ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDA2MGE3MWQuLjhkMTU4MzAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNDUsMyArNDUsNiBAQAogCiAjIGNzY29wZSBmaWxlcwogY3Njb3BlLioKKworKi5vcmlnCisqLnJlagpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKaW5kZXggZjA4Y2E5NS4uOGIwNTYzNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCkBAIC0xMiw2ICsxMiw4IEBACiAKIDAwLUlOREVYCiAJLSB0aGlzIGZpbGUuCitBQkkvCisJLSBpbmZvIG9uIGtlcm5lbCA8LT4gdXNlcnNwYWNlIEFCSSBhbmQgcmVsYXRpdmUgaW50ZXJmYWNlIHN0YWJpbGl0eS4KIEJVRy1IVU5USU5HCiAJLSBicnV0ZSBmb3JjZSBtZXRob2Qgb2YgZG9pbmcgYmluYXJ5IHNlYXJjaCBvZiBwYXRjaGVzIHRvIGZpbmQgYnVnLgogQ2hhbmdlcwpAQCAtMjUsMzcgKzI3LDU3IEBACiBEb2NCb29rLwogCS0gZGlyZWN0b3J5IHdpdGggRG9jQm9vayB0ZW1wbGF0ZXMgZXRjLiBmb3Iga2VybmVsIGRvY3VtZW50YXRpb24uCiBIT1dUTwotCS0gVGhlIHByb2Nlc3MgYW5kIHByb2NlZHVyZXMgb2YgaG93IHRvIGRvIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudC4KKwktIHRoZSBwcm9jZXNzIGFuZCBwcm9jZWR1cmVzIG9mIGhvdyB0byBkbyBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQuCiBJTy1tYXBwaW5nLnR4dAogCS0gaG93IHRvIGFjY2VzcyBJL08gbWFwcGVkIG1lbW9yeSBmcm9tIHdpdGhpbiBkZXZpY2UgZHJpdmVycy4KIElQTUkudHh0CiAJLSBpbmZvIG9uIExpbnV4IEludGVsbGlnZW50IFBsYXRmb3JtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChJUE1JKSBEcml2ZXIuCiBJUlEtYWZmaW5pdHkudHh0CiAJLSBob3cgdG8gc2VsZWN0IHdoaWNoIENQVShzKSBoYW5kbGUgd2hpY2ggaW50ZXJydXB0IGV2ZW50cyBvbiBTTVAuCitJUlEudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB3aGF0IGFuIElSUSBpcy4KIE1hbmFnZW1lbnRTdHlsZQogCS0gaG93IHRvIChhdHRlbXB0IHRvKSBtYW5hZ2Uga2VybmVsIGhhY2tlcnMuCiBNU0ktSE9XVE8udHh0CiAJLSB0aGUgTWVzc2FnZSBTaWduYWxlZCBJbnRlcnJ1cHRzIChNU0kpIERyaXZlciBHdWlkZSBIT1dUTyBhbmQgRkFRLgorUENJRUJVUy1IT1dUTy50eHQKKwktIGEgZ3VpZGUgZGVzY3JpYmluZyB0aGUgUENJIEV4cHJlc3MgUG9ydCBCdXMgZHJpdmVyLgogUkNVLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBvbiBSQ1UgKHJlYWQtY29weSB1cGRhdGUpLgogUkVBRE1FLkRBQzk2MAogCS0gaW5mbyBvbiBNeWxleCBEQUM5NjAvREFDMTEwMCBQQ0kgUkFJRCBDb250cm9sbGVyIERyaXZlciBmb3IgTGludXguCitSRUFETUUuY3ljbGFkZXNaCisJLSBpbmZvIG9uIEN5Y2xhZGVzLVogZmlybXdhcmUgbG9hZGluZy4KIFNBSy50eHQKIAktIGluZm8gb24gU2VjdXJlIEF0dGVudGlvbiBLZXlzLgorU2VjdXJpdHlCdWdzCisJLSBwcm9jZWR1cmUgZm9yIHJlcG9ydGluZyBzZWN1cml0eSBidWdzIGZvdW5kIGluIHRoZSBrZXJuZWwuCitTdWJtaXRDaGVja2xpc3QKKwktIExpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdC4KIFN1Ym1pdHRpbmdEcml2ZXJzCiAJLSBwcm9jZWR1cmUgdG8gZ2V0IGEgbmV3IGRyaXZlciBzb3VyY2UgaW5jbHVkZWQgaW50byB0aGUga2VybmVsIHRyZWUuCiBTdWJtaXR0aW5nUGF0Y2hlcwogCS0gcHJvY2VkdXJlIHRvIGdldCBhIHNvdXJjZSBwYXRjaCBpbmNsdWRlZCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4KIFZHQS1zb2Z0Y3Vyc29yLnR4dAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCithY2NvdW50aW5nLworCS0gZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50aW5nIGFuZCB0YXNrc3RhdHMuCithb2UvCisJLSBkZXNjcmlwdGlvbiBvZiBBb0UgKEFUQSBvdmVyIEV0aGVybmV0KSBhbG9uZyB3aXRoIGNvbmZpZyBleGFtcGxlcy4KIGFwcGx5aW5nLXBhdGNoZXMudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB2YXJpb3VzIHRyZWVzIGFuZCBob3cgdG8gYXBwbHkgdGhlaXIgcGF0Y2hlcy4KIGFybS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gYWJvdXQgTGludXggb24gdGhlIEFSTSBhcmNoaXRlY3R1cmUuCithdG9taWNfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBhdG9taWMgYW5kIGJpdG1hc2sgb3BlcmF0aW9ucy4KK2F1eGRpc3BsYXkvCisJLSBtaXNjLiBMQ0QgZHJpdmVyIGRvY3VtZW50YXRpb24gKGNmYWcxMjg2NGIsIGtzMDEwOCkuCiBiYXNpY19wcm9maWxpbmcudHh0CiAJLSBiYXNpYyBpbnN0cnVjdGlvbnMgZm9yIHRob3NlIHdobyB3YW50cyB0byBwcm9maWxlIExpbnV4IGtlcm5lbC4KIGJpbmZtdF9taXNjLnR4dAogCS0gaW5mbyBvbiB0aGUga2VybmVsIHN1cHBvcnQgZm9yIGV4dHJhIGJpbmFyeSBmb3JtYXRzLgorYmxhY2tmaW4vCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQmxhY2tmaW4gYXJjaC4KIGJsb2NrLwogCS0gaW5mbyBvbiB0aGUgQmxvY2sgSS9PIChCSU8pIGxheWVyLgogY2FjaGV0bGIudHh0CkBAIC02OCwxNiArOTAsMzIgQEAKIAktIGNsaSgpL3N0aSgpIHJlbW92YWwgZ3VpZGUuCiBjb21wdXRvbmUudHh0CiAJLSBpbmZvIG9uIENvbXB1dG9uZSBJbnRlbGxpcG9ydCBJSS9QbHVzIE11bHRpcG9ydCBTZXJpYWwgRHJpdmVyLgorY29ubmVjdG9yLworCS0gZG9jcyBvbiB0aGUgbmV0bGluayBiYXNlZCB1c2Vyc3BhY2U8LT5rZXJuZWwgc3BhY2UgY29tbXVuaWNhdGlvbiBtb2QuCitjb25zb2xlLworCS0gZG9jdW1lbnRhdGlvbiBvbiBMaW51eCBjb25zb2xlIGRyaXZlcnMuCiBjcHFhcnJheS50eHQKIAktIGluZm8gb24gdXNpbmcgQ29tcGFxJ3MgU01BUlQyIEludGVsbGlnZW50IERpc2sgQXJyYXkgQ29udHJvbGxlcnMuCiBjcHUtZnJlcS8KIAktIGluZm8gb24gQ1BVIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorY3B1LWhvdHBsdWcudHh0CisJLSBkb2N1bWVudCBkZXNjcmliaW5nIENQVSBob3RwbHVnIHN1cHBvcnQgaW4gdGhlIExpbnV4IGtlcm5lbC4KK2NwdS1sb2FkLnR4dAorCS0gZG9jdW1lbnQgZGVzY3JpYmluZyBob3cgQ1BVIGxvYWQgc3RhdGlzdGljcyBhcmUgY29sbGVjdGVkLgorY3B1c2V0cy50eHQKKwktIGRvY3VtZW50cyB0aGUgY3B1c2V0cyBmZWF0dXJlOyBhc3NpZ24gQ1BVcyBhbmQgTWVtIHRvIGEgc2V0IG9mIHRhc2tzLgorY3B1dG9wb2xvZ3kudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGhvdyBDUFUgdG9wb2xvZ3kgaW5mbyBpcyBleHBvcnRlZCB2aWEgc3lzZnMuCiBjcmlzLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBDUklTIGFyY2hpdGVjdHVyZS4KIGNyeXB0by8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIENyeXB0byBBUEkuCitkY2RiYXMudHh0CisJLSBpbmZvcm1hdGlvbiBvbiB0aGUgRGVsbCBTeXN0ZW1zIE1hbmFnZW1lbnQgQmFzZSBEcml2ZXIuCiBkZWJ1Z2dpbmctbW9kdWxlcy50eHQKIAktIHNvbWUgbm90ZXMgb24gZGVidWdnaW5nIG1vZHVsZXMgYWZ0ZXIgTGludXggMi42LjMuCitkZWxsX3JidS50eHQKKwktIGRvY3VtZW50IGRlbW9uc3RyYXRpbmcgdGhlIHVzZSBvZiB0aGUgRGVsbCBSZW1vdGUgQklPUyBVcGRhdGUgZHJpdmVyLgogZGV2aWNlLW1hcHBlci8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gRGV2aWNlIE1hcHBlci4KIGRldmljZXMudHh0CkBAIC04NiwzMiArMTI0LDUyIEBACiAJLSBpbmZvIG9uIERpZ2kgSW50bC4ge1BDLFBDSSxFSVNBfVh4IGFuZCBYZW0gc2VyaWVzIGNhcmRzLgogZG5vdGlmeS50eHQKIAktIGluZm8gYWJvdXQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpbiBMaW51eC4KK2RvbnRkaWZmCisJLSBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGRpZmYnZWQuCiBkcml2ZXItbW9kZWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IGRyaXZlciBtb2RlbC4KK2RyaXZlcnMvCisJLSBkaXJlY3Rvcnkgd2l0aCBkcml2ZXIgZG9jdW1lbnRhdGlvbiAoY3VycmVudGx5IG9ubHkgRURBQykuCiBkdmIvCiAJLSBpbmZvIG9uIExpbnV4IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0IChEVkIpIHN1YnN5c3RlbS4KIGVhcmx5LXVzZXJzcGFjZS8KIAktIGluZm8gYWJvdXQgaW5pdHJhbWZzLCBrbGliYywgYW5kIHVzZXJzcGFjZSBlYXJseSBkdXJpbmcgYm9vdC4KK2VjcnlwdGZzLnR4dAorCS0gZG9jcyBvbiBlQ3J5cHRmczogc3RhY2tlZCBjcnlwdG9ncmFwaGljIGZpbGVzeXN0ZW0gZm9yIExpbnV4LgogZWlzYS50eHQKIAktIGluZm8gb24gRUlTQSBidXMgc3VwcG9ydC4KIGV4Y2VwdGlvbi50eHQKIAktIGhvdyBMaW51eCB2Mi4yIGhhbmRsZXMgZXhjZXB0aW9ucyB3aXRob3V0IHZlcmlmeV9hcmVhIGV0Yy4KK2ZhdWx0LWluamVjdGlvbi8KKwktIGRpciB3aXRoIGRvY3MgYWJvdXQgdGhlIGZhdWx0IGluamVjdGlvbiBjYXBhYmlsaXRpZXMgaW5mcmFzdHJ1Y3R1cmUuCiBmYi8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGZyYW1lIGJ1ZmZlciBncmFwaGljcyBhYnN0cmFjdGlvbiBsYXllci4KK2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKwktIGxpc3Qgb2YgZmlsZXMgYW5kIGZlYXR1cmVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIHJlbW92ZWQuCiBmaWxlc3lzdGVtcy8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIHZhcmlvdXMgZmlsZXN5c3RlbXMgdGhhdCBMaW51eCBzdXBwb3J0cy4KIGZpcm13YXJlX2NsYXNzLwogCS0gcmVxdWVzdF9maXJtd2FyZSgpIGhvdHBsdWcgaW50ZXJmYWNlIGluZm8uCiBmbG9wcHkudHh0CiAJLSBub3RlcyBhbmQgZHJpdmVyIG9wdGlvbnMgZm9yIHRoZSBmbG9wcHkgZGlzayBkcml2ZXIuCitmdWppdHN1LworCS0gRnVqaXRzdSBGUi1WIExpbnV4IGRvY3VtZW50YXRpb24uCitncGlvLnR4dAorCS0gb3ZlcnZpZXcgb2YgR1BJTyAoR2VuZXJhbCBQdXJwb3NlIElucHV0L091dHB1dCkgYWNjZXNzIGNvbnZlbnRpb25zLgogaGF5ZXMtZXNwLnR4dAogCS0gaW5mbyBvbiB1c2luZyB0aGUgSGF5ZXMgRVNQIHNlcmlhbCBkcml2ZXIuCiBoaWdodWlkLnR4dAogCS0gbm90ZXMgb24gdGhlIGNoYW5nZSBmcm9tIDE2IGJpdCB0byAzMiBiaXQgdXNlci9ncm91cCBJRHMuCiBocGV0LnR4dAogCS0gSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgRHJpdmVyIGZvciBMaW51eC4KK2hydGltZXIvCisJLSBpbmZvIG9uIHRoZSB0aW1lcl9zdGF0cyBkZWJ1Z2dpbmcgZmFjaWxpdHkgZm9yIHRpbWVyIChhYil1c2UuCitocnRpbWVycy8KKwktIGluZm8gb24gdGhlIGhydGltZXJzIHN1YnN5c3RlbSBmb3IgaGlnaC1yZXNvbHV0aW9uIGtlcm5lbCB0aW1lcnMuCiBod19yYW5kb20udHh0CiAJLSBpbmZvIG9uIExpbnV4IHN1cHBvcnQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIGk4eHggY2hpcHNldHMuCitod21vbi8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3Mgb24gdmFyaW91cyBoYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlcnMuCiBpMmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IHRoZSBJMkMgYnVzL3Byb3RvY29sICgyIHdpcmUsIGtIeiBzcGVlZCkuCiBpMm8vCkBAIC0xMjIsMTYgKzE4MCwyMiBAQAogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCBMaW51eCBvbiBJbnRlbCA2NCBiaXQgYXJjaGl0ZWN0dXJlLgogaWRlLnR4dAogCS0gaW1wb3J0YW50IGluZm8gZm9yIHVzZXJzIG9mIEFUQSBkZXZpY2VzIChJREUvRUlERSBkaXNrcyBhbmQgQ0QtUk9NUykuCitpbmZpbmliYW5kLworCS0gZGlyZWN0b3J5IHdpdGggZG9jdW1lbnRzIGNvbmNlcm5pbmcgTGludXggSW5maW5pQmFuZCBzdXBwb3J0LgogaW5pdHJkLnR4dAogCS0gaG93IHRvIHVzZSB0aGUgUkFNIGRpc2sgYXMgYW4gaW5pdGlhbC90ZW1wb3Jhcnkgcm9vdCBmaWxlc3lzdGVtLgogaW5wdXQvCiAJLSBpbmZvIG9uIExpbnV4IGlucHV0IGRldmljZSBzdXBwb3J0LgogaW9fb3JkZXJpbmcudHh0CiAJLSBpbmZvIG9uIG9yZGVyaW5nIEkvTyB3cml0ZXMgdG8gbWVtb3J5LW1hcHBlZCBhZGRyZXNzZXMuCitpb2N0bC8KKwktIGRpcmVjdG9yeSB3aXRoIGRvY3VtZW50cyBkZXNjcmliaW5nIHZhcmlvdXMgSU9DVEwgY2FsbHMuCiBpb2N0bC1udW1iZXIudHh0CiAJLSBob3cgdG8gaW1wbGVtZW50IGFuZCByZWdpc3RlciBkZXZpY2UvZHJpdmVyIGlvY3RsIGNhbGxzLgogaW9zdGF0cy50eHQKIAktIGluZm8gb24gSS9PIHN0YXRpc3RpY3MgTGludXgga2VybmVsIHByb3ZpZGVzLgoraXJxZmxhZ3MtdHJhY2luZy50eHQKKwktIGhvdyB0byB1c2UgdGhlIGlycS1mbGFncyB0cmFjaW5nIGZlYXR1cmUuCiBpc2FwbnAudHh0CiAJLSBpbmZvIG9uIExpbnV4IElTQSBQbHVnICYgUGxheSBzdXBwb3J0LgogaXNkbi8KQEAgLTE0MCwyNiArMjA0LDQwIEBACiAJLSBpbmZvIG9uIHRoZSBpbi1rZXJuZWwgYmluYXJ5IHN1cHBvcnQgZm9yIEphdmEodG0pLgoga2J1aWxkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuCi1rZHVtcHQudHh0Ci0gICAgICAgLSBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgora2R1bXAvCisJLSBkaXJlY3Rvcnkgd2l0aCBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgoga2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAogCS0gbWluaSBIb3dUbyBvbiBnZW5lcmF0aW9uIGFuZCBsb2NhdGlvbiBvZiBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmaWxlcy4KIGtlcm5lbC1kb2NzLnR4dAogCS0gbGlzdGluZyBvZiB2YXJpb3VzIFdXVyArIGJvb2tzIHRoYXQgZG9jdW1lbnQga2VybmVsIGludGVybmFscy4KIGtlcm5lbC1wYXJhbWV0ZXJzLnR4dAogCS0gc3VtbWFyeSBsaXN0aW5nIG9mIGNvbW1hbmQgbGluZSAvIGJvb3QgcHJvbXB0IGFyZ3MgZm9yIHRoZSBrZXJuZWwuCitrZXlzLXJlcXVlc3Qta2V5LnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIGtlcm5lbCBrZXkgcmVxdWVzdCBzZXJ2aWNlLgora2V5cy50eHQKKwktIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXJuZWwga2V5IHJldGVudGlvbiBzZXJ2aWNlLgoga29iamVjdC50eHQKIAktIGluZm8gb2YgdGhlIGtvYmplY3QgaW5mcmFzdHJ1Y3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbC4KK2twcm9iZXMudHh0CisJLSBkb2N1bWVudHMgdGhlIGtlcm5lbCBwcm9iZXMgZGVidWdnaW5nIGZlYXR1cmUuCitrcmVmLnR4dAorCS0gZG9jcyBvbiBhZGRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzIChrcmVmcykgdG8ga2VybmVsIG9iamVjdHMuCiBsYXB0b3AtbW9kZS50eHQKLQktIEhvdyB0byBjb25zZXJ2ZSBiYXR0ZXJ5IHBvd2VyIHVzaW5nIGxhcHRvcC1tb2RlLgorCS0gaG93IHRvIGNvbnNlcnZlIGJhdHRlcnkgcG93ZXIgdXNpbmcgbGFwdG9wLW1vZGUuCiBsZG0udHh0CiAJLSBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIExETSAoV2luZG93cyBEeW5hbWljIERpc2tzKS4KK2xlZHMtY2xhc3MudHh0CisJLSBkb2N1bWVudHMgTEVEIGhhbmRsaW5nIHVuZGVyIExpbnV4LgorbG9jYWxfb3BzLnR4dAorCS0gc2VtYW50aWNzIGFuZCBiZWhhdmlvciBvZiBsb2NhbCBhdG9taWMgb3BlcmF0aW9ucy4KK2xvY2tkZXAtZGVzaWduLnR4dAorCS0gZG9jdW1lbnRhdGlvbiBvbiB0aGUgcnVudGltZSBsb2NraW5nIGNvcnJlY3RuZXNzIHZhbGlkYXRvci4KIGxvY2tzLnR4dAogCS0gaW5mbyBvbiBmaWxlIGxvY2tpbmcgaW1wbGVtZW50YXRpb25zLCBmbG9jaygpIHZzLiBmY250bCgpLCBldGMuCiBsb2dvLmdpZgotCS0gRnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4pLgorCS0gZnVsbCBjb2xvdXIgR0lGIGltYWdlIG9mIExpbnV4IGxvZ28gKHBlbmd1aW4gLSBUdXgpLgogbG9nby50eHQKLQktIEluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KKwktIGluZm8gb24gY3JlYXRvciBvZiBhYm92ZSBsb2dvICYgc2l0ZSB0byBnZXQgYWRkaXRpb25hbCBpbWFnZXMgZnJvbS4KIG02OGsvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IG9uIE1vdG9yb2xhIDY4ayBhcmNoaXRlY3R1cmUuCiBtYWdpYy1udW1iZXIudHh0CkBAIC0xNzAsNiArMjQ4LDggQEAKIAktIGluZm8gb24gc3VwcG9ydGluZyBNaWNybyBDaGFubmVsIEFyY2hpdGVjdHVyZSAoZS5nLiBQUy8yKSBzeXN0ZW1zLgogbWQudHh0CiAJLSBpbmZvIG9uIGJvb3QgYXJndW1lbnRzIGZvciB0aGUgbXVsdGlwbGUgZGV2aWNlcyBkcml2ZXIuCittZW1vcnktYmFycmllcnMudHh0CisJLSBpbmZvIG9uIExpbnV4IGtlcm5lbCBtZW1vcnkgYmFycmllcnMuCiBtZW1vcnkudHh0CiAJLSBpbmZvIG9uIHR5cGljYWwgTGludXggbWVtb3J5IHByb2JsZW1zLgogbWlwcy8KQEAgLTE3Nyw5ICsyNTcsMTEgQEAKIG1vbm8udHh0CiAJLSBob3cgdG8gZXhlY3V0ZSBNb25vLWJhc2VkIC5ORVQgYmluYXJpZXMgd2l0aCB0aGUgaGVscCBvZiBCSU5GTVRfTUlTQy4KIG1veGEtc21hcnRpbwotCS0gaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCisJLSBmaWxlIHdpdGggaW5mbyBvbiBpbnN0YWxsaW5nL3VzaW5nIE1veGEgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBtdHJyLnR4dAogCS0gaG93IHRvIHVzZSBQUHJvIE1lbW9yeSBUeXBlIFJhbmdlIFJlZ2lzdGVycyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZS4KK211dGV4LWRlc2lnbi50eHQKKwktIGluZm8gb24gdGhlIGdlbmVyaWMgbXV0ZXggc3Vic3lzdGVtLgogbmJkLnR4dAogCS0gaW5mbyBvbiBhIFRDUCBpbXBsZW1lbnRhdGlvbiBvZiBhIG5ldHdvcmsgYmxvY2sgZGV2aWNlLgogbmV0bGFiZWwvCkBAIC0xOTAsNiArMjcyLDggQEAKIAktIHNob3J0IGd1aWRlIG9uIHNldHRpbmcgdXAgYSBkaXNrbGVzcyBib3ggd2l0aCBORlMgcm9vdCBmaWxlc3lzdGVtLgogbm1pX3dhdGNoZG9nLnR4dAogCS0gaW5mbyBvbiBOTUkgd2F0Y2hkb2cgZm9yIFNNUCBzeXN0ZW1zLgorbm9tbXUtbW1hcC50eHQKKwktIGRvY3VtZW50YXRpb24gYWJvdXQgbm8tbW11IG1lbW9yeSBtYXBwaW5nIHN1cHBvcnQuCiBudW1hc3RhdC50eHQKIAktIGluZm8gb24gaG93IHRvIHJlYWQgTnVtYSBwb2xpY3kgaGl0L21pc3Mgc3RhdGlzdGljcyBpbiBzeXNmcy4KIG9vcHMtdHJhY2luZy50eHQKQEAgLTIwMiw4ICsyODYsMTYgQEAKIAktIGhvdyB0byB1c2UgdGhlIHBhcmFsbGVsLXBvcnQgZHJpdmVyLgogcGFycG9ydC1sb3dsZXZlbC50eHQKIAktIGRlc2NyaXB0aW9uIGFuZCB1c2FnZSBvZiB0aGUgbG93IGxldmVsIHBhcmFsbGVsIHBvcnQgZnVuY3Rpb25zLgorcGNpLWVycm9yLXJlY292ZXJ5LnR4dAorCS0gaW5mbyBvbiBQQ0kgZXJyb3IgcmVjb3ZlcnkuCiBwY2kudHh0CiAJLSBpbmZvIG9uIHRoZSBQQ0kgc3Vic3lzdGVtIGZvciBkZXZpY2UgZHJpdmVyIGF1dGhvcnMuCitwY2llYWVyLWhvd3RvLnR4dAorCS0gdGhlIFBDSSBFeHByZXNzIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBEcml2ZXIgR3VpZGUgSE9XVE8uCitwY21jaWEvCisJLSBpbmZvIG9uIHRoZSBMaW51eCBQQ01DSUEgZHJpdmVyLgorcGktZnV0ZXgudHh0CisJLSBkb2N1bWVudGF0aW9uIG9uIGxpZ2h0d2VpZ2h0IFBJLWZ1dGV4ZXMuCiBwbS50eHQKIAktIGluZm8gb24gTGludXggcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0LgogcG5wLnR4dApAQCAtMjE0LDE4ICszMDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggd2l0aCB0aGUgUG93ZXJQQy4KIHByZWVtcHQtbG9ja2luZy50eHQKIAktIGluZm8gb24gbG9ja2luZyB1bmRlciBhIHByZWVtcHRpdmUga2VybmVsLgorcHJpb190cmVlLnR4dAorCS0gaW5mbyBvbiByYWRpeC1wcmlvcml0eS1zZWFyY2gtdHJlZSB1c2UgZm9yIGluZGV4aW5nIHZtYXMuCiByYW1kaXNrLnR4dAogCS0gc2hvcnQgZ3VpZGUgb24gaG93IHRvIHNldCB1cCBhbmQgdXNlIHRoZSBSQU0gZGlzay4KK3JidHJlZS50eHQKKwktIGluZm8gb24gd2hhdCByZWQtYmxhY2sgdHJlZXMgYXJlIGFuZCB3aGF0IHRoZXkgYXJlIGZvci4KIHJpc2NvbTgudHh0CiAJLSBub3RlcyBvbiB1c2luZyB0aGUgUklTQ29tLzggbXVsdGktcG9ydCBzZXJpYWwgZHJpdmVyLgorcm9idXN0LWZ1dGV4LUFCSS50eHQKKwktIGRvY3VtZW50YXRpb24gb2YgdGhlIHJvYnVzdCBmdXRleCBBQkkuCityb2J1c3QtZnV0ZXhlcy50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCByb2J1c3QgZnV0ZXhlcyBhcmUuCiByb2NrZXQudHh0CiAJLSBpbmZvIG9uIHRoZSBDb210cm9sIFJvY2tldFBvcnQgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiBycGMtY2FjaGUudHh0CiAJLSBpbnRyb2R1Y3Rpb24gdG8gdGhlIGNhY2hpbmcgbWVjaGFuaXNtcyBpbiB0aGUgc3VucnBjIGxheWVyLgorcnQtbXV0ZXgtZGVzaWduLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIFJlYWxUaW1lIG11dGV4IGltcGxlbWVudGF0aW9uIGRlc2lnbi4KK3J0LW11dGV4LnR4dAorCS0gZGVzYy4gb2YgUlQtbXV0ZXggc3Vic3lzdGVtIHdpdGggUEkgKFByaW9yaXR5IEluaGVyaXRhbmNlKSBzdXBwb3J0LgogcnRjLnR4dAogCS0gbm90ZXMgb24gaG93IHRvIHVzZSB0aGUgUmVhbCBUaW1lIENsb2NrIChha2EgQ01PUyBjbG9jaykgZHJpdmVyLgogczM5MC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggb24gdGhlIElCTSBTMzkwLgorc2NoZWQtYXJjaC50eHQKKwktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgogc2NoZWQtY29kaW5nLnR4dAogCS0gcmVmZXJlbmNlIGZvciB2YXJpb3VzIHNjaGVkdWxlci1yZWxhdGVkIG1ldGhvZHMgaW4gdGhlIE8oMSkgc2NoZWR1bGVyLgogc2NoZWQtZGVzaWduLnR4dApAQCAtMjQwLDIyICszNDYsMzIgQEAKIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIGxvdyBsZXZlbCBzZXJpYWwgQVBJLgogc2VyaWFsLWNvbnNvbGUudHh0CiAJLSBob3cgdG8gc2V0IHVwIExpbnV4IHdpdGggYSBzZXJpYWwgbGluZSBjb25zb2xlIGFzIHRoZSBkZWZhdWx0Lgorc2dpLWlvYzQudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB0aGUgU0dJIElPQzQgUENJIChtdWx0aSBmdW5jdGlvbikgZGV2aWNlLgogc2dpLXZpc3dzLnR4dAogCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgorc2hhcmVkc3VidHJlZS50eHQKKwktIGEgZGVzY3JpcHRpb24gb2Ygc2hhcmVkIHN1YnRyZWVzIGZvciBuYW1lc3BhY2VzLgogc21hcnQtY29uZmlnLnR4dAogCS0gZGVzY3JpcHRpb24gb2YgdGhlIFNtYXJ0IENvbmZpZyBtYWtlZmlsZSBmZWF0dXJlLgogc21wLnR4dAogCS0gYSBmZXcgbm90ZXMgb24gc3ltbWV0cmljIG11bHRpLXByb2Nlc3NpbmcuCitzb255LWxhcHRvcC50eHQKKwktIFNvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIgKFNOQykgUmVhZG1lLgogc29ueXBpLnR4dAogCS0gaW5mbyBvbiBMaW51eCBTb255IFByb2dyYW1tYWJsZSBJL08gRGV2aWNlIHN1cHBvcnQuCiBzb3VuZC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gc291bmQgY2FyZCBzdXBwb3J0Lgogc3BhcmMvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHVzaW5nIExpbnV4IG9uIFNwYXJjIGFyY2hpdGVjdHVyZS4KK3NwYXJzZS50eHQKKwktIGluZm8gb24gaG93IHRvIG9idGFpbiBhbmQgdXNlIHRoZSBzcGFyc2UgdG9vbCBmb3IgdHlwZWNoZWNraW5nLgogc3BlY2lhbGl4LnR4dAogCS0gaW5mbyBvbiBoYXJkd2FyZS9kcml2ZXIgZm9yIHNwZWNpYWxpeCBJTzgrIG11bHRpcG9ydCBzZXJpYWwgY2FyZC4KK3NwaS8KKwktIG92ZXJ2aWV3IG9mIExpbnV4IGtlcm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgc3VwcG9ydC4KIHNwaW5sb2Nrcy50eHQKIAktIGluZm8gb24gdXNpbmcgc3BpbmxvY2tzIHRvIHByb3ZpZGUgZXhjbHVzaXZlIGFjY2VzcyBpbiBrZXJuZWwuCiBzdGFibGVfYXBpX25vbnNlbnNlLnR4dApAQCAtMjc0LDI0ICszOTAsMzIgQEAKIAktIGluZm8gb24gdGhlIG1hZ2ljIFN5c1JxIGtleS4KIHRlbGVwaG9ueS8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGVsZXBob255IChlLmcuIHZvaWNlIG92ZXIgSVApIHN1cHBvcnQuCit0aGlua3BhZC1hY3BpLnR4dAorCS0gaW5mb3JtYXRpb24gb24gdGhlIChJQk0gYW5kIExlbm92bykgVGhpbmtQYWQgQUNQSSBFeHRyYXMgZHJpdmVyLgogdGltZV9pbnRlcnBvbGF0b3JzLnR4dAogCS0gaW5mbyBvbiB0aW1lIGludGVycG9sYXRvcnMuCiB0aXBhci50eHQKIAktIGluZm9ybWF0aW9uIGFib3V0IFBhcmFsbGVsIGxpbmsgY2FibGUgZm9yIFRleGFzIEluc3RydW1lbnRzIGhhbmRoZWxkcy4KIHR0eS50eHQKIAktIGd1aWRlIHRvIHRoZSBsb2NraW5nIHBvbGljaWVzIG9mIHRoZSB0dHkgbGF5ZXIuCi11bmljb2RlLnR4dAotCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCiB1bWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBVc2VyIE1vZGUgTGludXguCit1bmljb2RlLnR4dAorCS0gaW5mbyBvbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIvZm9udCBtYXBwaW5nIHVzZWQgaW4gTGludXguCit1bnNoYXJlLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIExpbnV4IHVuc2hhcmUgc3lzdGVtIGNhbGwuCiB1c2IvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIHJlZ2FyZGluZyB0aGUgVW5pdmVyc2FsIFNlcmlhbCBCdXMuCit2aWRlby1vdXRwdXQudHh0CisJLSBzeXNmcyBjbGFzcyBkcml2ZXIgaW50ZXJmYWNlIHRvIGVuYWJsZS9kaXNhYmxlIGEgdmlkZW8gb3V0cHV0IGRldmljZS4KIHZpZGVvNGxpbnV4LwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyByZWdhcmRpbmcgdmlkZW8vVFYvcmFkaW8gY2FyZHMgYW5kIGxpbnV4Lgogdm0vCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHRoZSBMaW51eCB2bSBjb2RlLgogdm95YWdlci50eHQKIAktIGd1aWRlIHRvIHJ1bm5pbmcgTGludXggb24gdGhlIFZveWFnZXIgYXJjaGl0ZWN0dXJlLgordzEvCisJLSBkaXJlY3Rvcnkgd2l0aCBkb2N1bWVudHMgcmVnYXJkaW5nIHRoZSAxLXdpcmUgKHcxKSBzdWJzeXN0ZW0uCiB3YXRjaGRvZy8KIAktIGhvdyB0byBhdXRvLXJlYm9vdCBMaW51eCBpZiBpdCBoYXMgImZhbGxlbiBhbmQgY2FuJ3QgZ2V0IHVwIi4gOy0pCiB4ODZfNjQvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBiNDliOTJlLi5hNjY3ZWIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTIxOCw2ICsyMTgsMTggQEAKIAogYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgogCitEbyBub3QgbGVhdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBhdCB0aGUgZW5kcyBvZiBsaW5lcy4gIFNvbWUgZWRpdG9ycyB3aXRoCisic21hcnQiIGluZGVudGF0aW9uIHdpbGwgaW5zZXJ0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBuZXcgbGluZXMgYXMKK2FwcHJvcHJpYXRlLCBzbyB5b3UgY2FuIHN0YXJ0IHR5cGluZyB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgcmlnaHQgYXdheS4KK0hvd2V2ZXIsIHNvbWUgc3VjaCBlZGl0b3JzIGRvIG5vdCByZW1vdmUgdGhlIHdoaXRlc3BhY2UgaWYgeW91IGVuZCB1cCBub3QKK3B1dHRpbmcgYSBsaW5lIG9mIGNvZGUgdGhlcmUsIHN1Y2ggYXMgaWYgeW91IGxlYXZlIGEgYmxhbmsgbGluZS4gIEFzIGEgcmVzdWx0LAoreW91IGVuZCB1cCB3aXRoIGxpbmVzIGNvbnRhaW5pbmcgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworR2l0IHdpbGwgd2FybiB5b3UgYWJvdXQgcGF0Y2hlcyB0aGF0IGludHJvZHVjZSB0cmFpbGluZyB3aGl0ZXNwYWNlLCBhbmQgY2FuCitvcHRpb25hbGx5IHN0cmlwIHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZvciB5b3U7IGhvd2V2ZXIsIGlmIGFwcGx5aW5nIGEgc2VyaWVzCitvZiBwYXRjaGVzLCB0aGlzIG1heSBtYWtlIGxhdGVyIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBmYWlsIGJ5IGNoYW5naW5nIHRoZWlyCitjb250ZXh0IGxpbmVzLgorCiAKIAkJQ2hhcHRlciA0OiBOYW1pbmcKIApAQCAtNzI2LDYgKzczOCwzMyBAQAogZGVmaW5lZCB0aGF0IHlvdSBzaG91bGRuJ3QgcmVwcm9kdWNlIGluIHlvdXIgY29kZS4KIAogCisJCUNoYXB0ZXIgMTg6ICBFZGl0b3IgbW9kZWxpbmVzIGFuZCBvdGhlciBjcnVmdAorCitTb21lIGVkaXRvcnMgY2FuIGludGVycHJldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHNvdXJjZSBmaWxlcywKK2luZGljYXRlZCB3aXRoIHNwZWNpYWwgbWFya2Vycy4gIEZvciBleGFtcGxlLCBlbWFjcyBpbnRlcnByZXRzIGxpbmVzIG1hcmtlZAorbGlrZSB0aGlzOgorCistKi0gbW9kZTogYyAtKi0KKworT3IgbGlrZSB0aGlzOgorCisvKgorTG9jYWwgVmFyaWFibGVzOgorY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETUFHSUNfREVCVUdfRkxBRyBmb28uYyIKK0VuZDoKKyovCisKK1ZpbSBpbnRlcnByZXRzIG1hcmtlcnMgdGhhdCBsb29rIGxpa2UgdGhpczoKKworLyogdmltOnNldCBzdz04IG5vZXQgKi8KKworRG8gbm90IGluY2x1ZGUgYW55IG9mIHRoZXNlIGluIHNvdXJjZSBmaWxlcy4gIFBlb3BsZSBoYXZlIHRoZWlyIG93biBwZXJzb25hbAorZWRpdG9yIGNvbmZpZ3VyYXRpb25zLCBhbmQgeW91ciBzb3VyY2UgZmlsZXMgc2hvdWxkIG5vdCBvdmVycmlkZSB0aGVtLiAgVGhpcworaW5jbHVkZXMgbWFya2VycyBmb3IgaW5kZW50YXRpb24gYW5kIG1vZGUgY29uZmlndXJhdGlvbi4gIFBlb3BsZSBtYXkgdXNlIHRoZWlyCitvd24gY3VzdG9tIG1vZGUsIG9yIG1heSBoYXZlIHNvbWUgb3RoZXIgbWFnaWMgbWV0aG9kIGZvciBtYWtpbmcgaW5kZW50YXRpb24KK3dvcmsgY29ycmVjdGx5LgorCisKIAogCQlBcHBlbmRpeCBJOiBSZWZlcmVuY2VzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IDQ2YmNmZjIuLmZkMmVmNGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMTM5LDggKzEzOSwxMCBAQAogIUVsaWIvY21kbGluZS5jCiAgICAgIDwvc2VjdDE+CiAKLSAgICAgPHNlY3QxPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJjcmMiPjx0aXRsZT5DUkMgRnVuY3Rpb25zPC90aXRsZT4KKyFFbGliL2NyYzcuYwogIUVsaWIvY3JjMTYuYworIUVsaWIvY3JjLWl0dS10LmMKICFFbGliL2NyYzMyLmMKICFFbGliL2NyYy1jY2l0dC5jCiAgICAgIDwvc2VjdDE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwKaW5kZXggNDVjYWQyMy4uMmRlODRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbApAQCAtMzUyLDQ5ICszNTIsOTMgQEAKICAgICAgIDxmdW5jc3lub3BzaXM+CiAJPGZ1bmNwcm90b3R5cGU+CiAJICA8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+PC9mdW5jZGVmPgotCSAgPHBhcmFtZGVmPmNoYXIqIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJICA8cGFyYW1kZWY+Y2hhciogPHBhcmFtZXRlcj5idWZmZXI8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCSAgPHBhcmFtZGVmPmNoYXIqKiA8cGFyYW1ldGVyPnN0YXJ0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj5vZmZfdCA8cGFyYW1ldGVyPm9mZjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CiAJICA8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+Y291bnQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5lb2Y8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCSAgPHBhcmFtZGVmPmludCogPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KIAkgIDxwYXJhbWRlZj52b2lkKiA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgogCTwvZnVuY3Byb3RvdHlwZT4KICAgICAgIDwvZnVuY3N5bm9wc2lzPgogCiAgICAgICA8cGFyYT4KICAgICAgICAgVGhlIHJlYWQgZnVuY3Rpb24gc2hvdWxkIHdyaXRlIGl0cyBpbmZvcm1hdGlvbiBpbnRvIHRoZQotICAgICAgICA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uIEZvciBwcm9wZXIgdXNlLCB0aGUgZnVuY3Rpb24KLSAgICAgICAgc2hvdWxkIHN0YXJ0IHdyaXRpbmcgYXQgYW4gb2Zmc2V0IG9mCi0gICAgICAgIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGluIDxwYXJhbWV0ZXI+cGFnZTwvcGFyYW1ldGVyPiBhbmQKLSAgICAgICAgd3JpdGUgYXQgbW9zdCA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IGJ5dGVzLCBidXQgYmVjYXVzZQotICAgICAgICBtb3N0IHJlYWQgZnVuY3Rpb25zIGFyZSBxdWl0ZSBzaW1wbGUgYW5kIG9ubHkgcmV0dXJuIGEgc21hbGwKLSAgICAgICAgYW1vdW50IG9mIGluZm9ybWF0aW9uLCB0aGVzZSB0d28gcGFyYW1ldGVycyBhcmUgdXN1YWxseQotICAgICAgICBpZ25vcmVkIChpdCBicmVha3MgcGFnZXJzIGxpa2UgPGxpdGVyYWw+bW9yZTwvbGl0ZXJhbD4gYW5kCi0gICAgICAgIDxsaXRlcmFsPmxlc3M8L2xpdGVyYWw+LCBidXQgPGxpdGVyYWw+Y2F0PC9saXRlcmFsPiBzdGlsbAotICAgICAgICB3b3JrcykuCisgICAgICAgIDxwYXJhbWV0ZXI+YnVmZmVyPC9wYXJhbWV0ZXI+LCB3aGljaCB3aWxsIGJlIGV4YWN0bHkKKyAgICAgICAgPGxpdGVyYWw+UEFHRV9TSVpFPC9saXRlcmFsPiBieXRlcyBsb25nLgogICAgICAgPC9wYXJhPgogCiAgICAgICA8cGFyYT4KLSAgICAgICAgSWYgdGhlIDxwYXJhbWV0ZXI+b2ZmPC9wYXJhbWV0ZXI+IGFuZAotICAgICAgICA8cGFyYW1ldGVyPmNvdW50PC9wYXJhbWV0ZXI+IHBhcmFtZXRlcnMgYXJlIHByb3Blcmx5IHVzZWQsCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHNob3VsZCBiZSB1c2VkIHRvIHNpZ25hbCB0aGF0IHRoZQorICAgICAgICBUaGUgcGFyYW1ldGVyCisgICAgICAgIDxwYXJhbWV0ZXI+cGVvZjwvcGFyYW1ldGVyPiBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUKICAgICAgICAgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgYnkgd3JpdGluZwogICAgICAgICA8bGl0ZXJhbD4xPC9saXRlcmFsPiB0byB0aGUgbWVtb3J5IGxvY2F0aW9uCi0gICAgICAgIDxwYXJhbWV0ZXI+ZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KKyAgICAgICAgPHBhcmFtZXRlcj5wZW9mPC9wYXJhbWV0ZXI+IHBvaW50cyB0by4KICAgICAgIDwvcGFyYT4KIAogICAgICAgPHBhcmE+Ci0gICAgICAgIFRoZSBwYXJhbWV0ZXIgPHBhcmFtZXRlcj5zdGFydDwvcGFyYW1ldGVyPiBkb2Vzbid0IHNlZW0gdG8gYmUKLSAgICAgICAgdXNlZCBhbnl3aGVyZSBpbiB0aGUga2VybmVsLiBUaGUgPHBhcmFtZXRlcj5kYXRhPC9wYXJhbWV0ZXI+CisgICAgICAgIFRoZSA8cGFyYW1ldGVyPmRhdGE8L3BhcmFtZXRlcj4KICAgICAgICAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHNpbmdsZSBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yCiAgICAgICAgIHNldmVyYWwgZmlsZXMsIHNlZSA8eHJlZiBsaW5rZW5kPSJ1c2luZ2RhdGEiLz4uCiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgotICAgICAgICBUaGUgPGZ1bmN0aW9uPnJlYWRfZnVuYzwvZnVuY3Rpb24+IGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIHRoZSA8cGFyYW1ldGVyPnBhZ2U8L3BhcmFtZXRlcj4uCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGFyZSBkZXNjcmliZWQKKwlieSBhIGNvbW1lbnQgaW4gPGZpbGVuYW1lPmZzL3Byb2MvZ2VuZXJpYy5jPC9maWxlbmFtZT4gYXMgZm9sbG93czoKICAgICAgIDwvcGFyYT4KIAorICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgIDxwYXJhPgorCVlvdSBoYXZlIHRocmVlIHdheXMgdG8gcmV0dXJuIGRhdGE6CisgICAgICAgCTwvcGFyYT4KKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgorCSAgICAgIExlYXZlIDxsaXRlcmFsPipzdGFydCA9IE5VTEw8L2xpdGVyYWw+LiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKQorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGF0CisJICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyLiAgUmV0dXJuIHRoZSBudW1iZXIgKDxsaXRlcmFsPm48L2xpdGVyYWw+KQorCSAgICAgIG9mIGJ5dGVzIHRoZXJlIGFyZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJICAgICAgYnVmZmVyIHVwIHRvIHRoZSBsYXN0IGJ5dGUgb2YgZGF0YS4gIElmIHRoZQorCSAgICAgIG51bWJlciBvZiBzdXBwbGllZCBieXRlcyAoPGxpdGVyYWw+PSBuIC0gb2Zmc2V0PC9saXRlcmFsPikgaXMKKwkgICAgICBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91IGRpZG4ndCBzaWduYWwgZW9mCisJICAgICAgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8gdGFrZSBtb3JlIGRhdGEKKwkgICAgICB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgcmVxdWVzdGVkCisJICAgICAgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4gIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWZ1bCBmb3IgZmlsZXMKKwkgICAgICBubyBsYXJnZXIgdGhhbiB0aGUgYnVmZmVyLgorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSBsZXNzIHRoYW4KKwkgICAgICB0aGUgYnVmZmVyIGFkZHJlc3MgYnV0IGdyZWF0ZXIgdGhhbiB6ZXJvLgorCSAgICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGUKKwkgICAgICBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4gIFJldHVybiB0aGUgbnVtYmVyIG9mCisJICAgICAgYnl0ZXMgb2YgZGF0YSBwbGFjZWQgdGhlcmUuICBJZiB0aGlzIG51bWJlciBpcworCSAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UgZGlkbid0IHNpZ25hbCBlb2YKKwkgICAgICBhbmQgdGhlIHJlYWRlciBpcyBwcmVwYXJlZCB0byB0YWtlIG1vcmUgZGF0YQorCSAgICAgIHlvdSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHRoZSByZXF1ZXN0ZWQKKwkgICAgICBvZmZzZXQgYWR2YW5jZWQgYnkgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4gIFRoaXMgaW50ZXJmYWNlIGlzCisJICAgICAgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBsYXJnZSBmaWxlIGNvbnNpc3RpbmcKKwkgICAgICBvZiBhIHNlcmllcyBvZiBibG9ja3Mgd2hpY2ggeW91IHdhbnQgdG8gY291bnQKKwkgICAgICBhbmQgcmV0dXJuIGFzIHdob2xlcy4KKwkgICAgICAoSGFjayBieSBQYXVsLlJ1c3NlbGxAcnVzdGNvcnAuY29tLmF1KQorCSAgICA8L3BhcmE+CisJICA8L2xpc3RpdGVtPgorCSAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+CisJICAgICAgU2V0IDxsaXRlcmFsPipzdGFydDwvbGl0ZXJhbD4gdG8gYW4gYWRkcmVzcyB3aXRoaW4gdGhlIGJ1ZmZlci4KKwkgICAgICBQdXQgdGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBvZmZzZXQgYXQgPGxpdGVyYWw+KnN0YXJ0PC9saXRlcmFsPi4KKwkgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHBsYWNlZCB0aGVyZS4KKwkgICAgICBJZiB0aGlzIG51bWJlciBpcyBncmVhdGVyIHRoYW4gemVybyBhbmQgeW91CisJICAgICAgZGlkbid0IHNpZ25hbCBlb2YgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8KKwkgICAgICB0YWtlIG1vcmUgZGF0YSB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUKKwkgICAgICByZXF1ZXN0ZWQgb2Zmc2V0IGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMKKwkgICAgICBhYnNvcmJlZC4KKwkgICAgPC9wYXJhPgorCSAgPC9saXN0aXRlbT4KKwk8L29yZGVyZWRsaXN0PgorICAgICAgPC9ibG9ja3F1b3RlPgorCiAgICAgICA8cGFyYT4KICAgICAgICAgPHhyZWYgbGlua2VuZD0iZXhhbXBsZSIvPiBzaG93cyBob3cgdG8gdXNlIGEgcmVhZCBjYWxsIGJhY2sKICAgICAgICAgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAppbmRleCBmNGRmZmFkLi40MmIwMWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKQEAgLTIyMiw3ICsyMjIsMTUgQEAKIAlkZWFkbG9jayBhcyBzb29uIGFzIHRoZSBSQ1UgY2FsbGJhY2sgaGFwcGVucyB0byBpbnRlcnJ1cHQgdGhhdAogCWFjcXVpc2l0aW9uJ3MgY3JpdGljYWwgc2VjdGlvbi4KIAotMTMuCVNSQ1UgKHNyY3VfcmVhZF9sb2NrKCksIHNyY3VfcmVhZF91bmxvY2soKSwgYW5kIHN5bmNocm9uaXplX3NyY3UoKSkKKzEzLglSQ1UgY2FsbGJhY2tzIGNhbiBiZSBhbmQgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSW4gbWFueSBjYXNlcywKKwl0aGUgY2FsbGJhY2sgY29kZSBzaW1wbHkgd3JhcHBlcnMgYXJvdW5kIGtmcmVlKCksIHNvIHRoYXQgdGhpcworCWlzIG5vdCBhbiBpc3N1ZSAob3IsIG1vcmUgYWNjdXJhdGVseSwgdG8gdGhlIGV4dGVudCB0aGF0IGl0IGlzCisJYW4gaXNzdWUsIHRoZSBtZW1vcnktYWxsb2NhdG9yIGxvY2tpbmcgaGFuZGxlcyBpdCkuICBIb3dldmVyLAorCWlmIHRoZSBjYWxsYmFja3MgZG8gbWFuaXB1bGF0ZSBhIHNoYXJlZCBkYXRhIHN0cnVjdHVyZSwgdGhleQorCW11c3QgdXNlIHdoYXRldmVyIGxvY2tpbmcgb3Igb3RoZXIgc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkCisJdG8gc2FmZWx5IGFjY2VzcyBhbmQvb3IgbW9kaWZ5IHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCisKKzE0LglTUkNVIChzcmN1X3JlYWRfbG9jaygpLCBzcmN1X3JlYWRfdW5sb2NrKCksIGFuZCBzeW5jaHJvbml6ZV9zcmN1KCkpCiAJbWF5IG9ubHkgYmUgaW52b2tlZCBmcm9tIHByb2Nlc3MgY29udGV4dC4gIFVubGlrZSBvdGhlciBmb3JtcyBvZgogCVJDVSwgaXQgLWlzLSBwZXJtaXNzaWJsZSB0byBibG9jayBpbiBhbiBTUkNVIHJlYWQtc2lkZSBjcml0aWNhbAogCXNlY3Rpb24gKGRlbWFya2VkIGJ5IHNyY3VfcmVhZF9sb2NrKCkgYW5kIHNyY3VfcmVhZF91bmxvY2soKSksCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDZlYmZmYjUuLjE5ZTdmNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC0xLDQgKzEsNCBAQAotTGludXggS2VybmVsIHBhdGNoIHN1bWJpdHRhbCBjaGVja2xpc3QKK0xpbnV4IEtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogSGVyZSBhcmUgc29tZSBiYXNpYyB0aGluZ3MgdGhhdCBkZXZlbG9wZXJzIHNob3VsZCBkbyBpZiB0aGV5IHdhbnQgdG8gc2VlIHRoZWlyCkBAIC05LDcgKzksNiBAQAoga2VybmVsIHBhdGNoZXMuCiAKIAotCiAxOiBCdWlsZHMgY2xlYW5seSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgPXksID1tLCBhbmQKICAgID1uLiAgTm8gZ2NjIHdhcm5pbmdzL2Vycm9ycywgbm8gbGlua2VyIHdhcm5pbmdzL2Vycm9ycy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKaW5kZXggMDk1OGU5Ny4uM2Y5YTc5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCkBAIC00NjQsOSArNDY0LDI1IEBACiBOdWZmIHNhaWQuICBJZiB5b3VyIGNvZGUgZGV2aWF0ZXMgdG9vIG11Y2ggZnJvbSB0aGlzLCBpdCBpcyBsaWtlbHkKIHRvIGJlIHJlamVjdGVkIHdpdGhvdXQgZnVydGhlciByZXZpZXcsIGFuZCB3aXRob3V0IGNvbW1lbnQuCiAKK09uY2Ugc2lnbmlmaWNhbnQgZXhjZXB0aW9uIGlzIHdoZW4gbW92aW5nIGNvZGUgZnJvbSBvbmUgZmlsZSB0bworYW5vdGhlciBpbiB0aGlzIGNhc2UgeW91IHNob3VsZCBub3QgbW9kaWZ5IHRoZSBtb3ZlZCBjb2RlIGF0IGFsbCBpbgordGhlIHNhbWUgcGF0Y2ggd2hpY2ggbW92ZXMgaXQuICBUaGlzIGNsZWFybHkgZGVsaW5lYXRlcyB0aGUgYWN0IG9mCittb3ZpbmcgdGhlIGNvZGUgYW5kIHlvdXIgY2hhbmdlcy4gIFRoaXMgZ3JlYXRseSBhaWRzIHJldmlldyBvZiB0aGUKK2FjdHVhbCBkaWZmZXJlbmNlcyBhbmQgYWxsb3dzIHRvb2xzIHRvIGJldHRlciB0cmFjayB0aGUgaGlzdG9yeSBvZgordGhlIGNvZGUgaXRzZWxmLgorCiBDaGVjayB5b3VyIHBhdGNoZXMgd2l0aCB0aGUgcGF0Y2ggc3R5bGUgY2hlY2tlciBwcmlvciB0byBzdWJtaXNzaW9uCi0oc2NyaXB0cy9jaGVja3BhdGNoLnBsKS4gIFlvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbAotdmlvbGF0aW9ucyB0aGF0IHJlbWFpbiBpbiB5b3VyIHBhdGNoLgorKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuICBUaGUgc3R5bGUgY2hlY2tlciBzaG91bGQgYmUgdmlld2VkIGFzCithIGd1aWRlIG5vdCBhcyB0aGUgZmluYWwgd29yZC4gIElmIHlvdXIgY29kZSBsb29rcyBiZXR0ZXIgd2l0aAorYSB2aW9sYXRpb24gdGhlbiBpdHMgcHJvYmFibHkgYmVzdCBsZWZ0IGFsb25lLgorCitUaGUgY2hlY2tlciByZXBvcnRzIGF0IHRocmVlIGxldmVsczoKKyAtIEVSUk9SOiB0aGluZ3MgdGhhdCBhcmUgdmVyeSBsaWtlbHkgdG8gYmUgd3JvbmcKKyAtIFdBUk5JTkc6IHRoaW5ncyByZXF1aXJpbmcgY2FyZWZ1bCByZXZpZXcKKyAtIENIRUNLOiB0aGluZ3MgcmVxdWlyaW5nIHRob3VnaHQKKworWW91IHNob3VsZCBiZSBhYmxlIHRvIGp1c3RpZnkgYWxsIHZpb2xhdGlvbnMgdGhhdCByZW1haW4gaW4geW91cgorcGF0Y2guCiAKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKaW5kZXggNzFhY2MyOC4uMjRjNWFhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCisrKyBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYwpAQCAtNDksNiArNDksNyBAQAogaW50IGRiZzsKIGludCBwcmludF9kZWxheXM7CiBpbnQgcHJpbnRfaW9fYWNjb3VudGluZzsKK2ludCBwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50czsKIF9fdTY0IHN0aW1lLCB1dGltZTsKIAogI2RlZmluZSBQUklOVEYoZm10LCBhcmcuLi4pIHsJCQlcCkBAIC0xOTUsNyArMTk2LDcgQEAKIAkgICAgICAgIklPICAgICUxNXMlMTVzXG4iCiAJICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcbiIKIAkgICAgICAgIk1FTSAgICUxNXMlMTVzXG4iCi0JICAgICAgICIgICAgICAlMTVsbHUlMTVsbHVcblxuIiwKKwkgICAgICAgIiAgICAgICUxNWxsdSUxNWxsdVxuIgogCSAgICAgICAiY291bnQiLCAicmVhbCB0b3RhbCIsICJ2aXJ0dWFsIHRvdGFsIiwgImRlbGF5IHRvdGFsIiwKIAkgICAgICAgdC0+Y3B1X2NvdW50LCB0LT5jcHVfcnVuX3JlYWxfdG90YWwsIHQtPmNwdV9ydW5fdmlydHVhbF90b3RhbCwKIAkgICAgICAgdC0+Y3B1X2RlbGF5X3RvdGFsLApAQCAtMjA0LDYgKzIwNSwxNCBAQAogCSAgICAgICAiY291bnQiLCAiZGVsYXkgdG90YWwiLCB0LT5zd2FwaW5fY291bnQsIHQtPnN3YXBpbl9kZWxheV90b3RhbCk7CiB9CiAKK3ZvaWQgdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tzdGF0cyAqdCkKK3sKKwlwcmludGYoIlxuXG5UYXNrICAgJTE1cyUxNXNcbiIKKwkgICAgICAgIiAgICAgICAlMTVsdSUxNWx1XG4iLAorCSAgICAgICAidm9sdW50YXJ5IiwgIm5vbnZvbHVudGFyeSIsCisJICAgICAgIHQtPm52Y3N3LCB0LT5uaXZjc3cpOworfQorCiB2b2lkIHByaW50X2lvYWNjdChzdHJ1Y3QgdGFza3N0YXRzICp0KQogewogCXByaW50ZigiJXM6IHJlYWQ9JWxsdSwgd3JpdGU9JWxsdSwgY2FuY2VsbGVkX3dyaXRlPSVsbHVcbiIsCkBAIC0yMzUsNyArMjQ0LDcgQEAKIAlzdHJ1Y3QgbXNndGVtcGxhdGUgbXNnOwogCiAJd2hpbGUgKDEpIHsKLQkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZGl3OnI6bTp0OnA6dmwiKTsKKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAicWRpdzpyOm06dDpwOnZsIik7CiAJCWlmIChjIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yNDgsNiArMjU3LDEwIEBACiAJCQlwcmludGYoInByaW50aW5nIElPIGFjY291bnRpbmdcbiIpOwogCQkJcHJpbnRfaW9fYWNjb3VudGluZyA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlwcmludGYoInByaW50aW5nIHRhc2svcHJvY2VzcyBjb250ZXh0IHN3aXRjaCByYXRlc1xuIik7CisJCQlwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyA9IDE7CisJCQlicmVhazsKIAkJY2FzZSAndyc6CiAJCQlsb2dmaWxlID0gc3RyZHVwKG9wdGFyZyk7CiAJCQlwcmludGYoIndyaXRlIHRvIGZpbGUgJXNcbiIsIGxvZ2ZpbGUpOwpAQCAtMzg5LDYgKzQwMiw4IEBACiAJCQkJCQkJcHJpbnRfZGVsYXlhY2N0KChzdHJ1Y3QgdGFza3N0YXRzICopIE5MQV9EQVRBKG5hKSk7CiAJCQkJCQlpZiAocHJpbnRfaW9fYWNjb3VudGluZykKIAkJCQkJCQlwcmludF9pb2FjY3QoKHN0cnVjdCB0YXNrc3RhdHMgKikgTkxBX0RBVEEobmEpKTsKKwkJCQkJCWlmIChwcmludF90YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cykKKwkJCQkJCQl0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cygoc3RydWN0IHRhc2tzdGF0cyAqKSBOTEFfREFUQShuYSkpOwogCQkJCQkJaWYgKGZkKSB7CiAJCQkJCQkJaWYgKHdyaXRlKGZkLCBOTEFfREFUQShuYSksIG5hLT5ubGFfbGVuKSA8IDApIHsKIAkJCQkJCQkJZXJyKDEsIndyaXRlIGVycm9yXG4iKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dCBiL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy90YXNrc3RhdHMtc3RydWN0LnR4dAppbmRleCA2NjFjNzk3Li44YWE3NTI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvdGFza3N0YXRzLXN0cnVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL3Rhc2tzdGF0cy1zdHJ1Y3QudHh0CkBAIC0yMiw2ICsyMiw4IEBACiAgICAgLyogRXh0ZW5kZWQgYWNjb3VudGluZyBmaWVsZHMgZW5kICovCiAgICAgVGhlaXIgdmFsdWVzIGFyZSBjb2xsZWN0ZWQgaWYgQ09ORklHX1RBU0tfWEFDQ1QgaXMgc2V0LgogCis0KSBQZXItdGFzayBhbmQgcGVyLXRocmVhZCBjb250ZXh0IHN3aXRjaCBjb3VudCBzdGF0aXN0aWNzCisKIEZ1dHVyZSBleHRlbnNpb24gc2hvdWxkIGFkZCBmaWVsZHMgdG8gdGhlIGVuZCBvZiB0aGUgdGFza3N0YXRzIHN0cnVjdCwgYW5kCiBzaG91bGQgbm90IGNoYW5nZSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgZWFjaCBmaWVsZCB3aXRoaW4gdGhlIHN0cnVjdC4KIApAQCAtMTU4LDQgKzE2MCw4IEBACiAKIAkvKiBFeHRlbmRlZCBhY2NvdW50aW5nIGZpZWxkcyBlbmQgKi8KIAorNCkgUGVyLXRhc2sgYW5kIHBlci10aHJlYWQgc3RhdGlzdGljcworCV9fdTY0CW52Y3N3OwkJCS8qIENvbnRleHQgdm9sdW50YXJ5IHN3aXRjaCBjb3VudGVyICovCisJX191NjQJbml2Y3N3OwkJCS8qIENvbnRleHQgaW52b2x1bnRhcnkgc3dpdGNoIGNvdW50ZXIgKi8KKwogfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAppbmRleCBkZWJmNjgxLi44NjZiNzYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dApAQCAtMjUzLDcgKzI1Myw3IEBACiAKIAlUaGUgZmlyc3Qgb2YgdGhlc2UgdHdvIHJvdXRpbmVzIGlzIGludm9rZWQgYWZ0ZXIgbWFwX3ZtX2FyZWEoKQogCWhhcyBpbnN0YWxsZWQgdGhlIHBhZ2UgdGFibGUgZW50cmllcy4gIFRoZSBzZWNvbmQgaXMgaW52b2tlZAotCWJlZm9yZSB1bm1hcF92bV9hcmVhKCkgZGVsZXRlcyB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzLgorCWJlZm9yZSB1bm1hcF9rZXJuZWxfcmFuZ2UoKSBkZWxldGVzIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMuCiAKIFRoZXJlIGV4aXN0cyBhbm90aGVyIHdob2xlIGNsYXNzIG9mIGNwdSBjYWNoZSBpc3N1ZXMgd2hpY2ggY3VycmVudGx5CiByZXF1aXJlIGEgd2hvbGUgZGlmZmVyZW50IHNldCBvZiBpbnRlcmZhY2VzIHRvIGhhbmRsZSBwcm9wZXJseS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2Nkcm9tLzAwLUlOREVYCmluZGV4IDkxNmRhZmUuLjQzM2VkZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS8wMC1JTkRFWApAQCAtMiwzMiArMiwxMCBAQAogCS0gdGhpcyBmaWxlIChpbmZvIG9uIENELVJPTXMgYW5kIExpbnV4KQogTWFrZWZpbGUKIAktIG9ubHkgdXNlZCB0byBnZW5lcmF0ZSBUZVggb3V0cHV0IGZyb20gdGhlIGRvY3VtZW50YXRpb24uCi1henRjZAotCS0gaW5mbyBvbiBBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMvQ29ucmFkL0N5Q0RST00gZHJpdmVyLgogY2Ryb20tc3RhbmRhcmQudGV4CiAJLSBMYVRlWCBkb2N1bWVudCBvbiBzdGFuZGFyZGl6aW5nIHRoZSBDRC1ST00gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlLgotY2R1MzFhCi0JLSBpbmZvIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0QtUk9NIGRyaXZlci4KLWNtMjA2Ci0JLSBpbmZvIG9uIHRoZSBQaGlsaXBzL0xNUyBjbTIwNi9jbTI2MCBDRC1ST00gZHJpdmVyLgotZ3NjZAotCS0gaW5mbyBvbiB0aGUgR29sZHN0YXIgUjQyMCBDRC1ST00gZHJpdmVyLgogaWRlLWNkCiAJLSBpbmZvIG9uIHNldHRpbmcgdXAgYW5kIHVzaW5nIEFUQVBJIChha2EgSURFKSBDRC1ST01zLgotaXNwMTYKLQktIGluZm8gb24gdGhlIENELVJPTSBpbnRlcmZhY2Ugb24gSVNQMTYsIE1BRDE2IG9yIE1vemFydCBzb3VuZCBjYXJkLgotbWNkCi0JLSBpbmZvIG9uIGxpbWl0YXRpb25zIG9mIHN0YW5kYXJkIE1pdHN1bWkgQ0QtUk9NIGRyaXZlci4KLW1jZHgKLQktIGluZm8gb24gaW1wcm92ZWQgTWl0c3VtaSBDRC1ST00gZHJpdmVyLgotb3B0Y2QKLQktIGluZm8gb24gdGhlIE9wdGljcyBTdG9yYWdlIDgwMDAgQVQgQ0QtUk9NIGRyaXZlcgogcGFja2V0LXdyaXRpbmcudHh0CiAJLSBJbmZvIG9uIHRoZSBDRFJXIHBhY2tldCB3cml0aW5nIG1vZHVsZQotc2JwY2QKLQktIGluZm8gb24gdGhlIFNvdW5kQmxhc3Rlci9QYW5hc29uaWMgQ0QtUk9NIGludGVyZmFjZSBkcml2ZXIuCi1zamNkCi0JLSBpbmZvIG9uIHRoZSBTQU5ZTyBDRFItSDk0QSBDRC1ST00gaW50ZXJmYWNlIGRyaXZlci4KLXNvbnljZDUzNQotCS0gaW5mbyBvbiB0aGUgU29ueSBDRFUtNTM1IChhbmQgNTMxKSBDRC1ST00gZHJpdmVyLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9henRjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMDI5MC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2F6dGNkCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLSRJZDogUkVBRE1FLmF6dGNkLHYgMi42MCAxOTk3LzExLzI5IDA5OjUxOjI1IHJvb3QgRXhwIHJvb3QgJAotICAgICAgICAgIFJlYWRtZS1GaWxlIERvY3VtZW50YXRpb24vY2Ryb20vYXp0Y2QKLSAgICAgICAgICAgCQkJZm9yIAotCSAgICAgQVpURUNIIENELVJPTSBDREEyNjgtMDFBLCBPUkNISUQgQ0QtMzExMCwKLSAgICAgIE9LQU5PL1dFQVJORVMgQ0REMTEwLCBDT05SQUQgVFhDLCBDeUNEUk9NIENSNTIwLCBDUjU0MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0QtUk9NIERyaXZlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjYgYW5kIG5ld2VyCi0gICAgICAgICAgICAgICAgICAgKGZvciBvdGhlciBkcml2ZXMgc2VlIDYuLTguKQotCi1OT1RFOiBUSElTIERSSVZFUiBXSUxMIFdPUksgV0lUSCBUSEUgQ0QtUk9NIERSSVZFUyBMSVNURUQsIFdISUNIIEhBVkUKLSAgICAgIEEgUFJPUFJJRVRBUlkgSU5URVJGQUNFIChpbXBsZW1lbnRlZCBvbiBhIHNvdW5kIGNhcmQgb3Igb24gYW4KLSAgICAgIElTQS1BVC1idXMgY2FyZCkuIAotICAgICAgSVQgV0lMTCBERUZJTklURUxZIE5PVCBXT1JLIFdJVEggQ0QtUk9NIERSSVZFUyBXSVRIICpJREUqLUlOVEVSRkFDRSwKLSAgICAgIHN1Y2ggYXMgdGhlIEF6dGVjaCBDREEyNjktMDMxU0UgISEhIChUaGUgb25seSBrbm93biBleGNlcHRpb25zIGFyZQotICAgICAgJ2Zha2VkJyBJREUgZHJpdmVzIGxpa2UgdGhlIEN5Q0RST00gQ1I1MjBpZSB3aGljaCB3b3JrIHdpdGggYXp0Y2QKLSAgICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgc2VlIDcuKS4gSUYgWU9VJ1JFIFVTSU5HIEEgQ0QtUk9NIERSSVZFCi0gICAgICBXSVRIIElERS1JTlRFUkZBQ0UsIFNPTUVUSU1FUyBBTFNPIENBTExFRCBBVEFQSS1DT01QQVRJQkxFLCBQTEVBU0UgCi0gICAgICBVU0UgVEhFIGlkZS1jZC5jIERSSVZFUiwgV1JJVFRFTiBCWSBNQVJLIExPUkQgQU5EIFNDT1RUIFNOWURFUiAhCi0gICAgICBUSEUgU1RBTkRBUkQtS0VSTkVMIDEuMi54IE5PVyBBTFNPIFNVUFBPUlRTIElERS1DRFJPTS1EUklWRVMsIFNFRSBUSEUKLSAgICAgIEhBUkRESVNLICghKSBTRUNUSU9OIE9GIG1ha2UgY29uZmlnLCBXSEVOIENPTVBJTElORyBBIE5FVyBLRVJORUwhISEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29udGVudHMgb2YgdGhpcyBmaWxlOgotICAgICAgICAgICAgICAgICAgICAgICAgIDEuICBOT1RFCi0gICAgICAgICAgICAgICAgICAgICAgICAgMi4gIElOU1RBTExBVElPTgotICAgICAgICAgICAgICAgICAgICAgICAgIDMuICBDT05GSUdVUklORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuICBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotICAgICAgICAgICAgICAgICAgICAgICAgIDQuMSAgIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi0gICAgICAgICAgICAgICAgICAgICAgICAgNC4yICAgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi0gICAgICAgICAgICAgICAgICAgICAgICAgNS4gIEtOT1dOIFBST0JMRU1TLCBGVVRVUkUgREVWRUxPUE1FTlRTCi0JCQkgNS4xICAgTVVMVElTRVNTSU9OIFNVUFBPUlQKLQkJCSA1LjIgICBTVEFUVVMgUkVDT0dOSVRJT04KLQkJCSA1LjMgICBET1NFTVUncyBDRFJPTSBTVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgICAgICAgNi4gIEJVRyBSRVBPUlRTCi0gICAgICAgICAgICAgICAgICAgICAgICAgNy4gIE9USEVSIERSSVZFUwotICAgICAgICAgICAgICAgICAgICAgICAgIDguICBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCAuLi4gREVCVUdHSU5HICAKLSAgICAgICAgICAgICAgICAgICAgICAgICA5LiAgVEVDSE5JQ0FMIEhJU1RPUlkgT0YgVEhFIERSSVZFUgotICAgICAgICAgICAgICAgICAgICAgICAgMTAuICBBQ0tOT1dMRURHTUVOVFMKLSAgICAgICAgICAgICAgICAgICAgICAgIDExLiAgUFJPR1JBTU1JTkcgQUREIE9OUzogQ0RQTEFZLkMKLSAgICAgICAgICAgICAgICAgICAgICAgIEFQUEVORElYOiBTb3VyY2UgY29kZSBvZiBjZHBsYXkuYwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0xLiBOT1RFIAotVGhpcyBzb2Z0d2FyZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW4gYWxwaGEgYW5kIGJldGEgdGVzdCBhbmQgaXMgcGFydCBvZgotdGhlIHN0YW5kYXJkIGtlcm5lbCBzaW5jZSBrZXJuZWwgMS4xLjh4IHNpbmNlIERlY2VtYmVyIDE5OTQuIEl0IHdvcmtzIHdpdGgKLUFaVEVDSCBDREEyNjgtMDFBLCBPUkNISUQgQ0RTLTMxMTAsIE9SQ0hJRC9XRUFSTkVTIENERDExMCBhbmQgQ09OUkFEIFRYQyAKLShOci45OSAzMSAyMyAtc2VyaWVzIDA0KSBhbmQgaGFzIHByb3ZlbiB0byBiZSBzdGFibGUgd2l0aCBrZXJuZWwgCi12ZXJzaW9ucyAxLjAuOSBhbmQgbmV3ZXIuIEJ1dCB3aXRoIGFueSBzb2Z0d2FyZSB0aGVyZSBzdGlsbCBtYXkgYmUgYnVncyBpbiBpdC4gCi1TbyBpZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zLCB5b3UgYXJlIGludml0ZWQgdG8gaGVscCB1cyBpbXByb3ZlIHRoaXMgc29mdHdhcmUuIAotUGxlYXNlIHNlbmQgbWUgYSBkZXRhaWxlZCBidWcgcmVwb3J0IChzZWUgY2hhcHRlciBCVUcgUkVQT1JUUykuIFlvdSBhcmUgYWxzbyAKLWludml0ZWQgaW4gaGVscGluZyB1cyB0byBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGRyaXZlcywgd2hpY2ggYXJlIHN1cHBvcnRlZC4KLQotUGxlYXNlIHJlYWQgdGhlIFJFQURNRS1maWxlcyBjYXJlZnVsbHkgYW5kIGFsd2F5cyBrZWVwIGEgYmFja3VwIGNvcHkgb2YgeW91ciAKLW9sZCBrZXJuZWwsIGluIG9yZGVyIHRvIHJlYm9vdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyEKLQotMi4gSU5TVEFMTEFUSU9OCi1UaGUgZHJpdmVyIGNvbnNpc3RzIG9mIGEgaGVhZGVyIGZpbGUgJ2F6dGNkLmgnLCB3aGljaCBub3JtYWxseSBzaG91bGQgcmVzaWRlIAotaW4gL3Vzci9zcmMvbGludXgvZHJpdmVycy9jZHJvbSBhbmQgdGhlIHNvdXJjZSBjb2RlICdhenRjZC5jJywgd2hpY2ggbm9ybWFsbHkgCi1yZXNpZGVzIGluIHRoZSBzYW1lIHBsYWNlLiBJdCB1c2VzIC9kZXYvYXp0Y2QgKC9kZXYvYXp0Y2QwIGluIHNvbWUgZGlzdHJpLQotYnV0aW9ucyksIHdoaWNoIG11c3QgYmUgYSB2YWxpZCBibG9jayBkZXZpY2Ugd2l0aCBtYWpvciBudW1iZXIgMjkgYW5kIHJlc2lkZSAKLWluIGRpcmVjdG9yeSAvZGV2LiBUbyBtb3VudCBhIENELVJPTSwgeW91ciBrZXJuZWwgbmVlZHMgdG8gaGF2ZSB0aGUgSVNPOTY2MC0KLWZpbGVzeXN0ZW0gc3VwcG9ydCBpbmNsdWRlZC4KLQotUExFQVNFIE5PVEU6IGF6dGNkLmMgaGFzIGJlZW4gZGV2ZWxvcGVkIGluIHBhcmFsbGVsIHRvIHRoZSBsaW51eCBrZXJuZWwsCi13aGljaCBoYWQgYW5kIGlzIGhhdmluZyBtYW55IG1ham9yIGFuZCBtaW5vciBjaGFuZ2VzIHdoaWNoIGFyZSBub3QgYmFja3dhcmQKLWNvbXBhdGlibGUuIFF1aXRlIGRlZmluaXRlbHkgYXp0Y2QuYyB2ZXJzaW9uIDEuODAgYW5kIG5ld2VyIHdpbGwgTk9UIHdvcmsKLWluIGtlcm5lbHMgb2xkZXIgdGhhbiAxLjMuMzMuIFNvIHBsZWFzZSBhbHdheXMgdXNlIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCi1vZiBhenRjZC5jIHdpdGggdGhlIGFwcHJvcHJpYXRlIGxpbnV4LWtlcm5lbC4KLQotMy4gIENPTkZJR1VSSU5HIFlPVVIgS0VSTkVMCi1JZiB5b3VyIGtlcm5lbCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIHVzaW5nIHRoZSBBWlRFQ0ggZHJpdmVyIHlvdSB3aWxsCi1zZWUgdGhlIGZvbGxvd2luZyBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzOgotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRHJpdmVyVmVyc2lvbj08dmVyc2lvbiBudW1iZXI+IEJhc2VBZGRyZXNzPTxiYXNlYWRkcmVzcz4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEZpcm13YXJlVmVyc2lvbj08ZmlybXdhcmUgdmVyc2lvbiBpZCBvZiB5b3VyIEkvTy1jYXJkPj4+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiA8ZHJpdmUgdHlwZT4gZGV0ZWN0ZWQKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IEVuZAotSWYgdGhlIG1lc3NhZ2UgbG9va3MgZGlmZmVyZW50IGFuZCB5b3UgYXJlIHN1cmUgdG8gaGF2ZSBhIHN1cHBvcnRlZCBkcml2ZSwKLWl0IG1heSBoYXZlIGEgZGlmZmVyZW50IGJhc2UgYWRkcmVzcy4gVGhlIEF6dGVjaCBkcml2ZXIgZG9lcyBsb29rIGZvciB0aGUgCi1DRC1ST00gZHJpdmUgYXQgdGhlIGJhc2UgYWRkcmVzcyBzcGVjaWZpZWQgaW4gYXp0Y2QuaCBhdCBjb21waWxlIHRpbWUuIFRoaXMgCi1hZGRyZXNzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBib290IHBhcmFtZXRlciBhenRjZD0uLi4uWW91IHNob3VsZCByZWJvb3QgYW5kIAotc3RhcnQgTGludXggd2l0aCBib290IHBhcmFtZXRlciBhenRjZD08YmFzZSBhZGRyZXNzPiwgZS5nLiBhenRjZD0weDMyMC4gSWYgCi15b3UgZG8gbm90IGtub3cgdGhlIGJhc2UgYWRkcmVzcywgc3RhcnQgeW91ciBQQyB3aXRoIERPUyBhbmQgbG9vayBhdCB0aGUgYm9vdCAKLW1lc3NhZ2Ugb2YgeW91ciBDRC1ST00ncyBET1MgZHJpdmVyLiBJZiB0aGF0IHN0aWxsIGRvZXMgbm90IGhlbHAsIHVzZSBib290Ci1wYXJhbWV0ZXIgYXp0Y2Q9PGJhc2UgYWRkcmVzcz4sMHg3OSAsIHRoaXMgdGVsbHMgYXp0Y2QgdG8gdHJ5IGEgbGl0dGxlIGhhcmRlci4KLWF6dGNkIG1heSBiZSBjb25maWd1cmVkIHRvIHVzZSBhdXRvcHJvYmluZyB0aGUgYmFzZSBhZGRyZXNzIGJ5IHJlY29tcGlsaW5nCi1pdCAoc2VlIGNoYXB0ZXIgNC4pLgotCi1JZiB0aGUgbWVzc2FnZSBsb29rcyBjb3JyZWN0LCBhcyB1c2VyICdyb290JyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gbW91bnQgdGhlIAotZHJpdmUgYnkKLSAgICAgICAgICBtb3VudCAtdCBpc285NjYwIC1yIC9kZXYvYXp0Y2QwIC9tbnQKLWFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0vZGV2L2F6dGNkMCBhbmQgL21udCBkbyBleGlzdCBhbmQgY3JlYXRlIHRoZW0sIGlmIG5lY2Vzc2FyeSBieSBkb2luZwotICAgICAgbWtub2QgL2Rldi9henRjZDAgYiAyOSAwCi0gICAgICBta2RpciAvbW50ICAgICAgICAgICAgICAgICAgICAgICAKLQotSWYgeW91IHN0aWxsIGdldCBhIGRpZmZlcmVudCBtZXNzYWdlIHdoaWxlIExpbnV4IGJvb3RzIG9yIHdoZW4geW91IGdldCB0aGUgCi1tZXNzYWdlLCB0aGF0IHRoZSBJU085NjYwLWZpbGVzeXN0ZW0gaXMgbm90IHN1cHBvcnRlZCBieSB5b3VyIGtlcm5lbCwgd2hlbgoteW91IHRyeSB0byBtb3VudCB0aGUgQ0QtUk9NIGRyaXZlLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWwuCi0KLUlmIHlvdSBkbyAqbm90KiBoYXZlIGFuIEF6dGVjaC9PcmNoaWQvT2thbm8vV2Vhcm5lcy9UWEMgZHJpdmUgYW5kIHdhbnQgdG8gCi1ieXBhc3MgZHJpdmUgZGV0ZWN0aW9uIGR1cmluZyBMaW51eCBib290IHVwLCBzdGFydCB3aXRoIGJvb3QgcGFyYW1ldGVyIGF6dGNkPTAuCi0KLU1vc3QgZGlzdHJpYnV0aW9ucyBub3dhZGF5cyBkbyBjb250YWluIGEgYm9vdCBkaXNrIGltYWdlIGNvbnRhaW5pbmcgYXp0Y2QuCi1QbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5vdCB3b3JrIHdpdGggSURFL0FUQVBJIGRyaXZlcyEgV2l0aCB0aGVzZSAKLXlvdSBtdXN0IHVzZSBpZGUtY2QuYyBpbnN0ZWFkLgotCi00LiBSRUNPTVBJTElORyBZT1VSIEtFUk5FTAotSWYgeW91ciBrZXJuZWwgaXMgbm90IHlldCBjb25maWd1cmVkIGZvciB0aGUgQVpURUNIIGRyaXZlciBhbmQgdGhlIElTTzk2NjAtCi1maWxlc3lzdGVtLCB5b3UgaGF2ZSB0byByZWNvbXBpbGUgeW91ciBrZXJuZWw6IAotCi0tIEVkaXQgYXp0Y2QuaCB0byBzZXQgdGhlIEkvTy1hZGRyZXNzIHRvIHlvdXIgSS9PLUJhc2UgYWRkcmVzcyAoQVpUX0JBU0VfQUREUiksIAotICB0aGUgZHJpdmVyIGRvZXMgbm90IHVzZSBpbnRlcnJ1cHRzIG9yIERNQSwgc28gaWYgeW91IGFyZSB1c2luZyBhbiBBWlRFQ0gKLSAgQ0QyNjgsIGFuIE9SQ0hJRCBDRC0zMTEwIG9yIE9SQ0hJRC9XRUFSTkVTIENERDExMCB0aGF0J3MgdGhlIG9ubHkgaXRlbSB5b3UgCi0gIGhhdmUgdG8gc2V0IHVwLiBJZiB5b3UgaGF2ZSBhIHNvdW5kY2FyZCwgcmVhZCBjaGFwdGVyIDQuMi4KLSAgVXNlcnMgb2Ygb3RoZXIgZHJpdmVzIHNob3VsZCByZWFkIGNoYXB0ZXIgT1RIRVIgRFJJVkVTIG9mIHRoaXMgZmlsZS4KLSAgWW91IGFsc28gY2FuIGNvbmZpZ3VyZSB0aGF0IGFkZHJlc3MgYnkga2VybmVsIGJvb3QgcGFyYW1ldGVyIGF6dGNkPS4uLiAKLS0gYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotICBBWlRfQkFTRV9BRERSIHRvICctMScuIEluIHRoYXQgY2FzZSBhenRjZCBwcm9iZXMgdGhlIGFkZHJlc3NlcyBsaXN0ZWQgCi0gIHVuZGVyIEFaVF9CQVNFX0FVVE8uIEJ1dCBwbGVhc2UgcmVtZW1iZXIsIHRoYXQgYXV0b3Byb2JpbmcgYWx3YXlzIG1heSAKLSAgaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotLSBUaGVyZSBhcmUgc29tZSBvdGhlciBwb2ludHMsIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIGF1dG8tZWplY3QgdGhlCi0gIENEIHdoZW4gdW5tb3VudGluZyBhIGRyaXZlLCB0cmF5IGxvY2tpbmcgZXRjLiwgc2VlIGF6dGNkLmggZm9yIGRldGFpbHMuCi0tIElmIHlvdSdyZSB1c2luZyBhIGxpbnV4IGtlcm5lbCB2ZXJzaW9uIHByaW9yIHRvIDIuMS4wLCBpbiBhenRjZC5oCi0gIHVuY29tbWVudCB0aGUgbGluZSAnI2RlZmluZSBBWlRfS0VSTkVMX1BSSU9SXzJfMScKLS0gQnVpbGQgYSBuZXcga2VybmVsLCBjb25maWd1cmUgaXQgZm9yICdBenRlY2gvT3JjaGlkL09rYW5vL1dlYXJuZXMgc3VwcG9ydCcgCi0gIChpZiB5b3Ugd2FudCBhenRjZCB0byBiZSBwYXJ0IG9mIHRoZSBrZXJuZWwpLiBEbyBub3QgY29uZmlndXJlIGl0IGZvcgotICAnQXp0ZWNoLi4uIHN1cHBvcnQnLCBpZiB5b3Ugd2FudCB0byB1c2UgYXp0Y2QgYXMgYSBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUuIAotICBCdXQgaW4gYW55IGNhc2UgeW91IG11c3QgaGF2ZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGluY2x1ZGVkIGluIHlvdXIKLSAga2VybmVsLgotLSBBY3RpdmF0ZSB0aGUgbmV3IGtlcm5lbCwgbm9ybWFsbHkgdGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgTElMTyAoZG9uJ3QgZm9yLQotICBnZXQgdG8gY29uZmlndXJlIGl0IGJlZm9yZSBhbmQgdG8ga2VlcCBhIGNvcHkgb2YgeW91ciBvbGQga2VybmVsIGluIGNhc2UKLSAgc29tZXRoaW5nIGdvZXMgd3JvbmchKS4KLS0gUmVib290Ci0tIElmIHlvdSd2ZSBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgeW91IG5vdyBzaG91bGQgc2VlIGR1cmluZyBib290IAotICBzb21lIG1lc3NhZ2VzIGxpa2UKLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IERyaXZlclZlcnNpb249PHZlcnNpb24gbnVtYmVyPiBCYXNlQWRkcmVzcz08YmFzZWFkZHJlc3M+Ci0gICAgQXp0ZWNoIENELVJPTSBJbml0OiBGaXJtd2FyZVZlcnNpb249PGZpcm13YXJlIHZlcnNpb24gaWQgb2YgeW91ciBJL08tY2FyZD4KLSAgICBBenRlY2ggQ0QtUk9NIEluaXQ6IDxkcml2ZSB0eXBlPiBkZXRlY3RlZAotICAgIEF6dGVjaCBDRC1ST00gSW5pdDogRW5kCi0tIElmIHlvdSBoYXZlIG5vdCBpbmNsdWRlZCBhenRjZCBpbiB5b3VyIGtlcm5lbCwgYnV0IHdhbnQgdG8gbG9hZCBhenRjZCBhcyBhIAotICBydW4gdGltZSBsb2FkYWJsZSBtb2R1bGUgc2VlIDQuMS4gCi0tIElmIHRoZSBtZXNzYWdlIGxvb2tzIGNvcnJlY3QsIGFzIHVzZXIgJ3Jvb3QnIHlvdSBzaG91bGQgYmUgYWJsZSB0byBtb3VudCAKLSAgdGhlIGRyaXZlIGJ5Ci0gICAgICAgICAgbW91bnQgLXQgaXNvOTY2MCAtciAvZGV2L2F6dGNkMCAvbW50Ci0gIGFuZCB1c2UgaXQgYXMgYW55IG90aGVyIGZpbGVzeXN0ZW0uIChJZiB0aGlzIGRvZXMgbm90IHdvcmssIGNoZWNrIGlmCi0gIC9kZXYvYXp0Y2QwIGFuZCAvbW50IGRvIGV4aXN0IGFuZCBjcmVhdGUgdGhlbSwgaWYgbmVjZXNzYXJ5IGJ5IGRvaW5nCi0gICAgICBta25vZCAvZGV2L2F6dGNkMCBiIDI5IDAKLSAgICAgIG1rZGlyIC9tbnQgICAgICAgICAgICAgICAgICAgICAgIAotLSBJZiB0aGlzIHN0aWxsIGRvZXMgbm90IGhlbHAsIHNlZSBjaGFwdGVycyBPVEhFUiBEUklWRVMgYW5kIERFQlVHR0lORy4KLQotNC4xIEFaVENEIEFTIEEgUlVOLVRJTUUgTE9BREFCTEUgTU9EVUxFCi1JZiB5b3UgZG8gbm90IG5lZWQgYXp0Y2QgcGVybWFuZW50bHksIHlvdSBjYW4gYWxzbyBsb2FkIGFuZCByZW1vdmUgdGhlIGRyaXZlcgotZHVyaW5nIHJ1bnRpbWUgdmlhIGluc21vZCBhbmQgcm1tb2QuIFRvIGJ1aWxkIGF6dGNkIGFzIGEgbG9hZGFibGUgbW9kdWxlIHlvdSAKLW11c3QgY29uZmlndXJlIHlvdXIga2VybmVsIGZvciBBWlRFQ0ggbW9kdWxlIHN1cHBvcnQgKGFuc3dlciAnbScgd2hlbiBjb24tCi1maWd1cmluZyB0aGUga2VybmVsKS4gQW55aG93LCB5b3UgbWF5IHJ1biBpbnRvIHByb2JsZW1zLCBpZiB0aGUgdmVyc2lvbiBvZiAKLXlvdXIgYm9vdCBrZXJuZWwgaXMgbm90IHRoZSBzYW1lIHRoYW4gdGhlIHNvdXJjZSBrZXJuZWwgdmVyc2lvbiwgZnJvbSB3aGljaCAKLXlvdSBjcmVhdGUgdGhlIG1vZHVsZXMuIFNvIHJlYnVpbGQgeW91ciBrZXJuZWwsIGlmIG5lY2Vzc2FyeS4gCi0KLU5vdyBlZGl0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgeW91ciBBWlRFQ0ggaW50ZXJmYWNlIGNhcmQgaW4KLS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vYXp0Y2QuaCB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuIAotYXp0Y2QgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGF1dG9wcm9iaW5nIHRoZSBiYXNlIGFkZHJlc3MgYnkgc2V0dGluZwotQVpUX0JBU0VfQUREUiB0byAnLTEnLiBJbiB0aGF0IGNhc2UgYXp0Y2QgcHJvYmVzIHRoZSBhZGRyZXNzZXMgbGlzdGVkIAotdW5kZXIgQVpUX0JBU0VfQVVUTy4gQnV0IHBsZWFzZSByZW1lbWJlciwgdGhhdCBhdXRvcHJvYmluZyBhbHdheXMgbWF5IAotaW5jb3JyZWN0bHkgaW5mbHVlbmNlIG90aGVyIGhhcmR3YXJlIGNvbXBvbmVudHMgdG9vIQotVGhlcmUgYXJlIGFsc28gc29tZSBzcGVjaWFsIGZlYXR1cmVzIHdoaWNoIG1heSBiZSBjb25maWd1cmVkLCBlLmcuIAotYXV0by1lamVjdCBhIENEIHdoZW4gdW5tb3VudGluZyB0aGUgZHJpdmUgZXRjOyBzZWUgYXp0Y2QuaCBmb3IgZGV0YWlscy4gCi1UaGVuIGNoYW5nZSB0byAvdXNyL3NyYy9saW51eCBhbmQgZG8gYSAKLSAgICAgICAgICAgICAgICAgICAgbWFrZSBtb2R1bGVzICAKLQkgICAgICAgICAgICBtYWtlIG1vZHVsZXNfaW5zdGFsbAotQWZ0ZXIgdGhhdCB5b3UgY2FuIHJ1bi10aW1lIGxvYWQgdGhlIGRyaXZlciB2aWEKLSAgICAgICAgICAgICAgICAgICAgaW5zbW9kIC9saWIvbW9kdWxlcy9YLlguWC9taXNjL2F6dGNkLm8KLWFuZCByZW1vdmUgaXQgdmlhICAgcm1tb2QgIGF6dGNkLgotSWYgeW91IGRpZCBub3Qgc2V0IHRoZSBjb3JyZWN0IGJhc2UgYWRkcmVzcyBpbiBhenRjZC5oLCB5b3UgY2FuIGFsc28gc3VwcGx5IHRoZQotYmFzZSBhZGRyZXNzIHdoZW4gbG9hZGluZyB0aGUgZHJpdmVyIHZpYQotICAgICAgICAgICAgICAgICAgICBpbnNtb2QgL2xpYi9tb2R1bGVzL1guWC5YL21pc2MvYXp0Y2QubyBhenRjZD08YmFzZSBhZGRyZXNzPgotQWdhaW4gc3BlY2lmeWluZyBhenRjZD0tMSB3aWxsIGNhdXNlIGF1dG9wcm9iaW5nLgotSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBpc285NjYwLWZpbGVzeXN0ZW0gaW4geW91ciBib290IGtlcm5lbCwgeW91IGFsc28gaGF2ZQotdG8gbG9hZCBpdCBiZWZvcmUgeW91IGNhbiBtb3VudCB0aGUgQ0RST006Ci0gICAgICAgICAgICAgICAgICAgIGluc21vZCAvbGliL21vZHVsZXMvWC5YLlgvZnMvaXNvZnMubwotVGhlIG1vdW50IHByb2NlZHVyZSB3b3JrcyBhcyBkZXNjcmliZWQgaW4gNC4gYWJvdmUuCi0oSW4gYWxsIGNvbW1hbmRzICdYLlguWCcgaXMgdGhlIGN1cnJlbnQgbGludXgga2VybmVsIHZlcnNpb24gbnVtYmVyKQotCi00LjIgQ0RST00gQ09OTkVDVEVEIFRPIEEgU09VTkRDQVJECi1Nb3N0IHNvdW5kY2FyZHMgZG8gaGF2ZSBhIGJ1cyBpbnRlcmZhY2UgdG8gdGhlIENEUk9NLWRyaXZlLiBJbiBtYW55IGNhc2VzCi10aGlzIHNvdW5kY2FyZCBuZWVkcyB0byBiZSBjb25maWd1cmVkLCBiZWZvcmUgdGhlIENEUk9NIGNhbiBiZSB1c2VkLiBUaGlzCi1jb25maWd1cmF0aW9uIHByb2NlZHVyZSBjb25zaXN0cyBvZiB3cml0aW5nIHNvbWUga2luZCBvZiBpbml0aWFsaXphdGlvbgotZGF0YSB0byB0aGUgc291bmRjYXJkIHJlZ2lzdGVycy4gVGhlIEFaVEVDSC1DRFJPTSBkcml2ZXIgaW4gdGhlIG1vbWVudCBkb2VzCi1vbmx5IHN1cHBvcnQgb25lIHR5cGUgb2Ygc291bmRjYXJkIChTb3VuZFdhdmUzMikuIFVzZXJzIG9mIG90aGVyIHNvdW5kY2FyZHMKLXNob3VsZCB0cnkgdG8gYm9vdCBET1MgZmlyc3QgYW5kIGxldCB0aGVpciBET1MgZHJpdmVycyBpbml0aWFsaXplIHRoZQotc291bmRjYXJkIGFuZCBDRFJPTSwgdGhlbiB3YXJtIGJvb3QgKG9yIHVzZSBsb2FkbGluKSB0aGVpciBQQyB0byBzdGFydAotTGludXguCi1TdXBwb3J0IGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIFNvdW5kV2F2ZTMyLXNvdW5kY2FyZHMgaXMgZGlyZWN0bHkKLWltcGxlbWVudGVkIGluIHRoZSBBWlRFQ0ggZHJpdmVyLiBQbGVhc2UgZWRpdCBsaW51eC9kcml2ZXJzL2Nkcm9tL2F6dGRjLmgsCi11bmNvbW1lbnQgbGluZSAnI2RlZmluZSBBWlRfU1czMicgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yCi1BWlRfQkFTRV9BRERSIGFuZCBBWlRfU1czMl9CQVNFX0FERFIuIFRoaXMgc3VwcG9ydCB3YXMgdGVzdGVkIHdpdGggYW4gT3JjaGlkCi1DRFMtMzExMCBjb25uZWN0ZWQgdG8gYSBTb3VuZFdhdmUzMi4KLUlmIHlvdSB3YW50IHlvdXIgc291bmRjYXJkIHRvIGJlIHN1cHBvcnRlZCwgZmluZCBvdXQsIGhvdyBpdCBuZWVkcyB0byBiZQotY29uZmlndXJlZCBhbmQgbWFpbCBtZSAoc2VlIDYuKSB0aGUgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24uIAotCi01LiBLTk9XTiBQUk9CTEVNUywgRlVUVVJFIERFVkVMT1BNRU5UUwotNS4xIE1VTFRJU0VTU0lPTiBTVVBQT1JUCi1NdWx0aXNlc3Npb24gc3VwcG9ydCBmb3IgQ0QncyBzdGlsbCBpcyBhIG15dGguIEkgaW1wbGVtZW50ZWQgYW5kIHRlc3RlZCBhIGJhc2ljCi1zdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gYW5kIFhBIENEcywgYnV0IEkgc3RpbGwgaGF2ZSBub3QgZW5vdWdoIENEcyBhbmQgYXBwbGktCi1jYXRpb25zIHRvIHRlc3QgaXQgcmlnb3JvdXNseS4gU28gaWYgeW91J2QgbGlrZSB0byBoZWxwIG1lLCBwbGVhc2UgY29udGFjdCBtZQotKEVtYWlsIGFkZHJlc3Mgc2VlIGJlbG93KS4gQXMgb2YgdmVyc2lvbiAxLjQgYW5kIG5ld2VyIHlvdSBjYW4gZW5hYmxlIHRoZSAKLW11bHRpc2Vzc2lvbiBzdXBwb3J0IGluIGF6dGNkLmggYnkgc2V0dGluZyBBWlRfTVVMVElTRVNTSU9OIHRvIDEuIERvaW5nIHNvIAotd2lsbCBjYXVzZSB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIHRvIGRlYWwgd2l0aCBtdWx0aXNlc3Npb24gQ0RzLCBpZS4gcmVkaXJlY3QgCi1yZXF1ZXN0cyB0byB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCBzZXNzaW9uLCAKLXdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvIG9mIGFsbCBwcmV2aW91cyBzZXNzaW9ucyBldGMuLiBJZiB5b3UgZG8gc2V0IAotQVpUX01VTFRJU0VTU0lPTiB0byAwLCB5b3UgY2FuIHVzZSBtdWx0aXNlc3Npb24gQ0RzIGFueXdheS4gSW4gdGhhdCBjYXNlIHRoZSAKLWRyaXZlJ3MgZmlybXdhcmUgd2lsbCBkbyBhdXRvbWF0aWMgcmVkaXJlY3Rpb24uIEZvciB0aGUgSVNPOTY2MC1maWxlc3lzdGVtIGFueSAKLW11bHRpc2Vzc2lvbiBDRCAgd2lsbCB0aGVuIGxvb2sgbGlrZSBhICdub3JtYWwnIHNpbmdsZSBzZXNzaW9uIENELiBCdXQgbmV2ZXItCi10aGVsZXNzIHRoZSBkYXRhIG9mIGFsbCBzZXNzaW9ucyBhcmUgdmlld2FibGUgYW5kIGFjY2Vzc2libGUuIFNvIHdpdGggcHJhY3RpY2FsLQotbHkgYWxsIHJlYWwgd29ybGQgYXBwbGljYXRpb25zIHlvdSB3b24ndCBub3RpY2UgdGhlIGRpZmZlcmVuY2UuIEJ1dCBhcyBmdXR1cmUKLWFwcGxpY2F0aW9ucyBtYXkgbWFrZSB1c2Ugb2YgYWR2YW5jZWQgbXVsdGlzZXNzaW9uIGZlYXR1cmVzLCBJJ3ZlIHN0YXJ0ZWQgdG8KLWltcGxlbWVudCB0aGUgaW50ZXJmYWNlIGZvciB0aGUgSVNPOTY2MCBtdWx0aXNlc3Npb24gaW50ZXJmYWNlIHZpYSBpb2N0bAotQ0RST01NVUxUSVNFU1NJT04uCi0KLTUuMiBTVEFUVVMgUkVDT0dOSVRJT04KLVRoZSBkcml2ZSBzdGF0dXMgcmVjb2duaXRpb24gZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gYWxsIGNhc2VzLiBDaGFuZ2luZwotYSBkaXNrIG9yIGhhdmluZyB0aGUgZG9vciBvcGVuLCB3aGVuIGEgZHJpdmUgaXMgYWxyZWFkeSBtb3VudGVkLCBpcyBkZXRlY3RlZCAKLWJ5IHRoZSBBenRlY2ggZHJpdmVyIGl0c2VsZiwgYnV0IG5ldmVydGhlbGVzcyBjYXVzZXMgbXVsdGlwbGUgcmVhZCBhdHRlbXB0cwotYnkgdGhlIGRpZmZlcmVudCBsYXllcnMgb2YgdGhlIElTTzk2NjAtZmlsZXN5c3RlbSBkcml2ZXIsIHdoaWNoIGZpbmFsbHkgdGltZW91dCwKLXNvIHlvdSBoYXZlIHRvIHdhaXQgcXVpdGUgYSBsaXR0bGUuLi4gQnV0IGlzbid0IGl0IGJhZCBzdHlsZSB0byBjaGFuZ2UgYSBkaXNrIAotaW4gYSBtb3VudGVkIGRyaXZlLCBhbnlob3cgPyEKLQotVGhlIGRyaXZlciB1c2VzIGJ1c3kgd2FpdCBpbiBtb3N0IGNhc2VzIGZvciB0aGUgZHJpdmUgaGFuZHNoYWtlIChtYWNyb3MKLVNURU5fTE9XIGFuZCBEVEVOX0xPVykuIEkgdGVzdGVkIHdpdGggYSA0ODYvRFgyIGF0IDY2TUh6IGFuZCBhIFBlbnRpdW0gYXQKLTYwTUh6IGFuZCA5ME1Iei4gV2hlbmV2ZXIgeW91IHVzZSBhIG11Y2ggZmFzdGVyIG1hY2hpbmUgeW91IGFyZSBsaWtlbHkgdG8gZ2V0IAotdGltZW91dCBtZXNzYWdlcy4gSW4gdGhhdCBjYXNlIGVkaXQgYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgCi1BWlRfVElNRU9VVC4gCi0KLUZvciBzb21lICdzbG93JyBkcml2ZSBjb21tYW5kcyBJIGltcGxlbWVudGVkIHdhaXRpbmcgd2l0aCBhIHRpbWVyIHdhaXRxdWV1ZQotKG1hY3JvIFNURU5fTE9XX1dBSVQpLiBJZiB5b3UgZ2V0IHRoaXMgdGltZW91dCBtZXNzYWdlLCB5b3UgbWF5IGFsc28gZWRpdAotYXp0Y2QuaCBhbmQgaW5jcmVhc2UgdGhlIHRpbWVvdXQgdmFsdWUgQVpUX1NUQVRVU19ERUxBWS4gVGhlIHdhaXRxdWV1ZSBoYXMKLXNob3duIHRvIGJlIGEgbGl0dGxlIGNyaXRpY2FsLiBJZiB5b3UgZ2V0IGtlcm5lbCBwYW5pYyBtZXNzYWdlcywgZWRpdCBhenRjZC5jCi1hbmQgc3Vic3RpdHV0ZSBTVEVOX0xPV19XQUlUIGJ5IFNURU5fTE9XLiBCdXN5IHdhaXRpbmcgd2l0aCBTVEVOX0xPVyBpcyBtb3JlCi1zdGFibGUsIGJ1dCBhbHNvIGNhdXNlcyBDUFUgb3ZlcmhlYWQuCi0KLTUuMyBET1NFTVUncyBDRC1ST00gU1VQUE9SVAotV2l0aCByZWxlYXNlIDEuMjAgYXp0Y2Qgd2FzIG1vZGlmaWVkIHRvIGFsbG93IGFjY2VzcyB0byBDRC1ST01TIHdoZW4gcnVubmluZwotdW5kZXIgZG9zZW11LTAuNjAuMCBhenRjZC12ZXJzaW9ucyBiZWZvcmUgMS4yMCBhcmUgbW9zdCBsaWtlbHkgdG8gY3Jhc2gKLUxpbnV4LCB3aGVuIGEgQ0QtUk9NIGlzIGFjY2Vzc2VkIHVuZGVyIGRvc2VtdS4gVGhpcyBwcm9ibGVtIGhhcyBwYXJ0bHkgYmVlbgotZml4ZWQsIGJ1dCBzdGlsbCB3aGVuIGFjY2Vzc2luZyBhIGRpcmVjdG9yeSBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlIHN5c3RlbQotbWlnaHQgaGFuZyBmb3Igc29tZSAzMHNlYy4gU28gYmUgcGF0aWVudCwgd2hlbiB1c2luZyBkb3NlbXUncyBDRC1ST00gc3VwcG9ydAotaW4gY29tYmluYXRpb24gd2l0aCBhenRjZCA6LSkgISAKLVRoaXMgcHJvYmxlbSBoYXMgbm93IChKdWx5IDE5OTUpIGJlZW4gZml4ZWQgYnkgYSBtb2RpZmljYXRpb24gdG8gZG9zZW11J3MKLUNELVJPTSBkcml2ZXIuIFRoZSBuZXcgdmVyc2lvbiBjYW1lIHdpdGggZG9zZW11LTAuNjAuMiwgc2VlIGRvc2VtdSdzCi1SRUFETUUuQ0RST00uCi0KLTYuIEJVRyBSRVBPUlRTCi1QbGVhc2Ugc2VuZCBkZXRhaWxlZCBidWcgcmVwb3J0cyBhbmQgYnVnIGZpeGVzIHZpYSBFTWFpbCB0bwotCi0gICAgICAgIFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUKLQotUGxlYXNlIGluY2x1ZGUgYSBkZXNjcmlwdGlvbiBvZiB5b3VyIENELVJPTSBkcml2ZSB0eXBlIGFuZCBpbnRlcmZhY2UgY2FyZCwgCi10aGUgZXhhY3QgZmlybXdhcmUgbWVzc2FnZSBkdXJpbmcgTGludXggYm9vdHVwLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIAotQVpURUNILUNEUk9NLWRyaXZlciBhbmQgdGhlIExpbnV4IGtlcm5lbCB2ZXJzaW9uLiBBbHNvIGEgZGVzY3JpcHRpb24gb2YgeW91ciAKLXN5c3RlbSdzIG90aGVyIGhhcmR3YXJlIGNvdWxkIGJlIG9mIGludGVyZXN0LCBlc3BlY2lhbGx5IG1pY3JvcHJvY2Vzc29yIHR5cGUsIAotY2xvY2sgZnJlcXVlbmN5LCBvdGhlciBpbnRlcmZhY2UgY2FyZHMgc3VjaCBhcyBzb3VuZGNhcmRzLCBldGhlcm5ldCBhZGFwdGVyLCAKLWdhbWUgY2FyZHMgZXRjLi4KLQotSSB3aWxsIHRyeSB0byBjb2xsZWN0IHRoZSByZXBvcnRzIGFuZCBtYWtlIHRoZSBuZWNlc3NhcnkgbW9kaWZpY2F0aW9ucyBmcm9tIAotdGltZSB0byB0aW1lLiBJIG1heSBhbHNvIGNvbWUgYmFjayB0byB5b3UgZGlyZWN0bHkgd2l0aCBzb21lIGJ1ZyBmaXhlcyBhbmQgCi1hc2sgeW91IHRvIGRvIGZ1cnRoZXIgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCi1FZGl0b3JzIG9mIENELVJPTXMgYXJlIGludml0ZWQgdG8gc2VuZCBhICdjb29wZXJhdGlvbicgY29weSBvZiB0aGVpcgotQ0QtUk9NcyB0byB0aGUgdm9sdW50ZWVycywgd2hvIHByb3ZpZGVkIHRoZSBDRC1ST00gc3VwcG9ydCBmb3IgTGludXguIE15Ci1zbmFpbCBtYWlsIGFkZHJlc3MgZm9yIHN1Y2ggJ3N0dWZmJyBpcwotICAgICAgICAgICBQcm9mLiBEci4gVy4gWmltbWVybWFubgotICAgICAgICAgICBGYWNoaG9jaHNjaHVsZSBmdWVyIFRlY2huaWsgRXNzbGluZ2VuCi0gICAgICAgICAgIEZhY2hiZXJlaWNoIElUCi0gICAgICAgICAgIEZsYW5kZXJuc3RyYXNzZSAxMDEKLSAgICAgICAgICAgRC03MzczMiBFc3NsaW5nZW4KLSAgICAgICAgICAgR2VybWFueQotCi0KLTcuIE9USEVSIERSSVZFUwotVGhlIGZvbGxvd2luZyBkcml2ZXMgT1JDSElEIENEUzMxMTAsIE9LQU5PIENERDExMCwgV0VBUk5FUyBDREQxMTAgYW5kIENvbnJhZAotVFhDIE5yLiA5OTMxMjMtc2VyaWVzIDA0IG5lYXJseSBsb29rIHRoZSBzYW1lIGFzIEFaVEVDSCBDREEyNjgtMDFBLCBlc3BlY2lhbGx5IAotdGhleSBzZWVtIHRvIHVzZSB0aGUgc2FtZSBjb21tYW5kIGNvZGVzLiBTbyBpdCB3YXMgcXVpdGUgc2ltcGxlIHRvIG1ha2UgdGhlIAotQVpURUNIIGRyaXZlciB3b3JrIHdpdGggdGhlc2UgZHJpdmVzLiAKLQotVW5mb3J0dW5hdGVseSBJIGRvIG5vdCBoYXZlIGFueSBvZiB0aGVzZSBkcml2ZXMgYXZhaWxhYmxlLCBzbyBJIGNvdWxkbid0IHRlc3QKLWl0IG15c2VsZi4gSW4gc29tZSBpbnN0YWxsYXRpb25zLCBpdCBzZWVtcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgZHJpdmUgCi13aXRoIHRoZSBET1MgZHJpdmVyIGJlZm9yZSAoZXNwZWNpYWxseSBpZiBjb21iaW5lZCB3aXRoIGEgc291bmQgY2FyZCkgYW5kIHRoZW4gCi1kbyBhIHdhcm0gYm9vdCAoQ1RSTC1BTFQtUkVTRVQpIG9yIHN0YXJ0IExpbnV4IGZyb20gRE9TLCBlLmcuIHdpdGggJ2xvYWRsaW4nLgotCi1JZiB5b3UgZG8gbm90IHN1Y2NlZWQsIHJlYWQgY2hhcHRlciBERUJVR0dJTkcuIFRoYW5rcyBpbiBhZHZhbmNlIQotCi1Tb3JyeSBmb3IgdGhlIGluY29udmVuaWVuY2UsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gZGV2ZWxvcCBmb3IgaGFyZHdhcmUsIAotd2hpY2ggeW91IGRvbid0IGhhdmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nLiBTbyBpZiB5b3UgbGlrZSwgcGxlYXNlIGhlbHAgdXMuCi0KLUlmIHlvdSBkbyBoYXZlIGEgQ3lDRFJPTSBDUjUyMGllIHRoYW5rcyB0byBIaWxtYXIgQmVyZ2VyJ3MgaGVscCB5b3VyIGNoYW5jZXMKLWFyZSBnb29kLCB0aGF0IGl0IHdpbGwgd29yayB3aXRoIGF6dGNkLiBUaGUgQ1I1MjBpZSBpcyBzb2xkIGFzIGFuIElERS1kcml2ZQotYW5kIHJlYWxseSBpcyBjb25uZWN0ZWQgdG8gdGhlIElERSBpbnRlcmZhY2UgKHByaW1hcnkgYXQgMHgxRjAgb3Igc2Vjb25kYXJ5Ci1hdCAweDE3MCwgY29uZmlndXJlZCBhcyBzbGF2ZSwgbm90IGFzIG1hc3RlcikuIE5ldmVydGhlbGVzcyBpdCBpcyBub3QgQVRBUEkKLWNvbXBhdGlibGUgYnV0IHN0aWxsIHVzZXMgQXp0ZWNoJ3MgY29tbWFuZCBjb2Rlcy4KLQotCi04LiBERUJVR0dJTkcgOiBJRiBZT1UgRE9OJ1QgU1VDQ0VFRCwgVFJZIFRIRSBGT0xMT1dJTkcKLS1yZXJlYWQgdGhlIGNvbXBsZXRlIFJFQURNRSBmaWxlCi0tbWFrZSBzdXJlLCB0aGF0IHlvdXIgZHJpdmUgaXMgaGFyZHdhcmUgY29uZmlndXJlZCBmb3IgCi0gICAgdHJhbnNmZXIgbW9kZTogcG9sbGVkCi0gICAgSVJROiAgICAgICAgICAgbm90IHVzZWQKLSAgICBETUE6ICAgICAgICAgICBub3QgdXNlZAotICAgIEJhc2UgQWRkcmVzczogIHNvbWV0aGluZyBsaWtlIDMwMCwgMzIwIC4uLgotIFlvdSBjYW4gY2hlY2sgdGhpcywgd2hlbiB5b3Ugc3RhcnQgdGhlIERPUyBkcml2ZXIsIHdoaWNoIGNhbWUgd2l0aCB5b3VyCi0gZHJpdmUuIEJ5IGFwcHJvcHJpYXRlbHkgY29uZmlndXJpbmcgdGhlIGRyaXZlIGFuZCB0aGUgRE9TIGRyaXZlciB5b3UgY2FuCi0gY2hlY2ssIHdoZXRoZXIgeW91ciBkcml2ZSBkb2VzIG9wZXJhdGUgaW4gdGhpcyBtb2RlIGNvcnJlY3RseSB1bmRlciBET1MuIElmCi0gaXQgZG9lcyBub3Qgb3BlcmF0ZSB1bmRlciBET1MsIGl0IHdvbid0IHVuZGVyIExpbnV4LgotIElmIHlvdXIgZHJpdmUncyBiYXNlIGFkZHJlc3MgaXMgc29tZXRoaW5nIGxpa2UgMHgxNzAgb3IgMHgxRjAgKGFuZCBpdCBpcwotIG5vdCBhIEN5Q0RST00gQ1I1MjBpZSBvciBDUiA5NDBpZSkgeW91IG1vc3QgbGlrZWx5IGFyZSBoYXZpbmcgYW4gSURFL0FUQVBJLQotIGNvbXBhdGlibGUgZHJpdmUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYXp0Y2QuYywgdXNlIGlkZS1jZC5jIGluc3RlYWQuCi0gTWFrZSBzdXJlIHRoZSBCYXNlIEFkZHJlc3MgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgaW4gYXp0Y2QuaCwgYWxzbyBtYWtlCi0gc3VyZSwgdGhhdCAvZGV2L2F6dGNkMCBleGlzdHMgd2l0aCB0aGUgY29ycmVjdCBtYWpvciBudW1iZXIgKGNvbXBhcmUgaXQgd2l0aAotIHRoZSBlbnRyeSBpbiBmaWxlIC91c3IvaW5jbHVkZS9saW51eC9tYWpvci5oIGZvciB0aGUgQXp0ZWNoIGRyaXZlKS4gCi0taW5zZXJ0IGEgQ0QtUk9NIGFuZCBjbG9zZSB0aGUgdHJheQotLWNvbGQgYm9vdCB5b3VyIFBDIChpLmUuIHZpYSB0aGUgcG93ZXIgb24gc3dpdGNoIG9yIHRoZSByZXNldCBidXR0b24pCi0taWYgeW91IHN0YXJ0IExpbnV4IHZpYSBET1MsIGUuZy4gdXNpbmcgbG9hZGxpbiwgbWFrZSBzdXJlLCB0aGF0IHRoZSBET1MKLSBkcml2ZXIgZm9yIHRoZSBDRC1ST00gZHJpdmUgaXMgbm90IGxvYWRlZCAoY29tbWVudCBvdXQgdGhlIGNhbGxpbmcgbGluZXMgCi0gaW4gRE9TJyBjb25maWcuc3lzISkKLS1sb29rIGZvciB0aGUgYXp0Y2Q6IGluaXQgbWVzc2FnZSBkdXJpbmcgTGludXggaW5pdCBhbmQgbm90ZSB0aGVtIGV4YWN0bHkKLS1sb2cgaW4gYXMgcm9vdCBhbmQgZG8gYSBtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQKLS1pZiB5b3UgZG9uJ3Qgc3VjY2VlZCBpbiB0aGUgZmlyc3QgdGltZSwgdHJ5IHNldmVyYWwgdGltZXMuIFRyeSBhbHNvIHRvIG9wZW4KLSBhbmQgY2xvc2UgdGhlIHRyYXksIHRoZW4gbW91bnQgYWdhaW4uIFBsZWFzZSBub3RlIGNhcmVmdWxseSBhbGwgY29tbWFuZHMKLSB5b3UgdHlwZWQgaW4gYW5kIHRoZSBhenRjZC1tZXNzYWdlcywgd2hpY2ggeW91IGdldC4KLS1pZiB5b3UgZ2V0IGFuICdBenRlY2ggQ0QtUk9NIGluaXQ6IGFib3J0ZWQnIG1lc3NhZ2UsIHJlYWQgdGhlIHJlbWFya3MgYWJvdXQKLSB0aGUgdmVyc2lvbiBzdHJpbmcgYmVsb3cuCi0KLUlmIHRoaXMgZG9lcyBub3QgaGVscCwgZG8gdGhlIHNhbWUgd2l0aCB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2VzIAotLXN0YXJ0IERPUyBiZWZvcmU7IG1ha2Ugbm93IHN1cmUsIHRoYXQgdGhlIERPUyBkcml2ZXIgZm9yIHRoZSBDRC1ST00gaXMgCi0gbG9hZGVkIHVuZGVyIERPUyAoaS5lLiB1bmNvbW1lbnQgaXQgYWdhaW4gaW4gY29uZmlnLnN5cykKLS13YXJtIGJvb3QgeW91ciBQQyAoaS5lLiB2aWEgQ1RSTC1BTFQtREVMKQotIGlmIHlvdSBoYXZlIGl0LCB5b3UgY2FuIGFsc28gc3RhcnQgdmlhIGxvYWRsaW4gKHRyeSBib3RoKS4KLSAuLi4KLSBBZ2FpbiBub3RlIGFsbCBjb21tYW5kcyBhbmQgdGhlIGF6dGNkLW1lc3NhZ2VzLgotCi1JZiB5b3Ugc2VlIFNURU5fTE9XIG9yIFNURU5fTE9XX1dBSVQgZXJyb3IgbWVzc2FnZXMsIGluY3JlYXNlIHRoZSB0aW1lb3V0Ci12YWx1ZXMuCi0KLUlmIHRoaXMgc3RpbGwgZG9lcyBub3QgaGVscCwgCi0tbG9vayBpbiBhenRjZC5jIGZvciB0aGUgbGluZXMgICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQVpUX1RFU1QxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKLSBhbmQgc3Vic3RpdHV0ZSAnI2lmIDAnIGJ5ICcjaWYgMScuCi0tcmVjb21waWxlIHlvdXIga2VybmVsIGFuZCByZXBlYXQgdGhlIGFib3ZlIHR3byBwcm9jZWR1cmVzLiBZb3Ugd2lsbCBub3cgZ2V0IAotIGEgYnVuZGxlIG9mIGRlYnVnZ2luZyBtZXNzYWdlcyBmcm9tIHRoZSBkcml2ZXIuIEFnYWluIG5vdGUgeW91ciBjb21tYW5kcwotIGFuZCB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZXMuIElmIHlvdSBoYXZlIHN5c2xvZ2QgcnVubmluZywgdGhlc2UgbWVzc2FnZXMKLSBtYXkgYWxzbyBiZSBmb3VuZCBpbiBzeXNsb2dkJ3Mga2VybmVsIGxvZyBmaWxlLiBOZXZlcnRoZWxlc3MgaW4gc29tZQotIGluc3RhbGxhdGlvbnMgc3lzbG9nZCBkb2VzIG5vdCB5ZXQgcnVuLCB3aGVuIGluaXQoKSBpcyBjYWxsZWQsIHRodXMgbG9vayBmb3IKLSB0aGUgYXp0Y2QtbWVzc2FnZXMgZHVyaW5nIGluaXQsIGJlZm9yZSB0aGUgbG9naW4tcHJvbXB0IGFwcGVhcnMuCi0gVGhlbiBsb29rIGluIGF6dGNkLmMsIHRvIGZpbmQgb3V0LCB3aGF0IGhhcHBlbmVkLiBUaGUgbm9ybWFsIGNhbGxpbmcgc2VxdWVuY2UgCi0gaXM6IGF6dGNkX2luaXQoKSBkdXJpbmcgTGludXggYm9vdHVwIHByb2NlZHVyZSBpbml0KCkKLSBhZnRlciBkb2luZyBhICdtb3VudCAtdCBpc285NjYwIC9kZXYvYXp0Y2QwIC9tbnQnIHRoZSBub3JtYWwgY2FsbGluZyBzZXF1ZW5jZSBpcwotICAgICBhenRjZF9vcGVuKCkgICAgLT4gU3RhdHVzIDJjIGFmdGVyIGNvbGQgcmVib290IHdpdGggQ0RST00gb3IgYXVkaW8gQ0QgaW5zZXJ0ZWQKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA4ICBhZnRlciB3YXJtIHJlYm9vdCB3aXRoIENEUk9NIGluc2VydGVkICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgLT4gU3RhdHVzIDJlIGFmdGVyIGNvbGQgcmVib290IHdpdGggbm8gZGlzaywgY2xvc2VkIHRyYXkKLSAgICAgICAgICAgICAgICAgICAgIC0+IFN0YXR1cyA2ZSBhZnRlciBjb2xkIHJlYm9vdCwgbW91bnQgd2l0aCBkb29yIG9wZW4KLSAgICAgYXp0VXBkYXRlVG9jKCkKLSAgICAgYXp0R2V0RGlza0luZm8oKQotICAgICBhenRHZXRRQ2hhbm5lbEluZm8oKSAgIHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0R2V0VG9jKCkKLSAgICAgYXp0R2V0UUNoYW5uZWxJbmZvKCkgICByZXBlYXRlZCBzZXZlcmFsIHRpbWVzCi0gICAgIGEgbGlzdCBvZiB0cmFjayBpbmZvcm1hdGlvbgotICAgICBkb19henRjZF9yZXF1ZXN0KCkgIH0gIAotICAgICBhenRfdHJhbnNmZXIoKSAgICB9IHJlcGVhdGVkIHNldmVyYWwgdGltZXMKLSAgICAgYXp0X3BvbGwgICAgICAgICAgfQotIENoZWNrLCBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb3IgdGhlIHN0YXR1cyBmbGFncyEKLSAKLSBUaGVyZSBhcmUgYSBsb3Qgb2Ygb3RoZXIgbWVzc2FnZXMsIGVnLiB0aGUgQUNNRC1jb21tYW5kIGNvZGUgKGRlZmluZWQgaW4KLSBhenRjZC5oKSwgc3RhdHVzIGluZm8gZnJvbSB0aGUgZ2V0QXp0U3RhdHVzLWNvbW1hbmQgYW5kIHRoZSBzdGF0ZSBzZXF1ZW5jZSBvZgotIHRoZSBmaW5pdGUgc3RhdGUgbWFjaGluZSBpbiBhenRfcG9sbCgpLiBUaGUgbW9zdCBpbXBvcnRhbnQgYXJlIHRoZSBzdGF0dXMKLSBtZXNzYWdlcywgbG9vayBob3cgdGhleSBhcmUgZGVmaW5lZCBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQsIGlmIHRoZXkgbWFrZQotIHNlbnNlIGluIHRoZSBjb250ZXh0IHdoZXJlIHRoZXkgYXBwZWFyLiBXaXRoIGEgQ0QtUk9NIGluc2VydGVkIHRoZSBzdGF0dXMgCi0gc2hvdWxkIGFsd2F5cyBiZSA4LCBleGNlcHQgaW4gYXp0Y2Rfb3BlbigpLiBUcnkgdG8gb3BlbiB0aGUgdHJheSwgaW5zZXJ0IGFuCi0gYXVkaW8gZGlzaywgaW5zZXJ0IG5vIGRpc2sgb3IgcmVpbnNlcnQgdGhlIENELVJPTSBhbmQgY2hlY2ssIGlmIHRoZSBzdGF0dXMKLSBiaXRzIGNoYW5nZSBhY2NvcmRpbmdseS4gVGhlIHN0YXR1cyBiaXRzIGFyZSB0aGUgbW9zdCBsaWtlbHkgcG9pbnQsIHdoZXJlIAotIHRoZSBkcml2ZSBtYW51ZmFjdHVyZXJzIG1heSBpbXBsZW1lbnQgY2hhbmdlcy4KLSAgICAgICAgICAgIAotSWYgeW91IHN0aWxsIGRvbid0IHN1Y2NlZWQsIGEgZ29vZCBwb2ludCB0byBzdGFydCBpcyB0byBsb29rIGluIGF6dGNkLmMgaW4gCi1mdW5jdGlvbiBhenRjZF9pbml0LCB3aGVyZSB0aGUgZHJpdmUgc2hvdWxkIGJlIGRldGVjdGVkIGR1cmluZyBpbml0LiBEbyB0aGUKLWZvbGxvd2luZzoKLS1yZWJvb3QgdGhlIHN5c3RlbSB3aXRoIGJvb3QgcGFyYW1ldGVyICdhenRjZD08eW91ciBiYXNlIGFkZHJlc3M+LDB4NzknLiBXaXRoCi0gcGFyYW1ldGVyIDB4NzkgbW9zdCBvZiB0aGUgZHJpdmUgdmVyc2lvbiBkZXRlY3Rpb24gaXMgYnlwYXNzZWQuIEFmdGVyIHRoYXQgCi0geW91IHNob3VsZCBzZWUgdGhlIGNvbXBsZXRlIHZlcnNpb24gc3RyaW5nIGluY2x1ZGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZyAKLSBibGFua3MgZHVyaW5nIGluaXQuIAotIE5vdyBhZGFwdCB0aGUgc3RhdGVtZW50Ci0gICAgICBpZiAoKHJlc3VsdFsxXT09J0EnKSYmKHJlc3VsdFsyXT09J1onIC4uLikKLSBpbiBhenRjZF9pbml0KCkgdG8gZXhhY3RseSBtYXRjaCB0aGUgZmlyc3QgMyBvciA0IGxldHRlcnMgeW91IGhhdmUgc2Vlbi4KLS1Bbm90aGVyIHBvaW50IGlzIHRoZSAnc21hcnQnIGNhcmQgZGV0ZWN0aW9uIGZlYXR1cmUgaW4gYXp0Y2RfaW5pdCgpLiBOb3JtYWxseQotIHRoZSBDRC1ST00gZHJpdmUgaXMgcmVhZHksIHdoZW4gYXp0Y2RfaW5pdCBpcyB0cnlpbmcgdG8gcmVhZCB0aGUgdmVyc2lvbgotIHN0cmluZyBhbmQgYSB0aW1lIGNvbnN1bWluZyBBQ01EX1NPRlRfUkVTRVQgY29tbWFuZCBjYW4gYmUgYXZvaWRlZC4gVGhpcyBpcwotIGRldGVjdGVkIGJ5IGxvb2tpbmcsIGlmIEFGTF9PUF9PSyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkuIElmIHRoZSBDRC1ST00gZHJpdmUgCi0gaGFuZ3MgaW4gc29tZSB1bmtub3duIHN0YXRlLCBlLmcuIGJlY2F1c2Ugb2YgYW4gZXJyb3IgYmVmb3JlIGEgd2FybSBzdGFydCBvciAKLSBiZWNhdXNlIHlvdSBmaXJzdCBvcGVyYXRlZCB1bmRlciBET1MsIGV2ZW4gdGhlIHZlcnNpb24gc3RyaW5nIG1heSBiZSBjb3JyZWN0LCAKLSBidXQgdGhlIGZvbGxvd2luZyBjb21tYW5kcyB3aWxsIG5vdC4gVGhlbiBjaGFuZ2UgdGhlIGNvZGUgaW4gc3VjaCBhIHdheSwgCi0gdGhhdCB0aGUgQUNNRF9TT0ZUX1JFU0VUIGlzIGlzc3VlZCBpbiBhbnkgY2FzZSwgYnkgc3Vic3RpdHV0aW5nIHRoZQotIGlmLXN0YXRlbWVudCAnaWYgKCAuLi49QUZMX09QX09LKScgYnkgJ2lmICgxKScuCi0KLUlmIHlvdSBzdWNjZWVkLCBwbGVhc2UgbWFpbCBtZSB0aGUgZXhhY3QgdmVyc2lvbiBzdHJpbmcgb2YgeW91ciBkcml2ZSBhbmQKLXRoZSBjb2RlIG1vZGlmaWNhdGlvbnMsIHlvdSBoYXZlIG1hZGUgdG9nZXRoZXIgd2l0aCBhIHNob3J0IGV4cGxhbmF0aW9uLgotSWYgeW91IGRvbid0IHN1Y2NlZWQsIHlvdSBtYXkgbWFpbCBtZSB0aGUgb3V0cHV0IG9mIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi1CdXQgcmVtZW1iZXIsIHRoZXkgYXJlIG9ubHkgdXNlZnVsLCBpZiB0aGV5IGFyZSBleGFjdCBhbmQgY29tcGxldGUgYW5kIHlvdQotZGVzY3JpYmUgaW4gZGV0YWlsIHlvdXIgaGFyZHdhcmUgc2V0dXAgYW5kIHdoYXQgeW91IGRpZCAoY29sZC93YXJtIHJlYm9vdCwKLXdpdGgvd2l0aG91dCBET1MsIERPUy1kcml2ZXIgc3RhcnRlZC9ub3Qgc3RhcnRlZCwgd2hpY2ggTGludXgtY29tbWFuZHMgZXRjLikKLQotCi05LiBURUNITklDQUwgSElTVE9SWSBPRiBUSEUgRFJJVkVSCi1UaGUgQVpURUNILURyaXZlciBpcyBhIHJld29yayBvZiB0aGUgTWl0c3VtaS1Ecml2ZXIuIEZvdXIgbWFqb3IgaXRlbXMgaGFkIHRvCi1iZSByZXdvcmtlZDoKLQotYSkgVGhlIE1pdHN1bWkgZHJpdmUgZG9lcyBpc3N1ZSBjb21wbGV0ZSBzdGF0dXMgaW5mb3JtYXRpb24gYWNrbm93bGVkZ2luZwotZWFjaCBjb21tYW5kLCB0aGUgQXp0ZWNoIGRyaXZlIGRvZXMgb25seSBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCB3YXMKLXByb2Nlc3NlZC4gU28gd2hlbmV2ZXIgdGhlIGNvbXBsZXRlIHN0YXR1cyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQsIGFuIGV4dHJhCi1BQ01EX0dFVF9TVEFUVVMgY29tbWFuZCBpcyBpc3N1ZWQuIFRoZSBoYW5kc2hha2UgcHJvY2VkdXJlIGZvciB0aGUgZHJpdmUKLWNhbiBiZSBmb3VuZCBpbiB0aGUgZnVuY3Rpb25zIGF6dFNlbmRDbWQoKSwgc2VuZEF6dENtZCgpIGFuZCBnZXRBenRTdGF0dXMoKS4KLQotYikgVGhlIEF6dGVjaCBEcml2ZSBkb2VzIG5vdCBoYXZlIGEgQUNNRF9HRVRfRElTS19JTkZPIGNvbW1hbmQsIHNvIHRoZQotbmVjZXNzYXJ5IGluZm8gYWJvdXQgdGhlIG51bWJlciBvZiB0cmFja3MgKGZpcnN0VHJhY2ssIGxhc3RUcmFjayksIGRpc2sKLWxlbmd0aCBldGMuIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIFRPQyBpbiB0aGUgbGVhZCBpbiB0cmFjayAoc2VlIGZ1bmN0aW9uCi1henRHZXREaXNrSW5mbygpKS4KLQotYykgV2hlbmV2ZXIgZGF0YSBpcyByZWFkIGZyb20gdGhlIGRyaXZlLCB0aGUgTWl0c3VtaSBkcml2ZSBpcyBzdGFydGVkIHdpdGggYQotY29tbWFuZCB0byByZWFkIGFuIGluZGVmaW5pdGUgKDB4ZmZmZmZmKSBudW1iZXIgb2Ygc2VjdG9ycy4gV2hlbiB0aGUgYXBwcm9wcmlhdGUgCi1udW1iZXIgb2Ygc2VjdG9ycyBpcyByZWFkLCB0aGUgZHJpdmUgaXMgc3RvcHBlZCBieSBhIEFDRE1fU1RPUCBjb21tYW5kLiBUaGlzCi1kb2VzIG5vdCB3b3JrIHdpdGggdGhlIEF6dGVjaCBkcml2ZS4gSSBkaWQgbm90IGZpbmQgYSB3YXkgdG8gc3RvcCBpdC4gVGhlCi1zdG9wIGFuZCBwYXVzZSBjb21tYW5kcyBkbyBvbmx5IHdvcmsgaW4gQVVESU8gbW9kZSBidXQgbm90IGluIERBVEEgbW9kZS4KLVRoZXJlZm9yZSBJIGhhZCB0byBtb2RpZnkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgaW4gZnVuY3Rpb24gYXp0X3BvbGwgdG8KLW9ubHkgcmVhZCBhIGNlcnRhaW4gbnVtYmVyIG9mIHNlY3RvcnMgYW5kIHRoZW4gc3RhcnQgYSBuZXcgcmVhZCBvbiBkZW1hbmQuIEFzIEkgCi1oYXZlIG5vdCBjb21wbGV0ZWx5IHVuZGVyc3Rvb2QsIGhvdyB0aGUgYnVmZmVyL2NhY2hpbmcgc2NoZW1lIG9mIHRoZSBNaXRzdW1pIAotZHJpdmVyIHdhcyBpbXBsZW1lbnRlZCwgSSBhbSBub3Qgc3VyZSwgaWYgSSBoYXZlIGNvdmVyZWQgYWxsIGNhc2VzIGNvcnJlY3RseSwgCi13aGVuZXZlciB5b3UgZ2V0IHRpbWVvdXQgbWVzc2FnZXMsIHRoZSBidWcgaXMgbW9zdCBsaWtlbHkgdG8gYmUgaW4gdGhhdAotZnVuY3Rpb24gYXp0X3BvbGwoKSBhcm91bmQgc3dpdGNoKGNtZCkgLi4uLiBjYXNlIEFDRF9TX0RBVEEuIAotCi1kKSBJIGRpZCBub3QgZ2V0IGluZm9ybWF0aW9uIGFib3V0IGNoYW5naW5nIGRyaXZlIG1vZGUuIFNvIEkgZG91YnQsIHRoYXQgdGhlCi1jb2RlIGFyb3VuZCBmdW5jdGlvbiBhenRfcG9sbCgpIGNhc2UgQVpUX1NfTU9ERSBkb2VzIHdvcmsuIEluIG15IHRlc3QgSSBoYXZlCi1ub3QgYmVlbiBhYmxlIHRvIHN3aXRjaCB0byByZWFkaW5nIGluIHJhdyBtb2RlLiBGb3IgcmVhZGluZyByYXcgbW9kZSwgQXp0ZWNoCi11c2VzIGEgZGlmZmVyZW50IGNvbW1hbmQgdGhhbiBmb3IgY29va2VkIG1vZGUsIHdoaWNoIEkgb25seSBoYXZlIGltcGxlbWVuLQotdGVkIGluIHRoZSBpb2N0bC1zZWN0aW9uIGJ1dCBub3QgaW4gdGhlIHNlY3Rpb24gd2hpY2ggaXMgdXNlZCBieSB0aGUgSVNPOTY2MC4gCi0KLVRoZSBkcml2ZXIgd2FzIGRldmVsb3BlZCBvbiBhbiBBU1QgUEMgd2l0aCBJbnRlbCA0ODYvRFgyLCA4TUIgUkFNLCAzNDBNQiBJREUgCi1oYXJkIGRpc2sgYW5kIG9uIGFuIEFTVCBQQyB3aXRoIEludGVsIFBlbnRpdW0gNjBNSHosIDE2TUIgUkFNLCA1MjBNQiBJREUgCi1ydW5uaW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIDEuMC45IGZyb20gdGhlIExTVCAxLjggRGlzdHJpYnV0aW9uLiBUaGUga2VybmVsIAotd2FzIGNvbXBpbGVkIHdpdGggZ2NjLjIuNS44LiBNeSBDRC1ST00gZHJpdmUgaXMgYW4gQXp0ZWNoIENEQTI2OC0wMUEuIE15Ci1kcml2ZSBzYXlzLCB0aGF0IGl0IGhhcyBGaXJtd2FyZSBWZXJzaW9uIEFaVDI2ODAxQTEuMy4gSXQgY2FtZSB3aXRoIGFuIElTQS1idXMKLWludGVyZmFjZSBjYXJkIGFuZCB3b3JrcyB3aXRoIHBvbGxlZCBJL08gd2l0aG91dCBETUEgYW5kIHdpdGhvdXQgaW50ZXJydXB0cy4KLVRoZSBjb2RlIGZvciBhbGwgb3RoZXIgZHJpdmVzIHdhcyAncmVtb3RlJyB0ZXN0ZWQgYW5kIGRlYnVnZ2VkIGJ5IGEgbnVtYmVyIG9mIAotdm9sdW50ZWVycyBvbiB0aGUgSW50ZXJuZXQuCi0KLVBvaW50cywgd2hlcmUgSSBmZWVsIHRoYXQgcG9zc2libGUgcHJvYmxlbXMgbWlnaHQgYmUgYW5kIGFsbCBwb2ludHMgd2hlcmUgSSAKLWRpZCBub3QgY29tcGxldGVseSB1bmRlcnN0YW5kIHRoZSBkcml2ZSdzIGJlaGF2aW91ciBvciB0cnVzdCBteSBvd24gY29kZSBhcmUgCi1tYXJrZWQgd2l0aCAvKj8/PyovIGluIHRoZSBzb3VyY2UgY29kZS4gVGhlcmUgYXJlIGFsc28gc29tZSBwYXJ0cyBpbiB0aGUgCi1NaXRzdW1pIGRyaXZlciwgd2hlcmUgSSBkaWQgbm90IGNvbXBsZXRlbHkgdW5kZXJzdGFuZCB0aGVpciBjb2RlLgotCi0KLTEwLiBBQ0tOT1dMRURHTUVOVFMKLVdpdGhvdXQgdGhlIGhlbHAgb2YgUC5CdXNoLCBBenRlY2gsIHdobyBkZWxpdmVyZWQgdGVjaG5pY2FsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgQXp0ZWNoIERyaXZlIGFuZCB3aXRob3V0IHRoZSBoZWxwIG9mIEUuTW9lbmtlYmVyZywgR1dERywgd2hvIGRpZCBhCi1ncmVhdCBqb2IgaW4gYW5hbHl6aW5nIHRoZSBjb21tYW5kIHN0cnVjdHVyZSBvZiB2YXJpb3VzIENELVJPTSBkcml2ZXMsIHRoaXMKLXdvcmsgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZS4gRS5Nb2Vua2ViZXJnIHdhcyBhbHNvIGEgZ3JlYXQgaGVscCBpbiAKLW1ha2luZyB0aGUgc29mdHdhcmUgJ2tlcm5lbCByZWFkeScgYW5kIGluIGFuc3dlcmluZyBtYW55IG9mIHRoZSBDRFJPTS1yZWxhdGVkIAotcXVlc3Rpb25zIGluIHRoZSBuZXdzZ3JvdXBzLiBIZSByZWFsbHkgaXMgKnRoZSogTGludXggQ0QtUk9NIGd1cnUuIFRoYW5rcyAKLWFsc28gdG8gYWxsIHRoZSBndXlzIG9uIHRoZSBJbnRlcm5ldCwgd2hvIGNvbGxlY3RlZCB2YWx1YWJsZSB0ZWNobmljYWwgCi1pbmZvcm1hdGlvbiBhYm91dCBDRFJPTXMuIAotCi1Kb2UgTmFyZG9uZSAoam9lQGFjY2Vzcy5kaWdleC5uZXQpIHdhcyBhIHBhdGllbnQgdGVzdGVyIGV2ZW4gZm9yIG15IGZpcnN0Ci10cmlhbCwgd2hpY2ggd2FzIG1vcmUgdGhhbiBzbG93LCBhbmQgbWFkZSBzdWdnZXN0aW9ucyBmb3IgY29kZSBpbXByb3ZlbWVudC4KLUVzcGVjaWFsbHkgdGhlICdmaW5pdGUgc3RhdGUgbWFjaGluZScgYXp0X3BvbGwoKSB3YXMgcmV3cml0dGVuIGJ5IEpvZSB0byBnZXQKLWNsZWFuIEMgY29kZSBhbmQgYXZvaWQgdGhlIHVnbHkgJ2dvdG9zJywgd2hpY2ggSSBjb3BpZWQgZnJvbSBtY2QuYy4KLQotUm9iYnkgU2NoaXJtZXIgKHNjaGlybWVyQGZtaS51bmktcGFzc2F1LmRlKSB0ZXN0ZWQgdGhlIGF1ZGlvIHN0dWZmIChpb2N0bHMpIAotYW5kIHN1Z2dlc3RlZCBhIGxvdCBvZiBwYXRjaGVzIGZvciB0aGVtLgotCi1Kb3NlcGggUGlza29yIGFuZCBQZXRlciBOdWdlbnQgd2VyZSB0aGUgZmlyc3QgdXNlcnMgd2l0aCB0aGUgT1JDSElEIENEMzExMAotYW5kIGFsc28gd2VyZSB2ZXJ5IHBhdGllbnQgd2l0aCB0aGUgcHJvYmxlbXMgd2hpY2ggb2NjdXJyZWQuCi0KLVJlaW5oYXJkIE1heCBkZWxpdmVyZWQgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgQ0RST00taW50ZXJmYWNlIG9mIHRoZQotU291bmRXYXZlMzIgc291bmRjYXJkcy4KLQotSm9jaGVuIEt1bnogYW5kIE9sYWYgS2FsdXphIGRlbGl2ZXJlZCB0aGUgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRpbmcgQ29ucmFkJ3MgCi1UWEMgZHJpdmUuCi0KLUhpbG1hciBCZXJnZXIgZGVsaXZlcmVkIHRoZSBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIEN5Q0RST00gQ1I1MjBpZS4KLQotQW55Ym9keSwgd2hvIGlzIGludGVyZXN0ZWQgaW4gdGhlc2UgaXRlbXMgc2hvdWxkIGhhdmUgYSBsb29rIGF0ICdmdHAuZ3dkZy5kZScsCi1kaXJlY3RvcnkgJ3B1Yi9saW51eC9jZHJvbScgYW5kIGF0ICdmdHAuY2Ryb20uY29tJywgZGlyZWN0b3J5ICdwdWIvY2Ryb20nLgotCi0xMS4gUFJPR1JBTU1JTkcgQUREIE9OczogY2RwbGF5LmMKLVlvdSBjYW4gdXNlIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW5jbHVkZWQgaW4gYXp0Y2QuYyBpbiB5b3VyIG93biBwcm9ncmFtcy4gQXMKLWFuIGV4YW1wbGUgb24gaG93IHRvIGRvIHRoaXMsIHlvdSB3aWxsIGZpbmQgYSB0aW55IENEIFBsYXllciBmb3IgYXVkaW8gQ0RzIAotbmFtZWQgJ2NkcGxheS5jJy4gSXQgYWxsb3dzIHlvdSB0byBwbGF5IGF1ZGlvIENEcy4gWW91IGNhbiBwbGF5IGEgc3BlY2lmaWVkIAotdHJhY2ssIHBhdXNlIGFuZCByZXN1bWUgb3Igc2tpcCB0cmFja3MgZm9yd2FyZCBhbmQgYmFja3dhcmRzLiBJZiB5b3UgcXVpdCB0aGUgCi1wcm9ncmFtIHdpdGhvdXQgc3RvcHBpbmcgdGhlICBkcml2ZSwgcGxheWluZyBpcyBjb250aW51ZWQuIFlvdSBjYW4gYWxzbyAKLShtaXMpdXNlIGNkcGxheSB0byByZWFkIGFuZCBoZXhkdW1wIGRhdGEgZGlza3MuIFlvdSBjYW4gZmluZCB0aGUgY29kZSBpbiB0aGUgCi1BUFBFTkRJWCBvZiB0aGlzIGZpbGUsIHdoaWNoIHlvdSBzaG91bGQgY3V0IG91dCB3aXRoIGFuIGVkaXRvciBhbmQgc3RvcmUgaW4gYSAKLXNlcGFyYXRlIGZpbGUgJ2NkcGxheS5jJy4gVG8gY29tcGlsZSBpdCBhbmQgbWFrZSBpdCBleGVjdXRhYmxlLCBkbwotICBnY2MgLXMgLVdhbGwgLU8yIC1ML3Vzci9saWIgY2RwbGF5LmMgLW8gL3Vzci9sb2NhbC9iaW4vY2RwbGF5ICMgY29tcGlsZXMgaXQKLSAgY2htb2QgKzc1NSAvdXNyL2xvY2FsL2Jpbi9jZHBsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ha2VzIGl0IGV4ZWN1dGFibGUKLSAgbG4gLXMgL2Rldi9henRjZDAgL2Rldi9jZHJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZXMgYSBsaW5rCi0gICAoZm9yIC91c3IvbGliIHN1YnN0aXR1dGUgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnksIHdoZXJlIHlvdXIgaW5jbHVkZSBmaWxlcyAKLSAgICByZXNpZGUsICBhbmQgZm9yIC91c3IvbG9jYWwvYmluIHRoZSBkaXJlY3RvcnksIHdoZXJlIHlvdSB3YW50IHRoZSBleGVjdXRhYmxlIAotICAgIGJpbmFyeSB0byByZXNpZGUgKQotCi1Zb3UgaGF2ZSB0byBzZXQgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgZm9yIGNkcGxheSAqYW5kKiBmb3IgL2Rldi9tY2QwIG9yCi0vZGV2L2F6dGNkMCBpbiBvcmRlciB0byB1c2UgaXQuIFJlbWVtYmVyLCB0aGF0IHlvdSBzaG91bGQgbm90IGhhdmUgL2Rldi9jZHJvbSAKLW1vdW50ZWQsIHdoZW4geW91J3JlIHBsYXlpbmcgYXVkaW8gQ0RzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGp1c3QgYSBoYWNrIGZvciB0ZXN0aW5nIHRoZSBpb2N0bC1mdW5jdGlvbnMgaW4gYXp0Y2QuYy4gSSB3aWxsIAotbm90IG1haW50YWluIGl0LCBzbyBpZiB5b3UgcnVuIGludG8gcHJvYmxlbXMsIGRpc2NhcmQgaXQgb3IgaGF2ZSBhIGxvb2sgaW50byAKLXRoZSBzb3VyY2UgY29kZSAnY2RwbGF5LmMnLiBUaGUgcHJvZ3JhbSBkb2VzIG9ubHkgY29udGFpbiBhIG1pbmltdW0gb2YgdXNlciAKLXByb3RlY3Rpb24gYW5kIGlucHV0IGVycm9yIGRldGVjdGlvbi4gSWYgeW91IHVzZSB0aGUgY29tbWFuZHMgaW4gdGhlIHdyb25nIAotb3JkZXIgb3IgaWYgeW91IHRyeSB0byByZWFkIGEgQ0QgYXQgd3JvbmcgYWRkcmVzc2VzLCB5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcwotb3IgZXZlbiBoYW5nIHlvdXIgbWFjaGluZS4gSWYgeW91IGdldCBTVEVOX0xPVywgU1RFTl9MT1dfV0FJVCBvciBzZWdtZW50IHZpb2xhdGlvbiAKLWVycm9yIG1lc3NhZ2VzIHdoZW4gdXNpbmcgY2RwbGF5LCBhZnRlciB0aGF0LCB0aGUgc3lzdGVtIG1pZ2h0IG5vdCBiZSBzdGFibGUgCi1hbnkgbW9yZSwgc28geW91J2QgYmV0dGVyIHJlYm9vdC4gQXMgdGhlIGlvY3RsLWZ1bmN0aW9ucyBydW4gaW4ga2VybmVsIG1vZGUsCi1tb3N0IG5vcm1hbCBMaW51eC1tdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiBmZWF0dXJlcyBkbyBub3Qgd29yay4gQnkgdXNpbmcKLXVuaW5pdGlhbGl6ZWQgJ3dpbGQnIHBvaW50ZXJzIGV0Yy4sIGl0IGlzIGVhc3kgdG8gd3JpdGUgdG8gb3RoZXIgdXNlcnMnIGRhdGEgCi1hbmQgcHJvZ3JhbSBhcmVhcywgZGVzdHJveSBrZXJuZWwgdGFibGVzIGV0Yy4uIFNvIGlmIHlvdSBleHBlcmltZW50IHdpdGggaW9jdGxzCi1hcyBhbHdheXMgd2hlbiB5b3UgYXJlIGRvaW5nIHN5c3RlbXMgcHJvZ3JhbW1pbmcgYW5kIGtlcm5lbCBoYWNraW5nLCB5b3UKLXNob3VsZCBoYXZlIGEgYmFja3VwIGNvcHkgb2YgeW91ciBzeXN0ZW0gaW4gYSBzYWZlIHBsYWNlIChhbmQgeW91IGFsc28KLXNob3VsZCB0cnkgcmVzdG9yaW5nIGZyb20gYSBiYWNrdXAgY29weSBmaXJzdCkhCi0KLUEgcmV3b3JrZWQgYW5kIGltcHJvdmVkIHZlcnNpb24gY2FsbGVkICdjZHRlc3Rlci5jJywgd2hpY2ggaGFzIHlldCBtb3JlCi1mZWF0dXJlcyBmb3IgdGVzdGluZyBDRFJPTS1kcml2ZXMgY2FuIGJlIGZvdW5kIGluCi1Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkLCB3cml0dGVuIGJ5IEUuTW9lbmtlYmVyZy4KLQotV2VybmVyIFppbW1lcm1hbm4KLUZhY2hob2Noc2NodWxlIGZ1ZXIgVGVjaG5payBFc3NsaW5nZW4KLShFTWFpbDogV2VybmVyLlppbW1lcm1hbm5AZmh0LWVzc2xpbmdlbi5kZSkKLU9jdG9iZXIsIDE5OTcKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BUFBFTkRJWDogU291cmNlIGNvZGUgb2YgY2RwbGF5LmMKLQotLyogVGlueSBBdWRpbyBDRCBQbGF5ZXIKLQotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYgV2VybmVyIFppbW1lcm1hbm4gKFdlcm5lci5aaW1tZXJtYW5uQGZodC1lc3NsaW5nZW4uZGUpCi0KLVRoaXMgcHJvZ3JhbSBvcmlnaW5hbGx5IHdhcyB3cml0dGVuIHRvIHRlc3QgdGhlIGF1ZGlvIGZ1bmN0aW9ucyBvZiB0aGUKLUFaVEVDSC5DRFJPTS1kcml2ZXIsIGJ1dCBpdCBzaG91bGQgd29yayB3aXRoIGV2ZXJ5IENELVJPTSBkcml2ZS4gQmVmb3JlIAotdXNpbmcgaXQsIHlvdSBzaG91bGQgc2V0IGEgc3ltbGluayBmcm9tIC9kZXYvY2Ryb20gdG8geW91ciByZWFsIENEUk9NCi1kZXZpY2UuCi0KLVRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIHRoaXMgcHJvZ3JhbS4KLQotSGlzdG9yeTogIFYwLjEgIFcuWmltbWVybWFubjogRmlyc3QgcmVsZWFzZS4gTm92LiA4LCAxOTk0Ci0gICAgICAgICAgVjAuMiAgVy5aaW1tZXJtYW5uOiBFbmhhbmNlZCBmdW5jdGlvbmFsaXR5LiBOb3YuIDksIDE5OTQKLSAgICAgICAgICBWMC4zICBXLlppbW1lcm1hbm46IEFkZGl0aW9uYWwgZnVuY3Rpb25zLiBOb3YuIDI4LCAxOTk0ICAgICAgICAgIAotICAgICAgICAgIFYwLjQgIFcuWmltbWVybWFubjogZml4ZWQgc29tZSBidWdzLiBEZWMuIDE3LCAxOTk0Ci0gICAgICAgICAgVjAuNSAgVy5aaW1tZXJtYW5uOiBjbGVhbiAnc2NhbmYnIGNvbW1hbmRzIHdpdGhvdXQgY29tcGlsZXIgd2FybmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gNiwgMTk5NQotICAgICAgICAgIFYwLjYgIFcuWmltbWVybWFubjogdm9sdW1lIGNvbnRyb2wgKHN0aWxsIGV4cGVyaW1lbnRhbCkuIEphbi4gMjQsIDE5OTUKLSAgICAgICAgICBWMC43ICBXLlppbW1lcm1hbm46IHJlYWQgcmF3IG1vZGlmaWVkLiBKdWx5IDI2LCA5NQotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+Ci0jaW5jbHVkZSA8bGludXgvLi4vLi4vZHJpdmVycy9jZHJvbS9henRjZC5oPgotCi12b2lkIGhlbHAodm9pZCkKLXsgcHJpbnRmKCJBdmFpbGFibGUgQ29tbWFuZHM6ICBTVE9QICAgICAgICAgcyAgICAgIEVKRUNUL0NMT1NFICBlICAgICAgIFFVSVQgICAgICAgICBxXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBQTEFZIFRSQUNLICAgdCAgICAgIFBBVVNFICAgICAgICBwICAgICAgIFJFU1VNRSAgICAgICByXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBORVhUIFRSQUNLICAgbiAgICAgIFJFUEVBVCBMQVNUICBsICAgICAgIEhFTFAgICAgICAgICBoXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBTVUIgQ0hBTk5FTCAgYyAgICAgIFRSQUNLIElORk8gICBpICAgICAgIFBMQVkgQVQgICAgICBhXG4iKTsKLSAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICBSRUFEICAgICAgICAgZCAgICAgIFJFQUQgUkFXICAgICB3ICAgICAgIFZPTFVNRSAgICAgICB2XG4iKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsgaW50IGhhbmRsZTsKLSAgdW5zaWduZWQgY2hhciBjb21tYW5kPScgJywgaW5pPTAsIGZpcnN0PTEsIGxhc3Q9MTsKLSAgdW5zaWduZWQgaW50IGNtZCwgaSxqLGssIGFyZzEsYXJnMixhcmczOwotICBzdHJ1Y3QgY2Ryb21fdGkgICAgICAgdGk7Ci0gIHN0cnVjdCBjZHJvbV90b2NoZHIgICB0b2NIZHI7Ci0gIHN0cnVjdCBjZHJvbV9zdWJjaG5sICBzdWJjaG5sOwotICBzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgZW50cnk7Ci0gIHN0cnVjdCBjZHJvbV9tc2YgICAgICBtc2Y7Ci0gIHVuaW9uICB7IHN0cnVjdCBjZHJvbV9tc2YgbXNmOwotICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZltDRF9GUkFNRVNJWkVfUkFXXTsKLSAgICAgICAgIH0gYXp0OwotICBzdHJ1Y3QgY2Ryb21fdm9sY3RybCAgdm9sY3RybDsKLQotICBwcmludGYoIlxuTWluaS1BdWRpbyBDRC1QbGF5ZXIgVjAuNzIgICAoQykgMTk5NCwxOTk1LDE5OTYgIFcuWmltbWVybWFublxuIik7Ci0gIGhhbmRsZT1vcGVuKCIvZGV2L2Nkcm9tIixPX1JEV1IpOwotICBpb2N0bChoYW5kbGUsQ0RST01SRVNVTUUpOwotICAKLSAgaWYgKGhhbmRsZTw9MCkgCi0gICAgeyBwcmludGYoIkRyaXZlIEVycm9yOiBhbHJlYWR5IHBsYXlpbmcsIG5vIGF1ZGlvIGRpc2ssIGRvb3Igb3BlblxuIik7Ci0gICAgICBwcmludGYoIiAgICAgICAgICAgICBvciBubyBwZXJtaXNzaW9uICh5b3UgbXVzdCBiZSBST09UIGluIG9yZGVyIHRvIHVzZSB0aGlzIHByb2dyYW0pXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7IGhlbHAoKTsKLSAgICAgIHdoaWxlICgxKQotICAgICAgICB7IHByaW50ZigiVHlwZSBjb21tYW5kIChoID0gaGVscCk6ICAiKTsKLSAgICAgICAgICBzY2FuZigiJXMiLCZjb21tYW5kKTsgCi0gICAgICAgICAgc3dpdGNoIChjb21tYW5kKQotICAgICAgICAgICAgeyBjYXNlICdlJzogICBjbWQ9Q0RST01FSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwoaGFuZGxlLGNtZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgICAgICAgIGNhc2UgJ3AnOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiQ29tbWFuZCBub3QgYWxsb3dlZCAtIHBsYXkgdHJhY2sgZmlyc3RcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01QQVVTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdyJzogICBpZiAoIWluaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkNvbW1hbmQgbm90IGFsbG93ZWQgLSBwbGF5IHRyYWNrIGZpcnN0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY21kPUNEUk9NUkVTVU1FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3MnOiAgIGNtZD1DRFJPTVBBVVNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCkpIHByaW50ZigiRHJpdmUgZXJyb3Igb3IgYWxyZWFkeSBzdG9wcGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY21kPUNEUk9NU1RPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQpKSBwcmludGYoIkRyaXZlIGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3QnOiAgIGNtZD1DRFJPTVJFQURUT0NIRFI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZ0b2NIZHIpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiLS1maXJzdCB0cmFjazogJWQgICAtLWxhc3QgdHJhY2s6ICVkICAgLS1lbnRlciB0cmFjayBudW1iZXI6ICIsZmlyc3QsbGFzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ9Q0RST01QTEFZVFJLSU5EOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVpIiwmYXJnMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aS5jZHRpX3RyazA+bGFzdCkgIHRpLmNkdGlfdHJrMD1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnbic6ICAgaWYgKCFpbmkrKykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt0aS5jZHRpX3RyazAgPiBsYXN0KSAgdGkuY2R0aV90cmswPWxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX2luZDA9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMT1sYXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQxPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdGkpKSBwcmludGYoIkRyaXZlIEVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaT0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2wnOiAgIGlmICghaW5pKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaW9jdGwoaGFuZGxlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD10b2NIZHIuY2R0aF90cmswOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdD0gdG9jSGRyLmNkdGhfdHJrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfdHJrMD1maXJzdCsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdD09MCl8fChmaXJzdD5sYXN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZiAoIi0tY291bGQgbm90IHJlYWQgVE9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNtZD1DRFJPTVBMQVlUUktJTkQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS10aS5jZHRpX3RyazAgPCBmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGkuY2R0aV9pbmQwPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aS5jZHRpX3RyazE9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpLmNkdGlfaW5kMT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKGhhbmRsZSxjbWQsJnRpKSkgcHJpbnRmKCJEcml2ZSBFcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmk9MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2MnOiAgIHN1YmNobmwuY2RzY19mb3JtYXQ9Q0RST01fTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRHJpdmUgRXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkF1ZGlvU3RhdHVzOiVzICAgVHJhY2s6JWQgIE1vZGU6JWQgICBNU0Y9JWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY19hdWRpb3N0YXR1cz09Q0RST01fQVVESU9fUExBWSA/ICJQTEFZSU5HIjoiTk9UIFBMQVlJTkciLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLm1pbnV0ZSwgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLnNlY29uZCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hubC5jZHNjX2Fic2FkZHIubXNmLmZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGNhc2UgJ2knOiAgIGlmICghaW5pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJDb21tYW5kIG5vdCBhbGxvd2VkIC0gcGxheSB0cmFjayBmaXJzdFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjbWQ9Q0RST01SRUFEVE9DRU5UUlk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRyYWNrIE5vLjogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfdHJhY2s9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jZHRlX3RyYWNrPGZpcnN0KSBlbnRyeS5jZHRlX3RyYWNrPWZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNkdGVfdHJhY2s+bGFzdCkgIGVudHJ5LmNkdGVfdHJhY2s9bGFzdDsKLQkJCSAgICAgIGVudHJ5LmNkdGVfZm9ybWF0PUNEUk9NX01TRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZlbnRyeSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIHRyYWNrIG5vLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJWQ6JWQ6JWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5jZHRlX2FkcixlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2Yuc2Vjb25kLGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdhJzogICBjbWQ9Q0RST01QTEFZTVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJhbWUpICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkOiVkOiVkIiwmYXJnMSwmYXJnMiwmYXJnMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzAgID1hcmcyOwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfZnJhbWUwPWFyZzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgbXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZi5jZG1zZl9mcmFtZTA+IDc0KSBtc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2YuY2Rtc2ZfbWluMT02MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmLmNkbXNmX3NlYzE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1zZi5jZG1zZl9mcmFtZTE9MDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZtc2YpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciBvciBpbnZhbGlkIGFkZHJlc3NcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLypub3Qgc3VwcG9ydGVkIGJ5IGV2ZXJ5IENEUk9NIGRyaXZlciovCi0gICAgICAgICAgICAgIGNhc2UgJ2QnOiAgIGNtZD1DRFJPTVJFQURDT09LRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMCAgPiA1OSkgYXp0Lm1zZi5jZG1zZl9zZWMwICA9NTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD4gNzQpIGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPTc0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmYXp0Lm1zZikpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yLCBpbnZhbGlkIGFkZHJlc3Mgb3IgdW5zdXBwb3J0ZWQgY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y2hhcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDEyODtpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiJTRkOiIsaSoxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8MTY7aisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlMnggIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoaXNhbG51bShhenQuYnVmW2kqMTYral0pKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsYXp0LmJ1ZltpKjE2K2pdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrPj0yMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJwcmVzcyBFTlRFUiB0byBjb250aW51ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGNoYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3cnOiAgIGNtZD1DRFJPTVJFQURSQVc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQ6JWQ6JWQiLCZhcmcxLCZhcmcyLCZhcmczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9taW4wICA9YXJnMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9zZWMwICA9YXJnMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9YXJnMzsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXp0Lm1zZi5jZG1zZl9zZWMwICA+IDU5KSBhenQubXNmLmNkbXNmX3NlYzAgID01OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPiA3NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2N0bChoYW5kbGUsY21kLCZhenQpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJEcml2ZSBlcnJvciwgaW52YWxpZCBhZGRyZXNzIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBrPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8MTQ3O2krKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlNGQ6IixpKjE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajwxNjtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIiUyeCAiLGF6dC5idWZbaSoxNitqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPDE2O2orKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmIChpc2FsbnVtKGF6dC5idWZbaSoxNitqXSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIixhenQuYnVmW2kqMTYral0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGs+PTIwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnZXRjaGFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGs9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgIGNhc2UgJ3YnOiAgIGNtZD1DRFJPTVZPTENUUkw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLS1DaGFubmVsIDAgTGVmdCAgKDAtMjU1KTogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsJmFyZzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIi0tQ2hhbm5lbCAxIFJpZ2h0ICgwLTI1NSk6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZhcmcyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMD1hcmcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xjdHJsLmNoYW5uZWwxPWFyZzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGN0cmwuY2hhbm5lbDI9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sY3RybC5jaGFubmVsMz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9jdGwoaGFuZGxlLGNtZCwmdm9sY3RybCkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIkRyaXZlIGVycm9yIG9yIHVuc3VwcG9ydGVkIGNvbW1hbmRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAotICAgICAgICAgICAgICBjYXNlICdxJzogICBpZiAoY2xvc2UoaGFuZGxlKSkgcHJpbnRmKCJEcml2ZSBFcnJvcjogQ0xPU0VcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgICBjYXNlICdoJzogICBoZWxwKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBkZWZhdWx0OiAgICBwcmludGYoInVua25vd24gY29tbWFuZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jZHUzMWEgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NjdkYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2NkdTMxYQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0KLQkJQ0RVMzFBL0NEVTMzQSBEcml2ZXIgSW5mbwotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluZm9ybWF0aW9uIG9uIHRoZSBTb255IENEVTMxQS9DRFUzM0EgQ0RST00gZHJpdmVyIGZvciB0aGUgTGludXgKLWtlcm5lbC4KLQotICAgQ29yZXkgTWlueWFyZCAobWlueWFyZEBtZXRyb25ldC5jb20pCi0gIAotICAgQ29sb3NzaWFucyAzOjE3Ci0KLUNydWRlIFRhYmxlIG9mIENvbnRlbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFNldHRpbmcgVXAgdGhlIEhhcmR3YXJlCi0gIENvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLSAgQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLSAgRHJpdmVyIFNwZWNpYWwgRmVhdHVyZXMKLQotICAKLVRoaXMgZGV2aWNlIGRyaXZlciBoYW5kbGVzIFNvbnkgQ0RVMzFBL0NEVTMzQSBDRFJPTSBkcml2ZXMgYW5kCi1wcm92aWRlcyBhIGNvbXBsZXRlIGJsb2NrLWxldmVsIGludGVyZmFjZSBhcyB3ZWxsIGFzIGFuIGlvY3RsKCkKLWludGVyZmFjZSBhcyBzcGVjaWZpZWQgaW4gaW5jbHVkZS9saW51eC9jZHJvbS5oKS4gIFdpdGggdGhpcwotaW50ZXJmYWNlLCBDRFJPTXMgY2FuIGJlIGFjY2Vzc2VkLCBzdGFuZGFyZCBhdWRpbyBDRHMgY2FuIGJlIHBsYXllZAotYmFjayBub3JtYWxseSwgYW5kIENEIGF1ZGlvIGluZm9ybWF0aW9uIGNhbiBiZSByZWFkIG9mZiB0aGUgZHJpdmUuCi0KLU5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrIGZvciBDRFUzMUEvQ0RVMzNBIGRyaXZlcy4gIFNvbWUgdmVuZG9ycwotbWFya2V0IHRoZWlyIGRyaXZlcyBhcyBDRFUzMUEgY29tcGF0aWJsZS4gIFRoZXkgbGllLiAgVGhlaXIgZHJpdmVzIGFyZQotcmVhbGx5IENEVTMxQSBoYXJkd2FyZSBpbnRlcmZhY2UgY29tcGF0aWJsZSAodGhleSBjYW4gcGx1ZyBpbnRvIHRoZQotc2FtZSBjYXJkKS4gIFRoZXkgYXJlIG5vdCBzb2Z0d2FyZSBjb21wYXRpYmxlLgotCi1TZXR0aW5nIFVwIHRoZSBIYXJkd2FyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIENEVTMxQSBkcml2ZXIgaXMgdW5hYmxlIHRvIHNhZmVseSB0ZWxsIGlmIGFuIGludGVyZmFjZSBjYXJkIGlzCi1wcmVzZW50IHRoYXQgaXQgY2FuIHVzZSBiZWNhdXNlIHRoZSBpbnRlcmZhY2UgY2FyZCBkb2VzIG5vdCBhbm5vdW5jZQotaXRzIHByZXNlbmNlIGluIGFueSB3YXkgYmVzaWRlcyBwbGFjaW5nIDQgSS9PIGxvY2F0aW9ucyBpbiBtZW1vcnkuICBJdAotdXNlZCB0byBqdXN0IHByb2JlIG1lbW9yeSBhbmQgYXR0ZW1wdCBjb21tYW5kcywgYnV0IExpbnVzIHdpc2VseSBhc2tlZAotbWUgdG8gcmVtb3ZlIHRoYXQgYmVjYXVzZSBpdCBjb3VsZCByZWFsbHkgc2NyZXcgdXAgb3RoZXIgaGFyZHdhcmUgaW4KLXRoZSBzeXN0ZW0uCi0KLUJlY2F1c2Ugb2YgdGhpcywgeW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpbnRlcmZhY2UKLWlzLCB3aGF0IGludGVycnVwdHMgYXJlIHVzZWQsIGFuZCBwb3NzaWJseSBpZiB5b3UgYXJlIG9uIGEgUEFTLTE2Ci1zb3VuZGNhcmQuCi0KLUlmIHlvdSBoYXZlIHRoZSBTb255IENEVTMxQS9DRFUzM0EgZHJpdmUgaW50ZXJmYWNlIGNhcmQsIHRoZSBmb2xsb3dpbmcKLWRpYWdyYW0gd2lsbCBoZWxwIHlvdSBzZXQgaXQgdXAuICBJZiB5b3UgaGF2ZSBhbm90aGVyIGNhcmQsIHlvdSBhcmUgb24KLXlvdXIgb3duLiAgWW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEkvTyBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgaXMKLW5vdCB1c2VkIGJ5IGFub3RoZXIgY2FyZCBpbiB0aGUgc3lzdGVtLiAgWW91IHdpbGwgbmVlZCB0byBrbm93IHRoZSBJL08KLWFkZHJlc3MgYW5kIGludGVycnVwdCB5b3UgaGF2ZSBzZXQuICBOb3RlIHRoYXQgdXNlIG9mIGludGVycnVwdHMgaXMKLWhpZ2hseSByZWNvbW1lbmRlZCwgaWYgcG9zc2libGUsIGl0IHJlYWxseSBjdXRzIGRvd24gb24gQ1BVIHVzZWQuCi1VbmZvcnR1bmF0ZWx5LCBtb3N0IHNvdW5kY2FyZHMgZG8gbm90IHN1cHBvcnQgaW50ZXJydXB0cyBmb3IgdGhlaXIKLUNEUk9NIGludGVyZmFjZXMuICBCeSBkZWZhdWx0LCB0aGUgU29ueSBpbnRlcmZhY2UgY2FyZCBjb21lcyB3aXRoCi1pbnRlcnJ1cHRzIGRpc2FibGVkLgotICAgCi0gICAgICAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgIHwgIEpQMSAgICAgfCAgMzQgUGluIENvbm4gICAgfCAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgIEpQNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0rCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICArLSsKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgRXh0ZXJuYWwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgfCAgQ29ubmVjdG9yCi0gICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8IHwKLSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICstKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKwotICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgCi0gICAgICBKUDEgc2V0cyB0aGUgQmFzZSBBZGRyZXNzLCB1c2luZyB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgotICAgCi0gICAgICAgIEFkZHJlc3MgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIKLSAgICAgICAgLS0tLS0tLSAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAweDMyMCAgICAgICAgICAgU2hvcnQgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzMwICAgICAgICAgICBTaG9ydCAgICAgICAgICAgT3BlbgotICAgICAgICAweDM0MCAgICAgICAgICAgT3BlbiAgICAgICAgICAgIFNob3J0Ci0gICAgICAgIDB4MzYwICAgICAgICAgICBPcGVuICAgICAgICAgICAgT3BlbgotICAgCi0gICAgICBKUDIgYW5kIEpQMyBjb25maWd1cmUgdGhlIERNQSBjaGFubmVsOyB0aGV5IG11c3QgYmUgc2V0IHRoZSBzYW1lLgotICAgCi0gICAgICAgIERNQSAgICAgICAgICAgICBQaW4gMSAgICAgICAgICAgUGluIDIgICAgICAgICAgIFBpbiAzCi0gICAgICAgIC0tLSAgICAgICAgICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tCi0gICAgICAgIDEgICAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDIgICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICAzICAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbgotICAgCi0gICAgICBKUDQgQ29uZmlndXJlcyB0aGUgSVJROgotICAgCi0gICAgICAgIElSUSAgICAgUGluIDEgICAgICAgICAgIFBpbiAyICAgICAgICAgICBQaW4gMyAgICAgICAgICAgUGluIDQKLSAgICAgICAgLS0tICAgICAtLS0tLSAgICAgICAgICAgLS0tLS0gICAgICAgICAgIC0tLS0tICAgICAgICAgICAtLS0tLQotICAgICAgICAzICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT24gICAgICAgICAgICAgIE9mZgotICAgICAgICA0ICAgICAgIE9mZiAgICAgICAgICAgICBPZmYqICAgICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uCi0gICAgICAgIDUgICAgICAgT24gICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAgICAgIDYgICAgICAgT2ZmICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmCi0gICAKLSAgICAgICAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0byBzZXQgdGhpcyBmb3IgaW50ZXJydXB0Ci0gICAgICAgICAgICAgICAgICA0LCBidXQgSSB0aGluayB0aGF0IGlzIGEgbWlzdGFrZS4KLQotTm90ZSB0aGF0IGlmIHlvdSBoYXZlIGFub3RoZXIgaW50ZXJmYWNlIGNhcmQsIHlvdSB3aWxsIG5lZWQgdG8gbG9vayBhdAotdGhlIGRvY3VtZW50YXRpb24gdG8gZmluZCB0aGUgSS9PIGJhc2UgYWRkcmVzcy4gIFRoaXMgaXMgc3BlY2lmaWVkIHRvCi10aGUgU0xDRC5TWVMgZHJpdmVyIGZvciBET1Mgd2l0aCB0aGUgL0I6IHBhcmFtZXRlciwgc28geW91IGNhbiBsb29rIGF0Ci15b3UgRE9TIGRyaXZlciBzZXR1cCB0byBmaW5kIHRoZSBhZGRyZXNzLCBpZiBuZWNlc3NhcnkuCi0KLUNvbmZpZ3VyaW5nIHRoZSBLZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotWW91IG11c3QgdGVsbCB0aGUga2VybmVsIHdoZXJlIHRoZSBkcml2ZSBpcyBhdCBib290IHRpbWUuICBUaGlzIGNhbiBiZQotZG9uZSBhdCB0aGUgTGludXggYm9vdCBwcm9tcHQsIGJ5IHVzaW5nIExJTE8sIG9yIGJ5IHVzaW5nIEJvb3RsaW4uCi1Ob3RlIHRoYXQgdGhpcyBpcyBubyBzdWJzdGl0dXRlIGZvciBIT1dUT3MgYW5kIExJTE8gZG9jdW1lbnRhdGlvbiwgaWYKLXlvdSBhcmUgY29uZnVzZWQgcGxlYXNlIHJlYWQgdGhvc2UgZm9yIGluZm8gb24gYm9vdGxpbmUgY29uZmlndXJhdGlvbgotYW5kIExJTE8uCi0KLUF0IHRoZSBsaW51eCBib290IHByb21wdCwgcHJlc3MgdGhlIEFMVCBrZXkgYW5kIGFkZCB0aGUgZm9sbG93aW5nIGxpbmUKLWFmdGVyIHRoZSBib290IG5hbWUgKHlvdSBjYW4gbGV0IHRoZSBrZXJuZWwgYm9vdCwgaXQgd2lsbCB0ZWxsIHlvdSB0aGUKLWRlZmF1bHQgYm9vdCBuYW1lIHdoaWxlIGJvb3RpbmcpOgotCi0JY2R1MzFhPTxiYXNlIGFkZHJlc3M+LDxpbnRlcnJ1cHQ+WyxQQVNdCi0KLVRoZSBiYXNlIGFkZHJlc3MgbmVlZHMgdG8gaGF2ZSAiMHgiIGluIGZyb250IG9mIGl0LCBzaW5jZSBpdCBpcyBpbgotaGV4LiAgRm9yIGluc3RhbmNlLCB0byBjb25maWd1cmUgYSBkcml2ZSBhdCBhZGRyZXNzIDMyMCBvbiBpbnRlcnJ1cHQgNSwKLXVzZSB0aGUgZm9sbG93aW5nOgotCi0JY2R1MzFhPTB4MzIwLDUKLQotSSB1c2UgdGhlIGZvbGxvd2luZyBib290IGxpbmU6Ci0KLQljZHUzMWE9MHgxZjg4LDAsUEFTCi0KLWJlY2F1c2UgSSBoYXZlIGEgUEFTLTE2IHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJydXB0IGZvciB0aGUKLUNEVTMxQSBpbnRlcmZhY2UuCi0KLUFkZGluZyB0aGlzIGFzIGFuIGFwcGVuZCBsaW5lIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIC9ldGMvbGlsby5jb25mCi1maWxlIHdpbGwgc2V0IGl0IGZvciBsaWxvIGNvbmZpZ3VyYXRpb25zLiAgSSBoYXZlIHRoZSBmb2xsb3dpbmcgYXMgdGhlCi1maXJzdCBsaW5lIGluIG15IGxpbG8uY29uZiBmaWxlOgotCi0JYXBwZW5kPSJjZHUzMWE9MHgxZjg4LDAiCi0KLUknbSBub3Qgc3VyZSBob3cgdG8gc2V0IHVwIEJvb3RsaW4gKEkgaGF2ZSBuZXZlciB1c2VkIGl0KSwgaWYgc29tZW9uZQotd291bGQgbGlrZSB0byBmaWxsIGluIHRoaXMgc2VjdGlvbiBwbGVhc2UgZG8uCi0KLQotQ29uZmlndXJpbmcgYXMgYSBNb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgc3VwcG9ydHMgbG9hZGluZyBhcyBhIG1vZHVsZS4gIEhvd2V2ZXIsIHlvdSBtdXN0IHNwZWNpZnkKLXRoZSBib290IGFkZHJlc3MgYW5kIGludGVycnVwdCBvbiB0aGUgYm9vdCBsaW5lIHRvIGluc21vZC4gIFlvdSBjYW4ndAotdXNlIG1vZHByb2JlIHRvIGxvYWQgaXQsIHNpbmNlIG1vZHByb2JlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nCi12YXJpYWJsZXMuCi0KLUFueXdheSwgSSB1c2UgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGxvYWQgbXkgZHJpdmVyIGFzIGEgbW9kdWxlCi0KLSAgL3NiaW4vaW5zbW9kIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgL21pc2MvY2R1MzFhLm8gY2R1MzFhX3BvcnQ9MHgxZjg4Ci0KLVlvdSBjYW4gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGluIHRoZSBkcml2ZXI6Ci0KLSAgY2R1MzFhX3BvcnQ9PEkvTyBhZGRyZXNzPiAtIHNldHMgdGhlIGJhc2UgSS9PLiAgSWYgaGV4LCBwdXQgMHggaW4KLQkJCSAgICAgIGZyb250IG9mIGl0LiAgVGhpcyBtdXN0IGJlIHNwZWNpZmllZC4KLQotICBjZHUzMWFfaXJxPTxpbnRlcnJ1cHQ+IC0gU2V0cyB0aGUgaW50ZXJydXB0IG51bWJlci4gIExlYXZpbmcgdGhpcwotCQkJICAgb2ZmIHdpbGwgdHVybiBpbnRlcnJ1cHRzIG9mZi4KLQotCi1Ecml2ZXIgU3BlY2lhbCBGZWF0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBmZWF0dXJlcyBiZXlvbmQgdGhlIG5vcm1hbCBhdWRpbyBhbmQgQ0QtUk9NCi1mdW5jdGlvbnMgb2YgdGhlIGRyaXZlLgotCi0yMDQ4IGJ5dGUgYnVmZmVyIG1vZGUKLQotSWYgYSBkaXNrIGlzIG1vdW50ZWQgd2l0aCAtbyBibG9jaz0yMDQ4LCBkYXRhIGlzIGNvcGllZCBzdHJhaWdodCBmcm9tCi10aGUgZHJpdmUgZGF0YSBwb3J0IHRvIHRoZSBidWZmZXIuICBPdGhlcndpc2UsIHRoZSByZWFkYWhlYWQgYnVmZmVyCi1tdXN0IGJlIGludm9sdmVkIHRvIGhvbGQgdGhlIG90aGVyIDFLIG9mIGRhdGEgd2hlbiBhIDFLIGJsb2NrCi1vcGVyYXRpb24gaXMgZG9uZS4gIE5vdGUgdGhhdCB3aXRoIDIwNDggYnl0ZSBibG9ja3MgeW91IGNhbm5vdCBleGVjdXRlCi1maWxlcyBmcm9tIHRoZSBDRC4KLQotWEEgY29tcGF0aWJpbGl0eQotCi1UaGUgZHJpdmVyIHNob3VsZCBzdXBwb3J0IFhBIGRpc2tzIGZvciBib3RoIHRoZSBDRFUzMUEgYW5kIENEVTMzQS4gIEl0Ci1kb2VzIHRoaXMgdHJhbnNwYXJlbnRseSwgdGhlIHVzaW5nIHByb2dyYW0gZG9lc24ndCBuZWVkIHRvIHNldCBpdC4KLQotTXVsdGktU2Vzc2lvbgotCi1BIG11bHRpLXNlc3Npb24gZGlzayBsb29rcyBqdXN0IGxpa2UgYSBub3JtYWwgZGlzayB0byB0aGUgdXNlci4gIEp1c3QKLW1vdW50IG9uZSBub3JtYWxseSwgYW5kIGFsbCB0aGUgZGF0YSBzaG91bGQgYmUgdGhlcmUuICBBIHNwZWNpYWwKLXRoYW5rcyB0byBLb2VuIGZvciBoZWxwIHdpdGggdGhpcyEKLQotUmF3IHNlY3RvciBJL08KLQotVXNpbmcgdGhlIENEUk9NUkVBREFVRElPIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQgcmF3IGF1ZGlvIGFuZCBkYXRhCi10cmFja3MuICBCb3RoIG9wZXJhdGlvbnMgcmV0dXJuIDIzNTIgYnl0ZXMgcGVyIHNlY3Rvci4gIE9uIHRoZSBkYXRhCi10cmFja3MsIHRoZSBmaXJzdCAxMiBieXRlcyBpcyBub3QgcmV0dXJuZWQgYnkgdGhlIGRyaXZlIGFuZCB0aGUgdmFsdWUKLW9mIHRoYXQgZGF0YSBpcyBpbmRldGVybWluYXRlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNiBiL0RvY3VtZW50YXRpb24vY2Ryb20vY20yMDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMDM2OGYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9jbTIwNgorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi1UaGlzIGlzIHRoZSByZWFkbWUgZmlsZSBmb3IgdGhlIGRyaXZlciBmb3IgdGhlIFBoaWxpcHMvTE1TIGNkcm9tIGRyaXZlCi1jbTIwNiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBjbTI2MCBob3N0IGFkYXB0ZXIgY2FyZC4gCi0KLQkJCQkoYykgMTk5NSBEYXZpZCBBLiB2YW4gTGVldXdlbgotICAgCi1DaGFuZ2VzIHNpbmNlIHZlcnNpb24gMC45OQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gSW50ZXJmYWNpbmcgdG8gdGhlIGtlcm5lbCBpcyByb3V0ZWQgdGhvdWdoIGFuIGV4dHJhIGludGVyZmFjZSBsYXllciwgCi0gIGNkcm9tLmMuIFRoaXMgYWxsb3dzIHJ1bnRpbWUtY29uZmlndXJhYmxlIGBiZWhhdmlvcicgb2YgdGhlIGNkcm9tLWRyaXZlLCAKLSAgaW5kZXBlbmRlbnQgb2YgdGhlIGRyaXZlci4gCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4zMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgYXVkaW8gc3VwcG9ydCwgdGhhdCBpcywgYm90aCAgd29ya21hbiwgd29ya2JvbmUgYW5kIGNkcCB3b3JrCi0gIG5vdyByZWFzb25hYmx5LiBSZWFkaW5nIFRPQyBzdGlsbCB0YWtlcyBzb21lIHRpbWUuIHhtY2QgaGFzIGJlZW4KLSAgcmVwb3J0ZWQgdG8gcnVuIHN1Y2Nlc3NmdWxseS4gCi0tIE1hZGUgYXV0by1wcm9iZSBjb2RlIGEgbGl0dGxlIGJldHRlciwgSSBob3BlCi0KLUZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMC4yOAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEZ1bGwgc3BlZWQgdHJhbnNmZXIgcmF0ZSAoMzAwIGtCL3MpLgotLSBNaW5pbXVtIGtlcm5lbCBtZW1vcnkgdXNhZ2UgZm9yIGJ1ZmZlcmluZyAobGVzcyB0aGFuIDMga0IpLgotLSBNdWx0aXNlc3Npb24gc3VwcG9ydC4KLS0gVHJheSBsb2NraW5nLgotLSBTdGF0aXN0aWNzIG9mIGRyaXZlciBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLgotLSBNb2R1bGUgc3VwcG9ydC4KLS0gQXV0by1wcm9iaW5nIG9mIGFkYXB0ZXIgY2FyZCdzIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUsCi0gIGFsc28gY29uZmlndXJhYmxlIGF0IGJvb3QgdGltZSBvciBtb2R1bGUgbG9hZCB0aW1lLgotCi0KLURlY2lkZSBob3cgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlIGRyaXZlci4gVGhlcmUgYXJlIHR3bwotb3B0aW9uczoKLQotICAgKGEpIGluc3RhbGxpbmcgdGhlIGRyaXZlciBhcyBhIHJlc2lkZW50IHBhcnQgb2YgdGhlIGtlcm5lbAotICAgKGIpIGNvbXBpbGluZyB0aGUgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlCi0KLSAgIEZ1cnRoZXIsIHlvdSBtdXN0IGRlY2lkZSBpZiB5b3UgYXJlIGdvaW5nIHRvIHNwZWNpZnkgdGhlIGJhc2UgcG9ydAotICAgYWRkcmVzcyBhbmQgdGhlIGludGVycnVwdCByZXF1ZXN0IGxpbmUgb2YgdGhlIGFkYXB0ZXIgY2FyZCBjbTI2MCBhcwotICAgYm9vdCBvcHRpb25zIGZvciAoYSksIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciAoYiksIHVzZSBhdXRvbWF0aWMKLSAgIHByb2Jpbmcgb2YgdGhlc2UgdmFsdWVzLCBvciBoYXJkLXdpcmUgeW91ciBhZGFwdG9yIGNhcmQncyBzZXR0aW5ncwotICAgaW50byB0aGUgc291cmNlIGNvZGUuIElmIHlvdSBkb24ndCBjYXJlLCB5b3UgY2FuIGNob29zZSAKLSAgIGF1dG9wcm9iaW5nLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4gSW4gdGhhdCBjYXNlIHlvdSBjYW4gbW92ZSBvbiB0bwotICAgdGhlIG5leHQgc3RlcC4KLQotQ29tcGlsaW5nIHRoZSBrZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBtb3ZlIHRvIC91c3Ivc3JjL2xpbnV4IGFuZCBkbyBhIAotCi0JbWFrZSBjb25maWcKLQotICAgSWYgeW91IGhhdmUgY2hvc2VuIG9wdGlvbiAoYSksIGFuc3dlciB5ZXMgdG8gQ09ORklHX0NNMjA2IGFuZAotICAgQ09ORklHX0lTTzk2NjBfRlMuCi0KLSAgIElmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGIpLCBhbnN3ZXIgeWVzIHRvIENPTkZJR19NT0RWRVJTSU9OUwotICAgYW5kIG5vICghKSB0byBDT05GSUdfQ00yMDYgYW5kIENPTkZJR19JU085NjYwX0ZTLiAKLQotMikgdGhlbiBkbyBhIAotCQotCW1ha2UgY2xlYW47IG1ha2UgekltYWdlOyBtYWtlIG1vZHVsZXMKLQotMykgZG8gdGhlIHVzdWFsIHRoaW5ncyB0byBpbnN0YWxsIGEgbmV3IGltYWdlIChiYWNrdXAgdGhlIG9sZCBvbmUsIHJ1bgotICAgYHJkZXYgLVIgekltYWdlIDEnLCBjb3B5IHRoZSBuZXcgaW1hZ2UgaW4gcGxhY2UsIHJ1biBsaWxvKS4gIE1pZ2h0Ci0gICBiZSBgbWFrZSB6bGlsbycuCi0KLVVzaW5nIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSB3aWxsIG9ubHkgb2NjYXNpb25hbGx5IHVzZSB0aGUgY2Qtcm9tIGRyaXZlciwgeW91IGNhbiBjaG9vc2UKLW9wdGlvbiAoYiksIGluc3RhbGwgYXMgYSBsb2FkYWJsZSBtb2R1bGUuIFlvdSBtYXkgaGF2ZSB0byByZS1jb21waWxlCi10aGUgbW9kdWxlIHdoZW4geW91IHVwZ3JhZGUgdGhlIGtlcm5lbCB0byBhIG5ldyB2ZXJzaW9uLiAKLQotU2luY2UgdmVyc2lvbiAwLjk2LCBtdWNoIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvCi1hIGdlbmVyaWMgY2Ryb20gaW50ZXJmYWNlIGluIHRoZSBmaWxlIGNkcm9tLmMuIFRoZSBtb2R1bGUgY20yMDYubwotZGVwZW5kcyBvbiBjZHJvbS5vLiBJZiB0aGUgbGF0dGVyIGlzIG5vdCBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsCi15b3UgbXVzdCBleHBsaWNpdGx5IGxvYWQgaXQgYmVmb3JlIGNtMjA2Lm86Ci0KLQkgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvY2Ryb20ubwotCi1UbyBpbnN0YWxsIHRoZSBtb2R1bGUsIHlvdSB1c2UgdGhlIGNvbW1hbmQsIGFzIHJvb3QKLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8KLQotWW91IGNhbiBzcGVjaWZ5IHRoZSBiYXNlIGFkZHJlc3Mgb24gdGhlIGNvbW1hbmQgbGluZSBhcyB3ZWxsIGFzIHRoZSBpcnEgCi1saW5lIHRvIGJlIHVzZWQsIGUuZy4KLQotCWluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL2NtMjA2Lm8gY20yMDY9MHgzMDAsMTEKLQotVGhlIG9yZGVyIG9mIGJhc2UgcG9ydCBhbmQgaXJxIGxpbmUgZG9lc24ndCBtYXR0ZXI7IGlmIHlvdSBzcGVjaWZ5IG9ubHkKLW9uZSwgdGhlIG90aGVyIHdpbGwgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHQuICBZb3UKLW1heSBhbHNvIGhhdmUgdG8gaW5zdGFsbCB0aGUgZmlsZS1zeXN0ZW0gbW9kdWxlIGBpc285NjYwLm8nLCBpZiB5b3UKLWRpZG4ndCBjb21waWxlIHRoYXQgaW50byB0aGUga2VybmVsLiAKLQotCi1Vc2luZyB0aGUgZHJpdmVyIGFzIHBhcnQgb2YgdGhlIGtlcm5lbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIHlvdSBoYXZlIGNob3NlbiBvcHRpb24gKGEpLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGJhc2UtcG9ydAotYWRkcmVzcyBhbmQgaXJxIG9uIHRoZSBsaWxvIGJvb3QgY29tbWFuZCBsaW5lLCBlLmcuOgotCi0JTElMTzogbGludXggY20yMDY9MHgzNDAsMTEKLQotVGhpcyBhc3N1bWVzIHRoYXQgeW91ciBsaW51eCBrZXJuZWwgaW1hZ2Uga2V5d29yZCBpcyBgbGludXgnLiAKLUlmIHlvdSBzcGVjaWZ5IGVpdGhlciBJUlEgKDMtLTExKSBvciBiYXNlIHBvcnQgKDB4MzAwLS0weDM3MCksCi1hdXRvIHByb2JpbmcgaXMgdHVybmVkIG9mZiBmb3IgYm90aCBzZXR0aW5ncywgdGh1cyBzZXR0aW5nIHRoZSAKLW90aGVyIHZhbHVlIHRvIHRoZSBjb21waWxlZC1pbiBkZWZhdWx0LgotCi1Ob3RlIHRoYXQgeW91IGNhbiBhbHNvIHB1dCB0aGVzZSBwYXJhbWV0ZXJzIGluIHRoZSBsaWxvIGNvbmZpZ3VyYXRpb24gZmlsZToKLQotIyBsaW51eCBjb25maWcKLWltYWdlID0gL3ZtbGludXoKLSAgIHJvb3QgPSAvZGV2L2hkYTEKLSAgIGxhYmVsID0gTGludXgKLSAgIGFwcGVuZCA9ICJjbTIwNj0weDM0MCwxMSIKLSAgIHJlYWQtb25seQotCi0KLUlmIG1vZHVsZSBwYXJhbWV0ZXJzIGFuZCBMSUxPIGNvbmZpZyBvcHRpb25zIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUlmIGF1dG9wcm9iaW5nIGRvZXMgbm90IHdvcmssIHlvdSBjYW4gaGFyZC13aXJlIHRoZSBkZWZhdWx0IHZhbHVlcwotb2YgdGhlIGJhc2UgcG9ydCBhZGRyZXNzIChDTTIwNl9CQVNFKSBhbmQgaW50ZXJydXB0IHJlcXVlc3QgbGluZQotKENNMjA2X0lSUSkgaW50byB0aGUgZmlsZSAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL2NtMjA2LmguIENoYW5nZQotdGhlIGRlZmluZXMgb2YgQ00yMDZfSVJRIGFuZCBDTTIwNl9CQVNFLgotCi0KLU1vdW50aW5nIHRoZSBjZHJvbQotLS0tLS0tLS0tLS0tLS0tLS0tCi0xKSBNYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZGV2aWNlIGlzIGluc3RhbGxlZCBpbiAvZGV2LgotCi0gIAlta25vZCAvZGV2L2NtMjA2Y2QgYiAzMiAwCi0KLTIpIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1vdW50IHBvaW50LCBlLmcuLCAvY2Ryb20gCi0KLQlta2RpciAvY2Ryb20KLQotMykgbW91bnQgdXNpbmcgYSBjb21tYW5kIGxpa2UgdGhpcyAocnVuIGFzIHJvb3QpOgotCi0JbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9jbTIwNmNkIC9jZHJvbQotCi00KSBGb3IgdXNlci1tb3VudHMsIGFkZCBhIGxpbmUgaW4gL2V0Yy9mc3RhYgotCi0JL2Rldi9jbTIwNmNkICAgICAgL2Nkcm9tICAgICBpc285NjYwIAlybyxub2F1dG8sdXNlcgotCi0gICBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gZ2l2ZSB0aGUgY29tbWFuZHMKLQotCW1vdW50IC9jZHJvbQotCXVtb3VudCAvY2Ryb20KLQotSWYgdGhpbmdzIGRvbid0IHdvcmsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gVHJ5IHRvIGRvIGEgYGRtZXNnJyB0byBmaW5kIG91dCBpZiB0aGUgZHJpdmVyIHNhaWQgYW55dGhpbmcgYWJvdXQKLSAgd2hhdCBpcyBnb2luZyB3cm9uZyBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLgotCi0tIFRyeSB0byBkbyBhIGBkZCBpZj0vZGV2L2NtMjA2Y2QgfCBvZCAtdGMgfCBsZXNzJyB0byByZWFkIGZyb20gdGhlCi0gIENELgotCi0tIExvb2sgaW4gdGhlIC9wcm9jIGRpcmVjdG9yeSB0byBzZWUgaWYgYGNtMjA2JyBzaG93cyB1cCB1bmRlciBvbmUgb2YKLSAgYGludGVycnVwdHMnLCBgaW9wb3J0cycsIGBkZXZpY2VzJyBvciBgbW9kdWxlcycgKGlmIGFwcGxpY2FibGUpLgotCi0KLURJU0NMQUlNRVIgCi0tLS0tLS0tLS0tIAotSSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgdGhpcyBkcml2ZXIgd29ya3MsIG9yIHRoYXQgdGhlIGhhcmR3YXJlIHdpbGwKLW5vdCBiZSBoYXJtZWQsIGFsdGhvdWdoIEkgY29uc2lkZXIgaXQgbW9zdCB1bmxpa2VseS4gCi0KLUkgaG9wZSB0aGF0IHlvdSdsbCBmaW5kIHRoaXMgZHJpdmVyIGluIHNvbWUgd2F5IHVzZWZ1bC4gCi0KLQkJCQkJRGF2aWQgdmFuIExlZXV3ZW4KLQkJCQkJZGF2aWRAdG0udG5vLm5sCi0KLU5vdGUgZm9yIExpbnV4IENEUk9NIHZlbmRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Zb3UgYXJlIGVuY291cmFnZWQgdG8gaW5jbHVkZSB0aGlzIGRyaXZlciBvbiB5b3VyIExpbnV4IENEUk9NLiBJZgoteW91IGRvLCB5b3UgbWlnaHQgY29uc2lkZXIgc2VuZGluZyBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4KLVlvdSBjYW4gY29udGFjdCBtZSB0aHJvdWdoIG15IGUtbWFpbCBhZGRyZXNzLCBkYXZpZEB0bS50bm8ubmwuIAotSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgaW50byBhIGtlcm5lbCB0byBib290IG9mZiBhIGNkcm9tLCAKLXlvdSBzaG91bGQgYWN0dWFsbHkgc2VuZCBtZSBhIGZyZWUgY29weSBvZiB0aGF0IGNkLXJvbS4gCi0KLUNvcHlyaWdodAotLS0tLS0tLS0tCi1UaGUgY29weXJpZ2h0IG9mIHRoZSBjbTIwNiBkcml2ZXIgZm9yIExpbnV4IGlzIAotCi0gICAgKGMpIDE5OTUgRGF2aWQgQS4gdmFuIExlZXV3ZW4KLQotVGhlIGRyaXZlciBpcyByZWxlYXNlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR05VIGdlbmVyYWwgcHVibGljCi1saWNlbnNlLCB3aGljaCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgcm9vdCBvZiB0aGlzCi1zb3VyY2UgdHJlZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vZ3NjZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxY2EzNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL2dzY2QKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0JR29sZHN0YXIgUjQyMCBDRC1Sb20gZGV2aWNlIGRyaXZlciBSRUFETUUKLQotRm9yIGFsbCBraW5kIG9mIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHb2xkU3RhciBSNDIwIENEUk9NCi1hbmQgdGhpcyBMaW51eCBkZXZpY2UgZHJpdmVyIHNlZSB0aGUgV1dXIHBhZ2U6Ci0KLSAgICAgICAgaHR0cDovL2xpbnV4LnJ6LmZoLWhhbm5vdmVyLmRlL35yYXVwYWNoICAgICAgICAKLQotCi0gICAgICBJZiB5b3UgYXJlIHRoZSBlZGl0b3Igb2YgYSBMaW51eCBDRCwgeW91IHNob3VsZAotICAgICAgZW5hYmxlIGdzY2QuYyB3aXRoaW4geW91ciBib290IGZsb3BweSBrZXJuZWwuIFBsZWFzZSwKLSAgICAgIHNlbmQgbWUgb25lIG9mIHlvdXIgQ0RzIGZvciBmcmVlLgotCi0KLVRoaXMgY3VycmVudCBkcml2ZXIgdmVyc2lvbiAwLjRhIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBkYXRhIGZyb20gdGhlIGRpc2suCi1DdXJyZW50bHkgd2UgaGF2ZSBubyBhdWRpbyBhbmQgbm8gbXVsdGlzZXNzaW9uIG9yIFhBIHN1cHBvcnQuCi1UaGUgcG9sbGluZyBpbnRlcmZhY2UgaXMgdXNlZCwgbm8gRE1BLgotCi0KLVNvbWV0aW1lcyB0aGUgR29sZFN0YXIgUjQyMCBpcyBzb2xkIGluIGEgJ1JldmVhbCBNdWx0aW1lZGlhIEtpdCcuIFRoaXMga2l0J3MKLWRyaXZlIGludGVyZmFjZSBpcyBjb21wYXRpYmxlLCB0b28uCi0KLQotSW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlIHRvICcvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tJyBhbmQgZWRpdCB0aGUgZmlsZSAnZ3NjZC5oJy4gSW5zZXJ0Ci10aGUgaS9vIGFkZHJlc3Mgb2YgeW91ciBpbnRlcmZhY2UgY2FyZC4KLQotVGhlIGRlZmF1bHQgYmFzZSBhZGRyZXNzIGlzIDB4MzQwLiBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuIAotQWRkcmVzcyBzZWxlY3Rpb24gaXMgYWNjb21wbGlzaGVkIGJ5IGp1bXBlcnMgUE44MDEtMSB0byBQTjgwMS00IG9uIHRoZSAKLUdvbGRTdGFyIEludGVyZmFjZSBDYXJkLgotQXBwcm9wcmlhdGUgc2V0dGluZ3MgYXJlOiAweDMwMCwgMHgzMTAsIDB4MzIwLCAweDMzMCwgMHgzNDAsIDB4MzUwLCAweDM2MAotMHgzNzAsIDB4MzgwLCAweDM5MCwgMHgzQTAsIDB4M0IwLCAweDNDMCwgMHgzRDAsIDB4M0UwLCAweDNGMCAgICAgICAgICAgICAKLQotVGhlbiBnbyBiYWNrIHRvICcvdXNyL3NyYy9saW51eC8nIGFuZCAnbWFrZSBjb25maWcnIHRvIGJ1aWxkIHRoZSBuZXcKLWNvbmZpZ3VyYXRpb24gZm9yIHlvdXIga2VybmVsLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIEdvbGRTdGFyIGRyaXZlcgotbGlrZSBhIG1vZHVsZSwgZG9uJ3Qgc2VsZWN0ICdHb2xkU3RhciBDRFJPTSBzdXBwb3J0Jy4gQnkgdGhlIHdheSwgeW91Ci1oYXZlIHRvIGluY2x1ZGUgdGhlIGlzbzk2NjAgZmlsZXN5c3RlbS4KLQotTm93IHN0YXJ0IGNvbXBpbGluZyB0aGUga2VybmVsIHdpdGggJ21ha2UgekltYWdlJy4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlLCB5b3UgaGF2ZSB0byBkbyAnbWFrZSBtb2R1bGVzJyAKLWFuZCAnbWFrZSBtb2R1bGVzX2luc3RhbGwnLCBhZGRpdGlvbmFsbHkuCi1JbnN0YWxsIHlvdXIgbmV3IGtlcm5lbCBhcyB1c3VhbCAtIG1heWJlIHlvdSBkbyBpdCB3aXRoICdtYWtlIHpsaWxvJy4KLQotQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSBkcml2ZXIsIHlvdSBoYXZlIHRvCi0gICBta25vZCAvZGV2L2dzY2QwIGIgMTYgMAotdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgZmlsZSAoeW91IG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UpLgotCi1JZiB5b3UgdXNlIG1vZHVsZXMsIHlvdSBjYW4gdHJ5IHRvIGluc2VydCB0aGUgZHJpdmVyLgotU2F5OiAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vJwotb3I6ICAnaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvZ3NjZC5vIGdzY2Q9PGFkZHJlc3M+JwotVGhlIGRyaXZlciBzaG91bGQgcmVwb3J0IGl0cyByZXN1bHRzLgotCi1UaGF0J3MgaXQhIE1vdW50IGEgZGlzaywgaS5lLiAnbW91bnQgLXJ0IGlzbzk2NjAgL2Rldi9nc2NkMCAvY2Ryb20nCi0KLUZlZWwgZnJlZSB0byByZXBvcnQgZXJyb3JzIGFuZCBzdWdnZXN0aW9ucyB0byB0aGUgZm9sbG93aW5nIGFkZHJlc3MuCi1CZSBzdXJlLCBJJ20gdmVyeSBoYXBweSB0byByZWNlaXZlIHlvdXIgY29tbWVudHMhCi0gCi0gICAgICAgIE9saXZlciBSYXVwYWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5ub3ZlciwgSnVuaSAxOTk1Ci0ocmF1cGFjaEBud2ZzMS5yei5maC1oYW5ub3Zlci5kZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL2lzcDE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg2NTMzLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIC0tIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYKLQotRG9jcyBieSBFcmljIHZhbiBkZXIgTWFhcmVsIDxILlQuTS52LmQuTWFhcmVsQG1hcmluLm5sPgotCi1UaGlzIGlzIHRoZSBSRUFETUUgZm9yIHZlcnNpb24gMC42IG9mIHRoZSBjZHJvbSBpbnRlcmZhY2Ugb24gYW4KLUlTUDE2LCBNQUQxNiBvciBNb3phcnQgc291bmQgY2FyZC4KLQotVGhlIGRldGVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGludGVyZmFjZSB1c2VkIHRvIGJlIGluY2x1ZGVkCi1pbiBib3RoIHRoZSBzamNkIGFuZCBvcHRjZCBjZHJvbSBkcml2ZXIuIERyaXZlcyBzdXBwb3J0ZWQgYnkgdGhlc2UKLWRyaXZlcnMgY2FtZSBwYWNrZWQgd2l0aCBNZWRpYSBNYWdpYydzIG11bHRpIG1lZGlhIGtpdCwgd2hpY2ggYWxzbwotaW5jbHVkZWQgdGhlIElTUDE2IGNhcmQuIFRoZSBpZGVhICh0aGFua3MgTGVvIFNwaWVrbWFuKQotdG8gbW92ZSBpdCBmcm9tIHRoZXNlIGRyaXZlcnMgaW50byBhIHNlcGFyYXRlIG1vZHVsZSBhbmQgbW9yZW92ZXIsIG5vdCB0bwotcmVseSBvbiB0aGUgTUFEMTYgc291bmQgZHJpdmVyLCBhcmUgYXMgZm9sbG93czoKLS1kdXBsaWNhdGlvbiBvZiBjb2RlIGluIHRoZSBrZXJuZWwgaXMgYSB3YXN0ZSBvZiByZXNvdXJjZXMgYW5kIHNob3VsZAotIGJlIGF2b2lkZWQ7Ci0taG93ZXZlciwga2VybmVscyBhbmQgbm90YWJseSB0aG9zZSBpbmNsdWRlZCB3aXRoIExpbnV4IGRpc3RyaWJ1dGlvbnMKLSAoY2YgU2xhY2t3YXJlIDMuMCBpbmNsdWRlZCB2ZXJzaW9uIDAuNSBvZiB0aGUgaXNwMTYgY29uZmlndXJhdGlvbgotIGNvZGUgaW5jbHVkZWQgaW4gdGhlIGRyaXZlcnMpIGRvbid0IGFsd2F5cyBjb21lIHdpdGggc291bmQgc3VwcG9ydAotIGluY2x1ZGVkLiBFc3BlY2lhbGx5IHdoZW4gdGhleSBhbHJlYWR5IGluY2x1ZGUgYSBidW5jaCBvZiBjZHJvbSBkcml2ZXJzLgotIEhlbmNlLCB0aGUgY2Ryb20gaW50ZXJmYWNlIHNob3VsZCBiZSBjb25maWd1cmFibGUgX2luZGVwZW5kZW50bHlfIG9mCi0gc291bmQgc3VwcG9ydC4KLQotVGhlIElTUDE2LCBNQUQxNiBhbmQgTW96YXJ0IHNvdW5kIGNhcmRzIGhhdmUgYW4gT1BUaSA4MkM5Mjggb3IgYW4KLU9QVGkgODJDOTI5IGNoaXAuICBUaGUgaW50ZXJmYWNlIG9uIHRoZXNlIGNhcmRzIHNob3VsZCB3b3JrIHdpdGgKLWFueSBjZHJvbSBhdHRhY2hlZCB0byB0aGUgY2FyZCwgd2hpY2ggaXMgJ2VsZWN0cmljYWxseScgY29tcGF0aWJsZQotd2l0aCBTYW55by9QYW5hc29uaWMsIFNvbnkgb3IgTWl0c3VtaSBub24taWRlIGRyaXZlcy4gSG93ZXZlciwgdGhlCi1jb21tYW5kIHNldHMgZm9yIGFueSBwcm9wcmlldGFyeSBkcml2ZXMgbWF5IGRpZmZlcgotKGFuZCBoZW5jZSBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUga2VybmVsKSBmcm9tIHRoZXNlIGZvdXIgdHlwZXMuCi1Gb3IgYSBmYWN0IEkga25vdyB0aGUgaW50ZXJmYWNlIHdvcmtzIGFuZCB0aGUgd2F5IG9mIGNvbmZpZ3VyYXRpb24KLWFzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50YXRpb24gd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLXNqY2QgKGluIFNhbnlvL1BhbmFzb25pYyBjb21wYXRpYmlsaXR5IG1vZGUpIGNkcm9tIGRyaXZlcnMKLShwcm9iYWJseSB3aXRoIHRoZSBvcHRjZCAoaW4gU29ueSBjb21wYXRpYmlsaXR5IG1vZGUpIGFzIHdlbGwpLgotSWYgeW91IGhhdmUgc3VjaCBhbiBPUFRpIGJhc2VkIHNvdW5kIGNhcmQgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKLWNkcm9tIGludGVyZmFjZSB3aXRoIGEgY2Ryb20gZHJpdmUgc3VwcG9ydGVkIGJ5IGFueSBvZiB0aGUgb3RoZXIgY2Ryb20KLWRyaXZlcnMsIGl0IHdpbGwgcHJvYmFibHkgd29yay4gUGxlYXNlIGxldCBtZSBrbm93IGFueSBleHBlcmllbmNlIHlvdQotbWlnaHQgaGF2ZSkuCi1JIHVuZGVyc3RhbmQgdGhhdCBjYXJkcyBiYXNlZCBvbiB0aGUgT1BUaSA4MkM5MjkgY2hpcHMgbWF5IGJlIGNvbmZpZ3VyZWQKLShoYXJkd2FyZSBqdW1wZXJzIHRoYXQgaXMpIGFzIGFuIElERSBpbnRlcmZhY2UuIEluaXRpYWxpc2F0aW9uIG9mIHN1Y2ggYQotY2FyZCBpbiB0aGlzIG1vZGUgaXMgbm90IHN1cHBvcnRlZCAoeWV0PykuCi0KLVRoZSBzdWdnZXN0aW9uIHRvIGNvbmZpZ3VyZSB0aGUgSVNQMTYgZXRjLiBzb3VuZCBjYXJkIGJ5IGJvb3RpbmcgRE9TIGFuZCAKLWRvIGEgd2FybSByZWJvb3QgdG8gYm9vdCBMaW51eCBzb21laG93IGRvZXNuJ3Qgd29yaywgYXQgbGVhc3Qgbm90Ci1vbiBteSBtYWNoaW5lIChJUEMgUDkwKSwgd2l0aCB0aGUgT1BUaSA4MkM5MjggYmFzZWQgY2FyZC4KLQotQm9vdGluZyB0aGUga2VybmVsIHRocm91Z2ggdGhlIGJvb3QgbWFuYWdlciBMSUxPIGFsbG93cyB0aGUgdXNlCi1vZiBzb21lIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uIHRoZSAnTElMTyBib290OicgcHJvbXB0LiBBdCBib290IHRpbWUKLXByZXNzIEFsdCBvciBTaGlmdCB3aGlsZSB0aGUgTElMTyBwcm9tcHQgaXMgd3JpdHRlbiBvbiB0aGUgc2NyZWVuIGFuZCBlbnRlcgotYW55IGtlcm5lbCBvcHRpb25zLiBBbHRlcm5hdGl2ZWx5IHRoZXNlIG9wdGlvbnMgbWF5IGJlIHVzZWQgaW4KLXRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uIGluIC9ldGMvbGlsby5jb25mLiBBZGRpbmcgJ2FwcGVuZD0iPGNtZF9saW5lX29wdGlvbnM+IicKLXdpbGwgZG8gdGhlIHRyaWNrIGFzIHdlbGwuCi1UaGUgc3ludGF4IG9mICdjbWRfbGluZV9vcHRpb25zJyBpcwotCi0gICAgICAgIGlzcDE2PVs8cG9ydD5bLDxpcnE+Wyw8ZG1hPl1dXVtbLF08ZHJpdmVfdHlwZT5dCi0KLUlmIHRoZXJlIGlzIG5vIElTUDE2IG9yIGNvbXBhdGlibGVzIGRldGVjdGVkLCB0aGVyZSdzIHByb2JhYmx5IG5vIGhhcm0gZG9uZS4KLVRoZXNlIG9wdGlvbnMgaW5kaWNhdGUgdGhlIHZhbHVlcyB0aGF0IHlvdXIgY2Ryb20gZHJpdmUgaGFzIGJlZW4gKG9yIHdpbGwgYmUpCi1jb25maWd1cmVkIHRvIHVzZS4KLVZhbGlkIHZhbHVlcyBmb3IgdGhlIGJhc2UgaS9vIGFkZHJlc3MgYXJlOgotICBwb3J0PTB4MzQwLDB4MzIwLDB4MzMwLDB4MzYwCi1mb3IgdGhlIGludGVycnVwdCByZXF1ZXN0IG51bWJlciAKLSAgaXJxPTAsMyw1LDcsOSwxMCwxMQotZm9yIHRoZSBkaXJlY3QgbWVtb3J5IGFjY2VzcyBsaW5lCi0gIGRtYT0wLDMsNSw2LDcKLWFuZCBmb3IgdGhlIHR5cGUgb2YgZHJpdmUKLSAgZHJpdmVfdHlwZT1ub2lzcDE2LFNhbnlvLFBhbmFzb25pYyxTb255LE1pdHN1bWkuCi1Ob3RlIHRoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgY2FzZSBzZW5zaXRpdmUuCi1UaGUgdmFsdWVzIDAgZm9yIGlycSBhbmQgZG1hIGluZGljYXRlIHRoYXQgdGhleSBhcmUgbm90IHVzZWQsIGFuZAotdGhlIGRyaXZlIHdpbGwgYmUgdXNlZCBpbiAncG9sbGluZycgbW9kZS4gVGhlIHZhbHVlcyA1IGFuZCA3IGZvciBpcnEKLXNob3VsZCBiZSBhdm9pZGVkIGluIG9yZGVyIHRvIGF2b2lkIGFueSBjb25mbGljdHMgd2l0aCBvcHRpb25hbAotc291bmQgY2FyZCBjb25maWd1cmF0aW9uLgotVGhlIHN5bnRheCBvZiB0aGUgY29tbWFuZCBsaW5lIGRvZXMgbm90IGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mCi1pcnEgd2hlbiB0aGVyZSdzIG5vdGhpbmcgc3BlY2lmaWVkIGZvciB0aGUgYmFzZSBhZGRyZXNzIGFuZCBubwotc3BlY2lmaWNhdGlvbiBvZiBkbWEgd2hlbiB0aGVyZSBpcyBubyBzcGVjaWZpY2F0aW9uIG9mIGlycS4KLVRoZSB2YWx1ZSAnbm9pc3AxNicgZm9yIGRyaXZlX3R5cGUsIHdoaWNoIG1heSBiZSB1c2VkIGFzIHRoZSBmaXJzdAotbm9uLWludGVnZXIgb3B0aW9uIHZhbHVlIChlLmcuICdpc3AxNj1ub2lzcDE2JyksIG1ha2VzIHN1cmUgdGhhdCBwcm9iaW5nCi1mb3IgYW5kIHN1YnNlcXVlbnQgY29uZmlndXJhdGlvbiBvZiBhbiBJU1AxNi1jb21wYXRpYmxlIGNhcmQgaXMgc2tpcHBlZAotYWxsIHRvZ2V0aGVyLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gb3ZlcmNvbWUgcG9zc2libGUgY29uZmxpY3RzIHdoaWNoCi1tYXkgYXJpc2Ugd2hpbGUgdGhlIGtlcm5lbCBpcyBwcm9iaW5nIHlvdXIgaGFyZHdhcmUuCi1UaGUgZGVmYXVsdCB2YWx1ZXMgYXJlCi0gIHBvcnQ9MHgzNDAKLSAgaXJxPTAKLSAgZG1hPTAKLSAgZHJpdmVfdHlwZT1TYW55bwotcmVmbGVjdGluZyBteSBvd24gY29uZmlndXJhdGlvbi4gVGhlIGRlZmF1bHRzIGNhbiBiZSBjaGFuZ2VkIGluCi10aGUgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL2lwczE2LmguCi0KLVRoZSBjZHJvbSBpbnRlcmZhY2UgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgcnVuIHRpbWUgYnkgbG9hZGluZyB0aGUKLWluaXRpYWxpc2F0aW9uIGRyaXZlciBhcyBhIG1vZHVsZS4gSW4gdGhhdCBjYXNlLCB0aGUgaW50ZXJmYWNlCi1wYXJhbWV0ZXJzIGNhbiBiZSBzZXQgYnkgZ2l2aW5nIGFwcHJvcHJpYXRlIHZhbHVlcyBvbiB0aGUgY29tbWFuZAotbGluZS4gQ29uZmlndXJpbmcgdGhlIGRyaXZlciBjYW4gdGhlbiBiZSBkb25lIGJ5IHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQgKGFzc3VtaW5nIHlvdSBoYXZlIGlzbzE2Lm8gaW5zdGFsbGVkIGluIGEgcHJvcGVyIHBsYWNlKToKLQotICBpbnNtb2QgaXNwMTYubyBpc3AxNl9jZHJvbV9iYXNlPTxwb3J0PiBpc3AxNl9jZHJvbV9pcnE9PGlycT4gXAotICAgIGlzcDE2X2Nkcm9tX2RtYT08ZG1hPiBpc3AxNl9jZHJvbV90eXBlPTxkcml2ZV90eXBlPgotCi13aGVyZSBwb3J0LCBpcnEsIGRtYSBhbmQgZHJpdmVfdHlwZSBjYW4gaGF2ZSBhbnkgb2YgdGhlIHZhbHVlcyBtZW50aW9uZWQKLWFib3ZlLgotCi0KLUhhdmUgZnVuIQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4IGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9tY2R4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmFjNGI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vbWNkeAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUlmIHlvdSBhcmUgdXNpbmcgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgcG9ydHMgYW5kIElSUXMKLWxpa2UKLQotICMgaW5zbW9kIG1jZHgubyBtY2R4PTB4MzAwLDExLDB4MzA0LDUKLQotYW5kIHNvIG9uICgiYWRkcmVzcyxJUlEiIHBhaXJzKS4KLVRoaXMgd2lsbCBvdmVycmlkZSB0aGUgY29uZmlndXJhdGlvbiBpbiBtY2R4LmguCi0KLVRoaXMgZHJpdmVyOgotCi0gICAgbyAgIGhhbmRsZXMgWEEgYW5kIChob3BlZnVsbHkpIG11bHRpIHNlc3Npb24gQ0RzIGFzIHdlbGwgYXMKLSAgICAgICAgb3JkaW5hcnkgQ0RzOwotICAgIG8gICBzdXBwb3J0cyB1cCB0byA1IGRyaXZlcyAob2YgY291cnNlLCB5b3UnbGwgbmVlZCBmcmVlIAotICAgICAgICBJUlFzLCBpL28gcG9ydHMgYW5kIHNsb3RzKTsKLSAgICBvICAgcGxheXMgYXVkaW8KLQotVGhpcyB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB5ZXQ6Ci0KLSAgICBvICAgc2hhcmVkIElSUXMgKGJ1dCBpdCBzZWVtcyB0byBiZSBwb3NzaWJsZSAtIEkndmUgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICAgICAgICAgY29ubmVjdGVkIHR3byBkcml2ZXMgdG8gdGhlIHNhbWUgaXJxLiAgU28gaXQncyBgb25seScgYSAKLSAgICAgICAgICAgICAgICBwcm9ibGVtIG9mIHRoZSBkcml2ZXIuKQotCi1UaGlzIGRyaXZlciBuZXZlciB3aWxsOgotCi0gICAgbyAgIFJlYWQgZGlnaXRhbCBhdWRpbyAoaS5lLiBjb3B5IGRpcmVjdGx5KSwgZHVlIHRvIG1pc3NpbmcKLSAgICAgICAgaGFyZHdhcmUgZmVhdHVyZXMuIAotCi0KLWhlaWtvQGxvdHRlLnNheC5kZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vb3B0Y2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDZjN2EuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9vcHRjZAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLVRoaXMgaXMgdGhlIFJFQURNRSBmaWxlIGZvciB0aGUgT3B0aWNzIFN0b3JhZ2UgODAwMCBBVCBDRFJPTSBkZXZpY2UgZHJpdmVyLgotCi1UaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBzby1jYWxsZWQgJ0RPTFBISU4nIGRyaXZlLCB3aXRoIHRoZSAzNC1waW4KLVNvbnktY29tcGF0aWJsZSBpbnRlcmZhY2UuIEZvciB0aGUgSURFLWNvbXBhdGlibGUgT3B0aWNzIFN0b3JhZ2UgODAwMQotZHJpdmUsIHlvdSB3aWxsIHdhbnQgdGhlIEFUQVBJIENEUk9NIGRyaXZlci4gVGhlIGRyaXZlciBhbHNvIHNlZW1zIHRvCi13b3JrIHdpdGggdGhlIExhc2VybWF0ZSBDUjMyOEEuIElmIHlvdSBoYXZlIGEgZHJpdmUgdGhhdCB3b3JrcyB3aXRoCi10aGlzIGRyaXZlciwgYW5kIHRoYXQgZG9lc24ndCByZXBvcnQgaXRzZWxmIGFzIERPTFBISU4sIHBsZWFzZSBkcm9wIG1lCi1hIG1haWwuCi0KLVRoZSBzdXBwb3J0IGZvciBtdWx0aXNlc3Npb24gQ0RzIGlzIGluIEFMUEhBIHN0YWdlLiBJZiB5b3UgdXNlIGl0LAotcGxlYXNlIG1haWwgbWUgeW91ciBleHBlcmllbmNlcy4gTXVsdGlzZXNzaW9uIHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkCi1hdCBjb21waWxlIHRpbWUuCi0KLVlvdSBjYW4gZmluZCBzb21lIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgYXQKLSAgICAgIGR1dGV0dGUuZXQudHVkZWxmdC5ubDovcHViL2xpbnV4LwotYW5kIGF0IEViZXJoYXJkJ3MgbWlycm9yCi0gICAgICBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2Nkcm9tL2RyaXZlcnMvb3B0aWNzLwotCi1CZWZvcmUgeW91IGNhbiB1c2UgdGhlIGRyaXZlciwgeW91IGhhdmUgdG8gY3JlYXRlIHRoZSBkZXZpY2UgZmlsZSBvbmNlOgotICMgbWtub2QgL2Rldi9vcHRjZDAgYiAxNyAwCi0KLVRvIHNwZWNpZnkgdGhlIGJhc2UgYWRkcmVzcyBpZiB0aGUgZHJpdmVyIGlzICJjb21waWxlZC1pbiIgdG8geW91ciBrZXJuZWwsCi15b3UgY2FuIHVzZSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBpdGVtIChMSUxPIG9wdGlvbikKLSAgICAgICAgICAgICBvcHRjZD0weDM0MAotd2l0aCB0aGUgcmlnaHQgYWRkcmVzcy4KLQotSWYgeW91IGhhdmUgY29tcGlsZWQgb3B0Y2QgYXMgYSBtb2R1bGUsIHlvdSBjYW4gbG9hZCBpdCB3aXRoCi0gIyBpbnNtb2QgL3Vzci9zcmMvbGludXgvbW9kdWxlcy9vcHRjZC5vCi1vcgotICMgaW5zbW9kIC91c3Ivc3JjL2xpbnV4L21vZHVsZXMvb3B0Y2QubyBvcHRjZD0weDM0MAotd2l0aCB0aGUgbWF0Y2hpbmcgYWRkcmVzcyB2YWx1ZSBvZiB5b3VyIGludGVyZmFjZSBjYXJkLgotCi1UaGUgZHJpdmVyIGVtcGxveXMgYSBudW1iZXIgb2YgYnVmZmVycyB0byBkbyByZWFkLWFoZWFkIGFuZCBibG9jayBzaXplCi1jb252ZXJzaW9uLiBUaGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgY29uZmlndXJhYmxlIGluIG9wdGNkLmgsIGFuZCBoYXMKLWluZmx1ZW5jZSBvbiB0aGUgZHJpdmVyIHBlcmZvcm1hbmNlLiBGb3IgbXkgbWFjaGluZSAoYSBQNzUpLCA2IGJ1ZmZlcnMKLXNlZW1zIG9wdGltYWwsIGFzIGNhbiBiZSBzZWVuIGZyb20gdGhpcyB0YWJsZToKLQotI2J1ZnMJa2IvcwklY3B1Ci0xCTk3CTAuMQotMgkxOTEJMC4zCi0zCTE4OAkwLjIKLTQJMjQ2CTAuMwotNQkxODkJMTkKLTYJMjgwCTAuNAotNwkyODEJNy4wCi04CTI0NgkyLjgKLTE2CTI4MQkzLjQKLQotSWYgeW91IGdldCBhIHRocm91Z2hwdXQgc2lnbmlmaWNhbnRseSBiZWxvdyAzMDAga2IvcywgdHJ5IHR3ZWFraW5nCi1OX0JVRlMsIGFuZCBkb24ndCBmb3JnZXQgdG8gbWFpbCBtZSB5b3VyIHJlc3VsdHMhCi0KLUknZCBhcHByZWNpYXRlIHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzLiBJZiB5b3UgZmluZCBhIGJ1ZywgdHJ5Ci1yZWNvbXBpbGluZyB0aGUgZHJpdmVyIHdpdGggc29tZSBzdHJhdGVnaWNhbGx5IGNob3NlbiBkZWJ1ZyBvcHRpb25zCi0odGhlc2UgY2FuIGJlIGZvdW5kIGluIG9wdGNkLmgpIGFuZCBpbmNsdWRlIHRoZSBtZXNzYWdlcyBnZW5lcmF0ZWQgaW4KLXlvdXIgYnVnIHJlcG9ydC4gR29vZCBsdWNrLgotCi1MZW8gU3BpZWttYW4gKHNwaWVrbWFuQGR1dGV0dGUuZXQudHVkZWxmdC5ubCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JhNjNmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLVRoaXMgUkVBRE1FIGJlbG9uZ3MgdG8gcmVsZWFzZSA0LjIgb3IgbmV3ZXIgb2YgdGhlIFNvdW5kQmxhc3RlciBQcm8KLShNYXRzdXNoaXRhLCBLb3RvYnVraSwgUGFuYXNvbmljLCBDcmVhdGl2ZUxhYnMsIExvbmdzaGluZSBhbmQgVGVhYykKLUNELVJPTSBkcml2ZXIgZm9yIExpbnV4LgotCi1zYnBjZCByZWFsbHksIHJlYWxseSBpcyBOT1QgZm9yIEFOWSBJREUvQVRBUEkgZHJpdmUhCi1Ob3QgZXZlbiBpZiB5b3UgaGF2ZSBhbiAib3JpZ2luYWwiIFNvdW5kQmxhc3RlciBjYXJkIHdpdGggYW4gSURFIGludGVyZmFjZSEKLVNvLCB5b3UnZCBiZXR0ZXIgaGF2ZSBhIGxvb2sgaW50byBSRUFETUUuaWRlIGlmIHlvdXIgcG9ydCBhZGRyZXNzIGlzIDB4MUYwLAotMHgxNzAsIDB4MUU4LCAweDE2OCBvciBzaW1pbGFyLgotSSBnZXQgdG9ucyBvZiBtYWlscyBmcm9tIElERS9BVEFQSSBkcml2ZSB1c2VycyAtIEkgcmVhbGx5IGNhbid0IGNvbnRpbnVlCi1hbnkgbW9yZSB0byBhbnN3ZXIgdGhlbSBhbGwuIFNvLCBpZiB5b3VyIGRyaXZlL2ludGVyZmFjZSBpbmZvcm1hdGlvbiBzaGVldHMKLW1lbnRpb24gIklERSIgKHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnksIHF1YXRlcm5hcnkpIGFuZCB0aGUgRE9TIGRyaXZlcgotaW52b2tpbmcgbGluZSB3aXRoaW4geW91ciBDT05GSUcuU1lTIGlzIHVzaW5nIGFuIGFkZHJlc3MgYmVsb3cgMHgyMzA6Ci1ET04nVCBST0IgTVkgTEFTVCBORVJWRSAtIGp1bXBlciB5b3VyIGludGVyZmFjZSB0byBhZGRyZXNzIDB4MTcwIGFuZCBJUlEgMTUKLSh0aGF0IGlzIHRoZSAic2Vjb25kYXJ5IElERSIgY29uZmlndXJhdGlvbiksIHNldCB5b3VyIGRyaXZlIHRvICJtYXN0ZXIiIGFuZAotdXNlIGlkZS1jZCBhcyB5b3VyIGRyaXZlci4gSWYgeW91IGRvIG5vdCBoYXZlIGEgc2Vjb25kIElERSBoYXJkIGRpc2ssIHVzZSB0aGUKLUxJTE8gY29tbWFuZHMKLSAgIGhkYj1ub3Byb2JlIGhkYz1jZHJvbQotYW5kIGdldCBsdWNreS4KLVRvIG1ha2UgaXQgZnVsbHkgY2xlYXIgdG8geW91OiBpZiB5b3UgbWFpbCBtZSBhYm91dCBJREUvQVRBUEkgZHJpdmUgcHJvYmxlbXMsCi1teSBhbnN3ZXIgaXMgYWJvdmUsIGFuZCBJIHNpbXBseSB3aWxsIGRpc2NhcmQgeW91ciBtYWlsLCBob3BpbmcgdG8gc3RvcCB0aGUKLWZsb29kIGFuZCB0byBmaW5kIHRpbWUgdG8gbGVhZCBteSAxMi15ZWFyIG9sZCBzb24gdG93YXJkcyBoYXBweSBjb21wdXRpbmcuCi0KLVRoZSBkcml2ZXIgaXMgYWJsZSB0byBkcml2ZSB0aGUgd2hvbGUgZmFtaWx5IG9mICJ0cmFkaXRpb25hbCIgQVQtc3R5bGUgKHRoYXQKLWlzIE5PVCB0aGUgbmV3ICJFbmhhbmNlZCBJREUiIG9yICJBVEFQSSIgZHJpdmUgc3RhbmRhcmQpIE1hdHN1c2hpdGEsCi1Lb3RvYnVraSwgUGFuYXNvbmljIGRyaXZlcywgc29tZXRpbWVzIGxhYmVsbGVkIGFzICJDcmVhdGl2ZUxhYnMiLiBUaGUKLXdlbGwta25vd24gZHJpdmVzIGFyZSBDUi01MjEsIENSLTUyMiwgQ1ItNTIzLCBDUi01NjIsIENSLTU2My4KLUNSLTU3NCBpcyBhbiBJREUvQVRBUEkgZHJpdmUuCi0KLVRoZSBMb25nc2hpbmUgTENTLTcyNjAgaXMgYSBkb3VibGUtc3BlZWQgZHJpdmUgd2hpY2ggdXNlcyB0aGUgIm9sZCIKLU1hdHN1c2hpdGEgY29tbWFuZCBzZXQuIEl0IGlzIHN1cHBvcnRlZCAtIHdpdGggaGVscCBieSBTZXJnZSBSb2J5bnMuCi1WZXJ0b3MgKCJFbGl0ZWdyb3VwIENvbXB1dGVyIFN5c3RlbXMiLCBFQ1MpIGhhcyBhIHNpbWlsYXIgZHJpdmUgLSBzdXBwb3J0Ci1oYXMgc3RhcnRlZDsgZ2V0IGluIGNvbnRhY3QgaWYgeW91IGhhdmUgc3VjaCBhICJWZXJ0b3MgMTAwIiBvciAiRUNTLUFUIgotZHJpdmUuCi0KLVRoZXJlIGV4aXN0cyBhbiAiSUJNIEV4dGVybmFsIElTQSBDRC1ST00gRHJpdmUiIHdoaWNoIGluIGZhY3QgaXMgYSBDUi01NjMKLXdpdGggYSBzcGVjaWFsIGNvbnRyb2xsZXIgYm9hcmQuIFRoaXMgZHJpdmUgaXMgc3VwcG9ydGVkICh0aGUgaW50ZXJmYWNlIGlzCi1vZiB0aGUgIkxhc2VyTWF0ZSIgdHlwZSksIGFuZCBpdCBpcyBwb3NzaWJseSB0aGUgYmVzdCBidXkgdG9kYXkgKGNoZWFwZXIgdGhhbgotYW4gaW50ZXJuYWwgZHJpdmUsIGFuZCB5b3UgY2FuIHVzZSBpdCBhcyBhbiBpbnRlcm5hbCwgdG9vIC0gZS5nLiBwbHVnIGl0IGludG8KLWEgc291bmRjYXJkKS4KLQotQ3JlYXRpdmVMYWJzIGhhcyBhIG5ldyBkcml2ZSAiQ0QyMDAiIGFuZCBhIHNpbWlsYXIgZHJpdmUgIkNEMjAwRiIuIFRoZSBsYXR0ZXIKLWlzIG1hZGUgYnkgRnVuYWkgYW5kIHNvbWV0aW1lcyBuYW1lZCAiRTI1NTBVQSIsIG5ld2VyIG1vZGVscyBtYXkgYmUgbmFtZWQKLSJNSzQwMTUiLiBUaGUgQ0QyMDBGIGRyaXZlcyBzaG91bGQgZnVsbHkgd29yay4KLUNEMjAwIGRyaXZlcyB3aXRob3V0ICJGIiBhcmUgc3RpbGwgZ2l2aW5nIHByb2JsZW1zOiBkcml2ZSBkZXRlY3Rpb24gYW5kCi1wbGF5aW5nIGF1ZGlvIHNob3VsZCB3b3JrLCBkYXRhIGFjY2VzcyB3aWxsIHJlc3VsdCBpbiBlcnJvcnMuIEkgbmVlZCBxdWFsaWZpZWQKLWZlZWRiYWNrIGFib3V0IHRoZSBidWdzIHdpdGhpbiB0aGUgZGF0YSBmdW5jdGlvbnMgb3IgYSBkcml2ZSAoSSBuZXZlciBzYXcgYQotQ0QyMDApLgotCi1UaGUgcXVhZC1zcGVlZCBUZWFjIENELTU1QSBkcml2ZSBpcyBzdXBwb3J0ZWQsIGJ1dCBzdGlsbCBkb2VzIG5vdCByZWFjaCAiZnVsbAotc3BlZWQiLiBUaGUgZGF0YSByYXRlIGFscmVhZHkgcmVhY2hlcyA1MDAga0Ivc2VjIGlmIHlvdSBzZXQgU0JQX0JVRkZFUl9GUkFNRVMKLXRvIDY0IChpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gZG8gdGhhdCBmb3Igbm9ybWFsICJmaWxlIGFjY2VzcyIgdXNhZ2UsIGJ1dCBpdAotY2FuIHNwZWVkIHVwIHRoaW5ncyBhIGxvdCBpZiB5b3UgdXNlIHNvbWV0aGluZyBsaWtlICJkZCIgdG8gcmVhZCBmcm9tIHRoZQotZHJpdmU7IEkgdXNlIGl0IGZvciB2ZXJpZnlpbmcgc2VsZi13cml0dGVuIENEcyB0aGlzIHdheSkuCi1UaGUgZHJpdmUgaXRzZWxmIGlzIGFibGUgdG8gZGVsaXZlciA2MDAga0Ivc2VjLCBzbyB0aGlzIG5lZWRzCi13b3JrOyB3aXRoIHRoZSBub3JtYWwgc2V0dXAsIHRoZSBwZXJmb3JtYW5jZSBjdXJyZW50bHkgaXMgbm90IGV2ZW4gYXMgZ29vZCBhcwotZG91YmxlLXNwZWVkLgotCi1UaGlzIGRyaXZlciBpcyBOT1QgZm9yIE1pdHN1bWkgb3IgU29ueSBvciBBenRlY2ggb3IgUGhpbGlwcyBvciBYWFggZHJpdmVzLAotYW5kIGFnYWluOiB0aGlzIGRyaXZlciBpcyBpbiBubyB3YXkgdXNhYmxlIGZvciBhbnkgSURFL0FUQVBJIGRyaXZlLiBJZiB5b3UgCi10aGluayB5b3VyIGRyaXZlIHNob3VsZCB3b3JrIGFuZCBpdCBkb2Vzbid0OiBzZW5kIG1lIHRoZSBET1MgZHJpdmVyIGZvciB5b3VyCi1iZWFzdCAoZ3ppcHBlZCArIHV1ZW5jb2RlZCkgYW5kIHlvdXIgQ09ORklHLlNZUyBpZiB5b3Ugd2FudCB0byBhc2sgbWUgZm9yIGhlbHAsCi1hbmQgaW5jbHVkZSBhbiBvcmlnaW5hbCBsb2cgbWVzc2FnZSBleGNlcnB0LCBhbmQgdHJ5IHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uCi1hIGNvbXBsZXRlIGlkaW90IG5lZWRzIHRvIHVuZGVyc3RhbmQgeW91ciBoYXNzbGUgYWxyZWFkeSB3aXRoIHlvdXIgZmlyc3QKLW1haWwuIEFuZCBpZiB5b3Ugd2FudCB0byBzYXkgImFzIEkgaGF2ZSBtYWlsZWQgeW91IGJlZm9yZSIsIGJlIHN1cmUgdGhhdCBJCi1kb24ndCByZW1lbWJlciB5b3VyICJjYXNlIiBieSBzdWNoIHJlbWFya3M7IGF0IHRoZSBtb21lbnQsIEkgaGF2ZSBzb21lIAotaHVuZHJlZHMgb2Ygb3BlbiBjb3JyZXNwb25kZW5jZXMgYWJvdXQgTGludXggQ0RST00gcXVlc3Rpb25zIChob3BlIHRvIHJlZHVjZSBpZgotdGhlIElERS9BVEFQSSB1c2VyIHF1ZXN0aW9ucyBkaXNhcHBlYXIpLiAKLQotCi1UaGlzIGRyaXZlciB3aWxsIHdvcmsgd2l0aCB0aGUgc291bmRjYXJkIGludGVyZmFjZXMgKFNCIFBybywgU0IgMTYsIEdhbGF4eSwKLVNvdW5kRlgsIE1vemFydCwgTUFEMTYgLi4uKSBhbmQgd2l0aCB0aGUgIm5vLXNvdW5kIiBjYXJkcyAoUGFuYXNvbmljIENJLTEwMVAsCi1MYXNlck1hdGUsIFdESC03MDAxQywgTG9uZ3NoaW5lIExDUy02ODUzLCBUZWFjIC4uLikuCi0KLUl0IHdvcmtzIHdpdGggdGhlICJjb25maWd1cmFibGUiIGludGVyZmFjZSAiU2VxdW9pYSBTLTEwMDAiLCB0b28sIHdoaWNoIGlzIAotdXNlZCBvbiB0aGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pYyBTb3VuZHNjYXBlIHNvdW5kIGNhcmRzLiBZb3UgaGF2ZSB0bwotc3BlY2lmeSB0aGUgdHlwZSAiU0JQUk8gMiIgYW5kIHRoZSB0cnVlIENEUk9NIHBvcnQgYWRkcmVzcyB3aXRoIGl0LCBub3QgdGhlCi0iY29uZmlndXJhdGlvbiBwb3J0IiBhZGRyZXNzLgotCi1JZiB5b3UgaGF2ZSBhIHNvdW5kIGNhcmQgd2hpY2ggbmVlZHMgYSAiY29uZmlndXJhdGlvbiBkcml2ZXIiIGluc3RlYWQgb2YKLWp1bXBlcnMgZm9yIGludGVyZmFjZSB0eXBlcyBhbmQgYWRkcmVzc2VzIChsaWtlIE1vemFydCBjYXJkcykgLSB0aG9zZQotZHJpdmVycyBnZXQgaW52b2tlZCBiZWZvcmUgdGhlIERPUyBDRFJPTSBkcml2ZXIgaW4geW91ciBDT05GSUcuU1lTLCB0eXBpY2FsCi1uYW1lcyBhcmUgImNkc2V0dXAuc3lzIiBhbmQgIm16dGluaXQuc3lzIiAtIGxldCB0aGUgc291bmQgZHJpdmVyIGRvIHRoZQotQ0RST00gcG9ydCBjb25maWd1cmF0aW9uICh0aGUgbGVhZGluZyBjb21tZW50cyBpbiBsaW51eC9kcml2ZXJzL3NvdW5kL21hZDE2LmMKLWFyZSBqdXN0IGZvciB5b3UhKS4gSGFubnUgU2F2b2xhaW5lbidzIG1hZDE2LmMgY29kZSBpcyBhYmxlIHRvIHNldCB1cCBteQotTW96YXJ0IGNhcmQgLSBJIHNpbXBseSBoYWQgdG8gYWRkCi0gICAjZGVmaW5lIE1BRDE2X0NPTkYgMHgwNgotICAgI2RlZmluZSBNQUQxNl9DRFNFTCAweDAzCi10byBjb25maWd1cmUgdGhlIENEUk9NIGludGVyZmFjZSBmb3IgdHlwZSAiUGFuYXNvbmljIiAoTGFzZXJNYXRlKSBhbmQgYWRkcmVzcwotMHgzNDAuCi0KLVRoZSBpbnRlcmZhY2UgdHlwZSBoYXMgdG8gZ2V0IGNvbmZpZ3VyZWQgaW4gbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZC5oLCAKLWJlY2F1c2UgdGhlIHJlZ2lzdGVyIGxheW91dCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgIlNvdW5kQmxhc3RlciIgYW5kIHRoZQotIkxhc2VyTWF0ZSIgdHlwZS4KLQotSSBnb3QgYSByZXBvcnQgdGhhdCB0aGUgVGVhYyBpbnRlcmZhY2UgY2FyZCAiSS9GIEUxMTcwOTgiIGlzIG9mIHR5cGUKLSJTb3VuZEJsYXN0ZXIiIChpLmUuIHlvdSBoYXZlIHRvIHNldCBTQlBSTyB0byAxKSBldmVuIHdpdGggdGhlIGFkZHJlc3NlcwotMHgzMDAgYW5kIGFib3ZlLiBUaGlzIGlzIHVudXN1YWwsIGFuZCBpdCBjYW4ndCBnZXQgY292ZXJlZCBieSB0aGUgYXV0bwotcHJvYmluZyBzY2hlbWUuCi1UaGUgVGVhYyAxNi1iaXQgaW50ZXJmYWNlIGNhcmRzIChsaWtlIFAvTiBFOTUwMjI4LTAwQSwgZGVmYXVsdCBhZGRyZXNzIDB4MkMwKQotbmVlZCB0aGUgU0JQUk8gMyBzZXR1cC4KLQotSWYgYXV0by1wcm9iaW5nIGZvdW5kIHRoZSBkcml2ZSwgdGhlIGFkZHJlc3MgaXMgY29ycmVjdC4gVGhlIHJlcG9ydGVkIHR5cGUKLW1heSBiZSB3cm9uZy4gQSAibW91bnQiIHdpbGwgZ2l2ZSBzdWNjZXNzIG9ubHkgaWYgdGhlIGludGVyZmFjZSB0eXBlIGlzIHNldAotcmlnaHQuIFBsYXlpbmcgYXVkaW8gc2hvdWxkIHdvcmsgd2l0aCBhIHdyb25nIHNldCBpbnRlcmZhY2UgdHlwZSwgdG9vLgotCi1XaXRoIHNvbWUgVGVhYyBhbmQgc29tZSBDRDIwMCBkcml2ZXMgSSBoYXZlIHNlZW4gaW50ZXJmYWNlIGNhcmRzIHdoaWNoIHNlZW0KLXRvIGxhY2sgdGhlICJkcml2ZSBzZWxlY3QiIGxpbmVzOyBhbHdheXMgZHJpdmUgMCBnZXRzIGFkZHJlc3NlZC4gVG8gYXZvaWQKLSJtaXJyb3IgZHJpdmVzIiAoZm91ciBkcml2ZXMgZGV0ZWN0ZWQgd2hlcmUgeW91IG9ubHkgaGF2ZSBvbmUpIHdpdGggc3VjaAotaW50ZXJmYWNlIGNhcmRzLCBzZXQgTUFYX0RSSVZFUyB0byAxIGFuZCBqdW1wZXIgeW91ciBkcml2ZSB0byBJRCAwIChpZgotcG9zc2libGUpLgotCi0KLVVwIHRvIDQgZHJpdmVzIHBlciBpbnRlcmZhY2UgY2FyZCwgYW5kIHVwIHRvIDQgaW50ZXJmYWNlIGNhcmRzIGFyZSBzdXBwb3J0ZWQuCi1BbGwgc3VwcG9ydGVkIGRyaXZlIGZhbWlsaWVzIGNhbiBiZSBtaXhlZCwgYnV0IHRoZSBDUi01MjEgZHJpdmVzIGFyZSAKLWhhcmQtd2lyZWQgdG8gZHJpdmUgSUQgMC4gVGhlIGRyaXZlcyBoYXZlIHRvIHVzZSBkaWZmZXJlbnQgZHJpdmUgSURzLCBhbmQgZWFjaAotZHJpdmUgaGFzIHRvIGdldCBhIHVuaXF1ZSBtaW5vciBudW1iZXIgKDAuLi4zKSwgY29ycmVzcG9uZGluZyBpbmRpcmVjdGx5IHRvIAotaXRzIGRyaXZlIElELgotVGhlIGRyaXZlIElEcyBtYXkgYmUgc2VsZWN0ZWQgZnJlZWx5IGZyb20gMCB0byAzIC0gdGhleSBkbyBub3QgaGF2ZSB0byBiZSBpbgotY29uc2VjdXRpdmUgb3JkZXIuCi0KLUFzIERvbiBDYXJyb2xsLCBkb25AZHM5LnVzLmRlbGwuY29tIG9yIEZJRE8gMTozODIvMTQsIHRvbGQgbWUsIGl0IGlzIHBvc3NpYmxlCi10byBjaGFuZ2Ugb2xkIGRyaXZlcyB0byBhbnkgSUQsIHRvby4gSGUgd3JpdGVzIGluIHRoaXMgc2Vuc2U6Ci0gICAiSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSBzaW5nbGUgc3BlZWQgZHJpdmUKLSAgICh0aGV5IGRvIG5vdCBoYXZlIHRoZSBJRCBqdW1wZXJzKSB5b3UgbXVzdCBhZGQgYSBESVAgc3dpdGNoCi0gICBhbmQgdHdvIHJlc2lzdG9ycy4gVGhlIHBhZHMgYXJlIGFscmVhZHkgb24gdGhlIGJvYXJkIG5leHQgdG8KLSAgIHRoZSBwb3dlciBjb25uZWN0b3IuIFlvdSB3aWxsIHNlZSB0aGUgc2lsa3NjcmVlbiBmb3IgdGhlCi0gICBzd2l0Y2ggaWYgeW91IHJlbW92ZSB0aGUgdG9wIGNvdmVyLgotICAgICAgICAgICAgICAgICAgICAxIDIgMyA0Ci0gICAgICAgICAgICAgSUQgMCA9IHggRiBGIHggICAgICAgICAgICAgTyA9ICJvbiIKLSAgICAgICAgICAgICBJRCAxID0geCBPIEYgeCAgICAgICAgICAgICBGID0gIm9mZiIKLSAgICAgICAgICAgICBJRCAyID0geCBGIE8geCAgICAgICAgICAgICB4ID0gImRvbid0IGNhcmUiCi0gICAgICAgICAgICAgSUQgMyA9IHggTyBPIHgKLSAgIE5leHQgdG8gdGhlIHN3aXRjaCBhcmUgdGhlIHBvc2l0aW9ucyBmb3IgUjc2ICg3aykgYW5kIFI3OAotICAgKDEyaykuIEkgaGFkIHRvIHBsYXkgYXJvdW5kIHdpdGggdGhlIHJlc2lzdG9yIHZhbHVlcyAtIElEIDMKLSAgIGRpZCBub3Qgd29yayB3aXRoIG90aGVyIHZhbHVlcy4gSWYgdGhlIHZhbHVlcyBhcmUgbm90IGdvb2QsCi0gICBJRCAzIGJlaGF2ZXMgbGlrZSBJRCAwLiIKLQotVG8gdXNlIG1vcmUgdGhhbiA0IGRyaXZlcywgeW91IHNpbXBseSBuZWVkIGEgc2Vjb25kIGNvbnRyb2xsZXIgY2FyZCBhdCBhIAotZGlmZmVyZW50IGFkZHJlc3MgYW5kIGEgc2Vjb25kIGNhYmxlLgotCi1UaGUgZHJpdmVyIHN1cHBvcnRzIHJlYWRpbmcgb2YgZGF0YSBmcm9tIHRoZSBDRCBhbmQgcGxheWluZyBvZiBhdWRpbyB0cmFja3MuCi1UaGUgYXVkaW8gcGFydCBzaG91bGQgcnVuIHdpdGggV29ya01hbiwgeGNkcGxheWVyLCB3aXRoIHRoZSAibm9uLVgxMSIgcHJvZHVjdHMKLUNEcGxheWVyIGFuZCBXb3JrQm9uZSAtIHRlbGwgbWUgaWYgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBzb2Z0d2FyZS4KLVRoZSBvbmx5IGFjY2VwdGVkIG1lYXN1cmUgZm9yIGNvcnJlY3RuZXNzIHdpdGggdGhlIGF1ZGlvIGZ1bmN0aW9ucyBpcyB0aGUKLSJjZHRlc3RlciIgdXRpbGl0eSAoYXBwZW5kZWQpIC0gbW9zdCBhdWRpbyBwbGF5ZXIgcHJvZ3JhbW1lcnMgc2VlbSB0byBiZQotYmV0dGVyIG11c2ljaWFucyB0aGFuIHByb2dyYW1tZXJzLiA7LSkKLQotV2l0aCB0aGUgQ1ItNTZ4IGFuZCB0aGUgQ0QyMDAgZHJpdmVzLCB0aGUgcmVhZGluZyBvZiBhdWRpbyBmcmFtZXMgaXMgcG9zc2libGUuCi1UaGlzIGlzIGltcGxlbWVudGVkIGJ5IGFuIElPQ1RMIGZ1bmN0aW9uIHdoaWNoIHJlYWRzIFJFQURfQVVESU8gZnJhbWVzIG9mCi0yMzUyIGJ5dGVzIGF0IG9uY2UgKGNvbmZpZ3VyYWJsZSB3aXRoIHRoZSAiUkVBRF9BVURJTyIgZGVmaW5lLCBkZWZhdWx0IGlzIDApLgotUmVhZGluZyB0aGUgc2FtZSBmcmFtZSBhIHNlY29uZCB0aW1lIGdpdmVzIGRpZmZlcmVudCBkYXRhOyB0aGUgZnJhbWUgZGF0YSAKLXN0YXJ0IGF0IGEgZGlmZmVyZW50IHBvc2l0aW9uLCBidXQgYWxsIHJlYWQgYnl0ZXMgYXJlIHZhbGlkLCBhbmQgd2UgYWx3YXlzCi1yZWFkIDk4IGNvbnNlY3V0aXZlIGNodW5rcyAob2YgMjQgQnl0ZXMpIGFzIGEgZnJhbWUuIFJlYWRpbmcgbW9yZSB0aGFuIDEgZnJhbWUKLWF0IG9uY2UgcG9zc2libHkgbWlzc2VzIHNvbWUgY2h1bmtzIGF0IGVhY2ggZnJhbWUgYm91bmRhcnkuIFRoaXMgbGFjayBoYXMgdG8KLWdldCBjb3JyZWN0ZWQgYnkgZXh0ZXJuYWwsICJoaWdoZXIgbGV2ZWwiIHNvZnR3YXJlIHdoaWNoIHJlYWRzIHRoZSBzYW1lIGZyYW1lIAotYWdhaW4gYW5kIHRyaWVzIHRvIGZpbmQgYW5kIGVsaW1pbmF0ZSBvdmVybGFwcGluZyBjaHVua3MgKDI0LWJ5dGUtcGllY2VzKS4KLQotVGhlIHRyYW5zZmVyIHJhdGUgd2l0aCByZWFkaW5nIGF1ZGlvICgxLWZyYW1lLXBpZWNlcykgY3VycmVudGx5IGlzIHZlcnkgc2xvdy4KLVRoaXMgY2FuIGJlIGJldHRlciByZWFkaW5nIGJpZ2dlciBjaHVua3MsIGJ1dCB0aGUgIm1pc3NpbmciIGNodW5rcyBwb3NzaWJseQotb2NjdXIgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNpbmdsZSBmcmFtZS4KLVRoZSBzb2Z0d2FyZSBpbnRlcmZhY2UgcG9zc2libHkgbWF5IGNoYW5nZSBhIGJpdCB0aGUgZGF5IHRoZSBTQ1NJIGRyaXZlcgotc3VwcG9ydHMgaXQgdG9vLgotCi1XaXRoIGFsbCBidXQgdGhlIENSLTUyeCBkcml2ZXMsIE11bHRpU2Vzc2lvbiBpcyBzdXBwb3J0ZWQuCi1QaG90byBDRHMgd29yayAodGhlICJvbGQiIGRyaXZlcyBsaWtlIENSLTUyMSBjYW4gYWNjZXNzIG9ubHkgdGhlIGZpcnN0Ci1zZXNzaW9uIG9mIGEgcGhvdG9DRCkuCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L2hwY2R0b3BwbS8geW91IHdpbGwgZmluZCBIYWRtdXQgRGFuaXNjaCdzIHBhY2thZ2UgdG8KLWNvbnZlcnQgcGhvdG8gQ0QgaW1hZ2UgZmlsZXMgYW5kIEdlcmQgS25vcnIncyB2aWV3aW5nIHV0aWxpdHkuCi0KLVRoZSB0cmFuc2ZlciByYXRlIHdpbGwgcmVhY2ggMTUwIGtCL3NlYyB3aXRoIENSLTUyeCBkcml2ZXMsIDMwMCBrQi9zZWMgd2l0aAotQ1ItNTZ4IGRyaXZlcywgYW5kIGN1cnJlbnRseSBub3QgbW9yZSB0aGFuIDUwMCBrQi9zZWMgKHVzdWFsbHkgbGVzcyB0aGFuCi0yNTAga0Ivc2VjKSB3aXRoIHRoZSBUZWFjIHF1YWQgc3BlZWQgZHJpdmVzLgotWEEgKFBob3RvQ0QpIGRpc2tzIHdpdGggIm9sZCIgZHJpdmVzIGdpdmUgb25seSA1MCBrQi9zZWMuCi0KLVRoaXMgcmVsZWFzZSBjb25zaXN0cyBvZgotLSB0aGlzIFJFQURNRSBmaWxlCi0tIHRoZSBkcml2ZXIgZmlsZSBsaW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmMKLS0gdGhlIHN0dWIgZmlsZXMgbGludXgvZHJpdmVycy9jZHJvbS9zYnBjZFsyMzRdLmMKLS0gdGhlIGhlYWRlciBmaWxlIGxpbnV4L2RyaXZlcnMvY2Ryb20vc2JwY2QuaC4KLQotCi1UbyBpbnN0YWxsOgotLS0tLS0tLS0tLS0KLQotMS4gU2V0dXAgeW91ciBoYXJkd2FyZSBwYXJhbWV0ZXJzLiBUaG91Z2ggdGhlIGRyaXZlciBkb2VzICJhdXRvLXByb2JpbmciIGF0IGEKLSAgIGxvdCBvZiAobm90IGFsbCBwb3NzaWJsZSEpIGFkZHJlc3NlcywgdGhpcyBzdGVwIGlzIHJlY29tbWVuZGVkIGZvcgotICAgZXZlcnlkYXkgdXNlLiBZb3Ugc2hvdWxkIGxldCBzYnBjZCBhdXRvLXByb2JlIG9uY2UgYW5kIHVzZSB0aGUgcmVwb3J0ZWQKLSAgIGFkZHJlc3MgaWYgYSBkcml2ZSBnb3QgZm91bmQuIFRoZSByZXBvcnRlZCB0eXBlIG1heSBiZSBpbmNvcnJlY3Q7IGl0IGlzCi0gICBjb3JyZWN0IGlmIHlvdSBjYW4gbW91bnQgYSBkYXRhIENELiBUaGVyZSBpcyBubyBjaG9pY2UgZm9yIHlvdSB3aXRoIHRoZQotICAgdHlwZTsgb25seSBvbmUgaXMgcmlnaHQsIHRoZSBvdGhlcnMgYXJlIGRlYWRseSB3cm9uZy4KLQotICAgYS4gR28gaW50byAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NicGNkLmggYW5kIGNvbmZpZ3VyZSBpdCBmb3IgeW91cgotICAgICAgaGFyZHdhcmUgKG5lYXIgdGhlIGJlZ2lubmluZyk6Ci0gICAgICBhMS4gU2V0IGl0IHVwIGZvciB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBpbnRlcmZhY2UgYm9hcmQuCi0gICAgICAgICAgIk9yaWdpbmFsIiBDcmVhdGl2ZUxhYnMgc291bmQgY2FyZHMgbmVlZCAiU0JQUk8gMSIuCi0gICAgICAgICAgTW9zdCAiY29tcGF0aWJsZSIgc291bmQgY2FyZHMgKGFsbW9zdCBhbGwgIm5vbi1DcmVhdGl2ZUxhYnMiIGNhcmRzKQotICAgICAgICAgIG5lZWQgIlNCUFJPIDAiLgotICAgICAgICAgIFRoZSAibm8tc291bmQiIGJvYXJkIGZyb20gT21uaUNkIG5lZWRzIHRoZSAiU0JQUk8gMSIgc2V0dXAuCi0gICAgICAgICAgVGhlIFRlYWMgOC1iaXQgIm5vLXNvdW5kIiBib2FyZHMgbmVlZCB0aGUgIlNCUFJPIDEiIHNldHVwLgotICAgICAgICAgIFRoZSBUZWFjIDE2LWJpdCAibm8tc291bmQiIGJvYXJkcyBuZWVkIHRoZSAiU0JQUk8gMyIgc2V0dXAuCi0gICAgICAgICAgQWxsIG90aGVyICJuby1zb3VuZCIgYm9hcmRzIG5lZWQgdGhlICJTQlBSTyAwIiBzZXR1cC4KLSAgICAgICAgICBUaGUgU3BlYSBNZWRpYSBGWCBhbmQgRW5zb25pcSBTb3VuZFNjYXBlIGNhcmRzIG5lZWQgIlNCUFJPIDIiLgotICAgICAgICAgIHNicGNkLmMgaG9sZHMgc29tZSBleGFtcGxlcyBpbiBpdHMgYXV0by1wcm9iZSBsaXN0LgotICAgICAgICAgIElmIHlvdSBjb25maWd1cmUgIlNCUFJPIiB3cm9uZywgdGhlIHBsYXlpbmcgb2YgYXVkaW8gQ0RzIHdpbGwgd29yaywKLSAgICAgICAgICBidXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gbW91bnQgYSBkYXRhIENELgotICAgICAgYTIuIFRlbGwgdGhlIGFkZHJlc3Mgb2YgeW91ciBDRFJPTV9QT1JUIChub3Qgb2YgdGhlIHNvdW5kIHBvcnQpLgotICAgICAgYTMuIElmIDQgZHJpdmVzIGdldCBmb3VuZCwgYnV0IHlvdSBoYXZlIG9ubHkgb25lLCBzZXQgTUFYX0RSSVZFUyB0byAxLgotICAgICAgYTQuIFNldCBESVNUUklCVVRJT04gdG8gMC4KLSAgIGIuIEFkZGl0aW9uYWxseSBmb3IgMi5hMSBhbmQgMi5hMiwgdGhlIHNldHVwIG1heSBiZSBkb25lIGR1cmluZwotICAgICAgYm9vdCB0aW1lICh2aWEgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBvciAiTElMTyBvcHRpb24iKToKLSAgICAgICAgICBzYnBjZD0weDMyMCxMYXNlck1hdGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyMzAsU291bmRCbGFzdGVyCi0gICAgICBvcgotICAgICAgICAgIHNicGNkPTB4MzM4LFNvdW5kU2NhcGUKLSAgICAgIG9yCi0gICAgICAgICAgc2JwY2Q9MHgyQzAsVGVhYzE2Yml0Ci0gICAgICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBpbnN0YWxsIGEgZnJlc2ggZGlzdHJpYnV0aW9uLgotICAgICAgSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIGl0IGdldHMgdGFrZW4gYXMgdGhlIHR5cGUKLSAgICAgIHNldHRpbmc7IDAgaXMgIkxhc2VyTWF0ZSIsIDEgaXMgIlNvdW5kQmxhc3RlciIsIDIgaXMgIlNvdW5kU2NhcGUiLAotICAgICAgMyBpcyAiVGVhYzE2Yml0Ii4KLSAgICAgIFNvLCBmb3IgZXhhbXBsZQotICAgICAgICAgIHNicGNkPTB4MjMwLDEKLSAgICAgIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgICAgICBzYnBjZD0weDIzMCxTb3VuZEJsYXN0ZXIKLQotMi4gImNkIC91c3Ivc3JjL2xpbnV4IiBhbmQgZG8gYSAibWFrZSBjb25maWciIGFuZCBzZWxlY3QgInkiIGZvciBNYXRzdXNoaXRhCi0gICBDRC1ST00gc3VwcG9ydCBhbmQgZm9yIElTTzk2NjAgRmlsZVN5c3RlbSBzdXBwb3J0LiBJZiB5b3UgZG8gbm90IGhhdmUgYQotICAgc2Vjb25kLCB0aGlyZCwgb3IgZm91cnRoIGNvbnRyb2xsZXIgaW5zdGFsbGVkLCBkbyBub3Qgc2F5ICJ5IiB0byB0aGUgCi0gICBzZWNvbmRhcnkgTWF0c3VzaGl0YSBDRC1ST00gcXVlc3Rpb25zLgotCi0zLiBUaGVuIG1ha2UgdGhlIGtlcm5lbCBpbWFnZSAoIm1ha2UgemxpbG8iIG9yIHNpbWlsYXIpLgotCi00LiBNYWtlIHRoZSBkZXZpY2UgZmlsZShzKS4gVGhpcyBzdGVwIHVzdWFsbHkgYWxyZWFkeSBoYXMgYmVlbiBkb25lIGJ5IHRoZQotICAgTUFLRURFViBzY3JpcHQuCi0gICBUaGUgZHJpdmVyIHVzZXMgTUFKT1IgMjUsIHNvLCBpZiBuZWNlc3NhcnksIGRvCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QgIGIgMjUgMCAgICAgICAoaWYgeW91IGhhdmUgb25seSBvbmUgZHJpdmUpCi0gICBhbmQvb3IKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDAgYiAyNSAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2QxIGIgMjUgMQotICAgICAgICBta25vZCAvZGV2L3NicGNkMiBiIDI1IDIKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDMgYiAyNSAzCi0gICB0byBtYWtlIHRoZSBub2RlKHMpLgotCi0gICBUaGUgImZpcnN0IGZvdW5kIiBkcml2ZSBnZXRzIE1JTk9SIDAgKHJlZ2FyZGxlc3Mgb2YgaXRzIGp1bXBlcmVkIElEKSwgdGhlCi0gICAibmV4dCBmb3VuZCIgKGF0IHRoZSBzYW1lIGNhYmxlKSBnZXRzIE1JTk9SIDEsIC4uLgotICAgCi0gICBGb3IgYSBzZWNvbmQgaW50ZXJmYWNlIGJvYXJkLCB5b3UgaGF2ZSB0byBtYWtlIG5vZGVzIGxpa2UKLSAgICAgICAgbWtub2QgL2Rldi9zYnBjZDQgYiAyNiAwCi0gICAgICAgIG1rbm9kIC9kZXYvc2JwY2Q1IGIgMjYgMQotICAgYW5kIHNvIG9uLiBVc2UgdGhlIE1BSk9ScyAyNiwgMjcsIDI4LgotCi0gICBJZiB5b3UgZnVydGhlciBtYWtlIGEgbGluayBsaWtlCi0gICAgICAgIGxuIC1zIHNicGNkIC9kZXYvY2Ryb20KLSAgIHlvdSBjYW4gdXNlIHRoZSBuYW1lIC9kZXYvY2Ryb20sIHRvby4KLQotNS4gUmVib290IHdpdGggdGhlIG5ldyBrZXJuZWwuCi0KLVlvdSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG8KLSAgICAgICAgICAgICAgbWtkaXIgL0NECi1hbmQgCi0gICAgICAgICAgICAgIG1vdW50IC1ydCBpc285NjYwIC9kZXYvc2JwY2QgL0NECi1vcgotICAgICAgICAgICAgICBtb3VudCAtcnQgaXNvOTY2MCAtbyBibG9jaz0yMDQ4IC9kZXYvc2JwY2QgL0NECi1hbmQgc2VlIHRoZSBjb250ZW50cyBvZiB5b3VyIENEIGluIHRoZSAvQ0QgZGlyZWN0b3J5LgotVG8gdXNlIGF1ZGlvIENEcywgYSBtb3VudGluZyBpcyBub3QgcmVjb21tZW5kZWQgKGFuZCBpdCB3b3VsZCBmYWlsIGlmIHRoZQotZmlyc3QgdHJhY2sgaXMgbm90IGEgZGF0YSB0cmFjaykuCi0KLQotVXNpbmcgc2JwY2QgYXMgYSAibG9hZGFibGUgbW9kdWxlIjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSBkbyBOT1Qgc2VsZWN0ICJNYXRzdXNoaXRhL1BhbmFzb25pYyBDRFJPTSBkcml2ZXIgc3VwcG9ydCIgZHVyaW5nIHRoZQotIm1ha2UgY29uZmlnIiBvZiB5b3VyIGtlcm5lbCwgeW91IGNhbiBidWlsZCB0aGUgImxvYWRhYmxlIG1vZHVsZSIgc2JwY2Quby4KLQotSWYgc2JwY2QgZ2V0cyB1c2VkIGFzIGEgbW9kdWxlLCB0aGUgc3VwcG9ydCBvZiBtb3JlIHRoYW4gb25lIGludGVyZmFjZQotY2FyZCAoaS5lLiBkcml2ZXMgNC4uLjE1KSBpcyBkaXNhYmxlZC4KLQotWW91IGNhbiBzcGVjaWZ5IGludGVyZmFjZSBhZGRyZXNzIGFuZCB0eXBlIHdpdGggdGhlICJpbnNtb2QiIGNvbW1hbmQgbGlrZToKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzNDAsMAotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgyMzAsMQotb3IKLSAjIGluc21vZCAvdXNyL3NyYy9saW51eC9tb2R1bGVzL3NicGNkLm8gc2JwY2Q9MHgzMzgsMgotd2hlcmUgdGhlIGxhc3QgbnVtYmVyIHJlcHJlc2VudHMgdGhlIFNCUFJPIHNldHRpbmcgKG5vIHN0cmluZ3MgYWxsb3dlZCBoZXJlKS4KLQotCi1UaGluZ3Mgb2YgaW50ZXJlc3Q6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBkcml2ZXIgaXMgY29uZmlndXJlZCB0byB0cnkgdGhlIExhc2VyTWF0ZSB0eXBlIG9mIGludGVyZmFjZSBhdCBJL08gcG9ydAotMHgwMzQwIGZpcnN0LiBJZiB0aGlzIGlzIG5vdCBhcHByb3ByaWF0ZSwgc2JwY2QuaCBzaG91bGQgZ2V0IGNoYW5nZWQKLSh5b3Ugd2lsbCBmaW5kIHRoZSByaWdodCBwbGFjZSAtIGp1c3QgYXQgdGhlIGJlZ2lubmluZykuCi0KLU5vIERNQSBhbmQgbm8gSVJRIGlzIHVzZWQuCi0KLVRvIHJlZHVjZSBvciBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIGtlcm5lbCBtZXNzYWdlcywgZWRpdCBzYnBjZC5jIGFuZCBwbGF5Ci13aXRoIHRoZSAiREJHX3h4eCIgc3dpdGNoZXMgKGluaXRpYWxpemF0aW9uIG9mIHRoZSB2YXJpYWJsZSAic2JwY2RfZGVidWciKS4KLURvbid0IGZvcmdldCB0byByZWZsZWN0IG9uIHdoYXQgeW91IGRvOyBlbmFibGluZyBhbGwgREJHX3h4eCBzd2l0Y2hlcyBhdCBvbmNlCi1tYXkgY3Jhc2ggeW91ciBzeXN0ZW0sIGFuZCBlYWNoIG1lc3NhZ2UgbGluZSBpcyBhY2NvbXBhbmllZCBieSBhIGRlbGF5LgotCi1UaGUgZHJpdmVyIHVzZXMgdGhlICJ2YXJpYWJsZSBCTE9DS19TSVpFIiBmZWF0dXJlLiBUbyB1c2UgaXQsIHlvdSBoYXZlIHRvCi1zcGVjaWZ5ICJibG9jaz0yMDQ4IiBhcyBhIG1vdW50IG9wdGlvbi4gRG9pbmcgdGhpcyB3aWxsIGRpc2FibGUgdGhlIGRpcmVjdAotZXhlY3V0aW9uIG9mIGEgYmluYXJ5IGZyb20gdGhlIENEOyB5b3UgaGF2ZSB0byBjb3B5IGl0IHRvIGEgZGV2aWNlIHdpdGggdGhlCi1zdGFuZGFyZCBCTE9DS19TSVpFICgxMDI0KSBmaXJzdC4gU28sIGRvIG5vdCB1c2UgdGhpcyBpZiB5b3VyIHN5c3RlbSBpcwotZGlyZWN0bHkgInJ1bm5pbmcgZnJvbSB0aGUgQ0RST00iIChsaWtlIHNvbWUgb2YgWWdnZHJhc2lsJ3MgaW5zdGFsbGF0aW9uCi12YXJpYW50cykuIFRoZXJlIGFyZSBDRHMgb24gdGhlIG1hcmtldCAobGlrZSB0aGUgR2VybWFuICJ1bmlmaXgiIExpbnV4Ci1kaXN0cmlidXRpb24pIHdoaWNoIE1VU1QgZ2V0IGhhbmRsZWQgd2l0aCBhIGJsb2NrX3NpemUgb2YgMTAyNC4gR2VuZXJhbGx5LAotb25lIGNhbiBzYXkgYWxsIHRoZSBDRHMgd2hpY2ggaG9sZCBmaWxlcyBvZiB0aGUgbmFtZSBZTVRSQU5TLlRCTCBhcmUgZGVmZWN0aXZlOwotZG8gbm90IHVzZSBibG9jaz0yMDQ4IHdpdGggdGhvc2UuCi0KLVdpdGhpbiBzYnBjZC5oLCB5b3Ugd2lsbCBmaW5kIHNvbWUgIiNkZWZpbmUicyAoZS5nLiBFSkVDVCBhbmQgSlVLRUJPWCkuIFdpdGgKLXRoZXNlLCB5b3UgY2FuIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBzb21lIHNwZWNpYWwgdGhpbmdzLgotWW91IGNhbiB1c2UgdGhlIGFwcGVuZGVkIHByb2dyYW0gImNkdGVzdGVyIiB0byBzZXQgdGhlIGF1dG8tZWplY3QgZmVhdHVyZQotZHVyaW5nIHJ1bnRpbWUuIEplZmYgVHJhbnRlcidzICJlamVjdCIgdXRpbGl0eSBjYW4gZG8gdGhpcywgdG9vIChhbmQgbW9yZSkKLWZvciB5b3UuCi0KLVRoZXJlIGlzIGFuIGlvY3RsIENEUk9NTVVMVElTRVNTSU9OIHRvIG9idGFpbiB3aXRoIGEgdXNlciBwcm9ncmFtIGlmCi10aGUgQ0QgaXMgYW4gWEEgZGlzayBhbmQgLSBpZiBpdCBpcyAtIHdoZXJlIHRoZSBsYXN0IHNlc3Npb24gc3RhcnRzLiBUaGUKLSJjZHRlc3RlciIgcHJvZ3JhbSBpbGx1c3RyYXRlcyBob3cgdG8gY2FsbCBpdC4KLQotCi1BdXRvLXByb2JpbmcgYXQgYm9vdCB0aW1lOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGRyaXZlciBkb2VzIGF1dG8tcHJvYmluZyBhdCBtYW55IHdlbGwta25vd24gaW50ZXJmYWNlIGNhcmQgYWRkcmVzc2VzLAotYnV0IG5vdCBhbGw6Ci1Tb21lIHByb2JpbmdzIGNhbiBjYXVzZSBhIGhhbmcgaWYgYW4gTkUyMDAwIGV0aGVybmV0IGNhcmQgZ2V0cyB0b3VjaGVkLCBiZWNhdXNlCi1TQlBDRCdzIGF1dG8tcHJvYmluZyBoYXBwZW5zIGJlZm9yZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG5ldCBkcml2ZXJzLgotVGhvc2UgImhhemFyZG91cyIgYWRkcmVzc2VzIGFyZSBleGNsdWRlZCBmcm9tIGF1dG8tcHJvYmluZzsgdGhlICJrZXJuZWwgCi1jb21tYW5kIGxpbmUiIGZlYXR1cmUgaGFzIHRvIGJlIHVzZWQgZHVyaW5nIGluc3RhbGxhdGlvbiBpZiB5b3UgaGF2ZSB5b3VyIAotZHJpdmUgYXQgdGhvc2UgYWRkcmVzc2VzLiBUaGUgIm1vZHVsZSIgdmVyc2lvbiBpcyBhbGxvd2VkIHRvIHByb2JlIGF0IHRob3NlCi1hZGRyZXNzZXMsIHRvby4KLQotVGhlIGF1dG8tcHJvYmluZyBsb29rcyBmaXJzdCBhdCB0aGUgY29uZmlndXJlZCBhZGRyZXNzIHJlc3AuIHRoZSBhZGRyZXNzCi1zdWJtaXR0ZWQgYnkgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFdpdGggdGhpcywgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoaXMKLWRyaXZlciB3aXRoaW4gaW5zdGFsbGF0aW9uIGJvb3QgZmxvcHBpZXMsIGFuZCBmb3IgYW55IG5vbi1zdGFuZGFyZCBhZGRyZXNzLAotdG9vLgotCi1BdXRvLXByb2Jpbmcgd2lsbCBtYWtlIGFuIGFzc3VtcHRpb24gYWJvdXQgdGhlIGludGVyZmFjZSB0eXBlICgiU0JQUk8iIG9yIG5vdCksCi1iYXNlZCB1cG9uIHRoZSBhZGRyZXNzLiBUaGF0IGFzc3VtcHRpb24gbWF5IGJlIHdyb25nIChpbml0aWFsaXphdGlvbiB3aWxsIGJlCi1vLmsuLCBidXQgeW91IHdpbGwgZ2V0IEkvTyBlcnJvcnMgZHVyaW5nIG1vdW50KS4gSW4gdGhhdCBjYXNlLCB1c2UgdGhlICJrZXJuZWwKLWNvbW1hbmQgbGluZSIgZmVhdHVyZSBhbmQgc3BlY2lmeSBhZGRyZXNzICYgdHlwZSBhdCBib290IHRpbWUgdG8gZmluZCBvdXQgdGhlCi1yaWdodCBzZXR1cC4KLQotRm9yIGV2ZXJ5ZGF5IHVzZSwgYWRkcmVzcyBhbmQgdHlwZSBzaG91bGQgZ2V0IGNvbmZpZ3VyZWQgd2l0aGluIHNicGNkLmguIFRoYXQKLXdpbGwgc3RvcCB0aGUgYXV0by1wcm9iaW5nIGR1ZSB0byBzdWNjZXNzIHdpdGggdGhlIGZpcnN0IHRyeS4KLQotVGhlIGtlcm5lbCBjb21tYW5kICJzYnBjZD0wIiBzdXBwcmVzc2VzIGVhY2ggYXV0by1wcm9iaW5nIGFuZCBjYXVzZXMKLXRoZSBkcml2ZXIgbm90IHRvIGZpbmQgYW55IGRyaXZlOyBpdCBpcyBtZWFudCBmb3IgcGVvcGxlIHdobyBsb3ZlIHNicGNkCi1zbyBtdWNoIHRoYXQgdGhleSBkbyBub3Qgd2FudCB0byBtaXNzIGl0LCBldmVuIGlmIHRoZXkgbWlzcyB0aGUgZHJpdmVzLiA7LSkgIAotCi1JZiB5b3UgY29uZmlndXJlICIjZGVmaW5lIENEUk9NX1BPUlQgMCIgaW4gc2JwY2QuaCwgdGhlIGF1dG8tcHJvYmluZyBpcwotaW5pdGlhbGx5IGRpc2FibGVkIGFuZCBuZWVkcyBhbiBleHBsaWNpdCBrZXJuZWwgY29tbWFuZCB0byBnZXQgYWN0aXZhdGVkLgotT25jZSBhY3RpdmF0ZWQsIGl0IGRvZXMgbm90IHN0b3AgYmVmb3JlIHN1Y2Nlc3Mgb3IgZW5kLW9mLWxpc3QuIFRoaXMgbWF5IGJlCi11c2VmdWwgd2l0aGluICJ1bml2ZXJzYWwiIENEUk9NIGluc3RhbGxhdGlvbiBib290IGZsb3BwaWVzIChidXQgdXNpbmcgdGhlIAotbG9hZGFibGUgbW9kdWxlIHdvdWxkIGJlIGJldHRlciBiZWNhdXNlIGl0IGFsbG93cyBhbiAiZXh0ZW5kZWQiIGF1dG8tcHJvYmluZwotd2l0aG91dCBmZWFyaW5nIE5FMjAwMCBjYXJkcykuCi0KLVRvIHNob3J0ZW4gdGhlIGF1dG8tcHJvYmluZyBsaXN0IHRvIGEgc2luZ2xlIGVudHJ5LCBzZXQgRElTVFJJQlVUSU9OIDAgd2l0aGluCi1zYnBjZC5oLgotCi0KLVNldHRpbmcgdXAgYWRkcmVzcyBhbmQgaW50ZXJmYWNlIHR5cGU6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3VyIEkvTyBwb3J0IGFkZHJlc3MgaXMgbm90IDB4MzQwLCB5b3UgaGF2ZSB0byBsb29rIGZvciB0aGUgI2RlZmluZXMgbmVhcgotdGhlIGJlZ2lubmluZyBvZiBzYnBjZC5oIGFuZCBjb25maWd1cmUgdGhlbTogc2V0IFNCUFJPIHRvIDAgb3IgMSBvciAyLCBhbmQKLWNoYW5nZSBDRFJPTV9QT1JUIHRvIHRoZSBhZGRyZXNzIG9mIHlvdXIgQ0RST00gSS9PIHBvcnQuCi0KLUFsbW9zdCBhbGwgb2YgdGhlICJTb3VuZEJsYXN0ZXIgY29tcGF0aWJsZSIgY2FyZHMgYmVoYXZlIGxpa2UgdGhlIG5vLXNvdW5kCi1pbnRlcmZhY2VzLCBpLmUuIG5lZWQgU0JQUk8gMCEgCi0KLVdpdGggIm9yaWdpbmFsIiBTQiBQcm8gY2FyZHMsIGFuIGluaXRpYWwgc2V0dGluZyBvZiBDRF92b2x1bWUgdGhyb3VnaCB0aGUKLXNvdW5kIGNhcmQncyBNSVhFUiByZWdpc3RlciBnZXRzIGRvbmUuCi1JZiB5b3UgYXJlIHVzaW5nIGEgImNvbXBhdGlibGUiIHNvdW5kIGNhcmQgb2YgdHlwZXMgIkxhc2VyTWF0ZSIgb3IgIlNQRUEiLAoteW91IGNhbiBzZXQgU09VTkRfQkFTRSAoaW4gc2JwY2QuaCkgdG8gZ2V0IGl0IGRvbmUgd2l0aCB5b3VyIGNhcmQsIHRvby4uLgotCi0KLVVzaW5nIGF1ZGlvIENEczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotV29ya21hbiwgV29ya0JvbmUsIHhjZHBsYXllciwgY2RwbGF5ZXIgYW5kIHRoZSBuaWNlIGxpdHRsZSB0b29sICJjZHBsYXkiIChzZWUKLVJFQURNRS5henRjZCBmcm9tIHRoZSBBenRlY2ggZHJpdmVyIHBhY2thZ2UpIHNob3VsZCB3b3JrLgotCi1UaGUgcHJvZ3JhbSBDRHBsYXllciBsaWtlcyB0byB0YWxrIHRvICIvZGV2L21jZCIgb25seSwgeGNkcGxheWVyIHdhbnRzCi0iL2Rldi9yc3IwIiwgd29ya21hbiBsb3ZlcyAiL2Rldi9zcjAiIG9yICIvZGV2L2Nkcm9tIiAtIHNvLCBtYWtlIHRoZSAKLWFwcHJvcHJpYXRlIGxpbmtzIHRvIHVzZSB0aGVtIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3VwcGx5IHBhcmFtZXRlcnMuCi0KLQotQ29weWluZyBhdWRpbyB0cmFja3M6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBwcm9ncmFtIHdpbGwgY29weSB0cmFjayAxIChvciBhIHBpZWNlIG9mIGl0KSBmcm9tIGFuIGF1ZGlvIENECi1pbnRvIHRoZSBmaWxlICJ0cmFjazAxIjoKLQotLyo9PT09PT09PT09PT09PT09PT09IGJlZ2luIHByb2dyYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotICogcmVhZCBhbiBhdWRpbyB0cmFjayBmcm9tIGEgQ0QKLSAqCi0gKiAoYykgMTk5NCBFYmVyaGFyZCBNb2Vua2ViZXJnIDxlbW9lbmtlQGd3ZGcuZGU+Ci0gKiAgICAgICAgICBtYXkgYmUgdXNlZCAmIGVuaGFuY2VkIGZyZWVseQotICoKLSAqIER1ZSB0byBub24tZXhpc3RlbnQgc3luYyBieXRlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggYXVkaW8gZnJhbWUgKG9yIGR1ZQotICogdG8gYSBmaXJtd2FyZSBidWcgd2l0aGluIGFsbCBrbm93biBkcml2ZXM/KSwgaXQgaXMgY3VycmVudGx5IGEga2luZCBvZgotICogZm9ydHVuZSBpZiB0d28gY29uc2VjdXRpdmUgZnJhbWVzIGZpdCB0b2dldGhlci4KLSAqIFVzdWFsbHksIHRoZXkgb3ZlcmxhcCwgb3IgYSBsaXR0bGUgcGllY2UgaXMgbWlzc2luZy4gVGhpcyBoYXBwZW5zIGluIHVuaXRzCi0gKiBvZiAyNC1ieXRlIGNodW5rcy4gSXQgaGFzIHRvIGdldCBmaXhlZCBieSBoaWdoZXItbGV2ZWwgc29mdHdhcmUgKHJlYWRpbmcKLSAqIHVudGlsIGFuIG92ZXJsYXAgb2NjdXJzLCBhbmQgdGhlbiBlbGltaW5hdGUgdGhlIG92ZXJsYXBwaW5nIGNodW5rcykuIAotICogZnRwLmd3ZGcuZGU6L3B1Yi9saW51eC9taXNjL2NkZGEyd2F2LXNicGNkLioudGFyLmd6IGhvbGRzIGFuIGV4YW1wbGUgb2YKLSAqIHN1Y2ggYW4gYWxnb3JpdGhtLgotICogVGhpcyBleGFtcGxlIHByb2dyYW0gZnVydGhlciBpcyBtaXNzaW5nIHRvIG9idGFpbiB0aGUgU3ViQ2hhbm5lbCBkYXRhCi0gKiB3aGljaCBiZWxvbmcgdG8gZWFjaCBmcmFtZS4KLSAqCi0gKiBUaGlzIGlzIG9ubHkgYW4gZXhhbXBsZSBvZiB0aGUgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lLiBUaGUgcmVhZCBkYXRhIGFyZQotICogcHVyZSAxNi1iaXQgQ0REQSB2YWx1ZXM7IHRoZXkgaGF2ZSB0byBnZXQgY29udmVydGVkIHRvIG1ha2Ugc291bmQgb3V0IG9mCi0gKiB0aGVtLgotICogSXQgaXMgbm8gZnVuIHRvIGxpc3RlbiB0byBpdCB3aXRob3V0IHByaW9yIG92ZXJsYXAvdW5kZXJsYXAgY29ycmVjdGlvbiEKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NoZHIgaGRyOwotc3RhdGljIHN0cnVjdCBjZHJvbV90b2NlbnRyeSBlbnRyeVsxMDFdOwotc3RhdGljIHN0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvIGFyZzsKLXN0YXRpYyB1X2NoYXIgYnVmZmVyW0NEX0ZSQU1FU0laRV9SQVddOwotc3RhdGljIGludCBkYXRhZmlsZSwgZHJpdmU7Ci1zdGF0aWMgaW50IGksIGosIGxpbWl0LCB0cmFjaywgZXJyOwotc3RhdGljIGNoYXIgZmlsZW5hbWVbMzJdOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotLyoKLSAqIG9wZW4gL2Rldi9jZHJvbQotICovCi0gIGRyaXZlPW9wZW4oIi9kZXYvY2Ryb20iLCAwKTsKLSAgaWYgKGRyaXZlPDApCi0gICAgewotICAgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuIGRyaXZlLlxuIik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotLyoKLSAqIGdldCBUb2NIZWFkZXIKLSAqLwotICBmcHJpbnRmKHN0ZG91dCwgImdldHRpbmcgVG9jSGVhZGVyLi4uXG4iKTsKLSAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURUT0NIRFIsICZoZHIpOwotICBpZiAoZXJyIT0wKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0hlYWRlciAoZXJyb3IgJWQpLlxuIiwgZXJyKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHJpbnRmKHN0ZG91dCwgIlRvY0hlYWRlcjogJWQgJWRcbiIsIGhkci5jZHRoX3RyazAsIGhkci5jZHRoX3RyazEpOwotLyoKLSAqIGdldCBhbmQgZGlzcGxheSBhbGwgVG9jRW50cmllcwotICovCi0gIGZwcmludGYoc3Rkb3V0LCAiZ2V0dGluZyBUb2NFbnRyaWVzLi4uXG4iKTsKLSAgZm9yIChpPTE7aTw9aGRyLmNkdGhfdHJrMSsxO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBlbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLSAgICAgIGVsc2UgZW50cnlbaV0uY2R0ZV90cmFjayA9IENEUk9NX0xFQURPVVQ7Ci0gICAgICBlbnRyeVtpXS5jZHRlX2Zvcm1hdCA9IENEUk9NX0xCQTsKLSAgICAgIGVycj1pb2N0bChkcml2ZSwgQ0RST01SRUFEVE9DRU5UUlksICZlbnRyeVtpXSk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgZ2V0IFRvY0VudHJ5ICMlZCAoZXJyb3IgJWQpLlxuIiwgaSwgZXJyKTsKLQkgIGV4aXQgKC0xKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZihzdGRvdXQsICJUb2NFbnRyeSAjJWQ6ICUxWCAlMVggJTA2WCAlMDJYXG4iLAotCQkgZW50cnlbaV0uY2R0ZV90cmFjaywKLQkJIGVudHJ5W2ldLmNkdGVfYWRyLAotCQkgZW50cnlbaV0uY2R0ZV9jdHJsLAotCQkgZW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJIGVudHJ5W2ldLmNkdGVfZGF0YW1vZGUpOwotCX0KLSAgICB9Ci0gIGZwcmludGYoc3Rkb3V0LCAiZ290IGFsbCBUb2NFbnRyaWVzLlxuIik7Ci0vKgotICogYXNrIGZvciB0cmFjayBudW1iZXIgKG5vdCBpbXBsZW1lbnRlZCBoZXJlKQotICovCi10cmFjaz0xOwotI2lmIDAgLyoganVzdCByZWFkIGEgbGl0dGxlIHBpZWNlICg0IHNlY29uZHMpICovCi1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhPWVudHJ5W3RyYWNrXS5jZHRlX2FkZHIubGJhKzMwMDsKLSNlbmRpZgotLyoKLSAqIHJlYWQgdHJhY2sgaW50byBmaWxlCi0gKi8KLSAgc3ByaW50ZihmaWxlbmFtZSwgInRyYWNrJTAyZFwwIiwgdHJhY2spOwotICBkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0gIGlmIChkYXRhZmlsZTwwKQotICAgIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiBkYXRhZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIGFyZy5hZGRyLmxiYT1lbnRyeVt0cmFja10uY2R0ZV9hZGRyLmxiYTsKLSAgYXJnLmFkZHJfZm9ybWF0PUNEUk9NX0xCQTsgLyogQ0RST01fTVNGIHdvdWxkIGJlIHBvc3NpYmxlIGhlcmUsIHRvby4gKi8KLSAgYXJnLm5mcmFtZXM9MTsKLSAgYXJnLmJ1Zj0mYnVmZmVyWzBdOwotICBsaW1pdD1lbnRyeVt0cmFjaysxXS5jZHRlX2FkZHIubGJhOwotICBmb3IgKDthcmcuYWRkci5sYmE8bGltaXQ7YXJnLmFkZHIubGJhKyspCi0gICAgewotICAgICAgZXJyPWlvY3RsKGRyaXZlLCBDRFJPTVJFQURBVURJTywgJmFyZyk7Ci0gICAgICBpZiAoZXJyIT0wKQotCXsKLQkgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3QgcmVhZCBhYnMuIGZyYW1lICMlZCAoZXJyb3IgJWQpLlxuIiwgCi0JCSBhcmcuYWRkci5sYmEsIGVycik7Ci0JfQotICAgICAgaj13cml0ZShkYXRhZmlsZSwgJmJ1ZmZlclswXSwgQ0RfRlJBTUVTSVpFX1JBVyk7Ci0gICAgICBpZiAoaiE9Q0RfRlJBTUVTSVpFX1JBVykKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiSS9PIGVycm9yIChkYXRhZmlsZSkgYXQgcmVsLiBmcmFtZSAlZFxuIiwKLQkJCSBhcmcuYWRkci5sYmEtZW50cnlbdHJhY2tdLmNkdGVfYWRkci5sYmEpOwotCX0KLSAgICAgIGFyZy5hZGRyLmxiYSsrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09IGVuZCBwcm9ncmFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1BdCBmdHAuZ3dkZy5kZTovcHViL2xpbnV4L21pc2MvY2RkYTJ3YXYtc2JwY2QuKi50YXIuZ3ogaXMgYW4gYWRhcHRlZCB2ZXJzaW9uIG9mCi1IZWlrbyBFaXNzZmVsZHQncyBkaWdpdGFsLWF1ZGlvIHRvIC5XQVYgY29udmVydGVyICh0aGUgb3JpZ2luYWwgaXMgdGhlcmUsIHRvbykuCi1UaGlzIGlzIHByZWxpbWluYXJ5LCBhcyBIZWlrbyBoaW1zZWxmIHdpbGwgY2FyZSBhYm91dCBpdC4KLQotCi1Lbm93biBwcm9ibGVtczoKLS0tLS0tLS0tLS0tLS0tLQotCi1DdXJyZW50bHksIHRoZSBkZXRlY3Rpb24gb2YgZGlzayBjaGFuZ2Ugb3IgcmVtb3ZhbCBpcyBhY3RpdmVseSBkaXNhYmxlZC4KLQotTW9zdCBhdHRlbXB0cyB0byByZWFkIHRoZSBVUEMvRUFOIGNvZGUgcmVzdWx0IGluIGEgc3RyZWFtIG9mIHplcm9lcy4gQWxsIG15Ci1kcml2ZXMgYXJlIG1vc3RseSB0ZWxsaW5nIHRoZXJlIGlzIG5vIFVQQy9FQU4gY29kZSBvbiBkaXNrIG9yIHRoZXJlIGlzLCBidXQgaXQKLWlzIGFuIGFsbC16ZXJvIG51bWJlci4gSSBndWVzcyBub3cgYWxtb3N0IG5vIENEIGhvbGRzIHN1Y2ggYSBudW1iZXIuCi0KLUJ1ZyByZXBvcnRzLCBjb21tZW50cywgd2lzaGVzLCBkb25hdGlvbnMgKHRlY2huaWNhbCBpbmZvcm1hdGlvbiBpcyBhIGRvbmF0aW9uLAotdG9vIDotKSBldGMuIHRvIGVtb2Vua2VAZ3dkZy5kZS4KLQotU25haWxNYWlsIGFkZHJlc3MsIHByZWZlcmFibGUgZm9yIENEIGVkaXRvcnMgaWYgdGhleSB3YW50IHRvIHN1Ym1pdCBhIGZyZWUKLSJjb29wZXJhdGlvbiIgY29weToKLSAgICAgICAgICAgICAgICAgICAgICAgICBFYmVyaGFyZCBNb2Vua2ViZXJnCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVpbmhvbGRzdHIuIDE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRC0zNzA4MyBHb2V0dGluZ2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2VybWFueQotLS0tCi0KLQotQXBwZW5kaXggLS0gdGhlICJjZHRlc3RlciIgdXRpbGl0eToKLQotLyoKLSAqIGNkdGVzdGVyLmMgLS0gdGVzdCB0aGUgYXVkaW8gZnVuY3Rpb25zIG9mIGEgQ0QgZHJpdmVyCi0gKgotICogKGMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPgotICogICAgICAgICAgcHVibGlzaGVkIHVuZGVyIHRoZSBHUEwKLSAqCi0gKiAgICAgICAgICBtYWRlIHVuZGVyIGhlYXZ5IHVzZSBvZiB0aGUgIlRpbnkgQXVkaW8gQ0QgUGxheWVyIgotICogICAgICAgICAgZnJvbSBXZXJuZXIgWmltbWVybWFubiA8emltbWVybWFAcnouZmh0LWVzc2xpbmdlbi5kZT4KLSAqICAgICAgICAgIChzZWUgbGludXgvZHJpdmVycy9ibG9jay9SRUFETUUuYXp0Y2QpCi0gKi8KLSN1bmRlZiBBWlRfUFJJVkFURV9JT0NUTFMgLyogbm90IHN1cHBvcnRlZCBieSBldmVyeSBDRFJPTSBkcml2ZXIgKi8KLSNkZWZpbmUgU0JQX1BSSVZBVEVfSU9DVExTIC8qIG5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KLQotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUwotI2luY2x1ZGUgPGxpbnV4Ly4uLy4uL2RyaXZlcnMvY2Ryb20vYXp0Y2QuaD4KLSNlbmRpZiAvKiBBWlRfUFJJVkFURV9JT0NUTFMgKi8KLSNpZmRlZiBTQlBfUFJJVkFURV9JT0NUTFMKLSNpbmNsdWRlIDxsaW51eC8uLi8uLi9kcml2ZXJzL2Nkcm9tL3NicGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQotc3RydWN0IGNkcm9tX3RvY2hkciBoZHI7Ci1zdHJ1Y3QgY2Ryb21fdG9jaGRyIHRvY0hkcjsKLXN0cnVjdCBjZHJvbV90b2NlbnRyeSBUb2NFbnRyeVsxMDFdOwotc3RydWN0IGNkcm9tX3RvY2VudHJ5IGVudHJ5Owotc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOwotc3RydWN0IGNkcm9tX3JlYWRfYXVkaW8gcmVhZF9hdWRpbzsKLXN0cnVjdCBjZHJvbV90aSB0aTsKLXN0cnVjdCBjZHJvbV9zdWJjaG5sIHN1YmNobmw7Ci1zdHJ1Y3QgY2Ryb21fbXNmIG1zZjsKLXN0cnVjdCBjZHJvbV92b2xjdHJsIHZvbGN0cmw7Ci0jaWZkZWYgQVpUX1BSSVZBVEVfSU9DVExTCi11bmlvbgotewotCXN0cnVjdCBjZHJvbV9tc2YgbXNmOwotCXVuc2lnbmVkIGNoYXIgYnVmW0NEX0ZSQU1FU0laRV9SQVddOwotfSBhenQ7Ci0jZW5kaWYgLyogQVpUX1BSSVZBVEVfSU9DVExTICovCi1pbnQgaSwgaTEsIGkyLCBpMywgaiwgazsKLXVuc2lnbmVkIGNoYXIgc2VxdWVuY2U9MDsKLXVuc2lnbmVkIGNoYXIgY29tbWFuZFs4MF07Ci11bnNpZ25lZCBjaGFyIGZpcnN0PTEsIGxhc3Q9MTsKLWNoYXIgKmRlZmF1bHRfZGV2aWNlPSIvZGV2L2Nkcm9tIjsKLWNoYXIgZGV2WzIwXTsKLWNoYXIgZmlsZW5hbWVbMjBdOwotaW50IGRyaXZlOwotaW50IGRhdGFmaWxlOwotaW50IHJjOwotCi12b2lkIGhlbHAodm9pZCkKLXsKLQlwcmludGYoIkF2YWlsYWJsZSBDb21tYW5kczpcbiIpOwotCXByaW50ZigiU1RPUCAgICAgICAgICBzICAgICAgRUpFQ1QgICAgICAgIGUgICAgICAgUVVJVCAgICAgICAgIHFcbiIpOwotCXByaW50ZigiUExBWSBUUkFDSyAgICB0ICAgICAgUEFVU0UgICAgICAgIHAgICAgICAgUkVTVU1FICAgICAgIHJcbiIpOwotCXByaW50ZigiTkVYVCBUUkFDSyAgICBuICAgICAgUkVQRUFUIExBU1QgIGwgICAgICAgSEVMUCAgICAgICAgIGhcbiIpOwotCXByaW50ZigiU1VCQ0hBTk5FTF9RICBjICAgICAgVFJBQ0sgSU5GTyAgIGkgICAgICAgUExBWSBBVCAgICAgIGFcbiIpOwotCXByaW50ZigiUkVBRCAgICAgICAgICBkICAgICAgUkVBRCBSQVcgICAgIHcgICAgICAgUkVBRCBBVURJTyAgIEFcbiIpOwotCXByaW50ZigiTVMtSU5GTyAgICAgICBNICAgICAgVE9DICAgICAgICAgIFQgICAgICAgU1RBUlQgICAgICAgIFNcbiIpOwotCXByaW50ZigiU0VUIEVKRUNUU1cgICBYICAgICAgREVWSUNFICAgICAgIEQgICAgICAgREVCVUcgICAgICAgIFlcbiIpOwotCXByaW50ZigiQVVESU9fQlVGU0laICBaICAgICAgUkVTRVQgICAgICAgIFIgICAgICAgU0VUIFZPTFVNRSAgIHZcbiIpOwotCXByaW50ZigiR0VUIFZPTFVNRSAgICBWXG4iKTsKLX0KLQotLyoKLSAqICBjb252ZXJ0IE1TRiBudW1iZXIgKDMgYnl0ZXMgb25seSkgdG8gTG9naWNhbF9CbG9ja19BZGRyZXNzIAotICovCi1pbnQgbXNmMmxiYSh1X2NoYXIgKm1zZikKLXsKLQlpbnQgaTsKLQkKLQlpPShtc2ZbMF0gKiBDRF9TRUNTICsgbXNmWzFdKSAqIENEX0ZSQU1FUyArIG1zZlsyXSAtIENEX0JMT0NLX09GRlNFVDsKLQlpZiAoaTwwKSByZXR1cm4gKDApOwotCXJldHVybiAoaSk7Ci19Ci0vKgotICogIGNvbnZlcnQgbG9naWNhbF9ibG9ja19hZGRyZXNzIHRvIG0tcy1mX251bWJlciAoMyBieXRlcyBvbmx5KQotICovCi12b2lkIGxiYTJtc2YoaW50IGxiYSwgdW5zaWduZWQgY2hhciAqbXNmKQotewotCWxiYSArPSBDRF9CTE9DS19PRkZTRVQ7Ci0JbXNmWzBdID0gbGJhIC8gKENEX1NFQ1MqQ0RfRlJBTUVTKTsKLQlsYmEgJT0gQ0RfU0VDUypDRF9GUkFNRVM7Ci0JbXNmWzFdID0gbGJhIC8gQ0RfRlJBTUVTOwotCW1zZlsyXSA9IGxiYSAlIENEX0ZSQU1FUzsKLX0KLQotaW50IGluaXRfZHJpdmUoY2hhciAqZGV2KQotewotCXVuc2lnbmVkIGNoYXIgbXNmX2VudFszXTsKLQotCS8qCi0JICogb3BlbiB0aGUgZGV2aWNlCi0JICovCi0JZHJpdmU9b3BlbihkZXYsMCk7Ci0JaWYgKGRyaXZlPDApIHJldHVybiAoLTEpOwotCS8qCi0JICogZ2V0IFRvY0hlYWRlcgotCSAqLwotCXByaW50ZigiZ2V0dGluZyBUb2NIZWFkZXIuLi5cbiIpOwotCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmaGRyKTsKLQlpZiAocmMhPTApCi0JewotCQlwcmludGYoImNhbid0IGdldCBUb2NIZWFkZXIgKGVycm9yICVkKS5cbiIscmMpOwotCQlyZXR1cm4gKC0yKTsKLQl9Ci0JZWxzZQotCQlmaXJzdD1oZHIuY2R0aF90cmswOwotCQlsYXN0PWhkci5jZHRoX3RyazE7Ci0JCXByaW50ZigiVG9jSGVhZGVyOiAlZCAlZFxuIixoZHIuY2R0aF90cmswLGhkci5jZHRoX3RyazEpOwotCS8qCi0JICogZ2V0IGFuZCBkaXNwbGF5IGFsbCBUb2NFbnRyaWVzCi0JICovCi0JcHJpbnRmKCJnZXR0aW5nIFRvY0VudHJpZXMuLi5cbiIpOwotCWZvciAoaT0xO2k8PWhkci5jZHRoX3RyazErMTtpKyspCi0JewotCQlpZiAoaSE9aGRyLmNkdGhfdHJrMSsxKSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gaTsKLQkJZWxzZSBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrID0gQ0RST01fTEVBRE9VVDsKLQkJVG9jRW50cnlbaV0uY2R0ZV9mb3JtYXQgPSBDRFJPTV9MQkE7Ci0JCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0VOVFJZLCZUb2NFbnRyeVtpXSk7Ci0JCWlmIChyYyE9MCkKLQkJewotCQkJcHJpbnRmKCJjYW4ndCBnZXQgVG9jRW50cnkgIyVkIChlcnJvciAlZCkuXG4iLGkscmMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbGJhMm1zZihUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLCZtc2ZfZW50WzBdKTsKLQkJCWlmIChUb2NFbnRyeVtpXS5jZHRlX3RyYWNrPT1DRFJPTV9MRUFET1VUKQotCQkJewotCQkJCXByaW50ZigiVG9jRW50cnkgIyUwMlg6ICUxWCAlMVggJTAyZDolMDJkOiUwMmQgKGxiYTogMHglMDZYKSAlMDJYXG4iLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX3RyYWNrLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkciwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9jdHJsLAotCQkJCSAgICAgICBtc2ZfZW50WzBdLAotCQkJCSAgICAgICBtc2ZfZW50WzFdLAotCQkJCSAgICAgICBtc2ZfZW50WzJdLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubGJhLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2RhdGFtb2RlKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIlRvY0VudHJ5ICMlMDJkOiAlMVggJTFYICUwMmQ6JTAyZDolMDJkIChsYmE6IDB4JTA2WCkgJTAyWFxuIiwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV90cmFjaywKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZHIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfY3RybCwKLQkJCQkgICAgICAgbXNmX2VudFswXSwKLQkJCQkgICAgICAgbXNmX2VudFsxXSwKLQkJCQkgICAgICAgbXNmX2VudFsyXSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLmxiYSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChoZHIuY2R0aF90cmsxKTsgLyogbnVtYmVyIG9mIHRyYWNrcyAqLwotfQotCi12b2lkIGRpc3BsYXkoaW50IHNpemUsdW5zaWduZWQgY2hhciAqYnVmZmVyKQotewotCWs9MDsKLQlnZXRjaGFyKCk7Ci0JZm9yIChpPTA7aTwoc2l6ZSsxKS8xNjtpKyspCi0JewotCQlwcmludGYoIiU0ZDoiLGkqMTYpOwotCQlmb3IgKGo9MDtqPDE2O2orKykKLQkJewotCQkJcHJpbnRmKCIgJTAyWCIsYnVmZmVyW2kqMTYral0pOwotCQl9Ci0JCXByaW50ZigiICAiKTsKLQkJZm9yIChqPTA7ajwxNjtqKyspCi0JCXsKLQkJCWlmIChpc2FsbnVtKGJ1ZmZlcltpKjE2K2pdKSkgCi0JCQkJcHJpbnRmKCIlYyIsYnVmZmVyW2kqMTYral0pOwotCQkJZWxzZQotCQkJCXByaW50ZigiLiIpOwotCQl9Ci0JCXByaW50ZigiXG4iKTsgCi0JCWsrKzsKLQkJaWYgKGs+PTIwKQotCQl7Ci0JCQlwcmludGYoInByZXNzIEVOVEVSIHRvIGNvbnRpbnVlXG4iKTsKLQkJCWdldGNoYXIoKTsKLQkJCWs9MDsKLQkJfQotCX0gCi19IAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotCXByaW50ZigiXG5UZXN0aW5nIHRvb2wgZm9yIGEgQ0RST00gZHJpdmVyJ3MgYXVkaW8gZnVuY3Rpb25zIFYwLjFcbiIpOwotCXByaW50ZigiKEMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPlxuIik7Ci0JcHJpbnRmKCJpbml0aWFsaXppbmcuLi5cbiIpOwotCQotCXJjPWluaXRfZHJpdmUoZGVmYXVsdF9kZXZpY2UpOwotCWlmIChyYzwwKSBwcmludGYoImNvdWxkIG5vdCBvcGVuICVzIChyYz0lZCkuXG4iLGRlZmF1bHRfZGV2aWNlLHJjKTsKLQloZWxwKCk7Ci0Jd2hpbGUgKDEpCi0JewotCQlwcmludGYoIkdpdmUgYSBvbmUtbGV0dGVyIGNvbW1hbmQgKGggPSBoZWxwKTogIik7Ci0JCXNjYW5mKCIlcyIsY29tbWFuZCk7Ci0JCWNvbW1hbmRbMV09MDsKLQkJc3dpdGNoIChjb21tYW5kWzBdKQotCQl7Ci0JCWNhc2UgJ0QnOgotCQkJcHJpbnRmKCJkZXZpY2UgbmFtZSAoZi5lLiAvZGV2L3NicGNkMyk6ID8gIik7Ci0JCQlzY2FuZigiJXMiLCZkZXYpOwotCQkJY2xvc2UoZHJpdmUpOwotCQkJcmM9aW5pdF9kcml2ZShkZXYpOwotCQkJaWYgKHJjPDApIHByaW50ZigiY291bGQgbm90IG9wZW4gJXMgKHJjICVkKS5cbiIsZGV2LHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdlJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NRUpFQ1QpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01FSkVDVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdwJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUEFVU0UpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QQVVTRTogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdyJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTVU1FKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVTVU1FOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NU1RPUDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdTJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RBUlQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01TVEFSVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICd0JzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRFRPQ0hEUiwmdG9jSGRyKTsKLQkJCWlmIChyYzwwKQotCQkJewotCQkJCXByaW50ZigiQ0RST01SRUFEVE9DSERSOiByYz0lZC5cbiIscmMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZmlyc3Q9dG9jSGRyLmNkdGhfdHJrMDsKLQkJCWxhc3Q9IHRvY0hkci5jZHRoX3RyazE7Ci0JCQlpZiAoKGZpcnN0PT0wKXx8KGZpcnN0Pmxhc3QpKQotCQkJewotCQkJCXByaW50ZiAoIi0tZ290IGludmFsaWQgVE9DIGRhdGEuXG4iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGYoIi0tZW50ZXIgdHJhY2sgbnVtYmVyKGZpcnN0PSVkLCBsYXN0PSVkKTogIixmaXJzdCxsYXN0KTsKLQkJCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQkJdGkuY2R0aV90cmswPWkxOwotCQkJCWlmICh0aS5jZHRpX3RyazA8Zmlyc3QpIHRpLmNkdGlfdHJrMD1maXJzdDsKLQkJCQlpZiAodGkuY2R0aV90cmswPmxhc3QpIHRpLmNkdGlfdHJrMD1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJCXRpLmNkdGlfdHJrMT1sYXN0OwotCQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgrK3RpLmNkdGlfdHJrMD5sYXN0KSB0aS5jZHRpX3RyazA9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMD0wOwotCQkJdGkuY2R0aV90cmsxPWxhc3Q7Ci0JCQl0aS5jZHRpX2luZDE9MDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUExBWVRSS0lORCwmdGkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01QTEFZVFJLSU5EOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2wnOgotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01TVE9QKTsKLQkJCWlmICgtLXRpLmNkdGlfdHJrMDxmaXJzdCkgdGkuY2R0aV90cmswPWZpcnN0OwotCQkJdGkuY2R0aV9pbmQwPTA7Ci0JCQl0aS5jZHRpX3RyazE9bGFzdDsKLQkJCXRpLmNkdGlfaW5kMT0wOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01QTEFZVFJLSU5ELCZ0aSk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlUUktJTkQ6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQlzdWJjaG5sLmNkc2NfZm9ybWF0PUNEUk9NX01TRjsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1VCQ0hOTCwmc3ViY2hubCk7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVNVQkNITkw6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJBdWRpb1N0YXR1czolcyAgVHJhY2s6JWQgIE1vZGU6JWQgIE1TRj0lMDJkOiUwMmQ6JTAyZFxuIiwKLQkJCQkgICAgICAgc3ViY2hubC5jZHNjX2F1ZGlvc3RhdHVzPT1DRFJPTV9BVURJT19QTEFZID8gIlBMQVlJTkciOiJOT1QgUExBWUlORyIsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY190cmssc3ViY2hubC5jZHNjX2FkciwgCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5taW51dGUsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIHN1YmNobmwuY2RzY19hYnNhZGRyLm1zZi5mcmFtZSk7Ci0JCQl9Ci0JCQlicmVhazsgICAgICAgICAgICAgIAotCQljYXNlICdpJzoKLQkJCXByaW50ZigiVHJhY2sgTm8uOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCWVudHJ5LmNkdGVfdHJhY2s9aTE7Ci0JCQlpZiAoZW50cnkuY2R0ZV90cmFjazxmaXJzdCkgZW50cnkuY2R0ZV90cmFjaz1maXJzdDsKLQkJCWlmIChlbnRyeS5jZHRlX3RyYWNrPmxhc3QpICBlbnRyeS5jZHRlX3RyYWNrPWxhc3Q7Ci0JCQllbnRyeS5jZHRlX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURUT0NFTlRSWSwmZW50cnkpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRUFEVE9DRU5UUlk6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRmKCJNb2RlICVkIFRyYWNrLCBzdGFydHMgYXQgJTAyZDolMDJkOiUwMmRcbiIsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRyLAotCQkJCSAgICAgICBlbnRyeS5jZHRlX2FkZHIubXNmLm1pbnV0ZSwKLQkJCQkgICAgICAgZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQsCi0JCQkJICAgICAgIGVudHJ5LmNkdGVfYWRkci5tc2YuZnJhbWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkJcHJpbnRmKCJBZGRyZXNzIChtaW46c2VjOmZybSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQltc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCW1zZi5jZG1zZl9zZWMwPWkyOwotCQkJbXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChtc2YuY2Rtc2Zfc2VjMD41OSkgbXNmLmNkbXNmX3NlYzA9NTk7Ci0JCQlpZiAobXNmLmNkbXNmX2ZyYW1lMD43NCkgbXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCWxiYTJtc2YoVG9jRW50cnlbbGFzdCsxXS5jZHRlX2FkZHIubGJhLTEsJm1zZi5jZG1zZl9taW4xKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NU1RPUCk7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVBMQVlNU0YsJm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVBMQVlNU0Y6IHJjPSVkLlxuIixyYyk7Ci0JCQlicmVhazsKLQkJY2FzZSAnVic6Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTFJFQUQsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJcHJpbnRmKCJWb2x1bWU6IGNoYW5uZWwgMCAobGVmdCkgJWQsIGNoYW5uZWwgMSAocmlnaHQpICVkXG4iLHZvbGN0cmwuY2hhbm5lbDAsdm9sY3RybC5jaGFubmVsMSk7Ci0JCQlicmVhazsgIAotCQljYXNlICdSJzoKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVTRVQpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01SRVNFVDogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotI2lmZGVmIEFaVF9QUklWQVRFX0lPQ1RMUyAvKm5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgQ0RST00gZHJpdmVyKi8KLQkJY2FzZSAnZCc6Ci0JCQlwcmludGYoIkFkZHJlc3MgKG1pbjpzZWM6ZnJtKSAgIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCWF6dC5tc2YuY2Rtc2ZfbWluMD1pMTsKLQkJCWF6dC5tc2YuY2Rtc2Zfc2VjMD1pMjsKLQkJCWF6dC5tc2YuY2Rtc2ZfZnJhbWUwPWkzOwotCQkJaWYgKGF6dC5tc2YuY2Rtc2Zfc2VjMD41OSkgYXp0Lm1zZi5jZG1zZl9zZWMwPTU5OwotCQkJaWYgKGF6dC5tc2YuY2Rtc2ZfZnJhbWUwPjc0KSBhenQubXNmLmNkbXNmX2ZyYW1lMD03NDsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBRE1PREUxLCZhenQubXNmKTsKLQkJCWlmIChyYzwwKSBwcmludGYoIkNEUk9NUkVBRE1PREUxOiByYz0lZC5cbiIscmMpOwotCQkJZWxzZSBkaXNwbGF5KENEX0ZSQU1FU0laRSxhenQuYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlICd3JzoKLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcmFtZSkgICIpOwotCQkJc2NhbmYoIiVkOiVkOiVkIiwmaTEsJmkyLCZpMyk7Ci0JCQlhenQubXNmLmNkbXNmX21pbjA9aTE7Ci0JCQlhenQubXNmLmNkbXNmX3NlYzA9aTI7Ci0JCQlhenQubXNmLmNkbXNmX2ZyYW1lMD1pMzsKLQkJCWlmIChhenQubXNmLmNkbXNmX3NlYzA+NTkpIGF6dC5tc2YuY2Rtc2Zfc2VjMD01OTsKLQkJCWlmIChhenQubXNmLmNkbXNmX2ZyYW1lMD43NCkgYXp0Lm1zZi5jZG1zZl9mcmFtZTA9NzQ7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVJFQURNT0RFMiwmYXp0Lm1zZik7Ci0JCQlpZiAocmM8MCkgcHJpbnRmKCJDRFJPTVJFQURNT0RFMjogcmM9JWQuXG4iLHJjKTsKLQkJCWVsc2UgZGlzcGxheShDRF9GUkFNRVNJWkVfUkFXLGF6dC5idWYpOyAvKiBjdXJyZW50bHkgb25seSAyMzM2ICovCi0JCQlicmVhazsgIAotI2VuZGlmCi0JCWNhc2UgJ3YnOgotCQkJcHJpbnRmKCItLUNoYW5uZWwgMCAoTGVmdCkgICgwLTI1NSk6ICIpOwotCQkJc2NhbmYoIiVkIiwmaTEpOwotCQkJdm9sY3RybC5jaGFubmVsMD1pMTsKLQkJCXByaW50ZigiLS1DaGFubmVsIDEgKFJpZ2h0KSAoMC0yNTUpOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkxKTsKLQkJCXZvbGN0cmwuY2hhbm5lbDE9aTE7Ci0JCQl2b2xjdHJsLmNoYW5uZWwyPTA7Ci0JCQl2b2xjdHJsLmNoYW5uZWwzPTA7Ci0JCQlyYz1pb2N0bChkcml2ZSxDRFJPTVZPTENUUkwsJnZvbGN0cmwpOwotCQkJaWYgKHJjPDApIHByaW50ZigiQ0RST01WT0xDVFJMOiByYz0lZC5cbiIscmMpOwotCQkJYnJlYWs7ICAKLQkJY2FzZSAncSc6Ci0JCQljbG9zZShkcml2ZSk7Ci0JCQlleGl0KDApOwotCQljYXNlICdoJzoKLQkJCWhlbHAoKTsKLQkJCWJyZWFrOwotCQljYXNlICdUJzogLyogZGlzcGxheSBUT0MgZW50cnkgLSB3aXRob3V0IGludm9sdmluZyB0aGUgZHJpdmVyICovCi0JCQlzY2FuZigiJWQiLCZpKTsKLQkJCWlmICgoaTxoZHIuY2R0aF90cmswKXx8KGk+aGRyLmNkdGhfdHJrMSkpCi0JCQkJcHJpbnRmKCJpbnZhbGlkIHRyYWNrIG51bWJlci5cbiIpOwotCQkJZWxzZQotCQkJCXByaW50ZigiVG9jRW50cnkgJTAyZDogYWRyPSUwMVggY3RybD0lMDFYIG1zZj0lMDJkOiUwMmQ6JTAyZCBtb2RlPSUwMlhcbiIsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfdHJhY2ssCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRyLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2N0cmwsCi0JCQkJICAgICAgIFRvY0VudHJ5W2ldLmNkdGVfYWRkci5tc2YubWludXRlLAotCQkJCSAgICAgICBUb2NFbnRyeVtpXS5jZHRlX2FkZHIubXNmLnNlY29uZCwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9hZGRyLm1zZi5mcmFtZSwKLQkJCQkgICAgICAgVG9jRW50cnlbaV0uY2R0ZV9kYXRhbW9kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnQSc6IC8qIHJlYWQgYXVkaW8gZGF0YSBpbnRvIGZpbGUgKi8KLQkJCXByaW50ZigiQWRkcmVzcyAobWluOnNlYzpmcm0pID8gIik7Ci0JCQlzY2FuZigiJWQ6JWQ6JWQiLCZpMSwmaTIsJmkzKTsKLQkJCXJlYWRfYXVkaW8uYWRkci5tc2YubWludXRlPWkxOwotCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQ9aTI7Ci0JCQlyZWFkX2F1ZGlvLmFkZHIubXNmLmZyYW1lPWkzOwotCQkJcmVhZF9hdWRpby5hZGRyX2Zvcm1hdD1DRFJPTV9NU0Y7Ci0JCQlwcmludGYoIiMgb2YgZnJhbWVzID8gIik7Ci0JCQlzY2FuZigiJWQiLCZpMSk7Ci0JCQlyZWFkX2F1ZGlvLm5mcmFtZXM9aTE7Ci0JCQlrPXJlYWRfYXVkaW8ubmZyYW1lcypDRF9GUkFNRVNJWkVfUkFXOwotCQkJcmVhZF9hdWRpby5idWY9bWFsbG9jKGspOwotCQkJaWYgKHJlYWRfYXVkaW8uYnVmPT1OVUxMKQotCQkJewotCQkJCXByaW50ZigiY2FuJ3QgbWFsbG9jICVkIGJ5dGVzLlxuIixrKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNwcmludGYoZmlsZW5hbWUsImF1ZGlvXyUwMmQlMDJkJTAyZF8lMDJkLiUwMmRcMCIsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5taW51dGUsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJcmVhZF9hdWRpby5hZGRyLm1zZi5mcmFtZSwKLQkJCQlyZWFkX2F1ZGlvLm5mcmFtZXMsCi0JCQkJKytzZXF1ZW5jZSk7Ci0JCQlkYXRhZmlsZT1jcmVhdChmaWxlbmFtZSwgMDc1NSk7Ci0JCQlpZiAoZGF0YWZpbGU8MCkKLQkJCXsKLQkJCQlwcmludGYoImNhbid0IG9wZW4gZGF0YWZpbGUgJXMuXG4iLGZpbGVuYW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NUkVBREFVRElPLCZyZWFkX2F1ZGlvKTsKLQkJCWlmIChyYyE9MCkKLQkJCXsKLQkJCQlwcmludGYoIkNEUk9NUkVBREFVRElPOiByYz0lZC5cbiIscmMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJjPXdyaXRlKGRhdGFmaWxlLCZyZWFkX2F1ZGlvLmJ1ZixrKTsKLQkJCQlpZiAocmMhPWspIHByaW50ZigiZGF0YWZpbGUgSS9PIGVycm9yICglZCkuXG4iLHJjKTsKLQkJCX0KLQkJCWNsb3NlKGRhdGFmaWxlKTsKLQkJCWJyZWFrOwotCQljYXNlICdYJzogLyogc2V0IEVKRUNUX1NXICgwOiBkaXNhYmxlLCAxOiBlbmFibGUgYXV0by1lamVjdGluZykgKi8KLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01FSkVDVF9TVyxpKTsKLQkJCWlmIChyYyE9MCkKLQkJCQlwcmludGYoIkNEUk9NRUpFQ1RfU1c6IHJjPSVkLlxuIixyYyk7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJFSkVDVF9TVyBzZXQgdG8gJWRcbiIsaSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnTSc6IC8qIGdldCB0aGUgbXVsdGlzZXNzaW9uIHJlZGlyZWN0aW9uIGluZm8gKi8KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTEJBOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obGJhKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKSBwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKGxiYSk6ICVkICgweCUwNlgpXG4iLG1zX2luZm8uYWRkci5sYmEsbXNfaW5mby5hZGRyLmxiYSk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRmKCJ0aGlzIENEIGlzIG5vdCBhbiBYQSBkaXNrLlxuIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW1zX2luZm8uYWRkcl9mb3JtYXQ9Q0RST01fTVNGOwotCQkJcmM9aW9jdGwoZHJpdmUsQ0RST01NVUxUSVNFU1NJT04sJm1zX2luZm8pOwotCQkJaWYgKHJjIT0wKQotCQkJewotCQkJCXByaW50ZigiQ0RST01NVUxUSVNFU1NJT04obXNmKTogcmM9JWQuXG4iLHJjKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAobXNfaW5mby54YV9mbGFnKQotCQkJCQlwcmludGYoIk11bHRpU2Vzc2lvbiBvZmZzZXQgKG1zZik6ICUwMmQ6JTAyZDolMDJkICgweCUwMlglMDJYJTAyWClcbiIsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLm1pbnV0ZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2Yuc2Vjb25kLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5mcmFtZSwKLQkJCQkJICAgICAgIG1zX2luZm8uYWRkci5tc2YubWludXRlLAotCQkJCQkgICAgICAgbXNfaW5mby5hZGRyLm1zZi5zZWNvbmQsCi0JCQkJCSAgICAgICBtc19pbmZvLmFkZHIubXNmLmZyYW1lKTsKLQkJCQllbHNlIHByaW50ZigidGhpcyBDRCBpcyBub3QgYW4gWEEgZGlzay5cbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgU0JQX1BSSVZBVEVfSU9DVExTCi0JCWNhc2UgJ1knOiAvKiBzZXQgdGhlIGRyaXZlcidzIG1lc3NhZ2UgbGV2ZWwgKi8KLSNpZiAwIC8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQkJCXByaW50ZigiZW50ZXIgc3dpdGNoIG5hbWUgKGYuZS4gREJHX0NNRCk6ICIpOwotCQkJc2NhbmYoIiVzIiwmZGJnX3N3aXRjaCk7Ci0JCQlqPWdldF9kYmdfbnVtKGRiZ19zd2l0Y2gpOwotI2Vsc2UKLQkJCXByaW50ZigiZW50ZXIgRERJT0NTREJHIHN3aXRjaCBudW1iZXI6ICIpOwotCQkJc2NhbmYoIiVkIiwmaik7Ci0jZW5kaWYKLQkJCXByaW50ZigiZW50ZXIgMCBmb3IgXCJvZmZcIiwgMSBmb3IgXCJvblwiOiAiKTsKLQkJCXNjYW5mKCIlZCIsJmkpOwotCQkJaWYgKGk9PTApIGp8PTB4ODA7Ci0JCQlwcmludGYoImNhbGxpbmcgXCJpb2N0bChkcml2ZSxERElPQ1NEQkcsJWQpXCJcbiIsaik7Ci0JCQlyYz1pb2N0bChkcml2ZSxERElPQ1NEQkcsaik7Ci0JCQlwcmludGYoIkRESU9DU0RCRzogcmM9JWQuXG4iLHJjKTsKLQkJCWJyZWFrOwotCQljYXNlICdaJzogLyogc2V0IHRoZSBhdWRpbyBidWZmZXIgc2l6ZSAqLwotCQkJcHJpbnRmKCIjIGZyYW1lcyB3YW50ZWQ6ID8gIik7Ci0JCQlzY2FuZigiJWQiLCZqKTsKLQkJCXJjPWlvY3RsKGRyaXZlLENEUk9NQVVESU9CVUZTSVosaik7Ci0JCQlwcmludGYoIiVkIGZyYW1lcyBncmFudGVkLlxuIixyYyk7Ci0JCQlicmVhazsKLSNlbmRpZiAvKiBTQlBfUFJJVkFURV9JT0NUTFMgKi8KLQkJZGVmYXVsdDoKLQkJCXByaW50ZigidW5rbm93biBjb21tYW5kOiBcIiVzXCIuXG4iLGNvbW1hbmQpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkIGIvRG9jdW1lbnRhdGlvbi9jZHJvbS9zamNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGExNDg0Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY2Ryb20vc2pjZAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSAtLSBEb2N1bWVudGF0aW9uL2Nkcm9tL3NqY2QKLQkJCQk4MCUgb2YgdGhlIHdvcmsgdGFrZXMgMjAlIG9mIHRoZSB0aW1lLAotCQkJCTIwJSBvZiB0aGUgd29yayB0YWtlcyA4MCUgb2YgdGhlIHRpbWUuLi4KLQkJCQkJCShNdXJwaHkncyBsYXcpCi0KLQkJCQlPbmNlIHN0YXJ0ZWQsIHRyYWluaW5nIGNhbiBub3QgYmUgc3RvcHBlZC4uLgotCQkJCQkJKFN0YXIgV2FycykKLQotVGhpcyBpcyB0aGUgUkVBRE1FIGZvciB0aGUgc2pjZCBjZHJvbSBkcml2ZXIsIHZlcnNpb24gMS42LgotCi1UaGlzIGZpbGUgaXMgbWVhbnQgYXMgYSB0aXBzICYgdHJpY2tzIGVkZ2UgZm9yIHRoZSB1c2FnZSBvZiB0aGUgU0FOWU8gQ0RSLUg5NEEKLWNkcm9tIGRyaXZlLiBJdCB3aWxsIGdyb3cgYXMgdGhlIHF1ZXN0aW9ucyBhcmlzZS4gOy0pCi1Gb3IgaW5mbyBvbiBjb25maWd1cmluZyB0aGUgSVNQMTYgc291bmQgY2FyZCBsb29rIGF0IERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBhbnkgb2YgdGhlIFBhbmFzb25pYywgU29ueSBvciBNaXRzdW1pIHN0eWxlCi1DRFJPTSBpbnRlcmZhY2VzLgotVGhlIGNkcm9tIGludGVyZmFjZSBvbiBNZWRpYSBNYWdpYydzIHNvZnQgY29uZmlndXJhYmxlIHNvdW5kIGNhcmQgSVNQMTYsCi13aGljaCB1c2VkIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIsIGlzIG5vdyBzdXBwb3J0ZWQgaW4gYSBzZXBhcmF0ZSBtb2R1bGUuCi1UaGlzIGluaXRpYWxpc2F0aW9uIG1vZHVsZSB3aWxsIHByb2JhYmx5IGFsc28gd29yayB3aXRoIG90aGVyIGludGVyZmFjZXMKLWJhc2VkIG9uIGFuIE9QVGkgODJDOTI4IG9yIDgyQzkyOSBjaGlwIChsaWtlIE1BRDE2IGFuZCBNb3phcnQpOiBzZWUgdGhlCi1kb2N1bWVudGF0aW9uIERvY3VtZW50YXRpb24vY2Ryb20vaXNwMTYuCi0KLVRoZSBkZXZpY2UgbWFqb3IgZm9yIHNqY2QgaXMgMTgsIGFuZCBtaW5vciBpcyAwLiBDcmVhdGUgYSBibG9jayBzcGVjaWFsCi1maWxlIGluIHlvdXIgL2RldiBkaXJlY3RvcnkgKGUuZy4sIC9kZXYvc2pjZCkgd2l0aCB0aGVzZSBudW1iZXJzLgotKEZvciB0aG9zZSB3aG8gZG9uJ3Qga25vdywgYmVpbmcgcm9vdCBhbmQgZG9pbmcgdGhlIGZvbGxvd2luZyBzaG91bGQgZG8KLXRoZSB0cmljazoKLSAgbWtub2QgLW0gNjQ0IC9kZXYvc2pjZCBiIDE4IDAKLWFuZCBtb3VudCB0aGUgY2Ryb20gYnkgL2Rldi9zamNkKS4KLQotVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZToKLSAgYmFzZSBhZGRyZXNzIDB4MzQwCi0gIG5vIGlycQotICBubyBkbWEKLShBY3R1YWxseSB0aGUgQ0RSLUg5NEEgZG9lc24ndCBrbm93IGhvdyB0byB1c2UgaXJxIGFuZCBkbWEuKQotQXMgb2YgdmVyc2lvbiAxLjIsIHNldHRpbmcgYmFzZSBhZGRyZXNzIGF0IGJvb3QgdGltZSBpcyBzdXBwb3J0ZWQKLXRocm91Z2ggdGhlIHVzZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9uczogdHlwZSBhdCB0aGUgImJvb3Q6IiBwcm9tcHQ6Ci0gIGxpbnV4IHNqY2Q9PGJhc2VfYWRkcmVzcz4KLSh3aGVyZSB5b3Ugd291bGQgdXNlIHRoZSBrZXJuZWwgbGFiZWxlZCAibGludXgiIGluIGxpbG8ncyBjb25maWd1cmF0aW9uCi1maWxlIC9ldGMvbGlsby5jb25mKS4gWW91IGNvdWxkIGFsc28gdXNlICdhcHBlbmQ9InNqY2Q9PGNvbmZpZ3VyYXRpb25faW5mbz4iJwotaW4gdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gb2YgL2V0Yy9saWxvLmNvbmYKLUlmIHlvdSdyZSBidWlsZGluZyBhIGtlcm5lbCB5b3Vyc2VsZiB5b3UgY2FuIHNldCB5b3VyIGRlZmF1bHQgYmFzZQotaS9vIGFkZHJlc3Mgd2l0aCBTSkNEX0JBU0VfQUREUiBpbiAvdXNyL3NyYy9saW51eC9kcml2ZXJzL2Nkcm9tL3NqY2QuaC4KLQotVGhlIHNqY2QgZHJpdmVyIHN1cHBvcnRzIGJlaW5nIGxvYWRlZCBhcyBhIG1vZHVsZS4gVGhlIGZvbGxvd2luZwotY29tbWFuZCB3aWxsIHNldCB0aGUgYmFzZSBpL28gYWRkcmVzcyBvbiB0aGUgZmx5IChhc3N1bWluZyB5b3UKLWhhdmUgaW5zdGFsbGVkIHRoZSBtb2R1bGUgaW4gYW4gYXBwcm9wcmlhdGUgcGxhY2UpLgotICBpbnNtb2Qgc2pjZC5vIHNqY2RfYmFzZT08YmFzZV9hZGRyZXNzPgotCi0KLUhhdmUgZnVuIQotCi1JZiBzb21ldGhpbmcgaXMgd3JvbmcsIHBsZWFzZSBlbWFpbCB0bwkJdmFkaW1AcmJyZi5ydQotCQkJCQlvciAJdmFkaW1AaXBzdW4ucmFzLnJ1Ci0JCQkJCW9yCW1vZGVsQGNlY21vdy5lbmV0LmRlYy5jb20KLQkJCQkJb3IJSC5ULk0udi5kLk1hYXJlbEBtYXJpbi5ubAotCi1JdCBoYXBwZW5zIHNvbWV0aW1lcyB0aGF0IFZhZGltIGlzIG5vdCByZWFjaGFibGUgYnkgbWFpbC4gRm9yIHRoZXNlCi1pbnN0YW5jZXMsIEVyaWMgdmFuIGRlciBNYWFyZWwgd2lsbCBoZWxwIHRvby4KLQotCQlWYWRpbSBWLiBNb2RlbCwgRXJpYyB2YW4gZGVyIE1hYXJlbCwgRWJlcmhhcmQgTW9lbmtlYmVyZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zb255Y2Q1MzUgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxZTEwOS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NvbnljZDUzNQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0gICAgICAgICAgICAgIFJFQURNRSBGT1IgTElOVVggU09OWSBDRFUtNTM1LzUzMSBEUklWRVIKLSAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIGlzIHRoZSBTb255IENEVS01MzUgKGFuZCA1MzEpIGRyaXZlciB2ZXJzaW9uIDAuNyBmb3IgTGludXguCi1JIGRvIG5vdCB0aGluayBJIGhhdmUgdGhlIGRvY3VtZW50YXRpb24gdG8gYWRkIGZlYXR1cmVzIGxpa2UgRE1BIHN1cHBvcnQKLXNvIGlmIGFueW9uZSBlbHNlIHdhbnRzIHRvIHB1cnN1ZSBpdCBvciBoZWxwIG1lIHdpdGggaXQsIHBsZWFzZSBkby4KLShJIG5lZWQgdG8gc2VlIHdoYXQgd2FzIGRvbmUgZm9yIHRoZSBDRFUtMzFBIGRyaXZlciAtLSBwZXJoYXBzIEkgY2FuCi1zdGVhbCBzb21lIG9mIHRoYXQgY29kZS4pCi0KLVRoaXMgaXMgYSBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgU29ueSBDRFUtNTM1IENEUk9NIGRyaXZlLiAgVGhpcyBpcwotb25lIG9mIHRoZSBvbGRlciBTb255IGRyaXZlcyB3aXRoIGl0cyBvd24gaW50ZXJmYWNlIGNhcmQgKFNvbnkgYnVzKS4KLVRoZSBET1MgZHJpdmVyIGZvciB0aGlzIGRyaXZlIGlzIG5hbWVkIFNPTllfQ0RVLlNZUyAtIHdoZW4geW91IGJvb3QgRE9TCi15b3VyIGRyaXZlIHNob3VsZCBiZSBpZGVudGlmaWVkIGFzIGEgU09OWSBDRFUtNTM1LiAgVGhlIGRyaXZlciB3b3Jrcwotd2l0aCBhIENEVS01MzEgYWxzby4gIE9uZSB1c2VyIHJlcG9ydGVkIHRoYXQgdGhlIGRyaXZlciB3b3JrZWQgb24gZHJpdmVzCi1PRU0nZWQgYnkgUHJvY29tbSwgZHJpdmUgYW5kIGludGVyZmFjZSBib2FyZCB3ZXJlIGxhYmVsbGVkIFByb2NvbW0uCi0KLVRoZSBMaW51eCBkcml2ZXIgaXMgYmFzZWQgb24gQ29yZXkgTWlueWFyZCdzIHNvbnljZCAwLjMgZHJpdmVyIGZvcgotdGhlIENEVS0zMUEuICBSb24gSmVwcGVzZW4ganVzdCBjaGFuZ2VkIHRoZSBjb21tYW5kcyB0aGF0IHdlcmUgc2VudAotdG8gdGhlIGRyaXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIENEVS01MzUgY29tbWFuZHMgYW5kIHJlZ2lzdGVycy4KLVRoZXJlIHdlcmUgZW5vdWdoIGNoYW5nZXMgdG8gbGV0IGJ1Z3MgY3JlZXAgaW4gYnV0IGl0IHNlZW1zIHRvIGJlIHN0YWJsZS4KLVJvbiB3YXMgYWJsZSB0byB0YXIgYW4gZW50aXJlIENEUk9NIChzaG91bGQgcmVhZCBhbGwgYmxvY2tzKSBhbmQgYnVpbHQKLWdob3N0dmlldyBhbmQgeGZpZyBvZmYgV2FsbnV0IENyZWVrJ3MgWDExUjUvR05VIENEUk9NLiAgeGNkcGxheWVyIGFuZAotd29ya21hbiB3b3JrIHdpdGggdGhlIGRyaXZlci4gIE90aGVycyBoYXZlIHVzZWQgdGhlIGRyaXZlciB3aXRob3V0Ci1wcm9ibGVtcyBleGNlcHQgdGhvc2UgZGVhbGluZyB3aXRoIHdhaXQgbG9vcHMgKGZpeGVkIGluIHRoaXJkIHJlbGVhc2UpLgotTGlrZSBNaW55YXJkJ3Mgb3JpZ2luYWwgZHJpdmVyIHRoaXMgb25lIHVzZXMgYSBwb2xsZWQgaW50ZXJmYWNlICh0aGlzCi1pcyBhbHNvIHRoZSBkZWZhdWx0IHNldHVwIGZvciB0aGUgRE9TIGRyaXZlcikuICBJdCBoYXMgbm90IGJlZW4gdHJpZWQKLXdpdGggaW50ZXJydXB0cyBvciBETUEgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCi0KLVJFUVVJUkVNRU5UUwotPT09PT09PT09PT09Ci0KLQktIFNvbnkgQ0RVLTUzNSBkcml2ZSwgcHJlZmVyYWJseSB3aXRob3V0IGludGVycnVwdHMgYW5kIERNQSAKLQkgIGVuYWJsZWQgb24gdGhlIGNhcmQuCi0KLQktIERyaXZlIG11c3QgYmUgc2V0IHVwIGFzIHVuaXQgMS4gIE9ubHkgdGhlIGZpcnN0IHVuaXQgd2lsbCBiZSAKLQkgIHJlY29nbml6ZWQKLQotCS0gWW91IG11c3QgZW50ZXIgeW91ciBpbnRlcmZhY2UgYWRkcmVzcyBpbnRvIAotICAgICAgICAgIC91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmggYW5kIGJ1aWxkIHRoZQotICAgICAgICAgIGFwcHJvcHJpYXRlIGtlcm5lbCBvciB1c2UgdGhlICJrZXJuZWwgY29tbWFuZCBsaW5lIiBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICBzb255Y2Q1MzU9MHgzMjAKLSAgICAgICAgICB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSBhZGRyZXNzLgotCi1OT1RFUzoKLT09PT09PQotCi0xKSBUaGUgZHJpdmUgTVVTVCBiZSB0dXJuZWQgb24gd2hlbiBib290aW5nIG9yIGl0IHdpbGwgbm90IGJlIHJlY29nbml6ZWQhCi0gICAoYnV0IHNlZSBjb21tZW50cyBvbiBtb2R1bGFyaXplZCB2ZXJzaW9uIGJlbG93KQotCi0yKSB3aGVuIHRoZSBjZHJvbSBkZXZpY2UgaXMgb3BlbmVkIHRoZSBlamVjdCBidXR0b24gaXMgZGlzYWJsZWQgdG8ga2VlcCB0aGUKLSAgIHVzZXIgZnJvbSBlamVjdGluZyBhIG1vdW50ZWQgZGlzayBhbmQgcmVwbGFjaW5nIGl0IHdpdGggYW5vdGhlci4KLSAgIFVuZm9ydHVuYXRlbHkgeGNkcGxheWVyIGFuZCB3b3JrbWFuIGFsc28gb3BlbiB0aGUgY2Ryb20gZGV2aWNlIHNvIHlvdQotICAgaGF2ZSB0byB1c2UgdGhlIGVqZWN0IGJ1dHRvbiBpbiB0aGUgc29mdHdhcmUuICBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3VyCi0gICBjZHJvbSBwbGF5ZXIgcmVmdXNlcyB0byBnaXZlIHVwIGl0cyBkaXNrIC0tIGV4aXQgd29ya21hbiBvciB4Y2RwbGF5ZXIsIG9yCi0gICB1bW91bnQgdGhlIGRyaXZlIGlmIGl0IGhhcyBiZWVuIG1vdW50ZWQuCi0KLVRIQU5LUwotPT09PT09Ci0KLU1hbnkgdGhhbmtzIHRvIFJvbiBKZXBwZXNlbiAocm9uai5hbkBzaXRlMDA3LnNhaWMuY29tKSBmb3IgZ2V0dGluZwotdGhpcyBwcm9qZWN0IG9mZiB0aGUgZ3JvdW5kLiAgSGUgd3JvdGUgdGhlIGluaXRpYWwgcmVsZWFzZQotYW5kIHRoZSBmaXJzdCB0d28gcGF0Y2hlcyB0byB0aGlzIGRyaXZlciAoMC4xLCAwLjIsIGFuZCAwLjMpLgotVGhhbmtzIGFsc28gdG8gRWJlcmhhcmQgTW9lbmtlYmVyZyAoZW1vZW5rZUBnd2RnLmRlKSBmb3IgcHJvZGRpbmcKLW1lIHRvIHBsYWNlIHRoaXMgY29kZSBpbnRvIHRoZSBtYWluc3RyZWFtIExpbnV4IHNvdXJjZSB0cmVlCi0oYXMgb2YgTGludXggdmVyc2lvbiAxLjEuOTEpLCBhcyB3ZWxsIGFzIHNvbWUgcGF0Y2hlcyB0byBtYWtlCi1pdCBhIGJldHRlciBkZXZpY2UgY2l0aXplbi4gIEZ1cnRoZXIgdGhhbmtzIHRvIEpvZWwgS2F0egotPGpvZWxrYXR6QHdlYmNoYXQub3JnPiBmb3IgaGlzIE1PRFVMRSBwYXRjaGVzIChzZWUgZGV0YWlscyBiZWxvdyksCi1Qb3JmaXJpIENsYXVkaW8gPEMuUG9yZmlyaUBuaXNtcy50ZWkuZXJpY3Nzb24uc2U+IGZvciBwYXRjaGVzCi10byBtYWtlIHRoZSBkcml2ZXIgd29yayB3aXRoIHRoZSBvbGRlciBDRFUtNTEwLzUxNSBzZXJpZXMsIGFuZAotSGVpa28gRWlzc2ZlbGR0IDxoZWlrb0Bjb2xvc3N1cy5lc2NhcGUuZGU+IGZvciBwb2ludGluZyBvdXQgdGhhdAotdGhlIHZlcmlmeV9hcmVhKCkgY2hlY2tzIHdlcmUgaWdub3JpbmcgdGhlIHJlc3VsdHMgb2Ygc2FpZCBjaGVja3MKLShub3RlOiB2ZXJpZnlfYXJlYSgpIGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIGJ5IGFjY2Vzc19vaygpKS4KLQotKEFja25vd2xlZGdtZW50cyBmcm9tIFJvbiBKZXBwZXNlbiBpbiB0aGUgMC4zIHJlbGVhc2U6KQotVGhhbmtzIHRvIENvcmV5IE1pbnlhcmQgd2hvIHdyb3RlIHRoZSBvcmlnaW5hbCBDRFUtMzFBIGRyaXZlciBvbiB3aGljaAotdGhpcyBkcml2ZXIgaXMgYmFzZWQuICBUaGFua3MgdG8gS2VuIFBpenppbmkgYW5kIEJvYiBCbGFpciB3aG8gcHJvdmlkZWQgCi1wYXRjaGVzIGFuZCBmZWVkYmFjayBvbiB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGlzIGRyaXZlci4KLQotS2VuIFBpenppbmkKLWtlbkBoYWxjeW9uLmNvbQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShUaGUgZm9sbG93aW5nIGlzIGZyb20gSm9lbCBLYXR6IDxqb2Vsa2F0ekB3ZWJjaGF0Lm9yZz4uKQotCi0JVG8gYnVpbGQgYSB2ZXJzaW9uIG9mIHNvbnk1MzUubyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgYXMgYSBtb2R1bGUsCi11c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1nY2MgLWMgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1PMiBzb255Y2Q1MzUuYyAtbyBzb255Y2Q1MzUubwotCi0JVG8gaW5zdGFsbCB0aGUgbW9kdWxlLCBzaW1wbHkgdHlwZToKLQotaW5zbW9kIHNvbnk1MzUubwotCW9yCi1pbnNtb2Qgc29ueTUzNS5vIHNvbnljZDUzNT08YWRkcmVzcz4KLQotCUFuZCB0byByZW1vdmUgaXQ6Ci0KLXJtbW9kIHNvbnk1MzUKLQotCVRoZSBjb2RlIGNoZWNrcyB0byBzZWUgaWYgTU9EVUxFIGlzIGRlZmluZWQgYW5kIGJlaGF2ZXMgYXMgaXQgdXNlZAotdG8gaWYgTU9EVUxFIGlzIG5vdCBkZWZpbmVkLiBUaGF0IG1lYW5zIHlvdXIgcGF0Y2hlZCBmaWxlIHNob3VsZCBiZWhhdmUKLWV4YWN0bHkgYXMgaXQgdXNlZCB0byBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuCi0KLQlJIGhhdmUgYW4gZXh0ZXJuYWwgZHJpdmUsIGFuZCBJIHVzdWFsbHkgbGVhdmUgaXQgcG93ZXJlZCBvZmYuIEkgdXNlZAotdG8gaGF2ZSB0byByZWJvb3QgaWYgSSBuZWVkZWQgdG8gdXNlIHRoZSBDRFJPTSBkcml2ZS4gTm93IEkgZG9uJ3QuCi0KLQlFdmVuIGlmIHlvdSBoYXZlIGFuIGludGVybmFsIGRyaXZlLCB3aHkgd2FzdGUgdGhlIDk2SyBvZiBtZW1vcnkKLSh1bnN3YXBwYWJsZSkgdGhhdCB0aGUgZHJpdmVyIHVzZXMgaWYgeW91IHVzZSB5b3VyIENELVJPTSBkcml2ZSBpbmZyZXF1ZW50bHk/Ci0KLQlUaGlzIGRyaXZlciB3aWxsIG5vdCBpbnN0YWxsICh3aGV0aGVyIGNvbXBpbGVkIGluIG9yIGxvYWRlZCBhcyBhCi1tb2R1bGUpIGlmIHRoZSBDRFJPTSBkcml2ZSBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24uIFRoaXMKLW1lYW5zIHRoYXQgeW91IGNhbiBoYXZlIHRoZSBkcml2ZXIgY29tcGlsZWQgaW50byB0aGUga2VybmVsIGFuZCBzdGlsbCBsb2FkCi10aGUgbW9kdWxlIGxhdGVyIChhc3N1bWluZyB0aGUgZHJpdmVyIGRvZXNuJ3QgaW5zdGFsbCBpdHNlbGYgZHVyaW5nCi1wb3dlci1vbikuIFRoaXMgb25seSB3YXN0ZXMgMTJLIHdoZW4geW91IGJvb3Qgd2l0aCB0aGUgQ0RST00gZHJpdmUgb2ZmLgotCi0JVGhpcyBpcyB3aGF0IEkgdXN1YWxseSBkbzsgSSBsZWF2ZSB0aGUgZHJpdmVyIGNvbXBpbGVkIGludG8gdGhlCi1rZXJuZWwsIGJ1dCBsb2FkIGl0IGFzIGEgbW9kdWxlIGlmIEkgcG93ZXJlZCB0aGUgc3lzdGVtIHVwIHdpdGggdGhlIGRyaXZlCi1vZmYgYW5kIHRoZW4gbGF0ZXIgZGVjaWRlZCB0byB1c2UgdGhlIENEUk9NIGRyaXZlLgotCi0JU2luY2UgdGhlIGRyaXZlciBvbmx5IHVzZXMgYSBzaW5nbGUgcGFnZSB0byBwb2ludCB0byB0aGUgY2h1bmtzLAotYXR0ZW1wdGluZyB0byBzZXQgdGhlIGJ1ZmZlciBjYWNoZSB0byBtb3JlIHRoYW4gMiBNZWdhYnl0ZXMgd291bGQgYmUgdmVyeQotYmFkOyBkb24ndCBkbyB0aGF0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxjbWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc3YWIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmFpbGNtZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotZWNobyAxID4gL3Byb2Mvc2VsZi9tYWtlLWl0LWZhaWwKLWV4ZWMgJCoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2ggYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsbW9kdWxlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRhOGI5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBVc2FnZTogZmFpbG1vZHVsZSA8ZmFpbG5hbWU+IDxtb2R1bGVuYW1lPiBbc3RhY2t0cmFjZS1kZXB0aF0KLSMKLSMJPGZhaWxuYW1lPjogImZhaWxzbGFiIiwgImZhaWxfYWxsb2NfcGFnZSIsIG9yICJmYWlsX21ha2VfcmVxdWVzdCIKLSMKLSMJPG1vZHVsZW5hbWU+OiBtb2R1bGUgbmFtZSB0aGF0IHlvdSB3YW50IHRvIGluamVjdCBmYXVsdHMuCi0jCi0jCVtzdGFja3RyYWNlLWRlcHRoXTogdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrdHJhY2Ugd2Fsa2luZyBhbGxvd2VkCi0jCi0KLVNUQUNLVFJBQ0VfREVQVEg9NQotaWYgWyAkIyAtZ3QgMiBdOyB0aGVuCi0JU1RBQ0tUUkFDRV9ERVBUSD0kMwotZmkKLQotaWYgWyAhIC1kIC9kZWJ1Zy8kMSBdOyB0aGVuCi0JZWNobyAiRmF1bHQtaW5qZWN0aW9uICQxIGRvZXMgbm90IGV4aXN0IiA+JjIKLQlleGl0IDEKLWZpCi1pZiBbICEgLWQgL3N5cy9tb2R1bGUvJDIgXTsgdGhlbgotCWVjaG8gIk1vZHVsZSAkMiBkb2VzIG5vdCBleGlzdCIgPiYyCi0JZXhpdCAxCi1maQotCi0jIERpc2FibGUgYW55IGZhdWx0IGluamVjdGlvbgotZWNobyAwID4gL2RlYnVnLyQxL3N0YWNrdHJhY2UtZGVwdGgKLQotZWNobyBgY2F0IC9zeXMvbW9kdWxlLyQyL3NlY3Rpb25zLy50ZXh0YCA+IC9kZWJ1Zy8kMS9yZXF1aXJlLXN0YXJ0Ci1lY2hvIGBjYXQgL3N5cy9tb2R1bGUvJDIvc2VjdGlvbnMvLmV4aXQudGV4dGAgPiAvZGVidWcvJDEvcmVxdWlyZS1lbmQKLWVjaG8gJFNUQUNLVFJBQ0VfREVQVEggPiAvZGVidWcvJDEvc3RhY2t0cmFjZS1kZXB0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKaW5kZXggYjdjYTU2MC4uNGJjMzc0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CkBAIC0xMDMsNiArMTAzLDExIEBACiAJZGVmYXVsdCBpcyAnTicsIHNldHRpbmcgaXQgdG8gJ1knIHdpbGwgaW5qZWN0IGZhaWx1cmVzCiAJb25seSBpbnRvIG5vbi1zbGVlcCBhbGxvY2F0aW9ucyAoR0ZQX0FUT01JQyBhbGxvY2F0aW9ucykuCiAKKy0gL2RlYnVnL2ZhaWxfcGFnZV9hbGxvYy9taW4tb3JkZXI6CisKKwlzcGVjaWZpZXMgdGhlIG1pbmltdW0gcGFnZSBhbGxvY2F0aW9uIG9yZGVyIHRvIGJlIGluamVjdGVkCisJZmFpbHVyZXMuCisKIG8gQm9vdCBvcHRpb24KIAogSW4gb3JkZXIgdG8gaW5qZWN0IGZhdWx0cyB3aGlsZSBkZWJ1Z2ZzIGlzIG5vdCBhdmFpbGFibGUgKGVhcmx5IGJvb3QgdGltZSksCkBAIC0xNTYsNzAgKzE2MSw3NyBAQAogQXBwbGljYXRpb24gRXhhbXBsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLW8gaW5qZWN0IHNsYWIgYWxsb2NhdGlvbiBmYWlsdXJlcyBpbnRvIG1vZHVsZSBpbml0L2NsZWFudXAgY29kZQorbyBJbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIGludG8gbW9kdWxlIGluaXQvZXhpdCBjb2RlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyEvYmluL2Jhc2gKIAotRkFJTENNRD1Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYWlsY21kLnNoCi1CTEFDS0xJU1Q9InJvb3RfcGx1ZyBldmJ1ZyIKK0ZBSUxUWVBFPWZhaWxzbGFiCitlY2hvIFkgPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAogCi1GQUlMTkFNRT1mYWlsc2xhYgotZWNobyBZID4gL2RlYnVnLyRGQUlMTkFNRS90YXNrLWZpbHRlcgotZWNobyAxMCA+IC9kZWJ1Zy8kRkFJTE5BTUUvcHJvYmFiaWxpdHkKLWVjaG8gMTAwID4gL2RlYnVnLyRGQUlMTkFNRS9pbnRlcnZhbAotZWNobyAtMSA+IC9kZWJ1Zy8kRkFJTE5BTUUvdGltZXMKLWVjaG8gMiA+IC9kZWJ1Zy8kRkFJTE5BTUUvdmVyYm9zZQotZWNobyAxID4gL2RlYnVnLyRGQUlMTkFNRS9pZ25vcmUtZ2ZwLXdhaXQKLQotYmxhY2tsaXN0KCkKK2ZhdWx0eV9zeXN0ZW0oKQogewotCWVjaG8gJEJMQUNLTElTVCB8IGdyZXAgJDEgPiAvZGV2L251bGwgMj4mMQorCWJhc2ggLWMgImVjaG8gMSA+IC9wcm9jL3NlbGYvbWFrZS1pdC1mYWlsICYmIGV4ZWMgJCoiCiB9CiAKLW9vcHMoKQotewotCWRtZXNnIHwgZ3JlcCBCVUcgPiAvZGV2L251bGwgMj4mMQotfQoraWYgWyAkIyAtZXEgMCBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIG1vZHVsZW5hbWUgWyBtb2R1bGVuYW1lIC4uLiBdIgorCWV4aXQgMQorZmkKIAotZmluZCAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCAtbmFtZSAnKi5rbycgLWV4ZWMgYmFzZW5hbWUge30gLmtvIFw7IHwKLQl3aGlsZSByZWFkIGkKLQlkbwotCQlvb3BzICYmIGV4aXQgMQorZm9yIG0gaW4gJCoKK2RvCisJZWNobyBpbnNlcnRpbmcgJG0uLi4KKwlmYXVsdHlfc3lzdGVtIG1vZHByb2JlICRtCiAKLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyBpbnNlcnRpbmcgJGkuLi4KLQkJCWJhc2ggJEZBSUxDTUQgbW9kcHJvYmUgJGkKLQkJZmkKLQlkb25lCi0KLWxzbW9kIHwgYXdrICd7IGlmICgkMyA9PSAwKSB7IHByaW50ICQxIH0gfScgfAotCXdoaWxlIHJlYWQgaQotCWRvCi0JCW9vcHMgJiYgZXhpdCAxCi0KLQkJaWYgISBibGFja2xpc3QgJGkKLQkJdGhlbgotCQkJZWNobyByZW1vdmluZyAkaS4uLgotCQkJYmFzaCAkRkFJTENNRCBtb2Rwcm9iZSAtciAkaQotCQlmaQotCWRvbmUKKwllY2hvIHJlbW92aW5nICRtLi4uCisJZmF1bHR5X3N5c3RlbSBtb2Rwcm9iZSAtciAkbQorZG9uZQogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotbyBpbmplY3Qgc2xhYiBhbGxvY2F0aW9uIGZhaWx1cmVzIG9ubHkgZm9yIGEgc3BlY2lmaWMgbW9kdWxlCitvIEluamVjdCBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZXMgb25seSBmb3IgYSBzcGVjaWZpYyBtb2R1bGUKIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIS9iaW4vYmFzaAogCi1GQUlMTU9EPURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhaWxtb2R1bGUuc2gKK0ZBSUxUWVBFPWZhaWxfcGFnZV9hbGxvYworbW9kdWxlPSQxCiAKLWVjaG8gaW5qZWN0aW5nIGVycm9ycyBpbnRvIHRoZSBtb2R1bGUgJDEuLi4KK2lmIFsgLXogJG1vZHVsZSBdCit0aGVuCisJZWNobyAiVXNhZ2U6ICQwIDxtb2R1bGVuYW1lPiIKKwlleGl0IDEKK2ZpCiAKLW1vZHByb2JlICQxCi1iYXNoICRGQUlMTU9EIGZhaWxzbGFiICQxIDEwCi1lY2hvIDI1ID4gL2RlYnVnL2ZhaWxzbGFiL3Byb2JhYmlsaXR5Cittb2Rwcm9iZSAkbW9kdWxlCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWYgWyAhIC1kIC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMgXQordGhlbgorCWVjaG8gTW9kdWxlICRtb2R1bGUgaXMgbm90IGxvYWRlZAorCWV4aXQgMQorZmkKKworY2F0IC9zeXMvbW9kdWxlLyRtb2R1bGUvc2VjdGlvbnMvLnRleHQgPiAvZGVidWcvJEZBSUxUWVBFL3JlcXVpcmUtc3RhcnQKK2NhdCAvc3lzL21vZHVsZS8kbW9kdWxlL3NlY3Rpb25zLy5kYXRhID4gL2RlYnVnLyRGQUlMVFlQRS9yZXF1aXJlLWVuZAorCitlY2hvIE4gPiAvZGVidWcvJEZBSUxUWVBFL3Rhc2stZmlsdGVyCitlY2hvIDEwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eQorZWNobyAxMDAgPiAvZGVidWcvJEZBSUxUWVBFL2ludGVydmFsCitlY2hvIC0xID4gL2RlYnVnLyRGQUlMVFlQRS90aW1lcworZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9zcGFjZQorZWNobyAyID4gL2RlYnVnLyRGQUlMVFlQRS92ZXJib3NlCitlY2hvIDEgPiAvZGVidWcvJEZBSUxUWVBFL2lnbm9yZS1nZnAtd2FpdAorZWNobyAxID4gL2RlYnVnLyRGQUlMVFlQRS9pZ25vcmUtZ2ZwLWhpZ2htZW0KK2VjaG8gMTAgPiAvZGVidWcvJEZBSUxUWVBFL3N0YWNrdHJhY2UtZGVwdGgKKwordHJhcCAiZWNobyAwID4gL2RlYnVnLyRGQUlMVFlQRS9wcm9iYWJpbGl0eSIgU0lHSU5UIFNJR1RFUk0gRVhJVAorCitlY2hvICJJbmplY3RpbmcgZXJyb3JzIGludG8gdGhlIG1vZHVsZSAkbW9kdWxlLi4uIChpbnRlcnJ1cHQgdG8gc3RvcCkiCitzbGVlcCAxMDAwMDAwCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCAwOTJjNjVkLi5kMDVlNjI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC00MSwxNCArNDEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJUkFXIGRyaXZlciAoQ09ORklHX1JBV19EUklWRVIpCi1XaGVuOglEZWNlbWJlciAyMDA1Ci1XaHk6CWRlY2xhcmVkIG9ic29sZXRlIHNpbmNlIGtlcm5lbCAyLjYuMwotCU9fRElSRUNUIGNhbiBiZSB1c2VkIGluc3RlYWQKLVdobzoJQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJb2xkIE5DUjUzQzl4IGRyaXZlcgogV2hlbjoJT2N0b2JlciAyMDA3CiBXaHk6CVJlcGxhY2VkIGJ5IHRoZSBtdWNoIGJldHRlciBlc3Bfc2NzaSBkcml2ZXIuICBBY3R1YWwgbG93LWxldmVsCkBAIC0xMTksMTMgKzExMSw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OiAgZHJpdmVycyBkZXBlbmRpbmcgb24gT1NTX09CU09MRVRFX0RSSVZFUgotV2hlbjogIG9wdGlvbnMgaW4gMi42LjIwLCBjb2RlIGluIDIuNi4yMgotV2h5OiAgIE9TUyBkcml2ZXJzIHdpdGggQUxTQSByZXBsYWNlbWVudHMKLVdobzogICBBZHJpYW4gQnVuayA8YnVua0BzdHVzdGEuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglVbnVzZWQgRVhQT1JUX1NZTUJPTC9FWFBPUlRfU1lNQk9MX0dQTCBleHBvcnRzCiAJKHRlbXBvcmFyeSB0cmFuc2l0aW9uIGNvbmZpZyBvcHRpb24gcHJvdmlkZWQgdW50aWwgdGhlbikKIAlUaGUgdHJhbnNpdGlvbiBjb25maWcgb3B0aW9uIHdpbGwgYWxzbyBiZSByZW1vdmVkIGF0IHRoZSBzYW1lIHRpbWUuCkBAIC0yNjQsNiArMjQ5LDE0IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OgkndGltZScga2VybmVsIGJvb3QgcGFyYW1ldGVyCitXaGVuOglKYW51YXJ5IDIwMDgKK1doeToJcmVwbGFjZWQgYnkgJ3ByaW50ay50aW1lPTx2YWx1ZT4nIHNvIHRoYXQgcHJpbnRrIHRpbWVzdGFtcHMgY2FuIGJlCisJZW5hYmxlZCBvciBkaXNhYmxlZCBhcyBuZWVkZWQKK1dobzoJUmFuZHkgRHVubGFwIDxyYW5keS5kdW5sYXBAb3JhY2xlLmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6ICBkcml2ZXJzIGRlcGVuZGluZyBvbiBPU1NfT0JTT0xFVEUKIFdoZW46ICBvcHRpb25zIGluIDIuNi4yMywgY29kZSBpbiAyLjYuMjUKIFdoeTogICBvYnNvbGV0ZSBPU1MgZHJpdmVycwpAQCAtMzA0LDMgKzI5NywxNiBAQAogV2hvOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6IFRoZSBhcmNoL3BwYyBhbmQgaW5jbHVkZS9hc20tcHBjIGRpcmVjdG9yaWVzCitXaGVuOiBKdW4gMjAwOAorV2h5OiAgVGhlIGFyY2gvcG93ZXJwYyB0cmVlIGlzIHRoZSBtZXJnZWQgYXJjaGl0ZWN0dXJlIGZvciBwcGMzMiBhbmQgcHBjNjQKKyAgICAgIHBsYXRmb3Jtcy4gIEN1cnJlbnRseSB0aGVyZSBhcmUgZWZmb3J0cyB1bmRlcndheSB0byBwb3J0IHRoZSByZW1haW5pbmcKKyAgICAgIGFyY2gvcHBjIHBsYXRmb3JtcyB0byB0aGUgbWVyZ2VkIHRyZWUuICBOZXcgc3VibWlzc2lvbnMgdG8gdGhlIGFyY2gvcHBjCisgICAgICB0cmVlIGhhdmUgYmVlbiBmcm96ZW4gd2l0aCB0aGUgMi42LjIyIGtlcm5lbCByZWxlYXNlIGFuZCB0aGF0IHRyZWUgd2lsbAorICAgICAgcmVtYWluIGluIGJ1Zy1maXggb25seSBtb2RlIHVudGlsIGl0cyBzY2hlZHVsZWQgcmVtb3ZhbC4gIFBsYXRmb3JtcworICAgICAgdGhhdCBhcmUgbm90IHBvcnRlZCBieSBKdW5lIDIwMDggd2lsbCBiZSByZW1vdmVkIGR1ZSB0byB0aGUgbGFjayBvZiBhbgorICAgICAgaW50ZXJlc3RlZCBtYWludGFpbmVyLgorV2hvOiAgbGludXhwcGMtZGV2QG96bGFicy5vcmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CmluZGV4IGIzNGNkYjUuLmQxYjk4MjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnMudHh0CkBAIC0yMzgsNiArMjM4LDggQEAKIAkJc3RydWN0IGNvbmZpZ19ncm91cCAqKCptYWtlX2dyb3VwKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCQlpbnQgKCpjb21taXRfaXRlbSkoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKKwkJdm9pZCAoKmRpc2Nvbm5lY3Rfbm90aWZ5KShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKKwkJCQkJICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogCQl2b2lkICgqZHJvcF9pdGVtKShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkgIHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CiAJfTsKQEAgLTI2OCw2ICsyNzAsMTYgQEAKIGZvciB0aGUgaXRlbSB0byBhY3R1YWxseSBkaXNhcHBlYXIgZnJvbSB0aGUgc3Vic3lzdGVtJ3MgdXNhZ2UuICBCdXQgaXQKIGlzIGdvbmUgZnJvbSBjb25maWdmcy4KIAorV2hlbiBkcm9wX2l0ZW0oKSBpcyBjYWxsZWQsIHRoZSBpdGVtJ3MgbGlua2FnZSBoYXMgYWxyZWFkeSBiZWVuIHRvcm4KK2Rvd24uICBJdCBubyBsb25nZXIgaGFzIGEgcmVmZXJlbmNlIG9uIGl0cyBwYXJlbnQgYW5kIGhhcyBubyBwbGFjZSBpbgordGhlIGl0ZW0gaGllcmFyY2h5LiAgSWYgYSBjbGllbnQgbmVlZHMgdG8gZG8gc29tZSBjbGVhbnVwIGJlZm9yZSB0aGlzCit0ZWFyZG93biBoYXBwZW5zLCB0aGUgc3Vic3lzdGVtIGNhbiBpbXBsZW1lbnQgdGhlCitjdF9ncm91cF9vcHMtPmRpc2Nvbm5lY3Rfbm90aWZ5KCkgbWV0aG9kLiAgVGhlIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIKK2NvbmZpZ2ZzIGhhcyByZW1vdmVkIHRoZSBpdGVtIGZyb20gdGhlIGZpbGVzeXN0ZW0gdmlldyBidXQgYmVmb3JlIHRoZQoraXRlbSBpcyByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBncm91cC4gIExpa2UgZHJvcF9pdGVtKCksCitkaXNjb25uZWN0X25vdGlmeSgpIGlzIHZvaWQgYW5kIGNhbm5vdCBmYWlsLiAgQ2xpZW50IHN1YnN5c3RlbXMgc2hvdWxkCitub3QgZHJvcCBhbnkgcmVmZXJlbmNlcyBoZXJlLCBhcyB0aGV5IHN0aWxsIG11c3QgZG8gaXQgaW4gZHJvcF9pdGVtKCkuCisKIEEgY29uZmlnX2dyb3VwIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGl0IHN0aWxsIGhhcyBjaGlsZCBpdGVtcy4gIFRoaXMKIGlzIGltcGxlbWVudGVkIGluIHRoZSBjb25maWdmcyBybWRpcigyKSBjb2RlLiAgLT5kcm9wX2l0ZW0oKSB3aWxsIG5vdCBiZQogY2FsbGVkLCBhcyB0aGUgaXRlbSBoYXMgbm90IGJlZW4gZHJvcHBlZC4gIHJtZGlyKDIpIHdpbGwgZmFpbCwgYXMgdGhlCkBAIC0yODAsMTggKzI5MiwxOCBAQAogCiAJc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CiAJCXN0cnVjdCBjb25maWdfZ3JvdXAJc3VfZ3JvdXA7Ci0JCXN0cnVjdCBzZW1hcGhvcmUJc3Vfc2VtOworCQlzdHJ1Y3QgbXV0ZXgJCXN1X211dGV4OwogCX07CiAKIAlpbnQgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiAJdm9pZCBjb25maWdmc191bnJlZ2lzdGVyX3N1YnN5c3RlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMpOwogCi0JQSBzdWJzeXN0ZW0gY29uc2lzdHMgb2YgYSB0b3BsZXZlbCBjb25maWdfZ3JvdXAgYW5kIGEgc2VtYXBob3JlLgorCUEgc3Vic3lzdGVtIGNvbnNpc3RzIG9mIGEgdG9wbGV2ZWwgY29uZmlnX2dyb3VwIGFuZCBhIG11dGV4LgogVGhlIGdyb3VwIGlzIHdoZXJlIGNoaWxkIGNvbmZpZ19pdGVtcyBhcmUgY3JlYXRlZC4gIEZvciBhIHN1YnN5c3RlbSwKIHRoaXMgZ3JvdXAgaXMgdXN1YWxseSBkZWZpbmVkIHN0YXRpY2FsbHkuICBCZWZvcmUgY2FsbGluZwogY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKCksIHRoZSBzdWJzeXN0ZW0gbXVzdCBoYXZlIGluaXRpYWxpemVkIHRoZQogZ3JvdXAgdmlhIHRoZSB1c3VhbCBncm91cCBfaW5pdCgpIGZ1bmN0aW9ucywgYW5kIGl0IG11c3QgYWxzbyBoYXZlCi1pbml0aWFsaXplZCB0aGUgc2VtYXBob3JlLgoraW5pdGlhbGl6ZWQgdGhlIG11dGV4LgogCVdoZW4gdGhlIHJlZ2lzdGVyIGNhbGwgcmV0dXJucywgdGhlIHN1YnN5c3RlbSBpcyBsaXZlLCBhbmQgaXQKIHdpbGwgYmUgdmlzaWJsZSB2aWEgY29uZmlnZnMuICBBdCB0aGF0IHBvaW50LCBta2RpcigyKSBjYW4gYmUgY2FsbGVkIGFuZAogdGhlIHN1YnN5c3RlbSBtdXN0IGJlIHJlYWR5IGZvciBpdC4KQEAgLTMwMyw3ICszMTUsNyBAQAogc2hvd3MgYSB0cml2aWFsIG9iamVjdCBkaXNwbGF5aW5nIGFuZCBzdG9yaW5nIGFuIGF0dHJpYnV0ZSwgYW5kIGEgc2ltcGxlCiBncm91cCBjcmVhdGluZyBhbmQgZGVzdHJveWluZyB0aGVzZSBjaGlsZHJlbi4KIAotW0hpZXJhcmNoeSBOYXZpZ2F0aW9uIGFuZCB0aGUgU3Vic3lzdGVtIFNlbWFwaG9yZV0KK1tIaWVyYXJjaHkgTmF2aWdhdGlvbiBhbmQgdGhlIFN1YnN5c3RlbSBNdXRleF0KIAogVGhlcmUgaXMgYW4gZXh0cmEgYm9udXMgdGhhdCBjb25maWdmcyBwcm92aWRlcy4gIFRoZSBjb25maWdfZ3JvdXBzIGFuZAogY29uZmlnX2l0ZW1zIGFyZSBhcnJhbmdlZCBpbiBhIGhpZXJhcmNoeSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGV5CkBAIC0zMTQsMTkgKzMyNiwxOSBAQAogCiBBIHN1YnN5c3RlbSBjYW4gbmF2aWdhdGUgdGhlIGNnX2NoaWxkcmVuIGxpc3QgYW5kIHRoZSBjaV9wYXJlbnQgcG9pbnRlcgogdG8gc2VlIHRoZSB0cmVlIGNyZWF0ZWQgYnkgdGhlIHN1YnN5c3RlbS4gIFRoaXMgY2FuIHJhY2Ugd2l0aCBjb25maWdmcycKLW1hbmFnZW1lbnQgb2YgdGhlIGhpZXJhcmNoeSwgc28gY29uZmlnZnMgdXNlcyB0aGUgc3Vic3lzdGVtIHNlbWFwaG9yZSB0bworbWFuYWdlbWVudCBvZiB0aGUgaGllcmFyY2h5LCBzbyBjb25maWdmcyB1c2VzIHRoZSBzdWJzeXN0ZW0gbXV0ZXggdG8KIHByb3RlY3QgbW9kaWZpY2F0aW9ucy4gIFdoZW5ldmVyIGEgc3Vic3lzdGVtIHdhbnRzIHRvIG5hdmlnYXRlIHRoZQogaGllcmFyY2h5LCBpdCBtdXN0IGRvIHNvIHVuZGVyIHRoZSBwcm90ZWN0aW9uIG9mIHRoZSBzdWJzeXN0ZW0KLXNlbWFwaG9yZS4KK211dGV4LgogCi1BIHN1YnN5c3RlbSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGFjcXVpcmluZyB0aGUgc2VtYXBob3JlIHdoaWxlIGEgbmV3bHkKK0Egc3Vic3lzdGVtIHdpbGwgYmUgcHJldmVudGVkIGZyb20gYWNxdWlyaW5nIHRoZSBtdXRleCB3aGlsZSBhIG5ld2x5CiBhbGxvY2F0ZWQgaXRlbSBoYXMgbm90IGJlZW4gbGlua2VkIGludG8gdGhpcyBoaWVyYXJjaHkuICAgU2ltaWxhcmx5LCBpdAotd2lsbCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKK3dpbGwgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbXV0ZXggd2hpbGUgYSBkcm9wcGluZyBpdGVtIGhhcyBub3QKIHlldCBiZWVuIHVubGlua2VkLiAgVGhpcyBtZWFucyB0aGF0IGFuIGl0ZW0ncyBjaV9wYXJlbnQgcG9pbnRlciB3aWxsCiBuZXZlciBiZSBOVUxMIHdoaWxlIHRoZSBpdGVtIGlzIGluIGNvbmZpZ2ZzLCBhbmQgdGhhdCBhbiBpdGVtIHdpbGwgb25seQogYmUgaW4gaXRzIHBhcmVudCdzIGNnX2NoaWxkcmVuIGxpc3QgZm9yIHRoZSBzYW1lIGR1cmF0aW9uLiAgVGhpcyBhbGxvd3MKIGEgc3Vic3lzdGVtIHRvIHRydXN0IGNpX3BhcmVudCBhbmQgY2dfY2hpbGRyZW4gd2hpbGUgdGhleSBob2xkIHRoZQotc2VtYXBob3JlLgorbXV0ZXguCiAKIFtJdGVtIEFnZ3JlZ2F0aW9uIFZpYSBzeW1saW5rKDIpXQogCkBAIC0zODYsNiArMzk4LDMzIEBACiBybWRpcigyKS4gIFRoZXkgYWxzbyBhcmUgbm90IGNvbnNpZGVyZWQgd2hlbiBybWRpcigyKSBvbiB0aGUgcGFyZW50CiBncm91cCBpcyBjaGVja2luZyBmb3IgY2hpbGRyZW4uCiAKK1tEZXBlbmRhbnQgU3Vic3lzdGVtc10KKworU29tZXRpbWVzIG90aGVyIGRyaXZlcnMgZGVwZW5kIG9uIHBhcnRpY3VsYXIgY29uZmlnZnMgaXRlbXMuICBGb3IKK2V4YW1wbGUsIG9jZnMyIG1vdW50cyBkZXBlbmQgb24gYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBJZiB0aGF0CityZWdpb24gaXRlbSBpcyByZW1vdmVkIHdpdGggcm1kaXIoMiksIHRoZSBvY2ZzMiBtb3VudCBtdXN0IEJVRyBvciBnbworcmVhZG9ubHkuICBOb3QgaGFwcHkuCisKK2NvbmZpZ2ZzIHByb3ZpZGVzIHR3byBhZGRpdGlvbmFsIEFQSSBjYWxsczogY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBhbmQKK2NvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oKS4gIEEgY2xpZW50IGRyaXZlciBjYW4gY2FsbAorY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBvbiBhbiBleGlzdGluZyBpdGVtIHRvIHRlbGwgY29uZmlnZnMgdGhhdCBpdCBpcworZGVwZW5kZWQgb24uICBjb25maWdmcyB3aWxsIHRoZW4gcmV0dXJuIC1FQlVTWSBmcm9tIHJtZGlyKDIpIGZvciB0aGF0CitpdGVtLiAgV2hlbiB0aGUgaXRlbSBpcyBubyBsb25nZXIgZGVwZW5kZWQgb24sIHRoZSBjbGllbnQgZHJpdmVyIGNhbGxzCitjb25maWdmc191bmRlcGVuZF9pdGVtKCkgb24gaXQuCisKK1RoZXNlIEFQSSBjYW5ub3QgYmUgY2FsbGVkIHVuZGVybmVhdGggYW55IGNvbmZpZ2ZzIGNhbGxiYWNrcywgYXMKK3RoZXkgd2lsbCBjb25mbGljdC4gIFRoZXkgY2FuIGJsb2NrIGFuZCBhbGxvY2F0ZS4gIEEgY2xpZW50IGRyaXZlcgorcHJvYmFibHkgc2hvdWxkbid0IGNhbGxpbmcgdGhlbSBvZiBpdHMgb3duIGd1bXB0aW9uLiAgUmF0aGVyIGl0IHNob3VsZAorYmUgcHJvdmlkaW5nIGFuIEFQSSB0aGF0IGV4dGVybmFsIHN1YnN5c3RlbXMgY2FsbC4KKworSG93IGRvZXMgdGhpcyB3b3JrPyAgSW1hZ2luZSB0aGUgb2NmczIgbW91bnQgcHJvY2Vzcy4gIFdoZW4gaXQgbW91bnRzLAoraXQgYXNrcyBmb3IgYSBoZWFydGJlYXQgcmVnaW9uIGl0ZW0uICBUaGlzIGlzIGRvbmUgdmlhIGEgY2FsbCBpbnRvIHRoZQoraGVhcnRiZWF0IGNvZGUuICBJbnNpZGUgdGhlIGhlYXJ0YmVhdCBjb2RlLCB0aGUgcmVnaW9uIGl0ZW0gaXMgbG9va2VkCit1cC4gIEhlcmUsIHRoZSBoZWFydGJlYXQgY29kZSBjYWxscyBjb25maWdmc19kZXBlbmRfaXRlbSgpLiAgSWYgaXQKK3N1Y2NlZWRzLCB0aGVuIGhlYXJ0YmVhdCBrbm93cyB0aGUgcmVnaW9uIGlzIHNhZmUgdG8gZ2l2ZSB0byBvY2ZzMi4KK0lmIGl0IGZhaWxzLCBpdCB3YXMgYmVpbmcgdG9ybiBkb3duIGFueXdheSwgYW5kIGhlYXJ0YmVhdCBjYW4gZ3JhY2VmdWxseQorcGFzcyB1cCBhbiBlcnJvci4KKwogW0NvbW1pdHRhYmxlIEl0ZW1zXQogCiBOT1RFOiBDb21taXR0YWJsZSBpdGVtcyBhcmUgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2V4YW1wbGUuYyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCmluZGV4IDJkNmExNGEuLmU1NmQ0OTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29uZmlnZnMvY29uZmlnZnNfZXhhbXBsZS5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAkJc3Vic3lzID0gZXhhbXBsZV9zdWJzeXNbaV07CiAKIAkJY29uZmlnX2dyb3VwX2luaXQoJnN1YnN5cy0+c3VfZ3JvdXApOwotCQlpbml0X01VVEVYKCZzdWJzeXMtPnN1X3NlbSk7CisJCW11dGV4X2luaXQoJnN1YnN5cy0+c3VfbXV0ZXgpOwogCQlyZXQgPSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oc3Vic3lzKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSByZWdpc3RlcmluZyBzdWJzeXN0ZW0gJXNcbiIsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZWNyeXB0ZnMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2VjcnlwdGZzLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9lY3J5cHRmcy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CmluZGV4IDg3NTZhMDcuLmViZmZkZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTcxLDcgKzE3MSw5IEBACiBUaGlzIHNob3dzIHlvdSBuZWFybHkgdGhlIHNhbWUgaW5mb3JtYXRpb24geW91IHdvdWxkIGdldCBpZiB5b3Ugdmlld2VkIGl0IHdpdGgKIHRoZSBwcyAgY29tbWFuZC4gIEluICBmYWN0LCAgcHMgIHVzZXMgIHRoZSAgcHJvYyAgZmlsZSAgc3lzdGVtICB0byAgb2J0YWluIGl0cwogaW5mb3JtYXRpb24uIFRoZSAgc3RhdG0gIGZpbGUgIGNvbnRhaW5zICBtb3JlICBkZXRhaWxlZCAgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi1wcm9jZXNzIG1lbW9yeSB1c2FnZS4gSXRzIHNldmVuIGZpZWxkcyBhcmUgZXhwbGFpbmVkIGluIFRhYmxlIDEtMi4KK3Byb2Nlc3MgbWVtb3J5IHVzYWdlLiBJdHMgc2V2ZW4gZmllbGRzIGFyZSBleHBsYWluZWQgaW4gVGFibGUgMS0yLiAgVGhlIHN0YXQKK2ZpbGUgY29udGFpbnMgZGV0YWlscyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvY2VzcyBpdHNlbGYuICBJdHMgZmllbGRzIGFyZQorZXhwbGFpbmVkIGluIFRhYmxlIDEtMy4KIAogCiBUYWJsZSAxLTI6IENvbnRlbnRzIG9mIHRoZSBzdGF0bSBmaWxlcyAoYXMgb2YgMi42LjgtcmMzKQpAQCAtMTg4LDE2ICsxOTAsNjUgQEAKICBkdCAgICAgICBudW1iZXIgb2YgZGlydHkgcGFnZXMJCQkoYWx3YXlzIDAgb24gMi42KQogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKKworVGFibGUgMS0zOiBDb250ZW50cyBvZiB0aGUgc3RhdCBmaWxlcyAoYXMgb2YgMi42LjIyLXJjMykKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorIEZpZWxkICAgICAgICAgIENvbnRlbnQKKyAgcGlkICAgICAgICAgICBwcm9jZXNzIGlkCisgIHRjb21tICAgICAgICAgZmlsZW5hbWUgb2YgdGhlIGV4ZWN1dGFibGUKKyAgc3RhdGUgICAgICAgICBzdGF0ZSAoUiBpcyBydW5uaW5nLCBTIGlzIHNsZWVwaW5nLCBEIGlzIHNsZWVwaW5nIGluIGFuCisgICAgICAgICAgICAgICAgdW5pbnRlcnJ1cHRpYmxlIHdhaXQsIFogaXMgem9tYmllLCBUIGlzIHRyYWNlZCBvciBzdG9wcGVkKQorICBwcGlkICAgICAgICAgIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzCisgIHBncnAgICAgICAgICAgcGdycCBvZiB0aGUgcHJvY2VzcworICBzaWQgICAgICAgICAgIHNlc3Npb24gaWQKKyAgdHR5X25yICAgICAgICB0dHkgdGhlIHByb2Nlc3MgdXNlcworICB0dHlfcGdycCAgICAgIHBncnAgb2YgdGhlIHR0eQorICBmbGFncyAgICAgICAgIHRhc2sgZmxhZ3MKKyAgbWluX2ZsdCAgICAgICBudW1iZXIgb2YgbWlub3IgZmF1bHRzCisgIGNtaW5fZmx0ICAgICAgbnVtYmVyIG9mIG1pbm9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgbWFqX2ZsdCAgICAgICBudW1iZXIgb2YgbWFqb3IgZmF1bHRzCisgIGNtYWpfZmx0ICAgICAgbnVtYmVyIG9mIG1ham9yIGZhdWx0cyB3aXRoIGNoaWxkJ3MKKyAgdXRpbWUgICAgICAgICB1c2VyIG1vZGUgamlmZmllcworICBzdGltZSAgICAgICAgIGtlcm5lbCBtb2RlIGppZmZpZXMKKyAgY3V0aW1lICAgICAgICB1c2VyIG1vZGUgamlmZmllcyB3aXRoIGNoaWxkJ3MKKyAgY3N0aW1lICAgICAgICBrZXJuZWwgbW9kZSBqaWZmaWVzIHdpdGggY2hpbGQncworICBwcmlvcml0eSAgICAgIHByaW9yaXR5IGxldmVsCisgIG5pY2UgICAgICAgICAgbmljZSBsZXZlbAorICBudW1fdGhyZWFkcyAgIG51bWJlciBvZiB0aHJlYWRzCisgIHN0YXJ0X3RpbWUgICAgdGltZSB0aGUgcHJvY2VzcyBzdGFydGVkIGFmdGVyIHN5c3RlbSBib290CisgIHZzaXplICAgICAgICAgdmlydHVhbCBtZW1vcnkgc2l6ZQorICByc3MgICAgICAgICAgIHJlc2lkZW50IHNldCBtZW1vcnkgc2l6ZQorICByc3NsaW0gICAgICAgIGN1cnJlbnQgbGltaXQgaW4gYnl0ZXMgb24gdGhlIHJzcworICBzdGFydF9jb2RlICAgIGFkZHJlc3MgYWJvdmUgd2hpY2ggcHJvZ3JhbSB0ZXh0IGNhbiBydW4KKyAgZW5kX2NvZGUgICAgICBhZGRyZXNzIGJlbG93IHdoaWNoIHByb2dyYW0gdGV4dCBjYW4gcnVuCisgIHN0YXJ0X3N0YWNrICAgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrCisgIGVzcCAgICAgICAgICAgY3VycmVudCB2YWx1ZSBvZiBFU1AKKyAgZWlwICAgICAgICAgICBjdXJyZW50IHZhbHVlIG9mIEVJUAorICBwZW5kaW5nICAgICAgIGJpdG1hcCBvZiBwZW5kaW5nIHNpZ25hbHMgKG9ic29sZXRlKQorICBibG9ja2VkICAgICAgIGJpdG1hcCBvZiBibG9ja2VkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdpZ24gICAgICAgIGJpdG1hcCBvZiBpZ25vcmVkIHNpZ25hbHMgKG9ic29sZXRlKQorICBzaWdjYXRjaCAgICAgIGJpdG1hcCBvZiBjYXRjaGVkIHNpZ25hbHMgKG9ic29sZXRlKQorICB3Y2hhbiAgICAgICAgIGFkZHJlc3Mgd2hlcmUgcHJvY2VzcyB3ZW50IHRvIHNsZWVwCisgIDAgICAgICAgICAgICAgKHBsYWNlIGhvbGRlcikKKyAgMCAgICAgICAgICAgICAocGxhY2UgaG9sZGVyKQorICBleGl0X3NpZ25hbCAgIHNpZ25hbCB0byBzZW5kIHRvIHBhcmVudCB0aHJlYWQgb24gZXhpdAorICB0YXNrX2NwdSAgICAgIHdoaWNoIENQVSB0aGUgdGFzayBpcyBzY2hlZHVsZWQgb24KKyAgcnRfcHJpb3JpdHkgICByZWFsdGltZSBwcmlvcml0eQorICBwb2xpY3kgICAgICAgIHNjaGVkdWxpbmcgcG9saWN5IChtYW4gc2NoZWRfc2V0c2NoZWR1bGVyKQorICBibGtpb190aWNrcyAgIHRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYmxvY2sgSU8KKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCisKIDEuMiBLZXJuZWwgZGF0YQogLS0tLS0tLS0tLS0tLS0tCiAKIFNpbWlsYXIgdG8gIHRoZSAgcHJvY2VzcyBlbnRyaWVzLCB0aGUga2VybmVsIGRhdGEgZmlsZXMgZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dAogdGhlIHJ1bm5pbmcga2VybmVsLiBUaGUgZmlsZXMgdXNlZCB0byBvYnRhaW4gdGhpcyBpbmZvcm1hdGlvbiBhcmUgY29udGFpbmVkIGluCi0vcHJvYyBhbmQgIGFyZSAgbGlzdGVkICBpbiBUYWJsZSAxLTMuIE5vdCBhbGwgb2YgdGhlc2Ugd2lsbCBiZSBwcmVzZW50IGluIHlvdXIKKy9wcm9jIGFuZCAgYXJlICBsaXN0ZWQgIGluIFRhYmxlIDEtNC4gTm90IGFsbCBvZiB0aGVzZSB3aWxsIGJlIHByZXNlbnQgaW4geW91cgogc3lzdGVtLiBJdCAgZGVwZW5kcyAgb24gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGFuZCB0aGUgbG9hZGVkIG1vZHVsZXMsIHdoaWNoCiBmaWxlcyBhcmUgdGhlcmUsIGFuZCB3aGljaCBhcmUgbWlzc2luZy4KIAotVGFibGUgMS0zOiBLZXJuZWwgaW5mbyBpbiAvcHJvYyAKK1RhYmxlIDEtNDogS2VybmVsIGluZm8gaW4gL3Byb2MKIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIEZpbGUgICAgICAgIENvbnRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgYXBtICAgICAgICAgQWR2YW5jZWQgcG93ZXIgbWFuYWdlbWVudCBpbmZvICAgICAgICAgICAgICAgICAgICAKQEAgLTQ3MywxMCArNTI0LDEwIEBACiAKIE1vcmUgZGV0YWlsZWQgIGluZm9ybWF0aW9uICBjYW4gIGJlICBmb3VuZCAgaW4gIHRoZSAgY29udHJvbGxlciAgc3BlY2lmaWMKIHN1YmRpcmVjdG9yaWVzLiBUaGVzZSAgYXJlICBuYW1lZCAgaWRlMCwgIGlkZTEgIGFuZCAgc28gIG9uLiAgRWFjaCAgb2YgIHRoZXNlCi1kaXJlY3RvcmllcyBjb250YWlucyB0aGUgZmlsZXMgc2hvd24gaW4gdGFibGUgMS00LgorZGlyZWN0b3JpZXMgY29udGFpbnMgdGhlIGZpbGVzIHNob3duIGluIHRhYmxlIDEtNS4KIAogCi1UYWJsZSAxLTQ6IElERSBjb250cm9sbGVyIGluZm8gaW4gIC9wcm9jL2lkZS9pZGU/IAorVGFibGUgMS01OiBJREUgY29udHJvbGxlciBpbmZvIGluICAvcHJvYy9pZGUvaWRlPwogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2hhbm5lbCBJREUgY2hhbm5lbCAoMCBvciAxKSAgICAgICAgICAgICAgICAgICAgCkBAIC00ODYsMTEgKzUzNywxMSBAQAogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAKIEVhY2ggZGV2aWNlICBjb25uZWN0ZWQgIHRvICBhICBjb250cm9sbGVyICBoYXMgIGEgc2VwYXJhdGUgc3ViZGlyZWN0b3J5IGluIHRoZQotY29udHJvbGxlcnMgZGlyZWN0b3J5LiAgVGhlICBmaWxlcyAgbGlzdGVkIGluIHRhYmxlIDEtNSBhcmUgY29udGFpbmVkIGluIHRoZXNlCitjb250cm9sbGVycyBkaXJlY3RvcnkuICBUaGUgIGZpbGVzICBsaXN0ZWQgaW4gdGFibGUgMS02IGFyZSBjb250YWluZWQgaW4gdGhlc2UKIGRpcmVjdG9yaWVzLgogCiAKLVRhYmxlIDEtNTogSURFIGRldmljZSBpbmZvcm1hdGlvbiAKK1RhYmxlIDEtNjogSURFIGRldmljZSBpbmZvcm1hdGlvbgogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgRmlsZSAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgY2FjaGUgICAgICAgICAgICBUaGUgY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0xMjk3LDYgKzEzNDgsMjEgQEAKIGh1Z2V0bGJfc2htX2dyb3VwIGNvbnRhaW5zIGdyb3VwIGlkIHRoYXQgaXMgYWxsb3dlZCB0byBjcmVhdGUgU3lzViBzaGFyZWQKIG1lbW9yeSBzZWdtZW50IHVzaW5nIGh1Z2V0bGIgcGFnZS4KIAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZnVsIHdoZW4ga2VybmVsY29yZT0gaXMgc3BlY2lmaWVkIGF0IGJvb3QgdGltZSB0bworY3JlYXRlIFpPTkVfTU9WQUJMRSBmb3IgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1pZ3JhdGVkLiBIdWdlIHBhZ2VzCithcmUgbm90IG1vdmFibGUgc28gYXJlIG5vdCBub3JtYWxseSBhbGxvY2F0ZWQgZnJvbSBaT05FX01PVkFCTEUuIEEgbm9uLXplcm8KK3ZhbHVlIHdyaXR0ZW4gdG8gaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUgYWxsb3dzIGh1Z2UgcGFnZXMgdG8gYmUgYWxsb2NhdGVkCitmcm9tIFpPTkVfTU9WQUJMRS4KKworT25jZSBlbmFibGVkLCB0aGUgWk9ORV9NT1ZBQkxFIGlzIHRyZWF0ZWQgYXMgYW4gYXJlYSBvZiBtZW1vcnkgdGhlIGh1Z2UKK3BhZ2VzIHBvb2wgY2FuIGVhc2lseSBncm93IG9yIHNocmluayB3aXRoaW4uIEFzc3VtaW5nIHRoYXQgYXBwbGljYXRpb25zIGFyZQorbm90IHJ1bm5pbmcgdGhhdCBtbG9jaygpIGEgbG90IG9mIG1lbW9yeSwgaXQgaXMgbGlrZWx5IHRoZSBodWdlIHBhZ2VzIHBvb2wKK2NhbiBncm93IHRvIHRoZSBzaXplIG9mIFpPTkVfTU9WQUJMRSBieSByZXBlYXRlZGx5IGVudGVyaW5nIHRoZSBkZXNpcmVkIHZhbHVlCitpbnRvIG5yX2h1Z2VwYWdlcyBhbmQgdHJpZ2dlcmluZyBwYWdlIHJlY2xhaW0uCisKIGxhcHRvcF9tb2RlCiAtLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKaW5kZXggYTQ3Y2M4MS4uMDQ1ZjNlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dApAQCAtMyw3ICszLDcgQEAKIAogCU9yaWdpbmFsIGF1dGhvcjogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CiAKLQkJICBMYXN0IHVwZGF0ZWQgb24gT2N0b2JlciAyOCwgMjAwNQorCQkgIExhc3QgdXBkYXRlZCBvbiBKdW5lIDI0LCAyMDA3LgogCiAgIENvcHlyaWdodCAoQykgMTk5OSBSaWNoYXJkIEdvb2NoCiAgIENvcHlyaWdodCAoQykgMjAwNSBQZWtrYSBFbmJlcmcKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVRoaXMgZGVzY3JpYmVzIHRoZSBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjEzLCB0aGUgZm9sbG93aW5nCitUaGlzIGRlc2NyaWJlcyB0aGUgZmlsZXN5c3RlbS4gQXMgb2Yga2VybmVsIDIuNi4yMiwgdGhlIGZvbGxvd2luZwogbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewpAQCAtMTE5LDYgKzExOSw4IEBACiAgICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyOwogICAgICAgICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIG5leHQ7CiAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZnNfc3VwZXJzOworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX2xvY2tfa2V5OworCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBzX3Vtb3VudF9rZXk7CiB9OwogCiAgIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGUsIHN1Y2ggYXMgImV4dDIiLCAiaXNvOTY2MCIsCkBAIC0xMzcsMTEgKzEzOSwxMiBAQAogCiAgIG5leHQ6IGZvciBpbnRlcm5hbCBWRlMgdXNlOiB5b3Ugc2hvdWxkIGluaXRpYWxpemUgdGhpcyB0byBOVUxMCiAKKyAgc19sb2NrX2tleSwgc191bW91bnRfa2V5OiBsb2NrZGVwLXNwZWNpZmljCisKIFRoZSBnZXRfc2IoKSBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogCi0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2I6IHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4gVGhpcyBpcyBwYXJ0aWFsbHkKLQlpbml0aWFsaXplZCBieSB0aGUgVkZTIGFuZCB0aGUgcmVzdCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IHRoZQotCWdldF9zYigpIG1ldGhvZAorICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZTogZGVjcmliZXMgdGhlIGZpbGVzeXN0ZW0sIHBhcnRseSBpbml0aWFsaXplZAorICAJYnkgdGhlIHNwZWNpZmljIGZpbGVzeXN0ZW0gY29kZQogCiAgIGludCBmbGFnczogbW91bnQgZmxhZ3MKIApAQCAtMTUwLDEyICsxNTMsMTMgQEAKICAgdm9pZCAqZGF0YTogYXJiaXRyYXJ5IG1vdW50IG9wdGlvbnMsIHVzdWFsbHkgY29tZXMgYXMgYW4gQVNDSUkKIAlzdHJpbmcKIAotICBpbnQgc2lsZW50OiB3aGV0aGVyIG9yIG5vdCB0byBiZSBzaWxlbnQgb24gZXJyb3IKKyAgc3RydWN0IHZmc21vdW50ICptbnQ6IGEgdmZzLWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbW91bnQgcG9pbnQKIAogVGhlIGdldF9zYigpIG1ldGhvZCBtdXN0IGRldGVybWluZSBpZiB0aGUgYmxvY2sgZGV2aWNlIHNwZWNpZmllZAotaW4gdGhlIHN1cGVyYmxvY2sgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKLXN1cHBvcnRzLiBPbiBzdWNjZXNzIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc3VwZXJibG9jayBwb2ludGVyLCBvbgotZmFpbHVyZSBpdCByZXR1cm5zIE5VTEwuCitpbiB0aGUgZGV2X25hbWUgYW5kIGZzX3R5cGUgY29udGFpbnMgYSBmaWxlc3lzdGVtIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QKK3N1cHBvcnRzLiBJZiBpdCBzdWNjZWVkcyBpbiBvcGVuaW5nIHRoZSBuYW1lZCBibG9jayBkZXZpY2UsIGl0IGluaXRpYWxpemVzIGEKK3N0cnVjdCBzdXBlcl9ibG9jayBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZXN5c3RlbSBjb250YWluZWQgYnkgdGhlIGJsb2NrIGRldmljZS4KK09uIGZhaWx1cmUgaXQgcmV0dXJucyBhbiBlcnJvci4KIAogVGhlIG1vc3QgaW50ZXJlc3RpbmcgbWVtYmVyIG9mIHRoZSBzdXBlcmJsb2NrIHN0cnVjdHVyZSB0aGF0IHRoZQogZ2V0X3NiKCkgbWV0aG9kIGZpbGxzIGluIGlzIHRoZSAic19vcCIgZmllbGQuIFRoaXMgaXMgYSBwb2ludGVyIHRvCkBAIC0xOTMsNyArMTk3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIHRoZSBzdXBlcmJsb2NrIG9mIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgewogICAgICAgICBzdHJ1Y3QgaW5vZGUgKigqYWxsb2NfaW5vZGUpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMjE2LDggKzIyMCw2IEBACiAgICAgICAgIHZvaWQgKCpjbGVhcl9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKICAgICAgICAgdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAotICAgICAgICB2b2lkICgqc3luY19pbm9kZXMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAgICAgICAgIGludCAoKnNob3dfb3B0aW9ucykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAogICAgICAgICBzc2l6ZV90ICgqcXVvdGFfcmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CkBAIC0zMDAsOSArMzAyLDYgQEAKIAogICB1bW91bnRfYmVnaW46IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgdW5tb3VudGluZyBhIGZpbGVzeXN0ZW0uCiAKLSAgc3luY19pbm9kZXM6IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgd3JpdGluZyBvdXQgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGgKLSAgCWEgc3VwZXJibG9jay4KLQogICBzaG93X29wdGlvbnM6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHNob3cgbW91bnQgb3B0aW9ucyBmb3IgL3Byb2MvPHBpZD4vbW91bnRzLgogCiAgIHF1b3RhX3JlYWQ6IGNhbGxlZCBieSB0aGUgVkZTIHRvIHJlYWQgZnJvbSBmaWxlc3lzdGVtIHF1b3RhIGZpbGUuCkBAIC0zMjQsNyArMzIzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIGlub2RlIGluIHlvdXIKLWZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMTMsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKK2ZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgewogCWludCAoKmNyZWF0ZSkgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CkBAIC0zNDgsNiArMzQ3LDcgQEAKIAlzc2l6ZV90ICgqZ2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOwogCXNzaXplX3QgKCpsaXN0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKIAlpbnQgKCpyZW1vdmV4YXR0cikgKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKwl2b2lkICgqdHJ1bmNhdGVfcmFuZ2UpKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QsIGxvZmZfdCk7CiB9OwogCiBBZ2FpbiwgYWxsIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrcyBiZWluZyBoZWxkLCB1bmxlc3MKQEAgLTQ0NCw2ICs0NDQsOSBAQAogICByZW1vdmV4YXR0cjogY2FsbGVkIGJ5IHRoZSBWRlMgdG8gcmVtb3ZlIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBmcm9tCiAgIAlhIGZpbGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSByZW1vdmV4YXR0cigyKSBzeXN0ZW0gY2FsbC4KIAorICB0cnVuY2F0ZV9yYW5nZTogYSBtZXRob2QgcHJvdmlkZWQgYnkgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSB0byB0cnVuY2F0ZSBhCisgIAlyYW5nZSBvZiBibG9ja3MgLCBpLmUuIHB1bmNoIGEgaG9sZSBzb21ld2hlcmUgaW4gYSBmaWxlLgorCiAKIFRoZSBBZGRyZXNzIFNwYWNlIE9iamVjdAogPT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MjIsNyArNTI1LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBkZXNjcmliZXMgaG93IHRoZSBWRlMgY2FuIG1hbmlwdWxhdGUgbWFwcGluZyBvZiBhIGZpbGUgdG8gcGFnZSBjYWNoZSBpbgoteW91ciBmaWxlc3lzdGVtLiBBcyBvZiBrZXJuZWwgMi42LjE2LCB0aGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGRlZmluZWQ6Cit5b3VyIGZpbGVzeXN0ZW0uIEFzIG9mIGtlcm5lbCAyLjYuMjIsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKIAogc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB7CiAJaW50ICgqd3JpdGVwYWdlKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwpAQCAtNTQzLDYgKzU0Niw3IEBACiAJCQlpbnQpOwogCS8qIG1pZ3JhdGUgdGhlIGNvbnRlbnRzIG9mIGEgcGFnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCAqLwogCWludCAoKm1pZ3JhdGVwYWdlKSAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqbGF1bmRlcl9wYWdlKSAoc3RydWN0IHBhZ2UgKik7CiB9OwogCiAgIHdyaXRlcGFnZTogY2FsbGVkIGJ5IHRoZSBWTSB0byB3cml0ZSBhIGRpcnR5IHBhZ2UgdG8gYmFja2luZyBzdG9yZS4KQEAgLTY4OSw2ICs2OTMsMTAgQEAKIAl0cmFuc2ZlciBhbnkgcHJpdmF0ZSBkYXRhIGFjcm9zcyBhbmQgdXBkYXRlIGFueSByZWZlcmVuY2VzCiAgICAgICAgIHRoYXQgaXQgaGFzIHRvIHRoZSBwYWdlLgogCisgIGxhdW5kZXJfcGFnZTogQ2FsbGVkIGJlZm9yZSBmcmVlaW5nIGEgcGFnZSAtIGl0IHdyaXRlcyBiYWNrIHRoZSBkaXJ0eSBwYWdlLiBUbworICAJcHJldmVudCByZWRpcnR5aW5nIHRoZSBwYWdlLCBpdCBpcyBrZXB0IGxvY2tlZCBkdXJpbmcgdGhlIHdob2xlCisJb3BlcmF0aW9uLgorCiBUaGUgRmlsZSBPYmplY3QKID09PT09PT09PT09PT09PQogCkBAIC02OTksOSArNzA3LDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgZGVzY3JpYmVzIGhvdyB0aGUgVkZTIGNhbiBtYW5pcHVsYXRlIGFuIG9wZW4gZmlsZS4gQXMgb2Yga2VybmVsCi0yLjYuMTcsIHRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZGVmaW5lZDoKKzIuNi4yMiwgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSBkZWZpbmVkOgogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiAJc3NpemVfdCAoKnJlYWQpIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKQEAgLTcyOCwxMCArNzM3LDggQEAKIAlpbnQgKCpjaGVja19mbGFncykoaW50KTsKIAlpbnQgKCpkaXJfbm90aWZ5KShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCWludCAoKmZsb2NrKSAoc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOwotCXNzaXplX3QgKCpzcGxpY2Vfd3JpdGUpKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IGZpbGUgKiwgc2l6ZV90LCB1bnNpZ25lZCAKLWludCk7Ci0Jc3NpemVfdCAoKnNwbGljZV9yZWFkKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgIAotaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3dyaXRlKShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHN0cnVjdCBmaWxlICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKwlzc2l6ZV90ICgqc3BsaWNlX3JlYWQpKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogfTsKIAogQWdhaW4sIGFsbCBtZXRob2RzIGFyZSBjYWxsZWQgd2l0aG91dCBhbnkgbG9ja3MgYmVpbmcgaGVsZCwgdW5sZXNzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dAppbmRleCAyMmIwODE0Li4yMGQzNjhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2hydGltZXIvdGltZXJfc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKQEAgLTY3LDMgKzY3LDcgQEAKIAogICAgIFRob21hcywgSW5nbwogCitBZGRlZCBmbGFnIHRvIGluZGljYXRlICdkZWZlcnJhYmxlIHRpbWVyJyBpbiAvcHJvYy90aW1lcl9zdGF0cy4gQSBkZWZlcnJhYmxlCit0aW1lciB3aWxsIGFwcGVhciBhcyBmb2xsb3dzCisgIDEwRCwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0CmluZGV4IDNkZTdkMzcuLjVjN2ZiZjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQKQEAgLTY3LDcgKzY3LDcgQEAKIDB4MDAJMDAtMUYJbGludXgvd2F2ZWZyb250LmgJY29uZmxpY3QhCiAweDAyCWFsbAlsaW51eC9mZC5oCiAweDAzCWFsbAlsaW51eC9oZHJlZy5oCi0weDA0CWFsbAlsaW51eC91bXNkb3NfZnMuaAorMHgwNAlEMi1EQwlsaW51eC91bXNkb3NfZnMuaAlEZWFkIHNpbmNlIDIuNi4xMSwgYnV0IGRvbid0IHJldXNlIHRoZXNlLgogMHgwNglhbGwJbGludXgvbHAuaAogMHgwOQlhbGwJbGludXgvbWQuaAogMHgxMglhbGwJbGludXgvZnMuaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0ZDg4MGIzLi45YTU0MTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMzQsNyArMzQsNiBAQAogCUFQSUMJQVBJQyBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJQVBNCUFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBpcyBlbmFibGVkLgogCUFYMjUJQXBwcm9wcmlhdGUgQVguMjUgc3VwcG9ydCBpcyBlbmFibGVkLgotCUNECUFwcHJvcHJpYXRlIENEIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlEUk0JRGlyZWN0IFJlbmRlcmluZyBNYW5hZ2VtZW50IHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlFREQJQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIFNlcnZpY2VzIChFREQpIGlzIGVuYWJsZWQKIAlFRkkJRUZJIFBhcnRpdGlvbmluZyAoR1BUKSBpcyBlbmFibGVkCkBAIC0yMzgsMTYgKzIzNyw5IEBACiAJCQlEaXNhYmxlIFBJTiAxIG9mIEFQSUMgdGltZXIKIAkJCUNhbiBiZSB1c2VmdWwgdG8gd29yayBhcm91bmQgY2hpcHNldCBidWdzLgogCi0JYWQxODE2PQkJW0hXLE9TU10KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4KLQkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNi4KLQogCWFkMTg0OD0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDx0eXBlPgogCi0JYWRsaWI9CQlbSFcsT1NTXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlhZHZhbnN5cz0JW0hXLFNDU0ldCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS9hZHZhbnN5cy5jLgogCkBAIC0zMjYsOSArMzE4LDYgQEAKIAogCWF1dG90ZXN0CVtJQTY0XQogCi0JYXp0Y2Q9CQlbSFcsQ0RdIEF6dGVjaCBDRDI2OCBDRFJPTSBkcml2ZXIKLQkJCUZvcm1hdDogPGlvPiwweDc5ICg/KQotCiAJYmF5Y29tX2VwcD0JW0hXLEFYMjVdCiAJCQlGb3JtYXQ6IDxpbz4sPG1vZGU+CiAKQEAgLTM3MSwxMCArMzYwLDYgQEAKIAkJCXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGF0IHRoZSBjb3JyZWN0IHNpemUgc2hvdWxkIGJlLgogCQkJVGhpcyBvcHRpb24gcHJvdmlkZXMgYW4gb3ZlcnJpZGUgZm9yIHRoZXNlIHNpdHVhdGlvbnMuCiAKLQljZHUzMWE9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT5bLFBBU10KLQkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9jZHJvbS9jZHUzMWEuYy4KLQogCWNoYW5kZXY9CVtIVyxORVRdIEdlbmVyaWMgY2hhbm5lbCBkZXZpY2UgaW5pdGlhbGlzYXRpb24KIAogCWNoZWNrcmVxcHJvdAlbU0VMSU5VWF0gU2V0IGluaXRpYWwgY2hlY2tyZXFwcm90IGZsYWcgdmFsdWUuCkBAIC00MjgsOSArNDEzLDYgQEAKIAlocGV0PQkJW0lBLTMyLEhQRVRdIG9wdGlvbiB0byBkaXNhYmxlIEhQRVQgYW5kIHVzZSBQSVQuCiAJCQlGb3JtYXQ6IGRpc2FibGUKIAotCWNtMjA2PQkJW0hXLENEXQotCQkJRm9ybWF0OiB7IGF1dG8gfCBbPGlvPixdWzxpcnE+XSB9Ci0KIAljb20yMDAyMD0JW0hXLE5FVF0gQVJDbmV0IC0gQ09NMjAwMjAgY2hpcHNldAogCQkJRm9ybWF0OgogCQkJPGlvPlssPGlycT5bLDxub2RlSUQ+Wyw8YmFja3BsYW5lPlssPGNrcD5bLDx0aW1lb3V0Pl1dXV1dCkBAIC00NjIsMTMgKzQ0NCwyMCBAQAogCQkJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0IGZvciBhbgogCQkJYWx0ZXJuYXRpdmUuCiAKLQkJdWFydCxpbyw8YWRkcj5bLG9wdGlvbnNdCi0JCXVhcnQsbW1pbyw8YWRkcj5bLG9wdGlvbnNdCisJCXVhcnRbODI1MF0saW8sPGFkZHI+WyxvcHRpb25zXQorCQl1YXJ0WzgyNTBdLG1taW8sPGFkZHI+WyxvcHRpb25zXQogCQkJU3RhcnQgYW4gZWFybHksIHBvbGxlZC1tb2RlIGNvbnNvbGUgb24gdGhlIDgyNTAvMTY1NTAKIAkJCVVBUlQgYXQgdGhlIHNwZWNpZmllZCBJL08gcG9ydCBvciBNTUlPIGFkZHJlc3MsCiAJCQlzd2l0Y2hpbmcgdG8gdGhlIG1hdGNoaW5nIHR0eVMgZGV2aWNlIGxhdGVyLiAgVGhlCiAJCQlvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgdHR5UywgYWJvdmUuCiAKKwllYXJseWNvbj0JW0tOTF0gT3V0cHV0IGVhcmx5IGNvbnNvbGUgZGV2aWNlIGFuZCBvcHRpb25zLgorCQl1YXJ0WzgyNTBdLGlvLDxhZGRyPlssb3B0aW9uc10KKwkJdWFydFs4MjUwXSxtbWlvLDxhZGRyPlssb3B0aW9uc10KKwkJCVN0YXJ0IGFuIGVhcmx5LCBwb2xsZWQtbW9kZSBjb25zb2xlIG9uIHRoZSA4MjUwLzE2NTUwCisJCQlVQVJUIGF0IHRoZSBzcGVjaWZpZWQgSS9PIHBvcnQgb3IgTU1JTyBhZGRyZXNzLgorCQkJVGhlIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0dHlTLCBhYm92ZS4KKwogCWNwY2locF9nZW5lcmljPQlbSFcsUENJXSBHZW5lcmljIHBvcnQgSS9PIENvbXBhY3RQQ0kgZHJpdmVyCiAJCQlGb3JtYXQ6CiAJCQk8Zmlyc3Rfc2xvdD4sPGxhc3Rfc2xvdD4sPHBvcnQ+LDxlbnVtX2JpdD5bLDxkZWJ1Zz5dCkBAIC02NjAsOSArNjQ5LDYgQEAKIAlncHQJCVtFRkldIEZvcmNlcyBkaXNrIHdpdGggdmFsaWQgR1BUIHNpZ25hdHVyZSBidXQKIAkJCWludmFsaWQgUHJvdGVjdGl2ZSBNQlIgdG8gYmUgdHJlYXRlZCBhcyBHUFQuCiAKLQlnc2NkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlndnAxMT0JCVtIVyxTQ1NJXQogCiAJaGFzaGRpc3Q9CVtLTkwsTlVNQV0gTGFyZ2UgaGFzaGVzIGFsbG9jYXRlZCBkdXJpbmcgYm9vdApAQCAtODI2LDE0ICs4MTIsMzcgQEAKIAkJCXRhc2tzIGluIHRoZSBzeXN0ZW0gLS0gY2FuIGNhdXNlIHByb2JsZW1zIGFuZAogCQkJc3Vib3B0aW1hbCBsb2FkIGJhbGFuY2VyIHBlcmZvcm1hbmNlLgogCi0JaXNwMTY9CQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPHNldHVwPgotCiAJaXVjdj0JCVtIVyxORVRdCiAKIAlqcz0JCVtIVyxKT1ldIEFuYWxvZyBqb3lzdGljawogCQkJU2VlIERvY3VtZW50YXRpb24vaW5wdXQvam95c3RpY2sudHh0LgogCisJa2VybmVsY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCXNwZWNpZmllcyB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2FibGUgYnkgdGhlIGtlcm5lbAorCQkJZm9yIG5vbi1tb3ZhYmxlIGFsbG9jYXRpb25zLiAgVGhlIHJlcXVlc3RlZCBhbW91bnQgaXMKKwkJCXNwcmVhZCBldmVubHkgdGhyb3VnaG91dCBhbGwgbm9kZXMgaW4gdGhlIHN5c3RlbS4gVGhlCisJCQlyZW1haW5pbmcgbWVtb3J5IGluIGVhY2ggbm9kZSBpcyB1c2VkIGZvciBNb3ZhYmxlCisJCQlwYWdlcy4gSW4gdGhlIGV2ZW50LCBhIG5vZGUgaXMgdG9vIHNtYWxsIHRvIGhhdmUgYm90aAorCQkJa2VybmVsY29yZSBhbmQgTW92YWJsZSBwYWdlcywga2VybmVsY29yZSBwYWdlcyB3aWxsCisJCQl0YWtlIHByaW9yaXR5IGFuZCBvdGhlciBub2RlcyB3aWxsIGhhdmUgYSBsYXJnZXIgbnVtYmVyCisJCQlvZiBrZXJuZWxjb3JlIHBhZ2VzLiAgVGhlIE1vdmFibGUgem9uZSBpcyB1c2VkIGZvciB0aGUKKwkJCWFsbG9jYXRpb24gb2YgcGFnZXMgdGhhdCBtYXkgYmUgcmVjbGFpbWVkIG9yIG1vdmVkCisJCQlieSB0aGUgcGFnZSBtaWdyYXRpb24gc3Vic3lzdGVtLiAgVGhpcyBtZWFucyB0aGF0CisJCQlIdWdlVExCIHBhZ2VzIG1heSBub3QgYmUgYWxsb2NhdGVkIGZyb20gdGhpcyB6b25lLgorCQkJTm90ZSB0aGF0IGFsbG9jYXRpb25zIGxpa2UgUFRFcy1mcm9tLUhpZ2hNZW0gc3RpbGwKKwkJCXVzZSB0aGUgSGlnaE1lbSB6b25lIGlmIGl0IGV4aXN0cywgYW5kIHRoZSBOb3JtYWwKKwkJCXpvbmUgaWYgaXQgZG9lcyBub3QuCisKKwltb3ZhYmxlY29yZT1ubltLTUddCVtLTkwsSUEtMzIsSUEtNjQsUFBDLFg4Ni02NF0gVGhpcyBwYXJhbWV0ZXIKKwkJCWlzIHNpbWlsYXIgdG8ga2VybmVsY29yZSBleGNlcHQgaXQgc3BlY2lmaWVzIHRoZQorCQkJYW1vdW50IG9mIG1lbW9yeSB1c2VkIGZvciBtaWdyYXRhYmxlIGFsbG9jYXRpb25zLgorCQkJSWYgYm90aCBrZXJuZWxjb3JlIGFuZCBtb3ZhYmxlY29yZSBpcyBzcGVjaWZpZWQsCisJCQl0aGVuIGtlcm5lbGNvcmUgd2lsbCBiZSBhdCAqbGVhc3QqIHRoZSBzcGVjaWZpZWQKKwkJCXZhbHVlIGJ1dCBtYXkgYmUgbW9yZS4gSWYgbW92YWJsZWNvcmUgb24gaXRzIG93bgorCQkJaXMgc3BlY2lmaWVkLCB0aGUgYWRtaW5pc3RyYXRvciBtdXN0IGJlIGNhcmVmdWwKKwkJCXRoYXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNhYmxlIGZvciBhbGwgYWxsb2NhdGlvbnMKKwkJCWlzIG5vdCB0b28gc21hbGwuCisKIAlrZWVwaW5pdHJkCVtIVyxBUk1dCiAKIAlrc3RhY2s9TglbSUEtMzIsWDg2LTY0XSBQcmludCBOIHdvcmRzIGZyb20gdGhlIGtlcm5lbCBzdGFjawpAQCAtOTY3LDExICs5NzYsNiBAQAogCiAJbWNhdGVzdD0JW0lBLTY0XQogCi0JbWNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8cG9ydD4sPGlycT4sPG1pdHN1bWlfYnVnXzkzX3dhaXQ+Ci0KLQltY2R4PQkJW0hXLENEXQotCiAJbWNlCQlbSUEtMzJdIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uCiAKIAltZD0JCVtIV10gUkFJRCBzdWJzeXN0ZW1zIGRldmljZXMgYW5kIGxldmVsCkBAIC0xMTgxLDYgKzExODUsOCBAQAogCiAJbm9zbXAJCVtTTVBdIFRlbGxzIGFuIFNNUCBrZXJuZWwgdG8gYWN0IGFzIGEgVVAga2VybmVsLgogCisJbm9zb2Z0bG9ja3VwCVtLTkxdIERpc2FibGUgdGhlIHNvZnQtbG9ja3VwIGRldGVjdG9yLgorCiAJbm9zeW5jCQlbSFcsTTY4S10gRGlzYWJsZXMgc3luYyBuZWdvdGlhdGlvbiBmb3IgYWxsIGRldmljZXMuCiAKIAlub3RzYwkJW0JVR1M9SUEtMzJdIERpc2FibGUgVGltZSBTdGFtcCBDb3VudGVyCkBAIC0xMTg5LDIwICsxMTk1LDE5IEBACiAKIAlub3diCQlbQVJNXQogCisJbnVtYV96b25lbGlzdF9vcmRlcj0gW0tOTCwgQk9PVF0gU2VsZWN0IHpvbmVsaXN0IG9yZGVyIGZvciBOVU1BLgorCQkJb25lIG9mIFsnem9uZScsICdub2RlJywgJ2RlZmF1bHQnXSBjYW4gYmUgc3BlY2lmaWVkCisJCQlUaGlzIGNhbiBiZSBzZXQgZnJvbSBzeXNjdGwgYWZ0ZXIgYm9vdC4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQgZm9yIGRldGFpbHMuCisKIAlucl91YXJ0cz0JW1NFUklBTF0gbWF4aW11bSBudW1iZXIgb2YgVUFSVHMgdG8gYmUgcmVnaXN0ZXJlZC4KIAogCW9wbDM9CQlbSFcsT1NTXQogCQkJRm9ybWF0OiA8aW8+CiAKLQlvcGwzc2EyPQlbSFcsT1NTXSBGb3JtYXQ6Ci0JCQk8aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzX2lvPiw8bXB1X2lvPiw8eW1vZGU+LDxsb29wYmFjaz5bLDxpc2FwbnA+LDxtdWx0aXBsZV0KLQogCW9wcm9maWxlLnRpbWVyPQlbSFddCiAJCQlVc2UgdGltZXIgaW50ZXJydXB0IGluc3RlYWQgb2YgcGVyZm9ybWFuY2UgY291bnRlcnMKIAotCW9wdGNkPQkJW0hXLENEXQotCQkJRm9ybWF0OiA8aW8+Ci0KIAlvc3N0PQkJW0hXLFNDU0ldIFNDU0kgVGFwZSBEcml2ZXIKIAkJCUZvcm1hdDogPGJ1ZmZlcl9zaXplPiw8d3JpdGVfdGhyZXNob2xkPgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9zY3NpL3N0LnR4dC4KQEAgLTEzODEsNiArMTM4NiwxNSBAQAogCQkJYXV0b2NvbmZpZ3VyYXRpb24uCiAJCQlSYW5nZXMgYXJlIGluIHBhaXJzIChtZW1vcnkgYmFzZSBhbmQgc2l6ZSkuCiAKKwlwcmludC1mYXRhbC1zaWduYWxzPQorCQkJW0tOTF0gZGVidWc6IHByaW50IGZhdGFsIHNpZ25hbHMKKwkJCXByaW50LWZhdGFsLXNpZ25hbHM9MTogcHJpbnQgc2VnZmF1bHQgaW5mbyB0bworCQkJdGhlIGtlcm5lbCBjb25zb2xlLgorCQkJZGVmYXVsdDogb2ZmLgorCisJcHJpbnRrLnRpbWU9CVNob3cgdGltaW5nIGRhdGEgcHJlZml4ZWQgdG8gZWFjaCBwcmludGsgbWVzc2FnZSBsaW5lCisJCQlGb3JtYXQ6IDxib29sPiAgKDEvWS95PWVuYWJsZSwgMC9OL249ZGlzYWJsZSkKKwogCXByb2ZpbGU9CVtLTkxdIEVuYWJsZSBrZXJuZWwgcHJvZmlsaW5nIHZpYSAvcHJvYy9wcm9maWxlCiAJCQlGb3JtYXQ6IFtzY2hlZHVsZSxdPG51bWJlcj4KIAkJCVBhcmFtOiAic2NoZWR1bGUiIC0gcHJvZmlsZSBzY2hlZHVsZSBwb2ludHMuCkBAIC0xNDkzLDYgKzE1MDcsMTAgQEAKIAogCXJvb3Rmc3R5cGU9CVtLTkxdIFNldCByb290IGZpbGVzeXN0ZW0gdHlwZQogCisJcm9vdHdhaXQJW0tOTF0gV2FpdCAoaW5kZWZpbml0ZWx5KSBmb3Igcm9vdCBkZXZpY2UgdG8gc2hvdyB1cC4KKwkJCVVzZWZ1bCBmb3IgZGV2aWNlcyB0aGF0IGFyZSBkZXRlY3RlZCBhc3luY2hyb25vdXNseQorCQkJKGUuZy4gVVNCIGFuZCBNTUMgZGV2aWNlcykuCisKIAlydwkJW0tOTF0gTW91bnQgcm9vdCBkZXZpY2UgcmVhZC13cml0ZSBvbiBib290CiAKIAlTCQlbS05MXSBSdW4gaW5pdCBpbiBzaW5nbGUgbW9kZQpAQCAtMTUwNSwxMSArMTUyMyw2IEBACiAKIAlzYm5pPQkJW05FVF0gR3JhbmNoIFNCTkkxMiBsZWFzZWQgbGluZSBhZGFwdGVyCiAKLQlzYnBjZD0JCVtIVyxDRF0gU291bmRibGFzdGVyIENEIGFkYXB0ZXIKLQkJCUZvcm1hdDogPGlvPiw8dHlwZT4KLQkJCVNlZSBhIGNvbW1lbnQgYmVmb3JlIGZ1bmN0aW9uIHNicGNkX3NldHVwKCkgaW4KLQkJCWRyaXZlcnMvY2Ryb20vc2JwY2QuYy4KLQogCXNjMTIwMHdkdD0JW0hXLFdEVF0gU0MxMjAwIFdEVCAod2F0Y2hkb2cpIGRyaXZlcgogCQkJRm9ybWF0OiA8aW8+Wyw8dGltZW91dD5bLDxpc2FwbnA+XV0KIApAQCAtMTU2Miw0MSArMTU3NSw0MSBAQAogCXNpbWV0aD0JCVtJQS02NF0KIAlzaW1zY3NpPQogCi0Jc2pjZD0JCVtIVyxDRF0KLQkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPgotCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL2Nkcm9tL3NqY2QuYy4KLQogCXNscmFtPQkJW0hXLE1URF0KIAotCXNsdWJfZGVidWcJW01NLCBTTFVCXQotCQkJRW5hYmxpbmcgc2x1Yl9kZWJ1ZyBhbGxvd3Mgb25lIHRvIGRldGVybWluZSB0aGUgY3VscHJpdAotCQkJaWYgc2xhYiBvYmplY3RzIGJlY29tZSBjb3JydXB0ZWQuIEVuYWJsaW5nIHNsdWJfZGVidWcKLQkJCWNyZWF0ZXMgZ3VhcmQgem9uZXMgYXJvdW5kIG9iamVjdHMgYW5kIHBvaXNvbnMgb2JqZWN0cwotCQkJd2hlbiBub3QgaW4gdXNlLiBBbHNvIHRyYWNrcyB0aGUgbGFzdCBhbGxvYyAvIGZyZWUuCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwlzbHViX2RlYnVnWz1vcHRpb25zWyxzbGFic11dCVtNTSwgU0xVQl0KKwkJCUVuYWJsaW5nIHNsdWJfZGVidWcgYWxsb3dzIG9uZSB0byBkZXRlcm1pbmUgdGhlCisJCQljdWxwcml0IGlmIHNsYWIgb2JqZWN0cyBiZWNvbWUgY29ycnVwdGVkLiBFbmFibGluZworCQkJc2x1Yl9kZWJ1ZyBjYW4gY3JlYXRlIGd1YXJkIHpvbmVzIGFyb3VuZCBvYmplY3RzIGFuZAorCQkJbWF5IHBvaXNvbiBvYmplY3RzIHdoZW4gbm90IGluIHVzZS4gQWxzbyB0cmFja3MgdGhlCisJCQlsYXN0IGFsbG9jIC8gZnJlZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisJCQlEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc2x1Yl9tYXhfb3JkZXI9IFtNTSwgU0xVQl0KLQkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuIFNldHRpbmcKLQkJCXRoaXMgdG9vIGhpZ2ggbWF5IGNhdXNlIGZyYWdtZW50YXRpb24uCi0JCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KKwkJCURldGVybWluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBvcmRlciBmb3Igc2xhYnMuCisJCQlBIGhpZ2ggc2V0dGluZyBtYXkgY2F1c2UgT09NcyBkdWUgdG8gbWVtb3J5CisJCQlmcmFnbWVudGF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUKKwkJCURvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX21pbl9vYmplY3RzPQlbTU0sIFNMVUJdCi0JCQlUaGUgbWluaW11bSBvYmplY3RzIHBlciBzbGFiLiBTTFVCIHdpbGwgaW5jcmVhc2UgdGhlCi0JCQlzbGFiIG9yZGVyIHVwIHRvIHNsdWJfbWF4X29yZGVyIHRvIGdlbmVyYXRlIGEKLQkJCXN1ZmZpY2llbnRseSBiaWcgc2xhYiB0byBzYXRpc2Z5IHRoZSBudW1iZXIgb2Ygb2JqZWN0cy4KLQkJCVRoZSBoaWdoZXIgdGhlIG51bWJlciBvZiBvYmplY3RzIHRoZSBzbWFsbGVyIHRoZSBvdmVyaGVhZAotCQkJb2YgdHJhY2tpbmcgc2xhYnMuCisJCQlUaGUgbWluaW11bSBudW1iZXIgb2Ygb2JqZWN0cyBwZXIgc2xhYi4gU0xVQiB3aWxsCisJCQlpbmNyZWFzZSB0aGUgc2xhYiBvcmRlciB1cCB0byBzbHViX21heF9vcmRlciB0bworCQkJZ2VuZXJhdGUgYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc2xhYiBhYmxlIHRvIGNvbnRhaW4KKwkJCXRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbmRpY2F0ZWQuIFRoZSBoaWdoZXIgdGhlIG51bWJlcgorCQkJb2Ygb2JqZWN0cyB0aGUgc21hbGxlciB0aGUgb3ZlcmhlYWQgb2YgdHJhY2tpbmcgc2xhYnMKKwkJCWFuZCB0aGUgbGVzcyBmcmVxdWVudGx5IGxvY2tzIG5lZWQgdG8gYmUgYWNxdWlyZWQuCiAJCQlGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dC4KIAogCXNsdWJfbWluX29yZGVyPQlbTU0sIFNMVUJdCiAJCQlEZXRlcm1pbmVzIHRoZSBtaW5pbnVtIHBhZ2Ugb3JkZXIgZm9yIHNsYWJzLiBNdXN0IGJlCi0JCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyCisJCQlsb3dlciB0aGFuIHNsdWJfbWF4X29yZGVyLgogCQkJRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIERvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQuCiAKIAlzbHViX25vbWVyZ2UJW01NLCBTTFVCXQotCQkJRGlzYWJsZSBtZXJnaW5nIG9mIHNsYWJzIG9mIHNpbWlsYXIgc2l6ZS4gTWF5IGJlCisJCQlEaXNhYmxlIG1lcmdpbmcgb2Ygc2xhYnMgd2l0aCBzaW1pbGFyIHNpemUuIE1heSBiZQogCQkJbmVjZXNzYXJ5IGlmIHRoZXJlIGlzIHNvbWUgcmVhc29uIHRvIGRpc3Rpbmd1aXNoCi0JCQlhbGxvY3MgdG8gZGlmZmVyZW50IHNsYWJzLgorCQkJYWxsb2NzIHRvIGRpZmZlcmVudCBzbGFicy4gRGVidWcgb3B0aW9ucyBkaXNhYmxlCisJCQltZXJnaW5nIG9uIHRoZWlyIG93bi4KIAkJCUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0LgogCiAJc21hcnQyPQkJW0hXXQpAQCAtMTczOCw5ICsxNzUxLDYgQEAKIAogCXNuZC15bWZwY2k9CVtIVyxBTFNBXQogCi0Jc29ueWNkNTM1PQlbSFcsQ0RdCi0JCQlGb3JtYXQ6IDxpbz5bLDxpcnE+XQotCiAJc29ueXBpLio9CVtIV10gU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlcgogCQkJU2VlIERvY3VtZW50YXRpb24vc29ueXBpLnR4dAogCkBAIC0xODEyLDYgKzE4MjIsNyBAQAogCQkJU2V0IG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgZm9yIFRDUCBjb25uZWN0aW9uCiAKIAl0aW1lCQlTaG93IHRpbWluZyBkYXRhIHByZWZpeGVkIHRvIGVhY2ggcHJpbnRrIG1lc3NhZ2UgbGluZQorCQkJW2RlcHJlY2F0ZWQsIHNlZSAncHJpbnRrLnRpbWUnXQogCiAJdGlwYXIudGltZW91dD0JW0hXLFBQVF0KIAkJCVNldCBjb21tdW5pY2F0aW9ucyB0aW1lb3V0IGluIHRlbnRocyBvZiBhIHNlY29uZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKaW5kZXggMWM0MWRiMi4uNTkxMDhjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CkBAIC04MiwxMyArODIsNiBAQAogICAvZGV2L2ZkIDogLT4gMHgwMjAwIChmbG9wcHkgZGlzaykKICAgL2Rldi94ZGE6IC0+IDB4MGMwMCAoZmlyc3QgWFQgZGlzaywgdW51c2VkIGluIExpbnV4L202OGspCiAgIC9kZXYveGRiOiAtPiAweDBjNDAgKHNlY29uZCBYVCBkaXNrLCB1bnVzZWQgaW4gTGludXgvbTY4aykKLSAgL2Rldi9hZGE6IC0+IDB4MWMwMCAoZmlyc3QgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRiOiAtPiAweDFjMTAgKHNlY29uZCBBQ1NJIGRldmljZSkKLSAgL2Rldi9hZGM6IC0+IDB4MWMyMCAodGhpcmQgQUNTSSBkZXZpY2UpCi0gIC9kZXYvYWRkOiAtPiAweDFjMzAgKGZvcnRoIEFDU0kgZGV2aWNlKQotCi1UaGUgbGFzdCBmb3VyIG5hbWVzIGFyZSBhdmFpbGFibGUgb25seSBpZiB0aGUga2VybmVsIGhhcyBiZWVuIGNvbXBpbGVkCi13aXRoIEF0YXJpIGFuZCBBQ1NJIHN1cHBvcnQuCiAKICAgVGhlIG5hbWUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGRlY2ltYWwgbnVtYmVyLCB0aGF0IHN0YW5kcyBmb3IgdGhlCiBwYXJ0aXRpb24gbnVtYmVyLiBJbnRlcm5hbGx5LCB0aGUgdmFsdWUgb2YgdGhlIG51bWJlciBpcyBqdXN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dAppbmRleCAwYjI3ODYzLi45OGM0MzkyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQKQEAgLTE0NiwxMiArMTQ2LDYgQEAKIAlpcnEgPSAwCiAJKFByb2JlcyBwb3J0czogMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyNDAsIDB4MzQwLCAweDMyMCwgMHgzODAsIDB4MzAwKQogCi1hdGFyaV9iaW9uZXQuYzoKLQlTdXBwb3J0cyBmdWxsIGF1dG9wcm9iaW5nLiAobTY4ay9BdGFyaSkKLQotYXRhcmlfcGFtc25ldC5jOgotCVN1cHBvcnRzIGZ1bGwgYXV0b3Byb2JpbmcuIChtNjhrL0F0YXJpKQotCiBhdGFyaWxhbmNlLmM6CiAJU3VwcG9ydHMgZnVsbCBhdXRvcHJvYmluZy4gKG02OGsvQXRhcmkpCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vb29wcy10cmFjaW5nLnR4dAppbmRleCA3ZDViNjBkLi43ZjYwZGZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL29vcHMtdHJhY2luZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9vb3BzLXRyYWNpbmcudHh0CkBAIC04Niw2ICs4NiwyMCBAQAogYW5kIGRvIGEgcmVwbGFjZSBvZiBzcGFjZXMgdG8gIlx4IiAtIHRoYXQncyB3aGF0IEkgZG8sIGFzIEknbSB0b28gbGF6eSAKIHRvIHdyaXRlIGEgcHJvZ3JhbSB0byBhdXRvbWF0ZSB0aGlzIGFsbCkuCiAKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBzaGVsbCBzY3JpcHQgaW4gc2NyaXB0cy9kZWNvZGVjb2RlLgorSXRzIHVzYWdlIGlzOiAgZGVjb2RlY29kZSA8IG9vcHMudHh0CisKK1RoZSBoZXggYnl0ZXMgdGhhdCBmb2xsb3cgIkNvZGU6IiBtYXkgKGluIHNvbWUgYXJjaGl0ZWN0dXJlcykgaGF2ZSBhIHNlcmllcworb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgYXMgd2VsbCBhcyBieXRlcyBhdCBhbmQKK2ZvbGxvd2luZyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyLiAgSW4gc29tZSBjYXNlcywgb25lIGluc3RydWN0aW9uCitieXRlIG9yIHdvcmQgaXMgc3Vycm91bmRlZCBieSA8PiBvciAoKSwgYXMgaW4gIjw4Nj4iIG9yICIoZjAwZCkiLiAgVGhlc2UKKzw+IG9yICgpIG1hcmtpbmdzIGluZGljYXRlIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIuICBFeGFtcGxlIGZyb20KK2kzODYsIHNwbGl0IGludG8gbXVsdGlwbGUgbGluZXMgZm9yIHJlYWRhYmlsaXR5OgorCitDb2RlOiBmOSAwZiA4ZCBmOSAwMCAwMCAwMCA4ZCA0MiAwYyBlOCBkZCAyNiAxMSBjNyBhMSA2MCBlYSAyYiBmOSA4YiA1MCAwOCBhMQorNjQgZWEgMmIgZjkgOGQgMzQgODIgOGIgMWUgODUgZGIgNzQgNmQgOGIgMTUgNjAgZWEgMmIgZjkgPDhiPiA0MyAwNCAzOSA0MiA1NAorN2UgMDQgNDAgODkgNDIgNTQgOGIgNDMgMDQgM2IgMDUgMDAgZjYgNTIgYzAKKwogRmluYWxseSwgaWYgeW91IHdhbnQgdG8gc2VlIHdoZXJlIHRoZSBjb2RlIGNvbWVzIGZyb20sIHlvdSBjYW4gZG8KIAogCWNkIC91c3Ivc3JjL2xpbnV4CkBAIC0yMzcsNiArMjUxLDggQEAKICAgNzogJ1UnIGlmIGEgdXNlciBvciB1c2VyIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSByZXF1ZXN0ZWQgdGhhdCB0aGUKICAgICAgVGFpbnRlZCBmbGFnIGJlIHNldCwgJyAnIG90aGVyd2lzZS4KIAorICA4OiAnRCcgaWYgdGhlIGtlcm5lbCBoYXMgZGllZCByZWNlbnRseSwgaS5lLiB0aGVyZSB3YXMgYW4gT09QUyBvciBCVUcuCisKIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhlICdUYWludGVkOiAnIHN0cmluZyBpcyB0byB0ZWxsIGtlcm5lbAogZGVidWdnZXJzIGlmIHRoaXMgaXMgYSBjbGVhbiBrZXJuZWwgb3IgaWYgYW55dGhpbmcgdW51c3VhbCBoYXMKIG9jY3VycmVkLiAgVGFpbnRpbmcgaXMgcGVybWFuZW50OiBldmVuIGlmIGFuIG9mZmVuZGluZyBtb2R1bGUgaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9mcmVlemluZy1vZi10YXNrcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxYTI4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZnJlZXppbmctb2YtdGFza3MudHh0CkBAIC0wLDAgKzEsMTYwIEBACitGcmVlemluZyBvZiB0YXNrcworCShDKSAyMDA3IFJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4sIEdQTAorCitJLiBXaGF0IGlzIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworVGhlIGZyZWV6aW5nIG9mIHRhc2tzIGlzIGEgbWVjaGFuaXNtIGJ5IHdoaWNoIHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lCitrZXJuZWwgdGhyZWFkcyBhcmUgY29udHJvbGxlZCBkdXJpbmcgaGliZXJuYXRpb24gb3Igc3lzdGVtLXdpZGUgc3VzcGVuZCAob24gc29tZQorYXJjaGl0ZWN0dXJlcykuCisKK0lJLiBIb3cgZG9lcyBpdCB3b3JrPworCitUaGVyZSBhcmUgZm91ciBwZXItdGFzayBmbGFncyB1c2VkIGZvciB0aGF0LCBQRl9OT0ZSRUVaRSwgUEZfRlJPWkVOLCBUSUZfRlJFRVpFCithbmQgUEZfRlJFRVpFUl9TS0lQICh0aGUgbGFzdCBvbmUgaXMgYXV4aWxpYXJ5KS4gIFRoZSB0YXNrcyB0aGF0IGhhdmUKK1BGX05PRlJFRVpFIHVuc2V0IChhbGwgdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUga2VybmVsIHRocmVhZHMpIGFyZQorcmVnYXJkZWQgYXMgJ2ZyZWV6YWJsZScgYW5kIHRyZWF0ZWQgaW4gYSBzcGVjaWFsIHdheSBiZWZvcmUgdGhlIHN5c3RlbSBlbnRlcnMgYQorc3VzcGVuZCBzdGF0ZSBhcyB3ZWxsIGFzIGJlZm9yZSBhIGhpYmVybmF0aW9uIGltYWdlIGlzIGNyZWF0ZWQgKGluIHdoYXQgZm9sbG93cword2Ugb25seSBjb25zaWRlciBoaWJlcm5hdGlvbiwgYnV0IHRoZSBkZXNjcmlwdGlvbiBhbHNvIGFwcGxpZXMgdG8gc3VzcGVuZCkuCisKK05hbWVseSwgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIGhpYmVybmF0aW9uIHByb2NlZHVyZSB0aGUgZnVuY3Rpb24KK2ZyZWV6ZV9wcm9jZXNzZXMoKSAoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSBpcyBjYWxsZWQuICBJdCBleGVjdXRlcwordHJ5X3RvX2ZyZWV6ZV90YXNrcygpIHRoYXQgc2V0cyBUSUZfRlJFRVpFIGZvciBhbGwgb2YgdGhlIGZyZWV6YWJsZSB0YXNrcyBhbmQKK3NlbmRzIGEgZmFrZSBzaWduYWwgdG8gZWFjaCBvZiB0aGVtLiAgQSB0YXNrIHRoYXQgcmVjZWl2ZXMgc3VjaCBhIHNpZ25hbCBhbmQgaGFzCitUSUZfRlJFRVpFIHNldCwgc2hvdWxkIHJlYWN0IHRvIGl0IGJ5IGNhbGxpbmcgdGhlIHJlZnJpZ2VyYXRvcigpIGZ1bmN0aW9uCisoZGVmaW5lZCBpbiBrZXJuZWwvcG93ZXIvcHJvY2Vzcy5jKSwgd2hpY2ggc2V0cyB0aGUgdGFzaydzIFBGX0ZST1pFTiBmbGFnLAorY2hhbmdlcyBpdHMgc3RhdGUgdG8gVEFTS19VTklOVEVSUlVQVElCTEUgYW5kIG1ha2VzIGl0IGxvb3AgdW50aWwgUEZfRlJPWkVOIGlzCitjbGVhcmVkIGZvciBpdC4gIFRoZW4sIHdlIHNheSB0aGF0IHRoZSB0YXNrIGlzICdmcm96ZW4nIGFuZCB0aGVyZWZvcmUgdGhlIHNldCBvZgorZnVuY3Rpb25zIGhhbmRsaW5nIHRoaXMgbWVjaGFuaXNtIGlzIGNhbGxlZCAndGhlIGZyZWV6ZXInICh0aGVzZSBmdW5jdGlvbnMgYXJlCitkZWZpbmVkIGluIGtlcm5lbC9wb3dlci9wcm9jZXNzLmMgYW5kIGluY2x1ZGUvbGludXgvZnJlZXplci5oKS4gIFVzZXIgc3BhY2UKK3Byb2Nlc3NlcyBhcmUgZ2VuZXJhbGx5IGZyb3plbiBiZWZvcmUga2VybmVsIHRocmVhZHMuCisKK0l0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBjYWxsIHJlZnJpZ2VyYXRvcigpIGRpcmVjdGx5LiAgSW5zdGVhZCwgaXQgaXMKK3JlY29tbWVuZGVkIHRvIHVzZSB0aGUgdHJ5X3RvX2ZyZWV6ZSgpIGZ1bmN0aW9uIChkZWZpbmVkIGluCitpbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCksIHRoYXQgY2hlY2tzIHRoZSB0YXNrJ3MgVElGX0ZSRUVaRSBmbGFnIGFuZCBtYWtlcyB0aGUKK3Rhc2sgZW50ZXIgcmVmcmlnZXJhdG9yKCkgaWYgdGhlIGZsYWcgaXMgc2V0LgorCitGb3IgdXNlciBzcGFjZSBwcm9jZXNzZXMgdHJ5X3RvX2ZyZWV6ZSgpIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCitzaWduYWwtaGFuZGxpbmcgY29kZSwgYnV0IHRoZSBmcmVlemFibGUga2VybmVsIHRocmVhZHMgbmVlZCB0byBjYWxsIGl0CitleHBsaWNpdGx5IGluIHN1aXRhYmxlIHBsYWNlcy4gIFRoZSBjb2RlIHRvIGRvIHRoaXMgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgorCisJZG8geworCQlodWJfZXZlbnRzKCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisKKyhmcm9tIGRyaXZlcnMvdXNiL2NvcmUvaHViLmM6Omh1Yl90aHJlYWQoKSkuCisKK0lmIGEgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgZmFpbHMgdG8gY2FsbCB0cnlfdG9fZnJlZXplKCkgYWZ0ZXIgdGhlIGZyZWV6ZXIgaGFzCitzZXQgVElGX0ZSRUVaRSBmb3IgaXQsIHRoZSBmcmVlemluZyBvZiB0YXNrcyB3aWxsIGZhaWwgYW5kIHRoZSBlbnRpcmUKK2hpYmVybmF0aW9uIG9wZXJhdGlvbiB3aWxsIGJlIGNhbmNlbGxlZC4gIEZvciB0aGlzIHJlYXNvbiwgZnJlZXphYmxlIGtlcm5lbAordGhyZWFkcyBtdXN0IGNhbGwgdHJ5X3RvX2ZyZWV6ZSgpIHNvbWV3aGVyZS4KKworQWZ0ZXIgdGhlIHN5c3RlbSBtZW1vcnkgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIGhpYmVybmF0aW9uIGltYWdlIGFuZAorZGV2aWNlcyBoYXZlIGJlZW4gcmVpbml0aWFsaXplZCwgdGhlIGZ1bmN0aW9uIHRoYXdfcHJvY2Vzc2VzKCkgaXMgY2FsbGVkIGluCitvcmRlciB0byBjbGVhciB0aGUgUEZfRlJPWkVOIGZsYWcgZm9yIGVhY2ggZnJvemVuIHRhc2suICBUaGVuLCB0aGUgdGFza3MgdGhhdAoraGF2ZSBiZWVuIGZyb3plbiBsZWF2ZSByZWZyaWdlcmF0b3IoKSBhbmQgY29udGludWUgcnVubmluZy4KKworSUlJLiBXaGljaCBrZXJuZWwgdGhyZWFkcyBhcmUgZnJlZXphYmxlPworCitLZXJuZWwgdGhyZWFkcyBhcmUgbm90IGZyZWV6YWJsZSBieSBkZWZhdWx0LiAgSG93ZXZlciwgYSBrZXJuZWwgdGhyZWFkIG1heSBjbGVhcgorUEZfTk9GUkVFWkUgZm9yIGl0c2VsZiBieSBjYWxsaW5nIHNldF9mcmVlemFibGUoKSAodGhlIHJlc2V0dGluZyBvZiBQRl9OT0ZSRUVaRQorZGlyZWN0bHkgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQpLiAgRnJvbSB0aGlzIHBvaW50IGl0IGlzIHJlZ2FyZGVkIGFzIGZyZWV6YWJsZQorYW5kIG11c3QgY2FsbCB0cnlfdG9fZnJlZXplKCkgaW4gYSBzdWl0YWJsZSBwbGFjZS4KKworSVYuIFdoeSBkbyB3ZSBkbyB0aGF0PworCitHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXJlIGlzIGEgY291cGxlIG9mIHJlYXNvbnMgdG8gdXNlIHRoZSBmcmVlemluZyBvZiB0YXNrczoKKworMS4gVGhlIHByaW5jaXBhbCByZWFzb24gaXMgdG8gcHJldmVudCBmaWxlc3lzdGVtcyBmcm9tIGJlaW5nIGRhbWFnZWQgYWZ0ZXIKK2hpYmVybmF0aW9uLiAgQXQgdGhlIG1vbWVudCB3ZSBoYXZlIG5vIHNpbXBsZSBtZWFucyBvZiBjaGVja3BvaW50aW5nCitmaWxlc3lzdGVtcywgc28gaWYgdGhlcmUgYXJlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gZmlsZXN5c3RlbSBkYXRhIGFuZC9vcgorbWV0YWRhdGEgb24gZGlza3MsIHdlIGNhbm5vdCBicmluZyB0aGVtIGJhY2sgdG8gdGhlIHN0YXRlIGZyb20gYmVmb3JlIHRoZQorbW9kaWZpY2F0aW9ucy4gIEF0IHRoZSBzYW1lIHRpbWUgZWFjaCBoaWJlcm5hdGlvbiBpbWFnZSBjb250YWlucyBzb21lCitmaWxlc3lzdGVtLXJlbGF0ZWQgaW5mb3JtYXRpb24gdGhhdCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RhdGUgb2YgdGhlCitvbi1kaXNrIGRhdGEgYW5kIG1ldGFkYXRhIGFmdGVyIHRoZSBzeXN0ZW0gbWVtb3J5IHN0YXRlIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20KK3RoZSBpbWFnZSAob3RoZXJ3aXNlIHRoZSBmaWxlc3lzdGVtcyB3aWxsIGJlIGRhbWFnZWQgaW4gYSBuYXN0eSB3YXksIHVzdWFsbHkKK21ha2luZyB0aGVtIGFsbW9zdCBpbXBvc3NpYmxlIHRvIHJlcGFpcikuICBXZSB0aGVyZWZvcmUgZnJlZXplIHRhc2tzIHRoYXQgbWlnaHQKK2NhdXNlIHRoZSBvbi1kaXNrIGZpbGVzeXN0ZW1zJyBkYXRhIGFuZCBtZXRhZGF0YSB0byBiZSBtb2RpZmllZCBhZnRlciB0aGUKK2hpYmVybmF0aW9uIGltYWdlIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGJlZm9yZSB0aGUgc3lzdGVtIGlzIGZpbmFsbHkgcG93ZXJlZCBvZmYuCitUaGUgbWFqb3JpdHkgb2YgdGhlc2UgYXJlIHVzZXIgc3BhY2UgcHJvY2Vzc2VzLCBidXQgaWYgYW55IG9mIHRoZSBrZXJuZWwgdGhyZWFkcworbWF5IGNhdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gaGFwcGVuLCB0aGV5IGhhdmUgdG8gYmUgZnJlZXphYmxlLgorCisyLiBUaGUgc2Vjb25kIHJlYXNvbiBpcyB0byBwcmV2ZW50IHVzZXIgc3BhY2UgcHJvY2Vzc2VzIGFuZCBzb21lIGtlcm5lbCB0aHJlYWRzCitmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHN1c3BlbmRpbmcgYW5kIHJlc3VtaW5nIG9mIGRldmljZXMuICBBIHVzZXIgc3BhY2UKK3Byb2Nlc3MgcnVubmluZyBvbiBhIHNlY29uZCBDUFUgd2hpbGUgd2UgYXJlIHN1c3BlbmRpbmcgZGV2aWNlcyBtYXksIGZvcgorZXhhbXBsZSwgYmUgdHJvdWJsZXNvbWUgYW5kIHdpdGhvdXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHdlIHdvdWxkIG5lZWQgc29tZQorc2FmZWd1YXJkcyBhZ2FpbnN0IHJhY2UgY29uZGl0aW9ucyB0aGF0IG1pZ2h0IG9jY3VyIGluIHN1Y2ggYSBjYXNlLgorCitBbHRob3VnaCBMaW51cyBUb3J2YWxkcyBkb2Vzbid0IGxpa2UgdGhlIGZyZWV6aW5nIG9mIHRhc2tzLCBoZSBzYWlkIHRoaXMgaW4gb25lCitvZiB0aGUgZGlzY3Vzc2lvbnMgb24gTEtNTCAoaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNy80LzI3LzYwOCk6CisKKyJSSlc6PiBXaHkgd2UgZnJlZXplIHRhc2tzIGF0IGFsbCBvciB3aHkgd2UgZnJlZXplIGtlcm5lbCB0aHJlYWRzPworCitMaW51czogSW4gbWFueSB3YXlzLCAnYXQgYWxsJy4KKworSSBfZG9fIHJlYWxpemUgdGhlIElPIHJlcXVlc3QgcXVldWUgaXNzdWVzLCBhbmQgdGhhdCB3ZSBjYW5ub3QgYWN0dWFsbHkgZG8KK3MycmFtIHdpdGggc29tZSBkZXZpY2VzIGluIHRoZSBtaWRkbGUgb2YgYSBETUEuICBTbyB3ZSB3YW50IHRvIGJlIGFibGUgdG8KK2F2b2lkICp0aGF0KiwgdGhlcmUncyBubyBxdWVzdGlvbiBhYm91dCB0aGF0LiAgQW5kIEkgc3VzcGVjdCB0aGF0IHN0b3BwaW5nCit1c2VyIHRocmVhZHMgYW5kIHRoZW4gd2FpdGluZyBmb3IgYSBzeW5jIGlzIHByYWN0aWNhbGx5IG9uZSBvZiB0aGUgZWFzaWVyCit3YXlzIHRvIGRvIHNvLgorCitTbyBpbiBwcmFjdGljZSwgdGhlICdhdCBhbGwnIG1heSBiZWNvbWUgYSAnd2h5IGZyZWV6ZSBrZXJuZWwgdGhyZWFkcz8nIGFuZAorZnJlZXppbmcgdXNlciB0aHJlYWRzIEkgZG9uJ3QgZmluZCByZWFsbHkgb2JqZWN0aW9uYWJsZS4iCisKK1N0aWxsLCB0aGVyZSBhcmUga2VybmVsIHRocmVhZHMgdGhhdCBtYXkgd2FudCB0byBiZSBmcmVlemFibGUuICBGb3IgZXhhbXBsZSwgaWYKK2Ega2VybmVsIHRoYXQgYmVsb25ncyB0byBhIGRldmljZSBkcml2ZXIgYWNjZXNzZXMgdGhlIGRldmljZSBkaXJlY3RseSwgaXQgaW4KK3ByaW5jaXBsZSBuZWVkcyB0byBrbm93IHdoZW4gdGhlIGRldmljZSBpcyBzdXNwZW5kZWQsIHNvIHRoYXQgaXQgZG9lc24ndCB0cnkgdG8KK2FjY2VzcyBpdCBhdCB0aGF0IHRpbWUuICBIb3dldmVyLCBpZiB0aGUga2VybmVsIHRocmVhZCBpcyBmcmVlemFibGUsIGl0IHdpbGwgYmUKK2Zyb3plbiBiZWZvcmUgdGhlIGRyaXZlcidzIC5zdXNwZW5kKCkgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgYW5kIGl0IHdpbGwgYmUKK3RoYXdlZCBhZnRlciB0aGUgZHJpdmVyJ3MgLnJlc3VtZSgpIGNhbGxiYWNrIGhhcyBydW4sIHNvIGl0IHdvbid0IGJlIGFjY2Vzc2luZwordGhlIGRldmljZSB3aGlsZSBpdCdzIHN1c3BlbmRlZC4KKworMy4gQW5vdGhlciByZWFzb24gZm9yIGZyZWV6aW5nIHRhc2tzIGlzIHRvIHByZXZlbnQgdXNlciBzcGFjZSBwcm9jZXNzZXMgZnJvbQorcmVhbGl6aW5nIHRoYXQgaGliZXJuYXRpb24gKG9yIHN1c3BlbmQpIG9wZXJhdGlvbiB0YWtlcyBwbGFjZS4gIElkZWFsbHksIHVzZXIKK3NwYWNlIHByb2Nlc3NlcyBzaG91bGQgbm90IG5vdGljZSB0aGF0IHN1Y2ggYSBzeXN0ZW0td2lkZSBvcGVyYXRpb24gaGFzIG9jY3VycmVkCithbmQgc2hvdWxkIGNvbnRpbnVlIHJ1bm5pbmcgd2l0aG91dCBhbnkgcHJvYmxlbXMgYWZ0ZXIgdGhlIHJlc3RvcmUgKG9yIHJlc3VtZQorZnJvbSBzdXNwZW5kKS4gIFVuZm9ydHVuYXRlbHksIGluIHRoZSBtb3N0IGdlbmVyYWwgY2FzZSB0aGlzIGlzIHF1aXRlIGRpZmZpY3VsdAordG8gYWNoaWV2ZSB3aXRob3V0IHRoZSBmcmVlemluZyBvZiB0YXNrcy4gIENvbnNpZGVyLCBmb3IgZXhhbXBsZSwgYSBwcm9jZXNzCit0aGF0IGRlcGVuZHMgb24gYWxsIENQVXMgYmVpbmcgb25saW5lIHdoaWxlIGl0J3MgcnVubmluZy4gIFNpbmNlIHdlIG5lZWQgdG8KK2Rpc2FibGUgbm9uYm9vdCBDUFVzIGR1cmluZyB0aGUgaGliZXJuYXRpb24sIGlmIHRoaXMgcHJvY2VzcyBpcyBub3QgZnJvemVuLCBpdAorbWF5IG5vdGljZSB0aGF0IHRoZSBudW1iZXIgb2YgQ1BVcyBoYXMgY2hhbmdlZCBhbmQgbWF5IHN0YXJ0IHRvIHdvcmsgaW5jb3JyZWN0bHkKK2JlY2F1c2Ugb2YgdGhhdC4KKworVi4gQXJlIHRoZXJlIGFueSBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBmcmVlemluZyBvZiB0YXNrcz8KKworWWVzLCB0aGVyZSBhcmUuCisKK0ZpcnN0IG9mIGFsbCwgdGhlIGZyZWV6aW5nIG9mIGtlcm5lbCB0aHJlYWRzIG1heSBiZSB0cmlja3kgaWYgdGhleSBkZXBlbmQgb25lCitvbiBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGlmIGtlcm5lbCB0aHJlYWQgQSB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIChpbiB0aGUKK1RBU0tfVU5JTlRFUlJVUFRJQkxFIHN0YXRlKSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgYnkgZnJlZXphYmxlIGtlcm5lbCB0aHJlYWQgQgorYW5kIEIgaXMgZnJvemVuIGluIHRoZSBtZWFudGltZSwgdGhlbiBBIHdpbGwgYmUgYmxvY2tlZCB1bnRpbCBCIGlzIHRoYXdlZCwgd2hpY2gKK21heSBiZSB1bmRlc2lyYWJsZS4gIFRoYXQncyB3aHkga2VybmVsIHRocmVhZHMgYXJlIG5vdCBmcmVlemFibGUgYnkgZGVmYXVsdC4KKworU2Vjb25kLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyB0d28gcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YgdXNlcgorc3BhY2UgcHJvY2Vzc2VzOgorMS4gUHV0dGluZyBwcm9jZXNzZXMgaW50byBhbiB1bmludGVycnVwdGlibGUgc2xlZXAgZGlzdG9ydHMgdGhlIGxvYWQgYXZlcmFnZS4KKzIuIE5vdyB0aGF0IHdlIGhhdmUgRlVTRSwgcGx1cyB0aGUgZnJhbWV3b3JrIGZvciBkb2luZyBkZXZpY2UgZHJpdmVycyBpbgordXNlcnNwYWNlLCBpdCBnZXRzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIHNvbWUgdXNlcnNwYWNlIHByb2Nlc3NlcyBhcmUKK25vdyBkb2luZyB0aGUgc29ydHMgb2YgdGhpbmdzIHRoYXQga2VybmVsIHRocmVhZHMgZG8KKyhodHRwczovL2xpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnL3BpcGVybWFpbC9saW51eC1wbS8yMDA3LU1heS8wMTIzMDkuaHRtbCkuCisKK1RoZSBwcm9ibGVtIDEuIHNlZW1zIHRvIGJlIGZpeGFibGUsIGFsdGhvdWdoIGl0IGhhc24ndCBiZWVuIGZpeGVkIHNvIGZhci4gIFRoZQorb3RoZXIgb25lIGlzIG1vcmUgc2VyaW91cywgYnV0IGl0IHNlZW1zIHRoYXQgd2UgY2FuIHdvcmsgYXJvdW5kIGl0IGJ5IHVzaW5nCitoaWJlcm5hdGlvbiAoYW5kIHN1c3BlbmQpIG5vdGlmaWVycyAoaW4gdGhhdCBjYXNlLCB0aG91Z2gsIHdlIHdvbid0IGJlIGFibGUgdG8KK2F2b2lkIHRoZSByZWFsaXphdGlvbiBieSB0aGUgdXNlciBzcGFjZSBwcm9jZXNzZXMgdGhhdCB0aGUgaGliZXJuYXRpb24gaXMgdGFraW5nCitwbGFjZSkuCisKK1RoZXJlIGFyZSBhbHNvIHByb2JsZW1zIHRoYXQgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIHRlbmRzIHRvIGV4cG9zZSwgYWx0aG91Z2gKK3RoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHJlcXVlc3RfZmlybXdhcmUoKSBpcworY2FsbGVkIGZyb20gYSBkZXZpY2UgZHJpdmVyJ3MgLnJlc3VtZSgpIHJvdXRpbmUsIGl0IHdpbGwgdGltZW91dCBhbmQgZXZlbnR1YWxseQorZmFpbCwgYmVjYXVzZSB0aGUgdXNlciBsYW5kIHByb2Nlc3MgdGhhdCBzaG91bGQgcmVzcG9uZCB0byB0aGUgcmVxdWVzdCBpcyBmcm96ZW4KK2F0IHRoaXMgcG9pbnQuICBTbywgc2VlbWluZ2x5LCB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gdGhlIGZyZWV6aW5nIG9mIHRhc2tzLgorU3VwcG9zZSwgaG93ZXZlciwgdGhhdCB0aGUgZmlybXdhcmUgZmlsZSBpcyBsb2NhdGVkIG9uIGEgZmlsZXN5c3RlbSBhY2Nlc3NpYmxlCitvbmx5IHRocm91Z2ggYW5vdGhlciBkZXZpY2UgdGhhdCBoYXNuJ3QgYmVlbiByZXN1bWVkIHlldC4gIEluIHRoYXQgY2FzZSwKK3JlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGUgZnJlZXppbmcgb2YgdGFza3MKK2lzIHVzZWQuICBDb25zZXF1ZW50bHksIHRoZSBwcm9ibGVtIGlzIG5vdCByZWFsbHkgcmVsYXRlZCB0byB0aGUgZnJlZXppbmcgb2YKK3Rhc2tzLCBzaW5jZSBpdCBnZW5lcmFsbHkgZXhpc3RzIGFueXdheS4gIFtUaGUgc29sdXRpb24gdG8gdGhpcyBwYXJ0aWN1bGFyCitwcm9ibGVtIGlzIHRvIGtlZXAgdGhlIGZpcm13YXJlIGluIG1lbW9yeSBhZnRlciBpdCdzIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUKK2FuZCB1cGxvYWQgaWYgZnJvbSBtZW1vcnkgdG8gdGhlIGRldmljZSB3aGVuZXZlciBuZWNlc3NhcnkuXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9rZXJuZWxfdGhyZWFkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1Nzc4NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLUtFUk5FTCBUSFJFQURTCi0KLQotRnJlZXplcgotCi1VcG9uIGVudGVyaW5nIGEgc3VzcGVuZGVkIHN0YXRlIHRoZSBzeXN0ZW0gd2lsbCBmcmVlemUgYWxsCi10YXNrcy4gVGhpcyBpcyBkb25lIGJ5IGRlbGl2ZXJpbmcgcHNldWRvc2lnbmFscy4gVGhpcyBhZmZlY3RzCi1rZXJuZWwgdGhyZWFkcywgdG9vLiBUbyBzdWNjZXNzZnVsbHkgZnJlZXplIGEga2VybmVsIHRocmVhZAotdGhlIHRocmVhZCBoYXMgdG8gY2hlY2sgZm9yIHRoZSBwc2V1ZG9zaWduYWwgYW5kIGVudGVyIHRoZQotcmVmcmlnZXJhdG9yLiBDb2RlIHRvIGRvIHRoaXMgbG9va3MgbGlrZSB0aGlzOgotCi0JZG8gewotCQlodWJfZXZlbnRzKCk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKLQkJdHJ5X3RvX2ZyZWV6ZSgpOwotCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7Ci0KLWZyb20gZHJpdmVycy91c2IvY29yZS9odWIuYzo6aHViX3RocmVhZCgpCi0KLQotVGhlIFVuZnJlZXphYmxlCi0KLVNvbWUga2VybmVsIHRocmVhZHMgaG93ZXZlciwgbXVzdCBub3QgYmUgZnJvemVuLiBUaGUga2VybmVsIG11c3QKLWJlIGFibGUgdG8gZmluaXNoIHBlbmRpbmcgSU8gb3BlcmF0aW9ucyBhbmQgbGF0ZXIgb24gYmUgYWJsZSB0bwotd3JpdGUgdGhlIG1lbW9yeSBpbWFnZSB0byBkaXNrLiBLZXJuZWwgdGhyZWFkcyBuZWVkZWQgdG8gZG8gSU8KLW11c3Qgc3RheSBhd2FrZS4gU3VjaCB0aHJlYWRzIG11c3QgbWFyayB0aGVtc2VsdmVzIHVuZnJlZXphYmxlCi1saWtlIHRoaXM6Ci0KLQkvKgotCSAqIFRoaXMgdGhyZWFkIGRvZXNuJ3QgbmVlZCBhbnkgdXNlci1sZXZlbCBhY2Nlc3MsCi0JICogc28gZ2V0IHJpZCBvZiBhbGwgb3VyIHJlc291cmNlcy4KLQkgKi8KLQlkYWVtb25pemUoInVzYi1zdG9yYWdlIik7Ci0KLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQotZnJvbSBkcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jOjp1c2Jfc3Rvcl9jb250cm9sX3RocmVhZCgpCi0KLVN1Y2ggZHJpdmVycyBhcmUgdGhlbXNlbHZlcyByZXNwb25zaWJsZSBmb3Igc3RheWluZyBxdWlldCBkdXJpbmcKLXRoZSBhY3R1YWwgc25hcHNob3R0aW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IDE1MmI1MTAuLmFlYTdlOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE0MCwyMSArMTQwLDExIEBACiB3ZWJzaXRlLCBhbmQgbm90IHRvIHRoZSBMaW51eCBLZXJuZWwgTWFpbGluZyBMaXN0LiBXZSBhcmUgd29ya2luZwogdG93YXJkIG1lcmdpbmcgc3VzcGVuZDIgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgogCi1ROiBBIGtlcm5lbCB0aHJlYWQgbXVzdCB2b2x1bnRhcmlseSBmcmVlemUgaXRzZWxmIChjYWxsICdyZWZyaWdlcmF0b3InKS4KLUkgZm91bmQgc29tZSBrZXJuZWwgdGhyZWFkcyB0aGF0IGRvbid0IGRvIGl0LCBhbmQgdGhleSBkb24ndCBmcmVlemUKLXNvIHRoZSBzeXN0ZW0gY2FuJ3Qgc2xlZXAuIElzIHRoaXMgYSBrbm93biBiZWhhdmlvcj8KK1E6IFdoYXQgaXMgdGhlIGZyZWV6aW5nIG9mIHRhc2tzIGFuZCB3aHkgYXJlIHdlIHVzaW5nIGl0PwogCi1BOiBBbGwgc3VjaCBrZXJuZWwgdGhyZWFkcyBuZWVkIHRvIGJlIGZpeGVkLCBvbmUgYnkgb25lLiBTZWxlY3QgdGhlCi1wbGFjZSB3aGVyZSB0aGUgdGhyZWFkIGlzIHNhZmUgdG8gYmUgZnJvemVuIChubyBrZXJuZWwgc2VtYXBob3Jlcwotc2hvdWxkIGJlIGhlbGQgYXQgdGhhdCBwb2ludCBhbmQgaXQgbXVzdCBiZSBzYWZlIHRvIHNsZWVwIHRoZXJlKSwgYW5kCi1hZGQ6Ci0KLSAgICAgICB0cnlfdG9fZnJlZXplKCk7Ci0KLUlmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCi1pbnN0ZWFkIHNldCB0aGUgUEZfTk9GUkVFWkUgcHJvY2VzcyBmbGFnIHdoZW4gY3JlYXRpbmcgdGhlIHRocmVhZCAoYW5kCi1iZSB2ZXJ5IGNhcmVmdWwpLgotCitBOiBUaGUgZnJlZXppbmcgb2YgdGFza3MgaXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggdXNlciBzcGFjZSBwcm9jZXNzZXMgYW5kIHNvbWUKK2tlcm5lbCB0aHJlYWRzIGFyZSBjb250cm9sbGVkIGR1cmluZyBoaWJlcm5hdGlvbiBvciBzeXN0ZW0td2lkZSBzdXNwZW5kIChvbiBzb21lCithcmNoaXRlY3R1cmVzKS4gIFNlZSBmcmVlemluZy1vZi10YXNrcy50eHQgZm9yIGRldGFpbHMuCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAicGxhdGZvcm0iIGFuZCAic2h1dGRvd24iPwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvYm9vdGluZy13aXRob3V0LW9mLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CmluZGV4IGQ0MmQ5ODEuLjBjMjQzNDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0CkBAIC00MiwxNSArNDIsMTYgQEAKICAgICAxKSBEZWZpbmluZyBjaGlsZCBub2RlcyBvZiBhbiBTT0MKICAgICAyKSBSZXByZXNlbnRpbmcgZGV2aWNlcyB3aXRob3V0IGEgY3VycmVudCBPRiBzcGVjaWZpY2F0aW9uCiAgICAgICBhKSBNRElPIElPIGRldmljZQotICAgICAgYykgUEhZIG5vZGVzCiAgICAgICBiKSBHaWFuZmFyLWNvbXBhdGlibGUgZXRoZXJuZXQgbm9kZXMKKyAgICAgIGMpIFBIWSBub2RlcwogICAgICAgZCkgSW50ZXJydXB0IGNvbnRyb2xsZXJzCiAgICAgICBlKSBJMkMKICAgICAgIGYpIEZyZWVzY2FsZSBTT0MgVVNCIGNvbnRyb2xsZXJzCiAgICAgICBnKSBGcmVlc2NhbGUgU09DIFNFQyBTZWN1cml0eSBFbmdpbmVzCiAgICAgICBoKSBCb2FyZCBDb250cm9sIGFuZCBTdGF0dXMgKEJDU1IpCiAgICAgICBpKSBGcmVlc2NhbGUgUVVJQ0MgRW5naW5lIG1vZHVsZSAoUUUpCi0gICAgICBnKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBqKSBGbGFzaCBjaGlwIG5vZGVzCisgICAgICBrKSBHbG9iYWwgVXRpbGl0aWVzIEJsb2NrCiAKICAgVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKICAgICAxKSBpbnRlcnJ1cHRzIHByb3BlcnR5CkBAIC02MjYsNiArNjI3LDE0IEBACiBhIGxpc3Qgb2YgcHJvcGVydGllcywgYSBsaXN0IG9mIGNoaWxkIG5vZGVzLCBhbmQgYW4gZW5kIHRva2VuLiBFdmVyeQogY2hpbGQgbm9kZSBpcyBhIGZ1bGwgbm9kZSBzdHJ1Y3R1cmUgaXRzZWxmIGFzIGRlZmluZWQgYWJvdmUuCiAKK05PVEU6IFRoZSBhYm92ZSBkZWZpbml0aW9uIHJlcXVpcmVzIHRoYXQgYWxsIHByb3BlcnR5IGRlZmluaXRpb25zIGZvcgorYSBwYXJ0aWN1bGFyIG5vZGUgTVVTVCBwcmVjZWRlIGFueSBzdWJub2RlIGRlZmluaXRpb25zIGZvciB0aGF0IG5vZGUuCitBbHRob3VnaCB0aGUgc3RydWN0dXJlIHdvdWxkIG5vdCBiZSBhbWJpZ3VvdXMgaWYgcHJvcGVydGllcyBhbmQKK3N1Ym5vZGVzIHdlcmUgaW50ZXJtaW5nbGVkLCB0aGUga2VybmVsIHBhcnNlciByZXF1aXJlcyB0aGF0IHRoZQorcHJvcGVydGllcyBjb21lIGZpcnN0ICh1cCB1bnRpbCBhdCBsZWFzdCAyLjYuMjIpLiAgQW55IHRvb2xzCittYW5pcHVsYXRpbmcgYSBmbGF0dGVuZWQgdHJlZSBtdXN0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGlzCitjb25zdHJhaW50LgorCiA0KSBEZXZpY2UgdHJlZSAic3RyaW5ncyIgYmxvY2sKIAogSW4gb3JkZXIgdG8gc2F2ZSBzcGFjZSwgcHJvcGVydHkgbmFtZXMsIHdoaWNoIGFyZSBnZW5lcmFsbHkgcmVkdW5kYW50LApAQCAtMTc4Miw2ICsxNzkxLDMzIEBACiAgCQlwYXJ0aXRpb24tbmFtZXMgPSAiZnNcMGZpcm13YXJlIjsKICAJfTsKIAorICAgaykgR2xvYmFsIFV0aWxpdGllcyBCbG9jaworCisgICBUaGUgZ2xvYmFsIHV0aWxpdGllcyBibG9jayBjb250cm9scyBwb3dlciBtYW5hZ2VtZW50LCBJL08gZGV2aWNlCisgICBlbmFibGluZywgcG93ZXItb24tcmVzZXQgY29uZmlndXJhdGlvbiBtb25pdG9yaW5nLCBnZW5lcmFsLXB1cnBvc2UKKyAgIEkvTyBzaWduYWwgY29uZmlndXJhdGlvbiwgYWx0ZXJuYXRlIGZ1bmN0aW9uIHNlbGVjdGlvbiBmb3IgbXVsdGlwbGV4ZWQKKyAgIHNpZ25hbHMsIGFuZCBjbG9jayBjb250cm9sLgorCisgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgICAgLSBjb21wYXRpYmxlIDogU2hvdWxkIGRlZmluZSB0aGUgY29tcGF0aWJsZSBkZXZpY2UgdHlwZSBmb3IKKyAgICAgIGdsb2JhbC11dGlsaXRpZXMuCisgICAgLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgorCisgIFJlY29tbWVuZGVkIHByb3BlcnRpZXM6CisKKyAgICAtIGZzbCxoYXMtcnN0Y3IgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgZ2xvYmFsIHV0aWxpdGllcyByZWdpc3RlciBzZXQKKyAgICAgIGNvbnRhaW5zIGEgZnVuY3Rpb25pbmcgInJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIiIChpLmUuIHRoZSBib2FyZAorICAgICAgaXMgd2lyZWQgdG8gcmVzZXQgdXBvbiBzZXR0aW5nIHRoZSBIUkVTRVRfUkVRIGJpdCBpbiB0aGlzIHJlZ2lzdGVyKS4KKworICAgIEV4YW1wbGU6CisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLyogZ2xvYmFsIHV0aWxpdGllcyBibG9jayAqLworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOworCQlyZWcgPSA8ZTAwMDAgMTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJfTsKKwogICAgTW9yZSBkZXZpY2VzIHdpbGwgYmUgZGVmaW5lZCBhcyB0aGlzIHNwZWMgbWF0dXJlcy4KIAogVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcnRjLnR4dCBiL0RvY3VtZW50YXRpb24vcnRjLnR4dAppbmRleCA3YzcwMWI4Li5jOTMxZDYxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CkBAIC0zODUsNyArMzg1LDcgQEAKIAkJLyogbm90IGFsbCBSVENzIHN1cHBvcnQgcGVyaW9kaWMgSVJRcyAqLwogCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwgIlxuTm8gcGVyaW9kaWMgSVJRIHN1cHBvcnRcbiIpOwotCQkJcmV0dXJuIDA7CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJcGVycm9yKCJSVENfSVJRUF9SRUFEIGlvY3RsIik7CiAJCWV4aXQoZXJybm8pOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQUQxODE2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGJkOGYyLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL0FEMTgxNgorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLURvY3VtZW50YXRpb24gZm9yIHRoZSBBRDE4MTYoQSkgc291bmQgZHJpdmVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbnN0YWxsYXRpb246Ci0tLS0tLS0tLS0tLS0tCi0KLVRvIGdldCB5b3VyIEFEMTgxNihBKSBiYXNlZCBzb3VuZCBjYXJkIHdvcmssIHlvdSdsbCBoYXZlIHRvIGVuYWJsZSBzdXBwb3J0IGZvcgotZXhwZXJpbWVudGFsIGNvZGUgKCJQcm9tcHQgZm9yIGRldmVsb3BtZW50IGFuZC9vciBpbmNvbXBsZXRlIGNvZGUvZHJpdmVycyIpCi1hbmQgaXNhcG5wICgiUGx1ZyBhbmQgUGxheSBzdXBwb3J0IiwgIklTQSBQbHVnIGFuZCBQbGF5IHN1cHBvcnQiKS4gRW5hYmxlCi0iU291bmQgY2FyZCBzdXBwb3J0IiwgIk9TUyBtb2R1bGVzIHN1cHBvcnQiIGFuZCAiU3VwcG9ydCBmb3IgQUQxODE2KEEpIGJhc2VkCi1jYXJkcyAoRVhQRVJJTUVOVEFMKSIgaW4gdGhlIHNvdW5kIGNvbmZpZ3VyYXRpb24gbWVudSwgdG9vLiBOb3cgYnVpbGQsIGluc3RhbGwKLWFuZCByZWJvb3QgdGhlIG5ldyBrZXJuZWwgYXMgdXN1YWwuCi0KLUZlYXR1cmVzOgotLS0tLS0tLS0tCi0KLUxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgotLSBmdWxsLWR1cGxleCBzdXBwb3J0Ci0tIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzOiB1bnNpZ25lZCA4Yml0LCBzaWduZWQgMTZiaXQgbGl0dGxlIGVuZGlhbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgMTZiaXQgYmlnIGVuZGlhbiwgtS1sYXcsIEEtbGF3Ci0tIHN1cHBvcnRlZCBjaGFubmVsczogbW9ubyBhbmQgc3RlcmVvCi0tIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlczogTWFzdGVyLCBDRCwgTGluZSwgTGluZTEsIExpbmUyLCBNaWMKLS0gc3VwcG9ydHMgcGhhdCAzZCBzdGVyZW8gY2lyY3VpdCAoTGluZSAzKQotCi0KLVN1cHBvcnRlZCBjYXJkczoKLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBjYXJkcyBhcmUga25vd24gdG8gd29yayB3aXRoIHRoaXMgZHJpdmVyOgotLSBUZXJyYXRlYyBCYXNlIDEgCi0tIFRlcnJhdGVjIEJhc2UgNjQgCi0tIEhQIEtheWFrIAotLSBBY2VyIEZYLTNECi0tIFNZLTE4MTYgCi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAzMiBXYXZlIDNECi0tIEhpZ2hzY3JlZW4gU291bmQtQm9vc3RhciAxNiAKLS0gQVZNIEFwZXggUHJvIGNhcmQgCi0tIChBenRlY2ggU0MtMTYgM0QpIAotLSAoTmV3Y29tIFNDLTE2IDNEKSAKLS0gKFRlcnJhdGVjIEVXUzY0UykgCi0KLUNhcmRzIGxpc3RlZCBpbiBicmFja2V0cyBhcmUgbm90IHN1cHBvcnRlZCByZWxpYWJsZS4gSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQgCi15b3Ugc2hvdWxkIGFkZCB0aGUgZXh0cmEgcGFyYW1ldGVyOgotICBvcHRpb25zPTEKLXdoZW4gbG9hZGluZyB0aGUgYWQxODE2IG1vZHVsZSB2aWEgbW9kcHJvYmUuIAotCi0KLVRyb3VibGVzaG9vdGluZzoKLS0tLS0tLS0tLS0tLS0tLS0KLQotRmlyc3Qgb2YgYWxsIHlvdSBzaG91bGQgY2hlY2ssIGlmIHRoZSBkcml2ZXIgaGFzIGJlZW4gbG9hZGVkCi1wcm9wZXJseS4KLQotSWYgbG9hZGluZyBvZiB0aGUgZHJpdmVyIHN1Y2NlZWRzLCBidXQgcGxheWJhY2svY2FwdHVyZSBmYWlscywgY2hlY2sKLWlmIHlvdSB1c2VkIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgaXJxLCBkbWEgYW5kIGRtYTIgd2hlbiBsb2FkaW5nIHRoZSBtb2R1bGUuCi1JZiBvbmUgb2YgdGhlbSBpcyB3cm9uZyB5b3UgdXN1YWxseSBnZXQgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlOgotCi1Ob3YgIDYgMTc6MDY6MTMgdGVrMDEga2VybmVsOiBTb3VuZDogRE1BIChvdXRwdXQpIHRpbWVkIG91dCAtIElSUS9EUlEgY29uZmlnIGVycm9yPwotCi1JZiBwbGF5YmFjay9jYXB0dXJlIGlzIHRvbyBmYXN0IG9yIHRvIHNsb3csIHlvdSBzaG91bGQgaGF2ZSBhIGxvb2sgYXQKLXRoZSBjbG9jayBjaGlwIG9mIHlvdXIgc291bmQgY2FyZC4gVGhlIEFEMTgxNiB3YXMgZGVzaWduZWQgZm9yIGEgMzNNSHoKLW9zY2lsbGF0b3IsIGhvd2V2ZXIgbW9zdCBzb3VuZCBjYXJkIG1hbnVmYWN0dXJlciB1c2Ugc2xpZ2h0bHkKLWRpZmZlcmVudCBvc2NpbGxhdG9ycyBhcyB0aGV5IGFyZSBjaGVhcGVyIHRoYW4gMzNNSHogb3NjaWxsYXRvcnMuIElmCi15b3UgaGF2ZSBzdWNoIGEgY2FyZCB5b3UgaGF2ZSB0byBhZGp1c3QgdGhlIGFkMTgxNl9jbG9ja2ZyZXEgcGFyYW1ldGVyCi1hYm92ZS4gRm9yIGV4YW1wbGU6IEZvciBhIGNhcmQgdXNpbmcgYSAzMi44NzVNSHogb3NjaWxsYXRvciB1c2UKLWFkMTgxNl9jbG9ja2ZyZXE9MzI4NzUgaW5zdGVhZCBvZiBhZDE4MTZfY2xvY2tmcmVxPTMzMDAwLgotCi0KLVVwZGF0ZXMsIGJ1Z2ZpeGVzIGFuZCBidWdyZXBvcnRzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQXMgdGhlIGRyaXZlciBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHVuZGVyIGRldmVsb3BtZW50LCB5b3Ugc2hvdWxkCi13YXRjaCBvdXQgZm9yIHVwZGF0ZXMuICBVcGRhdGVzIG9mIHRoZSBkcml2ZXIgYXJlIGF2YWlsYWJsZSBvbiB0aGUKLUludGVybmV0IGZyb20gb25lIG9mIG15IGhvbWUgcGFnZXM6Ci0gIGh0dHA6Ly93d3cuc3R1ZGVudC5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZS9+dGVrL3Byb2plY3RzL2xpbnV4Lmh0bWwKLW9yOgotICBodHRwOi8vd3d3LnR1LWRhcm1zdGFkdC5kZS9+dGVrMDEvcHJvamVjdHMvbGludXguaHRtbAotCi1CdWdyZXBvcnRzLCBidWdmaXhlcyBhbmQgcmVsYXRlZCBxdWVzdGlvbnMgc2hvdWxkIGJlIHNlbnQgdmlhIEUtTWFpbCB0bzoKLSAgdGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZQotCi1UaG9yc3RlbiBLbmFiZSA8dGVrQHJiZy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZT4KLUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KLQlMYXN0IG1vZGlmaWVkOiAyMDAwLzA5LzIwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9OTTI1NiBiL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAzMjE3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2CisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBOZW9NYWdpYyAyNTZBVi8yNTZaWCBzb3VuZCBkcml2ZXIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWW91J3JlIGxvb2tpbmcgYXQgdmVyc2lvbiAxLjEgb2YgdGhlIGRyaXZlci4gIChXb29ob28hKSBJdCBoYXMgYmVlbgotc3VjY2Vzc2Z1bGx5IHRlc3RlZCBhZ2FpbnN0IHRoZSBmb2xsb3dpbmcgbGFwdG9wIG1vZGVsczoKLQotCVNvbnkgWjUwNVMvWjUwNVNYL1o1MDVEWC9aNTA1UlgKLQlTb255IEYxNTAsIEYxNjAsIEYxODAsIEYyNTAsIEYyNzAsIEYyODAsIFBDRy1GMjYKLQlEZWxsIExhdGl0dWRlIENQaSwgQ1B0ICh2YXJpb3VzIHN1Ym1vZGVscykKLQotVGhlcmUgYXJlIGEgZmV3IGNhdmVhdHMsIHdoaWNoIGlzIHdoeSB5b3Ugc2hvdWxkIHJlYWQgdGhlIGVudGlyZXR5IG9mCi10aGlzIGRvY3VtZW50IGZpcnN0LgotCi1UaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIHdpdGhvdXQgYW55IHN1cHBvcnQgb3IgYXNzaXN0YW5jZSBmcm9tCi1OZW9NYWdpYy4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5LCBleHByZXNzZWQsIGltcGxpZWQsIG9yIG90aGVyd2lzZS4gIEl0Ci1pcyBmcmVlIHNvZnR3YXJlIGluIHRoZSBwdWJsaWMgZG9tYWluOyBmZWVsIGZyZWUgdG8gdXNlIGl0LCBzZWxsIGl0LAotZ2l2ZSBpdCB0byB5b3VyIGJlc3QgZnJpZW5kcywgZXZlbiBjbGFpbSB0aGF0IHlvdSB3cm90ZSBpdCAoYnV0IHdoeT8hKQotYnV0IGRvbid0IGdvIHdoaW5pbmcgdG8gbWUsIE5lb01hZ2ljLCBTb255LCBEZWxsLCBvciBhbnlvbmUgZWxzZQotd2hlbiBpdCBibG93cyB1cCB5b3VyIGNvbXB1dGVyLgotCi1WZXJzaW9uIDEuMSBjb250YWlucyBhIGNoYW5nZSB0byB0cnkgYW5kIGRldGVjdCBub24tQUM5NyB2ZXJzaW9ucyBvZgotdGhlIGhhcmR3YXJlLCBhbmQgbm90IGluc3RhbGwgaXRzZWxmIGFwcHJvcHJpYXRlbHkuICBJdCBzaG91bGQgYWxzbwotcmVpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBvbiBhbiBBUE0gcmVzdW1lIGV2ZW50LCBhc3N1bWluZyB0aGF0IEFQTQotd2FzIGNvbmZpZ3VyZWQgaW50byB5b3VyIGtlcm5lbC4KLQotPT09PT09PT09PT09Ci1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1FbmFibGUgdGhlIHNvdW5kIGRyaXZlcnMsIHRoZSBPU1Mgc291bmQgZHJpdmVycywgYW5kIHRoZW4gdGhlIE5NMjU2Ci1kcml2ZXIuICBUaGUgTk0yNTYgZHJpdmVyICptdXN0KiBiZSBjb25maWd1cmVkIGFzIGEgbW9kdWxlIChpdCB3b24ndAotZ2l2ZSB5b3UgYW55IG90aGVyIGNob2ljZSkuCi0KLU5leHQsIGRvIHRoZSB1c3VhbCAibWFrZSBtb2R1bGVzIiBhbmQgIm1ha2UgbW9kdWxlc19pbnN0YWxsIi4KLUZpbmFsbHksIGluc21vZCB0aGUgc291bmRjb3JlLCBzb3VuZCBhbmQgbm0yNTYgbW9kdWxlcy4KLQotV2hlbiB0aGUgbm0yNTYgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQsIHlvdSBzaG91bGQgc2VlIGEgY291cGxlIG9mCi1jb25maXJtYXRpb24gbWVzc2FnZXMgaW4gdGhlIGtlcm5lbCBsb2dmaWxlIGluZGljYXRpbmcgdGhhdCBpdCBmb3VuZAotdGhlIGRldmljZSAodGhlIGRldmljZSBkb2VzICpub3QqIHVzZSBhbnkgSS9PIHBvcnRzIG9yIERNQSBjaGFubmVscykuCi1Ob3cgdHJ5IHBsYXlpbmcgYSB3YXYgZmlsZSwgZnV0eiB3aXRoIHRoZSBDRC1ST00gaWYgeW91IGhhdmUgb25lLCBldGMuCi0KLVRoZSBOTTI1NiBpcyBlbnRpcmVseSBhIFBDSS1iYXNlZCBkZXZpY2UsIGFuZCBhbGwgdGhlIG5lY2Vzc2FyeQotaW5mb3JtYXRpb24gaXMgYXV0b21hdGljYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBjYXJkLiAgSXQgY2FuIG9ubHkgYmUKLWNvbmZpZ3VyZWQgYXMgYSBtb2R1bGUgaW4gYSB2YWluIGF0dGVtcHQgdG8gcHJldmVudCBwZW9wbGUgZnJvbQotaHVydGluZyB0aGVtc2VsdmVzLiAgSXQgd29ya3MgY29ycmVjdGx5IGlmIGl0IHNoYXJlcyBhbiBJUlEgd2l0aAotYW5vdGhlciBkZXZpY2UgKGl0IG5vcm1hbGx5IHNoYXJlcyBJUlEgOSB3aXRoIHRoZSBidWlsdGluIGVlcHJvMTAwCi1ldGhlcm5ldCBvbiB0aGUgU29ueSBaNTA1IGxhcHRvcHMpLiAKLQotSXQgZG9lcyBub3QgcnVuIHRoZSBjYXJkIGluIGFueSBzb3J0IG9mIGNvbXBhdGliaWxpdHkgbW9kZS4gSXQgd2lsbAotbm90IHdvcmsgb24gbGFwdG9wcyB0aGF0IGhhdmUgdGhlIFNCMTYtY29tcGF0aWJsZSwgQUQxODQ4LWNvbXBhdGlibGUKLW9yIENTNDIzMi1jb21wYXRpYmxlIGNvZGVjL21peGVyOyB5b3Ugd2lsbCB3YW50IHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUKLWNvbXBhdGlibGUgT1NTIGRyaXZlciB3aXRoIHRoZXNlIGNoaXBzZXRzLiAgSSBjYW5ub3QgcHJvdmlkZSBhbnkKLWFzc2lzdGFuY2Ugd2l0aCBtYWNoaW5lcyB1c2luZyB0aGUgU0IxNiwgQUQxODQ4IG9yIENTNDIzMiBjb21wYXRpYmxlCi12ZXJzaW9ucy4gIChUaGUgZHJpdmVyIG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgdGhlIG1peGVyIHZlcnNpb24sIGFuZAotd2lsbCByZWZ1c2UgdG8gbG9hZCBpZiBpdCBiZWxpZXZlcyB0aGUgaGFyZHdhcmUgaXMgbm90Ci1BQzk3LWNvbXBhdGlibGUuKQotCi1UaGUgc291bmQgc3VwcG9ydCBpcyB2ZXJ5IGJhc2ljLCBidXQgaXQgZG9lcyBpbmNsdWRlIHNpbXVsdGFuZW91cwotcGxheWJhY2sgYW5kIHJlY29yZCBjYXBhYmlsaXR5LiAgVGhlIG1peGVyIHN1cHBvcnQgaXMgYWxzbyBxdWl0ZQotc2ltcGxlLCBhbHRob3VnaCB0aGlzIGlzIGluIGtlZXBpbmcgd2l0aCB0aGUgcmF0aGVyIGxpbWl0ZWQKLWZ1bmN0aW9uYWxpdHkgb2YgdGhlIGNoaXBzZXQuCi0KLVRoZXJlIGlzIG5vIGhhcmR3YXJlIHN5bnRoZXNpemVyIGF2YWlsYWJsZSwgYXMgdGhlIExvc2Vkb3dzIE9QTC0zIGFuZAotTUlESSBzdXBwb3J0IGlzIGRvbmUgdmlhIGhhcmR3YXJlIGVtdWxhdGlvbi4KLQotT25seSB0aHJlZSByZWNvcmRpbmcgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBTb255OiB0aGUKLW1pY3JvcGhvbmUsIHRoZSBDRC1ST00gaW5wdXQsIGFuZCB0aGUgdm9sdW1lIGRldmljZSAod2hpY2ggY29ycmVzcG9uZHMKLXRvIHRoZSBzdGVyZW8gb3V0cHV0KS4gIChPdGhlciBkZXZpY2VzIG1heSBiZSBhdmFpbGFibGUgb24gb3RoZXIKLW1vZGVscyBvZiBsYXB0b3BzLikgIFRoZSBaNTA1IHNlcmllcyBkb2VzIG5vdCBoYXZlIGEgYnVpbHRpbiBDRC1ST00sCi1zbyBvZiBjb3Vyc2UgdGhlIENELVJPTSBpbnB1dCBkb2Vzbid0IHdvcmsuICBJdCBkb2VzIHdvcmsgb24gbGFwdG9wcwotd2l0aCBhIGJ1aWx0aW4gQ0QtUk9NIGRyaXZlLgotCi1UaGUgbWl4ZXIgZGV2aWNlIGRvZXMgbm90IGFwcGVhciB0byBoYXZlIGFueSB0b25lIGNvbnRyb2xzLCBhdCBsZWFzdAotb24gdGhlIFo1MDUgc2VyaWVzLiAgVGhlIG1peGVyIG1vZHVsZSBjaGVja3MgZm9yIHRvbmUgY29udHJvbHMgaW4gdGhlCi1BQzk3IG1peGVyLCBhbmQgd2lsbCBlbmFibGUgdGhlbSBpZiB0aGV5IGFyZSBhdmFpbGFibGUuCi0KLT09PT09PT09PT09PT09Ci1Lbm93biBwcm9ibGVtcwotPT09PT09PT09PT09PT0KLQotICAqIFRoZXJlIGFyZSBrbm93biBwcm9ibGVtcyB3aXRoIFBDTUNJQSBjYXJkcyBhbmQgdGhlIGVlcHJvMTAwIGV0aGVybmV0IAotICAgIGRyaXZlciBvbiB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWC4gIEtlZXAgcmVhZGluZy4KLQotICAqIFRoZXJlIGFyZSBhbHNvIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIHVzaW5nIGEgdmlydHVhbCBYIGRpc3BsYXksIGFuZAotICAgIGFsc28gcHJvYmxlbXMgbG9hZGluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBYIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLiAKLSAgICBLZWVwIHJlYWRpbmcuCi0KLSAgKiBUaGUgdm9sdW1lIGNvbnRyb2wgaXNuJ3QgYW55d2hlcmUgbmVhciBsaW5lYXIuICBTb3JyeS4gIFRoaXMgd2lsbCBiZQotICAgIGZpeGVkIGV2ZW50dWFsbHksIHdoZW4gSSBnZXQgc3VmZmljaWVudGx5IGFubm95ZWQgd2l0aCBpdC4gIChJIGRvdWJ0Ci0gICAgaXQgd2lsbCBldmVyIGJlIGZpeGVkIG5vdywgc2luY2UgSSd2ZSBuZXZlciBnb3R0ZW4gc3VmZmljaWVudGx5Ci0gICAgYW5ub3llZCB3aXRoIGl0IGFuZCBub2JvZHkgZWxzZSBzZWVtcyB0byBjYXJlLikKLQotICAqIFRoZXJlIGFyZSByZXBvcnRzIHRoYXQgdGhlIENELVJPTSB2b2x1bWUgaXMgdmVyeSBsb3cuICBTaW5jZSBJIGRvIG5vdAotICAgIGhhdmUgYSBDRC1ST00gZXF1aXBwZWQgbGFwdG9wLCBJIGNhbm5vdCB0ZXN0IHRoaXMgKGl0J3Mga2luZGEgaGFyZCB0bwotICAgIGRvIHJlbW90ZWx5KS4KLQotICAqIE9ubHkgOCBmaXhlZC1yYXRlIHNwZWVkcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBpcyBtYWlubHkgYSBjaGlwc2V0Ci0gICAgbGltaXRhdGlvbi4gIEl0IG1heSBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IG90aGVyIHNwZWVkcyBpbiB0aGUgZnV0dXJlLgotCi0gICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgdGhlIHRlbGVwaG9uZSBtaXhlci9jb2RlYy4gIFRoZXJlIGlzIHN1cHBvcnQKLSAgICBmb3IgYSBwaG9uZWluL3Bob25lb3V0IGRldmljZSBpbiB0aGUgbWl4ZXIgZHJpdmVyOyAgd2hldGhlciBvciBub3QgCi0gICAgaXQgZG9lcyBhbnl0aGluZyBpcyBhbnlvbmUncyBndWVzcy4gIChSZXBvcnRzIG9uIHRoaXMgd291bGQgYmUKLSAgICBhcHByZWNpYXRlZC4gIFlvdSdsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgcGhvbmUgdG8KLSAgICBnbyBvZmYtaG9vayBiZWZvcmUgaXQnbGwgd29yaywgdGhvLikKLQotICAqIFRoaXMgZHJpdmVyIHdhcyBub3Qgd3JpdHRlbiB3aXRoIGFueSBjb29wZXJhdGlvbiBvciBzdXBwb3J0IGZyb20KLSAgICBOZW9NYWdpYy4gIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYWJvdXQgdGhpcywgc2VlIHRoZWlyIHdlYnNpdGUKLSAgICBmb3IgdGhlaXIgb2ZmaWNpYWwgc3RhbmNlIG9uIHN1cHBvcnRpbmcgb3BlbiBzb3VyY2UgZHJpdmVycy4KLQotPT09PT09PT09PT09Ci1WaWRlbyBtZW1vcnkKLT09PT09PT09PT09PQotCi1UaGUgTmVvTWFnaWMgc291bmQgZW5naW5lIHVzZXMgYSBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5IG1lbW9yeSB0byBob2xkCi10aGUgc291bmQgYnVmZmVyLiAgKENyYXp5LCBlaD8pICBUaGUgTmVvTWFnaWMgdmlkZW8gQklPUyBzZXRzIHVwIGEKLXNwZWNpYWwgcG9pbnRlciBhdCB0aGUgdG9wIG9mIHZpZGVvIFJBTSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgdG9wIG9mCi10aGUgYXVkaW8gYnVmZmVyIHNob3VsZCBiZSBwbGFjZWQuCi0KLUF0IHRoZSBwcmVzZW50IHRpbWUgWEZyZWU4NiBpcyBhcHBhcmVudGx5IG5vdCBhd2FyZSBvZiB0aGlzLiAgSXQgd2lsbAotdGh1cyB3cml0ZSBvdmVyIGVpdGhlciB0aGUgcG9pbnRlciBvciB0aGUgc291bmQgYnVmZmVyIHdpdGggYWJhbmRvbi4KLShBY2NlbGVyYXRlZC1YIHNlZW1zIHRvIGRvIGEgYmV0dGVyIGpvYiBoZXJlLikKLQotVGhpcyBpbXBsaWVzIGEgZmV3IHRoaW5nczoKLQotICAqIFNvbWV0aW1lcyB0aGUgTk0yNTYgZHJpdmVyIGhhcyB0byBndWVzcyBhdCB3aGVyZSB0aGUgYnVmZmVyIAotICAgIHNob3VsZCBiZSBwbGFjZWQsIGVzcGVjaWFsbHkgaWYgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWZ0ZXIgdGhlCi0gICAgWCBzZXJ2ZXIgaXMgc3RhcnRlZC4gIEl0J3MgdXN1YWxseSBjb3JyZWN0LCBidXQgaXQgd2lsbCBjb25zaXN0ZW50bHkKLSAgICBmYWlsIG9uIHRoZSBTb255IEYyNTAuCi0KLSAgKiBWaXJ0dWFsIHNjcmVlbnMgZ3JlYXRlciB0aGFuIDEwMjR4NzY4eDE2IHVuZGVyIFhGcmVlODYgYXJlCi0gICAgcHJvYmxlbWF0aWMgb24gbGFwdG9wcyB3aXRoIG9ubHkgMi41TUIgb2Ygc2NyZWVuIFJBTS4gVGhpcwotICAgIGluY2x1ZGVzIGFsbCBvZiB0aGUgMjU2QVYtZXF1aXBwZWQgbGFwdG9wcy4gIChWaXJ0dWFsIGRpc3BsYXlzCi0gICAgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgMjU2WlgsIHdoaWNoIGhhcyBhdCBsZWFzdCA0TUIgb2YKLSAgICB2aWRlbyBSQU0uKQotCi1JZiB5b3Ugc3RhcnQgaGF2aW5nIHByb2JsZW1zIHdpdGggcmFuZG9tIG5vaXNlIGJlaW5nIG91dHB1dCBlaXRoZXIKLWNvbnN0YW50bHkgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gb24gdGhlIEYyNTApLCBvciB3aGVuIHdpbmRvd3MKLWFyZSBtb3ZlZCBhcm91bmQgKHRoaXMgaXMgdGhlIHVzdWFsIHN5bXB0b20gd2hlbiB1c2luZyBhIHZpcnR1YWwKLXNjcmVlbiksIHRoZSBiZXN0IGZpeCBpcyB0bwotCi0gICogRG9uJ3QgdXNlIGEgdmlydHVhbCBmcmFtZSBidWZmZXIuCi0gICogTWFrZSBzdXJlIHlvdSBsb2FkIHRoZSBOTTI1NiBtb2R1bGUgYmVmb3JlIHRoZSBYIHNlcnZlciBpcwotICAgIHN0YXJ0ZWQuCi0KLU9uIHRoZSBGMjUwLCBpdCBpcyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgZHJpdmVyIHRvIGxvYWQgcHJvcGVybHkgZXZlbgotYWZ0ZXIgdGhlIFhGcmVlODYgc2VydmVyIGlzIHN0YXJ0ZWQgYnkgZG9pbmc6Ci0KLQlpbnNtb2Qgbm0yNTYgYnVmZmVydG9wPTB4MjVhODAwCi0KLVRoaXMgZm9yY2VzIHRoZSBhdWRpbyBidWZmZXJzIHRvIHRoZSBjb3JyZWN0IG9mZnNldCBpbiBzY3JlZW4gUkFNLgotCi1PbmUgdXNlciBoYXMgcmVwb3J0ZWQgYSBzaW1pbGFyIHByb2JsZW0gb24gdGhlIFNvbnkgRjI3MCwgYWx0aG91Z2gKLW90aGVycyBhcHBhcmVudGx5IGFyZW4ndCBzZWVpbmcgYW55IHByb2JsZW1zLiAgSGlzIHN1Z2dlc3RlZCBjb21tYW5kCi1pcwotCi0JaW5zbW9kIG5tMjU2IGJ1ZmZlcnRvcD0weDI3MjgwMAotCi09PT09PT09PT09PT09PT09PQotT2ZmaWNpYWwgV1dXIHNpdGUKLT09PT09PT09PT09PT09PT09Ci0KLVRoZSBvZmZpY2lhbCBzaXRlIGZvciB0aGUgTk0yNTYgZHJpdmVyIGlzOgotCi0JaHR0cDovL3d3dy51Z2x4Lm9yZy9zb255Lmh0bWwKLQotWW91IHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgdGhlcmUsCi1hbmQgdGhlIGRyaXZlciB3aWxsIGJlIHN1cHBvcnRlZCBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4KLQotPT09PT09PT09PT09PT0KLVo1MDVSWCBhbmQgSURFCi09PT09PT09PT09PT09PQotCi1UaGVyZSBhcHBlYXJzIHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBJREUgY2hpcHNldCBvbiB0aGUgWjUwNVJYOyBvbmUKLW9mIHRoZSBzeW1wdG9tcyBpcyB0aGF0IHNvdW5kIHBsYXliYWNrIHBlcmlvZGljYWxseSBoYW5ncyAod2hlbiB0aGUKLWRpc2sgaXMgYWNjZXNzZWQpLiAgVGhlIHVzZXIgcmVwb3J0aW5nIHRoZSBwcm9ibGVtIGFsc28gcmVwb3J0ZWQgdGhhdAotZW5hYmxpbmcgYWxsIG9mIHRoZSBJREUgY2hpcHNldCB3b3JrYXJvdW5kcyBpbiB0aGUga2VybmVsIHNvbHZlZCB0aGUKLXByb2JsZW0sIHRobyBvYnZpb3VzbHkgb25seSBvbmUgb2YgdGhlbSBzaG91bGQgYmUgbmVlZGVkLS1pZiBzb21lb25lCi1jYW4gZ2l2ZSBtZSBtb3JlIGRldGFpbHMgSSB3b3VsZCBhcHByZWNpYXRlIGl0LgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVo1MDVTL1o1MDVTWCBvbi1ib2FyZCBFdGhlcm5ldAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSdyZSB1c2luZyB0aGUgb24tYm9hcmQgRXRoZXJuZXQgUHJvLzEwMCBldGhlcm5ldCBzdXBwb3J0IG9uIHRoZSBaNTA1Ci1zZXJpZXMsIEkgc3Ryb25nbHkgZW5jb3VyYWdlIHlvdSB0byBkb3dubG9hZCB0aGUgbGF0ZXN0IGVlcHJvMTAwIGRyaXZlciBmcm9tCi1Eb25hbGQgQmVja2VyJ3Mgc2l0ZToKLQotCWZ0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L3B1Yi9saW51eC9kcml2ZXJzL3Rlc3QvZWVwcm8xMDAuYwotCi1UaGVyZSB3YXMgYSByZXBvcnRlZCBwcm9ibGVtIG9uIHRoZSBaNTA1U1ggdGhhdCBpZiB0aGUgZXRoZXJuZXQKLWludGVyZmFjZSBpcyBkaXNhYmxlZCBhbmQgcmVlbmFibGVkIHdoaWxlIHRoZSBzb3VuZCBkcml2ZXIgaXMgbG9hZGVkLAotdGhlIG1hY2hpbmUgd291bGQgbG9jayB1cC4gIEkgaGF2ZSBpbmNsdWRlZCBhIHdvcmthcm91bmQgdGhhdCBpcwotd29ya2luZyBzYXRpc2ZhY3RvcmlseS4gIEhvd2V2ZXIsIHlvdSBtYXkgb2NjYXNpb25hbGx5IHNlZSBhIG1lc3NhZ2UKLWFib3V0ICJSZWxlYXNpbmcgaW50ZXJydXB0cywgb3ZlciAxMDAwIGJhZCBpbnRlcnJ1cHRzIiB3aGljaCBpbmRpY2F0ZXMKLXRoYXQgdGhlIHdvcmthcm91bmQgaXMgZG9pbmcgaXRzIGpvYi4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUENNQ0lBIGFuZCB0aGUgWjUwNVMvWjUwNVNYL1o1MDVEWAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBpcyBhbHNvIGEga25vd24gcHJvYmxlbSB3aXRoIHRoZSBTb255IFo1MDVTIGFuZCBaNTA1U1ggaGFuZ2luZwotaWYgYSBQQ01DSUEgY2FyZCBpcyBpbnNlcnRlZCB3aGlsZSB0aGUgZXRoZXJuZXQgZHJpdmVyIGlzIGxvYWRlZCwgb3IKLWluIHNvbWUgY2FzZXMgaWYgdGhlIGxhcHRvcCBpcyBzdXNwZW5kZWQuICBUaGlzIGlzIGNhdXNlZCBieSB0b25zIG9mCi1zcHVyaW91cyBJUlEgOXMsIHByb2JhYmx5IGdlbmVyYXRlZCBmcm9tIHRoZSBQQ01DSUEgb3IgQUNQSSBicmlkZ2VzLgotCi1UaGVyZSBpcyBjdXJyZW50bHkgbm8gZml4IGZvciB0aGUgcHJvYmxlbSB0aGF0IHdvcmtzIGluIGV2ZXJ5IGNhc2UuCi1UaGUgb25seSBrbm93biB3b3JrYXJvdW5kcyBhcmUgdG8gZGlzYWJsZSB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlCi1iZWZvcmUgaW5zZXJ0aW5nIG9yIHJlbW92aW5nIGEgUENNQ0lBIGNhcmQsIG9yIHdpdGggc29tZSBjYXJkcwotZGlzYWJsaW5nIHRoZSBQQ01DSUEgY2FyZCBiZWZvcmUgZWplY3RpbmcgaXQgd2lsbCBhbHNvIGhlbHAgdGhlCi1wcm9ibGVtIHdpdGggdGhlIGxhcHRvcCBoYW5naW5nIHdoZW4gdGhlIGNhcmQgaXMgZWplY3RlZC4KLQotT25lIHVzZXIgaGFzIHJlcG9ydGVkIHRoYXQgc2V0dGluZyB0aGUgdGNpYydzIGNzX2lycSB0byBzb21lIHZhbHVlCi1vdGhlciB0aGFuIDkgKGxpa2UgMTEpIGZpeGVkIHRoZSBwcm9ibGVtLiAgVGhpcyBkb2Vzbid0IHdvcmsgb24gbXkKLVo1MDVTLCBob3dldmVyLS1jaGFuZ2luZyB0aGUgdmFsdWUgY2F1c2VzIHRoZSBjYXJkbWdyIHRvIHN0b3Agc2VlaW5nCi1jYXJkIGluc2VydGlvbnMgYW5kIHJlbW92YWxzLCBjYXJkcyBkb24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5LCBhbmQKLUkgc3RpbGwgZ2V0IGhhbmdzIGlmIGEgY2FyZCBpcyBpbnNlcnRlZCB3aGVuIHRoZSBrZXJuZWwgaXMgYm9vdGVkLgotCi1Vc2luZyB0aGUgbGF0ZXN0IGV0aGVybmV0IGRyaXZlciBhbmQgcGNtY2lhIHBhY2thZ2UgYWxsb3dzIG1lIHRvCi1pbnNlcnQgYW4gQWRhcHRlYyAxNDgwQSBTbGltU2NzaSBjYXJkIHdpdGhvdXQgdGhlIGxhcHRvcCBoYW5naW5nLAotYWx0aG91Z2ggSSBzdGlsbCBoYXZlIHRvIHNodXQgZG93biB0aGUgY2FyZCBiZWZvcmUgZWplY3Rpbmcgb3IKLXBvd2VyaW5nIGRvd24gdGhlIGxhcHRvcC4gIEhvd2V2ZXIsIHNpbWlsYXIgZXhwZXJpbWVudHMgd2l0aCBhIERFLTY2MAotZXRoZXJuZXQgY2FyZCBzdGlsbCByZXN1bHQgaW4gaGFuZ3Mgd2hlbiB0aGUgY2FyZCBpcyBpbnNlcnRlZC4gIEkgYW0KLWJlZ2lubmluZyB0byB0aGluayB0aGF0IHRoZSBpbnRlcnJ1cHRzIGFyZSBDYXJkQnVzLXJlbGF0ZWQsIHNpbmNlIHRoZQotQWRhcHRlYyBjYXJkIGlzIGEgQ2FyZEJ1cyBjYXJkLCBhbmQgdGhlIERFLTY2MCBpcyBub3Q7IGhvd2V2ZXIsIEkKLWRvbid0IGhhdmUgYW55IG90aGVyIENhcmRCdXMgY2FyZHMgdG8gdGVzdCB3aXRoLgotCi09PT09PT0KLVRoYW5rcwotPT09PT09Ci0KLUZpcnN0LCBJIHdhbnQgdG8gdGhhbmsgZXZlcnlvbmUgKGV4Y2VwdCBOZW9NYWdpYyBvZiBjb3Vyc2UpIGZvciB0aGVpcgotZ2VuZXJvdXMgc3VwcG9ydCBhbmQgZW5jb3VyYWdlbWVudC4gIEknZCBsaWtlIHRvIGxpc3QgZXZlcnlvbmUncyBuYW1lCi1oZXJlIHRoYXQgcmVwbGllZCBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHBoYXNlLCBidXQgdGhlIGxpc3QgaXMKLWFtYXppbmdseSBsb25nLgotCi1JIHdpbGwgYmUgcmF0aGVyIHVuZmFpciBhbmQgc2luZ2xlIG91dCBhIGZldyBwZW9wbGUsIGhvd2V2ZXI6Ci0KLQlKdXN0aW4gTWF1cmVyLCBmb3IgYmVpbmcgdGhlIGZpcnN0IHJhbmRvbSBuZXQucGVyc29uIHRvIHRyeSBpdCwKLQlhbmQgZm9yIGxldHRpbmcgbWUgbG9naW4gdG8gaGlzIFo1MDVTWCB0byBnZXQgaXQgd29ya2luZyB0aGVyZQotCi0JRWRpIFdlaXR6IGZvciB0cnlpbmcgb3V0IHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zLCBhbmQgZ2l2aW5nCi0JbWUgYSBsb3Qgb2YgdXNlZnVsIGZlZWRiYWNrCi0KLQlHcmVnIFJ1bXBsZSBmb3IgbGV0dGluZyBtZSBsb2dpbiByZW1vdGVseSB0byBnZXQgdGhlIGRyaXZlciAKLQlmdW5jdGlvbmFsIG9uIHRoZSAyNTZaWCwgZm9yIGhpcyBhc3Npc3RhbmNlIG9uIHRyYWNraW5nCi0JZG93biBhbGwgc29ydHMgb2YgcmFuZG9tIHN0dWZmLCBhbmQgZm9yIHRyeWluZyBvdXQgQWNjZWwtWAotCi0JWmFjaCBCcm93biwgZm9yIHRoZSBpbml0aWFsIEFDOTcgbWl4ZXIgaW50ZXJmYWNlIGRlc2lnbgotCi0JSmVmZiBHYXJ6aWssIGZvciB2YXJpb3VzIGhlbHBmdWwgc3VnZ2VzdGlvbnMgb24gdGhlIEFDOTcKLQlpbnRlcmZhY2UKLQotCSJNci4gQnVtcHkiIGZvciBmZWVkYmFjayBvbiB0aGUgWjUwNVJYCi0KLQlCaWxsIE5vdHRpbmdoYW0sIGZvciBnZW5lcm91cyBhc3Npc3RhbmNlIGluIGdldHRpbmcgdGhlIG1peGVyIElECi0JY29kZSB3b3JraW5nCi0KLT09PT09PT09PT09PT09PT09Ci1QcmV2aW91cyB2ZXJzaW9ucwotPT09PT09PT09PT09PT09PT0KLQotVmVyc2lvbnMgcHJpb3IgdG8gMC4zIChha2EgYG5vbmFtZScpIGhhZCBwcm9ibGVtcyB3aXRoIHdlaXJkIGFydGlmYWN0cwotaW4gdGhlIG91dHB1dCBhbmQgZmFpbGVkIHRvIHNldCB0aGUgcmVjb3JkaW5nIHJhdGUgcHJvcGVybHkuICBUaGVzZQotcHJvYmxlbXMgaGF2ZSBsb25nIHNpbmNlIGJlZW4gZml4ZWQuCi0KLVZlcnNpb25zIHByaW9yIHRvIDAuNSBoYWQgcHJvYmxlbXMgd2l0aCBjbGlja3MgaW4gdGhlIG91dHB1dCB3aGVuCi1hbnl0aGluZyBvdGhlciB0aGFuIDE2LWJpdCBzdGVyZW8gc291bmQgd2FzIGJlaW5nIHBsYXllZCwgYW5kIGFsc28gaGFkCi1wZXJpb2RpYyBjbGlja3Mgd2hlbiByZWNvcmRpbmcuCi0KLVZlcnNpb24gMC43IGZpcnN0IGluY29ycG9yYXRlZCBzdXBwb3J0IGZvciB0aGUgTk0yNTZaWCBjaGlwc2V0LCB3aGljaAotaXMgZm91bmQgb24gc29tZSBEZWxsIExhdGl0dWRlIGxhcHRvcHMgKHRoZSBDUHQsIGFuZCBhcHBhcmVudGx5Ci1zb21lIENQaSBtb2RlbHMgYXMgd2VsbCkuICBJdCBhbHNvIGluY2x1ZGVkIHRoZSBnZW5lcmljIEFDOTcKLW1peGVyIG1vZHVsZS4KLQotVmVyc2lvbiAwLjc1IHJlbmFtZWQgYWxsIHRoZSBmdW5jdGlvbnMgYW5kIGZpbGVzIHdpdGggc2xpZ2h0bHkgbW9yZQotZ2VuZXJpYyBuYW1lcy4KLQotTm90ZSB0aGF0IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgZG9jdW1lbnQgY2xhaW1lZCB0aGF0IHJlY29yZGluZyB3YXMKLTgtYml0IG9ubHk7IGl0IGFjdHVhbGx5IGhhcyBiZWVuIHdvcmtpbmcgZm9yIDE2LWJpdHMgYWxsIGFsb25nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvT1BMMy1TQTIgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNmQyYi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBMgorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi1Eb2N1bWVudGF0aW9uIGZvciB0aGUgT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBkcml2ZXIgKG9wbDNzYTIubykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TY290dCBNdXJyYXksIHNjb3R0QHNwaXRlZnVsLm9yZwotSmFudWFyeSA3LCAyMDAxCi0KLU5PVEU6IEFsbCB0cmFkZS1tYXJrZWQgdGVybXMgbWVudGlvbmVkIGJlbG93IGFyZSBwcm9wZXJ0aWVzIG9mIHRoZWlyCi0gICAgICByZXNwZWN0aXZlIG93bmVycy4KLQotCi1TdXBwb3J0ZWQgRGV2aWNlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBkcml2ZXIgaXMgZm9yIFBuUCBzb3VuZGNhcmRzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgWWFtYWhhIGF1ZGlvCi1jb250cm9sbGVyIGNoaXBzZXRzOgotCi1ZTUY3MTEgYWthIE9QTDMtU0EyCi1ZTUY3MTUgYW5kIFlNRjcxOSBha2EgT1BMMy1TQTMKLQotVXAgdW50aWwgcmVjZW50bHkgKERlY2VtYmVyIDIwMDApLCBJJ2QgdGhvdWdodCB0aGUgNzE5IHRvIGJlIGEKLWRpZmZlcmVudCBjaGlwc2V0LCB0aGUgT1BMMy1TQXguICBBZnRlciBhbiBlbWFpbCBleGhhbmdlIHdpdGgKLVlhbWFoYSwgaG93ZXZlciwgaXQgdHVybnMgb3V0IHRoYXQgdGhlIDcxOSBpcyBqdXN0IGEgcmUtYmFkZ2VkCi03MTUsIGFuZCB0aGUgY2hpcHNldHMgYXJlIGlkZW50aWNhbC4gIFRoZSBjaGlwc2V0IGRldGVjdGlvbiBjb2RlCi1oYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcy4KLQotQW55d2F5cywgYWxsIG9mIHRoZXNlIGNoaXBzZXRzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGRldmljZXM6Ci0KLU9QTDMgRk0gc3ludGhlc2l6ZXIKLVNvdW5kYmxhc3RlciBQcm8KLU1pY3Jvc29mdC9XaW5kb3dzIFNvdW5kIFN5c3RlbQotTVBVNDAxIE1JREkgaW50ZXJmYWNlCi0KLU5vdGUgdGhhdCB0aGlzIGRyaXZlciB1c2VzIHRoZSBNU1MgZGV2aWNlLCBhbmQgdG8gbXkga25vd2xlZGdlIHRoZXNlCi1jaGlwc2V0cyBlbmZvcmNlIGFuIGVpdGhlci9vciBzaXR1YXRpb24gd2l0aCB0aGUgU291bmRibGFzdGVyIFBybwotZGV2aWNlIGFuZCB0aGUgTVNTIGRldmljZS4gIFNpbmNlIHRoZSBNU1MgZGV2aWNlIGhhcyBiZXR0ZXIKLWNhcGFiaWxpdGllcywgSSBoYXZlIGltcGxlbWVudGVkIHRoZSBkcml2ZXIgdG8gdXNlIGl0LgotCi0KLU1peGVyIENoYW5uZWxzCi0tLS0tLS0tLS0tLS0tLQotCi1PbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlciAocHJlLURlY2VtYmVyIDIwMDApIGhhZCB0d28gbWl4ZXJzLAotYW4gT1BMMy1TQTIgb3IgU0EzIG1peGVyIGFuZCBhIE1TUyBtaXhlci4gIFRoZSBPUEwzLVNBWzIzXSBtaXhlcgotZGV2aWNlIGNvbnRhaW5lZCBhIHN1cGVyc2V0IG9mIG1peGVyIGNoYW5uZWxzIGNvbnNpc3Rpbmcgb2YgaXRzIG93bgotY2hhbm5lbHMgYW5kIGFsbCBvZiB0aGUgTVNTIG1peGVyIGNoYW5uZWxzLiAgVG8gc2ltcGxpZnkgdGhlIGRyaXZlcgotY29uc2lkZXJhYmx5LCBhbmQgdG8gcGFydGl0aW9uIGZ1bmN0aW9uYWxpdHkgYmV0dGVyLCB0aGUgT1BMMy1TQVsyM10KLW1peGVyIGRldmljZSBub3cgY29udGFpbnMgaGFzIGl0cyBvd24gc3BlY2lmaWMgbWl4ZXIgY2hhbm5lbHMuICBUaGV5Ci1hcmU6Ci0KLVZvbHVtZSAgICAgLSBIYXJkd2FyZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wKLUJhc3MgICAgICAgLSBTQTMgb25seSwgbm93IHN1cHBvcnRzIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCi1UcmVibGUgICAgIC0gU0EzIG9ubHksIG5vdyBzdXBwb3J0cyBsZWZ0IGFuZCByaWdodCBjaGFubmVscwotTWljcm9waG9uZSAtIEhhcmR3YXJlIG1pY3JvcGhvbmUgaW5wdXQgdm9sdW1lIGNvbnRyb2wKLURpZ2l0YWwxICAgLSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgIldpZGUiIG1peGVyCi0KLUFsbCBvdGhlciBtaXhlciBjaGFubmVscyAoZS5nLiAiUENNIiwgIkNEIiwgZXRjLikgbm93IGhhdmUgdG8gYmUKLWNvbnRyb2xsZWQgdmlhIHRoZSAiTVMgU291bmQgU3lzdGVtIChDUzQyMzEpIiBtaXhlci4gIFRvIGZhY2lsaXRhdGUKLXRoaXMsIHRoZSBtaXhlciBkZXZpY2UgY3JlYXRpb24gb3JkZXIgaGFzIGJlZW4gc3dpdGNoZWQgc28gdGhhdAotdGhlIE1TUyBtaXhlciBpcyBjcmVhdGVkIGZpcnN0LiAgVGhpcyBhbGxvd3MgYWNjZXNzaW5nIHRoZSBtYWpvcml0eQotb2YgdGhlIHVzZWZ1bCBtaXhlciBjaGFubmVscyBldmVuIHZpYSBzaW5nbGUgbWl4ZXItYXdhcmUgdG9vbHMKLXN1Y2ggYXMgImF1bWl4Ii4KLQotCi1QbHVnICduIFBsYXkKLS0tLS0tLS0tLS0tLQotCi1JbiBwcmV2aW91cyBrZXJuZWxzICgyLjIueCksIHNvbWUgY29uZmlndXJhdGlvbiB3YXMgcmVxdWlyZWQgdG8KLWdldCB0aGUgZHJpdmVyIHRvIHRhbGsgdG8gdGhlIGNhcmQuICBCZWluZyB0aGUgbmV3IG1pbGxlbm5pdW0gYW5kCi1hbGwsIHRoZSAyLjQueCBrZXJuZWxzIG5vdyBzdXBwb3J0IGF1dG8tY29uZmlndXJhdGlvbiBpZiBJU0EgUG5QCi1zdXBwb3J0IGlzIGNvbmZpZ3VyZWQgaW4uICBUaGVvcmV0aWNhbGx5LCB0aGUgZHJpdmVyIGV2ZW4gc3VwcG9ydHMKLWhhdmluZyBtb3JlIHRoYW4gb25lIGNhcmQgaW4gdGhpcyBjYXNlLgotCi1XaXRoIHRoZSBhZGRpdGlvbiBvZiBQblAgc3VwcG9ydCB0byB0aGUgZHJpdmVyLCB0d28gbmV3IHBhcmFtZXRlcnMKLWhhdmUgYmVlbiBhZGRlZCB0byBjb250cm9sIGl0OgotCi1pc2FwbnAgICAtIHNldCB0byAwIHRvIGRpc2FibGUgSVNBIFBuUCBjYXJkIGRldGVjdGlvbgotCi1tdWx0aXBsZSAtIHNldCB0byAwIHRvIGRpc2FibGUgbXVsdGlwbGUgUG5QIGNhcmQgZGV0ZWN0aW9uCi0KLQotT3B0aW9uYWwgUGFyYW1ldGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWNlbnQgKERlY2VtYmVyIDIwMDApIGFkZGl0aW9ucyB0byB0aGUgZHJpdmVyIChiYXNlZCBvbiBhIHBhdGNoCi1wcm92aWRlZCBieSBQZXRlciBFbmdsbWFpZXIpIGFyZSB0d28gbmV3IHBhcmFtZXRlcnM6Ci0KLXltb2RlIC0gICAgU2V0IFlhbWFoYSAzRCBlbmhhbmNlbWVudCBtb2RlOgotICAgICAgICAgICAwID0gRGVza3RvcC9Ob3JtYWwgIDUtMTIgY20gc3BlYWtlcnMKLSAgICAgICAgICAgMSA9IE5vdGVib29rIFBDICgxKSAzIGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDIgPSBOb3RlYm9vayBQQyAoMikgMS41IGNtIHNwZWFrZXJzCi0gICAgICAgICAgIDMgPSBIaS1GaSAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKLQotbG9vcGJhY2sgLSBTZXQgQS9EIGlucHV0IHNvdXJjZS4gVXNlZnVsIGZvciBlY2hvIGNhbmNlbGxhdGlvbjoKLSAgICAgICAgICAgMCA9IE1pYyBSaWdodCBjaGFubmVsIChkZWZhdWx0KQotICAgICAgICAgICAxID0gTW9ubyBvdXRwdXQgbG9vcGJhY2sKLQotVGhlIHltb2RlIHBhcmFtZXRlciBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGRvZXMgd29yay4gIFRoZSBsb29wYmFjawotcGFyYW1ldGVyLCBob3dldmVyLCBpcyB1bnRlc3RlZC4gIEFueSBmZWVkYmFjayBvbiBpdHMgdXNlZnVsbmVzcwotd291bGQgYmUgYXBwcmVjaWF0ZWQuCi0KLQotTWFudWFsIENvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGZvciBzb21lIHJlYXNvbiB5b3UgZGVjaWRlIG5vdCB0byBjb21waWxlIElTQSBQblAgc3VwcG9ydCBpbnRvCi15b3VyIGtlcm5lbCwgb3IgZGlzYWJsZWQgdGhlIGRyaXZlcidzIHVzYWdlIG9mIGl0IGJ5IHNldHRpbmcgdGhlCi1pc2FwbnAgcGFyYW1ldGVyIGFzIGRpc2N1c3NlZCBhYm92ZSwgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGRvIHNvbWUKLW1hbnVhbCBjb25maWd1cmF0aW9uLiAgVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoaXMuICBUaGUgbW9zdAotY29tbW9uIGlzIHRvIHVzZSB0aGUgaXNhcG5wdG9vbHMgcGFja2FnZSB0byBpbml0aWFsaXplIHRoZSBjYXJkLCBhbmQKLXVzZSB0aGUga2VybmVsIG1vZHVsZSBmb3JtIG9mIHRoZSBzb3VuZCBzdWJzeXN0ZW0gYW5kIHNvdW5kIGRyaXZlcnMuCi1BbHRlcm5hdGl2ZWx5LCBzb21lIEJJT1MncyBhbGxvdyBtYW51YWwgY29uZmlndXJhdGlvbiBvZiBpbnN0YWxsZWQKLVBuUCBkZXZpY2VzIGluIGEgQklPUyBtZW51LCB3aGljaCBzaG91bGQgYWxsb3cgdXNpbmcgdGhlIG5vbi1tb2R1bGFyCi1zb3VuZCBkcml2ZXJzLCBpLmUuIGJ1aWx0IGludG8gdGhlIGtlcm5lbC4KLQotSSBwZXJzb25hbGx5IHVzZSBpc2FwbnAgYW5kIG1vZHVsZXMsIGFuZCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gYSBQblAKLUJJT1MgbWFjaGluZSB0byB0ZXN0LiAgSWYgeW91IGhhdmUgc3VjaCBhIGJlYXN0LCBjb25maWd1cmluZyB0aGUKLWRyaXZlciB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwgc2hvdWxkIGp1c3Qgd29yayAodGhhbmtzIHRvIHdvcmsKLWRvbmUgYnkgRGF2aWQgTHV5ZXIgPGx1eWVyQHVjcy51d2EuZWR1LmF1PikuICBZb3Ugd2lsbCBzdGlsbCBuZWVkCi10byBzcGVjaWZ5IHNldHRpbmdzLCB3aGljaCBjYW4gYmUgZG9uZSBieSBhZGRpbmc6Ci0KLW9wbDNzYTI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPG1zc2lvPiw8bXB1aW8+Ci0KLXRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiAgRm9yIGV4YW1wbGU6Ci0KLW9wbDNzYTI9MHgzNzAsNSwwLDEsMHg1MzAsMHgzMzAKLQotSWYgeW91IGFyZSBpbnN0ZWFkIHVzaW5nIHRoZSBpc2FwbnAgdG9vbHMgKGFzIG1vc3QgcGVvcGxlIGhhdmUgYmVlbgotYmVmb3JlIExpbnV4IDIuNC54KSwgZm9sbG93IHRoZSBkaXJlY3Rpb25zIGluIHRoZWlyIGRvY3VtZW50YXRpb24gdG8KLXByb2R1Y2UgYSBjb25maWd1cmF0aW9uIGZpbGUuICBIZXJlIGlzIHRoZSByZWxldmFudCBleGNlcnB0IEkgdXNlZCB0bwotdXNlIGZvciBteSBTQTMgY2FyZCBmcm9tIG15IGlzYXBucC5jb25mOgotCi0oQ09ORklHVVJFIFlNSDA4MDAvLTEgKExEIDAKLQotIyBOT1RFOiBJTyAwIGlzIGZvciB0aGUgdW51c2VkIFNvdW5kQmxhc3RlciBwYXJ0IG9mIHRoZSBjaGlwc2V0LgotKElPIDAgKEJBU0UgMHgwMjIwKSkKLShJTyAxIChCQVNFIDB4MDUzMCkpCi0oSU8gMiAoQkFTRSAweDAzODgpKQotKElPIDMgKEJBU0UgMHgwMzMwKSkKLShJTyA0IChCQVNFIDB4MDM3MCkpCi0oSU5UIDAgKElSUSA1IChNT0RFICtFKSkpCi0oRE1BIDAgKENIQU5ORUwgMCkpCi0oRE1BIDEgKENIQU5ORUwgMSkpCi0KLUhlcmUsIG5vdGUgdGhhdDoKLQotUG9ydCAgQWNjZXB0YWJsZSBSYW5nZSAgUHVycG9zZQotLS0tLSAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLQotSU8gMCAgMHgwMjIwIC0gMHgwMjgwICAgU0IgYmFzZSBhZGRyZXNzLCB1bnVzZWQuCi1JTyAxICAweDA1MzAgLSAweDBGNDggICBNU1MgYmFzZSBhZGRyZXNzCi1JTyAyICAweDAzODggLSAweDAzRjggICBPUEwzIGJhc2UgYWRkcmVzcwotSU8gMyAgMHgwMzAwIC0gMHgwMzM0ICAgTVBVIGJhc2UgYWRkcmVzcwotSU8gNCAgMHgwMTAwIC0gMHgwRkZFICAgY2FyZCdzIG93biBiYXNlIGFkZHJlc3MgZm9yIGl0cyBjb250cm9sIEkvTyBwb3J0cwotCi1UaGUgSVJRIGFuZCBETUEgdmFsdWVzIGNhbiBiZSBhbnkgdGhhdCBhcmUgY29uc2lkZXJlZCBhY2NlcHRhYmxlIGZvciBhCi1NU1MuICBBc3N1bWluZyB5b3UndmUgZ290IGlzYXBucCBhbGwgaGFwcHksIHRoZW4geW91IHNob3VsZCBiZSBhYmxlIHRvCi1kbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nICh3aGljaCBtYXRjaGVzIHVwIHdpdGggdGhlIGlzYXBucAotY29uZmlndXJhdGlvbiBhYm92ZSk6Ci0KLW1vZHByb2JlIG1wdTQwMQotbW9kcHJvYmUgYWQxODQ4Ci1tb2Rwcm9iZSBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTUgZG1hPTAgZG1hMj0xCi1tb2Rwcm9iZSBvcGwzIGlvPTB4Mzg4Ci0KLVNlZSB0aGUgc2VjdGlvbiAiQXV0b21hdGljIE1vZHVsZSBMb2FkaW5nIiBiZWxvdyBmb3IgaG93IHRvIHNldCB1cAotL2V0Yy9tb2Rwcm9iZS5jb25mIHRvIGF1dG9tYXRlIHRoaXMuCi0KLUFuIGltcG9ydGFudCB0aGluZyB0byByZW1lbWJlciB0aGF0IHRoZSBvcGwzc2EyIG1vZHVsZSdzIGlvIGFyZ3VtZW50IGlzCi1mb3IgaXQncyBvd24gY29udHJvbCBwb3J0LCB3aGljaCBoYW5kbGVzIHRoZSBjYXJkJ3MgbWFzdGVyIG1peGVyIGZvcgotdm9sdW1lIChvbiBhbGwgY2FyZHMpLCBhbmQgYmFzcyBhbmQgdHJlYmxlIChvbiBTQTMgY2FyZHMpLgotCi0KLVRyb3VibGVzaG9vdGluZwotLS0tLS0tLS0tLS0tLS0tCi0KLUlmIGFsbCBnb2VzIHdlbGwgYW5kIHlvdSBzZWUgbm8gZXJyb3IgbWVzc2FnZXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0bwotc3RhcnQgdXNpbmcgdGhlIHNvdW5kIGNhcGFiaWxpdGllcyBvZiB5b3VyIHN5c3RlbS4gIElmIHlvdSBnZXQgYW4KLWVycm9yIG1lc3NhZ2Ugd2hpbGUgdHJ5aW5nIHRvIGluc2VydCB0aGUgb3BsM3NhMiBtb2R1bGUsIHRoZW4gbWFrZQotc3VyZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlvdXMgYXJndW1lbnRzIG1hdGNoIHdoYXQgeW91IHNwZWNpZmllZAotaW4geW91ciBpc2FwbnAgY29uZmlndXJhdGlvbiBmaWxlLCBhbmQgdGhhdCB0aGVyZSBpcyBubyBjb25mbGljdCB3aXRoCi1hbm90aGVyIGRldmljZSBmb3IgYW4gSS9PIHBvcnQgb3IgaW50ZXJydXB0LiAgQ2hlY2tpbmcgdGhlIGNvbnRlbnRzIG9mCi0vcHJvYy9pb3BvcnRzIGFuZCAvcHJvYy9pbnRlcnJ1cHRzIGNhbiBiZSB1c2VmdWwgdG8gc2VlIGlmIHlvdSdyZQotYnV0dGluZyBoZWFkcyB3aXRoIGFub3RoZXIgZGV2aWNlLgotCi1JZiB5b3Ugc3RpbGwgY2Fubm90IGdldCB0aGUgbW9kdWxlIHRvIGxvYWQsIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mCi15b3VyIHN5c3RlbSBsb2cgZmlsZSwgdXN1YWxseSAvdmFyL2xvZy9tZXNzYWdlcy4gIElmIHlvdSBzZWUgdGhlCi1tZXNzYWdlICJvcGwzc2EyOiBVbmtub3duIFlhbWFoYSBhdWRpbyBjb250cm9sbGVyIHZlcnNpb24iLCB0aGVuIHlvdQotaGF2ZSBhIGRpZmZlcmVudCBjaGlwc2V0IHZlcnNpb24gdGhhbiBJJ3ZlIGVuY291bnRlcmVkIHNvIGZhci4gIExvb2sKLWZvciBhbGwgbWVzc2FnZXMgaW4gdGhlIGxvZyBmaWxlIHRoYXQgc3RhcnQgd2l0aCAib3BsM3NhMjogIiBhbmQgc2VlCi1pZiB0aGV5IHByb3ZpZGUgYW55IGNsdWVzLiAgSWYgeW91IGRvIG5vdCBzZWUgdGhlIGNoaXBzZXQgdmVyc2lvbgotbWVzc2FnZSwgYW5kIG5vbmUgb2YgdGhlIG90aGVyIG1lc3NhZ2VzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSBsb2cgYXJlCi1oZWxwZnVsLCBlbWFpbCBtZSBzb21lIGRldGFpbHMgYW5kIEknbGwgdHJ5IG15IGJlc3QgdG8gaGVscC4KLQotCi1BdXRvbWF0aWMgTW9kdWxlIExvYWRpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXN0bHksIGlmIHlvdSdyZSB1c2luZyBtb2R1bGVzIGFuZCB3YW50IHRvIHNldCB1cCBhdXRvbWF0aWMgbW9kdWxlCi1sb2FkaW5nIHdpdGgga21vZCwgdGhlIGtlcm5lbCBtb2R1bGUgbG9hZGVyLCBoZXJlIGlzIHRoZSBzZWN0aW9uIEkKLWN1cnJlbnRseSB1c2UgaW4gbXkgbW9kcHJvYmUuY29uZiBmaWxlOgotCi0jIFNvdW5kCi1hbGlhcyBzb3VuZC1zbG90LTAgb3BsM3NhMgotb3B0aW9ucyBvcGwzc2EyIGlvPTB4MzcwIG1zc19pbz0weDUzMCBtcHVfaW89MHgzMzAgaXJxPTcgZG1hPTAgZG1hMj0zCi1vcHRpb25zIG9wbDMgaW89MHgzODgKLQotVGhhdCdzIGFsbCBpdCBjdXJyZW50bHkgdGFrZXMgdG8gZ2V0IGFuIE9QTDMtU0EzIGNhcmQgd29ya2luZyBvbiBteQotc3lzdGVtLiAgT25jZSBhZ2FpbiwgaWYgeW91IGhhdmUgYW55IG90aGVyIHByb2JsZW1zLCBlbWFpbCBtZSBhdCB0aGUKLWFkZHJlc3MgbGlzdGVkIGFib3ZlLgotCi1TY290dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvVklBLWNoaXBzZXQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NjUyMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL29zcy9WSUEtY2hpcHNldAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLVJ1bm5pbmcgc291bmQgY2FyZHMgb24gVklBIGNoaXBzZXRzCi0KLW8JVGhlcmUgYXJlIHByb2JsZW1zIHdpdGggVklBIGNoaXBzZXRzIGFuZCBzb3VuZCBjYXJkcyB0aGF0IGFwcGVhciB0bwotCWxvY2sgdGhlIGhhcmR3YXJlIHNvbGlkbHkuIFRlc3QgcHJvZ3JhbXMgdW5kZXIgRE9TIGhhdmUgdmVyaWZpZWQgdGhlCi0JcHJvYmxlbSBleGlzdHMgb24gYXQgbGVhc3Qgc29tZSAoYnV0IGFwcGFyZW50bHkgbm90IGFsbCkgVklBIGJvYXJkcwotCi1vCVZJQSBoYXZlIHNvIGZhciBmYWlsZWQgdG8gYm90aGVyIHRvIGFuc3dlciBzdXBwb3J0IG1haWwgb24gdGhlIHN1YmplY3QKLQlzbyBpZiB5b3UgYXJlIGEgVklBIGVuZ2luZWVyIGZlZWxpbmcgYWdncmlldmVkIGFzIHlvdSByZWFkIHRoaXMgCi0JZG9jdW1lbnQgZ28gY2hhc2UgeW91ciBvd24gcGVvcGxlLiBJZiB0aGVyZSBpcyBhIHdvcmthcm91bmQgcGxlYXNlCi0JbGV0IHVzIGtub3cgc28gd2UgY2FuIGltcGxlbWVudCBpdC4KLQotCi1DZXJ0YWluIHBhdHRlcm5zIG9mIElTQSBETUEgYWNjZXNzIHVzZWQgZm9yIG1vc3QgUEMgc291bmQgY2FyZHMgY2F1c2UgdGhlCi1WSUEgY2hpcHNldHMgdG8gbG9jayB1cC4gRnJvbSB0aGUgY29sbGVjdGVkIHJlcG9ydHMgdGhpcyBhcHBlYXJzIHRvIGNvdmVyIGEKLXdpZGUgcmFuZ2Ugb2YgYm9hcmRzLiBTb21lIGFsc28gbG9jayB1cCB3aXRoIHNvdW5kIGNhcmRzIHVuZGVyIFdpbiogYXMgd2VsbC4KLQotTGludXggaW1wbGVtZW50cyBhIHdvcmthcm91bmQgcHJvdmlkaW5nIHlvdXIgY2hpcHNldCBpcyBQQ0kgYW5kIHlvdSBjb21waWxlZAotd2l0aCBQQ0kgUXVpcmtzIGVuYWJsZWQuIElmIHNvIHlvdSB3aWxsIHNlZSBhIG1lc3NhZ2UKLQkiQWN0aXZhdGluZyBJU0EgRE1BIGJ1ZyB3b3JrYXJvdW5kcyIKLQotZHVyaW5nIGJvb3RpbmcuIElmIHlvdSBoYXZlIGEgVklBIFBDSSBjaGlwc2V0IHRoYXQgaGFuZ3Mgd2hlbiB5b3UgdXNlIHRoZQotc291bmQgYW5kIGlzIG5vdCBnZW5lcmF0aW5nIHRoaXMgbWVzc2FnZSBldmVuIHdpdGggUENJIHF1aXJrcyBlbmFibGVkCi1wbGVhc2UgcmVwb3J0IHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgbGludXgta2VybmVsIGxpc3QgKHNlZSBSRVBPUlRJTkctQlVHUykuCi0KLUlmIHlvdSBhcmUgb25lIG9mIHRoZSB0aW55IG51bWJlciBvZiB1bmZvcnR1bmF0ZXMgd2l0aCBhIDQ4NiBJU0EvVkxCIFZJQQotY2hpcHNldCBib2FyZCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGEgc3BlY2lhbCBrZXJuZWwgZm9yCi15b3VyIGJvYXJkCi0KLQllZGl0IGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvZG1hLmgKLQotY2hhbmdlCi0KLSNkZWZpbmUgaXNhX2RtYV9icmlkZ2VfYnVnZ3kgCSgwKQotCi10bwotCi0jZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMSkKLQotYW5kIHJlYnVpbGQgYSBrZXJuZWwgd2l0aG91dCBQQ0kgcXVpcmsgc3VwcG9ydC4KLQotCi1PdGhlciB0aGFuIHRoaXMgcGFydGljdWxhciBnbGl0Y2ggdGhlIFZJQSBbTV1WUCogY2hpcHNldHMgYXBwZWFyIHRvIHdvcmsKLXBlcmZlY3RseSB3aXRoIExpbnV4LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvY3M0Nnh4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ0MzI3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvb3NzL2NzNDZ4eAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0KLURvY3VtZW50YXRpb24gZm9yIHRoZSBDaXJydXMgTG9naWMvQ3J5c3RhbCBTb3VuZEZ1c2lvbiBjczQ2eHgvY3M0MjgwIGF1ZGlvIAotY29udHJvbGxlciBjaGlwcyAoMjAwMS8wNS8xMSkKLQotVGhlIGNzNDZ4eCBhdWRpbyBkcml2ZXIgc3VwcG9ydHMgdGhlIERTUCBsaW5lIG9mIENpcnJ1cyBjb250cm9sbGVycy4gCi1TcGVjaWZpY2FsbHksIHRoZSBjczQ2MTAsIGNzNDYxMiwgY3M0NjE0LCBjczQ2MjIsIGNzNDYyNCwgY3M0NjMwIGFuZCB0aGUgY3M0MjgwCi1wcm9kdWN0cy4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGdlbmVyaWMgYWM5N19jb2RlYyBkcml2ZXIgZm9yIEFDOTcgY29kZWMKLXN1cHBvcnQuICAKLQotCi1GZWF0dXJlczoKLQotRnVsbCBEdXBsZXggUGxheWJhY2svQ2FwdHVyZSBzdXBwb3J0ZWQgZnJvbSA4ay00OGsuCi0xNkJpdCBTaWduZWQgTEUgJiA4Qml0IFVuc2lnbmVkLCB3aXRoIE1vbm8gb3IgU3RlcmVvIHN1cHBvcnRlZC4KLQotQVBNL1BNIC0gMi4yLnggUE0gaXMgZW5hYmxlZCBhbmQgZnVuY3Rpb25hbC4gQVBNIGNhbiBhbHNvCi1iZSBlbmFibGVkIGZvciAyLjQueCBieSBtb2RpZnlpbmcgdGhlIENTNDZYWF9BQ1BJX1NVUFBPUlQgbWFjcm8KLWRlZmluaXRpb24uCi0KLURNQSBwbGF5YmFjayBidWZmZXIgc2l6ZSBpcyBjb25maWd1cmFibGUgZnJvbSAxNmsgKGRlZmF1bHRvcmRlcj0yKSB1cCB0byAyTWVnIAotKGRlZmF1bHRvcmRlcj0xMSkuICBETUEgY2FwdHVyZSBidWZmZXIgc2l6ZSBpcyBmaXhlZCBhdCBhIHNpbmdsZSA0ayBwYWdlIGFzCi10d28gMmsgZnJhZ21lbnRzLgotCi1NTUFQIHNlZW1zIHRvIHdvcmsgd2VsbCB3aXRoIFF1YWtlSUlJLCBhbmQgdGVzdCBYTU1TIHBsdWdpbi4KLQotTXl0aDIgd29ya3MsIGJ1dCB0aGUgcG9sbGluZyBsb2dpYyBpcyBub3QgZnVsbHkgY29ycmVjdCwgYnV0IGlzIGZ1bmN0aW9uYWwuCi0KLVRoZSAyLjQuNC1hYzYgZ2FtZXBvcnQgY29kZSBpbiB0aGUgY3M0NjF4IGpveXN0aWNrIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgCi13aXRoIGEgTWljcm9zb2Z0IFNpZGV3aW5kZXIgam95c3RpY2sgKGNzNDYxeC5vIGFuZCBzaWRld2luZGVyLm8pLiAgVGhpcyAKLWF1ZGlvIGRyaXZlciBtdXN0IGJlIGxvYWRlZCBwcmlvciB0byB0aGUgam95c3RpY2sgZHJpdmVyIHRvIGVuYWJsZSB0aGUKLURTUCB0YXNrIGltYWdlIHN1cHBvcnRpbmcgdGhlIGpveXN0aWNrIGRldmljZS4KLQotCi1MaW1pdGF0aW9uczoKLQotU1BESUYgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCi0KLVByaW1hcnkgY29kZWMgc3VwcG9ydCBvbmx5LiAgTm8gc2Vjb25kYXJ5IGNvZGVjIHN1cHBvcnQgaXMgaW1wbGVtZW50ZWQuCi0KLQotCi1OT1RFUzoKLQotSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIC0gdGhlIEVHUElPMiBwaW4gY29udHJvbHMgdGhlIGV4dGVybmFsIEFtcCwKLWFuZCBoYXMgYmVlbiB0ZXN0ZWQuCi1Nb2R1bGUgcGFyYW1ldGVyIGhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIKLXRvIGRpc2FibGUgdGhlIGV4dGVybmFsIGFtcGxpZmllci4KLQotVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCi10aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKLXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIG5vdAotdHVybmVkIG9uLiAgVGhlIHByaW1hcnkgY29kZWMgZXh0ZXJuYWwgYW1wbGlmaWVyIGlzIHN1cHBvcnRlZCBidXQKLW5vdGUgdGhhdCB0aGUgQUM5NyBFQVBEIGJpdCBpcyBpbnZlcnRlZCBsb2dpYyAoYW1wX3ZveWV0cmEoKSkuCi0KLURNQSBidWZmZXIgc2l6ZSAtIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCBtYW55IG9mIHRoZSBMaW51eCBhcHBsaWNhdGlvbnMKLWNvbmNlcm5pbmcgdGhlIG9wdGltYWwgYnVmZmVyIHNpemUuICBTZXZlcmFsIGFwcGxpY2F0aW9ucyByZXF1ZXN0IGEgCi1jZXJ0YWluIGZyYWdtZW50IHNpemUgYW5kIG51bWJlciBhbmQgdGhlbiBkbyBub3QgdmVyaWZ5IHRoYXQgdGhlIGRyaXZlcgotaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLiAgCi1TTkRDVExfRFNQX1NFVEZSQUdNRU5UIGlvY3RsIGlzIHVzZWQgdG8gcmVxdWVzdCBhIGZyYWdtZW50IHNpemUgYW5kCi1udW1iZXIgb2YgZnJhZ21lbnRzLiAgU29tZSBhcHBsaWNhdGlvbnMgZXhpdCBpZiBhbiBlcnJvciBpcyByZXR1cm5lZAotb24gdGhpcyBwYXJ0aWN1bGFyIGlvY3RsLiBUaGVyZWZvcmUsIGluIGFsaWdubWVudCB3aXRoIHRoZSBvdGhlciBPU1MgYXVkaW8gCi1kcml2ZXJzLCBubyBlcnJvciBpcyByZXR1cm5lZCB3aGVuIGEgU0VURlJBR3MgSU9DVEwgaXMgcmVjZWl2ZWQsIGJ1dCB0aGUgCi12YWx1ZXMgcGFzc2VkIGZyb20gdGhlIGFwcCBhcmUgbm90IHVzZWQgaW4gYW55IGJ1ZmZlciBjYWxjdWxhdGlvbiAKLShvc3NmcmFnc2hpZnQvb3NzbWF4ZnJhZ3MgYXJlIG5vdCB1c2VkKS4KLVVzZSB0aGUgImRlZmF1bHRvcmRlcj1OIiBtb2R1bGUgcGFyYW1ldGVyIHRvIGNoYW5nZSB0aGUgYnVmZmVyIHNpemUgaWYKLXlvdSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgcmVxdWlyZXMgYSBzcGVjaWZpYyBudW1iZXIgb2YgZnJhZ21lbnRzCi1vciBhIHNwZWNpZmljIGJ1ZmZlciBzaXplIChzZWUgYmVsb3cpLgotCi1EZWJ1ZyBJbnRlcmZhY2UKLS0tLS0tLS0tLS0tLS0tLQotVGhlcmUgaXMgYW4gaW9jdGwgZGVidWcgaW50ZXJmYWNlIHRvIGFsbG93IHJ1bnRpbWUgbW9kaWZpY2F0aW9uIG9mIHRoZSAKLWRlYnVnIHByaW50IGxldmVscy4gIFRoaXMgZGVidWcgaW50ZXJmYWNlIGNvZGUgY2FuIGJlIGRpc2FibGVkIGZyb20gdGhlIAotY29tcGlsYXRpb24gcHJvY2VzcyB3aXRoIGNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBkZWZpbmU6Ci0jZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKLVRoZXJlIGlzIGFsc28gYSBkZWJ1ZyBwcmludCBtZXRob2RvbGd5IHRvIHNlbGVjdCBwcmludGYgc3RhdGVtZW50cyBmcm9tCi1kaWZmZXJlbnQgYXJlYXMgb2YgdGhlIGRyaXZlci4gIEEgZGVidWcgcHJpbnQgbGV2ZWwgaXMgYWxzbyB1c2VkIHRvIGFsbG93Ci1hZGRpdGlvbmFsIHByaW50ZnMgdG8gYmUgYWN0aXZlLiAgQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZQotZHJpdmVyIHRvIGRpc2FibGUgY29tcGlsYXRpb24gb2YgdGhlIENTX0RCR09VVCBwcmludCBzdGF0ZW1lbnRzOgotI2RlZmluZSBDU0RFQlVHIDEKLSAKLVBsZWFzZSBzZWUgdGhlIGRlZmluaXRpb25zIGZvciBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgZm9yIGFkZGl0aW9uYWwKLWluZm9ybWF0aW9uIG9uIHRoZSBkZWJ1ZyBsZXZlbHMgYW5kIHNlY3Rpb25zLgotCi1UaGVyZSBpcyBhbHNvIGEgY3NkYmcgZXhlY3V0YWJsZSB0byBhbGxvdyBydW50aW1lIG1hbmlwdWxhdGlvbiBvZiB0aGVzZSAKLXBhcmFtZXRlcnMuICBmb3IgYSBjb3B5IGVtYWlsOiB0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbQotCi0KLQotTU9EVUxFX1BBUk1TIGRlZmluaXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW1vZHVsZV9wYXJhbShkZWZhdWx0b3JkZXIsIHVsb25nLCAwKTsKLWRlZmF1bHRvcmRlcj1OCi13aGVyZSBOIGlzIGEgdmFsdWUgZnJvbSAxIHRvIDEyCi1UaGUgYnVmZmVyIG9yZGVyIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGRtYSBidWZmZXIgZm9yIHRoZSBkcml2ZXIuCi11bmRlciBMaW51eCwgYSBzbWFsbGVyIGJ1ZmZlciBhbGxvd3MgbW9yZSByZXNwb25zaXZlbmVzcyBmcm9tIG1hbnkgb2YgdGhlIAotYXBwbGljYXRpb25zIChlLmcuIGdhbWVzKS4gIEEgbGFyZ2VyIGJ1ZmZlciBhbGxvd3Mgc29tZSBvZiB0aGUgYXBwcyAoZXNvdW5kKSAKLXRvIG5vdCB1bmRlcnJ1biB0aGUgZG1hIGJ1ZmZlciBhcyBlYXNpbHkuICBBcyBkZWZhdWx0LCB1c2UgMzJrIChvcmRlcj0zKQotcmF0aGVyIHRoYW4gNjRrIGFzIHNvbWUgb2YgdGhlIGdhbWVzIHdvcmsgbW9yZSByZXNwb25zaXZlbHkuCi0oMl5OKSAqIFBBR0VfU0laRSA9IGFsbG9jYXRlZCBidWZmZXIgc2l6ZQotCi1tb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOwotbW9kdWxlX3BhcmFtKGNzX2RlYnVnbWFzaywgdWxvbmcsIDA2NDQpOwotY3NfZGVidWdsZXZlbD1OCi1jc19kZWJ1Z21hc2s9MHhNTU1NTU1NTQotd2hlcmUgTiBpcyBhIHZhbHVlIGZyb20gMCAobm8gZGVidWcgcHJpbnRmcyksIHRvIDkgKG1heGltdW0pCi0weE1NTU1NTU1NIGlzIGEgZGVidWcgbWFzayBjb3JyZXNwb25kaW5nIHRvIHRoZSBDU194eHggYml0cyAoc2VlIGRyaXZlciBzb3VyY2UpLgotCi1tb2R1bGVfcGFyYW0oaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSwgdWxvbmcsIDApOwotaGVyY3VsZXNfZWdwaW9fZGlzYWJsZT1OCi13aGVyZSBOIGlzIGEgMCAoZW5hYmxlIGVncGlvKSwgb3IgYSAxIChkaXNhYmxlIGVncGlvIHN1cHBvcnQpCi0KLW1vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKLWluaXRkZWxheT1OCi1UaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtaWxsZXNjb25kIGRlbGF5IGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24KLWNvZGUgcHJpb3IgdG8gcG93ZXJpbmcgdXAgdGhlIFBMTC4gIE9uIGxhcHRvcHMgdGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0bwotYXNzaXN0IHdpdGggZXJyb3JzIG9uIHJlc3VtZSwgbW9zdGx5IHdpdGggSUJNIGxhcHRvcHMuICBCYXNpY2FsbHksIGlmIHRoZSAKLXN5c3RlbSBpcyBib290ZWQgdW5kZXIgYmF0dGVyeSBwb3dlciB0aGVuIHRoZSBtZGVsYXkoKS91ZGVsYXkoKSBmdW5jdGlvbnMgZmFpbCB0byAKLXByb3Blcmx5IGRlbGF5IHRoZSByZXF1aXJlZCB0aW1lLiAgQWxzbywgaWYgdGhlIHN5c3RlbSBpcyBib290ZWQgdW5kZXIgQUMgcG93ZXIKLWFuZCB0aGVuIHRoZSBwb3dlciByZW1vdmVkLCB0aGUgbWRlbGF5KCkvdWRlbGF5KCkgZnVuY3Rpb25zIHdpbGwgbm90IGRlbGF5IHByb3Blcmx5LgotIAotbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOwotcG93ZXJkb3duPU4KLXdoZXJlIE4gaXMgMCAoZGlzYWJsZSBhbnkgcG93ZXJkb3duIG9mIHRoZSBpbnRlcm5hbCBibG9ja3MpIG9yIDEgKGVuYWJsZSBwb3dlcmRvd24pCi0KLQotbW9kdWxlX3BhcmFtKGV4dGVybmFsX2FtcCwgYm9vbCwgMCk7Ci1leHRlcm5hbF9hbXA9MQotaWYgTiBpcyBzZXQgdG8gMSwgdGhlbiBmb3JjZSBlbmFibGluZyB0aGUgRUFQRCBzdXBwb3J0IGluIHRoZSBwcmltYXJ5IEFDOTcgY29kZWMuCi1vdmVycmlkZSB0aGUgZGV0ZWN0aW9uIGxvZ2ljIGFuZCBmb3JjZSB0aGUgZXh0ZXJuYWwgYW1wIGJpdCBpbiB0aGUgQUM5NyAweDI2IHJlZ2lzdGVyCi10byBiZSByZXNldCAoMCkuICBFQVBEIHNob3VsZCBiZSAwIGZvciBwb3dlcnVwLCBhbmQgMSBmb3IgcG93ZXJkb3duLiAgVGhlIFZUQiBTYW50YSBDcnV6Ci1jYXJkIGhhcyBpbnZlcnRlZCBsb2dpYywgc28gdGhlcmUgaXMgYSBzcGVjaWFsIGZ1bmN0aW9uIGZvciB0aGVzZSBjYXJkcy4KLQotbW9kdWxlX3BhcmFtKHRoaW5rcGFkLCBib29sLCAwKTsKLXRoaW5rcGFkPTEKLWlmIE4gaXMgc2V0IHRvIDEsIHRoZW4gZm9yY2UgZW5hYmxpbmcgdGhlIGNsa3J1biBmdW5jdGlvbmFsaXR5LgotQ3VycmVudGx5LCB3aGVuIHRoZSBwYXJ0IGlzIGJlaW5nIHVzZWQsIHRoZW4gY2xrcnVuIGlzIGRpc2FibGVkIGZvciB0aGUgZW50aXJlIHN5c3RlbSwKLWJ1dCByZS1lbmFibGVkIHdoZW4gdGhlIGRyaXZlciBpcyByZWxlYXNlZCBvciB0aGVyZSBpcyBubyBvdXRzdGFuZGluZyBvcGVuIGNvdW50LgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscCBiL0RvY3VtZW50YXRpb24vc3BpL3NwaS1sbTcwbGxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGJkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscApAQCAtMCwwICsxLDY5IEBACitzcGlfbG03MGxscCA6ICBMTTcwLUxMUCBwYXJwb3J0LXRvLVNQSSBhZGFwdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBib2FyZC9jaGlwOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMTFAgZXZhbHVhdGlvbiBib2FyZAorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisKK0F1dGhvcjoKKyAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorVGhpcyBkcml2ZXIgcHJvdmlkZXMgZ2x1ZSBjb2RlIGNvbm5lY3RpbmcgYSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAgTExQCit0ZW1wZXJhdHVyZSBzZW5zb3IgZXZhbHVhdGlvbiBib2FyZCB0byB0aGUga2VybmVsJ3MgU1BJIGNvcmUgc3Vic3lzdGVtLgorCitJbiBlZmZlY3QsIHRoaXMgZHJpdmVyIHR1cm5zIHRoZSBwYXJhbGxlbCBwb3J0IGludGVyZmFjZSBvbiB0aGUgZXZhbCBib2FyZAoraW50byBhIFNQSSBidXMgd2l0aCBhIHNpbmdsZSBkZXZpY2UsIHdoaWNoIHdpbGwgYmUgZHJpdmVuIGJ5IHRoZSBnZW5lcmljCitMTTcwIGRyaXZlciAoZHJpdmVycy9od21vbi9sbTcwLmMpLgorCitUaGUgaGFyZHdhcmUgaW50ZXJmYWNpbmcgb24gdGhlIExNNzAgTExQIGV2YWwgYm9hcmQgaXMgYXMgZm9sbG93czoKKworICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgICAgIFBvcnQgICAgICBEaXJlY3Rpb24gICBKUDIgSGVhZGVyCisgICAtLS0tLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLQorICAgICAgRDAgICAgIDIgICAgICAtICAgICAgICAgLQorICAgICAgRDEgICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDIgICAgIDQgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDMgICAgIDUgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDQgICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICAgICAgRDUgICAgIDcgICAgIC0tPiAgICAgIG5DUyAgOAorICAgICAgRDYgICAgIDggICAgIC0tPiAgICAgIFNDTEsgMworICAgICAgRDcgICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICAgICBHTkQgICAgMjUgICAgICAtICAgICAgIEdORCAgNworICAgIFNlbGVjdCAgMTMgICAgIDwtLSAgICAgIFNJL08gMQorICAgLS0tLS0tLS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHNpbmNlIHRoZSBMTTcwIHVzZXMgYSAiMy13aXJlIiB2YXJpYW50IG9mIFNQSSwgdGhlIFNJL1NPIHBpbgoraXMgY29ubmVjdGVkIHRvIGJvdGggcGluIEQ3IChhcyBNYXN0ZXIgT3V0KSBhbmQgU2VsZWN0IChhcyBNYXN0ZXIgSW4pCit1c2luZyBhbiBhcnJhbmdtZW50IHRoYXQgbGV0cyBlaXRoZXIgdGhlIHBhcnBvcnQgb3IgdGhlIExNNzAgcHVsbCB0aGUKK3BpbiBsb3cuICBUaGlzIGNhbid0IGJlIHNoYXJlZCB3aXRoIHRydWUgU1BJIGRldmljZXMsIGJ1dCBvdGhlciAzLXdpcmUKK2RldmljZXMgbWlnaHQgc2hhcmUgdGhlIHNhbWUgU0kvU08gcGluLgorCitUaGUgYml0YmFuZ2VyIHJvdXRpbmUgaW4gdGhpcyBkcml2ZXIgKGxtNzBfdHhyeCkgaXMgY2FsbGVkIGJhY2sgZnJvbQordGhlIGJvdW5kICJod21vbi9sbTcwIiBwcm90b2NvbCBkcml2ZXIgdGhyb3VnaCBpdHMgc3lzZnMgaG9vaywgdXNpbmcgYQorc3BpX3dyaXRlX3RoZW5fcmVhZCgpIGNhbGwuICBJdCBwZXJmb3JtcyBNb2RlIDAgKFNQSS9NaWNyb3dpcmUpIGJpdGJhbmdpbmcuCitUaGUgbG03MCBkcml2ZXIgdGhlbiBpbnRlcHJldHMgdGhlIHJlc3VsdGluZyBkaWdpdGFsIHRlbXBlcmF0dXJlIHZhbHVlCithbmQgZXhwb3J0cyBpdCB0aHJvdWdoIHN5c2ZzLgorCitBICJnb3RjaGEiOiBOYXRpb25hbCBTZW1pY29uZHVjdG9yJ3MgTE03MCBMTFAgZXZhbCBib2FyZCBjaXJjdWl0IHNjaGVtYXRpYworc2hvd3MgdGhhdCB0aGUgU0kvTyBsaW5lIGZyb20gdGhlIExNNzAgY2hpcCBpcyBjb25uZWN0ZWQgdG8gdGhlIGJhc2Ugb2YgYQordHJhbnNpc3RvciBRMSAoYW5kIGFsc28gYSBwdWxsdXAsIGFuZCBhIHplbmVyIGRpb2RlIHRvIEQ3KTsgd2hpbGUgdGhlCitjb2xsZWN0b3IgaXMgdGllZCB0byBWQ0MuCisKK0ludGVycHJldGluZyB0aGlzIGNpcmN1aXQsIHdoZW4gdGhlIExNNzAgU0kvTyBsaW5lIGlzIEhpZ2ggKG9yIHRyaXN0YXRlCithbmQgbm90IGdyb3VuZGVkIGJ5IHRoZSBob3N0IHZpYSBENyksIHRoZSB0cmFuc2lzdG9yIGNvbmR1Y3RzIGFuZCBzd2l0Y2hlcwordGhlIGNvbGxlY3RvciB0byB6ZXJvLCB3aGljaCBpcyByZWZsZWN0ZWQgb24gcGluIDEzIG9mIHRoZSBEQjI1IHBhcnBvcnQKK2Nvbm5lY3Rvci4gIFdoZW4gU0kvTyBpcyBMb3cgKGRyaXZlbiBieSB0aGUgTE03MCBvciB0aGUgaG9zdCkgb24gdGhlIG90aGVyCitoYW5kLCB0aGUgdHJhbnNpc3RvciBpcyBjdXQgb2ZmIGFuZCB0aGUgdm9sdGFnZSB0aWVkIHRvIGl0J3MgY29sbGVjdG9yIGlzCityZWZsZWN0ZWQgb24gcGluIDEzIGFzIGEgSGlnaCBsZXZlbC4KKworU286IHRoZSBnZXRtaXNvIGlubGluZSByb3V0aW5lIGluIHRoaXMgZHJpdmVyIHRha2VzIHRoaXMgZmFjdCBpbnRvIGFjY291bnQsCitpbnZlcnRpbmcgdGhlIHZhbHVlIHJlYWQgYXQgcGluIDEzLgorCisKK1RoYW5rcyB0bworLS0tLS0tLS0tCitvIERhdmlkIEJyb3duZWxsIGZvciBtZW50b3JpbmcgdGhlIFNQSS1zaWRlIGRyaXZlciBkZXZlbG9wbWVudC4KK28gRHIuQ3JhaWcgSG9sbGFiYXVnaCBmb3IgdGhlIChlYXJseSkgIm1hbnVhbCIgYml0YmFuZ2luZyBkcml2ZXIgdmVyc2lvbi4KK28gTmFkaXIgQmlsbGltb3JpYSBmb3IgaGVscCBpbnRlcnByZXRpbmcgdGhlIGNpcmN1aXQgc2NoZW1hdGljLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zcGlubG9ja3MudHh0CmluZGV4IGE2NjFkNjguLjQ3MWU3NTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpbmxvY2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaW5sb2Nrcy50eHQKQEAgLTEsNyArMSwxMiBAQAotVVBEQVRFIE1hcmNoIDIxIDIwMDUgQW1pdCBHdWQgPGd1ZEBldGgubmV0PgorU1BJTl9MT0NLX1VOTE9DS0VEIGFuZCBSV19MT0NLX1VOTE9DS0VEIGRlZmVhdCBsb2NrZGVwIHN0YXRlIHRyYWNraW5nIGFuZAorYXJlIGhlbmNlIGRlcHJlY2F0ZWQuCiAKLU1hY3JvcyBTUElOX0xPQ0tfVU5MT0NLRUQgYW5kIFJXX0xPQ0tfVU5MT0NLRUQgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUKLXJlbW92ZWQgc29vbi4gU28gZm9yIGFueSBuZXcgY29kZSBkeW5hbWljIGluaXRpYWxpemF0aW9uIHNob3VsZCBiZSB1c2VkOgorUGxlYXNlIHVzZSBERUZJTkVfU1BJTkxPQ0soKS9ERUZJTkVfUldMT0NLKCkgb3IKK19fU1BJTl9MT0NLX1VOTE9DS0VEKCkvX19SV19MT0NLX1VOTE9DS0VEKCkgYXMgYXBwcm9wcmlhdGUgZm9yIHN0YXRpYworaW5pdGlhbGl6YXRpb24uCisKK0R5bmFtaWMgaW5pdGlhbGl6YXRpb24sIHdoZW4gbmVjZXNzYXJ5LCBtYXkgYmUgcGVyZm9ybWVkIGFzCitkZW1vbnN0cmF0ZWQgYmVsb3cuCiAKICAgIHNwaW5sb2NrX3QgeHh4X2xvY2s7CiAgICByd2xvY2tfdCB4eHhfcndfbG9jazsKQEAgLTE1LDEyICsyMCw5IEBACiAKICAgIG1vZHVsZV9pbml0KHh4eF9pbml0KTsKIAotUmVhc29ucyBmb3IgZGVwcmVjYXRpb24KLSAgLSBpdCBodXJ0cyBhdXRvbWF0aWMgbG9jayB2YWxpZGF0b3JzCi0gIC0gaXQgYmVjb21lcyBpbnRydXNpdmUgZm9yIHRoZSByZWFsdGltZSBwcmVlbXB0aW9uIHBhdGNoZXMKLQotRm9sbG93aW5nIGRpc2N1c3Npb24gaXMgc3RpbGwgdmFsaWQsIGhvd2V2ZXIsIHdpdGggdGhlIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24KLW9mIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIHN0YXRpYy4KK1RoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiBpcyBzdGlsbCB2YWxpZCwgaG93ZXZlciwgd2l0aCB0aGUgZHluYW1pYworaW5pdGlhbGl6YXRpb24gb2Ygc3BpbmxvY2tzIG9yIHdpdGggREVGSU5FX1NQSU5MT0NLLCBldGMuLCB1c2VkCitpbnN0ZWFkIG9mIFNQSU5fTE9DS19VTkxPQ0tFRC4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKQEAgLTAsMCArMSwyMiBAQAorCitFeGNlcHQgZm9yIGEgZmV3IGV4dHJlbWVseSByYXJlIGV4Y2VwdGlvbnMgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZQordGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlLiAgSW5zdGVhZCBldmVyeW9uZSB1c2VzIC9wcm9jL3N5cy8uLi4gIHdpdGgKK3JlYWRhYmxlIGFzY2lpIG5hbWVzLgorCitSZWNlbnRseSB0aGUga2VybmVsIGhhcyBzdGFydGVkIHN1cHBvcnRpbmcgc2V0dGluZyB0aGUgYmluYXJ5IHN5c2N0bCB2YWx1ZSB0bworQ1RMX1VOTlVNQkVSRUQgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gYXNzaWduIGEgYmluYXJ5IHN5c2N0bCBwYXRoIHRvIGFsbG93CitzeXNjdGxzIHRvIHNob3cgdXAgaW4gL3Byb2Mvc3lzLgorCitBc3NpZ25pbmcgYmluYXJ5IHN5c2N0bCBudW1iZXJzIGlzIGFuIGVuZGxlc3Mgc291cmNlIG9mIGNvbmZsaWN0cyBpbiBzeXNjdGwuaCwKK2JyZWFraW5nIG9mIHRoZSB1c2VyIHNwYWNlIEFCSSAoYmVjYXVzZSBvZiB0aG9zZSBjb25mbGljdHMpLCBhbmQgbWFpbnRlbmFuY2UKK3Byb2JsZW1zLiAgQSBjb21wbGV0ZSBwYXNzIHRocm91Z2ggYWxsIG9mIHRoZSBzeXNjdGwgdXNlcnMgcmV2ZWFsZWQgbXVsdGlwbGUKK2luc3RhbmNlcyB3aGVyZSB0aGUgc3lzY3RsIGJpbmFyeSBpbnRlcmZhY2Ugd2FzIGJyb2tlbiBhbmQgaGFkIGdvbmUgdW5kZXRlY3RlZAorZm9yIHllYXJzLgorCitTbyBwbGVhc2UgZG8gbm90IGFkZCBuZXcgYmluYXJ5IHN5c2N0bCBudW1iZXJzLiAgVGhleSBhcmUgdW5uZWVkZWQgYW5kCitwcm9ibGVtYXRpYy4KKworSWYgeW91IHJlYWxseSBuZWVkIGEgbmV3IGJpbmFyeSBzeXNjdGwgbnVtYmVyIHBsZWFzZSBmaXJzdCBtZXJnZSB5b3VyIHN5c2N0bAoraW50byB0aGUga2VybmVsIGFuZCB0aGVuIGFzIGEgc2VwYXJhdGUgcGF0Y2ggYWxsb2NhdGUgYSBiaW5hcnkgc3lzY3RsIG51bWJlci4KKworKGViaWVkZXJtQHhtaXNzaW9uLmNvbSwgSnVuZSAyMDA3KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CmluZGV4IDhjZmNhMTcuLmEwY2NjNWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKQEAgLTMyLDEyICszMiwxNCBAQAogLSBtaW5fc2xhYl9yYXRpbwogLSBwYW5pY19vbl9vb20KIC0gbW1hcF9taW5fYWRkcmVzcworLSBudW1hX3pvbmVsaXN0X29yZGVyCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGRpcnR5X3JhdGlvLCBkaXJ0eV9iYWNrZ3JvdW5kX3JhdGlvLCBkaXJ0eV9leHBpcmVfY2VudGlzZWNzLAogZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcywgdmZzX2NhY2hlX3ByZXNzdXJlLCBsYXB0b3BfbW9kZSwKLWJsb2NrX2R1bXAsIHN3YXBfdG9rZW5fdGltZW91dCwgZHJvcC1jYWNoZXM6CitibG9ja19kdW1wLCBzd2FwX3Rva2VuX3RpbWVvdXQsIGRyb3AtY2FjaGVzLAoraHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGU6CiAKIFNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CiAKQEAgLTIzMSwzICsyMzMsNDcgQEAKIHZhc3QgbWFqb3JpdHkgb2YgYXBwbGljYXRpb25zIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBwcm92aWRlIGRlZmVuc2UgaW4gZGVwdGgKIGFnYWluc3QgZnV0dXJlIHBvdGVudGlhbCBrZXJuZWwgYnVncy4KIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbnVtYV96b25lbGlzdF9vcmRlcgorCitUaGlzIHN5c2N0bCBpcyBvbmx5IGZvciBOVU1BLgorJ3doZXJlIHRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20nIGlzIGNvbnRyb2xsZWQgYnkgem9uZWxpc3RzLgorKFRoaXMgZG9jdW1lbnRhdGlvbiBpZ25vcmVzIFpPTkVfSElHSE1FTS9aT05FX0RNQTMyIGZvciBzaW1wbGUgZXhwbGFuYXRpb24uCisgeW91IG1heSBiZSBhYmxlIHRvIHJlYWQgWk9ORV9ETUEgYXMgWk9ORV9ETUEzMi4uLikKKworSW4gbm9uLU5VTUEgY2FzZSwgYSB6b25lbGlzdCBmb3IgR0ZQX0tFUk5FTCBpcyBvcmRlcmVkIGFzIGZvbGxvd2luZy4KK1pPTkVfTk9STUFMIC0+IFpPTkVfRE1BCitUaGlzIG1lYW5zIHRoYXQgYSBtZW1vcnkgYWxsb2NhdGlvbiByZXF1ZXN0IGZvciBHRlBfS0VSTkVMIHdpbGwKK2dldCBtZW1vcnkgZnJvbSBaT05FX0RNQSBvbmx5IHdoZW4gWk9ORV9OT1JNQUwgaXMgbm90IGF2YWlsYWJsZS4KKworSW4gTlVNQSBjYXNlLCB5b3UgY2FuIHRoaW5rIG9mIGZvbGxvd2luZyAyIHR5cGVzIG9mIG9yZGVyLgorQXNzdW1lIDIgbm9kZSBOVU1BIGFuZCBiZWxvdyBpcyB6b25lbGlzdCBvZiBOb2RlKDApJ3MgR0ZQX0tFUk5FTAorCisoQSkgTm9kZSgwKSBaT05FX05PUk1BTCAtPiBOb2RlKDApIFpPTkVfRE1BIC0+IE5vZGUoMSkgWk9ORV9OT1JNQUwKKyhCKSBOb2RlKDApIFpPTkVfTk9STUFMIC0+IE5vZGUoMSkgWk9ORV9OT1JNQUwgLT4gTm9kZSgwKSBaT05FX0RNQS4KKworVHlwZShBKSBvZmZlcnMgdGhlIGJlc3QgbG9jYWxpdHkgZm9yIHByb2Nlc3NlcyBvbiBOb2RlKDApLCBidXQgWk9ORV9ETUEKK3dpbGwgYmUgdXNlZCBiZWZvcmUgWk9ORV9OT1JNQUwgZXhoYXVzdGlvbi4gVGhpcyBpbmNyZWFzZXMgcG9zc2liaWxpdHkgb2YKK291dC1vZi1tZW1vcnkoT09NKSBvZiBaT05FX0RNQSBiZWNhdXNlIFpPTkVfRE1BIGlzIHRlbmQgdG8gYmUgc21hbGwuCisKK1R5cGUoQikgY2Fubm90IG9mZmVyIHRoZSBiZXN0IGxvY2FsaXR5IGJ1dCBpcyBtb3JlIHJvYnVzdCBhZ2FpbnN0IE9PTSBvZgordGhlIERNQSB6b25lLgorCitUeXBlKEEpIGlzIGNhbGxlZCBhcyAiTm9kZSIgb3JkZXIuIFR5cGUgKEIpIGlzICJab25lIiBvcmRlci4KKworIk5vZGUgb3JkZXIiIG9yZGVycyB0aGUgem9uZWxpc3RzIGJ5IG5vZGUsIHRoZW4gYnkgem9uZSB3aXRoaW4gZWFjaCBub2RlLgorU3BlY2lmeSAiW05uXW9kZSIgZm9yIHpvbmUgb3JkZXIKKworIlpvbmUgT3JkZXIiIG9yZGVycyB0aGUgem9uZWxpc3RzIGJ5IHpvbmUgdHlwZSwgdGhlbiBieSBub2RlIHdpdGhpbiBlYWNoCit6b25lLiAgU3BlY2lmeSAiW1p6XW9uZSJmb3Igem9kZSBvcmRlci4KKworU3BlY2lmeSAiW0RkXWVmYXVsdCIgdG8gcmVxdWVzdCBhdXRvbWF0aWMgY29uZmlndXJhdGlvbi4gIEF1dG9jb25maWd1cmF0aW9uCit3aWxsIHNlbGVjdCAibm9kZSIgb3JkZXIgaW4gZm9sbG93aW5nIGNhc2UuCisoMSkgaWYgdGhlIERNQSB6b25lIGRvZXMgbm90IGV4aXN0IG9yCisoMikgaWYgdGhlIERNQSB6b25lIGNvbXByaXNlcyBncmVhdGVyIHRoYW4gNTAlIG9mIHRoZSBhdmFpbGFibGUgbWVtb3J5IG9yCisoMykgaWYgYW55IG5vZGUncyBETUEgem9uZSBjb21wcmlzZXMgZ3JlYXRlciB0aGFuIDYwJSBvZiBpdHMgbG9jYWwgbWVtb3J5IGFuZAorICAgIHRoZSBhbW91bnQgb2YgbG9jYWwgbWVtb3J5IGlzIGJpZyBlbm91Z2guCisKK090aGVyd2lzZSwgInpvbmUiIG9yZGVyIHdpbGwgYmUgc2VsZWN0ZWQuIERlZmF1bHQgb3JkZXIgaXMgcmVjb21tZW5kZWQgdW5sZXNzCit0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXMgZm9yIHlvdXIgc3lzdGVtL2FwcGxpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAppbmRleCA2ODcxMDRiLi41MWNjYzQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dApAQCAtNzcsOCArNzcsOSBAQAogY2FsbCwgdGhlbiBpdCBpcyByZXF1aXJlZCB0aGF0IHN5c3RlbSBhZG1pbmlzdHJhdG9yIG1vdW50IGEgZmlsZSBzeXN0ZW0gb2YKIHR5cGUgaHVnZXRsYmZzOgogCi0JbW91bnQgbm9uZSAvbW50L2h1Z2UgLXQgaHVnZXRsYmZzIDx1aWQ9dmFsdWU+IDxnaWQ9dmFsdWU+IDxtb2RlPXZhbHVlPgotCQkgPHNpemU9dmFsdWU+IDxucl9pbm9kZXM9dmFsdWU+CisgIG1vdW50IC10IGh1Z2V0bGJmcyBcCisJLW8gdWlkPTx2YWx1ZT4sZ2lkPTx2YWx1ZT4sbW9kZT08dmFsdWU+LHNpemU9PHZhbHVlPixucl9pbm9kZXM9PHZhbHVlPiBcCisJbm9uZSAvbW50L2h1Z2UKIAogVGhpcyBjb21tYW5kIG1vdW50cyBhIChwc2V1ZG8pIGZpbGVzeXN0ZW0gb2YgdHlwZSBodWdldGxiZnMgb24gdGhlIGRpcmVjdG9yeQogL21udC9odWdlLiAgQW55IGZpbGVzIGNyZWF0ZWQgb24gL21udC9odWdlIHVzZXMgaHVnZXBhZ2VzLiAgVGhlIHVpZCBhbmQgZ2lkCkBAIC04OCwxMSArODksMTAgQEAKIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIDA3NTUgaXMgcGlja2VkLiBUaGUgc2l6ZSBvcHRpb24gc2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBvZgogbWVtb3J5IChodWdlIHBhZ2VzKSBhbGxvd2VkIGZvciB0aGF0IGZpbGVzeXN0ZW0gKC9tbnQvaHVnZSkuIFRoZSBzaXplIGlzCiByb3VuZGVkIGRvd24gdG8gSFBBR0VfU0laRS4gIFRoZSBvcHRpb24gbnJfaW5vZGVzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi1pbm9kZXMgdGhhdCAvbW50L2h1Z2UgY2FuIHVzZS4gIElmIHRoZSBzaXplIG9yIG5yX2lub2RlcyBvcHRpb25zIGFyZSBub3QKK2lub2RlcyB0aGF0IC9tbnQvaHVnZSBjYW4gdXNlLiAgSWYgdGhlIHNpemUgb3IgbnJfaW5vZGVzIG9wdGlvbiBpcyBub3QKIHByb3ZpZGVkIG9uIGNvbW1hbmQgbGluZSB0aGVuIG5vIGxpbWl0cyBhcmUgc2V0LiAgRm9yIHNpemUgYW5kIG5yX2lub2Rlcwogb3B0aW9ucywgeW91IGNhbiB1c2UgW0d8Z10vW018bV0vW0t8a10gdG8gcmVwcmVzZW50IGdpZ2EvbWVnYS9raWxvLiBGb3IKLWV4YW1wbGUsIHNpemU9MksgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgc2l6ZT0yMDQ4LiBBbiBleGFtcGxlIGlzIGdpdmVuIGF0Ci10aGUgZW5kIG9mIHRoaXMgZG9jdW1lbnQuCitleGFtcGxlLCBzaXplPTJLIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHNpemU9MjA0OC4KIAogcmVhZCBhbmQgd3JpdGUgc3lzdGVtIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGZpbGVzIHRoYXQgcmVzaWRlIG9uIGh1Z2V0bGIKIGZpbGUgc3lzdGVtcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0CmluZGV4IDE1MjMzMjAuLmQxN2YzMjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dApAQCAtNDEsNiArNDEsOCBAQAogCVAJCVBvaXNvbmluZyAob2JqZWN0IGFuZCBwYWRkaW5nKQogCVUJCVVzZXIgdHJhY2tpbmcgKGZyZWUgYW5kIGFsbG9jKQogCVQJCVRyYWNlIChwbGVhc2Ugb25seSB1c2Ugb24gc2luZ2xlIHNsYWJzKQorCS0JCVN3aXRjaCBhbGwgZGVidWdnaW5nIG9mZiAodXNlZnVsIGlmIHRoZSBrZXJuZWwgaXMKKwkJCWNvbmZpZ3VyZWQgd2l0aCBDT05GSUdfU0xVQl9ERUJVR19PTikKIAogRi5lLiBpbiBvcmRlciB0byBib290IGp1c3Qgd2l0aCBzYW5pdHkgY2hlY2tzIGFuZCByZWQgem9uaW5nIG9uZSB3b3VsZCBzcGVjaWZ5OgogCkBAIC0xMjUsMTMgKzEyNywyMCBAQAogCiBIZXJlIGlzIGEgc2FtcGxlIG9mIHNsdWIgZGVidWcgb3V0cHV0OgogCi0qKiogU0xVQiBrbWFsbG9jLTg6IFJlZHpvbmUgQWN0aXZlQDB4YzkwZjZkMjAgc2xhYiAweGM1MjhjNTMwIG9mZnNldD0zMzYwIGZsYWdzPTB4NDAwMDAwYzMgaW51c2U9NjEgZnJlZWxpc3Q9MHhjOTBmNmQ1OAotICBCeXRlcyBiNCAweGM5MGY2ZDEwOiAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgLi4uLi4uLi5aWlpaWlpaWgotICAgIE9iamVjdCAweGM5MGY2ZDIwOiAgMzEgMzAgMzEgMzkgMmUgMzAgMzAgMzUgICAgICAgICAgICAgICAgICAgICAgICAgMTAxOS4wMDUKLSAgIFJlZHpvbmUgMHhjOTBmNmQyODogIDAwIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLUZyZWVQb2ludGVyIDB4YzkwZjZkMmMgLT4gMHhjOTBmNmQ1OAotTGFzdCBhbGxvYzogZ2V0X21vZGFsaWFzKzB4NjEvMHhmNSBqaWZmaWVzX2Fnbz01MyBjcHU9MSBwaWQ9NTU0Ci1GaWxsZXIgMHhjOTBmNmQ1MDogIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhICAgICAgICAgICAgICAgICAgICAgICAgIFpaWlpaWlpaCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQlVHIGttYWxsb2MtODogUmVkem9uZSBvdmVyd3JpdHRlbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5GTzogMHhjOTBmNmQyOC0weGM5MGY2ZDJiLiBGaXJzdCBieXRlIDB4MDAgaW5zdGVhZCBvZiAweGNjCitJTkZPOiBTbGFiIDB4YzUyOGM1MzAgZmxhZ3M9MHg0MDAwMDBjMyBpbnVzZT02MSBmcD0weGM5MGY2ZDU4CitJTkZPOiBPYmplY3QgMHhjOTBmNmQyMCBAb2Zmc2V0PTMzNjAgZnA9MHhjOTBmNmQ1OAorSU5GTzogQWxsb2NhdGVkIGluIGdldF9tb2RhbGlhcysweDYxLzB4ZjUgYWdlPTUzIGNwdT0xIHBpZD01NTQKKworQnl0ZXMgYjQgMHhjOTBmNmQxMDogIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDVhIDVhIDVhIDVhIDVhIDVhIDVhIDVhIC4uLi4uLi4uWlpaWlpaWloKKyAgT2JqZWN0IDB4YzkwZjZkMjA6ICAzMSAzMCAzMSAzOSAyZSAzMCAzMCAzNSAgICAgICAgICAgICAgICAgICAgICAgICAxMDE5LjAwNQorIFJlZHpvbmUgMHhjOTBmNmQyODogIDAwIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyBQYWRkaW5nIDB4YzkwZjZkNTA6ICA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICBaWlpaWlpaWgorCiAgIFs8YzAxMDUyM2Q+XSBkdW1wX3RyYWNlKzB4NjMvMHgxZWIKICAgWzxjMDEwNTNkZj5dIHNob3dfdHJhY2VfbG9nX2x2bCsweDFhLzB4MmYKICAgWzxjMDEwNjAxZD5dIHNob3dfdHJhY2UrMHgxMi8weDE0CkBAIC0xNTMsNzQgKzE2MiwxMDggQEAKICAgWzxjMDEwNDExMj5dIHN5c2VudGVyX3Bhc3RfZXNwKzB4NWYvMHg5OQogICBbPGI3ZjdiNDEwPl0gMHhiN2Y3YjQxMAogICA9PT09PT09PT09PT09PT09PT09PT09PQotQEBAIFNMVUIga21hbGxvYy04OiBSZXN0b3JpbmcgcmVkem9uZSAoMHhjYykgZnJvbSAweGM5MGY2ZDI4LTB4YzkwZjZkMmIKIAorRklYIGttYWxsb2MtODogUmVzdG9yaW5nIFJlZHpvbmUgMHhjOTBmNmQyOC0weGM5MGY2ZDJiPTB4Y2MKIAorSWYgU0xVQiBlbmNvdW50ZXJzIGEgY29ycnVwdGVkIG9iamVjdCAoZnVsbCBkZXRlY3Rpb24gcmVxdWlyZXMgdGhlIGtlcm5lbAordG8gYmUgYm9vdGVkIHdpdGggc2x1Yl9kZWJ1ZykgdGhlbiB0aGUgZm9sbG93aW5nIG91dHB1dCB3aWxsIGJlIGR1bXBlZAoraW50byB0aGUgc3lzbG9nOgogCi1JZiBTTFVCIGVuY291bnRlcnMgYSBjb3JydXB0ZWQgb2JqZWN0IHRoZW4gaXQgd2lsbCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcKLWFjdGlvbnM6Ci0KLTEuIElzb2xhdGlvbiBhbmQgcmVwb3J0IG9mIHRoZSBpc3N1ZQorMS4gRGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gZW5jb3VudGVyZWQKIAogVGhpcyB3aWxsIGJlIGEgbWVzc2FnZSBpbiB0aGUgc3lzdGVtIGxvZyBzdGFydGluZyB3aXRoCiAKLSoqKiBTTFVCIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPFdoYXQgd2VudCB3cm9uZz5APG9iamVjdCBhZGRyZXNzPgotb2Zmc2V0PTxvZmZzZXQgb2Ygb2JqZWN0IGludG8gc2xhYj4gZmxhZ3M9PHNsYWJmbGFncz4KLWludXNlPTxvYmplY3RzIGluIHVzZSBpbiB0aGlzIHNsYWI+IGZyZWVsaXN0PTxmaXJzdCBmcmVlIG9iamVjdCBpbiBzbGFiPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JVRyA8c2xhYiBjYWNoZSBhZmZlY3RlZD46IDxXaGF0IHdlbnQgd3Jvbmc+CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0yLiBSZXBvcnQgb24gaG93IHRoZSBwcm9ibGVtIHdhcyBkZWFsdCB3aXRoIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY29udGludWVkCi1vcGVyYXRpb24gb2YgdGhlIHN5c3RlbS4KK0lORk86IDxjb3JydXB0aW9uIHN0YXJ0Pi08Y29ycnVwdGlvbl9lbmQ+IDxtb3JlIGluZm8+CitJTkZPOiBTbGFiIDxhZGRyZXNzPiA8c2xhYiBpbmZvcm1hdGlvbj4KK0lORk86IE9iamVjdCA8YWRkcmVzcz4gPG9iamVjdCBpbmZvcm1hdGlvbj4KK0lORk86IEFsbG9jYXRlZCBpbiA8a2VybmVsIGZ1bmN0aW9uPiBhZ2U9PGppZmZpZXMgc2luY2UgYWxsb2M+IGNwdT08YWxsb2NhdGVkIGJ5CisJY3B1PiBwaWQ9PHBpZCBvZiB0aGUgcHJvY2Vzcz4KK0lORk86IEZyZWVkIGluIDxrZXJuZWwgZnVuY3Rpb24+IGFnZT08amlmZmllcyBzaW5jZSBmcmVlPiBjcHU9PGZyZWVkIGJ5IGNwdT4KKwkgcGlkPTxwaWQgb2YgdGhlIHByb2Nlc3M+CiAKLVRoZXNlIGFyZSBtZXNzYWdlcyBpbiB0aGUgc3lzdGVtIGxvZyBiZWdpbm5pbmcgd2l0aAorKE9iamVjdCBhbGxvY2F0aW9uIC8gZnJlZSBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpZiBTTEFCX1NUT1JFX1VTRVIgaXMKK3NldCBmb3IgdGhlIHNsYWIuIHNsdWJfZGVidWcgc2V0cyB0aGF0IG9wdGlvbikKIAotQEBAIFNMVUIgPHNsYWIgY2FjaGUgYWZmZWN0ZWQ+OiA8Y29ycmVjdGl2ZSBhY3Rpb24gdGFrZW4+CisyLiBUaGUgb2JqZWN0IGNvbnRlbnRzIGlmIGFuIG9iamVjdCB3YXMgaW52b2x2ZWQuCiAKLQotSW4gdGhlIGFib3ZlIHNhbXBsZSBTTFVCIGZvdW5kIHRoYXQgdGhlIFJlZHpvbmUgb2YgYW4gYWN0aXZlIG9iamVjdCBoYXMKLWJlZW4gb3ZlcndyaXR0ZW4uIEhlcmUgYSBzdHJpbmcgb2YgOCBjaGFyYWN0ZXJzIHdhcyB3cml0dGVuIGludG8gYSBzbGFiIHRoYXQKLWhhcyB0aGUgbGVuZ3RoIG9mIDggY2hhcmFjdGVycy4gSG93ZXZlciwgYSA4IGNoYXJhY3RlciBzdHJpbmcgbmVlZHMgYQotdGVybWluYXRpbmcgMC4gVGhhdCB6ZXJvIGhhcyBvdmVyd3JpdHRlbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgUmVkem9uZSBmaWVsZC4KLUFmdGVyIHJlcG9ydGluZyB0aGUgZGV0YWlscyBvZiB0aGUgaXNzdWUgZW5jb3VudGVyZWQgdGhlIEBAQCBTTFVCIG1lc3NhZ2UKLXRlbGwgdXMgdGhhdCBTTFVCIGhhcyByZXN0b3JlZCB0aGUgcmVkem9uZSB0byBpdHMgcHJvcGVyIHZhbHVlIGFuZCB0aGVuCi1zeXN0ZW0gb3BlcmF0aW9ucyBjb250aW51ZS4KLQotVmFyaW91cyB0eXBlcyBvZiBsaW5lcyBjYW4gZm9sbG93IHRoZSBAQEAgU0xVQiBsaW5lOgorVmFyaW91cyB0eXBlcyBvZiBsaW5lcyBjYW4gZm9sbG93IHRoZSBCVUcgU0xVQiBsaW5lOgogCiBCeXRlcyBiNCA8YWRkcmVzcz4gOiA8Ynl0ZXM+Ci0JU2hvdyBhIGZldyBieXRlcyBiZWZvcmUgdGhlIG9iamVjdCB3aGVyZSB0aGUgcHJvYmxlbSB3YXMgZGV0ZWN0ZWQuCisJU2hvd3MgYSBmZXcgYnl0ZXMgYmVmb3JlIHRoZSBvYmplY3Qgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGRldGVjdGVkLgogCUNhbiBiZSB1c2VmdWwgaWYgdGhlIGNvcnJ1cHRpb24gZG9lcyBub3Qgc3RvcCB3aXRoIHRoZSBzdGFydCBvZiB0aGUKIAlvYmplY3QuCiAKIE9iamVjdCA8YWRkcmVzcz4gOiA8Ynl0ZXM+CiAJVGhlIGJ5dGVzIG9mIHRoZSBvYmplY3QuIElmIHRoZSBvYmplY3QgaXMgaW5hY3RpdmUgdGhlbiB0aGUgYnl0ZXMKLQl0eXBpY2FsbHkgY29udGFpbiBwb2lzb25pbmcgdmFsdWVzLiBBbnkgbm9uLXBvaXNvbiB2YWx1ZSBzaG93cyBhCisJdHlwaWNhbGx5IGNvbnRhaW4gcG9pc29uIHZhbHVlcy4gQW55IG5vbi1wb2lzb24gdmFsdWUgc2hvd3MgYQogCWNvcnJ1cHRpb24gYnkgYSB3cml0ZSBhZnRlciBmcmVlLgogCiBSZWR6b25lIDxhZGRyZXNzPiA6IDxieXRlcz4KLQlUaGUgcmVkem9uZSBmb2xsb3dpbmcgdGhlIG9iamVjdC4gVGhlIHJlZHpvbmUgaXMgdXNlZCB0byBkZXRlY3QKKwlUaGUgUmVkem9uZSBmb2xsb3dpbmcgdGhlIG9iamVjdC4gVGhlIFJlZHpvbmUgaXMgdXNlZCB0byBkZXRlY3QKIAl3cml0ZXMgYWZ0ZXIgdGhlIG9iamVjdC4gQWxsIGJ5dGVzIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgc2FtZQogCXZhbHVlLiBJZiB0aGVyZSBpcyBhbnkgZGV2aWF0aW9uIHRoZW4gaXQgaXMgZHVlIHRvIGEgd3JpdGUgYWZ0ZXIKIAl0aGUgb2JqZWN0IGJvdW5kYXJ5LgogCi1GcmVlcG9pbnRlcgotCVRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGZyZWUgb2JqZWN0IGluIHRoZSBzbGFiLiBNYXkgYmVjb21lCi0JY29ycnVwdGVkIGlmIG92ZXJ3cml0aW5nIGNvbnRpbnVlcyBhZnRlciB0aGUgcmVkIHpvbmUuCisJKFJlZHpvbmUgaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgU0xBQl9SRURfWk9ORSBpcyBzZXQuCisJc2x1Yl9kZWJ1ZyBzZXRzIHRoYXQgb3B0aW9uKQogCi1MYXN0IGFsbG9jOgotTGFzdCBmcmVlOgotCVNob3dzIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIG9iamVjdCB3YXMgYWxsb2NhdGVkL2ZyZWVkIGxhc3QuCi0JV2Ugbm90ZSB0aGUgcGlkLCB0aGUgdGltZSBhbmQgdGhlIENQVSB0aGF0IGRpZCBzby4gVGhpcyBpcyB1c3VhbGx5Ci0JdGhlIG1vc3QgdXNlZnVsIGluZm9ybWF0aW9uIHRvIGZpZ3VyZSBvdXQgd2hlcmUgdGhpbmdzIHdlbnQgd3JvbmcuCi0JSGVyZSBnZXRfbW9kYWxpYXMoKSBkaWQgYW4ga21hbGxvYyg4KSBpbnN0ZWFkIG9mIGEga21hbGxvYyg5KS4KLQotRmlsbGVyIDxhZGRyZXNzPiA6IDxieXRlcz4KK1BhZGRpbmcgPGFkZHJlc3M+IDogPGJ5dGVzPgogCVVudXNlZCBkYXRhIHRvIGZpbGwgdXAgdGhlIHNwYWNlIGluIG9yZGVyIHRvIGdldCB0aGUgbmV4dCBvYmplY3QKIAlwcm9wZXJseSBhbGlnbmVkLiBJbiB0aGUgZGVidWcgY2FzZSB3ZSBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUKLQlhdCBsZWFzdCA0IGJ5dGVzIG9mIGZpbGxlci4gVGhpcyBhbGxvdyBmb3IgdGhlIGRldGVjdGlvbiBvZiB3cml0ZXMKKwlhdCBsZWFzdCA0IGJ5dGVzIG9mIHBhZGRpbmcuIFRoaXMgYWxsb3dzIHRoZSBkZXRlY3Rpb24gb2Ygd3JpdGVzCiAJYmVmb3JlIHRoZSBvYmplY3QuCiAKLUZvbGxvd2luZyB0aGUgZmlsbGVyIHdpbGwgYmUgYSBzdGFja2R1bXAuIFRoYXQgc3RhY2tkdW1wIGRlc2NyaWJlcyB0aGUKLWxvY2F0aW9uIHdoZXJlIHRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQuIFRoZSBjYXVzZSBvZiB0aGUgY29ycnVwdGlvbiBpcyBtb3JlCi1saWtlbHkgdG8gYmUgZm91bmQgYnkgbG9va2luZyBhdCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgYWxsb2MgLyBmcmVlLgorMy4gQSBzdGFja2R1bXAKIAotQ2hyaXN0b3BoIExhbWV0ZXIsIDxjbGFtZXRlckBzZ2kuY29tPiwgTWF5IDIzLCAyMDA3CitUaGUgc3RhY2tkdW1wIGRlc2NyaWJlcyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4gVGhlIGNhdXNlCitvZiB0aGUgY29ycnVwdGlvbiBpcyBtYXkgYmUgbW9yZSBsaWtlbHkgZm91bmQgYnkgbG9va2luZyBhdCB0aGUgZnVuY3Rpb24gdGhhdAorYWxsb2NhdGVkIG9yIGZyZWVkIHRoZSBvYmplY3QuCisKKzQuIFJlcG9ydCBvbiBob3cgdGhlIHByb2JsZW0gd2FzIGRlYWx0IHdpdGggaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBjb250aW51ZWQKK29wZXJhdGlvbiBvZiB0aGUgc3lzdGVtLgorCitUaGVzZSBhcmUgbWVzc2FnZXMgaW4gdGhlIHN5c3RlbSBsb2cgYmVnaW5uaW5nIHdpdGgKKworRklYIDxzbGFiIGNhY2hlIGFmZmVjdGVkPjogPGNvcnJlY3RpdmUgYWN0aW9uIHRha2VuPgorCitJbiB0aGUgYWJvdmUgc2FtcGxlIFNMVUIgZm91bmQgdGhhdCB0aGUgUmVkem9uZSBvZiBhbiBhY3RpdmUgb2JqZWN0IGhhcworYmVlbiBvdmVyd3JpdHRlbi4gSGVyZSBhIHN0cmluZyBvZiA4IGNoYXJhY3RlcnMgd2FzIHdyaXR0ZW4gaW50byBhIHNsYWIgdGhhdAoraGFzIHRoZSBsZW5ndGggb2YgOCBjaGFyYWN0ZXJzLiBIb3dldmVyLCBhIDggY2hhcmFjdGVyIHN0cmluZyBuZWVkcyBhCit0ZXJtaW5hdGluZyAwLiBUaGF0IHplcm8gaGFzIG92ZXJ3cml0dGVuIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBSZWR6b25lIGZpZWxkLgorQWZ0ZXIgcmVwb3J0aW5nIHRoZSBkZXRhaWxzIG9mIHRoZSBpc3N1ZSBlbmNvdW50ZXJlZCB0aGUgRklYIFNMVUIgbWVzc2FnZQordGVsbCB1cyB0aGF0IFNMVUIgaGFzIHJlc3RvcmVkIHRoZSBSZWR6b25lIHRvIGl0cyBwcm9wZXIgdmFsdWUgYW5kIHRoZW4KK3N5c3RlbSBvcGVyYXRpb25zIGNvbnRpbnVlLgorCitFbWVyZ2VuY3kgb3BlcmF0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNaW5pbWFsIGRlYnVnZ2luZyAoc2FuaXR5IGNoZWNrcyBhbG9uZSkgY2FuIGJlIGVuYWJsZWQgYnkgYm9vdGluZyB3aXRoCisKKwlzbHViX2RlYnVnPUYKKworVGhpcyB3aWxsIGJlIGdlbmVyYWxseSBiZSBlbm91Z2ggdG8gZW5hYmxlIHRoZSByZXNpbGllbmN5IGZlYXR1cmVzIG9mIHNsdWIKK3doaWNoIHdpbGwga2VlcCB0aGUgc3lzdGVtIHJ1bm5pbmcgZXZlbiBpZiBhIGJhZCBrZXJuZWwgY29tcG9uZW50IHdpbGwKK2tlZXAgY29ycnVwdGluZyBvYmplY3RzLiBUaGlzIG1heSBiZSBpbXBvcnRhbnQgZm9yIHByb2R1Y3Rpb24gc3lzdGVtcy4KK1BlcmZvcm1hbmNlIHdpbGwgYmUgaW1wYWN0ZWQgYnkgdGhlIHNhbml0eSBjaGVja3MgYW5kIHRoZXJlIHdpbGwgYmUgYQorY29udGludWFsIHN0cmVhbSBvZiBlcnJvciBtZXNzYWdlcyB0byB0aGUgc3lzbG9nIGJ1dCBubyBhZGRpdGlvbmFsIG1lbW9yeQord2lsbCBiZSB1c2VkICh1bmxpa2UgZnVsbCBkZWJ1Z2dpbmcpLgorCitObyBndWFyYW50ZWVzLiBUaGUga2VybmVsIGNvbXBvbmVudCBzdGlsbCBuZWVkcyB0byBiZSBmaXhlZC4gUGVyZm9ybWFuY2UKK21heSBiZSBvcHRpbWl6ZWQgZnVydGhlciBieSBsb2NhdGluZyB0aGUgc2xhYiB0aGF0IGV4cGVyaWVuY2VzIGNvcnJ1cHRpb24KK2FuZCBlbmFibGluZyBkZWJ1Z2dpbmcgb25seSBmb3IgdGhhdCBjYWNoZQorCitJLmUuCisKKwlzbHViX2RlYnVnPUYsZGVudHJ5CisKK0lmIHRoZSBjb3JydXB0aW9uIG9jY3VycyBieSB3cml0aW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG9iamVjdCB0aGVuIGl0CittYXkgYmUgYWR2aXNhYmxlIHRvIGVuYWJsZSBhIFJlZHpvbmUgdG8gYXZvaWQgY29ycnVwdGluZyB0aGUgYmVnaW5uaW5nCitvZiBvdGhlciBvYmplY3RzLgorCisJc2x1Yl9kZWJ1Zz1GWixkZW50cnkKKworQ2hyaXN0b3BoIExhbWV0ZXIsIDxjbGFtZXRlckBzZ2kuY29tPiwgTWF5IDMwLCAyMDA3CmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDM5MTQyNjkuLjVhYmVjMTQgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xOTQsMTMgKzE5NCw2IEBACiBMOglsaW51eC1hY2VuaWNAc3Vuc2l0ZS5kawogUzoJTWFpbnRhaW5lZAogCi1BQ0kgTUlYRVIgRFJJVkVSCi1QOglSb2JlcnQgU2llbWVyCi1NOglSb2JlcnQuU2llbWVyQGdteC5kZQotTDoJbGludXgtc291bmRAdmdlci5rZXJuZWwub3JnCi1XOglodHRwOi8vd3d3LnN0dWQudW5pLWthcmxzcnVoZS5kZS9+dWgxYi8KLVM6CU1haW50YWluZWQKLQogSVBTIFNDU0kgUkFJRCBEUklWRVIKIFA6CUFkYXB0ZWMgT0VNIFJhaWQgU29sdXRpb25zCiBNOglhYWNyYWlkQGFkYXB0ZWMuY29tCkBAIC0yNzIsMjEgKzI2NSw2IEBACiBXOglodHRwOi8vYWNwaS5zb3VyY2Vmb3JnZS5uZXQvCiBTOglTdXBwb3J0ZWQKIAotQUQxODE2IFNPVU5EIERSSVZFUgotUDoJVGhvcnN0ZW4gS25hYmUKLU06CVRob3JzdGVuIEtuYWJlIDxsaW51eEB0aG9yc3Rlbi1rbmFiZS5kZT4KLVc6CWh0dHA6Ly9saW51eC50aG9yc3Rlbi1rbmFiZS5kZQotUzoJTWFpbnRhaW5lZAotCi1BRDE4ODkgU09VTkQgRFJJVkVSCi1QOglLeWxlIE1jTWFydGluCi1NOglreWxlQHBhcmlzYy1saW51eC5vcmcKLVA6CVRoaWJhdXQgVmFyZW5lCi1NOglULUJvbmVAcGFyaXNjLWxpbnV4Lm9yZwotVzoJaHR0cDovL3dpa2kucGFyaXNjLWxpbnV4Lm9yZy9BRDE4ODkKLUw6CXBhcmlzYy1saW51eEBsaXN0cy5wYXJpc2MtbGludXgub3JnCi1TOglNYWludGFpbmVkCi0KIEFETTEwMjUgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIFA6CUplYW4gRGVsdmFyZQogTToJa2hhbGlAbGludXgtZnIub3JnCkBAIC0xMjc2LDYgKzEyNTQsMTIgQEAKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorRE1BIEdFTkVSSUMgTUVNQ1BZIFNVQlNZU1RFTQorUDoJU2hhbm5vbiBOZWxzb24KK006CXNoYW5ub24ubmVsc29uQGludGVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBET0NCT09LIEZPUiBET0NVTUVOVEFUSU9OCiBQOglSYW5keSBEdW5sYXAKIE06CXJkdW5sYXBAeGVub3RpbWUubmV0CkBAIC0xMzk4LDEzICsxMzgyLDYgQEAKIEw6CWdlbmVyYWxAbGlzdHMub3BlbmZhYnJpY3Mub3JnCiBTOglTdXBwb3J0ZWQKIAotRU1VMTBLMSBTT1VORCBEUklWRVIKLVA6CUphbWVzIENvdXJ0aWVyLUR1dHRvbgotTToJSmFtZXNAc3VwZXJidWcuZGVtb24uY28udWsKLUw6CWVtdTEwazEtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Ci1XOglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VtdTEwazEvCi1TOglNYWludGFpbmVkCi0KIEVNVUxFWCBMUEZDIEZDIFNDU0kgRFJJVkVSCiBQOglKYW1lcyBTbWFydAogTToJamFtZXMuc21hcnRAZW11bGV4LmNvbQpAQCAtMTkwMCw2ICsxODc3LDEyIEBACiBNOgl0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWsKIFM6CU1haW50YWluZWQKIAorSU5URUwgSS9PQVQgRE1BIERSSVZFUgorUDoJU2hhbm5vbiBOZWxzb24KK006CXNoYW5ub24ubmVsc29uQGludGVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIElOVEVMIElYUDRYWCBSQU5ET00gTlVNQkVSIEdFTkVSQVRPUiBTVVBQT1JUCiBQOglEZWVwYWsgU2F4ZW5hCiBNOglkc2F4ZW5hQHBsZXhpdHkubmV0CkBAIC0yMjk3LDYgKzIyODAsMTQgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiAKK00zMlIgQVJDSElURUNUVVJFCitQOglIaXJva2F6dSBUYWthdGEKK006CXRha2F0YUBsaW51eC1tMzJyLm9yZworTDoJbGludXgtbTMyckBtbC5saW51eC1tMzJyLm9yZworTDoJbGludXgtbTMyci1qYUBtbC5saW51eC1tMzJyLm9yZyAoaW4gSmFwYW5lc2UpCitXOglodHRwOi8vd3d3LmxpbnV4LW0zMnIub3JnLworUzoJTWFpbnRhaW5lZAorCiBNNjhLIEFSQ0hJVEVDVFVSRQogUDoJR2VlcnQgVXl0dGVyaG9ldmVuCiBNOglnZWVydEBsaW51eC1tNjhrLm9yZwpAQCAtMjYyMiwxMiArMjYxMyw2IEBACiBXOglodHRwOi8vd3d3Lm5ldGxhYi5pcy50c3VrdWJhLmFjLmpwL355b2tvdGEvaXp1bWkvbmluamEvCiBTOglNYWludGFpbmVkCiAKLU5PTi1JREUvTk9OLVNDU0kgQ0RST00gRFJJVkVSUyBbR0VORVJBTF0gKGNvbWUgb24sIGNyZXcgLSBtYXJrIHlvdXIgcmVzcG9uc2liaWxpdHkpCi1QOglFYmVyaGFyZCBNb2Vua2ViZXJnCi1NOgllbW9lbmtlQGd3ZGcuZGUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogTlRGUyBGSUxFU1lTVEVNCiBQOglBbnRvbiBBbHRhcGFybWFrb3YKIE06CWFpYTIxQGNhbnRhYi5uZXQKQEAgLTI3MTAsMTIgKzI2OTUsNiBAQAogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAotT1BMMy1TQTIsIFNBMywgYW5kIFNBeCBEUklWRVIKLVA6CVp3YW5lIE13YWlrYW1ibwotTToJendhbmVAYXJtLmxpbnV4Lm9yZy51awotTDoJbGludXgtc291bmRAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi0KIE9QUk9GSUxFCiBQOglQaGlsaXBwZSBFbGllCiBNOglwaGlsLmVsQHdhbmFkb28uZnIKQEAgLTMxMjAsMTIgKzMwOTksNiBAQAogVzoJaHR0cDovL3d3dy5taWh1LmRlL2xpbnV4L3NhYTcxNDYKIFM6CU1haW50YWluZWQKIAotU0JQQ0QgQ0RST00gRFJJVkVSCi1QOglFYmVyaGFyZCBNb2Vua2ViZXJnCi1NOgllbW9lbmtlQGd3ZGcuZGUKLUw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLQogU0MxMjAwIFdEVCBEUklWRVIKIFA6CVp3YW5lIE13YWlrYW1ibwogTToJendhbmVAYXJtLmxpbnV4Lm9yZy51awpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBkZTRmOGY3Li5kZGJmY2FjIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzEzLDcgKzMxMyw4IEBACiBDUFBGTEFHUyAgICAgICAgOj0gLURfX0tFUk5FTF9fICQoTElOVVhJTkNMVURFKQogCiBDRkxBR1MgICAgICAgICAgOj0gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIFwKLSAgICAgICAgICAgICAgICAgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbgorCQkgICAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiBcCisJCSAgIC1XZXJyb3ItaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24KIEFGTEFHUyAgICAgICAgICA6PSAtRF9fQVNTRU1CTFlfXwogCiAjIFJlYWQgS0VSTkVMUkVMRUFTRSBmcm9tIGluY2x1ZGUvY29uZmlnL2tlcm5lbC5yZWxlYXNlIChpZiBpdCBleGlzdHMpCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCmluZGV4IDBjZDA2MDUuLjgzYTc4MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3B0cmFjZS5jCkBAIC0zMTUsOSArMzE1LDcgQEAKIAkvKiBXaGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gICovCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXRtcCA9IGRhdGE7Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMSk7Ci0JCXJldCA9IChjb3BpZWQgPT0gc2l6ZW9mKHRtcCkpID8gMCA6IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zbXAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCmluZGV4IDgwY2ZiNzUuLmIyODczMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NtcC5jCkBAIC02NSw3ICs2NSw3IEBACiB9OwogCiAvKiBTZXQgdG8gYSBzZWNvbmRhcnkncyBjcHVpZCB3aGVuIGl0IGNvbWVzIG9ubGluZS4gICovCi1zdGF0aWMgaW50IHNtcF9zZWNvbmRhcnlfYWxpdmUgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHNtcF9zZWNvbmRhcnlfYWxpdmUgX19kZXZpbml0ZGF0YSA9IDA7CiAKIC8qIFdoaWNoIGNwdXMgaWRzIGNhbWUgb25saW5lLiAgKi8KIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKQEAgLTE3Myw3ICsxNzMsNyBAQAogfQogCiAvKiBXYWl0IHVudGlsIGh3cnBiLT50eHJkeSBpcyBjbGVhciBmb3IgY3B1LiAgUmV0dXJuIC0xIG9uIHRpbWVvdXQuICAqLwotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiB3YWl0X2Zvcl90eHJkeSAodW5zaWduZWQgbG9uZyBjcHVtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKQEAgLTM1OCw3ICszNTgsNyBAQAogLyoKICAqIEJyaW5nIG9uZSBjcHUgb25saW5lLgogICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIHNtcF9ib290X29uZV9jcHUoaW50IGNwdWlkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NybWNvbnMuYwppbmRleCA5MzBjZWRjLi43ODNmNGU1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zcm1jb25zLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3JtY29ucy5jCkBAIC0yODksNyArMjg5LDcgQEAKIAlyZXR1cm4gc3JtY29uc19kcml2ZXI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50CiBzcm1fY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKaW5kZXggMGJjYjk2OC4uOTIyMTQzZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYwpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCWlvN19jbGVhcl9lcnJvcnMoaW83KTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyB2b2lkIF9faW5pdAogbWFydmVsX2luaXRfcnRjKHZvaWQpCiB7CiAJaW5pdF9ydGNfaXJxKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FscGhhL2tlcm5lbC90aW1lLmMKaW5kZXggNDc0OGUxNC4uMWRkNTBkMCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3RpbWUuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCit2b2lkIF9faW5pdAogY29tbW9uX2luaXRfcnRjKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciB4OwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKaW5kZXggZDZlNjY1ZC4uZWMwZjA1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCkBAIC0xODQsNiArMTg0LDcgQEAKICNlbmRpZgogCXByaW50aygiJXMoJWQpOiAlcyAlbGRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc3RyLCBlcnIpOwogCWRpa19zaG93X3JlZ3MocmVncywgcjlfMTUpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWRpa19zaG93X3RyYWNlKCh1bnNpZ25lZCBsb25nICopKHJlZ3MrMSkpOwogCWRpa19zaG93X2NvZGUoKHVuc2lnbmVkIGludCAqKXJlZ3MtPnBjKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYyBiL2FyY2gvYWxwaGEvbGliL2NoZWNrc3VtLmMKaW5kZXggYWIzNzYxYy4uODY5OGUwNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL2FscGhhL2xpYi9jaGVja3N1bS5jCkBAIC02OSw2ICs2OSw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CiAKIC8qCiAgKiBEbyBhIDY0LWJpdCBjaGVja3N1bSBvbiBhbiBhcmJpdHJhcnkgbWVtb3J5IGFyZWEuLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0va2VybmVsL3B0cmFjZS5jCmluZGV4IDZmMmY0NmMuLjc4YzlmMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHRyYWNlLmMKQEAgLTY1Nyw3ICs2NTcsNiBAQAogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAogCXN3aXRjaCAocmVxdWVzdCkgewpAQCAtNjY2LDEyICs2NjUsNyBAQAogCQkgKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgotCQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDApOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC02ODMsMTIgKzY3Nyw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggMjM3ZjQ5OS4uZjIxMTRiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTI0OSw2ICsyNDksNyBAQAogCWJ1c3Rfc3BpbmxvY2tzKDEpOwogCV9fZGllKHN0ciwgZXJyLCB0aHJlYWQsIHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCmluZGV4IGUxOGE0MWUuLmRkZTA4OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogCkBAIC04Myw2ICs4NCwxMyBAQAogCS5wdWxsdXBfcGluCT0gQVQ5MV9QSU5fUEEyNCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSBjc2IzMzdfaTJjX2RldmljZXNbXSA9IHsKKwl7IEkyQ19CT0FSRF9JTkZPKCJydGMtZHMxMzA3IiwgMHg2OCksCisJICAudHlwZSA9ICJkczEzMDciLAorCX0sCit9OworCisKIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9jZl9kYXRhIF9faW5pdGRhdGEgY3NiMzM3X2NmX2RhdGEgPSB7CiAJLyoKIAkgKiBjb25uZWN0b3IgUDQgb24gdGhlIENTQiAzMzcgbWF0ZXMgdG8KQEAgLTE2MSw2ICsxNjksOCBAQAogCWF0OTFfYWRkX2RldmljZV91ZGMoJmNzYjMzN191ZGNfZGF0YSk7CiAJLyogSTJDICovCiAJYXQ5MV9hZGRfZGV2aWNlX2kyYygpOworCWkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvKDAsIGNzYjMzN19pMmNfZGV2aWNlcywKKwkJCUFSUkFZX1NJWkUoY3NiMzM3X2kyY19kZXZpY2VzKSk7CiAJLyogQ29tcGFjdCBGbGFzaCAqLwogCWF0OTFfc2V0X2dwaW9faW5wdXQoQVQ5MV9QSU5fUEIyMiwgMSk7CQkvKiBJT0lTMTYgKi8KIAlhdDkxX2FkZF9kZXZpY2VfY2YoJmNzYjMzN19jZl9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDM5MGE5N2QuLjE4NzNiZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgpAQCAtMTk5LDYgKzIwMCwxMiBAQAogCS5yZXNvdXJjZQk9ICZuMjEwMF91YXJ0X3Jlc291cmNlLAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyBfX2luaXRkYXRhIG4yMTAwX2kyY19kZXZpY2VzW10gPSB7CisJeworCQlJMkNfQk9BUkRfSU5GTygicnRjLXJzNWMzNzIiLCAweDMyKSwKKwkJLnR5cGUgPSAicnM1YzM3MmIiLAorCX0sCit9OwogCiAvKgogICogUHVsbCBQQ0E5NTMyIEdQSU8gIzggbG93IHRvIHBvd2VyIG9mZiB0aGUgbWFjaGluZS4KQEAgLTI0OCw2ICsyNTUsOSBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4X2RtYV8wX2NoYW5uZWwpOwogCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaW9wM3h4X2RtYV8xX2NoYW5uZWwpOwogCisJaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8oMCwgbjIxMDBfaTJjX2RldmljZXMsCisJCUFSUkFZX1NJWkUobjIxMDBfaTJjX2RldmljZXMpKTsKKwogCXBtX3Bvd2VyX29mZiA9IG4yMTAwX3Bvd2VyX29mZjsKIAogCWluaXRfdGltZXIoJnBvd2VyX2J1dHRvbl9wb2xsX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvS2NvbmZpZyBiL2FyY2gvYXJtMjYvS2NvbmZpZwppbmRleCAyMDY4OGJjLi45MDQ0ZjMzIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L0tjb25maWcKKysrIGIvYXJjaC9hcm0yNi9LY29uZmlnCkBAIC0xNyw2ICsxNyw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgTk9fRE1BCisJZGVmX2Jvb2wgeQorCiBjb25maWcgQVJDSF9BQ09STgogICAgICAgICBib29sCiAgICAgICAgIGRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0yNi9kZWZjb25maWcgYi9hcmNoL2FybTI2L2RlZmNvbmZpZwppbmRleCBjNGE4OTcwLi4yYjdkNDRiIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L2RlZmNvbmZpZworKysgYi9hcmNoL2FybTI2L2RlZmNvbmZpZwpAQCAtMjQ4LDcgKzI0OCw2IEBACiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VNU0RPU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hcm0yNi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNDE2OTI3OS4uMGZlZmI4NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvYXJtMjYva2VybmVsL3B0cmFjZS5jCkBAIC01MzEsNyArNTMxLDYgQEAKIAogbG9uZyBhcmNoX3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKQEAgLTU0MCwxMiArNTM5LDcgQEAKIAkJICovCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgogCQljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLAotCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAwKTsKLQkJCWlmIChyZXQgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC01NTcsMTIgKzU1MSw3IEBACiAJCSAqLwogCQljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAkJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsCi0JCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyksIDEpOwotCQkJaWYgKHJldCA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBQVFJBQ0VfUE9LRVVTUjoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTI2L2tlcm5lbC90cmFwcy5jCmluZGV4IGQ1OTRmYjUuLjI5MTFlMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0yNi9rZXJuZWwvdHJhcHMuYwpAQCAtMTg1LDYgKzE4NSw3IEBACiAJcHJpbnRrKCJJbnRlcm5hbCBlcnJvcjogJXM6ICV4XG4iLCBzdHIsIGVycik7CiAJcHJpbnRrKCJDUFU6ICVkXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXNob3dfcmVncyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHN0YWNrIGxpbWl0ID0gMHglcClcbiIsCiAJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZW5kX29mX3N0YWNrKHRzaykpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTI2L21tL2luaXQuYyBiL2FyY2gvYXJtMjYvbW0vaW5pdC5jCmluZGV4IDU2MmZhYzEuLjM2ZTdlZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtMjYvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtMjYvbW0vaW5pdC5jCkBAIC0zMyw5ICszMyw2IEBACiAKICNpbmNsdWRlIDxhc20vbWFwLmg+CiAKLQotI2RlZmluZSBUQUJMRV9TSVpFCVBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpCi0KIHN0cnVjdCBtbXVfZ2F0aGVyIG1tdV9nYXRoZXJzW05SX0NQVVNdOwogCiBleHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2MzNmMyZC4uMzkwNjBjYiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE1Myw3ICsxNTMsNiBAQAogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHJldDsKIAogCXByX2RlYnVnKCJhcmNoX3B0cmFjZSglbGQsICVkLCAlI2x4LCAlI2x4KVxuIiwKQEAgLTE2NiwxMSArMTY1LDcgQEAKIAkvKiBSZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIGNoaWxkIHByb2Nlc3MgKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoKIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKHJldCA9PSBzaXplb2YodG1wKSkKLQkJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgpAQCAtMTgxLDExICsxNzYsNyBAQAogCS8qIFdyaXRlIHRoZSB3b3JkIGluIGRhdGEgYXQgbG9jYXRpb24gYWRkciAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKGRhdGEpKQotCQkJcmV0ID0gMDsKLQkJZWxzZQotCQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYwppbmRleCA4NmQxMDc1Li45YTczY2U3IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAlzaG93X3JlZ3NfbG9nX2x2bChyZWdzLCBLRVJOX0VNRVJHKTsKIAlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncy0+c3AsIHJlZ3MsIEtFUk5fRU1FUkcpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGluX2ludGVycnVwdCgpKQpAQCAtMTg0LDcgKzE4NSw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykgJiYgKGVjciA9PSBFQ1JfSUxMRUdBTF9PUENPREUpKSB7CiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0eXBlOwogCi0JCXR5cGUgPSByZXBvcnRfYnVnKHJlZ3MtPnBjKTsKKwkJdHlwZSA9IHJlcG9ydF9idWcocmVncy0+cGMsIHJlZ3MpOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBCVUdfVFJBUF9UWVBFX05PTkU6CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kZWZjb25maWcgYi9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCmluZGV4IDJhMzQxMWVhLi43MTBjMjBiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZGVmY29uZmlnCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kZWZjb25maWcKQEAgLTQyOSw3ICs0MjksNiBAQAogIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTVNET1NfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBmZDIxMjlhLi5mNGY5ZGI2OSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jCkBAIC04MywxOSArODMsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiBSZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcy4gKi8gCiAJCWNhc2UgUFRSQUNFX1BFRUtURVhUOgotCQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCQlpbnQgY29waWVkOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCQotCQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCQlicmVhazsKLQkJCQotCQkJcmV0ID0gcHV0X3VzZXIodG1wLGRhdGFwKTsKKwkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKLQkJfQogCiAJCS8qIFJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCQljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMTMsMTIgKzEwMyw3IEBACiAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOgogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQkKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJCi0JCQlyZXQgPSAtRUlPOworCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAgCiAgCQkvKiBXcml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyZXNzIGluIHRoZSBVU0VSIGFyZWEuICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9jcnlwdG9jb3AuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCmluZGV4IDFhMDcxZjEuLmU4OTE0ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jCkBAIC0yNjcsMTAgKzI2NywxMCBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3J5cHRvY29wX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCW9wZW46IGNyeXB0b2NvcF9vcGVuLAotCXJlbGVhc2U6IGNyeXB0b2NvcF9yZWxlYXNlLAotCWlvY3RsOiBjcnlwdG9jb3BfaW9jdGwKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkub3BlbiA9CQljcnlwdG9jb3Bfb3BlbiwKKwkucmVsZWFzZSA9CWNyeXB0b2NvcF9yZWxlYXNlLAorCS5pb2N0bCA9CWNyeXB0b2NvcF9pb2N0bAogfTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCmluZGV4IDVkNmM1MjcuLmUxMmY2Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jCkBAIC01NzQsMTAgKzU3NCwxMCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMmNfZm9wcyA9IHsKLQlvd25lcjogICAgVEhJU19NT0RVTEUsCi0JaW9jdGw6ICAgIGkyY19pb2N0bCwKLQlvcGVuOiAgICAgaTJjX29wZW4sCi0JcmVsZWFzZTogIGkyY19yZWxlYXNlLAorCS5vd25lciA9ICAgIFRISVNfTU9EVUxFLAorCS5pb2N0bCA9ICAgIGkyY19pb2N0bCwKKwkub3BlbiA9ICAgICBpMmNfb3BlbiwKKwkucmVsZWFzZSA9ICBpMmNfcmVsZWFzZSwKIH07CiAKIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYwppbmRleCAyNGI5MTliLi5mYThkNTAwIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNmODU2My5jCkBAIC01MSwxMCArNTEsMTAgQEAKIGludCBwY2Y4NTYzX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwY2Y4NTYzX2ZvcHMgPSB7Ci0Jb3duZXI6IFRISVNfTU9EVUxFLAotCWlvY3RsOiBwY2Y4NTYzX2lvY3RsLAotCW9wZW46IHBjZjg1NjNfb3BlbiwKLQlyZWxlYXNlOiBwY2Y4NTYzX3JlbGVhc2UsCisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLmlvY3RsID0JcGNmODU2M19pb2N0bCwKKwkub3BlbiA9CQlwY2Y4NTYzX29wZW4sCisJLnJlbGVhc2UgPQlwY2Y4NTYzX3JlbGVhc2UsCiB9OwogCiB1bnNpZ25lZCBjaGFyCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYwppbmRleCBkNGQ1N2I3Li4zOGVjZTBjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE0NiwxMiArMTQ2LDcgQEAKIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcy4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6CiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQotCQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQkJYnJlYWs7Ci0KLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogIAkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwppbmRleCA0M2RjMDhlLi4yNzU2NzNjIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwpAQCAtMTQ5Miw2ICsxNDkyLDEwIEBACiAJLmxvbmcgc3lzX21vdmVfcGFnZXMKIAkubG9uZyBzeXNfZ2V0Y3B1CiAJLmxvbmcgc3lzX2Vwb2xsX3B3YWl0CisJLmxvbmcgc3lzX3V0aW1lbnNhdAkJLyogMzIwICovCisJLmxvbmcgc3lzX3NpZ25hbGZkCisJLmxvbmcgc3lzX3RpbWVyZmQKKwkubG9uZyBzeXNfZXZlbnRmZAogCiAKIHN5c2NhbGxfdGFibGVfc2l6ZSA9ICguIC0gc3lzX2NhbGxfdGFibGUpCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvZ2RiLXN0dWIuYyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCmluZGV4IDFlN2ExMDEuLmU4OWNhZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jCkBAIC02NDcsMTcgKzY0NywxMSBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfR0RCU1RVQl9DT05TT0xFCi0KLXN0YXRpYyBrZGV2X3QgZ2Ric3R1Yl9jb25zb2xlX2RldihzdHJ1Y3QgY29uc29sZSAqY29uKQotewotCXJldHVybiBNS0RFVigxLDMpOyAvKiAvZGV2L251bGwgKi8KLX0KKyNpZmRlZiBDT05GSUdfR0RCX0NPTlNPTEUKIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIGdkYnN0dWJfY29uc29sZSA9IHsKIAkubmFtZQk9ICJnZGIiLAogCS53cml0ZQk9IGdkYnN0dWJfY29uc29sZV93cml0ZSwJLyogaW4gYnJlYWsuUyAqLwotCS5kZXZpY2UJPSBnZGJzdHViX2NvbnNvbGVfZGV2LAogCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKIAkuaW5kZXgJPSAtMSwKIH07CkBAIC0yMDIxLDcgKzIwMTUsNyBAQAogCXB0ciA9IG1lbTJoZXgoZ2Ric3R1Yl9iYW5uZXIsIHB0ciwgc2l6ZW9mKGdkYnN0dWJfYmFubmVyKSAtIDEsIDApOwogCWdkYnN0dWJfc2VuZF9wYWNrZXQob3V0cHV0X2J1ZmZlcik7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX0dEQlNUVUJfSU1NRURJQVRFKQorI2lmIGRlZmluZWQoQ09ORklHX0dEQl9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKIAlyZWdpc3Rlcl9jb25zb2xlKCZnZGJzdHViX2NvbnNvbGUpOwogI2VuZGlmCiAKQEAgLTIwMzEsNyArMjAyNSw3IEBACiAvKgogICogcmVnaXN0ZXIgdGhlIGNvbnNvbGUgYXQgYSBtb3JlIGFwcHJvcHJpYXRlIHRpbWUKICAqLwotI2lmIGRlZmluZWQgKENPTkZJR19HREJTVFVCX0NPTlNPTEUpICYmICFkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKKyNpZiBkZWZpbmVkIChDT05GSUdfR0RCX0NPTlNPTEUpICYmICFkZWZpbmVkKENPTkZJR19HREJTVFVCX0lNTUVESUFURSkKIHN0YXRpYyBpbnQgX19pbml0IGdkYnN0dWJfcG9zdGluaXQodm9pZCkKIHsKIAlwcmludGsoInJlZ2lzdGVyaW5nIGNvbnNvbGVcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCmluZGV4IGNlODhmYjkuLjcwOWU5YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKQEAgLTExMiwyMCArMTEyLDEyIEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJaW50IGNvcGllZDsKLQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgogCQlyZXQgPSAtRUlPOwogCQlpZiAoaXNfdXNlcl9hZGRyX3ZhbGlkKGNoaWxkLCBhZGRyLCBzaXplb2YodG1wKSkgPCAwKQogCQkJYnJlYWs7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMTc2LDkgKzE2OCw3IEBACiAJCXJldCA9IC1FSU87CiAJCWlmIChpc191c2VyX2FkZHJfdmFsaWQoY2hpbGQsIGFkZHIsIHNpemVvZih0bXApKSA8IDApCiAJCQlicmVhazsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gMDsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwppbmRleCBhYTNjNzk1Li5jMWMzMmU0IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwpAQCAtNjAsMTAgKzYwLDYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF91Y2xpbnV4X21lbW9yeSh2b2lkKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0NPTlNPTEUKLWV4dGVybiBzdHJ1Y3QgY29uc3cgKmNvbnN3aXRjaHA7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19NQjkzMDkwX01CMDAKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbWI5MzA5MF9iYW5uZXJbXSA9ICJGSi9SSCBGUi1WIExpbnV4IjsKIHN0YXRpYyBjaGFyIF9faW5pdGRhdGEgbWI5MzA5MF92ZXJzaW9uW10gPSBVVFNfUkVMRUFTRTsKQEAgLTc5NSwxMyArNzkxLDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DSFJfREVWX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZMQVNIKQotCS8qIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRmxhc2hyb20gZGV2aWNlIGhlcmUgc2luY2Ugd2UgbWlnaHQKLQkgKiBkbyB0aGluZ3Mgd2l0aCBmbGFzaCBlYXJseSBvbiBpbiB0aGUgYm9vdAotCSAqLwotCWZsYXNoX3Byb2JlKCk7Ci0jZW5kaWYKLQogCS8qIGRlYWwgd2l0aCB0aGUgY29tbWFuZCBsaW5lIC0gUmVkQm9vdCBtYXkgaGF2ZSBwYXNzZWQgb25lIHRvIHRoZSBrZXJuZWwgKi8KIAltZW1jcHkoY29tbWFuZF9saW5lLCBib290X2NvbW1hbmRfbGluZSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwogCSpjbWRsaW5lX3AgPSAmY29tbWFuZF9saW5lWzBdOwpAQCAtODM3LDExICs4MjYsNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0JMS01FTQotCVJPT1RfREVWID0gTUtERVYoQkxLTUVNX01BSk9SLDApOwotI2VuZGlmCi0JLypyb21fbGVuZ3RoID0gKHVuc2lnbmVkIGxvbmcpJl9mbGFzaGVuZCAtICh1bnNpZ25lZCBsb25nKSZfcm9tdmVjOyovCi0KICNpZmRlZiBDT05GSUdfTU1VCiAJc2V0dXBfbGludXhfbWVtb3J5KCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9LY29uZmlnIGIvYXJjaC9oODMwMC9LY29uZmlnCmluZGV4IDYxOGRiYWQuLmUzNWY3NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvS2NvbmZpZworKysgYi9hcmNoL2g4MzAwL0tjb25maWcKQEAgLTY4LDYgKzY4LDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBJU0EKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL01ha2VmaWxlIGIvYXJjaC9oODMwMC9NYWtlZmlsZQppbmRleCBiMmQ4OTZhLi41M2I1YzFlIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvTWFrZWZpbGUKQEAgLTYxLDEwICs2MSwxMSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotdm1saW51eC5zcmVjIHZtbGludXguYmluOiB2bWxpbnV4Cit2bWxpbnV4LnNyZWMgdm1saW51eC5iaW4gekltYWdlOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACiAKIGRlZmluZSBhcmNoaGVscAotICBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCi0gIGVjaG8gICd2bWxpbnV4LnNyZWMgLSBDcmVhdGUgc3JlYyBiaW5hcnknCisgIEBlY2hvICAndm1saW51eC5iaW4gIC0gQ3JlYXRlIHJhdyBiaW5hcnknCisgIEBlY2hvICAndm1saW51eC5zcmVjIC0gQ3JlYXRlIHNyZWMgYmluYXJ5JworICBAZWNobyAgJ3pJbWFnZSAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNzFhYWM4Mi4uZDYxODllMCAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTE1LDEwICsxNSwxMCBAQAogIyBpbiBvcmRlciB0byBzdXBwcmVzcyBlcnJvciBtZXNzYWdlLgogIwogQ09ORklHX01FTU9SWV9TVEFSVCAgICAgPz0gMHgwMDQwMDAwMAotQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDQwMDAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDE0MDAwMAogSU1BR0VfT0ZGU0VUIDo9ICQoc2hlbGwgcHJpbnRmICIweCUwOHgiICQkWyQoQ09ORklHX01FTU9SWV9TVEFSVCkrJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldKQogCi1MREZMQUdTX3ZtbGludXggOj0gLVQgJChvYmopL3ZtbGludXgubGRzCitMREZMQUdTX3ZtbGludXggOj0gLVR0ZXh0ICQoSU1BR0VfT0ZGU0VUKSAtZXN0YXJ0dXAgJChvYmopL3ZtbGludXgubGRzCiAKICQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggYjhlOTBkMS4uOTg1YTgxYSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDYgWW9zaGlub3JpIFNhdG8KICAqLwogCi0uaDgzMDBoCisJLmg4MzAwaAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2RlZmluZSBTUkFNX1NUQVJUIDB4ZmY0MDAwCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcyBiL2FyY2gvaDgzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcwpAQCAtMCwwICsxLDMyIEBACitTRUNUSU9OUworeworICAgICAgICAudGV4dCA6CisgICAgICAgIHsKKyAgICAgICAgX19zdGV4dCA9IC4gOworCV9fdGV4dCA9IC47CisJICAgICAgICooLnRleHQuc3RhcnR1cCkKKwkgICAgICAgKigudGV4dCkKKyAgICAgICAgX19ldGV4dCA9IC4gOworICAgICAgICB9CisKKwkucm9kYXRhIDoKKwl7CisJCSooLnJvZGF0YSkKKwl9CisgICAgICAgIC5kYXRhIDoKKworICAgICAgICB7CisgICAgICAgIF9fc2RhdGEgPSAuIDsKKyAgICAgICAgX19fZGF0YV9zdGFydCA9IC4gOworICAgICAgICAgICAgICAgICooLmRhdGEuKikKKwl9CisgICAgICAgIC5ic3MgOgorICAgICAgICB7CisgICAgICAgIC4gPSBBTElHTigweDQpIDsKKyAgICAgICAgX19zYnNzID0gLiA7CisgICAgICAgICAgICAgICAgKiguYnNzKikKKyAgICAgICAgLiA9IEFMSUdOKDB4NCkgOworICAgICAgICBfX2Vic3MgPSAuIDsKKyAgICAgICAgX19lbmQgPSAuIDsKKyAgICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IgYi9hcmNoL2g4MzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LnNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGY2OTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9oODMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKQEAgLTAsMCArMSw5IEBACitTRUNUSU9OUworeworICAuZGF0YSA6IHsKKwlfaW5wdXRfbGVuID0gLjsKKwlMT05HKF9pbnB1dF9kYXRhX2VuZCAtIF9pbnB1dF9kYXRhKSBfaW5wdXRfZGF0YSA9IC47CisJKiguZGF0YSkKKwlfaW5wdXRfZGF0YV9lbmQgPSAuOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2NjMWE3Zi4uODc0ZjZhZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvTWFrZWZpbGUKQEAgLTYsNiArNiw3IEBACiAKIG9iai15IDo9IHByb2Nlc3MubyB0cmFwcy5vIHB0cmFjZS5vIGlycS5vIFwKIAkgc3lzX2g4MzAwLm8gdGltZS5vIHNlbWFwaG9yZS5vIHNpZ25hbC5vIFwKLSAgICAgICAgIHNldHVwLm8gZ3Bpby5vIGluaXRfdGFzay5vIHN5c2NhbGxzLm8KKyAgICAgICAgIHNldHVwLm8gZ3Bpby5vIGluaXRfdGFzay5vIHN5c2NhbGxzLm8gXAorCSBlbnRyeS5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubyBoODMwMF9rc3ltcy5vIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUyBiL2FyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gYXJjaC9oODMwMC9wbGF0Zm9ybS9oOHMvZW50cnkuUwpyZW5hbWUgdG8gYXJjaC9oODMwMC9rZXJuZWwvZW50cnkuUwppbmRleCBmM2Q2YjhlLi5jYTc0MzE2IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9lbnRyeS5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL2VudHJ5LlMKQEAgLTEsMTEgKzEsMTAgQEAKIC8qIC0qLSBtb2RlOiBhc20gLSotCiAgKgotICogIGxpbnV4L2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL2VudHJ5LlMKKyAqICBsaW51eC9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCiAgKgogICogIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyAqICBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgogICoKLSAqCWZhaXJseSBoZWF2eSBjaGFuZ2VzIHRvIGZpeCBzeXNjYWxsIGFyZ3MgYW5kIHNpZ25hbCBwcm9jZXNzaW5nCi0gKglieSBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgogICovCiAKIC8qCkBAIC0yMywxMyArMjIsNjYgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9IODMwMEgpCisjZGVmaW5lIFVTRVJSRVQgOAorSU5URVJSVVBUUyA9IDY0CisJLmg4MzAwaAorCS5tYWNybwlTSExMMiByZWcKKwlzaGxsLmwJXHJlZworCXNobGwubAlccmVnCisJLmVuZG0KKwkubWFjcm8JU0hMUjIgcmVnCisJc2hsci5sCVxyZWcKKwlzaGxyLmwJXHJlZworCS5lbmRtCisJLm1hY3JvCVNBVkVSRUdTCisJbW92LmwJZXIwLEAtc3AKKwltb3YubAllcjEsQC1zcAorCW1vdi5sCWVyMixALXNwCisJbW92LmwJZXIzLEAtc3AKKwkuZW5kbQorCS5tYWNybwlSRVNUT1JFUkVHUworCW1vdi5sCUBzcCssZXIzCisJbW92LmwJQHNwKyxlcjIKKwkuZW5kbQorCS5tYWNybwlTQVZFRVhSCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRUVYUgorCS5lbmRtCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDhTKQorI2RlZmluZSBVU0VSUkVUIDEwCisjZGVmaW5lIFVTRVJFWFIgOAorSU5URVJSVVBUUyA9IDEyOAogCS5oODMwMHMKKwkubWFjcm8JU0hMTDIgcmVnCisJc2hsbC5sCSMyLFxyZWcKKwkuZW5kbQorCS5tYWNybwlTSExSMiByZWcKKwlzaGxyLmwJIzIsXHJlZworCS5lbmRtCisJLm1hY3JvCVNBVkVSRUdTCisJc3RtLmwJZXIwLWVyMyxALXNwCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRVJFR1MKKwlsZG0ubAlAc3ArLGVyMi1lcjMKKwkuZW5kbQorCS5tYWNybwlTQVZFRVhSCisJbW92LncJQChVU0VSRVhSOjE2LGVyMCkscjEKKwltb3YudwlyMSxAKExFWFItTEVSMzoxNixzcCkJCS8qIGNvcHkgRVhSICovCisJLmVuZG0KKwkubWFjcm8JUkVTVE9SRUVYUgorCW1vdi53CUAoTEVYUi1MRVIxOjE2LHNwKSxyMQkJLyogcmVzdG9yZSBFWFIgKi8KKwltb3YuYglyMWwscjFoCisJbW92LncJcjEsQChVU0VSRVhSOjE2LGVyMCkKKwkuZW5kbQorI2VuZGlmCisKIAogLyogQ1BVIGNvbnRleHQgc2F2ZS9yZXN0b3JlIG1hY3Jvcy4gKi8KLQkKKwogCS5tYWNybwlTQVZFX0FMTAogCW1vdi5sCWVyMCxALXNwCi0KIAlzdGMJY2NyLHIwbAkJCQkvKiBjaGVjayBrZXJuZWwgbW9kZSAqLwogCWJ0c3QJIzQscjBsCiAJYm5lCTVmCkBAIC0zOSw0MiArOTEsMzggQEAKIAltb3YubAlAc3AsZXIwCQkJCS8qIHJlc3RvcmUgc2F2ZWQgZXIwICovCiAJb3JjCSMweDEwLGNjcgkJCS8qIHN3aXRjaCBrZXJuZWwgc3RhY2sgKi8KIAltb3YubAlAU1lNQk9MX05BTUUoc3dfa3NwKSxzcAotCXN1Yi5sCSMoTFJFVC1MT1JJRyksc3AJCS8qIGFsbG9jYXRlIExPUklHIC0gTFJFVCAqLyAKLQlzdG0ubAllcjAtZXIzLEAtc3AKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKDEwOjE2LGVyMCksZXIxCQkvKiBjb3B5IHRoZSBSRVQgYWRkciAqLwotCW1vdi5sCWVyMSxAKExSRVQtTEVSMzoxNixzcCkKLQltb3YudwlAKDg6MTYsZXIwKSxyMQotCW1vdi53CXIxLEAoTEVYUi1MRVIzOjE2LHNwKQkJLyogY29weSBFWFIgKi8KKwlzdWIubAkjKExSRVQtTE9SSUcpLHNwCQkvKiBhbGxvY2F0ZSBMT1JJRyAtIExSRVQgKi8KKwlTQVZFUkVHUworCW1vdi5sICAgQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCisJbW92LmwgICBAKFVTRVJSRVQ6MTYsZXIwKSxlcjEgICAgICAgICAgIC8qIGNvcHkgdGhlIFJFVCBhZGRyICovCisJbW92LmwgICBlcjEsQChMUkVULUxFUjM6MTYsc3ApCisJU0FWRUVYUgogCi0JbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KLQlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCi0Jc3ViLncJcjAscjAKLQltb3YuYglyMWgscjBsCi0JbW92LncJcjAsQChMQ0NSLUxFUjM6MTYsc3ApCQkvKiBjb3B5IGNjciAqLwogCW1vdi5sCUAoTE9SSUctTEVSMzoxNixzcCksZXIwCiAJbW92LmwJZXIwLEAoTEVSMC1MRVIzOjE2LHNwKQkJLyogY29weSBFUjAgKi8KKwltb3YudwllMSxyMQkJCQkvKiBlMSBoaWdoYnl0ZSA9IGNjciAqLworCWFuZAkjMHhlZixyMWgJCQkvKiBtYXNrIG1vZGU/IGZsYWcgKi8KIAlicmEJNmYKIDU6CiAJLyoga2VybmVsIG1vZGUgKi8KIAltb3YubAlAc3AsZXIwCQkJCS8qIHJlc3RvcmUgc2F2ZWQgZXIwICovCiAJc3VicwkjMixzcAkJCQkvKiBzZXQgZHVtbXkgY2NyICovCi0Jc3RtLmwJZXIwLWVyMyxALXNwCisJU0FWRVJFR1MKIAltb3YudwlAKExSRVQtTEVSMzoxNixzcCkscjEJCS8qIGNvcHkgb2xkIGNjciAqLworNjoKIAltb3YuYglyMWgscjFsCiAJbW92LmIJIzAscjFoCi0JbW92LncJcjEsQChMQ0NSLUxFUjM6MTYsc3ApCi02OgkKKwltb3YudwlyMSxAKExDQ1ItTEVSMzoxNixzcCkJCS8qIHNldCBjY3IgKi8KIAltb3YubAllcjYsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM2ICovCiAJbW92LmwJZXI1LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNSAqLwogCW1vdi5sCWVyNCxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzQgKi8KLQkuZW5kbQorCS5lbmRtCQkJCQkvKiByMSA9IGNjciAqLwogCiAJLm1hY3JvCVJFU1RPUkVfQUxMCiAJbW92LmwJQHNwKyxlcjQKIAltb3YubAlAc3ArLGVyNQogCW1vdi5sCUBzcCssZXI2Ci0JbGRtLmwJQHNwKyxlcjItZXIzCisJUkVTVE9SRVJFR1MKIAltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjAJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCiAJYnRzdAkjNCxyMGwKIAlibmUJN2YKQEAgLTgzLDE4ICsxMzEsMTYgQEAKIAltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKIAltb3YubAlAKExFUjAtTEVSMToxNixzcCksZXIxCQkvKiByZXN0b3JlIEVSMCAqLwogCW1vdi5sCWVyMSxAZXIwCi0JbW92LncJQChMRVhSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIEVYUiAqLwotCW1vdi5iCXIxbCxyMWgKLQltb3YudwlyMSxAKDg6MTYsZXIwKQorCVJFU1RPUkVFWFIKIAltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjEJCS8qIHJlc3RvcmUgdGhlIFJFVCBhZGRyICovCiAJbW92LmIJcjFsLHIxaAogCW1vdi5iCUAoTFJFVCsxLUxFUjE6MTYsc3ApLHIxbAogCW1vdi53CXIxLGUxCiAJbW92LncJQChMUkVUKzItTEVSMToxNixzcCkscjEKLQltb3YubAllcjEsQCgxMDoxNixlcjApCisJbW92LmwJZXIxLEAoVVNFUlJFVDoxNixlcjApCiAKIAltb3YubAlAc3ArLGVyMQotCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8gCisJYWRkLmwJIyhMUkVULUxFUjEpLHNwCQkJLyogcmVtb3ZlIExPUklHIC0gTFJFVCAqLwogCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd19rc3ApCiAJYW5kYwkjMHhlZixjY3IJCQkvKiBzd2l0Y2ggdG8gdXNlciBtb2RlICovCiAJbW92LmwJZXIwLHNwCkBAIC0xMDgsNyArMTU0LDcgQEAKIAlhZGRzCSM0LHNwCQkJCS8qIHJlbW92ZSB0aGUgc3cgY3JlYXRlZCBMVkVDICovCiAJcnRlCiAJLmVuZG0KLQkKKwogLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQogLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKIC5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9mb3JrKQpAQCAtMTE2LDE2ICsxNjIsMjUgQEAKIC5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCiAuZ2xvYmwgU1lNQk9MX05BTUUoc3dfa3NwKSxTWU1CT0xfTkFNRShzd191c3ApCiAuZ2xvYmwgU1lNQk9MX05BTUUocmVzdW1lKQotLmdsb2JsIFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQogLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkKLQkJCi1JTlRFUlJVUFRTID0gMTI4CisuZ2xvYmwgU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCisKICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJLnNlY3Rpb24gLmludF9yZWRpcmVjdCwiYXgiCiBTWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0g4MzAwSCkKIAkucmVwdAk3CiAJLmxvbmcJMAogCS5lbmRyCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfSDhTKQorCS5yZXB0CTUKKwkubG9uZwkwCisJLmVuZHIKKwlqbXAJQFNZTUJPTF9OQU1FKHRyYWNlX2JyZWFrKQorCS5sb25nCTAKKyNlbmRpZgorCiAJanNyCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCS8qIE5NSSAqLwogCWptcAlAU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCS8qIFRSQVBBICMwIChTeXN0ZW0gY2FsbCkgKi8KIAkubG9uZwkwCkBAIC0xNDEsMjAgKzE5NiwyMCBAQAogU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQogCS5zcGFjZQk0CiAjZW5kaWYKLQkKKwogCS5zZWN0aW9uIC50ZXh0CiAJLmFsaWduCTIKIFNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9lbnRyeSkKIAlTQVZFX0FMTAotCW1vdi53CUAoTENDUixzcCkscjAKLQlidHN0CSM0LHIwbAorCW1vdi5sCXNwLGVyMAorCWFkZC5sCSNMVkVDLGVyMAorCWJ0c3QJIzQscjFsCiAJYm5lCTFmCisJLyogdXNlciBMVkVDICovCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQCg0OjE2LGVyMCksZXIwCi0JYnJhCTJmCisJYWRkcwkjNCxlcjAKIDE6Ci0JbW92LmwJQChMVkVDOjE2LHNwKSxlcjAKLTI6CisJbW92LmwJQGVyMCxlcjAJCQkvKiBMVkVDIGFkZHJlc3MgKi8KICNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCiAJc3ViLmwJI1NZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSksZXIwCiAjZW5kaWYKQEAgLTE2Miw2OSArMjE3LDYyIEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSksZXIxCiAJc3ViLmwJZXIxLGVyMAogI2VuZGlmCi0Jc2hsci5sCSMyLGVyMAorCVNITFIyCWVyMAogCWRlYy5sCSMxLGVyMAogCW1vdi5sCXNwLGVyMQogCXN1YnMJIzQsZXIxCQkJCS8qIGFkanVzdCByZXRfcGMgKi8KLQlqc3IJQFNZTUJPTF9OQU1FKHByb2Nlc3NfaW50KQotCW1vdi5sCUBTWU1CT0xfTkFNRShpcnFfc3RhdCkrQ1BVU1RBVF9TT0ZUSVJRX1BFTkRJTkcsZXIwCi0JYmVxCTFmCi0JanNyCUBTWU1CT0xfTkFNRShkb19zb2Z0aXJxKQotMToKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX0lSUSkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKIAogU1lNQk9MX05BTUVfTEFCRUwoc3lzdGVtX2NhbGwpCiAJc3VicwkjNCxzcAkJCQkvKiBkdW1teSBMVkVDICovCiAJU0FWRV9BTEwKKwlhbmRjCSMweDdmLGNjcgogCW1vdi5sCWVyMCxlcjQKLQltb3YubAkjLUVOT1NZUyxlcjAKLQltb3YubAllcjAsQChMRVIwOjE2LHNwKQogCiAJLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KIAltb3YubAlzcCxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWNtcC5sCSNOUl9zeXNjYWxscyxlcjQKLQliY2MJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgotCXNobGwubAkjMixlcjQKLQltb3YubAkjU1lNQk9MX05BTUUoc3lzX2NhbGxfdGFibGUpLGVyMAotCWFkZC5sCWVyNCxlcjAKLQltb3YubAlAZXIwLGVyMAotCW1vdi5sCWVyMCxlcjQKLQliZXEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgkKIAltb3YubAlzcCxlcjIKIAlhbmQudwkjMHhlMDAwLHIyCi0JbW92LmIJQCgoVEFTS19GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKKwltb3YuYglAKChUSV9GTEFHUyszLShUSUZfU1lTQ0FMTF9UUkFDRSA+PiAzKSk6MTYsZXIyKSxyMmwKIAlidHN0CSMoVElGX1NZU0NBTExfVFJBQ0UgJiA3KSxyMmwKLQltb3YubAlAKExFUjE6MTYsc3ApLGVyMAotCW1vdi5sCUAoTEVSMjoxNixzcCksZXIxCi0JbW92LmwJQChMRVIzOjE2LHNwKSxlcjIKLQlhbmRjCSMweDdmLGNjcgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCQkvKiBzYXZlIHRoZSByZXR1cm4gdmFsdWUgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDQUxMX1BSSU5UKQotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF9wcmludCkKLSNlbmRpZgotCWJyYQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjgKKwliZXEJMWYKKwlqc3IJQFNZTUJPTF9OQU1FKGRvX3N5c2NhbGxfdHJhY2UpCiAxOgotCWpzcglTWU1CT0xfTkFNRShzeXNjYWxsX3RyYWNlKQorCWNtcC5sCSNOUl9zeXNjYWxscyxlcjQKKwliY2MJYmFkc3lzCisJU0hMTDIJZXI0CisJbW92LmwJI1NZTUJPTF9OQU1FKHN5c19jYWxsX3RhYmxlKSxlcjAKKwlhZGQubAllcjQsZXIwCisJbW92LmwJQGVyMCxlcjQKKwliZXEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKToxNgogCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCiAJbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKIAltb3YubAlAKExFUjM6MTYsc3ApLGVyMgogCWpzcglAZXI0CiAJbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4CisJbW92LmwJc3AsZXIyCisJYW5kLncJIzB4ZTAwMCxyMgorCW1vdi5iCUAoKFRJX0ZMQUdTKzMtKFRJRl9TWVNDQUxMX1RSQUNFID4+IDMpKToxNixlcjIpLHIybAorCWJ0c3QJIyhUSUZfU1lTQ0FMTF9UUkFDRSAmIDcpLHIybAorCWJlcQkyZgorCWpzcglAU1lNQk9MX05BTUUoZG9fc3lzY2FsbF90cmFjZSkKKzI6CisjaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKKwlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCisjZW5kaWYKKwlvcmMJIzB4ODAsY2NyCisJYnJhCXJlc3VtZV91c2Vyc3BhY2UKIAotU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21fZm9yaykKLQltb3YubAllcjIsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzY2hlZHVsZV90YWlsKQotCWJyYQlTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pOjgKK2JhZHN5czoKKwltb3YubAkjLUVOT1NZUyxlcjAKKwltb3YubAllcjAsQChMRVIwOjE2LHNwKQorCWJyYQlyZXN1bWVfdXNlcnNwYWNlCiAKLVNZTUJPTF9OQU1FX0xBQkVMKHJlc2NoZWR1bGUpCi0JLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCisjaWYgIWRlZmluZWQoQ09ORklHX1BSRUVNUFQpCisjZGVmaW5lIHJlc3VtZV9rZXJuZWwgcmVzdG9yZV9hbGwKKyNlbmRpZgogCiBTWU1CT0xfTkFNRV9MQUJFTChyZXRfZnJvbV9leGNlcHRpb24pCiAjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKQEAgLTIzMiw1OCArMjgwLDY4IEBACiAjZW5kaWYKIFNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ludGVycnVwdCkKIAltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCi0JYnRzdAkjNCxyMGwJCQkvKiBjaGVjayBpZiByZXR1cm5pbmcgdG8ga2VybmVsICovCi0JYm5lCWRvbmU6OAkJCS8qIGlmIHNvLCBza2lwIHJlc2NoZWQsIHNpZ25hbHMgKi8KKwlidHN0CSM0LHIwbAorCWJuZQlyZXN1bWVfa2VybmVsOjgJCS8qIHJldHVybiBmcm9tIGtlcm5lbCAqLworcmVzdW1lX3VzZXJzcGFjZToKIAlhbmRjCSMweDdmLGNjcgogCW1vdi5sCXNwLGVyNAotCWFuZC53CSMweGUwMDAscjQKKwlhbmQudwkjMHhlMDAwLHI0CQkvKiBlcjQgPC0gY3VycmVudCB0aHJlYWQgaW5mbyAqLwogCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKIAlhbmQubAkjX1RJRl9XT1JLX01BU0ssZXIxCi0JYmVxCWRvbmU6OAotMToKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCisJYmVxCXJlc3RvcmVfYWxsOjgKK3dvcmtfcGVuZGluZzoKIAlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIxbAotCWJuZQlTWU1CT0xfTkFNRShyZXNjaGVkdWxlKToxNgorCWJuZQl3b3JrX3Jlc2NoZWQ6OAorCS8qIHdvcmsgbm90aWZ5c2lnICovCiAJbW92LmwJc3AsZXIwCi0Jc3VicwkjNCxlcjAJCQkvKiBhZGp1c3QgcmV0cGMgKi8KLQltb3YubAllcjIsZXIxCi0JanNyCUBTWU1CT0xfTkFNRShkb19zaWduYWwpCi0jaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkKLQlicmEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi0zOgotCWJ0c3QJIzQscjBsCi0JYmVxCWRvbmU6OAkJCS8qIHVzZXJzcGFjZSB0aG9ydSAqLwotNDoKLQltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMQotCWJuZQlkb25lOjgKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQliZXEJZG9uZTo4Ci0JbW92LmIJcjBsLHIwbAotCWJwbAlkb25lOjgJCQkvKiBpbnRlcnJ1cHQgb2ZmIChleGNlcHRpb24gcGF0aD8pICovCi0JbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0JYW5kYwkjMHg3ZixjY3IKKwlzdWJzCSM0LGVyMAkJCS8qIGVyMDogcHRfcmVncyAqLworCWpzcglAU1lNQk9MX05BTUUoZG9fbm90aWZ5X3Jlc3VtZSkKKwlicmEJcmVzdG9yZV9hbGw6OAord29ya19yZXNjaGVkOgorCW1vdi5sCXNwLGVyMAorCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCiAJanNyCUBTWU1CT0xfTkFNRShzY2hlZHVsZSkKLQlzdWIubAllcjEsZXIxCi0JbW92LmwJZXIxLEAoVElfUFJFX0NPVU5UOjE2LGVyNCkKLQlvcmMJIzB4ODAsY2NyCi0JYnJhCTRiOjgKLSNlbmRpZgotZG9uZToKKwlicmEJcmVzdW1lX3VzZXJzcGFjZTo4CityZXN0b3JlX2FsbDoKIAlSRVNUT1JFX0FMTAkJCS8qIERvZXMgUlRFICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorcmVzdW1lX2tlcm5lbDoKKwltb3YubAlAKFRJX1BSRV9DT1VOVDoxNixlcjQpLGVyMAorCWJuZQlyZXN0b3JlX2FsbDo4CituZWVkX3Jlc2NoZWQ6CisJbW92LmwJQChUSV9GTEFHUzoxNixlcjQpLGVyMAorCWJ0c3QJI1RJRl9ORUVEX1JFU0NIRUQscjBsCisJYmVxCXJlc3RvcmVfYWxsOjgKKwltb3YuYglAKExDQ1IrMToxNixzcCkscjBsCS8qIEludGVycnVwdCBFbmFibGVkPyAqLworCWJtaQlyZXN0b3JlX2FsbDo4CisJbW92LmwJI1BSRUVNUFRfQUNUSVZFLGVyMAorCW1vdi5sCWVyMCxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCisJYW5kYwkjMHg3ZixjY3IKKwltb3YubAlzcCxlcjAKKwlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQorCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCisJb3JjCSMweDgwLGNjcgorCWJyYQluZWVkX3Jlc2NoZWQ6OAorI2VuZGlmCisKK1NZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCisJbW92LmwJZXIyLGVyMAorCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKKwlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKKwogU1lNQk9MX05BTUVfTEFCRUwocmVzdW1lKQogCS8qCi0JICoJZXIwID0gcHJldgotCSAqCWVyMSA9IG5leHQKLQkgKglyZXR1cm4gbGFzdCBpbiBlcjIKKwkgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgb2Zmc2V0IG9mIHRzcyBpcyBpbiBkMSwKKwkgKiBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcyBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKQorCSAqIGlzIGluIGExIGFuZCBkMi5iIGlzIG5vbi16ZXJvIGlmIHRoZSBtbSBzdHJ1Y3R1cmUgaXMKKwkgKiBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQorCSAqIHJlZ2lzdGVycyB1bnRpbCB0aGVpciBjb250ZW50cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KIAkgKi8KIAogCS8qIHNhdmUgc3IgKi8KIAlzdWIudwlyMyxyMwogCXN0YwljY3IscjNsCi0Jc3RjCWV4cixyM2gKIAltb3YudwlyMyxAKFRIUkVBRF9DQ1IrMjoxNixlcjApCiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KQEAgLTI5MSw0MSArMzQ5LDQ1IEBACiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIzCiAJbW92LmwJZXIzLEAoVEhSRUFEX1VTUDoxNixlcjApCiAJbW92LmwJc3AsQChUSFJFQURfS1NQOjE2LGVyMCkKLQkKKwogCS8qIFNraXAgYWRkcmVzcyBzcGFjZSBzd2l0Y2hpbmcgaWYgdGhleSBhcmUgdGhlIHNhbWUuICovCiAJLyogRklYTUU6IHdoYXQgZGlkIHdlIGhhY2sgb3V0IG9mIGhlcmUsIHRoaXMgZG9lcyBub3RoaW5nISAqLwogCiAJbW92LmwJQChUSFJFQURfVVNQOjE2LGVyMSksZXIwCiAJbW92LmwJZXIwLEBTWU1CT0xfTkFNRShzd191c3ApCiAJbW92LmwJQChUSFJFQURfS1NQOjE2LGVyMSksc3AKLQkJCQorCiAJLyogcmVzdG9yZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAltb3YudwlAKFRIUkVBRF9DQ1IrMjoxNixlcjEpLHIzCiAKIAlsZGMJcjNsLGNjcgotCWxkYwlyM2gsZXhyCi0KIAlydHMKIAogU1lNQk9MX05BTUVfTEFCRUwodHJhY2VfYnJlYWspCi0Jc3VicwkjNCxzcAkJCS8qIGR1bW15IExWRUMgKi8KKwlzdWJzCSM0LHNwCiAJU0FWRV9BTEwKIAlzdWIubAllcjEsZXIxCiAJZGVjLmwJIzEsZXIxCi0JbW92LmwJZXIxLEAoTE9SSUcsc3ApCQorCW1vdi5sCWVyMSxAKExPUklHLHNwKQogCW1vdi5sCXNwLGVyMAogCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCiAJbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCiAJbW92LmwJQGVyMCxlcjEKKwltb3YudwlAKC0yOjE2LGVyMSkscjIKKwljbXAudwkjMHg1NzMwLHIyCisJYmVxCTFmCiAJc3VicwkjMixlcjEKLQltb3YubAllcjEsQGVyMAkKKwltb3YubAllcjEsQGVyMAorMToKIAlhbmQudwkjMHhmZixlMQogCW1vdi5sCWVyMSxlcjAKIAlqc3IJQFNZTUJPTF9OQU1FKHRyYWNlX3RyYXApCi0Jam1wCUBTWU1CT0xfTkFNRShyZXRfZnJvbV9leGNlcHRpb24pCQorCWptcAlAU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKQogCiAJLnNlY3Rpb24JLmJzcwogU1lNQk9MX05BTUVfTEFCRUwoc3dfa3NwKQotCS5zcGFjZQk0CQorCS5zcGFjZQk0CiBTWU1CT0xfTkFNRV9MQUJFTChzd191c3ApCi0JLnNwYWNlCTQJCisJLnNwYWNlCTQKKworCS5lbmQKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYyBiL2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZjQ3OS4uMDAwMDAwMAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9pbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvaDgzMDAva2VybmVsL2ludHMuYwotICoKLSAqIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KLSAqCi0gKiBCYXNlZCBvbiBsaW51eC9hcmNoLyQoQVJDSCkvcGxhdGZvcm0vJChQTEFURk9STSkvaW50cy5jCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAxOTk2IFJvbWFuIFppcHBlbAotICogQ29weXJpZ2h0IDE5OTkgRC4gSmVmZiBEaW9ubmUgPGplZmZAcnQtY29udHJvbC5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgaGFzIG9ubHkgNCBlbGVtZW50cyBmb3Igc3BlZWQgcmVhc29ucwotICovCi10eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7Ci0JaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JaW50ICAgICAgICAgZmxhZ3M7Ci0JaW50ICAgICAgICAgY291bnQ7Ci0Jdm9pZAkgICAgKmRldl9pZDsKLQljb25zdCBjaGFyICAqZGV2bmFtZTsKLX0gaXJxX2hhbmRsZXJfdDsKLQotc3RhdGljIGlycV9oYW5kbGVyX3QgKmlycV9saXN0W05SX0lSUVNdOwotc3RhdGljIGludCB1c2Vfa21hbGxvYzsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKmludGVycnVwdF9yZWRpcmVjdF90YWJsZTsKLWV4dGVybiBjb25zdCBpbnQgaDgzMDBfc2F2ZWRfdmVjdG9yc1tdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaDgzMDBfdHJhcF90YWJsZVtdOwotaW50IGg4MzAwX2VuYWJsZV9pcnFfcGluKHVuc2lnbmVkIGludCBpcnEpOwotdm9pZCBoODMwMF9kaXNhYmxlX2lycV9waW4odW5zaWduZWQgaW50IGlycSk7Ci0KLSNkZWZpbmUgQ1BVX1ZFQ1RPUiAoKHVuc2lnbmVkIGxvbmcgKikweDAwMDAwMCkKLSNkZWZpbmUgQUREUl9NQVNLICgweGZmZmZmZikKLQotI2lmIGRlZmluZWQoQ09ORklHX1JBTUtFUk5FTCkKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCAqZ2V0X3ZlY3Rvcl9hZGRyZXNzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyAqcm9tX3ZlY3RvciA9IENQVV9WRUNUT1I7Ci0JdW5zaWduZWQgbG9uZyBiYXNlLHRtcDsKLQlpbnQgdmVjX25vOwotCi0JYmFzZSA9IHJvbV92ZWN0b3JbRVhUX0lSUTBdICYgQUREUl9NQVNLOwotCQotCS8qIGNoZWNrIHJvbXZlY3RvciBmb3JtYXQgKi8KLQlmb3IgKHZlY19ubyA9IEVYVF9JUlExOyB2ZWNfbm8gPD0gRVhUX0lSUTArRVhUX0lSUVM7IHZlY19ubysrKSB7Ci0JCWlmICgoYmFzZSsodmVjX25vIC0gRVhUX0lSUTApKjQpICE9IChyb21fdmVjdG9yW3ZlY19ub10gJiBBRERSX01BU0spKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogcmFtdmVjdG9yIGJhc2UgYWRkcmVzcyAqLwotCWJhc2UgLT0gRVhUX0lSUTAqNDsKLQotCS8qIHdyaXRlcmJsZSBjaGVjayAqLwotCXRtcCA9IH4oKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYmFzZSk7Ci0JKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKWJhc2UpID0gdG1wOwotCWlmICgoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYmFzZSkgIT0gdG1wKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKiliYXNlOwotfQotI2VuZGlmCi0KLXZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgKnJhbXZlYywqcmFtdmVjX3A7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqdHJhcF9lbnRyeTsKLQljb25zdCBpbnQgKnNhdmVkX3ZlY3RvcjsKLQotCXJhbXZlYyA9IGdldF92ZWN0b3JfYWRkcmVzcygpOwotCWlmIChyYW12ZWMgPT0gTlVMTCkKLQkJcGFuaWMoImludGVycnVwdCB2ZWN0b3Igc2VydXAgZmFpbGVkLiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAidmlydHVhbCB2ZWN0b3IgYXQgMHglMDhseFxuIiwodW5zaWduZWQgbG9uZylyYW12ZWMpOwotCi0JLyogY3JlYXRlIHJlZGlyZWN0IHRhYmxlICovCi0JcmFtdmVjX3AgPSByYW12ZWM7Ci0JdHJhcF9lbnRyeSA9IGg4MzAwX3RyYXBfdGFibGU7Ci0Jc2F2ZWRfdmVjdG9yID0gaDgzMDBfc2F2ZWRfdmVjdG9yczsKLQlmb3IgKCBpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpZiAoaSA9PSAqc2F2ZWRfdmVjdG9yKSB7Ci0JCQlyYW12ZWNfcCsrOwotCQkJc2F2ZWRfdmVjdG9yKys7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIGkgPCBOUl9UUkFQUyApIHsKLQkJCQlpZiAoKnRyYXBfZW50cnkpCi0JCQkJCSpyYW12ZWNfcCA9IFZFQ1RPUigqdHJhcF9lbnRyeSk7Ci0JCQkJcmFtdmVjX3ArKzsKLQkJCQl0cmFwX2VudHJ5Kys7Ci0JCQl9IGVsc2UKLQkJCQkqcmFtdmVjX3ArKyA9IFJFRElSRUNUKGludGVycnVwdF9lbnRyeSk7Ci0JCX0KLQl9Ci0JaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlID0gcmFtdmVjOwotI2lmZGVmIERVTVBfVkVDVE9SCi0JcmFtdmVjX3AgPSByYW12ZWM7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewotCQlpZiAoKGkgJSA4KSA9PSAwKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuJXA6ICIscmFtdmVjX3ApOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXAgIiwqcmFtdmVjX3ApOwotCQlyYW12ZWNfcCsrOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KLWludCByZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCAKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlycV9oYW5kbGVyX3QgKmlycV9oYW5kbGU7Ci0JaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJJbmNvcnJlY3QgSVJRICVkIGZyb20gJXNcbiIsIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChpcnFfbGlzdFtpcnFdIHx8IChoODMwMF9lbmFibGVfaXJxX3BpbihpcnEpID09IC1FQlVTWSkpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAodXNlX2ttYWxsb2MpCi0JCWlycV9oYW5kbGUgPSBrbWFsbG9jKHNpemVvZihpcnFfaGFuZGxlcl90KSwgR0ZQX0FUT01JQyk7Ci0JZWxzZSB7Ci0JCS8qIHVzZSBib290bWVtIGFsbG9jYXRlciAqLwotCQlpcnFfaGFuZGxlID0gKGlycV9oYW5kbGVyX3QgKilhbGxvY19ib290bWVtKHNpemVvZihpcnFfaGFuZGxlcl90KSk7Ci0JCWlycV9oYW5kbGUgPSAoaXJxX2hhbmRsZXJfdCAqKSgodW5zaWduZWQgbG9uZylpcnFfaGFuZGxlIHwgMHg4MDAwMDAwMCk7Ci0JfQotCi0JaWYgKGlycV9oYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpcnFfaGFuZGxlLT5oYW5kbGVyID0gaGFuZGxlcjsKLQlpcnFfaGFuZGxlLT5mbGFncyAgID0gZmxhZ3M7Ci0JaXJxX2hhbmRsZS0+Y291bnQgICA9IDA7Ci0JaXJxX2hhbmRsZS0+ZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfaGFuZGxlLT5kZXZuYW1lID0gZGV2bmFtZTsKLQlpcnFfbGlzdFtpcnFdID0gaXJxX2hhbmRsZTsKLQotCWlmIChpcnFfaGFuZGxlLT5mbGFncyAmIElSUUZfU0FNUExFX1JBTkRPTSkKLQkJcmFuZF9pbml0aWFsaXplX2lycShpcnEpOwotCi0JZW5hYmxlX2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHJlcXVlc3RfaXJxKTsKLQotdm9pZCBmcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+PSBOUl9JUlFTKQotCQlyZXR1cm47Ci0KLQlpZiAoIWlycV9saXN0W2lycV0gfHwgaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICE9IGRldl9pZCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICBpcnEsIGlycV9saXN0W2lycV0tPmRldm5hbWUpOwotCWRpc2FibGVfaXJxKGlycSk7Ci0JaDgzMDBfZGlzYWJsZV9pcnFfcGluKGlycSk7Ci0JaWYgKCgodW5zaWduZWQgbG9uZylpcnFfbGlzdFtpcnFdICYgMHg4MDAwMDAwMCkgPT0gMCkgewotCQlrZnJlZShpcnFfbGlzdFtpcnFdKTsKLQkJaXJxX2xpc3RbaXJxXSA9IE5VTEw7Ci0JfQotfQotCi1FWFBPUlRfU1lNQk9MKGZyZWVfaXJxKTsKLQotLyoKLSAqIERvIHdlIG5lZWQgdGhlc2UgcHJvYmUgZnVuY3Rpb25zIG9uIHRoZSBtNjhrPwotICovCi11bnNpZ25lZCBsb25nIHByb2JlX2lycV9vbiAodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChwcm9iZV9pcnFfb24pOwotCi1pbnQgcHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKQotewotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHByb2JlX2lycV9vZmYpOwotCi12b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID49IEVYVF9JUlEwICYmIGlycSA8PSAoRVhUX0lSUTAgKyBFWFRfSVJRUykpCi0JCUlFUl9SRUdTIHw9IDEgPDwgKGlycSAtIEVYVF9JUlEwKTsKLX0KLQotdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmIChpcnEgPj0gRVhUX0lSUTAgJiYgaXJxIDw9IChFWFRfSVJRMCArIEVYVF9JUlFTKSkKLQkJSUVSX1JFR1MgJj0gfigxIDw8IChpcnEgLSBFWFRfSVJRMCkpOwotfQotCi1hc21saW5rYWdlIHZvaWQgcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlycV9lbnRlcigpOwotCWg4MzAwX2NsZWFyX2lzcihpcnEpOwotCWlmIChpcnEgPj0gTlJfVFJBUFMgJiYgaXJxIDwgTlJfSVJRUykgewotCQlpZiAoaXJxX2xpc3RbaXJxXSkgewotCQkJaXJxX2xpc3RbaXJxXS0+aGFuZGxlcihpcnEsIGlycV9saXN0W2lycV0tPmRldl9pZCwgZnApOwotCQkJaXJxX2xpc3RbaXJxXS0+Y291bnQrKzsKLQkJCWlmIChpcnFfbGlzdFtpcnFdLT5mbGFncyAmIElSUUZfU0FNUExFX1JBTkRPTSkKLQkJCQlhZGRfaW50ZXJydXB0X3JhbmRvbW5lc3MoaXJxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUJVRygpOwotCX0KLQlpcnFfZXhpdCgpOwotfQotCi1pbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaSA9ICoobG9mZl90ICopIHY7Ci0KLQlpZiAoKGkgPCBOUl9JUlFTKSAmJiAoaXJxX2xpc3RbaV0hPU5VTEwpKSB7Ci0JCXNlcV9wcmludGYocCwgIiUzZDogJTEwdSAiLGksaXJxX2xpc3RbaV0tPmNvdW50KTsKLQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIGlycV9saXN0W2ldLT5kZXZuYW1lKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpbml0X2lycV9wcm9jKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9rbWFsbG9jKHZvaWQpCi17Ci0JdXNlX2ttYWxsb2MgPSAxOwotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChlbmFibGVfa21hbGxvYyk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCmluZGV4IDhmMjQxMWQuLmQzMmJiZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3B0cmFjZS5jCkBAIC0xMTEsMTAgKzExMSw3IEBACiAgICAgICAvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQkJcmV0ID0gMDsKLQkJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0gc2l6ZW9mKGRhdGEpKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gLUVJTzsKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMjE5LDcgKzIxNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBkb19zeXNjYWxsX3RyYWNlKHZvaWQpCiB7CiAJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwppbmRleCAwMjk1NTYwLi42MmVhMTJkIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwpAQCAtNTQ3LDMgKzU0Nyw5IEBACiAJfQogCXJldHVybiAwOwogfQorCithc21saW5rYWdlIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTMyIHRocmVhZF9pbmZvX2ZsYWdzKQoreworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIChfVElGX1NJR1BFTkRJTkcgfCBfVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCWRvX3NpZ25hbChyZWdzLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL01ha2VmaWxlIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKaW5kZXggYjI0ZWEwOC4uYzUwOTYzNiAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKKysrIGIvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvTWFrZWZpbGUKQEAgLTQsNCArNCw0IEBACiAjIFJldXNlIGFueSBmaWxlcyB3ZSBjYW4gZnJvbSB0aGUgSDgvMzAwSAogIwogCi1vYmoteSA6PSBlbnRyeS5vIGlycV9waW4ubyBwdHJhY2VfaDgzMDBoLm8KK29iai15IDo9IGlycV9waW4ubyBwdHJhY2VfaDgzMDBoLm8KZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMgYi9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4MzAwaC9lbnRyeS5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODZhYzNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDgzMDBoL2VudHJ5LlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyogLSotIG1vZGU6IGFzbSAtKi0KLSAqCi0gKiAgbGludXgvYXJjaC9oODMwMC9wbGF0Zm9ybS9oODMwMGgvZW50cnkuUwotICoKLSAqICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+Ci0gKiAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KLSAqCi0gKi8KLQotLyoKLSAqICBlbnRyeS5TCi0gKiAgaW5jbHVkZSBleGNlcHRpb24vaW50ZXJydXB0IGdhdGV3YXkKLSAqICAgICAgICAgIHN5c3RlbSBjYWxsIGVudHJ5Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0KLQkuaDgzMDBoCi0KLS8qIENQVSBjb250ZXh0IHNhdmUvcmVzdG9yZSBtYWNyb3MuICovCi0JCi0JLm1hY3JvCVNBVkVfQUxMCi0JbW92LmwJZXIwLEAtc3AKLQotCXN0YwljY3IscjBsCQkJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCi0JYnRzdAkjNCxyMGwKLQlibmUJNWYKLQotCW1vdi5sCXNwLEBTWU1CT0xfTkFNRShzd191c3ApCQkvKiB1c2VyIG1vZGUgKi8KLQltb3YubAlAc3AsZXIwCi0Jb3JjCSMweDEwLGNjcgotCW1vdi5sCUBTWU1CT0xfTkFNRShzd19rc3ApLHNwCi0Jc3ViLmwJIyhMUkVULUxPUklHKSxzcAkJLyogYWxsb2NhdGUgTE9SSUcgLSBMUkVUICovIAotCW1vdi5sCWVyMCxALXNwCi0JbW92LmwJZXIxLEAtc3AKLQltb3YubCAgIEBTWU1CT0xfTkFNRShzd191c3ApLGVyMAotCW1vdi5sICAgQCg4OjE2LGVyMCksZXIxICAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBSRVQgYWRkciAqLwotCW1vdi5sICAgZXIxLEAoTFJFVC1MRVIxOjE2LHNwKQotCi0JbW92LncJZTEscjEJCQkJLyogZTEgaGlnaGJ5dGUgPSBjY3IgKi8KLQlhbmQJIzB4ZWYscjFoCQkJLyogbWFzayBtb2RlPyBmbGFnICovCi0Jc3ViLncJcjAscjAKLQltb3YuYglyMWgscjBsCi0JbW92LncJcjAsQChMQ0NSLUxFUjE6MTYsc3ApCQkvKiBjb3B5IGNjciAqLwotCW1vdi5sCUAoTE9SSUctTEVSMToxNixzcCksZXIwCi0JbW92LmwJZXIwLEAoTEVSMC1MRVIxOjE2LHNwKQkJLyogY29weSBFUjAgKi8KLQlicmEJNmYKLTU6Ci0JbW92LmwJQHNwLGVyMAkJCQkvKiBrZXJuZWwgbW9kZSAqLwotCXN1YnMJIzIsc3AJCQkJLyogZHVtbXkgY2NyICovCi0JbW92LmwJZXIwLEAtc3AKLQltb3YubAllcjEsQC1zcAotCW1vdi53CUAoTFJFVC1MRVIxOjE2LHNwKSxyMQkJLyogY29weSBvbGQgY2NyICovCi0JbW92LmIJcjFoLHIxbAotCW1vdi5iCSMwLHIxaAotCW1vdi53CXIxLEAoTENDUi1MRVIxOjE2LHNwKQkJLyogc2V0IGNjciAqLwotNjoKLQltb3YubAllcjIsQC1zcAotCW1vdi5sCWVyMyxALXNwCi0JbW92LmwJZXI2LEAtc3AJCQkvKiBzeXNjYWxsIGFyZyAjNiAqLwotCW1vdi5sCWVyNSxALXNwCQkJLyogc3lzY2FsbCBhcmcgIzUgKi8KLQltb3YubAllcjQsQC1zcAkJCS8qIHN5c2NhbGwgYXJnICM0ICovCi0JLmVuZG0KLQotCS5tYWNybwlSRVNUT1JFX0FMTAotCW1vdi5sCUBzcCssZXI0Ci0JbW92LmwJQHNwKyxlcjUKLQltb3YubAlAc3ArLGVyNgotCW1vdi5sCUBzcCssZXIzCi0JbW92LmwJQHNwKyxlcjIKLQltb3YudwlAKExDQ1ItTEVSMToxNixzcCkscjAJCS8qIGNoZWNrIGtlcm5lbCBtb2RlICovCi0JYnRzdAkjNCxyMGwKLQlibmUJN2YKLQotCW9yYwkjMHg4MCxjY3IKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKExFUjAtTEVSMToxNixzcCksZXIxCQkvKiByZXN0b3JlIEVSMCAqLwotCW1vdi5sCWVyMSxAZXIwCi0JbW92LncJQChMQ0NSLUxFUjE6MTYsc3ApLHIxCQkvKiByZXN0b3JlIHRoZSBSRVQgYWRkciAqLwotCW1vdi5iCXIxbCxyMWgKLQltb3YuYglAKExSRVQrMS1MRVIxOjE2LHNwKSxyMWwKLQltb3YudwlyMSxlMQotCW1vdi53CUAoTFJFVCsyLUxFUjE6MTYsc3ApLHIxCi0JbW92LmwJZXIxLEAoODoxNixlcjApCi0KLQltb3YubAlAc3ArLGVyMQotCWFkZC5sCSMoTFJFVC1MRVIxKSxzcAkJCS8qIHJlbW92ZSBMT1JJRyAtIExSRVQgKi8gCi0JbW92LmwJc3AsQFNZTUJPTF9OQU1FKHN3X2tzcCkKLQltb3YubAllcjAsc3AKLQlicmEJOGYKLTc6Ci0JbW92LmwJQHNwKyxlcjEKLQlhZGRzCSM0LHNwCi0JYWRkcwkjMixzcAotODoKLQltb3YubAlAc3ArLGVyMAotCWFkZHMJIzQsc3AJCQkJLyogcmVtb3ZlIHRoZSBzdyBjcmVhdGVkIExWRUMgKi8KLQlydGUKLQkuZW5kbQotCQotLmdsb2JsIFNZTUJPTF9OQU1FKHN5c3RlbV9jYWxsKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikKLS5nbG9ibCBTWU1CT0xfTkFNRShyZXRfZnJvbV9mb3JrKQotLmdsb2JsIFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpCi0uZ2xvYmwgU1lNQk9MX05BTUUoc3dfa3NwKSxTWU1CT0xfTkFNRShzd191c3ApCi0uZ2xvYmwgU1lNQk9MX05BTUUocmVzdW1lKQotLmdsb2JsIFNZTUJPTF9OQU1FKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLS5nbG9ibCBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfZW50cnkpCi0uZ2xvYmwgU1lNQk9MX05BTUUoc3lzdGVtX2NhbGwpCi0uZ2xvYmwgU1lNQk9MX05BTUUodHJhY2VfYnJlYWspCi0KLSNpZiBkZWZpbmVkKENPTkZJR19ST01LRVJORUwpCi1JTlRFUlJVUFRTID0gNjQJCQotCS5zZWN0aW9uIC5pbnRfcmVkaXJlY3QsImF4IgotU1lNQk9MX05BTUVfTEFCRUwoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotCS5yZXB0CTcKLQkubG9uZwkwCi0JLmVuZHIKLQlqc3IJQFNZTUJPTF9OQU1FKGludGVycnVwdF9lbnRyeSkJLyogTk1JICovCi0Jam1wCUBTWU1CT0xfTkFNRShzeXN0ZW1fY2FsbCkJLyogVFJBUEEgIzAgKFN5c3RlbSBjYWxsKSAqLwotCS5sb25nCTAKLQkubG9uZwkwCi0Jam1wCUBTWU1CT0xfTkFNRSh0cmFjZV9icmVhaykJLyogVFJBUEEgIzMgKGJyZWFrcG9pbnQpICovCi0JLnJlcHQJSU5URVJSVVBUUy0xMgotCWpzcglAU1lNQk9MX05BTUUoaW50ZXJydXB0X2VudHJ5KQotCS5lbmRyCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19SQU1LRVJORUwpCi0uZ2xvYmwgU1lNQk9MX05BTUUoaW50ZXJydXB0X3JlZGlyZWN0X3RhYmxlKQotCS5zZWN0aW9uIC5ic3MKLVNZTUJPTF9OQU1FX0xBQkVMKGludGVycnVwdF9yZWRpcmVjdF90YWJsZSkKLQkuc3BhY2UJNAotI2VuZGlmCi0KLQkuc2VjdGlvbiAudGV4dAotCS5hbGlnbgkyCi1TWU1CT0xfTkFNRV9MQUJFTChpbnRlcnJ1cHRfZW50cnkpCi0JU0FWRV9BTEwKLQltb3YudwlAKExDQ1Isc3ApLHIwCi0JYnRzdAkjNCxyMGwKLQlibmUJMWYKLQltb3YubAlAU1lNQk9MX05BTUUoc3dfdXNwKSxlcjAKLQltb3YubAlAKDQ6MTYsZXIwKSxlcjAKLQlicmEJMmYKLTE6Ci0JbW92LmwJQChMVkVDLHNwKSxlcjAKLTI6Ci0jaWYgZGVmaW5lZChDT05GSUdfUk9NS0VSTkVMKQotCXN1Yi5sCSNTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUkFNS0VSTkVMKQotCW1vdi5sCUBTWU1CT0xfTkFNRShpbnRlcnJ1cHRfcmVkaXJlY3RfdGFibGUpLGVyMQotCXN1Yi5sCWVyMSxlcjAKLSNlbmRpZgotCXNobHIubAllcjAKLQlzaGxyLmwJZXIwCi0JZGVjLmwJIzEsZXIwCi0JbW92LmwJc3AsZXIxCi0Jc3VicwkjNCxlcjEJCQkJLyogYWRqdXN0IHJldF9wYyAqLwotCWpzcglAU1lNQk9MX05BTUUoZG9fSVJRKQotCW1vdi5sCUBTWU1CT0xfTkFNRShpcnFfc3RhdCkrQ1BVU1RBVF9TT0ZUSVJRX1BFTkRJTkcsZXIwCi0JYmVxCTFmCi0JanNyCUBTWU1CT0xfTkFNRShkb19zb2Z0aXJxKQotMToKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2ludGVycnVwdCkKLQkKLVNZTUJPTF9OQU1FX0xBQkVMKHN5c3RlbV9jYWxsKQotCXN1YnMJIzQsc3AJCQkJLyogZHVtbXkgTFZFQyAqLwotCVNBVkVfQUxMCi0JbW92LncJQChMQ0NSOjE2LHNwKSxyMQotCWJzZXQJIzQscjFsCi0JbGRjCXIxbCxjY3IKLQltb3YubAllcjAsZXI0Ci0JbW92LmwJIy1FTk9TWVMsZXIwCi0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkKLQotCS8qIHNhdmUgdG9wIG9mIGZyYW1lICovCi0JbW92LmwJc3AsZXIwCi0JanNyCUBTWU1CT0xfTkFNRShzZXRfZXNwMCkKLQljbXAubAkjTlJfc3lzY2FsbHMsZXI0Ci0JYmNjCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYKLQlzaGxsLmwJZXI0Ci0Jc2hsbC5sCWVyNAotCW1vdi5sCSNTWU1CT0xfTkFNRShzeXNfY2FsbF90YWJsZSksZXIwCi0JYWRkLmwJZXI0LGVyMAotCW1vdi5sCUBlcjAsZXI0Ci0JYmVxCVNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbik6MTYJCi0JbW92LmwJc3AsZXIyCi0JYW5kLncJIzB4ZTAwMCxyMgotCW1vdi5iCUAoKFRBU0tfRkxBR1MrMy0oVElGX1NZU0NBTExfVFJBQ0UgPj4gMykpOjE2LGVyMikscjJsCi0JYnRzdAkjKFRJRl9TWVNDQUxMX1RSQUNFICYgNykscjJsCi0JYm5lCTFmCi0JbW92LmwJQChMRVIxOjE2LHNwKSxlcjAKLQltb3YubAlAKExFUjI6MTYsc3ApLGVyMQotCW1vdi5sCUAoTEVSMzoxNixzcCksZXIyCi0JanNyCUBlcjQKLQltb3YubAllcjAsQChMRVIwOjE2LHNwKQkJLyogc2F2ZSB0aGUgcmV0dXJuIHZhbHVlICovCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ0FMTF9QUklOVCkKLQlqc3IJQFNZTUJPTF9OQU1FKHN5c2NhbGxfcHJpbnQpCi0jZW5kaWYKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0xOgotCWpzcglTWU1CT0xfTkFNRShzeXNjYWxsX3RyYWNlKQotCW1vdi5sCUAoTEVSMToxNixzcCksZXIwCi0JbW92LmwJQChMRVIyOjE2LHNwKSxlcjEKLQltb3YubAlAKExFUjM6MTYsc3ApLGVyMgotCWpzcglAZXI0Ci0JbW92LmwJZXIwLEAoTEVSMDoxNixzcCkJCS8qIHNhdmUgdGhlIHJldHVybiB2YWx1ZSAqLwotCWpzcglAU1lNQk9MX05BTUUoc3lzY2FsbF90cmFjZSkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0KLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2ZvcmspCi0JbW92LmwJZXIyLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGVfdGFpbCkKLQlicmEJU1lNQk9MX05BTUUocmV0X2Zyb21fZXhjZXB0aW9uKTo4Ci0KLVNZTUJPTF9OQU1FX0xBQkVMKHJlc2NoZWR1bGUpCi0JLyogc2F2ZSB0b3Agb2YgZnJhbWUgKi8KLQltb3YubAlzcCxlcjAKLQlqc3IJQFNZTUJPTF9OQU1FKHNldF9lc3AwKQotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0KLVNZTUJPTF9OQU1FX0xBQkVMKHJldF9mcm9tX2V4Y2VwdGlvbikKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCW9yYwkjMHg4MCxjY3IKLSNlbmRpZgotU1lNQk9MX05BTUVfTEFCRUwocmV0X2Zyb21faW50ZXJydXB0KQotCW1vdi5iCUAoTENDUisxOjE2LHNwKSxyMGwKLQlidHN0CSM0LHIwbAkJCS8qIGNoZWNrIGlmIHJldHVybmluZyB0byBrZXJuZWwgKi8KLQlibmUJZG9uZTo4CQkJLyogaWYgc28sIHNraXAgcmVzY2hlZCwgc2lnbmFscyAqLwotCWFuZGMJIzB4N2YsY2NyCi0JbW92LmwJc3AsZXI0Ci0JYW5kLncJIzB4ZTAwMCxyNAotCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKLQlhbmQubAkjX1RJRl9XT1JLX01BU0ssZXIxCi0JYmVxCWRvbmU6OAotMToKLQltb3YubAlAKFRJX0ZMQUdTOjE2LGVyNCksZXIxCi0JYnRzdAkjVElGX05FRURfUkVTQ0hFRCxyMWwKLQlibmUJU1lNQk9MX05BTUUocmVzY2hlZHVsZSk6MTYKLQltb3YubAlzcCxlcjAKLQlzdWJzCSM0LGVyMAkJCS8qIGFkanVzdCByZXRwYyAqLwotCW1vdi5sCWVyMixlcjEKLQlqc3IJQFNZTUJPTF9OQU1FKGRvX3NpZ25hbCkKLSNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKQotCWJyYQlkb25lOjgJCQkvKiB1c2Vyc3BhY2UgdGhvcnUgKi8KLTM6Ci0JYnRzdAkjNCxyMGwKLQliZXEJZG9uZTo4CQkJLyogdXNlcnNwYWNlIHRob3J1ICovCi00OgotCW1vdi5sCUAoVElfUFJFX0NPVU5UOjE2LGVyNCksZXIxCi0JYm5lCWRvbmU6OAotCW1vdi5sCUAoVElfRkxBR1M6MTYsZXI0KSxlcjEKLQlidHN0CSNUSUZfTkVFRF9SRVNDSEVELHIxbAotCWJlcQlkb25lOjgKLQltb3YuYglyMGwscjBsCi0JYnBsCWRvbmU6OAkJCS8qIGludGVycnVwdCBvZmYgKGV4Y2VwdGlvbiBwYXRoPykgKi8KLQltb3YubAkjUFJFRU1QVF9BQ1RJVkUsZXIxCi0JbW92LmwJZXIxLEAoVElfUFJFX0NPVU5UOjE2LGVyNCkKLQlhbmRjCSMweDdmLGNjcgotCWpzcglAU1lNQk9MX05BTUUoc2NoZWR1bGUpCi0Jc3ViLmwJZXIxLGVyMQotCW1vdi5sCWVyMSxAKFRJX1BSRV9DT1VOVDoxNixlcjQpCi0Jb3JjCSMweDgwLGNjcgotCWJyYQk0Yjo4Ci0jZW5kaWYKLWRvbmU6Ci0JUkVTVE9SRV9BTEwJCQkvKiBEb2VzIFJURSAqLwotCi1TWU1CT0xfTkFNRV9MQUJFTChyZXN1bWUpCi0JLyoKLQkgKiBCZXdhcmUgLSB3aGVuIGVudGVyaW5nIHJlc3VtZSwgb2Zmc2V0IG9mIHRzcyBpcyBpbiBkMSwKLQkgKiBwcmV2ICh0aGUgY3VycmVudCB0YXNrKSBpcyBpbiBhMCwgbmV4dCAodGhlIG5ldyB0YXNrKQotCSAqIGlzIGluIGExIGFuZCBkMi5iIGlzIG5vbi16ZXJvIGlmIHRoZSBtbSBzdHJ1Y3R1cmUgaXMKLQkgKiBzaGFyZWQgYmV0d2VlbiB0aGUgdGFza3MsIHNvIGRvbid0IGNoYW5nZSB0aGVzZQotCSAqIHJlZ2lzdGVycyB1bnRpbCB0aGVpciBjb250ZW50cyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLQkgKi8KLQotCS8qIHNhdmUgc3IgKi8KLQlzdWIudwlyMyxyMwotCXN0YwljY3IscjNsCi0JbW92LncJcjMsQChUSFJFQURfQ0NSKzI6MTYsZXIwKQotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0Jb3JjCSMweDgwLGNjcgotCW1vdi5sCUBTWU1CT0xfTkFNRShzd191c3ApLGVyMwotCW1vdi5sCWVyMyxAKFRIUkVBRF9VU1A6MTYsZXIwKQotCW1vdi5sCXNwLEAoVEhSRUFEX0tTUDoxNixlcjApCi0KLQkvKiBTa2lwIGFkZHJlc3Mgc3BhY2Ugc3dpdGNoaW5nIGlmIHRoZXkgYXJlIHRoZSBzYW1lLiAqLwotCS8qIEZJWE1FOiB3aGF0IGRpZCB3ZSBoYWNrIG91dCBvZiBoZXJlLCB0aGlzIGRvZXMgbm90aGluZyEgKi8KLQotCW1vdi5sCUAoVEhSRUFEX1VTUDoxNixlcjEpLGVyMAotCW1vdi5sCWVyMCxAU1lNQk9MX05BTUUoc3dfdXNwKQotCW1vdi5sCUAoVEhSRUFEX0tTUDoxNixlcjEpLHNwCi0JCQkKLQkvKiByZXN0b3JlIHN0YXR1cyByZWdpc3RlciAqLwotCW1vdi53CUAoVEhSRUFEX0NDUisyOjE2LGVyMSkscjMKLQotCWxkYwlyM2wsY2NyCi0JcnRzCi0JCi1TWU1CT0xfTkFNRV9MQUJFTCh0cmFjZV9icmVhaykKLQlzdWJzCSM0LHNwCi0JU0FWRV9BTEwKLQlzdWIubAllcjEsZXIxCi0JZGVjLmwJIzEsZXIxCi0JbW92LmwJZXIxLEAoTE9SSUcsc3ApCQotCW1vdi5sCXNwLGVyMAotCWpzcglAU1lNQk9MX05BTUUoc2V0X2VzcDApCi0JbW92LmwJQFNZTUJPTF9OQU1FKHN3X3VzcCksZXIwCi0JbW92LmwJQGVyMCxlcjEKLQlzdWJzCSMyLGVyMQotCW1vdi5sCWVyMSxAZXIwCQotCWFuZC53CSMweGZmLGUxCi0JbW92LmwJZXIxLGVyMAotCWpzcglAU1lNQk9MX05BTUUodHJhY2VfdHJhcCkKLQlqbXAJQFNZTUJPTF9OQU1FKHJldF9mcm9tX2V4Y2VwdGlvbikJCi0KLQkuc2VjdGlvbgkuYnNzCi1TWU1CT0xfTkFNRV9MQUJFTChzd19rc3ApCi0JLnNwYWNlCTQJCi1TWU1CT0xfTkFNRV9MQUJFTChzd191c3ApCi0JLnNwYWNlCTQJCmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL3BsYXRmb3JtL2g4cy9NYWtlZmlsZSBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCmluZGV4IDA4NDdiMTUuLmJmMTI0MTggMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCisrKyBiL2FyY2gvaDgzMDAvcGxhdGZvcm0vaDhzL01ha2VmaWxlCkBAIC00LDQgKzQsNCBAQAogIyBSZXVzZSBhbnkgZmlsZXMgd2UgY2FuIGZyb20gdGhlIEg4UwogIwogCi1vYmoteSA6PSBlbnRyeS5vIGludHNfaDhzLm8gcHRyYWNlX2g4cy5vCitvYmoteSA6PSBpbnRzX2g4cy5vIHB0cmFjZV9oOHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCBiMWIyYjMwLi5jN2M5YzJhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTIxMiwyMSArMTIxMiwyNiBAQAogCiBzb3VyY2UgImZzL0tjb25maWciCiAKLW1lbnUgIkluc3RydW1lbnRhdGlvbiBTdXBwb3J0IgorbWVudWNvbmZpZyBJTlNUUlVNRU5UQVRJT04KKwlib29sICJJbnN0cnVtZW50YXRpb24gU3VwcG9ydCIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgeQorCitpZiBJTlNUUlVNRU5UQVRJT04KIAogc291cmNlICJhcmNoL2kzODYvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwogCSAgYSBwcm9iZXBvaW50IGFuZCBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrLiAgS3Byb2JlcyBpcyB1c2VmdWwKIAkgIGZvciBrZXJuZWwgZGVidWdnaW5nLCBub24taW50cnVzaXZlIGluc3RydW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KIAkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgotZW5kbWVudQorCitlbmRpZiAjIElOU1RSVU1FTlRBVElPTgogCiBzb3VyY2UgImFyY2gvaTM4Ni9LY29uZmlnLmRlYnVnIgogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvTWFrZWZpbGUgYi9hcmNoL2kzODYvTWFrZWZpbGUKaW5kZXggYmQyOGY5Zi4uMTgxY2MyOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9NYWtlZmlsZQpAQCAtMTA4LDYgKzEwOCw3IEBACiAjIG11c3QgYmUgbGlua2VkIGFmdGVyIGtlcm5lbC8KIGRyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpCQkrPSBhcmNoL2kzODYvb3Byb2ZpbGUvCiBkcml2ZXJzLSQoQ09ORklHX1BNKQkJCSs9IGFyY2gvaTM4Ni9wb3dlci8KK2RyaXZlcnMtJChDT05GSUdfRkIpICAgICAgICAgICAgICAgICAgICArPSBhcmNoL2kzODYvdmlkZW8vCiAKIENGTEFHUyArPSAkKG1mbGFncy15KQogQUZMQUdTICs9ICQobWZsYWdzLXkpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwppbmRleCA0MTEyYWZlLi40NzAwMWQ1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwbS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTIyMiw2ICsyMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMjMxMSw3ICsyMzEyLDYgQEAKIAkJcmVtb3ZlX3Byb2NfZW50cnkoImFwbSIsIE5VTEwpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlrYXBtZF90YXNrLT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAl3YWtlX3VwX3Byb2Nlc3Moa2FwbWRfdGFzayk7CiAKIAlpZiAobnVtX29ubGluZV9jcHVzKCkgPiAxICYmICFzbXAgKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCmluZGV4IGY3NGRmYzQuLjgyNzE0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TCkBAIC0xNjgsNiArMTY4LDEyIEBACiAuc2VjdGlvbiAuaW5pdC50ZXh0LCJheCIsQHByb2diaXRzCiAjZW5kaWYKIAorCS8qIERvIGFuIGVhcmx5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBmaXhtYXAgYXJlYSAqLworCW1vdmwgJChzd2FwcGVyX3BnX2RpciAtIF9fUEFHRV9PRkZTRVQpLCAlZWR4CisJbW92bCAkKHN3YXBwZXJfcGdfcG1kIC0gX19QQUdFX09GRlNFVCksICVlYXgKKwlhZGRsICQweDAwNywgJWVheAkJCS8qIDB4MDA3ID0gUFJFU0VOVCtSVytVU0VSICovCisJbW92bCAlZWF4LCA0MDkyKCVlZHgpCisKICNpZmRlZiBDT05GSUdfU01QCiBFTlRSWShzdGFydHVwXzMyX3NtcCkKIAljbGQKQEAgLTUwNyw2ICs1MTMsOCBAQAogLnNlY3Rpb24gIi5ic3MucGFnZV9hbGlnbmVkIiwidyIKIEVOVFJZKHN3YXBwZXJfcGdfZGlyKQogCS5maWxsIDEwMjQsNCwwCitFTlRSWShzd2FwcGVyX3BnX3BtZCkKKwkuZmlsbCAxMDI0LDQsMAogRU5UUlkoZW1wdHlfemVyb19wYWdlKQogCS5maWxsIDQwOTYsMSwwCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggN2Y4YjdhZi4uMjFkYjhmNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTY2Nyw2ICs2NjcsNyBAQAogCQlzZXRfcGVuZGluZ19pcnEoaSwgY3B1bWFza19vZl9jcHUoMCkpOwogCX0KIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKCA7IDsgKSB7CiAJCXRpbWVfcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVfcmVtYWluaW5nKTsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggZmJhMTIxZi4uMDNiN2Y1NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAlsYXN0X2lycV9zdW1zIFtOUl9DUFVTXSwKIAlhbGVydF9jb3VudGVyIFtOUl9DUFVTXTsKIAotdm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2cgKHZvaWQpCit2b2lkIHRvdWNoX25taV93YXRjaGRvZyh2b2lkKQogewogCWlmIChubWlfd2F0Y2hkb2cgPiAwKSB7CiAJCXVuc2lnbmVkIGNwdTsKQEAgLTMwNCw4ICszMDQsMTAgQEAKIAkJICogSnVzdCByZXNldCB0aGUgYWxlcnQgY291bnRlcnMsIChvdGhlciBDUFVzIG1pZ2h0IGJlCiAJCSAqIHNwaW5uaW5nIG9uIGxvY2tzIHdlIGhvbGQpOgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJaWYgKGFsZXJ0X2NvdW50ZXJbY3B1XSkKKwkJCQlhbGVydF9jb3VudGVyW2NwdV0gPSAwOworCQl9CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMDZkZmE2NS4uNmM0OWFjYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTUzOCw4ICs1MzgsMzEgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIG5vaW5saW5lIHZvaWQgX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKLQkJCQkgICAgc3RydWN0IHRzc19zdHJ1Y3QgKnRzcykKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAordm9pZCBoYXJkX2Rpc2FibGVfVFNDKHZvaWQpCit7CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgfCBYODZfQ1I0X1RTRCk7Cit9Cit2b2lkIGRpc2FibGVfVFNDKHZvaWQpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfdGhyZWFkX2ZsYWcoVElGX05PVFNDKSkKKwkJLyoKKwkJICogTXVzdCBmbGlwIHRoZSBDUFUgc3RhdGUgc3luY2hyb25vdXNseSB3aXRoCisJCSAqIFRJRl9OT1RTQyBpbiB0aGUgY3VycmVudCBydW5uaW5nIGNvbnRleHQuCisJCSAqLworCQloYXJkX2Rpc2FibGVfVFNDKCk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KK3ZvaWQgaGFyZF9lbmFibGVfVFNDKHZvaWQpCit7CisJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOworfQorI2VuZGlmIC8qIENPTkZJR19TRUNDT01QICovCisKK3N0YXRpYyBub2lubGluZSB2b2lkCitfX3N3aXRjaF90b194dHJhKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl9wLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfcCwKKwkJIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpCiB7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQ7CiAKQEAgLTU1NSw2ICs1NzgsMTcgQEAKIAkJc2V0X2RlYnVncmVnKG5leHQtPmRlYnVncmVnWzddLCA3KTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhwcmV2X3AsIFRJRl9OT1RTQykgXgorCSAgICB0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9OT1RTQykpIHsKKwkJLyogcHJldiBhbmQgbmV4dCBhcmUgZGlmZmVyZW50ICovCisJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9OT1RTQykpCisJCQloYXJkX2Rpc2FibGVfVFNDKCk7CisJCWVsc2UKKwkJCWhhcmRfZW5hYmxlX1RTQygpOworCX0KKyNlbmRpZgorCiAJaWYgKCF0ZXN0X3Rza190aHJlYWRfZmxhZyhuZXh0X3AsIFRJRl9JT19CSVRNQVApKSB7CiAJCS8qCiAJCSAqIERpc2FibGUgdGhlIGJpdG1hcCB2aWEgYW4gaW52YWxpZCBvZmZzZXQuIFdlIHN0aWxsIGNhY2hlCkBAIC01ODYsMzMgKzYyMCw2IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgdGhlIGNvbnRleHQgc3dpdGNoIGZyb20gcHJldiB0byBuZXh0Ci0gKiBoYXMgdG8gdHdlYWsgdGhlIFRTQyBkaXNhYmxlIGJpdCBpbiB0aGUgY3I0LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV90c2Moc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCi0JCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3ApCi17Ci0Jc3RydWN0IHRocmVhZF9pbmZvICpwcmV2LCAqbmV4dDsKLQotCS8qCi0JICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKLQkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgotCSAqLwotCXByZXYgPSB0YXNrX3RocmVhZF9pbmZvKHByZXZfcCk7Ci0JbmV4dCA9IHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKTsKLQotCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSB8fCBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewotCQkvKiBzbG93IHBhdGggaGVyZSAqLwotCQlpZiAoaGFzX3NlY3VyZV9jb21wdXRpbmcocHJldikgJiYKLQkJICAgICFoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkgewotCQkJd3JpdGVfY3I0KHJlYWRfY3I0KCkgJiB+WDg2X0NSNF9UU0QpOwotCQl9IGVsc2UgaWYgKCFoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgotCQkJICAgaGFzX3NlY3VyZV9jb21wdXRpbmcobmV4dCkpCi0JCQl3cml0ZV9jcjQocmVhZF9jcjQoKSB8IFg4Nl9DUjRfVFNEKTsKLQl9Ci19Ci0KLS8qCiAgKglzd2l0Y2hfdG8oeCx5bikgc2hvdWxkIHN3aXRjaCB0YXNrcyBmcm9tIHggdG8geS4KICAqCiAgKiBXZSBmc2F2ZS9md2FpdCBzbyB0aGF0IGFuIGV4Y2VwdGlvbiBnb2VzIG9mZiBhdCB0aGUgcmlnaHQgdGltZQpAQCAtNjg5LDExICs2OTYsOSBAQAogCS8qCiAJICogTm93IG1heWJlIGhhbmRsZSBkZWJ1ZyByZWdpc3RlcnMgYW5kL29yIElPIGJpdG1hcHMKIAkgKi8KLQlpZiAodW5saWtlbHkoKHRhc2tfdGhyZWFkX2luZm8obmV4dF9wKS0+ZmxhZ3MgJiBfVElGX1dPUktfQ1RYU1cpCi0JICAgIHx8IHRlc3RfdHNrX3RocmVhZF9mbGFnKHByZXZfcCwgVElGX0lPX0JJVE1BUCkpKQotCQlfX3N3aXRjaF90b194dHJhKG5leHRfcCwgdHNzKTsKLQotCWRpc2FibGVfdHNjKHByZXZfcCwgbmV4dF9wKTsKKwlpZiAodW5saWtlbHkodGFza190aHJlYWRfaW5mbyhwcmV2X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTV19QUkVWIHx8CisJCSAgICAgdGFza190aHJlYWRfaW5mbyhuZXh0X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTV19ORVhUKSkKKwkJX19zd2l0Y2hfdG9feHRyYShwcmV2X3AsIG5leHRfcCwgdHNzKTsKIAogCS8qCiAJICogTGVhdmUgbGF6eSBtb2RlLCBmbHVzaGluZyBhbnkgaHlwZXJjYWxscyBtYWRlIGhlcmUuCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCAwYzBjZWVjLi4xYzA3NWY1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1OCwxNyArMzU4LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgZGF0YXApOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTM5NSwxMCArMzg3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCmluZGV4IDkwZGEwNTcuLjE4YzFjMjggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTM5MCw3ICszOTAsNyBAQAogCQl1bnNpZ25lZCBsb25nIGVzcDsKIAkJdW5zaWduZWQgc2hvcnQgc3M7CiAKLQkJcmVwb3J0X2J1ZyhyZWdzLT5laXApOworCQlyZXBvcnRfYnVnKHJlZ3MtPmVpcCwgcmVncyk7CiAKIAkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlMDRseCBbIyVkXVxuIiwgc3RyLCBlcnIgJiAweGZmZmYsICsrZGllX2NvdW50ZXIpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCkBAIC00MzMsNiArNDMzLDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllLmxvY2ssIGZsYWdzKTsKIAogCWlmICghcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZSBiL2FyY2gvaTM4Ni92aWRlby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQ0N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3ZpZGVvL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19GQikgICAgICAgICAgICAgICArPSBmYmRldi5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYyBiL2FyY2gvaTM4Ni92aWRlby9mYmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmIzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvdmlkZW8vZmJkZXYuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogYXJjaC9pMzg2L3ZpZGVvL2ZiZGV2LmMgLSBpMzg2IEZyYW1lYnVmZmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFudG9uaW5vIERhcGxhcyA8YWRhcGxhc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK2ludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSBpbmZvLT5kZXZpY2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChkZXZpY2UpCisJCXBjaV9kZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisKKwlpZiAocGNpX2RldikKKwkJcmVzID0gJnBjaV9kZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdOworCisJaWYgKHJlcyAmJiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fU0hBRE9XKQorCQlyZXR2YWwgPSAxOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woZmJfaXNfcHJpbWFyeV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCBkYjlkZGZmLi42MTZjOTZlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtNTgyLDggKzU4Miw4IEBACiBzb3VyY2UgImFyY2gvaWE2NC9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwppbmRleCBjMWRjYTIyLi5jZDRhZGY1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPiAgICAgICAgIC8qIGh3ZWlnaHQ2NCgpICovCisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogCiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CQkvKiBpYTY0X2dldF9pdGMoKSAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDMsNiArNDQsOCBAQAogCiAjaW5jbHVkZSA8YXNtL2FjcGktZXh0Lmg+CiAKK2V4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBzaXplKTsKKwogI2RlZmluZSBQRlggIklPQzogIgogCiAvKgpAQCAtMjAyNiwxMSArMjAyOSwyNCBAQAogCWlmICghaWE2NF9wbGF0Zm9ybV9pcygiaHB6eDEiKSAmJiAhaWE2NF9wbGF0Zm9ybV9pcygiaHB6eDFfc3dpb3RsYiIpKQogCQlyZXR1cm4gMDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykgJiYgZGVmaW5lZChDT05GSUdfQ1JBU0hfRFVNUCkKKwkvKiBJZiB3ZSBhcmUgYm9vdGluZyBhIGtkdW1wIGtlcm5lbCwgdGhlIHNiYV9pb21tdSB3aWxsCisJICogY2F1c2UgZGV2aWNlcyB0aGF0IHdlcmUgbm90IHNodXRkb3duIHByb3Blcmx5IHRvIE1DQQorCSAqIGFzIHNvb24gYXMgdGhleSBhcmUgdHVybmVkIGJhY2sgb24uICBPdXIgb25seSBvcHRpb24gZm9yCisJICogYSBzdWNjZXNzZnVsIGtkdW1wIGtlcm5lbCBib290IGlzIHRvIHVzZSB0aGUgc3dpb3RsYi4KKwkgKi8KKwlpZiAoZWxmY29yZWhkcl9hZGRyIDwgRUxGQ09SRV9BRERSX01BWCkgeworCQlpZiAoc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUoNjQgKiAoMTw8MjApKSAhPSAwKQorCQkJcGFuaWMoIlVuYWJsZSB0byBpbml0aWFsaXplIHNvZnR3YXJlIEkvTyBUTEI6IgorCQkJCSAgIiBUcnkgbWFjaHZlYz1kaWcgYm9vdCBvcHRpb24iKTsKKwkJbWFjaHZlY19pbml0KCJkaWciKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKIAlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfc2JhX2lvY19kcml2ZXIpOwogCWlmICghaW9jX2xpc3QpIHsKICNpZmRlZiBDT05GSUdfSUE2NF9HRU5FUklDCi0JCWV4dGVybiBpbnQgc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUgKHNpemVfdCBzaXplKTsKLQogCQkvKgogCQkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBzb21ldGhpbmcgc2JhX2lvbW11IGNhbiBjbGFpbSwgd2UKIAkJICogbmVlZCB0byBzZXR1cCB0aGUgc3dpb3RsYiBhbmQgc3dpdGNoIHRvIHRoZSBkaWcgbWFjaHZlYy4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYyBiL2FyY2gvaWE2NC9ocC9zaW0vYm9vdC9mdy1lbXUuYwppbmRleCAzMDBhY2Q5Li4xMTg5ZDAzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL2Jvb3QvZnctZW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9ib290L2Z3LWVtdS5jCkBAIC0zMjksMTEgKzMyOSw2IEBACiAJc3RyY3B5KHNhbF9zeXN0YWItPnByb2R1Y3RfaWQsICJIUC1zaW11bGF0b3IiKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0lBNjRfU0RWCi0Jc3RyY3B5KHNhbF9zeXN0YWItPm9lbV9pZCwgIkludGVsIik7Ci0Jc3RyY3B5KHNhbF9zeXN0YWItPnByb2R1Y3RfaWQsICJTRFYiKTsKLSNlbmRpZgotCiAJLyogZmlsbCBpbiBhbiBlbnRyeSBwb2ludDogKi8KIAlzYWxfZWQtPnR5cGUgPSBTQUxfREVTQ19FTlRSWV9QT0lOVDsKIAlzYWxfZWQtPnBhbF9wcm9jID0gX19wYShwYWxfZGVzY1swXSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwppbmRleCAzMjRlYTc1Li5lZjI1MmRmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKQEAgLTM2LDEwICszNiw2IEBACiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZmRlZiBDT05GSUdfS0RCCi0jIGluY2x1ZGUgPGxpbnV4L2tkYi5oPgotI2VuZGlmCi0KICN1bmRlZiBTSU1TRVJJQUxfREVCVUcJLyogZGVmaW5lIHRoaXMgdG8gZ2V0IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi8KIAogI2RlZmluZSBLRVlCT0FSRF9JTlRSCTMJLyogbXVzdCBtYXRjaCB3aXRoIHNpbXVsYXRvciEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pYTMyL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKaW5kZXggYzA1YmRhNi4uNmY0ZDNkMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKKysrIGIvYXJjaC9pYTY0L2lhMzIvYmluZm10X2VsZjMyLmMKQEAgLTI2MSw3ICsyNjEsNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZwotZWxmMzJfbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlKQorZWxmMzJfbWFwIChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwgc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBnb2ZmID0gKGVwcG50LT5wX3ZhZGRyKSAmIH5JQTMyX1BBR0VfTUFTSzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TIGIvYXJjaC9pYTY0L2lhMzIvaWEzMl9lbnRyeS5TCmluZGV4IDk5YjY2NWUuLjA2ZWZkMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pYTMyL2lhMzJfZW50cnkuUworKysgYi9hcmNoL2lhNjQvaWEzMi9pYTMyX2VudHJ5LlMKQEAgLTMwNCw3ICszMDQsNyBAQAogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGluaXRfbW9kdWxlICovCiAJZGF0YTggc3lzX25pX3N5c2NhbGwJLyogZGVsZXRlX21vZHVsZSAqLwogCWRhdGE4IHN5c19uaV9zeXNjYWxsCS8qIGdldF9rZXJuZWxfc3ltcyAqLyAgLyogMTMwICovCi0JZGF0YTggc3lzX3F1b3RhY3RsCisJZGF0YTggc3lzMzJfcXVvdGFjdGwKIAlkYXRhOCBzeXNfZ2V0cGdpZAogCWRhdGE4IHN5c19mY2hkaXIKIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfYmRmbHVzaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKaW5kZXggNzVlYzM0Ny4uNzNjYTg2ZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9rcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9mc3lzLlMgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwppbmRleCA4NTg5ZTg0Li4zZjkyNmMyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUwpAQCAtMjQ3LDYgKzI0Nyw5IEBACiAudGltZV9yZWRvOgogCS5wcmVkLnJlbC5tdXRleCBwOCxwOSxwMTAKIAlsZDQuYWNxIHIyOCA9IFtyMjldCS8vIHh0aW1lX2xvY2suc2VxdWVuY2UuIE11c3QgY29tZSBmaXJzdCBmb3IgbG9ja2luZyBwdXJwb3NlcworCTs7CisJYW5kIHIyOCA9IH4xLHIyOAkvLyBNYWtlIHNlcXVlbmNlIGV2ZW4gdG8gZm9yY2UgcmV0cnkgaWYgb2RkCisJOzsKIChwOCkJbW92IHIyID0gYXIuaXRjCQkvLyBDUFVfVElNRVIuIDM2IGNsb2NrcyBsYXRlbmN5ISEhCiAJYWRkIHIyMiA9IElBNjRfVElNRV9JTlRFUlBPTEFUT1JfTEFTVF9DT1VOVEVSX09GRlNFVCxyMjAKIChwOSkJbGQ4IHIyID0gW3IzMF0JCS8vIHJlYWRxKHRpLT5hZGRyZXNzKS4gQ291bGQgYWxzbyBoYXZlIGxhdGVuY3kgaXNzdWVzLi4KQEAgLTI4NCw3ICsyODcsNiBAQAogKHAxNSkJbGQ4IHIxNyA9IFtyMTldLC1JQTY0X1RJTUVTUEVDX1RWX05TRUNfT0ZGU0VUCiAocDcpCWNtcC5uZSBwNyxwMCA9IHIyNSxyMwkvLyBpZiBjbXB4Y2hnIG5vdCBzdWNjZXNzZnVsIHJlZG8KIAkvLyBzaW11bGF0ZSB0Yml0Lm56Lm9yIHA3LHAwID0gcjI4LDAKLQlhbmQgcjI4ID0gfjEscjI4CS8vIE1ha2Ugc2VxdWVuY2UgZXZlbiB0byBmb3JjZSByZXRyeSBpZiBvZGQKIAlnZXRmLnNpZyByMiA9IGY4CiAJbWYKIAlhZGQgcjggPSByOCxyMTgJCS8vIEFkZCB0aW1lIGludGVycG9sYXRvciBvZmZzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwppbmRleCAxODhmYjczLi40ZDk4NjRjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCkBAIC0zOTAsMTAgKzM5MCw2IEBACiAJaWYgKCFlZmlfc2V0dXBfcGNkcF9jb25zb2xlKGNtZGxpbmUpKQogCQllYXJseWNvbnMrKzsKICNlbmRpZgotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCi0JaWYgKCFlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KGNtZGxpbmUpKQotCQllYXJseWNvbnMrKzsKLSNlbmRpZgogCiAJcmV0dXJuIChlYXJseWNvbnMpID8gMCA6IC0xOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDE1YWQ4NWQuLjNhZWFmMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRpZS5sb2NrX293bmVyID0gLTE7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWUubG9jayk7CiAKIAlpZiAocGFuaWNfb25fb29wcykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYyBiL2FyY2gvaWE2NC9saWIvY2hlY2tzdW0uYwppbmRleCA0NDExZDliLi45ZmM5NTUwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbGliL2NoZWNrc3VtLmMKKysrIGIvYXJjaC9pYTY0L2xpYi9jaGVja3N1bS5jCkBAIC02MCw2ICs2MCw3IEBACiAJcmVzdWx0ID0gKHJlc3VsdCAmIDB4ZmZmZmZmZmYpICsgKHJlc3VsdCA+PiAzMik7CiAJcmV0dXJuIChfX2ZvcmNlIF9fd3N1bSlyZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX2NzdW0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgbG9uZyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKaW5kZXggNmRhOTg1NC4uZGY4ZDViZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvc25faHdwZXJmLmMKQEAgLTc1MCw5ICs3NTAsMTAgQEAKIAkJCWdvdG8gZXJyb3I7CiAJCX0gZWxzZQogCQlpZiAoKHIgPSBzbl9od3BlcmZfZW51bV9vYmplY3RzKCZub2JqLCAmb2JqcykpID09IDApIHsKKwkJCWludCBjcHVvYmpfaW5kZXggPSAwOworCiAJCQltZW1zZXQocCwgMCwgYS5zeik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbm9iajsgaSsrKSB7Ci0JCQkJaW50IGNwdW9ial9pbmRleCA9IDA7CiAJCQkJaWYgKCFTTl9IV1BFUkZfSVNfTk9ERShvYmpzICsgaSkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCW5vZGUgPSBzbl9od3BlcmZfb2JqX3RvX2Nub2RlKG9ianMgKyBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9LY29uZmlnIGIvYXJjaC9tMzJyL0tjb25maWcKaW5kZXggYzNiYjhhNy4uOGNjZjNlNCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTMxLDYgKzMxLDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBOT19ETUEKKwlkZWZfYm9vbCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL20zMnIva2VybmVsL3B0cmFjZS5jCmluZGV4IDVmMDJiMzEuLjU3YTkyZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9wdHJhY2UuYwpAQCAtNTk1LDcgKzU5NSw2IEBACiBzdGF0aWMgaW50CiBkb19wdHJhY2UobG9uZyByZXF1ZXN0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7CkBAIC02MDQsMTEgKzYwMyw3IEBACiAJICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6CiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChyZXQgPT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyoKQEAgLTYyNCwxNSArNjE5LDkgQEAKIAkgKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoKIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpOwotCQlpZiAocmV0ID09IHNpemVvZihkYXRhKSkgewotCQkJcmV0ID0gMDsKLQkJCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QT0tFVEVYVCkgewotCQkJCWludmFsaWRhdGVfY2FjaGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU87Ci0JCX0KKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOworCQlpZiAocmV0ID09IDAgJiYgcmVxdWVzdCA9PSBQVFJBQ0VfUE9LRVRFWFQpCisJCQlpbnZhbGlkYXRlX2NhY2hlKCk7CiAJCWJyZWFrOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZS5jCmluZGV4IGNkYmE5ZmQuLjJjZjA2OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTI4LDEwICsxMjgsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVEVYVDoJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWkgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoaSAhPSBzaXplb2YodG1wKSkKLQkJCWdvdG8gb3V0X2VpbzsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCkBAIC0xNjAsOCArMTU3LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDoJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSAhPSBzaXplb2YoZGF0YSkpCi0JCQlnb3RvIG91dF9laW87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCBhMjdhNGZhLi40ZTI3NTJhIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC0xMTcwLDYgKzExNzAsNyBAQAogCWNvbnNvbGVfdmVyYm9zZSgpOwogCXByaW50aygiJXM6ICUwOHhcbiIsc3RyLG5yKTsKIAlzaG93X3JlZ2lzdGVycyhmcCk7CisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jIGIvYXJjaC9tNjhrL2xpYi9jaGVja3N1bS5jCmluZGV4IGNmNmJiNTEuLjYyMTZmMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL202OGsvbGliL2NoZWNrc3VtLmMKQEAgLTQyMiwzICs0MjIsNCBAQAogCSAgICApOwogICAgIHJldHVybihzdW0pOwogfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDk0MTk1NWQuLjg0NmY5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJZnAgPSAoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilwLT50aHJlYWQua3NwKS0+YTY7CiAJZG8gewogCQlpZiAoZnAgPCBzdGFja19wYWdlK3NpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pIHx8Ci0JCSAgICBmcCA+PSA4MTg0K3N0YWNrX3BhZ2UpCisJCSAgICBmcCA+PSBUSFJFQURfU0laRS04K3N0YWNrX3BhZ2UpCiAJCQlyZXR1cm4gMDsKIAkJcGMgPSAoKHVuc2lnbmVkIGxvbmcgKilmcClbMV07CiAJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9wdHJhY2UuYwppbmRleCBmNTRiNmEzLi5lZjcwY2EwIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3B0cmFjZS5jCkBAIC0xMDYsMTcgKzEwNiw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KIAkJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQkJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCQkJaW50IGNvcGllZDsKLQotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJCXJldCA9IC1FSU87Ci0JCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJCWJyZWFrOwotCQl9CiAKIAkJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE1OSwxMCArMTUxLDcgQEAKIAkJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhpcyB3aWxsIGhhdmUgdG8gYmUgZml4ZWQuICovCiAJCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJCXJldCA9IDA7Ci0JCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCQlicmVhazsKLQkJCXJldCA9IC1FSU87CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIFBUUkFDRV9QT0tFVVNSOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKaW5kZXggODEzM2IxMC4uODBmNGU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NldHVwLmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogIGxpbnV4L2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCiAgKgotICogIENvcHlyaWdodCAoQykgMTk5OS0yMDA0ICBHcmVnIFVuZ2VyZXIgKGdlcmdAc25hcGdlYXIuY29tKQotICogIENvcHlyaWdodCAoQykgMTk5OCwxOTk5ICBELiBKZWZmIERpb25uZSA8amVmZkBsaW5lby5jYT4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyAgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgsMTk5OSAgRC4gSmVmZiBEaW9ubmUgPGplZmZAdUNsaW51eC5vcmc+CiAgKiAgQ29weWxlZnQgICgpKSAyMDAwICAgICAgIEphbWVzIEQuIFNjaGV0dGluZSB7amFtZXNAdGVsb3Mtc3lzdGVtcy5jb219CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk4ICAgICAgIEtlbm5ldGggQWxiYW5vd3NraSA8a2phaGRzQGtqYWhkcy5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAxOTk1ICAgICAgIEhhbWlzaCBNYWNkb25hbGQKQEAgLTIwLDE3ICsyMCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00NiwzNCArNDIsMTkgQEAKIAogY2hhciBfX2luaXRkYXRhIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV07CiAKLS8qIHNldHVwIHNvbWUgZHVtbXkgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGR1bW15X3dhaXRidXQodm9pZCkKLXsKLX0KK3ZvaWQgKCptYWNoX3RyYXBfaW5pdCkodm9pZCk7CiAKLXZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFfaGFuZGxlcl90IGhhbmRsZXIpOwotdm9pZCAoKm1hY2hfdGljaykoIHZvaWQgKTsKLS8qIG1hY2hpbmUgZGVwZW5kZW50IGtleWJvYXJkIGZ1bmN0aW9ucyAqLwotaW50ICgqbWFjaF9rZXliX2luaXQpICh2b2lkKTsKLWludCAoKm1hY2hfa2JkcmF0ZSkgKHN0cnVjdCBrYmRfcmVwZWF0ICopOwotdm9pZCAoKm1hY2hfa2JkX2xlZHMpICh1bnNpZ25lZCBpbnQpOwotLyogbWFjaGluZSBkZXBlbmRlbnQgaXJxIGZ1bmN0aW9ucyAqLwotdm9pZCAoKm1hY2hfaW5pdF9JUlEpICh2b2lkKTsKLWlycV9oYW5kbGVyX3QgbWFjaF9kZWZhdWx0X2hhbmRsZXI7Ci1pbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotdm9pZCAoKm1hY2hfcHJvY2Vzc19pbnQpIChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotdm9pZCAoKm1hY2hfdHJhcF9pbml0KSAodm9pZCk7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KLXVuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpICh2b2lkKTsKLXZvaWQgKCptYWNoX2dldHRvZCkgKGludCosIGludCosIGludCosIGludCosIGludCosIGludCopOwotaW50ICgqbWFjaF9od2NsaykgKGludCwgc3RydWN0IHJ0Y190aW1lKik7Ci1pbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSAodW5zaWduZWQgbG9uZyk7Ci12b2lkICgqbWFjaF9ta3NvdW5kKSggdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgdGlja3MgKTsKLXZvaWQgKCptYWNoX3Jlc2V0KSggdm9pZCApOwotdm9pZCAoKndhaXRidXQpKHZvaWQpID0gZHVtbXlfd2FpdGJ1dDsKLXZvaWQgKCptYWNoX2RlYnVnX2luaXQpKHZvaWQpOwotdm9pZCAoKm1hY2hfaGFsdCkoIHZvaWQgKTsKLXZvaWQgKCptYWNoX3Bvd2VyX29mZikoIHZvaWQgKTsKK3ZvaWQgKCptYWNoX3NjaGVkX2luaXQpKGlycV9oYW5kbGVyX3QgaGFuZGxlcik7Cit2b2lkICgqbWFjaF90aWNrKSh2b2lkKTsKK3ZvaWQgKCptYWNoX2dldHRvZCkoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7CitpbnQgKCptYWNoX3NldF9jbG9ja19tbXNzKSh1bnNpZ25lZCBsb25nKTsKK3Vuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpKHZvaWQpOworCisvKiBtYWNoaW5lIGRlcGVuZGVudCByZWJvb3QgZnVuY3Rpb25zICovCit2b2lkICgqbWFjaF9yZXNldCkodm9pZCk7Cit2b2lkICgqbWFjaF9oYWx0KSh2b2lkKTsKK3ZvaWQgKCptYWNoX3Bvd2VyX29mZikodm9pZCk7CiAKIAogI2lmZGVmIENPTkZJR19NNjgwMDAKQEAgLTEzNCwxMyArMTE1LDYgQEAKIAkjZGVmaW5lCUNQVSAiVU5LTk9XTiIKICNlbmRpZgogCi0vKiAoZXMpICovCi0vKiBub3RlOiB3aHkgaXMgdGhpcyBkZWZpbmVkIGhlcmU/ICB0aGUgbXVzdCBiZSBhIGJldHRlciBwbGFjZSB0byBwdXQgdGhpcyAqLwotI2lmIGRlZmluZWQoIENPTkZJR19URUxPUykgfHwgZGVmaW5lZCggQ09ORklHX1VDRElNTSApIHx8IGRlZmluZWQoIENPTkZJR19VQ1NJTU0gKSB8fCBkZWZpbmVkKENPTkZJR19EUkFHRU4yKSB8fCAoZGVmaW5lZCggQ09ORklHX1BJTE9UICkgJiYgZGVmaW5lZCggQ09ORklHX002ODMyOCApKQotI2RlZmluZSBDQVRfUk9NQVJSQVkKLSNlbmRpZgotLyogKC9lcykgKi8KLQogZXh0ZXJuIGludCBfc3RleHQsIF9ldGV4dCwgX3NkYXRhLCBfZWRhdGEsIF9zYnNzLCBfZWJzcywgX2VuZDsKIGV4dGVybiBpbnQgX3JhbXN0YXJ0LCBfcmFtZW5kOwogCkBAIC0xNDgsMTUgKzEyMiw4IEBACiB7CiAJaW50IGJvb3RtYXBfc2l6ZTsKIAotI2lmIGRlZmluZWQoQ0FUX1JPTUFSUkFZKSAmJiBkZWZpbmVkKERFQlVHKQotCWV4dGVybiBpbnQgX19kYXRhX3JvbV9zdGFydDsKLQlleHRlcm4gaW50IF9fZGF0YV9zdGFydDsKLQlpbnQgKnJvbWFycmF5ID0gKGludCAqKSgoaW50KSAmX19kYXRhX3JvbV9zdGFydCArCi0JCQkgICAgICAoaW50KSZfZWRhdGEgLSAoaW50KSZfX2RhdGFfc3RhcnQpOwotI2VuZGlmCi0KIAltZW1vcnlfc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7Ci0JbWVtb3J5X2VuZCA9IF9yYW1lbmQ7IC8qIGJ5IG5vdyB0aGUgc3RhY2sgaXMgcGFydCBvZiB0aGUgaW5pdCB0YXNrICovCisJbWVtb3J5X2VuZCA9IF9yYW1lbmQ7CiAKIAlpbml0X21tLnN0YXJ0X2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9zdGV4dDsKIAlpbml0X21tLmVuZF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CkBAIC0yMjAsMTEgKzE4Nyw3IEBACiAJCShpbnQpICZfc2JzcywgKGludCkgJl9lYnNzKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiS0VSTkVMIC0+IFJPTUZTPTB4JTA2eC0weCUwNnggTUVNPTB4JTA2eC0weCUwNnggIgogCQkiU1RBQ0s9MHglMDZ4LTB4JTA2eFxuIiwKLSNpZmRlZiBDQVRfUk9NQVJSQVkKLQkJKGludCkgcm9tYXJyYXksICgoaW50KSByb21hcnJheSkgKyByb21hcnJheVsyXSwKLSNlbHNlCiAJCShpbnQpICZfZWJzcywgKGludCkgbWVtb3J5X3N0YXJ0LAotI2VuZGlmCiAJCShpbnQpIG1lbW9yeV9zdGFydCwgKGludCkgbWVtb3J5X2VuZCwKIAkJKGludCkgbWVtb3J5X2VuZCwgKGludCkgX3JhbWVuZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKaW5kZXggYmVkNWY0Ny4uZmRlMDRlMSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrbm9tbXUva2VybmVsL3RyYXBzLmMKQEAgLTgzLDYgKzgzLDcgQEAKIAlwcmludGsoS0VSTl9FTUVSRyAiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBQQUdFX1NJWkUrKHVuc2lnbmVkIGxvbmcpY3VycmVudCk7CiAJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9tbS9tZW1vcnkuYyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCmluZGV4IDQxMWU0NTIuLjFhNjZiNzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4a25vbW11L21tL21lbW9yeS5jCkBAIC0xNyw5MCArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyoKLSAqIGNhY2hlX2NsZWFyKCkgc2VtYW50aWNzOiBDbGVhciBhbnkgY2FjaGUgZW50cmllcyBmb3IgdGhlIGFyZWEgaW4gcXVlc3Rpb24sCi0gKiB3aXRob3V0IHdyaXRpbmcgYmFjayBkaXJ0eSBlbnRyaWVzIGZpcnN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgZGF0YSB3aWxsCi0gKiBiZSBvdmVyd3JpdHRlbiBhbnl3YXksIGUuZy4gYnkgRE1BIHRvIG1lbW9yeS4gVGhlIHJhbmdlIGlzIGRlZmluZWQgYnkgYQotICogX3BoeXNpY2FsXyBhZGRyZXNzLgotICovCi0KLXZvaWQgY2FjaGVfY2xlYXIgKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci19Ci0KLQotLyoKLSAqCURlZmluZSBjYWNoZSBpbnZhbGlkYXRlIGZ1bmN0aW9ucy4gVGhlIENvbGRGaXJlIDU0MDcgaXMgcmVhbGx5Ci0gKgl0aGUgb25seSBwcm9jZXNzb3IgdGhhdCBuZWVkcyB0byBkbyBzb21lIHdvcmsgaGVyZS4gQW55dGhpbmcKLSAqCXRoYXQgaGFzIHNlcGFyYXRlIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlcyB3aWxsIGJlIGEgcHJvYmxlbS4KLSAqLwotI2lmZGVmIENPTkZJR19NNTQwNwotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNhY2hlX2ludmFsaWRhdGVfbGluZXModW5zaWduZWQgbG9uZyBwYWRkciwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nCXNzZXQsIGVzZXQ7Ci0KLQlzc2V0ID0gKHBhZGRyICYgMHgwMDAwMGZmMCk7Ci0JZXNldCA9ICgocGFkZHIgKyBsZW4pICYgMHgwMDAwZmYwKSArIDB4MTA7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCSJub3Bcblx0IgotCQkiY2xybAklJWQwXG5cdCIKLQkJIjE6XG5cdCIKLQkJIm1vdmVsCSUwLCUlYTBcblx0IgotCQkiYWRkbAklJWQwLCUlYTBcblx0IgotCQkiMjpcblx0IgotCQkiLndvcmQJMHhmNGU4XG5cdCIKLQkJImFkZGwJIzB4MTAsJSVhMFxuXHQiCi0JCSJjbXBsCSUxLCUlYTBcblx0IgotCQkiYmx0CTJiXG5cdCIKLQkJImFkZHFsCSMxLCUlZDBcblx0IgotCQkiY21waWwJIzQsJSVkMFxuXHQiCi0JCSJibmUJMWIiCi0JCTogOiAiYSIgKHNzZXQpLCAiYSIgKGVzZXQpIDogImQwIiwgImEwIiApOwotfQotCi0jZWxzZQotI2RlZmluZQljYWNoZV9pbnZhbGlkYXRlX2xpbmVzKGEsYikKLSNlbmRpZgotCi0KLS8qCi0gKiBjYWNoZV9wdXNoKCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbiBhcmVhLAotICogYW5kIGludmFsaWRhdGUgdGhlIHJhbmdlIGluIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4gSXQgbmVlZHMgbm90IChidXQgbWF5KQotICogaW52YWxpZGF0ZSB0aG9zZSBlbnRyaWVzIGFsc28gaW4gdGhlIGRhdGEgY2FjaGUuIFRoZSByYW5nZSBpcyBkZWZpbmVkIGJ5IGEKLSAqIF9waHlzaWNhbF8gYWRkcmVzcy4KLSAqLwotCi12b2lkIGNhY2hlX3B1c2ggKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCi17Ci0JY2FjaGVfaW52YWxpZGF0ZV9saW5lcyhwYWRkciwgbGVuKTsKLX0KLQotCi0vKgotICogY2FjaGVfcHVzaF92KCkgc2VtYW50aWNzOiBXcml0ZSBiYWNrIGFueSBkaXJ0eSBjYWNoZSBkYXRhIGluIHRoZSBnaXZlbgotICogYXJlYSwgYW5kIGludmFsaWRhdGUgdGhvc2UgZW50cmllcyBhdCBsZWFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuIFRoaXMKLSAqIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRoYXQgY2FuIGJlIGV4ZWN1dGVkIGFzCi0gKiBjb2RlIGxhdGVyLiBUaGUgcmFuZ2UgaXMgZGVmaW5lZCBieSBhIF91c2VyX21vZGVfIF92aXJ0dWFsXyBhZGRyZXNzICAob3IsCi0gKiBtb3JlIGV4YWN0bHksIHRoZSBzcGFjZSBpcyBkZWZpbmVkIGJ5IHRoZSAlc2ZjLyVkZmMgcmVnaXN0ZXIuKQotICovCi0KLXZvaWQgY2FjaGVfcHVzaF92ICh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgbGVuKQotewotCWNhY2hlX2ludmFsaWRhdGVfbGluZXModmFkZHIsIGxlbik7Ci19Ci0KLS8qIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuIFRoZQotICogY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KKyAqIE1hcCBzb21lIHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2UgaW50byB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UuCisgKiBUaGUgY29kZSBpcyBjb3BpZWQgYW5kIGFkYXB0ZWQgZnJvbSBtYXBfY2h1bmsoKS4KICAqLwogCiB1bnNpZ25lZCBsb25nIGtlcm5lbF9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggYjVhN2I0Ni4uODkzZTdiYyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC0xNzQsMTcgKzE3NCw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzEzLDExICszMDUsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwppbmRleCAzN2M1NjJjLi5jZTI3N2NiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCkBAIC0zMjYsNiArMzI2LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAJcHJpbnRrKCIlc1sjJWRdOlxuIiwgc3RyLCArK2RpZV9jb3VudGVyKTsKIAlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKaW5kZXggYmRhYWMzNC4uODlmMjkyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvc2V0dXAuYwppbmRleCBmNGE2MTY5Li4yZDVjNmQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL3NldHVwLmMKQEAgLTMxLDYgKzMxLDcgQEAKIHVuc2lnbmVkIGludCBzYjFfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfcGFzczsKIHVuc2lnbmVkIGludCBzb2NfdHlwZTsKK0VYUE9SVF9TWU1CT0woc29jX3R5cGUpOwogdW5zaWduZWQgaW50IHBlcmlwaF9yZXY7CiB1bnNpZ25lZCBpbnQgemJidXNfbWh6OwogRVhQT1JUX1NZTUJPTCh6YmJ1c19taHopOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3B0cmFjZS5jCmluZGV4IDhhMGRiMzcuLjI2ZWM3NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTg3LDEwICs4Nyw5IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKIAljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQlpbnQgY29waWVkOwotCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJCWlmIChfX2lzX2NvbXBhdF90YXNrKGNoaWxkKSkgeworCQkJaW50IGNvcGllZDsKIAkJCXVuc2lnbmVkIGludCB0bXA7CiAKIAkJCWFkZHIgJj0gMHhmZmZmZmZmZkw7CkBAIC0xMDUsMTUgKzEwNCw3IEBACiAJCX0KIAkJZWxzZQogI2VuZGlmCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQkJcmV0ID0gLUVJTzsKLQkJCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQkJZ290byBvdXRfdHNrOwotCQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQl9CisJCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0X3RzazsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKaW5kZXggYzNlYzlmMS4uYmJmMDI5YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RyYXBzLmMKQEAgLTI2NCw2ICsyNjQsNyBAQAogCiAJc2hvd19yZWdzKHJlZ3MpOwogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMwMiw3ICszMDMsNyBAQAogCWlmICh1bmxpa2VseShpaXIgPT0gUEFSSVNDX0JVR19CUkVBS19JTlNOICYmICF1c2VyX21vZGUocmVncykpKSB7CiAJCS8qIGNoZWNrIGlmIGEgQlVHKCkgb3IgV0FSTigpIHRyYXBwZWQgaGVyZS4gICovCiAJCWVudW0gYnVnX3RyYXBfdHlwZSB0dDsKLQkJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPmlhb3FbMF0gJiB+Myk7CisJCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5pYW9xWzBdICYgfjMsIHJlZ3MpOwogCQlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5pYW9xWzBdICs9IDQ7CiAJCQlyZWdzLT5pYW9xWzFdICs9IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMKaW5kZXggMzIyMTY3Ny4uY2Y3ODBjYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJCS8qIEhhbmRsZSBzb21lIGZyZXF1ZW50IHNwZWNpYWwgY2FzZXMuLi4uICovCiAJCXsKLQkJCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCQkJY2hhciBzeW1uYW1lW0tTWU1fTkFNRV9MRU5dOwogCQkJY2hhciAqbW9kbmFtZTsKIAogCQkJa2FsbHN5bXNfbG9va3VwKGluZm8tPmlwLCBOVUxMLCBOVUxMLCAmbW9kbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNmJlZWUzMi4uZDg2MGI2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTQsMTcgKzQsNyBAQAogCiBtYWlubWVudSAiTGludXgvUG93ZXJQQyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAotY29uZmlnIFBQQzY0Ci0JYm9vbCAiNjQtYml0IGtlcm5lbCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBzZWxlY3RzIHdoZXRoZXIgYSAzMi1iaXQgb3IgYSA2NC1iaXQga2VybmVsCi0JICB3aWxsIGJlIGJ1aWx0LgotCi1jb25maWcgUFBDX1BNX05FRURTX1JUQ19MSUIKLQlib29sCi0Jc2VsZWN0IFJUQ19MSUIKLQlkZWZhdWx0IHkgaWYgUE0KK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUiCiAKIGNvbmZpZyBQUEMzMgogCWJvb2wKQEAgLTY2LDYgKzU2LDkgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX05PX1ZJUlRfVE9fQlVTCisJZGVmX2Jvb2wgUFBDNjQKKwogY29uZmlnIFBQQwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTEzMiwxMjMgKzEyNSw2IEBACiAJZGVwZW5kcyBvbiBQUEM2NCAmJiAoQlJPS0VOIHx8IChQUENfUE1BQzY0ICYmIEVYUEVSSU1FTlRBTCkpCiAJZGVmYXVsdCB5CiAKLW1lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgotY2hvaWNlCi0JcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKLQlkZXBlbmRzIG9uIFBQQzMyCi0JZGVmYXVsdCA2eHgKLQotY29uZmlnIENMQVNTSUMzMgotCWJvb2wgIjUyeHgvNnh4Lzd4eC83NHh4IgotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IDZ4eAotCWhlbHAKLQkgIFRoZXJlIGFyZSBmb3VyIGZhbWlsaWVzIG9mIFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLiAgVGhlIG1vcmUgY29tbW9uCi0JICB0eXBlcyAoNjAxLCA2MDMsIDYwNCwgNzQwLCA3NTAsIDc0MDApLCB0aGUgTW90b3JvbGEgZW1iZWRkZWQKLQkgIHZlcnNpb25zICg4MjEsIDgyMywgODUwLCA4NTUsIDg2MCwgNTJ4eCwgODJ4eCwgODN4eCksIHRoZSBBTUNDCi0JICBlbWJlZGRlZCB2ZXJzaW9ucyAoNDAzIGFuZCA0MDUpIGFuZCB0aGUgaGlnaCBlbmQgNjQgYml0IFBvd2VyCi0JICBwcm9jZXNzb3JzIChQT1dFUiAzLCBQT1dFUjQsIGFuZCBJQk0gUFBDOTcwIGFsc28ga25vd24gYXMgRzUpLgotCi0JICBUaGlzIG9wdGlvbiBpcyB0aGUgY2F0Y2gtYWxsIGZvciA2eHggdHlwZXMsIGluY2x1ZGluZyBzb21lIG9mIHRoZQotCSAgZW1iZWRkZWQgdmVyc2lvbnMuICBVbmxlc3MgdGhlcmUgaXMgc2VlIGFuIG9wdGlvbiBmb3IgdGhlIHNwZWNpZmljCi0JICBjaGlwIGZhbWlseSB5b3UgYXJlIHVzaW5nLCB5b3Ugd2FudCB0aGlzIG9wdGlvbi4KLQkgIAotCSAgWW91IGRvIG5vdCB3YW50IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSA2NCBiaXQKLQkgIElCTSBSUy82MDAwIG9yIGFuIEFwcGxlIEc1LCBjaG9vc2UgNnh4LgotCSAgCi0JICBJZiB1bnN1cmUsIHNlbGVjdCB0aGlzIG9wdGlvbgotCSAgCi0JICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBydW5zIGluIDMyLWJpdCBtb2RlIGV2ZW4gb24gNjQtYml0IGNoaXBzLgotCi1jb25maWcgUFBDXzgyeHgKLQlib29sICJGcmVlc2NhbGUgODJ4eCIKLQlzZWxlY3QgNnh4Ci0Jc2VsZWN0IFBQQ19GUFUKLQotY29uZmlnIFBQQ184M3h4Ci0JYm9vbCAiRnJlZXNjYWxlIDgzeHgiCi0Jc2VsZWN0IDZ4eAotCXNlbGVjdCBGU0xfU09DCi0Jc2VsZWN0IDgzeHgKLQlzZWxlY3QgUFBDX0ZQVQotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODV4eAotCWJvb2wgIkZyZWVzY2FsZSA4NXh4IgotCXNlbGVjdCBFNTAwCi0Jc2VsZWN0IEZTTF9TT0MKLQlzZWxlY3QgODV4eAotCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCi0KLWNvbmZpZyBQUENfODZ4eAotCWJvb2wgIkZyZWVzY2FsZSA4Nnh4IgotCXNlbGVjdCA2eHgKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCBGU0xfUENJRQotCXNlbGVjdCBQUENfRlBVCi0Jc2VsZWN0IEFMVElWRUMKLQloZWxwCi0JICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCi0KLWNvbmZpZyBQUENfOHh4Ci0JYm9vbCAiRnJlZXNjYWxlIDh4eCIKLQlzZWxlY3QgRlNMX1NPQwotCXNlbGVjdCA4eHgKLQotY29uZmlnIDQweAotCWJvb2wgIkFNQ0MgNDB4IgotCXNlbGVjdCBQUENfRENSX05BVElWRQotCi1jb25maWcgNDR4Ci0JYm9vbCAiQU1DQyA0NHgiCi0Jc2VsZWN0IFBQQ19EQ1JfTkFUSVZFCi0Jc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKLQotY29uZmlnIEUyMDAKLQlib29sICJGcmVlc2NhbGUgZTIwMCIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBQT1dFUjRfT05MWQotCWJvb2wgIk9wdGltaXplIGZvciBQT1dFUjQiCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIENhdXNlIHRoZSBjb21waWxlciB0byBvcHRpbWl6ZSBmb3IgUE9XRVI0L1BPV0VSNS9QUEM5NzAgcHJvY2Vzc29ycy4KLQkgIFRoZSByZXN1bHRpbmcgYmluYXJ5IHdpbGwgbm90IHdvcmsgb24gUE9XRVIzIG9yIFJTNjQgcHJvY2Vzc29ycwotCSAgd2hlbiBjb21waWxlZCB3aXRoIGJpbnV0aWxzIDIuMTUgb3IgbGF0ZXIuCi0KLWNvbmZpZyBQT1dFUjMKLQlib29sCi0JZGVwZW5kcyBvbiBQUEM2NAotCWRlZmF1bHQgeSBpZiAhUE9XRVI0X09OTFkKLQotY29uZmlnIFBPV0VSNAotCWRlcGVuZHMgb24gUFBDNjQKLQlkZWZfYm9vbCB5Ci0KLWNvbmZpZyA2eHgKLQlib29sCi0KLSMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYwotY29uZmlnIDh4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODN4eAotCWJvb2wKLQotIyB0aGlzIGlzIHRlbXAgdG8gaGFuZGxlIGNvbXBhdCB3aXRoIGFyY2g9cHBjCi1jb25maWcgODV4eAotCWJvb2wKLQotY29uZmlnIEU1MDAKLQlib29sCi0KLWNvbmZpZyBQUENfRlBVCi0JYm9vbAotCWRlZmF1bHQgeSBpZiBQUEM2NAotCiBjb25maWcgUFBDX0RDUl9OQVRJVkUKIAlib29sCiAJZGVmYXVsdCBuCkBAIC0yNjcsMTM0ICsxNDMsNiBAQAogCWRlcGVuZHMgb24gUFBDNjQgIyBub3Qgc3VwcG9ydGVkIG9uIDMyIGJpdHMgeWV0CiAJZGVmYXVsdCBuCiAKLWNvbmZpZyA0eHgKLQlib29sCi0JZGVwZW5kcyBvbiA0MHggfHwgNDR4Ci0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBCT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMCB8fCA0NHgKLQlkZWZhdWx0IHkKLQotY29uZmlnIEZTTF9CT09LRQotCWJvb2wKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCi1jb25maWcgUFRFXzY0QklUCi0JYm9vbAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlkZWZhdWx0IHkgaWYgNDR4Ci0JZGVmYXVsdCB5IGlmIEU1MDAgJiYgUEhZU182NEJJVAotCi1jb25maWcgUEhZU182NEJJVAotCWJvb2wgJ0xhcmdlIHBoeXNpY2FsIGFkZHJlc3Mgc3VwcG9ydCcgaWYgRTUwMAotCWRlcGVuZHMgb24gNDR4IHx8IEU1MDAKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUCi0JZGVmYXVsdCB5IGlmIDQ0eAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIGxhcmdlciB0aGFuIDMyLWJpdCBwaHlzaWNhbAotCSAgYWRkcmVzc2VzLiAgVGhpcyBmZWF0dXJlcyBpcyBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBlNTAwIGNvcmVzLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IE4gaGVyZS4KLQotY29uZmlnIEFMVElWRUMKLQlib29sICJBbHRpVmVjIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDTEFTU0lDMzIgfHwgUE9XRVI0Ci0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIEFsdGl2ZWMgZXh0ZW5zaW9ucyB0byB0aGUKLQkgIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseSBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZwotCSAgYWx0aXZlYyByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZSAnYWx0aXZlYyBlbmFibGUnIGJpdCBzbyB1c2VyCi0JICBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgYWx0aXZlYyBpbnN0cnVjdGlvbnMuCi0KLQkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgYWx0aXZlYyAoRzQsIG90aGVyd2lzZSBrbm93biBhcyA3NHh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlCi0JICBhbnkgYWZmZWN0IG9uIGEgbm9uLWFsdGl2ZWMgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZQotCSAga2VybmVsKS4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTUEUKLQlib29sICJTUEUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMga2VybmVsIHN1cHBvcnQgZm9yIHRoZSBTaWduYWwgUHJvY2Vzc2luZwotCSAgRXh0ZW5zaW9ucyAoU1BFKSB0byB0aGUgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5Ci0JICBzdXBwb3J0cyBzYXZpbmcgYW5kIHJlc3RvcmluZyBTUEUgcmVnaXN0ZXJzLCBhbmQgdHVybmluZyBvbiB0aGUKLQkgICdzcGUgZW5hYmxlJyBiaXQgc28gdXNlciBwcm9jZXNzZXMgY2FuIGV4ZWN1dGUgU1BFIGluc3RydWN0aW9ucy4KLQotCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwotCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKLQkgIGVmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KLQotY29uZmlnIFBQQ19TVERfTU1VCi0JYm9vbAotCWRlcGVuZHMgb24gNnh4IHx8IFBPV0VSMyB8fCBQT1dFUjQgfHwgUFBDNjQKLQlkZWZhdWx0IHkKLQotY29uZmlnIFBQQ19TVERfTU1VXzMyCi0JZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUFBDX1NURF9NTVUgJiYgUFBDMzIKLQotY29uZmlnIFBQQ19NTV9TTElDRVMKLQlib29sCi0JZGVmYXVsdCB5IGlmIEhVR0VUTEJfUEFHRQotCWRlZmF1bHQgbgotCi1jb25maWcgVklSVF9DUFVfQUNDT1VOVElORwotCWJvb2wgIkRldGVybWluaXN0aWMgdGFzayBhbmQgQ1BVIHRpbWUgYWNjb3VudGluZyIKLQlkZXBlbmRzIG9uIFBQQzY0Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBtb3JlIGFjY3VyYXRlIHRhc2sgYW5kIENQVSB0aW1lCi0JICBhY2NvdW50aW5nLiAgVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgYSBDUFUgY291bnRlciBvbiBlYWNoCi0JICBrZXJuZWwgZW50cnkgYW5kIGV4aXQgYW5kIG9uIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUga2VybmVsCi0JICBiZXR3ZWVuIHN5c3RlbSwgc29mdGlycSBhbmQgaGFyZGlycSBzdGF0ZSwgc28gdGhlcmUgaXMgYQotCSAgc21hbGwgcGVyZm9ybWFuY2UgaW1wYWN0LiAgVGhpcyBhbHNvIGVuYWJsZXMgYWNjb3VudGluZyBvZgotCSAgc3RvbGVuIHRpbWUgb24gbG9naWNhbGx5LXBhcnRpdGlvbmVkIHN5c3RlbXMgcnVubmluZyBvbgotCSAgSUJNIFBPV0VSNS1iYXNlZCBtYWNoaW5lcy4KLQotCSAgSWYgaW4gZG91YnQsIHNheSBZIGhlcmUuCi0KLWNvbmZpZyBTTVAKLQlkZXBlbmRzIG9uIFBQQ19TVERfTU1VCi0JYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQotCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIHNheSBOLiBJZiB5b3UgaGF2ZSBhIHN5c3RlbSB3aXRoIG1vcmUKLQkgIHRoYW4gb25lIENQVSwgc2F5IFkuICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBjdXJyZW50bHkKLQkgIHN1cHBvcnQgU01QIG1hY2hpbmVzIHdpdGggNjAzLzYwM2UvNjAzZXYgb3IgUFBDNzUwICgiRzMiKSBwcm9jZXNzb3JzCi0JICBzaW5jZSB0aGV5IGhhdmUgaW5hZGVxdWF0ZSBoYXJkd2FyZSBzdXBwb3J0IGZvciBtdWx0aXByb2Nlc3NvcgotCSAgb3BlcmF0aW9uLgotCi0JICBJZiB5b3Ugc2F5IE4gaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUgYW5kIG11bHRpcHJvY2Vzc29yCi0JICBtYWNoaW5lcywgYnV0IHdpbGwgdXNlIG9ubHkgb25lIENQVSBvZiBhIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuIElmCi0JICB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBvbiBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmVzLgotCSAgT24gYSBzaW5nbGUtcHJvY2Vzc29yIG1hY2hpbmUsIHRoZSBrZXJuZWwgd2lsbCBydW4gZmFzdGVyIGlmIHlvdSBzYXkKLQkgIE4gaGVyZS4KLQotCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KLQotY29uZmlnIE5SX0NQVVMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMTI4KSIKLQlyYW5nZSAyIDEyOAotCWRlcGVuZHMgb24gU01QCi0JZGVmYXVsdCAiMzIiIGlmIFBQQzY0Ci0JZGVmYXVsdCAiNCIKLQotY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQotCWJvb2wKLQlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAotCWRlZmF1bHQgeQotCi1jb25maWcgQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWQotCWJvb2wKLWVuZG1lbnUKLQogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIgpAQCAtNjc0LDEwICs0MjIsNiBAQAogY29uZmlnIEZTTF9TT0MKIAlib29sCiAKLWNvbmZpZyBGU0xfUENJRQotCWJvb2wKLQlkZXBlbmRzIG9uIFBQQ184Nnh4Ci0KICMgWWVzIE1DQSBSUy82MDAwcyBleGlzdCBidXQgTGludXgtUFBDIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFueQogY29uZmlnIE1DQQogCWJvb2wKQEAgLTY4NSwxMCArNDI5LDEwIEBACiBjb25maWcgUENJCiAJYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IFBQQ184NXh4IHx8IFBQQ184Nnh4IFwKIAkJfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIChQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUykpIFwKLQkJfHwgTVBDNzQ0OEhQQzIgfHwgUFBDX1BTMyB8fCBQUENfSE9MTFkKLQlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICFQUENfODN4eCBcCisJCXx8IFBQQ19QUzMKKwlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFQUENfODN4eCBcCiAJCSYmICFQUENfODV4eCAmJiAhUFBDXzg2eHgKLQlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHggJiYgQVBVUworCWRlZmF1bHQgUENJX1BFUk1FRElBIGlmICE0eHggJiYgIUNQTTIgJiYgITh4eAogCWRlZmF1bHQgUENJX1FTUEFOIGlmICE0eHggJiYgIUNQTTIgJiYgOHh4CiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNJCiAJaGVscApAQCAtODk2LDggKzY0MCw4IEBACiBzb3VyY2UgImFyY2gvcG93ZXJwYy9vcHJvZmlsZS9LY29uZmlnIgogCiBjb25maWcgS1BST0JFUwotCWJvb2wgIktwcm9iZXMgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBFWFBFUklNRU5UQUwgJiYgTU9EVUxFUworCWJvb2wgIktwcm9iZXMiCisJZGVwZW5kcyBvbiAhQk9PS0UgJiYgITR4eCAmJiBLQUxMU1lNUyAmJiBNT0RVTEVTCiAJaGVscAogCSAgS3Byb2JlcyBhbGxvd3MgeW91IHRvIHRyYXAgYXQgYWxtb3N0IGFueSBrZXJuZWwgYWRkcmVzcyBhbmQKIAkgIGV4ZWN1dGUgYSBjYWxsYmFjayBmdW5jdGlvbi4gIHJlZ2lzdGVyX2twcm9iZSgpIGVzdGFibGlzaGVzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggZmJhZmQ5Ni4uMTg3YTM5YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIENQUEZMQUdTX3ZtbGludXgubGRzCTo9IC1VcG93ZXJwYwogCi1CT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB6SW1hZ2UuZHRzIHpJbWFnZS5kdHNfaW5pdHJkIHVJbWFnZQorQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgdUltYWdlCiAKIFBIT05ZICs9ICQoQk9PVF9UQVJHRVRTKQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguYyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCmluZGV4IGQ1MTM3N2QuLjlmNjRlODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290LzQ0eC5jCkBAIC0zOCwzICszOCw0OCBAQAogCiAJZHRfZml4dXBfbWVtb3J5KDAsIG1lbXNpemUpOwogfQorCisjZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0CisjZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWFzbSB2b2xhdGlsZSAoCisJCSJtZnNwcgklMCwlMVxuIgorCQkib3JpcwklMCwlMCwlMkBoXG4iCisJCSJtdHNwcgklMSwlMCIKKwkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKKwkJKTsKKworfQorCisvKiBSZWFkIDR4eCBFQkMgYnVzIGJyaWRnZSByZWdpc3RlcnMgdG8gZ2V0IG1hcHBpbmdzIG9mIHRoZSBwZXJpcGhlcmFsCisgKiBiYW5rcyBpbnRvIHRoZSBPUEIgYWRkcmVzcyBzcGFjZSAqLwordm9pZCBpYm00eHhfZml4dXBfZWJjX3Jhbmdlcyhjb25zdCBjaGFyICplYmMpCit7CisJdm9pZCAqZGV2cDsKKwl1MzIgYnhjcjsKKwl1MzIgcmFuZ2VzW0VCQ19OVU1fQkFOS1MqNF07CisJdTMyICpwID0gcmFuZ2VzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVCQ19OVU1fQkFOS1M7IGkrKykgeworCQltdGRjcihEQ1JOX0VCQzBfQ0ZHQUREUiwgRUJDX0JYQ1IoaSkpOworCQlieGNyID0gbWZkY3IoRENSTl9FQkMwX0NGR0RBVEEpOworCisJCWlmICgoYnhjciAmIEVCQ19CWENSX0JVKSAhPSBFQkNfQlhDUl9CVV9PRkYpIHsKKwkJCSpwKysgPSBpOworCQkJKnArKyA9IDA7CisJCQkqcCsrID0gYnhjciAmIEVCQ19CWENSX0JBUzsKKwkJCSpwKysgPSBFQkNfQlhDUl9CQU5LX1NJWkUoYnhjcik7CisJCX0KKwl9CisKKwlkZXZwID0gZmluZGRldmljZShlYmMpOworCWlmICghIGRldnApCisJCWZhdGFsKCJDb3VsZG4ndCBsb2NhdGUgRUJDIG5vZGUgJXNcblxyIiwgZWJjKTsKKworCXNldHByb3AoZGV2cCwgInJhbmdlcyIsIHJhbmdlcywgKHAgLSByYW5nZXMpICogc2l6ZW9mKHUzMikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvNDR4LmggYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAppbmRleCA3YjEyOWFkLi41Nzc5ODJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC80NHguaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC80NHguaApAQCAtMTEsNiArMTEsOSBAQAogI2RlZmluZSBfUFBDX0JPT1RfNDRYX0hfCiAKIHZvaWQgaWJtNDR4X2ZpeHVwX21lbXNpemUodm9pZCk7Cit2b2lkIGlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKGNvbnN0IGNoYXIgKmViYyk7CisKK3ZvaWQgaWJtNDR4X2RiY3JfcmVzZXQodm9pZCk7CiB2b2lkIGVib255X2luaXQodm9pZCAqbWFjMCwgdm9pZCAqbWFjMSk7CiAKICNlbmRpZiAvKiBfUFBDX0JPT1RfNDRYX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IGZmMjcwMTkuLjYxYTZmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC00MywxMCArNDMsMTEgQEAKIAogc3JjLXdsaWIgOj0gc3RyaW5nLlMgY3J0MC5TIHN0ZGlvLmMgbWFpbi5jIGZsYXRkZXZ0cmVlLmMgZmxhdGRldnRyZWVfbWlzYy5jIFwKIAkJbnMxNjU1MC5jIHNlcmlhbC5jIHNpbXBsZV9hbGxvYy5jIGRpdjY0LlMgdXRpbC5TIFwKLQkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIFwKLQkJNDR4LmMgZWJvbnkuYyBtdjY0eDYwLmMgbXBzYy5jIG12NjR4NjBfaTJjLmMKKwkJZ3VuemlwX3V0aWwuYyBlbGZfdXRpbC5jICQoemxpYikgZGV2dHJlZS5jIG9mbGliLmMgb2Zjb25zb2xlLmMgXAorCQk0NHguYyBlYm9ueS5jIG12NjR4NjAuYyBtcHNjLmMgbXY2NHg2MF9pMmMuYyBjdWJvb3QuYwogc3JjLXBsYXQgOj0gb2YuYyBjdWJvb3QtODN4eC5jIGN1Ym9vdC04NXh4LmMgaG9sbHkuYyBcCi0JCWN1Ym9vdC1lYm9ueS5jIHRyZWVib290LWVib255LmMgcHJwbWMyODAwLmMKKwkJY3Vib290LWVib255LmMgdHJlZWJvb3QtZWJvbnkuYyBwcnBtYzI4MDAuYyBcCisJCXBzMy1oZWFkLlMgcHMzLWh2Y2FsbC5TIHBzMy5jCiBzcmMtYm9vdCA6PSAkKHNyYy13bGliKSAkKHNyYy1wbGF0KSBlbXB0eS5jCiAKIHNyYy1ib290IDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLWJvb3QpKQpAQCAtNzUsMTEgKzc2LDExIEBACiAkKG9iaikvZW1wdHkuYzoKIAlAdG91Y2ggJEAKIAotJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkczogJChvYmopLyU6ICQoc3JjdHJlZSkvJChzcmMpLyUuUworJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHM6ICQob2JqKS8lOiAkKHNyY3RyZWUpLyQoc3JjKS8lLlMKIAlAY3AgJDwgJEAKIAogY2xlYW4tZmlsZXMgOj0gJCh6bGliKSAkKHpsaWJoZWFkZXIpICQoemxpYmxpbnV4aGVhZGVyKSBcCi0JCWVtcHR5LmMgekltYWdlLmNvZmYubGRzIHpJbWFnZS5sZHMKKwkJZW1wdHkuYyB6SW1hZ2UgekltYWdlLmNvZmYubGRzIHpJbWFnZS5wczMubGRzIHpJbWFnZS5sZHMKIAogcXVpZXRfY21kX2Jvb3RjYyA9IEJPT1RDQyAgJEAKICAgICAgIGNtZF9ib290Y2MgPSAkKENST1NTMzJDQykgLVdwLC1NRCwkKGRlcGZpbGUpICQoQk9PVENGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiB0YXJnZXRzCQkrPSAkKHBhdHN1YnN0ICQob2JqKS8lLCUsJChvYmotYm9vdCkgd3JhcHBlci5hKQogZXh0cmEteQkJOj0gJChvYmopL3dyYXBwZXIuYSAkKG9iai1wbGF0KSAkKG9iaikvZW1wdHkubyBcCi0JCSAgICQob2JqKS96SW1hZ2UubGRzICQob2JqKS96SW1hZ2UuY29mZi5sZHMKKwkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHMKIAogd3JhcHBlcgkJOj0kKHNyY3RyZWUpLyQoc3JjKS93cmFwcGVyCiB3cmFwcGVyYml0cwk6PSAkKGV4dHJhLXkpICQoYWRkcHJlZml4ICQob2JqKS8sYWRkbm90ZSBoYWNrLWNvZmYgbWt0cmVlKSBcCkBAIC0xMzIsNyArMTMzLDcgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gekltYWdlLmNocnAKIGltYWdlLSQoQ09ORklHX1BQQ19FRklLQSkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJCSs9IHpJbWFnZS5wbWFjCi1pbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHktZWxmCitpbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHkKIGltYWdlLSQoQ09ORklHX1BQQ19QUlBNQzI4MDApCQkrPSB6SW1hZ2UucHJwbWMyODAwCiBpbWFnZS0kKENPTkZJR19QUENfSVNFUklFUykJCSs9IHpJbWFnZS5pc2VyaWVzCiBpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkJCSs9IHVJbWFnZQpAQCAtMTU3LDU1ICsxNTgsNDMgQEAKIAogJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negogCi1kdHMtICA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHMlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0cy15IDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0cyUsICQoaW1hZ2UteSkpCi1kdHMteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHMteSkpCi10YXJnZXRzCSs9ICQoaW1hZ2UteSkgJChkdHMteSkKLQotZHRzX2luaXRyZC0gIDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0c19pbml0cmQlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKLWR0c19pbml0cmQteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHNfaW5pdHJkJSwgJChpbWFnZS15KSkKLWR0c19pbml0cmQteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHNfaW5pdHJkLXkpKQotdGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoZHRzX2luaXRyZC15KQotCi0kKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negorIyBJZiBDT05GSUdfV0FOVF9ERVZJQ0VfVFJFRSBpcyBzZXQgYW5kIENPTkZJR19ERVZJQ0VfVFJFRSBpc24ndCBhbgorIyBlbXB0eSBzdHJpbmcsIGRlZmluZSAnZHRzJyB0byBiZSBwYXRoIHRvIHRoZSBkdHMKKyMgQ09ORklHX0RFVklDRV9UUkVFIHdpbGwgaGF2ZSAiIiBhcm91bmQgaXQsIG1ha2Ugc3VyZSB0byBzdHJpcCB0aGVtCitpZmVxICgkKENPTkZJR19XQU5UX0RFVklDRV9UUkVFKSx5KQoraWZuZXEgKCQoQ09ORklHX0RFVklDRV9UUkVFKSwiIikKK2R0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAorCSwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFOiIlIj0lKQorZW5kaWYKK2VuZGlmCiAKICMgRG9uJ3QgcHV0IHRoZSByYW1kaXNrIG9uIHRoZSBwYXR0ZXJuIHJ1bGU7IHdoZW4gaXRzIG1pc3NpbmcgbWFrZSB3aWxsIHRyeQogIyB0aGUgcGF0dGVybiBydWxlIHdpdGggbGVzcyBkZXBlbmRlbmNpZXMgdGhhdCBhbHNvIG1hdGNoZXMgKGV2ZW4gd2l0aCB0aGUKICMgaGFyZCBkZXBlbmRlbmN5IGxpc3RlZCkuCi0kKG9iaikvekltYWdlLmR0c19pbml0cmQuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykgJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKKyQob2JqKS96SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChkdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwkKGR0cyksLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCi0kKG9iaikvekltYWdlLmR0cy4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQorJChvYmopL3pJbWFnZS4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpKQogCi0kKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQotCi0kKG9iaikvekltYWdlLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqKQorIyBUaGlzIGNhbm5vdCBiZSBpbiB0aGUgcm9vdCBvZiAkKHNyYykgYXMgdGhlIHpJbWFnZSBydWxlIGFsd2F5cyBhZGRzIGEgJChvYmopCisjIHByZWZpeAorJChvYmopL3ZtbGludXguc3RyaXA6IHZtbGludXgKKwkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCiAkKG9iaikvekltYWdlLmlzZXJpZXM6IHZtbGludXgKIAkkKFNUUklQKSAtcyAtUiAuY29tbWVudCAkPCAtbyAkQAogCi0kKG9iaikvekltYWdlLnBzMzogdm1saW51eAotCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACiskKG9iaikvekltYWdlLnBzMzogdm1saW51eCAgJCh3cmFwcGVyKSAkKHdyYXBwZXJiaXRzKSAkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cworCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vIHZtbGludXguc3RyaXAKKwkkKGNhbGwgY21kLHdyYXAscHMzLCQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzLCwpCiAKLSQob2JqKS96SW1hZ2UuaW5pdHJkLnBzMzogdm1saW51eAotCUBlY2hvICIgIFdBUk5JTkcgekltYWdlLmluaXRyZC5wczMgbm90IHN1cHBvcnRlZCAoeWV0KSIKLQotJChvYmopL3pJbWFnZS5ob2xseS1lbGY6IHZtbGludXggJCh3cmFwcGVyYml0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLGhvbGx5LCQob2JqKS9kdHMvaG9sbHkuZHRzLCwpCi0KLSQob2JqKS96SW1hZ2UuaW5pdHJkLmhvbGx5LWVsZjogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKG9iaikvcmFtZGlzay5pbWFnZS5negotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsaG9sbHksJChvYmopL2R0cy9ob2xseS5kdHMsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQorJChvYmopL3pJbWFnZS5pbml0cmQucHMzOiB2bWxpbnV4ICAkKHdyYXBwZXIpICQod3JhcHBlcmJpdHMpICQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzICQob2JqKS9yYW1kaXNrLmltYWdlLmd6CisJJChjYWxsIGNtZCx3cmFwLHBzMywkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cywsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCiAKICQob2JqKS91SW1hZ2U6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHVib290KQogCi0jIENPTkZJR19ERVZJQ0VfVFJFRSB3aWxsIGhhdmUgIiIgYXJvdW5kIGl0LCBtYWtlIHN1cmUgdG8gc3RyaXAgdGhlbQotZHRzID0gJChpZiAkKHNoZWxsIGVjaG8gJChDT05GSUdfREVWSUNFX1RSRUUpIHwgZ3JlcCAnXi8nKSxcCi0JLCQoc3JjdHJlZSkvJChzcmMpL2R0cy8pJChDT05GSUdfREVWSUNFX1RSRUU6IiUiPSUpCi0KICQob2JqKS9jdUltYWdlLiU6IHZtbGludXggJChkdHMpICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCxjdWJvb3QtJCosJChkdHMpKQogCkBAIC0yMTUsMjIgKzIwNCwyMiBAQAogJChvYmopL3RyZWVJbWFnZS4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQogCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHMpKQogCisjIElmIHRoZXJlIGlzbid0IGEgcGxhdGZvcm0gc2VsZWN0ZWQgdGhlbiBqdXN0IHN0cmlwIHRoZSB2bWxpbnV4LgoraWZlcSAoLCQoaW1hZ2UteSkpCitpbWFnZS15IDo9IHZtbGludXguc3RyaXAKK2VuZGlmCisKICQob2JqKS96SW1hZ2U6CQkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCUBybSAtZiAkQDsgbG4gJDwgJEAKICQob2JqKS96SW1hZ2UuaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGluaXRyZC15KSkKIAlAcm0gLWYgJEA7IGxuICQ8ICRACi0kKG9iaikvekltYWdlLmR0czoJJChhZGRwcmVmaXggJChvYmopLywgJChkdHMteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAotCiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCi1jbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSB6SW1hZ2UgekltYWdlLmluaXRyZCBjdUltYWdlLiogXAotCXRyZWVJbWFnZS4qIHpJbWFnZS5kdHMgekltYWdlLmR0c19pbml0cmQKK2NsZWFuLWZpbGVzICs9ICQoaW1hZ2UtKSAkKGluaXRyZC0pIHpJbWFnZSB6SW1hZ2UuaW5pdHJkIGN1SW1hZ2UuKiB0cmVlSW1hZ2UuKiBcCisJb3RoZXJvcy5ibGQKIAogIyBjbGVhbiB1cCBmaWxlcyBjYWNoZWQgYnkgd3JhcHBlcgogY2xlYW4ta2VybmVsIDo9IHZtbGludXguc3RyaXAgdm1saW51eC5iaW4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jCmluZGV4IDlhZjU1NGUuLjI5NjAyNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAKICNpbmNsdWRlICJvcHMuaCIKICNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgImN1Ym9vdC5oIgogCiAjZGVmaW5lIFRBUkdFVF84M3h4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKIGV4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKIAogc3RhdGljIHZvaWQgcGxhdGZvcm1fZml4dXBzKHZvaWQpCkBAIC01MiwxNiArNTIsNyBAQAogdm9pZCBwbGF0Zm9ybV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNykKIHsKLQl1bnNpZ25lZCBsb25nIGVuZF9vZl9yYW0gPSBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemU7Ci0JdW5zaWduZWQgbG9uZyBhdmFpbF9yYW0gPSBlbmRfb2ZfcmFtIC0gKHVuc2lnbmVkIGxvbmcpX2VuZDsKLQotCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOwotCWxvYWRlcl9pbmZvLmluaXRyZF9hZGRyID0gcjQ7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSAtIDEwMjQqMTAyNCwgMzIsIDY0KTsKKwlDVUJPT1RfSU5JVCgpOwogCWZ0X2luaXQoX2R0Yl9zdGFydCwgX2R0Yl9lbmQgLSBfZHRiX3N0YXJ0LCAzMik7CiAJc2VyaWFsX2NvbnNvbGVfaW5pdCgpOwogCXBsYXRmb3JtX29wcy5maXh1cHMgPSBwbGF0Zm9ybV9maXh1cHM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYwppbmRleCBlMjU2MDMxLi4xMGYwZjY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMKQEAgLTEyLDEyICsxMiwxMiBAQAogCiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfODV4eAogI2luY2x1ZGUgInBwY2Jvb3QuaCIKIAogc3RhdGljIGJkX3QgYmQ7Ci1leHRlcm4gY2hhciBfZW5kW107CiBleHRlcm4gY2hhciBfZHRiX3N0YXJ0W10sIF9kdGJfZW5kW107CiAKIHN0YXRpYyB2b2lkIHBsYXRmb3JtX2ZpeHVwcyh2b2lkKQpAQCAtNTMsMTYgKzUzLDcgQEAKIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCiB7Ci0JdW5zaWduZWQgbG9uZyBlbmRfb2ZfcmFtID0gYmQuYmlfbWVtc3RhcnQgKyBiZC5iaV9tZW1zaXplOwotCXVuc2lnbmVkIGxvbmcgYXZhaWxfcmFtID0gZW5kX29mX3JhbSAtICh1bnNpZ25lZCBsb25nKV9lbmQ7Ci0KLQltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKLQlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSAtIHI0IDogMDsKLQlsb2FkZXJfaW5mby5jbWRsaW5lID0gKGNoYXIgKilyNjsKLQlsb2FkZXJfaW5mby5jbWRsaW5lX2xlbiA9IHI3IC0gcjY7Ci0KLQlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBhdmFpbF9yYW0gLSAxMDI0KjEwMjQsIDMyLCA2NCk7CisJQ1VCT09UX0lOSVQoKTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwogCXNlcmlhbF9jb25zb2xlX2luaXQoKTsKIAlwbGF0Zm9ybV9vcHMuZml4dXBzID0gcGxhdGZvcm1fZml4dXBzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWVib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwppbmRleCA0NDY0YzVmLi5jNWYzN2NlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtZWJvbnkuYwpAQCAtMTUsMjggKzE1LDE2IEBACiAjaW5jbHVkZSAib3BzLmgiCiAjaW5jbHVkZSAic3RkaW8uaCIKICNpbmNsdWRlICI0NHguaCIKKyNpbmNsdWRlICJjdWJvb3QuaCIKIAogI2RlZmluZSBUQVJHRVRfNDR4CiAjaW5jbHVkZSAicHBjYm9vdC5oIgogCiBzdGF0aWMgYmRfdCBiZDsKLWV4dGVybiBjaGFyIF9lbmRbXTsKLQotQlNTX1NUQUNLKDQwOTYpOwogCiB2b2lkIHBsYXRmb3JtX2luaXQodW5zaWduZWQgbG9uZyByMywgdW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3KQogewotCXVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSA9IGJkLmJpX21lbXN0YXJ0ICsgYmQuYmlfbWVtc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOwotCi0JbWVtY3B5KCZiZCwgKGJkX3QgKilyMywgc2l6ZW9mKGJkKSk7Ci0JbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKLQlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgOiAwOwotCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwotCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKLQotCXNpbXBsZV9hbGxvY19pbml0KF9lbmQsIGF2YWlsX3JhbSwgMzIsIDY0KTsKLQorCUNVQk9PVF9JTklUKCk7CiAJZWJvbnlfaW5pdCgmYmQuYmlfZW5ldGFkZHIsICZiZC5iaV9lbmV0MWFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc5NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvbXBhdGliaWxpdHkgZm9yIG9sZCAobm90IGRldmljZSB0cmVlIGF3YXJlKSBVLUJvb3QgdmVyc2lvbnMKKyAqCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPgorICogQ29uc29saWRhdGVkIHVzaW5nIG1hY3JvcyBieSBEYXZpZCBHaWJzb24gPGRhdmlkQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoYykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisKKyNpbmNsdWRlICJwcGNib290LmgiCisKK2V4dGVybiBjaGFyIF9lbmRbXTsKK2V4dGVybiBjaGFyIF9kdGJfc3RhcnRbXSwgX2R0Yl9lbmRbXTsKKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOworCisJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSByNDsKKwlsb2FkZXJfaW5mby5pbml0cmRfc2l6ZSA9IHI0ID8gcjUgLSByNCA6IDA7CisJbG9hZGVyX2luZm8uY21kbGluZSA9IChjaGFyICopcjY7CisJbG9hZGVyX2luZm8uY21kbGluZV9sZW4gPSByNyAtIHI2OworCisJc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtIC0gMTAyNCoxMDI0LCAzMiwgNjQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmggYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDJhYTdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfUFBDX0JPT1RfQ1VCT09UX0hfCisjZGVmaW5lIF9QUENfQk9PVF9DVUJPT1RfSF8KKwordm9pZCBjdWJvb3RfaW5pdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJIHVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSk7CisKKyNkZWZpbmUgQ1VCT09UX0lOSVQoKSBcCisJZG8geyBcCisJCW1lbWNweSgmYmQsIChiZF90ICopcjMsIHNpemVvZihiZCkpOyBcCisJCWN1Ym9vdF9pbml0KHI0LCByNSwgcjYsIHI3LCBiZC5iaV9tZW1zdGFydCArIGJkLmJpX21lbXNpemUpOyBcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9QUENfQk9PVF9DVUJPT1RfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKaW5kZXggODc3YmM5Ny4uMTRiNDRhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKQEAgLTI2LDYgKzI2LDQzIEBACiAjZGVmaW5lCQkJU0RSQU1fQ09ORklHX0JBTktfU0laRShyZWcpCVwKIAkoMHgwMDQwMDAwMCA8PCAoKHJlZyAmIFNEUkFNX0NPTkZJR19TSVpFX01BU0spID4+IDE3KSkKIAorLyogNDQwR1AgRXh0ZXJuYWwgQnVzIENvbnRyb2xsZXIgKEVCQykgKi8KKyNkZWZpbmUgRENSTl9FQkMwX0NGR0FERFIJCQkJMHgwMTIKKyNkZWZpbmUgRENSTl9FQkMwX0NGR0RBVEEJCQkJMHgwMTMKKyNkZWZpbmUgICBFQkNfTlVNX0JBTktTCQkJCQkgIDgKKyNkZWZpbmUgICBFQkNfQjBDUgkJCQkJICAweDAwCisjZGVmaW5lICAgRUJDX0IxQ1IJCQkJCSAgMHgwMQorI2RlZmluZSAgIEVCQ19CMkNSCQkJCQkgIDB4MDIKKyNkZWZpbmUgICBFQkNfQjNDUgkJCQkJICAweDAzCisjZGVmaW5lICAgRUJDX0I0Q1IJCQkJCSAgMHgwNAorI2RlZmluZSAgIEVCQ19CNUNSCQkJCQkgIDB4MDUKKyNkZWZpbmUgICBFQkNfQjZDUgkJCQkJICAweDA2CisjZGVmaW5lICAgRUJDX0I3Q1IJCQkJCSAgMHgwNworI2RlZmluZSAgIEVCQ19CWENSKG4pCQkJCQkgIChuKQorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFTCQkJCSAgICAweGZmZjAwMDAwCisjZGVmaW5lCSAgICBFQkNfQlhDUl9CUwkJCQkgIAkgICAgMHgwMDBlMDAwMAorI2RlZmluZQkgICAgRUJDX0JYQ1JfQkFOS19TSVpFKHJlZykgXAorCSgweDEwMDAwMCA8PCAoKChyZWcpICYgRUJDX0JYQ1JfQlMpID4+IDE3KSkKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JVCQkJCSAgCSAgICAweDAwMDE4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX09GRgkJCSAgCSAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICAgICAgRUJDX0JYQ1JfQlVfUk8JCQkgIAkgICAgICAweDAwMDA4MDAwCisjZGVmaW5lCSAgICAgIEVCQ19CWENSX0JVX1dPCQkJICAJICAgICAgMHgwMDAxMDAwMAorI2RlZmluZQkgICAgICBFQkNfQlhDUl9CVV9SVwkJCSAgCSAgICAgIDB4MDAwMTgwMDAKKyNkZWZpbmUJICAgIEVCQ19CWENSX0JXCQkJCSAgCSAgICAweDAwMDA2MDAwCisjZGVmaW5lICAgRUJDX0IwQVAJCQkJCSAgMHgxMAorI2RlZmluZSAgIEVCQ19CMUFQCQkJCQkgIDB4MTEKKyNkZWZpbmUgICBFQkNfQjJBUAkJCQkJICAweDEyCisjZGVmaW5lICAgRUJDX0IzQVAJCQkJCSAgMHgxMworI2RlZmluZSAgIEVCQ19CNEFQCQkJCQkgIDB4MTQKKyNkZWZpbmUgICBFQkNfQjVBUAkJCQkJICAweDE1CisjZGVmaW5lICAgRUJDX0I2QVAJCQkJCSAgMHgxNgorI2RlZmluZSAgIEVCQ19CN0FQCQkJCQkgIDB4MTcKKyNkZWZpbmUgICBFQkNfQlhBUChuKQkJCQkJICAoMHgxMCsobikpCisjZGVmaW5lICAgRUJDX0JFQVIJCQkJCSAgMHgyMAorI2RlZmluZSAgIEVCQ19CRVNSCQkJCQkgIDB4MjEKKyNkZWZpbmUgICBFQkNfQ0ZHCQkJCQkgIDB4MjMKKyNkZWZpbmUgICBFQkNfQ0lECQkJCQkgIDB4MjQKKwogLyogNDQwR1AgQ2xvY2ssIFBNLCBjaGlwIGNvbnRyb2wgKi8KICNkZWZpbmUgRENSTl9DUEMwX1NSCQkJCQkweDBiMAogI2RlZmluZSBEQ1JOX0NQQzBfRVIJCQkJCTB4MGIxCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2Vib255LmR0cwppbmRleCAwZWMwMmY0Li5jNWY5OTYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZWJvbnkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9lYm9ueS5kdHMKQEAgLTMxLDggKzMxLDggQEAKIAkJCXJlZyA9IDwwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLy8gRmlsbGVkIGluIGJ5IHpJbWFnZQogCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OyAvLyBGaWxsZWQgaW4gYnkgekltYWdlCi0JCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47Ci0JCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CiAJCQlpLWNhY2hlLXNpemUgPSA8ODAwMD47IC8qIDMyIGtCICovCiAJCQlkLWNhY2hlLXNpemUgPSA8ODAwMD47IC8qIDMyIGtCICovCiAJCQlkY3ItY29udHJvbGxlcjsKQEAgLTEzNSwxMSArMTM1LDkgQEAKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8vIEZpbGxlZCBpbiBieSB6SW1hZ2UKLQkJCQlyYW5nZXMgPSA8MCAwMDAwMDAwMCBmZmYwMDAwMCAxMDAwMDAKLQkJCQkJICAxIDAwMDAwMDAwIDQ4MDAwMDAwIDEwMDAwMAotCQkJCQkgIDIgMDAwMDAwMDAgZmY4MDAwMDAgNDAwMDAwCi0JCQkJCSAgMyAwMDAwMDAwMCA0ODIwMDAwMCAxMDAwMDAKLQkJCQkJICA3IDAwMDAwMDAwIDQ4MzAwMDAwIDEwMDAwMD47CisJCQkJLy8gcmFuZ2VzIHByb3BlcnR5IGlzIHN1cHBsaWVkIGJ5IHpJbWFnZQorCQkJCS8vIGJhc2VkIG9uIGZpcm13YXJlJ3MgY29uZmlndXJhdGlvbiBvZiB0aGUKKwkJCQkvLyBFQkMgYnJpZGdlCiAJCQkJaW50ZXJydXB0cyA9IDw1IDQ+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2hvbGx5LmR0cwppbmRleCAyNTQ0OTliLi44MGE0ZmFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvaG9sbHkuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9ob2xseS5kdHMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAJdHNpMTA5QGMwMDAwMDAwIHsKIAkJZGV2aWNlX3R5cGUgPSAidHNpLWJyaWRnZSI7Ci0JCWNvbXBhdGlibGUgPSAidHNpLWJyaWRnZSI7CisJCWNvbXBhdGlibGUgPSAidHNpMTA5LWJyaWRnZSIsICJ0c2kxMDgtYnJpZGdlIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlyYW5nZXMgPSA8MDAwMDAwMDAgYzAwMDAwMDAgMDAwMTAwMDA+OwpAQCAtNTQsNTIgKzU0LDU1IEBACiAKIAkJaTJjQDcwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKLQkJCWNvbXBhdGlibGUgID0gInRzaS1pMmMiOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWNvbXBhdGlibGUgID0gInRzaTEwOS1pMmMiLCAidHNpMTA4LWkyYyI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8ZSAyPjsKIAkJCXJlZyA9IDw3MDAwIDQwMD47CiAJCX07CiAKLQkJbWRpb0A2MDAwIHsKKwkJTURJTzogbWRpb0A2MDAwIHsKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktbWRpbyIsICJ0c2kxMDgtbWRpbyI7CisJCQlyZWcgPSA8NjAwMCA1MD47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OwogCi0JCQlQSFkxOiBldGhlcm5ldC1waHlANjAwMCB7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQljb21wYXRpYmxlID0gImJjbTU0eHgiOwotCQkJCXJlZyA9IDw2MDAwIDUwPjsKLQkJCQlwaHktaWQgPSA8MT47CisJCQlQSFkxOiBldGhlcm5ldC1waHlAMSB7CisJCQkJY29tcGF0aWJsZSA9ICJiY201NDYxYSI7CisJCQkJcmVnID0gPDE+OworCQkJCXR4Yy1yeGMtZGVsYXktZGlzYWJsZTsKIAkJCX07CiAKLQkJCVBIWTI6IGV0aGVybmV0LXBoeUA2NDAwIHsKLQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCWNvbXBhdGlibGUgPSAiYmNtNTR4eCI7Ci0JCQkJcmVnID0gPDYwMDAgNTA+OwotCQkJCXBoeS1pZCA9IDwyPjsKKwkJCVBIWTI6IGV0aGVybmV0LXBoeUAyIHsKKwkJCQljb21wYXRpYmxlID0gImJjbTU0NjFhIjsKKwkJCQlyZWcgPSA8Mj47CisJCQkJdHhjLXJ4Yy1kZWxheS1kaXNhYmxlOwogCQkJfTsKIAkJfTsKIAogCQlldGhlcm5ldEA2MjAwIHsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDktZXRoZXJuZXQiLCAidHNpMTA4LWV0aGVybmV0IjsKIAkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlyZWcgPSA8NjAwMCAyMDA+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmUEhZMT47CiAJCX07CiAKIAkJZXRoZXJuZXRANjYwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA5LWV0aGVybmV0IiwgInRzaTEwOC1ldGhlcm5ldCI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcmVnID0gPDY0MDAgMjAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJi90c2kxMDlAYzAwMDAwMDAvcGljQDc0MDAgPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJaW50ZXJydXB0cyA9IDwxMSAyPjsKKwkJCW1kaW8taGFuZGxlID0gPCZNRElPPjsKIAkJCXBoeS1oYW5kbGUgPSA8JlBIWTI+OwogCQl9OwogCkBAIC0xMTAsNyArMTEzLDcgQEAKIAkJCXZpcnR1YWwtcmVnID0gPGMwMDA3ODA4PjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzRjlDNjAwMD47CiAJCQljdXJyZW50LXNwZWVkID0gPDFjMjAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8YyAyPjsKIAkJfTsKIApAQCAtMTIxLDcgKzEyNCw3IEBACiAJCQl2aXJ0dWFsLXJlZyA9IDxjMDAwN2MwOD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8M0Y5QzYwMDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDwxYzIwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTVBJQz47CiAJCQlpbnRlcnJ1cHRzID0gPGQgMj47CiAJCX07CiAKQEAgLTEzNiw3ICsxMzksNyBAQAogCiAJCXBjaUAxMDAwIHsKIAkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQljb21wYXRpYmxlID0gInRzaTEwOSI7CisJCQljb21wYXRpYmxlID0gInRzaTEwOS1wY2kiLCAidHNpMTA4LXBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKQEAgLTE1MCw3ICsxNTMsNyBAQAogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgNDAwMDAwMDAgNDAwMDAwMDAgMCAxMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCA3ZTAwMDAwMCAwIDAwMDEwMDAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw3ZjI4MTU0PjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICYvdHNpMTA5QGMwMDAwMDAwL3BpY0A3NDAwID47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKIAkJCWludGVycnVwdHMgPSA8MTcgMj47CiAJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8ZjgwMCAwIDAgNz47CiAJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC0xODYsMTMgKzE4OSwxMiBAQAogIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKICAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKICAJCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmL3RzaTEwOUBjMDAwMDAwMC9waWNANzQwMCA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OwogCQkJfTsKIAkJfTsKIAl9OwogCiAJY2hvc2VuIHsKIAkJbGludXgsc3Rkb3V0LXBhdGggPSAiL3RzaTEwOUBjMDAwMDAwMC9zZXJpYWxANzgwOCI7Ci0JCWJvb3RhcmdzID0gImNvbnNvbGU9dHR5UzAsMTE1MjAwIjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjNzQ0OGhwYzIuZHRzCmluZGV4IDc2NWMzMDYuLjBlM2QzMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM3NDQ4aHBjMi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzc0NDhocGMyLmR0cwpAQCAtNDUsNyArNDUsNyBAQAogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCWRldmljZV90eXBlID0gInRzaS1icmlkZ2UiOworCQlkZXZpY2VfdHlwZSA9ICJ0c2kxMDgtYnJpZGdlIjsKIAkJcmFuZ2VzID0gPDAwMDAwMDAwIGMwMDAwMDAwIDAwMDEwMDAwPjsKIAkJcmVnID0gPGMwMDAwMDAwIDAwMDEwMDAwPjsKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKQEAgLTU1LDI3ICs1NSwyNiBAQAogCQkJaW50ZXJydXB0cyA9IDxFIDA+OwogCQkJcmVnID0gPDcwMDAgNDAwPjsKIAkJCWRldmljZV90eXBlID0gImkyYyI7Ci0JCQljb21wYXRpYmxlICA9ICJ0c2ktaTJjIjsKKwkJCWNvbXBhdGlibGUgID0gInRzaTEwOC1pMmMiOwogCQl9OwogCi0JCW1kaW9ANjAwMCB7CisJCU1ESU86IG1kaW9ANjAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJtZGlvIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LW1kaW8iOworCQkJcmVnID0gPDYwMDAgNTA+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAotCQkJcGh5ODogZXRoZXJuZXQtcGh5QDYwMDAgeworCQkJcGh5ODogZXRoZXJuZXQtcGh5QDggewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDg+OwotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJcmVnID0gPDg+OwogCQkJfTsKIAotCQkJcGh5OTogZXRoZXJuZXQtcGh5QDY0MDAgeworCQkJcGh5OTogZXRoZXJuZXQtcGh5QDkgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8NjAwMCA1MD47Ci0JCQkJcGh5LWlkID0gPDk+OwotCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQkJcmVnID0gPDk+OwogCQkJfTsKIAogCQl9OwpAQCAtODMsMTIgKzgyLDEyIEBACiAJCWV0aGVybmV0QDYyMDAgewogCQkJI3NpemUtY2VsbHMgPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gIlRTSS1FVEgiOwotCQkJY29tcGF0aWJsZSA9ICJ0c2ktZXRoZXJuZXQiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDgtZXRoZXJuZXQiOwogCQkJcmVnID0gPDYwMDAgMjAwPjsKIAkJCWFkZHJlc3MgPSBbIDAwIDA2IEQyIDAwIDAwIDAxIF07CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQltZGlvLWhhbmRsZSA9IDwmTURJTz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHk4PjsKIAkJfTsKIApAQCAtOTYsMTIgKzk1LDEyIEBACiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJUU0ktRVRIIjsKLQkJCWNvbXBhdGlibGUgPSAidHNpLWV0aGVybmV0IjsKKwkJCWNvbXBhdGlibGUgPSAidHNpMTA4LWV0aGVybmV0IjsKIAkJCXJlZyA9IDw2NDAwIDIwMD47CiAJCQlhZGRyZXNzID0gWyAwMCAwNiBEMiAwMCAwMCAwMiBdOwogCQkJaW50ZXJydXB0cyA9IDwxMSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJbWRpby1oYW5kbGUgPSA8Jk1ESU8+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5OT47CiAJCX07CiAKQEAgLTEzNSw3ICsxMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAJYmlnLWVuZGlhbjsKIAkJfTsKIAkJcGNpQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJ0c2kxMHgiOworCQkJY29tcGF0aWJsZSA9ICJ0c2kxMDgtcGNpIjsKIAkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwogCQkJI3NpemUtY2VsbHMgPSA8Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODI3MmFkcy5kdHMKaW5kZXggNDIzZWVkYy4uMTkzNGI4MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgyNzJhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MjcyYWRzLmR0cwpAQCAtMTQsMTIgKzE0LDEwIEBACiAgICAgICAgY29tcGF0aWJsZSA9ICJNUEM4MjYwQURTIjsKICAgICAgICAjYWRkcmVzcy1jZWxscyA9IDwxPjsKICAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKLSAgICAgICBsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKICAgICAgICBjcHVzIHsKICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47Ci0gICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKICAgICAgICAgICAgICAgIFBvd2VyUEMsODI3MkAwIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUgPSAiY3B1IjsKQEAgLTMyLDEyICszMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICBidXMtZnJlcXVlbmN5ID0gPDA+OwogICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1mcmVxdWVuY3kgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgIDMyLWJpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyMDE+OwogICAgICAgICAgICAgICAgfTsKICAgICAgICB9OwogCi0gICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXJAZjgyMDAwMDAgewotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDxmODIwMDAwMD47CisJCXBjaV9waWM6IGludGVycnVwdC1jb250cm9sbGVyQGY4MjAwMDAwIHsKICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDA+OwogICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwyPjsKICAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyOwpAQCAtNDcsMTUgKzQzLDEzIEBACiAgICAgICAgfTsKICAgICAgICBtZW1vcnkgewogICAgICAgICAgICAgICAgZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLSAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MzAwPjsKICAgICAgICAgICAgICAgIHJlZyA9IDwwMDAwMDAwMCA0MDAwMDAwIGY0NTAwMDAwIDAwMDAwMDIwPjsKICAgICAgICB9OwogCiAgICAgICAgY2hvc2VuIHsKICAgICAgICAgICAgICAgIG5hbWUgPSAiY2hvc2VuIjsKICAgICAgICAgICAgICAgIGxpbnV4LHBsYXRmb3JtID0gPDA+OwotICAgICAgICAgICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXIgPSA8MTBjMDA+OwotICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDw0MDA+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlciA9IDwmQ3BtX3BpYz47CiAgICAgICAgfTsKIAogICAgICAgIHNvYzgyNzJAZjAwMDAwMDAgewpAQCAtNzAsMjAgKzY0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gIm1kaW8iOwogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImZzX2VuZXQiOwogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MCAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwyNDUyMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJuZXQtcGh5QDAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbnV4LHBoYW5kbGUgPSA8MjQ1MjAwMD47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQlwaHkwOmV0aGVybmV0LXBoeUAwIHsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDE3IDQ+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYW5nID0gWyAxMiAxMiAxMyAwMiAwMiAwMSBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0LXBoeUAxIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eCxwaGFuZGxlID0gPDI0NTIwMDE+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJcGh5MTpldGhlcm5ldC1waHlAMSB7CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNyA0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRiYW5nID0gWyAxMiAxMiAxMyAwMiAwMiAwMSBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwzPjsKQEAgLTEwMSw4ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMTMwMCAyMCA4NDAwIDEwMCAxMTM4MCAzMD47CiAgICAgICAgICAgICAgICAgICAgICAgIG1hYy1hZGRyZXNzID0gWyAwMCAxMSAyRiA5OSA0MyA1NCBdOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIwIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5LWhhbmRsZSA9IDwyNDUyMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5MD47CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4LWNsb2NrID0gPDEzPjsKICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MTI+OwogICAgICAgICAgICAgICAgfTsKQEAgLTExNSwxNCArMTA2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMTMyMCAyMCA4NTAwIDEwMCAxMTNiMCAzMD47CiAgICAgICAgICAgICAgICAgICAgICAgIG1hYy1hZGRyZXNzID0gWyAwMCAxMSAyRiA5OSA0NCA1NCBdOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIxIDI+OwotICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKLSAgICAgICAgICAgICAgICAgICAgICAgcGh5LWhhbmRsZSA9IDwyNDUyMDAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OworCQkJcGh5LWhhbmRsZSA9IDwmUGh5MT47CiAgICAgICAgICAgICAgICAgICAgICAgIHJ4LWNsb2NrID0gPDE3PjsKICAgICAgICAgICAgICAgICAgICAgICAgdHgtY2xvY2sgPSA8MTg+OwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgY3BtQGYwMDAwMDAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDxmMDAwMDAwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OwogICAgICAgICAgICAgICAgICAgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwyPjsKQEAgLTE0Miw3ICsxMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxMWEwMCAyMCA4MDAwIDEwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC1zcGVlZCA9IDwxYzIwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwyOCAyPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPDEwYzAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1zZXR1cCA9IDwwIDAwZmZmZmZmPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1jbG9jayA9IDwxPjsKQEAgLTE1NiwxNSArMTQ2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gPDExYTYwIDIwIDgzMDAgMTAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LXNwZWVkID0gPDFjMjAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDJiIDI+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLXNldHVwID0gPDFiIGZmZmZmZjAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeC1jbG9jayA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC1jbG9jayA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyQDEwYzAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwxMGMwMD47CisJCQljcG1fcGljOmludGVycnVwdC1jb250cm9sbGVyQDEwYzAwIHsKICAgICAgICAgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAgICAgICAgICAgICAgICAgICAgICAgICNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1jb250cm9sbGVyOwpAQCAtMTc0LDcgKzE2Myw2IEBACiAJCSAgICAgICBjb21wYXRpYmxlID0gIkNQTTIiOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHBjaUAwNTAwIHsKLSAgICAgICAgICAgICAgICAgICAgICAgbGludXgscGhhbmRsZSA9IDwwNTAwPjsKICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVycnVwdC1jZWxscyA9IDwxPjsKICAgICAgICAgICAgICAgICAgICAgICAgI3NpemUtY2VsbHMgPSA8Mj47CiAgICAgICAgICAgICAgICAgICAgICAgICNhZGRyZXNzLWNlbGxzID0gPDM+OwpAQCAtMjAyLDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMiBmODIwMDAwMCA0MyA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgMyBmODIwMDAwMCA0MCA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzAwMCAwIDAgNCBmODIwMDAwMCA0MSA4PjsKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwxMGMwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwxNCA4PjsKICAgICAgICAgICAgICAgICAgICAgICAgYnVzLXJhbmdlID0gPDAgMD47CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgNDAwMDAwMDAKQEAgLTIxNiw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInRhbGl0b3MiOwogICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MzAwMDAgMTAwMDA+OwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRzID0gPGIgMj47Ci0gICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8MTBjMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAgICAgICAgICAgICAgICAgICAgICAgIG51bS1jaGFubmVscyA9IDw0PjsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC1maWZvLWxlbiA9IDwxOD47CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtdW5pdHMtbWFzayA9IDwwMDAwMDA3ZT47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cwppbmRleCAxMTJkZDUxLi40ZmMwYzRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKQEAgLTI3Miw3ICsyNzIsMTMgQEAKIAkJCXJlZyA9IDwyMjAwIDIwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDIyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZxZWljID47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDE5PjsKIAkJCXR4LWNsb2NrID0gPDFhPjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkzID47CkBAIC0yODcsNyArMjkzLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMz47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwxNz47CiAJCQl0eC1jbG9jayA9IDwxOD47CiAJCQlwaHktaGFuZGxlID0gPCAmcGh5NCA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKaW5kZXggYmU0YzM1Ny4uNDQ3YzAzZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCkBAIC0yMzEsNyArMjMxLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwNCA5ZiBlZiAwMyAwMiBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MjA+OwogCQkJdHgtY2xvY2sgPSA8MTM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MDA+OwpAQCAtMjQ2LDcgKzI1MiwxMyBAQAogCQkJcmVnID0gPDIyMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgZWYgMDMgMDEgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDE5PjsKIAkJCXR4LWNsb2NrID0gPDFhPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA0PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKaW5kZXggZGIwZDAwMy4uYWU5YmNhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKQEAgLTEzMSw2ICsxMzEsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIwIDggMjEgOCAyMiA4PjsKQEAgLTE0NSw2ICsxNTAsMTEgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCiAJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDIzIDggMjQgOCAyNSA4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCmluZGV4IGRmNzczZmEuLjMxMGU4NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwpAQCAtMTM2LDYgKzEzNiwxMSBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjAgOCAyMSA4IDIyIDg+OwpAQCAtMTUwLDYgKzE1NSwxMSBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjMgOCAyNCA4IDI1IDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKaW5kZXggMzhjODU5NC4uMWU5MTRmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCkBAIC0zMDEsNyArMzAxLDEzIEBACiAJCQlyZWcgPSA8MjAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDA0IDlmIDAwIDIzIDIzIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE5PjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkwID47CkBAIC0zMTcsNyArMzIzLDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmcWVpYyA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDExIDIyIDMzIDQ0IDU1IF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jayA9IDwwPjsKIAkJCXR4LWNsb2NrID0gPDE0PjsKIAkJCXBoeS1oYW5kbGUgPSA8ICZwaHkxID47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKaW5kZXggZDkxZTgxYy4uMzY0YTk2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cwpAQCAtNTIsNyArNTIsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciI7CiAJCQlyZWcgPSA8MjAwMCAxMDAwPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMiAyPjsKIAkJfTsKIAogCQlsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKQEAgLTYxLDE0ICs2MSwxNCBAQAogCQkJY2FjaGUtbGluZS1zaXplID0gPDIwPjsJLy8gMzIgYnl0ZXMKIAkJCWNhY2hlLXNpemUgPSA8NDAwMDA+OwkvLyBMMiwgMjU2SwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDAgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEwIDI+OwogCQl9OwogCiAJCWkyY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gImkyYyI7CiAJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwogCQkJcmVnID0gPDMwMDAgMTAwPjsKLQkJCWludGVycnVwdHMgPSA8MWIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJiIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlkZnNycjsKIAkJfTsKQEAgLTgxLDE5ICs4MSwxOSBAQAogCQkJcmVnID0gPDI0NTIwIDIwPjsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MD47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDE+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzcgMT47CisJCQkJaW50ZXJydXB0cyA9IDw3IDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwNiw5ICsxMDYsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMjAsOSArMTI1LDE0IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlhZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAxIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCS8qCisJCQkgKiBhZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQlhZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMzQsOSArMTQ0LDE0IEBACiAJCQltb2RlbCA9ICJGRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAyIF07Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDIgXTsKLQkJCWludGVycnVwdHMgPSA8MTkgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyOSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNDYsNyArMTYxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTU1LDcgKzE3MCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAkJcGNpQDgwMDAgewpAQCAtMTYzLDc4ICsxNzgsNzggQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDAyICovCi0JCQkJMTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJMTAwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJMTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkxMDAwIDAgMCAyICZtcGljIDIgMQorCQkJCTEwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCS8qIElEU0VMIDB4MDMgKi8KLQkJCQkxODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkxODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxODAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkxODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkxODAwIDAgMCAxICZtcGljIDQgMQorCQkJCTE4MDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkxODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgwNCAqLwotCQkJCTIwMDAgMCAwIDEgJm1waWMgMzMgMQotCQkJCTIwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCTIwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTIwMDAgMCAwIDQgJm1waWMgMzIgMQorCQkJCTIwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMjAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkyMDAwIDAgMCAzICZtcGljIDEgMQorCQkJCTIwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBJRFNFTCAweDA1ICovCi0JCQkJMjgwMCAwIDAgMSAmbXBpYyAzMiAxCi0JCQkJMjgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMjgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJMjgwMCAwIDAgNCAmbXBpYyAzMSAxCisJCQkJMjgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkyODAwIDAgMCAyICZtcGljIDMgMQorCQkJCTI4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJMjgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MGMgKi8KLQkJCQk2MDAwIDAgMCAxICZtcGljIDMxIDEKLQkJCQk2MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQk2MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQk2MDAwIDAgMCA0ICZtcGljIDM0IDEKKwkJCQk2MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCTYwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJNjAwMCAwIDAgMyAmbXBpYyAzIDEKKwkJCQk2MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJLyogSURTRUwgMHgwZCAqLwotCQkJCTY4MDAgMCAwIDEgJm1waWMgMzQgMQotCQkJCTY4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTY4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTY4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTY4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJNjgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQk2ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTY4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDBlICovCi0JCQkJNzAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJNzAwMCAwIDAgMiAmbXBpYyAzNCAxCi0JCQkJNzAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJNzAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJNzAwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQk3MDAwIDAgMCAyICZtcGljIDQgMQorCQkJCTcwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJNzAwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIElEU0VMIDB4MGYgKi8KLQkJCQk3ODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQk3ODAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQk3ODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQk3ODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQk3ODAwIDAgMCAxICZtcGljIDIgMQorCQkJCTc4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJNzgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQk3ODAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxMiAqLwotCQkJCTkwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTkwMDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTkwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCTkwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCTkwMDAgMCAwIDEgJm1waWMgMSAxCisJCQkJOTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQk5MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCTkwMDAgMCAwIDQgJm1waWMgNCAxCiAKIAkJCQkvKiBJRFNFTCAweDEzICovCi0JCQkJOTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJOTgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJOTgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJOTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJOTgwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQk5ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTk4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJOTgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTQgKi8KLQkJCQlhMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQlhMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQlhMDAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQlhMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQlhMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCWEwMDAgMCAwIDIgJm1waWMgNCAxCisJCQkJYTAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQlhMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJLyogSURTRUwgMHgxNSAqLwotCQkJCWE4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCWE4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCWE4MDAgMCAwIDMgJm1waWMgMzQgMQotCQkJCWE4MDAgMCAwIDQgJm1waWMgMzEgMT47CisJCQkJYTgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQlhODAwIDAgMCAyICZtcGljIDMgMQorCQkJCWE4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJYTgwMCAwIDAgNCAmbXBpYyAxIDE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDA4IDI+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAwMTAwMDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwppbmRleCA0ZjJjM2FmLi4wNzAyMDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQxLW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTMgKzgxLDEzIEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDAsOCArMTAwLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CiAJCX07CkBAIC0xMTMsOCArMTEzLDggQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xNDIsNDkgKzE0Miw0OSBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTAgKi8KLQkJCQkwODAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDgwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA4MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwODAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDgwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDgwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDgwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDgwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDExICovCi0JCQkJMDg4MDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDg4MDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4ODAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4ODAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMiAoU2xvdCAxKSAqLwotCQkJCTA5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA5MDAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwOTAwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwOTAwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwOTAwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTMgKFNsb3QgMikgKi8KLQkJCQkwOTgwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJMDk4MDAgMCAwIDIgJm1waWMgMzIgMQotCQkJCTA5ODAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkwOTgwMCAwIDAgNCAmbXBpYyAzMCAxCisJCQkJMDk4MDAgMCAwIDEgJm1waWMgMSAxCisJCQkJMDk4MDAgMCAwIDIgJm1waWMgMiAxCisJCQkJMDk4MDAgMCAwIDMgJm1waWMgMyAxCisJCQkJMDk4MDAgMCAwIDQgJm1waWMgMCAxCiAKIAkJCQkvKiBJRFNFTCAweDE0IChTbG90IDMpICovCi0JCQkJMGEwMDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCTBhMDAwIDAgMCAyICZtcGljIDMzIDEKLQkJCQkwYTAwMCAwIDAgMyAmbXBpYyAzMCAxCi0JCQkJMGEwMDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCTBhMDAwIDAgMCAxICZtcGljIDIgMQorCQkJCTBhMDAwIDAgMCAyICZtcGljIDMgMQorCQkJCTBhMDAwIDAgMCAzICZtcGljIDAgMQorCQkJCTBhMDAwIDAgMCA0ICZtcGljIDEgMQogCiAJCQkJLyogSURTRUwgMHgxNSAoU2xvdCA0KSAqLwotCQkJCTBhODAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkwYTgwMCAwIDAgMiAmbXBpYyAzMCAxCi0JCQkJMGE4MDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCTBhODAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzIDEKKwkJCQkwYTgwMCAwIDAgMiAmbXBpYyAwIDEKKwkJCQkwYTgwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkwYTgwMCAwIDAgNCAmbXBpYyAyIDEKIAogCQkJCS8qIEJ1cyAxIChUdW5kcmEgQnJpZGdlKSAqLwogCQkJCS8qIElEU0VMIDB4MTIgKElTQSBicmlkZ2UpICovCi0JCQkJMTkwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTE5MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkxOTAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMTkwMDAgMCAwIDQgJm1waWMgMzMgMT47CisJCQkJMTkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMTkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMTkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMTkwMDAgMCAwIDQgJm1waWMgMyAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTggMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CkBAIC0yMTYsMTIgKzIxNiwxMiBAQAogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MTUgKi8KLQkJCQlhODAwIDAgMCAxICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAyICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCAzICZtcGljIDNiIDEKLQkJCQlhODAwIDAgMCA0ICZtcGljIDNiIDE+OworCQkJCWE4MDAgMCAwIDEgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMiAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCAzICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDQgJm1waWMgYiAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwOSAyPjsKKwkJCWludGVycnVwdHMgPSA8MTkgMj47CiAJCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIGEwMDAwMDAwIGEwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTMwMDAwMDAgMCAwMDEwMDAwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCmluZGV4IDMwMzM1OTkuLjgyODU5MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCkBAIC01Miw3ICs1Miw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTQ0LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODEsMTMgKzgxLDEzIEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8M2EgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDNhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC0xMDEsNyArMTAxLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8ZCAyIGUgMiAxMiAyPjsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTExNCw3ICsxMTQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxmIDIgMTAgMiAxMSAyPjsKKwkJCWludGVycnVwdHMgPSA8MWYgMiAyMCAyIDIxIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKIAkJCXJlZyA9IDw0NTAwIDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFhIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYSAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDYwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCmluZGV4IGFkOTYzODEuLjlkMGI4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDgwMDAwPjsJLy8gTDIsIDUxMksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwyNSArODEsMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDA+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTEyLDggKzExMiw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MWQgMiAxZSAyIDIyIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJfTsKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMSBdOwotCQkJaW50ZXJydXB0cyA9IDwxMyAyIDE0IDIgMTggMj47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzOSw4ICsxMzksOCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCA3MyAwMiBdOwotCQkJaW50ZXJydXB0cyA9IDxmIDIgMTAgMiAxMSAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQl9OwpAQCAtMTUyLDggKzE1Miw4IEBACiAJCQltb2RlbCA9ICJlVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI3MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAzIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDE1IDIgMTYgMiAxNyAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwyNSAyIDI2IDIgMjcgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OwogCQl9OwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ1MDAgMTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE3Myw1OCArMTczLDY0IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIAorCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIHJlZworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1ndXRzIjsKKwkJCXJlZyA9IDxlMDAwMCAxMDAwPjsKKwkJCWZzbCxoYXMtcnN0Y3I7CisJCX07CisKIAkJcGNpMTogcGNpQDgwMDAgewogCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDFmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjU2LDEyICsyNjIsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCmluZGV4IDk1MWVkOTIuLjE3ZTQ1ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NTUtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSwxNCArNjEsMTQgQEAKIAkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCiAJCQljYWNoZS1zaXplID0gPDQwMDAwPjsJLy8gTDIsIDI1NksKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwwIDI+OworCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKIAkJfTsKIAogCQlpMmNAMzAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJpMmMiOwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwzMDAwIDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDFiIDI+OworCQkJaW50ZXJydXB0cyA9IDwyYiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJZGZzcnI7CiAJCX07CkBAIC04MSwxMyArODEsMTMgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMD47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMCw4ICsxMDAsOCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDBkIDIgMGUgMiAxMiAyPjsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTEzLDggKzExMyw4IEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CiAJCX07CkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTQyLDQ5ICsxNDIsNDkgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDEwICovCi0JCQkJMDgwMDAgMCAwIDEgJm1waWMgMzAgMQotCQkJCTA4MDAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkwODAwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJMDgwMDAgMCAwIDQgJm1waWMgMzMgMQorCQkJCTA4MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTA4MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTA4MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTA4MDAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJLyogSURTRUwgMHgxMSAqLwotCQkJCTA4ODAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkwODgwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMDg4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTA4ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkwODgwMCAwIDAgMSAmbXBpYyAwIDEKKwkJCQkwODgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkwODgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkwODgwMCAwIDAgNCAmbXBpYyAzIDEKIAogCQkJCS8qIElEU0VMIDB4MTIgKFNsb3QgMSkgKi8KLQkJCQkwOTAwMCAwIDAgMSAmbXBpYyAzMCAxCi0JCQkJMDkwMDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCTA5MDAwIDAgMCAzICZtcGljIDMyIDEKLQkJCQkwOTAwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJMDkwMDAgMCAwIDEgJm1waWMgMCAxCisJCQkJMDkwMDAgMCAwIDIgJm1waWMgMSAxCisJCQkJMDkwMDAgMCAwIDMgJm1waWMgMiAxCisJCQkJMDkwMDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkvKiBJRFNFTCAweDEzIChTbG90IDIpICovCi0JCQkJMDk4MDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCTA5ODAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkwOTgwMCAwIDAgMyAmbXBpYyAzMyAxCi0JCQkJMDk4MDAgMCAwIDQgJm1waWMgMzAgMQorCQkJCTA5ODAwIDAgMCAxICZtcGljIDEgMQorCQkJCTA5ODAwIDAgMCAyICZtcGljIDIgMQorCQkJCTA5ODAwIDAgMCAzICZtcGljIDMgMQorCQkJCTA5ODAwIDAgMCA0ICZtcGljIDAgMQogCiAJCQkJLyogSURTRUwgMHgxNCAoU2xvdCAzKSAqLwotCQkJCTBhMDAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJMGEwMDAgMCAwIDMgJm1waWMgMzAgMQotCQkJCTBhMDAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkwYTAwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkwYTAwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkwYTAwMCAwIDAgMyAmbXBpYyAwIDEKKwkJCQkwYTAwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCS8qIElEU0VMIDB4MTUgKFNsb3QgNCkgKi8KLQkJCQkwYTgwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJMGE4MDAgMCAwIDIgJm1waWMgMzAgMQotCQkJCTBhODAwIDAgMCAzICZtcGljIDMxIDEKLQkJCQkwYTgwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJMGE4MDAgMCAwIDEgJm1waWMgMyAxCisJCQkJMGE4MDAgMCAwIDIgJm1waWMgMCAxCisJCQkJMGE4MDAgMCAwIDMgJm1waWMgMSAxCisJCQkJMGE4MDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkvKiBCdXMgMSAoVHVuZHJhIEJyaWRnZSkgKi8KIAkJCQkvKiBJRFNFTCAweDEyIChJU0EgYnJpZGdlKSAqLwotCQkJCTE5MDAwIDAgMCAxICZtcGljIDMwIDEKLQkJCQkxOTAwMCAwIDAgMiAmbXBpYyAzMSAxCi0JCQkJMTkwMDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMzIDE+OworCQkJCTE5MDAwIDAgMCAxICZtcGljIDAgMQorCQkJCTE5MDAwIDAgMCAyICZtcGljIDEgMQorCQkJCTE5MDAwIDAgMCAzICZtcGljIDIgMQorCQkJCTE5MDAwIDAgMCA0ICZtcGljIDMgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDggMj47CisJCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMCA4MDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUyMDAwMDAwIDAgMDAxMDAwMDA+OwpAQCAtMjE2LDEyICsyMTYsMTIgQEAKIAkJCWludGVycnVwdC1tYXAgPSA8CiAKIAkJCQkvKiBJRFNFTCAweDE1ICovCi0JCQkJYTgwMCAwIDAgMSAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMiAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgMyAmbXBpYyAzYiAxCi0JCQkJYTgwMCAwIDAgNCAmbXBpYyAzYiAxPjsKKwkJCQlhODAwIDAgMCAxICZtcGljIGIgMQorCQkJCWE4MDAgMCAwIDIgJm1waWMgYiAxCisJCQkJYTgwMCAwIDAgMyAmbXBpYyBiIDEKKwkJCQlhODAwIDAgMCA0ICZtcGljIGIgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MDkgMj47CisJCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwogCQkJYnVzLXJhbmdlID0gPDAgMD47CiAJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCBhMDAwMDAwMCBhMDAwMDAwMCAwIDIwMDAwMDAwCiAJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwIGUzMDAwMDAwIDAgMDAxMDAwMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjBhZHMuZHRzCmluZGV4IDgwNjgyMTUuLjIxY2NhYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTYwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2MGFkcy5kdHMKQEAgLTUyLDcgKzUyLDcgQEAKIAkJCWNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbWVtb3J5LWNvbnRyb2xsZXIiOwogCQkJcmVnID0gPDIwMDAgMTAwMD47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MiAyPjsKKwkJCWludGVycnVwdHMgPSA8MTIgMj47CiAJCX07CiAKIAkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CkBAIC02MSw3ICs2MSw3IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw0MDAwMD47CS8vIEwyLCAyNTZLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJbWRpb0AyNDUyMCB7CkBAIC03MiwyNSArNzIsMjUgQEAKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMT47CisJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDcgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzcgMT47CisJCQkJaW50ZXJydXB0cyA9IDw3IDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEwMSw4ICsxMDEsMTQgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNDAwMCAxMDAwPjsKLQkJCWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAwIEZEIF07Ci0JCQlpbnRlcnJ1cHRzID0gPGQgMiBlIDIgMTIgMj47CisJCQkvKgorCQkJICogYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQl9OwpAQCAtMTE0LDggKzEyMCwxNCBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI1MDAwIDEwMDA+OwotCQkJYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKLQkJCWludGVycnVwdHMgPSA8MTMgMiAxNCAyIDE4IDI+OworCQkJLyoKKwkJCSAqIGFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJfTsKQEAgLTEzMiw3OSArMTQ0LDc5IEBACiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCiAJCQkJCS8qIElEU0VMIDB4MiAqLwotCQkJCQkgMTAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSAxMDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDEwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgMTAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSAxMDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgMTAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDEwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSAxMDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDB4MyAqLwotCQkJCQkgMTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJCSAxODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkJIDE4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCQkgMTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJCSAxODAwIDAgMCAxICZtcGljIDQgMQorCQkJCQkgMTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkJIDE4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCSAxODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJCS8qIElEU0VMIDB4NCAqLwotCQkJCQkgMjAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJCSAyMDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkJIDIwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCQkgMjAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJCSAyMDAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkgMjAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkJIDIwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJCSAyMDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJCS8qIElEU0VMIDB4NSAgKi8KLQkJCQkJIDI4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgMjgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSAyODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIDI4MDAgMCAwIDQgJm1waWMgMzEgMQorCQkJCQkgMjgwMCAwIDAgMSAmbXBpYyAyIDEKKwkJCQkJIDI4MDAgMCAwIDIgJm1waWMgMyAxCisJCQkJCSAyODAwIDAgMCAzICZtcGljIDQgMQorCQkJCQkgMjgwMCAwIDAgNCAmbXBpYyAxIDEKIAogCQkJCQkvKiBJRFNFTCAxMiAqLwotCQkJCQkgNjAwMCAwIDAgMSAmbXBpYyAzMSAxCi0JCQkJCSA2MDAwIDAgMCAyICZtcGljIDMyIDEKLQkJCQkJIDYwMDAgMCAwIDMgJm1waWMgMzMgMQotCQkJCQkgNjAwMCAwIDAgNCAmbXBpYyAzNCAxCisJCQkJCSA2MDAwIDAgMCAxICZtcGljIDEgMQorCQkJCQkgNjAwMCAwIDAgMiAmbXBpYyAyIDEKKwkJCQkJIDYwMDAgMCAwIDMgJm1waWMgMyAxCisJCQkJCSA2MDAwIDAgMCA0ICZtcGljIDQgMQogCiAJCQkJCS8qIElEU0VMIDEzICovCi0JCQkJCSA2ODAwIDAgMCAxICZtcGljIDM0IDEKLQkJCQkJIDY4MDAgMCAwIDIgJm1waWMgMzEgMQotCQkJCQkgNjgwMCAwIDAgMyAmbXBpYyAzMiAxCi0JCQkJCSA2ODAwIDAgMCA0ICZtcGljIDMzIDEKKwkJCQkJIDY4MDAgMCAwIDEgJm1waWMgNCAxCisJCQkJCSA2ODAwIDAgMCAyICZtcGljIDEgMQorCQkJCQkgNjgwMCAwIDAgMyAmbXBpYyAyIDEKKwkJCQkJIDY4MDAgMCAwIDQgJm1waWMgMyAxCiAKIAkJCQkJLyogSURTRUwgMTQqLwotCQkJCQkgNzAwMCAwIDAgMSAmbXBpYyAzMyAxCi0JCQkJCSA3MDAwIDAgMCAyICZtcGljIDM0IDEKLQkJCQkJIDcwMDAgMCAwIDMgJm1waWMgMzEgMQotCQkJCQkgNzAwMCAwIDAgNCAmbXBpYyAzMiAxCisJCQkJCSA3MDAwIDAgMCAxICZtcGljIDMgMQorCQkJCQkgNzAwMCAwIDAgMiAmbXBpYyA0IDEKKwkJCQkJIDcwMDAgMCAwIDMgJm1waWMgMSAxCisJCQkJCSA3MDAwIDAgMCA0ICZtcGljIDIgMQogCiAJCQkJCS8qIElEU0VMIDE1ICovCi0JCQkJCSA3ODAwIDAgMCAxICZtcGljIDMyIDEKLQkJCQkJIDc4MDAgMCAwIDIgJm1waWMgMzMgMQotCQkJCQkgNzgwMCAwIDAgMyAmbXBpYyAzNCAxCi0JCQkJCSA3ODAwIDAgMCA0ICZtcGljIDMxIDEKKwkJCQkJIDc4MDAgMCAwIDEgJm1waWMgMiAxCisJCQkJCSA3ODAwIDAgMCAyICZtcGljIDMgMQorCQkJCQkgNzgwMCAwIDAgMyAmbXBpYyA0IDEKKwkJCQkJIDc4MDAgMCAwIDQgJm1waWMgMSAxCiAKIAkJCQkJLyogSURTRUwgMTggKi8KLQkJCQkJIDkwMDAgMCAwIDEgJm1waWMgMzEgMQotCQkJCQkgOTAwMCAwIDAgMiAmbXBpYyAzMiAxCi0JCQkJCSA5MDAwIDAgMCAzICZtcGljIDMzIDEKLQkJCQkJIDkwMDAgMCAwIDQgJm1waWMgMzQgMQorCQkJCQkgOTAwMCAwIDAgMSAmbXBpYyAxIDEKKwkJCQkJIDkwMDAgMCAwIDIgJm1waWMgMiAxCisJCQkJCSA5MDAwIDAgMCAzICZtcGljIDMgMQorCQkJCQkgOTAwMCAwIDAgNCAmbXBpYyA0IDEKIAogCQkJCQkvKiBJRFNFTCAxOSAqLwotCQkJCQkgOTgwMCAwIDAgMSAmbXBpYyAzNCAxCi0JCQkJCSA5ODAwIDAgMCAyICZtcGljIDMxIDEKLQkJCQkJIDk4MDAgMCAwIDMgJm1waWMgMzIgMQotCQkJCQkgOTgwMCAwIDAgNCAmbXBpYyAzMyAxCisJCQkJCSA5ODAwIDAgMCAxICZtcGljIDQgMQorCQkJCQkgOTgwMCAwIDAgMiAmbXBpYyAxIDEKKwkJCQkJIDk4MDAgMCAwIDMgJm1waWMgMiAxCisJCQkJCSA5ODAwIDAgMCA0ICZtcGljIDMgMQogCiAJCQkJCS8qIElEU0VMIDIwICovCi0JCQkJCSBhMDAwIDAgMCAxICZtcGljIDMzIDEKLQkJCQkJIGEwMDAgMCAwIDIgJm1waWMgMzQgMQotCQkJCQkgYTAwMCAwIDAgMyAmbXBpYyAzMSAxCi0JCQkJCSBhMDAwIDAgMCA0ICZtcGljIDMyIDEKKwkJCQkJIGEwMDAgMCAwIDEgJm1waWMgMyAxCisJCQkJCSBhMDAwIDAgMCAyICZtcGljIDQgMQorCQkJCQkgYTAwMCAwIDAgMyAmbXBpYyAxIDEKKwkJCQkJIGEwMDAgMCAwIDQgJm1waWMgMiAxCiAKIAkJCQkJLyogSURTRUwgMjEgKi8KLQkJCQkJIGE4MDAgMCAwIDEgJm1waWMgMzIgMQotCQkJCQkgYTgwMCAwIDAgMiAmbXBpYyAzMyAxCi0JCQkJCSBhODAwIDAgMCAzICZtcGljIDM0IDEKLQkJCQkJIGE4MDAgMCAwIDQgJm1waWMgMzEgMT47CisJCQkJCSBhODAwIDAgMCAxICZtcGljIDIgMQorCQkJCQkgYTgwMCAwIDAgMiAmbXBpYyAzIDEKKwkJCQkJIGE4MDAgMCAwIDMgJm1waWMgNCAxCisJCQkJCSBhODAwIDAgMCA0ICZtcGljIDEgMT47CiAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDw4IDA+OworCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKIAkJCWJ1cy1yYW5nZSA9IDwwIDA+OwogCQkJcmFuZ2VzID0gPDAyMDAwMDAwIDAgODAwMDAwMDAgODAwMDAwMDAgMCAyMDAwMDAwMAogCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMCBlMjAwMDAwMCAwIDAxMDAwMDAwPjsKQEAgLTIzNCw3ICsyNDYsNyBAQAogCQkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDwxZSAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDJlIDI+OwogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCXJlZyA9IDw5MGMwMCA4MD47CiAJCQkJYnVpbHQtaW47CkBAIC0yNzUsNyArMjg3LDEzIEBACiAJCQkJbW9kZWwgPSAiRkNDIjsKIAkJCQlkZXZpY2UtaWQgPSA8Mj47CiAJCQkJcmVnID0gPDkxMzIwIDIwIDg4NTAwIDEwMCA5MTNhMCAzMD47Ci0JCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAyIEZEIF07CisJCQkJLyoKKwkJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJCSAqLworCQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJCWNsb2NrLXNldHVwID0gPGZmMDBmZmZmIDI1MDAwMD47CiAJCQkJcngtY2xvY2sgPSA8MTU+OwogCQkJCXR4LWNsb2NrID0gPDE2PjsKQEAgLTI5MCw3ICszMDgsMTMgQEAKIAkJCQltb2RlbCA9ICJGQ0MiOwogCQkJCWRldmljZS1pZCA9IDwzPjsKIAkJCQlyZWcgPSA8OTEzNDAgMjAgODg2MDAgMTAwIDkxM2QwIDMwPjsKLQkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKKwkJCQkvKgorCQkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkJICovCisJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQkJY2xvY2stc2V0dXAgPSA8ZmZmZjAwZmYgMzcwMD47CiAJCQkJcngtY2xvY2sgPSA8MTc+OwogCQkJCXR4LWNsb2NrID0gPDE4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cwppbmRleCBhMTIzZWM5Li42YmIxOGYyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCkBAIC02MSw3ICs2MSw3IEBACiAJCQljb21wYXRpYmxlID0gImZzbCw4NTY4LW1lbW9yeS1jb250cm9sbGVyIjsKIAkJCXJlZyA9IDwyMDAwIDEwMDA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDIgMj47CisJCQlpbnRlcnJ1cHRzID0gPDEyIDI+OwogCQl9OwogCiAJCWwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewpAQCAtNzAsMTQgKzcwLDE0IEBACiAJCQljYWNoZS1saW5lLXNpemUgPSA8MjA+OwkvLyAzMiBieXRlcwogCQkJY2FjaGUtc2l6ZSA9IDw4MDAwMD47CS8vIEwyLCA1MTJLCiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MCAyPjsKKwkJCWludGVycnVwdHMgPSA8MTAgMj47CiAJCX07CiAKIAkJaTJjQDMwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzAwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtODYsNyArODYsNyBAQAogCQkJZGV2aWNlX3R5cGUgPSAiaTJjIjsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CiAJCQlyZWcgPSA8MzEwMCAxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYiAyPjsKKwkJCWludGVycnVwdHMgPSA8MmIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCWRmc3JyOwogCQl9OwpAQCAtOTksMjUgKzk5LDI1IEBACiAJCQlyZWcgPSA8MjQ1MjAgMjA+OwogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwogCQkJCXJlZyA9IDwzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKQEAgLTEzMCw4ICsxMzAsMTQgQEAKIAkJCW1vZGVsID0gImVUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjQwMDAgMTAwMD47CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KIAkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDxkIDIgZSAyIDEyIDI+OworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisgCQkJaW50ZXJydXB0cyA9IDwxZCAyIDFlIDIgMjIgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwogCQl9OwpAQCAtMTQzLDggKzE0OSwxNCBAQAogCQkJbW9kZWwgPSAiZVRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNTAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMF07Ci0JCQlpbnRlcnJ1cHRzID0gPDEzIDIgMTQgMiAxOCAyPjsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKyAJCQlpbnRlcnJ1cHRzID0gPDIzIDIgMjQgMiAyOCAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CiAJCX07CkBAIC0xNTQsNyArMTY2LDcgQEAKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CiAJCQlyZWcgPSA8NDUwMCAxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwxYSAyPjsKKwkJCWludGVycnVwdHMgPSA8MmEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTYzLDcgKzE3NSw3IEBACiAJCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwogCQkJcmVnID0gPDQ2MDAgMTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MWEgMj47CisJCQlpbnRlcnJ1cHRzID0gPDJhIDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCX07CiAKQEAgLTE3Miw3ICsxODQsNyBAQAogCQkJbW9kZWwgPSAiU0VDMiI7CiAJCQljb21wYXRpYmxlID0gInRhbGl0b3MiOwogCQkJcmVnID0gPDMwMDAwIGYwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxZCAyPjsKKwkJCWludGVycnVwdHMgPSA8MmQgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCW51bS1jaGFubmVscyA9IDw0PjsKIAkJCWNoYW5uZWwtZmlmby1sZW4gPSA8MTg+OwpAQCAtMzAwLDcgKzMxMiwxMyBAQAogCQkJcmVnID0gPDIwMDAgMjAwPjsKIAkJCWludGVycnVwdHMgPSA8MjA+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgMDQgOWYgMDAgMjMgMjMgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrID0gPDA+OwogCQkJdHgtY2xvY2sgPSA8MTk+OwogCQkJcGh5LWhhbmRsZSA9IDwmcWVfcGh5MD47CkBAIC0zMTYsNyArMzM0LDEzIEBACiAJCQlyZWcgPSA8MzAwMCAyMDA+OwogCQkJaW50ZXJydXB0cyA9IDwyMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCAxMSAyMiAzMyA0NCA1NSBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2sgPSA8MD47CiAJCQl0eC1jbG9jayA9IDwxND47CiAJCQlwaHktaGFuZGxlID0gPCZxZV9waHkxPjsKQEAgLTMzNSwyNSArMzU5LDI1IEBACiAJCQkgKiBnaWFuZmFyJ3MgTURJTyBidXMgKi8KIAkJCXFlX3BoeTA6IGV0aGVybmV0LXBoeUAwMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MTogZXRoZXJuZXQtcGh5QDAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxPjsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkyOiBldGhlcm5ldC1waHlAMDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MzEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwogCQkJCXJlZyA9IDwyPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTM6IGV0aGVybmV0LXBoeUAwMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMiAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMzY3LDcgKzM5MSw3IEBACiAJCQlyZWcgPSA8ODAgODA+OwogCQkJYnVpbHQtaW47CiAJCQliaWctZW5kaWFuOwotCQkJaW50ZXJydXB0cyA9IDwxZSAyIDFlIDI+OyAvL2hpZ2g6MzAgbG93OjMwCisJCQlpbnRlcnJ1cHRzID0gPDJlIDIgMmUgMj47IC8vaGlnaDozMCBsb3c6MzAKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCmluZGV4IDI2MGIyNjQuLmRiNTZhMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCkBAIC01Niw4ICs1NiwxMiBAQAogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJcmFuZ2VzID0gPDAgZjgwMDAwMDAgMDAxMDAwMDA+OwotCQlyZWcgPSA8ZjgwMDAwMDAgMDAxMDAwMDA+OwkvLyBDQ1NSQkFSIDFNCisJCXJhbmdlcyA9IDwwMDAwMTAwMCBmODAwMTAwMCAwMDBmZjAwMAorCQkJICA4MDAwMDAwMCA4MDAwMDAwMCAyMDAwMDAwMAorCQkJICBlMjAwMDAwMCBlMjAwMDAwMCAwMDEwMDAwMAorCQkJICBhMDAwMDAwMCBhMDAwMDAwMCAyMDAwMDAwMAorCQkJICBlMzAwMDAwMCBlMzAwMDAwMCAwMDEwMDAwMD47CisJCXJlZyA9IDxmODAwMDAwMCAwMDAwMTAwMD47CS8vIENDU1JCQVIKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKIAogCQlpMmNAMzAwMCB7CkBAIC04NiwyNSArOTAsMjUgQEAKIAkJCXJlZyA9IDwyNDUyMCAyMD47CiAJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDA+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NGEgMT47CisJCQkJaW50ZXJydXB0cyA9IDxhIDE+OwogCQkJCXJlZyA9IDwxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDRhIDE+OworCQkJCWludGVycnVwdHMgPSA8YSAxPjsKIAkJCQlyZWcgPSA8Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw0YSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPGEgMT47CiAJCQkJcmVnID0gPDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtMTE3LDcgKzEyMSwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI0MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDczIDAwIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDFkIDIgMWUgMiAyMiAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CkBAIC0xMzAsNyArMTQwLDEzIEBACiAJCQltb2RlbCA9ICJUU0VDIjsKIAkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CiAJCQlyZWcgPSA8MjUwMDAgMTAwMD47Ci0JCQltYWMtYWRkcmVzcyA9IFsgMDAgRTAgMEMgMDAgNzMgMDEgXTsKKwkJCS8qCisJCQkgKiBtYWMtYWRkcmVzcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQKKwkJCSAqIGluIDIuNi4yNS4gIE9ubHkgcmVjZW50IHZlcnNpb25zIG9mCisJCQkgKiBVLUJvb3Qgc3VwcG9ydCBsb2NhbC1tYWMtYWRkcmVzcywgaG93ZXZlci4KKwkJCSAqLworCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCWludGVycnVwdHMgPSA8MjMgMiAyNCAyIDI4IDI+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKQEAgLTE0Myw3ICsxNTksMTMgQEAKIAkJCW1vZGVsID0gIlRTRUMiOwogCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKIAkJCXJlZyA9IDwyNjAwMCAxMDAwPjsKLQkJCW1hYy1hZGRyZXNzID0gWyAwMCBFMCAwQyAwMCAwMiBGRCBdOworCQkJLyoKKwkJCSAqIG1hYy1hZGRyZXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZAorCQkJICogaW4gMi42LjI1LiAgT25seSByZWNlbnQgdmVyc2lvbnMgb2YKKwkJCSAqIFUtQm9vdCBzdXBwb3J0IGxvY2FsLW1hYy1hZGRyZXNzLCBob3dldmVyLgorCQkJICovCisJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJaW50ZXJydXB0cyA9IDwxRiAyIDIwIDIgMjEgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwpAQCAtMTU2LDcgKzE3OCwxMyBAQAogCQkJbW9kZWwgPSAiVFNFQyI7CiAJCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwogCQkJcmVnID0gPDI3MDAwIDEwMDA+OwotCQkJbWFjLWFkZHJlc3MgPSBbIDAwIEUwIDBDIDAwIDAzIEZEIF07CisJCQkvKgorCQkJICogbWFjLWFkZHJlc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkCisJCQkgKiBpbiAyLjYuMjUuICBPbmx5IHJlY2VudCB2ZXJzaW9ucyBvZgorCQkJICogVS1Cb290IHN1cHBvcnQgbG9jYWwtbWFjLWFkZHJlc3MsIGhvd2V2ZXIuCisJCQkgKi8KKwkJCW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlpbnRlcnJ1cHRzID0gPDI1IDIgMjYgMiAyNyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CkBAIC0xODYsNyArMjE0LDcgQEAKIAkJCSNzaXplLWNlbGxzID0gPDI+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCQlyZWcgPSA8ODAwMCAxMDAwPjsKLQkJCWJ1cy1yYW5nZSA9IDwwIGZlPjsKKwkJCWJ1cy1yYW5nZSA9IDwwIGZmPjsKIAkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMjAwMDAwMDAKIAkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAgZTIwMDAwMDAgMCAwMDEwMDAwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MWZjYTA1NT47CkBAIC0yODUsMTcgKzMxMyw4NCBAQAogCQkJCWY4MDAgMCAwIDMgJmk4MjU5IDAgMAogCQkJCWY4MDAgMCAwIDQgJmk4MjU5IDAgMAogCQkJCT47Ci0JCQlpODI1OTogaTgyNTlANGQwIHsKLQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJYnVpbHQtaW47Ci0JCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7Ci0gICAgICAgICAgICAgICAgCSAgICAgICAgYmlnLWVuZGlhbjsKLQkJCQlpbnRlcnJ1cHRzID0gPDQ5IDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJdWxpMTU3NUAwIHsKKwkJCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCQlyYW5nZXMgPSA8MDIwMDAwMDAgMCA4MDAwMDAwMAorCQkJCQkgIDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJICAwIDIwMDAwMDAwCisJCQkJCSAgMDEwMDAwMDAgMCAwMDAwMDAwMAorCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJICAwIDAwMTAwMDAwPjsKKworCQkJCXBjaV9icmlkZ2VAMCB7CisJCQkJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQkJCXJhbmdlcyA9IDwwMjAwMDAwMCAwIDgwMDAwMDAwCisJCQkJCQkgIDAyMDAwMDAwIDAgODAwMDAwMDAKKwkJCQkJCSAgMCAyMDAwMDAwMAorCQkJCQkJICAwMTAwMDAwMCAwIDAwMDAwMDAwCisJCQkJCQkgIDAxMDAwMDAwIDAgMDAwMDAwMDAKKwkJCQkJCSAgMCAwMDEwMDAwMD47CisKKwkJCQkJaXNhQDFlIHsKKwkJCQkJCWRldmljZV90eXBlID0gImlzYSI7CisJCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJCQkJCXJlZyA9IDxmMDAwIDAgMCAwIDA+OworCQkJCQkJcmFuZ2VzID0gPDEgMCAwMTAwMDAwMCAwIDAKKwkJCQkJCQkgIDAwMDAxMDAwPjsKKwkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKKworCQkJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKKwkJCQkJCQlyZWcgPSA8MSAyMCAyCisJCQkJCQkJICAgICAgIDEgYTAgMgorCQkJCQkJCSAgICAgICAxIDRkMCAyPjsKKwkJCQkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCQkJYnVpbHQtaW47CisJCQkJCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7CisJCQkJCQkJaW50ZXJydXB0cyA9IDw5IDI+OworCQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJCQk8Jm1waWM+OworCQkJCQkJfTsKKworCQkJCQkJaTgwNDJANjAgeworCQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCQkJCXJlZyA9IDwxIDYwIDEgMSA2NCAxPjsKKwkJCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyBjIDM+OworCQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJCQk8Jmk4MjU5PjsKKworCQkJCQkJCWtleWJvYXJkQDAgeworCQkJCQkJCQlyZWcgPSA8MD47CisJCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLDMwMyI7CisJCQkJCQkJfTsKKworCQkJCQkJCW1vdXNlQDEgeworCQkJCQkJCQlyZWcgPSA8MT47CisJCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7CisJCQkJCQkJfTsKKwkJCQkJCX07CisKKwkJCQkJCXJ0Y0A3MCB7CisJCQkJCQkJY29tcGF0aWJsZSA9CisJCQkJCQkJCSJwbnBQTlAsYjAwIjsKKwkJCQkJCQlyZWcgPSA8MSA3MCAyPjsKKwkJCQkJCX07CisKKwkJCQkJCWdwaW9ANDAwIHsKKwkJCQkJCQlyZWcgPSA8MSA0MDAgODA+OworCQkJCQkJfTsKKwkJCQkJfTsKKwkJCQl9OwogCQkJfTsKIAogCQl9OwpAQCAtMzE2LDEwICs0MTEsMTAgQEAKIAkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAJCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0NCAxCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyA0NSAxCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyA0NiAxCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyA0NyAxCisJCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDEKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMQorCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCisJCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKIAkJCQk+OwogCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY2YWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCmluZGV4IGMwZDA2ZmQuLmU1ZTc3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjZhZHMuZHRzCkBAIC0xNSwxMiArMTUsMTAgQEAKIAljb21wYXRpYmxlID0gIm1wYzh4eCI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47Ci0JbGludXgscGhhbmRsZSA9IDwxMDA+OwogCiAJY3B1cyB7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJbGludXgscGhhbmRsZSA9IDwyMDA+OwogCiAJCVBvd2VyUEMsODY2QDAgewogCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKQEAgLTM0LDE0ICszMiwxMiBAQAogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJMzItYml0OwogCQkJaW50ZXJydXB0cyA9IDxmIDI+OwkvLyBkZWNyZW1lbnRlciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJbGludXgscGhhbmRsZSA9IDwyMDE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCX07CiAJfTsKIAogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCWxpbnV4LHBoYW5kbGUgPSA8MzAwPjsKIAkJcmVnID0gPDAwMDAwMDAwIDgwMDAwMD47CiAJfTsKIApAQCAtNTcsMTEgKzUzLDkgQEAKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwogCQkJY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKIAkJCXJlZyA9IDxlODAgOD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPGU4MD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJZXRoZXJuZXQtcGh5QGYgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMGY+OworCQkJcGh5OiBldGhlcm5ldC1waHlAZiB7CiAJCQkJcmVnID0gPGY+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtNzUsMTIgKzY5LDExIEBACiAJCQlyZWcgPSA8ZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDEgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwZj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeT47CiAJCX07CiAKLQkJcGljQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OworCQltcGM4eHhfcGljOiBwaWNAZmYwMDAwMDAgewogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC05MSw3ICs4NCw2IEBACiAJCX07CiAKIAkJY3BtQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMDIsMTUgKzk0LDE0IEBACiAJCQljb21tYW5kLXByb2MgPSA8OWMwPjsKIAkJCWJyZy1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDAgMj47CS8vIGNwbSBlcnJvciBpbnRlcnJ1cHQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCi0JCQlwaWNAOTMwIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPDkzMD47CisJCQljcG1fcGljOiBwaWNAOTMwIHsKIAkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKIAkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJCWludGVycnVwdHMgPSA8NSAyIDAgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CiAJCQkJcmVnID0gPDkzMCAyMD47CiAJCQkJYnVpbHQtaW47CiAJCQkJZGV2aWNlX3R5cGUgPSAiY3BtLXBpYyI7CkBAIC0xMjgsNyArMTE5LDcgQEAKIAkJCQl0eC1jbG9jayA9IDwxPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8NCAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzbWNAYTkwIHsKQEAgLTE0Miw3ICsxMzMsNyBAQAogCQkJCXR4LWNsb2NrID0gPDI+OwogCQkJCWN1cnJlbnQtc3BlZWQgPSA8MD47CiAJCQkJaW50ZXJydXB0cyA9IDwzIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAKIAkJCXNjY0BhMDAgewpAQCAtMTUzLDcgKzE0NCw3IEBACiAJCQkJcmVnID0gPGEwMCAxOCAzYzAwIDgwPjsKIAkJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDMgRkQgXTsKIAkJCQlpbnRlcnJ1cHRzID0gPDFlIDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8OTMwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAkJCX07CiAJCX07CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4ODVhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKaW5kZXggMTEwYmY2MS4uZGM3YWI5YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMKQEAgLTE1LDEyICsxNSwxMCBAQAogCWNvbXBhdGlibGUgPSAibXBjOHh4IjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKLQlsaW51eCxwaGFuZGxlID0gPDEwMD47CiAKIAljcHVzIHsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwotCQlsaW51eCxwaGFuZGxlID0gPDIwMD47CiAKIAkJUG93ZXJQQyw4ODVAMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwpAQCAtMzQsMTQgKzMyLDEyIEBACiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQkzMi1iaXQ7CiAJCQlpbnRlcnJ1cHRzID0gPGYgMj47CS8vIGRlY3JlbWVudGVyIGludGVycnVwdAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDxmZjAwMDAwMD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPDIwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKIAkJfTsKIAl9OwogCiAJbWVtb3J5IHsKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJbGludXgscGhhbmRsZSA9IDwzMDA+OwogCQlyZWcgPSA8MDAwMDAwMDAgODAwMDAwPjsKIAl9OwogCkBAIC01NywyMSArNTMsMTcgQEAKIAkJCWRldmljZV90eXBlID0gIm1kaW8iOwogCQkJY29tcGF0aWJsZSA9ICJmc19lbmV0IjsKIAkJCXJlZyA9IDxlODAgOD47Ci0JCQlsaW51eCxwaGFuZGxlID0gPGU4MD47CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJZXRoZXJuZXQtcGh5QDAgewotCQkJCWxpbnV4LHBoYW5kbGUgPSA8ZTgwMDA+OworCQkJUGh5MDogZXRoZXJuZXQtcGh5QDAgewogCQkJCXJlZyA9IDwwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKLQkJCWV0aGVybmV0LXBoeUAxIHsKLQkJCQlsaW51eCxwaGFuZGxlID0gPGU4MDAxPjsKKwkJCVBoeTE6IGV0aGVybmV0LXBoeUAxIHsKIAkJCQlyZWcgPSA8MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07Ci0JCQlldGhlcm5ldC1waHlAMiB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDxlODAwMj47CisJCQlQaHkyOiBldGhlcm5ldC1waHlAMiB7CiAJCQkJcmVnID0gPDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtODUsOCArNzcsOCBAQAogCQkJcmVnID0gPGUwMCAxODg+OwogCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAxIEZEIF07CiAJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPGZmMDAwMDAwPjsKLQkJCXBoeS1oYW5kbGUgPSA8ZTgwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CisJCQlwaHktaGFuZGxlID0gPCZQaHkxPjsKIAkJfTsKIAogCQlmZWNAMWUwMCB7CkBAIC05NywxMiArODksMTEgQEAKIAkJCXJlZyA9IDwxZTAwIDE4OD47CiAJCQltYWMtYWRkcmVzcyA9IFsgMDAgMDAgMEMgMDAgMDIgRkQgXTsKIAkJCWludGVycnVwdHMgPSA8NyAxPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OwotCQkJcGh5LWhhbmRsZSA9IDxlODAwMT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNcGM4eHhfcGljPjsKKwkJCXBoeS1oYW5kbGUgPSA8JlBoeTI+OwogCQl9OwogCi0JCXBpY0BmZjAwMDAwMCB7Ci0JCQlsaW51eCxwaGFuZGxlID0gPGZmMDAwMDAwPjsKKwkJTXBjOHh4X3BpYzogcGljQGZmMDAwMDAwIHsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwpAQCAtMTEyLDggKzEwMywxOCBAQAogCQkJY29tcGF0aWJsZSA9ICJDUE0iOwogCQl9OwogCisJCXBjbWNpYUAwMDgwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJY29tcGF0aWJsZSA9ICJmc2wscHEtcGNtY2lhIjsKKwkJCWRldmljZV90eXBlID0gInBjbWNpYSI7CisJCQlyZWcgPSA8ODAgODA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmTXBjOHh4X3BpYz47CisJCQlpbnRlcnJ1cHRzID0gPGQgMT47CisJCX07CisKIAkJY3BtQGZmMDAwMDAwIHsKLQkJCWxpbnV4LHBoYW5kbGUgPSA8ZmYwMDAwMDA+OwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CkBAIC0xMjQsMTUgKzEyNSwxNCBAQAogCQkJY29tbWFuZC1wcm9jID0gPDljMD47CiAJCQlicmctZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwwIDI+OwkvLyBjcG0gZXJyb3IgaW50ZXJydXB0Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZDcG1fcGljPjsKIAotCQkJcGljQDkzMCB7Ci0JCQkJbGludXgscGhhbmRsZSA9IDw5MzA+OworCQkJQ3BtX3BpYzogcGljQDkzMCB7CiAJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CiAJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDUgMiAwIDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8ZmYwMDAwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1wYzh4eF9waWM+OwogCQkJCXJlZyA9IDw5MzAgMjA+OwogCQkJCWJ1aWx0LWluOwogCQkJCWRldmljZV90eXBlID0gImNwbS1waWMiOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCQkJdHgtY2xvY2sgPSA8MT47CiAJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDQgMz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDw5MzA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkNwbV9waWM+OwogCQkJfTsKIAogCQkJc21jQGE5MCB7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJCQl0eC1jbG9jayA9IDwyPjsKIAkJCQljdXJyZW50LXNwZWVkID0gPDA+OwogCQkJCWludGVycnVwdHMgPSA8MyAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CiAJCQl9OwogCiAJCQlzY2NAYTQwIHsKQEAgLTE3NSw4ICsxNzUsOCBAQAogCQkJCXJlZyA9IDxhNDAgMTggM2UwMCA4MD47CiAJCQkJbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDBDIDAwIDAzIEZEIF07CiAJCQkJaW50ZXJydXB0cyA9IDwxYyAzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDkzMD47Ci0JCQkJcGh5LWhhbmRsZSA9IDxlODAwMj47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmQ3BtX3BpYz47CisJCQkJcGh5LWhhbmRsZSA9IDwmUGh5Mj47CiAJCQl9OwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHJwbWMyODAwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCmluZGV4IDU2ODk2NWEuLjY5OWQwZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wcnBtYzI4MDAuZHRzCkBAIC0zMDksNyArMzA5LDcgQEAKIAl9OwogCiAJY2hvc2VuIHsKLQkJYm9vdGFyZ3MgPSAiaXA9b24gY29uc29sZT10dHlNTTAiOworCQlib290YXJncyA9ICJpcD1vbiI7CiAJCWxpbnV4LHN0ZG91dC1wYXRoID0gIi9tdjY0eDYwQGYxMDAwMDAwL21wc2NAODAwMCI7CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHMzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wczMuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHMzLmR0cwpAQCAtMCwwICsxLDY4IEBACisvKgorICogIFBTMyBHYW1lIENvbnNvbGUgZGV2aWNlIHRyZWUuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisvIHsKKwltb2RlbCA9ICJTb255UFMzIjsKKwljb21wYXRpYmxlID0gInNvbnkscHMzIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKworCWNob3NlbiB7CisJfTsKKworCS8qCisJICogV2UnbGwgZ2V0IHRoZSBzaXplIG9mIHRoZSBib290bWVtIGJsb2NrIGZyb20gbHYxIGFmdGVyIHN0YXJ0dXAsCisJICogc28gd2UnbGwgcHV0IGEgbnVsbCBlbnRyeSBoZXJlLgorCSAqLworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDAgMCAwIDA+OworCX07CisKKwkvKgorCSAqIFRoZSBib290IGNwdSBpcyBhbHdheXMgemVybyBmb3IgUFMzLgorCSAqCisJICogZHRjIGV4cGVjdHMgYSBjbG9jay1mcmVxdWVuY3kgYW5kIHRpbWViYXNlLWZyZXF1ZW5jeSBlbnRyaWVzLCBzbworCSAqIHdlJ2xsIHB1dCBhIG51bGwgZW50cmllcyBoZXJlLiAgVGhlc2Ugd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlcgorCSAqIHN0YXJ0dXAgd2l0aCBkYXRhIGZyb20gbHYxLgorCSAqCisJICogU2VlbXMgdGhlIG9ubHkgd2F5IGN1cnJlbnRseSB0byBpbmRpY2F0ZSBhIHByb2Nlc3NvciBoYXMgbXVsdGlwbGUKKwkgKiB0aHJlYWRzIGlzIHdpdGggYW4gaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgZW50cnkuICBXZSdsbCBwdXQgb25lCisJICogaGVyZSBzbyB3ZSBjYW4gYnJpbmcgdXAgYm90aCBvZiBvdXJzLiAgU2VlIHNtcF9zZXR1cF9jcHVfbWFwcygpLgorCSAqLworCisJY3B1cyB7CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKworCQljcHVAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgPSA8MCAxPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKKwkJCWktY2FjaGUtc2l6ZSA9IDw4MDAwPjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDw4MDAwPjsKKwkJCWktY2FjaGUtbGluZS1zaXplID0gPDgwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDgwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9lYm9ueS5jCmluZGV4IGIxMjUxZWUuLjc1ZGFlZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2Vib255LmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZWJvbnkuYwpAQCAtMTAwLDI4ICsxMDAsMTMgQEAKIAlpYm00NDBncF9maXh1cF9jbG9ja3Moc3lzY2xrLCA2ICogMTg0MzIwMCk7CiAJaWJtNDR4X2ZpeHVwX21lbXNpemUoKTsKIAlkdF9maXh1cF9tYWNfYWRkcmVzc2VzKGVib255X21hYzAsIGVib255X21hYzEpOwotfQotCi0jZGVmaW5lIFNQUk5fREJDUjAJCTB4MTM0Ci0jZGVmaW5lICAgREJDUjBfUlNUX1NZU1RFTQkweDMwMDAwMDAwCi0KLXN0YXRpYyB2b2lkIGVib255X2V4aXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWFzbSB2b2xhdGlsZSAoCi0JCSJtZnNwcgklMCwlMVxuIgotCQkib3JpcwklMCwlMCwlMkBoXG4iCi0JCSJtdHNwcgklMSwlMCIKLQkJOiAiPSZyIih0bXApIDogImkiKFNQUk5fREJDUjApLCAiaSIoREJDUjBfUlNUX1NZU1RFTSkKLQkJKTsKLQorCWlibTR4eF9maXh1cF9lYmNfcmFuZ2VzKCIvcGxiL29wYi9lYmMiKTsKIH0KIAogdm9pZCBlYm9ueV9pbml0KHZvaWQgKm1hYzAsIHZvaWQgKm1hYzEpCiB7CiAJcGxhdGZvcm1fb3BzLmZpeHVwcyA9IGVib255X2ZpeHVwczsKLQlwbGF0Zm9ybV9vcHMuZXhpdCA9IGVib255X2V4aXQ7CisJcGxhdGZvcm1fb3BzLmV4aXQgPSBpYm00NHhfZGJjcl9yZXNldDsKIAllYm9ueV9tYWMwID0gbWFjMDsKIAllYm9ueV9tYWMxID0gbWFjMTsKIAlmdF9pbml0KF9kdGJfc3RhcnQsIF9kdGJfZW5kIC0gX2R0Yl9zdGFydCwgMzIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCmluZGV4IDU2YjU2YTguLjQxNmRjMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKQEAgLTM2LDggKzM2LDYgQEAKIAl1bnNpZ25lZCBsb25nIHNpemU7CiB9OwogCi10eXBlZGVmIHZvaWQgKCprZXJuZWxfZW50cnlfdCkodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKLQogI3VuZGVmIERFQlVHCiAKIHN0YXRpYyBzdHJ1Y3QgYWRkcl9yYW5nZSBwcmVwX2tlcm5lbCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mLmMKaW5kZXggZDE2ZWUzZS4uMzg1ZTA4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2YuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5jCkBAIC0xNSw4ICsxNSw3IEBACiAjaW5jbHVkZSAicGFnZS5oIgogI2luY2x1ZGUgIm9wcy5oIgogCi10eXBlZGVmIHZvaWQgKmloYW5kbGU7Ci10eXBlZGVmIHZvaWQgKnBoYW5kbGU7CisjaW5jbHVkZSAib2YuaCIKIAogZXh0ZXJuIGNoYXIgX2VuZFtdOwogCkBAIC0yNSwxNTQgKzI0LDEwIEBACiAjZGVmaW5lIFJBTV9FTkQJCSg1MTI8PDIwKQkvKiBGaXhtZTogdXNlIE9GICovCiAjZGVmaW5lCU9ORV9NQgkJMHgxMDAwMDAKIAotaW50ICgqcHJvbSkgKHZvaWQgKik7CiAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xhaW1fYmFzZTsKIAotc3RhdGljIGludCBjYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKQotewotCWludCBpOwotCXN0cnVjdCBwcm9tX2FyZ3MgewotCQljb25zdCBjaGFyICpzZXJ2aWNlOwotCQlpbnQgbmFyZ3M7Ci0JCWludCBucmV0OwotCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07Ci0JfSBhcmdzOwotCXZhX2xpc3QgbGlzdDsKLQotCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7Ci0JYXJncy5uYXJncyA9IG5hcmdzOwotCWFyZ3MubnJldCA9IG5yZXQ7Ci0KLQl2YV9zdGFydChsaXN0LCBucmV0KTsKLQlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7Ci0JdmFfZW5kKGxpc3QpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKLQkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKLQotCWlmIChwcm9tKCZhcmdzKSA8IDApCi0JCXJldHVybiAtMTsKLQotCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOwotfQotCi1zdGF0aWMgaW50IGNhbGxfcHJvbV9yZXQoY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwKLQkJICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcHJvbV9hcmdzIHsKLQkJY29uc3QgY2hhciAqc2VydmljZTsKLQkJaW50IG5hcmdzOwotCQlpbnQgbnJldDsKLQkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOwotCX0gYXJnczsKLQl2YV9saXN0IGxpc3Q7Ci0KLQlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCWFyZ3MubmFyZ3MgPSBuYXJnczsKLQlhcmdzLm5yZXQgPSBucmV0OwotCi0JdmFfc3RhcnQobGlzdCwgcmV0cyk7Ci0JZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCi0JCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOwotCXZhX2VuZChsaXN0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCi0JCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7Ci0KLQlpZiAocHJvbSgmYXJncykgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQotCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQotCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOwotCi0JcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Ci19Ci0KLS8qCi0gKiBPbGRlciBPRidzIHJlcXVpcmUgdGhhdCB3aGVuIGNsYWltaW5nIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgYWRkcmVzc2VzLAotICogd2UgY2xhaW0gdGhlIHBoeXNpY2FsIHNwYWNlIGluIHRoZSAvbWVtb3J5IG5vZGUgYW5kIHRoZSB2aXJ0dWFsCi0gKiBzcGFjZSBpbiB0aGUgY2hvc2VuIG1tdSBub2RlLCBhbmQgdGhlbiBkbyBhIG1hcCBvcGVyYXRpb24gdG8KLSAqIG1hcCB2aXJ0dWFsIHRvIHBoeXNpY2FsLgotICovCi1zdGF0aWMgaW50IG5lZWRfbWFwID0gLTE7Ci1zdGF0aWMgaWhhbmRsZSBjaG9zZW5fbW11Owotc3RhdGljIHBoYW5kbGUgbWVtb3J5OwotCi0vKiByZXR1cm5zIHRydWUgaWYgczIgaXMgYSBwcmVmaXggb2YgczEgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21hdGNoKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKLXsKLQlmb3IgKDsgKnMyOyArK3MyKQotCQlpZiAoKnMxKysgIT0gKnMyKQotCQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfb2ZfdmVyc2lvbih2b2lkKQotewotCXBoYW5kbGUgb3Byb20sIGNob3NlbjsKLQljaGFyIHZlcnNpb25bNjRdOwotCi0Jb3Byb20gPSBmaW5kZGV2aWNlKCIvb3BlbnByb20iKTsKLQlpZiAob3Byb20gPT0gKHBoYW5kbGUpIC0xKQotCQlyZXR1cm4gMDsKLQlpZiAoZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQotCQlyZXR1cm4gMDsKLQl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7Ci0JcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKLQlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQotCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKLQkJcmV0dXJuIDA7Ci0JY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOwotCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7Ci0JCWNob3NlbiA9IGZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOwotCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgewotCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JaWYgKGdldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgewotCQlwcmludGYoIm5vIG1tdVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQltZW1vcnkgPSAoaWhhbmRsZSkgY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnkiKTsKLQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgewotCQltZW1vcnkgPSAoaWhhbmRsZSkgY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnlAMCIpOwotCQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgewotCQkJcHJpbnRmKCJubyBtZW1vcnkgbm9kZVxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgKmNsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHJlc3VsdDsKLQotCWlmIChuZWVkX21hcCA8IDApCi0JCW5lZWRfbWFwID0gY2hlY2tfb2ZfdmVyc2lvbigpOwotCWlmIChhbGlnbiB8fCAhbmVlZF9tYXApCi0JCXJldHVybiAodm9pZCAqKSBjYWxsX3Byb20oImNsYWltIiwgMywgMSwgdmlydCwgc2l6ZSwgYWxpZ24pOwotCi0JcmV0ID0gY2FsbF9wcm9tX3JldCgiY2FsbC1tZXRob2QiLCA1LCAyLCAmcmVzdWx0LCAiY2xhaW0iLCBtZW1vcnksCi0JCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOwotCWlmIChyZXQgIT0gMCB8fCByZXN1bHQgPT0gLTEpCi0JCXJldHVybiAodm9pZCAqKSAtMTsKLQlyZXQgPSBjYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIGNob3Nlbl9tbXUsCi0JCQkgICAgYWxpZ24sIHNpemUsIHZpcnQpOwotCS8qIDB4MTIgPT0gY29oZXJlbnQgKyByZWFkL3dyaXRlICovCi0JcmV0ID0gY2FsbF9wcm9tKCJjYWxsLW1ldGhvZCIsIDYsIDEsICJtYXAiLCBjaG9zZW5fbW11LAotCQkJMHgxMiwgc2l6ZSwgdmlydCwgdmlydCk7Ci0JcmV0dXJuICh2b2lkICopIHZpcnQ7Ci19Ci0KIHN0YXRpYyB2b2lkICpvZl90cnlfY2xhaW0odW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CkBAIC0xODQsNyArMzksNyBAQAogI2lmZGVmIERFQlVHCiAJCXByaW50ZigiICAgIHRyeWluZzogMHglMDhseFxuXHIiLCBjbGFpbV9iYXNlKTsKICNlbmRpZgotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpY2xhaW0oY2xhaW1fYmFzZSwgc2l6ZSwgMCk7CisJCWFkZHIgPSAodW5zaWduZWQgbG9uZylvZl9jbGFpbShjbGFpbV9iYXNlLCBzaXplLCAwKTsKIAkJaWYgKCh2b2lkICopYWRkciAhPSAodm9pZCAqKS0xKQogCQkJYnJlYWs7CiAJfQpAQCAtMjA4LDY0ICs2Myw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKLQotCWlmICghcCkKLQkJZmF0YWwoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGltYWdlIVxuXHIiKTsKLQotCXJldHVybiBwOwotfQotCi1zdGF0aWMgdm9pZCBvZl9leGl0KHZvaWQpCi17Ci0JY2FsbF9wcm9tKCJleGl0IiwgMCwgMCk7Ci19Ci0KLS8qCi0gKiBPRiBkZXZpY2UgdHJlZSByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZCAqb2ZfZmluZGRldmljZShjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiAocGhhbmRsZSkgY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgbmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCi0JCWNvbnN0IGludCBidWZsZW4pCi17Ci0JcmV0dXJuIGNhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKLX0KLQotc3RhdGljIGludCBvZl9zZXRwcm9wKGNvbnN0IHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJY29uc3QgaW50IGJ1ZmxlbikKLXsKLQlyZXR1cm4gY2FsbF9wcm9tKCJzZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOwotfQotCi0vKgotICogT0YgY29uc29sZSByb3V0aW5lcwotICovCi1zdGF0aWMgdm9pZCAqb2Zfc3Rkb3V0X2hhbmRsZTsKLQotc3RhdGljIGludCBvZl9jb25zb2xlX29wZW4odm9pZCkKLXsKLQl2b2lkICpkZXZwOwotCi0JaWYgKCgoZGV2cCA9IGZpbmRkZXZpY2UoIi9jaG9zZW4iKSkgIT0gTlVMTCkKLQkJCSYmIChnZXRwcm9wKGRldnAsICJzdGRvdXQiLCAmb2Zfc3Rkb3V0X2hhbmRsZSwKLQkJCQlzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpCi0JCQkJPT0gc2l6ZW9mKG9mX3N0ZG91dF9oYW5kbGUpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIG9mX2NvbnNvbGVfd3JpdGUoY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWNhbGxfcHJvbSgid3JpdGUiLCAzLCAxLCBvZl9zdGRvdXRfaGFuZGxlLCBidWYsIGxlbik7Ci19Ci0KIHZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIGExLCB1bnNpZ25lZCBsb25nIGEyLCB2b2lkICpwcm9tcHRyKQogewogCXBsYXRmb3JtX29wcy5pbWFnZV9oZHIgPSBvZl9pbWFnZV9oZHI7CkBAIC0yNzcsMTAgKzc0LDkgQEAKIAlkdF9vcHMuZ2V0cHJvcCA9IG9mX2dldHByb3A7CiAJZHRfb3BzLnNldHByb3AgPSBvZl9zZXRwcm9wOwogCi0JY29uc29sZV9vcHMub3BlbiA9IG9mX2NvbnNvbGVfb3BlbjsKLQljb25zb2xlX29wcy53cml0ZSA9IG9mX2NvbnNvbGVfd3JpdGU7CisJb2ZfY29uc29sZV9pbml0KCk7CiAKLQlwcm9tID0gKGludCAoKikodm9pZCAqKSlwcm9tcHRyOworCW9mX2luaXQocHJvbXB0cik7CiAJbG9hZGVyX2luZm8ucHJvbXB0ciA9IHByb21wdHI7CiAJaWYgKGExICYmIGEyICYmIGEyICE9IDB4ZGVhZGJlZWYpIHsKIAkJbG9hZGVyX2luZm8uaW5pdHJkX2FkZHIgPSBhMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L29mLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZi5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX1BQQ19CT09UX09GX0hfCisjZGVmaW5lIF9QUENfQk9PVF9PRl9IXworCit0eXBlZGVmIHZvaWQgKnBoYW5kbGU7Cit0eXBlZGVmIHZvaWQgKmloYW5kbGU7CisKK3ZvaWQgb2ZfaW5pdCh2b2lkICpwcm9tcHRyKTsKK2ludCBvZl9jYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKTsKK3ZvaWQgKm9mX2NsYWltKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduKTsKK3ZvaWQgKm9mX3ZtbGludXhfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgb2ZfZXhpdCh2b2lkKTsKK3ZvaWQgKm9mX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pOworaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAorCSAgICAgICBjb25zdCBpbnQgYnVmbGVuKTsKKworLyogQ29uc29sZSBmdW5jdGlvbnMgKi8KK3ZvaWQgb2ZfY29uc29sZV9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX1BQQ19CT09UX09GX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vZmNvbnNvbGUuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGUwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9vZmNvbnNvbGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogT0YgY29uc29sZSByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgUGF1bCBNYWNrZXJyYXMgMTk5Ny4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbGYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJvcHMuaCIKKworI2luY2x1ZGUgIm9mLmgiCisKK3N0YXRpYyB2b2lkICpvZl9zdGRvdXRfaGFuZGxlOworCitzdGF0aWMgaW50IG9mX2NvbnNvbGVfb3Blbih2b2lkKQoreworCXZvaWQgKmRldnA7CisKKwlpZiAoKChkZXZwID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbiIpKSAhPSBOVUxMKQorCSAgICAmJiAob2ZfZ2V0cHJvcChkZXZwLCAic3Rkb3V0IiwgJm9mX3N0ZG91dF9oYW5kbGUsCisJCQkgICBzaXplb2Yob2Zfc3Rkb3V0X2hhbmRsZSkpCisJCT09IHNpemVvZihvZl9zdGRvdXRfaGFuZGxlKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBvZl9jb25zb2xlX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlvZl9jYWxsX3Byb20oIndyaXRlIiwgMywgMSwgb2Zfc3Rkb3V0X2hhbmRsZSwgYnVmLCBsZW4pOworfQorCit2b2lkIG9mX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCWNvbnNvbGVfb3BzLm9wZW4gPSBvZl9jb25zb2xlX29wZW47CisJY29uc29sZV9vcHMud3JpdGUgPSBvZl9jb25zb2xlX3dyaXRlOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvb2ZsaWIuYyBiL2FyY2gvcG93ZXJwYy9ib290L29mbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViOGZkNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29mbGliLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDE5OTcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAib3BzLmgiCisKKyNpbmNsdWRlICJvZi5oIgorCitzdGF0aWMgaW50ICgqcHJvbSkgKHZvaWQgKik7CisKK3ZvaWQgb2ZfaW5pdCh2b2lkICpwcm9tcHRyKQoreworCXByb20gPSAoaW50ICgqKSh2b2lkICopKXByb21wdHI7Cit9CisKK2ludCBvZl9jYWxsX3Byb20oY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwgLi4uKQoreworCWludCBpOworCXN0cnVjdCBwcm9tX2FyZ3MgeworCQljb25zdCBjaGFyICpzZXJ2aWNlOworCQlpbnQgbmFyZ3M7CisJCWludCBucmV0OworCQl1bnNpZ25lZCBpbnQgYXJnc1sxMl07CisJfSBhcmdzOworCXZhX2xpc3QgbGlzdDsKKworCWFyZ3Muc2VydmljZSA9IHNlcnZpY2U7CisJYXJncy5uYXJncyA9IG5hcmdzOworCWFyZ3MubnJldCA9IG5yZXQ7CisKKwl2YV9zdGFydChsaXN0LCBucmV0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJYXJncy5hcmdzW2ldID0gdmFfYXJnKGxpc3QsIHVuc2lnbmVkIGludCk7CisJdmFfZW5kKGxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IG5yZXQ7IGkrKykKKwkJYXJncy5hcmdzW25hcmdzK2ldID0gMDsKKworCWlmIChwcm9tKCZhcmdzKSA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAobnJldCA+IDApPyBhcmdzLmFyZ3NbbmFyZ3NdOiAwOworfQorCitzdGF0aWMgaW50IG9mX2NhbGxfcHJvbV9yZXQoY29uc3QgY2hhciAqc2VydmljZSwgaW50IG5hcmdzLCBpbnQgbnJldCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnJldHMsIC4uLikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJvbV9hcmdzIHsKKwkJY29uc3QgY2hhciAqc2VydmljZTsKKwkJaW50IG5hcmdzOworCQlpbnQgbnJldDsKKwkJdW5zaWduZWQgaW50IGFyZ3NbMTJdOworCX0gYXJnczsKKwl2YV9saXN0IGxpc3Q7CisKKwlhcmdzLnNlcnZpY2UgPSBzZXJ2aWNlOworCWFyZ3MubmFyZ3MgPSBuYXJnczsKKwlhcmdzLm5yZXQgPSBucmV0OworCisJdmFfc3RhcnQobGlzdCwgcmV0cyk7CisJZm9yIChpID0gMDsgaSA8IG5hcmdzOyBpKyspCisJCWFyZ3MuYXJnc1tpXSA9IHZhX2FyZyhsaXN0LCB1bnNpZ25lZCBpbnQpOworCXZhX2VuZChsaXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucmV0OyBpKyspCisJCWFyZ3MuYXJnc1tuYXJncytpXSA9IDA7CisKKwlpZiAocHJvbSgmYXJncykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmV0cyAhPSAodm9pZCAqKSAwKQorCQlmb3IgKGkgPSAxOyBpIDwgbnJldDsgKytpKQorCQkJcmV0c1tpLTFdID0gYXJncy5hcmdzW25hcmdzK2ldOworCisJcmV0dXJuIChucmV0ID4gMCk/IGFyZ3MuYXJnc1tuYXJnc106IDA7Cit9CisKKy8qIHJldHVybnMgdHJ1ZSBpZiBzMiBpcyBhIHByZWZpeCBvZiBzMSAqLworc3RhdGljIGludCBzdHJpbmdfbWF0Y2goY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWZvciAoOyAqczI7ICsrczIpCisJCWlmICgqczErKyAhPSAqczIpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE9sZGVyIE9GJ3MgcmVxdWlyZSB0aGF0IHdoZW4gY2xhaW1pbmcgYSBzcGVjaWZpYyByYW5nZSBvZiBhZGRyZXNzZXMsCisgKiB3ZSBjbGFpbSB0aGUgcGh5c2ljYWwgc3BhY2UgaW4gdGhlIC9tZW1vcnkgbm9kZSBhbmQgdGhlIHZpcnR1YWwKKyAqIHNwYWNlIGluIHRoZSBjaG9zZW4gbW11IG5vZGUsIGFuZCB0aGVuIGRvIGEgbWFwIG9wZXJhdGlvbiB0bworICogbWFwIHZpcnR1YWwgdG8gcGh5c2ljYWwuCisgKi8KK3N0YXRpYyBpbnQgbmVlZF9tYXAgPSAtMTsKK3N0YXRpYyBpaGFuZGxlIGNob3Nlbl9tbXU7CitzdGF0aWMgcGhhbmRsZSBtZW1vcnk7CisKK3N0YXRpYyBpbnQgY2hlY2tfb2ZfdmVyc2lvbih2b2lkKQoreworCXBoYW5kbGUgb3Byb20sIGNob3NlbjsKKwljaGFyIHZlcnNpb25bNjRdOworCisJb3Byb20gPSBvZl9maW5kZGV2aWNlKCIvb3BlbnByb20iKTsKKwlpZiAob3Byb20gPT0gKHBoYW5kbGUpIC0xKQorCQlyZXR1cm4gMDsKKwlpZiAob2ZfZ2V0cHJvcChvcHJvbSwgIm1vZGVsIiwgdmVyc2lvbiwgc2l6ZW9mKHZlcnNpb24pKSA8PSAwKQorCQlyZXR1cm4gMDsKKwl2ZXJzaW9uW3NpemVvZih2ZXJzaW9uKS0xXSA9IDA7CisJcHJpbnRmKCJPRiB2ZXJzaW9uID0gJyVzJ1xyXG4iLCB2ZXJzaW9uKTsKKwlpZiAoIXN0cmluZ19tYXRjaCh2ZXJzaW9uLCAiT3BlbiBGaXJtd2FyZSwgMS4iKQorCSAgICAmJiAhc3RyaW5nX21hdGNoKHZlcnNpb24sICJGaXJtV29ya3MsMy4iKSkKKwkJcmV0dXJuIDA7CisJY2hvc2VuID0gb2ZfZmluZGRldmljZSgiL2Nob3NlbiIpOworCWlmIChjaG9zZW4gPT0gKHBoYW5kbGUpIC0xKSB7CisJCWNob3NlbiA9IG9mX2ZpbmRkZXZpY2UoIi9jaG9zZW5AMCIpOworCQlpZiAoY2hvc2VuID09IChwaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBjaG9zZW5cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKG9mX2dldHByb3AoY2hvc2VuLCAibW11IiwgJmNob3Nlbl9tbXUsIHNpemVvZihjaG9zZW5fbW11KSkgPD0gMCkgeworCQlwcmludGYoIm5vIG1tdVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1vcnkgPSAoaWhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnkiKTsKKwlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgeworCQltZW1vcnkgPSAoaWhhbmRsZSkgb2ZfY2FsbF9wcm9tKCJvcGVuIiwgMSwgMSwgIi9tZW1vcnlAMCIpOworCQlpZiAobWVtb3J5ID09IChpaGFuZGxlKSAtMSkgeworCQkJcHJpbnRmKCJubyBtZW1vcnkgbm9kZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlwcmludGYoIm9sZCBPRiBkZXRlY3RlZFxyXG4iKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCAqb2ZfY2xhaW0odW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24pCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCisJaWYgKG5lZWRfbWFwIDwgMCkKKwkJbmVlZF9tYXAgPSBjaGVja19vZl92ZXJzaW9uKCk7CisJaWYgKGFsaWduIHx8ICFuZWVkX21hcCkKKwkJcmV0dXJuICh2b2lkICopIG9mX2NhbGxfcHJvbSgiY2xhaW0iLCAzLCAxLCB2aXJ0LCBzaXplLCBhbGlnbik7CisKKwlyZXQgPSBvZl9jYWxsX3Byb21fcmV0KCJjYWxsLW1ldGhvZCIsIDUsIDIsICZyZXN1bHQsICJjbGFpbSIsIG1lbW9yeSwKKwkJCSAgICAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJaWYgKHJldCAhPSAwIHx8IHJlc3VsdCA9PSAtMSkKKwkJcmV0dXJuICh2b2lkICopIC0xOworCXJldCA9IG9mX2NhbGxfcHJvbV9yZXQoImNhbGwtbWV0aG9kIiwgNSwgMiwgJnJlc3VsdCwgImNsYWltIiwgY2hvc2VuX21tdSwKKwkJCSAgICAgICBhbGlnbiwgc2l6ZSwgdmlydCk7CisJLyogMHgxMiA9PSBjb2hlcmVudCArIHJlYWQvd3JpdGUgKi8KKwlyZXQgPSBvZl9jYWxsX3Byb20oImNhbGwtbWV0aG9kIiwgNiwgMSwgIm1hcCIsIGNob3Nlbl9tbXUsCisJCQkgICAweDEyLCBzaXplLCB2aXJ0LCB2aXJ0KTsKKwlyZXR1cm4gKHZvaWQgKikgdmlydDsKK30KKwordm9pZCAqb2Zfdm1saW51eF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcCA9IG1hbGxvYyhzaXplKTsKKworCWlmICghcCkKKwkJZmF0YWwoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Iga2VybmVsIGltYWdlIVxuXHIiKTsKKworCXJldHVybiBwOworfQorCit2b2lkIG9mX2V4aXQodm9pZCkKK3sKKwlvZl9jYWxsX3Byb20oImV4aXQiLCAwLCAwKTsKK30KKworLyoKKyAqIE9GIGRldmljZSB0cmVlIHJvdXRpbmVzCisgKi8KK3ZvaWQgKm9mX2ZpbmRkZXZpY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKHBoYW5kbGUpIG9mX2NhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIG5hbWUpOworfQorCitpbnQgb2ZfZ2V0cHJvcChjb25zdCB2b2lkICpwaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWYsCisJICAgICAgIGNvbnN0IGludCBidWZsZW4pCit7CisJcmV0dXJuIG9mX2NhbGxfcHJvbSgiZ2V0cHJvcCIsIDQsIDEsIHBoYW5kbGUsIG5hbWUsIGJ1ZiwgYnVmbGVuKTsKK30KKworaW50IG9mX3NldHByb3AoY29uc3Qgdm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmLAorCSAgICAgICBjb25zdCBpbnQgYnVmbGVuKQoreworCXJldHVybiBvZl9jYWxsX3Byb20oInNldHByb3AiLCA0LCAxLCBwaGFuZGxlLCBuYW1lLCBidWYsIGJ1Zmxlbik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaCBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCmluZGV4IDk1OTEyNGYuLjg2MDc3MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCkBAIC0xOSw2ICsxOSw4IEBACiAjZGVmaW5lCU1BWF9QQVRIX0xFTgkJMjU2CiAjZGVmaW5lCU1BWF9QUk9QX0xFTgkJMjU2IC8qIFdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCiAKK3R5cGVkZWYgdm9pZCAoKmtlcm5lbF9lbnRyeV90KSh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB2b2lkICpyNSk7CisKIC8qIFBsYXRmb3JtIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIHN0cnVjdCBwbGF0Zm9ybV9vcHMgewogCXZvaWQJKCpmaXh1cHMpKHZvaWQpOwpAQCAtNTEsNyArNTMsNyBAQAogLyogQ29uc29sZSBvcGVyYXRpb25zICovCiBzdHJ1Y3QgY29uc29sZV9vcHMgewogCWludAkoKm9wZW4pKHZvaWQpOwotCXZvaWQJKCp3cml0ZSkoY2hhciAqYnVmLCBpbnQgbGVuKTsKKwl2b2lkCSgqd3JpdGUpKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAJdm9pZAkoKmVkaXRfY21kbGluZSkoY2hhciAqYnVmLCBpbnQgbGVuKTsKIAl2b2lkCSgqY2xvc2UpKHZvaWQpOwogCXZvaWQJKmRhdGE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaGVhZC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWhlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWhlYWQuUwpAQCAtMCwwICsxLDgwIEBACisvKgorICogIFBTMyBib290d3JhcHBlciBlbnRyeS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJwcGNfYXNtLmgiCisKKwkudGV4dAorCisvKgorICogX19zeXN0ZW1fcmVzZXRfb3ZlcmxheSAtIFRoZSBQUzMgZmlyc3Qgc3RhZ2UgZW50cnkuCisgKgorICogVGhlIGJvb3R3cmFwZXIgYnVpbGQgc2NyaXB0IGNvcGllcyB0aGUgMHgxMDAgYnl0ZXMgYXQgc3ltYm9sCisgKiBfX3N5c3RlbV9yZXNldF9vdmVybGF5IHRvIG9mZnNldCAweDEwMCBvZiB0aGUgcm9tIGltYWdlLgorICoKKyAqIFRoZSBQUzMgaGFzIGEgc2luZ2xlIHByb2Nlc3NvciB3aXRoIHR3byB0aHJlYWRzLgorICovCisKKwkuZ2xvYmwgX19zeXN0ZW1fcmVzZXRfb3ZlcmxheQorX19zeXN0ZW1fcmVzZXRfb3ZlcmxheToKKworCS8qIFN3aXRjaCB0byAzMi1iaXQgbW9kZS4gKi8KKworCW1mbXNyCXI5CisJY2xybGRpCXI5LHI5LDEKKwltdG1zcmQJcjkKKwlub3AKKworCS8qIEdldCB0aHJlYWQgbnVtYmVyIGluIHIzIGFuZCBicmFuY2guICovCisKKwltZnNwcglyMywgMHg4OAorCWNudGx6dy4JcjMsIHIzCisJbGkJcjQsIDAKKwlsaQlyNSwgMAorCWJlcQkxZgorCisJLyogU2Vjb25kYXJ5IGdvZXMgdG8gX19zZWNvbmRhcnlfaG9sZCBpbiBrZXJuZWwuICovCisKKwlsaQlyNCwgMHg2MAorCW10Y3RyCXI0CisJYmN0cgorCisJLyogUHJpbWFyeSBkZWxheXMgdGhlbiBnb2VzIHRvIF96aW1hZ2Vfc3RhcnQgaW4gd3JhcHBlci4gKi8KKzE6CisJb3IJMzEsIDMxLCAzMSAvKiBkYjE2Y3ljICovCisJb3IJMzEsIDMxLCAzMSAvKiBkYjE2Y3ljICovCisKKwlsaXMJcjQsIF96aW1hZ2Vfc3RhcnRAaGEKKwlhZGRpCXI0LCByNCwgX3ppbWFnZV9zdGFydEBsCisJbXRjdHIJcjQKKwliY3RyCisKKy8qCisgKiBfX3N5c3RlbV9yZXNldF9rZXJuZWwgLSBQbGFjZSBob2xkZXIgZm9yIHRoZSBrZXJuZWwgcmVzZXQgdmVjdG9yLgorICoKKyAqIFRoZSBib290d3JhcHBlciBidWlsZCBzY3JpcHQgY29waWVzIDB4MTAwIGJ5dGVzIGZyb20gb2Zmc2V0IDB4MTAwCisgKiBvZiB0aGUgcm9tIGltYWdlIHRvIHRoZSBzeW1ib2wgX19zeXN0ZW1fcmVzZXRfa2VybmVsLiAgQXQgcnVudGltZQorICogdGhlIGJvb3R3cmFwcGVyIHByb2dyYW0gY29waWVzIHRoZSAweDEwMCBieXRlcyBhdCBfX3N5c3RlbV9yZXNldF9rZXJuZWwKKyAqIHRvIHJhbSBhZGRyZXNzIDB4MTAwLiAgVGhpcyBzeW1ib2wgbXVzdCBvY2N1cHkgMHgxMDAgYnl0ZXMuCisgKi8KKworCS5nbG9ibCBfX3N5c3RlbV9yZXNldF9rZXJuZWwKK19fc3lzdGVtX3Jlc2V0X2tlcm5lbDoKKworCS4gPSBfX3N5c3RlbV9yZXNldF9rZXJuZWwgKyAweDEwMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWh2Y2FsbC5TIGIvYXJjaC9wb3dlcnBjL2Jvb3QvcHMzLWh2Y2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjdkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMtaHZjYWxsLlMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAgUFMzIGJvb3R3cmFwcGVyIGh2Y2FsbHMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAicHBjX2FzbS5oIgorCisvKgorICogVGhlIFBTMyBoeXBlcnZpc29yIHVzZXMgYSA2NCBiaXQgIkMiIGxhbmd1YWdlIGNhbGxpbmcgY29udmVudGlvbi4KKyAqIFRoZSByb3V0aW5lcyBoZXJlIG1hcnNoYWwgYXJndW1lbnRzIGJldHdlZW4gdGhlIDMyIGJpdCB3cmFwcGVyCisgKiBwcm9ncmFtIGFuZCB0aGUgNjQgYml0IGh2Y2FsbHMuCisgKgorICogIHdyYXBwZXIgICAgICAgICAgIGx2MQorICogIDMyLWJpdCAoaCxsKSAgICAgIDY0LWJpdAorICoKKyAqICAxOiByMyxyNCAgICAgICAgICA8LT4gcjMKKyAqICAyOiByNSxyNiAgICAgICAgICA8LT4gcjQKKyAqICAzOiByNyxyOCAgICAgICAgICA8LT4gcjUKKyAqICA0OiByOSxyMTAgICAgICAgICA8LT4gcjYKKyAqICA1OiA4KHIxKSwxMihyMSkgICA8LT4gcjcKKyAqICA2OiAxNihyMSksMjAocjEpICA8LT4gcjgKKyAqICA3OiAyNChyMSksMjgocjEpICA8LT4gcjkKKyAqICA4OiAzMihyMSksMzYocjEpICA8LT4gcjEwCisgKgorICovCisKKy5tYWNybyBHTE9CQUwgbmFtZQorCS5zZWN0aW9uICIudGV4dCIKKwkuYmFsaWduIDQKKwkuZ2xvYmwgXG5hbWUKK1xuYW1lOgorLmVuZG0KKworLm1hY3JvIE5PX1NVUFBPUlQgbmFtZQorCUdMT0JBTCBcbmFtZQorCWIgcHMzX25vX3N1cHBvcnQKKy5lbmRtCisKKy5tYWNybyBIVkNBTEwgbnVtCisJbGkgcjExLCBcbnVtCisJLmxvbmcgMHg0NDAwMDAyMgorCWV4dHN3IHIzLCByMworLmVuZG0KKworLm1hY3JvIFNBVkVfTFIgb2Zmc2V0PTQKKwltZmxyIHIwCisJc3R3IHIwLCBcb2Zmc2V0KHIxKQorLmVuZG0KKworLm1hY3JvIExPQURfTFIgb2Zmc2V0PTQKKwlsd3ogcjAsIFxvZmZzZXQocjEpCisJbXRsciByMAorLmVuZG0KKworLm1hY3JvIExPQURfNjRfUkVHIHRhcmdldCxoaWdoLGxvdworCXNsZGkgcjExLCBcaGlnaCwgMzIKKwlvciBcdGFyZ2V0LCByMTEsIFxsb3cKKy5lbmRtCisKKy5tYWNybyBMT0FEXzY0X1NUQUNLIHRhcmdldCxvZmZzZXQKKwlsZCBcdGFyZ2V0LCBcb2Zmc2V0KHIxKQorLmVuZG0KKworLm1hY3JvIExPQURfUjMKKwlMT0FEXzY0X1JFRyByMyxyMyxyNAorLmVuZG0KKworLm1hY3JvIExPQURfUjQKKwlMT0FEXzY0X1JFRyByNCxyNSxyNgorLmVuZG0KKworLm1hY3JvIExPQURfUjUKKwlMT0FEXzY0X1JFRyByNSxyNyxyOAorLmVuZG0KKworLm1hY3JvIExPQURfUjYKKwlMT0FEXzY0X1JFRyByNixyOSxyMTAKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I3CisJTE9BRF82NF9TVEFDSyByNyw4CisuZW5kbQorCisubWFjcm8gTE9BRF9SOAorCUxPQURfNjRfU1RBQ0sgcjgsMTYKKy5lbmRtCisKKy5tYWNybyBMT0FEX1I5CisJTE9BRF82NF9TVEFDSyByOSwyNAorLmVuZG0KKworLm1hY3JvIExPQURfUjEwCisJTE9BRF82NF9TVEFDSyByMTAsMzIKKy5lbmRtCisKKy5tYWNybyBMT0FEX1JFR1NfMAorCXN0d3UgMSwtMTYoMSkKKwlzdHcgMywgOCgxKQorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU181CisJTE9BRF9SMworCUxPQURfUjQKKwlMT0FEX1I1CisJTE9BRF9SNgorCUxPQURfUjcKKy5lbmRtCisKKy5tYWNybyBMT0FEX1JFR1NfNgorCUxPQURfUkVHU181CisJTE9BRF9SOAorLmVuZG0KKworLm1hY3JvIExPQURfUkVHU184CisJTE9BRF9SRUdTXzYKKwlMT0FEX1I5CisJTE9BRF9SMTAKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzBfMQorCWx3eiByMTEsIDgocjEpCisJc3RkIHI0LCAwKHIxMSkKKwltciByNCwgcjMKKwlsaSByMywgMAorCWFkZGkgcjEscjEsMTYKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzVfMgorCWx3eiByMTEsIDE2KHIxKQorCXN0ZCByNCwgMChyMTEpCisJbHd6IHIxMSwgMjQocjEpCisJc3RkIHI1LCAwKHIxMSkKKy5lbmRtCisKKy5tYWNybyBTVE9SRV9SRUdTXzZfMQorCWx3eiByMTEsIDI0KHIxKQorCXN0ZCByNCwgMChyMTEpCisuZW5kbQorCitHTE9CQUwgbHYxX2dldF9sb2dpY2FsX3BwZV9pZAorCVNBVkVfTFIKKwlMT0FEX1JFR1NfMAorCUhWQ0FMTCA2OQorCVNUT1JFX1JFR1NfMF8xCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX2dldF9sb2dpY2FsX3BhcnRpdGlvbl9pZAorCVNBVkVfTFIKKwlMT0FEX1JFR1NfMAorCUhWQ0FMTCA3NAorCVNUT1JFX1JFR1NfMF8xCisJTE9BRF9MUgorCWJscgorCitHTE9CQUwgbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUKKwlTQVZFX0xSCisJTE9BRF9SRUdTXzUKKwlIVkNBTEwgOTEKKwlTVE9SRV9SRUdTXzVfMgorCUxPQURfTFIKKwlibHIKKworR0xPQkFMIGx2MV9wYW5pYworCVNBVkVfTFIKKwlMT0FEX1JFR1NfOAorCUhWQ0FMTCAyNTUKKwlMT0FEX0xSCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wczMuYyBiL2FyY2gvcG93ZXJwYy9ib290L3BzMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2Q1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wczMuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqICBQUzMgYm9vdHdyYXBwZXIgc3VwcG9ydC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiAgQ29weXJpZ2h0IDIwMDcgU29ueSBDb3JwLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgIm9wcy5oIgorCitleHRlcm4gczY0IGx2MV9wYW5pYyh1NjQgaW5fMSk7CitleHRlcm4gczY0IGx2MV9nZXRfbG9naWNhbF9wYXJ0aXRpb25faWQodTY0ICpvdXRfMSk7CitleHRlcm4gczY0IGx2MV9nZXRfbG9naWNhbF9wcGVfaWQodTY0ICpvdXRfMSk7CitleHRlcm4gczY0IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlKHU2NCBpbl8xLCB1NjQgaW5fMiwgdTY0IGluXzMsCisJdTY0IGluXzQsIHU2NCBpbl81LCB1NjQgKm91dF8xLCB1NjQgKm91dF8yKTsKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ZihmbXQpCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIERCRygKKwljb25zdCBjaGFyICpmbXQsIC4uLikge3JldHVybiAwO30KKyNlbmRpZgorCitCU1NfU1RBQ0soNDA5Nik7CisKKy8qIEEgYnVmZmVyIHRoYXQgbWF5IGJlIGVkaXRlZCBieSB0b29scyBvcGVyYXRpbmcgb24gYSB6SW1hZ2UgYmluYXJ5IHNvIGFzIHRvCisgKiBlZGl0IHRoZSBjb21tYW5kIGxpbmUgcGFzc2VkIHRvIHZtbGludXggKGJ5IHNldHRpbmcgL2Nob3Nlbi9ib290YXJncykuCisgKiBUaGUgYnVmZmVyIGlzIHB1dCBpbiBpdCdzIG93biBzZWN0aW9uIHNvIHRoYXQgdG9vbHMgbWF5IGxvY2F0ZSBpdCBlYXNpZXIuCisgKi8KK3N0YXRpYyBjaGFyIGNtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIl9fYnVpbHRpbl9jbWRsaW5lIikpKTsKKworc3RhdGljIHZvaWQgcHJlcF9jbWRsaW5lKHZvaWQgKmNob3NlbikKK3sKKwlpZiAoY21kbGluZVswXSA9PSAnXDAnKQorCQlnZXRwcm9wKGNob3NlbiwgImJvb3RhcmdzIiwgY21kbGluZSwgQ09NTUFORF9MSU5FX1NJWkUtMSk7CisJZWxzZQorCQlzZXRwcm9wX3N0cihjaG9zZW4sICJib290YXJncyIsIGNtZGxpbmUpOworCisJcHJpbnRmKCJjbWRsaW5lOiAnJXMnXG4iLCBjbWRsaW5lKTsKK30KKworc3RhdGljIHZvaWQgcHMzX2NvbnNvbGVfd3JpdGUoY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworfQorCitzdGF0aWMgdm9pZCBwczNfZXhpdCh2b2lkKQoreworCXByaW50ZigicHMzX2V4aXRcbiIpOworCisJLyogbHYxX3BhbmljIHdpbGwgc2h1dGRvd24gdGhlIGxwYXIuICovCisKKwlsdjFfcGFuaWMoMCk7IC8qIHplcm8gPSBkbyBub3QgcmVib290ICovCisJd2hpbGUgKDEpOworfQorCitzdGF0aWMgaW50IHBzM19yZXBvc2l0b3J5X3JlYWRfcm1fc2l6ZSh1NjQgKnJtX3NpemUpCit7CisJczY0IHJlc3VsdDsKKwl1NjQgbHBhcl9pZDsKKwl1NjQgcHBlX2lkOworCXU2NCB2MjsKKworCXJlc3VsdCA9IGx2MV9nZXRfbG9naWNhbF9wYXJ0aXRpb25faWQoJmxwYXJfaWQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIC0xOworCisJcmVzdWx0ID0gbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcHBlX2lkKTsKKworCWlmIChyZXN1bHQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogbjE6IDAwMDAwMDAwNjI2OTAwMDAgOiAuLi4uYmkuLgorCSAqIG4yOiA3MDc1MDAwMDAwMDAwMDAwIDogcHUuLi4uLi4KKwkgKiBuMzogMDAwMDAwMDAwMDAwMDAwMSA6IC4uLi4uLi4uCisJICogbjQ6IDcyNmQ1ZjczNjk3YTY1MDAgOiBybV9zaXplLgorCSovCisKKwlyZXN1bHQgPSBsdjFfZ2V0X3JlcG9zaXRvcnlfbm9kZV92YWx1ZShscGFyX2lkLCAweDAwMDAwMDAwNjI2OTAwMDBVTEwsCisJCTB4NzA3NTAwMDAwMDAwMDAwMFVMTCwgcHBlX2lkLCAweDcyNmQ1ZjczNjk3YTY1MDBVTEwsIHJtX3NpemUsCisJCSZ2Mik7CisKKwlwcmludGYoIiVzOiVkOiBwcGVfaWQgICVsdSBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpcHBlX2lkKTsKKwlwcmludGYoIiVzOiVkOiBscGFyX2lkICVsdSBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJKHVuc2lnbmVkIGxvbmcpbHBhcl9pZCk7CisJcHJpbnRmKCIlczolZDogcm1fc2l6ZSAlbGx4aCBcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKnJtX3NpemUpOworCisJcmV0dXJuIHJlc3VsdCA/IC0xIDogMDsKK30KKwordm9pZCBwczNfY29weV92ZWN0b3JzKHZvaWQpCit7CisJZXh0ZXJuIGNoYXIgX19zeXN0ZW1fcmVzZXRfa2VybmVsW107CisKKwltZW1jcHkoKHZvaWQgKikweDEwMCwgX19zeXN0ZW1fcmVzZXRfa2VybmVsLCAweDEwMCk7CisJZmx1c2hfY2FjaGUoKHZvaWQgKikweDEwMCwgMHgxMDApOworfQorCit2b2lkIHBsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlleHRlcm4gY2hhciBfZW5kW107CisJZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdOworCWV4dGVybiBjaGFyIF9pbml0cmRfc3RhcnRbXTsKKwlleHRlcm4gY2hhciBfaW5pdHJkX2VuZFtdOworCWNvbnN0IHUzMiBoZWFwc2l6ZSA9IDB4MTAwMDAwMCAtICh1MzIpX2VuZDsgLyogMTZNaUIgKi8KKwl2b2lkICpjaG9zZW47CisJdW5zaWduZWQgbG9uZyBmdF9hZGRyOworCXU2NCBybV9zaXplOworCisJY29uc29sZV9vcHMud3JpdGUgPSBwczNfY29uc29sZV93cml0ZTsKKwlwbGF0Zm9ybV9vcHMuZXhpdCA9IHBzM19leGl0OworCisJcHJpbnRmKCJcbi0tIFBTMyBib290d3JhcHBlciAtLVxuIik7CisKKwlzaW1wbGVfYWxsb2NfaW5pdChfZW5kLCBoZWFwc2l6ZSwgMzIsIDY0KTsKKwlmdF9pbml0KF9kdGJfc3RhcnQsIDAsIDQpOworCisJY2hvc2VuID0gZmluZGRldmljZSgiL2Nob3NlbiIpOworCisJcHMzX3JlcG9zaXRvcnlfcmVhZF9ybV9zaXplKCZybV9zaXplKTsKKwlkdF9maXh1cF9tZW1vcnkoMCwgcm1fc2l6ZSk7CisKKwlpZiAoX2luaXRyZF9lbmQgPiBfaW5pdHJkX3N0YXJ0KSB7CisJCXNldHByb3BfdmFsKGNob3NlbiwgImxpbnV4LGluaXRyZC1zdGFydCIsICh1MzIpKF9pbml0cmRfc3RhcnQpKTsKKwkJc2V0cHJvcF92YWwoY2hvc2VuLCAibGludXgsaW5pdHJkLWVuZCIsICh1MzIpKF9pbml0cmRfZW5kKSk7CisJfQorCisJcHJlcF9jbWRsaW5lKGNob3Nlbik7CisKKwlmdF9hZGRyID0gZHRfb3BzLmZpbmFsaXplKCk7CisKKwlwczNfY29weV92ZWN0b3JzKCk7CisKKwlwcmludGYoIiBmbGF0IHRyZWUgYXQgMHglbHhcblxyIiwgZnRfYWRkcik7CisKKwkoKGtlcm5lbF9lbnRyeV90KTApKGZ0X2FkZHIsIDAsIE5VTEwpOworCisJcHMzX2V4aXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKaW5kZXggN2ZkMzIzMy4uZWFhMGQzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc2VyaWFsLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlyZXR1cm4gc2NkcC0+b3BlbigpOwogfQogCi1zdGF0aWMgdm9pZCBzZXJpYWxfd3JpdGUoY2hhciAqYnVmLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgc2VyaWFsX3dyaXRlKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3Qgc2VyaWFsX2NvbnNvbGVfZGF0YSAqc2NkcCA9IGNvbnNvbGVfb3BzLmRhdGE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpby5jCmluZGV4IDBhOWZlZWIuLjViNTc4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3N0ZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkaW8uYwpAQCAtMTkwLDcgKzE5MCwxMSBAQAogCiAJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KIAkJcXVhbGlmaWVyID0gLTE7Ci0JCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fCAqZm10ID09J1onKSB7CisJCWlmICgqZm10ID09ICdsJyAmJiAqKGZtdCArIDEpID09ICdsJykgeworCQkJcXVhbGlmaWVyID0gJ3EnOworCQkJZm10ICs9IDI7CisJCX0gZWxzZSBpZiAoKmZtdCA9PSAnaCcgfHwgKmZtdCA9PSAnbCcgfHwgKmZtdCA9PSAnTCcKKwkJCXx8ICpmbXQgPT0gJ1onKSB7CiAJCQlxdWFsaWZpZXIgPSAqZm10OwogCQkJKytmbXQ7CiAJCX0KQEAgLTI4MSw2ICsyODUsMTAgQEAKIAkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKIAkJCWlmIChmbGFncyAmIFNJR04pCiAJCQkJbnVtID0gKHNpZ25lZCBsb25nKSBudW07CisJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdxJykgeworCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisJCQlpZiAoZmxhZ3MgJiBTSUdOKQorCQkJCW51bSA9IChzaWduZWQgbG9uZyBsb25nKSBudW07CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdaJykgewogCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7CiAJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaCBiL2FyY2gvcG93ZXJwYy9ib290L3R5cGVzLmgKaW5kZXggNzlkMjZlNy4uMzEzOTNkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oCkBAIC03LDYgKzcsMTAgQEAKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXUxNjsKIHR5cGVkZWYgdW5zaWduZWQgaW50CQl1MzI7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwl1NjQ7Cit0eXBlZGVmIHNpZ25lZCBjaGFyCQlzODsKK3R5cGVkZWYgc2hvcnQJCQlzMTY7Cit0eXBlZGVmIGludAkJCXMzMjsKK3R5cGVkZWYgbG9uZyBsb25nCQlzNjQ7CiAKICNkZWZpbmUgbWluKHgseSkgKHsgXAogCXR5cGVvZih4KSBfeCA9ICh4KTsJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlciBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKaW5kZXggZGE3N2FkYy4uNjVmNjg1NCAxMDA3NTUKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCkBAIC0xNDQsNiArMTQ0LDE1IEBACiBjdWJvb3QqKQogICAgIGd6aXA9CiAgICAgOzsKK3BzMykKKyAgICBwbGF0Zm9ybW89IiRvYmplY3QvcHMzLWhlYWQubyAkb2JqZWN0L3BzMy1odmNhbGwubyAkb2JqZWN0L3BzMy5vIgorICAgIGxkcz0kb2JqZWN0L3pJbWFnZS5wczMubGRzCisgICAgZ3ppcD0KKyAgICBleHQ9YmluCisgICAgb2JqZmxhZ3M9Ii1PIGJpbmFyeSAtLXNldC1zZWN0aW9uLWZsYWdzPS5ic3M9Y29udGVudHMsYWxsb2MsbG9hZCxkYXRhIgorICAgIGtzZWN0aW9uPS5rZXJuZWw6dm1saW51eC5iaW4KKyAgICBpc2VjdGlvbj0ua2VybmVsOmluaXRyZAorICAgIDs7CiBlc2FjCiAKIHZtej0iJHRtcGRpci9gYmFzZW5hbWUgXCIka2VybmVsXCJgLiRleHQiCkBAIC0yMzksNCArMjQ4LDUwIEBACiAgICAgZmkKICAgICBleGl0IDAKICAgICA7OworcHMzKQorICAgICMgVGhlIHBzMydzIGxvYWRlciBzdXBwb3J0cyBsb2FkaW5nIGd6aXBwZWQgYmluYXJ5IGltYWdlcyBmcm9tIGZsYXNoCisgICAgIyByb20gdG8gYWRkciB6ZXJvLiBUaGUgbG9hZGVyIGVudGVycyB0aGUgaW1hZ2UgYXQgYWRkciAweDEwMC4gIEEKKyAgICAjIGJvb3R3cmFwcGVyIG92ZXJsYXkgaXMgdXNlIHRvIGFycmFuZ2UgZm9yIHRoZSBrZXJuZWwgdG8gYmUgbG9hZGVkCisgICAgIyB0byBhZGRyIHplcm8gYW5kIHRvIGhhdmUgYSBzdWl0YWJsZSBib290d3JhcHBlciBlbnRyeSBhdCAweDEwMC4KKyAgICAjIFRvIGNvbnN0cnVjdCB0aGUgcm9tIGltYWdlLCAweDEwMCBieXRlcyBmcm9tIG9mZnNldCAweDEwMCBpbiB0aGUKKyAgICAjIGtlcm5lbCBpcyBjb3BpZWQgdG8gdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9rZXJuZWwuCisgICAgIyBUaGUgMHgxMDAgYnl0ZXMgYXQgdGhlIGJvb3R3cmFwcGVyIHN5bWJvbCBfX3N5c3RlbV9yZXNldF9vdmVybGF5IGlzCisgICAgIyB0aGVuIGNvcGllZCB0byBvZmZzZXQgMHgxMDAuICBBdCBydW50aW1lIHRoZSBib290d3JhcHBlciBwcm9ncmFtCisgICAgIyBjb3BpZXMgdGhlIDB4MTAwIGJ5dGVzIGF0IF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCB0byBhZGRyIDB4MTAwLgorCisgICAgc3lzdGVtX3Jlc2V0X292ZXJsYXk9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X292ZXJsYXkkJyAgICAgICBcCisgICAgICAgIHwgY3V0IC1kJyAnIC1mMWAKKyAgICBzeXN0ZW1fcmVzZXRfb3ZlcmxheT1gcHJpbnRmICIlZCIgJHN5c3RlbV9yZXNldF9vdmVybGF5YAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9MHhgJHtDUk9TU31ubSAiJG9maWxlIiBcCisgICAgICAgIHwgZ3JlcCAnIF9fc3lzdGVtX3Jlc2V0X2tlcm5lbCQnICAgICAgIFwKKyAgICAgICAgfCBjdXQgLWQnICcgLWYxYAorICAgIHN5c3RlbV9yZXNldF9rZXJuZWw9YHByaW50ZiAiJWQiICRzeXN0ZW1fcmVzZXRfa2VybmVsYAorICAgIG92ZXJsYXlfZGVzdD0iMjU2IgorICAgIG92ZXJsYXlfc2l6ZT0iMjU2IgorCisgICAgcm0gLWYgIiRvYmplY3Qvb3RoZXJvcy5ibGQiCisKKyAgICAke0NST1NTfW9iamNvcHkgLU8gYmluYXJ5ICIkb2ZpbGUiICIkb2ZpbGUuYmluIgorCisgICAgbXNnPSQoZGQgaWY9IiRvZmlsZS5iaW4iIG9mPSIkb2ZpbGUuYmluIiBjb252PW5vdHJ1bmMgXAorICAgICAgICBza2lwPSRvdmVybGF5X2Rlc3Qgc2Vlaz0kc3lzdGVtX3Jlc2V0X2tlcm5lbCAgICAgIFwKKyAgICAgICAgY291bnQ9JG92ZXJsYXlfc2l6ZSBicz0xIDI+JjEpCisKKyAgICBpZiBbICQ/IC1uZSAiMCIgXTsgdGhlbgorICAgICAgIGVjaG8gJG1zZworICAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBtc2c9JChkZCBpZj0iJG9maWxlLmJpbiIgb2Y9IiRvZmlsZS5iaW4iIGNvbnY9bm90cnVuYyBcCisgICAgICAgIHNraXA9JHN5c3RlbV9yZXNldF9vdmVybGF5IHNlZWs9JG92ZXJsYXlfZGVzdCAgICAgXAorICAgICAgICBjb3VudD0kb3ZlcmxheV9zaXplIGJzPTEgMj4mMSkKKworICAgIGlmIFsgJD8gLW5lICIwIiBdOyB0aGVuCisgICAgICAgZWNobyAkbXNnCisgICAgICAgZXhpdCAyCisgICAgZmkKKworICAgIGd6aXAgLS1mb3JjZSAtOSAtLXN0ZG91dCAiJG9maWxlLmJpbiIgPiAiJG9iamVjdC9vdGhlcm9zLmJsZCIKKyAgICA7OwogZXNhYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvekltYWdlLnBzMy5sZHMuUyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5wczMubGRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhNDY5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3pJbWFnZS5wczMubGRzLlMKQEAgLTAsMCArMSw1MCBAQAorT1VUUFVUX0FSQ0gocG93ZXJwYzpjb21tb24pCitFTlRSWShfemltYWdlX3N0YXJ0KQorRVhURVJOKF96aW1hZ2Vfc3RhcnQpCitTRUNUSU9OUworeworICBfdm1saW51eF9zdGFydCA9ICAuOworICAua2VybmVsOnZtbGludXguYmluIDogeyAqKC5rZXJuZWw6dm1saW51eC5iaW4pIH0KKyAgX3ZtbGludXhfZW5kID0gIC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfZHRiX3N0YXJ0ID0gLjsKKyAgLmtlcm5lbDpkdGIgOiB7ICooLmtlcm5lbDpkdGIpIH0KKyAgX2R0Yl9lbmQgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2luaXRyZF9zdGFydCA9ICAuOworICAua2VybmVsOmluaXRyZCA6IHsgKigua2VybmVsOmluaXRyZCkgfQorICBfaW5pdHJkX2VuZCA9ICAuOworCisgIF9zdGFydCA9IC47CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgKigudGV4dCkKKyAgICAqKC5maXh1cCkKKyAgfQorICBfZXRleHQgPSAuOworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSopCisgICAgKiguZGF0YSopCisgICAgKiguc2RhdGEqKQorICAgIF9fZ290Ml9zdGFydCA9IC47CisgICAgKiguZ290MikKKyAgICBfX2dvdDJfZW5kID0gLjsKKyAgfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX2VkYXRhICA9ICAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzICAgICAgIDoKKyAgeworICAgKiguc2JzcykKKyAgICooLmJzcykKKyAgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9lbmQgPSAuIDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL2hvbGx5X2RlZmNvbmZpZwppbmRleCAzMjc4MTg0Li4wNGI5NGY4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9ob2xseV9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvaG9sbHlfZGVmY29uZmlnCkBAIC0xOTAsMTAgKzE5MCwxMiBAQAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19aT05FX0RNQV9GTEFHPTEKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQotIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMTE1MjAwIgogIyBDT05GSUdfUE0gaXMgbm90IHNldAogIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5UX0RFVklDRV9UUkVFIGlzIG5vdCBzZXQKK0NPTkZJR19XQU5UX0RFVklDRV9UUkVFPXkKK0NPTkZJR19ERVZJQ0VfVFJFRT0iaG9sbHkuZHRzIgogQ09ORklHX0lTQV9ETUFfQVBJPXkKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKaW5kZXggOTU2ZDFkZi4uZDBiNDNkZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCkBAIC0xNTYsNyArMTU2LDExIEBACiBDT05GSUdfUFMzX1VTRV9MUEFSX0FERFI9eQogQ09ORklHX1BTM19WVUFSVD15CiBDT05GSUdfUFMzX1BTM0FWPXkKLUNPTkZJR19QUzNfU1lTX01BTkFHRVI9eQorQ09ORklHX1BTM19TWVNfTUFOQUdFUj1tCitDT05GSUdfUFMzX1NUT1JBR0U9eQorQ09ORklHX1BTM19ESVNLPXkKK0NPTkZJR19QUzNfUk9NPXkKK0NPTkZJR19QUzNfRkxBU0g9eQogQ09ORklHX1BQQ19DRUxMPXkKICMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfSUJNX0NFTExfQkxBREUgaXMgbm90IHNldApAQCAtMzM1LDcgKzMzOSw3IEBACiBDT05GSUdfQlRfTDJDQVA9bQogQ09ORklHX0JUX1NDTz1tCiBDT05GSUdfQlRfUkZDT01NPW0KLSMgQ09ORklHX0JUX1JGQ09NTV9UVFkgaXMgbm90IHNldAorQ09ORklHX0JUX1JGQ09NTV9UVFk9eQogIyBDT05GSUdfQlRfQk5FUCBpcyBub3Qgc2V0CiBDT05GSUdfQlRfSElEUD1tCiAKQEAgLTM0NCw3ICszNDgsOSBAQAogIwogQ09ORklHX0JUX0hDSVVTQj1tCiBDT05GSUdfQlRfSENJVVNCX1NDTz15Ci0jIENPTkZJR19CVF9IQ0lVQVJUIGlzIG5vdCBzZXQKK0NPTkZJR19CVF9IQ0lVQVJUPW0KK0NPTkZJR19CVF9IQ0lVQVJUX0g0PXkKK0NPTkZJR19CVF9IQ0lVQVJUX0JDU1A9eQogIyBDT05GSUdfQlRfSENJQkNNMjAzWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CVF9IQ0lCUEExMFggaXMgbm90IHNldAogIyBDT05GSUdfQlRfSENJQkZVU0IgaXMgbm90IHNldApAQCAtNDM1LDcgKzQ0MSw3IEBACiAjCiAjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcwogIwotIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorQ09ORklHX1NDU0lfTVVMVElfTFVOPXkKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldApAQCAtNDc5LDYgKzQ4NSw3IEBACiBDT05GSUdfTUlJPW0KIENPTkZJR19ORVRERVZfMTAwMD15CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKK0NPTkZJR19HRUxJQ19ORVQ9eQogCiAjCiAjIFdpcmVsZXNzIExBTgpAQCAtNTQ2LDcgKzU1MywyNyBAQAogIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0pPWVNUSUNLPXkKKyMgQ09ORklHX0pPWVNUSUNLX0FOQUxPRyBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19BM0QgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfQURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0NPQlJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dGMksgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfR1JJUCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19HUklQX01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX0dVSUxMRU1PVCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19JTlRFUkFDVCBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19TSURFV0lOREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1RNREMgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfSUZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1dBUlJJT1IgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfTUFHRUxMQU4gaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VPUkIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfU1BBQ0VCQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1NUSU5HRVIgaXMgbm90IHNldAorIyBDT05GSUdfSk9ZU1RJQ0tfVFdJREpPWSBpcyBub3Qgc2V0CisjIENPTkZJR19KT1lTVElDS19KT1lEVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pPWVNUSUNLX1hQQUQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldApAQCAtNTYzLDcgKzU5MCw3IEBACiBDT05GSUdfVlQ9eQogQ09ORklHX1ZUX0NPTlNPTEU9eQogQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKK0NPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwpAQCAtMTA4Niw3ICsxMTEzLDcgQEAKICMKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CkBAIC0xMTE2LDE2ICsxMTQzLDcgQEAKICMgQ09ORklHX0RFQlVHR0VSIGlzIG5vdCBzZXQKIENPTkZJR19JUlFTVEFDS1M9eQogIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0Ci1DT05GSUdfUFBDX0VBUkxZX0RFQlVHPXkKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19QQU5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBU19DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19NQVBMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfSVNFUklFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUEFTX1JFQUxNT0RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19CRUFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCAzZTc3OWYwLi40MmM0MmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDggQEAKIAogb2JqLXkJCQkJOj0gc2VtYXBob3JlLm8gY3B1dGFibGUubyBwdHJhY2UubyBzeXNjYWxscy5vIFwKIAkJCQkgICBpcnEubyBhbGlnbi5vIHNpZ25hbF8zMi5vIHBtYy5vIHZkc28ubyBcCi0JCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubworCQkJCSAgIGluaXRfdGFzay5vIHByb2Nlc3MubyBzeXN0YmwubyBpZGxlLm8gXAorCQkJCSAgIHNpZ25hbC5vCiBvYmoteQkJCQkrPSB2ZHNvMzIvCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBzZXR1cF82NC5vIGJpbmZtdF9lbGYzMi5vIHN5c19wcGMzMi5vIFwKIAkJCQkgICBzaWduYWxfNjQubyBwdHJhY2UzMi5vIFwKQEAgLTY1LDkgKzY2LDkgQEAKIG1vZHVsZS0kKENPTkZJR19QUEM2NCkJCSs9IG1vZHVsZV82NC5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJCSs9ICQobW9kdWxlLXkpCiAKLXBjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8KK3BjaTY0LSQoQ09ORklHX1BQQzY0KQkJKz0gcGNpXzY0Lm8gcGNpX2RuLm8gaXNhLWJyaWRnZS5vCiBwY2kzMi0kKENPTkZJR19QUEMzMikJCTo9IHBjaV8zMi5vCi1vYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpCitvYmotJChDT05GSUdfUENJKQkJKz0gJChwY2k2NC15KSAkKHBjaTMyLXkpIHBjaS1jb21tb24ubwogb2JqLSQoQ09ORklHX1BDSV9NU0kpCQkrPSBtc2kubwoga2V4ZWMtJChDT05GSUdfUFBDNjQpCQk6PSBtYWNoaW5lX2tleGVjXzY0Lm8KIGtleGVjLSQoQ09ORklHX1BQQzMyKQkJOj0gbWFjaGluZV9rZXhlY18zMi5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggYjJiNWQ2Ni4uYjFmODAwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMjk0LDYgKzI5NCwyMSBAQAogCQkub3Byb2ZpbGVfbW1jcmFfc2lwcgk9IE1NQ1JBX1NJUFIsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI1IiwKIAl9LAorCXsJLyogUG93ZXI1KysgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZmZmMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNiMDMwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUrIChncykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSNSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI1X1BMVVMsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUrKyIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisJCS5vcHJvZmlsZV9tbWNyYV9zaWh2CT0gTU1DUkFfU0lIViwKKwkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBNTUNSQV9TSVBSLAorCQkucGxhdGZvcm0JCT0gInBvd2VyNSsiLAorCX0sCiAJewkvKiBQb3dlcjUgR1MgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCiAJCS5wdnJfdmFsdWUJCT0gMHgwMDNiMDAwMCwKQEAgLTExNzgsOCArMTE5Myw4IEBACiAJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1AgUmV2LiBBICovCi0JCS5wdnJfbWFzawkJPSAweGZmMDAwZmZmLAotCQkucHZyX3ZhbHVlCQk9IDB4NTMwMDA4OTEsCisJCS5wdnJfbWFzawkJPSAweGZmZjAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTMyMDA4OTEsCiAJCS5jcHVfbmFtZQkJPSAiNDQwU1AgUmV2LiBBIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180NFgsCiAJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX0JPT0tFLApAQCAtMTE4OCw5ICsxMjAzLDE5IEBACiAJCS5wbGF0Zm9ybQkJPSAicHBjNDQwIiwKIAl9LAogCXsgLyogNDQwU1BlIFJldi4gQSAqLwotCQkucHZyX21hc2sJCT0gMHhmZjAwMGZmZiwKLQkJLnB2cl92YWx1ZQkJPSAweDUzMDAwODkwLAotCQkuY3B1X25hbWUJCT0gIjQ0MFNQZSBSZXYuIEEiLAorCQkucHZyX21hc2sgICAgICAgICAgICAgICA9IDB4ZmZmMDBmZmYsCisJCS5wdnJfdmFsdWUgICAgICAgICAgICAgID0gMHg1MzQwMDg5MCwKKwkJLmNwdV9uYW1lICAgICAgICAgICAgICAgPSAiNDQwU1BlIFJldi4gQSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMgICAgICA9IENPTU1PTl9VU0VSX0JPT0tFLAorCQkuaWNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorCQkuZGNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorCQkucGxhdGZvcm0gICAgICAgICAgICAgICA9ICJwcGM0NDAiLAorCX0sCisJeyAvKiA0NDBTUGUgUmV2LiBCICovCisJCS5wdnJfbWFzawkJPSAweGZmZjAwZmZmLAorCQkucHZyX3ZhbHVlCQk9IDB4NTM0MDA4OTEsCisJCS5jcHVfbmFtZQkJPSAiNDQwU1BlIFJldi4gQiIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNDRYLAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9CT09LRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKaW5kZXggYzg5NzIwMy4uN2Q3M2ExMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMKQEAgLTksNyArOSw2IEBACiAgKiAgcmV3cml0dGVuIGJ5IFBhdWwgTWFja2VycmFzLgogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgogICogIE1QQzh4eCBtb2RpZmljYXRpb25zIENvcHlyaWdodCAoQykgMTk5NyBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KS4KLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG93LWxldmVsIHN1cHBvcnQgYW5kIHNldHVwIGZvciB0aGUKICAqICBQb3dlclBDIHBsYXRmb3JtLCBpbmNsdWRpbmcgdHJhcCBhbmQgaW50ZXJydXB0IGRpc3BhdGNoLgpAQCAtMzIsMTAgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCi0jaWZkZWYgQ09ORklHX0FQVVMKLSNpbmNsdWRlIDxhc20vYW1pZ2FwcGMuaD4KLSNlbmRpZgotCiAvKiA2MDEgb25seSBoYXZlIElCQVQ7IGNyMC5lcSBpcyBzZXQgb24gNjAxIHdoZW4gdXNpbmcgdGhpcyBtYWNybyAqLwogI2RlZmluZSBMT0FEX0JBVChuLCByZWcsIFJBLCBSQikJXAogCS8qIHNlZSB0aGUgY29tbWVudCBmb3IgY2xlYXJfYmF0cygpIC0tIENvcnQgKi8gXApAQCAtOTIsMTEgKzg3LDYgQEAKICAqICByNDogdmlydHVhbCBhZGRyZXNzIG9mIGJvb3RfaW5mb3NfdAogICogIHI1OiAwCiAgKgotICogQVBVUwotICogICByMzogJ0FQVVMnCi0gKiAgIHI0OiBwaHlzaWNhbCBhZGRyZXNzIG9mIG1lbW9yeSBiYXNlCi0gKiAgIExpbnV4L202OGsgc3R5bGUgQm9vdEluZm8gc3RydWN0dXJlIGF0ICZfZW5kLgotICoKICAqIFBSRVAKICAqIFRoaXMgaXMganVtcGVkIHRvIG9uIHByZXAgc3lzdGVtcyByaWdodCBhZnRlciB0aGUga2VybmVsIGlzIHJlbG9jYXRlZAogICogdG8gaXRzIHByb3BlciBwbGFjZSBpbiBtZW1vcnkgYnkgdGhlIGJvb3QgbG9hZGVyLiAgVGhlIGV4cGVjdGVkIGxheW91dApAQCAtMTUwLDE0ICsxNDAsNiBAQAogICovCiAJYmwJZWFybHlfaW5pdAogCi0jaWZkZWYgQ09ORklHX0FQVVMKLS8qIE9uIEFQVVMgdGhlIF9fdmEvX19wYSBjb25zdGFudHMgbmVlZCB0byBiZSBzZXQgdG8gdGhlIGNvcnJlY3QKLSAqIHZhbHVlcyBiZWZvcmUgY29udGludWluZy4KLSAqLwotCW1yCXI0LHIzMAotCWJsCWZpeF9tZW1fY29uc3RhbnRzCi0jZW5kaWYgLyogQ09ORklHX0FQVVMgKi8KLQogLyogU3dpdGNoIE1NVSBvZmYsIGNsZWFyIEJBVHMgYW5kIGZsdXNoIFRMQi4gQXQgdGhpcyBwb2ludCwgcjMgY29udGFpbnMKICAqIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdlIGFyZSBydW5uaW5nIGF0LCByZXR1cm5lZCBieSBlYXJseV9pbml0KCkKICAqLwpAQCAtMTY3LDcgKzE0OSw3IEBACiAJYmwJZmx1c2hfdGxicwogCiAJYmwJaW5pdGlhbF9iYXRzCi0jaWYgIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKIAlibAlzZXR1cF9kaXNwX2JhdAogI2VuZGlmCiAKQEAgLTE4Myw3ICsxNjUsNiBAQAogI2VuZGlmIC8qIENPTkZJR182eHggKi8KIAogCi0jaWZuZGVmIENPTkZJR19BUFVTCiAvKgogICogV2UgbmVlZCB0byBydW4gd2l0aCBfc3RhcnQgYXQgcGh5c2ljYWwgYWRkcmVzcyAwLgogICogT24gQ0hSUCwgd2UgYXJlIGxvYWRlZCBhdCAweDEwMDAwIHNpbmNlIE9GIG9uIENIUlAgdXNlcwpAQCAtMTk2LDcgKzE3Nyw2IEBACiAJYWRkaXMJcjQscjMsS0VSTkVMQkFTRUBoCS8qIGN1cnJlbnQgYWRkcmVzcyBvZiBfc3RhcnQgKi8KIAljbXB3aQkwLHI0LDAJCQkvKiBhcmUgd2UgYWxyZWFkeSBydW5uaW5nIGF0IDA/ICovCiAJYm5lCXJlbG9jYXRlX2tlcm5lbAotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCiAvKgogICogd2Ugbm93IGhhdmUgdGhlIDFzdCAxNk0gb2YgcmFtIG1hcHBlZCB3aXRoIHRoZSBiYXRzLgogICogcHJlcCBuZWVkcyB0aGUgbW11IHRvIGJlIHR1cm5lZCBvbiBoZXJlLCBidXQgcG1hYyBhbHJlYWR5IGhhcyBpdCBvbi4KQEAgLTg4MSw4NSArODYxLDYgQEAKIAlhZGRpCXI2LHI2LDQKIAlibHIKIAotI2lmZGVmIENPTkZJR19BUFVTCi0vKgotICogT24gQVBVUyB0aGUgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBrZXJuZWwgaXMgbm90IGtub3duIGF0IGNvbXBpbGUKLSAqIHRpbWUsIHdoaWNoIG1lYW5zIHRoZSBfX3BhL19fdmEgY29uc3RhbnRzIHVzZWQgYXJlIGluY29ycmVjdC4gSW4gdGhlCi0gKiBfX2luaXQgc2VjdGlvbiBpcyByZWNvcmRlZCB0aGUgdmlydHVhbCBhZGRyZXNzZXMgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nCi0gKiB0aGVzZSBjb25zdGFudHMsIHNvIGFsbCB0aGF0IGhhcyB0byBiZSBkb25lIGlzIGZpeCB0aGVzZSBiZWZvcmUKLSAqIGNvbnRpbnVpbmcgdGhlIGtlcm5lbCBib290LgotICoKLSAqIHI0ID0gVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGtlcm5lbCBiYXNlLgotICovCi1maXhfbWVtX2NvbnN0YW50czoKLQltcglyMTAscjQKLQlhZGRpcwlyMTAscjEwLC1LRVJORUxCQVNFQGggICAgLyogdmlydF90b19waHlzIGNvbnN0YW50ICovCi0JbmVnCXIxMSxyMTAJICAgICAgICAgICAgICAgICAvKiBwaHlzX3RvX3ZpcnQgY29uc3RhbnQgKi8KLQotCWxpcwlyMTIsX192dG9wX3RhYmxlX2JlZ2luQGgKLQlvcmkJcjEyLHIxMixfX3Z0b3BfdGFibGVfYmVnaW5AbAotCWFkZAlyMTIscjEyLHIxMAkgICAgICAgICAvKiB0YWJsZSBiZWdpbiBwaHlzIGFkZHJlc3MgKi8KLQlsaXMJcjEzLF9fdnRvcF90YWJsZV9lbmRAaAotCW9yaQlyMTMscjEzLF9fdnRvcF90YWJsZV9lbmRAbAotCWFkZAlyMTMscjEzLHIxMAkgICAgICAgICAvKiB0YWJsZSBlbmQgcGh5cyBhZGRyZXNzICovCi0Jc3ViaQlyMTIscjEyLDQKLQlzdWJpCXIxMyxyMTMsNAotMToJbHd6dQlyMTQsNChyMTIpICAgICAgICAgICAgICAgLyogdmlydCBhZGRyZXNzIG9mIGluc3RydWN0aW9uICovCi0JYWRkICAgICByMTQscjE0LHIxMCAgICAgICAgICAgICAgLyogcGh5cyBhZGRyZXNzIG9mIGluc3RydWN0aW9uICovCi0JbHd6ICAgICByMTUsMChyMTQpICAgICAgICAgICAgICAgLyogaW5zdHJ1Y3Rpb24sIG5vdyBpbnNlcnQgdG9wICovCi0Jcmx3aW1pICByMTUscjEwLDE2LDE2LDMxICAgICAgICAgLyogaGFsZiBvZiB2cCBjb25zdCBpbiBsb3cgaGFsZiAqLwotCXN0dwlyMTUsMChyMTQpICAgICAgICAgICAgICAgLyogb2YgaW5zdHJ1Y3Rpb24gYW5kIHJlc3RvcmUuICovCi0JZGNic3QJcjAscjE0CQkJIC8qIHdyaXRlIGl0IHRvIG1lbW9yeSAqLwotCXN5bmMKLQlpY2JpCXIwLHIxNAkJCSAvKiBmbHVzaCB0aGUgaWNhY2hlIGxpbmUgKi8KLQljbXB3CXIxMixyMTMKLQlibmUgICAgIDFiCi0Jc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMKLQotLyoKLSAqIE1hcCB0aGUgbWVtb3J5IHdoZXJlIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgd2lsbAotICogYmUgY29waWVkIHRvIHdoZW4gaGFzaCBjb25zdGFudHMgaGF2ZSBiZWVuIHBhdGNoZWQuCi0gKi8KLSNpZmRlZiBDT05GSUdfQVBVU19GQVNUX0VYQ0VQVAotCWxpcwlyOCwweGZmZjAKLSNlbHNlCi0JbGlzCXI4LDAKLSNlbmRpZgotCW9yaQlyOCxyOCwweDIJCS8qIDEyOEtCLCBzdXBlcnZpc29yICovCi0JbXRzcHIJU1BSTl9EQkFUM1UscjgKLQltdHNwcglTUFJOX0RCQVQzTCxyOAotCi0JbGlzCXIxMixfX3B0b3ZfdGFibGVfYmVnaW5AaAotCW9yaQlyMTIscjEyLF9fcHRvdl90YWJsZV9iZWdpbkBsCi0JYWRkCXIxMixyMTIscjEwCSAgICAgICAgIC8qIHRhYmxlIGJlZ2luIHBoeXMgYWRkcmVzcyAqLwotCWxpcwlyMTMsX19wdG92X3RhYmxlX2VuZEBoCi0Jb3JpCXIxMyxyMTMsX19wdG92X3RhYmxlX2VuZEBsCi0JYWRkCXIxMyxyMTMscjEwCSAgICAgICAgIC8qIHRhYmxlIGVuZCBwaHlzIGFkZHJlc3MgKi8KLQlzdWJpCXIxMixyMTIsNAotCXN1YmkJcjEzLHIxMyw0Ci0xOglsd3p1CXIxNCw0KHIxMikgICAgICAgICAgICAgICAvKiB2aXJ0IGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlhZGQgICAgIHIxNCxyMTQscjEwICAgICAgICAgICAgICAvKiBwaHlzIGFkZHJlc3Mgb2YgaW5zdHJ1Y3Rpb24gKi8KLQlsd3ogICAgIHIxNSwwKHIxNCkgICAgICAgICAgICAgICAvKiBpbnN0cnVjdGlvbiwgbm93IGluc2VydCB0b3AgKi8KLQlybHdpbWkgIHIxNSxyMTEsMTYsMTYsMzEgICAgICAgICAvKiBoYWxmIG9mIHB2IGNvbnN0IGluIGxvdyBoYWxmKi8KLQlzdHcJcjE1LDAocjE0KSAgICAgICAgICAgICAgIC8qIG9mIGluc3RydWN0aW9uIGFuZCByZXN0b3JlLiAqLwotCWRjYnN0CXIwLHIxNAkJCSAvKiB3cml0ZSBpdCB0byBtZW1vcnkgKi8KLQlzeW5jCi0JaWNiaQlyMCxyMTQJCQkgLyogZmx1c2ggdGhlIGljYWNoZSBsaW5lICovCi0JY21wdwlyMTIscjEzCi0JYm5lICAgICAxYgotCi0Jc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCi0JaXN5bmMJCQkJLyogTm8gc3BlY3VsYXRpdmUgbG9hZGluZyB1bnRpbCBub3cgKi8KLQlibHIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGxlYXNlIG5vdGUgdGhhdCBvbiBBUFVTIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgYXJlIGxvY2F0ZWQgYXQgdGhlCi0gKiAgcGh5c2ljYWwgYWRkcmVzcyAweGZmZjAwMDAuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycwotICogIGNhbm5vdCB1c2UgcmVsYXRpdmUgYnJhbmNoZXMgdG8gYWNjZXNzIHRoZSBjb2RlIGJlbG93LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmIC8qIENPTkZJR19BUFVTICovCi0KICNpZmRlZiBDT05GSUdfU01QCiAjaWZkZWYgQ09ORklHX0dFTUlOSQogCS5nbG9ibAlfX3NlY29uZGFyeV9zdGFydF9nZW1pbmkKQEAgLTExMzUsMTkgKzEwMzYsNiBAQAogCWJsCV9fc2F2ZV9jcHVfc2V0dXAKIAlibAlNTVVfaW5pdAogCi0jaWZkZWYgQ09ORklHX0FQVVMKLQkvKiBDb3B5IGV4Y2VwdGlvbiBjb2RlIHRvIGV4Y2VwdGlvbiB2ZWN0b3IgYmFzZSBvbiBBUFVTLiAqLwotCWxpcwlyNCxLRVJORUxCQVNFQGgKLSNpZmRlZiBDT05GSUdfQVBVU19GQVNUX0VYQ0VQVAotCWxpcwlyMywweGZmZjAJCS8qIENvcHkgdG8gMHhmZmYwMDAwMCAqLwotI2Vsc2UKLQlsaXMJcjMsMAkJCS8qIENvcHkgdG8gMHgwMDAwMDAwMCAqLwotI2VuZGlmCi0JbGkJcjUsMHg0MDAwCQkvKiAjIGJ5dGVzIG9mIG1lbW9yeSB0byBjb3B5ICovCi0JbGkJcjYsMAotCWJsCWNvcHlfYW5kX2ZsdXNoCQkvKiBjb3B5IHRoZSBmaXJzdCAweDQwMDAgYnl0ZXMgKi8KLSNlbmRpZiAgLyogQ09ORklHX0FQVVMgKi8KLQogLyoKICAqIEdvIGJhY2sgdG8gcnVubmluZyB1bm1hcHBlZCBzbyB3ZSBjYW4gbG9hZCB1cCBuZXcgdmFsdWVzCiAgKiBmb3IgU0RSMSAoaGFzaCB0YWJsZSBwb2ludGVyKSBhbmQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzCkBAIC0xMzI0LDExICsxMjEyLDcgQEAKICNlbHNlCiAJb3JpCXI4LHI4LDIJCQkvKiBSL1cgYWNjZXNzICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwotI2lmZGVmIENPTkZJR19BUFVTCi0Jb3JpCXIxMSxyMTEsQkxfOE08PDJ8MHgyCS8qIHNldCB1cCA4TUIgQkFUIHJlZ2lzdGVycyBmb3IgNjA0ICovCi0jZWxzZQogCW9yaQlyMTEscjExLEJMXzI1Nk08PDJ8MHgyCS8qIHNldCB1cCBCQVQgcmVnaXN0ZXJzIGZvciA2MDQgKi8KLSNlbmRpZiAvKiBDT05GSUdfQVBVUyAqLwogCiAJbXRzcHIJU1BSTl9EQkFUMEwscjgJCS8qIE4uQi4gNnh4IChub3QgNjAxKSBoYXZlIHZhbGlkICovCiAJbXRzcHIJU1BSTl9EQkFUMFUscjExCQkvKiBiaXQgaW4gdXBwZXIgQkFUIHJlZ2lzdGVyICovCkBAIC0xMzM4LDcgKzEyMjIsNyBAQAogCWJscgogCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQVBVUykgJiYgZGVmaW5lZChDT05GSUdfQk9PVFhfVEVYVCkKKyNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAogc2V0dXBfZGlzcF9iYXQ6CiAJLyoKIAkgKiBzZXR1cCB0aGUgZGlzcGxheSBiYXQgcHJlcGFyZWQgZm9yIHVzIGluIHByb20uYwpAQCAtMTM2Miw3ICsxMjQ2LDcgQEAKIDE6CW10c3ByCVNQUk5fSUJBVDNMLHI4CiAJbXRzcHIJU1BSTl9JQkFUM1UscjExCiAJYmxyCi0jZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX0FQVVMpICYmIGRlZmluZWQoQ09ORklHX0JPT1RYX1RFWFQpICovCisjZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KIAogI2lmZGVmIENPTkZJR184MjYwCiAvKiBKdW1wIGludG8gdGhlIHN5c3RlbSByZXNldCBmb3IgdGhlIHJvbS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggMTExMWZjZS4uOGNkZDQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTEwMyw4ICsxMDMsOCBAQAogCiAJLiA9IDB4NjAKIC8qCi0gKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCBvbiBwU2VyaWVzIHRvIGhvbGQgc2Vjb25kYXJ5IHByb2Nlc3NvcnMKLSAqIGluIGEgc3BpbiBsb29wIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGZyZWVkIGZyb20gT3BlbkZpcm13YXJlLCBidXQKKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIHRvIGhvbGQgc2Vjb25kYXJ5IHByb2Nlc3NvcnMKKyAqIGluIGEgc3BpbiBsb29wIGFmdGVyIHRoZXkgaGF2ZSBlbnRlcmVkIHRoZSBrZXJuZWwsIGJ1dAogICogYmVmb3JlIHRoZSBidWxrIG9mIHRoZSBrZXJuZWwgaGFzIGJlZW4gcmVsb2NhdGVkLiAgVGhpcyBjb2RlCiAgKiBpcyByZWxvY2F0ZWQgdG8gcGh5c2ljYWwgYWRkcmVzcyAweDYwIGJlZm9yZSBwcm9tX2luaXQgaXMgcnVuLgogICogQWxsIG9mIGl0IG11c3QgZml0IGJlbG93IHRoZSBmaXJzdCBleGNlcHRpb24gdmVjdG9yIGF0IDB4MTAwLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCmluZGV4IDM0YWUxMTQuLmUzMWFjYTkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pby5jCkBAIC0zNSw3ICszNSw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC02Niw3ICs2Niw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC05Nyw3ICs5Nyw3IEBACiAJYXNtIHZvbGF0aWxlKCJzeW5jIik7CiAJZG8gewogCQl0bXAgPSAqcG9ydDsKLQkJYXNtIHZvbGF0aWxlKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkqdGJ1ZisrID0gdG1wOwogCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAJYXNtIHZvbGF0aWxlKCJ0d2kgMCwlMCwwOyBpc3luYyIgOiA6ICJyIiAodG1wKSk7CkBAIC0xNTUsMjEgKzE1NSwyMSBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIgOiA6IDogIm1lbW9yeSIpOwogCXdoaWxlKG4gJiYgKCFJT19DSEVDS19BTElHTih2c3JjLCA0KSB8fCAhSU9fQ0hFQ0tfQUxJR04oZGVzdCwgNCkpKSB7CiAJCSooKHU4ICopZGVzdCkgPSAqKCh2b2xhdGlsZSB1OCAqKXZzcmMpOwotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJCWVpZWlvKCk7CiAJCXZzcmMrKzsKIAkJZGVzdCsrOwogCQluLS07CiAJfQogCXdoaWxlKG4gPiA0KSB7CiAJCSooKHUzMiAqKWRlc3QpID0gKigodm9sYXRpbGUgdTMyICopdnNyYyk7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKTsKKwkJZWllaW8oKTsKIAkJdnNyYyArPSA0OwogCQlkZXN0ICs9IDQ7CiAJCW4gLT0gNDsKIAl9CiAJd2hpbGUobikgewogCQkqKCh1OCAqKWRlc3QpID0gKigodm9sYXRpbGUgdTggKil2c3JjKTsKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOworCQllaWVpbygpOwogCQl2c3JjKys7CiAJCWRlc3QrKzsKIAkJbi0tOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggYzJiODRjNi4uMmZjODc4NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC03LDcgKzcsNiBAQAogICogICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgQ29ydCBEb3VnYW4KICAqICBBZGFwdGVkIGZvciBQb3dlciBNYWNpbnRvc2ggYnkgUGF1bCBNYWNrZXJyYXMKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zMzcsNyArMzM2LDggQEAKIAogdm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKIHsKLQlwcGNfbWQuaW5pdF9JUlEoKTsKKwlpZiAocHBjX21kLmluaXRfSVJRKQorCQlwcGNfbWQuaW5pdF9JUlEoKTsKICNpZmRlZiBDT05GSUdfUFBDNjQKIAlpcnFfY3R4X2luaXQoKTsKICNlbmRpZgpAQCAtNTk3LDYgKzU5Nyw0OSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBpcnFfc2V0dXBfdmlycShzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgIGlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwkvKiBDbGVhciBJUlFfTk9SRVFVRVNUIGZsYWcgKi8KKwlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKKworCS8qIG1hcCBpdCAqLworCXNtcF93bWIoKTsKKwlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaHdpcnE7CisJc21wX21iKCk7CisKKwlpZiAoaG9zdC0+b3BzLT5tYXAoaG9zdCwgdmlycSwgaHdpcnEpKSB7CisJCXByX2RlYnVnKCJpcnE6IC0+IG1hcHBpbmcgZmFpbGVkLCBmcmVlaW5nXG4iKTsKKwkJaXJxX2ZyZWVfdmlydCh2aXJxLCAxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9kaXJlY3RfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QpCit7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlob3N0ID0gaXJxX2RlZmF1bHRfaG9zdDsKKworCUJVR19PTihob3N0ID09IE5VTEwpOworCVdBUk5fT04oaG9zdC0+cmV2bWFwX3R5cGUgIT0gSVJRX0hPU1RfTUFQX05PTUFQKTsKKworCXZpcnEgPSBpcnFfYWxsb2NfdmlydChob3N0LCAxLCAwKTsKKwlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJcHJfZGVidWcoImlycTogY3JlYXRlX2RpcmVjdCB2aXJxIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5PX0lSUTsKKwl9CisKKwlwcl9kZWJ1ZygiaXJxOiBjcmVhdGVfZGlyZWN0IG9idGFpbmVkIHZpcnEgJWRcbiIsIHZpcnEpOworCisJaWYgKGlycV9zZXR1cF92aXJxKGhvc3QsIHZpcnEsIHZpcnEpKQorCQlyZXR1cm4gTk9fSVJROworCisJcmV0dXJuIHZpcnE7Cit9CiAKIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0LAogCQkJCWlycV9od19udW1iZXJfdCBod2lycSkKQEAgLTY0NSwxOCArNjg4LDkgQEAKIAl9CiAJcHJfZGVidWcoImlycTogLT4gb2J0YWluZWQgdmlycSAlZFxuIiwgdmlycSk7CiAKLQkvKiBDbGVhciBJUlFfTk9SRVFVRVNUIGZsYWcgKi8KLQlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyAmPSB+SVJRX05PUkVRVUVTVDsKLQotCS8qIG1hcCBpdCAqLwotCXNtcF93bWIoKTsKLQlpcnFfbWFwW3ZpcnFdLmh3aXJxID0gaHdpcnE7Ci0Jc21wX21iKCk7Ci0JaWYgKGhvc3QtPm9wcy0+bWFwKGhvc3QsIHZpcnEsIGh3aXJxKSkgewotCQlwcl9kZWJ1ZygiaXJxOiAtPiBtYXBwaW5nIGZhaWxlZCwgZnJlZWluZ1xuIik7Ci0JCWlycV9mcmVlX3ZpcnQodmlycSwgMSk7CisJaWYgKGlycV9zZXR1cF92aXJxKGhvc3QsIHZpcnEsIGh3aXJxKSkKIAkJcmV0dXJuIE5PX0lSUTsKLQl9CisKIAlyZXR1cm4gdmlycTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9jcmVhdGVfbWFwcGluZyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXNhLWJyaWRnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjQ5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lzYS1icmlkZ2UuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIFJvdXRpbmVzIGZvciB0cmFja2luZyBhIGxlZ2FjeSBJU0EgYnJpZGdlCisgKgorICogQ29weXJpZ2ggMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqCisgKiBTb21lIGJpdHMgYW5kIHBpZWNlcyBtb3ZlZCBvdmVyIGZyb20gcGNpXzY0LmMKKyAqCisgKiBDb3B5cmlnaCAyMDAzIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTSBDb3JwLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKK3Vuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2U7CS8qIE5VTEwgaWYgbm8gSVNBIGJ1cyAqLworRVhQT1JUX1NZTUJPTChpc2FfaW9fYmFzZSk7CisKKy8qIENhY2hlZCBJU0EgYnJpZGdlIGRldi4gKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9icmlkZ2VfZGV2bm9kZTsKK3N0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlX3BjaWRldjsKK0VYUE9SVF9TWU1CT0xfR1BMKGlzYV9icmlkZ2VfcGNpZGV2KTsKKworI2RlZmluZSBJU0FfU1BBQ0VfTUFTSyAweDEKKyNkZWZpbmUgSVNBX1NQQUNFX0lPIDB4MQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3Byb2Nlc3NfSVNBX09GX3JhbmdlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmlzYV9ub2RlLAorCQkJCQkJdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzKQoreworCS8qIFdlIHNob3VsZCBnZXQgc29tZSBzYW5lciBwYXJzaW5nIGhlcmUgYW5kIHJlbW92ZSB0aGVzZSBzdHJ1Y3RzICovCisJc3RydWN0IHBjaV9hZGRyZXNzIHsKKwkJdTMyIGFfaGk7CisJCXUzMiBhX21pZDsKKwkJdTMyIGFfbG87CisJfTsKKworCXN0cnVjdCBpc2FfYWRkcmVzcyB7CisJCXUzMiBhX2hpOworCQl1MzIgYV9sbzsKKwl9OworCisJc3RydWN0IGlzYV9yYW5nZSB7CisJCXN0cnVjdCBpc2FfYWRkcmVzcyBpc2FfYWRkcjsKKwkJc3RydWN0IHBjaV9hZGRyZXNzIHBjaV9hZGRyOworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl9OworCisJY29uc3Qgc3RydWN0IGlzYV9yYW5nZSAqcmFuZ2U7CisJdW5zaWduZWQgbG9uZyBwY2lfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXNhX2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IHJsZW4gPSAwOworCisJcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkoaXNhX25vZGUsICJyYW5nZXMiLCAmcmxlbik7CisJaWYgKHJhbmdlID09IE5VTEwgfHwgKHJsZW4gPCBzaXplb2Yoc3RydWN0IGlzYV9yYW5nZSkpKQorCQlnb3RvIGludmFsX3JhbmdlOworCisJLyogRnJvbSAiSVNBIEJpbmRpbmcgdG8gMTI3NSIKKwkgKiBUaGUgcmFuZ2VzIHByb3BlcnR5IGlzIGxhaWQgb3V0IGFzIGFuIGFycmF5IG9mIGVsZW1lbnRzLAorCSAqIGVhY2ggb2Ygd2hpY2ggY29tcHJpc2VzOgorCSAqICAgY2VsbHMgMCAtIDE6CWFuIElTQSBhZGRyZXNzCisJICogICBjZWxscyAyIC0gNDoJYSBQQ0kgYWRkcmVzcworCSAqCQkJKHNpemUgZGVwZW5kaW5nIG9uIGRldi0+bl9hZGRyX2NlbGxzKQorCSAqICAgY2VsbCA1OgkJdGhlIHNpemUgb2YgdGhlIHJhbmdlCisJICovCisJaWYgKChyYW5nZS0+aXNhX2FkZHIuYV9oaSAmJiBJU0FfU1BBQ0VfTUFTSykgIT0gSVNBX1NQQUNFX0lPKSB7CisJCXJhbmdlKys7CisJCXJsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpOworCQlpZiAocmxlbiA8IHNpemVvZihzdHJ1Y3QgaXNhX3JhbmdlKSkKKwkJCWdvdG8gaW52YWxfcmFuZ2U7CisJfQorCWlmICgocmFuZ2UtPmlzYV9hZGRyLmFfaGkgJiYgSVNBX1NQQUNFX01BU0spICE9IElTQV9TUEFDRV9JTykKKwkJZ290byBpbnZhbF9yYW5nZTsKKworCWlzYV9hZGRyID0gcmFuZ2UtPmlzYV9hZGRyLmFfbG87CisJcGNpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmFuZ2UtPnBjaV9hZGRyLmFfbWlkIDw8IDMyIHwKKwkJcmFuZ2UtPnBjaV9hZGRyLmFfbG87CisKKwkvKiBBc3N1bWUgdGhlc2UgYXJlIGJvdGggemVyby4gTm90ZTogV2UgY291bGQgZml4IHRoYXQgYW5kCisJICogZG8gYSBwcm9wZXIgcGFyc2luZyBpbnN0ZWFkIC4uLiBvaCB3ZWxsLCB0aGF0IHdpbGwgZG8gZm9yCisJICogbm93IGFzIG5vYm9keSB1c2VzIGZhbmN5IG1hcHBpbmdzIGZvciBJU0EgYnJpZGdlcworCSAqLworCWlmICgocGNpX2FkZHIgIT0gMCkgfHwgKGlzYV9hZGRyICE9IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBpc2EgdG8gcGNpIG1hcHBpbmc6ICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsaWduIHNpemUgYW5kIG1ha2Ugc3VyZSBpdCdzIGNyb3BwZWQgdG8gNjRLICovCisJc2l6ZSA9IFBBR0VfQUxJR04ocmFuZ2UtPnNpemUpOworCWlmIChzaXplID4gMHgxMDAwMCkKKwkJc2l6ZSA9IDB4MTAwMDA7CisKKwlwcmludGsoS0VSTl9FUlIgIm5vIElTQSBJTyByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2UsIgorCSAgICAgICAibWFwcGluZyA2NGtcbiIpOworCisJX19pb3JlbWFwX2F0KHBoYl9pb19iYXNlX3BoeXMsICh2b2lkICopSVNBX0lPX0JBU0UsCisJCSAgICAgc2l6ZSwgX1BBR0VfTk9fQ0FDSEV8X1BBR0VfR1VBUkRFRCk7CisJcmV0dXJuOworCitpbnZhbF9yYW5nZToKKwlwcmludGsoS0VSTl9FUlIgIm5vIElTQSBJTyByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2UsIgorCSAgICAgICAibWFwcGluZyA2NGtcbiIpOworCV9faW9yZW1hcF9hdChwaGJfaW9fYmFzZV9waHlzLCAodm9pZCAqKUlTQV9JT19CQVNFLAorCQkgICAgIDB4MTAwMDAsIF9QQUdFX05PX0NBQ0hFfF9QQUdFX0dVQVJERUQpOworfQorCisKKy8qKgorICogaXNhX2JyaWRnZV9maW5kX2Vhcmx5IC0gRmluZCBhbmQgbWFwIHRoZSBJU0EgSU8gc3BhY2UgZWFybHkgYmVmb3JlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBtYWluIFBDSSBkaXNjb3ZlcnkuIFRoaXMgaXMgb3B0aW9uYWxseSBjYWxsZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcmNoIGNvZGUgd2hlbiBhZGRpbmcgUENJIFBIQnMgdG8gZ2V0IGVhcmx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgdG8gSVNBIElPIHBvcnRzCisgKi8KK3ZvaWQgX19pbml0IGlzYV9icmlkZ2VfZmluZF9lYXJseShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnBhcmVudCA9IE5VTEwsICp0bXA7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gSVNBIGJyaWRnZSwgYmFpbCBvZmYgKi8KKwlpZiAoaXNhX2JyaWRnZV9kZXZub2RlICE9IE5VTEwpCisJCXJldHVybjsKKworCS8qIEZvciBlYWNoICJpc2EiIG5vZGUgaW4gdGhlIHN5c3RlbS4gTm90ZSA6IHdlIGRvIGEgc2VhcmNoIGJ5CisJICogdHlwZSBhbmQgbm90IGJ5IG5hbWUuIEl0IG1pZ2h0IGJlIGJldHRlciB0byBkbyBieSBuYW1lIGJ1dCB0aGF0J3MKKwkgKiB3aGF0IHRoZSBjb2RlIHVzZWQgdG8gZG8gYW5kIEkgZG9uJ3Qgd2FudCB0byBicmVhayB0b28gbXVjaCBhdAorCSAqIG9uY2UuIFdlIGNhbiBsb29rIGludG8gY2hhbmdpbmcgdGhhdCBzZXBhcmF0ZWx5CisJICovCisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiaXNhIikgeworCQkvKiBMb29rIGZvciBvdXIgaG9zZSBiZWluZyBhIHBhcmVudCAqLworCQlmb3IgKHBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOyBwYXJlbnQ7KSB7CisJCQlpZiAocGFyZW50ID09IGhvc2UtPmFyY2hfZGF0YSkgeworCQkJCW9mX25vZGVfcHV0KHBhcmVudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0bXAgPSBwYXJlbnQ7CisJCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KHBhcmVudCk7CisJCQlvZl9ub2RlX3B1dCh0bXApOworCQl9CisJCWlmIChwYXJlbnQgIT0gTlVMTCkKKwkJCWJyZWFrOworCX0KKwlpZiAobnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlzYV9icmlkZ2VfZGV2bm9kZSA9IG5wOworCisJLyogTm93IHBhcnNlIHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSBhbmQgc2V0dXAgdGhlIElTQSBtYXBwaW5nICovCisJcGNpX3Byb2Nlc3NfSVNBX09GX3JhbmdlcyhucCwgaG9zZS0+aW9fYmFzZV9waHlzKTsKKworCS8qIFNldCB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHdlIGhhdmUgYW4gSVNBIGJyaWRnZSAqLworCWlzYV9pb19iYXNlID0gSVNBX0lPX0JBU0U7CisKKwlwcl9kZWJ1ZygiSVNBIGJyaWRnZSAoZWFybHkpIGlzICVzXG4iLCBucC0+ZnVsbF9uYW1lKTsKK30KKworLyoqCisgKiBpc2FfYnJpZGdlX2ZpbmRfbGF0ZSAtIEZpbmQgYW5kIG1hcCB0aGUgSVNBIElPIHNwYWNlIHVwb24gZGlzY292ZXJ5IG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgbmV3IElTQSBicmlkZ2UKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGlzYV9icmlkZ2VfZmluZF9sYXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldm5vZGUpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KHBkZXYtPmJ1cyk7CisKKwkvKiBTdG9yZSBJU0EgZGV2aWNlIG5vZGUgYW5kIFBDSSBkZXZpY2UgKi8KKwlpc2FfYnJpZGdlX2Rldm5vZGUgPSBvZl9ub2RlX2dldChkZXZub2RlKTsKKwlpc2FfYnJpZGdlX3BjaWRldiA9IHBkZXY7CisKKwkvKiBOb3cgcGFyc2UgdGhlICJyYW5nZXMiIHByb3BlcnR5IGFuZCBzZXR1cCB0aGUgSVNBIG1hcHBpbmcgKi8KKwlwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKGRldm5vZGUsIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CisKKwkvKiBTZXQgdGhlIGdsb2JhbCBJU0EgaW8gYmFzZSB0byBpbmRpY2F0ZSB3ZSBoYXZlIGFuIElTQSBicmlkZ2UgKi8KKwlpc2FfaW9fYmFzZSA9IElTQV9JT19CQVNFOworCisJcHJfZGVidWcoIklTQSBicmlkZ2UgKGxhdGUpIGlzICVzIG9uICVzXG4iLAorCQkgZGV2bm9kZS0+ZnVsbF9uYW1lLCBwY2lfbmFtZShwZGV2KSk7Cit9CisKKy8qKgorICogaXNhX2JyaWRnZV9yZW1vdmUgLSBSZW1vdmUvdW5tYXAgYW4gSVNBIGJyaWRnZQorICovCitzdGF0aWMgdm9pZCBpc2FfYnJpZGdlX3JlbW92ZSh2b2lkKQoreworCXByX2RlYnVnKCJJU0EgYnJpZGdlIHJlbW92ZWQgIVxuIik7CisKKwkvKiBDbGVhciB0aGUgZ2xvYmFsIElTQSBpbyBiYXNlIHRvIGluZGljYXRlIHRoYXQgd2UgaGF2ZSBubyBtb3JlCisJICogSVNBIGJyaWRnZS4gTm90ZSB0aGF0IGRyaXZlcnMgZG9uJ3QgcXVpdGUgaGFuZGxlIHRoYXQsIHRob3VnaAorCSAqIHdlIHNob3VsZCBwcm9iYWJseSBkbyBzb21ldGhpbmcgYWJvdXQgaXQuIEJ1dCBkbyB3ZSBldmVyIHJlYWxseQorCSAqIGhhdmUgSVNBIGJyaWRnZXMgYmVpbmcgcmVtb3ZlZCBvbiBtYWNoaW5lcyB1c2luZyBsZWdhY3kgZGV2aWNlcyA/CisJICovCisJaXNhX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKKworCS8qIENsZWFyIHJlZmVyZW5jZXMgdG8gdGhlIGJyaWRnZSAqLworCW9mX25vZGVfcHV0KGlzYV9icmlkZ2VfZGV2bm9kZSk7CisJaXNhX2JyaWRnZV9kZXZub2RlID0gTlVMTDsKKwlpc2FfYnJpZGdlX3BjaWRldiA9IE5VTEw7CisKKwkvKiBVbm1hcCB0aGUgSVNBIGFyZWEgKi8KKwlfX2lvdW5tYXBfYXQoKHZvaWQgKilJU0FfSU9fQkFTRSwgMHgxMDAwMCk7Cit9CisKKy8qKgorICogaXNhX2JyaWRnZV9ub3RpZnkgLSBHZXQgbm90aWZpZWQgb2YgUENJIGRldmljZXMgYWRkaXRpb24vcmVtb3ZhbAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2FfYnJpZGdlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2bm9kZSA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKworCXN3aXRjaChhY3Rpb24pIHsKKwljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbiBlYXJseSBJU0EgZGV2aWNlLCB3aXRob3V0IFBDSSBkZXYgKi8KKwkJaWYgKGlzYV9icmlkZ2VfZGV2bm9kZSAmJiBpc2FfYnJpZGdlX2Rldm5vZGUgPT0gZGV2bm9kZSAmJgorCQkgICAgIWlzYV9icmlkZ2VfcGNpZGV2KSB7CisJCQlwcl9kZWJ1ZygiSVNBIGJyaWRnZSBQQ0kgYXR0YWNoZWQ6ICVzXG4iLAorCQkJCSBwY2lfbmFtZShwZGV2KSk7CisJCQlpc2FfYnJpZGdlX3BjaWRldiA9IHBkZXY7CisJCX0KKworCQkvKiBDaGVjayBpZiB3ZSBoYXZlIG5vIElTQSBkZXZpY2UsIGFuZCB0aGlzIGhhcHBlbnMgdG8gYmUgb25lLAorCQkgKiByZWdpc3RlciBpdCBhcyBzdWNoIGlmIGl0IGhhcyBhbiBPRiBkZXZpY2UKKwkJICovCisJCWlmICghaXNhX2JyaWRnZV9kZXZub2RlICYmIGRldm5vZGUgJiYgZGV2bm9kZS0+dHlwZSAmJgorCQkgICAgIXN0cmNtcChkZXZub2RlLT50eXBlLCAiaXNhIikpCisJCQlpc2FfYnJpZGdlX2ZpbmRfbGF0ZShwZGV2LCBkZXZub2RlKTsKKworCQlyZXR1cm4gMDsKKwljYXNlIEJVU19OT1RJRllfREVMX0RFVklDRToKKwkJLyogQ2hlY2sgaWYgdGhpcyBvdXIgZXhpc3RpbmcgSVNBIGRldmljZSAqLworCQlpZiAocGRldiA9PSBpc2FfYnJpZGdlX3BjaWRldiB8fAorCQkgICAgKGRldm5vZGUgJiYgZGV2bm9kZSA9PSBpc2FfYnJpZGdlX2Rldm5vZGUpKQorCQkJaXNhX2JyaWRnZV9yZW1vdmUoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlzYV9icmlkZ2Vfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpc2FfYnJpZGdlX25vdGlmeQorfTsKKworLyoqCisgKiBpc2FfYnJpZGdlX2luaXQgLSByZWdpc3RlciB0byBiZSBub3RpZmllZCBvZiBJU0EgYnJpZGdlIGFkZGl0aW9uL3JlbW92YWwKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlzYV9icmlkZ2VfaW5pdCh2b2lkKQoreworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gMDsKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBjaV9idXNfdHlwZSwgJmlzYV9icmlkZ2Vfbm90aWZpZXIpOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChpc2FfYnJpZGdlX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCA5OGRlY2Y4Li5lNzA4YWI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJbXRzcHIgICBTUFJOX0wxQ1NSMCxyMwogCWlzeW5jCiAJYmxyCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCiAJbWZzcHIJcjMsU1BSTl9MMUNTUjEKIAlvcmkJcjMscjMsTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSCiAJbXRzcHIJU1BSTl9MMUNTUjEscjMKQEAgLTQxOSw3ICs0MTksNyBAQAogX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKIAlhbmRjCXIzLHIzLHI1CiAJc3ViZglyNCxyMyxyNApAQCAtNTE0LDggKzUxNCw4IEBACiAgKi8KIF9HTE9CQUwoX19mbHVzaF9kY2FjaGVfaWNhY2hlKQogQkVHSU5fRlRSX1NFQ1RJT04KLQlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorCWJscgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCXJsd2lubQlyMyxyMywwLDAsMTkJCQkvKiBHZXQgcGFnZSBiYXNlIGFkZHJlc3MgKi8KIAlsaQlyNCw0MDk2L0wxX0NBQ0hFX0JZVEVTCS8qIE51bWJlciBvZiBsaW5lcyBpbiBhIHBhZ2UgKi8KIAltdGN0cglyNApAQCAtNTQzLDcgKzU0Myw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZV9waHlzKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlibHIJCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCW1mbXNyCXIxMAogCXJsd2lubQlyMCxyMTAsMCwyOCwyNgkJCS8qIGNsZWFyIERSICovCiAJbXRtc3IJcjAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWlzY182NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKaW5kZXggNTE5ODYxZC4uYmJiM2JhNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMKQEAgLTY0Niw2ICs2NDYsMTkgQEAKIAkvKiB0dXJuIG9mZiBtbXUgKi8KIAlibAlyZWFsX21vZGUKIAorCS8qIGNvcHkgIDB4MTAwIGJ5dGVzIHN0YXJ0aW5nIGF0IHN0YXJ0IHRvIDAgKi8KKwlsaQlyMywwCisJbXIJcjQscjMwCQkvKiBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldCAqLworCWxpCXI1LDB4MTAwCisJbGkJcjYsMAorCWJsCS5jb3B5X2FuZF9mbHVzaAkvKiAoZGVzdCwgc3JjLCBjb3B5IGxpbWl0LCBzdGFydCBvZmZzZXQpICovCisxOgkvKiBhc3N1bWUgbm9ybWFsIGJsciByZXR1cm4gKi8KKworCS8qIHJlbGVhc2Ugb3RoZXIgY3B1cyB0byB0aGUgbmV3IGtlcm5lbCBzZWNvbmRhcnkgc3RhcnQgYXQgMHg2MCAqLworCW1mbHIJcjUKKwlsaQlyNiwxCisJc3R3CXI2LGtleGVjX2ZsYWctMWIoNSkKKwogCS8qIGNsZWFyIG91dCBoYXJkd2FyZSBoYXNoIHBhZ2UgdGFibGUgYW5kIHRsYiAqLwogCWxkCXI1LDAocjI3KQkJLyogZGVyZWYgZnVuY3Rpb24gZGVzY3JpcHRvciAqLwogCW10Y3RyCXI1CkBAIC02NzYsMTkgKzY4OSw2IEBACiAgKiAgICBhcmUgdGhlIGJvb3QgY3B1ID8/Pz8/CiAgKiAgICBvdGhlciBkZXZpY2UgdHJlZSBkaWZmZXJlbmNlcyAocHJvcCBzaXplcywgdmEgdnMgcGEsIGV0YykuLi4KICAqLwotCi0JLyogY29weSAgMHgxMDAgYnl0ZXMgc3RhcnRpbmcgYXQgc3RhcnQgdG8gMCAqLwotCWxpCXIzLDAKLQltcglyNCxyMzAKLQlsaQlyNSwweDEwMAotCWxpCXI2LDAKLQlibAkuY29weV9hbmRfZmx1c2gJLyogKGRlc3QsIHNyYywgY29weSBsaW1pdCwgc3RhcnQgb2Zmc2V0KSAqLwotMToJLyogYXNzdW1lIG5vcm1hbCBibHIgcmV0dXJuICovCi0KLQkvKiByZWxlYXNlIG90aGVyIGNwdXMgdG8gdGhlIG5ldyBrZXJuZWwgc2Vjb25kYXJ5IHN0YXJ0IGF0IDB4NjAgKi8KLQltZmxyCXI1Ci0JbGkJcjYsMQotCXN0dwlyNixrZXhlY19mbGFnLTFiKDUpCiAJbXIJcjMscjI1CSMgbXkgcGh5cyBjcHUKIAltcglyNCxyMzAJIyBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldAogCW10bHIJNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9vZl9wbGF0Zm9ybS5jCmluZGV4IGQ0NTRmNjEuLjk1MzZlZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvb2ZfcGxhdGZvcm0uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL29mX3BsYXRmb3JtLmMKQEAgLTQyNywxNCArNDI3LDYgQEAKIAkvKiBQcm9jZXNzICJyYW5nZXMiIHByb3BlcnR5ICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIGRldi0+bm9kZSwgMCk7CiAKLQkvKiBTZXR1cCBJTyBzcGFjZS4gV2UgdXNlIHRoZSBub24tZHluYW1pYyB2ZXJzaW9uIG9mIHRoYXQgY29kZSBoZXJlLAotCSAqIHdoaWNoIGRvZXNuJ3QgcXVpdGUgc3VwcG9ydCB1bnBsdWdnaW5nLiBOZXh0IGtlcm5lbCByZWxlYXNlIHdpbGwKLQkgKiBoYXZlIGEgYmV0dGVyIGZpeCBmb3IgdGhpcy4KLQkgKiBOb3RlIGFsc28gdGhhdCB3ZSBkb24ndCBkbyBJU0EsIHRoaXMgd2lsbCBhbHNvIGJlIGZpeGVkIHdpdGggYQotCSAqIG1vcmUgbWFzc2l2ZSByZXdvcmsuCi0JICovCi0JcGNpX3NldHVwX3BoYl9pbyhwaGIsIHBjaV9pb19iYXNlID09IDApOwotCiAJLyogSW5pdCBwY2lfZG4gZGF0YSBzdHJ1Y3R1cmVzICovCiAJcGNpX2RldnNfcGhiX2luaXRfZHluYW1pYyhwaGIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjVlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYwpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvbnRhaW5zIGNvbW1vbiBwY2kgcm91dGluZXMgZm9yIEFMTCBwcGMgcGxhdGZvcm0KKyAqIChiYXNlZCBvbiBwY2lfMzIuYyBhbmQgcGNpXzY0LmMpCisgKgorICogUG9ydCBmb3IgUFBDNjQgRGF2aWQgRW5nZWJyZXRzZW4sIElCTSBDb3JwLgorICogQ29udGFpbnMgY29tbW9uIHBjaSByb3V0aW5lcyBmb3IgcHBjNjQgcGxhdGZvcm0sIHBTZXJpZXMgYW5kIGlTZXJpZXMgYnJhbmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+LCBJQk0KKyAqICAgUmV3b3JrLCBiYXNlZCBvbiBhbHBoYSBQQ0kgY29kZS4KKyAqCisgKiBDb21tb24gcG1hYy9wcmVwL2NocnAgcGNpIHJvdXRpbmVzLiAtLSBDb3J0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CisKKyNpZmRlZiBERUJVRworI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKQorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zZV9zcGlubG9jayk7CisKKy8qIFhYWCBraWxsIHRoYXQgc29tZSBkYXkgLi4uICovCitpbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaG9zZV9saXN0OworCisvKgorICogcGNpX2NvbnRyb2xsZXIocGhiKSBpbml0aWFsaXplZCBjb21tb24gdmFyaWFibGVzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpX3NldHVwX3BjaV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwltZW1zZXQoaG9zZSwgMCwgc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlcikpOworCisJc3Bpbl9sb2NrKCZob3NlX3NwaW5sb2NrKTsKKwlob3NlLT5nbG9iYWxfbnVtYmVyID0gZ2xvYmFsX3BoYl9udW1iZXIrKzsKKwlsaXN0X2FkZF90YWlsKCZob3NlLT5saXN0X25vZGUsICZob3NlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZob3NlX3NwaW5sb2NrKTsKK30KKworc3RydWN0IHBjaV9jb250cm9sbGVyICogcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiOworCisJaWYgKG1lbV9pbml0X2RvbmUpCisJCXBoYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfY29udHJvbGxlciksIEdGUF9LRVJORUwpOworCWVsc2UKKwkJcGhiID0gYWxsb2NfYm9vdG1lbShzaXplb2YgKHN0cnVjdCBwY2lfY29udHJvbGxlcikpOworCWlmIChwaGIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcGNpX3NldHVwX3BjaV9jb250cm9sbGVyKHBoYik7CisJcGhiLT5hcmNoX2RhdGEgPSBkZXY7CisJcGhiLT5pc19keW5hbWljID0gbWVtX2luaXRfZG9uZTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlpZiAoZGV2KSB7CisJCWludCBuaWQgPSBvZl9ub2RlX3RvX25pZChkZXYpOworCisJCWlmIChuaWQgPCAwIHx8ICFub2RlX29ubGluZShuaWQpKQorCQkJbmlkID0gLTE7CisKKwkJUEhCX1NFVF9OT0RFKHBoYiwgbmlkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcGhiOworfQorCit2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQoreworCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7CisJbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKKwlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7CisKKwlpZiAocGhiLT5pc19keW5hbWljKQorCQlrZnJlZShwaGIpOworfQorCisvKgorICogUmV0dXJuIHRoZSBkb21haW4gbnVtYmVyIGZvciB0aGlzIGJ1cy4KKyAqLworaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCisJCXJldHVybiBob3NlLT5nbG9iYWxfbnVtYmVyOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwY2lfZG9tYWluX25yKTsKKworI2lmZGVmIENPTkZJR19QUENfT0YKKworLyogVGhpcyByb3V0aW5lIGlzIG1lYW50IHRvIGJlIHVzZWQgZWFybHkgZHVyaW5nIGJvb3QsIHdoZW4gdGhlCisgKiBQQ0kgYnVzIG51bWJlcnMgaGF2ZSBub3QgeWV0IGJlZW4gYXNzaWduZWQsIGFuZCB5b3UgbmVlZCB0bworICogaXNzdWUgUENJIGNvbmZpZyBjeWNsZXMgdG8gYW4gT0YgZGV2aWNlLgorICogSXQgY291bGQgYWxzbyBiZSB1c2VkIHRvICJmaXgiIFJUQVMgY29uZmlnIGN5Y2xlcyBpZiB5b3Ugd2FudAorICogdG8gc2V0IHBjaV9hc3NpZ25fYWxsX2J1c2VzIHRvIDEgYW5kIHN0aWxsIHVzZSBSVEFTIGZvciBQQ0kKKyAqIGNvbmZpZyBjeWNsZXMuCisgKi8KK3N0cnVjdCBwY2lfY29udHJvbGxlciogcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSkKK3sKKwlpZiAoIWhhdmVfb2YpCisJCXJldHVybiBOVUxMOworCXdoaWxlKG5vZGUpIHsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpCisJCQlpZiAoaG9zZS0+YXJjaF9kYXRhID09IG5vZGUpCisJCQkJcmV0dXJuIGhvc2U7CisJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3NpemVfdCBwY2lfc2hvd19kZXZzcGVjKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJcGRldiA9IHRvX3BjaV9kZXYgKGRldik7CisJbnAgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisJaWYgKG5wID09IE5VTEwgfHwgbnAtPmZ1bGxfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIG5wLT5mdWxsX25hbWUpOworfQorc3RhdGljIERFVklDRV9BVFRSKGRldnNwZWMsIFNfSVJVR08sIHBjaV9zaG93X2RldnNwZWMsIE5VTEwpOworI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KKworLyogQWRkIHN5c2ZzIHByb3BlcnRpZXMgKi8KK3ZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyNpZmRlZiBDT05GSUdfUFBDX09GCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCit9CisKK2NoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc3RyOworfQorCisvKgorICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KKyAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQorICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCisgKi8KK2ludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOworCisjaWZkZWYgREVCVUcKKwltZW1zZXQoJm9pcnEsIDB4ZmYsIHNpemVvZihvaXJxKSk7CisjZW5kaWYKKwkvKiBUcnkgdG8gZ2V0IGEgbWFwcGluZyBmcm9tIHRoZSBkZXZpY2UtdHJlZSAqLworCWlmIChvZl9pcnFfbWFwX3BjaShwY2lfZGV2LCAmb2lycSkpIHsKKwkJdTggbGluZSwgcGluOworCisJCS8qIElmIHRoYXQgZmFpbHMsIGxldHMgZmFsbGJhY2sgdG8gd2hhdCBpcyBpbiB0aGUgY29uZmlnCisJCSAqIHNwYWNlIGFuZCBtYXAgdGhhdCB0aHJvdWdoIHRoZSBkZWZhdWx0IGNvbnRyb2xsZXIuIFdlCisJCSAqIGFsc28gc2V0IHRoZSB0eXBlIHRvIGxldmVsIGxvdyBzaW5jZSB0aGF0J3Mgd2hhdCBQQ0kKKwkJICogaW50ZXJydXB0cyBhcmUuIElmIHlvdXIgcGxhdGZvcm0gZG9lcyBkaWZmZXJlbnRseSwgdGhlbgorCQkgKiBlaXRoZXIgcHJvdmlkZSBhIHByb3BlciBpbnRlcnJ1cHQgdHJlZSBvciBkb24ndCB1c2UgdGhpcworCQkgKiBmdW5jdGlvbi4KKwkJICovCisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbikpCisJCQlyZXR1cm4gLTE7CisJCWlmIChwaW4gPT0gMCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmxpbmUpIHx8CisJCSAgICBsaW5lID09IDB4ZmYpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlEQkcoIiAtPiBubyBtYXAgISBVc2luZyBpcnEgbGluZSAlZCBmcm9tIFBDSSBjb25maWdcbiIsIGxpbmUpOworCisJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgbGluZSk7CisJCWlmICh2aXJxICE9IE5PX0lSUSkKKwkJCXNldF9pcnFfdHlwZSh2aXJxLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCX0gZWxzZSB7CisJCURCRygiIC0+IGdvdCBvbmUsIHNwZWMgJWQgY2VsbHMgKDB4JTA4eCAweCUwOHguLi4pIG9uICVzXG4iLAorCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5zcGVjaWZpZXJbMV0sCisJCSAgICBvaXJxLmNvbnRyb2xsZXItPmZ1bGxfbmFtZSk7CisKKwkJdmlycSA9IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAorCQkJCQkgICAgIG9pcnEuc2l6ZSk7CisJfQorCWlmKHZpcnEgPT0gTk9fSVJRKSB7CisJCURCRygiIC0+IGZhaWxlZCB0byBtYXAgIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlEQkcoIiAtPiBtYXBwZWQgdG8gbGludXggaXJxICVkXG4iLCB2aXJxKTsKKworCXBjaV9kZXYtPmlycSA9IHZpcnE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOworCisvKgorICogUGxhdGZvcm0gc3VwcG9ydCBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbW1hcCgpcywKKyAqIG1vZGVsbGVkIG9uIHRoZSBzcGFyYzY0IGltcGxlbWVudGF0aW9uIGJ5IERhdmUgTWlsbGVyLgorICogIC0tIHBhdWx1cy4KKyAqLworCisvKgorICogQWRqdXN0IHZtX3Bnb2ZmIG9mIFZNQSBzdWNoIHRoYXQgaXQgaXMgdGhlIHBoeXNpY2FsIHBhZ2Ugb2Zmc2V0CisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMi1iaXQgcGNpIGJ1cyBvZmZzZXQgZm9yIERFViByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCisgKgorICogQmFzaWNhbGx5LCB0aGUgdXNlciBmaW5kcyB0aGUgYmFzZSBhZGRyZXNzIGZvciBoaXMgZGV2aWNlIHdoaWNoIGhlIHdpc2hlcworICogdG8gbW1hcC4gIFRoZXkgcmVhZCB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGNvbmZpZyBzcGFjZSBiYXNlIHJlZ2lzdGVyLAorICogYWRkIHdoYXRldmVyIFBBR0VfU0laRSBtdWx0aXBsZSBvZmZzZXQgdGhleSB3aXNoLCBhbmQgZmVlZCB0aGlzIGludG8gdGhlCisgKiBvZmZzZXQgcGFyYW1ldGVyIG9mIG1tYXAgb24gL3Byb2MvYnVzL3BjaS9YWFggZm9yIHRoYXQgZGV2aWNlLgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKl9fcGNpX21tYXBfbWFrZV9vZmZzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCAqb2Zmc2V0LAorCQkJCQkgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisJdW5zaWduZWQgbG9uZyBpb19vZmZzZXQgPSAwOworCWludCBpLCByZXNfYml0OworCisJaWYgKGhvc2UgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgeworI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gcGNpX3Jlc291cmNlX3RvX3VzZXIoKSBmb3Igd2h5IHRoaXMgaXMgZGlzYWJsZWQgKi8KKwkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKKyNlbmRpZgorCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CisJfSBlbHNlIHsKKwkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OworCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCByZXF1ZXN0ZWQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZQorCSAqIHJlc291cmNlcyBvZiB0aGUgZGV2aWNlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJaW50IGZsYWdzID0gcnAtPmZsYWdzOworCisJCS8qIHRyZWF0IFJPTSBhcyBtZW1vcnkgKHNob3VsZCBiZSBhbHJlYWR5KSAqLworCQlpZiAoaSA9PSBQQ0lfUk9NX1JFU09VUkNFKQorCQkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU07CisKKwkJLyogQWN0aXZlIGFuZCBzYW1lIHR5cGU/ICovCisJCWlmICgoZmxhZ3MgJiByZXNfYml0KSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCisJCWlmICgqb2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwgKm9mZnNldCA+IHJwLT5lbmQpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCBpdCEgY29uc3RydWN0IHRoZSBmaW5hbCBwaHlzaWNhbCBhZGRyZXNzICovCisJCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQorCQkJKm9mZnNldCArPSBob3NlLT5pb19iYXNlX3BoeXMgLSBpb19vZmZzZXQ7CisJCXJldHVybiBycDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNldCB2bV9wYWdlX3Byb3Qgb2YgVk1BLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUsIGZvciBhIHBjaQorICogZGV2aWNlIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBwZ3Byb3RfdCBfX3BjaV9tbWFwX3NldF9wZ3Byb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpycCwKKwkJCQkgICAgICBwZ3Byb3RfdCBwcm90ZWN0aW9uLAorCQkJCSAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKKwkJCQkgICAgICBpbnQgd3JpdGVfY29tYmluZSkKK3sKKwl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOworCisJLyogV3JpdGUgY29tYmluZSBpcyBhbHdheXMgMCBvbiBub24tbWVtb3J5IHNwYWNlIG1hcHBpbmdzLiBPbgorCSAqIG1lbW9yeSBzcGFjZSwgaWYgdGhlIHVzZXIgZGlkbid0IHBhc3MgMSwgd2UgY2hlY2sgZm9yIGEKKwkgKiAicHJlZmV0Y2hhYmxlIiByZXNvdXJjZS4gVGhpcyBpcyBhIGJpdCBoYWNraXNoLCBidXQgd2UgdXNlCisJICogdGhpcyB0byB3b3JrYXJvdW5kIHRoZSBpbmFiaWxpdHkgb2YgL3N5c2ZzIHRvIHByb3ZpZGUgYSB3cml0ZQorCSAqIGNvbWJpbmUgYml0CisJICovCisJaWYgKG1tYXBfc3RhdGUgIT0gcGNpX21tYXBfbWVtKQorCQl3cml0ZV9jb21iaW5lID0gMDsKKwllbHNlIGlmICh3cml0ZV9jb21iaW5lID09IDApIHsKKwkJaWYgKHJwLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQl3cml0ZV9jb21iaW5lID0gMTsKKwl9CisKKwkvKiBYWFggd291bGQgYmUgbmljZSB0byBoYXZlIGEgd2F5IHRvIGFzayBmb3Igd3JpdGUtdGhyb3VnaCAqLworCXByb3QgfD0gX1BBR0VfTk9fQ0FDSEU7CisJaWYgKHdyaXRlX2NvbWJpbmUpCisJCXByb3QgJj0gfl9QQUdFX0dVQVJERUQ7CisJZWxzZQorCQlwcm90IHw9IF9QQUdFX0dVQVJERUQ7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKy8qCisgKiBUaGlzIG9uZSBpcyB1c2VkIGJ5IC9kZXYvbWVtIGFuZCBmYmRldiB3aG8gaGF2ZSBubyBjbHVlIGFib3V0IHRoZQorICogUENJIGRldmljZSwgaXQgdHJpZXMgdG8gZmluZCB0aGUgUENJIGRldmljZSBmaXJzdCBhbmQgY2FsbHMgdGhlCisgKiBhYm92ZSByb3V0aW5lCisgKi8KK3BncHJvdF90IHBjaV9waHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgcGdwcm90X3QgcHJvdGVjdGlvbikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpmb3VuZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBwcm90ID0gcGdwcm90X3ZhbChwcm90ZWN0aW9uKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBmbiA8PCBQQUdFX1NISUZUOworCWludCBpOworCisJaWYgKHBhZ2VfaXNfcmFtKHBmbikpCisJCXJldHVybiBfX3BncHJvdChwcm90KTsKKworCXByb3QgfD0gX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJnBkZXYtPnJlc291cmNlW2ldOworCQkJaW50IGZsYWdzID0gcnAtPmZsYWdzOworCisJCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KKwkJCWlmICgoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLworCQkJaWYgKG9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8CisJCQkgICAgb2Zmc2V0ID4gcnAtPmVuZCkKKwkJCQljb250aW51ZTsKKwkJCWZvdW5kID0gcnA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKSB7CisJCWlmIChmb3VuZC0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BSRUZFVENIKQorCQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJfQorCisJREJHKCJub24tUENJIG1hcCBmb3IgJWx4LCBwcm90OiAlbHhcbiIsIG9mZnNldCwgcHJvdCk7CisKKwlyZXR1cm4gX19wZ3Byb3QocHJvdCk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gdGhlIGFjdHVhbCByZW1hcCBvZiB0aGUgcGFnZXMgZm9yIGEgUENJIGRldmljZSBtYXBwaW5nLCBhcworICogYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLiAgVGhlIHJlZ2lvbiBpbiB0aGUgcHJvY2VzcyB0byBtYXAKKyAqIGlzIGRlc2NyaWJlZCBieSB2bV9zdGFydCBhbmQgdm1fZW5kIG1lbWJlcnMgb2YgVk1BLCB0aGUgYmFzZSBwaHlzaWNhbAorICogYWRkcmVzcyBpcyBmb3VuZCBpbiB2bV9wZ29mZi4KKyAqIFRoZSBwY2kgZGV2aWNlIHN0cnVjdHVyZSBpcyBwcm92aWRlZCBzbyB0aGF0IGFyY2hpdGVjdHVyZXMgbWF5IG1ha2UgbWFwcGluZworICogZGVjaXNpb25zIG9uIGEgcGVyLWRldmljZSBvciBwZXItYnVzIGJhc2lzLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIHplcm8gb24gc3VjY2Vzcy4KKyAqLworaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsIGludCB3cml0ZV9jb21iaW5lKQoreworCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJc3RydWN0IHJlc291cmNlICpycDsKKwlpbnQgcmV0OworCisJcnAgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgJm9mZnNldCwgbW1hcF9zdGF0ZSk7CisJaWYgKHJwID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCisJCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAorCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKKworCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCisJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKKwkJCSAgcmVzb3VyY2Vfc2l6ZV90ICpzdGFydCwgcmVzb3VyY2Vfc2l6ZV90ICplbmQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwlyZXNvdXJjZV9zaXplX3Qgb2Zmc2V0ID0gMDsKKworCWlmIChob3NlID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOworCisJLyogV2UgcGFzcyBhIGZ1bGx5IGZpeGVkIHVwIGFkZHJlc3MgdG8gdXNlcmxhbmQgZm9yIE1NSU8gaW5zdGVhZCBvZgorCSAqIGEgQkFSIHZhbHVlIGJlY2F1c2UgWCBpcyBsYW1lIGFuZCBleHBlY3RzIHRvIGJlIGFibGUgdG8gdXNlIHRoYXQKKwkgKiB0byBwYXNzIHRvIC9kZXYvbWVtICEKKwkgKgorCSAqIFRoYXQgbWVhbnMgdGhhdCB3ZSdsbCBoYXZlIHBvdGVudGlhbGx5IDY0IGJpdHMgdmFsdWVzIHdoZXJlIHNvbWUKKwkgKiB1c2VybGFuZCBhcHBzIG9ubHkgZXhwZWN0IDMyIChsaWtlIFggaXRzZWxmIHNpbmNlIGl0IHRoaW5rcyBvbmx5CisJICogU3BhcmMgaGFzIDY0IGJpdHMgTU1JTykgYnV0IGlmIHdlIGRvbid0IGRvIHRoYXQsIHdlIGJyZWFrIGl0IG9uCisJICogMzIgYml0cyBDSFJQcyA6LSgKKwkgKgorCSAqIEhvcGVmdWxseSwgdGhlIHN5c2ZzIGluc3RlcmZhY2UgaXMgaW1tdW5lIHRvIHRoYXQgZ3Vuay4gT25jZSBYCisJICogaGFzIGJlZW4gZml4ZWQgKGFuZCB0aGUgZml4IHNwcmVhZCBlbm91Z2gpLCB3ZSBjYW4gcmUtZW5hYmxlIHRoZQorCSAqIDIgbGluZXMgYmVsb3cgYW5kIHBhc3MgZG93biBhIEJBUiB2YWx1ZSB0byB1c2VybGFuZC4gSW4gdGhhdCBjYXNlCisJICogd2UnbGwgYWxzbyBoYXZlIHRvIHJlLWVuYWJsZSB0aGUgbWF0Y2hpbmcgY29kZSBpbgorCSAqIF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoKS4KKwkgKgorCSAqIEJlbkguCisJICovCisjaWYgMAorCWVsc2UgaWYgKHJzcmMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OworI2VuZGlmCisKKwkqc3RhcnQgPSByc3JjLT5zdGFydCAtIG9mZnNldDsKKwkqZW5kID0gcnNyYy0+ZW5kIC0gb2Zmc2V0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKaW5kZXggODY5ODIxMS4uMGFkZjA3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCkBAIC01NSw4ICs1NSw3IEBACiAgKi8KIGludCBwY2lfYXNzaWduX2FsbF9idXNlczsKIAotc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlX2hlYWQ7Ci1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqKiBob3NlX3RhaWwgPSAmaG9zZV9oZWFkOworTElTVF9IRUFEKGhvc2VfbGlzdCk7CiAKIHN0YXRpYyBpbnQgcGNpX2J1c19jb3VudDsKIApAQCAtNTczLDU4ICs1NzIsNiBAQAogCX0KIH0KIAotCi1pbnQKLXBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKLXsKLQl1MTYgY21kLCBvbGRfY21kOwotCWludCBpZHg7Ci0Jc3RydWN0IHJlc291cmNlICpyOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0Jb2xkX2NtZCA9IGNtZDsKLQlmb3IgKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKLQkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwotCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQotCQkJY29udGludWU7Ci0JCi0JCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwotCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCQljbWQgfD0gUENJX0NPTU1BTkRfSU87Ci0JCWlmIChyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKLQl9Ci0JaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCi0JCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JaWYgKGNtZCAhPSBvbGRfY21kKSB7Ci0JCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZXh0X2NvbnRyb2xsZXJfaW5kZXg7Ci0KLXN0cnVjdCBwY2lfY29udHJvbGxlciAqIF9faW5pdAotcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwotCi0JaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilhbGxvY19ib290bWVtKHNpemVvZigqaG9zZSkpOwotCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0KLQkqaG9zZV90YWlsID0gaG9zZTsKLQlob3NlX3RhaWwgPSAmaG9zZS0+bmV4dDsKLQotCWhvc2UtPmluZGV4ID0gbmV4dF9jb250cm9sbGVyX2luZGV4Kys7Ci0KLQlyZXR1cm4gaG9zZTsKLX0KLQogI2lmZGVmIENPTkZJR19QUENfT0YKIC8qCiAgKiBGdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgb24gT3BlbkZpcm13YXJlIG1hY2hpbmVzLgpAQCAtNjcwLDcgKzYxNyw3IEBACiBwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQogewogCWludCBpOwotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAJc3RydWN0IHByb3BlcnR5ICptYXBfcHJvcDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCkBAIC02ODcsNyArNjM0LDcgQEAKIAkJcGNpX3RvX09GX2J1c19tYXBbaV0gPSAweGZmOwogCiAJLyogRm9yIGVhY2ggaG9zZSwgd2UgYmVnaW4gc2VhcmNoaW5nIGJyaWRnZXMgKi8KLQlmb3IoaG9zZT1ob3NlX2hlYWQ7IGhvc2U7IGhvc2U9aG9zZS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGU7CQogCQlub2RlID0gKHN0cnVjdCBkZXZpY2Vfbm9kZSAqKWhvc2UtPmFyY2hfZGF0YTsKIAkJaWYgKCFub2RlKQpAQCAtNzY1LDcgKzcxMiw3IEBACiAKIAkvKiBBcmUgd2UgYSByb290IGJ1cyA/ICovCiAJaWYgKGJ1cy0+c2VsZiA9PSBOVUxMIHx8IGJ1cy0+cGFyZW50ID09IE5VTEwpIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cy0+bnVtYmVyKTsKKwkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CiAJCWlmIChob3NlID09IE5VTEwpCiAJCQlyZXR1cm4gTlVMTDsKIAkJcmV0dXJuIG9mX25vZGVfZ2V0KGhvc2UtPmFyY2hfZGF0YSk7CkBAIC04MTgsMjcgKzc2NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kZXZpY2VfdG9fT0Zfbm9kZSk7CiAKLS8qIFRoaXMgcm91dGluZSBpcyBtZWFudCB0byBiZSB1c2VkIGVhcmx5IGR1cmluZyBib290LCB3aGVuIHRoZQotICogUENJIGJ1cyBudW1iZXJzIGhhdmUgbm90IHlldCBiZWVuIGFzc2lnbmVkLCBhbmQgeW91IG5lZWQgdG8KLSAqIGlzc3VlIFBDSSBjb25maWcgY3ljbGVzIHRvIGFuIE9GIGRldmljZS4KLSAqIEl0IGNvdWxkIGFsc28gYmUgdXNlZCB0byAiZml4IiBSVEFTIGNvbmZpZyBjeWNsZXMgaWYgeW91IHdhbnQKLSAqIHRvIHNldCBwY2lfYXNzaWduX2FsbF9idXNlcyB0byAxIGFuZCBzdGlsbCB1c2UgUlRBUyBmb3IgUENJCi0gKiBjb25maWcgY3ljbGVzLgotICovCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIHBjaV9maW5kX2hvc2VfZm9yX09GX2RldmljZShzdHJ1Y3QgZGV2aWNlX25vZGUqIG5vZGUpCi17Ci0JaWYgKCFoYXZlX29mKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZShub2RlKSB7Ci0JCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZTsKLQkJZm9yIChob3NlPWhvc2VfaGVhZDtob3NlO2hvc2U9aG9zZS0+bmV4dCkKLQkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKLQkJCQlyZXR1cm4gaG9zZTsKLQkJbm9kZT1ub2RlLT5wYXJlbnQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgaW50CiBmaW5kX09GX3BjaV9kZXZpY2VfZmlsdGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSwgdm9pZCogZGF0YSkKIHsKQEAgLTEwMjcsMzQgKzk1MywxMiBAQAogCX0KIH0KIAotc3RhdGljIHNzaXplX3QgcGNpX3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCXBkZXYgPSB0b19wY2lfZGV2IChkZXYpOwotCW5wID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOwotCWlmIChucCA9PSBOVUxMIHx8IG5wLT5mdWxsX25hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXMiLCBucC0+ZnVsbF9uYW1lKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihkZXZzcGVjLCBTX0lSVUdPLCBwY2lfc2hvd19kZXZzcGVjLCBOVUxMKTsKLQogI2Vsc2UgLyogQ09ORklHX1BQQ19PRiAqLwogdm9pZCBwY2liaW9zX21ha2VfT0ZfYnVzX21hcCh2b2lkKQogewogfQogI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KIAotLyogQWRkIHN5c2ZzIHByb3BlcnRpZXMgKi8KLWludCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotI2lmZGVmIENPTkZJR19QUENfT0YKLQlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCi19Ci0KLQogI2lmZGVmIENPTkZJR19QUENfUE1BQwogLyoKICAqIFRoaXMgc2V0IG9mIHJvdXRpbmVzIGNoZWNrcyBmb3IgUENJPC0+UENJIGJyaWRnZXMgdGhhdCBoYXZlIGNsb3NlZApAQCAtMTI2OSwxNCArMTE3MywxNCBAQAogc3RhdGljIGludCBfX2luaXQKIHBjaWJpb3NfaW5pdCh2b2lkKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAJc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgbmV4dF9idXNubzsKKwlpbnQgbmV4dF9idXNubyA9IDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlXG4iKTsKIAogCS8qIFNjYW4gYWxsIG9mIHRoZSByZWNvcmRlZCBQQ0kgY29udHJvbGxlcnMuICAqLwotCWZvciAobmV4dF9idXNubyA9IDAsIGhvc2UgPSBob3NlX2hlYWQ7IGhvc2U7IGhvc2UgPSBob3NlLT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKSB7CiAJCWlmIChwY2lfYXNzaWduX2FsbF9idXNlcykKIAkJCWhvc2UtPmZpcnN0X2J1c25vID0gbmV4dF9idXNubzsKIAkJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CkBAIC0xMzE5LDEyICsxMjIzLDYgQEAKIAogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLXVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZml4dXAoc3RydWN0IHBjaV9kZXYgKiBkZXYsIHN0cnVjdCByZXNvdXJjZSAqIHJlcywKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXJldHVybiBzdGFydDsKLX0KLQogdm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopIGJ1cy0+c3lzZGF0YTsKQEAgLTEzNDIsNyArMTI0MCw3IEBACiAJCWlmICghcmVzLT5mbGFncykgewogCQkJaWYgKGlvX29mZnNldCkKIAkJCQlwcmludGsoS0VSTl9FUlIgIkkvTyByZXNvdXJjZSBub3Qgc2V0IGZvciBob3N0IgotCQkJCSAgICAgICAiIGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCSAgICAgICAiIGJyaWRnZSAlZFxuIiwgaG9zZS0+Z2xvYmFsX251bWJlcik7CiAJCQlyZXMtPnN0YXJ0ID0gMDsKIAkJCXJlcy0+ZW5kID0gSU9fU1BBQ0VfTElNSVQ7CiAJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKQEAgLTEzNTYsNyArMTI1NCw3IEBACiAJCQkJaWYgKGkgPiAwKQogCQkJCQljb250aW51ZTsKIAkJCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSByZXNvdXJjZSBub3Qgc2V0IGZvciAiCi0JCQkJICAgICAgICJob3N0IGJyaWRnZSAlZFxuIiwgaG9zZS0+aW5kZXgpOworCQkJCSAgICAgICAiaG9zdCBicmlkZ2UgJWRcbiIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOwogCQkJCXJlcy0+c3RhcnQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKIAkJCQlyZXMtPmVuZCA9IH4wVTsKIAkJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CkBAIC0xMzcwLDcgKzEyNjgsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAJCQlpZiAoKHJlcyA9IGJ1cy0+cmVzb3VyY2VbaV0pID09IE5VTEwpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIXJlcy0+ZmxhZ3MpCisJCQlpZiAoIXJlcy0+ZmxhZ3MgfHwgYnVzLT5zZWxmLT50cmFuc3BhcmVudCkKIAkJCQljb250aW51ZTsKIAkJCWlmIChpb19vZmZzZXQgJiYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSkgewogCQkJCXJlcy0+c3RhcnQgKz0gaW9fb2Zmc2V0OwpAQCAtMTM5NSwxMSArMTI5Myw2IEBACiAJfQogfQogCi1jaGFyIF9faW5pdCAqcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KLQogLyogdGhlIG5leHQgb25lIGlzIHN0b2xlbiBmcm9tIHRoZSBhbHBoYSBwb3J0Li4uICovCiB2b2lkIF9faW5pdAogcGNpYmlvc191cGRhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpcnEpCkBAIC0xNDA4LDY0ICsxMzAxLDYgQEAKIAkvKiBYWFggRklYTUUgLSB1cGRhdGUgT0YgZGV2aWNlIHRyZWUgbm9kZSBpbnRlcnJ1cHQgcHJvcGVydHkgKi8KIH0KIAotI2lmZGVmIENPTkZJR19QUENfTUVSR0UKLS8qIFhYWCBUaGlzIGlzIGEgY29weSBvZiB0aGUgcHBjNjQgdmVyc2lvbi4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2Ugc3RhcnQKLSAqIG1lcmdpbmcgdGhlIDIgUENJIGxheWVycwotICovCi0vKgotICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KLSAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQotICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCi0gKi8KLWludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3Qgb2ZfaXJxIG9pcnE7Ci0JdW5zaWduZWQgaW50IHZpcnE7Ci0KLQlEQkcoIlRyeSB0byBtYXAgaXJxIGZvciAlcy4uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOwotCi0JLyogVHJ5IHRvIGdldCBhIG1hcHBpbmcgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKi8KLQlpZiAob2ZfaXJxX21hcF9wY2kocGNpX2RldiwgJm9pcnEpKSB7Ci0JCXU4IGxpbmUsIHBpbjsKLQotCQkvKiBJZiB0aGF0IGZhaWxzLCBsZXRzIGZhbGxiYWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNvbmZpZwotCQkgKiBzcGFjZSBhbmQgbWFwIHRoYXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBjb250cm9sbGVyLiBXZQotCQkgKiBhbHNvIHNldCB0aGUgdHlwZSB0byBsZXZlbCBsb3cgc2luY2UgdGhhdCdzIHdoYXQgUENJCi0JCSAqIGludGVycnVwdHMgYXJlLiBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgZGlmZmVyZW50bHksIHRoZW4KLQkJICogZWl0aGVyIHByb3ZpZGUgYSBwcm9wZXIgaW50ZXJydXB0IHRyZWUgb3IgZG9uJ3QgdXNlIHRoaXMKLQkJICogZnVuY3Rpb24uCi0JCSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGluID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKSB8fAotCQkgICAgbGluZSA9PSAweGZmKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJREJHKCIgLT4gbm8gbWFwICEgVXNpbmcgaXJxIGxpbmUgJWQgZnJvbSBQQ0kgY29uZmlnXG4iLCBsaW5lKTsKLQotCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCQlpZiAodmlycSAhPSBOT19JUlEpCi0JCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQl9IGVsc2UgewotCQlEQkcoIiAtPiBnb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHguLi4pIG9uICVzXG4iLAotCQkgICAgb2lycS5zaXplLCBvaXJxLnNwZWNpZmllclswXSwgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKLQkJCQkJICAgICBvaXJxLnNpemUpOwotCX0KLQlpZih2aXJxID09IE5PX0lSUSkgewotCQlEQkcoIiAtPiBmYWlsZWQgdG8gbWFwICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBjaV9kZXYtPmlycSA9IHZpcnE7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOwotI2VuZGlmIC8qIENPTkZJR19QUENfTUVSR0UgKi8KLQogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKIAl1MTYgY21kLCBvbGRfY21kOwpAQCAtMTQ5NywyODEgKzEzMzIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBjaV9jb250cm9sbGVyKgorc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlcioKIHBjaV9idXNfdG9faG9zZShpbnQgYnVzKQogewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IGhvc2VfaGVhZDsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7CiAKLQlmb3IgKDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQogCQlpZiAoYnVzID49IGhvc2UtPmZpcnN0X2J1c25vICYmIGJ1cyA8PSBob3NlLT5sYXN0X2J1c25vKQogCQkJcmV0dXJuIGhvc2U7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgX19pb21lbSAqCi1wY2lfYnVzX2lvX2Jhc2UodW5zaWduZWQgaW50IGJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7Ci0KLQlob3NlID0gcGNpX2J1c190b19ob3NlKGJ1cyk7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaG9zZS0+aW9fYmFzZV92aXJ0OwotfQotCi11bnNpZ25lZCBsb25nCi1wY2lfYnVzX2lvX2Jhc2VfcGh5cyh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAwOwotCXJldHVybiBob3NlLT5pb19iYXNlX3BoeXM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9idXNfbWVtX2Jhc2VfcGh5cyh1bnNpZ25lZCBpbnQgYnVzKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQotCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoYnVzKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiAwOwotCXJldHVybiBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCi17Ci0JLyogSGFjayBhbGVydCBhZ2FpbiAhIFNlZSBjb21tZW50cyBpbiBjaHJwX3BjaS5jCi0JICovCi0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0KLQkJKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKXBkZXYtPnN5c2RhdGE7Ci0JaWYgKGhvc2UgJiYgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlyZXR1cm4gcmVzLT5zdGFydCAtIGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwotCS8qIFdlIG1heSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIElPcyBoZXJlLi4uICovCi0JcmV0dXJuIHJlcy0+c3RhcnQ7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90ICpvZmZzZXQsCi0JCQkJCSAgICAgICBlbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3NlKGRldi0+YnVzLT5udW1iZXIpOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0ID0gMDsKLQlpbnQgaSwgcmVzX2JpdDsKLQotCWlmIChob3NlID09IDApCi0JCXJldHVybiBOVUxMOwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCi0JCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0jZW5kaWYKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwotCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9IGhvc2UtPmlvX2Jhc2VfdmlydCAtICh2b2lkIF9faW9tZW0gKilfSU9fQkFTRTsKLQkJKm9mZnNldCArPSBpb19vZmZzZXQ7Ci0JCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHJlcXVlc3RlZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCi0JICogcmVzb3VyY2VzIG9mIHRoZSBkZXZpY2UuCi0JICovCi0JZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpycCA9ICZkZXYtPnJlc291cmNlW2ldOwotCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJLyogdHJlYXQgUk9NIGFzIG1lbW9yeSAoc2hvdWxkIGJlIGFscmVhZHkpICovCi0JCWlmIChpID09IFBDSV9ST01fUkVTT1VSQ0UpCi0JCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKLQotCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KLQkJaWYgKChmbGFncyAmIHJlc19iaXQpID09IDApCi0JCQljb250aW51ZTsKLQotCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KLQkJaWYgKCpvZmZzZXQgPCAocnAtPnN0YXJ0ICYgUEFHRV9NQVNLKSB8fCAqb2Zmc2V0ID4gcnAtPmVuZCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZvdW5kIGl0ISBjb25zdHJ1Y3QgdGhlIGZpbmFsIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQkJaWYgKG1tYXBfc3RhdGUgPT0gcGNpX21tYXBfaW8pCi0JCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKLQkJcmV0dXJuIHJwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCi0gKiBkZXZpY2UgbWFwcGluZy4KLSAqLwotc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAotCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCi0JCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQotewotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0KLQkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCi0JICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQotCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKLQkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCi0JICogY29tYmluZSBiaXQKLQkgKi8KLQlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCi0JCXdyaXRlX2NvbWJpbmUgPSAwOwotCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgewotCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXdyaXRlX2NvbWJpbmUgPSAxOwotCX0KLQotCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKLQlpZiAod3JpdGVfY29tYmluZSkKLQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKLQllbHNlCi0JCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotLyoKLSAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCi0gKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKLSAqIGFib3ZlIHJvdXRpbmUKLSAqLwotcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IGk7Ci0KLQlpZiAocGFnZV9pc19yYW0ocGZuKSkKLQkJcmV0dXJuIF9fcGdwcm90KHByb3QpOwotCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKLQkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQotCQkJCWNvbnRpbnVlOwotCQkJZm91bmQgPSBycDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZm91bmQpIHsKLQkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCi0JCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9Ci0KLQlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotCi0vKgotICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAotICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgotICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCi0gKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1pbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKLQkJCWludCB3cml0ZV9jb21iaW5lKQotewotCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0Jc3RydWN0IHJlc291cmNlICpycDsKLQlpbnQgcmV0OwotCi0JcnAgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgJm9mZnNldCwgbW1hcF9zdGF0ZSk7Ci0JaWYgKHJwID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCi0JCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAotCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKLQotCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCi0JCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBPYnNvbGV0ZSBmdW5jdGlvbnMuIFNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIHN5bWJpb3MgZHJpdmVyCi0gKiBpcyBmaXhlZAotICovCi11bnNpZ25lZCBsb25nCi1waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKLQlpbnQgaTsKLQotCWZvciAoaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpIHsKLQkJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQkJaWYgKHBhID49IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQKLQkJCSAgICAmJiBwYSA8PSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmVuZCkgewotCQkJCS8qCi0JCQkJICogWFhYIHRoZSBob3NlLT5wY2lfbWVtX29mZnNldCByZWFsbHkKLQkJCQkgKiBvbmx5IGFwcGxpZXMgdG8gbWVtX3Jlc291cmNlc1swXS4KLQkJCQkgKiBXZSBuZWVkIGEgd2F5IHRvIHN0b3JlIGFuIG9mZnNldCBmb3IKLQkJCQkgKiB0aGUgb3RoZXJzLiAgLS0gcGF1bHVzCi0JCQkJICovCi0JCQkJaWYgKGkgPT0gMCkKLQkJCQkJcGEgLT0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0JCQkJcmV0dXJuIHBhOwotCQkJfQotCQl9Ci0JfQotCS8qIGhtbW0sIGRpZG4ndCBmaW5kIGl0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXBjaV9waHlzX3RvX2J1cyh1bnNpZ25lZCBsb25nIHBhLCBpbnQgYnVzbnIpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gcGNpX2J1c190b19ob3NlKGJ1c25yKTsKLQlpZiAoIWhvc2UpCi0JCXJldHVybiBwYTsKLQlyZXR1cm4gcGEgLSBob3NlLT5wY2lfbWVtX29mZnNldDsKLX0KLQotdW5zaWduZWQgbG9uZwotcGNpX2J1c190b19waHlzKHVuc2lnbmVkIGludCBiYSwgaW50IGJ1c25yKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciogaG9zZSA9IHBjaV9idXNfdG9faG9zZShidXNucik7Ci0JaWYgKCFob3NlKQotCQlyZXR1cm4gYmE7Ci0JcmV0dXJuIGJhICsgaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci19Ci0KIC8qIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gbG9jYXRpb25zIG9mIHZhcmlvdXMgSS9PIHJlZ2lvbnMgaW4gcGh5c2ljYWwKICAqIG1lbW9yeS4gIERvIHRoaXMgb24gYSBwZXItY2FyZCBiYXNpcyBzbyB0aGF0IHdlIGNob29zZSB0aGUgcmlnaHQKICAqIHJvb3QgYnJpZGdlLgpAQCAtMTgxNCw2MiArMTM4NSwxMSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKLQkJCSAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAotCQkJICByZXNvdXJjZV9zaXplX3QgKnN0YXJ0LCByZXNvdXJjZV9zaXplX3QgKmVuZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoZGV2LT5idXMtPm51bWJlcik7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoaG9zZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKLQotCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKLQkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0Ci0JICogdG8gcGFzcyB0byAvZGV2L21lbSAhCi0JICoKLQkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCi0JICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQotCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgotCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCi0JICoKLQkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAotCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKLQkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQotCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KLQkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCi0JICoKLQkgKiBCZW5ILgotCSAqLwotI2lmIDAKLQllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKLX0KLQotdm9pZCBfX2luaXQgcGNpX2luaXRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHJlc291cmNlX3NpemVfdCBzdGFydCwKLQkJCSAgICAgIHJlc291cmNlX3NpemVfdCBlbmQsIGludCBmbGFncywgY2hhciAqbmFtZSkKLXsKLQlyZXMtPnN0YXJ0ID0gc3RhcnQ7Ci0JcmVzLT5lbmQgPSBlbmQ7Ci0JcmVzLT5mbGFncyA9IGZsYWdzOwotCXJlcy0+bmFtZSA9IG5hbWU7Ci0JcmVzLT5wYXJlbnQgPSBOVUxMOwotCXJlcy0+c2libGluZyA9IE5VTEw7Ci0JcmVzLT5jaGlsZCA9IE5VTEw7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlID0gaG9zZV9oZWFkOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgKnRtcDsKIAotCWZvciAoOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewogCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IGhvc2UtPmlvX3Jlc291cmNlLmVuZCAtCiAJCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDE7CiAJCWlmIChhZGRyZXNzID49IGhvc2UtPmlvX2Jhc2VfcGh5cyAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggZTMwMDlhNC4uYTk3ZTIzYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDEsMzUgKzQyLDIzIEBACiAKIHVuc2lnbmVkIGxvbmcgcGNpX3Byb2JlX29ubHkgPSAxOwogaW50IHBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMDsKLXN0YXRpYyBpbnQgcGNpX2luaXRpYWxfc2Nhbl9kb25lOwogCiBzdGF0aWMgdm9pZCBmaXh1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHBjaV9kZXYgKmRldik7CiBzdGF0aWMgdm9pZCBkb19idXNfc2V0dXAoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci1zdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpOwogCiAvKiBwY2lfaW9fYmFzZSAtLSB0aGUgYmFzZSBhZGRyZXNzIGZyb20gd2hpY2ggaW8gYmFycyBhcmUgb2Zmc2V0cy4KICAqIFRoaXMgaXMgdGhlIGxvd2VzdCBJL08gYmFzZSBhZGRyZXNzIChzbyBiYXIgdmFsdWVzIGFyZSBhbHdheXMgcG9zaXRpdmUpLAogICogYW5kIGl0ICptdXN0KiBiZSB0aGUgc3RhcnQgb2YgSVNBIHNwYWNlIGlmIGFuIElTQSBidXMgZXhpc3RzIGJlY2F1c2UKLSAqIElTQSBkcml2ZXJzIHVzZSBoYXJkIGNvZGVkIG9mZnNldHMuICBJZiBubyBJU0EgYnVzIGV4aXN0cyBhIGR1bW15Ci0gKiBwYWdlIGlzIG1hcHBlZCBhbmQgaXNhX2lvX2xpbWl0IHByZXZlbnRzIGFjY2VzcyB0byBpdC4KKyAqIElTQSBkcml2ZXJzIHVzZSBoYXJkIGNvZGVkIG9mZnNldHMuICBJZiBubyBJU0EgYnVzIGV4aXN0cyBub3RoaW5nCisgKiBpcyBtYXBwZWQgb24gdGhlIGZpcnN0IDY0SyBvZiBJTyBzcGFjZQogICovCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlOwkvKiBOVUxMIGlmIG5vIElTQSBidXMgKi8KLUVYUE9SVF9TWU1CT0woaXNhX2lvX2Jhc2UpOwotdW5zaWduZWQgbG9uZyBwY2lfaW9fYmFzZTsKK3Vuc2lnbmVkIGxvbmcgcGNpX2lvX2Jhc2UgPSBJU0FfSU9fQkFTRTsKIEVYUE9SVF9TWU1CT0wocGNpX2lvX2Jhc2UpOwogCi12b2lkIGlTZXJpZXNfcGNpYmlvc19pbml0KHZvaWQpOwotCiBMSVNUX0hFQUQoaG9zZV9saXN0KTsKIAogc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKnBjaV9kbWFfb3BzOwogCi1pbnQgZ2xvYmFsX3BoYl9udW1iZXI7CQkvKiBHbG9iYWwgcGhiIGNvdW50ZXIgKi8KLQotLyogQ2FjaGVkIElTQSBicmlkZ2UgZGV2LiAqLwotc3RydWN0IHBjaV9kZXYgKnBwYzY0X2lzYWJyaWRnZV9kZXYgPSBOVUxMOwotRVhQT1JUX1NZTUJPTF9HUEwocHBjNjRfaXNhYnJpZGdlX2Rldik7Ci0KIHZvaWQgc2V0X3BjaV9kbWFfb3BzKHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgKmRtYV9vcHMpCiB7CiAJcGNpX2RtYV9vcHMgPSBkbWFfb3BzOwpAQCAtMTAwLDcgKzg5LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7CisJICAgICAgICBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBfSU9fQkFTRTsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCW9mZnNldCA9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwpAQCAtMTE5LDcgKzEwOCw3IEBACiAJCXJldHVybjsKIAogCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKLQkgICAgICAgIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOworCSAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CiAKIAlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQogCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKQEAgLTE1Niw3ICsxNDUsNyBAQAogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtCi0JCQkJCXBjaV9pb19iYXNlOworCQkJCQlfSU9fQkFTRTsKIAkJLyogTWFrZSBzdXJlIHdlIHN0YXJ0IGF0IG91ciBtaW4gb24gYWxsIGhvc2VzICovCiAJCWlmIChzdGFydCAtIG9mZnNldCA8IFBDSUJJT1NfTUlOX0lPKQogCQkJc3RhcnQgPSBQQ0lCSU9TX01JTl9JTyArIG9mZnNldDsKQEAgLTE4MCw1NSArMTY5LDYgQEAKIAlyZXMtPnN0YXJ0ID0gc3RhcnQ7CiB9CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaG9zZV9zcGlubG9jayk7Ci0KLS8qCi0gKiBwY2lfY29udHJvbGxlcihwaGIpIGluaXRpYWxpemVkIGNvbW1vbiB2YXJpYWJsZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQotewotCW1lbXNldChob3NlLCAwLCBzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0KLQlzcGluX2xvY2soJmhvc2Vfc3BpbmxvY2spOwotCWhvc2UtPmdsb2JhbF9udW1iZXIgPSBnbG9iYWxfcGhiX251bWJlcisrOwotCWxpc3RfYWRkX3RhaWwoJmhvc2UtPmxpc3Rfbm9kZSwgJmhvc2VfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmhvc2Vfc3BpbmxvY2spOwotfQotCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7Ci0KLQlpZiAobWVtX2luaXRfZG9uZSkKLQkJcGhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7Ci0JZWxzZQotCQlwaGIgPSBhbGxvY19ib290bWVtKHNpemVvZiAoc3RydWN0IHBjaV9jb250cm9sbGVyKSk7Ci0JaWYgKHBoYiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIocGhiKTsKLQlwaGItPmFyY2hfZGF0YSA9IGRldjsKLQlwaGItPmlzX2R5bmFtaWMgPSBtZW1faW5pdF9kb25lOwotCWlmIChkZXYpIHsKLQkJaW50IG5pZCA9IG9mX25vZGVfdG9fbmlkKGRldik7Ci0KLQkJaWYgKG5pZCA8IDAgfHwgIW5vZGVfb25saW5lKG5pZCkpCi0JCQluaWQgPSAtMTsKLQotCQlQSEJfU0VUX05PREUocGhiLCBuaWQpOwotCX0KLQlyZXR1cm4gcGhiOwotfQotCi12b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKQotewotCXNwaW5fbG9jaygmaG9zZV9zcGlubG9jayk7Ci0JbGlzdF9kZWwoJnBoYi0+bGlzdF9ub2RlKTsKLQlzcGluX3VubG9jaygmaG9zZV9zcGlubG9jayk7Ci0KLQlpZiAocGhiLT5pc19keW5hbWljKQotCQlrZnJlZShwaGIpOwotfQotCiB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2NsYWltX29uZV9idXMoc3RydWN0IHBjaV9idXMgKmIpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKQEAgLTI5MSw3ICsyMzEsNiBAQAogCXJldHVybiBmbGFnczsKIH0KIAotI2RlZmluZSBHRVRfNjRCSVQocHJvcCwgaSkJKCgoKHU2NCkgKHByb3ApWyhpKV0pIDw8IDMyKSB8IChwcm9wKVsoaSkrMV0pCiAKIHN0YXRpYyB2b2lkIHBjaV9wYXJzZV9vZl9hZGRycyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMTAsOCArMjQ5LDggQEAKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MoYWRkcnNbMF0pOwogCQlpZiAoIWZsYWdzKQogCQkJY29udGludWU7Ci0JCWJhc2UgPSBHRVRfNjRCSVQoYWRkcnMsIDEpOwotCQlzaXplID0gR0VUXzY0QklUKGFkZHJzLCAzKTsKKwkJYmFzZSA9IG9mX3JlYWRfbnVtYmVyKCZhZGRyc1sxXSwgMik7CisJCXNpemUgPSBvZl9yZWFkX251bWJlcigmYWRkcnNbM10sIDIpOwogCQlpZiAoIXNpemUpCiAJCQljb250aW51ZTsKIAkJaSA9IGFkZHJzWzBdICYgMHhmZjsKQEAgLTQ3OSw3ICs0MTgsNyBAQAogCWkgPSAxOwogCWZvciAoOyBsZW4gPj0gMzI7IGxlbiAtPSAzMiwgcmFuZ2VzICs9IDgpIHsKIAkJZmxhZ3MgPSBwY2lfcGFyc2Vfb2ZfZmxhZ3MocmFuZ2VzWzBdKTsKLQkJc2l6ZSA9IEdFVF82NEJJVChyYW5nZXMsIDYpOworCQlzaXplID0gb2ZfcmVhZF9udW1iZXIoJnJhbmdlc1s2XSwgMik7CiAJCWlmIChmbGFncyA9PSAwIHx8IHNpemUgPT0gMCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CkBAIC00OTgsNyArNDM3LDcgQEAKIAkJCXJlcyA9IGJ1cy0+cmVzb3VyY2VbaV07CiAJCQkrK2k7CiAJCX0KLQkJcmVzLT5zdGFydCA9IEdFVF82NEJJVChyYW5nZXMsIDEpOworCQlyZXMtPnN0YXJ0ID0gb2ZfcmVhZF9udW1iZXIoJnJhbmdlc1sxXSwgMik7CiAJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIHNpemUgLSAxOwogCQlyZXMtPmZsYWdzID0gZmxhZ3M7CiAJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKQEAgLTUzNywxMCArNDc2LDE2IEBACiAJYnVzLT5zZWNvbmRhcnkgPSBob3NlLT5maXJzdF9idXNubzsKIAlob3NlLT5idXMgPSBidXM7CiAKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpCisJCXBjaWJpb3NfbWFwX2lvX3NwYWNlKGJ1cyk7CisKIAlidXMtPnJlc291cmNlWzBdID0gcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCWlmIChyZXMtPmZsYWdzICYmIHJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgcmVzKSkKKwlpZiAocmVzLT5mbGFncyAmJiByZXF1ZXN0X3Jlc291cmNlKCZpb3BvcnRfcmVzb3VyY2UsIHJlcykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBQQ0kgSU8gcmVnaW9uICIKIAkJICAgICAgICJvbiBQQ0kgZG9tYWluICUwNHhcbiIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOworCQlEQkcoInJlcy0+c3RhcnQgPSAweCUwMTZseCwgcmVzLT5lbmQgPSAweCUwMTZseFxuIiwKKwkJICAgIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CiAJCXJlcyA9ICZob3NlLT5tZW1fcmVzb3VyY2VzW2ldOwpAQCAtNTk4LDE3ICs1NDMsNiBAQAogCWlmIChwcGNfbWQucGNpYmlvc19maXh1cCkKIAkJcHBjX21kLnBjaWJpb3NfZml4dXAoKTsKIAotCS8qIENhY2hlIHRoZSBsb2NhdGlvbiBvZiB0aGUgSVNBIGJyaWRnZSAoaWYgd2UgaGF2ZSBvbmUpICovCi0JcHBjNjRfaXNhYnJpZGdlX2RldiA9IHBjaV9nZXRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9JU0EgPDwgOCwgTlVMTCk7Ci0JaWYgKHBwYzY0X2lzYWJyaWRnZV9kZXYgIT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIklTQSBicmlkZ2UgYXQgJXNcbiIsIHBjaV9uYW1lKHBwYzY0X2lzYWJyaWRnZV9kZXYpKTsKLQotCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKLQkJLyogbWFwIGluIFBDSSBJL08gc3BhY2UgKi8KLQkJcGhic19yZW1hcF9pbygpOwotCi0JcGNpX2luaXRpYWxfc2Nhbl9kb25lID0gMTsKLQogCXByaW50ayhLRVJOX0RFQlVHICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIGRvbmVcbiIpOwogCiAJcmV0dXJuIDA7CkBAIC02MTYsMTEgKzU1MCw2IEBACiAKIHN1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwogCi1jaGFyIF9faW5pdCAqcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KLQogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKIHsKIAl1MTYgY21kLCBvbGRjbWQ7CkBAIC02NTEsMjIgKzU4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBSZXR1cm4gdGhlIGRvbWFpbiBudW1iZXIgZm9yIHRoaXMgYnVzLgotICovCi1pbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQotCQlyZXR1cm4gMDsKLQllbHNlIHsKLQkJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7Ci0KLQkJcmV0dXJuIGhvc2UtPmdsb2JhbF9udW1iZXI7Ci0JfQotfQotCi1FWFBPUlRfU1lNQk9MKHBjaV9kb21haW5fbnIpOwotCiAvKiBEZWNpZGUgd2hldGhlciB0byBkaXNwbGF5IHRoZSBkb21haW4gbnVtYmVyIGluIC9wcm9jICovCiBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7CkBAIC02NzgsMjgxICs1OTEsNiBAQAogCX0KIH0KIAotLyoKLSAqIFBsYXRmb3JtIHN1cHBvcnQgZm9yIC9wcm9jL2J1cy9wY2kvWC9ZIG1tYXAoKXMsCi0gKiBtb2RlbGxlZCBvbiB0aGUgc3BhcmM2NCBpbXBsZW1lbnRhdGlvbiBieSBEYXZlIE1pbGxlci4KLSAqICAtLSBwYXVsdXMuCi0gKi8KLQotLyoKLSAqIEFkanVzdCB2bV9wZ29mZiBvZiBWTUEgc3VjaCB0aGF0IGl0IGlzIHRoZSBwaHlzaWNhbCBwYWdlIG9mZnNldAotICogY29ycmVzcG9uZGluZyB0byB0aGUgMzItYml0IHBjaSBidXMgb2Zmc2V0IGZvciBERVYgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLgotICoKLSAqIEJhc2ljYWxseSwgdGhlIHVzZXIgZmluZHMgdGhlIGJhc2UgYWRkcmVzcyBmb3IgaGlzIGRldmljZSB3aGljaCBoZSB3aXNoZXMKLSAqIHRvIG1tYXAuICBUaGV5IHJlYWQgdGhlIDMyLWJpdCB2YWx1ZSBmcm9tIHRoZSBjb25maWcgc3BhY2UgYmFzZSByZWdpc3RlciwKLSAqIGFkZCB3aGF0ZXZlciBQQUdFX1NJWkUgbXVsdGlwbGUgb2Zmc2V0IHRoZXkgd2lzaCwgYW5kIGZlZWQgdGhpcyBpbnRvIHRoZQotICogb2Zmc2V0IHBhcmFtZXRlciBvZiBtbWFwIG9uIC9wcm9jL2J1cy9wY2kvWFhYIGZvciB0aGF0IGRldmljZS4KLSAqCi0gKiBSZXR1cm5zIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QgKm9mZnNldCwKLQkJCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOwotCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0ID0gMDsKLQlpbnQgaSwgcmVzX2JpdDsKLQotCWlmIChob3NlID09IDApCi0JCXJldHVybiBOVUxMOwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCi0JLyogSWYgbWVtb3J5LCBhZGQgb24gdGhlIFBDSSBicmlkZ2UgYWRkcmVzcyBvZmZzZXQgKi8KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9tZW0pIHsKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIHBjaV9yZXNvdXJjZV90b191c2VyKCkgZm9yIHdoeSB0aGlzIGlzIGRpc2FibGVkICovCi0JCSpvZmZzZXQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7Ci0jZW5kaWYKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwotCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCQkqb2Zmc2V0ICs9IGlvX29mZnNldDsKLQkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfSU87Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgcmVxdWVzdGVkIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUKLQkgKiByZXNvdXJjZXMgb2YgdGhlIGRldmljZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJmRldi0+cmVzb3VyY2VbaV07Ci0JCWludCBmbGFncyA9IHJwLT5mbGFnczsKLQotCQkvKiB0cmVhdCBST00gYXMgbWVtb3J5IChzaG91bGQgYmUgYWxyZWFkeSkgKi8KLQkJaWYgKGkgPT0gUENJX1JPTV9SRVNPVVJDRSkKLQkJCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOwotCi0JCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQlpZiAoKGZsYWdzICYgcmVzX2JpdCkgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEluIHRoZSByYW5nZSBvZiB0aGlzIHJlc291cmNlPyAqLwotCQlpZiAoKm9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8ICpvZmZzZXQgPiBycC0+ZW5kKQotCQkJY29udGludWU7Ci0KLQkJLyogZm91bmQgaXQhIGNvbnN0cnVjdCB0aGUgZmluYWwgcGh5c2ljYWwgYWRkcmVzcyAqLwotCQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykKLQkJICAgICAgIAkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKLQkJcmV0dXJuIHJwOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2V0IHZtX3BhZ2VfcHJvdCBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpCi0gKiBkZXZpY2UgbWFwcGluZy4KLSAqLwotc3RhdGljIHBncHJvdF90IF9fcGNpX21tYXBfc2V0X3BncHJvdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAotCQkJCSAgICAgIHBncHJvdF90IHByb3RlY3Rpb24sCi0JCQkJICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLAotCQkJCSAgICAgIGludCB3cml0ZV9jb21iaW5lKQotewotCXVuc2lnbmVkIGxvbmcgcHJvdCA9IHBncHJvdF92YWwocHJvdGVjdGlvbik7Ci0KLQkvKiBXcml0ZSBjb21iaW5lIGlzIGFsd2F5cyAwIG9uIG5vbi1tZW1vcnkgc3BhY2UgbWFwcGluZ3MuIE9uCi0JICogbWVtb3J5IHNwYWNlLCBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyAxLCB3ZSBjaGVjayBmb3IgYQotCSAqICJwcmVmZXRjaGFibGUiIHJlc291cmNlLiBUaGlzIGlzIGEgYml0IGhhY2tpc2gsIGJ1dCB3ZSB1c2UKLQkgKiB0aGlzIHRvIHdvcmthcm91bmQgdGhlIGluYWJpbGl0eSBvZiAvc3lzZnMgdG8gcHJvdmlkZSBhIHdyaXRlCi0JICogY29tYmluZSBiaXQKLQkgKi8KLQlpZiAobW1hcF9zdGF0ZSAhPSBwY2lfbW1hcF9tZW0pCi0JCXdyaXRlX2NvbWJpbmUgPSAwOwotCWVsc2UgaWYgKHdyaXRlX2NvbWJpbmUgPT0gMCkgewotCQlpZiAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXdyaXRlX2NvbWJpbmUgPSAxOwotCX0KLQotCS8qIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgYSB3YXkgdG8gYXNrIGZvciB3cml0ZS10aHJvdWdoICovCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRTsKLQlpZiAod3JpdGVfY29tYmluZSkKLQkJcHJvdCAmPSB+X1BBR0VfR1VBUkRFRDsKLQllbHNlCi0JCXByb3QgfD0gX1BBR0VfR1VBUkRFRDsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotLyoKLSAqIFRoaXMgb25lIGlzIHVzZWQgYnkgL2Rldi9tZW0gYW5kIGZiZGV2IHdobyBoYXZlIG5vIGNsdWUgYWJvdXQgdGhlCi0gKiBQQ0kgZGV2aWNlLCBpdCB0cmllcyB0byBmaW5kIHRoZSBQQ0kgZGV2aWNlIGZpcnN0IGFuZCBjYWxscyB0aGUKLSAqIGFib3ZlIHJvdXRpbmUKLSAqLwotcGdwcm90X3QgcGNpX3BoeXNfbWVtX2FjY2Vzc19wcm90KHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICBwZ3Byb3RfdCBwcm90ZWN0aW9uKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKmZvdW5kID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHByb3QgPSBwZ3Byb3RfdmFsKHByb3RlY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IGk7Ci0KLQlpZiAocGFnZV9pc19yYW0ocGZuKSkKLQkJcmV0dXJuIF9fcGdwcm90KHByb3QpOwotCi0JcHJvdCB8PSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQ7Ci0KLQlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKLQkJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKLQkJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07Ci0JCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7Ci0KLQkJCS8qIEFjdGl2ZSBhbmQgc2FtZSB0eXBlPyAqLwotCQkJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJLyogSW4gdGhlIHJhbmdlIG9mIHRoaXMgcmVzb3VyY2U/ICovCi0JCQlpZiAob2Zmc2V0IDwgKHJwLT5zdGFydCAmIFBBR0VfTUFTSykgfHwKLQkJCSAgICBvZmZzZXQgPiBycC0+ZW5kKQotCQkJCWNvbnRpbnVlOwotCQkJZm91bmQgPSBycDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWJyZWFrOwotCX0KLQlpZiAoZm91bmQpIHsKLQkJaWYgKGZvdW5kLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCi0JCQlwcm90ICY9IH5fUEFHRV9HVUFSREVEOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQl9Ci0KLQlEQkcoIm5vbi1QQ0kgbWFwIGZvciAlbHgsIHByb3Q6ICVseFxuIiwgb2Zmc2V0LCBwcm90KTsKLQotCXJldHVybiBfX3BncHJvdChwcm90KTsKLX0KLQotCi0vKgotICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAotICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCi0gKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgotICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCi0gKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCi0gKgotICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgotICovCi1pbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCi17Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJwOwotCWludCByZXQ7Ci0KLQlycCA9IF9fcGNpX21tYXBfbWFrZV9vZmZzZXQoZGV2LCAmb2Zmc2V0LCBtbWFwX3N0YXRlKTsKLQlpZiAocnAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2bWEtPnZtX3Bnb2ZmID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKLQkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCi0JCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwotCi0JcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKLQkJCSAgICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBjaV9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlwZGV2ID0gdG9fcGNpX2RldiAoZGV2KTsKLQlucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKLQlpZiAobnAgPT0gTlVMTCB8fCBucC0+ZnVsbF9uYW1lID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgbnAtPmZ1bGxfbmFtZSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVHTywgcGNpX3Nob3dfZGV2c3BlYywgTlVMTCk7Ci0KLWludCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXJldHVybiBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOwotfQotCi0jZGVmaW5lIElTQV9TUEFDRV9NQVNLIDB4MQotI2RlZmluZSBJU0FfU1BBQ0VfSU8gMHgxCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX25vZGUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBwaGJfaW9fYmFzZV9waHlzLAotCQkJCSAgICAgIHZvaWQgX19pb21lbSAqIHBoYl9pb19iYXNlX3ZpcnQpCi17Ci0JLyogUmVtb3ZlIHRoZXNlIGFzYXAgKi8KLQotCXN0cnVjdCBwY2lfYWRkcmVzcyB7Ci0JCXUzMiBhX2hpOwotCQl1MzIgYV9taWQ7Ci0JCXUzMiBhX2xvOwotCX07Ci0KLQlzdHJ1Y3QgaXNhX2FkZHJlc3MgewotCQl1MzIgYV9oaTsKLQkJdTMyIGFfbG87Ci0JfTsKLQotCXN0cnVjdCBpc2FfcmFuZ2UgewotCQlzdHJ1Y3QgaXNhX2FkZHJlc3MgaXNhX2FkZHI7Ci0JCXN0cnVjdCBwY2lfYWRkcmVzcyBwY2lfYWRkcjsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0JfTsKLQotCWNvbnN0IHN0cnVjdCBpc2FfcmFuZ2UgKnJhbmdlOwotCXVuc2lnbmVkIGxvbmcgcGNpX2FkZHI7Ci0JdW5zaWduZWQgaW50IGlzYV9hZGRyOwotCXVuc2lnbmVkIGludCBzaXplOwotCWludCBybGVuID0gMDsKLQotCXJhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KGlzYV9ub2RlLCAicmFuZ2VzIiwgJnJsZW4pOwotCWlmIChyYW5nZSA9PSBOVUxMIHx8IChybGVuIDwgc2l6ZW9mKHN0cnVjdCBpc2FfcmFuZ2UpKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm5vIElTQSByYW5nZXMgb3IgdW5leHBlY3RlZCBpc2EgcmFuZ2Ugc2l6ZSwiCi0JCSAgICAgICAibWFwcGluZyA2NGtcbiIpOwotCQlfX2lvcmVtYXBfZXhwbGljaXQocGhiX2lvX2Jhc2VfcGh5cywKLQkJCQkgICAodW5zaWduZWQgbG9uZylwaGJfaW9fYmFzZV92aXJ0LAotCQkJCSAgIDB4MTAwMDAsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JCXJldHVybjsJCi0JfQotCQotCS8qIEZyb20gIklTQSBCaW5kaW5nIHRvIDEyNzUiCi0JICogVGhlIHJhbmdlcyBwcm9wZXJ0eSBpcyBsYWlkIG91dCBhcyBhbiBhcnJheSBvZiBlbGVtZW50cywKLQkgKiBlYWNoIG9mIHdoaWNoIGNvbXByaXNlczoKLQkgKiAgIGNlbGxzIDAgLSAxOglhbiBJU0EgYWRkcmVzcwotCSAqICAgY2VsbHMgMiAtIDQ6CWEgUENJIGFkZHJlc3MgCi0JICoJCQkoc2l6ZSBkZXBlbmRpbmcgb24gZGV2LT5uX2FkZHJfY2VsbHMpCi0JICogICBjZWxsIDU6CQl0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UKLQkgKi8KLQlpZiAoKHJhbmdlLT5pc2FfYWRkci5hX2hpICYmIElTQV9TUEFDRV9NQVNLKSA9PSBJU0FfU1BBQ0VfSU8pIHsKLQkJaXNhX2FkZHIgPSByYW5nZS0+aXNhX2FkZHIuYV9sbzsKLQkJcGNpX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmFuZ2UtPnBjaV9hZGRyLmFfbWlkIDw8IDMyIHwgCi0JCQlyYW5nZS0+cGNpX2FkZHIuYV9sbzsKLQotCQkvKiBBc3N1bWUgdGhlc2UgYXJlIGJvdGggemVybyAqLwotCQlpZiAoKHBjaV9hZGRyICE9IDApIHx8IChpc2FfYWRkciAhPSAwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmV4cGVjdGVkIGlzYSB0byBwY2kgbWFwcGluZzogJXNcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNpemUgPSBQQUdFX0FMSUdOKHJhbmdlLT5zaXplKTsKLQotCQlfX2lvcmVtYXBfZXhwbGljaXQocGhiX2lvX2Jhc2VfcGh5cywgCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpIHBoYl9pb19iYXNlX3ZpcnQsIAotCQkJCSAgIHNpemUsIF9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JfQotfQotCiB2b2lkIF9fZGV2aW5pdCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKIAkJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbSkKIHsKQEAgLTEwNDcsMTU1ICs2ODUsMTIyIEBACiAJfQogfQogCi12b2lkIF9fZGV2aW5pdCBwY2lfc2V0dXBfcGhiX2lvKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHByaW1hcnkpCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKKworaW50IHBjaWJpb3NfdW5tYXBfaW9fc3BhY2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSBob3NlLT5wY2lfaW9fc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGlvX3ZpcnRfb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaXNhX2RuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKGJ1cyA9PSBOVUxMKTsKIAotCWhvc2UtPmlvX2Jhc2VfdmlydCA9IHJlc2VydmVfcGhiX2lvc3BhY2Uoc2l6ZSk7Ci0JREJHKCJwaGIlZCBpb19iYXNlX3BoeXMgMHglbHggaW9fYmFzZV92aXJ0IDB4JWx4XG4iLAotCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCSh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQpOwotCi0JaWYgKHByaW1hcnkpIHsKLQkJcGNpX2lvX2Jhc2UgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQ7Ci0JCWlzYV9kbiA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpc2EiKTsKLQkJaWYgKGlzYV9kbikgewotCQkJaXNhX2lvX2Jhc2UgPSBwY2lfaW9fYmFzZTsKLQkJCXBjaV9wcm9jZXNzX0lTQV9PRl9yYW5nZXMoaXNhX2RuLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCQkJCQlob3NlLT5pb19iYXNlX3ZpcnQpOwotCQkJb2Zfbm9kZV9wdXQoaXNhX2RuKTsKLQkJfQotCX0KLQotCWlvX3ZpcnRfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7Ci0JcmVzID0gJmhvc2UtPmlvX3Jlc291cmNlOwotCXJlcy0+c3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7Ci0JcmVzLT5lbmQgKz0gaW9fdmlydF9vZmZzZXQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgaW5pdGlhbCBQQ0kgc2NhbiwgdGhlbiB3ZSBuZWVkIHRvCi0JICogcHJvY2VlZCB0byBJTyBtYXBwaW5ncyBub3cKKwkvKiBJZiB0aGlzIGlzIG5vdCBhIFBIQiwgd2Ugb25seSBmbHVzaCB0aGUgaGFzaCB0YWJsZSBvdmVyCisJICogdGhlIGFyZWEgbWFwcGVkIGJ5IHRoaXMgYnJpZGdlLiBXZSBkb24ndCBwbGF5IHdpdGggdGhlIFBURQorCSAqIG1hcHBpbmdzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgdG8gZGVhbCB3aXRoIHN1Yi1wYWdlIGFsaWduZW1udHMKKwkgKiBzbyBmbHVzaGluZyB0aGUgaGFzaCB0YWJsZSBpcyB0aGUgb25seSBzYW5lIHdheSB0byBtYWtlIHN1cmUKKwkgKiB0aGF0IG5vIGhhc2ggZW50cmllcyBhcmUgY292ZXJpbmcgdGhhdCByZW1vdmVkIGJyaWRnZSBhcmVhCisJICogd2hpbGUgc3RpbGwgYWxsb3dpbmcgb3RoZXIgYnVzc2VzIG92ZXJsYXBwaW5nIHRob3NlIHBhZ2VzCiAJICovCi0JaWYgKHBjaV9pbml0aWFsX3NjYW5fZG9uZSkKLQkJX19pb3JlbWFwX2V4cGxpY2l0KGhvc2UtPmlvX2Jhc2VfcGh5cywKLQkJCQkgICAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQsCi0JCQkJICAgaG9zZS0+cGNpX2lvX3NpemUsCi0JCQkJICAgX1BBR0VfTk9fQ0FDSEUgfCBfUEFHRV9HVUFSREVEKTsKLX0KKwlpZiAoYnVzLT5zZWxmKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKIAotdm9pZCBfX2RldmluaXQgcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkJaW50IHByaW1hcnkpCisJCURCRygiSU8gdW5tYXBwaW5nIGZvciBQQ0ktUENJIGJyaWRnZSAlc1xuIiwKKwkJICAgIHBjaV9uYW1lKGJ1cy0+c2VsZikpOworCisJCV9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZSgmaW5pdF9tbSwgcmVzLT5zdGFydCArIF9JT19CQVNFLAorCQkJCQkgcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCXJldHVybiAwOworCX0KKworCS8qIEdldCB0aGUgaG9zdCBicmlkZ2UgKi8KKwlob3NlID0gcGNpX2J1c190b19ob3N0KGJ1cyk7CisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIElPcyBhbGxvY2F0ZWQgKi8KKwlpZiAoaG9zZS0+aW9fYmFzZV9hbGxvYyA9PSAwKQorCQlyZXR1cm4gMDsKKworCURCRygiSU8gdW5tYXBwaW5nIGZvciBQSEIgJXNcbiIsCisJICAgICgoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhKS0+ZnVsbF9uYW1lKTsKKwlEQkcoIiAgYWxsb2M9MHglcFxuIiwgaG9zZS0+aW9fYmFzZV9hbGxvYyk7CisKKwkvKiBUaGlzIGlzIGEgUEhCLCB3ZSBmdWxseSB1bm1hcCB0aGUgSU8gYXJlYSAqLworCXZ1bm1hcChob3NlLT5pb19iYXNlX2FsbG9jKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc191bm1hcF9pb19zcGFjZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLworCitpbnQgX19kZXZpbml0IHBjaWJpb3NfbWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gaG9zZS0+cGNpX2lvX3NpemU7CisJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfcGFnZTsKKwl1bnNpZ25lZCBsb25nIHNpemVfcGFnZTsKIAl1bnNpZ25lZCBsb25nIGlvX3ZpcnRfb2Zmc2V0OwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIAotCWlmIChzaXplID09IDApCi0JCXJldHVybjsKKwlXQVJOX09OKGJ1cyA9PSBOVUxMKTsKIAotCWhvc2UtPmlvX2Jhc2VfdmlydCA9IF9faW9yZW1hcChob3NlLT5pb19iYXNlX3BoeXMsIHNpemUsCi0JCQkJCV9QQUdFX05PX0NBQ0hFIHwgX1BBR0VfR1VBUkRFRCk7Ci0JREJHKCJwaGIlZCBpb19iYXNlX3BoeXMgMHglbHggaW9fYmFzZV92aXJ0IDB4JWx4XG4iLAotCQlob3NlLT5nbG9iYWxfbnVtYmVyLCBob3NlLT5pb19iYXNlX3BoeXMsCi0JCSh1bnNpZ25lZCBsb25nKSBob3NlLT5pb19iYXNlX3ZpcnQpOwotCi0JaWYgKHByaW1hcnkpCi0JCXBjaV9pb19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0OwotCi0JaW9fdmlydF9vZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQlyZXMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7Ci0JcmVzLT5zdGFydCArPSBpb192aXJ0X29mZnNldDsKLQlyZXMtPmVuZCArPSBpb192aXJ0X29mZnNldDsKLX0KLQotCi1zdGF0aWMgaW50IGdldF9idXNfaW9fcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgbG9uZyAqc3RhcnRfcGh5cywKLQkJCQl1bnNpZ25lZCBsb25nICpzdGFydF92aXJ0LCB1bnNpZ25lZCBsb25nICpzaXplKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCi0JaWYgKGJ1cy0+c2VsZikKLQkJcmVzID0gYnVzLT5yZXNvdXJjZVswXTsKLQllbHNlCi0JCS8qIFJvb3QgQnVzICovCi0JCXJlcyA9ICZob3NlLT5pb19yZXNvdXJjZTsKLQotCWlmIChyZXMtPmVuZCA9PSAwICYmIHJlcy0+c3RhcnQgPT0gMCkKLQkJcmV0dXJuIDE7Ci0KLQkqc3RhcnRfdmlydCA9IHBjaV9pb19iYXNlICsgcmVzLT5zdGFydDsKLQkqc3RhcnRfcGh5cyA9ICpzdGFydF92aXJ0ICsgaG9zZS0+aW9fYmFzZV9waHlzCi0JCS0gKHVuc2lnbmVkIGxvbmcpIGhvc2UtPmlvX2Jhc2VfdmlydDsKLQotCWlmIChyZXMtPmVuZCA+IHJlcy0+c3RhcnQpCi0JCSpzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKLQllbHNlIHsKLQkJcHJpbnRrKCIlcygpOiB1bmV4cGVjdGVkIHJlZ2lvbiAweCVseC0+MHglbHhcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKLQkJcmV0dXJuIDE7CisJLyogSWYgdGhpcyBub3QgYSBQSEIsIG5vdGhpbmcgdG8gZG8sIHBhZ2UgdGFibGVzIHN0aWxsIGV4aXN0IGFuZAorCSAqIHRodXMgSFBURXMgd2lsbCBiZSBmYXVsdGVkIGluIHdoZW4gbmVlZGVkCisJICovCisJaWYgKGJ1cy0+c2VsZikgeworCQlEQkcoIklPIG1hcHBpbmcgZm9yIFBDSS1QQ0kgYnJpZGdlICVzXG4iLAorCQkgICAgcGNpX25hbWUoYnVzLT5zZWxmKSk7CisJCURCRygiICB2aXJ0PTB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICBidXMtPnJlc291cmNlWzBdLT5zdGFydCArIF9JT19CQVNFLAorCQkgICAgYnVzLT5yZXNvdXJjZVswXS0+ZW5kICsgX0lPX0JBU0UpOworCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBHZXQgdGhlIGhvc3QgYnJpZGdlICovCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXBoeXNfcGFnZSA9IF9BTElHTl9ET1dOKGhvc2UtPmlvX2Jhc2VfcGh5cywgUEFHRV9TSVpFKTsKKwlzaXplX3BhZ2UgPSBfQUxJR05fVVAoaG9zZS0+cGNpX2lvX3NpemUsIFBBR0VfU0laRSk7CisKKwkvKiBNYWtlIHN1cmUgSU8gYXJlYSBhZGRyZXNzIGlzIGNsZWFyICovCisJaG9zZS0+aW9fYmFzZV9hbGxvYyA9IE5VTEw7CisKKwkvKiBJZiB0aGVyZSdzIG5vIElPIHRvIG1hcCBvbiB0aGF0IGJ1cywgZ2V0IGF3YXkgdG9vICovCisJaWYgKGhvc2UtPnBjaV9pb19zaXplID09IDAgfHwgaG9zZS0+aW9fYmFzZV9waHlzID09IDApCisJCXJldHVybiAwOworCisJLyogTGV0J3MgYWxsb2NhdGUgc29tZSBJTyBzcGFjZSBmb3IgdGhhdCBndXkuIFdlIGRvbid0IHBhc3MKKwkgKiBWTV9JT1JFTUFQIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBhYm91dCBhbGlnbm1lbnQgdHJpY2tzIHRoYXQKKwkgKiB0aGUgY29yZSBkb2VzIGluIHRoYXQgY2FzZS4gTWF5YmUgd2Ugc2hvdWxkIGR1ZSB0byBzdHVwaWQgY2FyZAorCSAqIHdpdGggaW5jb21wbGV0ZSBhZGRyZXNzIGRlY29kaW5nIGJ1dCBJJ2QgcmF0aGVyIG5vdCBkZWFsIHdpdGgKKwkgKiB0aG9zZSBvdXRzaWRlIG9mIHRoZSByZXNlcnZlZCA2NEsgbGVnYWN5IHJlZ2lvbi4KKwkgKi8KKwlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplX3BhZ2UsIDAsIFBIQl9JT19CQVNFLCBQSEJfSU9fRU5EKTsKKwlpZiAoYXJlYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlob3NlLT5pb19iYXNlX2FsbG9jID0gYXJlYS0+YWRkcjsKKwlob3NlLT5pb19iYXNlX3ZpcnQgPSAodm9pZCBfX2lvbWVtICopKGFyZWEtPmFkZHIgKworCQkJCQkgICAgICBob3NlLT5pb19iYXNlX3BoeXMgLSBwaHlzX3BhZ2UpOworCisJREJHKCJJTyBtYXBwaW5nIGZvciBQSEIgJXNcbiIsCisJICAgICgoc3RydWN0IGRldmljZV9ub2RlICopaG9zZS0+YXJjaF9kYXRhKS0+ZnVsbF9uYW1lKTsKKwlEQkcoIiAgcGh5cz0weCUwMTZseCwgdmlydD0weCVwIChhbGxvYz0weCVwKVxuIiwKKwkgICAgaG9zZS0+aW9fYmFzZV9waHlzLCBob3NlLT5pb19iYXNlX3ZpcnQsIGhvc2UtPmlvX2Jhc2VfYWxsb2MpOworCURCRygiICBzaXplPTB4JTAxNmx4IChhbGxvYz0weCUwMTZseClcbiIsCisJICAgIGhvc2UtPnBjaV9pb19zaXplLCBzaXplX3BhZ2UpOworCisJLyogRXN0YWJsaXNoIHRoZSBtYXBwaW5nICovCisJaWYgKF9faW9yZW1hcF9hdChwaHlzX3BhZ2UsIGFyZWEtPmFkZHIsIHNpemVfcGFnZSwKKwkJCSBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRml4dXAgaG9zZSBJTyByZXNvdXJjZSAqLworCWlvX3ZpcnRfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gX0lPX0JBU0U7CisJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gaW9fdmlydF9vZmZzZXQ7CisJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IGlvX3ZpcnRfb2Zmc2V0OworCisJREJHKCIgIGhvc2UtPmlvX3Jlc291cmNlPTB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOworCiAJcmV0dXJuIDA7CiB9Ci0KLWludCB1bm1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BoeXM7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF92aXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmICghYnVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBleHBlY3RlZCBidXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQotCQlyZXR1cm4gMTsKLQlpZiAoX19pb3VubWFwX2V4cGxpY2l0KCh2b2lkIF9faW9tZW0gKikgc3RhcnRfdmlydCwgc2l6ZSkpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHVubWFwX2J1c19yYW5nZSk7Ci0KLWludCByZW1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BoeXM7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF92aXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCWlmICghYnVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSBleHBlY3RlZCBidXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQkKLQlpZiAoZ2V0X2J1c19pb19yYW5nZShidXMsICZzdGFydF9waHlzLCAmc3RhcnRfdmlydCwgJnNpemUpKQotCQlyZXR1cm4gMTsKLQlpZiAoc3RhcnRfcGh5cyA9PSAwKQotCQlyZXR1cm4gMTsKLQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGluZyBJTyAlbHggLT4gJWx4LCBzaXplOiAlbHhcbiIsIHN0YXJ0X3BoeXMsIHN0YXJ0X3ZpcnQsIHNpemUpOwotCWlmIChfX2lvcmVtYXBfZXhwbGljaXQoc3RhcnRfcGh5cywgc3RhcnRfdmlydCwgc2l6ZSwKLQkJCSAgICAgICBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChyZW1hcF9idXNfcmFuZ2UpOwotCi1zdGF0aWMgdm9pZCBwaGJzX3JlbWFwX2lvKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhvc2UsIHRtcCwgJmhvc2VfbGlzdCwgbGlzdF9ub2RlKQotCQlyZW1hcF9idXNfcmFuZ2UoaG9zZS0+YnVzKTsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfbWFwX2lvX3NwYWNlKTsKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewpAQCAtMTIwMyw4ICs4MDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCQlyZXMtPnN0YXJ0ICs9IG9mZnNldDsKIAkJcmVzLT5lbmQgKz0gb2Zmc2V0OwogCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CkBAIC0xMjE5LDkgKzgyMywyMCBAQAogCS8qIFVwZGF0ZSBkZXZpY2UgcmVzb3VyY2VzLiAgKi8KIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKQotCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncykKLQkJCWZpeHVwX3Jlc291cmNlKCZkZXYtPnJlc291cmNlW2ldLCBkZXYpOworCURCRygiJXM6IEZpeHVwIHJlc291cmNlczpcbiIsIHBjaV9uYW1lKGRldikpOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmRldi0+cmVzb3VyY2VbaV07CisJCWlmICghcmVzLT5mbGFncykKKwkJCWNvbnRpbnVlOworCisJCURCRygiICAweCUwMnggPCAlMDhseDoweCUwMTZseC4uLjB4JTAxNmx4XG4iLAorCQkgICAgaSwgcmVzLT5mbGFncywgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCisJCWZpeHVwX3Jlc291cmNlKHJlcywgZGV2KTsKKworCQlEQkcoIiAgICAgICA+ICUwOGx4OjB4JTAxNmx4Li4uMHglMDE2bHhcbiIsCisJCSAgICByZXMtPmZsYWdzLCByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJfQogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMpOwogCkBAIC0xMjkxLDExOSArOTA2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpYmlvc19maXh1cF9idXMpOwogCi0vKgotICogUmVhZHMgdGhlIGludGVycnVwdCBwaW4gdG8gZGV0ZXJtaW5lIGlmIGludGVycnVwdCBpcyB1c2UgYnkgY2FyZC4KLSAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZSAKLSAqIG9wZW5maXJtd2FyZSBhbmQgc2V0cyBpdCBpbiB0aGUgcGNpX2RldiBhbmQgcGNpX2NvbmZpZyBsaW5lLgotICovCi1pbnQgcGNpX3JlYWRfaXJxX2xpbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IG9mX2lycSBvaXJxOwotCXVuc2lnbmVkIGludCB2aXJxOwotCi0JREJHKCJUcnkgdG8gbWFwIGlycSBmb3IgJXMuLi5cbiIsIHBjaV9uYW1lKHBjaV9kZXYpKTsKLQotI2lmZGVmIERFQlVHCi0JbWVtc2V0KCZvaXJxLCAweGZmLCBzaXplb2Yob2lycSkpOwotI2VuZGlmCi0JLyogVHJ5IHRvIGdldCBhIG1hcHBpbmcgZnJvbSB0aGUgZGV2aWNlLXRyZWUgKi8KLQlpZiAob2ZfaXJxX21hcF9wY2kocGNpX2RldiwgJm9pcnEpKSB7Ci0JCXU4IGxpbmUsIHBpbjsKLQotCQkvKiBJZiB0aGF0IGZhaWxzLCBsZXRzIGZhbGxiYWNrIHRvIHdoYXQgaXMgaW4gdGhlIGNvbmZpZwotCQkgKiBzcGFjZSBhbmQgbWFwIHRoYXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBjb250cm9sbGVyLiBXZQotCQkgKiBhbHNvIHNldCB0aGUgdHlwZSB0byBsZXZlbCBsb3cgc2luY2UgdGhhdCdzIHdoYXQgUENJCi0JCSAqIGludGVycnVwdHMgYXJlLiBJZiB5b3VyIHBsYXRmb3JtIGRvZXMgZGlmZmVyZW50bHksIHRoZW4KLQkJICogZWl0aGVyIHByb3ZpZGUgYSBwcm9wZXIgaW50ZXJydXB0IHRyZWUgb3IgZG9uJ3QgdXNlIHRoaXMKLQkJICogZnVuY3Rpb24uCi0JCSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocGluID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsICZsaW5lKSB8fAotCQkgICAgbGluZSA9PSAweGZmKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJREJHKCIgLT4gbm8gbWFwICEgVXNpbmcgaXJxIGxpbmUgJWQgZnJvbSBQQ0kgY29uZmlnXG4iLCBsaW5lKTsKLQotCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCQlpZiAodmlycSAhPSBOT19JUlEpCi0JCQlzZXRfaXJxX3R5cGUodmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKLQl9IGVsc2UgewotCQlEQkcoIiAtPiBnb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHggMHglMDh4Li4uKSBvbiAlc1xuIiwKLQkJICAgIG9pcnEuc2l6ZSwgb2lycS5zcGVjaWZpZXJbMF0sIG9pcnEuc3BlY2lmaWVyWzFdLAotCQkgICAgb2lycS5jb250cm9sbGVyLT5mdWxsX25hbWUpOwotCi0JCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcob2lycS5jb250cm9sbGVyLCBvaXJxLnNwZWNpZmllciwKLQkJCQkJICAgICBvaXJxLnNpemUpOwotCX0KLQlpZih2aXJxID09IE5PX0lSUSkgewotCQlEQkcoIiAtPiBmYWlsZWQgdG8gbWFwICFcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JREJHKCIgLT4gbWFwcGVkIHRvIGxpbnV4IGlycSAlZFxuIiwgdmlycSk7Ci0KLQlwY2lfZGV2LT5pcnEgPSB2aXJxOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjaV9yZWFkX2lycV9saW5lKTsKLQotdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAotCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCi0JCQkgIHJlc291cmNlX3NpemVfdCAqc3RhcnQsIHJlc291cmNlX3NpemVfdCAqZW5kKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7Ci0JcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7Ci0KLQlpZiAoaG9zZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQotCS8qIFdlIHBhc3MgYSBmdWxseSBmaXhlZCB1cCBhZGRyZXNzIHRvIHVzZXJsYW5kIGZvciBNTUlPIGluc3RlYWQgb2YKLQkgKiBhIEJBUiB2YWx1ZSBiZWNhdXNlIFggaXMgbGFtZSBhbmQgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHVzZSB0aGF0Ci0JICogdG8gcGFzcyB0byAvZGV2L21lbSAhCi0JICoKLQkgKiBUaGF0IG1lYW5zIHRoYXQgd2UnbGwgaGF2ZSBwb3RlbnRpYWxseSA2NCBiaXRzIHZhbHVlcyB3aGVyZSBzb21lCi0JICogdXNlcmxhbmQgYXBwcyBvbmx5IGV4cGVjdCAzMiAobGlrZSBYIGl0c2VsZiBzaW5jZSBpdCB0aGlua3Mgb25seQotCSAqIFNwYXJjIGhhcyA2NCBiaXRzIE1NSU8pIGJ1dCBpZiB3ZSBkb24ndCBkbyB0aGF0LCB3ZSBicmVhayBpdCBvbgotCSAqIDMyIGJpdHMgQ0hSUHMgOi0oCi0JICoKLQkgKiBIb3BlZnVsbHksIHRoZSBzeXNmcyBpbnN0ZXJmYWNlIGlzIGltbXVuZSB0byB0aGF0IGd1bmsuIE9uY2UgWAotCSAqIGhhcyBiZWVuIGZpeGVkIChhbmQgdGhlIGZpeCBzcHJlYWQgZW5vdWdoKSwgd2UgY2FuIHJlLWVuYWJsZSB0aGUKLQkgKiAyIGxpbmVzIGJlbG93IGFuZCBwYXNzIGRvd24gYSBCQVIgdmFsdWUgdG8gdXNlcmxhbmQuIEluIHRoYXQgY2FzZQotCSAqIHdlJ2xsIGFsc28gaGF2ZSB0byByZS1lbmFibGUgdGhlIG1hdGNoaW5nIGNvZGUgaW4KLQkgKiBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KCkuCi0JICoKLQkgKiBCZW5ILgotCSAqLwotI2lmIDAKLQllbHNlIGlmIChyc3JjLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlvZmZzZXQgPSBob3NlLT5wY2lfbWVtX29mZnNldDsKLSNlbmRpZgotCi0JKnN0YXJ0ID0gcnNyYy0+c3RhcnQgLSBvZmZzZXQ7Ci0JKmVuZCA9IHJzcmMtPmVuZCAtIG9mZnNldDsKLX0KLQotc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKQotewotCWlmICghaGF2ZV9vZikKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUobm9kZSkgewotCQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkKLQkJCWlmIChob3NlLT5hcmNoX2RhdGEgPT0gbm9kZSkKLQkJCQlyZXR1cm4gaG9zZTsKLQkJbm9kZSA9IG5vZGUtPnBhcmVudDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwpAQCAtMTQxMiw3ICs5MTQsNyBAQAogCQlpZiAoYWRkcmVzcyA+PSBob3NlLT5pb19iYXNlX3BoeXMgJiYKIAkJICAgIGFkZHJlc3MgPCAoaG9zZS0+aW9fYmFzZV9waHlzICsgaG9zZS0+cGNpX2lvX3NpemUpKSB7CiAJCQl1bnNpZ25lZCBsb25nIGJhc2UgPQotCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOworCQkJCSh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIF9JT19CQVNFOwogCQkJcmV0dXJuIGJhc2UgKyAoYWRkcmVzcyAtIGhvc2UtPmlvX2Jhc2VfcGh5cyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGNfa3N5bXMuYwppbmRleCBjOTZmYTliLi5hMjBmMTk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTY3LDcgKzY3LDYgQEAKIEVYUE9SVF9TWU1CT0woRE1BX01PREVfUkVBRCk7CiBFWFBPUlRfU1lNQk9MKERNQV9NT0RFX1dSSVRFKTsKIAotRVhQT1JUX1NZTUJPTChkb19zaWduYWwpOwogRVhQT1JUX1NZTUJPTCh0cmFuc2Zlcl90b19oYW5kbGVyKTsKIEVYUE9SVF9TWU1CT0woZG9fSVJRKTsKIEVYUE9SVF9TWU1CT0wobWFjaGluZV9jaGVja19leGNlcHRpb24pOwpAQCAtMTA2LDEwICsxMDUsNiBAQAogRVhQT1JUX1NZTUJPTChwY2lfZHJhbV9vZmZzZXQpOwogRVhQT1JUX1NZTUJPTChwY2lfYWxsb2NfY29uc2lzdGVudCk7CiBFWFBPUlRfU1lNQk9MKHBjaV9mcmVlX2NvbnNpc3RlbnQpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2lvX2Jhc2UpOwotRVhQT1JUX1NZTUJPTChwY2lfYnVzX2lvX2Jhc2VfcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfbWVtX2Jhc2VfcGh5cyk7Ci1FWFBPUlRfU1lNQk9MKHBjaV9idXNfdG9faG9zZSk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBFWFBPUlRfU1lNQk9MKHN0YXJ0X3RocmVhZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZlMmYwMzUuLjg0ZjAwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMTksMjIgKzIxOSwyNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiBpbnQgc2V0X2RhYnIodW5zaWduZWQgbG9uZyBkYWJyKQogeworI2lmZGVmIENPTkZJR19QUENfTUVSR0UJCS8qIFhYWCBmb3Igbm93ICovCiAJaWYgKHBwY19tZC5zZXRfZGFicikKIAkJcmV0dXJuIHBwY19tZC5zZXRfZGFicihkYWJyKTsKKyNlbmRpZgogCisJLyogWFhYIHNob3VsZCB3ZSBoYXZlIGEgQ1BVX0ZUUl9IQVNfREFCUiA/ICovCisjaWYgZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHXzZ4eCkKIAltdHNwcihTUFJOX0RBQlIsIGRhYnIpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUEM2NAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV91c2FnZSwgY3B1X3VzYWdlX2FycmF5KTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjdXJyZW50X2RhYnIpOwogI2VuZGlmCiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjdXJyZW50X2RhYnIpOworCiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldykKIHsKQEAgLTI5OSwxMiArMzAzLDEwIEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLSNpZmRlZiBDT05GSUdfUFBDNjQJLyogZm9yIG5vdyAqLwogCWlmICh1bmxpa2VseShfX2dldF9jcHVfdmFyKGN1cnJlbnRfZGFicikgIT0gbmV3LT50aHJlYWQuZGFicikpIHsKIAkJc2V0X2RhYnIobmV3LT50aHJlYWQuZGFicik7CiAJCV9fZ2V0X2NwdV92YXIoY3VycmVudF9kYWJyKSA9IG5ldy0+dGhyZWFkLmRhYnI7CiAJfQotI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCiAJbmV3X3RocmVhZCA9ICZuZXctPnRocmVhZDsKIAlvbGRfdGhyZWFkID0gJmN1cnJlbnQtPnRocmVhZDsKQEAgLTQ3MywxMiArNDc1LDEwIEBACiAKIAlkaXNjYXJkX2xhenlfY3B1X3N0YXRlKCk7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQJLyogZm9yIG5vdyAqLwogCWlmIChjdXJyZW50LT50aHJlYWQuZGFicikgewogCQljdXJyZW50LT50aHJlYWQuZGFiciA9IDA7CiAJCXNldF9kYWJyKDApOwogCX0KLSNlbmRpZgogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCmluZGV4IGFmNDJkZGEuLjM3ZmY5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8YXNtL3BTZXJpZXNfcmVjb25maWcuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhLRVJOX0VSUiBmbXQpCkBAIC0xMDA1LDcgKzEwMDYsNyBAQAogCiB2b2lkIF9faW5pdCBlYXJseV9pbml0X2RldnRyZWUodm9pZCAqcGFyYW1zKQogewotCURCRygiIC0+IGVhcmx5X2luaXRfZGV2dHJlZSgpXG4iKTsKKwlEQkcoIiAtPiBlYXJseV9pbml0X2RldnRyZWUoJXApXG4iLCBwYXJhbXMpOwogCiAJLyogU2V0dXAgZmxhdCBkZXZpY2UtdHJlZSBwb2ludGVyICovCiAJaW5pdGlhbF9ib290X3BhcmFtcyA9IHBhcmFtczsKQEAgLTEwNTUsOCArMTA1Niw2IEBACiAJREJHKCIgPC0gZWFybHlfaW5pdF9kZXZ0cmVlKClcbiIpOwogfQogCi0jdW5kZWYgcHJpbnRrCi0KIGludCBvZl9uX2FkZHJfY2VsbHMoc3RydWN0IGRldmljZV9ub2RlKiBucCkKIHsKIAljb25zdCBpbnQgKmlwOwpAQCAtMTM3NSw4ICsxMzc0LDE3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0ga3JlZl90b19kZXZpY2Vfbm9kZShrcmVmKTsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBub2RlLT5wcm9wZXJ0aWVzOwogCi0JaWYgKCFPRl9JU19EWU5BTUlDKG5vZGUpKQorCS8qIFdlIHNob3VsZCBuZXZlciBiZSByZWxlYXNpbmcgbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGV0YWNoZWQuICovCisJaWYgKCFvZl9ub2RlX2NoZWNrX2ZsYWcobm9kZSwgT0ZfREVUQUNIRUQpKSB7CisJCXByaW50aygiV0FSTklORzogQmFkIG9mX25vZGVfcHV0KCkgb24gJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCWR1bXBfc3RhY2soKTsKKwkJa3JlZl9pbml0KCZub2RlLT5rcmVmKTsKIAkJcmV0dXJuOworCX0KKworCWlmICghb2Zfbm9kZV9jaGVja19mbGFnKG5vZGUsIE9GX0RZTkFNSUMpKQorCQlyZXR1cm47CisKIAl3aGlsZSAocHJvcCkgewogCQlzdHJ1Y3QgcHJvcGVydHkgKm5leHQgPSBwcm9wLT5uZXh0OwogCQlrZnJlZShwcm9wLT5uYW1lKTsKQEAgLTE0MzIsNiArMTQ0MCw4IEBACiAJd3JpdGVfbG9jaygmZGV2dHJlZV9sb2NrKTsKIAogCXBhcmVudCA9IG5wLT5wYXJlbnQ7CisJaWYgKCFwYXJlbnQpCisJCWdvdG8gb3V0X3VubG9jazsKIAogCWlmIChhbGxub2RlcyA9PSBucCkKIAkJYWxsbm9kZXMgPSBucC0+YWxsbmV4dDsKQEAgLTE0NTUsNiArMTQ2NSw5IEBACiAJCXByZXZzaWItPnNpYmxpbmcgPSBucC0+c2libGluZzsKIAl9CiAKKwlvZl9ub2RlX3NldF9mbGFnKG5wLCBPRl9ERVRBQ0hFRCk7CisKK291dF91bmxvY2s6CiAJd3JpdGVfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOwogfQogCkBAIC0xNzE2LDIyICsxNzI5LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9jcHVfbm9kZSk7CiAKLSNpZmRlZiBERUJVRworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKERFQlVHKQogc3RhdGljIHN0cnVjdCBkZWJ1Z2ZzX2Jsb2Jfd3JhcHBlciBmbGF0X2R0X2Jsb2I7CiAKIHN0YXRpYyBpbnQgX19pbml0IGV4cG9ydF9mbGF0X2RldmljZV90cmVlKHZvaWQpCiB7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAotCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInBvd2VycGMiLCBOVUxMKTsKLQlpZiAoIWQpCi0JCXJldHVybiAxOwotCiAJZmxhdF9kdF9ibG9iLmRhdGEgPSBpbml0aWFsX2Jvb3RfcGFyYW1zOwogCWZsYXRfZHRfYmxvYi5zaXplID0gaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplOwogCiAJZCA9IGRlYnVnZnNfY3JlYXRlX2Jsb2IoImZsYXQtZGV2aWNlLXRyZWUiLCBTX0lGUkVHIHwgU19JUlVTUiwKLQkJCQlkLCAmZmxhdF9kdF9ibG9iKTsKKwkJCQlwb3dlcnBjX2RlYnVnZnNfcm9vdCwgJmZsYXRfZHRfYmxvYik7CiAJaWYgKCFkKQogCQlyZXR1cm4gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggZDYwNDdjNC4uYTFkNTgyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC02MzUsNiArNjM1LDcgQEAKIC8qIGlibSxkeW5hbWljLXJlY29uZmlndXJhdGlvbi1tZW1vcnkgcHJvcGVydHkgc3VwcG9ydGVkICovCiAjZGVmaW5lIE9WNV9EUkNPTkZfTUVNT1JZCTB4MjAKICNkZWZpbmUgT1Y1X0xBUkdFX1BBR0VTCQkweDEwCS8qIGxhcmdlIHBhZ2VzIHN1cHBvcnRlZCAqLworI2RlZmluZSBPVjVfRE9OQVRFX0RFRElDQVRFX0NQVSAweDAyCS8qIGRvbmF0ZSBkZWRpY2F0ZWQgQ1BVIHN1cHBvcnQgKi8KIC8qIFBDSWUvTVNJIHN1cHBvcnQuICBXaXRob3V0IE1TSSBmdWxsIFBDSWUgaXMgbm90IHN1cHBvcnRlZCAqLwogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiAjZGVmaW5lIE9WNV9NU0kJCQkweDAxCS8qIFBDSWUvTVNJIHN1cHBvcnQgKi8KQEAgLTY4NSw3ICs2ODYsOCBAQAogCS8qIG9wdGlvbiB2ZWN0b3IgNTogUEFQUi9PRiBvcHRpb25zICovCiAJMyAtIDIsCQkJCS8qIGxlbmd0aCAqLwogCTAsCQkJCS8qIGRvbid0IGlnbm9yZSwgZG9uJ3QgaGFsdCAqLwotCU9WNV9MUEFSIHwgT1Y1X1NQTFBBUiB8IE9WNV9MQVJHRV9QQUdFUyB8IE9WNV9EUkNPTkZfTUVNT1JZIHwgT1Y1X01TSSwKKwlPVjVfTFBBUiB8IE9WNV9TUExQQVIgfCBPVjVfTEFSR0VfUEFHRVMgfCBPVjVfRFJDT05GX01FTU9SWSB8CisJT1Y1X0RPTkFURV9ERURJQ0FURV9DUFUgfCBPVjVfTVNJLAogfTsKIAogLyogT2xkIG1ldGhvZCAtIEVMRiBoZWFkZXIgd2l0aCBQVF9OT1RFIHNlY3Rpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS1jb21tb24uaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk3YWU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLWNvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiAgICBDb3B5cmlnaHQgKGMpIDIwMDIgU3RlcGhlbiBSb3Rod2VsbCwgSUJNIENvcHJvcmF0aW9uCi0gKiAgICBFeHRyYWN0ZWQgZnJvbSBwdHJhY2UuYyBhbmQgcHRyYWNlMzIuYwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIFJFQURNRS5sZWdhbCBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKLSAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX1BQQzY0X1BUUkFDRV9DT01NT05fSAotI2RlZmluZSBfUFBDNjRfUFRSQUNFX0NPTU1PTl9ICi0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLS8qCi0gKiBTZXQgb2YgbXNyIGJpdHMgdGhhdCBnZGIgY2FuIGNoYW5nZSBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzLgotICovCi0jZGVmaW5lIE1TUl9ERUJVR0NIQU5HRQkoTVNSX0ZFMCB8IE1TUl9TRSB8IE1TUl9CRSB8IE1TUl9GRTEpCi0KLS8qCi0gKiBHZXQgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKLXsKLQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7Ci0KLQkvKgotCSAqIFB1dCB0aGUgY29ycmVjdCBGUCBiaXRzIGluLCB0aGV5IG1pZ2h0IGJlIHdyb25nIGFzIGEgcmVzdWx0Ci0JICogb2Ygb3VyIGxhenkgRlAgcmVzdG9yZS4KLQkgKi8KLQlpZiAocmVnbm8gPT0gUFRfTVNSKSB7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtQVF9NU1JdOwotCQl0bXAgfD0gdGFzay0+dGhyZWFkLmZwZXhjX21vZGU7Ci0JfSBlbHNlIGlmIChyZWdubyA8IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgewotCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwotCX0KLQotCXJldHVybiB0bXA7Ci19Ci0KLS8qCi0gKiBXcml0ZSBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOTyBpbiB0YXNrIFRBU0suCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB1dF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8sCi0JCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlpZiAocmVnbm8gPCBQVF9TT0ZURSkgewotCQlpZiAocmVnbm8gPT0gUFRfTVNSKQotCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQotCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKLQkJKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW3JlZ25vXSA9IGRhdGE7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTzsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKLQlpZiAocmVncyAhPSBOVUxMKQotCQlyZWdzLT5tc3IgfD0gTVNSX1NFOwotCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX1NJTkdMRVNURVApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7Ci0JaWYgKHJlZ3MgIT0gTlVMTCkKLQkJcmVncy0+bXNyICY9IH5NU1JfU0U7Ci0JY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKLX0KLQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0vKgotICogR2V0L3NldCBhbGwgdGhlIGFsdGl2ZWMgcmVnaXN0ZXJzIHZyMC4udnIzMSwgdnNjciwgdnJzYXZlLCBpbiBvbmUgZ28uCi0gKiBUaGUgdHJhbnNmZXIgdG90YWxzIDM0IHF1YWR3b3JkLiAgUXVhZHdvcmRzIDAtMzEgY29udGFpbiB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHJlZ2lzdGVycy4gIFF1YWR3b3JkIDMyIGNvbnRhaW5zIHRoZSB2c2NyIGFzIHRoZQotICogbGFzdCB3b3JkIChvZmZzZXQgMTIpIHdpdGhpbiB0aGF0IHF1YWR3b3JkLiAgUXVhZHdvcmQgMzMgY29udGFpbnMgdGhlCi0gKiB2cnNhdmUgYXMgdGhlIGZpcnN0IHdvcmQgKG9mZnNldCAwKSB3aXRoaW4gdGhlIHF1YWR3b3JkLgotICoKLSAqIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgVk1YIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBQUEMzMgotICogcHRyYWNlIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHNpZ25hbCBoYW5kbGluZyBhbmQgcHRyYWNlIHRvIHVzZSB0aGUKLSAqIHNhbWUgc3RydWN0dXJlcy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJpLWFyY2gKLSAqIChjb21iaW5lZCAoMzItIGFuZCA2NC1iaXQpIGdkYi4KLSAqLwotCi0vKgotICogR2V0IGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92cnJlZ3ModW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEsCi0JCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ3NpemU7Ci0KLQkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCXJlZ3NpemUgPSAzMiAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgdGFzay0+dGhyZWFkLnZyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZTQ1IgKi8KLQlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogV3JpdGUgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbnRvIHRhc2sgVEFTSy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgc2V0X3ZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICpkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKLQotCS8qIGNvcHkgQWx0aVZlYyByZWdpc3RlcnMgVlJbMF0gLi4gVlJbMzFdICovCi0JcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC52ciwgZGF0YSwgcmVnc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCi0JLyogY29weSBWU0NSICovCi0JcmVnc2l6ZSA9IDEgKiBzaXplb2YodmVjdG9yMTI4KTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRhc2stPnRocmVhZC52c2NyLCBkYXRhLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChnZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHB0cmFjZV9zZXRfZGVidWdyZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBkYXRhKQotewotCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLwotCWlmIChhZGRyID4gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBUaGUgYm90dG9tIDMgYml0cyBhcmUgZmxhZ3MgKi8KLQlpZiAoKGRhdGEgJiB+MHg3VUwpID49IFRBU0tfU0laRSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBFbnN1cmUgdHJhbnNsYXRpb24gaXMgb24gKi8KLQlpZiAoZGF0YSAmJiAhKGRhdGEgJiBEQUJSX1RSQU5TTEFUSU9OKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQl0YXNrLT50aHJlYWQuZGFiciA9IGRhdGE7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfUFBDNjRfUFRSQUNFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwppbmRleCBiZjc2NTYyLi44YTE3N2JkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTM1LDExICszNSwxMSBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSAicHRyYWNlLWNvbW1vbi5oIgotI2VuZGlmCisvKgorICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgorICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICovCiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIC8qCiAgKiBTZXQgb2YgbXNyIGJpdHMgdGhhdCBnZGIgY2FuIGNoYW5nZSBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzLgogICovCkBAIC00OCw2NSArNDgsMTE3IEBACiAjZWxzZQogI2RlZmluZSBNU1JfREVCVUdDSEFOR0UJKE1TUl9TRSB8IE1TUl9CRSkKICNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogCiAvKgotICogZG9lcyBub3QgeWV0IGNhdGNoIHNpZ25hbHMgc2VudCB3aGVuIHRoZSBjaGlsZCBkaWVzLgotICogaW4gZXhpdC5jIG9yIGluIHNpZ25hbC5jLgorICogTWF4IHJlZ2lzdGVyIHdyaXRlYWJsZSB2aWEgcHV0X3JlZwogICovCi0KICNpZmRlZiBDT05GSUdfUFBDMzIKKyNkZWZpbmUgUFRfTUFYX1BVVF9SRUcJUFRfTVEKKyNlbHNlCisjZGVmaW5lIFBUX01BWF9QVVRfUkVHCVBUX0NDUgorI2VuZGlmCisKIC8qCiAgKiBHZXQgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHTk8gaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKK3Vuc2lnbmVkIGxvbmcgcHRyYWNlX2dldF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8pCiB7Ci0JaWYgKHJlZ25vIDwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKQotCSAgICAmJiB0YXNrLT50aHJlYWQucmVncyAhPSBOVUxMKQorCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKKworCWlmICh0YXNrLT50aHJlYWQucmVncyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyZWdubyA9PSBQVF9NU1IpIHsKKwkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnJlZ3MpW1BUX01TUl07CisJCXJldHVybiB0bXAgfCB0YXNrLT50aHJlYWQuZnBleGNfbW9kZTsKKwl9CisKKwlpZiAocmVnbm8gPCAoc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCiAJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwotCXJldHVybiAoMCk7CisKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyoKICAqIFdyaXRlIGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFR05PIGluIHRhc2sgVEFTSy4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubywKLQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhKQoraW50IHB0cmFjZV9wdXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vLCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWYgKHJlZ25vIDw9IFBUX01RICYmIHRhc2stPnRocmVhZC5yZWdzICE9IE5VTEwpIHsKKwlpZiAodGFzay0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocmVnbm8gPD0gUFRfTUFYX1BVVF9SRUcgfHwgcmVnbm8gPT0gUFRfVFJBUCkgewogCQlpZiAocmVnbm8gPT0gUFRfTVNSKQogCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQogCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKKwkJLyogV2UgcHJldmVudCBtdWNraW5nIGFyb3VuZCB3aXRoIHRoZSByZXNlcnZlZCBhcmVhIG9mIHRyYXAKKwkJICogd2hpY2ggYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsCisJCSAqLworCQlpZiAocmVnbm8gPT0gUFRfVFJBUCkKKwkJCWRhdGEgJj0gMHhmZmYwOwogCQkoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dID0gZGF0YTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAtRUlPOwogfQogCisKK3N0YXRpYyBpbnQgZ2V0X2ZwcmVncyh2b2lkIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICAgICBpbnQgaGFzX2Zwc2NyKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGhhc19mcHNjciA/IDMzIDogMzI7CisKKwlpZiAoY29weV90b191c2VyKGRhdGEsIHRhc2stPnRocmVhZC5mcHIsIGNvdW50ICogc2l6ZW9mKGRvdWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZnByZWdzKHZvaWQgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICAgIGludCBoYXNfZnBzY3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gaGFzX2Zwc2NyID8gMzMgOiAzMjsKKworCWlmIChjb3B5X2Zyb21fdXNlcih0YXNrLT50aHJlYWQuZnByLCBkYXRhLCBjb3VudCAqIHNpemVvZihkb3VibGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAvKgorICogR2V0L3NldCBhbGwgdGhlIGFsdGl2ZWMgcmVnaXN0ZXJzIHZyMC4udnIzMSwgdnNjciwgdnJzYXZlLCBpbiBvbmUgZ28uCisgKiBUaGUgdHJhbnNmZXIgdG90YWxzIDM0IHF1YWR3b3JkLiAgUXVhZHdvcmRzIDAtMzEgY29udGFpbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgdmVjdG9yIHJlZ2lzdGVycy4gIFF1YWR3b3JkIDMyIGNvbnRhaW5zIHRoZSB2c2NyIGFzIHRoZQorICogbGFzdCB3b3JkIChvZmZzZXQgMTIpIHdpdGhpbiB0aGF0IHF1YWR3b3JkLiAgUXVhZHdvcmQgMzMgY29udGFpbnMgdGhlCisgKiB2cnNhdmUgYXMgdGhlIGZpcnN0IHdvcmQgKG9mZnNldCAwKSB3aXRoaW4gdGhlIHF1YWR3b3JkLgorICoKKyAqIFRoaXMgZGVmaW5pdGlvbiBvZiB0aGUgVk1YIHN0YXRlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBQUEMzMgorICogcHRyYWNlIGludGVyZmFjZS4gIFRoaXMgYWxsb3dzIHNpZ25hbCBoYW5kbGluZyBhbmQgcHRyYWNlIHRvIHVzZSB0aGUKKyAqIHNhbWUgc3RydWN0dXJlcy4gIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIGJpLWFyY2gKKyAqIChjb21iaW5lZCAoMzItIGFuZCA2NC1iaXQpIGdkYi4KKyAqLworCisvKgogICogR2V0IGNvbnRlbnRzIG9mIEFsdGlWZWMgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGdldF92cnJlZ3ModW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBpbnQgZ2V0X3ZycmVncyh1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCWludCBpLCBqOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCAxMzMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAKIAkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBkYXRhKyspCi0JCQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnJbaV0udVtqXSwgZGF0YSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLCB0YXNrLT50aHJlYWQudnIsIHJlZ3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhICs9IChyZWdzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAogCS8qIGNvcHkgVlNDUiAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGRhdGErKykKLQkJaWYgKF9fcHV0X3VzZXIodGFzay0+dGhyZWFkLnZzY3IudVtpXSwgZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOworCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKLSAgICAgICAgLyogY29weSBWUlNBVkUgKi8KLQlpZiAoX19wdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCBkYXRhKSkKKwkvKiBjb3B5IFZSU0FWRSAqLworCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXJldHVybiAwOwpAQCAtMTE1LDMxICsxNjcsMjkgQEAKIC8qCiAgKiBXcml0ZSBjb250ZW50cyBvZiBBbHRpVmVjIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEpCitzdGF0aWMgaW50IHNldF92cnJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIF9fdXNlciAqZGF0YSkKIHsKLQlpbnQgaSwgajsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCAxMzMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CiAKIAkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrLCBkYXRhKyspCi0JCQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnJbaV0udVtqXSwgZGF0YSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJcmVnc2l6ZSA9IDMyICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC52ciwgZGF0YSwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWU0NSICovCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgZGF0YSsrKQotCQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnNjci51W2ldLCBkYXRhKSkKLQkJCXJldHVybiAtRUZBVUxUOworCXJlZ3NpemUgPSAxICogc2l6ZW9mKHZlY3RvcjEyOCk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0YXNrLT50aHJlYWQudnNjciwgZGF0YSwgcmVnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCiAJLyogY29weSBWUlNBVkUgKi8KLQlpZiAoX19nZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCBkYXRhKSkKKwlpZiAoZ2V0X3VzZXIodGFzay0+dGhyZWFkLnZyc2F2ZSwgKHUzMiBfX3VzZXIgKilkYXRhKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKICNpZmRlZiBDT05GSUdfU1BFCiAKQEAgLTE1Niw3ICsyMDYsNyBAQAogLyoKICAqIEdldCBjb250ZW50cyBvZiBTUEUgcmVnaXN0ZXIgc3RhdGUgaW4gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfZXZycmVncyh1bnNpZ25lZCBsb25nICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgaW50IGdldF9ldnJyZWdzKHVuc2lnbmVkIGxvbmcgKmRhdGEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlpbnQgaTsKIApAQCAtMTgyLDcgKzIzMiw3IEBACiAvKgogICogV3JpdGUgY29udGVudHMgb2YgU1BFIHJlZ2lzdGVyIHN0YXRlIGludG8gdGFzayBUQVNLLgogICovCi1zdGF0aWMgaW5saW5lIGludCBzZXRfZXZycmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmRhdGEpCitzdGF0aWMgaW50IHNldF9ldnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZGF0YSkKIHsKIAlpbnQgaTsKIApAQCAtMjA1LDggKzI1NSw4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NQRSAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCisKK3N0YXRpYyB2b2lkIHNldF9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrLT50aHJlYWQucmVnczsKIApAQCAtMjIxLDggKzI3MSw3IEBACiAJc2V0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfU0lOR0xFU1RFUCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIHZvaWQgY2xlYXJfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7CiAKQEAgLTIzNiw3ICsyODUsMjUgQEAKIAl9CiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9TSU5HTEVTVEVQKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KKworc3RhdGljIGludCBwdHJhY2Vfc2V0X2RlYnVncmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIERBQlIgYW5kIG5vIElBQlJTIGF0IHRoZSBtb21lbnQgKi8KKwlpZiAoYWRkciA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGhlIGJvdHRvbSAzIGJpdHMgYXJlIGZsYWdzICovCisJaWYgKChkYXRhICYgfjB4N1VMKSA+PSBUQVNLX1NJWkUpCisJCXJldHVybiAtRUlPOworCisJLyogRW5zdXJlIHRyYW5zbGF0aW9uIGlzIG9uICovCisJaWYgKGRhdGEgJiYgIShkYXRhICYgREFCUl9UUkFOU0xBVElPTikpCisJCXJldHVybiAtRUlPOworCisJdGFzay0+dGhyZWFkLmRhYnIgPSBkYXRhOworCXJldHVybiAwOworfQogCiAvKgogICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCkBAIC0yNDksNiArMzE2LDYyIEBACiAJY2xlYXJfc2luZ2xlX3N0ZXAoY2hpbGQpOwogfQogCisvKgorICogSGVyZSBhcmUgdGhlIG9sZCAibGVnYWN5IiBwb3dlcnBjIHNwZWNpZmljIGdldHJlZ3Mvc2V0cmVncyBwdHJhY2UgY2FsbHMsCisgKiB3ZSBtYXJrIHRoZW0gYXMgb2Jzb2xldGUgbm93LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uCisgKi8KK3N0YXRpYyBsb25nIGFyY2hfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsIGxvbmcgYWRkciwKKwkJCSAgICBsb25nIGRhdGEpCit7CisJaW50IHJldCA9IC1FUEVSTTsKKworCXN3aXRjaChyZXF1ZXN0KSB7CisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCisJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CisJCXJldCA9IGdldF9mcHJlZ3MoKHZvaWQgX191c2VyICopYWRkciwgY2hpbGQsIDApOworCQlicmVhazsKKwl9CisKKwljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiB7IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJcmV0ID0gc2V0X2ZwcmVncygodm9pZCBfX3VzZXIgKilhZGRyLCBjaGlsZCwgMCk7CisJCWJyZWFrOworCX0KKworCX0KKwlyZXR1cm4gcmV0OworfQorCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7CiAJaW50IHJldCA9IC1FUEVSTTsKQEAgLTI1NiwxNyArMzc5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwljYXNlIFBUUkFDRV9QRUVLREFUQToKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLQl9CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0yODQsMTEgKzM5OSw5IEBACiAjZW5kaWYKIAkJCWJyZWFrOwogCi0jaWZkZWYgQ09ORklHX1BQQzMyCiAJCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotI2VuZGlmCiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIChpbnQpIGluZGV4KTsKKwkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCAoaW50KSBpbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpW2luZGV4IC0gUFRfRlBSMF07CkBAIC0zMDAsMTEgKzQxMyw3IEBACiAJLyogSWYgSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCQkJPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAKIAkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KQEAgLTMyMywxMyArNDMyLDkgQEAKICNlbmRpZgogCQkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfUFBDMzIKIAkJQ0hFQ0tfRlVMTF9SRUdTKGNoaWxkLT50aHJlYWQucmVncyk7Ci0jZW5kaWYKLQkJaWYgKGluZGV4ID09IFBUX09SSUdfUjMpCi0JCQlicmVhazsKIAkJaWYgKGluZGV4IDwgUFRfRlBSMCkgewotCQkJcmV0ID0gcHV0X3JlZyhjaGlsZCwgaW5kZXgsIGRhdGEpOworCQkJcmV0ID0gcHRyYWNlX3B1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKIAkJfSBlbHNlIHsKIAkJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7CiAJCQkoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLmZwcilbaW5kZXggLSBQVF9GUFIwXSA9IGRhdGE7CkBAIC0zODQsNyArNDg5LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJY2FzZSBQVFJBQ0VfR0VUX0RFQlVHUkVHOiB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCS8qIFdlIG9ubHkgc3VwcG9ydCBvbmUgREFCUiBhbmQgbm8gSUFCUlMgYXQgdGhlIG1vbWVudCAqLwpAQCAtMzk4LDczICs1MDIsNjEgQEAKIAljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CiAJCXJldCA9IHB0cmFjZV9zZXRfZGVidWdyZWcoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKLSNlbmRpZgogCiAJY2FzZSBQVFJBQ0VfREVUQUNIOgogCQlyZXQgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKIAkJYnJlYWs7CiAKLQljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIFBUUkFDRV9HRVRSRUdTNjQ6CisjZW5kaWYKKwljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgcHRfcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KKwkJaW50IHVpOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IDA7CisJCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7CisJCQlyZXQgfD0gX19wdXRfdXNlcihwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgdWkpLAorCQkJCQkgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGxvbmcpOwogCQl9CiAJCWJyZWFrOwogCX0KIAotCWNhc2UgUFBDX1BUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwljYXNlIFBUUkFDRV9TRVRSRUdTNjQ6CisjZW5kaWYKKwljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWRhdGEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKIAkJCWlmIChyZXQpCiAJCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOworCQkJcHRyYWNlX3B1dF9yZWcoY2hpbGQsIHVpLCB0bXApOworCQkJZGF0YSArPSBzaXplb2YobG9uZyk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQorCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZSAoRlBSMC4uLjMxICsgRlBTQ1IpICovCiAJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQorCQlyZXQgPSBnZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWRhdGEsIGNoaWxkLCAxKTsKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKLQorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZSAoRlBSMC4uLjMxICsgRlBTQ1IpICovCiAJCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQorCQlyZXQgPSBzZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWRhdGEsIGNoaWxkLCAxKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00OTksMTEgKzU5MSwxOCBAQAogCQlicmVhazsKICNlbmRpZgogCisJLyogT2xkIHJldmVyc2UgYXJncyBwdHJhY2UgY2FsbHNzICovCisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCWNhc2UgUFBDX1BUUkFDRV9HRVRGUFJFR1M6IC8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VURlBSRUdTOiAvKiBHZXQgRlBScyAwIC0gMzEuICovCisJCXJldCA9IGFyY2hfcHRyYWNlX29sZChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAl9Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKaW5kZXggOWI5YTIzMC4uOWU2YmFlYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYwpAQCAtMzMsMTMgKzMzLDU1IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlICJwdHJhY2UtY29tbW9uLmgiCi0KIC8qCiAgKiBkb2VzIG5vdCB5ZXQgY2F0Y2ggc2lnbmFscyBzZW50IHdoZW4gdGhlIGNoaWxkIGRpZXMuCiAgKiBpbiBleGl0LmMgb3IgaW4gc2lnbmFsLmMuCiAgKi8KIAorLyoKKyAqIEhlcmUgYXJlIHRoZSBvbGQgImxlZ2FjeSIgcG93ZXJwYyBzcGVjaWZpYyBnZXRyZWdzL3NldHJlZ3MgcHRyYWNlIGNhbGxzLAorICogd2UgbWFyayB0aGVtIGFzIG9ic29sZXRlIG5vdywgdGhleSB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbgorICovCitzdGF0aWMgbG9uZyBjb21wYXRfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCisJCQkgICAgICBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpbnQgcmV0ID0gLUVQRVJNOworCisJc3dpdGNoKHJlcXVlc3QpIHsKKwljYXNlIFBQQ19QVFJBQ0VfR0VUUkVHUzogeyAvKiBHZXQgR1BScyAwIC0gMzEuICovCisJCWludCBpOworCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKKwkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlyZXQgPSBwdXRfdXNlcigqcmVnLCB0bXApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXJlZysrOworCQkJdG1wKys7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CisJCXVuc2lnbmVkIGludCBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopYWRkcjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZWcrKzsKKwkJCXRtcCsrOworCQl9CisJCWJyZWFrOworCX0KKworCX0KKwlyZXR1cm4gcmV0OworfQorCiBsb25nIGNvbXBhdF9zeXNfcHRyYWNlKGludCByZXF1ZXN0LCBpbnQgcGlkLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhdGEpCiB7CkBAIC0xMjMsNyArMTY1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIGluZGV4KTsKKwkJCXRtcCA9IHB0cmFjZV9nZXRfcmVnKGNoaWxkLCBpbmRleCk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJLyoKQEAgLTE2Miw3ICsyMDQsOSBAQAogCQllbHNlCiAJCQlwYXJ0ID0gMDsgIC8qIHdhbnQgdGhlIDFzdCBoYWxmIG9mIHRoZSByZWdpc3RlciAobGVmdC1tb3N0KS4gKi8KIAotCQkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUgd3JvbmcgYm91bmRhcnkgb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYSAqLworCQkvKiBWYWxpZGF0ZSB0aGUgaW5wdXQgLSBjaGVjayB0byBzZWUgaWYgYWRkcmVzcyBpcyBvbiB0aGUgd3JvbmcgYm91bmRhcnkKKwkJICogb3IgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHVzZXIgYXJlYQorCQkgKi8KIAkJaWYgKChhZGRyICYgMykgfHwgbnVtUmVnID4gUFRfRlBTQ1IpCiAJCQlicmVhazsKIApAQCAtMTcwLDcgKzIxNCw3IEBACiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJdG1wID0gKCh1bnNpZ25lZCBsb25nIGludCAqKWNoaWxkLT50aHJlYWQuZnByKVtudW1SZWcgLSBQVF9GUFIwXTsKIAkJfSBlbHNlIHsgLyogcmVnaXN0ZXIgd2l0aGluIFBUX1JFR1Mgc3RydWN0ICovCi0JCQl0bXAgPSBnZXRfcmVnKGNoaWxkLCBudW1SZWcpOworCQkJdG1wID0gcHRyYWNlX2dldF9yZWcoY2hpbGQsIG51bVJlZyk7CiAJCX0gCiAJCXJlZzMyYml0cyA9ICgodTMyKikmdG1wKVtwYXJ0XTsKIAkJcmV0ID0gcHV0X3VzZXIocmVnMzJiaXRzLCAodTMyIF9fdXNlciAqKWRhdGEpOwpAQCAtMjI2LDEwICsyNzAsOCBAQAogCQlpZiAoKGFkZHIgJiAzKSB8fCAoaW5kZXggPiBQVF9GUFNDUjMyKSkKIAkJCWJyZWFrOwogCi0JCWlmIChpbmRleCA9PSBQVF9PUklHX1IzKQotCQkJYnJlYWs7CiAJCWlmIChpbmRleCA8IFBUX0ZQUjApIHsKLQkJCXJldCA9IHB1dF9yZWcoY2hpbGQsIGluZGV4LCBkYXRhKTsKKwkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBpbmRleCwgZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwogCQkJLyoKQEAgLTI1OCw3MCArMzAwLDI1IEBACiAJCS8qIERldGVybWluZSB3aGljaCByZWdpc3RlciB0aGUgdXNlciB3YW50cyAqLwogCQlpbmRleCA9ICh1NjQpYWRkciA+PiAyOwogCQludW1SZWcgPSBpbmRleCAvIDI7CisKIAkJLyoKIAkJICogVmFsaWRhdGUgdGhlIGlucHV0IC0gY2hlY2sgdG8gc2VlIGlmIGFkZHJlc3MgaXMgb24gdGhlCiAJCSAqIHdyb25nIGJvdW5kYXJ5IG9yIGJleW9uZCB0aGUgZW5kIG9mIHRoZSB1c2VyIGFyZWEKIAkJICovCiAJCWlmICgoYWRkciAmIDMpIHx8IChudW1SZWcgPiBQVF9GUFNDUikpCiAJCQlicmVhazsKLQkJLyogSW5zdXJlIGl0IGlzIGEgcmVnaXN0ZXIgd2UgbGV0IHRoZW0gY2hhbmdlICovCi0JCWlmICgobnVtUmVnID09IFBUX09SSUdfUjMpCi0JCQkJfHwgKChudW1SZWcgPiBQVF9DQ1IpICYmIChudW1SZWcgPCBQVF9GUFIwKSkpCi0JCQlicmVhazsKLQkJaWYgKG51bVJlZyA+PSBQVF9GUFIwKSB7CisJCWlmIChudW1SZWcgPCBQVF9GUFIwKSB7CisJCQl1bnNpZ25lZCBsb25nIGZyZWcgPSBwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgbnVtUmVnKTsKKwkJCWlmIChpbmRleCAlIDIpCisJCQkJZnJlZyA9IChmcmVnICYgfjB4ZmZmZmZmZmZ1bCkgfCAoZGF0YSAmIDB4ZmZmZmZmZmZ1bCk7CisJCQllbHNlCisJCQkJZnJlZyA9IChmcmVnICYgMHhmZmZmZmZmZnVsKSB8IChkYXRhIDw8IDMyKTsKKwkJCXJldCA9IHB0cmFjZV9wdXRfcmVnKGNoaWxkLCBudW1SZWcsIGZyZWcpOworCQl9IGVsc2UgewogCQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKKwkJCSgodW5zaWduZWQgaW50ICopY2hpbGQtPnRocmVhZC5yZWdzKVtpbmRleF0gPSBkYXRhOworCQkJcmV0ID0gMDsKIAkJfQotCQlpZiAobnVtUmVnID09IFBUX01TUikKLQkJCWRhdGEgPSAoZGF0YSAmIE1TUl9ERUJVR0NIQU5HRSkKLQkJCQl8IChjaGlsZC0+dGhyZWFkLnJlZ3MtPm1zciAmIH5NU1JfREVCVUdDSEFOR0UpOwotCQkoKHUzMiopY2hpbGQtPnRocmVhZC5yZWdzKVtpbmRleF0gPSBkYXRhOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TWVNDQUxMOiAvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLwotCWNhc2UgUFRSQUNFX0NPTlQ6IHsgLyogcmVzdGFydCBhZnRlciBzaWduYWwuICovCi0JCXJldCA9IC1FSU87Ci0JCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQotCQkJYnJlYWs7Ci0JCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9TWVNDQUxMKQotCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQllbHNlCi0JCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4KLQkgKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvCi0JICogZXhpdC4KLQkgKi8KLQljYXNlIFBUUkFDRV9LSUxMOiB7Ci0JCXJldCA9IDA7Ci0JCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCi0JCQlicmVhazsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7Ci0JCS8qIG1ha2Ugc3VyZSB0aGUgc2luZ2xlIHN0ZXAgYml0IGlzIG5vdCBzZXQuICovCi0JCWNsZWFyX3NpbmdsZV9zdGVwKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDogeyAgLyogc2V0IHRoZSB0cmFwIGZsYWcuICovCi0JCXJldCA9IC1FSU87Ci0JCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQotCQkJYnJlYWs7Ci0JCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQlzZXRfc2luZ2xlX3N0ZXAoY2hpbGQpOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKLQkJLyogZ2l2ZSBpdCBhIGNoYW5jZSB0byBydW4uICovCi0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KIApAQCAtMzM0LDk1ICszMzEsNjcgQEAKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBQVFJBQ0VfU0VUX0RFQlVHUkVHOgotCQlyZXQgPSBwdHJhY2Vfc2V0X2RlYnVncmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUUkFDRV9ERVRBQ0g6Ci0JCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0JCQlyZXQgPSBnZXRfdXNlcigqcmVnLCB0bXApOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQkJCXJlZysrOwotCQkJdG1wKys7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQUENfUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5mcHIpWzBdOwotCQl1bnNpZ25lZCBpbnQgX191c2VyICp0bXAgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkZHI7Ci0KLQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6IHsgLyogR2V0IEZQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQuZnByKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IGdldF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKLQl9Ci0KIAljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzoKIAkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnB0cmFjZV9tZXNzYWdlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKIAkJYnJlYWs7CiAKLSNpZmRlZiBDT05GSUdfQUxUSVZFQworCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBwdF9yZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlpbnQgdWk7CisJICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIFBUX1JFR1NfQ09VTlQgKiBzaXplb2YoaW50KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0IHw9IF9fcHV0X3VzZXIocHRyYWNlX2dldF9yZWcoY2hpbGQsIHVpKSwKKwkJCQkJICAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGludCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgYWxsIGdwIHJlZ3MgaW4gdGhlIGNoaWxkLiAqLworCQl1bnNpZ25lZCBsb25nIHRtcDsKKwkJaW50IHVpOworCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilkYXRhLAorCQkJICAgICAgIFBUX1JFR1NfQ09VTlQgKiBzaXplb2YoaW50KSkpIHsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgeworCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXB0cmFjZV9wdXRfcmVnKGNoaWxkLCB1aSwgdG1wKTsKKwkJCWRhdGEgKz0gc2l6ZW9mKGludCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOgorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoKIAljYXNlIFBUUkFDRV9HRVRWUlJFR1M6Ci0JCS8qIEdldCB0aGUgY2hpbGQgYWx0aXZlYyByZWdpc3RlciBzdGF0ZS4gKi8KLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBnZXRfdnJyZWdzKCh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEsIGNoaWxkKTsKKwljYXNlIFBUUkFDRV9TRVRWUlJFR1M6CisJY2FzZSBQVFJBQ0VfR0VUUkVHUzY0OgorCWNhc2UgUFRSQUNFX1NFVFJFR1M2NDoKKwljYXNlIFBQQ19QVFJBQ0VfR0VURlBSRUdTOgorCWNhc2UgUFBDX1BUUkFDRV9TRVRGUFJFR1M6CisJY2FzZSBQVFJBQ0VfS0lMTDoKKwljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOgorCWNhc2UgUFRSQUNFX0RFVEFDSDoKKwljYXNlIFBUUkFDRV9TRVRfREVCVUdSRUc6CisJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKKwljYXNlIFBUUkFDRV9DT05UOgorCQlyZXQgPSBhcmNoX3B0cmFjZShjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfU0VUVlJSRUdTOgotCQkvKiBTZXQgdGhlIGNoaWxkIGFsdGl2ZWMgcmVnaXN0ZXIgc3RhdGUuICovCi0JCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKGNoaWxkKTsKLQkJcmV0ID0gc2V0X3ZycmVncyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7CisJLyogT2xkIHJldmVyc2UgYXJncyBwdHJhY2UgY2FsbHNzICovCisJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlyZXQgPSBjb21wYXRfcHRyYWNlX29sZChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotI2VuZGlmCiAKIAlkZWZhdWx0OgogCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKaW5kZXggZjIyODY4Mi4uYTVkZTYyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYwpAQCAtMjc4LDEwICsyNzgsOCBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAotCWluZGV4ID0gMDsKIAlmb3IgKG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBOVUxMKTsKIAkgICAgIG5vZGUgIT0gTlVMTDsKIAkgICAgIG5vZGUgPSBvZl9nZXRfbmV4dF9jaGlsZChyb290LCBub2RlKSkgewpAQCAtMjk1LDggKzI5Myw3IEBACiAJCQljb250aW51ZTsKIAkJcnRhc19zZXR1cF9waGIocGhiKTsKIAkJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGIsIG5vZGUsIDApOwotCQlwY2lfc2V0dXBfcGhiX2lvKHBoYiwgaW5kZXggPT0gMCk7Ci0JCWluZGV4Kys7CisJCWlzYV9icmlkZ2VfZmluZF9lYXJseShwaGIpOwogCX0KIAogCW9mX25vZGVfcHV0KHJvb3QpOwpAQCAtMzM1LDcgKzMzMiw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCXJjID0gdW5tYXBfYnVzX3JhbmdlKGIpOworCXJjID0gcGNpYmlvc191bm1hcF9pb19zcGFjZShiKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIElPIG9uIGJ1cyAlc1xuIiwKIAkJCV9fRlVOQ1RJT05fXywgYi0+bmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCBlZDA3YTE5Li40OTI0YzQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTQ4Niw2ICs0ODcsMTQgQEAKIAogCXN3aXRjaChiYXNlX3BvcnQpIHsKIAljYXNlIEk4MDQyX0RBVEFfUkVHOgorCQlpZiAoIShucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJwbnBQTlAsMzAzIikpKQorCQkJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGYwMyIpOworCQlpZiAobnApIHsKKwkJCXBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOworCQkJb2Zfbm9kZV9wdXQobnApOworCQkJbnAgPSBwYXJlbnQ7CisJCQlicmVhazsKKwkJfQogCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICI4MDQyIik7CiAJCWJyZWFrOwogCWNhc2UgRkRDX0JBU0U6IC8qIEZEQzEgKi8KQEAgLTU3MSwzICs1ODAsMTUgQEAKIAogbGF0ZV9pbml0Y2FsbChjaGVja19jYWNoZV9jb2hlcmVuY3kpOwogI2VuZGlmIC8qIENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RydWN0IGRlbnRyeSAqcG93ZXJwY19kZWJ1Z2ZzX3Jvb3Q7CisKK3N0YXRpYyBpbnQgcG93ZXJwY19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlwb3dlcnBjX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigicG93ZXJwYyIsIE5VTEwpOworCisJcmV0dXJuIHBvd2VycGNfZGVidWdmc19yb290ID09IE5VTEw7Cit9CithcmNoX2luaXRjYWxsKHBvd2VycGNfZGVidWdmc19pbml0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDM1ZjhmNDQuLjdlYzZiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKQEAgLTI2MiwxMyArMjYyLDExIEBACiAJICogU3lzdGVtcyB3aXRoIE9GIGNhbiBsb29rIGluIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBjcHUgbm9kZShzKQogCSAqIGZvciBhIHBvc3NpYmx5IG1vcmUgYWNjdXJhdGUgdmFsdWUuCiAJICovCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKSkgewotCQlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKLQkJaWNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5pY2FjaGVfYnNpemU7Ci0JCXVjYWNoZV9ic2l6ZSA9IDA7Ci0JfSBlbHNlCi0JCXVjYWNoZV9ic2l6ZSA9IGRjYWNoZV9ic2l6ZSA9IGljYWNoZV9ic2l6ZQotCQkJPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKKwlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKKwlpY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmljYWNoZV9ic2l6ZTsKKwl1Y2FjaGVfYnNpemUgPSAwOworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKSkKKwkJdWNhY2hlX2JzaXplID0gaWNhY2hlX2JzaXplID0gZGNhY2hlX2JzaXplOwogCiAJLyogcmVib290IG9uIHBhbmljICovCiAJcGFuaWNfdGltZW91dCA9IDE4MDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCA2MDE4MTc4Li5iYzQzYmJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0zNTAsMTMgKzM1MCwxMSBAQAogewogCURCRygiIC0+IHNldHVwX3N5c3RlbSgpXG4iKTsKIAotCS8qIEFwcGx5IHRoZSBDUFVzLXNwZWNpZmljIGFuZCBmaXJtd2FyZSBzcGVjaWZpYyBmaXh1cHMgdG8ga2VybmVsCi0JICogdGV4dCAobm9wIG91dCBzZWN0aW9ucyBub3QgcmVsZXZhbnQgdG8gdGhpcyBDUFUgb3IgdGhpcyBmaXJtd2FyZSkKKwkvKiBBcHBseSBDUFVzLXNwZWNpZmljIGZpeHVwcyB0byBrZXJuZWwgdGV4dCAobm9wIG91dCBzZWN0aW9ucworCSAqIG5vdCByZWxldmFudCB0byB0aGlzIENQVSkKIAkgKi8KIAlkb19mZWF0dXJlX2ZpeHVwcyhjdXJfY3B1X3NwZWMtPmNwdV9mZWF0dXJlcywKIAkJCSAgJl9fc3RhcnRfX19mdHJfZml4dXAsICZfX3N0b3BfX19mdHJfZml4dXApOwotCWRvX2ZlYXR1cmVfZml4dXBzKHBvd2VycGNfZmlybXdhcmVfZmVhdHVyZXMsCi0JCQkgICZfX3N0YXJ0X19fZndfZnRyX2ZpeHVwLCAmX19zdG9wX19fZndfZnRyX2ZpeHVwKTsKIAogCS8qCiAJICogVW5mbGF0dGVuIHRoZSBkZXZpY2UtdHJlZSBwYXNzZWQgYnkgcHJvbV9pbml0IG9yIGtleGVjCkBAIC0zOTQsNiArMzkyLDEyIEBACiAJaWYgKHBwY19tZC5pbml0X2Vhcmx5KQogCQlwcGNfbWQuaW5pdF9lYXJseSgpOwogCisJLyogQXBwbHkgZmlybXdhcmUgc3BlY2lmaWMgZml4dXBzIHRvIGtlcm5lbCB0ZXh0IChub3Agb3V0CisJICogc2VjdGlvbnMgbm90IHJlbGV2YW50IHRvIHRoaXMgZmlybXdhcmUpCisJICovCisJZG9fZmVhdHVyZV9maXh1cHMocG93ZXJwY19maXJtd2FyZV9mZWF0dXJlcywKKwkJCSAgJl9fc3RhcnRfX19md19mdHJfZml4dXAsICZfX3N0b3BfX19md19mdHJfZml4dXApOworCiAgCS8qCiAJICogV2UgY2FuIGRpc2NvdmVyIHNlcmlhbCBwb3J0cyBub3cgc2luY2UgdGhlIGFib3ZlIGRpZCBzZXR1cCB0aGUKIAkgKiBoYXNoIHRhYmxlIG1hbmFnZW1lbnQgZm9yIHVzLCB0aHVzIGlvcmVtYXAgd29ya3MuIFdlIGRvIHRoYXQgZWFybHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzRkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29tbW9uIHNpZ25hbCBoYW5kbGluZyBjb2RlIGZvciBib3RoIDMyIGFuZCA2NCBiaXRzCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDA3IEJlbmphbWluIEhlcnJlbnNjaG1pZHQsIElCTSBDb3Byb3JhdGlvbgorICogICAgRXh0cmFjdGVkIGZyb20gc2lnbmFsXzMyLmMgYW5kIHNpZ25hbF82NC5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgUkVBRE1FLmxlZ2FsIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaW5jbHVkZSAic2lnbmFsLmgiCisKKy8qCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNpZ25hbCBmcmFtZQorICovCit2b2lkIF9fdXNlciAqIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCSAgIHNpemVfdCBmcmFtZV9zaXplKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIG9sZHNwLCBuZXdzcDsKKworICAgICAgICAvKiBEZWZhdWx0IHRvIHVzaW5nIG5vcm1hbCBzdGFjayAqLworICAgICAgICBvbGRzcCA9IHJlZ3MtPmdwclsxXTsKKworCS8qIENoZWNrIGZvciBhbHQgc3RhY2sgKi8KKwlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICYmCisJICAgIGN1cnJlbnQtPnNhc19zc19zaXplICYmICFvbl9zaWdfc3RhY2sob2xkc3ApKQorCQlvbGRzcCA9IChjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZSk7CisKKwkvKiBHZXQgYWxpZ25lZCBmcmFtZSAqLworCW5ld3NwID0gKG9sZHNwIC0gZnJhbWVfc2l6ZSkgJiB+MHhGVUw7CisKKwkvKiBDaGVjayBhY2Nlc3MgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKW5ld3NwLCBvbGRzcCAtIG5ld3NwKSkKKwkJcmV0dXJuIE5VTEw7CisKKyAgICAgICAgcmV0dXJuICh2b2lkIF9fdXNlciAqKW5ld3NwOworfQorCisKKy8qCisgKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzaworICovCit2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KQoreworCXNpZ2RlbHNldG1hc2soc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9ICpzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjaGVja19zeXNjYWxsX3Jlc3RhcnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkJICBpbnQgaGFzX2hhbmRsZXIpCit7CisJdW5zaWduZWQgbG9uZyByZXQgPSByZWdzLT5ncHJbM107CisJaW50IHJlc3RhcnQgPSAxOworCisJLyogc3lzY2FsbCA/ICovCisJaWYgKFRSQVAocmVncykgIT0gMHgwQzAwKQorCQlyZXR1cm47CisKKwkvKiBlcnJvciBzaWduYWxsZWQgPyAqLworCWlmICghKHJlZ3MtPmNjciAmIDB4MTAwMDAwMDApKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgRVJFU1RBUlRfUkVTVEFSVEJMT0NLOgorCWNhc2UgRVJFU1RBUlROT0hBTkQ6CisJCS8qIEVSRVNUQVJUTk9IQU5EIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIG9ubHkgYmUKKwkJICogcmVzdGFydGVkIGlmIHRoZXJlIHdhcyBubyBoYW5kbGVyIGZvciB0aGUgc2lnbmFsLCBhbmQgc2luY2UKKwkJICogd2Ugb25seSBnZXQgaGVyZSBpZiB0aGVyZSBpcyBhIGhhbmRsZXIsIHdlIGRvbnQgcmVzdGFydC4KKwkJICovCisJCXJlc3RhcnQgPSAhaGFzX2hhbmRsZXI7CisJCWJyZWFrOworCWNhc2UgRVJFU1RBUlRTWVM6CisJCS8qIEVSRVNUQVJUU1lTIG1lYW5zIHRvIHJlc3RhcnQgdGhlIHN5c2NhbGwgaWYgdGhlcmUgaXMgbm8KKwkJICogaGFuZGxlciBvciB0aGUgaGFuZGxlciB3YXMgcmVnaXN0ZXJlZCB3aXRoIFNBX1JFU1RBUlQKKwkJICovCisJCXJlc3RhcnQgPSAhaGFzX2hhbmRsZXIgfHwgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpICE9IDA7CisJCWJyZWFrOworCWNhc2UgRVJFU1RBUlROT0lOVFI6CisJCS8qIEVSRVNUQVJUTk9JTlRSIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIGJlCisJCSAqIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3RhcnQpIHsKKwkJaWYgKHJldCA9PSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0spCisJCQlyZWdzLT5ncHJbMF0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJZWxzZQorCQkJcmVncy0+Z3ByWzNdID0gcmVncy0+b3JpZ19ncHIzOworCQlyZWdzLT5uaXAgLT0gNDsKKwkJcmVncy0+cmVzdWx0ID0gMDsKKwl9IGVsc2UgeworCQlyZWdzLT5yZXN1bHQgPSAtRUlOVFI7CisJCXJlZ3MtPmdwclszXSA9IEVJTlRSOworCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKKwl9Cit9CisKK2ludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2lnaW5mb190IGluZm87CisJaW50IHNpZ25yOworCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKwlpbnQgcmV0OworCWludCBpczMyID0gaXNfMzJiaXRfdGFzaygpOworCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UgaWYgKCFvbGRzZXQpCisJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisKKwkvKiBJcyB0aGVyZSBhbnkgc3lzY2FsbCByZXN0YXJ0IGJ1c2luZXNzIGhlcmUgPyAqLworCWNoZWNrX3N5c2NhbGxfcmVzdGFydChyZWdzLCAma2EsIHNpZ25yID4gMCk7CisKKwlpZiAoc2lnbnIgPD0gMCkgeworCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOworCQl9CisJCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5vIHNpZ25hbHMgZGVsaXZlcmVkICovCisJfQorCisgICAgICAgIC8qCisJICogUmVlbmFibGUgdGhlIERBQlIgYmVmb3JlIGRlbGl2ZXJpbmcgdGhlIHNpZ25hbCB0bworCSAqIHVzZXIgc3BhY2UuIFRoZSBEQUJSIHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgaWYgaXQKKwkgKiB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBrZXJuZWwuCisJICovCisJaWYgKGN1cnJlbnQtPnRocmVhZC5kYWJyKQorCQlzZXRfZGFicihjdXJyZW50LT50aHJlYWQuZGFicik7CisKKwlpZiAoaXMzMikgeworICAgICAgICAJaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJCXJldCA9IGhhbmRsZV9ydF9zaWduYWwzMihzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LAorCQkJCQlyZWdzKTsKKwkJZWxzZQorCQkJcmV0ID0gaGFuZGxlX3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsCisJCQkJCXJlZ3MpOworCX0gZWxzZSB7CisJCXJldCA9IGhhbmRsZV9ydF9zaWduYWw2NChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLAorCQkJICAma2Euc2Euc2FfbWFzayk7CisJCWlmICghKGthLnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ25yKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCQkvKgorCQkgKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KKwkJICogaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcuCisJCSAqLworCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2xvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAorCQl1bnNpZ25lZCBsb25nIHI1LCB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQl1bnNpZ25lZCBsb25nIHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCByZWdzLT5ncHJbMV0pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlZmIzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29wcm9yYXRpb24KKyAqICAgIEV4dHJhY3RlZCBmcm9tIHNpZ25hbF8zMi5jIGFuZCBzaWduYWxfNjQuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIFJFQURNRS5sZWdhbCBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1BPV0VSUENfQVJDSF9TSUdOQUxfSAorI2RlZmluZSBfUE9XRVJQQ19BUkNIX1NJR05BTF9ICisKKyNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCisKK2V4dGVybiB2b2lkIF9fdXNlciAqIGdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgIHNpemVfdCBmcmFtZV9zaXplKTsKK2V4dGVybiB2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqc2V0KTsKKworZXh0ZXJuIGludCBoYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsCisJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK2V4dGVybiBpbnQgaGFuZGxlX3J0X3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJICAgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LAorCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKworc3RhdGljIGlubGluZSBpbnQgaXNfMzJiaXRfdGFzayh2b2lkKQoreworCXJldHVybiB0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCk7Cit9CisKK2V4dGVybiBpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSAgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKnNldCwKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzXzMyYml0X3Rhc2sodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCQkgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKnNldCwKKwkJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiAtRUZBVUxUOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQzY0KSAqLworCisjZW5kaWYgIC8qIF9QT1dFUlBDX0FSQ0hfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IGRkMWRjYTUuLjU5MDA1N2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwpAQCAtNTEsMTIgKzUxLDExIEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNlbmRpZgogCisjaW5jbHVkZSAic2lnbmFsLmgiCisKICN1bmRlZiBERUJVR19TSUcKIAotI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKLQogI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBkb19zaWduYWwJZG9fc2lnbmFsMzIKICNkZWZpbmUgc3lzX3NpZ3N1c3BlbmQJY29tcGF0X3N5c19zaWdzdXNwZW5kCiAjZGVmaW5lIHN5c19ydF9zaWdzdXNwZW5kCWNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZAogI2RlZmluZSBzeXNfcnRfc2lncmV0dXJuCWNvbXBhdF9zeXNfcnRfc2lncmV0dXJuCkBAIC0yMzEsOCArMjMwLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogCi1pbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogLyoKICAqIEF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCiAgKi8KQEAgLTI1MSwxNCArMjQ4LDYgQEAKICAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAotI2lmZGVmIENPTkZJR19QUEMzMgotbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCBfX3VzZXIgKnVvc3MsIGludCByNSwKLQkJaW50IHI2LCBpbnQgcjcsIGludCByOCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3ByWzFdKTsKLX0KLSNlbmRpZgotCiBsb25nIHN5c19zaWdhY3Rpb24oaW50IHNpZywgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICphY3QsCiAJCXN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKIHsKQEAgLTI5MywxNCArMjgyLDE3IEBACiAvKgogICogV2hlbiB3ZSBoYXZlIHNpZ25hbHMgdG8gZGVsaXZlciwgd2Ugc2V0IHVwIG9uIHRoZQogICogdXNlciBzdGFjaywgZ29pbmcgZG93biBmcm9tIHRoZSBvcmlnaW5hbCBzdGFjayBwb2ludGVyOgotICoJYSBzaWdyZWdzIHN0cnVjdAorICoJYW4gQUJJIGdhcCBvZiA1NiB3b3JkcworICoJYW4gbWNvbnRleHQgc3RydWN0CiAgKglhIHNpZ2NvbnRleHQgc3RydWN0CiAgKglhIGdhcCBvZiBfX1NJR05BTF9GUkFNRVNJWkUgYnl0ZXMKICAqCi0gKiBFYWNoIG9mIHRoZXNlIHRoaW5ncyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgaW4gc2l6ZS4KKyAqIEVhY2ggb2YgdGhlc2UgdGhpbmdzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBieXRlcyBpbiBzaXplLiBUaGUgZm9sbG93aW5nCisgKiBzdHJ1Y3R1cmUgcmVwcmVzZW50IGFsbCBvZiB0aGlzIGV4Y2VwdCB0aGUgX19TSUdOQUxfRlJBTUVTSVpFIGdhcAogICoKICAqLwotc3RydWN0IHNpZ3JlZ3Mgeworc3RydWN0IHNpZ2ZyYW1lIHsKKwlzdHJ1Y3Qgc2lnY29udGV4dCBzY3R4OwkJLyogdGhlIHNpZ2NvbnRleHQgKi8KIAlzdHJ1Y3QgbWNvbnRleHQJbWN0eDsJCS8qIGFsbCB0aGUgcmVnaXN0ZXIgdmFsdWVzICovCiAJLyoKIAkgKiBQcm9ncmFtcyB1c2luZyB0aGUgcnM2MDAwL3hjb2ZmIGFiaSBjYW4gc2F2ZSB1cCB0byAxOSBncApAQCAtNzAzLDQ0ICs2OTUsMjIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAotCi0vKgotICogUmVzdG9yZSB0aGUgdXNlciBwcm9jZXNzJ3Mgc2lnbmFsIG1hc2sKLSAqLwotI2lmZGVmIENPTkZJR19QUEM2NAotZXh0ZXJuIHZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpOwotI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCi1zdGF0aWMgdm9pZCByZXN0b3JlX3NpZ21hc2soc2lnc2V0X3QgKnNldCkKLXsKLQlzaWdkZWxzZXRtYXNrKHNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSAqc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLX0KLSNlbmRpZgotCiAvKgogICogU2V0IHVwIGEgc2lnbmFsIGZyYW1lIGZvciBhICJyZWFsLXRpbWUiIHNpZ25hbCBoYW5kbGVyCiAgKiAob25lIHdoaWNoIGdldHMgc2lnaW5mbykuCiAgKi8KLXN0YXRpYyBpbnQgaGFuZGxlX3J0X3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKK2ludCBoYW5kbGVfcnRfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAJCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3ApCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKnJ0X3NmOwogCXN0cnVjdCBtY29udGV4dCBfX3VzZXIgKmZyYW1lOwotCXVuc2lnbmVkIGxvbmcgb3JpZ3NwID0gbmV3c3A7CisJdW5zaWduZWQgbG9uZyBuZXdzcCA9IDA7CiAKIAkvKiBTZXQgdXAgU2lnbmFsIEZyYW1lICovCiAJLyogUHV0IGEgUmVhbCBUaW1lIENvbnRleHQgb250byBzdGFjayAqLwotCW5ld3NwIC09IHNpemVvZigqcnRfc2YpOwotCXJ0X3NmID0gKHN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKiluZXdzcDsKLQotCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCi0JbmV3c3AgLT0gX19TSUdOQUxfRlJBTUVTSVpFICsgMTY7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKW5ld3NwLCBvcmlnc3AgLSBuZXdzcCkpCisJcnRfc2YgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MsIHNpemVvZigqcnRfc2YpKTsKKwlpZiAodW5saWtlbHkocnRfc2YgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAkvKiBQdXQgdGhlIHNpZ2luZm8gJiBmaWxsIGluIG1vc3Qgb2YgdGhlIHVjb250ZXh0ICovCkBAIC03NzAsOCArNzQwLDEyIEBACiAKIAljdXJyZW50LT50aHJlYWQuZnBzY3IudmFsID0gMDsJLyogdHVybiBvZmYgYWxsIGZwIGV4Y2VwdGlvbnMgKi8KIAorCS8qIGNyZWF0ZSBhIHN0YWNrIGZyYW1lIGZvciB0aGUgY2FsbGVyIG9mIHRoZSBoYW5kbGVyICovCisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpcnRfc2YpIC0gKF9fU0lHTkFMX0ZSQU1FU0laRSArIDE2KTsKIAlpZiAocHV0X3VzZXIocmVncy0+Z3ByWzFdLCAodTMyIF9fdXNlciAqKW5ld3NwKSkKIAkJZ290byBiYWRmcmFtZTsKKworCS8qIEZpbGwgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPmdwclsxXSA9IG5ld3NwOwogCXJlZ3MtPmdwclszXSA9IHNpZzsKIAlyZWdzLT5ncHJbNF0gPSAodW5zaWduZWQgbG9uZykgJnJ0X3NmLT5pbmZvOwpAQCAtMTAxNSwyNyArOTg5LDE4IEBACiAvKgogICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgogICovCi1zdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgbmV3c3ApCitpbnQgaGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjOwotCXN0cnVjdCBzaWdyZWdzIF9fdXNlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBvcmlnc3AgPSBuZXdzcDsKKwlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwl1bnNpZ25lZCBsb25nIG5ld3NwID0gMDsKIAogCS8qIFNldCB1cCBTaWduYWwgRnJhbWUgKi8KLQluZXdzcCAtPSBzaXplb2Yoc3RydWN0IHNpZ3JlZ3MpOwotCWZyYW1lID0gKHN0cnVjdCBzaWdyZWdzIF9fdXNlciAqKSBuZXdzcDsKLQotCS8qIFB1dCBhIHNpZ2NvbnRleHQgb24gdGhlIHN0YWNrICovCi0JbmV3c3AgLT0gc2l6ZW9mKCpzYyk7Ci0Jc2MgPSAoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICopIG5ld3NwOwotCi0JLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KLQluZXdzcCAtPSBfX1NJR05BTF9GUkFNRVNJWkU7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKSBuZXdzcCwgb3JpZ3NwIC0gbmV3c3ApKQorCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOworCXNjID0gKHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqKSAmZnJhbWUtPnNjdHg7CiAKICNpZiBfTlNJRyAhPSA2NAogI2Vycm9yICJQbGVhc2UgYWRqdXN0IGhhbmRsZV9zaWduYWwoKSIKQEAgLTEwNDcsNyArMTAxMiw3IEBACiAjZWxzZQogCSAgICB8fCBfX3B1dF91c2VyKG9sZHNldC0+c2lnWzFdLCAmc2MtPl91bnVzZWRbM10pCiAjZW5kaWYKLQkgICAgfHwgX19wdXRfdXNlcih0b191c2VyX3B0cihmcmFtZSksICZzYy0+cmVncykKKwkgICAgfHwgX19wdXRfdXNlcih0b191c2VyX3B0cigmZnJhbWUtPm1jdHgpLCAmc2MtPnJlZ3MpCiAJICAgIHx8IF9fcHV0X3VzZXIoc2lnLCAmc2MtPnNpZ25hbCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKQEAgLTEwNjMsOCArMTAyOCwxMSBAQAogCiAJY3VycmVudC0+dGhyZWFkLmZwc2NyLnZhbCA9IDA7CS8qIHR1cm4gb2ZmIGFsbCBmcCBleGNlcHRpb25zICovCiAKKwkvKiBjcmVhdGUgYSBzdGFjayBmcmFtZSBmb3IgdGhlIGNhbGxlciBvZiB0aGUgaGFuZGxlciAqLworCW5ld3NwID0gKCh1bnNpZ25lZCBsb25nKWZyYW1lKSAtIF9fU0lHTkFMX0ZSQU1FU0laRTsKIAlpZiAocHV0X3VzZXIocmVncy0+Z3ByWzFdLCAodTMyIF9fdXNlciAqKW5ld3NwKSkKIAkJZ290byBiYWRmcmFtZTsKKwogCXJlZ3MtPmdwclsxXSA9IG5ld3NwOwogCXJlZ3MtPmdwclszXSA9IHNpZzsKIAlyZWdzLT5ncHJbNF0gPSAodW5zaWduZWQgbG9uZykgc2M7CkBAIC0xMTI2LDEwNiArMTA5NCwzIEBACiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwogfQotCi0vKgotICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0Ci0gKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKLSAqIG1pc3Rha2UuCi0gKi8KLWludCBkb19zaWduYWwoc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnaW5mb190IGluZm87Ci0Jc3RydWN0IGtfc2lnYWN0aW9uIGthOwotCXVuc2lnbmVkIGludCBuZXdzcDsKLQlpbnQgc2lnbnIsIHJldDsKLQotI2lmZGVmIENPTkZJR19QUEMzMgotCWlmICh0cnlfdG9fZnJlZXplKCkpIHsKLQkJc2lnbnIgPSAwOwotCQlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZ290byBub19zaWduYWw7Ci0JfQotI2VuZGlmCi0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7Ci0JZWxzZSBpZiAoIW9sZHNldCkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLSNpZmRlZiBDT05GSUdfUFBDMzIKLW5vX3NpZ25hbDoKLSNlbmRpZgotCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMAkJLyogU3lzdGVtIENhbGwhICovCi0JICAgICYmIHJlZ3MtPmNjciAmIDB4MTAwMDAwMDAJCS8qIGVycm9yIHNpZ25hbGxlZCAqLwotCSAgICAmJiAoKHJldCA9IHJlZ3MtPmdwclszXSkgPT0gRVJFU1RBUlRTWVMKLQkJfHwgcmV0ID09IEVSRVNUQVJUTk9IQU5EIHx8IHJldCA9PSBFUkVTVEFSVE5PSU5UUgotCQl8fCByZXQgPT0gRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkgewotCi0JCWlmIChzaWduciA+IDAKLQkJICAgICYmIChyZXQgPT0gRVJFU1RBUlROT0hBTkQgfHwgcmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSwotCQkJfHwgKHJldCA9PSBFUkVTVEFSVFNZUwotCQkJICAgICYmICEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkpKSB7Ci0JCQkvKiBtYWtlIHRoZSBzeXN0ZW0gY2FsbCByZXR1cm4gYW4gRUlOVFIgZXJyb3IgKi8KLQkJCXJlZ3MtPnJlc3VsdCA9IC1FSU5UUjsKLQkJCXJlZ3MtPmdwclszXSA9IEVJTlRSOwotCQkJLyogbm90ZSB0aGF0IHRoZSBjcjAuU08gYml0IGlzIGFscmVhZHkgc2V0ICovCi0JCX0gZWxzZSB7Ci0JCQlyZWdzLT5uaXAgLT0gNDsJLyogQmFjayB1cCAmIHJldHJ5IHN5c3RlbSBjYWxsICovCi0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQkJcmVncy0+dHJhcCA9IDA7Ci0JCQlpZiAocmV0ID09IEVSRVNUQVJUX1JFU1RBUlRCTE9DSykKLQkJCQlyZWdzLT5ncHJbMF0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKLQkJCWVsc2UKLQkJCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7Ci0JCX0KLQl9Ci0KLQlpZiAoc2lnbnIgPT0gMCkgewotCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLwotCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgewotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssIE5VTEwpOwotCQl9Ci0JCXJldHVybiAwOwkJLyogbm8gc2lnbmFscyBkZWxpdmVyZWQgKi8KLQl9Ci0KLQlpZiAoKGthLnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgJiYgY3VycmVudC0+c2FzX3NzX3NpemUKLQkgICAgJiYgIW9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQotCQluZXdzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwotCWVsc2UKLQkJbmV3c3AgPSByZWdzLT5ncHJbMV07Ci0JbmV3c3AgJj0gfjB4ZlVMOwotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JLyoKLQkgKiBSZWVuYWJsZSB0aGUgREFCUiBiZWZvcmUgZGVsaXZlcmluZyB0aGUgc2lnbmFsIHRvCi0JICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAotCSAqIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGtlcm5lbC4KLQkgKi8KLQlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCi0JCXNldF9kYWJyKGN1cnJlbnQtPnRocmVhZC5kYWJyKTsKLSNlbmRpZgotCi0JLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJcmV0ID0gaGFuZGxlX3J0X3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzLCBuZXdzcCk7Ci0JZWxzZQotCQlyZXQgPSBoYW5kbGVfc2lnbmFsKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MsIG5ld3NwKTsKLQotCWlmIChyZXQpIHsKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsCi0JCQkgICZrYS5zYS5zYV9tYXNrKTsKLQkJaWYgKCEoa2Euc2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2lnbnIpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQkvKiBBIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KLQkJICAgaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCi0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggYjI3ZTI2OC4uZGU4OTVlNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCkBAIC0zNCw5ICszNCw5IEBACiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAotI2RlZmluZSBERUJVR19TSUcgMAorI2luY2x1ZGUgInNpZ25hbC5oIgogCi0jZGVmaW5lIF9CTE9DS0FCTEUgKH4oc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpKQorI2RlZmluZSBERUJVR19TSUcgMAogCiAjZGVmaW5lIEdQX1JFR1NfU0laRQltaW4oc2l6ZW9mKGVsZl9ncmVnc2V0X3QpLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKQogI2RlZmluZSBGUF9SRUdTX1NJWkUJc2l6ZW9mKGVsZl9mcHJlZ3NldF90KQpAQCAtNjQsMTQgKzY0LDYgQEAKIAljaGFyIGFiaWdhcFsyODhdOwogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CiAKLWxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLCB1bnNpZ25lZCBsb25nIHI1LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsIHVuc2lnbmVkIGxvbmcgcjgsCi0JCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+Z3ByWzFdKTsKLX0KLQotCiAvKgogICogU2V0IHVwIHRoZSBzaWdjb250ZXh0IGZvciB0aGUgc2lnbmFsIGZyYW1lLgogICovCkBAIC0yMDgsMjUgKzIwMCw2IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNpZ25hbCBmcmFtZQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX191c2VyICogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkJCSAgc2l6ZV90IGZyYW1lX3NpemUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3A7Ci0KLSAgICAgICAgLyogRGVmYXVsdCB0byB1c2luZyBub3JtYWwgc3RhY2sgKi8KLSAgICAgICAgbmV3c3AgPSByZWdzLT5ncHJbMV07Ci0KLQlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICYmIGN1cnJlbnQtPnNhc19zc19zaXplKSB7Ci0JCWlmICghIG9uX3NpZ19zdGFjayhyZWdzLT5ncHJbMV0pKQotCQkJbmV3c3AgPSAoY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemUpOwotCX0KLQotICAgICAgICByZXR1cm4gKHZvaWQgX191c2VyICopKChuZXdzcCAtIGZyYW1lX3NpemUpICYgLTE2dWwpOwotfQotCi0vKgogICogU2V0dXAgdGhlIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sKICAqLwogc3RhdGljIGxvbmcgc2V0dXBfdHJhbXBvbGluZSh1bnNpZ25lZCBpbnQgc3lzY2FsbCwgdW5zaWduZWQgaW50IF9fdXNlciAqdHJhbXApCkBAIC0yNTMsMTkgKzIyNiw2IEBACiB9CiAKIC8qCi0gKiBSZXN0b3JlIHRoZSB1c2VyIHByb2Nlc3MncyBzaWduYWwgbWFzayAoYWxzbyB1c2VkIGJ5IHNpZ25hbDMyLmMpCi0gKi8KLXZvaWQgcmVzdG9yZV9zaWdtYXNrKHNpZ3NldF90ICpzZXQpCi17Ci0Jc2lnZGVsc2V0bWFzayhzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gKnNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci19Ci0KLQotLyoKICAqIEhhbmRsZSB7Z2V0LHNldCxzd2FwfV9jb250ZXh0IG9wZXJhdGlvbnMKICAqLwogaW50IHN5c19zd2FwY29udGV4dChzdHJ1Y3QgdWNvbnRleHQgX191c2VyICpvbGRfY3R4LApAQCAtMzU5LDcgKzMxOSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZ25yLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCitpbnQgaGFuZGxlX3J0X3NpZ25hbDY0KGludCBzaWduciwgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCQlzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBIYW5kbGVyIGlzICpyZWFsbHkqIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvciBmb3IKQEAgLTM3Myw4ICszMzMsNyBAQAogCWxvbmcgZXJyID0gMDsKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOwogCiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKQEAgLTQxMSw3ICszNzAsNyBAQAogCWZ1bmN0X2Rlc2NfcHRyID0gKGZ1bmNfZGVzY3JfdCBfX3VzZXIgKikga2EtPnNhLnNhX2hhbmRsZXI7CiAKIAkvKiBBbGxvY2F0ZSBhIGR1bW15IGNhbGxlciBmcmFtZSBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyLiAqLwotCW5ld3NwID0gKHVuc2lnbmVkIGxvbmcpZnJhbWUgLSBfX1NJR05BTF9GUkFNRVNJWkU7CisJbmV3c3AgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUpIC0gX19TSUdOQUxfRlJBTUVTSVpFOwogCWVyciB8PSBwdXRfdXNlcihyZWdzLT5ncHJbMV0sICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKW5ld3NwKTsKIAogCS8qIFNldCB1cCAicmVncyIgc28gd2UgInJldHVybiIgdG8gdGhlIHNpZ25hbCBoYW5kbGVyLiAqLwpAQCAtNDQyLDEzNCArNDAxLDMgQEAKIAlmb3JjZV9zaWdzZWd2KHNpZ25yLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKIH0KLQotCi0vKgotICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgotICovCi1zdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCQkgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgcmV0OwotCi0JLyogU2V0IHVwIFNpZ25hbCBGcmFtZSAqLwotCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7Ci0KLQlpZiAocmV0KSB7Ci0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX3Jlc3RhcnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EpCi17Ci0Jc3dpdGNoICgoaW50KXJlZ3MtPnJlc3VsdCkgewotCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKLQljYXNlIC1FUkVTVEFSVE5PSEFORDoKLQkJLyogRVJFU1RBUlROT0hBTkQgbWVhbnMgdGhhdCB0aGUgc3lzY2FsbCBzaG91bGQgb25seSBiZQotCQkgKiByZXN0YXJ0ZWQgaWYgdGhlcmUgd2FzIG5vIGhhbmRsZXIgZm9yIHRoZSBzaWduYWwsIGFuZCBzaW5jZQotCQkgKiB3ZSBvbmx5IGdldCBoZXJlIGlmIHRoZXJlIGlzIGEgaGFuZGxlciwgd2UgZG9udCByZXN0YXJ0LgotCQkgKi8KLQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQlyZWdzLT5ncHJbM10gPSBFSU5UUjsKLQkJcmVncy0+Y2NyIHw9IDB4MTAwMDAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgLUVSRVNUQVJUU1lTOgotCQkvKiBFUkVTVEFSVFNZUyBtZWFucyB0byByZXN0YXJ0IHRoZSBzeXNjYWxsIGlmIHRoZXJlIGlzIG5vCi0JCSAqIGhhbmRsZXIgb3IgdGhlIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQgd2l0aCBTQV9SRVNUQVJUCi0JCSAqLwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUQVJUKSkgewotCQkJcmVncy0+cmVzdWx0ID0gLUVJTlRSOwotCQkJcmVncy0+Z3ByWzNdID0gRUlOVFI7Ci0JCQlyZWdzLT5jY3IgfD0gMHgxMDAwMDAwMDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGx0aHJvdWdoICovCi0JY2FzZSAtRVJFU1RBUlROT0lOVFI6Ci0JCS8qIEVSRVNUQVJUTk9JTlRSIG1lYW5zIHRoYXQgdGhlIHN5c2NhbGwgc2hvdWxkIGJlCi0JCSAqIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgcmV0dXJucy4KLQkJICovCi0JCXJlZ3MtPmdwclszXSA9IHJlZ3MtPm9yaWdfZ3ByMzsKLQkJcmVncy0+bmlwIC09IDQ7Ci0JCXJlZ3MtPnJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIE5vdGUgdGhhdCAnaW5pdCcgaXMgYSBzcGVjaWFsIHByb2Nlc3M6IGl0IGRvZXNuJ3QgZ2V0IHNpZ25hbHMgaXQgZG9lc24ndAotICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5Ci0gKiBtaXN0YWtlLgotICovCi1pbnQgZG9fc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ2luZm9fdCBpbmZvOwotCWludCBzaWducjsKLQlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7Ci0KLQkvKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyAzMiBiaXQgLSBpbnZva2UgdGhlCi0JICogMzIgYml0IHNpZ25hbCBoYW5kbGluZyBjb2RlCi0JICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKLQkJcmV0dXJuIGRvX3NpZ25hbDMyKG9sZHNldCwgcmVncyk7Ci0KLQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7Ci0JZWxzZSBpZiAoIW9sZHNldCkKLQkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7Ci0KLQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLQlpZiAoc2lnbnIgPiAwKSB7Ci0JCWludCByZXQ7Ci0KLQkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWlmIChUUkFQKHJlZ3MpID09IDB4MEMwMCkKLQkJCXN5c2NhbGxfcmVzdGFydChyZWdzLCAma2EpOwotCi0JCS8qCi0JCSAqIFJlZW5hYmxlIHRoZSBEQUJSIGJlZm9yZSBkZWxpdmVyaW5nIHRoZSBzaWduYWwgdG8KLQkJICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAotCQkgKiB0cmlnZ2VyZWQgaW5zaWRlIHRoZSBrZXJuZWwuCi0JCSAqLwotCQlpZiAoY3VycmVudC0+dGhyZWFkLmRhYnIpCi0JCQlzZXRfZGFicihjdXJyZW50LT50aHJlYWQuZGFicik7Ci0KLQkJcmV0ID0gaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKTsKLQotCQkvKiBJZiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCwgdGhlIHNhdmVkIHNpZ21hc2sgaXMgaW4KLQkJICAgaXRzIGZyYW1lLCBhbmQgd2UgY2FuIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KLQkJaWYgKHJldCAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoVFJBUChyZWdzKSA9PSAweDBDMDApIHsJLyogU3lzdGVtIENhbGwhICovCi0JCWlmICgoaW50KXJlZ3MtPnJlc3VsdCA9PSAtRVJFU1RBUlROT0hBTkQgfHwKLQkJICAgIChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVFNZUyB8fAotCQkgICAgKGludClyZWdzLT5yZXN1bHQgPT0gLUVSRVNUQVJUTk9JTlRSKSB7Ci0JCQlyZWdzLT5ncHJbM10gPSByZWdzLT5vcmlnX2dwcjM7Ci0JCQlyZWdzLT5uaXAgLT0gNDsgLyogQmFjayB1cCAmIHJldHJ5IHN5c3RlbSBjYWxsICovCi0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQl9IGVsc2UgaWYgKChpbnQpcmVncy0+cmVzdWx0ID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKLQkJCXJlZ3MtPmdwclswXSA9IF9fTlJfcmVzdGFydF9zeXNjYWxsOwotCQkJcmVncy0+bmlwIC09IDQ7Ci0JCQlyZWdzLT5yZXN1bHQgPSAwOwotCQl9Ci0JfQotCS8qIE5vIHNpZ25hbCB0byBkZWxpdmVyIC0tIHB1dCB0aGUgc2F2ZWQgc2lnbWFzayBiYWNrICovCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0JCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX3NpZ25hbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggNjg5OTFjMi4uNTVkMjllZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtNDQyLDEyICs0NDIsMTQgQEAKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2xpbmsoJm5vZGUtPnN5c2Rldi5rb2JqLCAmZGV2LT5rb2JqLAogCQkJa29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZSk7CiAKIHZvaWQgc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgaW50IG5pZCkKIHsKIAlzdHJ1Y3Qgbm9kZSAqbm9kZSA9ICZub2RlX2RldmljZXNbbmlkXTsKIAlzeXNmc19yZW1vdmVfbGluaygmbm9kZS0+c3lzZGV2LmtvYmosIGtvYmplY3RfbmFtZSgmZGV2LT5rb2JqKSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19yZW1vdmVfZGV2aWNlX2Zyb21fbm9kZSk7CiAKICNlbHNlCiBzdGF0aWMgdm9pZCByZWdpc3Rlcl9ub2Rlcyh2b2lkKQpAQCAtNDU3LDkgKzQ1OSw2IEBACiAKICNlbmRpZgogCi1FWFBPUlRfU1lNQk9MX0dQTChzeXNmc19hZGRfZGV2aWNlX3RvX25vZGUpOwotRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2RldmljZV9mcm9tX25vZGUpOwotCiAvKiBPbmx5IHZhbGlkIGlmIENQVSBpcyBwcmVzZW50LiAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19waHlzaWNhbF9pZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RpbWUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCmluZGV4IDJjODU2NGQuLmU1ZGYxNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jCkBAIC03Nyw5ICs3Nyw4IEBACiAvKiBrZWVwIHRyYWNrIG9mIHdoZW4gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHJ0YyAqLwogdGltZV90IGxhc3RfcnRjX3VwZGF0ZTsKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLXVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90aXRhbiA9IDA7Ci11bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGIgPSAwOyAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpcnN0X3NldHRpbWVvZmRheSA9IDE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGlTZXJpZXNfcmVjYWxfdGl0YW47CitzdGF0aWMgc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBpU2VyaWVzX3JlY2FsX3RiOwogI2VuZGlmCiAKIC8qIFRoZSBkZWNyZW1lbnRlciBjb3VudHMgZG93biBieSAxMjggZXZlcnkgMTI4bnMgb24gYSA2MDEuICovCkBAIC0xMTMsOCArMTEyLDkgQEAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiBFWFBPUlRfU1lNQk9MX0dQTChydGNfbG9jayk7CiAKLXU2NCB0Yl90b19uc19zY2FsZTsKLXVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0Oworc3RhdGljIHU2NCB0Yl90b19uc19zY2FsZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIHRiX3RvX25zX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBib290X3RiIF9fcmVhZF9tb3N0bHk7CiAKIHN0cnVjdCBnZXR0aW1lb2ZkYXlfc3RydWN0IGRvX2d0b2Q7CiAKQEAgLTIxNCw3ICsyMTQsNiBAQAogIAlydW5fcG9zaXhfY3B1X3RpbWVycyhjdXJyZW50KTsKIH0KIAotI2lmZGVmIENPTkZJR19QUENfU1BMUEFSCiAvKgogICogU3R1ZmYgZm9yIGFjY291bnRpbmcgc3RvbGVuIHRpbWUuCiAgKi8KQEAgLTIyMiwxOSArMjIxLDI4IEBACiAJaW50CWluaXRpYWxpemVkOwkJCS8qIHRocmVhZCBpcyBydW5uaW5nICovCiAJdTY0CXRiOwkJCS8qIGxhc3QgVEIgdmFsdWUgcmVhZCAqLwogCXU2NAlwdXJyOwkJCS8qIGxhc3QgUFVSUiB2YWx1ZSByZWFkICovCi0Jc3BpbmxvY2tfdCBsb2NrOwogfTsKIAorLyoKKyAqIEVhY2ggZW50cnkgaW4gdGhlIGNwdV9wdXJyX2RhdGEgYXJyYXkgaXMgbWFuaXB1bGF0ZWQgb25seSBieSBpdHMKKyAqICJvd25lciIgY3B1IC0tIHVzdWFsbHkgaW4gdGhlIHRpbWVyIGludGVycnVwdCBidXQgYWxzbyBvY2Nhc2lvbmFsbHkKKyAqIGluIHByb2Nlc3MgY29udGV4dCBmb3IgY3B1IG9ubGluZS4gIEFzIGxvbmcgYXMgY3B1cyBkbyBub3QgdG91Y2gKKyAqIGVhY2ggb3RoZXJzJyBjcHVfcHVycl9kYXRhLCBkaXNhYmxpbmcgbG9jYWwgaW50ZXJydXB0cyBpcworICogc3VmZmljaWVudCB0byBzZXJpYWxpemUgYWNjZXNzZXMuCisgKi8KIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X3B1cnJfZGF0YSwgY3B1X3B1cnJfZGF0YSk7CiAKIHN0YXRpYyB2b2lkIHNuYXBzaG90X3RiX2FuZF9wdXJyKHZvaWQgKmRhdGEpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgY3B1X3B1cnJfZGF0YSAqcCA9ICZfX2dldF9jcHVfdmFyKGNwdV9wdXJyX2RhdGEpOwogCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXAtPnRiID0gbWZ0YigpOwogCXAtPnB1cnIgPSBtZnNwcihTUFJOX1BVUlIpOwogCXdtYigpOwogCXAtPmluaXRpYWxpemVkID0gMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCkBAIC0yNDIsMTUgKzI1MCwxNCBAQAogICovCiB2b2lkIHNuYXBzaG90X3RpbWViYXNlcyh2b2lkKQogewotCWludCBjcHU7Ci0KIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJc3Bpbl9sb2NrX2luaXQoJnBlcl9jcHUoY3B1X3B1cnJfZGF0YSwgY3B1KS5sb2NrKTsKIAlvbl9lYWNoX2NwdShzbmFwc2hvdF90Yl9hbmRfcHVyciwgTlVMTCwgMCwgMSk7CiB9CiAKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KIHZvaWQgY2FsY3VsYXRlX3N0ZWFsX3RpbWUodm9pZCkKIHsKIAl1NjQgdGIsIHB1cnI7CkBAIC0yNjIsNyArMjY5LDYgQEAKIAlwbWUgPSAmcGVyX2NwdShjcHVfcHVycl9kYXRhLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCWlmICghcG1lLT5pbml0aWFsaXplZCkKIAkJcmV0dXJuOwkJLyogdGhpcyBjYW4gaGFwcGVuIGluIGVhcmx5IGJvb3QgKi8KLQlzcGluX2xvY2soJnBtZS0+bG9jayk7CiAJdGIgPSBtZnRiKCk7CiAJcHVyciA9IG1mc3ByKFNQUk5fUFVSUik7CiAJc3RvbGVuID0gKHRiIC0gcG1lLT50YikgLSAocHVyciAtIHBtZS0+cHVycik7CkBAIC0yNzAsOSArMjc2LDkgQEAKIAkJYWNjb3VudF9zdGVhbF90aW1lKGN1cnJlbnQsIHN0b2xlbik7CiAJcG1lLT50YiA9IHRiOwogCXBtZS0+cHVyciA9IHB1cnI7Ci0Jc3Bpbl91bmxvY2soJnBtZS0+bG9jayk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX1NQTFBBUgogLyoKICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3B1IGlzIGFkZGVkIHRvIHRoZSBvbmxpbmUgbWFwIHdoZW4KICAqIGEgY3B1IGlzIGJlaW5nIGJyb3VnaHQgdXAgYXQgcnVudGltZS4KQEAgLTI4NCwxMiArMjkwLDEyIEBACiAKIAlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BVUlIpKQogCQlyZXR1cm47CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXBtZSA9ICZwZXJfY3B1KGNwdV9wdXJyX2RhdGEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBtZS0+bG9jaywgZmxhZ3MpOwogCXBtZS0+dGIgPSBtZnRiKCk7CiAJcG1lLT5wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKIAlwbWUtPmluaXRpYWxpemVkID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWUtPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1NQTFBBUiAqLwpAQCAtNTUwLDEwICs1NTYsMTUgQEAKICAqIHJldHVybmVkIGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBmb3IgdGhlIHRpbWViYXNlIGZyZXF1ZW5jeS4gIAogICovCiAKLXN0YXRpYyB2b2lkIGlTZXJpZXNfdGJfcmVjYWwodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlTZXJpZXNfdGJfcmVjYWwodm9pZCkKIHsKIAlzdHJ1Y3QgZGl2X3Jlc3VsdCBkaXZyZXM7CiAJdW5zaWduZWQgbG9uZyB0aXRhbiwgdGI7CisKKwkvKiBNYWtlIHN1cmUgd2Ugb25seSBydW4gb24gaVNlcmllcyAqLworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAl0YiA9IGdldF90YigpOwogCXRpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOwogCWlmICggaVNlcmllc19yZWNhbF90aXRhbiApIHsKQEAgLTU5NCw4ICs2MDUsMTggQEAKIAl9CiAJaVNlcmllc19yZWNhbF90aXRhbiA9IHRpdGFuOwogCWlTZXJpZXNfcmVjYWxfdGIgPSB0YjsKKworCXJldHVybiAwOwogfQotI2VuZGlmCitsYXRlX2luaXRjYWxsKGlTZXJpZXNfdGJfcmVjYWwpOworCisvKiBDYWxsZWQgZnJvbSBwbGF0Zm9ybSBlYXJseSBpbml0ICovCit2b2lkIF9faW5pdCBpU2VyaWVzX3RpbWVfaW5pdF9lYXJseSh2b2lkKQoreworCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKKwlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOworfQorI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwogCiAvKgogICogRm9yIGlTZXJpZXMgc2hhcmVkIHByb2Nlc3NvcnMsIHdlIGhhdmUgdG8gbGV0IHRoZSBoeXBlcnZpc29yCkBAIC03MzUsNyArNzU2LDcgQEAKIHsKIAlpZiAoX19VU0VfUlRDKCkpCiAJCXJldHVybiBnZXRfcnRjKCk7Ci0JcmV0dXJuIG11bGhkdShnZXRfdGIoKSwgdGJfdG9fbnNfc2NhbGUpIDw8IHRiX3RvX25zX3NoaWZ0OworCXJldHVybiBtdWxoZHUoZ2V0X3RiKCkgLSBib290X3RiLCB0Yl90b19uc19zY2FsZSkgPDwgdGJfdG9fbnNfc2hpZnQ7CiB9CiAKIGludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKQEAgLTc1OSwxMiArNzgwLDYgQEAKIAkgKiB0byB0aGUgUlRDIGFnYWluLCBvciB3cml0ZSB0byB0aGUgUlRDIGJ1dCB0aGVuIHRoZXkgZG9uJ3QgY2FsbAogCSAqIHNldHRpbWVvZmRheSB0byBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLgogCSAqLwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpICYmIGZpcnN0X3NldHRpbWVvZmRheSkgewotCQlpU2VyaWVzX3RiX3JlY2FsKCk7Ci0JCWZpcnN0X3NldHRpbWVvZmRheSA9IDA7Ci0JfQotI2VuZGlmCiAKIAkvKiBNYWtlIHVzZXJzcGFjZSBnZXR0aW1lb2ZkYXkgc3BpbiB1bnRpbCB3ZSdyZSBkb25lLiAqLwogCSsrdmRzb19kYXRhLT50Yl91cGRhdGVfY291bnQ7CkBAIC05NjAsNiArOTc1LDggQEAKIAl9CiAJdGJfdG9fbnNfc2NhbGUgPSBzY2FsZTsKIAl0Yl90b19uc19zaGlmdCA9IHNoaWZ0OworCS8qIFNhdmUgdGhlIGN1cnJlbnQgdGltZWJhc2UgdG8gcHJldHR5IHVwIENPTkZJR19QUklOVEtfVElNRSAqLworCWJvb3RfdGIgPSBnZXRfdGIoKTsKIAogCXRtID0gZ2V0X2Jvb3RfdGltZSgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKaW5kZXggYmY2NDQ1YS4uMmJiMWNiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMTQ5LDYgKzE0OSw3IEBACiAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CiAKIAlpZiAoa2V4ZWNfc2hvdWxkX2NyYXNoKGN1cnJlbnQpIHx8CkBAIC03NzcsNyArNzc4LDcgQEAKIAkJCXJldHVybjsKIAogCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfUFIpICYmICAvKiBub3QgdXNlci1tb2RlICovCi0JCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCkgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CisJCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCwgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwppbmRleCA0MjQ1NTc5Li5jZWYwMWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJLyoKIAkgKiBGaWxsIHVwIHRoZSAic3lzdGVtY2ZnIiBzdHVmZiBmb3IgYmFja3dhcmQgY29tcGF0aWJsaXR5CiAJICovCi0Jc3RyY3B5KHZkc29fZGF0YS0+ZXllX2NhdGNoZXIsICJTWVNURU1DRkc6UFBDNjQiKTsKKwlzdHJjcHkoKGNoYXIgKil2ZHNvX2RhdGEtPmV5ZV9jYXRjaGVyLCAiU1lTVEVNQ0ZHOlBQQzY0Iik7CiAJdmRzb19kYXRhLT52ZXJzaW9uLm1ham9yID0gU1lTVEVNQ0ZHX01BSk9SOwogCXZkc29fZGF0YS0+dmVyc2lvbi5taW5vciA9IFNZU1RFTUNGR19NSU5PUjsKIAl2ZHNvX2RhdGEtPnByb2Nlc3NvciA9IG1mc3ByKFNQUk5fUFZSKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAyMWMzOWZmLi5hZTRhY2Q4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBQUk9WSURFMzIoeCkJUFJPVklERSh4KQogI2VuZGlmCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogRU5UUlkoX3N0ZXh0KQogCkBAIC0yMTEsNiArMjEyLDExIEBACiAJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAJfQogCisJLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKKwkuZGF0YS5yZWFkX21vc3RseSA6IHsKKwkJKiguZGF0YS5yZWFkX21vc3RseSkKKwl9CisKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX2RhdGFfbm9zYXZlIDogewogCQlfX25vc2F2ZV9iZWdpbiA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jIGIvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYwppbmRleCBjYTRkY2IwLi5jM2RmNTA0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS80eHhfbW11LmMKaW5kZXggODM4ZTA5ZC4uN2ZmMjYwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tLzR4eF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vNHh4X21tdS5jCkBAIC05LDcgKzksNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKaW5kZXggNGY4MzljNi4uN2U0ZDI3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQpAQCAtMTEsOCArMTEsNyBAQAogaGFzaC0kKENPTkZJR19QUENfTkFUSVZFKQk6PSBoYXNoX25hdGl2ZV82NC5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBpbml0XzY0Lm8gcGd0YWJsZV82NC5vIG1tdV9jb250ZXh0XzY0Lm8gXAogCQkJCSAgIGhhc2hfdXRpbHNfNjQubyBoYXNoX2xvd182NC5vIHRsYl82NC5vIFwKLQkJCQkgICBzbGJfbG93Lm8gc2xiLm8gc3RhYi5vIG1tYXAubyBpbWFsbG9jLm8gXAotCQkJCSAgICQoaGFzaC15KQorCQkJCSAgIHNsYl9sb3cubyBzbGIubyBzdGFiLm8gbW1hcC5vICQoaGFzaC15KQogb2JqLSQoQ09ORklHX1BQQ19TVERfTU1VXzMyKQkrPSBwcGNfbW11XzMyLm8gaGFzaF9sb3dfMzIubyB0bGJfMzIubwogb2JqLSQoQ09ORklHXzQweCkJCSs9IDR4eF9tbXUubwogb2JqLSQoQ09ORklHXzQ0eCkJCSs9IDQ0eF9tbXUubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCAxMTViMjVmLi4wZWNlNTEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJfQogCXByaW50aygiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgY3VycmVudC0+Y29tbSk7CiAJaWYgKHVzZXJfbW9kZShyZWdzKSkKLQkJZG9fZXhpdChTSUdLSUxMKTsKKwkJZG9fZ3JvdXBfZXhpdChTSUdLSUxMKTsKIAlyZXR1cm4gU0lHS0lMTDsKIAogZG9fc2lnYnVzOgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS9mc2xfYm9va2VfbW11LmMKaW5kZXggMTIzZGEwMy4uYWZhYjI0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZzbF9ib29rZV9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZnNsX2Jvb2tlX21tdS5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKICAqICAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCAgTGludXMgVG9ydmFsZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKaW5kZXggNGEyMGQ4OS4uNmJhOWI0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQlzcGluX3VubG9jaygmbmF0aXZlX3RsYmllX2xvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX2xvY2tfaHB0ZShocHRlX3QgKmhwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9sb2NrX2hwdGUoc3RydWN0IGhhc2hfcHRlICpocHRlcCkKIHsKIAl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCkBAIC0xMTYsNyArMTE2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZV90ICpocHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBuYXRpdmVfdW5sb2NrX2hwdGUoc3RydWN0IGhhc2hfcHRlICpocHRlcCkKIHsKIAl1bnNpZ25lZCBsb25nICp3b3JkID0gJmhwdGVwLT52OwogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLAogCQkJdW5zaWduZWQgbG9uZyB2ZmxhZ3MsIGludCBwc2l6ZSkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgaHB0ZV9ncm91cDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdiwgaHB0ZV9yOwogCWludCBpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKIAogCWhwdGVwLT5yID0gaHB0ZV9yOwogCS8qIEd1YXJhbnRlZSB0aGUgc2Vjb25kIGR3b3JkIGlzIHZpc2libGUgYmVmb3JlIHRoZSB2YWxpZCBiaXQgKi8KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIiA6IDogOiAibWVtb3J5Iik7CisJZWllaW8oKTsKIAkvKgogCSAqIE5vdyBzZXQgdGhlIGZpcnN0IGR3b3JkIGluY2x1ZGluZyB0aGUgdmFsaWQgYml0CiAJICogTk9URTogdGhpcyBhbHNvIHVubG9ja3MgdGhlIGhwdGUKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9yZW1vdmUodW5zaWduZWQgbG9uZyBocHRlX2dyb3VwKQogewotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAlpbnQgaTsKIAlpbnQgc2xvdF9vZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBocHRlX3Y7CkBAIC0yMTcsNyArMjE3LDcgQEAKIHN0YXRpYyBsb25nIG5hdGl2ZV9ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgdW5zaWduZWQgbG9uZyB2YSwgaW50IHBzaXplLCBpbnQgbG9jYWwpCiB7Ci0JaHB0ZV90ICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcCA9IGh0YWJfYWRkcmVzcyArIHNsb3Q7CiAJdW5zaWduZWQgbG9uZyBocHRlX3YsIHdhbnRfdjsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjMzLDE1ICsyMzMsMTQgQEAKIAkvKiBFdmVuIGlmIHdlIG1pc3MsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgVExCICovCiAJaWYgKCFIUFRFX1ZfQ09NUEFSRShocHRlX3YsIHdhbnRfdikgfHwgIShocHRlX3YgJiBIUFRFX1ZfVkFMSUQpKSB7CiAJCURCR19MT1coIiAtPiBtaXNzXG4iKTsKLQkJbmF0aXZlX3VubG9ja19ocHRlKGhwdGVwKTsKIAkJcmV0ID0gLTE7CiAJfSBlbHNlIHsKIAkJREJHX0xPVygiIC0+IGhpdFxuIik7CiAJCS8qIFVwZGF0ZSB0aGUgSFBURSAqLwogCQlocHRlcC0+ciA9IChocHRlcC0+ciAmIH4oSFBURV9SX1BQIHwgSFBURV9SX04pKSB8CiAJCQkobmV3cHAgJiAoSFBURV9SX1BQIHwgSFBURV9SX04gfCBIUFRFX1JfQykpOwotCQluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCX0KKwluYXRpdmVfdW5sb2NrX2hwdGUoaHB0ZXApOwogCiAJLyogRW5zdXJlIGl0IGlzIG91dCBvZiB0aGUgdGxiIHRvby4gKi8KIAl0bGJpZSh2YSwgcHNpemUsIGxvY2FsKTsKQEAgLTI1MSw3ICsyNTAsNyBAQAogCiBzdGF0aWMgbG9uZyBuYXRpdmVfaHB0ZV9maW5kKHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSkKIHsKLQlocHRlX3QgKmhwdGVwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXA7CiAJdW5zaWduZWQgbG9uZyBoYXNoOwogCXVuc2lnbmVkIGxvbmcgaSwgajsKIAlsb25nIHNsb3Q7CkBAIC0yOTQsNyArMjkzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHZzaWQsIHZhOwogCWxvbmcgc2xvdDsKLQlocHRlX3QgKmhwdGVwOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXA7CiAKIAl2c2lkID0gZ2V0X2tlcm5lbF92c2lkKGVhKTsKIAl2YSA9ICh2c2lkIDw8IDI4KSB8IChlYSAmIDB4MGZmZmZmZmYpOwpAQCAtMzE1LDcgKzMxNCw3IEBACiBzdGF0aWMgdm9pZCBuYXRpdmVfaHB0ZV9pbnZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyB2YSwKIAkJCQkgICBpbnQgcHNpemUsIGludCBsb2NhbCkKIHsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKKwlzdHJ1Y3QgaGFzaF9wdGUgKmhwdGVwID0gaHRhYl9hZGRyZXNzICsgc2xvdDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzQ1LDcgKzM0NCw3IEBACiAjZGVmaW5lIExQX0JJVFMJCTgKICNkZWZpbmUgTFBfTUFTSyhpKQkoKDB4RkYgPj4gKGkpKSA8PCBMUF9TSElGVCkKIAotc3RhdGljIHZvaWQgaHB0ZV9kZWNvZGUoaHB0ZV90ICpocHRlLCB1bnNpZ25lZCBsb25nIHNsb3QsCitzdGF0aWMgdm9pZCBocHRlX2RlY29kZShzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHVuc2lnbmVkIGxvbmcgc2xvdCwKIAkJCWludCAqcHNpemUsIHVuc2lnbmVkIGxvbmcgKnZhKQogewogCXVuc2lnbmVkIGxvbmcgaHB0ZV9yID0gaHB0ZS0+cjsKQEAgLTQxNSw3ICs0MTQsNyBAQAogc3RhdGljIHZvaWQgbmF0aXZlX2hwdGVfY2xlYXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNsb3QsIHNsb3RzLCBmbGFnczsKLQlocHRlX3QgKmhwdGVwID0gaHRhYl9hZGRyZXNzOworCXN0cnVjdCBoYXNoX3B0ZSAqaHB0ZXAgPSBodGFiX2FkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBocHRlX3YsIHZhOwogCXVuc2lnbmVkIGxvbmcgcHRlZ19jb3VudDsKIAlpbnQgcHNpemU7CkBAIC00NjIsNyArNDYxLDcgQEAKIHN0YXRpYyB2b2lkIG5hdGl2ZV9mbHVzaF9oYXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgbnVtYmVyLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyB2YSwgaGFzaCwgaW5kZXgsIGhpZHgsIHNoaWZ0LCBzbG90OwotCWhwdGVfdCAqaHB0ZXA7CisJc3RydWN0IGhhc2hfcHRlICpocHRlcDsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdjsKIAl1bnNpZ25lZCBsb25nIHdhbnRfdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggNGYyZjQ1My4uMmNlOTQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfU0RSMTsKIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXTsKIAotaHB0ZV90ICpodGFiX2FkZHJlc3M7CitzdHJ1Y3QgaGFzaF9wdGUgKmh0YWJfYWRkcmVzczsKIHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplX2J5dGVzOwogdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIGludCBtbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfNEs7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jIGIvYXJjaC9wb3dlcnBjL21tL2ltYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMTgxNS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW1hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qCi0gKiBjIDIwMDEgUFBDIDY0IFRlYW0sIElCTSBDb3JwCi0gKiAKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLQotI2luY2x1ZGUgIm1tdV9kZWNsLmgiCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoaW1saXN0X211dGV4KTsKLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbWxpc3QgPSBOVUxMOwotCi1zdGF0aWMgaW50IGdldF9mcmVlX2ltX2FkZHIodW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbV9hZGRyKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcDsKLQotCWFkZHIgPSBpb3JlbWFwX2JvdDsKLQlmb3IgKHAgPSAmaW1saXN0OyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYgKHNpemUgKyBhZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkcikKLQkJCWJyZWFrOwotCQlpZiAoKHVuc2lnbmVkIGxvbmcpdG1wLT5hZGRyID49IGlvcmVtYXBfYm90KQotCQkJYWRkciA9IHRtcC0+c2l6ZSArICh1bnNpZ25lZCBsb25nKSB0bXAtPmFkZHI7Ci0JCWlmIChhZGRyID49IElNQUxMT0NfRU5ELXNpemUpCi0JCQlyZXR1cm4gMTsKLQl9Ci0JKmltX2FkZHIgPSBhZGRyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZSBpcyBhIHN1YnNldAotICogb2YgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgcGFyZW50Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGltX3JlZ2lvbl9pc19zdWJzZXQodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCXN0cnVjdCB2bV9zdHJ1Y3QgKnBhcmVudCkKLXsKLQlyZXR1cm4gKGludCkgKHZfYWRkciA+PSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICYmCi0JICAgICAgICAgICAgICB2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyICsgcGFyZW50LT5zaXplICYmCi0JICAgIAkgICAgICBzaXplIDwgcGFyZW50LT5zaXplKTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgdl9hZGRyIGFuZCBzaXplIGlzIGEgc3VwZXJzZXQKLSAqIG9mIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IGNoaWxkCi0gKi8KLXN0YXRpYyBpbnQgaW1fcmVnaW9uX2lzX3N1cGVyc2V0KHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCXN0cnVjdCB2bV9zdHJ1Y3QgKmNoaWxkKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgcGFyZW50OwotCi0JcGFyZW50LmFkZHIgPSAodm9pZCAqKSB2X2FkZHI7Ci0JcGFyZW50LnNpemUgPSBzaXplOwotCi0JcmV0dXJuIGltX3JlZ2lvbl9pc19zdWJzZXQoKHVuc2lnbmVkIGxvbmcpIGNoaWxkLT5hZGRyLCBjaGlsZC0+c2l6ZSwKLQkJCSZwYXJlbnQpOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieSB2X2FkZHIgYW5kIHNpemUgb3ZlcmxhcHMKLSAqIHRoZSByZWdpb24gZGVzY3JpYmVkIGJ5IHZtLiAgT3ZlcmxhcHBpbmcgcmVnaW9ucyBtZWV0IHRoZQotICogZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKiAxKSBUaGUgcmVnaW9ucyBzaGFyZSBzb21lIHBhcnQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UKLSAqIDIpIFRoZSByZWdpb25zIGFyZW4ndCBpZGVudGljYWwKLSAqIDMpIE5laXRoZXIgcmVnaW9uIGlzIGEgc3Vic2V0IG9mIHRoZSBvdGhlcgotICovCi1zdGF0aWMgaW50IGltX3JlZ2lvbl9vdmVybGFwcyh1bnNpZ25lZCBsb25nIHZfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkgICAgIHN0cnVjdCB2bV9zdHJ1Y3QgKnZtKQotewotCWlmIChpbV9yZWdpb25faXNfc3VwZXJzZXQodl9hZGRyLCBzaXplLCB2bSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuICh2X2FkZHIgKyBzaXplID4gKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyICsgdm0tPnNpemUgJiYKLQkJdl9hZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHZtLT5hZGRyICsgdm0tPnNpemUpIHx8Ci0JICAgICAgICh2X2FkZHIgPCAodW5zaWduZWQgbG9uZykgdm0tPmFkZHIgJiYKLQkJdl9hZGRyICsgc2l6ZSA+ICh1bnNpZ25lZCBsb25nKSB2bS0+YWRkcik7Ci19Ci0KLS8qIERldGVybWluZSBpbWFsbG9jIHN0YXR1cyBvZiByZWdpb24gZGVzY3JpYmVkIGJ5IHZfYWRkciBhbmQgc2l6ZS4KLSAqIENhbiByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiBJTV9SRUdJT05fVU5VU0VEICAgLSAgRW50aXJlIHJlZ2lvbiBpcyB1bmFsbG9jYXRlZCBpbiBpbWFsbG9jIHNwYWNlLgotICogSU1fUkVHSU9OX1NVQlNFVCAtICAgIFJlZ2lvbiBpcyBhIHN1YnNldCBvZiBhIHJlZ2lvbiB0aGF0IGlzIGFscmVhZHkKLSAqIAkJCSBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqIAkJICAgICAgICAgdm0gd2lsbCBiZSBhc3NpZ25lZCB0byBhIHB0ciB0byB0aGUgcGFyZW50IHJlZ2lvbi4KLSAqIElNX1JFR0lPTl9FWElTVFMgLSAgICBFeGFjdCByZWdpb24gYWxyZWFkeSBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICB2bSB3aWxsIGJlIGFzc2lnbmVkIHRvIGEgcHRyIHRvIHRoZSBleGlzdGluZyBpbWxpc3QKLSAqICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuCi0gKiBJTV9SRUdJT05fT1ZFUkxBUFMgLSAgUmVnaW9uIG92ZXJsYXBzIGFuIGFsbG9jYXRlZCByZWdpb24gaW4gaW1hbGxvYyBzcGFjZS4KLSAqIElNX1JFR0lPTl9TVVBFUlNFVCAtICBSZWdpb24gaXMgYSBzdXBlcnNldCBvZiBhIHJlZ2lvbiB0aGF0IGlzIGFscmVhZHkKLSAqICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgaW4gaW1hbGxvYyBzcGFjZS4KLSAqLwotc3RhdGljIGludCBpbV9yZWdpb25fc3RhdHVzKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCSAgICBzdHJ1Y3Qgdm1fc3RydWN0ICoqdm0pCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdG1wOwotCi0JZm9yICh0bXAgPSBpbWxpc3Q7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQotCQlpZiAodl9hZGRyIDwgKHVuc2lnbmVkIGxvbmcpIHRtcC0+YWRkciArIHRtcC0+c2l6ZSkKLQkJCWJyZWFrOwotCi0JKnZtID0gTlVMTDsKLQlpZiAodG1wKSB7Ci0JCWlmIChpbV9yZWdpb25fb3ZlcmxhcHModl9hZGRyLCBzaXplLCB0bXApKQotCQkJcmV0dXJuIElNX1JFR0lPTl9PVkVSTEFQOwotCi0JCSp2bSA9IHRtcDsKLQkJaWYgKGltX3JlZ2lvbl9pc19zdWJzZXQodl9hZGRyLCBzaXplLCB0bXApKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gc3VwZXJzZXQgKi8KLQkJCXJldHVybiBJTV9SRUdJT05fU1VCU0VUOwotCQl9Ci0JCWlmIChpbV9yZWdpb25faXNfc3VwZXJzZXQodl9hZGRyLCBzaXplLCB0bXApKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gZmlyc3Qgc3Vic2V0ICovCi0JCQlyZXR1cm4gSU1fUkVHSU9OX1NVUEVSU0VUOwotCQl9Ci0JCWVsc2UgaWYgKHZfYWRkciA9PSAodW5zaWduZWQgbG9uZykgdG1wLT5hZGRyICYmCi0JCSAJIHNpemUgPT0gdG1wLT5zaXplKSB7Ci0JCQkvKiBSZXR1cm4gd2l0aCB0bXAgcG9pbnRpbmcgdG8gZXhhY3QgcmVnaW9uICovCi0JCQlyZXR1cm4gSU1fUkVHSU9OX0VYSVNUUzsKLQkJfQotCX0KLQotCXJldHVybiBJTV9SRUdJT05fVU5VU0VEOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqIHNwbGl0X2ltX3JlZ2lvbih1bnNpZ25lZCBsb25nIHZfYWRkciwgCi0JCXVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHZtX3N0cnVjdCAqcGFyZW50KQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtMSA9IE5VTEw7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdm0yID0gTlVMTDsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICpuZXdfdm0gPSBOVUxMOwotCQotCXZtMSA9IGttYWxsb2Moc2l6ZW9mKCp2bTEpLCBHRlBfS0VSTkVMKTsKLQlpZiAodm0xCT09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlcygpIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWlmICh2X2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkcikgewotCSAgICAgICAgLyogVXNlIGV4aXN0aW5nIHBhcmVudCB2bV9zdHJ1Y3QgdG8gcmVwcmVzZW50IGNoaWxkLCBhbGxvY2F0ZQotCQkgKiBuZXcgb25lIGZvciB0aGUgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0xLT5zaXplID0gcGFyZW50LT5zaXplIC0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgKHZfYWRkciArIHNpemUpOwotCQl2bTEtPm5leHQgPSBwYXJlbnQtPm5leHQ7Ci0KLQkJcGFyZW50LT5zaXplID0gc2l6ZTsKLQkJcGFyZW50LT5uZXh0ID0gdm0xOwotCQluZXdfdm0gPSBwYXJlbnQ7Ci0JfSBlbHNlIGlmICh2X2FkZHIgKyBzaXplID09ICh1bnNpZ25lZCBsb25nKSBwYXJlbnQtPmFkZHIgKyAKLQkJCXBhcmVudC0+c2l6ZSkgewotCQkvKiBBbGxvY2F0ZSBuZXcgdm1fc3RydWN0IHRvIHJlcHJlc2VudCBjaGlsZCwgdXNlIGV4aXN0aW5nCi0JCSAqIHBhcmVudCBvbmUgZm9yIHJlbWFpbmRlciBvZiBwYXJlbnQgcmFuZ2UKLQkJICovCi0JCXZtMS0+c2l6ZSA9IHNpemU7Ci0JCXZtMS0+YWRkciA9ICh2b2lkICopIHZfYWRkcjsKLQkJdm0xLT5uZXh0ID0gcGFyZW50LT5uZXh0OwotCQluZXdfdm0gPSB2bTE7Ci0KLQkJcGFyZW50LT5zaXplIC09IHNpemU7Ci0JCXBhcmVudC0+bmV4dCA9IHZtMTsKLQl9IGVsc2UgewotCSAgICAgICAgLyogQWxsb2NhdGUgdHdvIG5ldyB2bV9zdHJ1Y3RzIGZvciB0aGUgbmV3IGNoaWxkIGFuZCAKLQkJICogdXBwZXJtb3N0IHJlbWFpbmRlciwgYW5kIHVzZSBleGlzdGluZyBwYXJlbnQgb25lIGZvciB0aGUKLQkJICogbG93ZXIgcmVtYWluZGVyIG9mIHBhcmVudCByYW5nZQotCQkgKi8KLQkJdm0yID0ga21hbGxvYyhzaXplb2YoKnZtMiksIEdGUF9LRVJORUwpOwotCQlpZiAodm0yID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMoKSBvdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJa2ZyZWUodm0xKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJdm0xLT5zaXplID0gc2l6ZTsKLQkJdm0xLT5hZGRyID0gKHZvaWQgKikgdl9hZGRyOwotCQl2bTEtPm5leHQgPSB2bTI7Ci0JCW5ld192bSA9IHZtMTsKLQotCQl2bTItPnNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIHBhcmVudC0+YWRkciArIHBhcmVudC0+c2l6ZSkgLSAKLQkJCQkodl9hZGRyICsgc2l6ZSk7Ci0JCXZtMi0+YWRkciA9ICh2b2lkICopIHZfYWRkciArIHNpemU7Ci0JCXZtMi0+bmV4dCA9IHBhcmVudC0+bmV4dDsKLQotCQlwYXJlbnQtPnNpemUgPSB2X2FkZHIgLSAodW5zaWduZWQgbG9uZykgcGFyZW50LT5hZGRyOwotCQlwYXJlbnQtPm5leHQgPSB2bTE7Ci0JfQotCi0JcmV0dXJuIG5ld192bTsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKiBfX2FkZF9uZXdfaW1fYXJlYSh1bnNpZ25lZCBsb25nIHJlcV9hZGRyLCAKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcCwgKmFyZWE7Ci0JCQotCWZvciAocCA9ICZpbWxpc3Q7ICh0bXAgPSAqcCkgOyBwID0gJnRtcC0+bmV4dCkgewotCQlpZiAocmVxX2FkZHIgKyBzaXplIDw9ICh1bnNpZ25lZCBsb25nKXRtcC0+YWRkcikKLQkJCWJyZWFrOwotCX0KLQkKLQlhcmVhID0ga21hbGxvYyhzaXplb2YoKmFyZWEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCWFyZWEtPmZsYWdzID0gMDsKLQlhcmVhLT5hZGRyID0gKHZvaWQgKilyZXFfYWRkcjsKLQlhcmVhLT5zaXplID0gc2l6ZTsKLQlhcmVhLT5uZXh0ID0gKnA7Ci0JKnAgPSBhcmVhOwotCi0JcmV0dXJuIGFyZWE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICogX19pbV9nZXRfYXJlYSh1bnNpZ25lZCBsb25nIHJlcV9hZGRyLCAKLQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCQlpbnQgY3JpdGVyaWEpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqdG1wOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpbV9yZWdpb25fc3RhdHVzKHJlcV9hZGRyLCBzaXplLCAmdG1wKTsKLQlpZiAoKGNyaXRlcmlhICYgc3RhdHVzKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgSU1fUkVHSU9OX1VOVVNFRDoKLQkJdG1wID0gX19hZGRfbmV3X2ltX2FyZWEocmVxX2FkZHIsIHNpemUpOwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9TVUJTRVQ6Ci0JCXRtcCA9IHNwbGl0X2ltX3JlZ2lvbihyZXFfYWRkciwgc2l6ZSwgdG1wKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTV9SRUdJT05fRVhJU1RTOgotCQkvKiBSZXR1cm4gcmVxdWVzdGVkIHJlZ2lvbiAqLwotCQlicmVhazsKLQljYXNlIElNX1JFR0lPTl9TVVBFUlNFVDoKLQkJLyogUmV0dXJuIGZpcnN0IGV4aXN0aW5nIHN1YnNldCBvZiByZXF1ZXN0ZWQgcmVnaW9uICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMoKSB1bmV4cGVjdGVkIGltYWxsb2MgcmVnaW9uIHN0YXR1c1xuIiwKLQkJCQlfX0ZVTkNUSU9OX18pOwotCQl0bXAgPSBOVUxMOwotCX0KLQotCXJldHVybiB0bXA7Ci19Ci0KLXN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQkKLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWlmIChnZXRfZnJlZV9pbV9hZGRyKHNpemUsICZhZGRyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzKCkgY2Fubm90IG9idGFpbiBhZGRyIGZvciBzaXplIDB4JWx4XG4iLAotCQkJCV9fRlVOQ1RJT05fXywgc2l6ZSk7Ci0JCWFyZWEgPSBOVUxMOwotCQlnb3RvIG5leHRfaW1fZG9uZTsKLQl9Ci0KLQlhcmVhID0gX19pbV9nZXRfYXJlYShhZGRyLCBzaXplLCBJTV9SRUdJT05fVU5VU0VEKTsKLQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAKLQkJICAgICAgICIlcygpIGNhbm5vdCBvYnRhaW4gYXJlYSBmb3IgYWRkciAweCVseCBzaXplIDB4JWx4XG4iLAotCQkJX19GVU5DVElPTl9fLCBhZGRyLCBzaXplKTsKLQl9Ci1uZXh0X2ltX2RvbmU6Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXJldHVybiBhcmVhOwotfQotCi1zdHJ1Y3Qgdm1fc3RydWN0ICogaW1fZ2V0X2FyZWEodW5zaWduZWQgbG9uZyB2X2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJaW50IGNyaXRlcmlhKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWFyZWEgPSBfX2ltX2dldF9hcmVhKHZfYWRkciwgc2l6ZSwgY3JpdGVyaWEpOwotCW11dGV4X3VubG9jaygmaW1saXN0X211dGV4KTsKLQlyZXR1cm4gYXJlYTsKLX0KLQotdm9pZCBpbV9mcmVlKHZvaWQgKiBhZGRyKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKipwLCAqdG1wOwotICAKLQlpZiAoIWFkZHIpCi0JCXJldHVybjsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpIGFkZHIgJiB+UEFHRV9NQVNLKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvICVzIGJhZCBhZGRyZXNzICglcClcbiIsIF9fRlVOQ1RJT05fXywJCQlhZGRyKTsKLQkJcmV0dXJuOwotCX0KLQltdXRleF9sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCWZvciAocCA9ICZpbWxpc3QgOyAodG1wID0gKnApIDsgcCA9ICZ0bXAtPm5leHQpIHsKLQkJaWYgKHRtcC0+YWRkciA9PSBhZGRyKSB7Ci0JCQkqcCA9IHRtcC0+bmV4dDsKLQkJCXVubWFwX3ZtX2FyZWEodG1wKTsKLQkJCWtmcmVlKHRtcCk7Ci0JCQltdXRleF91bmxvY2soJmltbGlzdF9tdXRleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbXV0ZXhfdW5sb2NrKCZpbWxpc3RfbXV0ZXgpOwotCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvICVzIG5vbmV4aXN0ZW50IGFyZWEgKCVwKVxuIiwgX19GVU5DVElPTl9fLAotCQkJYWRkcik7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCA1ZmNlNmNjLi5lMWY1ZGVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKiAgUFBDNDR4LzM2LWJpdCBjaGFuZ2VzIGJ5IE1hdHQgUG9ydGVyIChtcG9ydGVyQG12aXN0YS5jb20pCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF82NC5jCmluZGV4IDczMTJhMjYuLjFkNmVkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfNjQuYwpAQCAtNSw3ICs1LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IDAyNjZhOTQuLmYwZTdlZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTUsNyArNSw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKICAqICBhbmQgQ29ydCBEb3VnYW4gKFBSZVApIChjb3J0QGNzLm5tdC5lZHUpCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMKLSAqICBBbWlnYS9BUFVTIGNoYW5nZXMgYnkgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykuCiAgKiAgUFBDNDR4LzM2LWJpdCBjaGFuZ2VzIGJ5IE1hdHQgUG9ydGVyIChtcG9ydGVyQG12aXN0YS5jb20pCiAgKgogICogIERlcml2ZWQgZnJvbSAiYXJjaC9pMzg2L21tL2luaXQuYyIKQEAgLTEyOSw4ICsxMjgsNiBAQAogCXpvbmUgPSBwZ2RhdGEtPm5vZGVfem9uZXM7CiAKIAlyZXR1cm4gX19hZGRfcGFnZXMoem9uZSwgc3RhcnRfcGZuLCBucl9wYWdlcyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKaW5kZXggNzkyMDg2Yi4uY2MzMmJhNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzMyLmMKQEAgLTExLDcgKzExLDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9kZWNsLmggYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAppbmRleCAyNTU4YzM0Li5jOTRhNjRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaAorKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2RlY2wuaApAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtNDAsOCArMzksOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9yZW1hcF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGludCBydGFzX2RhdGEsIHJ0YXNfc2l6ZTsKIAotc3RydWN0IF9QVEU7Ci1leHRlcm4gc3RydWN0IF9QVEUgKkhhc2gsICpIYXNoX2VuZDsKK3N0cnVjdCBoYXNoX3B0ZTsKK2V4dGVybiBzdHJ1Y3QgaGFzaF9wdGUgKkhhc2gsICpIYXNoX2VuZDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIEhhc2hfc2l6ZSwgSGFzaF9tYXNrOwogCiBleHRlcm4gdW5zaWduZWQgaW50IG51bV90bGJjYW1fZW50cmllczsKQEAgLTkwLDE2ICs4OSw0IEBACiAJZWxzZQogCQlfdGxiaWUodmEpOwogfQotI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCi0vKiBpbWFsbG9jIHJlZ2lvbiB0eXBlcyAqLwotI2RlZmluZSBJTV9SRUdJT05fVU5VU0VECTB4MQotI2RlZmluZSBJTV9SRUdJT05fU1VCU0VUCTB4MgotI2RlZmluZSBJTV9SRUdJT05fRVhJU1RTCTB4NAotI2RlZmluZSBJTV9SRUdJT05fT1ZFUkxBUAkweDgKLSNkZWZpbmUgSU1fUkVHSU9OX1NVUEVSU0VUCTB4MTAKLQotZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKiBpbV9nZXRfZnJlZV9hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqIGltX2dldF9hcmVhKHVuc2lnbmVkIGxvbmcgdl9hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICAgICAgaW50IHJlZ2lvbl90eXBlKTsKLWV4dGVybiB2b2lkIGltX2ZyZWUodm9pZCAqYWRkcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCmluZGV4IGY2YWUxYTUuLjY0NDg4NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwpAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMzcsNyArMzYsNiBAQAogdW5zaWduZWQgbG9uZyBpb3JlbWFwX2Jhc2U7CiB1bnNpZ25lZCBsb25nIGlvcmVtYXBfYm90OwogRVhQT1JUX1NZTUJPTChpb3JlbWFwX2JvdCk7CS8qIGFrYSBWTUFMTE9DX0VORCAqLwotaW50IGlvX2JhdF9pbmRleDsKIAogI2lmIGRlZmluZWQoQ09ORklHXzZ4eCkgfHwgZGVmaW5lZChDT05GSUdfUE9XRVIzKQogI2RlZmluZSBIQVZFX0JBVFMJMQpAQCAtMzAwLDUxICsyOTgsNiBAQAogCX0KIH0KIAotLyogaXMgeCBhIHBvd2VyIG9mIDQ/ICovCi0jZGVmaW5lIGlzX3Bvd2VyX29mXzQoeCkJaXNfcG93ZXJfb2ZfMih4KSAmJiAoZmZzKHgpICYgMSkKLQotLyoKLSAqIFNldCB1cCBhIG1hcHBpbmcgZm9yIGEgYmxvY2sgb2YgSS9PLgotICogdmlydCwgcGh5cywgc2l6ZSBtdXN0IGFsbCBiZSBwYWdlLWFsaWduZWQuCi0gKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgaW9yZW1hcCBpcyBjYWxsZWQuCi0gKi8KLXZvaWQgX19pbml0IGlvX2Jsb2NrX21hcHBpbmcodW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQotewotCWludCBpOwotCi0JaWYgKHZpcnQgPiBLRVJORUxCQVNFICYmIHZpcnQgPCBpb3JlbWFwX2JvdCkKLQkJaW9yZW1hcF9ib3QgPSBpb3JlbWFwX2Jhc2UgPSB2aXJ0OwotCi0jaWZkZWYgSEFWRV9CQVRTCi0JLyoKLQkgKiBVc2UgYSBCQVQgZm9yIHRoaXMgaWYgcG9zc2libGUuLi4KLQkgKi8KLQlpZiAoaW9fYmF0X2luZGV4IDwgMiAmJiBpc19wb3dlcl9vZl8yKHNpemUpCi0JICAgICYmICh2aXJ0ICYgKHNpemUgLSAxKSkgPT0gMCAmJiAocGh5cyAmIChzaXplIC0gMSkpID09IDApIHsKLQkJc2V0YmF0KGlvX2JhdF9pbmRleCwgdmlydCwgcGh5cywgc2l6ZSwgZmxhZ3MpOwotCQkrK2lvX2JhdF9pbmRleDsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvKiBIQVZFX0JBVFMgKi8KLQotI2lmZGVmIEhBVkVfVExCQ0FNCi0JLyoKLQkgKiBVc2UgYSBDQU0gZm9yIHRoaXMgaWYgcG9zc2libGUuLi4KLQkgKi8KLQlpZiAodGxiY2FtX2luZGV4IDwgbnVtX3RsYmNhbV9lbnRyaWVzICYmIGlzX3Bvd2VyX29mXzQoc2l6ZSkKLQkgICAgJiYgKHZpcnQgJiAoc2l6ZSAtIDEpKSA9PSAwICYmIChwaHlzICYgKHNpemUgLSAxKSkgPT0gMCkgewotCQlzZXR0bGJjYW0odGxiY2FtX2luZGV4LCB2aXJ0LCBwaHlzLCBzaXplLCBmbGFncywgMCk7Ci0JCSsrdGxiY2FtX2luZGV4OwotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8qIEhBVkVfVExCQ0FNICovCi0KLQkvKiBObyBCQVRzIGF2YWlsYWJsZSwgcHV0IGl0IGluIHRoZSBwYWdlIHRhYmxlcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpCi0JCW1hcF9wYWdlKHZpcnQgKyBpLCBwaHlzICsgaSwgZmxhZ3MpOwotfQotCiAvKiBTY2FuIHRoZSByZWFsIExpbnV4IHBhZ2UgdGFibGVzIGFuZCByZXR1cm4gYSBQVEUgcG9pbnRlciBmb3IKICAqIGEgdmlydHVhbCBhZGRyZXNzIGluIGEgY29udGV4dC4KICAqIFJldHVybnMgdHJ1ZSAoMSkgaWYgUFRFIHdhcyBmb3VuZCwgemVybyBvdGhlcndpc2UuICBUaGUgcG9pbnRlciB0bwpAQCAtMzc5LDgyICszMzIsNiBAQAogICAgICAgICByZXR1cm4ocmV0dmFsKTsKIH0KIAotLyogRmluZCBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGlzIHZpcnR1YWwgYWRkcmVzcy4gIE5vcm1hbGx5IHVzZWQgYnkKLSAqIEkvTyBmdW5jdGlvbnMsIGJ1dCBhbnlvbmUgY2FuIGNhbGwgaXQuCi0gKi8KLXVuc2lnbmVkIGxvbmcgaW9wYSh1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBwYTsKLQotCS8qIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyB3b24ndCB3b3JrIG9uIFBNYWNzIG9yIENIUlAuICBJdAotCSAqIGFwcGVhcnMgdGhlcmUgaXMgc29tZSBidWcsIG9yIHRoZXJlIGlzIHNvbWUgaW1wbGljaXQKLQkgKiBtYXBwaW5nIGRvbmUgbm90IHByb3Blcmx5IHJlcHJlc2VudGVkIGJ5IEJBVHMgb3IgaW4gcGFnZQotCSAqIHRhYmxlcy4uLi4uLi5JIGFtIGFjdGl2ZWx5IHdvcmtpbmcgb24gcmVzb2x2aW5nIHRoaXMsIGJ1dAotCSAqIGNhbid0IGhvbGQgdXAgb3RoZXIgc3R1ZmYuICAtLSBEYW4KLQkgKi8KLQlwdGVfdCAqcHRlOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCi0JLyogQ2hlY2sgdGhlIEJBVHMgKi8KLQlwYSA9IHZfbWFwcGVkX2J5X2JhdHMoYWRkcik7Ci0JaWYgKHBhKQotCQlyZXR1cm4gcGE7Ci0KLQkvKiBBbGxvdyBtYXBwaW5nIG9mIHVzZXIgYWRkcmVzc2VzICh3aXRoaW4gdGhlIHRocmVhZCkKLQkgKiBmb3IgRE1BIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAoYWRkciA8IFRBU0tfU0laRSkKLQkJbW0gPSBjdXJyZW50LT5tbTsKLQllbHNlCi0JCW1tID0gJmluaXRfbW07Ci0KLQlwYSA9IDA7Ci0JaWYgKGdldF9wdGVwdHIobW0sIGFkZHIsICZwdGUsIE5VTEwpKSB7Ci0JCXBhID0gKHB0ZV92YWwoKnB0ZSkgJiBQQUdFX01BU0spIHwgKGFkZHIgJiB+UEFHRV9NQVNLKTsKLQkJcHRlX3VubWFwKHB0ZSk7Ci0JfQotCi0JcmV0dXJuKHBhKTsKLX0KLQotLyogVGhpcyBpcyB3aWxsIGZpbmQgdGhlIHZpcnR1YWwgYWRkcmVzcyBmb3IgYSBwaHlzaWNhbCBvbmUuLi4uCi0gKiBTd2lwZWQgZnJvbSBBUFVTLCBjb3VsZCBiZSBkYW5nZXJvdXMgOi0pLgotICogVGhpcyBpcyBvbmx5IGEgcGxhY2Vob2xkZXIgdW50aWwgSSByZWFsbHkgZmluZCBhIHdheSB0byBtYWtlIHRoaXMKLSAqIHdvcmsuICAtLSBEYW4KLSAqLwotdW5zaWduZWQgbG9uZwotbW1fcHRvdiAodW5zaWduZWQgbG9uZyBwYWRkcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLSNpZiAwCi0JaWYgKHBhZGRyIDwgMTYqMTAyNCoxMDI0KQotCQlyZXQgPSBaVFdPX1ZBRERSKHBhZGRyKTsKLQllbHNlIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGttYXBfY2h1bmtfY291bnQ7KXsKLQkJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IGttYXBfY2h1bmtzW2krK107Ci0JCQl1bnNpZ25lZCBsb25nIHNpemUgPSBrbWFwX2NodW5rc1tpKytdOwotCQkJdW5zaWduZWQgbG9uZyB2aXJ0ID0ga21hcF9jaHVua3NbaSsrXTsKLQkJCWlmIChwYWRkciA+PSBwaHlzCi0JCQkgICAgJiYgcGFkZHIgPCAocGh5cyArIHNpemUpKXsKLQkJCQlyZXQgPSB2aXJ0ICsgcGFkZHIgLSBwaHlzOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCQotCQlyZXQgPSAodW5zaWduZWQgbG9uZykgX192YShwYWRkcik7Ci0JfQotZXhpdDoKLSNpZmRlZiBERUJVR1BWCi0JcHJpbnRrICgiUFRPViglbHgpPSVseFxuIiwgcGFkZHIsIHJldCk7Ci0jZW5kaWYKLSNlbHNlCi0JcmV0ID0gKHVuc2lnbmVkIGxvbmcpcGFkZHIgKyBLRVJORUxCQVNFOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIAogc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHIoc3RydWN0IHBhZ2UgKnBhZ2UsIHBncHJvdF90IHByb3QpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfNjQuYwppbmRleCBhZDZlMTM1Li4zZGZkMTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzY0LmMKQEAgLTcsNyArNyw2IEBACiAgKiAgTW9kaWZpY2F0aW9ucyBieSBQYXVsIE1hY2tlcnJhcyAoUG93ZXJNYWMpIChwYXVsdXNAc2FtYmEub3JnKQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMzQsNDEgKzMzLDI3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRyLmg+Ci0jaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9sbWIuaD4KLSNpbmNsdWRlIDxhc20vcnRhcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgotI2luY2x1ZGUgPGFzbS9lZWguaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW9tbXUuaD4KICNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KLSNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogCiAjaW5jbHVkZSAibW11X2RlY2wuaCIKIAotdW5zaWduZWQgbG9uZyBpb3JlbWFwX2JvdCA9IElNQUxMT0NfQkFTRTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBoYnNfaW9fYm90ID0gUEhCU19JT19CQVNFOwordW5zaWduZWQgbG9uZyBpb3JlbWFwX2JvdCA9IElPUkVNQVBfQkFTRTsKIAogLyoKICAqIG1hcF9pb19wYWdlIGN1cnJlbnRseSBvbmx5IGNhbGxlZCBieSBfX2lvcmVtYXAKQEAgLTEwMiw4ICs4Nyw4IEBACiAJCSAqIGVudHJ5IGluIHRoZSBoYXJkd2FyZSBwYWdlIHRhYmxlLgogCQkgKgogCQkgKi8KLQkJaWYgKGh0YWJfYm9sdF9tYXBwaW5nKGVhLCBlYSArIFBBR0VfU0laRSwgcGEsIGZsYWdzLAotCQkJCSAgICAgIG1tdV9pb19wc2l6ZSkpIHsKKwkJaWYgKGh0YWJfYm9sdF9tYXBwaW5nKGVhLCAodW5zaWduZWQgbG9uZyllYSArIFBBR0VfU0laRSwKKwkJCQkgICAgICBwYSwgZmxhZ3MsIG1tdV9pb19wc2l6ZSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGRvIGJvbHRlZCBtYXBwaW5nIElPICIKIAkJCSAgICAgICAibWVtb3J5IGF0ICUwMTZseCAhXG4iLCBwYSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExMyw4ICs5OCwxMSBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfY29tKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgcGEsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBzaXplLAorLyoqCisgKiBfX2lvcmVtYXBfYXQgLSBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gZXN0YWJsaXNoIHRoZSBwYWdlIHRhYmxlcworICogICAgICAgICAgICAgICAgZm9yIGFuIElPIG1hcHBpbmcKKyAqLwordm9pZCBfX2lvbWVtICogX19pb3JlbWFwX2F0KHBoeXNfYWRkcl90IHBhLCB2b2lkICplYSwgdW5zaWduZWQgbG9uZyBzaXplLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBpOwpAQCAtMTIyLDE3ICsxMTAsMzUgQEAKIAlpZiAoKGZsYWdzICYgX1BBR0VfUFJFU0VOVCkgPT0gMCkKIAkJZmxhZ3MgfD0gcGdwcm90X3ZhbChQQUdFX0tFUk5FTCk7CiAKKwlXQVJOX09OKHBhICYgflBBR0VfTUFTSyk7CisJV0FSTl9PTigoKHVuc2lnbmVkIGxvbmcpZWEpICYgflBBR0VfTUFTSyk7CisJV0FSTl9PTihzaXplICYgflBBR0VfTUFTSyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBQQUdFX1NJWkUpCi0JCWlmIChtYXBfaW9fcGFnZShlYStpLCBwYStpLCBmbGFncykpCisJCWlmIChtYXBfaW9fcGFnZSgodW5zaWduZWQgbG9uZyllYStpLCBwYStpLCBmbGFncykpCiAJCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiAodm9pZCBfX2lvbWVtICopIChlYSArIChhZGRyICYgflBBR0VfTUFTSykpOworCXJldHVybiAodm9pZCBfX2lvbWVtICopZWE7Cit9CisKKy8qKgorICogX19pb3VubWFwX2Zyb20gLSBMb3cgbGV2ZWwgZnVuY3Rpb24gdG8gdGVhciBkb3duIHRoZSBwYWdlIHRhYmxlcworICogICAgICAgICAgICAgICAgICBmb3IgYW4gSU8gbWFwcGluZy4gVGhpcyBpcyB1c2VkIGZvciBtYXBwaW5ncyB0aGF0CisgKiAgICAgICAgICAgICAgICAgIGFyZSBtYW5pcHVsYXRlZCBtYW51YWxseSwgbGlrZSBwYXJ0aWFsIHVubWFwcGluZyBvZgorICogICAgICAgICAgICAgICAgICBQQ0kgSU9zIG9yIElTQSBzcGFjZS4KKyAqLwordm9pZCBfX2lvdW5tYXBfYXQodm9pZCAqZWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlXQVJOX09OKCgodW5zaWduZWQgbG9uZyllYSkgJiB+UEFHRV9NQVNLKTsKKwlXQVJOX09OKHNpemUgJiB+UEFHRV9NQVNLKTsKKworCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZyllYSwgc2l6ZSk7CiB9CiAKIHZvaWQgX19pb21lbSAqIF9faW9yZW1hcChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQl1bnNpZ25lZCBsb25nIHBhLCBlYTsKKwlwaHlzX2FkZHJfdCBwYWxpZ25lZDsKIAl2b2lkIF9faW9tZW0gKnJldDsKIAogCS8qCkBAIC0xNDQsMjcgKzE1MCwzMCBAQAogCSAqIElNQUxMT0NfRU5ECiAJICogCiAJICovCi0JcGEgPSBhZGRyICYgUEFHRV9NQVNLOwotCXNpemUgPSBQQUdFX0FMSUdOKGFkZHIgKyBzaXplKSAtIHBhOworCXBhbGlnbmVkID0gYWRkciAmIFBBR0VfTUFTSzsKKwlzaXplID0gUEFHRV9BTElHTihhZGRyICsgc2l6ZSkgLSBwYWxpZ25lZDsKIAotCWlmICgoc2l6ZSA9PSAwKSB8fCAocGEgPT0gMCkpCisJaWYgKChzaXplID09IDApIHx8IChwYWxpZ25lZCA9PSAwKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAobWVtX2luaXRfZG9uZSkgewogCQlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOwotCQlhcmVhID0gaW1fZ2V0X2ZyZWVfYXJlYShzaXplKTsKKworCQlhcmVhID0gX19nZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQLAorCQkJCSAgICAgaW9yZW1hcF9ib3QsIElPUkVNQVBfRU5EKTsKIAkJaWYgKGFyZWEgPT0gTlVMTCkKIAkJCXJldHVybiBOVUxMOwotCQllYSA9ICh1bnNpZ25lZCBsb25nKShhcmVhLT5hZGRyKTsKLQkJcmV0ID0gX19pb3JlbWFwX2NvbShhZGRyLCBwYSwgZWEsIHNpemUsIGZsYWdzKTsKKwkJcmV0ID0gX19pb3JlbWFwX2F0KHBhbGlnbmVkLCBhcmVhLT5hZGRyLCBzaXplLCBmbGFncyk7CiAJCWlmICghcmV0KQotCQkJaW1fZnJlZShhcmVhLT5hZGRyKTsKKwkJCXZ1bm1hcChhcmVhLT5hZGRyKTsKIAl9IGVsc2UgewotCQllYSA9IGlvcmVtYXBfYm90OwotCQlyZXQgPSBfX2lvcmVtYXBfY29tKGFkZHIsIHBhLCBlYSwgc2l6ZSwgZmxhZ3MpOworCQlyZXQgPSBfX2lvcmVtYXBfYXQocGFsaWduZWQsICh2b2lkICopaW9yZW1hcF9ib3QsIHNpemUsIGZsYWdzKTsKIAkJaWYgKHJldCkKIAkJCWlvcmVtYXBfYm90ICs9IHNpemU7CiAJfQorCisJaWYgKHJldCkKKwkJcmV0ICs9IGFkZHIgJiB+UEFHRV9NQVNLOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4Nyw2MiArMTk2LDkgQEAKIH0KIAogCi0jZGVmaW5lIElTX1BBR0VfQUxJR05FRChfdmFsKSAoKF92YWwpID09ICgoX3ZhbCkgJiBQQUdFX01BU0spKQotCi1pbnQgX19pb3JlbWFwX2V4cGxpY2l0KHBoeXNfYWRkcl90IHBhLCB1bnNpZ25lZCBsb25nIGVhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0Jdm9pZCBfX2lvbWVtICpyZXQ7Ci0JCi0JLyogRm9yIG5vdywgcmVxdWlyZSBwYWdlLWFsaWduZWQgdmFsdWVzIGZvciBwYSwgZWEsIGFuZCBzaXplICovCi0JaWYgKCFJU19QQUdFX0FMSUdORUQocGEpIHx8ICFJU19QQUdFX0FMSUdORUQoZWEpIHx8Ci0JICAgICFJU19QQUdFX0FMSUdORUQoc2l6ZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCSJ1bmFsaWduZWQgdmFsdWUgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAxOwotCX0KLQkKLQlpZiAoIW1lbV9pbml0X2RvbmUpIHsKLQkJLyogVHdvIHRoaW5ncyB0byBjb25zaWRlciBpbiB0aGlzIGNhc2U6Ci0JCSAqIDEpIE5vIHJlY29yZHMgd2lsbCBiZSBrZXB0IChpbWFsbG9jLCBldGMpIHRoYXQgdGhlIHJlZ2lvbgotCQkgKiAgICBoYXMgYmVlbiByZW1hcHBlZAotCQkgKiAyKSBJdCB3b24ndCBiZSBlYXN5IHRvIGlvdW5tYXAoKSB0aGUgcmVnaW9uIGxhdGVyIChiZWNhdXNlCi0JCSAqICAgIG9mIDEpCi0JCSAqLwotCQk7Ci0JfSBlbHNlIHsKLQkJYXJlYSA9IGltX2dldF9hcmVhKGVhLCBzaXplLAotCQkJSU1fUkVHSU9OX1VOVVNFRHxJTV9SRUdJT05fU1VCU0VUfElNX1JFR0lPTl9FWElTVFMpOwotCQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCQkvKiBFeHBlY3RlZCB3aGVuIFBIQi1kbHBhciBpcyBpbiBwbGF5ICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCQlpZiAoZWEgIT0gKHVuc2lnbmVkIGxvbmcpIGFyZWEtPmFkZHIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBhZGRyIHJldHVybiBmcm9tICIKLQkJCSAgICAgICAiaW1fZ2V0X2FyZWFcbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JCi0JcmV0ID0gX19pb3JlbWFwX2NvbShwYSwgcGEsIGVhLCBzaXplLCBmbGFncyk7Ci0JaWYgKHJldCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW9yZW1hcF9leHBsaWNpdCgpIGFsbG9jYXRpb24gZmFpbHVyZSAhXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChyZXQgIT0gKHZvaWQgKikgZWEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJfX2lvcmVtYXBfY29tKCkgcmV0dXJuZWQgdW5leHBlY3RlZCBhZGRyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qICAKICAqIFVubWFwIGFuIElPIHJlZ2lvbiBhbmQgcmVtb3ZlIGl0IGZyb20gaW1hbGxvYydkIGxpc3QuCiAgKiBBY2Nlc3MgdG8gSU8gbWVtb3J5IHNob3VsZCBiZSBzZXJpYWxpemVkIGJ5IGRyaXZlci4KLSAqIFRoaXMgY29kZSBpcyBtb2RlbGVkIGFmdGVyIHZtYWxsb2MgY29kZSAtIHVubWFwX3ZtX2FyZWEoKQotICoKLSAqIFhYWAl3aGF0IGFib3V0IGNhbGxzIGJlZm9yZSBtZW1faW5pdF9kb25lIChpZSBweXRob25fY291bnRlcm1lYXN1cmVzKCkpCiAgKi8KIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqdG9rZW4pCiB7CkBAIC0yNTEsOSArMjA3LDE0IEBACiAJaWYgKCFtZW1faW5pdF9kb25lKQogCQlyZXR1cm47CiAJCi0JYWRkciA9ICh2b2lkICopICgodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSB0b2tlbiAmIFBBR0VfTUFTSyk7Ci0KLQlpbV9mcmVlKGFkZHIpOworCWFkZHIgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkKKwkJCSBQQ0lfRklYX0FERFIodG9rZW4pICYgUEFHRV9NQVNLKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciA8IGlvcmVtYXBfYm90KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkF0dGVtcHQgdG8gaW91bm1hcCBlYXJseSBib2x0ZWQgbWFwcGluZyIKKwkJICAgICAgICIgYXQgMHglcFxuIiwgYWRkcik7CisJCXJldHVybjsKKwl9CisJdnVubWFwKGFkZHIpOwogfQogCiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICp0b2tlbikKQEAgLTI2NCw3NyArMjI1LDggQEAKIAkJX19pb3VubWFwKHRva2VuKTsKIH0KIAotc3RhdGljIGludCBpb3VubWFwX3N1YnNldF9yZWdpb25zKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7Ci0KLQkvKiBDaGVjayB3aGV0aGVyIHN1YnNldHMgb2YgdGhpcyByZWdpb24gZXhpc3QgKi8KLQlhcmVhID0gaW1fZ2V0X2FyZWEoYWRkciwgc2l6ZSwgSU1fUkVHSU9OX1NVUEVSU0VUKTsKLQlpZiAoYXJlYSA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCXdoaWxlIChhcmVhKSB7Ci0JCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyKTsKLQkJYXJlYSA9IGltX2dldF9hcmVhKGFkZHIsIHNpemUsCi0JCQkJSU1fUkVHSU9OX1NVUEVSU0VUKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JaW50IHJjOwotCQotCWFkZHIgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKSBzdGFydCAmIFBBR0VfTUFTSzsKLQotCS8qIFZlcmlmeSB0aGF0IHRoZSByZWdpb24gZWl0aGVyIGV4aXN0cyBvciBpcyBhIHN1YnNldCBvZiBhbiBleGlzdGluZwotCSAqIHJlZ2lvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc3BsaXQgdGhlIHBhcmVudCByZWdpb24gdG8gY3JlYXRlIAotCSAqIHRoZSBleGFjdCByZWdpb24gCi0JICovCi0JYXJlYSA9IGltX2dldF9hcmVhKGFkZHIsIHNpemUsIAotCQkJICAgIElNX1JFR0lPTl9FWElTVFMgfCBJTV9SRUdJT05fU1VCU0VUKTsKLQlpZiAoYXJlYSA9PSBOVUxMKSB7Ci0JCS8qIERldGVybWluZSB3aGV0aGVyIHN1YnNldCByZWdpb25zIGV4aXN0LiAgSWYgc28sIHVubWFwICovCi0JCXJjID0gaW91bm1hcF9zdWJzZXRfcmVnaW9ucyhhZGRyLCBzaXplKTsKLQkJaWYgKHJjKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXMoKSBjYW5ub3QgdW5tYXAgbm9uZXhpc3RlbnQgcmFuZ2UgMHglbHhcbiIsCi0gCQkJCV9fRlVOQ1RJT05fXywgYWRkcik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKSBhcmVhLT5hZGRyKTsKLQl9Ci0JLyoKLQkgKiBGSVhNRSEgVGhpcyBjYW4ndCBiZSByaWdodDoKLQlpb3VubWFwKGFyZWEtPmFkZHIpOwotCSAqIE1heWJlIGl0IHNob3VsZCBiZSAiaW91bm1hcChhcmVhKTsiCi0JICovCi0JcmV0dXJuIDA7Ci19Ci0KIEVYUE9SVF9TWU1CT0woaW9yZW1hcCk7CiBFWFBPUlRfU1lNQk9MKGlvcmVtYXBfZmxhZ3MpOwogRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIEVYUE9SVF9TWU1CT0woX19pb3VubWFwKTsKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhwaGJfaW9fbG9jayk7Ci0KLXZvaWQgX19pb21lbSAqIHJlc2VydmVfcGhiX2lvc3BhY2UodW5zaWduZWQgbG9uZyBzaXplKQotewotCXZvaWQgX19pb21lbSAqdmlydF9hZGRyOwotCQkKLQlpZiAocGhic19pb19ib3QgPj0gSU1BTExPQ19CQVNFKSAKLQkJcGFuaWMoInJlc2VydmVfcGhiX2lvc3BhY2UoKTogcGhiIGlvIHNwYWNlIG92ZXJmbG93XG4iKTsKLQkJCQotCXNwaW5fbG9jaygmcGhiX2lvX2xvY2spOwotCXZpcnRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikgcGhic19pb19ib3Q7Ci0JcGhic19pb19ib3QgKz0gc2l6ZTsKLQlzcGluX3VubG9jaygmcGhiX2lvX2xvY2spOwotCi0JcmV0dXJuIHZpcnRfYWRkcjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jCmluZGV4IGVjMTQyMWEuLjVjNDVkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCkBAIC0zNSwxMiArMzQsMTIgQEAKIAogI2luY2x1ZGUgIm1tdV9kZWNsLmgiCiAKLVBURSAqSGFzaCwgKkhhc2hfZW5kOworc3RydWN0IGhhc2hfcHRlICpIYXNoLCAqSGFzaF9lbmQ7CiB1bnNpZ25lZCBsb25nIEhhc2hfc2l6ZSwgSGFzaF9tYXNrOwogdW5zaWduZWQgbG9uZyBfU0RSMTsKIAogdW5pb24gdWJhdCB7CQkJLyogQkFUIHJlZ2lzdGVyIHZhbHVlcyB0byBiZSBsb2FkZWQgKi8KLQlCQVQJYmF0OworCXN0cnVjdCBwcGNfYmF0IGJhdDsKIAl1MzIJd29yZFsyXTsKIH0gQkFUU1s4XVsyXTsJCQkvKiA4IHBhaXJzIG9mIElCQVQsIERCQVQgKi8KIApAQCAtMjQ1LDcgKzI0NCw3IEBACiAJY2FjaGVhYmxlX21lbXplcm8oSGFzaCwgSGFzaF9zaXplKTsKIAlfU0RSMSA9IF9fcGEoSGFzaCkgfCBTRFIxX0xPV19CSVRTOwogCi0JSGFzaF9lbmQgPSAoUFRFICopICgodW5zaWduZWQgbG9uZylIYXNoICsgSGFzaF9zaXplKTsKKwlIYXNoX2VuZCA9IChzdHJ1Y3QgaGFzaF9wdGUgKikgKCh1bnNpZ25lZCBsb25nKUhhc2ggKyBIYXNoX3NpemUpOwogCiAJcHJpbnRrKCJUb3RhbCBtZW1vcnkgPSAlbGRNQjsgdXNpbmcgJWxka0IgZm9yIGhhc2ggdGFibGUgKGF0ICVwKVxuIiwKIAkgICAgICAgdG90YWxfbWVtb3J5ID4+IDIwLCBIYXNoX3NpemUgPj4gMTAsIEhhc2gpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYyBiL2FyY2gvcG93ZXJwYy9tbS9zdGFiLmMKaW5kZXggMTMyYzZiYy4uMjg0OTJiYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCkBAIC01NSw3ICs1NSw3IEBACiAJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IDg7IGVudHJ5KyssIHN0ZSsrKSB7CiAJCQlpZiAoIShzdGUtPmVzaWRfZGF0YSAmIFNURV9FU0lEX1YpKSB7CiAJCQkJc3RlLT52c2lkX2RhdGEgPSB2c2lkX2RhdGE7Ci0JCQkJYXNtIHZvbGF0aWxlKCJlaWVpbyI6OjoibWVtb3J5Iik7CisJCQkJZWllaW8oKTsKIAkJCQlzdGUtPmVzaWRfZGF0YSA9IGVzaWRfZGF0YTsKIAkJCQlyZXR1cm4gKGdsb2JhbF9lbnRyeSB8IGVudHJ5KTsKIAkJCX0KQEAgLTEwMSw3ICsxMDEsNyBAQAogCWFzbSB2b2xhdGlsZSgic3luYyIgOiA6IDogIm1lbW9yeSIpOyAgICAvKiBPcmRlciB1cGRhdGUgKi8KIAogCWNhc3RvdXRfc3RlLT52c2lkX2RhdGEgPSB2c2lkX2RhdGE7Ci0JYXNtIHZvbGF0aWxlKCJlaWVpbyIgOiA6IDogIm1lbW9yeSIpOyAgIC8qIE9yZGVyIHVwZGF0ZSAqLworCWVpZWlvKCk7CQkJCS8qIE9yZGVyIHVwZGF0ZSAqLwogCWNhc3RvdXRfc3RlLT5lc2lkX2RhdGEgPSBlc2lkX2RhdGE7CiAKIAlhc20gdm9sYXRpbGUoInNsYmllICAlMCIgOiA6ICJyIiAob2xkX2VzaWQgPDwgU0lEX1NISUZUKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMKaW5kZXggNmE2OTQxNy4uMDZjN2U3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYwpAQCAtMTEsNyArMTEsNiBAQAogICogIE1vZGlmaWNhdGlvbnMgYnkgUGF1bCBNYWNrZXJyYXMgKFBvd2VyTWFjKSAocGF1bHVzQGNzLmFudS5lZHUuYXUpCiAgKiAgYW5kIENvcnQgRG91Z2FuIChQUmVQKSAoY29ydEBjcy5ubXQuZWR1KQogICogICAgQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCi0gKiAgQW1pZ2EvQVBVUyBjaGFuZ2VzIGJ5IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspLgogICoKICAqICBEZXJpdmVkIGZyb20gImFyY2gvaTM4Ni9tbS9pbml0LmMiCiAgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgIExpbnVzIFRvcnZhbGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKaW5kZXggMmJmYzRkNy4uY2JkMzRmYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwpAQCAtOCw3ICs4LDYgQEAKICAqICBNb2RpZmljYXRpb25zIGJ5IFBhdWwgTWFja2VycmFzIChQb3dlck1hYykgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQogICogIGFuZCBDb3J0IERvdWdhbiAoUFJlUCkgKGNvcnRAY3Mubm10LmVkdSkKICAqICAgIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcwotICogIEFtaWdhL0FQVVMgY2hhbmdlcyBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKS4KICAqCiAgKiAgRGVyaXZlZCBmcm9tICJhcmNoL2kzODYvbW0vaW5pdC5jIgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0ICBMaW51cyBUb3J2YWxkcwpAQCAtMjM5LDMgKzIzOCw1OSBAQAogCXB0ZV9mcmVlX3N1Ym1pdCgqYmF0Y2hwKTsKIAkqYmF0Y2hwID0gTlVMTDsKIH0KKworLyoqCisgKiBfX2ZsdXNoX2hhc2hfdGFibGVfcmFuZ2UgLSBGbHVzaCBhbGwgSFBURXMgZm9yIGEgZ2l2ZW4gYWRkcmVzcyByYW5nZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgaGFzaCB0YWJsZSAoYW5kIHRoZSBUTEIpLiBCdXQga2VlcHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW51eCBQVEVzIGludGFjdC4KKyAqCisgKiBAbW0JCTogbW1fc3RydWN0IG9mIHRoZSB0YXJnZXQgYWRkcmVzcyBzcGFjZSAoZ2VuZXJhbGx5IGluaXRfbW0pCisgKiBAc3RhcnQJOiBzdGFydGluZyBhZGRyZXNzCisgKiBAZW5kICAgICAgICAgOiBlbmRpbmcgYWRkcmVzcyAobm90IGluY2x1ZGVkIGluIHRoZSBmbHVzaCkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3RseSB0byBiZSB1c2VkIGJ5IHNvbWUgSU8gaG90cGx1ZyBjb2RlIGluIG9yZGVyCisgKiB0byByZW1vdmUgYWxsIGhhc2ggZW50cmllcyBmcm9tIGEgZ2l2ZW4gYWRkcmVzcyByYW5nZSB1c2VkIHRvIG1hcCBJTworICogc3BhY2Ugb24gYSByZW1vdmVkIFBDSS1QQ0kgYmlkZ2Ugd2l0aG91dCB0ZWFyaW5nIGRvd24gdGhlIGZ1bGwgbWFwcGluZworICogc2luY2UgNjRLIHBhZ2VzIG1heSBvdmVybGFwIHdpdGggb3RoZXIgYnJpZGdlcyB3aGVuIHVzaW5nIDY0SyBwYWdlcworICogd2l0aCA0SyBIVyBwYWdlcyBvbiBJTyBzcGFjZS4KKyAqCisgKiBCZWNhdXNlIG9mIHRoYXQgdXNhZ2UgcGF0dGVybiwgaXQncyBvbmx5IGF2YWlsYWJsZSB3aXRoIENPTkZJR19IT1RQTFVHCisgKiBhbmQgaXMgaW1wbGVtZW50ZWQgZm9yIHNtYWxsIHNpemUgcmF0aGVyIHRoYW4gc3BlZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfSE9UUExVRworCit2b2lkIF9fZmx1c2hfaGFzaF90YWJsZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdGFydCA9IF9BTElHTl9ET1dOKHN0YXJ0LCBQQUdFX1NJWkUpOworCWVuZCA9IF9BTElHTl9VUChlbmQsIFBBR0VfU0laRSk7CisKKwlCVUdfT04oIW1tLT5wZ2QpOworCisJLyogTm90ZTogTm9ybWFsbHksIHdlIHNob3VsZCBvbmx5IGV2ZXIgdXNlIGEgYmF0Y2ggd2l0aGluIGEKKwkgKiBQVEUgbG9ja2VkIHNlY3Rpb24uIFRoaXMgdmlvbGF0ZXMgdGhlIHJ1bGUsIGJ1dCB3aWxsIHdvcmsKKwkgKiBzaW5jZSB3ZSBkb24ndCBhY3R1YWxseSBtb2RpZnkgdGhlIFBURXMsIHdlIGp1c3QgZmx1c2ggdGhlCisJICogaGFzaCB3aGlsZSBsZWF2aW5nIHRoZSBQVEVzIGludGFjdCAoaW5jbHVkaW5nIHRoZWlyIHJlZmVyZW5jZQorCSAqIHRvIGJlaW5nIGhhc2hlZCkuIFRoaXMgaXMgbm90IHRoZSBtb3N0IHBlcmZvcm1hbmNlIG9yaWVudGVkCisJICogd2F5IHRvIGRvIHRoaW5ncyBidXQgaXMgZmluZSBmb3Igb3VyIG5lZWRzIGhlcmUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOworCWZvciAoOyBzdGFydCA8IGVuZDsgc3RhcnQgKz0gUEFHRV9TSVpFKSB7CisJCXB0ZV90ICpwdGVwID0gZmluZF9saW51eF9wdGUobW0tPnBnZCwgc3RhcnQpOworCQl1bnNpZ25lZCBsb25nIHB0ZTsKKworCQlpZiAocHRlcCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXB0ZSA9IHB0ZV92YWwoKnB0ZXApOworCQlpZiAoIShwdGUgJiBfUEFHRV9IQVNIUFRFKSkKKwkJCWNvbnRpbnVlOworCQlocHRlX25lZWRfZmx1c2gobW0sIHN0YXJ0LCBwdGVwLCBwdGUsIDApOworCX0KKwlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IGZlNTk3YTEuLmE3YzIwNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTEsNSArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQorICogQWRkZWQgbW1jcmFbc2xvdF0gc3VwcG9ydDoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IFdpbGwgU2NobWlkdCA8d2lsbHNjaG1AdXMuaWJtLmNvbT4sIElCTQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0xODEsMTEgKzE4MywxNyBAQAogICogT24gR1EgYW5kIG5ld2VyIHRoZSBNTUNSQSBzdG9yZXMgdGhlIEhWIGFuZCBQUiBiaXRzIGF0IHRoZSB0aW1lCiAgKiB0aGUgU0lBUiB3YXMgc2FtcGxlZC4gV2UgdXNlIHRoYXQgdG8gd29yayBvdXQgaWYgdGhlIFNJQVIgd2FzIHNhbXBsZWQgaW4KICAqIHRoZSBoeXBlcnZpc29yLCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgb3IgUlRBUy4KKyAqIElmIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBpcyBzZXQsIHdlIGNhbiB1c2UgdGhlIE1NQ1JBW3Nsb3RdIGJpdHMKKyAqIHRvIG1vcmUgYWNjdXJhdGVseSBpZGVudGlmeSB0aGUgYWRkcmVzcyBvZiB0aGUgc2FtcGxlZCBpbnN0cnVjdGlvbi4gVGhlCisgKiBtbWNyYVtzbG90XSBiaXRzIHJlcHJlc2VudCB0aGUgc2xvdCBudW1iZXIgb2YgYSBzYW1wbGVkIGluc3RydWN0aW9uCisgKiB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24gZ3JvdXAuICBUaGUgc2xvdCB3aWxsIGNvbnRhaW4gYSB2YWx1ZSBiZXR3ZWVuIDEKKyAqIGFuZCA1IGlmIE1NQ1JBX1NBTVBMRV9FTkFCTEUgaXMgc2V0LCBvdGhlcndpc2UgMC4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3BjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgcGMgPSBtZnNwcihTUFJOX1NJQVIpOwogCXVuc2lnbmVkIGxvbmcgbW1jcmE7CisJdW5zaWduZWQgbG9uZyBzbG90OwogCiAJLyogQ2FudCBkbyBtdWNoIGFib3V0IGl0ICovCiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX21tY3JhX3NpaHYpCkBAIC0xOTMsNiArMjAxLDEyIEBACiAKIAltbWNyYSA9IG1mc3ByKFNQUk5fTU1DUkEpOwogCisJaWYgKG1tY3JhICYgTU1DUkFfU0FNUExFX0VOQUJMRSkgeworCQlzbG90ID0gKChtbWNyYSAmIE1NQ1JBX1NMT1QpID4+IE1NQ1JBX1NMT1RfU0hJRlQpOworCQlpZiAoc2xvdCA+IDEpCisJCQlwYyArPSA0ICogKHNsb3QgLSAxKTsKKwl9CisKIAkvKiBXZXJlIHdlIGluIHRoZSBoeXBlcnZpc29yPyAqLwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpICYmCiAJICAgIChtbWNyYSAmIGN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW1jcmFfc2lodikpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvZWZpa2EuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCmluZGV4IGY1OTFhOWYuLjRiZTZlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9lZmlrYS5jCkBAIC01NCw3ICs1NCw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCi0JICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwkgICAgfCAoaG9zZS0+Z2xvYmFsX251bWJlciA8PCAyNCk7CiAJaW50IHJldCA9IC0xOwogCWludCBydmFsOwogCkBAIC02OSw3ICs2OSw3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXVuc2lnbmVkIGxvbmcgYWRkciA9IChvZmZzZXQgJiAweGZmKSB8ICgoZGV2Zm4gJiAweGZmKSA8PCA4KQogCSAgICB8ICgoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+Zmlyc3RfYnVzbm8pICYgMHhmZikgPDwgMTYpCi0JICAgIHwgKGhvc2UtPmluZGV4IDw8IDI0KTsKKwkgICAgfCAoaG9zZS0+Z2xvYmFsX251bWJlciA8PCAyNCk7CiAJaW50IHJ2YWw7CiAKIAlydmFsID0gcnRhc19jYWxsKHJ0YXNfdG9rZW4oIndyaXRlLXBjaS1jb25maWciKSwgMywgMSwgTlVMTCwKQEAgLTgzLDcgKzgzLDcgQEAKIH07CiAKIAotdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBlZmlrYV9wY2lzZXR1cCh2b2lkKQogewogCWNvbnN0IGludCAqYnVzX3JhbmdlOwogCWludCBsZW47CkBAIC0xMjgsNyArMTI4LDcgQEAKIAlwcmludGsoIiBjb250cm9sbGVkIGJ5ICVzXG4iLCBwY2ljdHJsLT5mdWxsX25hbWUpOwogCXByaW50aygiXG4iKTsKIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG9mX25vZGVfZ2V0KHBjaWN0cmwpKTsKIAlpZiAoIWhvc2UpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBFRklLQV9QTEFURk9STV9OQU1FCiAJCSAgICAgICAiOiBDYW4ndCBhbGxvY2F0ZSBQQ0kgY29udHJvbGxlciBzdHJ1Y3R1cmUgZm9yICVzXG4iLApAQCAtMTM2LDcgKzEzNiw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBvZl9ub2RlX2dldChwY2ljdHJsKTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZVswXTsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlWzFdOwogCWhvc2UtPm9wcyA9ICZydGFzX3BjaV9vcHM7CkBAIC0xNDUsNyArMTQ0LDcgQEAKIH0KIAogI2Vsc2UKLXZvaWQgX19pbml0IGVmaWthX3BjaXNldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZWZpa2FfcGNpc2V0dXAodm9pZCkKIHt9CiAjZW5kaWYKIApAQCAtMjUyLDYgKzI1MSw4IEBACiAJLnByb2dyZXNzCQk9IHJ0YXNfcHJvZ3Jlc3MsCiAJLmdldF9ib290X3RpbWUJCT0gcnRhc19nZXRfYm9vdF90aW1lLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorI2lmZGVmIENPTkZJR19QQ0kKIAkucGh5c19tZW1fYWNjZXNzX3Byb3QJPSBwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3QsCisjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9saXRlNTIwMC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKaW5kZXggMWNmYzAwZC4uNWM0NmU4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L2xpdGU1MjAwLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiB9CiAKLXZvaWQgbGl0ZTUyMDBfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3N0YXRpYyB2b2lkIGxpdGU1MjAwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc3RydWN0IGRldmljZV9ub2RlKiBucCA9IG9mX2ZpbmRfYWxsX25vZGVzKE5VTEwpOwogCWNvbnN0IGNoYXIgKm1vZGVsID0gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKaW5kZXggMzRkMzRhMi4uNGM2YzgyYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGNpLmMKQEAgLTExMiwxOCArMTEyLDE4IEBACiAJdTMyIHZhbHVlOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCiAJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsCiAJCSgxIDw8IDMxKSB8Ci0JCSgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikgfAorCQkoYnVzLT5udW1iZXIgPDwgMTYpIHwKIAkJKGRldmZuIDw8IDgpIHwKIAkJKG9mZnNldCAmIDB4ZmMpKTsKIAltYigpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX01QQzUyMDBfQlVHRklYKQotCWlmIChidXMtPm51bWJlciAhPSBob3NlLT5idXNfb2Zmc2V0KSB7CisJaWYgKGJ1cy0+bnVtYmVyKSB7CiAJCS8qIHdvcmthcm91bmQgZm9yIHRoZSBidWcgNDM1IG9mIHRoZSBNUEM1MjAwIChMMjVSKTsKIAkJICogRG9uJ3QgZG8gMzIgYml0cyBjb25maWcgYWNjZXNzIGR1cmluZyB0eXBlLTEgY3ljbGVzICovCiAJCXN3aXRjaCAobGVuKSB7CkBAIC0xNjksMTggKzE2OSwxOCBAQAogCXUzMiB2YWx1ZSwgbWFzazsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAogCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyLAogCQkoMSA8PCAzMSkgfAotCQkoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpIHwKKwkJKGJ1cy0+bnVtYmVyIDw8IDE2KSB8CiAJCShkZXZmbiA8PCA4KSB8CiAJCShvZmZzZXQgJiAweGZjKSk7CiAJbWIoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19NUEM1MjAwX0JVR0ZJWCkKLQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+YnVzX29mZnNldCkgeworCWlmIChidXMtPm51bWJlcikgewogCQkvKiB3b3JrYXJvdW5kIGZvciB0aGUgYnVnIDQzNSBvZiB0aGUgTVBDNTIwMCAoTDI1Uik7CiAJCSAqIERvbid0IGRvIDMyIGJpdHMgY29uZmlnIGFjY2VzcyBkdXJpbmcgdHlwZS0xIGN5Y2xlcyAqLwogCQlzd2l0Y2ggKGxlbikgewpAQCAtMzg1LDE3ICszODUsMTMgQEAKIAkgKiB0cmVlIGFyZSBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSA1Mnh4IFBDSSBjb250cm9sbGVyLiAgUmF0aGVyCiAJICogdGhhbiBwYXJzZSB0aGUgdHJlZSBoZXJlLCBsZXQgcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcygpCiAJICogZG8gaXQgZm9yIHVzIGFuZCBleHRyYWN0IHRoZSB2YWx1ZXMgYWZ0ZXIgdGhlIGZhY3QgKi8KLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihub2RlKTsKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaG9zZS0+YXJjaF9kYXRhID0gbm9kZTsKLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwotCiAJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMF0gOiAwOwogCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZmOwogCi0JaG9zZS0+YnVzX29mZnNldCA9IDA7CiAJaG9zZS0+b3BzID0gJm1wYzUyeHhfcGNpX29wczsKIAogCXBjaV9yZWdzID0gaW9yZW1hcChyc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9wbS5jCmluZGV4IGZkNDAwNDQuLmVlMmU3NjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9tcGM1Mnh4X3BtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcG0uYwpAQCAtOSw4ICs5LDggQEAKIAogCiAvKiB0aGVzZSBhcmUgZGVmaW5lZCBpbiBtcGM1Mnh4X3NsZWVwLlMsIGFuZCBvbmx5IHVzZWQgaGVyZSAqLwotZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kZWVwX3NsZWVwKHZvaWQgKnNyYW0sIHZvaWQgKnNkcmFtX3JlZ3MsCi0JCXN0cnVjdCBtcGM1Mnh4X2NkbSAqLCBzdHJ1Y3QgbXBjNTJ4eF9pbnRyICopOworZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kZWVwX3NsZWVwKHZvaWQgX19pb21lbSAqc3JhbSwgdm9pZCBfX2lvbWVtICpzZHJhbV9yZWdzLAorCQlzdHJ1Y3QgbXBjNTJ4eF9jZG0gX19pb21lbSAqLCBzdHJ1Y3QgbXBjNTJ4eF9pbnRyIF9faW9tZW0qKTsKIGV4dGVybiB2b2lkIG1wYzUyeHhfZHNfc3JhbSh2b2lkKTsKIGV4dGVybiBjb25zdCBsb25nIG1wYzUyeHhfZHNfc3JhbV9zaXplOwogZXh0ZXJuIHZvaWQgbXBjNTJ4eF9kc19jYWNoZWQodm9pZCk7CkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfY2RtIF9faW9tZW0gKmNkbTsKIHN0YXRpYyBzdHJ1Y3QgbXBjNTJ4eF9pbnRyIF9faW9tZW0gKmludHI7CiBzdGF0aWMgc3RydWN0IG1wYzUyeHhfZ3Bpb193a3VwIF9faW9tZW0gKmdwaW93Owotc3RhdGljIHZvaWQgKnNyYW07CitzdGF0aWMgdm9pZCBfX2lvbWVtICpzcmFtOwogc3RhdGljIGludCBzcmFtX3NpemU7CiAKIHN0cnVjdCBtcGM1Mnh4X3N1c3BlbmQgbXBjNTJ4eF9zdXNwZW5kOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJdTMyIGNsa19lbmFibGVzOwogCXUzMiBtc3IsIGhpZDA7CiAJdTMyIGludHJfbWFpbl9tYXNrOwotCXZvaWQgX19pb21lbSAqIGlycV8weDUwMCA9ICh2b2lkICopQ09ORklHX0tFUk5FTF9TVEFSVCArIDB4NTAwOworCXZvaWQgX19pb21lbSAqIGlycV8weDUwMCA9ICh2b2lkIF9faW9tZW0gKilDT05GSUdfS0VSTkVMX1NUQVJUICsgMHg1MDA7CiAJdW5zaWduZWQgbG9uZyBpcnFfMHg1MDBfc3RvcCA9ICh1bnNpZ25lZCBsb25nKWlycV8weDUwMCArIG1wYzUyeHhfZHNfY2FjaGVkX3NpemU7CiAJY2hhciBzYXZlZF8weDUwMFttcGM1Mnh4X2RzX2NhY2hlZF9zaXplXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwppbmRleCBkZTdmY2U5Li44OWZkZTQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIGNob2ljZQotCXByb21wdCAiTWFjaGluZSBUeXBlIgorCXByb21wdCAiODJ4eCBCb2FyZCBUeXBlIgogCWRlcGVuZHMgb24gUFBDXzgyeHgKIAlkZWZhdWx0IE1QQzgyeHhfQURTCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4Mnh4X2Fkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKaW5kZXggNDdjYjA5Zi4uZGEyMDgzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L21wYzgyeHhfYWRzLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CiAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgotI2luY2x1ZGUgPC4uL3N5c2Rldi9jcG0yX3BpYy5oPgorI2luY2x1ZGUgPHN5c2Rldi9jcG0yX3BpYy5oPgogCiAjaW5jbHVkZSAicHEyYWRzLmgiCiAKQEAgLTUwNyw3ICs1MDcsOCBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIGludCBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtODJ4eF9wY2lfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCSAgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtNTE1LDcgKzUxNiw3IEBACiAJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CiAKLXZvaWQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM4Mnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTU0MiwxOSArNTQzLDEzIEBACiAKIAlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihucCk7CiAKIAlpZiAoIWhvc2UpCiAJCXJldHVybjsKIAotCWhvc2UtPmFyY2hfZGF0YSA9IG5wOwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7Ci0KIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0JaG9zZS0+YnVzX29mZnNldCA9IDA7Ci0KLQlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOwogCiAJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsCiAJCQkgICByLnN0YXJ0ICsgb2Zmc2V0b2YocGNpX2NwbTJfdCwgcGNpX2NmZ19hZGRyKSwKQEAgLTU4NCw3ICs1NzksNyBAQAogI2lmZGVmIENPTkZJR19QQ0kKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbTgyeHhfcGNpX2V4Y2x1ZGVfZGV2aWNlOwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgyeHhfYWRkX2JyaWRnZShucCk7CiAKIAlvZl9ub2RlX3B1dChucCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKaW5kZXggMTljYWZkZi4uZWMzMDVmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjgzeHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184M3h4CiAJZGVmYXVsdCBNUEM4MzR4X01EUwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvTWFrZWZpbGUKaW5kZXggMzFhOTFiNS4uNWE5OGY4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBQb3dlclBDIDgzeHggbGludXgga2VybmVsLgogIwotb2JqLXkJCQkJOj0gbWlzYy5vCitvYmoteQkJCQk6PSBtaXNjLm8gdXNiLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubwogb2JqLSQoQ09ORklHX01QQzgzMTNfUkRCKQkrPSBtcGM4MzEzX3JkYi5vCiBvYmotJChDT05GSUdfTVBDODMyeF9SREIpCSs9IG1wYzgzMnhfcmRiLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzEzX3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKaW5kZXggOTY5NzBhYy4uM2VkZmUxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMTNfcmRiLmMKQEAgLTI4LDExICsyOCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC00OSwxMCArNDQsMTEgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKKwltcGM4MzF4X3VzYl9jZmcoKTsKIH0KIAogdm9pZCBfX2luaXQgbXBjODMxM19yZGJfaW5pdF9JUlEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKaW5kZXggOTQ4NDNlZC4uYjM5Y2I1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMKQEAgLTQ5LDExICs0OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiBzdGF0aWMgdTggKmJjc3JfcmVncyA9IE5VTEw7CiAKIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODAsNyArNzUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwppbmRleCAzZGI2OGI3Li5iMmIyOGE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwpAQCAtMzIsMTEgKzMyLDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKQEAgLTUzLDcgKzQ4LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwogCiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKaW5kZXggNDBhMDE5NC4uNDdiYTU0NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKQEAgLTM4LDExICszOCw2IEBACiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci0jZW5kaWYKLQogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQpAQCAtNTksMTAgKzU0LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCisKKwltcGM4MzR4X3VzYl9jZmcoKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNHhfaXR4X2luaXRfSVJRKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9tZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCmluZGV4IDEwMzk0YjIuLjRjOWZmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jCkBAIC0zOCw2MSArMzgsMTcgQEAKIAogI2luY2x1ZGUgIm1wYzgzeHguaCIKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAjZGVmaW5lIEJDU1I1X0lOVF9VU0IJCTB4MDIKLS8qIE5vdGU6IFRoaXMgaXMgb25seSBmb3IgUEIsIG5vdCBmb3IgUEIrUElCCi0gKiBPbiBQQiBvbmx5IHBvcnQwIGlzIGNvbm5lY3RlZCB1c2luZyBVTFBJICovCi1zdGF0aWMgaW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQorc3RhdGljIGludCBtcGM4MzR4ZW1kc191c2JfY2ZnKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzY2NyLCBzaWNybDsKLQl2b2lkIF9faW9tZW0gKmltbWFwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJdm9pZCBfX2lvbWVtICpiY3NyX3JlZ3MgPSBOVUxMOwogCXU4IGJjc3I1OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwotCWludCBwb3J0MF9pc19kciA9IDA7CiAKLQlpZiAoKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpKSAhPSBOVUxMKQotCQlwb3J0MF9pc19kciA9IDE7Ci0JaWYgKChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsICJ1c2IiLCAiZnNsLXVzYjItbXBoIikpICE9IE5VTEwpewotCQlpZiAocG9ydDBfaXNfZHIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiVGhlcmUgaXMgb25seSBvbmUgVVNCIHBvcnQgb24gUEIgYm9hcmQhIFxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSBpZiAoIXBvcnQwX2lzX2RyKQotCQkJLyogTm8gdXNiIHBvcnQgZW5hYmxlZCAqLwotCQkJcmV0dXJuIC0xOwotCX0KLQotCWltbWFwID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSwgMHgxMDAwKTsKLQlpZiAoIWltbWFwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb25maWd1cmUgY2xvY2sgKi8KLQlzY2NyID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTKTsKLQlpZiAocG9ydDBfaXNfZHIpCi0JCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCi0JZWxzZQotCQlzY2NyIHw9IE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTE7IC8qIDE6MyAqLwotCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHNjY3IpOwotCi0JLyogQ29uZmlndXJlIFBpbiAqLwotCXNpY3JsID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7Ci0JLyogc2V0IHBvcnQwIG9ubHkgKi8KLQlpZiAocG9ydDBfaXNfZHIpCi0JCXNpY3JsIHw9IE1QQzgzWFhfU0lDUkxfVVNCMDsKLQllbHNlCi0JCXNpY3JsICY9IH4oTVBDODNYWF9TSUNSTF9VU0IwKTsKLQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOwotCi0JaW91bm1hcChpbW1hcCk7Ci0KKwltcGM4MzR4X3VzYl9jZmcoKTsKIAkvKiBNYXAgQkNTUiBhcmVhICovCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiYmNzciIpOwotCWlmIChucCAhPSAwKSB7CisJaWYgKG5wKSB7CiAJCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAkJb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC0xMjksMTIgKzg1LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiAKLQltcGM4MzR4X3VzYl9jZmcoKTsKKwltcGM4MzR4ZW1kc191c2JfY2ZnKCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzR4X21kc19pbml0X0lSUSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwppbmRleCBiY2VlZmY4Li4wZTYxNWZkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwpAQCAtNTUsMTEgKzU1LDYgQEAKICNkZWZpbmUgREJHKGZtdC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyB1OCAqYmNzcl9yZWdzID0gTlVMTDsKIAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04Niw3ICs4MSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODN4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaAppbmRleCA5Y2QwM2I1Li41ODllZTU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKQEAgLTMsOSArMywxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAKIC8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9PRkZTICAgICAgICAgIDB4QTA4CisjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTUFTSyAgICAgIDB4MDBmMDAwMDAKICNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9NUEhDTV8xMSAgMHgwMGMwMDAwMAogI2RlZmluZSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzAxICAweDAwNDAwMDAwCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfTVBIQ01fMTAgIDB4MDA4MDAwMDAKQEAgLTE1LDIxICsxNyw0MyBAQAogCiAvKiBzeXN0ZW0gaS9vIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgbG93ICovCiAjZGVmaW5lIE1QQzgzWFhfU0lDUkxfT0ZGUyAgICAgICAgIDB4MTE0Ci0jZGVmaW5lIE1QQzgzWFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgTVBDODNYWF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JMX1VTQl9NQVNLICAgICAweDYwMDAwMDAwCisjZGVmaW5lIE1QQzgzNFhfU0lDUkxfVVNCMCAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgTVBDODM0WF9TSUNSTF9VU0IxICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBNUEM4MzFYX1NJQ1JMX1VTQl9NQVNLICAgICAweDAwMDAwYzAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkxfVVNCX1VMUEkgICAgIDB4MDAwMDA4MDAKIAogLyogc3lzdGVtIGkvbyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGhpZ2ggKi8KICNkZWZpbmUgTVBDODNYWF9TSUNSSF9PRkZTICAgICAgICAgMHgxMTgKLSNkZWZpbmUgTVBDODNYWF9TSUNSSF9VU0JfVVRNSSAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JICAgICAweDAwMDIwMDAwCisjZGVmaW5lIE1QQzgzMVhfU0lDUkhfVVNCX01BU0sgICAgIDB4MDAwMDAwZTAKKyNkZWZpbmUgTVBDODMxWF9TSUNSSF9VU0JfVUxQSSAgICAgMHgwMDAwMDBhMAorCisvKiBVU0IgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBGU0xfVVNCMl9DT05UUk9MX09GRlMgICAgICAweDUwMAorI2RlZmluZSBDT05UUk9MX1VUTUlfUEhZX0VOICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIENPTlRST0xfUkVGU0VMXzQ4TUhaICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJICAgMHgwMDAwMDQwMAorI2RlZmluZSBDT05UUk9MX09UR19QT1JUICAgICAgICAgICAweDAwMDAwMDIwCisKKy8qIFVTQiBQT1JUU0MgUmVnaXN0ZXJzICovCisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzFfT0ZGUyAgICAgIDB4MTg0CisjZGVmaW5lIEZTTF9VU0IyX1BPUlRTQzJfT0ZGUyAgICAgIDB4MTg4CisjZGVmaW5lIFBPUlRTQ1hfUFRXXzE2QklUICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgUE9SVFNDWF9QVFNfVVRNSSAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQT1JUU0NYX1BUU19VTFBJICAgICAgICAgICAweDgwMDAwMDAwCiAKIC8qCiAgKiBEZWNsYXJhdGlvbiBmb3IgdGhlIHZhcmlvdXMgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZQogICogbXBjODN4eF8qIGZpbGVzLiBNb3N0bHkgZm9yIHVzZSBieSBtcGM4M3h4X3NldHVwCiAgKi8KIAotZXh0ZXJuIGludCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKLWV4dGVybiBpbnQgbXBjODN4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOworZXh0ZXJuIGludCBtcGM4M3h4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4M3h4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHVfY2hhciBidXMsIHVfY2hhciBkZXZmbik7CiBleHRlcm4gdm9pZCBtcGM4M3h4X3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiBsb25nIG1wYzgzeHhfdGltZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CitleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKIAogI2VuZGlmCQkJCS8qIF9fTVBDODNYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9wY2kuYwppbmRleCA3NzQ0NTdkLi5jMGUyYjg5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3BjaS5jCkBAIC0zMywxOSArMzMsMTQgQEAKICNkZWZpbmUgREJHKHguLi4pCiAjZW5kaWYKIAotaW50IG1wYzgzeHhfcGNpMl9idXNubzsKLQotaW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzgzeHhfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODN4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4M3h4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1pbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCitpbnQgX19pbml0IG1wYzgzeHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKIHsKIAlpbnQgbGVuOwogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKQEAgLTY2LDExICs2MSwxMCBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlwY2lfYXNzaWduX2FsbF9idXNlcyA9IDE7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwotCWhvc2UtPnNldF9jZmdfdHlwZSA9IDE7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CkBAIC04Niw4ICs4MCw2IEBACiAJaWYgKChyc3JjLnN0YXJ0ICYgMHhmZmZmZikgPT0gMHg4NjAwKSB7CiAJCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCBpbW1yICsgMHg4MzgwLCBpbW1yICsgMHg4Mzg0KTsKIAkJcHJpbWFyeSA9IDA7Ci0JCWhvc2UtPmJ1c19vZmZzZXQgPSBob3NlLT5maXJzdF9idXNubzsKLQkJbXBjODN4eF9wY2kyX2J1c25vID0gaG9zZS0+Zmlyc3RfYnVzbm87CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODN4eCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZGYwMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC91c2IuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIEZyZWVzY2FsZSA4M3h4IFVTQiBTT0Mgc2V0dXAgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBMaSBZYW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODN4eC5oIgorCisKKyNpZmRlZiBDT05GSUdfTVBDODM0eAoraW50IG1wYzgzNHhfdXNiX2NmZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2Njciwgc2ljcmwsIHNpY3JoOworCXZvaWQgX19pb21lbSAqaW1tYXA7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJaW50IHBvcnQwX2lzX2RyID0gMCwgcG9ydDFfaXNfZHIgPSAwOworCWNvbnN0IHZvaWQgKnByb3AsICpkcl9tb2RlOworCisJaW1tYXAgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpLCAweDEwMDApOworCWlmICghaW1tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVhZCByZWdpc3RlcnMgKi8KKwkvKiBOb3RlOiBEUiBhbmQgTVBIIG11c3QgdXNlIHRoZSBzYW1lIGNsb2NrIHNldHRpbmcgaW4gU0NDUiAqLworCXNjY3IgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpICYgfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwlzaWNybCA9IGluX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMpICYgfk1QQzgzNFhfU0lDUkxfVVNCX01BU0s7CisJc2ljcmggPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKSAmIH5NUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCAidXNiIiwgImZzbC11c2IyLWRyIik7CisJaWYgKG5wKSB7CisJCXNjY3IgfD0gTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzExOyAgLyogMTozICovCisKKwkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBoeV90eXBlIiwgTlVMTCk7CisJCWlmIChwcm9wICYmICghc3RyY21wKHByb3AsICJ1dG1pIikgfHwKKwkJCQkJIXN0cmNtcChwcm9wLCAidXRtaV93aWRlIikpKSB7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjAgfCBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCQlzaWNyaCB8PSBNUEM4MzRYX1NJQ1JIX1VTQl9VVE1JOworCQkJcG9ydDFfaXNfZHIgPSAxOworCQl9IGVsc2UgaWYgKHByb3AgJiYgIXN0cmNtcChwcm9wLCAic2VyaWFsIikpIHsKKwkJCWRyX21vZGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkcl9tb2RlIiwgTlVMTCk7CisJCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMCB8IE1QQzgzNFhfU0lDUkxfVVNCMTsKKwkJCQlwb3J0MV9pc19kciA9IDE7CisJCQl9IGVsc2UgeworCQkJCXNpY3JsIHw9IE1QQzgzNFhfU0lDUkxfVVNCMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwcm9wICYmICFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiODM0eCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCX0KKwkJcG9ydDBfaXNfZHIgPSAxOworCQlvZl9ub2RlX3B1dChucCk7CisJfQorCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1tcGgiKTsKKwlpZiAobnApIHsKKwkJc2NjciB8PSBNUEM4M1hYX1NDQ1JfVVNCX01QSENNXzExOyAvKiAxOjMgKi8KKworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicG9ydDAiLCBOVUxMKTsKKwkJaWYgKHByb3ApIHsKKwkJCWlmIChwb3J0MF9pc19kcikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSI4MzR4IFVTQiBwb3J0MCBjYW4ndCBiZSB1c2VkIGJ5IGJvdGggRFIgYW5kIE1QSCFcbiIpOworCQkJc2ljcmwgfD0gTVBDODM0WF9TSUNSTF9VU0IwOworCQl9CisJCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwb3J0MSIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJaWYgKHBvcnQxX2lzX2RyKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJIjgzNHggVVNCIHBvcnQxIGNhbid0IGJlIHVzZWQgYnkgYm90aCBEUiBhbmQgTVBIIVxuIik7CisJCQlzaWNybCB8PSBNUEM4MzRYX1NJQ1JMX1VTQjE7CisJCX0KKwkJb2Zfbm9kZV9wdXQobnApOworCX0KKworCS8qIFdyaXRlIGJhY2sgKi8KKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0NDUl9PRkZTLCBzY2NyKTsKKwlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUywgc2ljcmwpOworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTLCBzaWNyaCk7CisKKwlpb3VubWFwKGltbWFwKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTVBDODM0eCAqLworCisjaWZkZWYgQ09ORklHX1BQQ19NUEM4MzF4CitpbnQgbXBjODMxeF91c2JfY2ZnKHZvaWQpCit7CisJdTMyIHRlbXA7CisJdm9pZCBfX2lvbWVtICppbW1hcCwgKnVzYl9yZWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCWNvbnN0IHZvaWQgKnByb3A7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0ID0gMDsKKyNpZmRlZiBDT05GSUdfVVNCX09URworCWNvbnN0IHZvaWQgKmRyX21vZGU7CisjZW5kaWYKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgInVzYiIsICJmc2wtdXNiMi1kciIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHlfdHlwZSIsIE5VTEwpOworCisJLyogTWFwIElNTVIgc3BhY2UgZm9yIHBpbiBhbmQgY2xvY2sgc2V0dGluZ3MgKi8KKwlpbW1hcCA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCksIDB4MTAwMCk7CisJaWYgKCFpbW1hcCkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIENvbmZpZ3VyZSBjbG9jayAqLworCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpOworCXRlbXAgJj0gfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKKwl0ZW1wIHw9IE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMTsgIC8qIDE6MyAqLworCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHRlbXApOworCisJLyogQ29uZmlndXJlIHBpbiBtdXggZm9yIFVMUEkuICBUaGVyZSBpcyBubyBwaW4gbXV4IGZvciBVVE1JICovCisJaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQl0ZW1wID0gaW5fYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkxfT0ZGUyk7CisJCXRlbXAgJj0gfk1QQzgzMVhfU0lDUkxfVVNCX01BU0s7CisJCXRlbXAgfD0gTVBDODMxWF9TSUNSTF9VU0JfVUxQSTsKKwkJb3V0X2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NJQ1JMX09GRlMsIHRlbXApOworCisJCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TSUNSSF9PRkZTKTsKKwkJdGVtcCAmPSB+TVBDODMxWF9TSUNSSF9VU0JfTUFTSzsKKwkJdGVtcCB8PSBNUEM4MzFYX1NJQ1JIX1VTQl9VTFBJOworCQlvdXRfYmUzMihpbW1hcCArIE1QQzgzWFhfU0lDUkhfT0ZGUywgdGVtcCk7CisJfQorCisJaW91bm1hcChpbW1hcCk7CisKKwkvKiBNYXAgVVNCIFNPQyBzcGFjZSAqLworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChyZXQpIHsKKwkJb2Zfbm9kZV9wdXQobnApOworCQlyZXR1cm4gcmV0OworCX0KKwl1c2JfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7CisKKwkvKiBVc2luZyBvbi1jaGlwIFBIWSAqLworCWlmICghc3RyY21wKHByb3AsICJ1dG1pX3dpZGUiKSB8fAorCQkJIXN0cmNtcChwcm9wLCAidXRtaSIpKSB7CisJCS8qIFNldCBVVE1JX1BIWV9FTiwgUkVGU0VMIHRvIDQ4TUhaICovCisJCW91dF9iZTMyKHVzYl9yZWdzICsgRlNMX1VTQjJfQ09OVFJPTF9PRkZTLAorCQkJCUNPTlRST0xfVVRNSV9QSFlfRU4gfCBDT05UUk9MX1JFRlNFTF80OE1IWik7CisJLyogVXNpbmcgZXh0ZXJuYWwgVVBMSSBQSFkgKi8KKwl9IGVsc2UgaWYgKCFzdHJjbXAocHJvcCwgInVscGkiKSkgeworCQkvKiBTZXQgUEhZX0NMS19TRUwgdG8gVUxQSSAqLworCQl0ZW1wID0gQ09OVFJPTF9QSFlfQ0xLX1NFTF9VTFBJOworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJCS8qIFNldCBPVEdfUE9SVCAqLworCQlkcl9tb2RlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZHJfbW9kZSIsIE5VTEwpOworCQlpZiAoZHJfbW9kZSAmJiAhc3RyY21wKGRyX21vZGUsICJvdGciKSkKKwkJCXRlbXAgfD0gQ09OVFJPTF9PVEdfUE9SVDsKKyNlbmRpZiAvKiBDT05GSUdfVVNCX09URyAqLworCQlvdXRfYmUzMih1c2JfcmVncyArIEZTTF9VU0IyX0NPTlRST0xfT0ZGUywgdGVtcCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiODMxeCBVU0IgUEhZIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaW91bm1hcCh1c2JfcmVncyk7CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NUEM4MzF4ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21pc2MuYwppbmRleCAzZTYyZmNiLi40ZmUzNzZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbWlzYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9taXNjLmMKQEAgLTEzLDExICsxMyw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKK3N0YXRpYyBfX2JlMzIgX19pb21lbSAqcnN0Y3I7CiAKIGV4dGVybiB2b2lkIGFib3J0KHZvaWQpOwogCitzdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4X3JzdGNyKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJnbG9iYWwtdXRpbGl0aWVzIik7CisJaWYgKChucCAmJiBvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsaGFzLXJzdGNyIiwgTlVMTCkpKSB7CisJCWNvbnN0IHUzMiAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJLyogbWFwIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqIDB4RTAwQjAgaXMgb2Zmc2V0IG9mIHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIKKwkJCSAqLworCQkJcnN0Y3IgPSBpb3JlbWFwKGdldF9pbW1yYmFzZSgpICsgKnByb3AgKyAweEIwLCAweGZmKTsKKwkJCWlmICghcnN0Y3IpCisJCQkJcHJpbnRrIChLRVJOX0VNRVJHICJFcnJvcjogcmVzZXQgY29udHJvbCAiCisJCQkJCQkicmVnaXN0ZXIgbm90IG1hcHBlZCFcbiIpOworCQl9CisJfSBlbHNlCisJCXByaW50ayAoS0VSTl9JTkZPICJyc3RjciBjb21wYXRpYmxlIHJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0IVxuIik7CisJaWYgKG5wKQorCQlvZl9ub2RlX3B1dChucCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwobXBjODV4eF9yc3Rjcik7CisKIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKmNtZCkKIHsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmIChyc3RjcikKKwkJLyogc2V0IHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkJb3V0X2JlMzIocnN0Y3IsIDB4Mik7CS8qIEhSRVNFVF9SRVEgKi8KIAlhYm9ydCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQ0X2RzLmMKaW5kZXggYmVjODRmZi4uNmZiOTBhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDRfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0NF9kcy5jCkBAIC02MSwyNCArNjEsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEFsbG9jIG1waWMgc3RydWN0dXJlIGFuZCBwZXIgaXN1IGhhcyAxNiBJTlQgZW50cmllcy4gKi8KIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCSAgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKLQkJCSAgMTYsIDY0LCAiIE9QRU5QSUMgICAgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCi0JLyoKLQkgKiA0OCBJbnRlcm5hbCBJbnRlcnJ1cHRzCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0KLQkvKgotCSAqIDE2IEV4dGVybmFsIGludGVycnVwdHMKLQkgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgci5zdGFydCArIDB4MTAwMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmgKaW5kZXggODM0MTVkYi4uNzI4NmZmYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCkBAIC0xNSw0ICsxNSw0IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQgbXBjODV4eF9yZXN0YXJ0KGNoYXIgKik7Ci1leHRlcm4gaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworZXh0ZXJuIGludCBtcGM4NXh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwppbmRleCA1ZDI3NjIxLi43MjM1ZjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYwpAQCAtMzgsMTMgKzM4LDkgQEAKICNpbmNsdWRlIDxhc20vZnNfcGQuaD4KICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQorc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpAQCAtOTEsMzAgKzg3LDEwIEBACiAKIAltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKIAkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCi0JCQk0LCAwLCAiIE9wZW5QSUMgICIpOworCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCW9mX25vZGVfcHV0KG5wKTsKIAotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCByLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHIuc3RhcnQgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgci5zdGFydCArIDB4MTAzMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAzLCByLnN0YXJ0ICsgMHgxMDM4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDQsIHIuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgci5zdGFydCArIDB4MTA0ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA2LCByLnN0YXJ0ICsgMHgxMDUwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDcsIHIuc3RhcnQgKyAweDEwNTgwKTsKLQotCS8qIFVudXNlZCBvbiB0aGlzIHBsYXRmb3JtIChsZWF2ZSByb29tIGZvciA4NTQ4KSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19DUE0yCkBAIC0yNDEsNyArMjE3LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSkgIT0gTlVMTDspCi0JCWFkZF9icmlkZ2UobnApOworCQltcGM4NXh4X2FkZF9icmlkZ2UobnApOwogCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDE0OTBlYjMuLjUwYzhkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC00NywxMSArNDcsNiBAQAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSAibXBjODV4eC5oIgogCi0jaWZuZGVmIENPTkZJR19QQ0kKLXVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2UgPSAwOwotdW5zaWduZWQgbG9uZyBpc2FfbWVtX2Jhc2UgPSAwOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgY2RzX3BjaV9zbG90ID0gMjsKIHN0YXRpYyB2b2xhdGlsZSB1OCAqY2FkbXVzOwogCkBAIC02MCwxNSArNTUsMTEgQEAKICNkZWZpbmUgQVJDQURJQV9IT1NUX0JSSURHRV9JRFNFTAkxNwogI2RlZmluZSBBUkNBRElBXzJORF9CUklER0VfSURTRUwJMwogCi1leHRlcm4gaW50IG1wYzg1eHhfcGNpMl9idXNubzsKLQotc3RhdGljIGludCBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3N0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7Ci0JaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQorCWlmICgoYnVzID09IGhvc2UtPmZpcnN0X2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQlpZiAobXBjODV4eF9wY2kyX2J1c25vKQotCQlpZiAoYnVzID09IChtcGM4NXh4X3BjaTJfYnVzbm8pICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQotCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkvKiBXZSBleHBsaWNpdGx5IGRvIG5vdCBnbyBwYXN0IHRoZSBUdW5kcmEgMzIwIEJyaWRnZSAqLwogCWlmICgoYnVzID09IDEpICYmIChQQ0lfU0xPVChkZXZmbikgPT0gQVJDQURJQV8yTkRfQlJJREdFX0lEU0VMKSkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKQEAgLTc4LDUyICs2OSw0NCBAQAogCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OwotCXVfY2hhcgkJYzsKKwl1X2NoYXIgYzsKKwlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9WSUEpIHsKKwkJc3dpdGNoIChkZXYtPmRldmljZSkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xOgorCQkJLyoKKwkJCSAqIFUtQm9vdCBkb2VzIG5vdCBzZXQgdGhlIGVuYWJsZSBiaXRzCisJCQkgKiBmb3IgdGhlIElERSBkZXZpY2UuIEZvcmNlIHRoZW0gb24gaGVyZS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQwLCAmYyk7CisJCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgYyk7CiAKLQlpZiAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLAotCQkJCQlQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMSwgTlVMTCkpKSB7CisJCQkvKgorCQkJICogU2luY2Ugb25seSBwcmltYXJ5IGludGVyZmFjZSB3b3JrcywgZm9yY2UgdGhlCisJCQkgKiBJREUgZnVuY3Rpb24gdG8gc3RhbmRhcmQgcHJpbWFyeSBJREUgaW50ZXJydXB0CisJCQkgKiB3LyA4MjU5IG9mZnNldAorCQkJICovCisJCQlkZXYtPmlycSA9IDE0OworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCQlicmVhazsKIAkJLyoKLQkJICogVS1Cb290IGRvZXMgbm90IHNldCB0aGUgZW5hYmxlIGJpdHMKLQkJICogZm9yIHRoZSBJREUgZGV2aWNlLiBGb3JjZSB0aGVtIG9uIGhlcmUuCisJCSAqIEZvcmNlIGxlZ2FjeSBVU0IgaW50ZXJydXB0IHJvdXRpbmcKIAkJICovCi0JCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgJmMpOwotCQljIHw9IDB4MDM7IC8qIElERTogQ2hpcCBFbmFibGUgQml0cyAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQwLCBjKTsKLQotCQkvKgotCQkgKiBTaW5jZSBvbmx5IHByaW1hcnkgaW50ZXJmYWNlIHdvcmtzLCBmb3JjZSB0aGUKLQkJICogSURFIGZ1bmN0aW9uIHRvIHN0YW5kYXJkIHByaW1hcnkgSURFIGludGVycnVwdAotCQkgKiB3LyA4MjU5IG9mZnNldAorCQljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yOgorCQkvKiBUaGVyZSBhcmUgdHdvIFVTQiBjb250cm9sbGVycy4KKwkJICogSWRlbnRpZnkgdGhlbSBieSBmdW5jdG9uIG51bWJlcgogCQkgKi8KLQkJZGV2LT5pcnEgPSAxNDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Ci0JCXBjaV9kZXZfcHV0KGRldik7CisJCQlpZiAoUENJX0ZVTkMoZGV2LT5kZXZmbikpCisJCQkJZGV2LT5pcnEgPSAxMTsKKwkJCWVsc2UKKwkJCQlkZXYtPmlycSA9IDEwOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KLQotCS8qCi0JICogRm9yY2UgbGVnYWN5IFVTQiBpbnRlcnJ1cHQgcm91dGluZwotCSAqLwotCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCi0JCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBOVUxMKSkpIHsKLQkJZGV2LT5pcnEgPSAxMDsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAxMCk7Ci0JCXBjaV9kZXZfcHV0KGRldik7Ci0JfQotCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKLQkJCQkJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIsIGRldikpKSB7Ci0JCWRldi0+aXJxID0gMTE7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOwotCQlwY2lfZGV2X3B1dChkZXYpOwotCX0KLQotCS8qIE5vdyBtYXAgYWxsIHRoZSBQQ0kgaXJxcyAqLwotCWRldiA9IE5VTEw7Ci0JZm9yX2VhY2hfcGNpX2RldihkZXYpCi0JCXBjaV9yZWFkX2lycV9saW5lKGRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX0k4MjU5CkBAIC0xNjUsMzMgKzE0OCwxMiBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCS8qIFJldHVybiB0aGUgbXBpYyBub2RlICovCiAJb2Zfbm9kZV9wdXQobnApOwogCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCi0JLyogVXNlZCBvbmx5IGZvciA4NTQ4IHNvIGZhciwgYnV0IG5vIGhhcm0gaW4KLQkgKiBhbGxvY2F0aW5nIHRoZW0gZm9yIGV2ZXJ5b25lICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDgsIHIuc3RhcnQgKyAweDEwNjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgOSwgci5zdGFydCArIDB4MTA2ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMCwgci5zdGFydCArIDB4MTA3MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMSwgci5zdGFydCArIDB4MTA3ODApOwotCi0JLyogRXh0ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMiwgci5zdGFydCArIDB4MTAwMDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxMywgci5zdGFydCArIDB4MTAwODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAxNCwgci5zdGFydCArIDB4MTAxMDApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpAQCAtMjU3LDkgKzIxOSw5IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAotCXBwY19tZC5wY2liaW9zX2ZpeHVwID0gbXBjODV4eF9jZHNfcGNpYmlvc19maXh1cDsKKwlwcGNfbWQucGNpX2lycV9maXh1cCA9IG1wYzg1eHhfY2RzX3BjaV9pcnFfZml4dXA7CiAJcHBjX21kLnBjaV9leGNsdWRlX2RldmljZSA9IG1wYzg1eHhfZXhjbHVkZV9kZXZpY2U7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKaW5kZXggZTNkZGRiZi4uMDA0YjgwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMKQEAgLTU5LDExICs1OSw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUENJCi11bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKLXVuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKLSNlbmRpZgotCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCkBAIC0xMDAsNyArOTUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BDSQogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykgewotCQlhZGRfYnJpZGdlKG5wKTsKKwkJbXBjODV4eF9hZGRfYnJpZGdlKG5wKTsKIAl9CiAJb2Zfbm9kZV9wdXQobnApOwogI2VuZGlmCkBAIC0xODEsMjkgKzE3NiwxMCBAQAogCiAJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJNCwgMCwgIiBPcGVuUElDICAiKTsKKwkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKLQkvKiBJbnRlcm5hbCBJbnRlcnJ1cHRzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHIuc3RhcnQgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgci5zdGFydCArIDB4MTAyODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCByLnN0YXJ0ICsgMHgxMDMwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDMsIHIuc3RhcnQgKyAweDEwMzgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgci5zdGFydCArIDB4MTA0MDApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA1LCByLnN0YXJ0ICsgMHgxMDQ4MCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDYsIHIuc3RhcnQgKyAweDEwNTAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNywgci5zdGFydCArIDB4MTA1ODApOwotCW1waWNfYXNzaWduX2lzdShtcGljLCA4LCByLnN0YXJ0ICsgMHgxMDYwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDksIHIuc3RhcnQgKyAweDEwNjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTAsIHIuc3RhcnQgKyAweDEwNzAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTEsIHIuc3RhcnQgKyAweDEwNzgwKTsKLQotCS8qIEV4dGVybmFsIEludGVycnVwdHMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTIsIHIuc3RhcnQgKyAweDEwMDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTMsIHIuc3RhcnQgKyAweDEwMDgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMTQsIHIuc3RhcnQgKyAweDEwMTAwKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wY2kuYwppbmRleCA0OGYxN2UyLi44MTE4NDE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3BjaS5jCkBAIC0zMywxMCArMzMsOCBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1pbnQgbXBjODV4eF9wY2kyX2J1c25vID0gMDsKLQogI2lmZGVmIENPTkZJR19QQ0kKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK2ludCBfX2luaXQgbXBjODV4eF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtNTcsMTEgKzU1LDEwIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKQEAgLTc0LDggKzcxLDYgQEAKIAlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDkwMDApIHsKIAkJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIGltbXIgKyAweDkwMDAsIGltbXIgKyAweDkwMDQpOwogCQlwcmltYXJ5ID0gMDsKLQkJaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOwotCQltcGM4NXh4X3BjaTJfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNUEM4NXh4IFBDSSBob3N0IGJyaWRnZSBhdCAweCUwMTZsbHguICIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKaW5kZXggZDFiY2ZmNS4uMGZhZWJmZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTEsNSArMSw1IEBACiBjaG9pY2UKLQlwcm9tcHQgIk1hY2hpbmUgVHlwZSIKKwlwcm9tcHQgIjg2eHggQm9hcmQgVHlwZSIKIAlkZXBlbmRzIG9uIFBQQ184Nnh4CiAJZGVmYXVsdCBNUEM4NjQxX0hQQ04KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmgKaW5kZXggMjgzNDQ2Mi4uMjNmN2VkMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHguaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCkBAIC0xNSwxNSArMTUsMTAgQEAKICAqIG1wYzg2eHhfKiBmaWxlcy4gTW9zdGx5IGZvciB1c2UgYnkgbXBjODZ4eF9zZXR1cCgpLgogICovCiAKLWV4dGVybiBpbnQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CitleHRlcm4gaW50IG1wYzg2eHhfYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiAKLWV4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwotCi1leHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkgICAgICAgdTMyIGNmZ19hZGRyLCB1MzIgY2ZnX2RhdGEpOwotZXh0ZXJuIHZvaWQgc2V0dXBfaW5kaXJlY3RfcGNpZV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpjZmdfYWRkciwKLQkJCQkJICAgICB2b2lkIF9faW9tZW0gKmNmZ19kYXRhKTsKK2V4dGVybiBpbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pOwogCiBleHRlcm4gdm9pZCBfX2luaXQgbXBjODZ4eF9zbXBfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCmluZGV4IDEwNTE3MDIuLjViMDFlYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKQEAgLTQ0LDEzICs0NCw2IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1BDSQotdW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Ci11bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldCA9IDA7Ci0jZW5kaWYKLQotCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIHZvaWQgbXBjODZ4eF84MjU5X2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewpAQCAtODEsMjIgKzc0LDkgQEAKIAkvKiBBbGxvYyBtcGljIHN0cnVjdHVyZSBhbmQgcGVyIGlzdSBoYXMgMTYgSU5UIGVudHJpZXMuICovCiAJbXBpYzEgPSBtcGljX2FsbG9jKG5wLCByZXMuc3RhcnQsCiAJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAotCQkJMTYsIE5SX0lSUVMgLSA0LAotCQkJIiBNUElDICAgICAiKTsKKwkJCTAsIDI1NiwgIiBNUElDICAgICAiKTsKIAlCVUdfT04obXBpYzEgPT0gTlVMTCk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDAsIHJlcy5zdGFydCArIDB4MTAwMDApOwotCi0JLyogNDggSW50ZXJuYWwgSW50ZXJydXB0cyAqLwotCW1waWNfYXNzaWduX2lzdShtcGljMSwgMSwgcmVzLnN0YXJ0ICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMxLCAyLCByZXMuc3RhcnQgKyAweDEwNDAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDMsIHJlcy5zdGFydCArIDB4MTA2MDApOwotCi0JLyogMTYgRXh0ZXJuYWwgaW50ZXJydXB0cwotCSAqIE1vdmluZyB0aGVtIGZyb20gWzAgLSAxNV0gdG8gWzY0IC0gNzldCi0JICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMxLCA0LCByZXMuc3RhcnQgKyAweDEwMDAwKTsKLQogCW1waWNfaW5pdChtcGljMSk7CiAKICNpZmRlZiBDT05GSUdfUENJCkBAIC0zMTksNiArMjk5LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB0ZW1wOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4MDQsIDB4MDQwNSk7CisJZGV2LT5jbGFzcyAmPSB+MHg1OwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgMHg0YSwgJnRlbXApOwogCXRlbXAgfD0gMHgxMDAwOwogCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NGEsIHRlbXApOwpAQCAtMzY0LDkgKzM0NSw3IEBACiAKICNpZmRlZiBDT05GSUdfUENJCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQotCQlhZGRfYnJpZGdlKG5wKTsKLQotCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4Nnh4X2V4Y2x1ZGVfZGV2aWNlOworCQltcGM4Nnh4X2FkZF9icmlkZ2UobnApOwogI2VuZGlmCiAKIAlwcmludGsoIk1QQzg2eHggSFBDTiBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwppbmRleCA4MjM1YzU2Li43M2NkNWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BjaS5jCkBAIC0xMjIsNyArMTIyLDYgQEAKIG1wYzg2eHhfc2V0dXBfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHUzMiBwY2llX29mZnNldCwgdTMyIHBjaWVfc2l6ZSkKIHsKIAl1MTYgY21kOwotCXVuc2lnbmVkIGludCB0ZW1wczsKIAogCURCRygiUENJRSBob3N0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0IDB4JTA4eCwgc2l6ZSAweCUwOHguXG4iLAogCQkJcGNpZV9vZmZzZXQsIHBjaWVfc2l6ZSk7CkBAIC0xMzMsMjIgKzEzMiw0OSBAQAogCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSV9DT01NQU5ELCBjbWQpOwogCiAJZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgMCwgMCwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOwotCi0JLyogUENJRSBCdXMsIEZpeCB0aGUgTVBDODY0MUQgaG9zdCBicmlkZ2UncyBsb2NhdGlvbiB0byBidXMgMHhGRi4gKi8KLQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCAwLCAwLCBQQ0lfUFJJTUFSWV9CVVMsICZ0ZW1wcyk7Ci0JdGVtcHMgPSAodGVtcHMgJiAweGZmMDAwMDAwKSB8ICgweGZmKSB8ICgweDAgPDwgOCkgfCAoMHhmZSA8PCAxNik7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIDAsIDAsIFBDSV9QUklNQVJZX0JVUywgdGVtcHMpOwogfQogCi1pbnQgbXBjODZ4eF9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfZnNsX3BjaWVfdHJhbnNwYXJlbnQoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJlc19pZHggPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCS8qCisJICogTWFrZSB0aGUgYnJpZGdlIGJlIHRyYW5zcGFyZW50LgorCSAqLworCWRldi0+dHJhbnNwYXJlbnQgPSAxOworCisJaG9zZSA9IHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cyk7CisJaWYgKCFob3NlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBob3NlIGZvciBidXMgJWRcbiIsCisJCSAgICAgICBkZXYtPmJ1cy0+bnVtYmVyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChob3NlLT5pb19yZXNvdXJjZS5mbGFncykgeworCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNfaWR4KytdOworCQlyZXMtPnN0YXJ0ID0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQ7CisJCXJlcy0+ZW5kID0gaG9zZS0+aW9fcmVzb3VyY2UuZW5kOworCQlyZXMtPmZsYWdzID0gaG9zZS0+aW9fcmVzb3VyY2UuZmxhZ3M7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVtyZXNfaWR4ICsgaV07CisJCXJlcy0+c3RhcnQgPSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0OworCQlyZXMtPmVuZCA9IGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kOworCQlyZXMtPmZsYWdzID0gaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5mbGFnczsKKwl9CiB9CiAKLWludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKKworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxOTU3LCAweDcwMTAsIHF1aXJrX2ZzbF9wY2llX3RyYW5zcGFyZW50KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKDB4MTk1NywgMHg3MDExLCBxdWlya19mc2xfcGNpZV90cmFuc3BhcmVudCk7CisKKyNkZWZpbmUgUENJRV9MVFNTTQkweDQwNAkvKiBQQ0llIExpbmsgVHJhaW5pbmcgYW5kIFN0YXR1cyAqLworI2RlZmluZSBQQ0lFX0xUU1NNX0wwCTB4MTYJLyogTDAgc3RhdGUgKi8KKworaW50IF9faW5pdCBtcGM4Nnh4X2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC0xNTYsNiArMTgyLDcgQEAKIAljb25zdCBpbnQgKmJ1c19yYW5nZTsKIAlpbnQgaGFzX2FkZHJlc3MgPSAwOwogCWludCBwcmltYXJ5ID0gMDsKKwl1MTYgdmFsOwogCiAJREJHKCJBZGRpbmcgUENJRSBob3N0IGJyaWRnZSAlc1xuIiwgZGV2LT5mdWxsX25hbWUpOwogCkBAIC0xNjgsMTcgKzE5NSwyMyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCXBjaV9hc3NpZ25fYWxsX2J1c2VzID0gMTsKKwlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKGRldik7CiAJaWYgKCFob3NlKQogCQlyZXR1cm4gLUVOT01FTTsKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAotCS8qIGxhc3RfYnVzbm8gPSAweGZlIGNhdXNlIGJ5IE1QQzg2NDEgUENJRSBidWcgKi8KKwlob3NlLT5pbmRpcmVjdF90eXBlID0gUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRyB8CisJCQkJUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVM7CisKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDB4MDsKLQlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZTsKKwlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAotCXNldHVwX2luZGlyZWN0X3BjaWUoaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5zdGFydCArIDB4NCk7CisJc2V0dXBfaW5kaXJlY3RfcGNpKGhvc2UsIHJzcmMuc3RhcnQsIHJzcmMuc3RhcnQgKyAweDQpOworCisJLyogUHJvYmUgdGhlIGhvc2UgbGluayB0cmFpbmluZyBzdGF0dXMgKi8KKwllYXJseV9yZWFkX2NvbmZpZ193b3JkKGhvc2UsIDAsIDAsIFBDSUVfTFRTU00sICZ2YWwpOworCWlmICh2YWwgPCBQQ0lFX0xUU1NNX0wwKQorCQlyZXR1cm4gLUVOWElPOwogCiAJLyogU2V0dXAgdGhlIFBDSUUgaG9zdCBjb250cm9sbGVyLiAqLwogCW1wYzg2eHhfc2V0dXBfcGNpZShob3NlLCByc3JjLnN0YXJ0LCByc3JjLmVuZCAtIHJzcmMuc3RhcnQgKyAxKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYwppbmRleCAwOTAxZGJhLi5mMTY5MzU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CkBAIC00OSw2ICs1MCwxMCBAQAogCiAjaW5jbHVkZSAic3lzZGV2L21wYzh4eF9waWMuaCIKIAorI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorc3RydWN0IG1wYzh4eF9wY21jaWFfb3BzIG04eHhfcGNtY2lhX29wczsKKyNlbmRpZgorCiB2b2lkIG04eHhfY2FsaWJyYXRlX2RlY3Iodm9pZCk7CiBleHRlcm4gdm9pZCBtOHh4X3dkdF9oYW5kbGVyX2luc3RhbGwoYmRfdCAqYnApOwogZXh0ZXJuIGludCBjcG1fcGljX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tcGM4ODVhZHNfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCmluZGV4IGMzNmU0NzUuLjVhODA4ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L21wYzg4NWFkc19zZXR1cC5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mc19lbmV0X3BkLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfdWFydF9wZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAKICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KQEAgLTM5LDcgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBleHRlcm4gdm9pZCBjcG1fcmVzZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtcGM4eHhfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSopOworZXh0ZXJuIHZvaWQgbXBjOHh4X3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKik7CiBleHRlcm4gdm9pZCBtcGM4eHhfcmVzdGFydChjaGFyICpjbWQpOwogZXh0ZXJuIHZvaWQgbXBjOHh4X2NhbGlicmF0ZV9kZWNyKHZvaWQpOwogZXh0ZXJuIGludCBtcGM4eHhfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pOwpAQCAtNDcsOSArNDgsNzMgQEAKIGV4dGVybiB2b2lkIG04eHhfcGljX2luaXQodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgaW50IG1wYzh4eF9nZXRfaXJxKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSk7Ci1zdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSk7Ci1zdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyogcHRyKTsKK3N0YXRpYyB2b2lkIGluaXRfc21jMV91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKTsKK3N0YXRpYyB2b2lkIGluaXRfc21jMl91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKTsKK3N0YXRpYyB2b2lkIGluaXRfc2NjM19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpwdHIpOworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9NOFhYCitzdGF0aWMgdm9pZCBwY21jaWFfaHdfc2V0dXAoaW50IHNsb3QsIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgKmJjc3JfaW87CisKKwliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAoZW5hYmxlKQorCQljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUENDRU4pOworCWVsc2UKKwkJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1BDQ0VOKTsKKworCWlvdW5tYXAoYmNzcl9pbyk7Cit9CisKK3N0YXRpYyBpbnQgcGNtY2lhX3NldF92b2x0YWdlKGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKQoreworCXUzMiByZWcgPSAwOworCXVuc2lnbmVkICpiY3NyX2lvOworCisJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjA6CisJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCisJY2xyYml0czMyKGJjc3JfaW8sIDB4MDA2MTAwMDApOworCisJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCisJc2V0Yml0czMyKGJjc3JfaW8sIHJlZyk7CisKKwlpb3VubWFwKGJjc3JfaW8pOworCXJldHVybiAwOworfQorI2VuZGlmCiAKIHZvaWQgX19pbml0IG1wYzg4NWFkc19ib2FyZF9zZXR1cCh2b2lkKQogewpAQCAtNjIsNyArMTI3LDcgQEAKICNlbmRpZgogCiAJYmNzcl9pbyA9IGlvcmVtYXAoQkNTUjEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JY3AgPSAoY3BtOHh4X3QgKilpbW1yX21hcChpbV9jcG0pOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAKIAlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSXG4iKTsKQEAgLTc1LDEzICsxNDAsMTMgQEAKIAlvdXRfOCgmKGNwLT5jcF9zbWNbMF0uc21jX3NtY20pLCB0bXB2YWw4KTsKIAljbHJiaXRzMTYoJmNwLT5jcF9zbWNbMF0uc21jX3NtY21yLCBTTUNNUl9SRU4gfCBTTUNNUl9URU4pOwkvKiBicmcxICovCiAjZWxzZQotCXNldGJpdHMzMihiY3NyX2lvLEJDU1IxX1JTMjMyRU5fMSk7CisJc2V0Yml0czMyKGJjc3JfaW8sIEJDU1IxX1JTMjMyRU5fMSk7CiAJb3V0X2JlMTYoJmNwLT5jcF9zbWNbMF0uc21jX3NtY21yLCAwKTsKIAlvdXRfOCgmY3AtPmNwX3NtY1swXS5zbWNfc21jZSwgMCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfQ1BNX1NNQzIKLQljbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzIpOworCWNscmJpdHMzMihiY3NyX2lvLCBCQ1NSMV9SUzIzMkVOXzIpOwogCWNscmJpdHMzMigmY3AtPmNwX3NpbW9kZSwgMHhlMDAwMDAwMCA+PiAxKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9zaW1vZGUsIDB4MjAwMDAwMDAgPj4gMSk7CS8qIGJyZzIgKi8KIAl0bXB2YWw4ID0gaW5fOCgmKGNwLT5jcF9zbWNbMV0uc21jX3NtY20pKSB8IChTTUNNX1JYIHwgU01DTV9UWCk7CkBAIC05MCw3ICsxNTUsNyBAQAogCiAJaW5pdF9zbWMyX3VhcnRfaW9wb3J0cygwKTsKICNlbHNlCi0Jc2V0Yml0czMyKGJjc3JfaW8sQkNTUjFfUlMyMzJFTl8yKTsKKwlzZXRiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKIAlvdXRfYmUxNigmY3AtPmNwX3NtY1sxXS5zbWNfc21jbXIsIDApOwogCW91dF84KCZjcC0+Y3Bfc21jWzFdLnNtY19zbWNlLCAwKTsKICNlbmRpZgpAQCAtOTksMjkgKzE2NCwzNCBAQAogCiAjaWZkZWYgQ09ORklHX0ZTX0VORVQKIAkvKiB1c2UgTURDIGZvciBNSUkgKGNvbW1vbikgKi8KLQlpb19wb3J0ID0gKGlvcDh4eF90KilpbW1yX21hcChpbV9pb3BvcnQpOworCWlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKIAlzZXRiaXRzMTYoJmlvX3BvcnQtPmlvcF9wZHBhciwgMHgwMDgwKTsKIAljbHJiaXRzMTYoJmlvX3BvcnQtPmlvcF9wZGRpciwgMHgwMDgwKTsKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1I1LCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTFfRU4pOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTFfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjVfTUlJMV9FTik7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTFfUlNUKTsKICNpZm5kZWYgQ09ORklHX0ZDX0VORVRfSEFTX1NDQwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTJfRU4pOwotCWNscmJpdHMzMihiY3NyX2lvLEJDU1I1X01JSTJfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjVfTUlJMl9FTik7CisJY2xyYml0czMyKGJjc3JfaW8sIEJDU1I1X01JSTJfUlNUKTsKIAogI2VuZGlmCiAJaW91bm1hcChiY3NyX2lvKTsKIAlpbW1yX3VubWFwKGlvX3BvcnQpOwogCiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ01DSUFfTThYWAorCS8qU2V0IHVwIGJvYXJkIHNwZWNpZmljIGhvb2stdXBzICovCisJbTh4eF9wY21jaWFfb3BzLmh3X2N0cmwgPSBwY21jaWFfaHdfc2V0dXA7CisJbTh4eF9wY21jaWFfb3BzLnZvbHRhZ2Vfc2V0ID0gcGNtY2lhX3NldF92b2x0YWdlOworI2VuZGlmCiB9CiAKLQotc3RhdGljIHZvaWQgaW5pdF9mZWMxX2lvcG9ydHMoc3RydWN0IGZzX3BsYXRmb3JtX2luZm8qIHB0cikKK3N0YXRpYyB2b2lkIGluaXRfZmVjMV9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpwdHIpCiB7Ci0JY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopaW1tcl9tYXAoaW1fY3BtKTsKLQlpb3A4eHhfdCAqaW9fcG9ydCA9IChpb3A4eHhfdCAqKWltbXJfbWFwKGltX2lvcG9ydCk7CisJY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CisJaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKikgaW1tcl9tYXAoaW1faW9wb3J0KTsKIAogCS8qIGNvbmZpZ3VyZSBGRUMxIHBpbnMgICovCiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGFwYXIsIDB4ZjgzMCk7CkBAIC0xNDMsMTEgKzIxMywxMCBAQAogCWltbXJfdW5tYXAoY3ApOwogfQogCi0KLXN0YXRpYyB2b2lkIGluaXRfZmVjMl9pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBwdHIpCitzdGF0aWMgdm9pZCBpbml0X2ZlYzJfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqcHRyKQogewotCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7Ci0JaW9wOHh4X3QgKmlvX3BvcnQgPSAoaW9wOHh4X3QgKilpbW1yX21hcChpbV9pb3BvcnQpOworCWNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSBpbW1yX21hcChpbV9jcG0pOworCWlvcDh4eF90ICppb19wb3J0ID0gKGlvcDh4eF90ICopIGltbXJfbWFwKGltX2lvcG9ydCk7CiAKIAkvKiBjb25maWd1cmUgRkVDMiBwaW5zICovCiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIDB4MDAwM2ZmZmMpOwpAQCAtMTc3LDE1ICsyNDYsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfc2NjM19pb3BvcnRzKHN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvKiBmcGkpCitzdGF0aWMgdm9pZCBpbml0X3NjYzNfaW9wb3J0cyhzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqZnBpKQogewogCXVuc2lnbmVkICpiY3NyX2lvOwogCWlvcDh4eF90ICppb19wb3J0OwogCWNwbTh4eF90ICpjcDsKIAogCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1JfQUREUiwgQkNTUl9TSVpFKTsKLQlpb19wb3J0ID0gKGlvcDh4eF90ICopaW1tcl9tYXAoaW1faW9wb3J0KTsKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJaW9fcG9ydCA9IChpb3A4eHhfdCAqKSBpbW1yX21hcChpbV9pb3BvcnQpOworCWNwID0gKGNwbTh4eF90ICopIGltbXJfbWFwKGltX2NwbSk7CiAKIAlpZiAoYmNzcl9pbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0NSSVQgIkNvdWxkIG5vdCByZW1hcCBCQ1NSXG4iKTsKQEAgLTE5NCw5ICsyNjMsOSBAQAogCiAJLyogRW5hYmxlIHRoZSBQSFkuCiAJICovCi0JY2xyYml0czMyKGJjc3JfaW8rNCwgQkNTUjRfRVRIMTBfUlNUKTsKKwljbHJiaXRzMzIoYmNzcl9pbyArIDQsIEJDU1I0X0VUSDEwX1JTVCk7CiAJdWRlbGF5KDEwMDApOwotCXNldGJpdHMzMihiY3NyX2lvKzQsIEJDU1I0X0VUSDEwX1JTVCk7CisJc2V0Yml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSNF9FVEgxMF9SU1QpOwogCS8qIENvbmZpZ3VyZSBwb3J0IEEgcGlucyBmb3IgVHhkIGFuZCBSeGQuCiAJICovCiAJc2V0Yml0czE2KCZpb19wb3J0LT5pb3BfcGFwYXIsIFBBX0VORVRfUlhEIHwgUEFfRU5FVF9UWEQpOwpAQCAtMjEyLDggKzI4MSw3IEBACiAJICovCiAJc2V0Yml0czMyKCZjcC0+Y3BfcGVwYXIsIFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVwYXIsIFBFX0VORVRfVEVOQSk7Ci0JY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsCi0JCSAgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLIHwgUEVfRU5FVF9URU5BKTsKKwljbHJiaXRzMzIoJmNwLT5jcF9wZWRpciwgUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLIHwgUEVfRU5FVF9URU5BKTsKIAljbHJiaXRzMzIoJmNwLT5jcF9wZXNvLCBQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIFBFX0VORVRfVEVOQSk7CiAKQEAgLTIzNyw3ICszMDUsNyBAQAogCWNscmJpdHMzMigmY3AtPmNwX3BlZGlyLCBQRV9FTkVUX1RFTkEpOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIFBFX0VORVRfVEVOQSk7CiAKLQlzZXRiaXRzMzIoYmNzcl9pbys0LCBCQ1NSMV9FVEhFTik7CisJc2V0Yml0czMyKGJjc3JfaW8gKyA0LCBCQ1NSMV9FVEhFTik7CiAJaW91bm1hcChiY3NyX2lvKTsKIAlpbW1yX3VubWFwKGlvX3BvcnQpOwogCWltbXJfdW5tYXAoY3ApOwpAQCAtMjU3LDUwICszMjUsNDggQEAKIAl9CiB9CiAKLQotCi1zdGF0aWMgdm9pZCBpbml0X3NtYzFfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIHB0cikKK3N0YXRpYyB2b2lkIGluaXRfc21jMV91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqcHRyKQogewotICAgICAgICB1bnNpZ25lZCAqYmNzcl9pbzsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKIAljcG04eHhfdCAqY3A7CiAKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXBhciwgMHgwMDAwMDBjMCk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIDB4MDAwMDAwYzApOwogCWNscmJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDAwNDApOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDAwODApOwogCWltbXJfdW5tYXAoY3ApOwogCi0gICAgICAgIGJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0gICAgICAgIGlmIChiY3NyX2lvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUjFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzEpOwotICAgICAgICBpb3VubWFwKGJjc3JfaW8pOworCWlmIChiY3NyX2lvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKKwkJcmV0dXJuOworCX0KKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8xKTsKKwlpb3VubWFwKGJjc3JfaW8pOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X3NtYzJfdWFydF9pb3BvcnRzKHN0cnVjdCBmc191YXJ0X3BsYXRmb3JtX2luZm8qIGZwaSkKK3N0YXRpYyB2b2lkIGluaXRfc21jMl91YXJ0X2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZnBpKQogewotICAgICAgICB1bnNpZ25lZCAqYmNzcl9pbzsKKwl1bnNpZ25lZCAqYmNzcl9pbzsKIAljcG04eHhfdCAqY3A7CiAKLQljcCA9IChjcG04eHhfdCAqKWltbXJfbWFwKGltX2NwbSk7CisJY3AgPSAoY3BtOHh4X3QgKikgaW1tcl9tYXAoaW1fY3BtKTsKIAlzZXRiaXRzMzIoJmNwLT5jcF9wZXBhciwgMHgwMDAwMGMwMCk7CiAJY2xyYml0czMyKCZjcC0+Y3BfcGVkaXIsIDB4MDAwMDBjMDApOwogCWNscmJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDA0MDApOwogCXNldGJpdHMzMigmY3AtPmNwX3Blc28sIDB4MDAwMDA4MDApOwogCWltbXJfdW5tYXAoY3ApOwogCi0gICAgICAgIGJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWJjc3JfaW8gPSBpb3JlbWFwKEJDU1IxLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0gICAgICAgIGlmIChiY3NyX2lvID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJDb3VsZCBub3QgcmVtYXAgQkNTUjFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjbHJiaXRzMzIoYmNzcl9pbyxCQ1NSMV9SUzIzMkVOXzIpOwotICAgICAgICBpb3VubWFwKGJjc3JfaW8pOworCWlmIChiY3NyX2lvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ291bGQgbm90IHJlbWFwIEJDU1IxXG4iKTsKKwkJcmV0dXJuOworCX0KKwljbHJiaXRzMzIoYmNzcl9pbywgQkNTUjFfUlMyMzJFTl8yKTsKKwlpb3VubWFwKGJjc3JfaW8pOwogfQogCiB2b2lkIGluaXRfc21jX2lvcG9ydHMoc3RydWN0IGZzX3VhcnRfcGxhdGZvcm1faW5mbyAqZGF0YSkKQEAgLTM3MywxNSArNDM5LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLWRlZmluZV9tYWNoaW5lKG1wYzg4NV9hZHMpIHsKLQkubmFtZQkJCT0gIk1QQzg4NSBBRFMiLAotCS5wcm9iZQkJCT0gbXBjODg1YWRzX3Byb2JlLAotCS5zZXR1cF9hcmNoCQk9IG1wYzg4NWFkc19zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBtOHh4X3BpY19pbml0LAotCS5zaG93X2NwdWluZm8JCT0gbXBjOHh4X3Nob3dfY3B1aW5mbywKLQkuZ2V0X2lycQkJPSBtcGM4eHhfZ2V0X2lycSwKLQkucmVzdGFydAkJPSBtcGM4eHhfcmVzdGFydCwKLQkuY2FsaWJyYXRlX2RlY3IJCT0gbXBjOHh4X2NhbGlicmF0ZV9kZWNyLAotCS5zZXRfcnRjX3RpbWUJCT0gbXBjOHh4X3NldF9ydGNfdGltZSwKLQkuZ2V0X3J0Y190aW1lCQk9IG1wYzh4eF9nZXRfcnRjX3RpbWUsCi19OworZGVmaW5lX21hY2hpbmUobXBjODg1X2FkcykKK3sKKy5uYW1lID0gIk1QQzg4NSBBRFMiLC5wcm9iZSA9IG1wYzg4NWFkc19wcm9iZSwuc2V0dXBfYXJjaCA9CisJICAgIG1wYzg4NWFkc19zZXR1cF9hcmNoLC5pbml0X0lSUSA9CisJICAgIG04eHhfcGljX2luaXQsLnNob3dfY3B1aW5mbyA9IG1wYzh4eF9zaG93X2NwdWluZm8sLmdldF9pcnEgPQorCSAgICBtcGM4eHhfZ2V0X2lycSwucmVzdGFydCA9IG1wYzh4eF9yZXN0YXJ0LC5jYWxpYnJhdGVfZGVjciA9CisJICAgIG1wYzh4eF9jYWxpYnJhdGVfZGVjciwuc2V0X3J0Y190aW1lID0KKwkgICAgbXBjOHh4X3NldF9ydGNfdGltZSwuZ2V0X3J0Y190aW1lID0gbXBjOHh4X2dldF9ydGNfdGltZSx9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDM2MWFjZmEuLjMzNTQ1ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTIsNyArMiw3IEBACiAKIGNob2ljZQogCXByb21wdCAiTWFjaGluZSB0eXBlIgotCWRlcGVuZHMgb24gUFBDNjQgfHwgQ0xBU1NJQzMyCisJZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHgKIAlkZWZhdWx0IFBQQ19NVUxUSVBMQVRGT1JNCiAKIGNvbmZpZyBQUENfTVVMVElQTEFURk9STQpAQCAtMTYsMTUgKzE2LDMwIEBACiAJYm9vbCAiRW1iZWRkZWQgNnh4Lzd4eC83eHh4LWJhc2VkIGJvYXJkIgogCWRlcGVuZHMgb24gUFBDMzIgJiYgKEJST0tFTnx8QlJPS0VOX09OX1NNUCkKIAotY29uZmlnIEFQVVMKLQlib29sICJBbWlnYS1BUFVTIgotCWRlcGVuZHMgb24gUFBDMzIgJiYgQlJPS0VOCitjb25maWcgUFBDXzgyeHgKKwlib29sICJGcmVlc2NhbGUgODJ4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCitjb25maWcgUFBDXzgzeHgKKwlib29sICJGcmVlc2NhbGUgODN4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDgzeHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgUFBDXzg2eHgKKwlib29sICJGcmVlc2NhbGUgODZ4eCIKKwlkZXBlbmRzIG9uIDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IEFMVElWRUMKIAloZWxwCi0JICBTZWxlY3QgQVBVUyBpZiBjb25maWd1cmluZyBmb3IgYSBQb3dlclVQIEFtaWdhLgotCSAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQ6Ci0JICA8aHR0cDovL2xpbnV4LWFwdXMuc291cmNlZm9yZ2UubmV0Lz4uCisJICBUaGUgRnJlZXNjYWxlIEU2MDAgU29DcyBoYXZlIDc0eHggY29yZXMuCiBlbmRjaG9pY2UKIAorY29uZmlnIENMQVNTSUMzMgorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIDZ4eCAmJiBQUENfTVVMVElQTEFURk9STQorCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YjVmZGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCkBAIC0wLDAgKzEsMjIxIEBACitjb25maWcgUFBDNjQKKwlib29sICI2NC1iaXQga2VybmVsIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNlbGVjdHMgd2hldGhlciBhIDMyLWJpdCBvciBhIDY0LWJpdCBrZXJuZWwKKwkgIHdpbGwgYmUgYnVpbHQuCisKK21lbnUgIlByb2Nlc3NvciBzdXBwb3J0IgorY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3IgVHlwZSIKKwlkZXBlbmRzIG9uIFBQQzMyCisJZGVmYXVsdCA2eHgKKwloZWxwCisJICBUaGVyZSBhcmUgZml2ZSBmYW1pbGllcyBvZiAzMiBiaXQgUG93ZXJQQyBjaGlwcyBzdXBwb3J0ZWQuCisJICBUaGUgbW9zdCBjb21tb24gb25lcyBhcmUgdGhlIGRlc2t0b3AgYW5kIHNlcnZlciBDUFVzICg2MDEsIDYwMywKKwkgIDYwNCwgNzQwLCA3NTAsIDc0eHgpIENQVXMgZnJvbSBGcmVlc2NhbGUgYW5kIElCTSwgd2l0aCB0aGVpcgorCSAgZW1iZWRkZWQgNTJ4eC84Mnh4LzgzeHgvODZ4eCBjb3VudGVycGFydHMuCisJICBUaGUgb3RoZXIgZW1iZWVkZWQgcGFydHMsIG5hbWVseSA0eHgsIDh4eCwgZTIwMCAoNTV4eCkgYW5kIGU1MDAKKwkgICg4NXh4KSBlYWNoIGZvcm0gYSBmYW1pbHkgb2YgdGhlaXIgb3duIHRoYXQgaXMgbm90IGNvbXBhdGlibGUKKwkgIHdpdGggdGhlIG90aGVycy4KKworCSAgSWYgdW5zdXJlLCBzZWxlY3QgNTJ4eC82eHgvN3h4Lzc0eHgvODJ4eC84M3h4Lzg2eHguCisKK2NvbmZpZyA2eHgKKwlib29sICI1Mnh4LzZ4eC83eHgvNzR4eC84Mnh4LzgzeHgvODZ4eCIKKwlzZWxlY3QgUFBDX0ZQVQorCitjb25maWcgUFBDXzg1eHgKKwlib29sICJGcmVlc2NhbGUgODV4eCIKKwlzZWxlY3QgRTUwMAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IDg1eHgKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCitjb25maWcgUFBDXzh4eAorCWJvb2wgIkZyZWVzY2FsZSA4eHgiCisJc2VsZWN0IEZTTF9TT0MKKwlzZWxlY3QgOHh4CisKK2NvbmZpZyA0MHgKKwlib29sICJBTUNDIDQweCIKKwlzZWxlY3QgUFBDX0RDUl9OQVRJVkUKKworY29uZmlnIDQ0eAorCWJvb2wgIkFNQ0MgNDR4IgorCXNlbGVjdCBQUENfRENSX05BVElWRQorCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCisKK2NvbmZpZyBFMjAwCisJYm9vbCAiRnJlZXNjYWxlIGUyMDAiCisKK2VuZGNob2ljZQorCitjb25maWcgUE9XRVI0X09OTFkKKwlib29sICJPcHRpbWl6ZSBmb3IgUE9XRVI0IgorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBDYXVzZSB0aGUgY29tcGlsZXIgdG8gb3B0aW1pemUgZm9yIFBPV0VSNC9QT1dFUjUvUFBDOTcwIHByb2Nlc3NvcnMuCisJICBUaGUgcmVzdWx0aW5nIGJpbmFyeSB3aWxsIG5vdCB3b3JrIG9uIFBPV0VSMyBvciBSUzY0IHByb2Nlc3NvcnMKKwkgIHdoZW4gY29tcGlsZWQgd2l0aCBiaW51dGlscyAyLjE1IG9yIGxhdGVyLgorCitjb25maWcgUE9XRVIzCisJYm9vbAorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IHkgaWYgIVBPV0VSNF9PTkxZCisKK2NvbmZpZyBQT1dFUjQKKwlkZXBlbmRzIG9uIFBQQzY0CisJZGVmX2Jvb2wgeQorCitjb25maWcgNnh4CisJYm9vbAorCisjIHRoaXMgaXMgdGVtcCB0byBoYW5kbGUgY29tcGF0IHdpdGggYXJjaD1wcGMKK2NvbmZpZyA4eHgKKwlib29sCisKKyMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYworY29uZmlnIDgzeHgKKwlib29sCisKKyMgdGhpcyBpcyB0ZW1wIHRvIGhhbmRsZSBjb21wYXQgd2l0aCBhcmNoPXBwYworY29uZmlnIDg1eHgKKwlib29sCisKK2NvbmZpZyBFNTAwCisJYm9vbAorCitjb25maWcgUFBDX0ZQVQorCWJvb2wKKwlkZWZhdWx0IHkgaWYgUFBDNjQKKworY29uZmlnIDR4eAorCWJvb2wKKwlkZXBlbmRzIG9uIDQweCB8fCA0NHgKKwlkZWZhdWx0IHkKKworY29uZmlnIEJPT0tFCisJYm9vbAorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwIHx8IDQ0eAorCWRlZmF1bHQgeQorCitjb25maWcgRlNMX0JPT0tFCisJYm9vbAorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyBQVEVfNjRCSVQKKwlib29sCisJZGVwZW5kcyBvbiA0NHggfHwgRTUwMAorCWRlZmF1bHQgeSBpZiA0NHgKKwlkZWZhdWx0IHkgaWYgRTUwMCAmJiBQSFlTXzY0QklUCisKK2NvbmZpZyBQSFlTXzY0QklUCisJYm9vbCAnTGFyZ2UgcGh5c2ljYWwgYWRkcmVzcyBzdXBwb3J0JyBpZiBFNTAwCisJZGVwZW5kcyBvbiA0NHggfHwgRTUwMAorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQKKwlkZWZhdWx0IHkgaWYgNDR4CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgbGFyZ2VyIHRoYW4gMzItYml0IHBoeXNpY2FsCisJICBhZGRyZXNzZXMuICBUaGlzIGZlYXR1cmVzIGlzIG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIGU1MDAgY29yZXMuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTiBoZXJlLgorCitjb25maWcgQUxUSVZFQworCWJvb2wgIkFsdGlWZWMgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIENMQVNTSUMzMiB8fCBQT1dFUjQKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgQWx0aXZlYyBleHRlbnNpb25zIHRvIHRoZQorCSAgUG93ZXJQQyBwcm9jZXNzb3IuIFRoZSBrZXJuZWwgY3VycmVudGx5IHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nCisJICBhbHRpdmVjIHJlZ2lzdGVycywgYW5kIHR1cm5pbmcgb24gdGhlICdhbHRpdmVjIGVuYWJsZScgYml0IHNvIHVzZXIKKwkgIHByb2Nlc3NlcyBjYW4gZXhlY3V0ZSBhbHRpdmVjIGluc3RydWN0aW9ucy4KKworCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWxseSBpZiB5b3UgaGF2ZSBhIHByb2Nlc3NvciB0aGF0IHN1cHBvcnRzCisJICBhbHRpdmVjIChHNCwgb3RoZXJ3aXNlIGtub3duIGFzIDc0eHggc2VyaWVzKSwgYnV0IGRvZXMgbm90IGhhdmUKKwkgIGFueSBhZmZlY3Qgb24gYSBub24tYWx0aXZlYyBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlCisJICBrZXJuZWwpLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFNQRQorCWJvb2wgIlNQRSBTdXBwb3J0IgorCWRlcGVuZHMgb24gRTIwMCB8fCBFNTAwCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBrZXJuZWwgc3VwcG9ydCBmb3IgdGhlIFNpZ25hbCBQcm9jZXNzaW5nCisJICBFeHRlbnNpb25zIChTUEUpIHRvIHRoZSBQb3dlclBDIHByb2Nlc3Nvci4gVGhlIGtlcm5lbCBjdXJyZW50bHkKKwkgIHN1cHBvcnRzIHNhdmluZyBhbmQgcmVzdG9yaW5nIFNQRSByZWdpc3RlcnMsIGFuZCB0dXJuaW5nIG9uIHRoZQorCSAgJ3NwZSBlbmFibGUnIGJpdCBzbyB1c2VyIHByb2Nlc3NlcyBjYW4gZXhlY3V0ZSBTUEUgaW5zdHJ1Y3Rpb25zLgorCisJICBUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2Nlc3NvciB0aGF0IHN1cHBvcnRzCisJICBTUEUgKGU1MDAsIG90aGVyd2lzZSBrbm93biBhcyA4NXh4IHNlcmllcyksIGJ1dCBkb2VzIG5vdCBoYXZlIGFueQorCSAgZWZmZWN0IG9uIGEgbm9uLXNwZSBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlIGtlcm5lbCkuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgorCitjb25maWcgUFBDX1NURF9NTVUKKwlib29sCisJZGVwZW5kcyBvbiA2eHggfHwgUE9XRVIzIHx8IFBPV0VSNCB8fCBQUEM2NAorCWRlZmF1bHQgeQorCitjb25maWcgUFBDX1NURF9NTVVfMzIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQUENfU1REX01NVSAmJiBQUEMzMgorCitjb25maWcgUFBDX01NX1NMSUNFUworCWJvb2wKKwlkZWZhdWx0IHkgaWYgSFVHRVRMQl9QQUdFCisJZGVmYXVsdCBuCisKK2NvbmZpZyBWSVJUX0NQVV9BQ0NPVU5USU5HCisJYm9vbCAiRGV0ZXJtaW5pc3RpYyB0YXNrIGFuZCBDUFUgdGltZSBhY2NvdW50aW5nIgorCWRlcGVuZHMgb24gUFBDNjQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIG1vcmUgYWNjdXJhdGUgdGFzayBhbmQgQ1BVIHRpbWUKKwkgIGFjY291bnRpbmcuICBUaGlzIGlzIGRvbmUgYnkgcmVhZGluZyBhIENQVSBjb3VudGVyIG9uIGVhY2gKKwkgIGtlcm5lbCBlbnRyeSBhbmQgZXhpdCBhbmQgb24gdHJhbnNpdGlvbnMgd2l0aGluIHRoZSBrZXJuZWwKKwkgIGJldHdlZW4gc3lzdGVtLCBzb2Z0aXJxIGFuZCBoYXJkaXJxIHN0YXRlLCBzbyB0aGVyZSBpcyBhCisJICBzbWFsbCBwZXJmb3JtYW5jZSBpbXBhY3QuICBUaGlzIGFsc28gZW5hYmxlcyBhY2NvdW50aW5nIG9mCisJICBzdG9sZW4gdGltZSBvbiBsb2dpY2FsbHktcGFydGl0aW9uZWQgc3lzdGVtcyBydW5uaW5nIG9uCisJICBJQk0gUE9XRVI1LWJhc2VkIG1hY2hpbmVzLgorCisJICBJZiBpbiBkb3VidCwgc2F5IFkgaGVyZS4KKworY29uZmlnIFNNUAorCWRlcGVuZHMgb24gUFBDX1NURF9NTVUKKwlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIG9uZSBDUFUuIElmIHlvdSBoYXZlCisJICBhIHN5c3RlbSB3aXRoIG9ubHkgb25lIENQVSwgc2F5IE4uIElmIHlvdSBoYXZlIGEgc3lzdGVtIHdpdGggbW9yZQorCSAgdGhhbiBvbmUgQ1BVLCBzYXkgWS4gIE5vdGUgdGhhdCB0aGUga2VybmVsIGRvZXMgbm90IGN1cnJlbnRseQorCSAgc3VwcG9ydCBTTVAgbWFjaGluZXMgd2l0aCA2MDMvNjAzZS82MDNldiBvciBQUEM3NTAgKCJHMyIpIHByb2Nlc3NvcnMKKwkgIHNpbmNlIHRoZXkgaGF2ZSBpbmFkZXF1YXRlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIG11bHRpcHJvY2Vzc29yCisJICBvcGVyYXRpb24uCisKKwkgIElmIHlvdSBzYXkgTiBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZSBhbmQgbXVsdGlwcm9jZXNzb3IKKwkgIG1hY2hpbmVzLCBidXQgd2lsbCB1c2Ugb25seSBvbmUgQ1BVIG9mIGEgbXVsdGlwcm9jZXNzb3IgbWFjaGluZS4gSWYKKwkgIHlvdSBzYXkgWSBoZXJlLCB0aGUga2VybmVsIHdpbGwgcnVuIG9uIHNpbmdsZS1wcm9jZXNzb3IgbWFjaGluZXMuCisJICBPbiBhIHNpbmdsZS1wcm9jZXNzb3IgbWFjaGluZSwgdGhlIGtlcm5lbCB3aWxsIHJ1biBmYXN0ZXIgaWYgeW91IHNheQorCSAgTiBoZXJlLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCitjb25maWcgTlJfQ1BVUworCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0xMjgpIgorCXJhbmdlIDIgMTI4CisJZGVwZW5kcyBvbiBTTVAKKwlkZWZhdWx0ICIzMiIgaWYgUFBDNjQKKwlkZWZhdWx0ICI0IgorCitjb25maWcgTk9UX0NPSEVSRU5UX0NBQ0hFCisJYm9vbAorCWRlcGVuZHMgb24gNHh4IHx8IDh4eCB8fCBFMjAwCisJZGVmYXVsdCB5CisKK2NvbmZpZyBDT05GSUdfQ0hFQ0tfQ0FDSEVfQ09IRVJFTkNZCisJYm9vbAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2FwdXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYXB1cy9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmRlM2JmLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvYXB1cy9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLQotY29uZmlnIEFNSUdBCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFtaWdhIHNlcmllcyBvZiBjb21wdXRlcnMuCi0KLWNvbmZpZyBaT1JSTwotCWJvb2wKLQlkZXBlbmRzIG9uIEFQVVMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFpvcnJvIGJ1cyBpbiB0aGUgQW1pZ2EuIElmIHlvdSBoYXZlCi0JICBleHBhbnNpb24gY2FyZHMgaW4geW91ciBBbWlnYSB0aGF0IGNvbmZvcm0gdG8gdGhlIEFtaWdhCi0JICBBdXRvQ29uZmlnKHRtKSBzcGVjaWZpY2F0aW9uLCBzYXkgWSwgb3RoZXJ3aXNlIE4uIE5vdGUgdGhhdCBldmVuCi0JICBleHBhbnNpb24gY2FyZHMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBab3JybyBzbG90cyBidXQgZml0IGluIGUuZy4KLQkgIHRoZSBDUFUgc2xvdCBtYXkgZmFsbCBpbiB0aGlzIGNhdGVnb3J5LCBzbyB5b3UgaGF2ZSB0byBzYXkgWSB0byBsZXQKLQkgIExpbnV4IHVzZSB0aGVzZS4KLQotY29uZmlnIEFCU1RSQUNUX0NPTlNPTEUKLQlib29sCi0JZGVwZW5kcyBvbiBBUFVTCi0JZGVmYXVsdCB5Ci0KLWNvbmZpZyBBUFVTX0ZBU1RfRVhDRVBUCi0JYm9vbAotCWRlcGVuZHMgb24gQVBVUwotCWRlZmF1bHQgeQotCi1jb25maWcgQU1JR0FfUENNQ0lBCi0JYm9vbCAiQW1pZ2EgMTIwMC82MDAgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBpbiB0aGUga2VybmVsIGZvciBwY21jaWEgb24gQW1pZ2EgMTIwMCBhbmQgQW1pZ2EKLQkgIDYwMC4gSWYgeW91IGludGVuZCB0byB1c2UgcGNtY2lhIGNhcmRzIHNheSBZOyBvdGhlcndpc2Ugc2F5IE4uCi0KLWNvbmZpZyBBTUlHQV9CVUlMVElOX1NFUklBTAotCXRyaXN0YXRlICJBbWlnYSBidWlsdGluIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSB5b3VyIEFtaWdhJ3MgYnVpbHQtaW4gc2VyaWFsIHBvcnQgaW4gTGludXgsCi0JICBhbnN3ZXIgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KLQotY29uZmlnIEdWUElPRVhUCi0JdHJpc3RhdGUgIkdWUCBJTy1FeHRlbmRlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIElmIHlvdSB3YW50IHRvIHVzZSBhIEdWUCBJTy1FeHRlbmRlciBzZXJpYWwgY2FyZCBpbiBMaW51eCwgc2F5IFkuCi0JICBPdGhlcndpc2UsIHNheSBOLgotCi1jb25maWcgR1ZQSU9FWFRfTFAKLQl0cmlzdGF0ZSAiR1ZQIElPLUV4dGVuZGVyIHBhcmFsbGVsIHByaW50ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdWUElPRVhUCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIGRyaXZpbmcgYSBwcmludGVyIGZyb20gdGhlIHBhcmFsbGVsIHBvcnQgb24geW91cgotCSAgR1ZQIElPLUV4dGVuZGVyIGNhcmQsIE4gb3RoZXJ3aXNlLgotCi1jb25maWcgR1ZQSU9FWFRfUExJUAotCXRyaXN0YXRlICJHVlAgSU8tRXh0ZW5kZXIgUExJUCBzdXBwb3J0IgotCWRlcGVuZHMgb24gR1ZQSU9FWFQKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgZG9pbmcgSVAgb3ZlciB0aGUgcGFyYWxsZWwgcG9ydCBvbiB5b3VyIEdWUAotCSAgSU8tRXh0ZW5kZXIgY2FyZCwgTiBvdGhlcndpc2UuCi0KLWNvbmZpZyBNVUxUSUZBQ0VfSUlJX1RUWQotCXRyaXN0YXRlICJNdWx0aWZhY2UgQ2FyZCBJSUkgc2VyaWFsIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTCi0JaGVscAotCSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgTXVsdGlmYWNlIElJSSBjYXJkJ3Mgc2VyaWFsIHBvcnQgaW4gTGludXgsCi0JICBhbnN3ZXIgWS4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KLQotY29uZmlnIEEyMjMyCi0JdHJpc3RhdGUgIkNvbW1vZG9yZSBBMjIzMiBzZXJpYWwgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBBUFVTCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgdGhlIDIyMzIgNy1wb3J0IHNlcmlhbCBjYXJkIHNoaXBwZWQgd2l0aCB0aGUKLQkgIEFtaWdhIDIwMDAgYW5kIG90aGVyIFpvcnJvLWJ1cyBtYWNoaW5lcywgZGF0aW5nIGZyb20gMTk4OS4gIEF0Ci0JICBhIG1heCBvZiAxOSwyMDAgYnBzLCB0aGUgcG9ydHMgYXJlIHNlcnZlZCBieSBhIDY1NTEgQUNJQSBVQVJUIGNoaXAKLQkgIGVhY2gsIHBsdXMgYSA4NTIwIENJQSwgYW5kIGEgbWFzdGVyIDY1MDIgQ1BVIGFuZCBidWZmZXIgYXMgd2VsbC4gVGhlCi0JICBwb3J0cyB3ZXJlIGNvbm5lY3RlZCB3aXRoIDggcGluIERJTiBjb25uZWN0b3JzIG9uIHRoZSBjYXJkIGJyYWNrZXQsCi0JICBmb3Igd2hpY2ggOCBwaW4gdG8gREIyNSBhZGFwdGVycyB3ZXJlIHN1cHBsaWVkLiBUaGUgY2FyZCBhbHNvIGhhZAotCSAganVtcGVycyBpbnRlcm5hbGx5IHRvIHRvZ2dsZSB2YXJpb3VzIHBpbm5pbmcgY29uZmlndXJhdGlvbnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZTsgYnV0IHRoZW4gImdlbmVyaWNfc2VyaWFsIgotCSAgd2lsbCBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGlzIGhhcyB0byBiZSBsb2FkZWQgYmVmb3JlCi0JICAic2VyX2EyMjMyIi4gSWYgeW91IHdhbnQgdG8gZG8gdGhpcywgYW5zd2VyIE0gaGVyZS4KLQotY29uZmlnIFdISVBQRVRfU0VSSUFMCi0JdHJpc3RhdGUgIkhpc29mdCBXaGlwcGV0IFBDTUNJQSBzZXJpYWwgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFNSUdBX1BDTUNJQQotCWhlbHAKLQkgIEhpU29mdCBoYXMgYSB3ZWIgcGFnZSBhdCA8aHR0cDovL3d3dy5oaXNvZnQuY28udWsvPiwgYnV0IHRoZXJlCi0JICBpcyBubyBsaXN0aW5nIGZvciB0aGUgV2hpcHBldCBpbiB0aGVpciBBbWlnYSBzZWN0aW9uLgotCi1jb25maWcgQVBORQotCXRyaXN0YXRlICJQQ01DSUEgTkUyMDAwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBTUlHQV9QQ01DSUEKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhIFBDTUNJQSBORTIwMDAgY29tcGF0aWJsZSBhZGFwdGVyLCBzYXkgWS4gIE90aGVyd2lzZSwKLQkgIHNheSBOLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcG5lLgotCi1jb25maWcgU0VSSUFMX0NPTlNPTEUKLQlib29sICJTdXBwb3J0IGZvciBzZXJpYWwgcG9ydCBjb25zb2xlIgotCWRlcGVuZHMgb24gQVBVUyAmJiAoQU1JR0FfQlVJTFRJTl9TRVJJQUw9eSB8fCBHVlBJT0VYVD15IHx8IE1VTFRJRkFDRV9JSUlfVFRZPXkpCi0KLWNvbmZpZyBIRUFSVEJFQVQKLQlib29sICJVc2UgcG93ZXIgTEVEIGFzIGEgaGVhcnRiZWF0IgotCWRlcGVuZHMgb24gQVBVUwotCWhlbHAKLQkgIFVzZSB0aGUgcG93ZXItb24gTEVEIG9uIHlvdXIgbWFjaGluZSBhcyBhIGxvYWQgbWV0ZXIuICBUaGUgZXhhY3QKLQkgIGJlaGF2aW9yIGlzIHBsYXRmb3JtLWRlcGVuZGVudCwgYnV0IG5vcm1hbGx5IHRoZSBmbGFzaCBmcmVxdWVuY3kgaXMKLQkgIGEgaHlwZXJib2xpYyBmdW5jdGlvbiBvZiB0aGUgNS1taW51dGUgbG9hZCBhdmVyYWdlLgotCi1jb25maWcgUFJPQ19IQVJEV0FSRQotCWJvb2wgIi9wcm9jL2hhcmR3YXJlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUFVTCi0KLXNvdXJjZSAiZHJpdmVycy96b3Jyby9LY29uZmlnIgotCi1jb25maWcgUENJX1BFUk1FRElBCi0JYm9vbCAiUENJIGZvciBQZXJtZWRpYTIiCi0JZGVwZW5kcyBvbiAhNHh4ICYmICE4eHggJiYgQVBVUwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvLXdvcmthcm91bmRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwppbmRleCA3ZmI5MmYyLi45ZDdjMmVmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW8td29ya2Fyb3VuZHMuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCXZhZGRyID0gKHVuc2lnbmVkIGxvbmcpUENJX0ZJWF9BRERSKGFkZHIpOwogCiAJCS8qIENoZWNrIGlmIGl0J3MgaW4gYWxsb3dlZCByYW5nZSBmb3IgIFBJTyAqLwotCQlpZiAodmFkZHIgPCBQSEJTX0lPX0JBU0UgfHwgdmFkZHIgPj0gSU1BTExPQ19CQVNFKQorCQlpZiAodmFkZHIgPCBQSEJfSU9fQkFTRSB8fCB2YWRkciA+IFBIQl9JT19FTkQpCiAJCQlyZXR1cm47CiAKIAkJLyogVHJ5IHRvIGZpbmQgYSBQVEUuIElmIG5vdCwgY2xlYXIgdGhlIHBhZGRyLCB3ZSdsbCBkbwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwppbmRleCBhN2Y1YTc2Li45NmE4ZjYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbnV4X2xvZ28uaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgogI2luY2x1ZGUgPGFzbS94bW9uLmg+CkBAIC0xODMsNyArMTg0LDcgQEAKIAkJc3B1LT5zbGJfcmVwbGFjZSA9IDA7CiAKIAlzcHVfcmVzdGFydF9kbWEoc3B1KTsKLQorCXNwdS0+c3RhdHMuc2xiX2ZsdCsrOwogCXJldHVybiAwOwogfQogCkBAIC0zMzIsNiArMzMzLDcgQEAKIAlpZiAoc3RhdCAmIDB4MTApIC8qIFNQVSBtYWlsYm94IHRocmVzaG9sZCAqLwogCQlzcHUtPndib3hfY2FsbGJhY2soc3B1KTsKIAorCXNwdS0+c3RhdHMuY2xhc3MyX2ludHIrKzsKIAlyZXR1cm4gc3RhdCA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9CiAKQEAgLTQ2Miw4ICs0NjQsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwdV9mcmVlKTsKIAorc3RhdGljIGludCBzcHVfc2h1dGRvd24oc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldikKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCisJc3B1X2ZyZWVfaXJxcyhzcHUpOworCXNwdV9kZXN0cm95X3NwdShzcHUpOworCXJldHVybiAwOworfQorCiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHNwdV9zeXNkZXZfY2xhc3MgPSB7Ci0Jc2V0X2tzZXRfbmFtZSgic3B1IikKKwlzZXRfa3NldF9uYW1lKCJzcHUiKSwKKwkuc2h1dGRvd24gPSBzcHVfc2h1dGRvd24sCiB9OwogCiBpbnQgc3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cikKQEAgLTU3NCw2ICs1ODYsOSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwdV9saXN0X2xvY2ssIGZsYWdzKTsKIAltdXRleF91bmxvY2soJnNwdV9tdXRleCk7CiAKKwlzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlID0gU1BVX1VUSUxfSURMRTsKKwlzcHUtPnN0YXRzLnRzdGFtcCA9IGppZmZpZXM7CisKIAlnb3RvIG91dDsKIAogb3V0X2ZyZWVfaXJxczoKQEAgLTU4Niw2ICs2MDEsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqc3B1X3N0YXRlX25hbWVzW10gPSB7CisJInVzZXIiLCAic3lzdGVtIiwgImlvd2FpdCIsICJpZGxlIgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzcHVfYWNjdF90aW1lKHN0cnVjdCBzcHUgKnNwdSwKKwkJZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWUgPSBzcHUtPnN0YXRzLnRpbWVzW3N0YXRlXTsKKworCWlmIChzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlID09IHN0YXRlKQorCQl0aW1lICs9IGppZmZpZXMgLSBzcHUtPnN0YXRzLnRzdGFtcDsKKworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHNwdV9zdGF0X3Nob3coc3RydWN0IHN5c19kZXZpY2UgKnN5c2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcHUgKnNwdSA9IGNvbnRhaW5lcl9vZihzeXNkZXYsIHN0cnVjdCBzcHUsIHN5c2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICIKKwkJICAgICAgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJc3B1X3N0YXRlX25hbWVzW3NwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGVdLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfVVNFUiksCisJCXNwdV9hY2N0X3RpbWUoc3B1LCBTUFVfVVRJTF9TWVNURU0pLAorCQlzcHVfYWNjdF90aW1lKHNwdSwgU1BVX1VUSUxfSU9XQUlUKSwKKwkJc3B1X2FjY3RfdGltZShzcHUsIFNQVV9VVElMX0lETEUpLAorCQlzcHUtPnN0YXRzLnZvbF9jdHhfc3dpdGNoLAorCQlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2gsCisJCXNwdS0+c3RhdHMuc2xiX2ZsdCwKKwkJc3B1LT5zdGF0cy5oYXNoX2ZsdCwKKwkJc3B1LT5zdGF0cy5taW5fZmx0LAorCQlzcHUtPnN0YXRzLm1hal9mbHQsCisJCXNwdS0+c3RhdHMuY2xhc3MyX2ludHIsCisJCXNwdS0+c3RhdHMubGliYXNzaXN0KTsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKHN0YXQsIDA2NDQsIHNwdV9zdGF0X3Nob3csIE5VTEwpOworCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwdV9iYXNlKHZvaWQpCiB7CiAJaW50IGksIHJldCA9IDA7CkBAIC02MDMsMTQgKzY1NywyOCBAQAogCiAJcmV0ID0gc3B1X2VudW1lcmF0ZV9zcHVzKGNyZWF0ZV9zcHUpOwogCi0JaWYgKHJldCkgeworCWlmIChyZXQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBpbml0aWFsaXppbmcgc3B1c1xuIiwKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gb3V0X3VucmVnaXN0ZXJfc3lzZGV2X2NsYXNzOwogCX0KIAorCWlmIChyZXQgPiAwKSB7CisJCS8qCisJCSAqIFdlIGNhbm5vdCBwdXQgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24gaW4KKwkJICogPGxpbnV4L2xpbnV4X2xvZ28uaD4gYmVjYXVzZSBvZiBjb25mbGljdGluZyBzZXNzaW9uIHR5cGUKKwkJICogY29uZmxpY3RzIGZvciBjb25zdCBhbmQgX19pbml0ZGF0YSB3aXRoIGRpZmZlcmVudCBjb21waWxlcgorCQkgKiB2ZXJzaW9ucworCQkgKi8KKwkJZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3BlX2NsdXQyMjQ7CisKKwkJZmJfYXBwZW5kX2V4dHJhX2xvZ28oJmxvZ29fc3BlX2NsdXQyMjQsIHJldCk7CisJfQorCiAJeG1vbl9yZWdpc3Rlcl9zcHVzKCZzcHVfZnVsbF9saXN0KTsKIAorCXNwdV9hZGRfc3lzZGV2X2F0dHIoJmF0dHJfc3RhdCk7CisKIAlyZXR1cm4gMDsKIAogIG91dF91bnJlZ2lzdGVyX3N5c2Rldl9jbGFzczoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCmluZGV4IDFkNDU2MmEuLjc1ZWQ1MGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwpAQCAtMjc5LDYgKzI3OSw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgaW50IG4gPSAwOwogCiAJcmV0ID0gLUVOT0RFVjsKIAlmb3IgKG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic3BlIik7CkBAIC0yODksOCArMjkwLDkgQEAKIAkJCQlfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUpOwogCQkJYnJlYWs7CiAJCX0KKwkJbisrOwogCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQgPyByZXQgOiBuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9jcmVhdGVfc3B1KHN0cnVjdCBzcHUgKnNwdSwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9iYWNraW5nX29wcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKaW5kZXggZDMyZGI5Zi4uMDdhMGU4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMKQEAgLTMyMCw2ICszMjAsMTIgQEAKIAkvKiBGSVhNRTogd2hhdCBhcmUgdGhlIHNpZGUtZWZmZWN0cyBvZiB0aGlzPyAqLwogCXByb2ItPmRtYV9xdWVyeW1hc2tfUlcgPSBtYXNrOwogCXByb2ItPmRtYV9xdWVyeXR5cGVfUlcgPSBtb2RlOworCS8qIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgU1BVIGNvbnRleHQgaXMgYWx3YXlzCisJICogYWNxdWlyZWQgaW4gcnVubmFibGUgc3RhdGUgd2hlbiBuZXcgYml0cyBhcmUgYWRkZWQgdG8gdGhlCisJICogbWFzayAodGFnd2FpdCksIHNvIGl0J3Mgc3VmZmljaWVudCBqdXN0IHRvIG1hc2sKKwkgKiBkbWFfdGFnc3RhdHVzX1Igd2l0aCB0aGUgJ21hc2snIHBhcmFtZXRlciBoZXJlLgorCSAqLworCWN0eC0+Y3NhLnByb2IuZG1hX3RhZ3N0YXR1c19SICY9IG1hc2s7CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+Y3NhLnJlZ2lzdGVyX2xvY2spOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwppbmRleCA3YzUxY2I1Li42ZDdiZDYwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKQEAgLTIzLDEwICsyMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgogI2luY2x1ZGUgInNwdWZzLmgiCiAKKworYXRvbWljX3QgbnJfc3B1X2NvbnRleHRzID0gQVRPTUlDX0lOSVQoMCk7CisKIHN0cnVjdCBzcHVfY29udGV4dCAqYWxsb2Nfc3B1X2NvbnRleHQoc3RydWN0IHNwdV9nYW5nICpnYW5nKQogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OwpAQCAtNTMsMTAgKzU3LDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJmN0eC0+cnEpOwogCWlmIChnYW5nKQogCQlzcHVfZ2FuZ19hZGRfY3R4KGdhbmcsIGN0eCk7Ci0JY3R4LT5ydF9wcmlvcml0eSA9IGN1cnJlbnQtPnJ0X3ByaW9yaXR5OwotCWN0eC0+cG9saWN5ID0gY3VycmVudC0+cG9saWN5OwotCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnByaW87Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmN0eC0+c2NoZWRfd29yaywgc3B1X3NjaGVkX3RpY2spOworCWN0eC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCXNwdV9zZXRfdGltZXNsaWNlKGN0eCk7CisJY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgPSBTUFVDVFhfVVRJTF9VU0VSOworCWN0eC0+c3RhdHMudHN0YW1wID0gamlmZmllczsKKworCWF0b21pY19pbmMoJm5yX3NwdV9jb250ZXh0cyk7CiAJZ290byBvdXQ7CiBvdXRfZnJlZToKIAlrZnJlZShjdHgpOwpAQCAtNzYsNiArODIsNyBAQAogCWlmIChjdHgtPmdhbmcpCiAJCXNwdV9nYW5nX3JlbW92ZV9jdHgoY3R4LT5nYW5nLCBjdHgpOwogCUJVR19PTighbGlzdF9lbXB0eSgmY3R4LT5ycSkpOworCWF0b21pY19kZWMoJm5yX3NwdV9jb250ZXh0cyk7CiAJa2ZyZWUoY3R4KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwppbmRleCAwZjc1YzA3Li5lMDY0ZDBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmF1bHQuYwpAQCAtMzMsNyArMzMsOCBAQAogICogZnVuY3Rpb24uIEN1cnJlbnRseSwgdGhlcmUgYXJlIGEgZmV3IGNvcm5lciBjYXNlcyB0aGF0IHdlIGhhdmVuJ3QgaGFkCiAgKiB0byBoYW5kbGUgZm9ydHVuYXRlbHkuCiAgKi8KLXN0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwgdW5zaWduZWQgbG9uZyBkc2lzcikKK3N0YXRpYyBpbnQgc3B1X2hhbmRsZV9tbV9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwKKwkJdW5zaWduZWQgbG9uZyBkc2lzciwgdW5zaWduZWQgKmZsdCkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKIAl1bnNpZ25lZCBsb25nIGlzX3dyaXRlOwpAQCAtNzMsNyArNzQsOCBAQAogCQkJZ290byBiYWRfYXJlYTsKIAl9CiAJcmV0ID0gMDsKLQlzd2l0Y2ggKGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpKSB7CisJKmZsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBlYSwgaXNfd3JpdGUpOworCXN3aXRjaCAoKmZsdCkgewogCWNhc2UgVk1fRkFVTFRfTUlOT1I6CiAJCWN1cnJlbnQtPm1pbl9mbHQrKzsKIAkJYnJlYWs7CkBAIC0xNTMsNiArMTU1LDcgQEAKIHsKIAl1NjQgZWEsIGRzaXNyLCBhY2Nlc3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmbHQgPSAwOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMTc4LDkgKzE4MSwxNyBAQAogCWlmICghKGRzaXNyICYgKE1GQ19EU0lTUl9QVEVfTk9UX0ZPVU5EIHwgTUZDX0RTSVNSX0FDQ0VTU19ERU5JRUQpKSkKIAkJcmV0dXJuIDA7CiAKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfSU9XQUlUKTsKKwogCXByX2RlYnVnKCJjdHggJXA6IGVhICUwMTZseCwgZHNpc3IgJTAxNmx4IHN0YXRlICVkXG4iLCBjdHgsIGVhLAogCQlkc2lzciwgY3R4LT5zdGF0ZSk7CiAKKwljdHgtPnN0YXRzLmhhc2hfZmx0Kys7CisJaWYgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1JVTk5BQkxFKSB7CisJCWN0eC0+c3B1LT5zdGF0cy5oYXNoX2ZsdCsrOworCQlzcHVfc3dpdGNoX3N0YXRlKGN0eC0+c3B1LCBTUFVfVVRJTF9JT1dBSVQpOworCX0KKwogCS8qIHdlIG11c3Qgbm90IGhvbGQgdGhlIGxvY2sgd2hlbiBlbnRlcmluZyBzcHVfaGFuZGxlX21tX2ZhdWx0ICovCiAJc3B1X3JlbGVhc2UoY3R4KTsKIApAQCAtMTkyLDcgKzIwMyw3IEBACiAKIAkvKiBoYXNoaW5nIGZhaWxlZCwgc28gdHJ5IHRoZSBhY3R1YWwgZmF1bHQgaGFuZGxlciAqLwogCWlmIChyZXQpCi0JCXJldCA9IHNwdV9oYW5kbGVfbW1fZmF1bHQoY3VycmVudC0+bW0sIGVhLCBkc2lzcik7CisJCXJldCA9IHNwdV9oYW5kbGVfbW1fZmF1bHQoY3VycmVudC0+bW0sIGVhLCBkc2lzciwgJmZsdCk7CiAKIAlzcHVfYWNxdWlyZShjdHgpOwogCS8qCkBAIC0yMDEsMTEgKzIxMiwyMyBAQAogCSAqIEluIGNhc2Ugb2YgdW5oYW5kbGVkIGVycm9yIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB1c2VyIHNwYWNlLgogCSAqLwogCWlmICghcmV0KSB7CisJCWlmIChmbHQgPT0gVk1fRkFVTFRfTUlOT1IpCisJCQljdHgtPnN0YXRzLm1pbl9mbHQrKzsKKwkJZWxzZQorCQkJY3R4LT5zdGF0cy5tYWpfZmx0Kys7CisJCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQkJaWYgKGZsdCA9PSBWTV9GQVVMVF9NSU5PUikKKwkJCQljdHgtPnNwdS0+c3RhdHMubWluX2ZsdCsrOworCQkJZWxzZQorCQkJCWN0eC0+c3B1LT5zdGF0cy5tYWpfZmx0Kys7CisJCX0KKwogCQlpZiAoY3R4LT5zcHUpCiAJCQljdHgtPm9wcy0+cmVzdGFydF9kbWEoY3R4KTsKIAl9IGVsc2UKIAkJc3B1ZnNfaGFuZGxlX2RtYV9lcnJvcihjdHgsIGVhLCBTUEVfRVZFTlRfU1BFX0RBVEFfU1RPUkFHRSk7CiAKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfU1lTVEVNKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3B1ZnNfaGFuZGxlX2NsYXNzMSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCBiMWU3ZTJmLi5jMjgxNGVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CkBAIC0zOSw2ICs0MCw3IEBACiAKICNkZWZpbmUgU1BVRlNfTU1BUF80SyAoUEFHRV9TSVpFID09IDB4MTAwMCkKIAorCiBzdGF0aWMgaW50CiBzcHVmc19tZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKQEAgLTIxNiwxMiArMjE4LDEyIEBACiAjZW5kaWYgLyogQ09ORklHX1NQVV9GU182NEtfTFMgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfbWVtX2ZvcHMgPSB7Ci0JLm9wZW4JIAkJPSBzcHVmc19tZW1fb3BlbiwKLQkucmVsZWFzZSAJCT0gc3B1ZnNfbWVtX3JlbGVhc2UsCi0JLnJlYWQgICAJCT0gc3B1ZnNfbWVtX3JlYWQsCi0JLndyaXRlICAgCQk9IHNwdWZzX21lbV93cml0ZSwKLQkubGxzZWVrICAJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkubW1hcCAgICAJCT0gc3B1ZnNfbWVtX21tYXAsCisJLm9wZW4JCQk9IHNwdWZzX21lbV9vcGVuLAorCS5yZWxlYXNlCQk9IHNwdWZzX21lbV9yZWxlYXNlLAorCS5yZWFkCQkJPSBzcHVmc19tZW1fcmVhZCwKKwkud3JpdGUJCQk9IHNwdWZzX21lbV93cml0ZSwKKwkubGxzZWVrCQkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5tbWFwCQkJPSBzcHVmc19tZW1fbW1hcCwKICNpZmRlZiBDT05GSUdfU1BVX0ZTXzY0S19MUwogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHNwdWZzX2dldF91bm1hcHBlZF9hcmVhLAogI2VuZGlmCkBAIC0xNDk3LDE0ICsxNDk5LDE1IEBACiAJCWlmIChzdGF0dXMpCiAJCQlyZXQgPSBzdGF0dXM7CiAJfQotCXNwdV9yZWxlYXNlKGN0eCk7CiAKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJY3R4LT50YWd3YWl0IHw9IDEgPDwgY21kLnRhZzsKIAlyZXQgPSBzaXplOwogCitvdXRfdW5sb2NrOgorCXNwdV9yZWxlYXNlKGN0eCk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MTUsMTQgKzE1MTgsMTQgQEAKIAl1MzIgZnJlZV9lbGVtZW50cywgdGFnc3RhdHVzOwogCXVuc2lnbmVkIGludCBtYXNrOwogCisJcG9sbF93YWl0KGZpbGUsICZjdHgtPm1mY193cSwgd2FpdCk7CisKIAlzcHVfYWNxdWlyZShjdHgpOwogCWN0eC0+b3BzLT5zZXRfbWZjX3F1ZXJ5KGN0eCwgY3R4LT50YWd3YWl0LCAyKTsKIAlmcmVlX2VsZW1lbnRzID0gY3R4LT5vcHMtPmdldF9tZmNfZnJlZV9lbGVtZW50cyhjdHgpOwogCXRhZ3N0YXR1cyA9IGN0eC0+b3BzLT5yZWFkX21mY190YWdzdGF0dXMoY3R4KTsKIAlzcHVfcmVsZWFzZShjdHgpOwogCi0JcG9sbF93YWl0KGZpbGUsICZjdHgtPm1mY193cSwgd2FpdCk7Ci0KIAltYXNrID0gMDsKIAlpZiAoZnJlZV9lbGVtZW50cyAmIDB4ZmZmZikKIAkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKQEAgLTE3OTcsNiArMTgwMCwyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNwdWZzX2NhcHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpCisJCXNlcV9wdXRzKHMsICJzY2hlZFxuIik7CisJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfSVNPTEFURSkpCisJCXNlcV9wdXRzKHMsICJzdGVwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc19jYXBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX2NhcHNfc2hvdywgU1BVRlNfSShpbm9kZSktPmlfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfY2Fwc19mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX2NhcHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwogc3RhdGljIHNzaXplX3QgX19zcHVmc19tYm94X2luZm9fcmVhZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKIAkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQogewpAQCAtMjAxNCw3ICsyMDQwLDEwNSBAQAogCS5yZWFkID0gc3B1ZnNfcHJveHlkbWFfaW5mb19yZWFkLAogfTsKIAorc3RhdGljIGludCBzcHVmc19zaG93X3RpZChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiJWRcbiIsIGN0eC0+dGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc190aWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc3B1ZnNfc2hvd190aWQsIFNQVUZTX0koaW5vZGUpLT5pX2N0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX3RpZF9mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX3RpZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3R4X3N0YXRlX25hbWVzW10gPSB7CisJInVzZXIiLCAic3lzdGVtIiwgImlvd2FpdCIsICJsb2FkZWQiCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX2FjY3RfdGltZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgdGltZSA9IGN0eC0+c3RhdHMudGltZXNbc3RhdGVdOworCisJaWYgKGN0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlID09IHN0YXRlKQorCQl0aW1lICs9IGppZmZpZXMgLSBjdHgtPnN0YXRzLnRzdGFtcDsKKworCXJldHVybiBqaWZmaWVzX3RvX21zZWNzKHRpbWUpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX3NsYl9mbHRzKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGJfZmx0cyA9IGN0eC0+c3RhdHMuc2xiX2ZsdDsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQlzbGJfZmx0cyArPSAoY3R4LT5zcHUtPnN0YXRzLnNsYl9mbHQgLQorCQkJICAgICBjdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSk7CisJfQorCisJcmV0dXJuIHNsYl9mbHRzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHNwdWZzX2NsYXNzMl9pbnRycyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHJzID0gY3R4LT5zdGF0cy5jbGFzczJfaW50cjsKKworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkgeworCQljbGFzczJfaW50cnMgKz0gKGN0eC0+c3B1LT5zdGF0cy5jbGFzczJfaW50ciAtCisJCQkJIGN0eC0+c3RhdHMuY2xhc3MyX2ludHJfYmFzZSk7CisJfQorCisJcmV0dXJuIGNsYXNzMl9pbnRyczsKK30KKworCitzdGF0aWMgaW50IHNwdWZzX3Nob3dfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBzLT5wcml2YXRlOworCisJc3B1X2FjcXVpcmUoY3R4KTsKKwlzZXFfcHJpbnRmKHMsICIlcyAlbGx1ICVsbHUgJWxsdSAlbGx1ICIKKwkJICAgICAgIiVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJY3R4X3N0YXRlX25hbWVzW2N0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlXSwKKwkJc3B1ZnNfYWNjdF90aW1lKGN0eCwgU1BVQ1RYX1VUSUxfVVNFUiksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX1NZU1RFTSksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX0lPV0FJVCksCisJCXNwdWZzX2FjY3RfdGltZShjdHgsIFNQVUNUWF9VVElMX0xPQURFRCksCisJCWN0eC0+c3RhdHMudm9sX2N0eF9zd2l0Y2gsCisJCWN0eC0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCwKKwkJc3B1ZnNfc2xiX2ZsdHMoY3R4KSwKKwkJY3R4LT5zdGF0cy5oYXNoX2ZsdCwKKwkJY3R4LT5zdGF0cy5taW5fZmx0LAorCQljdHgtPnN0YXRzLm1hal9mbHQsCisJCXNwdWZzX2NsYXNzMl9pbnRycyhjdHgpLAorCQljdHgtPnN0YXRzLmxpYmFzc2lzdCk7CisJc3B1X3JlbGVhc2UoY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVmc19zdGF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNwdWZzX3Nob3dfc3RhdCwgU1BVRlNfSShpbm9kZSktPmlfY3R4KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1ZnNfc3RhdF9mb3BzID0geworCS5vcGVuCQk9IHNwdWZzX3N0YXRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfY29udGVudHNbXSA9IHsKKwl7ICJjYXBhYmlsaXRpZXMiLCAmc3B1ZnNfY2Fwc19mb3BzLCAwNDQ0LCB9LAogCXsgIm1lbSIsICAmc3B1ZnNfbWVtX2ZvcHMsICAwNjY2LCB9LAogCXsgInJlZ3MiLCAmc3B1ZnNfcmVnc19mb3BzLCAgMDY2NiwgfSwKIAl7ICJtYm94IiwgJnNwdWZzX21ib3hfZm9wcywgMDQ0NCwgfSwKQEAgLTIwNDYsMTAgKzIxNzAsMTMgQEAKIAl7ICJ3Ym94X2luZm8iLCAmc3B1ZnNfd2JveF9pbmZvX2ZvcHMsIDA0NDQsIH0sCiAJeyAiZG1hX2luZm8iLCAmc3B1ZnNfZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKIAl7ICJwcm94eWRtYV9pbmZvIiwgJnNwdWZzX3Byb3h5ZG1hX2luZm9fZm9wcywgMDQ0NCwgfSwKKwl7ICJ0aWQiLCAmc3B1ZnNfdGlkX2ZvcHMsIDA0NDQsIH0sCisJeyAic3RhdCIsICZzcHVmc19zdGF0X2ZvcHMsIDA0NDQsIH0sCiAJe30sCiB9OwogCiBzdHJ1Y3QgdHJlZV9kZXNjciBzcHVmc19kaXJfbm9zY2hlZF9jb250ZW50c1tdID0geworCXsgImNhcGFiaWxpdGllcyIsICZzcHVmc19jYXBzX2ZvcHMsIDA0NDQsIH0sCiAJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCiAJeyAibWJveCIsICZzcHVmc19tYm94X2ZvcHMsIDA0NDQsIH0sCiAJeyAiaWJveCIsICZzcHVmc19pYm94X2ZvcHMsIDA0NDQsIH0sCkBAIC0yMDY4LDYgKzIxOTUsOCBAQAogCXsgInBzbWFwIiwgJnNwdWZzX3BzbWFwX2ZvcHMsIDA2NjYsIH0sCiAJeyAicGh5cy1pZCIsICZzcHVmc19pZF9vcHMsIDA2NjYsIH0sCiAJeyAib2JqZWN0LWlkIiwgJnNwdWZzX29iamVjdF9pZF9vcHMsIDA2NjYsIH0sCisJeyAidGlkIiwgJnNwdWZzX3RpZF9mb3BzLCAwNDQ0LCB9LAorCXsgInN0YXQiLCAmc3B1ZnNfc3RhdF9mb3BzLCAwNDQ0LCB9LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwppbmRleCA5ODA3MjA2Li5mMzc0NjBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYwpAQCAtMjMyLDEwICsyMzIsNiBAQAogCXJldHVybiBkY2FjaGVfZGlyX2Nsb3NlKGlub2RlLCBmaWxlKTsKIH0KIAotY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3B1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0JLmxvb2t1cCA9IHNpbXBsZV9sb29rdXAsCi19OwotCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNwdWZzX2NvbnRleHRfZm9wcyA9IHsKIAkub3BlbgkJPSBkY2FjaGVfZGlyX29wZW4sCiAJLnJlbGVhc2UJPSBzcHVmc19kaXJfY2xvc2UsCkBAIC0yNjksNyArMjY1LDcgQEAKIAkJZ290byBvdXRfaXB1dDsKIAogCWN0eC0+ZmxhZ3MgPSBmbGFnczsKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAlpZiAoZmxhZ3MgJiBTUFVfQ1JFQVRFX05PU0NIRUQpCiAJCXJldCA9IHNwdWZzX2ZpbGxfZGlyKGRlbnRyeSwgc3B1ZnNfZGlyX25vc2NoZWRfY29udGVudHMsCkBAIC0zODYsNyArMzgyLDcgQEAKIAlpZiAoIWdhbmcpCiAJCWdvdG8gb3V0X2lwdXQ7CiAKLQlpbm9kZS0+aV9vcCA9ICZzcHVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CkBAIC01OTMsNyArNTg5LDcgQEAKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKIAotCWlub2RlLT5pX29wID0gJnNwdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX29wID0gJnNpbXBsZV9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOwogCVNQVUZTX0koaW5vZGUpLT5pX2N0eCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwppbmRleCA1NzYyNjYwLi41OGFlMTNiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCkBAIC0yOSw3ICsyOSw4IEBACiAJc3B1ID0gY3R4LT5zcHU7CiAJcHRlX2ZhdWx0ID0gc3B1LT5kc2lzciAmCiAJICAgIChNRkNfRFNJU1JfUFRFX05PVF9GT1VORCB8IE1GQ19EU0lTUl9BQ0NFU1NfREVOSUVEKTsKLQlyZXR1cm4gKCEoKnN0YXQgJiAweDEpIHx8IHB0ZV9mYXVsdCB8fCBzcHUtPmNsYXNzXzBfcGVuZGluZykgPyAxIDogMDsKKwlyZXR1cm4gKCEoKnN0YXQgJiBTUFVfU1RBVFVTX1JVTk5JTkcpIHx8IHB0ZV9mYXVsdCB8fCBzcHUtPmNsYXNzXzBfcGVuZGluZykgPworCQkxIDogMDsKIH0KIAogc3RhdGljIGludCBzcHVfc2V0dXBfaXNvbGF0ZWQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCkBAIC0xNDIsOCArMTQzLDExIEBACiAJCQlydW5jbnRsID0gU1BVX1JVTkNOVExfUlVOTkFCTEU7CiAJCWN0eC0+b3BzLT5ydW5jbnRsX3dyaXRlKGN0eCwgcnVuY250bCk7CiAJfSBlbHNlIHsKLQkJc3B1X3N0YXJ0X3RpY2soY3R4KTsKKwkJdW5zaWduZWQgbG9uZyBtb2RlID0gU1BVX1BSSVZDTlRMX01PREVfTk9STUFMOwogCQljdHgtPm9wcy0+bnBjX3dyaXRlKGN0eCwgKm5wYyk7CisJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJCW1vZGUgPSBTUFVfUFJJVkNOVExfTU9ERV9TSU5HTEVfU1RFUDsKKwkJb3V0X2JlNjQoJmN0eC0+c3B1LT5wcml2Mi0+c3B1X3ByaXZjbnRsX1JXLCBtb2RlKTsKIAkJY3R4LT5vcHMtPnJ1bmNudGxfd3JpdGUoY3R4LCBTUFVfUlVOQ05UTF9SVU5OQUJMRSk7CiAJfQogCkBAIC0xNTUsNyArMTU5LDYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXNwdV9zdG9wX3RpY2soY3R4KTsKIAkqc3RhdHVzID0gY3R4LT5vcHMtPnN0YXR1c19yZWFkKGN0eCk7CiAJKm5wYyA9IGN0eC0+b3BzLT5ucGNfcmVhZChjdHgpOwogCXNwdV9yZWxlYXNlKGN0eCk7CkBAIC0yOTgsOSArMzAxLDIyIEBACiAJY3R4LT5vcHMtPm1hc3Rlcl9zdGFydChjdHgpOwogCWN0eC0+ZXZlbnRfcmV0dXJuID0gMDsKIAotCXJldCA9IHNwdV9hY3F1aXJlX3J1bm5hYmxlKGN0eCwgMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzcHVfYWNxdWlyZShjdHgpOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgeworCQlfX3NwdV91cGRhdGVfc2NoZWRfaW5mbyhjdHgpOworCisJCXJldCA9IHNwdV9hY3RpdmF0ZShjdHgsIDApOworCQlpZiAocmV0KSB7CisJCQlzcHVfcmVsZWFzZShjdHgpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSB0aGUgc2NoZWR1bGluZyBwcmlvcml0eSB1bmRlciBhY3RpdmVfbXV0ZXgKKwkJICogdG8gcHJvdGVjdCBhZ2FpbnN0IGZpbmRfdmljdGltKCkuCisJCSAqLworCQlzcHVfdXBkYXRlX3NjaGVkX2luZm8oY3R4KTsKKwl9CiAKIAlyZXQgPSBzcHVfcnVuX2luaXQoY3R4LCBucGMpOwogCWlmIChyZXQpIHsKQEAgLTMyNSwxNiArMzQxLDIwIEBACiAKIAkJaWYgKHVubGlrZWx5KGN0eC0+c3RhdGUgIT0gU1BVX1NUQVRFX1JVTk5BQkxFKSkgewogCQkJcmV0ID0gc3B1X3JlYWNxdWlyZV9ydW5uYWJsZShjdHgsIG5wYywgJnN0YXR1cyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJc3B1X3N0b3BfdGljayhjdHgpOworCQkJaWYgKHJldCkKIAkJCQlnb3RvIG91dDI7Ci0JCQl9CiAJCQljb250aW51ZTsKIAkJfQogCQlyZXQgPSBzcHVfcHJvY2Vzc19ldmVudHMoY3R4KTsKIAogCX0gd2hpbGUgKCFyZXQgJiYgIShzdGF0dXMgJiAoU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1AgfAotCQkJCSAgICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUKSkpOworCQkJCSAgICAgIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUIHwKKwkJCQkgICAgICAgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCkpKTsKKworCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCisJICAgICgoKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpICYgMHgzZjAwKSA9PSAweDIxMDApICYmCisJICAgIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkpCisJCWN0eC0+c3RhdHMubGliYXNzaXN0Kys7CiAKIAljdHgtPm9wcy0+bWFzdGVyX3N0b3AoY3R4KTsKIAlyZXQgPSBzcHVfcnVuX2ZpbmkoY3R4LCBucGMsICZzdGF0dXMpOwpAQCAtMzQ0LDEwICszNjQsMTUgQEAKIAlpZiAoKHJldCA9PSAwKSB8fAogCSAgICAoKHJldCA9PSAtRVJFU1RBUlRTWVMpICYmCiAJICAgICAoKHN0YXR1cyAmIFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9IQUxUKSB8fAorCSAgICAgIChzdGF0dXMgJiBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQKSB8fAogCSAgICAgICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCiAJICAgICAgIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUICE9IDB4MjEwNCkpKSkpCiAJCXJldCA9IHN0YXR1czsKIAorCS8qIE5vdGU6IHdlIGRvbid0IG5lZWQgdG8gZm9yY2Vfc2lnIFNJR1RSQVAgb24gc2luZ2xlLXN0ZXAKKwkgKiBzaW5jZSB3ZSBoYXZlIFRJRl9TSU5HTEVTVEVQIHNldCwgdGh1cyB0aGUga2VybmVsIHdpbGwgZG8KKwkgKiBpdCB1cG9uIHJldHVybiBmcm9tIHRoZSBzeXNjYWxsIGFueWF3eQorCSAqLwogCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApCiAJICAgICYmIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSA9PSAweDNmZmYpIHsKIAkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAzYjgzMWUwLi5lNWI0ZGQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtMzUsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9udW1hLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KQEAgLTQzLDU0ICs0NywxMjYgQEAKICNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+CiAjaW5jbHVkZSAic3B1ZnMuaCIKIAotI2RlZmluZSBTUFVfVElNRVNMSUNFCShIWikKLQogc3RydWN0IHNwdV9wcmlvX2FycmF5IHsKIAlERUNMQVJFX0JJVE1BUChiaXRtYXAsIE1BWF9QUklPKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bnFbTUFYX1BSSU9dOwogCXNwaW5sb2NrX3QgcnVucV9sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2xpc3RbTUFYX05VTU5PREVTXTsKIAlzdHJ1Y3QgbXV0ZXggYWN0aXZlX211dGV4W01BWF9OVU1OT0RFU107CisJaW50IG5yX2FjdGl2ZVtNQVhfTlVNTk9ERVNdOworCWludCBucl93YWl0aW5nOwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgc3B1X2F2ZW5ydW5bM107CiBzdGF0aWMgc3RydWN0IHNwdV9wcmlvX2FycmF5ICpzcHVfcHJpbzsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc3B1X3NjaGVkX3dxOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3B1c2NoZWRfdGFzazsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzcHVzY2hlZF90aW1lcjsKIAotc3RhdGljIGlubGluZSBpbnQgbm9kZV9hbGxvd2VkKGludCBub2RlKQorLyoKKyAqIFByaW9yaXR5IG9mIGEgbm9ybWFsLCBub24tcnQsIG5vbi1uaWNlZCdkIHByb2Nlc3MgKGFrYSBuaWNlIGxldmVsIDApLgorICovCisjZGVmaW5lIE5PUk1BTF9QUklPCQkxMjAKKworLyoKKyAqIEZyZXF1ZW5jeSBvZiB0aGUgc3B1IHNjaGVkdWxlciB0aWNrLiAgQnkgZGVmYXVsdCB3ZSBkbyBvbmUgU1BVIHNjaGVkdWxlcgorICogdGljayBmb3IgZXZlcnkgMTAgQ1BVIHNjaGVkdWxlciB0aWNrcy4KKyAqLworI2RlZmluZSBTUFVTQ0hFRF9USUNLCQkoMTApCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlICd0dW5pbmcga25vYnMnIG9mIHRoZSBzY2hlZHVsZXI6CisgKgorICogTWluaW11bSB0aW1lc2xpY2UgaXMgNSBtc2VjcyAob3IgMSBzcHUgc2NoZWR1bGVyIHRpY2ssIHdoaWNoZXZlciBpcworICogbGFyZ2VyKSwgZGVmYXVsdCB0aW1lc2xpY2UgaXMgMTAwIG1zZWNzLCBtYXhpbXVtIHRpbWVzbGljZSBpcyA4MDAgbXNlY3MuCisgKi8KKyNkZWZpbmUgTUlOX1NQVV9USU1FU0xJQ0UJbWF4KDUgKiBIWiAvICgxMDAwICogU1BVU0NIRURfVElDSyksIDEpCisjZGVmaW5lIERFRl9TUFVfVElNRVNMSUNFCSgxMDAgKiBIWiAvICgxMDAwICogU1BVU0NIRURfVElDSykpCisKKyNkZWZpbmUgTUFYX1VTRVJfUFJJTwkJKE1BWF9QUklPIC0gTUFYX1JUX1BSSU8pCisjZGVmaW5lIFNDQUxFX1BSSU8oeCwgcHJpbykgXAorCW1heCh4ICogKE1BWF9QUklPIC0gcHJpbykgLyAoTUFYX1VTRVJfUFJJTyAvIDIpLCBNSU5fU1BVX1RJTUVTTElDRSkKKworLyoKKyAqIHNjYWxlIHVzZXItbmljZSB2YWx1ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0gdG8gdGltZSBzbGljZSB2YWx1ZXM6CisgKiBbODAwbXMgLi4uIDEwMG1zIC4uLiA1bXNdCisgKgorICogVGhlIGhpZ2hlciBhIHRocmVhZCdzIHByaW9yaXR5LCB0aGUgYmlnZ2VyIHRpbWVzbGljZXMKKyAqIGl0IGdldHMgZHVyaW5nIG9uZSByb3VuZCBvZiBleGVjdXRpb24uIEJ1dCBldmVuIHRoZSBsb3dlc3QKKyAqIHByaW9yaXR5IHRocmVhZCBnZXRzIE1JTl9USU1FU0xJQ0Ugd29ydGggb2YgZXhlY3V0aW9uIHRpbWUuCisgKi8KK3ZvaWQgc3B1X3NldF90aW1lc2xpY2Uoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7Ci0JY3B1bWFza190IG1hc2s7Ci0KLQlpZiAoIW5yX2NwdXNfbm9kZShub2RlKSkKLQkJcmV0dXJuIDA7Ci0JbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKLQlpZiAoIWNwdXNfaW50ZXJzZWN0cyhtYXNrLCBjdXJyZW50LT5jcHVzX2FsbG93ZWQpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKwlpZiAoY3R4LT5wcmlvIDwgTk9STUFMX1BSSU8pCisJCWN0eC0+dGltZV9zbGljZSA9IFNDQUxFX1BSSU8oREVGX1NQVV9USU1FU0xJQ0UgKiA0LCBjdHgtPnByaW8pOworCWVsc2UKKwkJY3R4LT50aW1lX3NsaWNlID0gU0NBTEVfUFJJTyhERUZfU1BVX1RJTUVTTElDRSwgY3R4LT5wcmlvKTsKIH0KIAotdm9pZCBzcHVfc3RhcnRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKKy8qCisgKiBVcGRhdGUgc2NoZWR1bGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgorICovCit2b2lkIF9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWlmIChjdHgtPnBvbGljeSA9PSBTQ0hFRF9SUikgewotCQkvKgotCQkgKiBNYWtlIHN1cmUgdGhlIGV4aXRpbmcgYml0IGlzIGNsZWFyZWQuCi0JCSAqLwotCQljbGVhcl9iaXQoU1BVX1NDSEVEX0VYSVRJTkcsICZjdHgtPnNjaGVkX2ZsYWdzKTsKLQkJbWIoKTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHNwdV9zY2hlZF93cSwgJmN0eC0+c2NoZWRfd29yaywgU1BVX1RJTUVTTElDRSk7Ci0JfQorCS8qCisJICogMzItQml0IGFzc2lnbm1lbnQgYXJlIGF0b21pYyBvbiBwb3dlcnBjLCBhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dAorCSAqIG1lbW9yeSBvcmRlcmluZyBoZXJlIGJlY2F1c2UgcmV0cml2aW5nIHRoZSBjb250cm9sbGluZyB0aHJlYWQgaXMKKwkgKiBwZXIgZGVmaW50aW9uIHJhY3kuCisJICovCisJY3R4LT50aWQgPSBjdXJyZW50LT5waWQ7CisKKwkvKgorCSAqIFdlIGRvIG91ciBvd24gcHJpb3JpdHkgY2FsY3VsYXRpb25zLCBzbyB3ZSBub3JtYWxseSB3YW50CisJICogLT5zdGF0aWNfcHJpbyB0byBzdGFydCB3aXRoLiBVbmZvcnR1bmF0ZWx5IHRoaWVzIGZpZWxkCisJICogY29udGFpbnMganVuayBmb3IgdGhyZWFkcyB3aXRoIGEgcmVhbHRpbWUgc2NoZWR1bGluZworCSAqIHBvbGljeSBzbyB3ZSBoYXZlIHRvIGxvb2sgYXQgLT5wcmlvIGluIHRoaXMgY2FzZS4KKwkgKi8KKwlpZiAocnRfcHJpbyhjdXJyZW50LT5wcmlvKSkKKwkJY3R4LT5wcmlvID0gY3VycmVudC0+cHJpbzsKKwllbHNlCisJCWN0eC0+cHJpbyA9IGN1cnJlbnQtPnN0YXRpY19wcmlvOworCWN0eC0+cG9saWN5ID0gY3VycmVudC0+cG9saWN5OworCisJLyoKKwkgKiBBIGxvdCBvZiBwbGFjZXMgdGhhdCBkb24ndCBob2xkIGFjdGl2ZV9tdXRleCBwb2tlIGludG8KKwkgKiBjcHVzX2FsbG93ZWQsIGluY2x1ZGluZyBncmFiX3J1bm5hYmxlX2NvbnRleHQgd2hpY2gKKwkgKiBhbHJlYWR5IGhvbGRzIHRoZSBydW5xX2xvY2suICBTbyBhYnVzZSBydW5xX2xvY2sKKwkgKiB0byBwcm90ZWN0IHRoaXMgZmllbGQgYXN3ZWxsLgorCSAqLworCXNwaW5fbG9jaygmc3B1X3ByaW8tPnJ1bnFfbG9jayk7CisJY3R4LT5jcHVzX2FsbG93ZWQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisJc3Bpbl91bmxvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogfQogCi12b2lkIHNwdV9zdG9wX3RpY2soc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCit2b2lkIHNwdV91cGRhdGVfc2NoZWRfaW5mbyhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlpZiAoY3R4LT5wb2xpY3kgPT0gU0NIRURfUlIpIHsKLQkJLyoKLQkJICogV2hpbGUgdGhlIHdvcmsgY2FuIGJlIHJlYXJtaW5nIG5vcm1hbGx5IHNldHRpbmcgdGhpcyBmbGFnCi0JCSAqIG1ha2VzIHN1cmUgaXQgZG9lcyBub3QgcmVhcm0gaXRzZWxmIGFueW1vcmUuCi0JCSAqLwotCQlzZXRfYml0KFNQVV9TQ0hFRF9FWElUSU5HLCAmY3R4LT5zY2hlZF9mbGFncyk7Ci0JCW1iKCk7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmN0eC0+c2NoZWRfd29yayk7CisJaW50IG5vZGUgPSBjdHgtPnNwdS0+bm9kZTsKKworCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCV9fc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKGN0eCk7CisJbXV0ZXhfdW5sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKK30KKworc3RhdGljIGludCBfX25vZGVfYWxsb3dlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgaW50IG5vZGUpCit7CisJaWYgKG5yX2NwdXNfbm9kZShub2RlKSkgeworCQljcHVtYXNrX3QgbWFzayA9IG5vZGVfdG9fY3B1bWFzayhub2RlKTsKKworCQlpZiAoY3B1c19pbnRlcnNlY3RzKG1hc2ssIGN0eC0+Y3B1c19hbGxvd2VkKSkKKwkJCXJldHVybiAxOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vZGVfYWxsb3dlZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwgaW50IG5vZGUpCit7CisJaW50IHJ2YWw7CisKKwlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOworCXJ2YWwgPSBfX25vZGVfYWxsb3dlZChjdHgsIG5vZGUpOworCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKworCXJldHVybiBydmFsOwogfQogCiAvKioKQEAgLTk5LDkgKzE3NSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBzcHVfYWRkX3RvX2FjdGl2ZV9saXN0KHN0cnVjdCBzcHUgKnNwdSkKIHsKLQltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W3NwdS0+bm9kZV0pOwotCWxpc3RfYWRkX3RhaWwoJnNwdS0+bGlzdCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtzcHUtPm5vZGVdKTsKLQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbc3B1LT5ub2RlXSk7CisJaW50IG5vZGUgPSBzcHUtPm5vZGU7CisKKwltdXRleF9sb2NrKCZzcHVfcHJpby0+YWN0aXZlX211dGV4W25vZGVdKTsKKwlzcHVfcHJpby0+bnJfYWN0aXZlW25vZGVdKys7CisJbGlzdF9hZGRfdGFpbCgmc3B1LT5saXN0LCAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdKTsKKwltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworfQorCitzdGF0aWMgdm9pZCBfX3NwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJbGlzdF9kZWxfaW5pdCgmc3B1LT5saXN0KTsKKwlzcHVfcHJpby0+bnJfYWN0aXZlW3NwdS0+bm9kZV0tLTsKIH0KIAogLyoqCkBAIC0xMTMsNyArMTk4LDcgQEAKIAlpbnQgbm9kZSA9IHNwdS0+bm9kZTsKIAogCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwotCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CisJX19zcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKIAltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogfQogCkBAIC0xNDQsNiArMjI5LDEwIEBACiB7CiAJcHJfZGVidWcoIiVzOiBwaWQ9JWQgU1BVPSVkIE5PREU9JWRcbiIsIF9fRlVOQ1RJT05fXywgY3VycmVudC0+cGlkLAogCQkgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7CisKKwljdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSA9IHNwdS0+c3RhdHMuc2xiX2ZsdDsKKwljdHgtPnN0YXRzLmNsYXNzMl9pbnRyX2Jhc2UgPSBzcHUtPnN0YXRzLmNsYXNzMl9pbnRyOworCiAJc3B1LT5jdHggPSBjdHg7CiAJc3B1LT5mbGFncyA9IDA7CiAJY3R4LT5zcHUgPSBzcHU7CkBAIC0xNjEsOCArMjUwLDggQEAKIAlzcHUtPnRpbWVzdGFtcCA9IGppZmZpZXM7CiAJc3B1X2NwdV9hZmZpbml0eV9zZXQoc3B1LCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzcHVfc3dpdGNoX25vdGlmeShzcHUsIGN0eCk7Ci0Jc3B1X2FkZF90b19hY3RpdmVfbGlzdChzcHUpOwogCWN0eC0+c3RhdGUgPSBTUFVfU1RBVEVfUlVOTkFCTEU7CisJc3B1X3N3aXRjaF9zdGF0ZShzcHUsIFNQVV9VVElMX1NZU1RFTSk7CiB9CiAKIC8qKgpAQCAtMTc1LDcgKzI2NCw4IEBACiAJcHJfZGVidWcoIiVzOiB1bmJpbmQgcGlkPSVkIFNQVT0lZCBOT0RFPSVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCSBzcHUtPnBpZCwgc3B1LT5udW1iZXIsIHNwdS0+bm9kZSk7CiAKLQlzcHVfcmVtb3ZlX2Zyb21fYWN0aXZlX2xpc3Qoc3B1KTsKKwlzcHVfc3dpdGNoX3N0YXRlKHNwdSwgU1BVX1VUSUxfSURMRSk7CisKIAlzcHVfc3dpdGNoX25vdGlmeShzcHUsIE5VTEwpOwogCXNwdV91bm1hcF9tYXBwaW5ncyhjdHgpOwogCXNwdV9zYXZlKCZjdHgtPmNzYSwgc3B1KTsKQEAgLTE5Miw2ICsyODIsMTEgQEAKIAljdHgtPnNwdSA9IE5VTEw7CiAJc3B1LT5mbGFncyA9IDA7CiAJc3B1LT5jdHggPSBOVUxMOworCisJY3R4LT5zdGF0cy5zbGJfZmx0ICs9CisJCShzcHUtPnN0YXRzLnNsYl9mbHQgLSBjdHgtPnN0YXRzLnNsYl9mbHRfYmFzZSk7CisJY3R4LT5zdGF0cy5jbGFzczJfaW50ciArPQorCQkoc3B1LT5zdGF0cy5jbGFzczJfaW50ciAtIGN0eC0+c3RhdHMuY2xhc3MyX2ludHJfYmFzZSk7CiB9CiAKIC8qKgpAQCAtMjAwLDIwICsyOTUsMzkgQEAKICAqLwogc3RhdGljIHZvaWQgX19zcHVfYWRkX3RvX3JxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewotCWludCBwcmlvID0gY3R4LT5wcmlvOwotCi0JbGlzdF9hZGRfdGFpbCgmY3R4LT5ycSwgJnNwdV9wcmlvLT5ydW5xW3ByaW9dKTsKLQlzZXRfYml0KHByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCS8qCisJICogVW5mb3J0dW5hdGVseSB0aGlzIGNvZGUgcGF0aCBjYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcworCSAqIG9uIGJlaGFsZiBvZiBhIHNpbmdsZSBjb250ZXh0IGR1ZSB0byB0aGUgd2F5IHRoZSBwcm9ibGVtIHN0YXRlCisJICogbW1hcCBzdXBwb3J0IHdvcmtzLgorCSAqCisJICogRm9ydHVuYXRlbHkgd2UgbmVlZCB0byB3YWtlIHVwIGFsbCB0aGVzZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUKKwkgKiBhbmQgY2FuIHNpbXBseSBza2lwIHRoZSBydW5xdWV1ZSBhZGRpdGlvbiBmb3IgZXZlcnkgYnV0IHRoZSBmaXJzdAorCSAqIHRocmVhZCBnZXR0aW5nIGludG8gdGhpcyBjb2RlcGF0aC4KKwkgKgorCSAqIEl0J3Mgc3RpbGwgcXVpdGUgaGFja3ksIGFuZCBsb25nLXRlcm0gd2Ugc2hvdWxkIHByb3h5IGFsbCBvdGhlcgorCSAqIHRocmVhZHMgdGhyb3VnaCB0aGUgb3duZXIgdGhyZWFkIHNvIHRoYXQgc3B1X3J1biBpcyBpbiBjb250cm9sCisJICogb2YgYWxsIHRoZSBzY2hlZHVsaW5nIGFjdGl2aXR5IGZvciBhIGdpdmVuIGNvbnRleHQuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+cnEpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmN0eC0+cnEsICZzcHVfcHJpby0+cnVucVtjdHgtPnByaW9dKTsKKwkJc2V0X2JpdChjdHgtPnByaW8sIHNwdV9wcmlvLT5iaXRtYXApOworCQlpZiAoIXNwdV9wcmlvLT5ucl93YWl0aW5nKyspCisJCQlfX21vZF90aW1lcigmc3B1c2NoZWRfdGltZXIsIGppZmZpZXMgKyBTUFVTQ0hFRF9USUNLKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fc3B1X2RlbF9mcm9tX3JxKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogewogCWludCBwcmlvID0gY3R4LT5wcmlvOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnJxKSkKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cnEpKSB7CisJCWlmICghLS1zcHVfcHJpby0+bnJfd2FpdGluZykKKwkJCWRlbF90aW1lcigmc3B1c2NoZWRfdGltZXIpOwogCQlsaXN0X2RlbF9pbml0KCZjdHgtPnJxKTsKLQlpZiAobGlzdF9lbXB0eSgmc3B1X3ByaW8tPnJ1bnFbcHJpb10pKQotCQljbGVhcl9iaXQocHJpbywgc3B1X3ByaW8tPmJpdG1hcCk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnNwdV9wcmlvLT5ydW5xW3ByaW9dKSkKKwkJCWNsZWFyX2JpdChwcmlvLCBzcHVfcHJpby0+Yml0bWFwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHNwdV9wcmlvX3dhaXQoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCkBAIC0yNDQsNyArMzU4LDcgQEAKIAogCWZvciAobiA9IDA7IG4gPCBNQVhfTlVNTk9ERVM7IG4rKywgbm9kZSsrKSB7CiAJCW5vZGUgPSAobm9kZSA8IE1BWF9OVU1OT0RFUykgPyBub2RlIDogMDsKLQkJaWYgKCFub2RlX2FsbG93ZWQobm9kZSkpCisJCWlmICghbm9kZV9hbGxvd2VkKGN0eCwgbm9kZSkpCiAJCQljb250aW51ZTsKIAkJc3B1ID0gc3B1X2FsbG9jX25vZGUobm9kZSk7CiAJCWlmIChzcHUpCkBAIC0yNzYsMTUgKzM5MCwxNSBAQAogCW5vZGUgPSBjcHVfdG9fbm9kZShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlmb3IgKG4gPSAwOyBuIDwgTUFYX05VTU5PREVTOyBuKyssIG5vZGUrKykgewogCQlub2RlID0gKG5vZGUgPCBNQVhfTlVNTk9ERVMpID8gbm9kZSA6IDA7Ci0JCWlmICghbm9kZV9hbGxvd2VkKG5vZGUpKQorCQlpZiAoIW5vZGVfYWxsb3dlZChjdHgsIG5vZGUpKQogCQkJY29udGludWU7CiAKIAkJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3B1LCAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdLCBsaXN0KSB7CiAJCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKnRtcCA9IHNwdS0+Y3R4OwogCi0JCQlpZiAodG1wLT5ydF9wcmlvcml0eSA8IGN0eC0+cnRfcHJpb3JpdHkgJiYKLQkJCSAgICAoIXZpY3RpbSB8fCB0bXAtPnJ0X3ByaW9yaXR5IDwgdmljdGltLT5ydF9wcmlvcml0eSkpCisJCQlpZiAodG1wLT5wcmlvID4gY3R4LT5wcmlvICYmCisJCQkgICAgKCF2aWN0aW0gfHwgdG1wLT5wcmlvID4gdmljdGltLT5wcmlvKSkKIAkJCQl2aWN0aW0gPSBzcHUtPmN0eDsKIAkJfQogCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwpAQCAtMzEyLDcgKzQyNiwxMCBAQAogCQkJCXZpY3RpbSA9IE5VTEw7CiAJCQkJZ290byByZXN0YXJ0OwogCQkJfQorCQkJc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJCQlzcHVfdW5iaW5kX2NvbnRleHQoc3B1LCB2aWN0aW0pOworCQkJdmljdGltLT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CisJCQlzcHUtPnN0YXRzLmludm9sX2N0eF9zd2l0Y2grKzsKIAkJCW11dGV4X3VubG9jaygmdmljdGltLT5zdGF0ZV9tdXRleCk7CiAJCQkvKgogCQkJICogV2UgbmVlZCB0byBicmVhayBvdXQgb2YgdGhlIHdhaXQgbG9vcCBpbiBzcHVfcnVuCkBAIC0zMzgsMjIgKzQ1NSwzMCBAQAogICovCiBpbnQgc3B1X2FjdGl2YXRlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCi0JaWYgKGN0eC0+c3B1KQotCQlyZXR1cm4gMDsKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfU1lTVEVNKTsKIAogCWRvIHsKIAkJc3RydWN0IHNwdSAqc3B1OwogCisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgc2luZ2xlIGNvbnRleHQKKwkJICogb25seSBvbmUgYWN0dWFsbHkgYmluZHMgdGhlIGNvbnRleHQgd2hpbGUgdGhlIG90aGVycyB3aWxsCisJCSAqIG9ubHkgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBzdGF0ZV9tdXRleCBvbmNlIHRoZSBjb250ZXh0CisJCSAqIGFscmVhZHkgaXMgaW4gcnVubmFibGUgc3RhdGUuCisJCSAqLworCQlpZiAoY3R4LT5zcHUpCisJCQlyZXR1cm4gMDsKKwogCQlzcHUgPSBzcHVfZ2V0X2lkbGUoY3R4KTsKIAkJLyoKIAkJICogSWYgdGhpcyBpcyBhIHJlYWx0aW1lIHRocmVhZCB3ZSB0cnkgdG8gZ2V0IGl0IHJ1bm5pbmcgYnkKIAkJICogcHJlZW1wdGluZyBhIGxvd2VyIHByaW9yaXR5IHRocmVhZC4KIAkJICovCi0JCWlmICghc3B1ICYmIGN0eC0+cnRfcHJpb3JpdHkpCisJCWlmICghc3B1ICYmIHJ0X3ByaW8oY3R4LT5wcmlvKSkKIAkJCXNwdSA9IGZpbmRfdmljdGltKGN0eCk7CiAJCWlmIChzcHUpIHsKIAkJCXNwdV9iaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCQkJc3B1X2FkZF90b19hY3RpdmVfbGlzdChzcHUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMzY5LDIzICs0OTQsMjggQEAKICAqIFJlbW92ZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBjb250ZXh0IG9uIHRoZSBydW5xdWV1ZSBhbmQgcmV0dXJuIGl0CiAgKiB0byB0aGUgY2FsbGVyLiAgUmV0dXJucyAlTlVMTCBpZiBubyBydW5uYWJsZSBjb250ZXh0IHdhcyBmb3VuZC4KICAqLwotc3RhdGljIHN0cnVjdCBzcHVfY29udGV4dCAqZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGludCBwcmlvKQorc3RhdGljIHN0cnVjdCBzcHVfY29udGV4dCAqZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGludCBwcmlvLCBpbnQgbm9kZSkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IE5VTEw7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CiAJaW50IGJlc3Q7CiAKIAlzcGluX2xvY2soJnNwdV9wcmlvLT5ydW5xX2xvY2spOwogCWJlc3QgPSBzY2hlZF9maW5kX2ZpcnN0X2JpdChzcHVfcHJpby0+Yml0bWFwKTsKLQlpZiAoYmVzdCA8IHByaW8pIHsKKwl3aGlsZSAoYmVzdCA8IHByaW8pIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcnEgPSAmc3B1X3ByaW8tPnJ1bnFbYmVzdF07CiAKLQkJQlVHX09OKGxpc3RfZW1wdHkocnEpKTsKLQotCQljdHggPSBsaXN0X2VudHJ5KHJxLT5uZXh0LCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHJxKTsKLQkJX19zcHVfZGVsX2Zyb21fcnEoY3R4KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHgsIHJxLCBycSkgeworCQkJLyogWFhYKGhjaCk6IGNoZWNrIGZvciBhZmZpbml0eSBoZXJlIGFzd2VsbCAqLworCQkJaWYgKF9fbm9kZV9hbGxvd2VkKGN0eCwgbm9kZSkpIHsKKwkJCQlfX3NwdV9kZWxfZnJvbV9ycShjdHgpOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJYmVzdCsrOwogCX0KKwljdHggPSBOVUxMOworIGZvdW5kOgogCXNwaW5fdW5sb2NrKCZzcHVfcHJpby0+cnVucV9sb2NrKTsKLQogCXJldHVybiBjdHg7CiB9CiAKQEAgLTM5NSw5ICs1MjUsMTIgQEAKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKm5ldyA9IE5VTEw7CiAKIAlpZiAoc3B1KSB7Ci0JCW5ldyA9IGdyYWJfcnVubmFibGVfY29udGV4dChtYXhfcHJpbyk7CisJCW5ldyA9IGdyYWJfcnVubmFibGVfY29udGV4dChtYXhfcHJpbywgc3B1LT5ub2RlKTsKIAkJaWYgKG5ldyB8fCBmb3JjZSkgeworCQkJc3B1X3JlbW92ZV9mcm9tX2FjdGl2ZV9saXN0KHNwdSk7CiAJCQlzcHVfdW5iaW5kX2NvbnRleHQoc3B1LCBjdHgpOworCQkJY3R4LT5zdGF0cy52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy52b2xfY3R4X3N3aXRjaCsrOwogCQkJc3B1X2ZyZWUoc3B1KTsKIAkJCWlmIChuZXcpCiAJCQkJd2FrZV91cCgmbmV3LT5zdG9wX3dxKTsKQEAgLTQxNyw3ICs1NTAsMTcgQEAKICAqLwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKKwkvKgorCSAqIFdlIG11c3QgbmV2ZXIgcmVhY2ggdGhpcyBmb3IgYSBub3NjaGVkIGNvbnRleHQsCisJICogYnV0IGhhbmRsZSB0aGUgY2FzZSBncmFjZWZ1bGwgaW5zdGVhZCBvZiBwYW5pY2luZy4KKwkgKi8KKwlpZiAoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCiAJX19zcHVfZGVhY3RpdmF0ZShjdHgsIDEsIE1BWF9QUklPKTsKKwlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVQ1RYX1VUSUxfVVNFUik7CiB9CiAKIC8qKgpAQCAtNDMyLDU2ICs1NzUsMTc4IEBACiB7CiAJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpIHsKIAkJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7Ci0JCV9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBNQVhfUFJJTyk7CisJCWlmIChfX3NwdV9kZWFjdGl2YXRlKGN0eCwgMCwgTUFYX1BSSU8pKQorCQkJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVUNUWF9VVElMX1VTRVIpOworCQllbHNlIHsKKwkJCXNwdWN0eF9zd2l0Y2hfc3RhdGUoY3R4LCBTUFVDVFhfVVRJTF9MT0FERUQpOworCQkJc3B1X3N3aXRjaF9zdGF0ZShjdHgtPnNwdSwgU1BVX1VUSUxfVVNFUik7CisJCX0KIAkJbXV0ZXhfdW5sb2NrKCZjdHgtPnN0YXRlX211dGV4KTsKIAl9CiB9CiAKLXZvaWQgc3B1X3NjaGVkX3RpY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgc3B1c2NoZWRfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3B1X2NvbnRleHQsIHNjaGVkX3dvcmsud29yayk7Ci0JaW50IHByZWVtcHRlZDsKLQotCS8qCi0JICogSWYgdGhpcyBjb250ZXh0IGlzIGJlaW5nIHN0b3BwZWQgYXZvaWQgcmVzY2hlZHVsaW5nIGZyb20gdGhlCi0JICogc2NoZWR1bGVyIHRpY2sgYmVjYXVzZSB3ZSB3b3VsZCBibG9jayBvbiB0aGUgc3RhdGVfbXV0ZXguCi0JICogVGhlIGNhbGxlciB3aWxsIHlpZWxkIHRoZSBzcHUgbGF0ZXIgb24gYW55d2F5LgotCSAqLwotCWlmICh0ZXN0X2JpdChTUFVfU0NIRURfRVhJVElORywgJmN0eC0+c2NoZWRfZmxhZ3MpKQorCWlmIChjdHgtPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQorCQlyZXR1cm47CisJaWYgKGN0eC0+cG9saWN5ID09IFNDSEVEX0ZJRk8pCiAJCXJldHVybjsKIAotCW11dGV4X2xvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOwotCXByZWVtcHRlZCA9IF9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBjdHgtPnByaW8gKyAxKTsKLQltdXRleF91bmxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpOworCWlmICgtLWN0eC0+dGltZV9zbGljZSkKKwkJcmV0dXJuOwogCi0JaWYgKHByZWVtcHRlZCkgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluIHNwdV9ydW4gbWFudWFsbHkKLQkJICogdG8gZW5zdXJlIHRoaXMgY29udGV4dCBnZXRzIHB1dCBvbiB0aGUgcnVucXVldWUgYWdhaW4KLQkJICogQVNBUC4KLQkJICovCi0JCXdha2VfdXAoJmN0eC0+c3RvcF93cSk7CisJLyoKKwkgKiBVbmZvcnR1bmF0ZWx5IGFjdGl2ZV9tdXRleCByYW5rcyBvdXRzaWRlIG9mIHN0YXRlX211dGV4LCBzbworCSAqIHdlIGhhdmUgdG8gdHJ5bG9jayBoZXJlLiAgSWYgd2UgZmFpbCBnaXZlIHRoZSBjb250ZXh0IGFub3RoZXIKKwkgKiB0aWNrIGFuZCB0cnkgYWdhaW4uCisJICovCisJaWYgKG11dGV4X3RyeWxvY2soJmN0eC0+c3RhdGVfbXV0ZXgpKSB7CisJCXN0cnVjdCBzcHUgKnNwdSA9IGN0eC0+c3B1OworCQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKm5ldzsKKworCQluZXcgPSBncmFiX3J1bm5hYmxlX2NvbnRleHQoY3R4LT5wcmlvICsgMSwgc3B1LT5ub2RlKTsKKwkJaWYgKG5ldykgeworCisJCQlfX3NwdV9yZW1vdmVfZnJvbV9hY3RpdmVfbGlzdChzcHUpOworCQkJc3B1X3VuYmluZF9jb250ZXh0KHNwdSwgY3R4KTsKKwkJCWN0eC0+c3RhdHMuaW52b2xfY3R4X3N3aXRjaCsrOworCQkJc3B1LT5zdGF0cy5pbnZvbF9jdHhfc3dpdGNoKys7CisJCQlzcHVfZnJlZShzcHUpOworCQkJd2FrZV91cCgmbmV3LT5zdG9wX3dxKTsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGJyZWFrIG91dCBvZiB0aGUgd2FpdCBsb29wIGluCisJCQkgKiBzcHVfcnVuIG1hbnVhbGx5IHRvIGVuc3VyZSB0aGlzIGNvbnRleHQKKwkJCSAqIGdldHMgcHV0IG9uIHRoZSBydW5xdWV1ZSBhZ2FpbiBBU0FQLgorCQkJICovCisJCQl3YWtlX3VwKCZjdHgtPnN0b3Bfd3EpOworCQl9CisJCXNwdV9zZXRfdGltZXNsaWNlKGN0eCk7CisJCW11dGV4X3VubG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJfSBlbHNlIHsKLQkJc3B1X3N0YXJ0X3RpY2soY3R4KTsKKwkJY3R4LT50aW1lX3NsaWNlKys7CiAJfQogfQogCisvKioKKyAqIGNvdW50X2FjdGl2ZV9jb250ZXh0cyAtIGNvdW50IG5yIG9mIGFjdGl2ZSB0YXNrcworICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhc2tzIGN1cnJlbnRseSBydW5uaW5nIG9yIHdhaXRpbmcgdG8gcnVuLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCB0YWtlIHJ1bnFfbG9jayAvIGFjdGl2ZV9tdXRleCBoZXJlLiAgUmVhZGluZworICogYSBzaW5nbGUgMzJiaXQgdmFsdWUgaXMgYXRvbWljIG9uIHBvd2VycGMsIGFuZCB3ZSBkb24ndCBjYXJlCisgKiBhYm91dCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzIGhlcmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvdW50X2FjdGl2ZV9jb250ZXh0cyh2b2lkKQoreworCWludCBucl9hY3RpdmUgPSAwLCBub2RlOworCisJZm9yIChub2RlID0gMDsgbm9kZSA8IE1BWF9OVU1OT0RFUzsgbm9kZSsrKQorCQlucl9hY3RpdmUgKz0gc3B1X3ByaW8tPm5yX2FjdGl2ZVtub2RlXTsKKwlucl9hY3RpdmUgKz0gc3B1X3ByaW8tPm5yX3dhaXRpbmc7CisKKwlyZXR1cm4gbnJfYWN0aXZlOworfQorCisvKioKKyAqIHNwdV9jYWxjX2xvYWQgLSBnaXZlbiB0aWNrIGNvdW50LCB1cGRhdGUgdGhlIGF2ZW5ydW4gbG9hZCBlc3RpbWF0ZXMuCisgKiBAdGljazoJdGljayBjb3VudAorICoKKyAqIE5vIGxvY2tpbmcgYWdhaW5zdCByZWFkaW5nIHRoZXNlIHZhbHVlcyBmcm9tIHVzZXJzcGFjZSwgYXMgZm9yCisgKiB0aGUgQ1BVIGxvYWRhdmcgY29kZS4KKyAqLworc3RhdGljIHZvaWQgc3B1X2NhbGNfbG9hZCh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3Rhc2tzOyAvKiBmaXhlZC1wb2ludCAqLworCXN0YXRpYyBpbnQgY291bnQgPSBMT0FEX0ZSRVE7CisKKwljb3VudCAtPSB0aWNrczsKKworCWlmICh1bmxpa2VseShjb3VudCA8IDApKSB7CisJCWFjdGl2ZV90YXNrcyA9IGNvdW50X2FjdGl2ZV9jb250ZXh0cygpICogRklYRURfMTsKKwkJZG8geworCQkJQ0FMQ19MT0FEKHNwdV9hdmVucnVuWzBdLCBFWFBfMSwgYWN0aXZlX3Rhc2tzKTsKKwkJCUNBTENfTE9BRChzcHVfYXZlbnJ1blsxXSwgRVhQXzUsIGFjdGl2ZV90YXNrcyk7CisJCQlDQUxDX0xPQUQoc3B1X2F2ZW5ydW5bMl0sIEVYUF8xNSwgYWN0aXZlX3Rhc2tzKTsKKwkJCWNvdW50ICs9IExPQURfRlJFUTsKKwkJfSB3aGlsZSAoY291bnQgPCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwdXNjaGVkX3dha2UodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW1vZF90aW1lcigmc3B1c2NoZWRfdGltZXIsIGppZmZpZXMgKyBTUFVTQ0hFRF9USUNLKTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3B1c2NoZWRfdGFzayk7CisJc3B1X2NhbGNfbG9hZChTUFVTQ0hFRF9USUNLKTsKK30KKworc3RhdGljIGludCBzcHVzY2hlZF90aHJlYWQodm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBzcHUgKnNwdSwgKm5leHQ7CisJaW50IG5vZGU7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCQlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKKwkJCW11dGV4X2xvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNwdSwgbmV4dCwKKwkJCQkJCSAmc3B1X3ByaW8tPmFjdGl2ZV9saXN0W25vZGVdLAorCQkJCQkJIGxpc3QpCisJCQkJc3B1c2NoZWRfdGljayhzcHUtPmN0eCk7CisJCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTE9BRF9JTlQoeCkgKCh4KSA+PiBGU0hJRlQpCisjZGVmaW5lIExPQURfRlJBQyh4KSBMT0FEX0lOVCgoKHgpICYgKEZJWEVEXzEtMSkpICogMTAwKQorCitzdGF0aWMgaW50IHNob3dfc3B1X2xvYWRhdmcoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwcml2YXRlKQoreworCWludCBhLCBiLCBjOworCisJYSA9IHNwdV9hdmVucnVuWzBdICsgKEZJWEVEXzEvMjAwKTsKKwliID0gc3B1X2F2ZW5ydW5bMV0gKyAoRklYRURfMS8yMDApOworCWMgPSBzcHVfYXZlbnJ1blsyXSArIChGSVhFRF8xLzIwMCk7CisKKwkvKgorCSAqIE5vdGUgdGhhdCBsYXN0X3BpZCBkb2Vzbid0IHJlYWxseSBtYWtlIG11Y2ggc2Vuc2UgZm9yIHRoZQorCSAqIFNQVSBsb2FkYXZnIChpdCBldmVuIHNlZW1zIHZlcnkgb2RkIG9uIHRoZSBDUFUgc2lkZS4uKSwKKwkgKiBidXQgd2UgaW5jbHVkZSBpdCBoZXJlIHRvIGhhdmUgYSAxMDAlIGNvbXBhdGlibGUgaW50ZXJmYWNlLgorCSAqLworCXNlcV9wcmludGYocywgIiVkLiUwMmQgJWQuJTAyZCAlZC4lMDJkICVsZC8lZCAlZFxuIiwKKwkJTE9BRF9JTlQoYSksIExPQURfRlJBQyhhKSwKKwkJTE9BRF9JTlQoYiksIExPQURfRlJBQyhiKSwKKwkJTE9BRF9JTlQoYyksIExPQURfRlJBQyhjKSwKKwkJY291bnRfYWN0aXZlX2NvbnRleHRzKCksCisJCWF0b21pY19yZWFkKCZucl9zcHVfY29udGV4dHMpLAorCQljdXJyZW50LT5uc3Byb3h5LT5waWRfbnMtPmxhc3RfcGlkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzcHVfbG9hZGF2Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3NwdV9sb2FkYXZnLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3B1X2xvYWRhdmdfZm9wcyA9IHsKKwkub3BlbgkJPSBzcHVfbG9hZGF2Z19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCiBpbnQgX19pbml0IHNwdV9zY2hlZF9pbml0KHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlzcHVfc2NoZWRfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic3B1c2NoZWQiKTsKLQlpZiAoIXNwdV9zY2hlZF93cSkKLQkJcmV0dXJuIDE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwlpbnQgZXJyID0gLUVOT01FTSwgaTsKIAogCXNwdV9wcmlvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNwdV9wcmlvX2FycmF5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcHVfcHJpbykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIHByaW9yaXR5IHF1ZXVlLlxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0JCSAgICAgICBkZXN0cm95X3dvcmtxdWV1ZShzcHVfc2NoZWRfd3EpOwotCQlyZXR1cm4gMTsKLQl9CisJaWYgKCFzcHVfcHJpbykKKwkJZ290byBvdXQ7CisKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BSSU87IGkrKykgewogCQlJTklUX0xJU1RfSEVBRCgmc3B1X3ByaW8tPnJ1bnFbaV0pOwogCQlfX2NsZWFyX2JpdChpLCBzcHVfcHJpby0+Yml0bWFwKTsKQEAgLTQ5Miw3ICs3NTcsMzAgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtpXSk7CiAJfQogCXNwaW5fbG9ja19pbml0KCZzcHVfcHJpby0+cnVucV9sb2NrKTsKKworCXNldHVwX3RpbWVyKCZzcHVzY2hlZF90aW1lciwgc3B1c2NoZWRfd2FrZSwgMCk7CisKKwlzcHVzY2hlZF90YXNrID0ga3RocmVhZF9ydW4oc3B1c2NoZWRfdGhyZWFkLCBOVUxMLCAic3B1c2NoZWQiKTsKKwlpZiAoSVNfRVJSKHNwdXNjaGVkX3Rhc2spKSB7CisJCWVyciA9IFBUUl9FUlIoc3B1c2NoZWRfdGFzayk7CisJCWdvdG8gb3V0X2ZyZWVfc3B1X3ByaW87CisJfQorCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgic3B1X2xvYWRhdmciLCAwLCBOVUxMKTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIG91dF9zdG9wX2t0aHJlYWQ7CisJZW50cnktPnByb2NfZm9wcyA9ICZzcHVfbG9hZGF2Z19mb3BzOworCisJcHJfZGVidWcoInNwdXNjaGVkOiB0aWNrOiAlZCwgbWluIHRpY2tzOiAlZCwgZGVmYXVsdCB0aWNrczogJWRcbiIsCisJCQlTUFVTQ0hFRF9USUNLLCBNSU5fU1BVX1RJTUVTTElDRSwgREVGX1NQVV9USU1FU0xJQ0UpOwogCXJldHVybiAwOworCisgb3V0X3N0b3Bfa3RocmVhZDoKKwlrdGhyZWFkX3N0b3Aoc3B1c2NoZWRfdGFzayk7Cisgb3V0X2ZyZWVfc3B1X3ByaW86CisJa2ZyZWUoc3B1X3ByaW8pOworIG91dDoKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIF9fZXhpdCBzcHVfc2NoZWRfZXhpdCh2b2lkKQpAQCAtNTAwLDYgKzc4OCwxMSBAQAogCXN0cnVjdCBzcHUgKnNwdSwgKnRtcDsKIAlpbnQgbm9kZTsKIAorCXJlbW92ZV9wcm9jX2VudHJ5KCJzcHVfbG9hZGF2ZyIsIE5VTEwpOworCisJZGVsX3RpbWVyX3N5bmMoJnNwdXNjaGVkX3RpbWVyKTsKKwlrdGhyZWFkX3N0b3Aoc3B1c2NoZWRfdGFzayk7CisKIAlmb3IgKG5vZGUgPSAwOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspIHsKIAkJbXV0ZXhfbG9jaygmc3B1X3ByaW8tPmFjdGl2ZV9tdXRleFtub2RlXSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcHUsIHRtcCwgJnNwdV9wcmlvLT5hY3RpdmVfbGlzdFtub2RlXSwKQEAgLTUxMCw1ICs4MDMsNCBAQAogCQltdXRleF91bmxvY2soJnNwdV9wcmlvLT5hY3RpdmVfbXV0ZXhbbm9kZV0pOwogCX0KIAlrZnJlZShzcHVfcHJpbyk7Ci0JZGVzdHJveV93b3JrcXVldWUoc3B1X3NjaGVkX3dxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKaW5kZXggMGJmNzIzZC4uNGUxOWVkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlLmMKQEAgLTI5Niw3ICsyOTYsNyBAQAogICogVGhpcyBjb2RlIGRldmlhdGVzIGZyb20gdGhlIGRvY3VtZW50ZWQgc2VxdWVuY2UgaW4gdGhlCiAgKiBmb2xsb3dpbmcgYXNwZWN0czoKICAqCi0gKiAJMS4gVGhlIEVBIGZvciBMU0NTQSBpcyBwYXNzZWQgZnJvbSBQUEUgaW4gdGhlCisgKgkxLiBUaGUgRUEgZm9yIExTQ1NBIGlzIHBhc3NlZCBmcm9tIFBQRSBpbiB0aGUKICAqCSAgIHNpZ25hbCBub3RpZmljYXRpb24gY2hhbm5lbHMuCiAgKgkyLiBUaGUgcmVnaXN0ZXIgc3BpbGwgYXJlYSBpcyBwdWxsZWQgYnkgU1BVCiAgKgkgICBpbnRvIExTLCByYXRoZXIgdGhhbiBwdXNoZWQgYnkgUFBFLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwppbmRleCAxOTYwMzNiLi5hZTk1Y2MxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmUuYwpAQCAtNDQsNyArNDQsNyBAQAogCSAqICAgIFJlYWQgdGhlIFNQVV9SZEV2ZW50TXNrIGNoYW5uZWwgYW5kIHNhdmUgdG8gdGhlIExTQ1NBLgogCSAqLwogCW9mZnNldCA9IExTQ1NBX1FXX09GRlNFVChldmVudF9tYXNrKTsKLQlyZWdzX3NwaWxsW29mZnNldF0uc2xvdFswXSA9IHNwdV9yZWFkY2goU1BVX1JkRXZlbnRTdGF0TWFzayk7CisJcmVnc19zcGlsbFtvZmZzZXRdLnNsb3RbMF0gPSBzcHVfcmVhZGNoKFNQVV9SZEV2ZW50TWFzayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3RhZ19tYXNrKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCmluZGV4IDQ3NjE3ZTguLjA4YjM1MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVmcy5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogCiAjaW5jbHVkZSA8YXNtL3NwdS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CkBAIC0zOSw5ICs0MCwxNyBAQAogc3RydWN0IHNwdV9jb250ZXh0X29wczsKIHN0cnVjdCBzcHVfZ2FuZzsKIAotLyogY3R4LT5zY2hlZF9mbGFncyAqLwotZW51bSB7Ci0JU1BVX1NDSEVEX0VYSVRJTkcgPSAwLAorLyoKKyAqIFRoaXMgaXMgdGhlIHN0YXRlIGZvciBzcHUgdXRpbGl6YXRpb24gcmVwb3J0aW5nIHRvIHVzZXJzcGFjZS4KKyAqIEJlY2F1c2UgdGhpcyBzdGF0ZSBpcyB2aXNpYmxlIHRvIHVzZXJzcGFjZSBpdCBtdXN0IG5ldmVyIGNoYW5nZSBhbmQgbmVlZHMKKyAqIHRvIGJlIGtlcHQgc3RyaWN0bHkgc2VwYXJhdGUgZnJvbSBhbnkgaW50ZXJuYWwgc3RhdGUga2VwdCBieSB0aGUga2VybmVsLgorICovCitlbnVtIHNwdWN0eF9leGVjdXRpb25fc3RhdGUgeworCVNQVUNUWF9VVElMX1VTRVIgPSAwLAorCVNQVUNUWF9VVElMX1NZU1RFTSwKKwlTUFVDVFhfVVRJTF9JT1dBSVQsCisJU1BVQ1RYX1VUSUxfTE9BREVELAorCVNQVUNUWF9VVElMX01BWAogfTsKIAogc3RydWN0IHNwdV9jb250ZXh0IHsKQEAgLTgxLDEzICs5MCwzNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZ2FuZ19saXN0OwogCXN0cnVjdCBzcHVfZ2FuZyAqZ2FuZzsKIAorCS8qIG93bmVyIHRocmVhZCAqLworCXBpZF90IHRpZDsKKwogCS8qIHNjaGVkdWxlciBmaWVsZHMgKi8KLSAJc3RydWN0IGxpc3RfaGVhZCBycTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjaGVkX3dvcms7CisJc3RydWN0IGxpc3RfaGVhZCBycTsKKwl1bnNpZ25lZCBpbnQgdGltZV9zbGljZTsKIAl1bnNpZ25lZCBsb25nIHNjaGVkX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcnRfcHJpb3JpdHk7CisJY3B1bWFza190IGNwdXNfYWxsb3dlZDsKIAlpbnQgcG9saWN5OwogCWludCBwcmlvOworCisJLyogc3RhdGlzdGljcyAqLworCXN0cnVjdCB7CisJCS8qIHVwZGF0ZXMgcHJvdGVjdGVkIGJ5IGN0eC0+c3RhdGVfbXV0ZXggKi8KKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIGV4ZWN1dGlvbl9zdGF0ZTsKKwkJdW5zaWduZWQgbG9uZyB0c3RhbXA7CQkvKiB0aW1lIG9mIGxhc3QgY3R4IHN3aXRjaCAqLworCQl1bnNpZ25lZCBsb25nIHRpbWVzW1NQVUNUWF9VVElMX01BWF07CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB2b2xfY3R4X3N3aXRjaDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGludm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWFqX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGhhc2hfZmx0OworCQl1bnNpZ25lZCBsb25nIGxvbmcgc2xiX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNsYl9mbHRfYmFzZTsgLyogIyBhdCBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGNsYXNzMl9pbnRyOworCQl1bnNpZ25lZCBsb25nIGxvbmcgY2xhc3MyX2ludHJfYmFzZTsgLyogIyBhdCBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGxpYmFzc2lzdDsKKwl9IHN0YXRzOwogfTsKIAogc3RydWN0IHNwdV9nYW5nIHsKQEAgLTE3Nyw2ICsyMDcsNyBAQAogaW50IHNwdWZzX2hhbmRsZV9jbGFzczEoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogCiAvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KK2V4dGVybiBhdG9taWNfdCBucl9zcHVfY29udGV4dHM7CiBzdGF0aWMgaW5saW5lIHZvaWQgc3B1X2FjcXVpcmUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpCiB7CiAJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CkBAIC0yMDAsOSArMjMxLDkgQEAKIGludCBzcHVfYWN0aXZhdGUoc3RydWN0IHNwdV9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7CiB2b2lkIHNwdV95aWVsZChzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zdGFydF90aWNrKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKLXZvaWQgc3B1X3N0b3BfdGljayhzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCk7Ci12b2lkIHNwdV9zY2hlZF90aWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNwdV9zZXRfdGltZXNsaWNlKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgc3B1X3VwZGF0ZV9zY2hlZF9pbmZvKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KTsKK3ZvaWQgX19zcHVfdXBkYXRlX3NjaGVkX2luZm8oc3RydWN0IHNwdV9jb250ZXh0ICpjdHgpOwogaW50IF9faW5pdCBzcHVfc2NoZWRfaW5pdCh2b2lkKTsKIHZvaWQgX19leGl0IHNwdV9zY2hlZF9leGl0KHZvaWQpOwogCkBAIC0yMTAsNyArMjQxLDcgQEAKIAogLyoKICAqIHNwdWZzX3dhaXQKLSAqIAlTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCisgKglTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCiAgKgl3ZSBuZWVkIHRvIGNhbGwgc3B1X3JlbGVhc2UoY3R4KSBiZWZvcmUgc2xlZXBpbmcsIGFuZAogICoJdGhlbiBzcHVfYWNxdWlyZShjdHgpIHdoZW4gYXdva2VuLgogICovCkBAIC0yNTYsNCArMjg3LDM3IEBACiBleHRlcm4gc3RydWN0IHNwdWZzX2NvcmVkdW1wX3JlYWRlciBzcHVmc19jb3JlZHVtcF9yZWFkW107CiBleHRlcm4gaW50IHNwdWZzX2NvcmVkdW1wX251bV9ub3RlczsKIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBsaXR0bGUgYml0IHRvbyBsYXJnZSBmb3IgYW4gaW5saW5lLCBidXQKKyAqIGFzIGZhdWx0LmMgaXMgYnVpbHQgaW50byB0aGUga2VybmVsIHdlIGNhbid0IG1vdmUgaXQgb3V0IG9mCisgKiBsaW5lLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1Y3R4X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJZW51bSBzcHVjdHhfZXhlY3V0aW9uX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmN0eC0+c3RhdGVfbXV0ZXgpKTsKKworCWlmIChjdHgtPnN0YXRzLmV4ZWN1dGlvbl9zdGF0ZSAhPSBuZXdfc3RhdGUpIHsKKwkJdW5zaWduZWQgbG9uZyBjdXJ0aW1lID0gamlmZmllczsKKworCQljdHgtPnN0YXRzLnRpbWVzW2N0eC0+c3RhdHMuZXhlY3V0aW9uX3N0YXRlXSArPQorCQkJCSBjdXJ0aW1lIC0gY3R4LT5zdGF0cy50c3RhbXA7CisJCWN0eC0+c3RhdHMudHN0YW1wID0gY3VydGltZTsKKwkJY3R4LT5zdGF0cy5leGVjdXRpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3B1X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1ICpzcHUsCisJCWVudW0gc3B1Y3R4X2V4ZWN1dGlvbl9zdGF0ZSBuZXdfc3RhdGUpCit7CisJaWYgKHNwdS0+c3RhdHMudXRpbGl6YXRpb25fc3RhdGUgIT0gbmV3X3N0YXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7CisKKwkJc3B1LT5zdGF0cy50aW1lc1tzcHUtPnN0YXRzLnV0aWxpemF0aW9uX3N0YXRlXSArPQorCQkJCSBjdXJ0aW1lIC0gc3B1LT5zdGF0cy50c3RhbXA7CisJCXNwdS0+c3RhdHMudHN0YW1wID0gY3VydGltZTsKKwkJc3B1LT5zdGF0cy51dGlsaXphdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwl9Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCmluZGV4IDcxYTBiNDEuLjljNTA2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAgfQogI2VuZGlmCQkJCS8qIGRlYnVnICovCiAKLSNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykgCVBPTExfV0hJTEVfVFJVRSghKF9jKSkKKyNkZWZpbmUgUE9MTF9XSElMRV9GQUxTRShfYykJUE9MTF9XSElMRV9UUlVFKCEoX2MpKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNxdWlyZV9zcHVfbG9jayhzdHJ1Y3Qgc3B1ICpzcHUpCiB7CkBAIC0zODcsNiArMzg3LDE5IEBACiAJY3NhLT5wcm9iLmRtYV9xdWVyeXR5cGVfUlcgPSBpbl9iZTMyKCZwcm9iLT5kbWFfcXVlcnl0eXBlX1JXKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHB1X3RhZ3N0YXR1cyhzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzdHJ1Y3Qgc3B1X3Byb2JsZW0gX19pb21lbSAqcHJvYiA9IHNwdS0+cHJvYmxlbTsKKworCS8qIFNhdmUgdGhlIFByeHlfVGFnU3RhdHVzIHJlZ2lzdGVyIGluIHRoZSBDU0EuCisJICoKKwkgKiBJdCBpcyB1bm5lY2Vzc2FyeSB0byByZXN0b3JlIGRtYV90YWdzdGF0dXNfUiwgaG93ZXZlciwKKwkgKiBkbWFfdGFnc3RhdHVzX1IgaW4gdGhlIENTQSBpcyBhY2Nlc3NlZCB2aWEgYmFja2luZ19vcHMsIHNvCisJICogd2UgbXVzdCBzYXZlIGl0LgorCSAqLworCWNzYS0+cHJvYi5kbWFfdGFnc3RhdHVzX1IgPSBpbl9iZTMyKCZwcm9iLT5kbWFfdGFnc3RhdHVzX1IpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9tZmNfY3NyX3RzcShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKIHsKIAlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKQEAgLTE4MTIsNiArMTgyNSw3IEBACiAJc2F2ZV9tZmNfcXVldWVzKHByZXYsIHNwdSk7CS8qIFN0ZXAgMTkuICovCiAJc2F2ZV9wcHVfcXVlcnltYXNrKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjAuICovCiAJc2F2ZV9wcHVfcXVlcnl0eXBlKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjEuICovCisJc2F2ZV9wcHVfdGFnc3RhdHVzKHByZXYsIHNwdSk7ICAvKiBORVcuICAgICAqLwogCXNhdmVfbWZjX2Nzcl90c3EocHJldiwgc3B1KTsJLyogU3RlcCAyMi4gKi8KIAlzYXZlX21mY19jc3JfY21kKHByZXYsIHNwdSk7CS8qIFN0ZXAgMjMuICovCiAJc2F2ZV9tZmNfY3NyX2F0byhwcmV2LCBzcHUpOwkvKiBTdGVwIDI0LiAqLwpAQCAtMTkzMCw3ICsxOTQ0LDcgQEAKIAlyZXNldF9zcHVfcHJpdmNudGwocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE2LiAqLwogCXJlc2V0X3NwdV9sc2xyKHByZXYsIHNwdSk7ICAgICAgICAgICAgICAvKiBTdGVwIDE3LiAqLwogCXNldHVwX21mY19zcjEocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDE4LiAqLwotCXNwdV9pbnZhbGlkYXRlX3NsYnMoc3B1KTsgICAgICAgIAkvKiBTdGVwIDE5LiAqLworCXNwdV9pbnZhbGlkYXRlX3NsYnMoc3B1KTsJCS8qIFN0ZXAgMTkuICovCiAJcmVzZXRfY2hfcGFydDEocHJldiwgc3B1KTsJICAgICAgICAvKiBTdGVwIDIwLiAqLwogCXJlc2V0X2NoX3BhcnQyKHByZXYsIHNwdSk7CSAgICAgICAgLyogU3RlcCAyMS4gKi8KIAllbmFibGVfaW50ZXJydXB0cyhwcmV2LCBzcHUpOwkgICAgICAgIC8qIFN0ZXAgMjIuICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCmluZGV4IGQyYzY5MDUuLjIyYjRiNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9LY29uZmlnCkBAIC04LDQgKzgsNSBAQAogCXNlbGVjdCBQUENfTVBDMTA2CiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCiAJc2VsZWN0IFBQQ19OQVRJVkUKKwlzZWxlY3QgUENJCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvTWFrZWZpbGUKaW5kZXggOTAyZmViMS4uNGIzYmZhZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLW9iai15CQkJCSs9IHNldHVwLm8gdGltZS5vIHBlZ2Fzb3NfZXRoLm8KLW9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kubworb2JqLXkJCQkJKz0gc2V0dXAubyB0aW1lLm8gcGVnYXNvc19ldGgubyBwY2kubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfTlZSQU0pCQkrPSBudnJhbS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvcGNpLmMKaW5kZXggZDMyZmVkYy4uMzY5MDYyNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2hycC9wY2kuYwpAQCAtOTksNyArOTksNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQotCQl8IChob3NlLT5pbmRleCA8PCAyNCk7CisJCXwgKGhvc2UtPmdsb2JhbF9udW1iZXIgPDwgMjQpOwogICAgICAgICBpbnQgcmV0ID0gLTE7CiAJaW50IHJ2YWw7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAob2Zmc2V0ICYgMHhmZikgfCAoKGRldmZuICYgMHhmZikgPDwgOCkKIAkJfCAoKChidXMtPm51bWJlciAtIGhvc2UtPmZpcnN0X2J1c25vKSAmIDB4ZmYpIDw8IDE2KQotCQl8IChob3NlLT5pbmRleCA8PCAyNCk7CisJCXwgKGhvc2UtPmdsb2JhbF9udW1iZXIgPDwgMjQpOwogCWludCBydmFsOwogCiAJcnZhbCA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJ3cml0ZS1wY2ktY29uZmlnIiksIDMsIDEsIE5VTEwsCkBAIC0yNTQsMTMgKzI1NCwxMiBAQAogCQkJcHJpbnRrKCIgYXQgJWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpci5zdGFydCk7CiAJCXByaW50aygiXG4iKTsKIAotCQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAkJaWYgKCFob3NlKSB7CiAJCQlwcmludGsoIkNhbid0IGFsbG9jYXRlIFBDSSBjb250cm9sbGVyIHN0cnVjdHVyZSBmb3IgJXNcbiIsCiAJCQkJZGV2LT5mdWxsX25hbWUpOwogCQkJY29udGludWU7CiAJCX0KLQkJaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCQlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZVswXTsKIAkJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZVsxXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCmluZGV4IGYyZDI2MjYuLmJlYzc3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKQEAgLTI4LDYgKzI4LDcgQEAKIAlib29sICJQUEM3NTBHWC9DTCB3aXRoIFRTSTEweCBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpIgogCXNlbGVjdCBUU0kxMDhfQlJJREdFCiAJc2VsZWN0IFBQQ19VREJHXzE2NTUwCisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKIAloZWxwCiAJICBTZWxlY3QgUFBDX0hPTExZIGlmIGNvbmZpZ3VyaW5nIGZvciBhbiBJQk0gNzUwR1gvQ0wgRXZhbAogCSAgQm9hcmQgd2l0aCBUU0kxMDgvOSBicmlkZ2UgKEhpY2tvcnkvSG9sbHkpCkBAIC00NCw2ICs0NSw3IEBACiBjb25maWcgVFNJMTA4X0JSSURHRQogCWJvb2wKIAlkZXBlbmRzIG9uIE1QQzc0NDhIUEMyIHx8IFBQQ19IT0xMWQorCXNlbGVjdCBQQ0kKIAlzZWxlY3QgTVBJQwogCXNlbGVjdCBNUElDX1dFSVJECiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKaW5kZXggM2EwYjRhMC4uNjI5MmUzNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwpAQCAtNDUsNyArNDUsNyBAQAogCiAjZGVmaW5lIEhPTExZX1BDSV9DRkdfUEhZUyAweDdjMDAwMDAwCiAKLWludCBob2xseV9leGNsdWRlX2RldmljZSh1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCitpbnQgaG9sbHlfZXhjbHVkZV9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1X2NoYXIgYnVzLCB1X2NoYXIgZGV2Zm4pCiB7CiAJaWYgKGJ1cyA9PSAwICYmIFBDSV9TTE9UKGRldmZuKSA9PSAwKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCmluZGV4IGI0MTJmMDAuLmY0ZDBhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKQEAgLTU0LDggKzU0LDkgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IGxpbmtzdGF0aW9uX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogCWNvbnN0IGludCAqYnVzX3JhbmdlOwpAQCAtNjcsMTggKzY4LDE3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCQkJIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAlpZiAoaG9zZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7Ci0JaG9zZS0+YXJjaF9kYXRhID0gZGV2OwogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCAweGZlYzAwMDAwLCAweGZlZTAwMDAwKTsKIAogCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KIAkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgMSk7Ci0KKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC05Miw3ICs5Miw3IEBACiAKIAkvKiBMb29rdXAgUENJIGhvc3QgYnJpZGdlcyAqLwogCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKLQkJYWRkX2JyaWRnZShucCk7CisJCWxpbmtzdGF0aW9uX2FkZF9icmlkZ2UobnApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQlVGRkFMTyBOZXR3b3JrIEF0dGFjaGVkIFN0b3JhZ2UgU2VyaWVzXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICIoQykgMjAwMi0yMDA1IEJVRkZBTE8gSU5DLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwppbmRleCA0NTQyZTBjOC4uMWUzY2M2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC01NCwxNSArNTQsMTAgQEAKIAogI2RlZmluZSBNUEM3NDQ4SFBDMl9QQ0lfQ0ZHX1BIWVMgMHhmYjAwMDAwMAogCi0jaWZuZGVmIENPTkZJR19QQ0kKLWlzYV9pb19iYXNlID0gTVBDNzQ0OF9IUEMyX0lTQV9JT19CQVNFOwotaXNhX21lbV9iYXNlID0gTVBDNzQ0OF9IUEMyX0lTQV9NRU1fQkFTRTsKLXBjaV9kcmFtX29mZnNldCA9IE1QQzc0NDhfSFBDMl9QQ0lfTUVNX09GRlNFVDsKLSNlbmRpZgotCiBleHRlcm4gdm9pZCBfbm1hc2tfYW5kX29yX21zcih1bnNpZ25lZCBsb25nIG5tYXNrLCB1bnNpZ25lZCBsb25nIG9yX3ZhbCk7CiAKLWludCBtcGM3NDQ4X2hwYzJfZXhjbHVkZV9kZXZpY2UodV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQoraW50IG1wYzc0NDhfaHBjMl9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQogewogCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5oCmluZGV4IGE1NDNhNTIuLmY3ZTBlMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuaApAQCAtMTgsOSArMTgsNCBAQAogCiAjaW5jbHVkZSA8YXNtL3BwY2Jvb3QuaD4KIAotLyogQmFzZSBBZGRyZXNzZXMgZm9yIHRoZSBQQ0kgYnVzCi0gKi8KLSNkZWZpbmUgTVBDNzQ0OF9IUEMyX1BDSV9NRU1fT0ZGU0VUCSgweDAwMDAwMDAwKQotI2RlZmluZSBNUEM3NDQ4X0hQQzJfSVNBX0lPX0JBU0UJKDB4MDAwMDAwMDApCi0jZGVmaW5lIE1QQzc0NDhfSFBDMl9JU0FfTUVNX0JBU0UJKDB4MDAwMDAwMDApCiAjZW5kaWYJCQkJLyogX19QUENfUExBVEZPUk1TX01QQzc0NDhfSFBDMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9jYWxsX2hwdC5oCmluZGV4IGE4NDNiMGYuLjhkOTVmZTRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9ocHQuaApAQCAtNzYsMjQgKzc2LDI1IEBACiAJcmV0dXJuIGNvbXByZXNzZWRTdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kVmFsaWQoaHB0ZV90ICpocHRlLCB1NjQgdnBuKQorc3RhdGljIGlubGluZSB1NjQgSHZDYWxsSHB0X2ZpbmRWYWxpZChzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHU2NCB2cG4pCiB7CiAJcmV0dXJuIEh2Q2FsbDNSZXQxNihIdkNhbGxIcHRGaW5kVmFsaWQsIGhwdGUsIHZwbiwgMCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKGhwdGVfdCAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKK3N0YXRpYyBpbmxpbmUgdTY0IEh2Q2FsbEhwdF9maW5kTmV4dFZhbGlkKHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdTMyIGhwdGVJbmRleCwKIAkJdTggYml0c29uLCB1OCBiaXRzb2ZmKQogewogCXJldHVybiBIdkNhbGwzUmV0MTYoSHZDYWxsSHB0RmluZE5leHRWYWxpZCwgaHB0ZSwgaHB0ZUluZGV4LAogCQkJYml0c29uLCBiaXRzb2ZmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoaHB0ZV90ICpocHRlLCB1MzIgaHB0ZUluZGV4KQorc3RhdGljIGlubGluZSB2b2lkIEh2Q2FsbEhwdF9nZXQoc3RydWN0IGhhc2hfcHRlICpocHRlLCB1MzIgaHB0ZUluZGV4KQogewogCUh2Q2FsbDJSZXQxNihIdkNhbGxIcHRHZXQsIGhwdGUsIGhwdGVJbmRleCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfYWRkVmFsaWRhdGUodTMyIGhwdGVJbmRleCwgdTMyIGhCaXQsIGhwdGVfdCAqaHB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBIdkNhbGxIcHRfYWRkVmFsaWRhdGUodTMyIGhwdGVJbmRleCwgdTMyIGhCaXQsCisJCQkJCSBzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUpCiB7CiAJSHZDYWxsNChIdkNhbGxIcHRBZGRWYWxpZGF0ZSwgaHB0ZUluZGV4LCBoQml0LCBocHRlLT52LCBocHRlLT5yKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaHRhYi5jCmluZGV4IGVkNDRkZmMuLmI0ZTJjN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9odGFiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2h0YWIuYwpAQCAtNDQsNyArNDQsNyBAQAogCQkJIHVuc2lnbmVkIGxvbmcgdmZsYWdzLCBpbnQgcHNpemUpCiB7CiAJbG9uZyBzbG90OwotCWhwdGVfdCBsaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgbGhwdGU7CiAJaW50IHNlY29uZGFyeSA9IDA7CiAKIAlCVUdfT04ocHNpemUgIT0gTU1VX1BBR0VfNEspOwpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpU2VyaWVzX2hwdGVfZ2V0d29yZDAodW5zaWduZWQgbG9uZyBzbG90KQogewotCWhwdGVfdCBocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBocHRlOwogCiAJSHZDYWxsSHB0X2dldCgmaHB0ZSwgc2xvdCk7CiAJcmV0dXJuIGhwdGUudjsKQEAgLTE0NCw3ICsxNDQsNyBAQAogc3RhdGljIGxvbmcgaVNlcmllc19ocHRlX3VwZGF0ZXBwKHVuc2lnbmVkIGxvbmcgc2xvdCwgdW5zaWduZWQgbG9uZyBuZXdwcCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgdmEsIGludCBwc2l6ZSwgaW50IGxvY2FsKQogewotCWhwdGVfdCBocHRlOworCXN0cnVjdCBoYXNoX3B0ZSBocHRlOwogCXVuc2lnbmVkIGxvbmcgd2FudF92OwogCiAJaVNlcmllc19obG9jayhzbG90KTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICovCiBzdGF0aWMgbG9uZyBpU2VyaWVzX2hwdGVfZmluZCh1bnNpZ25lZCBsb25nIHZwbikKIHsKLQlocHRlX3QgaHB0ZTsKKwlzdHJ1Y3QgaGFzaF9wdGUgaHB0ZTsKIAlsb25nIHNsb3Q7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCmluZGV4IDljOTc0MjIuLmRhODcxNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKQEAgLTc0Miw2ICs3NDIsMTEgQEAKIAkvKiBJbnN0YWxsIElPIGhvb2tzICovCiAJcHBjX3BjaV9pbyA9IGlzZXJpZXNfcGNpX2lvOwogCisJLyogaVNlcmllcyBoYXMgbm8gSU8gc3BhY2UgaW4gdGhlIGNvbW1vbiBzZW5zZSwgaXQgbmVlZHMgdG8gc2V0CisJICogdGhlIElPIGJhc2UgdG8gMAorCSAqLworCXBjaV9pb19iYXNlID0gMDsKKwogCWlmIChyb290ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiaVNlcmllc19wY2liaW9zX2luaXQ6IGNhbid0IGZpbmQgcm9vdCAiCiAJCQkJIm9mIGRldmljZSB0cmVlXG4iKTsKQEAgLTc2Myw3ICs3NjgsNyBAQAogCQlpZiAocGhiID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7CisJCXBoYi0+cGNpX21lbV9vZmZzZXQgPSBidXM7CiAJCXBoYi0+Zmlyc3RfYnVzbm8gPSBidXM7CiAJCXBoYi0+bGFzdF9idXNubyA9IGJ1czsKIAkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwppbmRleCA3ZjVkY2VlLi4xM2E4YjE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYwpAQCAtNzksOCArNzksNiBAQAogc3RhdGljIHZvaWQgaVNlcmllc19wY2lfZmluYWxfZml4dXAodm9pZCkgeyB9CiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90YjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGl0YW47CiAKIHN0cnVjdCBNZW1vcnlCbG9jayB7CiAJdW5zaWduZWQgbG9uZyBhYnNTdGFydDsKQEAgLTI5Miw4ICsyOTAsOCBAQAogewogCURCRygiIC0+IGlTZXJpZXNfaW5pdF9lYXJseSgpXG4iKTsKIAotCWlTZXJpZXNfcmVjYWxfdGIgPSBnZXRfdGIoKTsKLQlpU2VyaWVzX3JlY2FsX3RpdGFuID0gSHZDYWxsWG1fbG9hZFRvZCgpOworCS8qIFNuYXBzaG90IHRoZSB0aW1lYmFzZSwgZm9yIHVzZSBpbiBsYXRlciByZWNhbGlicmF0aW9uICovCisJaVNlcmllc190aW1lX2luaXRfZWFybHkoKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgRE1BL1RDRSBtYW5hZ2VtZW50CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwppbmRleCA3YWFhNWJiLi5mY2VhYWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKQEAgLTQ0NCw3ICs0NDQsNyBAQAogCXUzX2h0ID0gaG9zZTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IG1hcGxlX2FkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpCiB7CiAJaW50IGxlbjsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CkBAIC01MTksMjMgKzUxOSw2IEBACiAJREJHKCIgPC0gbWFwbGVfcGNpX2lycV9maXh1cFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtYXBsZV9maXh1cF9waGJfcmVzb3VyY2VzKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCAqdG1wOwotCQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgewotCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwotCi0JCWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0ICs9IG9mZnNldDsKLQkJaG9zZS0+aW9fcmVzb3VyY2UuZW5kICs9IG9mZnNldDsKLQotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVsbHg7IGlvIGVuZDogJWxseFxuIiwKLQkJICAgICAgIGhvc2UtPmdsb2JhbF9udW1iZXIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLQogdm9pZCBfX2luaXQgbWFwbGVfcGNpX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqcm9vdDsKQEAgLTU1OCw3ICs1NDEsNyBAQAogCQkJY29udGludWU7CiAJCWlmICgob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ1NC1wY2llIikgfHwKIAkJICAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInUzLWFncCIpKSAmJgotCQkgICAgYWRkX2JyaWRnZShucCkgPT0gMCkKKwkJICAgIG1hcGxlX2FkZF9icmlkZ2UobnApID09IDApCiAJCQlvZl9ub2RlX2dldChucCk7CiAKIAkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAidTMtaHQiKSkgewpAQCAtNTcwLDI3ICs1NTMsOSBAQAogCiAJLyogTm93IHNldHVwIHRoZSBIeXBlclRyYW5zcG9ydCBob3N0IGlmIHdlIGZvdW5kIGFueQogCSAqLwotCWlmIChodCAmJiBhZGRfYnJpZGdlKGh0KSAhPSAwKQorCWlmIChodCAmJiBtYXBsZV9hZGRfYnJpZGdlKGh0KSAhPSAwKQogCQlvZl9ub2RlX3B1dChodCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogV2UgbmVlZCB0byBjYWxsIHBjaV9zZXR1cF9waGJfaW8gZm9yIHRoZSBIVCBicmlkZ2UgZmlyc3QKLSAgICAgICAgICogc28gaXQgZ2V0cyB0aGUgSS9PIHBvcnQgbnVtYmVycyBzdGFydGluZyBhdCAwLCBhbmQgd2UKLSAgICAgICAgICogbmVlZCB0byBjYWxsIGl0IGZvciB0aGUgQUdQIGJyaWRnZSBhZnRlciB0aGF0IHNvIGl0IGdldHMKLSAgICAgICAgICogc21hbGwgcG9zaXRpdmUgSS9PIHBvcnQgbnVtYmVycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh1M19odCkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHUzX2h0LCAxKTsKLSAgICAgICAgaWYgKHUzX2FncCkKLSAgICAgICAgICAgICAgICBwY2lfc2V0dXBfcGhiX2lvKHUzX2FncCwgMCk7Ci0gICAgICAgIGlmICh1NF9wY2llKQotICAgICAgICAgICAgICAgIHBjaV9zZXR1cF9waGJfaW8odTRfcGNpZSwgMCk7Ci0KLQkvKiBGaXh1cCB0aGUgSU8gcmVzb3VyY2VzIG9uIG91ciBob3N0IGJyaWRnZXMgYXMgdGhlIGNvbW1vbiBjb2RlCi0JICogZG9lcyBpdCBvbmx5IGZvciBjaGlsZHMgb2YgdGhlIGhvc3QgYnJpZGdlcwotCSAqLwotCW1hcGxlX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8gCiAJcGNpX2RldnNfcGhiX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKaW5kZXggN2M1MDc2ZS4uOTVjZDkwZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCkBAIC0yNSw0ICsyNSwxMyBAQAogCWhlbHAKIAkgIERyaXZlciBmb3IgTURJTyB2aWEgR1BJTyBvbiBQV1JmaWNpZW50IHBsYXRmb3JtcwogCitjb25maWcgRUxFQ1RSQV9JREUKKyAgICAgIHRyaXN0YXRlICJFbGVjdHJhIElERSBkcml2ZXIiCisgICAgICBkZWZhdWx0IHkKKyAgICAgIGRlcGVuZHMgb24gUFBDX1BBU0VNSSAmJiBBVEEKKyAgICAgIHNlbGVjdCBQQVRBX1BMQVRGT1JNCisgICAgICBoZWxwCisJVGhpcyBpbmNsdWRlcyBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIEVsZWN0cmEgb24tYm9hcmQgSURFCisJaW50ZXJmYWNlLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCmluZGV4IDJjZDJhNGYuLmY0N2ZjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLXkJKz0gc2V0dXAubyBwY2kubyB0aW1lLm8gaWRsZS5vIHBvd2Vyc2F2ZS5vIGlvbW11Lm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX01ESU8pCSs9IGdwaW9fbWRpby5vCitvYmotJChDT05GSUdfRUxFQ1RSQV9JREUpICs9IGVsZWN0cmFfaWRlLm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX0NQVUZSRVEpICs9IGNwdWZyZXEubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZWxlY3RyYV9pZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmYjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2VsZWN0cmFfaWRlLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBQQSBTZW1pLCBJbmMKKyAqCisgKiBNYWludGFpbmVkIGJ5OiBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIFRoZSBlbGVjdHJhIElERSBpbnRlcmZhY2UgaXMgaW5jcmVkaWJseSBzaW1wbGU6IEp1c3QgYSBkZXZpY2Ugb24gdGhlIGxvY2FsYnVzCisgKiB3aXRoIGludGVycnVwdHMgaG9va2VkIHVwIHRvIG9uZSBvZiB0aGUgR1BJT3MuIFRoZSBkZXZpY2UgdHJlZSBjb250YWlucyB0aGUKKyAqIGFkZHJlc3Mgd2luZG93IGFuZCBpbnRlcnJ1cHQgbWFwcGluZ3MgYWxyZWFkeSwgYW5kIHRoZSBwYXRhX3BsYXRmb3JtIGRyaXZlciBoYW5kbGVzCisgKiB0aGUgcmVzdC4gV2UganVzdCBuZWVkIHRvIGhvb2sgdGhlIHR3byB1cC4KKyAqLworCisjZGVmaW5lIE1BWF9JRlMJNAkvKiByZWFsbHksIHdlIGhhdmUgb25seSBvbmUgKi8KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZzW01BWF9JRlNdOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbGVjdHJhX2lkZV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgclszXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgImlkZSIsICJlbGVjdHJhLWlkZSIpOworCWkgPSAwOworCisJd2hpbGUgKG5wICYmIGkgPCBNQVhfSUZTKSB7CisJCW1lbXNldChyLCAwLCBzaXplb2YocikpOworCisJCS8qIHBhdGFfcGxhdGZvcm0gd2FudHMgdHdvIGFkZHJlc3MgcmFuZ2VzOiBvbmUgZm9yIHRoZSBiYXNlIHJlZ2lzdGVycywKKwkJICogYW5vdGhlciBmb3IgdGhlIGNvbnRyb2wgKGFsdHN0YXR1cykuIEl0J3MgbG9jYXRlZCBhdCBvZmZzZXQgMHgzZjYgaW4KKwkJICogdGhlIHdpbmRvdywgYnV0IHRoZSBkZXZpY2UgdHJlZSBvbmx5IGhhcyBvbmUgbGFyZ2UgcmVnaXN0ZXIgd2luZG93CisJCSAqIHRoYXQgY292ZXJzIGJvdGggcmFuZ2VzLiBTbyB3ZSBuZWVkIHRvIHNwbGl0IGl0IHVwIGJ5IGhhbmQgaGVyZToKKwkJICovCisKKwkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCXJbMV0uc3RhcnQgKz0gMHgzZjY7CisJCXJbMF0uZW5kID0gclsxXS5zdGFydC0xOworCisJCXJbMl0uc3RhcnQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CisJCXJbMl0uZW5kID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCQlyWzJdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisKKwkJcHJfZGVidWcoInJlZ2lzdGVyaW5nIHBsYXRmb3JtIGRldmljZSBhdCAweCVseC8weCVseCwgaXJxIGlzICVsZFxuIiwKKwkJCSByWzBdLnN0YXJ0LCByWzFdLnN0YXJ0LCByWzJdLnN0YXJ0KTsKKwkJcGRldnNbaV0gPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJwYXRhX3BsYXRmb3JtIiwgaSwgciwgMyk7CisJCWlmIChJU19FUlIocGRldnNbaV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHBkZXZzW2ldKTsKKwkJCXBkZXZzW2ldID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJpZGUiLCAiZWxlY3RyYS1pZGUiKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGVsZWN0cmFfaWRlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZWxlY3RyYV9pZGVfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9JRlM7IGkrKykKKwkJaWYgKHBkZXZzW2ldKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldnNbaV0pOworfQorbW9kdWxlX2V4aXQoZWxlY3RyYV9pZGVfZXhpdCk7CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUiAoIk9sb2YgSm9oYW5zc29uIDxvbG9mQGxpeG9tLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUEEgU2VtaSBFbGVjdHJhIElERSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKaW5kZXggYmJjNmRmYy4uYWIxZjVmNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvcGNpLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCWhvc2UtPmNmZ19kYXRhID0gaW9yZW1hcCgweGUwMDAwMDAwLCAweDEwMDAwMDAwKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3N0YXRpYyBpbnQgX19pbml0IHBhc19hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKIApAQCAtMTUwLDI5ICsxNTAsMTEgQEAKIAlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBQQS1QWFAgUENJIGhvc3QgYnJpZGdlLlxuIik7CiAKIAkvKiBJbnRlcnByZXQgdGhlICJyYW5nZXMiIHByb3BlcnR5ICovCi0JLyogVGhpcyBhbHNvIG1hcHMgdGhlIEkvTyByZWdpb24gYW5kIHNldHMgaXNhX2lvL21lbV9iYXNlICovCiAJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIDEpOwotCXBjaV9zZXR1cF9waGJfaW8oaG9zZSwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAodW5zaWduZWQgbG9uZylob3NlLT5pb19iYXNlX3ZpcnQgLSBwY2lfaW9fYmFzZTsKLQkJaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gb2Zmc2V0OwotCQlob3NlLT5pb19yZXNvdXJjZS5lbmQgKz0gb2Zmc2V0OwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgSG9zdCAlZCwgaW8gc3RhcnQ6ICVseDsgaW8gZW5kOiAlbHhcbiIsCi0JCSAgICAgICBob3NlLT5nbG9iYWxfbnVtYmVyLAotCQkgICAgICAgaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQsIGhvc2UtPmlvX3Jlc291cmNlLmVuZCk7Ci0JfQotfQotCi0KIHZvaWQgX19pbml0IHBhc19wY2lfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpyb290OwpAQCAtMTg1LDEzICsxNjcsMTEgQEAKIAl9CiAKIAlmb3IgKG5wID0gTlVMTDsgKG5wID0gb2ZfZ2V0X25leHRfY2hpbGQocm9vdCwgbnApKSAhPSBOVUxMOykKLQkJaWYgKG5wLT5uYW1lICYmICFzdHJjbXAobnAtPm5hbWUsICJweHAiKSAmJiAhYWRkX2JyaWRnZShucCkpCisJCWlmIChucC0+bmFtZSAmJiAhc3RyY21wKG5wLT5uYW1lLCAicHhwIikgJiYgIXBhc19hZGRfYnJpZGdlKG5wKSkKIAkJCW9mX25vZGVfZ2V0KG5wKTsKIAogCW9mX25vZGVfcHV0KHJvb3QpOwogCi0JcGFzX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8KIAlwY2lfZGV2c19waGJfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwppbmRleCBjNWEzZjYxLi5mZmU2NTI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCXJldHVybiAxOwogfQogCi1kZWZpbmVfbWFjaGluZShwYXMpIHsKK2RlZmluZV9tYWNoaW5lKHBhc2VtaSkgewogCS5uYW1lCQkJPSAiUEEgU2VtaSBQQTZULTE2ODJNIiwKIAkucHJvYmUJCQk9IHBhc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBwYXNfc2V0dXBfYXJjaCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvS2NvbmZpZwppbmRleCA1YjdhZmU1Li4wNTU5OTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCWJvb2wgIkFwcGxlIFBvd2VyTWFjIGJhc2VkIG1hY2hpbmVzIgogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0KIAlzZWxlY3QgTVBJQworCXNlbGVjdCBQQ0kKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSSBpZiBQUEMzMgogCXNlbGVjdCBQUENfTVBDMTA2IGlmIFBQQzMyCiAJc2VsZWN0IFBQQ19OQVRJVkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKaW5kZXggM2Y1MDdhYi4uZWZkZjVlYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9sb3dfaTJjLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9rZXlsYXJnby5oPgogI2luY2x1ZGUgPGFzbS91bmlub3J0aC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtODQsNyArODUsNyBAQAogCXZvaWQJCQkqaG9zdGRhdGE7CiAJaW50CQkJY2hhbm5lbDsJLyogc29tZSBob3N0cyBoYXZlIG11bHRpcGxlICovCiAJaW50CQkJbW9kZTsJCS8qIGN1cnJlbnQgbW9kZSAqLwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CiAJaW50CQkJb3BlbmVkOwogCWludAkJCXBvbGxlZDsJCS8qIG9wZW4gbW9kZSAqLwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBsYXRmb3JtX2RldjsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCiBzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdwogewotCXN0cnVjdCBzZW1hcGhvcmUJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQorCXN0cnVjdCBtdXRleAkJbXV0ZXg7CQkvKiBBY2Nlc3MgbXV0ZXggZm9yIHVzZSBieQogCQkJCQkJICogaTJjLWtleXdlc3QgKi8KIAl2b2lkIF9faW9tZW0JCSpiYXNlOwkJLyogcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCiAJaW50CQkJYnN0ZXBzOwkJLyogcmVnaXN0ZXIgc3RlcHBpbmcgKi8KQEAgLTM3NSwxNCArMzc2LDE0IEBACiBzdGF0aWMgaW50IGt3X2kyY19vcGVuKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7Ci0JZG93bigmaG9zdC0+bXV0ZXgpOworCW11dGV4X2xvY2soJmhvc3QtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQga3dfaTJjX2Nsb3NlKHN0cnVjdCBwbWFjX2kyY19idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7Ci0JdXAoJmhvc3QtPm11dGV4KTsKKwltdXRleF91bmxvY2soJmhvc3QtPm11dGV4KTsKIH0KIAogc3RhdGljIGludCBrd19pMmNfeGZlcihzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXMsIHU4IGFkZHJkaXIsIGludCBzdWJzaXplLApAQCAtNDk4LDcgKzQ5OSw3IEBACiAJCWtmcmVlKGhvc3QpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaW5pdF9NVVRFWCgmaG9zdC0+bXV0ZXgpOworCW11dGV4X2luaXQoJmhvc3QtPm11dGV4KTsKIAlpbml0X2NvbXBsZXRpb24oJmhvc3QtPmNvbXBsZXRlKTsKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CiAJaW5pdF90aW1lcigmaG9zdC0+dGltZW91dF90aW1lcik7CkBAIC01NzEsNyArNTcyLDcgQEAKIAlidXMtPm9wZW4gPSBrd19pMmNfb3BlbjsKIAlidXMtPmNsb3NlID0ga3dfaTJjX2Nsb3NlOwogCWJ1cy0+eGZlciA9IGt3X2kyY194ZmVyOwotCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwltdXRleF9pbml0KCZidXMtPm11dGV4KTsKIAlpZiAoY29udHJvbGxlciA9PSBidXNub2RlKQogCQlidXMtPmZsYWdzID0gcG1hY19pMmNfbXVsdGlidXM7CiAJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CkBAIC03OTgsNyArNzk5LDcgQEAKIAkJYnVzLT5tb2RlID0gcG1hY19pMmNfbW9kZV9zdGQ7CiAJCWJ1cy0+aG9zdGRhdGEgPSBidXMgKyAxOwogCQlidXMtPnhmZXIgPSBwbXVfaTJjX3hmZXI7Ci0JCWluaXRfTVVURVgoJmJ1cy0+c2VtKTsKKwkJbXV0ZXhfaW5pdCgmYnVzLT5tdXRleCk7CiAJCWJ1cy0+ZmxhZ3MgPSBwbWFjX2kyY19tdWx0aWJ1czsKIAkJbGlzdF9hZGQoJmJ1cy0+bGluaywgJnBtYWNfaTJjX2J1c3Nlcyk7CiAKQEAgLTkyMSw3ICs5MjIsNyBAQAogCQlidXMtPm1vZGUgPSBwbWFjX2kyY19tb2RlX3N0ZDsKIAkJYnVzLT5ob3N0ZGF0YSA9IGJ1cyArIDE7CiAJCWJ1cy0+eGZlciA9IHNtdV9pMmNfeGZlcjsKLQkJaW5pdF9NVVRFWCgmYnVzLT5zZW0pOworCQltdXRleF9pbml0KCZidXMtPm11dGV4KTsKIAkJYnVzLT5mbGFncyA9IDA7CiAJCWxpc3RfYWRkKCZidXMtPmxpbmssICZwbWFjX2kyY19idXNzZXMpOwogCkBAIC0xMDkzLDEzICsxMDk0LDEzIEBACiB7CiAJaW50IHJjOwogCi0JZG93bigmYnVzLT5zZW0pOworCW11dGV4X2xvY2soJmJ1cy0+bXV0ZXgpOwogCWJ1cy0+cG9sbGVkID0gcG9sbGVkIHx8IHBtYWNfaTJjX2ZvcmNlX3BvbGw7CiAJYnVzLT5vcGVuZWQgPSAxOwogCWJ1cy0+bW9kZSA9IHBtYWNfaTJjX21vZGVfc3RkOwogCWlmIChidXMtPm9wZW4gJiYgKHJjID0gYnVzLT5vcGVuKGJ1cykpICE9IDApIHsKIAkJYnVzLT5vcGVuZWQgPSAwOwotCQl1cCgmYnVzLT5zZW0pOworCQltdXRleF91bmxvY2soJmJ1cy0+bXV0ZXgpOwogCQlyZXR1cm4gcmM7CiAJfQogCXJldHVybiAwOwpAQCAtMTExMiw3ICsxMTEzLDcgQEAKIAlpZiAoYnVzLT5jbG9zZSkKIAkJYnVzLT5jbG9zZShidXMpOwogCWJ1cy0+b3BlbmVkID0gMDsKLQl1cCgmYnVzLT5zZW0pOworCW11dGV4X3VubG9jaygmYnVzLT5tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWFjX2kyY19jbG9zZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCmluZGV4IGM0YWY5ZTIuLjkyNTg2ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwpAQCAtMzUsOCArMzUsNiBAQAogI2RlZmluZSBEQkcoeC4uLikKICNlbmRpZgogCi1zdGF0aWMgaW50IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwotCiAvKiBYWFggQ291bGQgYmUgcGVyLWNvbnRyb2xsZXIsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHJpc2sgYW55dGhpbmcgYnkKICAqIGFzc3VtaW5nIHdlIHdvbid0IGhhdmUgYm90aCBVbmlOb3J0aCBhbmQgQmFuZGl0ICovCiBzdGF0aWMgaW50IGhhc191bmlub3J0aDsKQEAgLTg5Nyw3ICs4OTUsNyBAQAogICogInBjaSIgKGEgTVBDMTA2KSBhbmQgbm8gYmFuZGl0IG9yIGNoYW9zIGJyaWRnZXMsIGFuZCBjb250cmFyaXdpc2UsCiAgKiBpZiB3ZSBoYXZlIG9uZSBvciBtb3JlIGJhbmRpdCBvciBjaGFvcyBicmlkZ2VzLCB3ZSBkb24ndCBoYXZlIGEgTVBDMTA2LgogICovCi1zdGF0aWMgaW50IF9faW5pdCBhZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQorc3RhdGljIGludCBfX2luaXQgcG1hY19hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQogewogCWludCBsZW47CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwpAQCAtOTE4LDE1ICs5MTYsOSBAQAogCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOwogCX0KIAotCS8qIFhYWCBEaWZmZXJlbnQgcHJvdG90eXBlcywgdG8gYmUgbWVyZ2VkICovCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwotI2Vsc2UKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7Ci0jZW5kaWYKIAlpZiAoIWhvc2UpCiAJCXJldHVybiAtRU5PTUVNOwotCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKIAlob3NlLT5maXJzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVswXSA6IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IGJ1c19yYW5nZSA/IGJ1c19yYW5nZVsxXSA6IDB4ZmY7CiAKQEAgLTEwMDYsMTkgKzk5OCw2IEBACiAjZW5kaWYgLyogQ09ORklHX1BQQzMyICovCiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLXN0YXRpYyB2b2lkIF9faW5pdCBwbWFjX2ZpeHVwX3BoYl9yZXNvdXJjZXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsICp0bXA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJIEhvc3QgJWQsIGlvIHN0YXJ0OiAlbHg7IGlvIGVuZDogJWx4XG4iLAotCQkgICAgICAgaG9zZS0+Z2xvYmFsX251bWJlciwKLQkJICAgICAgIGhvc2UtPmlvX3Jlc291cmNlLnN0YXJ0LCBob3NlLT5pb19yZXNvdXJjZS5lbmQpOwotCX0KLX0KLSNlbmRpZgotCiB2b2lkIF9faW5pdCBwbWFjX3BjaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJvb3Q7CkBAIC0xMDM2LDcgKzEwMTUsNyBAQAogCQlpZiAoc3RyY21wKG5wLT5uYW1lLCAiYmFuZGl0IikgPT0gMAogCQkgICAgfHwgc3RyY21wKG5wLT5uYW1lLCAiY2hhb3MiKSA9PSAwCiAJCSAgICB8fCBzdHJjbXAobnAtPm5hbWUsICJwY2kiKSA9PSAwKSB7Ci0JCQlpZiAoYWRkX2JyaWRnZShucCkgPT0gMCkKKwkJCWlmIChwbWFjX2FkZF9icmlkZ2UobnApID09IDApCiAJCQkJb2Zfbm9kZV9nZXQobnApOwogCQl9CiAJCWlmIChzdHJjbXAobnAtPm5hbWUsICJodCIpID09IDApIHsKQEAgLTEwNTAsMjggKzEwMjksOSBAQAogCS8qIFByb2JlIEhUIGxhc3QgYXMgaXQgcmVsaWVzIG9uIHRoZSBhZ3AgcmVzb3VyY2VzIHRvIGJlIGFscmVhZHkKIAkgKiBzZXR1cAogCSAqLwotCWlmIChodCAmJiBhZGRfYnJpZGdlKGh0KSAhPSAwKQorCWlmIChodCAmJiBwbWFjX2FkZF9icmlkZ2UoaHQpICE9IDApCiAJCW9mX25vZGVfcHV0KGh0KTsKIAotCS8qCi0JICogV2UgbmVlZCB0byBjYWxsIHBjaV9zZXR1cF9waGJfaW8gZm9yIHRoZSBIVCBicmlkZ2UgZmlyc3QKLQkgKiBzbyBpdCBnZXRzIHRoZSBJL08gcG9ydCBudW1iZXJzIHN0YXJ0aW5nIGF0IDAsIGFuZCB3ZQotCSAqIG5lZWQgdG8gY2FsbCBpdCBmb3IgdGhlIEFHUCBicmlkZ2UgYWZ0ZXIgdGhhdCBzbyBpdCBnZXRzCi0JICogc21hbGwgcG9zaXRpdmUgSS9PIHBvcnQgbnVtYmVycy4KLQkgKi8KLQlpZiAodTNfaHQpCi0JCXBjaV9zZXR1cF9waGJfaW8odTNfaHQsIDEpOwotCWlmICh1M19hZ3ApCi0JCXBjaV9zZXR1cF9waGJfaW8odTNfYWdwLCAwKTsKLQlpZiAodTRfcGNpZSkKLQkJcGNpX3NldHVwX3BoYl9pbyh1NF9wY2llLCAwKTsKLQotCS8qCi0JICogT24gcHBjNjQsIGZpeHVwIHRoZSBJTyByZXNvdXJjZXMgb24gb3VyIGhvc3QgYnJpZGdlcyBhcwotCSAqIHRoZSBjb21tb24gY29kZSBkb2VzIGl0IG9ubHkgZm9yIGNoaWxkcmVuIG9mIHRoZSBob3N0IGJyaWRnZXMKLQkgKi8KLQlwbWFjX2ZpeHVwX3BoYl9yZXNvdXJjZXMoKTsKLQogCS8qIFNldHVwIHRoZSBsaW5rYWdlIGJldHdlZW4gT0Ygbm9kZXMgYW5kIFBIQnMgKi8KIAlwY2lfZGV2c19waGJfaW5pdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvS2NvbmZpZwppbmRleCA0MGYwMDA4Li5hMDUwNzliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAJc2VsZWN0IFVTQl9PSENJX0JJR19FTkRJQU5fTU1JTwogCXNlbGVjdCBVU0JfQVJDSF9IQVNfRUhDSQogCXNlbGVjdCBVU0JfRUhDSV9CSUdfRU5ESUFOX01NSU8KKwlzZWxlY3QgTUVNT1JZX0hPVFBMVUcKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBTb255IFBTMyBnYW1lIGNvbnNvbGUKIAkgIGFuZCBvdGhlciBwbGF0Zm9ybXMgdXNpbmcgdGhlIFBTMyBoeXBlcnZpc29yLgpAQCAtNzMsMTggKzc0LDEyIEBACiAKIGNvbmZpZyBQUzNfVlVBUlQKIAlkZXBlbmRzIG9uIFBQQ19QUzMKLQlib29sICJQUzMgVmlydHVhbCBVQVJUIHN1cHBvcnQiIGlmIFBTM19BRFZBTkNFRAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFBTMyBWaXJ0dWFsIFVBUlQuCi0KLQkgIFRoaXMgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3Igc2V2ZXJhbCBzeXN0ZW0gc2VydmljZXMKLQkgIGluY2x1ZGluZyB0aGUgU3lzdGVtIE1hbmFnZXIgYW5kIEFWIFNldHRpbmdzLiAgSW4KLQkgIGdlbmVyYWwsIGFsbCB1c2VycyB3aWxsIHNheSBZLgorCXRyaXN0YXRlCiAKIGNvbmZpZyBQUzNfUFMzQVYKKwlkZXBlbmRzIG9uIFBQQ19QUzMKIAl0cmlzdGF0ZSAiUFMzIEFWIHNldHRpbmdzIGRyaXZlciIgaWYgUFMzX0FEVkFOQ0VECi0JZGVwZW5kcyBvbiBQUzNfVlVBUlQKKwlzZWxlY3QgUFMzX1ZVQVJUCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUFMzIEFWIFNldHRpbmdzIGRyaXZlci4KQEAgLTkzLDEzICs4OCwxOCBAQAogCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkgb3IgTS4KIAogY29uZmlnIFBTM19TWVNfTUFOQUdFUgotCWJvb2wgIlBTMyBTeXN0ZW0gTWFuYWdlciBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAotCWRlcGVuZHMgb24gUFMzX1ZVQVJUCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUENfUFMzCisJdHJpc3RhdGUgIlBTMyBTeXN0ZW0gTWFuYWdlciBkcml2ZXIiIGlmIFBTM19BRFZBTkNFRAorCXNlbGVjdCBQUzNfVlVBUlQKKwlkZWZhdWx0IG0KIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQUzMgU3lzdGVtIE1hbmFnZXIuCiAKIAkgIFRoaXMgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3Igc3lzdGVtIGNvbnRyb2wuICBJbgotCSAgZ2VuZXJhbCwgYWxsIHVzZXJzIHdpbGwgc2F5IFkuCisJICBnZW5lcmFsLCBhbGwgdXNlcnMgd2lsbCBzYXkgWSBvciBNLgorCitjb25maWcgUFMzX1NUT1JBR0UKKwlkZXBlbmRzIG9uIFBQQ19QUzMKKwl0cmlzdGF0ZQogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCmluZGV4IGEwMDQ4ZmMuLmFjMWJkZjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL01ha2VmaWxlCkBAIC00LDMgKzQsNCBAQAogCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1NQVV9CQVNFKSArPSBzcHUubworb2JqLXkgKz0gZGV2aWNlLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1ZWJiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKQEAgLTAsMCArMSw3ODUgQEAKKy8qCisgKiAgUFMzIGRldmljZSByZWdpc3RyYXRpb24gcm91dGluZXMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sdjFjYWxsLmg+CisjaW5jbHVkZSA8YXNtL3BzM3N0b3IuaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qKgorICogcHMzX3NldHVwX2dlbGljX2RldmljZSAtIFNldHVwIGFuZCByZWdpc3RlciBhIGdlbGljIGRldmljZSBpbnN0YW5jZS4KKyAqCisgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UsIGluaXRpYWxpc2VzIHRoZQorICogc3RydWN0dXJlIG1lbWJlcnMsIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZSBpbnN0YW5jZSB3aXRoIHRoZSBzeXN0ZW0gYnVzLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF9nZWxpY19kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJQlVHX09OKHJlcG8tPmJ1c190eXBlICE9IFBTM19CVVNfVFlQRV9TQik7CisJQlVHX09OKHJlcG8tPmRldl90eXBlICE9IFBTM19ERVZfVFlQRV9TQl9HRUxJQyk7CisKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxheW91dCksIEdGUF9LRVJORUwpOworCisJaWYgKCFwKSB7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYWxsb2M7CisJfQorCisJcC0+ZGV2Lm1hdGNoX2lkID0gUFMzX01BVENIX0lEX0dFTElDOworCXAtPmRldi5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5kZXYuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPmRldi5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+ZGV2LmRfcmVnaW9uID0gJnAtPmRfcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJUFMzX0lOVEVSUlVQVF9UWVBFX0VWRU5UX1BPUlQsICZwLT5kZXYuaW50ZXJydXB0X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X2ZpbmRfaW50ZXJydXB0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9maW5kX2ludGVycnVwdDsKKwl9CisKKwlCVUdfT04ocC0+ZGV2LmludGVycnVwdF9pZCAhPSAwKTsKKworCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2LmRfcmVnaW9uLCBQUzNfRE1BXzY0SywKKwkJUFMzX0RNQV9PVEhFUiwgTlVMTCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfZG1hX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kbWFfaW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2RldmljZV9yZWdpc3RlcjsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9kbWFfaW5pdDoKK2ZhaWxfZmluZF9pbnRlcnJ1cHQ6CisJa2ZyZWUocCk7CitmYWlsX21hbGxvYzoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkOiBmYWlsLlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdF9yZWZvayBwczNfc2V0dXBfdWhjX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLCBlbnVtIHBzM19tYXRjaF9pZCBtYXRjaF9pZCwKKwllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRlcnJ1cHRfdHlwZSwgZW51bSBwczNfcmVnX3R5cGUgcmVnX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgbGF5b3V0IHsKKwkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBkZXY7CisJCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiBkX3JlZ2lvbjsKKwkJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiBtX3JlZ2lvbjsKKwl9ICpwOworCXU2NCBidXNfYWRkcjsKKwl1NjQgbGVuOworCisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTihyZXBvLT5idXNfdHlwZSAhPSBQUzNfQlVTX1RZUEVfU0IpOworCUJVR19PTihyZXBvLT5kZXZfdHlwZSAhPSBQUzNfREVWX1RZUEVfU0JfVVNCKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21hbGxvYzsKKwl9CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfU0I7CisJcC0+ZGV2LmJ1c19pZCA9IHJlcG8tPmJ1c19pZDsKKwlwLT5kZXYuZGV2X2lkID0gcmVwby0+ZGV2X2lkOworCXAtPmRldi5kX3JlZ2lvbiA9ICZwLT5kX3JlZ2lvbjsKKwlwLT5kZXYubV9yZWdpb24gPSAmcC0+bV9yZWdpb247CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChyZXBvLAorCQlpbnRlcnJ1cHRfdHlwZSwgJnAtPmRldi5pbnRlcnJ1cHRfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfaW50ZXJydXB0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKHJlcG8sIHJlZ190eXBlLAorCQkmYnVzX2FkZHIsICZsZW4pOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcgZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX2ZpbmRfcmVnOworCX0KKworCXJlc3VsdCA9IHBzM19kbWFfcmVnaW9uX2luaXQoJnAtPmRldiwgcC0+ZGV2LmRfcmVnaW9uLCBQUzNfRE1BXzY0SywKKwkJUFMzX0RNQV9JTlRFUk5BTCwgTlVMTCwgMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZCBwczNfZG1hX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kbWFfaW5pdDsKKwl9CisKKwlyZXN1bHQgPSBwczNfbW1pb19yZWdpb25faW5pdCgmcC0+ZGV2LCBwLT5kZXYubV9yZWdpb24sIGJ1c19hZGRyLCBsZW4sCisJCVBTM19NTUlPXzRLKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19tbWlvX3JlZ2lvbl9pbml0IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9tbWlvX2luaXQ7CisJfQorCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWdvdG8gZmFpbF9kZXZpY2VfcmVnaXN0ZXI7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworCitmYWlsX2RldmljZV9yZWdpc3RlcjoKK2ZhaWxfbW1pb19pbml0OgorZmFpbF9kbWFfaW5pdDoKK2ZhaWxfZmluZF9yZWc6CitmYWlsX2ZpbmRfaW50ZXJydXB0OgorCWtmcmVlKHApOworZmFpbF9tYWxsb2M6CisJcHJfZGVidWcoIiA8LSAlczolZDogZmFpbC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3NldHVwX2VoY2lfZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCit7CisJcmV0dXJuIHBzM19zZXR1cF91aGNfZGV2aWNlKHJlcG8sIFBTM19NQVRDSF9JRF9FSENJLAorCQlQUzNfSU5URVJSVVBUX1RZUEVfU0JfRUhDSSwgUFMzX1JFR19UWVBFX1NCX0VIQ0kpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfc2V0dXBfb2hjaV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlyZXR1cm4gcHMzX3NldHVwX3VoY19kZXZpY2UocmVwbywgUFMzX01BVENIX0lEX09IQ0ksCisJCVBTM19JTlRFUlJVUFRfVFlQRV9TQl9PSENJLCBQUzNfUkVHX1RZUEVfU0JfT0hDSSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zZXR1cF92dWFydF9kZXZpY2UoZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBtYXRjaF9pZCAldSwgcG9ydCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQltYXRjaF9pZCwgcG9ydF9udW1iZXIpOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBtYXRjaF9pZDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfVlVBUlQ7CisJcC0+ZGV2LnBvcnRfbnVtYmVyID0gcG9ydF9udW1iZXI7CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzc3Rvcl93YWl0X2Zvcl9jb21wbGV0aW9uKHU2NCBkZXZfaWQsIHU2NCB0YWcsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQgPSAtMTsKKwl1bnNpZ25lZCBpbnQgcmV0cmllcyA9IDA7CisJdTY0IHN0YXR1czsKKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCB0aW1lb3V0OyByZXRyaWVzKyspIHsKKwkJcmVzdWx0ID0gbHYxX3N0b3JhZ2VfY2hlY2tfYXN5bmNfc3RhdHVzKGRldl9pZCwgdGFnLCAmc3RhdHVzKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlicmVhazsKKworCQltc2xlZXAoMSk7CisJfQorCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiV1OiBjaGVja19hc3luY19zdGF0dXM6ICVzLCBzdGF0dXMgJWx4XG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpLCBzdGF0dXMpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBwczNfc3RvcmFnZV93YWl0X2Zvcl9kZXZpY2UgLSBXYWl0IGZvciBhIHN0b3JhZ2UgZGV2aWNlIHRvIGJlY29tZSByZWFkeS4KKyAqIEByZXBvOiBUaGUgcmVwb3NpdG9yeSBkZXZpY2UgdG8gd2FpdCBmb3IuCisgKgorICogVXNlcyB0aGUgaHlwZXJ2aXNvcidzIHN0b3JhZ2UgZGV2aWNlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20gdG8gd2FpdCB1bnRpbAorICogYSBzdG9yYWdlIGRldmljZSBpcyByZWFkeS4gIFRoZSBkZXZpY2Ugbm90aWZpY2F0aW9uIG1lY2hhbmlzbSB1c2VzIGEKKyAqIHBzdWVkbyBkZXZpY2UgKGlkID0gLTEpIHRvIGFzeW5jaHJvbm91c2x5IG5vdGlmeSB0aGUgZ3Vlc3Qgd2hlbiBzdG9yYWdlCisgKiBkZXZpY2VzIGJlY29tZSByZWFkeS4gIFRoZSBub3RpZmljYXRpb24gZGV2aWNlIGhhcyBhIGJsb2NrIHNpemUgb2YgNTEyCisgKiBieXRlcy4KKyAqLworCitzdGF0aWMgaW50IHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKQoreworCWludCByZXN1bHQ7CisJY29uc3QgdTY0IG5vdGlmaWNhdGlvbl9kZXZfaWQgPSAodTY0KS0xTEw7CisJY29uc3QgdW5zaWduZWQgaW50IHRpbWVvdXQgPSBIWjsKKwl1NjQgbHBhcjsKKwl1NjQgdGFnOworCXN0cnVjdCB7CisJCXU2NCBvcGVyYXRpb25fY29kZTsJLyogbXVzdCBiZSB6ZXJvICovCisJCXU2NCBldmVudF9tYXNrOwkJLyogMSA9IGRldmljZSByZWFkeSAqLworCX0gKm5vdGlmeV9jbWQ7CisJc3RydWN0IHsKKwkJdTY0IGV2ZW50X3R5cGU7CQkvKiBub3RpZnlfZGV2aWNlX3JlYWR5ICovCisJCXU2NCBidXNfaWQ7CisJCXU2NCBkZXZfaWQ7CisJCXU2NCBkZXZfdHlwZTsKKwkJdTY0IGRldl9wb3J0OworCX0gKm5vdGlmeV9ldmVudDsKKwllbnVtIHsKKwkJbm90aWZ5X2RldmljZV9yZWFkeSA9IDEKKwl9OworCisJcHJfZGVidWcoIiAtPiAlczoldTogYnVzX2lkICV1LCBkZXZfaWQgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywKKwkJIF9fTElORV9fLCByZXBvLT5idXNfaWQsIHJlcG8tPmRldl9pZCwgcmVwby0+ZGV2X3R5cGUpOworCisJbm90aWZ5X2NtZCA9IGt6YWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKKwlub3RpZnlfZXZlbnQgPSAodm9pZCAqKW5vdGlmeV9jbWQ7CisJaWYgKCFub3RpZnlfY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwYXIgPSBwczNfbW1fcGh5c190b19scGFyKF9fcGEobm90aWZ5X2NtZCkpOworCisJcmVzdWx0ID0gbHYxX29wZW5fZGV2aWNlKHJlcG8tPmJ1c19pZCwgbm90aWZpY2F0aW9uX2Rldl9pZCwgMCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiBsdjFfb3Blbl9kZXZpY2UgJXNcbiIsIF9fZnVuY19fLAorCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlOworCX0KKworCS8qIFNldHVwIGFuZCB3cml0ZSB0aGUgcmVxdWVzdCBmb3IgZGV2aWNlIG5vdGlmaWNhdGlvbi4gKi8KKworCW5vdGlmeV9jbWQtPm9wZXJhdGlvbl9jb2RlID0gMDsJLyogbXVzdCBiZSB6ZXJvICovCisJbm90aWZ5X2NtZC0+ZXZlbnRfbWFzayA9IDB4MDE7CS8qIGRldmljZSByZWFkeSAqLworCisJcmVzdWx0ID0gbHYxX3N0b3JhZ2Vfd3JpdGUobm90aWZpY2F0aW9uX2Rldl9pZCwgMCwgMCwgMSwgMCwgbHBhciwKKwkJCQkgICAmdGFnKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkgICAgICAgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCS8qIFdhaXQgZm9yIHRoZSB3cml0ZSBjb21wbGV0aW9uICovCisKKwlyZXN1bHQgPSBwczNzdG9yX3dhaXRfZm9yX2NvbXBsZXRpb24obm90aWZpY2F0aW9uX2Rldl9pZCwgdGFnLAorCQkJCQkgICAgIHRpbWVvdXQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogd3JpdGUgbm90IGNvbXBsZXRlZCAlc1xuIiwgX19mdW5jX18sCisJCSAgICAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX2Nsb3NlOworCX0KKworCS8qIExvb3AgaGVyZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0ZWQgbm90aWZpY2F0aW9uIGV2ZW50cy4gKi8KKworCXJlc3VsdCA9IC1FTk9ERVY7CisJd2hpbGUgKDEpIHsKKwkJbWVtc2V0KG5vdGlmeV9ldmVudCwgMCwgc2l6ZW9mKCpub3RpZnlfZXZlbnQpKTsKKworCQlyZXN1bHQgPSBsdjFfc3RvcmFnZV9yZWFkKG5vdGlmaWNhdGlvbl9kZXZfaWQsIDAsIDAsIDEsIDAsCisJCQkJCSAgbHBhciwgJnRhZyk7CisJCWlmIChyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHdyaXRlIGZhaWxlZCAlc1xuIiwgX19mdW5jX18sCisJCQkgICAgICAgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM3N0b3Jfd2FpdF9mb3JfY29tcGxldGlvbihub3RpZmljYXRpb25fZGV2X2lkLCB0YWcsCisJCQkJCQkgICAgIHRpbWVvdXQpOworCQlpZiAocmVzdWx0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiV1OiByZWFkIG5vdCBjb21wbGV0ZWQgJXNcbiIsCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobm90aWZ5X2V2ZW50LT5ldmVudF90eXBlICE9IG5vdGlmeV9kZXZpY2VfcmVhZHkgfHwKKwkJICAgIG5vdGlmeV9ldmVudC0+YnVzX2lkICE9IHJlcG8tPmJ1c19pZCkgeworCQkJcHJfZGVidWcoIiVzOiV1OiBiYWQgbm90aWZ5X2V2ZW50OiBldmVudCAlbHUsICIKKwkJCQkgImRldl9pZCAlbHUsIGRldl90eXBlICVsdVxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fLCBub3RpZnlfZXZlbnQtPmV2ZW50X3R5cGUsCisJCQkJIG5vdGlmeV9ldmVudC0+ZGV2X2lkLCBub3RpZnlfZXZlbnQtPmRldl90eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZGV2X2lkID09IHJlcG8tPmRldl9pZCAmJgorCQkgICAgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSA9PSByZXBvLT5kZXZfdHlwZSkgeworCQkJcHJfZGVidWcoIiVzOiV1OiBkZXZpY2UgcmVhZHk6IGRldl9pZCAldVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fLCByZXBvLT5kZXZfaWQpOworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5vdGlmeV9ldmVudC0+ZGV2X2lkID09IHJlcG8tPmRldl9pZCAmJgorCQkgICAgbm90aWZ5X2V2ZW50LT5kZXZfdHlwZSA9PSBQUzNfREVWX1RZUEVfTk9BQ0NFU1MpIHsKKwkJCXByX2RlYnVnKCIlczoldTogbm8gYWNjZXNzOiBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAorCQkJCSBfX0xJTkVfXywgcmVwby0+ZGV2X2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCitmYWlsX2Nsb3NlOgorCWx2MV9jbG9zZV9kZXZpY2UocmVwby0+YnVzX2lkLCBub3RpZmljYXRpb25fZGV2X2lkKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShub3RpZnlfY21kKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX3NldHVwX3N0b3JhZ2VfZGV2KGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8sCisJCQkJIGVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqcDsKKwl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CisJdW5zaWduZWQgaW50IG51bV9yZWdpb25zLCBpOworCisJcHJfZGVidWcoIiAtPiAlczoldTogbWF0Y2hfaWQgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbWF0Y2hfaWQpOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvKHJlcG8tPmJ1c19pbmRleCwKKwkJCQkJCSAgIHJlcG8tPmRldl9pbmRleCwgJnBvcnQsCisJCQkJCQkgICAmYmxrX3NpemUsICZudW1fYmxvY2tzLAorCQkJCQkJICAgJm51bV9yZWdpb25zKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IF9yZWFkX3N0b3JfZGV2X2luZm8gZmFpbGVkICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JXU6IGluZGV4ICV1OiV1OiBwb3J0ICVsdSBibGtfc2l6ZSAlbHUgbnVtX2Jsb2NrcyAlbHUgIgorCQkgIm51bV9yZWdpb25zICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwKKwkJIHJlcG8tPmRldl9pbmRleCwgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlKSArCisJCSAgICBudW1fcmVnaW9ucyAqIHNpemVvZihzdHJ1Y3QgcHMzX3N0b3JhZ2VfcmVnaW9uKSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghcCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfbWFsbG9jOworCX0KKworCXAtPnNiZC5tYXRjaF9pZCA9IG1hdGNoX2lkOworCXAtPnNiZC5kZXZfdHlwZSA9IFBTM19ERVZJQ0VfVFlQRV9TQjsKKwlwLT5zYmQuYnVzX2lkID0gcmVwby0+YnVzX2lkOworCXAtPnNiZC5kZXZfaWQgPSByZXBvLT5kZXZfaWQ7CisJcC0+c2JkLmRfcmVnaW9uID0gJnAtPmRtYV9yZWdpb247CisJcC0+YmxrX3NpemUgPSBibGtfc2l6ZTsKKwlwLT5udW1fcmVnaW9ucyA9IG51bV9yZWdpb25zOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQocmVwbywKKwkJCQkJICAgICAgIFBTM19JTlRFUlJVUFRfVFlQRV9FVkVOVF9QT1JULAorCQkJCQkgICAgICAgJnAtPnNiZC5pbnRlcnJ1cHRfaWQpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczoldTogZmluZF9pbnRlcnJ1cHQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIF9fTElORV9fLCByZXN1bHQpOworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfZmluZF9pbnRlcnJ1cHQ7CisJfQorCisJLyogRklYTUU6IEFycmFuZ2UgdG8gb25seSBkbyB0aGlzIG9uIGEgJ2NvbGQnIGJvb3QgKi8KKworCXJlc3VsdCA9IHBzM19zdG9yYWdlX3dhaXRfZm9yX2RldmljZShyZXBvKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6JXU6IHN0b3JhZ2Vfbm90aWZpY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX3Byb2JlX25vdGlmaWNhdGlvbjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3JlZ2lvbnM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaWQ7CisJCXU2NCBzdGFydCwgc2l6ZTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihyZXBvLT5idXNfaW5kZXgsCisJCQkJCQkJICAgICByZXBvLT5kZXZfaW5kZXgsCisJCQkJCQkJICAgICBpLCAmaWQsICZzdGFydCwKKwkJCQkJCQkgICAgICZzaXplKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiV1OiByZWFkX3N0b3JfZGV2X3JlZ2lvbiBmYWlsZWQgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbF9yZWFkX3JlZ2lvbjsKKwkJfQorCQlwcl9kZWJ1ZygiJXM6JXU6IHJlZ2lvbiAldTogaWQgJXUgc3RhcnQgJWx1IHNpemUgJWx1XG4iLAorCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgaSwgaWQsIHN0YXJ0LCBzaXplKTsKKworCQlwLT5yZWdpb25zW2ldLmlkID0gaWQ7CisJCXAtPnJlZ2lvbnNbaV0uc3RhcnQgPSBzdGFydDsKKwkJcC0+cmVnaW9uc1tpXS5zaXplID0gc2l6ZTsKKwl9CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPnNiZCk7CisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCSBfX2Z1bmNfXywgX19MSU5FX18pOworCQlnb3RvIGZhaWxfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIDA7CisKK2ZhaWxfZGV2aWNlX3JlZ2lzdGVyOgorZmFpbF9yZWFkX3JlZ2lvbjoKK2ZhaWxfcHJvYmVfbm90aWZpY2F0aW9uOgorZmFpbF9maW5kX2ludGVycnVwdDoKKwlrZnJlZShwKTsKK2ZhaWxfbWFsbG9jOgorCXByX2RlYnVnKCIgPC0gJXM6JXU6IGZhaWwuXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19yZWdpc3Rlcl92dWFydF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF92dWFydF9hdl9wb3J0KCZwb3J0X251bWJlcik7CisJaWYgKHJlc3VsdCkKKwkJcG9ydF9udW1iZXIgPSAwOyAvKiBhdiBkZWZhdWx0ICovCisKKwlyZXN1bHQgPSBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywgcG9ydF9udW1iZXIpOworCVdBUk5fT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfdnVhcnRfc3lzbWdyX3BvcnQoJnBvcnRfbnVtYmVyKTsKKwlpZiAocmVzdWx0KQorCQlwb3J0X251bWJlciA9IDI7IC8qIHN5c21nciBkZWZhdWx0ICovCisKKwlyZXN1bHQgPSBwczNfc2V0dXBfdnVhcnRfZGV2aWNlKFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKKwkJcG9ydF9udW1iZXIpOworCVdBUk5fT04ocmVzdWx0KTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX3NvdW5kX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBsYXlvdXQgeworCQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGRldjsKKwkJc3RydWN0IHBzM19kbWFfcmVnaW9uIGRfcmVnaW9uOworCQlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIG1fcmVnaW9uOworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRldi5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9TT1VORDsKKwlwLT5kZXYuZGV2X3R5cGUgPSBQUzNfREVWSUNFX1RZUEVfSU9DMDsKKwlwLT5kZXYuZF9yZWdpb24gPSAmcC0+ZF9yZWdpb247CisJcC0+ZGV2Lm1fcmVnaW9uID0gJnAtPm1fcmVnaW9uOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyKCZwLT5kZXYpOworCisJaWYgKHJlc3VsdCkKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBwczNfcmVnaXN0ZXJfZ3JhcGhpY3NfZGV2aWNlcyh2b2lkKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGxheW91dCB7CisJCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgZGV2OworCX0gKnA7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsYXlvdXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5kZXYubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M7CisJcC0+ZGV2LmRldl90eXBlID0gUFMzX0RFVklDRV9UWVBFX0lPQzA7CisKKwlyZXN1bHQgPSBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoJnAtPmRldik7CisKKwlpZiAocmVzdWx0KQorCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlIC0gUmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB0aGUgcmVwb3NpdGlvcnkgaW5mby4KKyAqCisgKi8KKworc3RhdGljIGludCBwczNfcmVnaXN0ZXJfcmVwb3NpdG9yeV9kZXZpY2UoCisJY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChyZXBvLT5kZXZfdHlwZSkgeworCWNhc2UgUFMzX0RFVl9UWVBFX1NCX0dFTElDOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfZ2VsaWNfZGV2aWNlKHJlcG8pOworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX2dlbGljX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBTM19ERVZfVFlQRV9TQl9VU0I6CisKKwkJLyogRWFjaCBVU0IgZGV2aWNlIGhhcyBib3RoIGFuIEVIQ0kgYW5kIGFuIE9IQ0kgSEMgKi8KKworCQlyZXN1bHQgPSBwczNfc2V0dXBfZWhjaV9kZXZpY2UocmVwbyk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19zZXR1cF9laGNpX2RldmljZSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19zZXR1cF9vaGNpX2RldmljZShyZXBvKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3NldHVwX29oY2lfZGV2aWNlIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQl9CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVl9UWVBFX1NUT1JfRElTSzoKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX0RJU0spOworCisJCS8qIFNvbWUgZGV2aWNlcyBhcmUgbm90IGFjY2Vzc2FibGUgZnJvbSB0aGUgT3RoZXIgT1MgbHBhci4gKi8KKwkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKSB7CisJCQlyZXN1bHQgPSAwOworCQkJcHJfZGVidWcoIiVzOiV1OiBub3QgYWNjZXNzYWJsZVxuIiwgX19mdW5jX18sCisJCQkJIF9fTElORV9fKTsKKwkJfQorCisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX1JPTToKKwkJcmVzdWx0ID0gcHMzX3NldHVwX3N0b3JhZ2VfZGV2KHJlcG8sIFBTM19NQVRDSF9JRF9TVE9SX1JPTSk7CisJCWlmIChyZXN1bHQpCisJCQlwcl9kZWJ1ZygiJXM6JXUgcHMzX3NldHVwX3N0b3JhZ2VfZGV2IGZhaWxlZFxuIiwKKwkJCQkgX19mdW5jX18sIF9fTElORV9fKTsKKwkJYnJlYWs7CisKKwljYXNlIFBTM19ERVZfVFlQRV9TVE9SX0ZMQVNIOgorCQlyZXN1bHQgPSBwczNfc2V0dXBfc3RvcmFnZV9kZXYocmVwbywgUFMzX01BVENIX0lEX1NUT1JfRkxBU0gpOworCQlpZiAocmVzdWx0KQorCQkJcHJfZGVidWcoIiVzOiV1IHBzM19zZXR1cF9zdG9yYWdlX2RldiBmYWlsZWRcbiIsCisJCQkJIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gMDsKKwkJcHJfZGVidWcoIiVzOiV1OiB1bnN1cHBvcnRlZCBkZXZfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcmVwby0+ZGV2X3R5cGUpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogcHMzX3Byb2JlX3RocmVhZCAtIEJhY2tncm91bmQgcmVwb3NpdG9yeSBwcm9iaW5nIGF0IHN5c3RlbSBzdGFydHVwLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBiYWNrZ3JvdW5kIHByb2Jpbmcgb24gYSBzaW5nbGUgYnVzLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Byb2JlX3RocmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8gPSBkYXRhOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgaW50IG1zID0gMjUwOworCisJcHJfZGVidWcoIiAtPiAlczoldToga3RocmVhZCBzdGFydGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJZG8geworCQl0cnlfdG9fZnJlZXplKCk7CisKKwkJcHJfZGVidWcoIiVzOiV1OiBwcm9iaW5nLi4uXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJCWRvIHsKKwkJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHJlcG8pOworCisJCQlpZiAocmVzdWx0ID09IC1FTk9ERVYpCisJCQkJcHJfZGVidWcoIiVzOiV1OiBub3RoaW5nIG5ld1xuIiwgX19mdW5jX18sCisJCQkJCV9fTElORV9fKTsKKwkJCWVsc2UgaWYgKHJlc3VsdCkKKwkJCQlwcl9kZWJ1ZygiJXM6JXU6IGZpbmQgZGV2aWNlIGVycm9yLlxuIiwKKwkJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCWVsc2UgeworCQkJCXByX2RlYnVnKCIlczoldTogZm91bmQgZGV2aWNlXG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJCXBzM19yZWdpc3Rlcl9yZXBvc2l0b3J5X2RldmljZShyZXBvKTsKKwkJCQlwczNfcmVwb3NpdG9yeV9idW1wX2RldmljZShyZXBvKTsKKwkJCQltcyA9IDI1MDsKKwkJCX0KKwkJfSB3aGlsZSAoIXJlc3VsdCk7CisKKwkJcHJfZGVidWcoIiVzOiV1OiBtcyAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBtcyk7CisKKwkJaWYgKCBtcyA+IDYwMDAwKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwX2ludGVycnVwdGlibGUobXMpOworCisJCS8qIEFuIGV4cG9uZW50aWFsIGJhY2tvZmYuICovCisJCW1zIDw8PSAxOworCisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiV1OiBrdGhyZWFkIGZpbmlzaGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3N0YXJ0X3Byb2JlX3RocmVhZCAtIFN0YXJ0cyB0aGUgYmFja2dyb3VuZCBwcm9iZSB0aHJlYWQuCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zdGFydF9wcm9iZV90aHJlYWQoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RhdGljIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsgLyogbXVzdCBiZSBzdGF0aWMgKi8KKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltZW1zZXQoJnJlcG8sIDAsIHNpemVvZihyZXBvKSk7CisKKwlyZXBvLmJ1c190eXBlID0gYnVzX3R5cGU7CisKKwlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9maW5kX2J1cyhyZXBvLmJ1c190eXBlLCAwLCAmcmVwby5idXNfaW5kZXgpOworCisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgZmluZCBidXMgKCVkKVxuIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LCAmcmVwby5idXNfaWQpOworCisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkX2J1c19pZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkJcmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdGFzayA9IGt0aHJlYWRfcnVuKHBzM19wcm9iZV90aHJlYWQsICZyZXBvLCAicHMzLXByb2JlLSV1IiwgYnVzX3R5cGUpOworCisJaWYgKElTX0VSUih0YXNrKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHRhc2spOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBrdGhyZWFkX3J1biBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCisvKioKKyAqIHBzM19yZWdpc3Rlcl9kZXZpY2VzIC0gUHJvYmUgdGhlIHN5c3RlbSBhbmQgcmVnaXN0ZXIgZGV2aWNlcyBmb3VuZC4KKyAqCisgKiBBIGRldmljZV9pbml0Y2FsbCgpIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgcHMzX3JlZ2lzdGVyX2RldmljZXModm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKiBwczNfcmVwb3NpdG9yeV9kdW1wX2J1c19pbmZvKCk7ICovCisKKwlyZXN1bHQgPSBwczNfc3RhcnRfcHJvYmVfdGhyZWFkKFBTM19CVVNfVFlQRV9TVE9SQUdFKTsKKworCXBzM19yZWdpc3Rlcl92dWFydF9kZXZpY2VzKCk7CisKKwlwczNfcmVnaXN0ZXJfZ3JhcGhpY3NfZGV2aWNlcygpOworCisJcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKFBTM19CVVNfVFlQRV9TQiwKKwkJcHMzX3JlZ2lzdGVyX3JlcG9zaXRvcnlfZGV2aWNlKTsKKworCXBzM19yZWdpc3Rlcl9zb3VuZF9kZXZpY2VzKCk7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwocHMzX3JlZ2lzdGVyX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaHRhYi5jCmluZGV4IGExNDA5ZTQuLjVkMmUxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2h0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9odGFiLmMKQEAgLTI5LDEyICsyOSwxMiBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAotc3RhdGljIGhwdGVfdCAqaHRhYjsKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9wdGUgKmh0YWI7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBodGFiX2FkZHI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciAqYm9sdHRhYjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnVzZXRhYjsKQEAgLTQ0LDggKzQ0LDggQEAKICNkZWZpbmUgZGVidWdfZHVtcF9ocHRlKF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nKSBcCiAJX2RlYnVnX2R1bXBfaHB0ZShfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX19mdW5jX18sIF9fTElORV9fKQogc3RhdGljIHZvaWQgX2RlYnVnX2R1bXBfaHB0ZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHZhLAotCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBocHRlX3QgbGhwdGUsIGludCBwc2l6ZSwKLQl1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQorCXVuc2lnbmVkIGxvbmcgZ3JvdXAsIHVuc2lnbmVkIGxvbmcgYml0bWFwLCBzdHJ1Y3QgaGFzaF9wdGUgbGhwdGUsCisJaW50IHBzaXplLCB1bnNpZ25lZCBsb25nIHNsb3QsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCURCRygiJXM6JWQ6IHBhICAgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIHBhKTsKIAlEQkcoIiVzOiVkOiBscGFyICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLApAQCAtNjMsNyArNjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgcmZsYWdzLCB1bnNpZ25lZCBsb25nIHZmbGFncywgaW50IHBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgc2xvdDsKLQlocHRlX3QgbGhwdGU7CisJc3RydWN0IGhhc2hfcHRlIGxocHRlOwogCWludCBzZWNvbmRhcnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgcmVzdWx0OwogCXVuc2lnbmVkIGxvbmcgYml0bWFwOwpAQCAtMjM0LDEwICsyMzQsMTcgQEAKIAogc3RhdGljIHZvaWQgcHMzX2hwdGVfY2xlYXIodm9pZCkKIHsKLQkvKiBNYWtlIHN1cmUgdG8gY2xlYW4gdXAgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZmlyc3QgKi8KLQlwczNmYl9jbGVhbnVwKCk7CisJaW50IHJlc3VsdDsKIAotCWx2MV91bm1hcF9odGFiKGh0YWJfYWRkcik7CisJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXN1bHQgPSBsdjFfdW5tYXBfaHRhYihodGFiX2FkZHIpOworCUJVR19PTihyZXN1bHQpOworCisJcHMzX21tX3NodXRkb3duKCk7CisJcHMzX21tX3Zhc19kZXN0cm95KCk7CisKKwlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIAogdm9pZCBfX2luaXQgcHMzX2hwdGVfaW5pdCh1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZSkKQEAgLTI1NSw3ICsyNjIsNyBAQAogCiAJcHBjNjRfcGZ0X3NpemUgPSBfX2lsb2cyKGh0YWJfc2l6ZSk7CiAKLQliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihocHRlX3QpIC8gODsKKwliaXRtYXBfc2l6ZSA9IGh0YWJfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgaGFzaF9wdGUpIC8gODsKIAogCWJvbHR0YWIgPSBfX3ZhKGxtYl9hbGxvYyhiaXRtYXBfc2l6ZSwgMSkpOwogCWludXNldGFiID0gX192YShsbWJfYWxsb2MoYml0bWFwX3NpemUsIDEpKTsKQEAgLTI3Myw4ICsyODAsOCBAQAogCiAJcmVzdWx0ID0gbHYxX21hcF9odGFiKDAsICZodGFiX2FkZHIpOwogCi0JaHRhYiA9IChocHRlX3QgKilfX2lvcmVtYXAoaHRhYl9hZGRyLCBodGFiX3NpemUsCi0JCQkJICAgcGdwcm90X3ZhbChQQUdFX1JFQURPTkxZX1gpKTsKKwlodGFiID0gKF9fZm9yY2Ugc3RydWN0IGhhc2hfcHRlICopaW9yZW1hcF9mbGFncyhodGFiX2FkZHIsIGh0YWJfc2l6ZSwKKwkJCQkJICAgIHBncHJvdF92YWwoUEFHRV9SRUFET05MWV9YKSk7CiAKIAlEQkcoIiVzOiVkOiBscGFyICUwMTZseGgsIHZpcnQgJTAxNmx4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlodGFiX2FkZHIsICh1bnNpZ25lZCBsb25nKWh0YWIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCBlYzkwMzBkLi42N2UzMmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogLyoqCkBAIC03OCwxOSArNzgsODUgQEAKIC8qKgogICogc3RydWN0IHBzM19wcml2YXRlIC0gYSBwZXIgY3B1IGRhdGEgc3RydWN0dXJlCiAgKiBAYm1wOiBwczNfYm1wIHN0cnVjdHVyZQotICogQG5vZGU6IEhWIGxvZ2ljYWxfcHBlX2lkCi0gKiBAY3B1OiBIViB0aHJlYWRfaWQKKyAqIEBwcGVfaWQ6IEhWIGxvZ2ljYWxfcHBlX2lkCisgKiBAdGhyZWFkX2lkOiBIViB0aHJlYWRfaWQKICAqLwogCiBzdHJ1Y3QgcHMzX3ByaXZhdGUgewogCXN0cnVjdCBwczNfYm1wIGJtcCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoUFMzX0JNUF9NSU5BTElHTikpKTsKLQl1NjQgbm9kZTsKLQl1bnNpZ25lZCBpbnQgY3B1OworCXU2NCBwcGVfaWQ7CisJdTY0IHRocmVhZF9pZDsKIH07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHMzX3ByaXZhdGUsIHBzM19wcml2YXRlKTsKIAogLyoqCisgKiBwczNfY2hpcF9tYXNrIC0gU2V0IGFuIGludGVycnVwdCBtYXNrIGJpdCBpbiBwczNfYm1wLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIFNldHMgcHMzX2JtcC5tYXNrIGFuZCBjYWxscyBsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzaygpLgorICovCisKK3N0YXRpYyB2b2lkIHBzM19jaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IHRocmVhZF9pZCAlbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJcGQtPnRocmVhZF9pZCwgdmlycSk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY2xlYXJfYml0KDYzIC0gdmlycSwgJnBkLT5ibXAubWFzayk7CisJbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHBzM19jaGlwX3VubWFzayAtIENsZWFyIGFuIGludGVycnVwdCBtYXNrIGJpdCBpbiBwczNfYm1wLgorICogQHZpcnE6IFRoZSBhc3NpZ25lZCBMaW51eCB2aXJxLgorICoKKyAqIENsZWFycyBwczNfYm1wLm1hc2sgYW5kIGNhbGxzIGx2MV9kaWRfdXBkYXRlX2ludGVycnVwdF9tYXNrKCkuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX2NoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQoreworCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoIiVzOiVkOiB0aHJlYWRfaWQgJWx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXBkLT50aHJlYWRfaWQsIHZpcnEpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNldF9iaXQoNjMgLSB2aXJxLCAmcGQtPmJtcC5tYXNrKTsKKwlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogcHMzX2NoaXBfZW9pIC0gSFYgZW5kLW9mLWludGVycnVwdC4KKyAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KKyAqCisgKiBDYWxscyBsdjFfZW5kX29mX2ludGVycnVwdF9leHQoKS4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCit7CisJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOworCWx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKK30KKworLyoqCisgKiBwczNfaXJxX2NoaXAgLSBSZXByZXNlbnRzIHRoZSBwczNfYm1wIGFzIGEgTGludXggc3RydWN0IGlycV9jaGlwLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcHMzX2lycV9jaGlwID0geworCS50eXBlbmFtZSA9ICJwczMiLAorCS5tYXNrID0gcHMzX2NoaXBfbWFzaywKKwkudW5tYXNrID0gcHMzX2NoaXBfdW5tYXNrLAorCS5lb2kgPSBwczNfY2hpcF9lb2ksCit9OworCisvKioKICAqIHBzM192aXJxX3NldHVwIC0gdmlycSByZWxhdGVkIHNldHVwLgogICogQGNwdTogZW51bSBwczNfY3B1X2JpbmRpbmcgaW5kaWNhdGluZyB0aGUgY3B1IHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlCiAgKiBzZXJ2aWNlZCBvbi4KQEAgLTEzNCw2ICsyMDAsOCBAQAogCQlnb3RvIGZhaWxfc2V0OwogCX0KIAorCXBzM19jaGlwX21hc2soKnZpcnEpOworCiAJcmV0dXJuIHJlc3VsdDsKIAogZmFpbF9zZXQ6CkBAIC0xNTMsOCArMjIxLDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCXNldF9pcnFfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwogCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CkBAIC0xOTAsNyArMjU4LDggQEAKIAogCS8qIEJpbmRzIG91dGxldCB0byBjcHUgKyB2aXJxLiAqLwogCi0JcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5ub2RlLCBwZC0+Y3B1LCAqdmlycSwgb3V0bGV0LCAwKTsKKwlyZXN1bHQgPSBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQocGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgKnZpcnEsCisJCW91dGxldCwgMCk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCXByX2luZm8oIiVzOiVkOiBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKQEAgLTIyMiwxMCArMjkxLDEyIEBACiAJaW50IHJlc3VsdDsKIAljb25zdCBzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gZ2V0X2lycV9jaGlwX2RhdGEodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IG5vZGUgJWx1LCBjcHUgJWQsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJcGQtPm5vZGUsIHBkLT5jcHUsIHZpcnEpOworCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsdSwgdGhyZWFkX2lkICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7CisJcHMzX2NoaXBfbWFzayh2aXJxKTsKKworCXJlc3VsdCA9IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dChwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2luZm8oIiVzOiVkOiBsdjFfZGlzY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKQEAgLTI4Miw3ICszNTMsOSBAQAogewogCWludCByZXN1bHQ7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkIHZpcnE6ICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHZpcnEpOworCXByX2RlYnVnKCIgLT4gJXM6JWQgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB2aXJxKTsKKworCXBzM19jaGlwX21hc2sodmlycSk7CiAKIAlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0KHZpcnFfdG9faHcodmlycSkpOwogCkBAIC0yOTAsMTcgKzM2MywxNCBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCS8qIGx2MV9kZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQoKSBkZXN0cm95cyB0aGUgSVJRIHBsdWcsCi0JICogc28gZG9uJ3QgY2FsbCBwczNfaXJxX3BsdWdfZGVzdHJveSgpIGhlcmUuCisJLyoKKwkgKiBEb24ndCBjYWxsIHBzM192aXJxX2Rlc3Ryb3koKSBoZXJlIHNpbmNlIHBzM19zbXBfY2xlYW51cF9jcHUoKQorCSAqIGNhbGxzIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKHNtcF9jYWxsX2Z1bmN0aW9uKSB3aGVuIGtleGVjaW5nLgogCSAqLwogCi0JcmVzdWx0ID0gcHMzX3ZpcnFfZGVzdHJveSh2aXJxKTsKLQlCVUdfT04ocmVzdWx0KTsKLQogCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSk7CiAKIGludCBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHVuc2lnbmVkIGludCB2aXJxKQogewpAQCAtMzExLDE3ICszODEsMTUgQEAKICAqIHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAgLSBTZXR1cCBhIHN5c3RlbSBidXMgZXZlbnQgcmVjZWl2ZSBwb3J0LgogICogQGNwdTogZW51bSBwczNfY3B1X2JpbmRpbmcgaW5kaWNhdGluZyB0aGUgY3B1IHRoZSBpbnRlcnJ1cHQgc2hvdWxkIGJlCiAgKiBzZXJ2aWNlZCBvbi4KLSAqIEBkaWQ6IFRoZSBIViBkZXZpY2UgaWRlbnRpZmllciByZWFkIGZyb20gdGhlIHN5c3RlbSByZXBvc2l0b3J5LgotICogQGludGVycnVwdF9pZDogVGhlIGRldmljZSBpbnRlcnJ1cHQgaWQgcmVhZCBmcm9tIHRoZSBzeXN0ZW0gcmVwb3NpdG9yeS4KKyAqIEBkZXY6IFRoZSBzeXN0ZW0gYnVzIGRldmljZSBpbnN0YW5jZS4KICAqIEB2aXJxOiBUaGUgYXNzaWduZWQgTGludXggdmlycS4KICAqCiAgKiBBbiBldmVudCBpcnEgcmVwcmVzZW50cyBhIHZpcnR1YWwgZGV2aWNlIGludGVycnVwdC4gIFRoZSBpbnRlcnJ1cHRfaWQKICAqIGNvcmVzcG9uZHMgdG8gdGhlIHNvZnR3YXJlIGludGVycnVwdCBudW1iZXIuCiAgKi8KIAotaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoZW51bSBwczNfY3B1X2JpbmRpbmcgY3B1LAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsIHVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsCi0JdW5zaWduZWQgaW50ICp2aXJxKQoraW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCWVudW0gcHMzX2NwdV9iaW5kaW5nIGNwdSwgdW5zaWduZWQgaW50ICp2aXJxKQogewogCS8qIHRoaXMgc2hvdWxkIGdvIGluIHN5c3RlbS1idXMuYyAqLwogCkBAIC0zMzIsOCArNDAwLDggQEAKIAlpZiAocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcmVzdWx0ID0gbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKLQkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcoKnZpcnEpLCBpbnRlcnJ1cHRfaWQpOworCXJlc3VsdCA9IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQoZGV2LT5idXNfaWQsCisJCWRldi0+ZGV2X2lkLCB2aXJxX3RvX2h3KCp2aXJxKSwgZGV2LT5pbnRlcnJ1cHRfaWQpOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25uZWN0X2ludGVycnVwdF9ldmVudF9yZWNlaXZlX3BvcnQiCkBAIC0zNDUsMjQgKzQxMywyNCBAQAogCX0KIAogCXByX2RlYnVnKCIlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWludGVycnVwdF9pZCwgKnZpcnEpOworCQlkZXYtPmludGVycnVwdF9pZCwgKnZpcnEpOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXApOwogCi1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkICpkaWQsCi0JdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwgdW5zaWduZWQgaW50IHZpcnEpCitpbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAkvKiB0aGlzIHNob3VsZCBnbyBpbiBzeXN0ZW0tYnVzLmMgKi8KIAogCWludCByZXN1bHQ7CiAKIAlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBpbnRlcnJ1cHRfaWQgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJaW50ZXJydXB0X2lkLCB2aXJxKTsKKwkJZGV2LT5pbnRlcnJ1cHRfaWQsIHZpcnEpOwogCi0JcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkaWQtPmJ1c19pZCwKLQkJZGlkLT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGludGVycnVwdF9pZCk7CisJcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydChkZXYtPmJ1c19pZCwKKwkJZGV2LT5kZXZfaWQsIHZpcnFfdG9faHcodmlycSksIGRldi0+aW50ZXJydXB0X2lkKTsKIAogCWlmIChyZXN1bHQpCiAJCXByX2RlYnVnKCIlczolZDogbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKQEAgLTM3Miw2ICs0NDAsMTQgQEAKIAlyZXN1bHQgPSBwczNfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3kodmlycSk7CiAJQlVHX09OKHJlc3VsdCk7CiAKKwkvKgorCSAqIHBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSgpIGRlc3Ryb3lzIHRoZSBJUlEgcGx1ZywKKwkgKiBzbyBkb24ndCBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgaGVyZS4KKwkgKi8KKworCXJlc3VsdCA9IHBzM192aXJxX2Rlc3Ryb3kodmlycSk7CisJQlVHX09OKHJlc3VsdCk7CisKIAlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CkBAIC00MTIsMTYgKzQ4OCwyNCBAQAogaW50IHBzM19pb19pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgb3V0bGV0ID0gdmlycV90b19odyh2aXJxKTsKIAotCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KHZpcnFfdG9faHcodmlycSkpOworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwkvKgorCSAqIGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KCkgd2lsbCBkZXN0cm95IHRoZSBJUlEgcGx1ZywKKwkgKiBzbyBjYWxsIHBzM19pcnFfcGx1Z19kZXN0cm95KCkgZmlyc3QuCisJICovCisKKwlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKKwlCVUdfT04ocmVzdWx0KTsKKworCXJlc3VsdCA9IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0KG91dGxldCk7CiAKIAlpZiAocmVzdWx0KQogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKLQlCVUdfT04ocmVzdWx0KTsKLQogCXJldHVybiByZXN1bHQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfaW9faXJxX2Rlc3Ryb3kpOwpAQCAtNDYxLDExICs1NDUsMTMgQEAKIAogCXJldHVybiByZXN1bHQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfdnVhcnRfaXJxX3NldHVwKTsKIAogaW50IHBzM192dWFydF9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKIAlpbnQgcmVzdWx0OwogCisJcHMzX2NoaXBfbWFzayh2aXJxKTsKIAlyZXN1bHQgPSBsdjFfZGVjb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSgpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNDc5LDYgKzU2NSw3IEBACiAKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X2lycV9kZXN0cm95KTsKIAogLyoqCiAgKiBwczNfc3BlX2lycV9zZXR1cCAtIFNldHVwIGFuIHNwZSB2aXJxLgpAQCAtNTE0LDkgKzYwMSwxNCBAQAogCiBpbnQgcHMzX3NwZV9pcnFfZGVzdHJveSh1bnNpZ25lZCBpbnQgdmlycSkKIHsKLQlpbnQgcmVzdWx0ID0gcHMzX2lycV9wbHVnX2Rlc3Ryb3kodmlycSk7CisJaW50IHJlc3VsdDsKKworCXBzM19jaGlwX21hc2sodmlycSk7CisKKwlyZXN1bHQgPSBwczNfaXJxX3BsdWdfZGVzdHJveSh2aXJxKTsKIAlCVUdfT04ocmVzdWx0KTsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtNTMzLDcgKzYyNSw3IEBACiAJCSpwICYgMHhmZmZmKTsKIH0KIAotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wXzI1Nl9ibXAoY29uc3QgY2hhciAqaGVhZGVyLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfMjU2X2JtcChjb25zdCBjaGFyICpoZWFkZXIsCiAJY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBjcHUsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogJXMgJXUgeyUwMTZseDolMDE2bHg6JTAxNmx4OiUwMTZseH1cbiIsCkBAIC01NDYsODYgKzYzOCwyNSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7Ci0JX2R1bXBfNjRfYm1wKCJzdGF0IiwgJnBkLT5ibXAuc3RhdHVzLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKLQlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+Y3B1LCBmdW5jLCBsaW5lKTsKKwlfZHVtcF82NF9ibXAoInN0YXQiLCAmcGQtPmJtcC5zdGF0dXMsIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwogfQogCiAjZGVmaW5lIGR1bXBfbWFzayhfeCkgX2R1bXBfbWFzayhfeCwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX21hc2soc3RydWN0IHBzM19wcml2YXRlKiBwZCwKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX21hc2soc3RydWN0IHBzM19wcml2YXRlICpwZCwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwotCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT5jcHUsIGZ1bmMsIGxpbmUpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXAubG9jaywgZmxhZ3MpOwogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGR1bXBfYm1wKHN0cnVjdCBwczNfcHJpdmF0ZSogcGQpIHt9OwogI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCiAKLXN0YXRpYyB2b2lkIHBzM19jaGlwX21hc2sodW5zaWduZWQgaW50IHZpcnEpCi17Ci0Jc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCXU2NCBiaXQgPSAweDgwMDAwMDAwMDAwMDAwMDBVTCA+PiB2aXJxOwotCXU2NCAqcCA9ICZwZC0+Ym1wLm1hc2s7Ci0JdTY0IG9sZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcHJfZGVidWcoIiVzOiVkOiBjcHUgJXUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcGQtPmNwdSwgdmlycSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JYXNtIHZvbGF0aWxlKAotCQkgICAgICIxOglsZGFyeCAlMCwwLCUzXG4iCi0JCSAgICAgImFuZGMJJTAsJTAsJTJcbiIKLQkJICAgICAic3RkY3guCSUwLDAsJTNcbiIKLQkJICAgICAiYm5lLQkxYiIKLQkJICAgICA6ICI9JnIiIChvbGQpLCAiK20iICgqcCkKLQkJICAgICA6ICJyIiAoYml0KSwgInIiIChwKQotCQkgICAgIDogImNjIiApOwotCi0JbHYxX2RpZF91cGRhdGVfaW50ZXJydXB0X21hc2socGQtPm5vZGUsIHBkLT5jcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHMzX2NoaXBfdW5tYXNrKHVuc2lnbmVkIGludCB2aXJxKQotewotCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJxKTsKLQl1NjQgYml0ID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKLQl1NjQgKnAgPSAmcGQtPmJtcC5tYXNrOwotCXU2NCBvbGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXByX2RlYnVnKCIlczolZDogY3B1ICV1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBkLT5jcHUsIHZpcnEpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWFzbSB2b2xhdGlsZSgKLQkJICAgICAiMToJbGRhcnggJTAsMCwlM1xuIgotCQkgICAgICJvcgklMCwlMCwlMlxuIgotCQkgICAgICJzdGRjeC4JJTAsMCwlM1xuIgotCQkgICAgICJibmUtCTFiIgotCQkgICAgIDogIj0mciIgKG9sZCksICIrbSIgKCpwKQotCQkgICAgIDogInIiIChiaXQpLCAiciIgKHApCi0JCSAgICAgOiAiY2MiICk7Ci0KLQlsdjFfZGlkX3VwZGF0ZV9pbnRlcnJ1cHRfbWFzayhwZC0+bm9kZSwgcGQtPmNwdSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBwczNfY2hpcF9lb2kodW5zaWduZWQgaW50IHZpcnEpCi17Ci0JY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnEpOwotCWx2MV9lbmRfb2ZfaW50ZXJydXB0X2V4dChwZC0+bm9kZSwgcGQtPmNwdSwgdmlycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaXJxX2NoaXAgPSB7Ci0JLnR5cGVuYW1lID0gInBzMyIsCi0JLm1hc2sgPSBwczNfY2hpcF9tYXNrLAotCS51bm1hc2sgPSBwczNfY2hpcF91bm1hc2ssCi0JLmVvaSA9IHBzM19jaGlwX2VvaSwKLX07Ci0KIHN0YXRpYyB2b2lkIHBzM19ob3N0X3VubWFwKHN0cnVjdCBpcnFfaG9zdCAqaCwgdW5zaWduZWQgaW50IHZpcnEpCiB7CiAJc2V0X2lycV9jaGlwX2RhdGEodmlycSwgTlVMTCk7CkBAIC02MzcsNyArNjY4LDcgQEAKIAlwcl9kZWJ1ZygiJXM6JWQ6IGh3aXJxICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBod2lycSwKIAkJdmlycSk7CiAKLQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmlycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcHMzX2lycV9jaGlwLCBoYW5kbGVfZmFzdGVvaV9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTcsNyArNjg4LDcgQEAKIAkJY3B1LCB2aXJxLCBwZC0+Ym1wLmlwaV9kZWJ1Z19icmtfbWFzayk7CiB9CiAKLXVuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBwczNfZ2V0X2lycSh2b2lkKQogewogCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSAmX19nZXRfY3B1X3ZhcihwczNfcHJpdmF0ZSk7CiAJdTY0IHggPSAocGQtPmJtcC5zdGF0dXMgJiBwZC0+Ym1wLm1hc2spOwpAQCAtNjcyLDggKzcwMyw4IEBACiAJcGx1ZyAmPSAweDNmOwogCiAJaWYgKHVubGlrZWx5KHBsdWcpID09IE5PX0lSUSkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IGNwdSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJcGQtPmNwdSk7CisJCXByX2RlYnVnKCIlczolZDogbm8gcGx1ZyBmb3VuZDogdGhyZWFkX2lkICVsdVxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcGQtPnRocmVhZF9pZCk7CiAJCWR1bXBfYm1wKCZwZXJfY3B1KHBzM19wcml2YXRlLCAwKSk7CiAJCWR1bXBfYm1wKCZwZXJfY3B1KHBzM19wcml2YXRlLCAxKSk7CiAJCXJldHVybiBOT19JUlE7CkBAIC03MDMsMTYgKzczNCwxNiBAQAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJc3RydWN0IHBzM19wcml2YXRlICpwZCA9ICZwZXJfY3B1KHBzM19wcml2YXRlLCBjcHUpOwogCi0JCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBkLT5ub2RlKTsKLQkJcGQtPmNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKwkJbHYxX2dldF9sb2dpY2FsX3BwZV9pZCgmcGQtPnBwZV9pZCk7CisJCXBkLT50aHJlYWRfaWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CiAJCXNwaW5fbG9ja19pbml0KCZwZC0+Ym1wLmxvY2spOwogCi0JCXByX2RlYnVnKCIlczolZDogbm9kZSAlbHUsIGNwdSAlZCwgYm1wICVseGhcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIHBkLT5ub2RlLCBwZC0+Y3B1LAorCQlwcl9kZWJ1ZygiJXM6JWQ6IHBwZV9pZCAlbHUsIHRocmVhZF9pZCAlbHUsIGJtcCAlbHhoXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLAogCQkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKCZwZC0+Ym1wKSkpOwogCi0JCXJlc3VsdCA9IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwZC0+bm9kZSwgcGQtPmNwdSwKLQkJCXBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcCkpKTsKKwkJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBkLT5wcGVfaWQsCisJCQlwZC0+dGhyZWFkX2lkLCBwczNfbW1fcGh5c190b19scGFyKF9fcGEoJnBkLT5ibXApKSk7CiAKIAkJaWYgKHJlc3VsdCkKIAkJCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwIGZhaWxlZDoiCkBAIC03MjIsMyArNzUzLDE2IEBACiAKIAlwcGNfbWQuZ2V0X2lycSA9IHBzM19nZXRfaXJxOwogfQorCit2b2lkIHBzM19zaHV0ZG93bl9JUlEoaW50IGNwdSkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCBwcGVfaWQ7CisJdTY0IHRocmVhZF9pZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoY3B1KTsKKworCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBwZV9pZCk7CisJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV9pcnFfc3RhdGVfYml0bWFwKHBwZV9pZCwgdGhyZWFkX2lkLCAwKTsKKworCURCRygiJXM6JWQ6IGx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCAoJWx1OiVsdS8lZCkgJXNcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgcHBlX2lkLCB0aHJlYWRfaWQsIGNwdSwgcHMzX3Jlc3VsdChyZXN1bHQpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCmluZGV4IGY4YTNlMjAuLjdiYjNlMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwpAQCAtMzAsOSArMzAsOSBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogZW51bSB7CkBAIC0xMTUsNyArMTE1LDggQEAKIH07CiAKICNkZWZpbmUgZGVidWdfZHVtcF9tYXAoeCkgX2RlYnVnX2R1bXBfbWFwKHgsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kZWJ1Z19kdW1wX21hcChjb25zdCBzdHJ1Y3QgbWFwKiBtLCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kZWJ1Z19kdW1wX21hcChjb25zdCBzdHJ1Y3QgbWFwICptLAorCWNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQogewogCURCRygiJXM6JWQ6IG1hcC50b3RhbCAgICAgPSAlbHhoXG4iLCBmdW5jLCBsaW5lLCBtLT50b3RhbCk7CiAJREJHKCIlczolZDogbWFwLnJtLnNpemUgICA9ICVseGhcbiIsIGZ1bmMsIGxpbmUsIG0tPnJtLnNpemUpOwpAQCAtMjEyLDkgKzIxMywxNSBAQAogCiB2b2lkIHBzM19tbV92YXNfZGVzdHJveSh2b2lkKQogeworCWludCByZXN1bHQ7CisKKwlEQkcoIiVzOiVkOiBtYXAudmFzX2lkICAgID0gJWx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1hcC52YXNfaWQpOworCiAJaWYgKG1hcC52YXNfaWQpIHsKLQkJbHYxX3NlbGVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UoMCk7Ci0JCWx2MV9kZXN0cnVjdF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2UobWFwLnZhc19pZCk7CisJCXJlc3VsdCA9IGx2MV9zZWxlY3RfdmlydHVhbF9hZGRyZXNzX3NwYWNlKDApOworCQlCVUdfT04ocmVzdWx0KTsKKwkJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZShtYXAudmFzX2lkKTsKKwkJQlVHX09OKHJlc3VsdCk7CiAJCW1hcC52YXNfaWQgPSAwOwogCX0KIH0KQEAgLTIzMiw3ICsyMzksNyBAQAogICogQHNpemUgaXMgcm91bmRlZCBkb3duIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHZhcyBsYXJnZSBwYWdlIHNpemUuCiAgKi8KIAotaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IHBzM19tbV9yZWdpb25fY3JlYXRlKHN0cnVjdCBtZW1fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIG11aWQ7CkBAIC0yNzMsMTAgKzI4MCwxNCBAQAogICogQHI6IHBvaW50ZXIgdG8gc3RydWN0IG1lbV9yZWdpb24KICAqLwogCi12b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKK3N0YXRpYyB2b2lkIHBzM19tbV9yZWdpb25fZGVzdHJveShzdHJ1Y3QgbWVtX3JlZ2lvbiAqcikKIHsKKwlpbnQgcmVzdWx0OworCisJREJHKCIlczolZDogci0+YmFzZSA9ICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgci0+YmFzZSk7CiAJaWYgKHItPmJhc2UpIHsKLQkJbHYxX3JlbGVhc2VfbWVtb3J5KHItPmJhc2UpOworCQlyZXN1bHQgPSBsdjFfcmVsZWFzZV9tZW1vcnkoci0+YmFzZSk7CisJCUJVR19PTihyZXN1bHQpOwogCQlyLT5zaXplID0gci0+YmFzZSA9IHItPm9mZnNldCA9IDA7CiAJCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplOwogCX0KQEAgLTMyOSwzMSArMzQwLDM0IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCiAvKioKLSAqIGRtYV9scGFyX3RvX2J1cyAtIFRyYW5zbGF0ZSBhbiBscGFyIGFkZHJlc3MgdG8gaW9jIG1hcHBlZCBidXMgYWRkcmVzcy4KKyAqIGRtYV9zYl9scGFyX3RvX2J1cyAtIFRyYW5zbGF0ZSBhbiBscGFyIGFkZHJlc3MgdG8gaW9jIG1hcHBlZCBidXMgYWRkcmVzcy4KICAqIEByOiBwb2ludGVyIHRvIGRtYSByZWdpb24gc3RydWN0dXJlCiAgKiBAbHBhcl9hZGRyOiBIViBscGFyIGFkZHJlc3MKICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfbHBhcl90b19idXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX3NiX2xwYXJfdG9fYnVzKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKIAl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcikKIHsKLQlCVUdfT04obHBhcl9hZGRyID49IG1hcC5yMS5iYXNlICsgbWFwLnIxLnNpemUpOwotCXJldHVybiByLT5idXNfYWRkciArIChscGFyX2FkZHIgPD0gbWFwLnJtLnNpemUgPyBscGFyX2FkZHIKLQkJOiBscGFyX2FkZHIgLSBtYXAucjEub2Zmc2V0KTsKKwlpZiAobHBhcl9hZGRyID49IG1hcC5ybS5zaXplKQorCQlscGFyX2FkZHIgLT0gbWFwLnIxLm9mZnNldDsKKwlCVUdfT04obHBhcl9hZGRyIDwgci0+b2Zmc2V0KTsKKwlCVUdfT04obHBhcl9hZGRyID49IHItPm9mZnNldCArIHItPmxlbik7CisJcmV0dXJuIHItPmJ1c19hZGRyICsgbHBhcl9hZGRyIC0gci0+b2Zmc2V0OwogfQogCiAjZGVmaW5lIGRtYV9kdW1wX3JlZ2lvbihfYSkgX2RtYV9kdW1wX3JlZ2lvbihfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGNvbnN0IGNoYXIqIGZ1bmMsCi0JaW50IGxpbmUpCitzdGF0aWMgdm9pZCAgX19tYXliZV91bnVzZWQgX2RtYV9kdW1wX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCiB7Ci0JREJHKCIlczolZDogZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGlkLmJ1c19pZCwKLQkJci0+ZGlkLmRldl9pZCk7CisJREJHKCIlczolZDogZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCisJCXItPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiBwYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCByLT5wYWdlX3NpemUpOwogCURCRygiJXM6JWQ6IGJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+YnVzX2FkZHIpOwogCURCRygiJXM6JWQ6IGxlbiAgICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKKwlEQkcoIiVzOiVkOiBvZmZzZXQgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIHItPm9mZnNldCk7CiB9CiAKLS8qKgorICAvKioKICAqIGRtYV9jaHVuayAtIEEgY2h1bmsgb2YgZG1hIHBhZ2VzIG1hcHBlZCBieSB0aGUgaW8gY29udHJvbGxlci4KICAqIEByZWdpb24gLSBUaGUgZG1hIHJlZ2lvbiB0aGF0IG93bnMgdGhpcyBjaHVuay4KICAqIEBscGFyX2FkZHI6IFN0YXJ0aW5nIGxwYXIgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCkBAIC0zODEsMTAgKzM5NSwxMSBAQAogCWludCBsaW5lKQogewogCURCRygiJXM6JWQ6IHIuZGV2ICAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwKLQkJYy0+cmVnaW9uLT5kaWQuYnVzX2lkLCBjLT5yZWdpb24tPmRpZC5kZXZfaWQpOworCQljLT5yZWdpb24tPmRldi0+YnVzX2lkLCBjLT5yZWdpb24tPmRldi0+ZGV2X2lkKTsKIAlEQkcoIiVzOiVkOiByLmJ1c19hZGRyICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogci5wYWdlX3NpemUgICV1XG4iLCBmdW5jLCBsaW5lLCBjLT5yZWdpb24tPnBhZ2Vfc2l6ZSk7CiAJREJHKCIlczolZDogci5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPnJlZ2lvbi0+bGVuKTsKKwlEQkcoIiVzOiVkOiByLm9mZnNldCAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgYy0+cmVnaW9uLT5vZmZzZXQpOwogCURCRygiJXM6JWQ6IGMubHBhcl9hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5scGFyX2FkZHIpOwogCURCRygiJXM6JWQ6IGMuYnVzX2FkZHIgICAlbHhoXG4iLCBmdW5jLCBsaW5lLCBjLT5idXNfYWRkcik7CiAJREJHKCIlczolZDogYy5sZW4gICAgICAgICVseGhcbiIsIGZ1bmMsIGxpbmUsIGMtPmxlbik7CkBAIC0zOTUsMzkgKzQxMCw2OCBAQAogewogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2J1cyA9IF9BTElHTl9ET1dOKGJ1c19hZGRyLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7Ci0JdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xlbiA9IF9BTElHTl9VUChsZW4sIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbitidXNfYWRkci1hbGlnbmVkX2J1cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CiAJCS8qIGludGVyc2VjdGlvbiAqLwotCQlpZiAoYWxpZ25lZF9idXMgPj0gYy0+YnVzX2FkZHIKLQkJCSYmIGFsaWduZWRfYnVzIDwgYy0+YnVzX2FkZHIgKyBjLT5sZW4KLQkJCSYmIGFsaWduZWRfYnVzICsgYWxpZ25lZF9sZW4gPD0gYy0+YnVzX2FkZHIgKyBjLT5sZW4pIHsKKwkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICYmCisJCSAgICBhbGlnbmVkX2J1cyArIGFsaWduZWRfbGVuIDw9IGMtPmJ1c19hZGRyICsgYy0+bGVuKQogCQkJcmV0dXJuIGM7Ci0JCX0KKwogCQkvKiBiZWxvdyAqLwotCQlpZiAoYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkcikgeworCQlpZiAoYWxpZ25lZF9idXMgKyBhbGlnbmVkX2xlbiA8PSBjLT5idXNfYWRkcikKIAkJCWNvbnRpbnVlOwotCQl9CisKIAkJLyogYWJvdmUgKi8KLQkJaWYgKGFsaWduZWRfYnVzID49IGMtPmJ1c19hZGRyICsgYy0+bGVuKSB7CisJCWlmIChhbGlnbmVkX2J1cyA+PSBjLT5idXNfYWRkciArIGMtPmxlbikKIAkJCWNvbnRpbnVlOwotCQl9CiAKIAkJLyogd2UgZG9uJ3QgaGFuZGxlIHRoZSBtdWx0aS1jaHVuayBjYXNlIGZvciBub3cgKi8KLQogCQlkbWFfZHVtcF9jaHVuayhjKTsKIAkJQlVHKCk7CiAJfQogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGRtYV9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCitzdGF0aWMgc3RydWN0IGRtYV9jaHVuayAqZG1hX2ZpbmRfY2h1bmtfbHBhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX2xwYXIgPSBfQUxJR05fRE9XTihscGFyX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGxwYXJfYWRkciAtIGFsaWduZWRfbHBhciwKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmci0+Y2h1bmtfbGlzdC5oZWFkLCBsaW5rKSB7CisJCS8qIGludGVyc2VjdGlvbiAqLworCQlpZiAoYy0+bHBhcl9hZGRyIDw9IGFsaWduZWRfbHBhciAmJgorCQkgICAgYWxpZ25lZF9scGFyIDwgYy0+bHBhcl9hZGRyICsgYy0+bGVuKSB7CisJCQlpZiAoYWxpZ25lZF9scGFyICsgYWxpZ25lZF9sZW4gPD0gYy0+bHBhcl9hZGRyICsgYy0+bGVuKQorCQkJCXJldHVybiBjOworCQkJZWxzZSB7CisJCQkJZG1hX2R1bXBfY2h1bmsoYyk7CisJCQkJQlVHKCk7CisJCQl9CisJCX0KKwkJLyogYmVsb3cgKi8KKwkJaWYgKGFsaWduZWRfbHBhciArIGFsaWduZWRfbGVuIDw9IGMtPmxwYXJfYWRkcikgeworCQkJY29udGludWU7CisJCX0KKwkJLyogYWJvdmUgKi8KKwkJaWYgKGMtPmxwYXJfYWRkciArIGMtPmxlbiA8PSBhbGlnbmVkX2xwYXIpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRtYV9zYl9mcmVlX2NodW5rKHN0cnVjdCBkbWFfY2h1bmsgKmMpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlpZiAoYy0+YnVzX2FkZHIpIHsKLQkJcmVzdWx0ID0gbHYxX3VubWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKLQkJCWMtPnJlZ2lvbi0+ZGlkLmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CisJCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfZG1hX3JlZ2lvbihjLT5yZWdpb24tPmRldi0+YnVzX2lkLAorCQkJYy0+cmVnaW9uLT5kZXYtPmRldl9pZCwgYy0+YnVzX2FkZHIsIGMtPmxlbik7CiAJCUJVR19PTihyZXN1bHQpOwogCX0KIApAQCAtNDM1LDggKzQ3OSwzOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfZnJlZV9jaHVuayhzdHJ1Y3QgZG1hX2NodW5rICpjKQoreworCWludCByZXN1bHQgPSAwOworCWludCBpb3BhZ2U7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IHBzM19kbWFfcmVnaW9uICpyID0gYy0+cmVnaW9uOworCisJREJHKCIlczpzdGFydFxuIiwgX19mdW5jX18pOworCWZvciAoaW9wYWdlID0gMDsgaW9wYWdlIDwgKGMtPmxlbiA+PiByLT5wYWdlX3NpemUpOyBpb3BhZ2UrKykgeworCQlvZmZzZXQgPSAoMSA8PCByLT5wYWdlX3NpemUpICogaW9wYWdlOworCQkvKiBwdXQgSU5WQUxJRCBlbnRyeSAqLworCQlyZXN1bHQgPSBsdjFfcHV0X2lvcHRlKDAsCisJCQkJICAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICBjLT5scGFyX2FkZHIgKyBvZmZzZXQsCisJCQkJICAgICAgIHItPmlvaWQsCisJCQkJICAgICAgIDApOworCQlEQkcoIiVzOiBidXM9JSNseCwgbHBhcj0lI2x4LCBpb2lkPSVkXG4iLCBfX2Z1bmNfXywKKwkJICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkgICAgci0+aW9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJREJHKCIlczolZDogbHYxX3B1dF9pb3B0ZSBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywKKwkJCSAgICBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJfQorCX0KKwlrZnJlZShjKTsKKwlEQkcoIiVzOmVuZFxuIiwgX19mdW5jX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgotICogZG1hX21hcF9wYWdlcyAtIE1hcHMgZG1hIHBhZ2VzIGludG8gdGhlIGlvIGNvbnRyb2xsZXIgYnVzIGFkZHJlc3Mgc3BhY2UuCisgKiBkbWFfc2JfbWFwX3BhZ2VzIC0gTWFwcyBkbWEgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBidXMgYWRkcmVzcyBzcGFjZS4KICAqIEByOiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19kbWFfcmVnaW9uLgogICogQHBoeXNfYWRkcjogU3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtNDQ2LDggKzUyMSw4IEBACiAgKiBtYWtlIHRoZSBIViBjYWxsIHRvIGFkZCB0aGUgcGFnZXMgaW50byB0aGUgaW8gY29udHJvbGxlciBhZGRyZXNzIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCBzdHJ1Y3QgZG1hX2NodW5rICoqY19vdXQpCitzdGF0aWMgaW50IGRtYV9zYl9tYXBfcGFnZXMoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKKwkgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCwgdTY0IGlvcHRlX2ZsYWcpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwpAQCAtNDYxLDEzICs1MzYsMTMgQEAKIAogCWMtPnJlZ2lvbiA9IHI7CiAJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOwotCWMtPmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIGMtPmxwYXJfYWRkcik7CisJYy0+YnVzX2FkZHIgPSBkbWFfc2JfbHBhcl90b19idXMociwgYy0+bHBhcl9hZGRyKTsKIAljLT5sZW4gPSBsZW47CiAKLQlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGlkLmJ1c19pZCwKLQkJYy0+cmVnaW9uLT5kaWQuZGV2X2lkLCBjLT5scGFyX2FkZHIsIGMtPmJ1c19hZGRyLCBjLT5sZW4sCi0JCTB4ZjgwMDAwMDAwMDAwMDAwMFVMKTsKLQorCUJVR19PTihpb3B0ZV9mbGFnICE9IDB4ZjgwMDAwMDAwMDAwMDAwMFVMKTsKKwlyZXN1bHQgPSBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uKGMtPnJlZ2lvbi0+ZGV2LT5idXNfaWQsCisJCQkJCSAgIGMtPnJlZ2lvbi0+ZGV2LT5kZXZfaWQsIGMtPmxwYXJfYWRkciwKKwkJCQkJICAgYy0+YnVzX2FkZHIsIGMtPmxlbiwgaW9wdGVfZmxhZyk7CiAJaWYgKHJlc3VsdCkgewogCQlEQkcoIiVzOiVkOiBsdjFfbWFwX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CkBAIC00ODcsMjYgKzU2MiwxMjAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IGRtYV9pb2MwX21hcF9wYWdlcyhzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBkbWFfY2h1bmsgKipjX291dCwKKwkJCSAgICAgIHU2NCBpb3B0ZV9mbGFnKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRtYV9jaHVuayAqYywgKmxhc3Q7CisJaW50IGlvcGFnZSwgcGFnZXM7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlEQkcoS0VSTl9FUlIgIiVzOiBwaHk9JSNseCwgbHBhciUjbHgsIGxlbj0lI2x4XG4iLCBfX2Z1bmNfXywKKwkgICAgcGh5c19hZGRyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkciksIGxlbik7CisJYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfY2h1bmspLCBHRlBfQVRPTUlDKTsKKworCWlmICghYykgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQorCisJYy0+cmVnaW9uID0gcjsKKwljLT5sZW4gPSBsZW47CisJYy0+bHBhcl9hZGRyID0gcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpOworCS8qIGFsbG9jYXRlIElPIGFkZHJlc3MgKi8KKwlpZiAobGlzdF9lbXB0eSgmci0+Y2h1bmtfbGlzdC5oZWFkKSkgeworCQkvKiBmaXJzdCBvbmUgKi8KKwkJYy0+YnVzX2FkZHIgPSByLT5idXNfYWRkcjsKKwl9IGVsc2UgeworCQkvKiBkZXJpdmUgZnJvbSBsYXN0IGJ1cyBhZGRyKi8KKwkJbGFzdCAgPSBsaXN0X2VudHJ5KHItPmNodW5rX2xpc3QuaGVhZC5uZXh0LAorCQkJCSAgIHN0cnVjdCBkbWFfY2h1bmssIGxpbmspOworCQljLT5idXNfYWRkciA9IGxhc3QtPmJ1c19hZGRyICsgbGFzdC0+bGVuOworCQlEQkcoIiVzOiBsYXN0IGJ1cz0lI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJCSAgICBsYXN0LT5idXNfYWRkciwgbGFzdC0+bGVuKTsKKwl9CisKKwkvKiBGSVhNRTogY2hlY2sgd2hldGhlciBsZW5ndGggZXhjZWVkcyByZWdpb24gc2l6ZSAqLworCisJLyogYnVpbGQgaW9wdGVzIGZvciB0aGUgYXJlYSAqLworCXBhZ2VzID0gbGVuID4+IHItPnBhZ2Vfc2l6ZTsKKwlEQkcoIiVzOiBwZ3NpemU9JSN4IGxlbj0lI2x4IHBhZ2VzPSUjeCBpb3B0ZWZsYWc9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHItPnBhZ2Vfc2l6ZSwgci0+bGVuLCBwYWdlcywgaW9wdGVfZmxhZyk7CisJZm9yIChpb3BhZ2UgPSAwOyBpb3BhZ2UgPCBwYWdlczsgaW9wYWdlKyspIHsKKwkJb2Zmc2V0ID0gKDEgPDwgci0+cGFnZV9zaXplKSAqIGlvcGFnZTsKKwkJcmVzdWx0ID0gbHYxX3B1dF9pb3B0ZSgwLAorCQkJCSAgICAgICBjLT5idXNfYWRkciArIG9mZnNldCwKKwkJCQkgICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJCSAgICAgICByLT5pb2lkLAorCQkJCSAgICAgICBpb3B0ZV9mbGFnKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IGx2MV9tYXBfZGV2aWNlX2RtYV9yZWdpb24gIgorCQkJCSJmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCWdvdG8gZmFpbF9tYXA7CisJCX0KKwkJREJHKCIlczogcGc9JWQgYnVzPSUjbHgsIGxwYXI9JSNseCwgaW9pZD0lI3hcbiIsIF9fZnVuY19fLAorCQkgICAgaW9wYWdlLCBjLT5idXNfYWRkciArIG9mZnNldCwgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkgICAgci0+aW9pZCk7CisJfQorCisJLyogYmUgc3VyZSB0aGF0IGxhc3QgYWxsb2NhdGVkIG9uZSBpcyBpbnNlcnRlZCBhdCBoZWFkICovCisJbGlzdF9hZGQoJmMtPmxpbmssICZyLT5jaHVua19saXN0LmhlYWQpOworCisJKmNfb3V0ID0gYzsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKKworZmFpbF9tYXA6CisJZm9yIChpb3BhZ2UtLTsgMCA8PSBpb3BhZ2U7IGlvcGFnZS0tKSB7CisJCWx2MV9wdXRfaW9wdGUoMCwKKwkJCSAgICAgIGMtPmJ1c19hZGRyICsgb2Zmc2V0LAorCQkJICAgICAgYy0+bHBhcl9hZGRyICsgb2Zmc2V0LAorCQkJICAgICAgci0+aW9pZCwKKwkJCSAgICAgIDApOworCX0KKwlrZnJlZShjKTsKK2ZhaWxfYWxsb2M6CisJKmNfb3V0ID0gTlVMTDsKKwlyZXR1cm4gcmVzdWx0OworfQorCiAvKioKLSAqIGRtYV9yZWdpb25fY3JlYXRlIC0gQ3JlYXRlIGEgZGV2aWNlIGRtYSByZWdpb24uCisgKiBkbWFfc2JfcmVnaW9uX2NyZWF0ZSAtIENyZWF0ZSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKgogICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIGRtYSByZWdpb24gY3JlYXRlIHJvdXRpbmUsIGFuZCBpcyB0aGUgb25lIHRoYXQKICAqIHdpbGwgbWFrZSB0aGUgSFYgY2FsbCB0byBjcmVhdGUgdGhlIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiogcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CiAKLQlyLT5sZW4gPSBfQUxJR05fVVAobWFwLnRvdGFsLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJcHJfaW5mbygiIC0+ICVzOiVkOlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCUJVR19PTighcik7CisKKwlpZiAoIXItPmRldi0+YnVzX2lkKSB7CisJCXByX2luZm8oIiVzOiVkOiAldToldSBubyBkbWFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCXItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCk7CisJCXJldHVybiAwOworCX0KKworCURCRygiJXM6JXU6IGxlbiA9IDB4JWx4LCBwYWdlX3NpemUgPSAldSwgb2Zmc2V0ID0gMHglbHhcbiIsIF9fZnVuY19fLAorCSAgICBfX0xJTkVfXywgci0+bGVuLCByLT5wYWdlX3NpemUsIHItPm9mZnNldCk7CisKKwlCVUdfT04oIXItPmxlbik7CisJQlVHX09OKCFyLT5wYWdlX3NpemUpOworCUJVR19PTighci0+cmVnaW9uX29wcyk7CisKIAlJTklUX0xJU1RfSEVBRCgmci0+Y2h1bmtfbGlzdC5oZWFkKTsKIAlzcGluX2xvY2tfaW5pdCgmci0+Y2h1bmtfbGlzdC5sb2NrKTsKIAotCXJlc3VsdCA9IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAotCQlyLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsICZyLT5idXNfYWRkcik7Ci0KLQlkbWFfZHVtcF9yZWdpb24ocik7CisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2RldmljZV9kbWFfcmVnaW9uKHItPmRldi0+YnVzX2lkLCByLT5kZXYtPmRldl9pZCwKKwkJcm91bmR1cF9wb3dfb2ZfdHdvKHItPmxlbiksIHItPnBhZ2Vfc2l6ZSwgci0+cmVnaW9uX3R5cGUsCisJCSZyLT5idXNfYWRkcik7CiAKIAlpZiAocmVzdWx0KSB7CiAJCURCRygiJXM6JWQ6IGx2MV9hbGxvY2F0ZV9kZXZpY2VfZG1hX3JlZ2lvbiBmYWlsZWQ6ICVzXG4iLApAQCAtNTE3LDYgKzY4NiwyNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKworCUlOSVRfTElTVF9IRUFEKCZyLT5jaHVua19saXN0LmhlYWQpOworCXNwaW5fbG9ja19pbml0KCZyLT5jaHVua19saXN0LmxvY2spOworCisJcmVzdWx0ID0gbHYxX2FsbG9jYXRlX2lvX3NlZ21lbnQoMCwKKwkJCQkJIHItPmxlbiwKKwkJCQkJIHItPnBhZ2Vfc2l6ZSwKKwkJCQkJICZyLT5idXNfYWRkcik7CisJaWYgKHJlc3VsdCkgeworCQlEQkcoIiVzOiVkOiBsdjFfYWxsb2NhdGVfaW9fc2VnbWVudCBmYWlsZWQ6ICVzXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOworCQlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJfQorCURCRygiJXM6IGxlbj0lI2x4LCBwZz0lZCwgYnVzPSUjbHhcbiIsIF9fZnVuY19fLAorCSAgICByLT5sZW4sIHItPnBhZ2Vfc2l6ZSwgci0+YnVzX2FkZHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKIC8qKgogICogZG1hX3JlZ2lvbl9mcmVlIC0gRnJlZSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCkBAIC01MjUsMzEgKzcxNSw2MiBAQAogICogd2lsbCBtYWtlIHRoZSBIViBjYWxsIHRvIGZyZWUgdGhlIHJlZ2lvbi4KICAqLwogCi1zdGF0aWMgaW50IGRtYV9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24qIHIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgZG1hX2NodW5rICpjOwogCXN0cnVjdCBkbWFfY2h1bmsgKnRtcDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKLQkJbGlzdF9kZWwoJmMtPmxpbmspOwotCQlkbWFfZnJlZV9jaHVuayhjKTsKKwlCVUdfT04oIXIpOworCisJaWYgKCFyLT5kZXYtPmJ1c19pZCkgeworCQlwcl9pbmZvKCIlczolZDogJXU6JXUgbm8gZG1hXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQlyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kaWQuYnVzX2lkLCByLT5kaWQuZGV2X2lkLAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjLCB0bXAsICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfc2JfZnJlZV9jaHVuayhjKTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZnJlZV9kZXZpY2VfZG1hX3JlZ2lvbihyLT5kZXYtPmJ1c19pZCwgci0+ZGV2LT5kZXZfaWQsCiAJCXItPmJ1c19hZGRyKTsKIAogCWlmIChyZXN1bHQpCiAJCURCRygiJXM6JWQ6IGx2MV9mcmVlX2RldmljZV9kbWFfcmVnaW9uIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKLQlyLT5sZW4gPSByLT5idXNfYWRkciA9IDA7CisJci0+YnVzX2FkZHIgPSAwOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkbWFfaW9jMF9yZWdpb25fZnJlZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjLCAqbjsKKworCURCRygiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIG4sICZyLT5jaHVua19saXN0LmhlYWQsIGxpbmspIHsKKwkJbGlzdF9kZWwoJmMtPmxpbmspOworCQlkbWFfaW9jMF9mcmVlX2NodW5rKGMpOworCX0KKworCXJlc3VsdCA9IGx2MV9yZWxlYXNlX2lvX3NlZ21lbnQoMCwgci0+YnVzX2FkZHIpOworCisJaWYgKHJlc3VsdCkKKwkJREJHKCIlczolZDogbHYxX2ZyZWVfZGV2aWNlX2RtYV9yZWdpb24gZmFpbGVkOiAlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKworCXItPmJ1c19hZGRyID0gMDsKKwlEQkcoIiVzOiBlbmRcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgotICogZG1hX21hcF9hcmVhIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9tYXBfYXJlYSAtIE1hcCBhbiBhcmVhIG9mIG1lbW9yeSBpbnRvIGEgZGV2aWNlIGRtYSByZWdpb24uCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqIEB2aXJ0X2FkZHI6IFN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYXJlYSB0byBtYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gbWFwLgpAQCAtNTU5LDE2ICs3ODAsMTkgQEAKICAqIFRoaXMgaXMgdGhlIGNvbW1vbiBkbWEgbWFwcGluZyByb3V0aW5lLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9hcmVhKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyKQorc3RhdGljIGludCBkbWFfc2JfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkgICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIsCisJICAgdTY0IGlvcHRlX2ZsYWcpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkbWFfY2h1bmsgKmM7CiAJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBpc19rZXJuZWxfYWRkcih2aXJ0X2FkZHIpID8gX19wYSh2aXJ0X2FkZHIpCiAJCTogdmlydF9hZGRyOwotCi0JKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJdW5zaWduZWQgbG9uZyBhbGlnbmVkX3BoeXMgPSBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKTsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIHBoeXNfYWRkciAtIGFsaWduZWRfcGh5cywKKwkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCSpidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcikpOwogCiAJaWYgKCFVU0VfRFlOQU1JQ19ETUEpIHsKIAkJdW5zaWduZWQgbG9uZyBscGFyX2FkZHIgPSBwczNfbW1fcGh5c190b19scGFyKHBoeXNfYWRkcik7CkBAIC01ODgsMTcgKzgxMiwxOCBAQAogCWMgPSBkbWFfZmluZF9jaHVuayhyLCAqYnVzX2FkZHIsIGxlbik7CiAKIAlpZiAoYykgeworCQlEQkcoIiVzOiVkOiByZXVzaW5nIG1hcHBlZCBjaHVuayIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWRtYV9kdW1wX2NodW5rKGMpOwogCQljLT51c2FnZV9jb3VudCsrOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmVzdWx0ID0gZG1hX21hcF9wYWdlcyhyLCBfQUxJR05fRE9XTihwaHlzX2FkZHIsIDEgPDwgci0+cGFnZV9zaXplKSwKLQkJX0FMSUdOX1VQKGxlbiwgMSA8PCByLT5wYWdlX3NpemUpLCAmYyk7CisJcmVzdWx0ID0gZG1hX3NiX21hcF9wYWdlcyhyLCBhbGlnbmVkX3BoeXMsIGFsaWduZWRfbGVuLCAmYywgaW9wdGVfZmxhZyk7CiAKIAlpZiAocmVzdWx0KSB7CiAJCSpidXNfYWRkciA9IDA7Ci0JCURCRygiJXM6JWQ6IGRtYV9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCisJCURCRygiJXM6JWQ6IGRtYV9zYl9tYXBfcGFnZXMgZmFpbGVkICglZClcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNjEwLDggKzgzNSw1NyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfbWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkgICAgIHU2NCBpb3B0ZV9mbGFnKQoreworCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2NodW5rICpjOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gaXNfa2VybmVsX2FkZHIodmlydF9hZGRyKSA/IF9fcGEodmlydF9hZGRyKQorCQk6IHZpcnRfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFsaWduZWRfcGh5cyA9IF9BTElHTl9ET1dOKHBoeXNfYWRkciwgMSA8PCByLT5wYWdlX3NpemUpOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzLAorCQkJCQkgICAgICAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisKKwlEQkcoS0VSTl9FUlIgIiVzOiB2YWRkcj0lI2x4LCBsZW49JSNseFxuIiwgX19mdW5jX18sCisJICAgIHZpcnRfYWRkciwgbGVuKTsKKwlEQkcoS0VSTl9FUlIgIiVzOiBwaD0lI2x4IGFfcGg9JSNseCBhX2w9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHBoeXNfYWRkciwgYWxpZ25lZF9waHlzLCBhbGlnbmVkX2xlbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJYyA9IGRtYV9maW5kX2NodW5rX2xwYXIociwgcHMzX21tX3BoeXNfdG9fbHBhcihwaHlzX2FkZHIpLCBsZW4pOworCisJaWYgKGMpIHsKKwkJLyogRklYTUUgKi8KKwkJQlVHKCk7CisJCSpidXNfYWRkciA9IGMtPmJ1c19hZGRyICsgcGh5c19hZGRyIC0gYWxpZ25lZF9waHlzOworCQljLT51c2FnZV9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVzdWx0ID0gZG1hX2lvYzBfbWFwX3BhZ2VzKHIsIGFsaWduZWRfcGh5cywgYWxpZ25lZF9sZW4sICZjLAorCQkJCSAgICBpb3B0ZV9mbGFnKTsKKworCWlmIChyZXN1bHQpIHsKKwkJKmJ1c19hZGRyID0gMDsKKwkJREJHKCIlczolZDogZG1hX2lvYzBfbWFwX3BhZ2VzIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyLT5jaHVua19saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJKmJ1c19hZGRyID0gYy0+YnVzX2FkZHIgKyBwaHlzX2FkZHIgLSBhbGlnbmVkX3BoeXM7CisJREJHKCIlczogdmE9JSNseCBwYT0lI2x4IGFfcGE9JSNseCBidXM9JSNseFxuIiwgX19mdW5jX18sCisJICAgIHZpcnRfYWRkciwgcGh5c19hZGRyLCBhbGlnbmVkX3BoeXMsICpidXNfYWRkcik7CisJYy0+dXNhZ2VfY291bnQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCi0gKiBkbWFfdW5tYXBfYXJlYSAtIFVubWFwIGFuIGFyZWEgb2YgbWVtb3J5IGZyb20gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl91bm1hcF9hcmVhIC0gVW5tYXAgYW4gYXJlYSBvZiBtZW1vcnkgZnJvbSBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAYnVzX2FkZHI6IFRoZSBzdGFydGluZyBpb2MgYnVzIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCiAgKiBAbGVuOiBMZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFyZWEgdG8gdW5tYXAuCkBAIC02MTksNyArODkzLDcgQEAKICAqIFRoaXMgaXMgdGhlIGNvbW1vbiBkbWEgdW5tYXAgcm91dGluZS4KICAqLwogCi1pbnQgZG1hX3VubWFwX2FyZWEoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAorc3RhdGljIGludCBkbWFfc2JfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTYzMSw3ICs5MDUsOCBAQAogCWlmICghYykgewogCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCiAJCQkxIDw8IHItPnBhZ2Vfc2l6ZSk7Ci0JCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuLCAxIDw8IHItPnBhZ2Vfc2l6ZSk7CisJCXVuc2lnbmVkIGxvbmcgYWxpZ25lZF9sZW4gPSBfQUxJR05fVVAobGVuICsgYnVzX2FkZHIKKwkJCS0gYWxpZ25lZF9idXMsIDEgPDwgci0+cGFnZV9zaXplKTsKIAkJREJHKCIlczolZDogbm90IGZvdW5kOiBidXNfYWRkciAlbHhoXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfYWRkcik7CiAJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogbGVuICVseGhcbiIsCkBAIC02NDcsOTQgKzkyMiwxNjYgQEAKIAogCWlmICghYy0+dXNhZ2VfY291bnQpIHsKIAkJbGlzdF9kZWwoJmMtPmxpbmspOwotCQlkbWFfZnJlZV9jaHVuayhjKTsKKwkJZG1hX3NiX2ZyZWVfY2h1bmsoYyk7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZG1hX2lvYzBfdW5tYXBfYXJlYShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJCQl1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfY2h1bmsgKmM7CisKKwlEQkcoIiVzOiBzdGFydCBhPSUjbHggbD0lI2x4XG4iLCBfX2Z1bmNfXywgYnVzX2FkZHIsIGxlbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnItPmNodW5rX2xpc3QubG9jaywgZmxhZ3MpOworCWMgPSBkbWFfZmluZF9jaHVuayhyLCBidXNfYWRkciwgbGVuKTsKKworCWlmICghYykgeworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfYnVzID0gX0FMSUdOX0RPV04oYnVzX2FkZHIsCisJCQkJCQkJMSA8PCByLT5wYWdlX3NpemUpOworCQl1bnNpZ25lZCBsb25nIGFsaWduZWRfbGVuID0gX0FMSUdOX1VQKGxlbiArIGJ1c19hZGRyCisJCQkJCQkgICAgICAtIGFsaWduZWRfYnVzLAorCQkJCQkJICAgICAgMSA8PCByLT5wYWdlX3NpemUpOworCQlEQkcoIiVzOiVkOiBub3QgZm91bmQ6IGJ1c19hZGRyICVseGhcbiIsCisJCSAgICBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19hZGRyKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBsZW4gJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgbGVuKTsKKwkJREJHKCIlczolZDogbm90IGZvdW5kOiBhbGlnbmVkX2J1cyAlbHhoXG4iLAorCQkgICAgX19mdW5jX18sIF9fTElORV9fLCBhbGlnbmVkX2J1cyk7CisJCURCRygiJXM6JWQ6IG5vdCBmb3VuZDogYWxpZ25lZF9sZW4gJWx4aFxuIiwKKwkJICAgIF9fZnVuY19fLCBfX0xJTkVfXywgYWxpZ25lZF9sZW4pOworCQlCVUcoKTsKKwl9CisKKwljLT51c2FnZV9jb3VudC0tOworCisJaWYgKCFjLT51c2FnZV9jb3VudCkgeworCQlsaXN0X2RlbCgmYy0+bGluayk7CisJCWRtYV9pb2MwX2ZyZWVfY2h1bmsoYyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmci0+Y2h1bmtfbGlzdC5sb2NrLCBmbGFncyk7CisJREJHKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKIC8qKgotICogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyIC0gU2V0dXAgYSBsaW5lYXIgZG1hIG1hcGluZyBmb3IgYSBkZXZpY2UuCisgKiBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIgLSBTZXR1cCBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIHJvdXRpbmUgY3JlYXRlcyBhbiBIViBkbWEgcmVnaW9uIGZvciB0aGUgZGV2aWNlIGFuZCBtYXBzIGFsbCBhdmFpbGFibGUKICAqIHJhbSBpbnRvIHRoZSBpbyBjb250cm9sbGVyIGJ1cyBhZGRyZXNzIHNwYWNlLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKK3N0YXRpYyBpbnQgZG1hX3NiX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqcikKIHsKIAlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCBsZW4sIHRtcDsKIAotCS8qIGZvcmNlIDE2TSBkbWEgcGFnZXMgZm9yIGxpbmVhciBtYXBwaW5nICovCi0KLQlpZiAoci0+cGFnZV9zaXplICE9IFBTM19ETUFfMTZNKSB7Ci0JCXByX2luZm8oIiVzOiVkOiBmb3JjaW5nIDE2TSBwYWdlcyBmb3IgbGluZWFyIG1hcFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXItPnBhZ2Vfc2l6ZSA9IFBTM19ETUFfMTZNOworCWlmIChyLT5sZW4gPiAxNioxMDI0KjEwMjQpIHsJLyogRklYTUU6IG5lZWQgcHJvcGVyIGZpeCAqLworCQkvKiBmb3JjZSAxNk0gZG1hIHBhZ2VzIGZvciBsaW5lYXIgbWFwcGluZyAqLworCQlpZiAoci0+cGFnZV9zaXplICE9IFBTM19ETUFfMTZNKSB7CisJCQlwcl9pbmZvKCIlczolZDogZm9yY2luZyAxNk0gcGFnZXMgZm9yIGxpbmVhciBtYXBcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJCXItPnBhZ2Vfc2l6ZSA9IFBTM19ETUFfMTZNOworCQkJci0+bGVuID0gX0FMSUdOX1VQKHItPmxlbiwgMSA8PCByLT5wYWdlX3NpemUpOworCQl9CiAJfQogCi0JcmVzdWx0ID0gZG1hX3JlZ2lvbl9jcmVhdGUocik7CisJcmVzdWx0ID0gZG1hX3NiX3JlZ2lvbl9jcmVhdGUocik7CiAJQlVHX09OKHJlc3VsdCk7CiAKLQlyZXN1bHQgPSBkbWFfbWFwX2FyZWEociwgbWFwLnJtLmJhc2UsIG1hcC5ybS5zaXplLCAmdG1wKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0IDwgbWFwLnJtLnNpemUpIHsKKwkJLyogTWFwIChwYXJ0IG9mKSAxc3QgUkFNIGNodW5rICovCisJCXZpcnRfYWRkciA9IG1hcC5ybS5iYXNlICsgci0+b2Zmc2V0OworCQlsZW4gPSBtYXAucm0uc2l6ZSAtIHItPm9mZnNldDsKKwkJaWYgKGxlbiA+IHItPmxlbikKKwkJCWxlbiA9IHItPmxlbjsKKwkJcmVzdWx0ID0gZG1hX3NiX21hcF9hcmVhKHIsIHZpcnRfYWRkciwgbGVuLCAmdG1wLAorCQkJSU9QVEVfUFBfVyB8IElPUFRFX1BQX1IgfCBJT1BURV9TT19SVyB8IElPUFRFX00pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlpZiAoVVNFX0xQQVJfQUREUikKLQkJcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5yMS5iYXNlLCBtYXAucjEuc2l6ZSwKLQkJCSZ0bXApOwotCWVsc2UKLQkJcmVzdWx0ID0gZG1hX21hcF9hcmVhKHIsIG1hcC5ybS5zaXplLCBtYXAucjEuc2l6ZSwKLQkJCSZ0bXApOwotCi0JQlVHX09OKHJlc3VsdCk7CisJaWYgKHItPm9mZnNldCArIHItPmxlbiA+IG1hcC5ybS5zaXplKSB7CisJCS8qIE1hcCAocGFydCBvZikgMm5kIFJBTSBjaHVuayAqLworCQl2aXJ0X2FkZHIgPSBVU0VfTFBBUl9BRERSID8gbWFwLnIxLmJhc2UgOiBtYXAucm0uc2l6ZTsKKwkJbGVuID0gci0+bGVuOworCQlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQkJdmlydF9hZGRyICs9IHItPm9mZnNldCAtIG1hcC5ybS5zaXplOworCQllbHNlCisJCQlsZW4gLT0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCXJlc3VsdCA9IGRtYV9zYl9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgJnRtcCwKKwkJCUlPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCisgKiBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyIC0gRnJlZSBhIGxpbmVhciBkbWEgbWFwcGluZyBmb3IgYSBkZXZpY2UuCiAgKiBAcjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfZG1hX3JlZ2lvbi4KICAqCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCB1bm1hcCBhbGwgbWFwcGVkIGFyZWFzIGFuZCBmcmVlIHRoZSBIViBkbWEgcmVnaW9uLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX3JlZ2lvbl9mcmVlX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpCitzdGF0aWMgaW50IGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewogCWludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgbGVuLCBscGFyX2FkZHI7CiAKLQlyZXN1bHQgPSBkbWFfdW5tYXBfYXJlYShyLCBkbWFfbHBhcl90b19idXMociwgMCksIG1hcC5ybS5zaXplKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlpZiAoci0+b2Zmc2V0IDwgbWFwLnJtLnNpemUpIHsKKwkJLyogVW5tYXAgKHBhcnQgb2YpIDFzdCBSQU0gY2h1bmsgKi8KKwkJbHBhcl9hZGRyID0gbWFwLnJtLmJhc2UgKyByLT5vZmZzZXQ7CisJCWxlbiA9IG1hcC5ybS5zaXplIC0gci0+b2Zmc2V0OworCQlpZiAobGVuID4gci0+bGVuKQorCQkJbGVuID0gci0+bGVuOworCQlidXNfYWRkciA9IGRtYV9zYl9scGFyX3RvX2J1cyhyLCBscGFyX2FkZHIpOworCQlyZXN1bHQgPSBkbWFfc2JfdW5tYXBfYXJlYShyLCBidXNfYWRkciwgbGVuKTsKKwkJQlVHX09OKHJlc3VsdCk7CisJfQogCi0JcmVzdWx0ID0gZG1hX3VubWFwX2FyZWEociwgZG1hX2xwYXJfdG9fYnVzKHIsIG1hcC5yMS5iYXNlKSwKLQkJbWFwLnIxLnNpemUpOwotCUJVR19PTihyZXN1bHQpOworCWlmIChyLT5vZmZzZXQgKyByLT5sZW4gPiBtYXAucm0uc2l6ZSkgeworCQkvKiBVbm1hcCAocGFydCBvZikgMm5kIFJBTSBjaHVuayAqLworCQlscGFyX2FkZHIgPSBtYXAucjEuYmFzZTsKKwkJbGVuID0gci0+bGVuOworCQlpZiAoci0+b2Zmc2V0ID49IG1hcC5ybS5zaXplKQorCQkJbHBhcl9hZGRyICs9IHItPm9mZnNldCAtIG1hcC5ybS5zaXplOworCQllbHNlCisJCQlsZW4gLT0gbWFwLnJtLnNpemUgLSByLT5vZmZzZXQ7CisJCWJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIGxwYXJfYWRkcik7CisJCXJlc3VsdCA9IGRtYV9zYl91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pOworCQlCVUdfT04ocmVzdWx0KTsKKwl9CiAKLQlyZXN1bHQgPSBkbWFfcmVnaW9uX2ZyZWUocik7CisJcmVzdWx0ID0gZG1hX3NiX3JlZ2lvbl9mcmVlKHIpOwogCUJVR19PTihyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCi0gKiBkbWFfbWFwX2FyZWFfbGluZWFyIC0gTWFwIGFuIGFyZWEgb2YgbWVtb3J5IGludG8gYSBkZXZpY2UgZG1hIHJlZ2lvbi4KKyAqIGRtYV9zYl9tYXBfYXJlYV9saW5lYXIgLSBNYXAgYW4gYXJlYSBvZiBtZW1vcnkgaW50byBhIGRldmljZSBkbWEgcmVnaW9uLgogICogQHI6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24uCiAgKiBAdmlydF9hZGRyOiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFyZWEgdG8gbWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIG1hcC4KICAqIEBidXNfYWRkcjogQSBwb2ludGVyIHRvIHJldHVybiB0aGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvCiAgKiBtYXAuCiAgKgotICogVGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucyB0aGUgY29yZXNwb25kaW5nIGJ1cyBhZGRyZXNzLiAgQWN0dWFsIG1hcHBpbmcKKyAqIFRoaXMgcm91dGluZSBqdXN0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgYnVzIGFkZHJlc3MuICBBY3R1YWwgbWFwcGluZwogICogb2NjdXJzIGluIGRtYV9yZWdpb25fY3JlYXRlX2xpbmVhcigpLgogICovCiAKLXN0YXRpYyBpbnQgZG1hX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCi0JdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcikKK3N0YXRpYyBpbnQgZG1hX3NiX21hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCisJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwl1NjQgaW9wdGVfZmxhZykKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IGlzX2tlcm5lbF9hZGRyKHZpcnRfYWRkcikgPyBfX3BhKHZpcnRfYWRkcikKIAkJOiB2aXJ0X2FkZHI7Ci0JKmJ1c19hZGRyID0gZG1hX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CisJKmJ1c19hZGRyID0gZG1hX3NiX2xwYXJfdG9fYnVzKHIsIHBzM19tbV9waHlzX3RvX2xwYXIocGh5c19hZGRyKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0NCw0MiArMTA5MSw5OCBAQAogICogQGJ1c19hZGRyOiBUaGUgc3RhcnRpbmcgaW9jIGJ1cyBhZGRyZXNzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICogQGxlbjogTGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBhcmVhIHRvIHVubWFwLgogICoKLSAqIFRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuICBVbm1hcHBpbmcgb2NjdXJzIGluIGRtYV9yZWdpb25fZnJlZV9saW5lYXIoKS4KKyAqIFRoaXMgcm91dGluZSBkb2VzIG5vdGhpbmcuICBVbm1hcHBpbmcgb2NjdXJzIGluIGRtYV9zYl9yZWdpb25fZnJlZV9saW5lYXIoKS4KICAqLwogCi1zdGF0aWMgaW50IGRtYV91bm1hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCitzdGF0aWMgaW50IGRtYV9zYl91bm1hcF9hcmVhX2xpbmVhcihzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsCiAJdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX3NiX3JlZ2lvbl9vcHMgPSAgeworCS5jcmVhdGUgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZSwKKwkuZnJlZSA9IGRtYV9zYl9yZWdpb25fZnJlZSwKKwkubWFwID0gZG1hX3NiX21hcF9hcmVhLAorCS51bm1hcCA9IGRtYV9zYl91bm1hcF9hcmVhCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19kbWFfcmVnaW9uX29wcyBwczNfZG1hX3NiX3JlZ2lvbl9saW5lYXJfb3BzID0geworCS5jcmVhdGUgPSBkbWFfc2JfcmVnaW9uX2NyZWF0ZV9saW5lYXIsCisJLmZyZWUgPSBkbWFfc2JfcmVnaW9uX2ZyZWVfbGluZWFyLAorCS5tYXAgPSBkbWFfc2JfbWFwX2FyZWFfbGluZWFyLAorCS51bm1hcCA9IGRtYV9zYl91bm1hcF9hcmVhX2xpbmVhcgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgcHMzX2RtYV9pb2MwX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IGRtYV9pb2MwX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBkbWFfaW9jMF9yZWdpb25fZnJlZSwKKwkubWFwID0gZG1hX2lvYzBfbWFwX2FyZWEsCisJLnVubWFwID0gZG1hX2lvYzBfdW5tYXBfYXJlYQorfTsKKworaW50IHBzM19kbWFfcmVnaW9uX2luaXQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAorCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwgZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemUsCisJZW51bSBwczNfZG1hX3JlZ2lvbl90eXBlIHJlZ2lvbl90eXBlLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxwYXJfYWRkcjsKKworCWxwYXJfYWRkciA9IGFkZHIgPyBwczNfbW1fcGh5c190b19scGFyKF9fcGEoYWRkcikpIDogMDsKKworCXItPmRldiA9IGRldjsKKwlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7CisJci0+cmVnaW9uX3R5cGUgPSByZWdpb25fdHlwZTsKKwlyLT5vZmZzZXQgPSBscGFyX2FkZHI7CisJaWYgKHItPm9mZnNldCA+PSBtYXAucm0uc2l6ZSkKKwkJci0+b2Zmc2V0IC09IG1hcC5yMS5vZmZzZXQ7CisJci0+bGVuID0gbGVuID8gbGVuIDogX0FMSUdOX1VQKG1hcC50b3RhbCwgMSA8PCByLT5wYWdlX3NpemUpOworCisJc3dpdGNoIChkZXYtPmRldl90eXBlKSB7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfU0I6CisJCXItPnJlZ2lvbl9vcHMgPSAgKFVTRV9EWU5BTUlDX0RNQSkKKwkJCT8gJnBzM19kbWFfc2JfcmVnaW9uX29wcworCQkJOiAmcHMzX2RtYV9zYl9yZWdpb25fbGluZWFyX29wczsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJci0+cmVnaW9uX29wcyA9ICZwczNfZG1hX2lvYzBfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25faW5pdCk7CiAKIGludCBwczNfZG1hX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9yZWdpb25fY3JlYXRlKHIpCi0JCTogZG1hX3JlZ2lvbl9jcmVhdGVfbGluZWFyKHIpOworCUJVR19PTighcik7CisJQlVHX09OKCFyLT5yZWdpb25fb3BzKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMtPmNyZWF0ZSk7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPmNyZWF0ZShyKTsKIH0KK0VYUE9SVF9TWU1CT0wocHMzX2RtYV9yZWdpb25fY3JlYXRlKTsKIAogaW50IHBzM19kbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9yZWdpb25fZnJlZShyKQotCQk6IGRtYV9yZWdpb25fZnJlZV9saW5lYXIocik7CisJQlVHX09OKCFyKTsKKwlCVUdfT04oIXItPnJlZ2lvbl9vcHMpOworCUJVR19PTighci0+cmVnaW9uX29wcy0+ZnJlZSk7CisJcmV0dXJuIHItPnJlZ2lvbl9vcHMtPmZyZWUocik7CiB9CitFWFBPUlRfU1lNQk9MKHBzM19kbWFfcmVnaW9uX2ZyZWUpOwogCiBpbnQgcHMzX2RtYV9tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwKLQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyAqYnVzX2FkZHIpCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCXU2NCBpb3B0ZV9mbGFnKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKQotCQk/IGRtYV9tYXBfYXJlYShyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIpCi0JCTogZG1hX21hcF9hcmVhX2xpbmVhcihyLCB2aXJ0X2FkZHIsIGxlbiwgYnVzX2FkZHIpOworCXJldHVybiByLT5yZWdpb25fb3BzLT5tYXAociwgdmlydF9hZGRyLCBsZW4sIGJ1c19hZGRyLCBpb3B0ZV9mbGFnKTsKIH0KIAogaW50IHBzM19kbWFfdW5tYXAoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuKQogewotCXJldHVybiAoVVNFX0RZTkFNSUNfRE1BKSA/IGRtYV91bm1hcF9hcmVhKHIsIGJ1c19hZGRyLCBsZW4pCi0JCTogZG1hX3VubWFwX2FyZWFfbGluZWFyKHIsIGJ1c19hZGRyLCBsZW4pOworCXJldHVybiByLT5yZWdpb25fb3BzLT51bm1hcChyLCBidXNfYWRkciwgbGVuKTsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KQEAgLTgxMCwxMiArMTIxMywxMyBAQAogCUJVR19PTihtYXAucm0uYmFzZSk7CiAJQlVHX09OKCFtYXAucm0uc2l6ZSk7CiAKLQlsbWJfYWRkKG1hcC5ybS5iYXNlLCBtYXAucm0uc2l6ZSk7Ci0JbG1iX2FuYWx5emUoKTsKIAogCS8qIGFycmFuZ2UgdG8gZG8gdGhpcyBpbiBwczNfbW1fYWRkX21lbW9yeSAqLwogCXBzM19tbV9yZWdpb25fY3JlYXRlKCZtYXAucjEsIG1hcC50b3RhbCAtIG1hcC5ybS5zaXplKTsKIAorCS8qIGNvcnJlY3QgbWFwLnRvdGFsIGZvciB0aGUgcmVhbCB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHdlIHVzZSAqLworCW1hcC50b3RhbCA9IG1hcC5ybS5zaXplICsgbWFwLnIxLnNpemU7CisKIAlEQkcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvb3MtYXJlYS5jCmluZGV4IDVjM2RhMDguLmI3MGU0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL29zLWFyZWEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9vcy1hcmVhLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogfSBzdGF0aWMgc2F2ZWRfcGFyYW1zOwogCiAjZGVmaW5lIGR1bXBfaGVhZGVyKF9hKSBfZHVtcF9oZWFkZXIoX2EsIF9fZnVuY19fLCBfX0xJTkVfXykKLXN0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgX19pb21lbSAqaCwgY29uc3QgY2hhciogZnVuYywKK3N0YXRpYyB2b2lkIF9kdW1wX2hlYWRlcihjb25zdCBzdHJ1Y3Qgb3NfYXJlYV9oZWFkZXIgKmgsIGNvbnN0IGNoYXIgKmZ1bmMsCiAJaW50IGxpbmUpCiB7CiAJcHJfZGVidWcoIiVzOiVkOiBoLm1hZ2ljX251bTogICAgICAgICAnJXMnXG4iLCBmdW5jLCBsaW5lLApAQCAtMTUxLDcgKzE1MSw3IEBACiB9CiAKICNkZWZpbmUgZHVtcF9wYXJhbXMoX2EpIF9kdW1wX3BhcmFtcyhfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyBfX2lvbWVtICpwLCBjb25zdCBjaGFyKiBmdW5jLAorc3RhdGljIHZvaWQgX2R1bXBfcGFyYW1zKGNvbnN0IHN0cnVjdCBvc19hcmVhX3BhcmFtcyAqcCwgY29uc3QgY2hhciAqZnVuYywKIAlpbnQgbGluZSkKIHsKIAlwcl9kZWJ1ZygiJXM6JWQ6IHAuYm9vdF9mbGFnOiAgICAgICAldVxuIiwgZnVuYywgbGluZSwgcC0+Ym9vdF9mbGFnKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9wbGF0Zm9ybS5oCmluZGV4IGNhMDRmMDMuLjg3ZDUyMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3BsYXRmb3JtLmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcGxhdGZvcm0uaApAQCAtNDEsNiArNDEsNyBAQAogLyogaXJxICovCiAKIHZvaWQgcHMzX2luaXRfSVJRKHZvaWQpOwordm9pZCBwczNfc2h1dGRvd25fSVJRKGludCBjcHUpOwogdm9pZCBfX2luaXQgcHMzX3JlZ2lzdGVyX2lwaV9kZWJ1Z19icmsodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZpcnEpOwogCiAvKiBzbXAgKi8KQEAgLTgyLDYgKzgzLDcgQEAKIAlQUzNfREVWX1RZUEVfU1RPUl9ST00gPSBUWVBFX1JPTSwJLyogNSAqLwogCVBTM19ERVZfVFlQRV9TQl9HUElPID0gNiwKIAlQUzNfREVWX1RZUEVfU1RPUl9GTEFTSCA9IFRZUEVfUkJDLAkvKiAxNCAqLworCVBTM19ERVZfVFlQRV9OT0FDQ0VTUyA9IDI1NSwKIH07CiAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19zdHIodW5zaWduZWQgaW50IGJ1c19pbmRleCwgY29uc3QgY2hhciAqYnVzX3N0ciwKQEAgLTEyOSwyNCArMTMxLDI4IEBACiAvKiByZXBvc2l0b3J5IGJ1cyBlbnVtZXJhdG9ycyAqLwogCiBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHsKKwllbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZTsKIAl1bnNpZ25lZCBpbnQgYnVzX2luZGV4OworCXVuc2lnbmVkIGludCBidXNfaWQ7CisJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGU7CiAJdW5zaWduZWQgaW50IGRldl9pbmRleDsKLQlzdHJ1Y3QgcHMzX2RldmljZV9pZCBkaWQ7CisJdW5zaWduZWQgaW50IGRldl9pZDsKIH07CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2RldmljZShlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbmxpbmUgaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZmlyc3RfZGV2aWNlKAotCWVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCBlbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnBzM19yZXBvc2l0b3J5X2J1bXBfZGV2aWNlKAorCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCiB7Ci0JcmV0dXJuIHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKGJ1c190eXBlLCBkZXZfdHlwZSwgTlVMTCwgZGV2KTsKKwlyZXBvLT5kZXZfaW5kZXgrKzsKKwlyZXR1cm4gcmVwbzsKIH0KLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2Uoc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbyk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9kZXZpY2VzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLAorCWludCAoKmNhbGxiYWNrKShjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvKSk7CitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9idXMoZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsIHVuc2lnbmVkIGludCBmcm9tLAorCXVuc2lnbmVkIGludCAqYnVzX2luZGV4KTsKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX2ludGVycnVwdF90eXBlIGludHJfdHlwZSwgdW5zaWduZWQgaW50ICppbnRlcnJ1cHRfaWQpOwotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfcmVnKGNvbnN0IHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKmRldiwKK2ludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAogCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlLCB1NjQgKmJ1c19hZGRyLCB1NjQgKmxlbik7CiAKIC8qIHJlcG9zaXRvcnkgYmxvY2sgZGV2aWNlIGluZm8gKi8KQEAgLTIxNiw0ICsyMjIsMTkgQEAKIGludCBwczNfcmVwb3NpdG9yeV9yZWFkX3NwdV9yZXNvdXJjZV9pZCh1bnNpZ25lZCBpbnQgcmVzX2luZGV4LAogCWVudW0gcHMzX3NwdV9yZXNvdXJjZV90eXBlKiByZXNvdXJjZV90eXBlLCB1bnNpZ25lZCBpbnQgKnJlc291cmNlX2lkKTsKIAorLyogcmVwb3NpdG9yeSB2dWFydCBpbmZvICovCisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQodW5zaWduZWQgaW50ICpwb3J0KTsKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCk7CisKKy8qIFBhZ2UgdGFibGUgZW50cmllcyAqLworI2RlZmluZSBJT1BURV9QUF9XCQkweDgwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiB3cml0ZSAqLworI2RlZmluZSBJT1BURV9QUF9SCQkweDQwMDAwMDAwMDAwMDAwMDB1bCAvKiBwcm90ZWN0aW9uOiByZWFkICovCisjZGVmaW5lIElPUFRFX00JCQkweDIwMDAwMDAwMDAwMDAwMDB1bCAvKiBjb2hlcmVuY3kgcmVxdWlyZWQgKi8KKyNkZWZpbmUgSU9QVEVfU09fUgkJMHgxMDAwMDAwMDAwMDAwMDAwdWwgLyogb3JkZXJpbmc6IHdyaXRlcyAqLworI2RlZmluZSBJT1BURV9TT19SVyAgICAgICAgICAgICAweDE4MDAwMDAwMDAwMDAwMDB1bCAvKiBvcmRlcmluZzogciAmIHcgKi8KKyNkZWZpbmUgSU9QVEVfUlBOX01hc2sJCTB4MDdmZmZmZmZmZmZmZjAwMHVsIC8qIFJQTiAqLworI2RlZmluZSBJT1BURV9ICQkJMHgwMDAwMDAwMDAwMDAwODAwdWwgLyogY2FjaGUgaGludCAqLworI2RlZmluZSBJT1BURV9JT0lEX01hc2sJCTB4MDAwMDAwMDAwMDAwMDdmZnVsIC8qIGlvaWQgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKaW5kZXggYWU1ODZhMC4uOGNjMzdjZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCWR1bXBfbm9kZV9uYW1lKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40KTsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZHVtcF9ub2RlKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40LCB2MSwgdjIpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MjogJTAxNmx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCB2Mik7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCiBpbnQgcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfc3RyKHVuc2lnbmVkIGludCBidXNfaW5kZXgsIGNvbnN0IGNoYXIgKmJ1c19zdHIsCkBAIC0zMTQsMzI0ICszMTQsMTQwIEBACiAJCXJlZ19pbmRleCwgYnVzX2FkZHIsIGxlbik7CiB9CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotaW50IHBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyh1bnNpZ25lZCBpbnQgYnVzX2luZGV4LAotCXVuc2lnbmVkIGludCBkZXZfaW5kZXgpCisKKworaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKHN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgKnJlcG8pCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IHJlc19pbmRleDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgdG1wID0gKnJlcG87CisJdW5zaWduZWQgaW50IG51bV9kZXY7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKKwlCVUdfT04ocmVwby0+YnVzX2luZGV4ID4gMTApOworCUJVR19PTihyZXBvLT5kZXZfaW5kZXggPiAxMCk7CiAKLQlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgewotCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2Rldih0bXAuYnVzX2luZGV4LCAmbnVtX2Rldik7CiAKLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCXJlc19pbmRleCwgJmludHJfdHlwZSwgJmludGVycnVwdF9pZCk7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQotCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyIgotCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBpbnRyX3R5cGUsCi0JCQlpbnRlcnJ1cHRfaWQpOwotCX0KLQotCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7Ci0JCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlOwotCQl1NjQgYnVzX2FkZHI7Ci0JCXU2NCBsZW47Ci0KLQkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJcmVzX2luZGV4LCAmcmVnX3R5cGUsICZidXNfYWRkciwgJmxlbik7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQotCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWciCi0JCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWx4aCwgbGVuICVseGhcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCByZWdfdHlwZSwKLQkJCWJ1c19hZGRyLCBsZW4pOwotCX0KLQotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBkdW1wX3N0b3JfZGV2X2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IGRldl9pbmRleCkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKLQl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7Ci0KLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c19pbmRleCwgZGV2X2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCwgJnBvcnQsCi0JCSZibGtfc2l6ZSwgJm51bV9ibG9ja3MsICZudW1fcmVnaW9ucyk7CiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvIgotCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQlnb3RvIG91dDsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXByX2RlYnVnKCIlczolZCAgKCV1OiV1KTogcG9ydCAlbHUsIGJsa19zaXplICVsdSwgbnVtX2Jsb2NrcyAiCi0JCSAiJWx1LCBudW1fcmVnaW9ucyAldVxuIiwKLQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHBvcnQsCi0JCSBibGtfc2l6ZSwgbnVtX2Jsb2NrcywgbnVtX3JlZ2lvbnMpOworCXByX2RlYnVnKCIlczolZDogYnVzX3R5cGUgJXUsIGJ1c19pbmRleCAldSwgYnVzX2lkICV1LCBudW1fZGV2ICV1XG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIHRtcC5idXNfdHlwZSwgdG1wLmJ1c19pbmRleCwgdG1wLmJ1c19pZCwKKwkJbnVtX2Rldik7CiAKLQlmb3IgKHJlZ2lvbl9pbmRleCA9IDA7IHJlZ2lvbl9pbmRleCA8IG51bV9yZWdpb25zOyByZWdpb25faW5kZXgrKykgewotCQl1bnNpZ25lZCBpbnQgcmVnaW9uX2lkOwotCQl1NjQgcmVnaW9uX3N0YXJ0LCByZWdpb25fc2l6ZTsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbihidXNfaW5kZXgsCi0JCQlkZXZfaW5kZXgsIHJlZ2lvbl9pbmRleCwgJnJlZ2lvbl9pZCwgJnJlZ2lvbl9zdGFydCwKLQkJCSZyZWdpb25fc2l6ZSk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCSBwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24iCi0JCQkJICAiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJICBidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXByX2RlYnVnKCIlczolZCAoJXU6JXUpIHJlZ2lvbl9pZCAldSwgc3RhcnQgJWx4aCwgc2l6ZSAlbHhoXG4iLAotCQkJIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBkZXZfaW5kZXgsIHJlZ2lvbl9pZCwKLQkJCSByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwlpZiAodG1wLmRldl9pbmRleCA+PSBudW1fZGV2KSB7CisJCXByX2RlYnVnKCIlczolZDogbm8gZGV2aWNlIGZvdW5kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLW91dDoKLQlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCXJldHVybiByZXN1bHQ7CisJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSh0bXAuYnVzX2luZGV4LCB0bXAuZGV2X2luZGV4LAorCQkmdG1wLmRldl90eXBlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X3R5cGUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKHRtcC5idXNfaW5kZXgsIHRtcC5kZXZfaW5kZXgsCisJCSZ0bXAuZGV2X2lkKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kOiBkZXZfdHlwZSAldSwgZGV2X2luZGV4ICV1LCBkZXZfaWQgJXVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmRldl90eXBlLCB0bXAuZGV2X2luZGV4LCB0bXAuZGV2X2lkKTsKKworCSpyZXBvID0gdG1wOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGR1bXBfZGV2aWNlX2luZm8odW5zaWduZWQgaW50IGJ1c19pbmRleCwgZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGUsCi0JCQkgICAgdW5zaWduZWQgaW50IG51bV9kZXYpCitpbnQgX19kZXZpbml0IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlcyhlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKKwlpbnQgKCpjYWxsYmFjaykoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGRldl9pbmRleDsKKwlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHJlcG87CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBidXNfJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4KTsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiBmaW5kIGJ1c190eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGJ1c190eXBlKTsKIAotCWZvciAoZGV2X2luZGV4ID0gMDsgZGV2X2luZGV4IDwgbnVtX2RldjsgZGV2X2luZGV4KyspIHsKLQkJZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGU7Ci0JCXVuc2lnbmVkIGludCBkZXZfaWQ7CisJZm9yIChyZXBvLmJ1c19pbmRleCA9IDA7IHJlcG8uYnVzX2luZGV4IDwgMTA7IHJlcG8uYnVzX2luZGV4KyspIHsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJmRldl90eXBlKTsKLQotCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZSIKLQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZChidXNfaW5kZXgsIGRldl9pbmRleCwKLQkJCSZkZXZfaWQpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCIKLQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCQkJYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IGRldl90eXBlICV1LCBkZXZfaWQgJXVcbiIsIF9fZnVuY19fLAotCQkJX19MSU5FX18sIGJ1c19pbmRleCwgZGV2X2luZGV4LCBkZXZfdHlwZSwgZGV2X2lkKTsKLQotCQlwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oYnVzX2luZGV4LCBkZXZfaW5kZXgpOwotCi0JCWlmIChidXNfdHlwZSA9PSBQUzNfQlVTX1RZUEVfU1RPUkFHRSkKLQkJCWR1bXBfc3Rvcl9kZXZfaW5mbyhidXNfaW5kZXgsIGRldl9pbmRleCk7Ci0JfQotCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBidXNfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JZm9yIChidXNfaW5kZXggPSAwOyBidXNfaW5kZXggPCAxMDsgYnVzX2luZGV4KyspIHsKLQkJZW51bSBwczNfYnVzX3R5cGUgYnVzX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBidXNfaWQ7Ci0JCXVuc2lnbmVkIGludCBudW1fZGV2OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmYnVzX3R5cGUpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX3R5cGUpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZidXNfaWQpOworCQlpZiAocmVwby5idXNfdHlwZSAhPSBidXNfdHlwZSkgeworCQkJcHJfZGVidWcoIiVzOiVkOiBza2lwLCBidXNfdHlwZSAldVxuIiwgX19mdW5jX18sCisJCQkJX19MSU5FX18sIHJlcG8uYnVzX3R5cGUpOworCQkJY29udGludWU7CisJCX0KKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChyZXBvLmJ1c19pbmRleCwKKwkJCSZyZXBvLmJ1c19pZCk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX2lkKCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOworCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoYnVzX2luZGV4ICE9IGJ1c19pZCkKLQkJCXByX2RlYnVnKCIlczolZCBidXNfaW5kZXggIT0gYnVzX2lkXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWZvciAocmVwby5kZXZfaW5kZXggPSAwOyA7IHJlcG8uZGV2X2luZGV4KyspIHsKKwkJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlKCZyZXBvKTsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOworCQkJaWYgKHJlc3VsdCA9PSAtRU5PREVWKSB7CisJCQkJcmVzdWx0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocmVzdWx0KQorCQkJCWJyZWFrOwogCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCBidXNfaW5kZXgpOwotCQkJY29udGludWU7CisJCQlyZXN1bHQgPSBjYWxsYmFjaygmcmVwbyk7CisKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcl9kZWJ1ZygiJXM6JWQ6IGFib3J0IGF0IGNhbGxiYWNrXG4iLCBfX2Z1bmNfXywKKwkJCQkJX19MSU5FX18pOworCQkJCWJyZWFrOworCQkJfQogCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiVkIGJ1c18ldTogYnVzX3R5cGUgJXUsIGJ1c19pZCAldSwgbnVtX2RldiAldVxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX2luZGV4LCBidXNfdHlwZSwgYnVzX2lkLAotCQkJbnVtX2Rldik7Ci0KLQkJZHVtcF9kZXZpY2VfaW5mbyhidXNfaW5kZXgsIGJ1c190eXBlLCBudW1fZGV2KTsKKwkJYnJlYWs7CiAJfQogCiAJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQotI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCiAKLXN0YXRpYyBpbnQgZmluZF9kZXZpY2UodW5zaWduZWQgaW50IGJ1c19pbmRleCwgdW5zaWduZWQgaW50IG51bV9kZXYsCi0JdW5zaWduZWQgaW50IHN0YXJ0X2Rldl9pbmRleCwgZW51bSBwczNfZGV2X3R5cGUgZGV2X3R5cGUsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQoraW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfYnVzKGVudW0gcHMzX2J1c190eXBlIGJ1c190eXBlLCB1bnNpZ25lZCBpbnQgZnJvbSwKKwl1bnNpZ25lZCBpbnQgKmJ1c19pbmRleCkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZGV2X2luZGV4OworCXVuc2lnbmVkIGludCBpOworCWVudW0gcHMzX2J1c190eXBlIHR5cGU7CisJaW50IGVycm9yOwogCi0JcHJfZGVidWcoIiVzOiVkOiBmaW5kIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldl90eXBlKTsKLQotCWRldi0+ZGV2X2luZGV4ID0gVUlOVF9NQVg7Ci0KLQlmb3IgKGRldl9pbmRleCA9IHN0YXJ0X2Rldl9pbmRleDsgZGV2X2luZGV4IDwgbnVtX2RldjsgZGV2X2luZGV4KyspIHsKLQkJZW51bSBwczNfZGV2X3R5cGUgeDsKLQotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkJJngpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl90eXBlIGZhaWxlZFxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWlmICh4ID09IGRldl90eXBlKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGRldl9pbmRleCA9PSBudW1fZGV2KQotCQlyZXR1cm4gLTE7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGRldl90eXBlICV1IGF0IGRldl9pbmRleCAldVxuIiwKLQkJX19mdW5jX18sIF9fTElORV9fLCBkZXZfdHlwZSwgZGV2X2luZGV4KTsKLQotCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkKGJ1c19pbmRleCwgZGV2X2luZGV4LAotCQkmZGV2LT5kaWQuZGV2X2lkKTsKLQotCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfZGV2X2lkIGZhaWxlZFxuIiwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JZGV2LT5kZXZfaW5kZXggPSBkZXZfaW5kZXg7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQgZm91bmQ6IGRldl9pZCAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlkZXYtPmRpZC5kZXZfaWQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IHBzM19yZXBvc2l0b3J5X2ZpbmRfZGV2aWNlIChlbnVtIHBzM19idXNfdHlwZSBidXNfdHlwZSwKLQllbnVtIHBzM19kZXZfdHlwZSBkZXZfdHlwZSwKLQljb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpzdGFydF9kZXYsCi0Jc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqZGV2KQotewotCWludCByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBidXNfaW5kZXg7Ci0JdW5zaWduZWQgaW50IG51bV9kZXY7Ci0KLQlwcl9kZWJ1ZygiJXM6JWQ6IGZpbmQgYnVzX3R5cGUgJXUsIGRldl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCWJ1c190eXBlLCBkZXZfdHlwZSk7Ci0KLQlCVUdfT04oc3RhcnRfZGV2ICYmIHN0YXJ0X2Rldi0+YnVzX2luZGV4ID4gMTApOwotCi0JZm9yIChidXNfaW5kZXggPSBzdGFydF9kZXYgPyBzdGFydF9kZXYtPmJ1c19pbmRleCA6IDA7IGJ1c19pbmRleCA8IDEwOwotCQlidXNfaW5kZXgrKykgewotCQllbnVtIHBzM19idXNfdHlwZSB4OwotCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoYnVzX2luZGV4LCAmeCk7Ci0KLQkJaWYgKHJlc3VsdCkgeworCWZvciAoaSA9IGZyb207IGkgPCAxMDsgaSsrKSB7CisJCWVycm9yID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZShpLCAmdHlwZSk7CisJCWlmIChlcnJvcikgewogCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX3R5cGUgZmFpbGVkXG4iLAogCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlkZXYtPmJ1c19pbmRleCA9IFVJTlRfTUFYOwotCQkJcmV0dXJuIHJlc3VsdDsKKwkJCSpidXNfaW5kZXggPSBVSU5UX01BWDsKKwkJCXJldHVybiBlcnJvcjsKIAkJfQotCQlpZiAoeCA9PSBidXNfdHlwZSkKLQkJCWJyZWFrOworCQlpZiAodHlwZSA9PSBidXNfdHlwZSkgeworCQkJKmJ1c19pbmRleCA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KLQotCWlmIChidXNfaW5kZXggPj0gMTApCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJfZGVidWcoIiVzOiVkOiBmb3VuZCBidXNfdHlwZSAldSBhdCBidXNfaW5kZXggJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgYnVzX3R5cGUsIGJ1c19pbmRleCk7Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KGJ1c19pbmRleCwgJm51bV9kZXYpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXJlc3VsdCA9IGZpbmRfZGV2aWNlKGJ1c19pbmRleCwgbnVtX2Rldiwgc3RhcnRfZGV2Ci0JCT8gc3RhcnRfZGV2LT5kZXZfaW5kZXggKyAxIDogMCwgZGV2X3R5cGUsIGRldik7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCBnZXRfZGlkIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19pZChidXNfaW5kZXgsICZkZXYtPmRpZC5idXNfaWQpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQgZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlkZXYtPmJ1c19pbmRleCA9IGJ1c19pbmRleDsKLQotCXByX2RlYnVnKCIlczolZCBmb3VuZDogYnVzX2lkICV1LCBkZXZfaWQgJXVcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwkqYnVzX2luZGV4ID0gVUlOVF9NQVg7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX2ludGVycnVwdChjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9pbnRlcnJ1cHQoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGUsIHVuc2lnbmVkIGludCAqaW50ZXJydXB0X2lkKQogewogCWludCByZXN1bHQgPSAwOwpAQCAtNjQ1LDggKzQ2MSw4IEBACiAJCWVudW0gcHMzX2ludGVycnVwdF90eXBlIHQ7CiAJCXVuc2lnbmVkIGludCBpZDsKIAotCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyKGRldi0+YnVzX2luZGV4LAotCQkJZGV2LT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJnQsICZpZCk7CisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmaWQpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pbnRyIGZhaWxlZFxuIiwKQEAgLTY2OSw3ICs0ODUsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfcmVwb3NpdG9yeV9maW5kX3JlZyhjb25zdCBzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpkZXYsCitpbnQgcHMzX3JlcG9zaXRvcnlfZmluZF9yZWcoY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbywKIAllbnVtIHBzM19yZWdfdHlwZSByZWdfdHlwZSwgdTY0ICpidXNfYWRkciwgdTY0ICpsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC02ODQsOCArNTAwLDggQEAKIAkJdTY0IGE7CiAJCXU2NCBsOwogCi0JCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyhkZXYtPmJ1c19pbmRleCwKLQkJCWRldi0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWcocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9yZWcgZmFpbGVkXG4iLApAQCAtOTY1LDYgKzc4MSwzNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X2F2X3BvcnQodW5zaWduZWQgaW50ICpwb3J0KQoreworCWludCByZXN1bHQ7CisJdTY0IHYxOworCisJcmVzdWx0ID0gcmVhZF9ub2RlKFBTM19MUEFSX0lEX0NVUlJFTlQsCisJCW1ha2VfZmlyc3RfZmllbGQoImJpIiwgMCksCisJCW1ha2VfZmllbGQoInZpcl91YXJ0IiwgMCksCisJCW1ha2VfZmllbGQoInBvcnQiLCAwKSwKKwkJbWFrZV9maWVsZCgiYXZzZXQiLCAwKSwKKwkJJnYxLCAwKTsKKwkqcG9ydCA9IHYxOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfcmVwb3NpdG9yeV9yZWFkX3Z1YXJ0X3N5c21ncl9wb3J0KHVuc2lnbmVkIGludCAqcG9ydCkKK3sKKwlpbnQgcmVzdWx0OworCXU2NCB2MTsKKworCXJlc3VsdCA9IHJlYWRfbm9kZShQUzNfTFBBUl9JRF9DVVJSRU5ULAorCQltYWtlX2ZpcnN0X2ZpZWxkKCJiaSIsIDApLAorCQltYWtlX2ZpZWxkKCJ2aXJfdWFydCIsIDApLAorCQltYWtlX2ZpZWxkKCJwb3J0IiwgMCksCisJCW1ha2VfZmllbGQoInN5c21nciIsIDApLAorCQkmdjEsIDApOworCSpwb3J0ID0gdjE7CisJcmV0dXJuIHJlc3VsdDsKK30KKwogLyoqCiAgICogcHMzX3JlcG9zaXRvcnlfcmVhZF9ib290X2RhdF9pbmZvIC0gR2V0IGFkZHJlc3MgYW5kIHNpemUgb2YgY2VsbF9leHRfb3NfYXJlYS4KICAgKiBhZGRyZXNzOiBscGFyIGFkZHJlc3Mgb2YgY2VsbF9leHRfb3NfYXJlYQpAQCAtMTAyNiwzICs4NzIsMjA1IEBACiAJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdAogCQk6IHBzM19yZXBvc2l0b3J5X3JlYWRfdGJfZnJlcShub2RlX2lkLCB0Yl9mcmVxKTsKIH0KKworI2lmIGRlZmluZWQoREVCVUcpCisKK2ludCBwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8oY29uc3Qgc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OworCisJcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CisKKwlmb3IgKHJlc19pbmRleCA9IDA7IHJlc19pbmRleCA8IDEwOyByZXNfaW5kZXgrKykgeworCQllbnVtIHBzM19pbnRlcnJ1cHRfdHlwZSBpbnRyX3R5cGU7CisJCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaW50cihyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsIHJlc19pbmRleCwgJmludHJfdHlwZSwgJmludGVycnVwdF9pZCk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQorCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pbnRyIgorCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJaW50cl90eXBlLCBpbnRlcnJ1cHRfaWQpOworCX0KKworCWZvciAocmVzX2luZGV4ID0gMDsgcmVzX2luZGV4IDwgMTA7IHJlc19pbmRleCsrKSB7CisJCWVudW0gcHMzX3JlZ190eXBlIHJlZ190eXBlOworCQl1NjQgYnVzX2FkZHI7CisJCXU2NCBsZW47CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVzX2luZGV4LCAmcmVnX3R5cGUsICZidXNfYWRkciwgJmxlbik7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJaWYgKHJlc3VsdCAhPSAgTFYxX05PX0VOVFJZKQorCQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9yZWciCisJCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQkJYnJlYWs7CisJCX0KKworCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWx4aCwgbGVuICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVnX3R5cGUsIGJ1c19hZGRyLCBsZW4pOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBkdW1wX3N0b3JfZGV2X2luZm8oc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSAqcmVwbykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKKwl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CisKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKworCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyhyZXBvLT5idXNfaW5kZXgsCisJCXJlcG8tPmRldl9pbmRleCwgJnBvcnQsICZibGtfc2l6ZSwgJm51bV9ibG9ja3MsICZudW1fcmVnaW9ucyk7CisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9pbmZvIgorCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6JWQgICgldToldSk6IHBvcnQgJWx1LCBibGtfc2l6ZSAlbHUsIG51bV9ibG9ja3MgIgorCQkgIiVsdSwgbnVtX3JlZ2lvbnMgJXVcbiIsCisJCSBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LCBwb3J0LAorCQkgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKKworCWZvciAocmVnaW9uX2luZGV4ID0gMDsgcmVnaW9uX2luZGV4IDwgbnVtX3JlZ2lvbnM7IHJlZ2lvbl9pbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCByZWdpb25faWQ7CisJCXU2NCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplOworCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uKHJlcG8tPmJ1c19pbmRleCwKKwkJCXJlcG8tPmRldl9pbmRleCwgcmVnaW9uX2luZGV4LCAmcmVnaW9uX2lkLAorCQkJJnJlZ2lvbl9zdGFydCwgJnJlZ2lvbl9zaXplKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJIHByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X3JlZ2lvbiIKKwkJCQkgICIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQkgIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnaW9uX2lkICV1LCBzdGFydCAlbHhoLCBzaXplICVseGhcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAorCQkJcmVnaW9uX2lkLCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwl9CisKK291dDoKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlICpyZXBvLAorCXVuc2lnbmVkIGludCBudW1fZGV2KQoreworCWludCByZXN1bHQgPSAwOworCisJcHJfZGVidWcoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCk7CisKKwlmb3IgKHJlcG8tPmRldl9pbmRleCA9IDA7IHJlcG8tPmRldl9pbmRleCA8IG51bV9kZXY7CisJCXJlcG8tPmRldl9pbmRleCsrKSB7CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfdHlwZShyZXBvLT5idXNfaW5kZXgsCisJCQlyZXBvLT5kZXZfaW5kZXgsICZyZXBvLT5kZXZfdHlwZSk7CisKKwkJaWYgKHJlc3VsdCkgeworCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUiCisJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQocmVwby0+YnVzX2luZGV4LAorCQkJcmVwby0+ZGV2X2luZGV4LCAmcmVwby0+ZGV2X2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQiCisJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBkZXZfdHlwZSAldSwgZGV2X2lkICV1XG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJCXJlcG8tPmRldl90eXBlLCByZXBvLT5kZXZfaWQpOworCisJCXBzM19yZXBvc2l0b3J5X2R1bXBfcmVzb3VyY2VfaW5mbyhyZXBvKTsKKworCQlpZiAocmVwby0+YnVzX3R5cGUgPT0gUFMzX0JVU19UWVBFX1NUT1JBR0UpCisJCQlkdW1wX3N0b3JfZGV2X2luZm8ocmVwbyk7CisJfQorCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcHMzX3JlcG9zaXRvcnlfZHVtcF9idXNfaW5mbyh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBwczNfcmVwb3NpdG9yeV9kZXZpY2UgcmVwbzsKKworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltZW1zZXQoJnJlcG8sIDAsIHNpemVvZihyZXBvKSk7CisKKwlmb3IgKHJlcG8uYnVzX2luZGV4ID0gMDsgcmVwby5idXNfaW5kZXggPCAxMDsgcmVwby5idXNfaW5kZXgrKykgeworCQl1bnNpZ25lZCBpbnQgbnVtX2RldjsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c190eXBlKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX3R5cGUpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQlicmVhazsKKwkJfQorCisJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX2lkKHJlcG8uYnVzX2luZGV4LAorCQkJJnJlcG8uYnVzX2lkKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlcG8uYnVzX2luZGV4ICE9IHJlcG8uYnVzX2lkKQorCQkJcHJfZGVidWcoIiVzOiVkIGJ1c19pbmRleCAhPSBidXNfaWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCQlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2J1c19udW1fZGV2KHJlcG8uYnVzX2luZGV4LAorCQkJJm51bV9kZXYpOworCisJCWlmIChyZXN1bHQpIHsKKwkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2RlYnVnKCIlczolZCBidXNfJXU6IGJ1c190eXBlICV1LCBidXNfaWQgJXUsIG51bV9kZXYgJXVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4LCByZXBvLmJ1c190eXBlLAorCQkJcmVwby5idXNfaWQsIG51bV9kZXYpOworCisJCWR1bXBfZGV2aWNlX2luZm8oJnJlcG8sIG51bV9kZXYpOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoREVCVUcpICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwppbmRleCA5MzUzOTY3Li5hYTA1Mjg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKQEAgLTM3LDI4ICszNywzNiBAQAogI2luY2x1ZGUgInBsYXRmb3JtLmgiCiAKICNpZiBkZWZpbmVkKERFQlVHKQotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZGVmaW5lIERCRyB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikgZG97aWYoMClwcmludGsoZm10KTt9d2hpbGUoMCkKKyNkZWZpbmUgREJHIHByX2RlYnVnCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKENPTkZJR19TTVApCiBzdGF0aWMgdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpIHt9CiAjZW5kaWYKIAotaW50IHBzM19nZXRfZmlybXdhcmVfdmVyc2lvbih1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiAqdikKK3N0YXRpYyB1bmlvbiBwczNfZmlybXdhcmVfdmVyc2lvbiBwczNfZmlybXdhcmVfdmVyc2lvbjsKKwordm9pZCBwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24odW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gKnYpCiB7Ci0JaW50IHJlc3VsdCA9IGx2MV9nZXRfdmVyc2lvbl9pbmZvKCZ2LT5yYXcpOwotCi0JaWYgKHJlc3VsdCkgewotCQl2LT5yYXcgPSAwOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKKwkqdiA9IHBzM19maXJtd2FyZV92ZXJzaW9uOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKTsKIAoraW50IHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24odTE2IG1ham9yLCB1MTYgbWlub3IsIHUxNiByZXYpCit7CisJdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24geDsKKworCXgucGFkID0gMDsKKwl4Lm1ham9yID0gbWFqb3I7CisJeC5taW5vciA9IG1pbm9yOworCXgucmV2ID0gcmV2OworCisJcmV0dXJuIChwczNfZmlybXdhcmVfdmVyc2lvbi5yYXcgLSB4LnJhdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNfY29tcGFyZV9maXJtd2FyZV92ZXJzaW9uKTsKKwogc3RhdGljIHZvaWQgcHMzX3Bvd2VyX3NhdmUodm9pZCkKIHsKIAkvKgpAQCAtOTksNyArMTA3LDggQEAKIAl3aGlsZSgxKTsKIH0KIAotI2lmZGVmIENPTkZJR19GQl9QUzMKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9QUzMpIHx8IGRlZmluZWQoQ09ORklHX0ZCX1BTM19NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19QUzNfRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX1BTM19GTEFTSF9NT0RVTEUpCiBzdGF0aWMgdm9pZCBwcmVhbGxvYyhzdHJ1Y3QgcHMzX3ByZWFsbG9jICpwKQogewogCWlmICghcC0+c2l6ZSkKQEAgLTExNSwxMiArMTI0LDE1IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVsdSBieXRlcyBhdCAlcFxuIiwgcC0+bmFtZSwgcC0+c2l6ZSwKIAkgICAgICAgcC0+YWRkcmVzcyk7CiB9CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0ZCX1BTMykgfHwgZGVmaW5lZChDT05GSUdfRkJfUFMzX01PRFVMRSkKIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmJfdmlkZW9tZW1vcnkgPSB7Ci0gICAgLm5hbWUgPSAicHMzZmIgdmlkZW9tZW1vcnkiLAotICAgIC5zaXplID0gQ09ORklHX0ZCX1BTM19ERUZBVUxUX1NJWkVfTSoxMDI0KjEwMjQsCi0gICAgLmFsaWduID0gMTAyNCoxMDI0CQkJLyogdGhlIEdQVSByZXF1aXJlcyAxIE1pQiBhbGlnbm1lbnQgKi8KKwkubmFtZSA9ICJwczNmYiB2aWRlb21lbW9yeSIsCisJLnNpemUgPSBDT05GSUdfRkJfUFMzX0RFRkFVTFRfU0laRV9NKjEwMjQqMTAyNCwKKwkuYWxpZ24gPSAxMDI0KjEwMjQJCS8qIHRoZSBHUFUgcmVxdWlyZXMgMSBNaUIgYWxpZ25tZW50ICovCiB9OworRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfdmlkZW9tZW1vcnkpOwogI2RlZmluZSBwcmVhbGxvY19wczNmYl92aWRlb21lbW9yeSgpCXByZWFsbG9jKCZwczNmYl92aWRlb21lbW9yeSkKIAogc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfcHMzZmIoY2hhciAqcCkKQEAgLTEzNyw2ICsxNDksMzAgQEAKICNkZWZpbmUgcHJlYWxsb2NfcHMzZmJfdmlkZW9tZW1vcnkoKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1BTM19GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfUFMzX0ZMQVNIX01PRFVMRSkKK3N0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmxhc2hfYm91bmNlX2J1ZmZlciA9IHsKKwkubmFtZSA9ICJwczNmbGFzaCBib3VuY2UgYnVmZmVyIiwKKwkuc2l6ZSA9IDI1NioxMDI0LAorCS5hbGlnbiA9IDI1NioxMDI0Cit9OworRVhQT1JUX1NZTUJPTF9HUEwocHMzZmxhc2hfYm91bmNlX2J1ZmZlcik7CisjZGVmaW5lIHByZWFsbG9jX3BzM2ZsYXNoX2JvdW5jZV9idWZmZXIoKQlwcmVhbGxvYygmcHMzZmxhc2hfYm91bmNlX2J1ZmZlcikKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfcHMzZmxhc2goY2hhciAqcCkKK3sKKwlpZiAoIXApCisJCXJldHVybiAxOworCisJaWYgKCFzdHJjbXAocCwgIm9mZiIpKQorCQlwczNmbGFzaF9ib3VuY2VfYnVmZmVyLnNpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgicHMzZmxhc2giLCBlYXJseV9wYXJzZV9wczNmbGFzaCk7CisjZWxzZQorI2RlZmluZSBwcmVhbGxvY19wczNmbGFzaF9ib3VuY2VfYnVmZmVyKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKIHN0YXRpYyBpbnQgcHMzX3NldF9kYWJyKHU2NCBkYWJyKQogewogCWVudW0ge0RBQlJfVVNFUiA9IDEsIERBQlJfS0VSTkVMID0gMix9OwpAQCAtMTQ2LDEzICsxODIsMTMgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zZXR1cF9hcmNoKHZvaWQpCiB7Ci0JdW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gdjsKIAogCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JcHMzX2dldF9maXJtd2FyZV92ZXJzaW9uKCZ2KTsKLQlwcmludGsoS0VSTl9JTkZPICJQUzMgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldVxuIiwgdi5tYWpvciwgdi5taW5vciwKLQkJdi5yZXYpOworCWx2MV9nZXRfdmVyc2lvbl9pbmZvKCZwczNfZmlybXdhcmVfdmVyc2lvbi5yYXcpOworCXByaW50ayhLRVJOX0lORk8gIlBTMyBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1XG4iLAorCSAgICAgICBwczNfZmlybXdhcmVfdmVyc2lvbi5tYWpvciwgcHMzX2Zpcm13YXJlX3ZlcnNpb24ubWlub3IsCisJICAgICAgIHBzM19maXJtd2FyZV92ZXJzaW9uLnJldik7CiAKIAlwczNfc3B1X3NldF9wbGF0Zm9ybSgpOwogCXBzM19tYXBfaHRhYigpOwpAQCAtMTY2LDYgKzIwMiw4IEBACiAjZW5kaWYKIAogCXByZWFsbG9jX3BzM2ZiX3ZpZGVvbWVtb3J5KCk7CisJcHJlYWxsb2NfcHMzZmxhc2hfYm91bmNlX2J1ZmZlcigpOworCiAJcHBjX21kLnBvd2VyX3NhdmUgPSBwczNfcG93ZXJfc2F2ZTsKIAogCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMTg0LDcgKzIyMiw3IEBACiAJREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAlkdF9yb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwotCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKGR0X3Jvb3QsICJQUzMiKSkKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShkdF9yb290LCAic29ueSxwczMiKSkKIAkJcmV0dXJuIDA7CiAKIAlwb3dlcnBjX2Zpcm13YXJlX2ZlYXR1cmVzIHw9IEZXX0ZFQVRVUkVfUFMzX1BPU1NJQkxFOwpAQCAtMjAxLDMxICsyMzksMTIgQEAKICNpZiBkZWZpbmVkKENPTkZJR19LRVhFQykKIHN0YXRpYyB2b2lkIHBzM19rZXhlY19jcHVfZG93bihpbnQgY3Jhc2hfc2h1dGRvd24sIGludCBzZWNvbmRhcnkpCiB7Ci0JREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmIChzZWNvbmRhcnkpIHsKLQkJaW50IGNwdTsKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCQlpZiAoY3B1KQotCQkJCXBzM19zbXBfY2xlYW51cF9jcHUoY3B1KTsKLQl9IGVsc2UKLQkJcHMzX3NtcF9jbGVhbnVwX2NwdSgwKTsKKwlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCi0JREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBzM19tYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQotewotCXVuc2lnbmVkIGxvbmcgcHBlX2lkOwotCi0JREJHKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0KLQlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZwcGVfaWQpOwotCWx2MV9jb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcChwcGVfaWQsIDAsIDApOwotCXBzM19tbV9zaHV0ZG93bigpOwotCXBzM19tbV92YXNfZGVzdHJveSgpOwotCi0JZGVmYXVsdF9tYWNoaW5lX2tleGVjKGltYWdlKTsKKwlwczNfc21wX2NsZWFudXBfY3B1KGNwdSk7CisJcHMzX3NodXRkb3duX0lSUShjcHUpOwogCiAJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CkBAIC0yNDcsNyArMjY2LDcgQEAKIAkucG93ZXJfb2ZmCQkJPSBwczNfcG93ZXJfb2ZmLAogI2lmIGRlZmluZWQoQ09ORklHX0tFWEVDKQogCS5rZXhlY19jcHVfZG93bgkJCT0gcHMzX2tleGVjX2NwdV9kb3duLAotCS5tYWNoaW5lX2tleGVjCQkJPSBwczNfbWFjaGluZV9rZXhlYywKKwkubWFjaGluZV9rZXhlYwkJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAogCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjX3ByZXBhcmUsCiAJLm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24JCT0gZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duLAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCmluZGV4IDUzNDE2ZWMuLmYwYjEyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCkBAIC0yNyw5ICsyNyw5IEBACiAjaW5jbHVkZSAicGxhdGZvcm0uaCIKIAogI2lmIGRlZmluZWQoREVCVUcpCi0jZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKKyNkZWZpbmUgREJHIHVkYmdfcHJpbnRmCiAjZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKSBkb3tpZigwKXByaW50ayhmbXQpO313aGlsZSgwKQorI2RlZmluZSBEQkcgcHJfZGVidWcKICNlbmRpZgogCiBzdGF0aWMgaXJxcmV0dXJuX3QgaXBpX2Z1bmN0aW9uX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqbXNnKQpAQCAtMzksMTEgKzM5LDExIEBACiB9CiAKIC8qKgotICAqIHZpcnFzIC0gYSBwZXIgY3B1IGFycmF5IG9mIHZpcnFzIGZvciBpcGkgdXNlCisgICogcHMzX2lwaV92aXJxcyAtIGEgcGVyIGNwdSBhcnJheSBvZiB2aXJxcyBmb3IgaXBpIHVzZQogICAqLwogCiAjZGVmaW5lIE1TR19DT1VOVCA0Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCB2aXJxc1tNU0dfQ09VTlRdKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIHBzM19pcGlfdmlycXNbTVNHX0NPVU5UXSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lc1tNU0dfQ09VTlRdID0gewogCSJpcGkgY2FsbCIsCkBAIC02Miw3ICs2Miw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl2aXJxID0gcGVyX2NwdSh2aXJxcywgdGFyZ2V0KVttc2ddOworCXZpcnEgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIHRhcmdldClbbXNnXTsKIAlyZXN1bHQgPSBwczNfc2VuZF9ldmVudF9sb2NhbGx5KHZpcnEpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTk0LDEzICs5NCwxMyBAQAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zbXBfc2V0dXBfY3B1KGludCBjcHUpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdSh2aXJxcywgY3B1KTsKKwl1bnNpZ25lZCBpbnQgKnZpcnFzID0gcGVyX2NwdShwczNfaXBpX3ZpcnFzLCBjcHUpOwogCWludCBpOwogCiAJREJHKCIgLT4gJXM6JWQ6ICglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgY3B1KTsKIAogCS8qCi0JICogQ2hlY2sgYXNzdW1wdGlvbnMgb24gdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcworCSAqIENoZWNrIGFzc3VtcHRpb25zIG9uIHBzM19pcGlfdmlycXNbXSBpbmRleGluZy4gSWYgdGhpcwogCSAqIGNoZWNrIGZhaWxzLCB0aGVuIGEgZGlmZmVyZW50IG1hcHBpbmcgb2YgUFBDX01TR18KIAkgKiB0byBpbmRleCBuZWVkcyB0byBiZSBzZXR1cC4KIAkgKi8KQEAgLTEzMiwxMyArMTMyLDEzIEBACiAKIHZvaWQgcHMzX3NtcF9jbGVhbnVwX2NwdShpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHZpcnFzLCBjcHUpOworCXVuc2lnbmVkIGludCAqdmlycXMgPSBwZXJfY3B1KHBzM19pcGlfdmlycXMsIGNwdSk7CiAJaW50IGk7CiAKIAlEQkcoIiAtPiAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwogCiAJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7Ci0JCWZyZWVfaXJxKHZpcnFzW2ldLCAodm9pZCopKGxvbmcpaSk7CisJCS8qIENhbid0IGNhbGwgZnJlZV9pcnEgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gKi8KIAkJcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHZpcnFzW2ldKTsKIAkJdmlycXNbaV0gPSBOT19JUlE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwppbmRleCA2NTE0MzdjLi41MDJkODBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwpAQCAtMTgyLDE1ICsxODIsMTggQEAKIHsKIAlzdHJ1Y3QgdGFibGUge2NoYXIqIG5hbWU7IHVuc2lnbmVkIGxvbmcgYWRkcjsgdW5zaWduZWQgbG9uZyBzaXplO307CiAKLQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93ID0gX19pb3JlbWFwKAotCQlzcHVfcGRhdGEoc3B1KS0+c2hhZG93X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCi0JCXBncHJvdF92YWwoUEFHRV9SRUFET05MWSkgfCBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpOworCXNwdV9wZGF0YShzcHUpLT5zaGFkb3cgPSBpb3JlbWFwX2ZsYWdzKHNwdV9wZGF0YShzcHUpLT5zaGFkb3dfYWRkciwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3BlX3NoYWRvdyksCisJCQkJCSAgICAgICBwZ3Byb3RfdmFsKFBBR0VfUkVBRE9OTFkpIHwKKwkJCQkJICAgICAgIF9QQUdFX05PX0NBQ0hFKTsKIAlpZiAoIXNwdV9wZGF0YShzcHUpLT5zaGFkb3cpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBpb3JlbWFwIHNoYWRvdyBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwogCX0KIAotCXNwdS0+bG9jYWxfc3RvcmUgPSBpb3JlbWFwKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywgTFNfU0laRSk7CisJc3B1LT5sb2NhbF9zdG9yZSA9IChfX2ZvcmNlIHZvaWQgKilpb3JlbWFwX2ZsYWdzKHNwdS0+bG9jYWxfc3RvcmVfcGh5cywKKwkJTFNfU0laRSwgX1BBR0VfTk9fQ0FDSEUpOworCiAJaWYgKCFzcHUtPmxvY2FsX3N0b3JlKSB7CiAJCXByX2RlYnVnKCIlczolZDogaW9yZW1hcCBsb2NhbF9zdG9yZSBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtMTk5LDYgKzIwMiw3IEBACiAKIAlzcHUtPnByb2JsZW0gPSBpb3JlbWFwKHNwdS0+cHJvYmxlbV9waHlzLAogCQlzaXplb2Yoc3RydWN0IHNwdV9wcm9ibGVtKSk7CisKIAlpZiAoIXNwdS0+cHJvYmxlbSkgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJvYmxlbSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9pb3JlbWFwOwpAQCAtMjA2LDYgKzIxMCw3IEBACiAKIAlzcHUtPnByaXYyID0gaW9yZW1hcChzcHVfcGRhdGEoc3B1KS0+cHJpdjJfYWRkciwKIAkJc2l6ZW9mKHN0cnVjdCBzcHVfcHJpdjIpKTsKKwogCWlmICghc3B1LT5wcml2MikgewogCQlwcl9kZWJ1ZygiJXM6JWQ6IGlvcmVtYXAgcHJpdjIgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlnb3RvIGZhaWxfaW9yZW1hcDsKQEAgLTQwMCwxMSArNDA1LDEzIEBACiAJCX0KIAl9CiAKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IEVycm9yIGluaXRpYWxpemluZyBzcHVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBudW1fcmVzb3VyY2VfaWQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBzcHVfbWFuYWdlbWVudF9vcHMgc3B1X21hbmFnZW1lbnRfcHMzX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYwppbmRleCA2YmRhNTEwLi40YmI2MzRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCkBAIC0zMCwyMiArMzAsMjI4IEBACiAKICNpbmNsdWRlICJwbGF0Zm9ybS5oIgogCitzdGF0aWMgc3RydWN0IGRldmljZSBwczNfc3lzdGVtX2J1cyA9IHsKKwkuYnVzX2lkID0gInBzM19zeXN0ZW0iLAorfTsKKworLyogRklYTUU6IG5lZWQgZGV2aWNlIHVzYWdlIGNvdW50ZXJzISAqLworc3RydWN0IHsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IHNiXzExOyAvKiB1c2IgMCAqLworCWludCBzYl8xMjsgLyogdXNiIDAgKi8KKwlpbnQgZ3B1OworfSBzdGF0aWMgdXNhZ2VfaGFjazsKKworc3RhdGljIGludCBwczNfaXNfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwkJCSB1bnNpZ25lZCBpbnQgYnVzX2lkLCB1bnNpZ25lZCBpbnQgZGV2X2lkKQoreworCXJldHVybiBkZXYtPmJ1c19pZCA9PSBidXNfaWQgJiYgZGV2LT5kZXZfaWQgPT0gZGV2X2lkOworfQorCitzdGF0aWMgaW50IHBzM19vcGVuX2h2X2RldmljZV9zYihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCUJVR19PTighZGV2LT5idXNfaWQpOworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJaWYgKHBzM19pc19kZXZpY2UoZGV2LCAxLCAxKSkgeworCQl1c2FnZV9oYWNrLnNiXzExKys7CisJCWlmICh1c2FnZV9oYWNrLnNiXzExID4gMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMikpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMisrOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMiA+IDEpIHsKKwkJCXJlc3VsdCA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5idXNfaWQsIGRldi0+ZGV2X2lkLCAwKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBsdjFfb3Blbl9kZXZpY2UgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHBzM19jbG9zZV9odl9kZXZpY2Vfc2Ioc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisKKwlCVUdfT04oIWRldi0+YnVzX2lkKTsKKwltdXRleF9sb2NrKCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMSkpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMS0tOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMSkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmIChwczNfaXNfZGV2aWNlKGRldiwgMSwgMikpIHsKKwkJdXNhZ2VfaGFjay5zYl8xMi0tOworCQlpZiAodXNhZ2VfaGFjay5zYl8xMikgeworCQkJcmVzdWx0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCXJlc3VsdCA9IGx2MV9jbG9zZV9kZXZpY2UoZGV2LT5idXNfaWQsIGRldi0+ZGV2X2lkKTsKKwlCVUdfT04ocmVzdWx0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgcHMzX29wZW5faHZfZGV2aWNlX2dwdShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJdXNhZ2VfaGFjay5ncHUrKzsKKwlpZiAodXNhZ2VfaGFjay5ncHUgPiAxKSB7CisJCXJlc3VsdCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXN1bHQgPSBsdjFfZ3B1X29wZW4oMCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogbHYxX2dwdV9vcGVuIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJfQorCitkb25lOgorCW11dGV4X3VubG9jaygmdXNhZ2VfaGFjay5tdXRleCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwczNfY2xvc2VfaHZfZGV2aWNlX2dwdShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCisJdXNhZ2VfaGFjay5ncHUtLTsKKwlpZiAodXNhZ2VfaGFjay5ncHUpIHsKKwkJcmVzdWx0ID0gMDsKKwkJZ290byBkb25lOworCX0KKworCXJlc3VsdCA9IGx2MV9ncHVfY2xvc2UoKTsKKwlCVUdfT04ocmVzdWx0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJnVzYWdlX2hhY2subXV0ZXgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBwczNfb3Blbl9odl9kZXZpY2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCUJVR19PTighZGV2KTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKKworCXN3aXRjaCAoZGV2LT5tYXRjaF9pZCkgeworCWNhc2UgUFMzX01BVENIX0lEX0VIQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfT0hDSToKKwljYXNlIFBTM19NQVRDSF9JRF9HRUxJQzoKKwljYXNlIFBTM19NQVRDSF9JRF9TVE9SX0RJU0s6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ST006CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9GTEFTSDoKKwkJcmV0dXJuIHBzM19vcGVuX2h2X2RldmljZV9zYihkZXYpOworCisJY2FzZSBQUzNfTUFUQ0hfSURfU09VTkQ6CisJY2FzZSBQUzNfTUFUQ0hfSURfR1JBUEhJQ1M6CisJCXJldHVybiBwczNfb3Blbl9odl9kZXZpY2VfZ3B1KGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKKwkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+YnVzX2lkKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiB1bmtub3duIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKwlCVUcoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19vcGVuX2h2X2RldmljZSk7CisKK2ludCBwczNfY2xvc2VfaHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKK3sKKwlCVUdfT04oIWRldik7CisJcHJfZGVidWcoIiVzOiVkOiBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5tYXRjaF9pZCk7CisKKwlzd2l0Y2ggKGRldi0+bWF0Y2hfaWQpIHsKKwljYXNlIFBTM19NQVRDSF9JRF9FSENJOgorCWNhc2UgUFMzX01BVENIX0lEX09IQ0k6CisJY2FzZSBQUzNfTUFUQ0hfSURfR0VMSUM6CisJY2FzZSBQUzNfTUFUQ0hfSURfU1RPUl9ESVNLOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfUk9NOgorCWNhc2UgUFMzX01BVENIX0lEX1NUT1JfRkxBU0g6CisJCXJldHVybiBwczNfY2xvc2VfaHZfZGV2aWNlX3NiKGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9TT1VORDoKKwljYXNlIFBTM19NQVRDSF9JRF9HUkFQSElDUzoKKwkJcmV0dXJuIHBzM19jbG9zZV9odl9kZXZpY2VfZ3B1KGRldik7CisKKwljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKKwljYXNlIFBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUjoKKwkJcHJfZGVidWcoIiVzOiVkOiB1bnN1cHBvcnRlZCBtYXRjaF9pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQpOworCQlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19pZDogJXVcbiIsIF9fZnVuY19fLAorCQkJX19MSU5FX18sIGRldi0+YnVzX2lkKTsKKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJfZGVidWcoIiVzOiVkOiB1bmtub3duIG1hdGNoX2lkOiAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKKwlCVUcoKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM19jbG9zZV9odl9kZXZpY2UpOworCiAjZGVmaW5lIGR1bXBfbW1pb19yZWdpb24oX2EpIF9kdW1wX21taW9fcmVnaW9uKF9hLCBfX2Z1bmNfXywgX19MSU5FX18pCiBzdGF0aWMgdm9pZCBfZHVtcF9tbWlvX3JlZ2lvbihjb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uKiByLAogCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewotCXByX2RlYnVnKCIlczolZDogZGV2ICAgICAgICV1OiV1XG4iLCBmdW5jLCBsaW5lLCByLT5kaWQuYnVzX2lkLAotCQlyLT5kaWQuZGV2X2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IGRldiAgICAgICAldToldVxuIiwgZnVuYywgbGluZSwgci0+ZGV2LT5idXNfaWQsCisJCXItPmRldi0+ZGV2X2lkKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGJ1c19hZGRyICAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5idXNfYWRkcik7CiAJcHJfZGVidWcoIiVzOiVkOiBsZW4gICAgICAgJWx4aFxuIiwgZnVuYywgbGluZSwgci0+bGVuKTsKIAlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXJfYWRkciAlbHhoXG4iLCBmdW5jLCBsaW5lLCByLT5scGFyX2FkZHIpOwogfQogCi1pbnQgcHMzX21taW9fcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQorc3RhdGljIGludCBwczNfc2JfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV9tYXBfZGV2aWNlX21taW9fcmVnaW9uKHItPmRpZC5idXNfaWQsIHItPmRpZC5kZXZfaWQsCisJcmVzdWx0ID0gbHYxX21hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5idXNfYWRkciwgci0+bGVuLCByLT5wYWdlX3NpemUsICZyLT5scGFyX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNTcsMTMgKzI2MywyNiBAQAogCWR1bXBfbW1pb19yZWdpb24ocik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KKworc3RhdGljIGludCBwczNfaW9jMF9tbWlvX3JlZ2lvbl9jcmVhdGUoc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwkvKiBkZXZpY2Ugc3BlY2lmaWM7IGRvIG5vdGhpbmcgY3VycmVudGx5ICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwczNfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCit7CisJcmV0dXJuIHItPm1taW9fb3BzLT5jcmVhdGUocik7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChwczNfbW1pb19yZWdpb25fY3JlYXRlKTsKIAotaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCitzdGF0aWMgaW50IHBzM19zYl9mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpCiB7CiAJaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGlkLmJ1c19pZCwgci0+ZGlkLmRldl9pZCwKKwlkdW1wX21taW9fcmVnaW9uKHIpOworOworCXJlc3VsdCA9IGx2MV91bm1hcF9kZXZpY2VfbW1pb19yZWdpb24oci0+ZGV2LT5idXNfaWQsIHItPmRldi0+ZGV2X2lkLAogCQlyLT5scGFyX2FkZHIpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTczLDE0ICsyOTIsNjAgQEAKIAlyLT5scGFyX2FkZHIgPSAwOwogCXJldHVybiByZXN1bHQ7CiB9CisKK3N0YXRpYyBpbnQgcHMzX2lvYzBfZnJlZV9tbWlvX3JlZ2lvbihzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyKQoreworCS8qIGRldmljZSBzcGVjaWZpYzsgZG8gbm90aGluZyBjdXJyZW50bHkgKi8KKwlyZXR1cm4gMDsKK30KKworCitpbnQgcHMzX2ZyZWVfbW1pb19yZWdpb24oc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gci0+bW1pb19vcHMtPmZyZWUocik7Cit9CisKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM19mcmVlX21taW9fcmVnaW9uKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHBzM19tbWlvX3NiX3JlZ2lvbl9vcHMgPSB7CisJLmNyZWF0ZSA9IHBzM19zYl9tbWlvX3JlZ2lvbl9jcmVhdGUsCisJLmZyZWUgPSBwczNfc2JfZnJlZV9tbWlvX3JlZ2lvbgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzIHBzM19tbWlvX2lvYzBfcmVnaW9uX29wcyA9IHsKKwkuY3JlYXRlID0gcHMzX2lvYzBfbW1pb19yZWdpb25fY3JlYXRlLAorCS5mcmVlID0gcHMzX2lvYzBfZnJlZV9tbWlvX3JlZ2lvbgorfTsKKworaW50IHBzM19tbWlvX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyLCB1bnNpZ25lZCBsb25nIGJ1c19hZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwllbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemUpCit7CisJci0+ZGV2ID0gZGV2OworCXItPmJ1c19hZGRyID0gYnVzX2FkZHI7CisJci0+bGVuID0gbGVuOworCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9TQjoKKwkJci0+bW1pb19vcHMgPSAmcHMzX21taW9fc2JfcmVnaW9uX29wczsKKwkJYnJlYWs7CisJY2FzZSBQUzNfREVWSUNFX1RZUEVfSU9DMDoKKwkJci0+bW1pb19vcHMgPSAmcHMzX21taW9faW9jMF9yZWdpb25fb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX21taW9fcmVnaW9uX2luaXQpOworCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKl9kZXYsCiAJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPSB0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rydik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydiA9IHBzM19kcnZfdG9fc3lzdGVtX2J1c19kcnYoX2Rydik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAogCXJlc3VsdCA9IGRldi0+bWF0Y2hfaWQgPT0gZHJ2LT5tYXRjaF9pZDsKIApAQCAtOTIsMzIgKzM1NywxNCBAQAogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7Ci0JaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2ID0KLQkJdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKF9kZXYtPmRyaXZlcik7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnY7CiAKLQlyZXN1bHQgPSBsdjFfb3Blbl9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQsIDApOworCUJVR19PTighZGV2KTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIF9kZXYtPmJ1c19pZCk7CiAKLQlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZDogbHYxX29wZW5fZGV2aWNlIGZhaWxlZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQlyZXN1bHQgPSAtRUFDQ0VTOwotCQlnb3RvIGNsZWFuX25vbmU7Ci0JfQotCi0JaWYgKGRldi0+ZF9yZWdpb24tPmRpZC5idXNfaWQpIHsKLQkJcmVzdWx0ID0gcHMzX2RtYV9yZWdpb25fY3JlYXRlKGRldi0+ZF9yZWdpb24pOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9yZWdpb25fY3JlYXRlIGZhaWxlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKLQkJCUJVR19PTigiY2hlY2sgcmVnaW9uIHR5cGUiKTsKLQkJCXJlc3VsdCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFuX2RldmljZTsKLQkJfQotCX0KLQorCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b19zeXN0ZW1fYnVzX2RydihkZXYpOwogCUJVR19PTighZHJ2KTsKIAogCWlmIChkcnYtPnByb2JlKQpAQCAtMTI2LDU2ICszNzMsMTI3IEBACiAJCXByX2luZm8oIiVzOiVkOiAlcyBubyBwcm9iZSBtZXRob2RcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCWRldi0+Y29yZS5idXNfaWQpOwogCi0JaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGRydi0+cHJvYmUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlnb3RvIGNsZWFuX2RtYTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi1jbGVhbl9kbWE6Ci0JcHMzX2RtYV9yZWdpb25fZnJlZShkZXYtPmRfcmVnaW9uKTsKLWNsZWFuX2RldmljZToKLQlsdjFfY2xvc2VfZGV2aWNlKGRldi0+ZGlkLmJ1c19pZCwgZGV2LT5kaWQuZGV2X2lkKTsKLWNsZWFuX25vbmU6CisJcHJfaW5mbygiIDwtICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHBzM19zeXN0ZW1fYnVzX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyICpkcnYgPQotCQl0b19wczNfc3lzdGVtX2J1c19kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKwlwcl9pbmZvKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIF9kZXYtPmJ1c19pZCk7CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKKwlCVUdfT04oIWRydik7CiAKIAlpZiAoZHJ2LT5yZW1vdmUpCi0JCWRydi0+cmVtb3ZlKGRldik7CisJCXJlc3VsdCA9IGRydi0+cmVtb3ZlKGRldik7CiAJZWxzZQotCQlwcl9pbmZvKCIlczolZDogJXMgbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkJZGV2LT5jb3JlLmJ1c19pZCk7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyByZW1vdmUgbWV0aG9kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAKLQlwczNfZG1hX3JlZ2lvbl9mcmVlKGRldi0+ZF9yZWdpb24pOwotCXBzM19mcmVlX21taW9fcmVnaW9uKGRldi0+bV9yZWdpb24pOwotCWx2MV9jbG9zZV9kZXZpY2UoZGV2LT5kaWQuYnVzX2lkLCBkZXYtPmRpZC5kZXZfaWQpOworCXByX2luZm8oIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5jb3JlLmJ1c19pZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KIAorc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXJldHVybjsKKwl9CisKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fc3lzdGVtX2J1c19kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlcyAtPiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPmNvcmUuYnVzX2lkLCBkcnYtPmNvcmUubmFtZSk7CisKKwlpZiAoZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihkZXYpOworCWVsc2UgaWYgKGRydi0+cmVtb3ZlKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkICVzOiBubyBzaHV0ZG93biwgY2FsbGluZyByZW1vdmVcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKwkJZHJ2LT5yZW1vdmUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCAlczogbm8gc2h1dGRvd24gbWV0aG9kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CisJCUJVRygpOworCX0KKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKK30KKworc3RhdGljIGludCBwczNfc3lzdGVtX2J1c191ZXZlbnQoc3RydWN0IGRldmljZSAqX2RldiwgY2hhciAqKmVudnAsCisJCQkJIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgaSA9IDAsIGxlbmd0aCA9IDA7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLAorCQkJICAgJmxlbmd0aCwgIk1PREFMSUFTPXBzMzolZCIsCisJCQkgICBkZXYtPm1hdGNoX2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnZwW2ldID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYSwKKwljaGFyICpidWYpCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgbGVuID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJwczM6JWRcbiIsIGRldi0+bWF0Y2hfaWQpOworCisJcmV0dXJuIChsZW4gPj0gUEFHRV9TSVpFKSA/IChQQUdFX1NJWkUgLSAxKSA6IGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBzM19zeXN0ZW1fYnVzX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhtb2RhbGlhcyksCisJX19BVFRSX05VTEwsCit9OworCiBzdHJ1Y3QgYnVzX3R5cGUgcHMzX3N5c3RlbV9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJwczNfc3lzdGVtX2J1cyIsCiAJLm1hdGNoID0gcHMzX3N5c3RlbV9idXNfbWF0Y2gsCisJLnVldmVudCA9IHBzM19zeXN0ZW1fYnVzX3VldmVudCwKIAkucHJvYmUgPSBwczNfc3lzdGVtX2J1c19wcm9iZSwKIAkucmVtb3ZlID0gcHMzX3N5c3RlbV9idXNfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHBzM19zeXN0ZW1fYnVzX3NodXRkb3duLAorCS5kZXZfYXR0cnMgPSBwczNfc3lzdGVtX2J1c19kZXZfYXR0cnMsCiB9OwogCi1pbnQgX19pbml0IHBzM19zeXN0ZW1fYnVzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zeXN0ZW1fYnVzX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OwogCiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwltdXRleF9pbml0KCZ1c2FnZV9oYWNrLm11dGV4KTsKKworCXJlc3VsdCA9IGRldmljZV9yZWdpc3RlcigmcHMzX3N5c3RlbV9idXMpOworCUJVR19PTihyZXN1bHQpOworCiAJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZwczNfc3lzdGVtX2J1c190eXBlKTsKIAlCVUdfT04ocmVzdWx0KTsKKworCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTg1LDE2ICs1MDMsMTMgQEAKICAqIFJldHVybnMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGFuZCBzZXRzIGRtYV9oYW5kbGUKICAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCiAgKi8KLQogc3RhdGljIHZvaWQgKiBwczNfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsCi0JZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKKwkJCQkgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHI7CiAKLQlCVUdfT04oIWRldi0+ZF9yZWdpb24tPmJ1c19hZGRyKTsKLQogCWZsYWcgJj0gfihfX0dGUF9ETUEgfCBfX0dGUF9ISUdITUVNKTsKIAlmbGFnIHw9IF9fR0ZQX1pFUk87CiAKQEAgLTIwNSw3ICs1MjAsOCBAQAogCQlnb3RvIGNsZWFuX25vbmU7CiAJfQogCi0JcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgdmlydF9hZGRyLCBzaXplLCBkbWFfaGFuZGxlKTsKKwlyZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLCB2aXJ0X2FkZHIsIHNpemUsIGRtYV9oYW5kbGUsCisJCQkgICAgIElPUFRFX1BQX1cgfCBJT1BURV9QUF9SIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTIyNiw3ICs1NDIsNyBAQAogc3RhdGljIHZvaWQgcHMzX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqX2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAogCXBzM19kbWFfdW5tYXAoZGV2LT5kX3JlZ2lvbiwgZG1hX2hhbmRsZSwgc2l6ZSk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKQEAgLTIzOSwxNSArNTU1LDE2IEBACiAgKiBieXRlIHdpdGhpbiB0aGUgcGFnZSBhcyB2YWRkci4KICAqLwogCi1zdGF0aWMgZG1hX2FkZHJfdCBwczNfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpfZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorc3RhdGljIGRtYV9hZGRyX3QgcHMzX3NiX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2Rldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0Jc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKF9kZXYpOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHBzM19kZXZfdG9fc3lzdGVtX2J1c19kZXYoX2Rldik7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCiAJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAotCQkmYnVzX2FkZHIpOworCQkJICAgICAmYnVzX2FkZHIsCisJCQkgICAgIElPUFRFX1BQX1IgfCBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlcgfCBJT1BURV9NKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoIiVzOiVkOiBwczNfZG1hX21hcCBmYWlsZWQgKCVkKVxuIiwKQEAgLTI1NywxMCArNTc0LDQ0IEBACiAJcmV0dXJuIGJ1c19hZGRyOwogfQogCitzdGF0aWMgZG1hX2FkZHJfdCBwczNfaW9jMF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHZvaWQgKnB0ciwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKKwlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgYnVzX2FkZHI7CisJdTY0IGlvcHRlX2ZsYWc7CisKKwlpb3B0ZV9mbGFnID0gSU9QVEVfTTsKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCWNhc2UgRE1BX0JJRElSRUNUSU9OQUw6CisJCWlvcHRlX2ZsYWcgfD0gSU9QVEVfUFBfUiB8IElPUFRFX1BQX1cgfCBJT1BURV9TT19SVzsKKwkJYnJlYWs7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlpb3B0ZV9mbGFnIHw9IElPUFRFX1BQX1IgfCBJT1BURV9TT19SOworCQlicmVhazsKKwljYXNlIERNQV9GUk9NX0RFVklDRToKKwkJaW9wdGVfZmxhZyB8PSBJT1BURV9QUF9XIHwgSU9QVEVfU09fUlc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5vdCBoYXBwbmVkICovCisJCUJVRygpOworCX07CisJcmVzdWx0ID0gcHMzX2RtYV9tYXAoZGV2LT5kX3JlZ2lvbiwgKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLAorCQkJICAgICAmYnVzX2FkZHIsIGlvcHRlX2ZsYWcpOworCisJaWYgKHJlc3VsdCkgeworCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM19kbWFfbWFwIGZhaWxlZCAoJWQpXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOworCX0KKwlyZXR1cm4gYnVzX2FkZHI7Cit9CisKIHN0YXRpYyB2b2lkIHBzM191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqX2RldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKIAlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSBwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KF9kZXYpOwogCWludCByZXN1bHQ7CiAKIAlyZXN1bHQgPSBwczNfZG1hX3VubWFwKGRldi0+ZF9yZWdpb24sIGRtYV9hZGRyLCBzaXplKTsKQEAgLTI3MSwyMCArNjIyLDIwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHBzM19tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorc3RhdGljIGludCBwczNfc2JfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfUFMzX0RZTkFNSUNfRE1BKQogCUJVR19PTigiZG8iKTsKIAlyZXR1cm4gLUVQRVJNOwogI2Vsc2UKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CiAJCWludCByZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLAogCQkJcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsCi0JCQkmc2ctPmRtYV9hZGRyZXNzKTsKKwkJCQkJICZzZy0+ZG1hX2FkZHJlc3MsIDApOwogCiAJCWlmIChyZXN1bHQpIHsKIAkJCXByX2RlYnVnKCIlczolZDogcHMzX2RtYV9tYXAgZmFpbGVkICglZClcbiIsCkBAIC0yOTksNyArNjUwLDE1IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgcHMzX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCitzdGF0aWMgaW50IHBzM19pb2MwX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgaW50IG5lbnRzLAorCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVRygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwczNfc2JfdW5tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCkBAIC0zMDcsMTggKzY2NiwzNCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB2b2lkIHBzM19pb2MwX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHKCk7Cit9CisKIHN0YXRpYyBpbnQgcHMzX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqX2RldiwgdTY0IG1hc2spCiB7CiAJcmV0dXJuIG1hc2sgPj0gRE1BXzMyQklUX01BU0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBzM19kbWFfb3BzID0geworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX3NiX2RtYV9vcHMgPSB7CiAJLmFsbG9jX2NvaGVyZW50ID0gcHMzX2FsbG9jX2NvaGVyZW50LAogCS5mcmVlX2NvaGVyZW50ID0gcHMzX2ZyZWVfY29oZXJlbnQsCi0JLm1hcF9zaW5nbGUgPSBwczNfbWFwX3NpbmdsZSwKKwkubWFwX3NpbmdsZSA9IHBzM19zYl9tYXBfc2luZ2xlLAogCS51bm1hcF9zaW5nbGUgPSBwczNfdW5tYXBfc2luZ2xlLAotCS5tYXBfc2cgPSBwczNfbWFwX3NnLAotCS51bm1hcF9zZyA9IHBzM191bm1hcF9zZywKKwkubWFwX3NnID0gcHMzX3NiX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfc2JfdW5tYXBfc2csCisJLmRtYV9zdXBwb3J0ZWQgPSBwczNfZG1hX3N1cHBvcnRlZAorfTsKKworc3RhdGljIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgcHMzX2lvYzBfZG1hX29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBwczNfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgPSBwczNfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZSA9IHBzM19pb2MwX21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZSA9IHBzM191bm1hcF9zaW5nbGUsCisJLm1hcF9zZyA9IHBzM19pb2MwX21hcF9zZywKKwkudW5tYXBfc2cgPSBwczNfaW9jMF91bm1hcF9zZywKIAkuZG1hX3N1cHBvcnRlZCA9IHBzM19kbWFfc3VwcG9ydGVkCiB9OwogCkBAIC0zMjgsNyArNzAzLDcgQEAKIAogc3RhdGljIHZvaWQgcHMzX3N5c3RlbV9idXNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqX2RldikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0gcHMzX2Rldl90b19zeXN0ZW1fYnVzX2RldihfZGV2KTsKIAlrZnJlZShkZXYpOwogfQogCkBAIC0zNDMsMTggKzcxOCwzNyBAQAogaW50IHBzM19zeXN0ZW1fYnVzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9jb3VudCA9IDE7CisJc3RhdGljIHVuc2lnbmVkIGludCBkZXZfaW9jMF9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl9zYl9jb3VudDsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRldl92dWFydF9jb3VudDsKIAotCWRldi0+Y29yZS5wYXJlbnQgPSBOVUxMOworCWlmICghZGV2LT5jb3JlLnBhcmVudCkKKwkJZGV2LT5jb3JlLnBhcmVudCA9ICZwczNfc3lzdGVtX2J1czsKIAlkZXYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CiAJZGV2LT5jb3JlLnJlbGVhc2UgPSBwczNfc3lzdGVtX2J1c19yZWxlYXNlX2RldmljZTsKIAotCWRldi0+Y29yZS5hcmNoZGF0YS5vZl9ub2RlID0gTlVMTDsKLQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfZG1hX29wczsKLQlkZXYtPmNvcmUuYXJjaGRhdGEubnVtYV9ub2RlID0gMDsKKwlzd2l0Y2ggKGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9JT0MwOgorCQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfaW9jMF9kbWFfb3BzOworCQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksCisJCQkiaW9jMF8lMDJ4IiwgKytkZXZfaW9jMF9jb3VudCk7CisJCWJyZWFrOworCWNhc2UgUFMzX0RFVklDRV9UWVBFX1NCOgorCQlkZXYtPmNvcmUuYXJjaGRhdGEuZG1hX29wcyA9ICZwczNfc2JfZG1hX29wczsKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJInNiXyUwMngiLCArK2Rldl9zYl9jb3VudCk7CiAKLQlzbnByaW50ZihkZXYtPmNvcmUuYnVzX2lkLCBzaXplb2YoZGV2LT5jb3JlLmJ1c19pZCksICJzYl8lMDJ4IiwKLQkJZGV2X2NvdW50KyspOworCQlicmVhazsKKwljYXNlIFBTM19ERVZJQ0VfVFlQRV9WVUFSVDoKKwkJc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLAorCQkJInZ1YXJ0XyUwMngiLCArK2Rldl92dWFydF9jb3VudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX07CisKKwlkZXYtPmNvcmUuYXJjaGRhdGEub2Zfbm9kZSA9IE5VTEw7CisJZGV2LT5jb3JlLmFyY2hkYXRhLm51bWFfbm9kZSA9IDA7CiAKIAlwcl9kZWJ1ZygiJXM6JWQgYWRkICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+Y29yZS5idXNfaWQpOwogCkBAIC0zNjgsOSArNzYyLDE1IEBACiB7CiAJaW50IHJlc3VsdDsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKKworCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlkcnYtPmNvcmUuYnVzID0gJnBzM19zeXN0ZW1fYnVzX3R5cGU7CiAKIAlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM3OCw3ICs3NzgsOSBAQAogCiB2b2lkIHBzM19zeXN0ZW1fYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKmRydikKIHsKKwlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBkcnYtPmNvcmUubmFtZSk7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiA8LSAlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy90aW1lLmMKaW5kZXggMWJhZThiMS4uODAyYTljYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvdGltZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3RpbWUuYwpAQCAtMzksNyArMzksNyBAQAogfQogCiAjZGVmaW5lIGR1bXBfdGltZShfYSkgX2R1bXBfdGltZShfYSwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3RpbWUoaW50IHRpbWUsIGNvbnN0IGNoYXIqIGZ1bmMsCitzdGF0aWMgdm9pZCBfX21heWJlX3VudXNlZCBfZHVtcF90aW1lKGludCB0aW1lLCBjb25zdCBjaGFyICpmdW5jLAogCWludCBsaW5lKQogewogCXN0cnVjdCBydGNfdGltZSB0bTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQppbmRleCBhZTFmYzkyLi45OTJiYTY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KIG9iai0kKENPTkZJR19YSUNTKQkrPSB4aWNzLm8KIG9iai0kKENPTkZJR19TQ0FOTE9HKQkrPSBzY2FubG9nLm8KLW9iai0kKENPTkZJR19FRUgpCSs9IGVlaC5vIGVlaF9jYWNoZS5vIGVlaF9kcml2ZXIubyBlZWhfZXZlbnQubworb2JqLSQoQ09ORklHX0VFSCkJKz0gZWVoLm8gZWVoX2NhY2hlLm8gZWVoX2RyaXZlci5vIGVlaF9ldmVudC5vIGVlaF9zeXNmcy5vCiBvYmotJChDT05GSUdfS0VYRUMpCSs9IGtleGVjLm8KIG9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaV9kbHBhci5vCiBvYmotJChDT05GSUdfUENJX01TSSkJKz0gbXNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWguYwppbmRleCA1ZjNlNmQ4Li5iODc3MDM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKICAqIGVlaC5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2ZSBFbmdlYnJldHNlbiAmIFRvZGQgSW5nbGV0dCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMSwgMjAwNSwgMjAwNgorICogQ29weXJpZ2h0IERhdmUgRW5nZWJyZXRzZW4gJiBUb2RkIEluZ2xldHQgMjAwMQorICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgMjAwNSwgMjAwNgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTUsNiArMTcsOCBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBQbGVhc2UgYWRkcmVzcyBjb21tZW50cyBhbmQgZmVlZGJhY2sgdG8gTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMTcsNyArMTIxLDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfY2hlY2s7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9tbWlvX2ZmczsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZhbHNlX3Bvc2l0aXZlczsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlnbm9yZWRfZmFpbHVyZXM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzbG90X3Jlc2V0czsKIAogI2RlZmluZSBJU19CUklER0UoY2xhc3NfY29kZSkgKCgoY2xhc3NfY29kZSk8PDE2KSA9PSBQQ0lfQkFTRV9DTEFTU19CUklER0UpCkBAIC01MDUsNiArNTA4LDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVIOiByZWFkX3Nsb3RfcmVzZXRfc3RhdGUoKSBmYWlsZWQ7IHJjPSVkIGRuPSVzXG4iLAogCQkgICAgICAgcmV0LCBkbi0+ZnVsbF9uYW1lKTsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC01MTMsNiArNTE3LDcgQEAKIAkgKiB0aGV5IGFyZSBlbXB0eSB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSBjaGlsZHJlbi4gKi8KIAlpZiAoKHJldHNbMF0gPT0gNSkgJiYgKGRuLT5jaGlsZCA9PSBOVUxMKSkgewogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyMiw2ICs1MjcsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRUg6IGV2ZW50IG9uIHVuc3VwcG9ydGVkIGRldmljZSwgcmM9JWQgZG49JXNcbiIsCiAJCSAgICAgICByZXQsIGRuLT5mdWxsX25hbWUpOwogCQlmYWxzZV9wb3NpdGl2ZXMrKzsKKwkJcGRuLT5lZWhfZmFsc2VfcG9zaXRpdmVzICsrOwogCQlyYyA9IDA7CiAJCWdvdG8gZG5fdW5sb2NrOwogCX0KQEAgLTUyOSw2ICs1MzUsNyBAQAogCS8qIElmIG5vdCB0aGUga2luZCBvZiBlcnJvciB3ZSBrbm93IGFib3V0LCBwdW50LiAqLwogCWlmIChyZXRzWzBdICE9IDEgJiYgcmV0c1swXSAhPSAyICYmIHJldHNbMF0gIT0gNCAmJiByZXRzWzBdICE9IDUpIHsKIAkJZmFsc2VfcG9zaXRpdmVzKys7CisJCXBkbi0+ZWVoX2ZhbHNlX3Bvc2l0aXZlcyArKzsKIAkJcmMgPSAwOwogCQlnb3RvIGRuX3VubG9jazsKIAl9CkBAIC05MjEsNiArOTI4LDcgQEAKIAlwZG4tPmVlaF9tb2RlID0gMDsKIAlwZG4tPmVlaF9jaGVja19jb3VudCA9IDA7CiAJcGRuLT5lZWhfZnJlZXplX2NvdW50ID0gMDsKKwlwZG4tPmVlaF9mYWxzZV9wb3NpdGl2ZXMgPSAwOwogCiAJaWYgKHN0YXR1cyAmJiBzdHJjbXAoc3RhdHVzLCAib2siKSAhPSAwKQogCQlyZXR1cm4gTlVMTDsJLyogaWdub3JlIGRldmljZXMgd2l0aCBiYWQgc3RhdHVzICovCkBAIC0xMTM5LDcgKzExNDcsOCBAQAogCXBkbiA9IFBDSV9ETihkbik7CiAJcGRuLT5wY2lkZXYgPSBkZXY7CiAKLQlwY2lfYWRkcl9jYWNoZV9pbnNlcnRfZGV2aWNlIChkZXYpOworCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfYWRkX2RldmljZShkZXYpOwogfQogCiB2b2lkIGVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQpAQCAtMTE3OCw2ICsxMTg3LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiRUVIOiByZW1vdmUgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKICNlbmRpZgogCXBjaV9hZGRyX2NhY2hlX3JlbW92ZV9kZXZpY2UoZGV2KTsKKwllZWhfc3lzZnNfcmVtb3ZlX2RldmljZShkZXYpOwogCiAJZG4gPSBwY2lfZGV2aWNlX3RvX09GX25vZGUoZGV2KTsKIAlpZiAoUENJX0ROKGRuKS0+cGNpZGV2KSB7CkBAIC0xMjE0LDExICsxMjI0LDEwIEBACiAJCQkJImNoZWNrIG5vdCB3YW50ZWQ9JWxkXG4iCiAJCQkJImVlaF90b3RhbF9tbWlvX2Zmcz0lbGRcbiIKIAkJCQkiZWVoX2ZhbHNlX3Bvc2l0aXZlcz0lbGRcbiIKLQkJCQkiZWVoX2lnbm9yZWRfZmFpbHVyZXM9JWxkXG4iCiAJCQkJImVlaF9zbG90X3Jlc2V0cz0lbGRcbiIsCiAJCQkJbm9fZGV2aWNlLCBub19kbiwgbm9fY2ZnX2FkZHIsIAogCQkJCWlnbm9yZWRfY2hlY2ssIHRvdGFsX21taW9fZmZzLCAKLQkJCQlmYWxzZV9wb3NpdGl2ZXMsIGlnbm9yZWRfZmFpbHVyZXMsIAorCQkJCWZhbHNlX3Bvc2l0aXZlcywKIAkJCQlzbG90X3Jlc2V0cyk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKaW5kZXggZjJiYWUwNC4uZTQ5YzgxNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMiw3ICsyLDggQEAKICAqIGVlaF9jYWNoZS5jCiAgKiBQQ0kgYWRkcmVzcyBjYWNoZTsgYWxsb3dzIHRoZSBsb29rdXAgb2YgUENJIGRldmljZXMgYmFzZWQgb24gSS9PIGFkZHJlc3MKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IElCTSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA0CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAYXVzdGluLmlibS5jb20+IDIwMDQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI5NSw2ICsyOTYsOCBAQAogCQkJY29udGludWU7CiAJCXBjaV9kZXZfZ2V0IChkZXYpOyAgLyogbWF0Y2hpbmcgcHV0IGlzIGluIGVlaF9yZW1vdmVfZGV2aWNlKCkgKi8KIAkJUENJX0ROKGRuKS0+cGNpZGV2ID0gZGV2OworCisJCWVlaF9zeXNmc19hZGRfZGV2aWNlKGRldik7CiAJfQogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCmluZGV4IDE2MWE1ODQuLjE1ZTAxNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBQQ0kgRXJyb3IgUmVjb3ZlcnkgRHJpdmVyIGZvciBSUEEtY29tcGxpYW50IFBQQzY0IHBsYXRmb3JtLgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IExpbmFzIFZlcHN0YXMgPGxpbmFzQGxpbmFzLm9yZz4KKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCAyMDA1CisgKiBDb3B5cmlnaHQgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPiAyMDA0LCAyMDA1CiAgKgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0xOSw4ICsyMCw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogU2VuZCBmZWVkYmFjayB0byA8bGluYXNAdXMuaWJtLmNvbT4KLSAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMTNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfc3lzZnMuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogU3lzZnMgZW50cmllcyBmb3IgUENJIEVycm9yIFJlY292ZXJ5IGZvciBQQVBSLWNvbXBsaWFudCBwbGF0Zm9ybS4KKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNworICogQ29weXJpZ2h0IExpbmFzIFZlcHN0YXMgPGxpbmFzQGF1c3Rpbi5pYm0uY29tPiAyMDA3CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBTZW5kIGNvbW1lbnRzIGFuZCBmZWVkYmFjayB0byBMaW5hcyBWZXBzdGFzIDxsaW5hc0BhdXN0aW4uaWJtLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKy8qKgorICogRUVIX1NIT1dfQVRUUiAtLSBjcmVhdGUgc3lzZnMgZW50cnkgZm9yIGVlaCBzdGF0aXN0aWMKKyAqIEBfbmFtZTogbmFtZSBvZiBmaWxlIGluIHN5c2ZzIGRpcmVjdG9yeQorICogQF9tZW1iOiBuYW1lIG9mIG1lbWJlciBpbiBzdHJ1Y3QgcGNpX2RuIHRvIGFjY2VzcworICogQF9mb3JtYXQ6IHByaW50ZiBmb3JtYXQgZm9yIGRpc3BsYXkKKyAqCisgKiBBbGwgb2YgdGhlIGF0dHJpYnV0ZXMgbG9vayB2ZXJ5IHNpbWlsYXIsIHNvIGp1c3QKKyAqIGF1dG8tZ2VuIGEgY3V0LW4tcGFzdGUgcm91dGluZSB0byBkaXNwbGF5IHRoZW0uCisgKi8KKyNkZWZpbmUgRUVIX1NIT1dfQVRUUihfbmFtZSxfbWVtYixfZm9ybWF0KSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGVlaF9zaG93XyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCAgICAgIFwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOyAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGNpX2RldmljZV90b19PRl9ub2RlKHBkZXYpOyBcCisJc3RydWN0IHBjaV9kbiAqcGRuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIWRuIHx8IFBDSV9ETihkbikgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcGRuID0gUENJX0ROKGRuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgX2Zvcm1hdCAiXG4iLCBwZG4tPl9tZW1iKTsgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgU19JUlVHTywgZWVoX3Nob3dfIyNfbmFtZSwgTlVMTCk7CisKKworRUVIX1NIT1dfQVRUUihlZWhfbW9kZSwgZWVoX21vZGUsICIweCV4Iik7CitFRUhfU0hPV19BVFRSKGVlaF9jb25maWdfYWRkciwgZWVoX2NvbmZpZ19hZGRyLCAiMHgleCIpOworRUVIX1NIT1dfQVRUUihlZWhfcGVfY29uZmlnX2FkZHIsIGVlaF9wZV9jb25maWdfYWRkciwgIjB4JXgiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2NoZWNrX2NvdW50LCBlZWhfY2hlY2tfY291bnQsICIlZCIpOworRUVIX1NIT1dfQVRUUihlZWhfZnJlZXplX2NvdW50LCBlZWhfZnJlZXplX2NvdW50LCAiJWQiKTsKK0VFSF9TSE9XX0FUVFIoZWVoX2ZhbHNlX3Bvc2l0aXZlcywgZWVoX2ZhbHNlX3Bvc2l0aXZlcywgIiVkIik7CisKK3ZvaWQgZWVoX3N5c2ZzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJjPTA7CisKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJcmMgKz0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlyYyArPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCXJjICs9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVFSDogVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBlbnRyaWVzXG4iKTsKK30KKwordm9pZCBlZWhfc3lzZnNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9tb2RlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9jb25maWdfYWRkcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9lZWhfcGVfY29uZmlnX2FkZHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2NoZWNrX2NvdW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2VlaF9mYWxzZV9wb3NpdGl2ZXMpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZWVoX2ZyZWV6ZV9jb3VudCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IDM2MmRmYmMuLjhjYzZlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMzczLDEyICszNzMsMjMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHNpemVfYnl0ZXMgPSAxVUwgPDwgcHBjNjRfcGZ0X3NpemU7CiAJdW5zaWduZWQgbG9uZyBocHRlX2NvdW50ID0gc2l6ZV9ieXRlcyA+PiA0OwotCXVuc2lnbmVkIGxvbmcgZHVtbXkxLCBkdW1teTI7CisJdW5zaWduZWQgbG9uZyBkdW1teTEsIGR1bW15MiwgZHdvcmQwOworCWxvbmcgbHBhcl9yYzsKIAlpbnQgaTsKIAogCS8qIFRPRE86IFVzZSBidWxrIGNhbGwgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKQotCQlwbHBhcl9wdGVfcmVtb3ZlX3JhdygwLCBpLCAwLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwlmb3IgKGkgPSAwOyBpIDwgaHB0ZV9jb3VudDsgaSsrKSB7CisJCS8qIGRvbnQgcmVtb3ZlIEhQVEVzIHdpdGggVlJNQSBtYXBwaW5ncyAqLworCQlscGFyX3JjID0gcGxwYXJfcHRlX3JlbW92ZV9yYXcoSF9BTkRDT05ELCBpLCBIUFRFX1ZfMVRCX1NFRywKKwkJCQkJCSZkdW1teTEsICZkdW1teTIpOworCQlpZiAobHBhcl9yYyA9PSBIX05PVF9GT1VORCkgeworCQkJbHBhcl9yYyA9IHBscGFyX3B0ZV9yZWFkX3JhdygwLCBpLCAmZHdvcmQwLCAmZHVtbXkxKTsKKwkJCWlmICghbHBhcl9yYyAmJiAoKGR3b3JkMCAmIEhQVEVfVl9WUk1BX01BU0spCisJCQkJIT0gSFBURV9WX1ZSTUFfTUFTSykpCisJCQkJLyogQ2FuIGJlIGhwdGUgZm9yIDFUQiBTZWcuIFNvIHJlbW92ZSBpdCAqLworCQkJCXBscGFyX3B0ZV9yZW1vdmVfcmF3KDAsIGksIDAsICZkdW1teTEsICZkdW1teTIpOworCQl9CisJfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCmluZGV4IGZmYWY2YzUuLjQ3ZjBlMDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKQEAgLTExMCw4ICsxMTAsNiBAQAogCQkJfQogCQl9CiAJfQotCi0JZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyk7CiAKQEAgLTEzOSw2ICsxMzcsOCBAQAogCiAJLyogTWFrZSB0aGUgZGlzY292ZXJlZCBkZXZpY2VzIGF2YWlsYWJsZSAqLwogCXBjaV9idXNfYWRkX2RldmljZXMoY2hpbGRfYnVzKTsKKworCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShjaGlsZF9idXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsNiArMTcxLDcgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZidXMtPmRldmljZXMpKSB7CiAJCQlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhidXMsIDApOwogCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCQkJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKGJ1cyk7CiAJCX0KIAl9IGVsc2UgaWYgKG1vZGUgPT0gUENJX1BST0JFX05PUk1BTCkgewogCQkvKiB1c2UgbGVnYWN5IHByb2JlICovCkBAIC0xNzksNiArMTgwLDcgQEAKIAkJaWYgKG51bSkgewogCQkJcGNpYmlvc19maXh1cF9uZXdfcGNpX2RldmljZXMoYnVzLCAxKTsKIAkJCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwkJCWVlaF9hZGRfZGV2aWNlX3RyZWVfbGF0ZShidXMpOwogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQpAQCAtMjAwLDggKzIwMiw2IEBACiAJcnRhc19zZXR1cF9waGIocGhiKTsKIAlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHBoYiwgZG4sIDApOwogCi0JcGNpX3NldHVwX3BoYl9pb19keW5hbWljKHBoYiwgcHJpbWFyeSk7Ci0KIAlwY2lfZGV2c19waGJfaW5pdF9keW5hbWljKHBoYik7CiAKIAlpZiAoZG4tPmNoaWxkKQpAQCAtMjEwLDYgKzIxMCw3IEBACiAJc2Nhbl9waGIocGhiKTsKIAlwY2liaW9zX2ZpeHVwX25ld19wY2lfZGV2aWNlcyhwaGItPmJ1cywgMCk7CiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CisJZWVoX2FkZF9kZXZpY2VfdHJlZV9sYXRlKHBoYi0+YnVzKTsKIAogCXJldHVybiBwaGI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGxwYXJfd3JhcHBlcnMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCmluZGV4IDJlNGQxMGMuLmQwMDNjODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wbHBhcl93cmFwcGVycy5oCkBAIC0xMDgsNiArMTA4LDIxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKiBwbHBhcl9wdGVfcmVhZF9yYXcgY2FuIGJlIGNhbGxlZCBpbiByZWFsIG1vZGUuIEl0IGNhbGxzIHBscGFyX2hjYWxsX3JhdyAqLworc3RhdGljIGlubGluZSBsb25nIHBscGFyX3B0ZV9yZWFkX3Jhdyh1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIHB0ZXgsCisJCXVuc2lnbmVkIGxvbmcgKm9sZF9wdGVoX3JldCwgdW5zaWduZWQgbG9uZyAqb2xkX3B0ZWxfcmV0KQoreworCWxvbmcgcmM7CisJdW5zaWduZWQgbG9uZyByZXRidWZbUExQQVJfSENBTExfQlVGU0laRV07CisKKwlyYyA9IHBscGFyX2hjYWxsX3JhdyhIX1JFQUQsIHJldGJ1ZiwgZmxhZ3MsIHB0ZXgpOworCisJKm9sZF9wdGVoX3JldCA9IHJldGJ1ZlswXTsKKwkqb2xkX3B0ZWxfcmV0ID0gcmV0YnVmWzFdOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW5saW5lIGxvbmcgcGxwYXJfcHRlX3Byb3RlY3QodW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwdGV4LAogCQl1bnNpZ25lZCBsb25nIGF2cG4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAppbmRleCAyNzI5ZDU1Li42MWUxOWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKQEAgLTMzLDYgKzMzLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9rZXhlY19jcHVfZG93bl9tcGljKHZvaWQpIHsgfQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIHBTZXJpZXNfZmluYWxfZml4dXAodm9pZCk7CisKIC8qIFBvd2Vyb24gZmxhZyB1c2VkIGZvciBlbmFibGluZyBhdXRvIHVwcyByZXN0YXJ0ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBydGFzX3Bvd2Vyb25fYXV0bzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwppbmRleCA1YWE5N2FmLi5jMDJmODc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcmVjb25maWcuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJc3RyY3B5KG5wLT5mdWxsX25hbWUsIHBhdGgpOwogCiAJbnAtPnByb3BlcnRpZXMgPSBwcm9wbGlzdDsKLQlPRl9NQVJLX0RZTkFNSUMobnApOworCW9mX25vZGVfc2V0X2ZsYWcobnAsIE9GX0RZTkFNSUMpOwogCWtyZWZfaW5pdCgmbnAtPmtyZWYpOwogCiAJbnAtPnBhcmVudCA9IGRlcml2ZV9wYXJlbnQocGF0aCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCmluZGV4IGEwMzFkOTkuLjU5ZTY5ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jCkBAIC0zOTksNiArMzk5LDcgQEAKIAkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCiAJICovCiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKKwlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMTsKIAogCS8qCiAJICogV2UgY29tZSBpbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZCBuZWVkX3Jlc2NoZWQoKQpAQCAtNDMxLDYgKzQzMiw3IEBACiAKIG91dDoKIAlITVRfbWVkaXVtKCk7CisJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDA7CiAJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggZjFkZjk0Mi4uNWJkOTBhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC0xNTYsOSArMTU2LDkgQEAKIAogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSkKK3N0YXRpYyBpbnQgZ2V0X2lycV9zZXJ2ZXIodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBzdHJpY3RfY2hlY2spCiB7Ci0JdW5zaWduZWQgaW50IHNlcnZlcjsKKwlpbnQgc2VydmVyOwogCS8qIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUgKi8KIAljcHVtYXNrX3QgY3B1bWFzayA9IGlycV9kZXNjW3ZpcnFdLmFmZmluaXR5OwogCWNwdW1hc2tfdCB0bXAgPSBDUFVfTUFTS19OT05FOwpAQCAtMTY2LDIyICsxNjYsMjUgQEAKIAlpZiAoIWRpc3RyaWJ1dGVfaXJxcykKIAkJcmV0dXJuIGRlZmF1bHRfc2VydmVyOwogCi0JaWYgKGNwdXNfZXF1YWwoY3B1bWFzaywgQ1BVX01BU0tfQUxMKSkgewotCQlzZXJ2ZXIgPSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyOwotCX0gZWxzZSB7CisJaWYgKCFjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKIAkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7CiAKLQkJaWYgKGNwdXNfZW1wdHkodG1wKSkKLQkJCXNlcnZlciA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JCWVsc2UKLQkJCXNlcnZlciA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoZmlyc3RfY3B1KHRtcCkpOworCQlzZXJ2ZXIgPSBmaXJzdF9jcHUodG1wKTsKKworCQlpZiAoc2VydmVyIDwgTlJfQ1BVUykKKwkJCXJldHVybiBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHNlcnZlcik7CisKKwkJaWYgKHN0cmljdF9jaGVjaykKKwkJCXJldHVybiAtMTsKIAl9CiAKLQlyZXR1cm4gc2VydmVyOworCWlmIChjcHVzX2VxdWFsKGNwdV9vbmxpbmVfbWFwLCBjcHVfcHJlc2VudF9tYXApKQorCQlyZXR1cm4gZGVmYXVsdF9kaXN0cmliX3NlcnZlcjsKIAorCXJldHVybiBkZWZhdWx0X3NlcnZlcjsKIH0KICNlbHNlCi1zdGF0aWMgaW50IGdldF9pcnFfc2VydmVyKHVuc2lnbmVkIGludCB2aXJxKQorc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHN0cmljdF9jaGVjaykKIHsKIAlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiB9CkBAIC0xOTIsNyArMTk1LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWludCBjYWxsX3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgc2VydmVyOworCWludCBzZXJ2ZXI7CiAKIAlwcl9kZWJ1ZygieGljczogdW5tYXNrIHZpcnEgJWRcbiIsIHZpcnEpOwogCkBAIC0yMDEsNyArMjA0LDcgQEAKIAlpZiAoaXJxID09IFhJQ1NfSVBJIHx8IGlycSA9PSBYSUNTX0lSUV9TUFVSSU9VUykKIAkJcmV0dXJuOwogCi0Jc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSk7CisJc2VydmVyID0gZ2V0X2lycV9zZXJ2ZXIodmlycSwgMCk7CiAKIAljYWxsX3N0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsIGlycSwgc2VydmVyLAogCQkJCURFRkFVTFRfUFJJT1JJVFkpOwpAQCAtMzk4LDggKzQwMSw3IEBACiAJdW5zaWduZWQgaW50IGlycTsKIAlpbnQgc3RhdHVzOwogCWludCB4aWNzX3N0YXR1c1syXTsKLQl1bnNpZ25lZCBsb25nIG5ld21hc2s7Ci0JY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CisJaW50IGlycV9zZXJ2ZXI7CiAKIAlpcnEgPSAodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnE7CiAJaWYgKGlycSA9PSBYSUNTX0lQSSB8fCBpcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCkBAIC00MTMsMTggKzQxNSwyMSBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogRm9yIHRoZSBtb21lbnQgb25seSBpbXBsZW1lbnQgZGVsaXZlcnkgdG8gYWxsIGNwdXMgb3Igb25lIGNwdSAqLwotCWlmIChjcHVzX2VxdWFsKGNwdW1hc2ssIENQVV9NQVNLX0FMTCkpIHsKLQkJbmV3bWFzayA9IGRlZmF1bHRfZGlzdHJpYl9zZXJ2ZXI7Ci0JfSBlbHNlIHsKLQkJY3B1c19hbmQodG1wLCBjcHVfb25saW5lX21hcCwgY3B1bWFzayk7Ci0JCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCQlyZXR1cm47Ci0JCW5ld21hc2sgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGZpcnN0X2NwdSh0bXApKTsKKwkvKgorCSAqIEZvciB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50IGRlbGl2ZXJ5IHRvIGFsbCBjcHVzIG9yIG9uZSBjcHUuCisJICogR2V0IGN1cnJlbnQgaXJxX3NlcnZlciBmb3IgdGhlIGdpdmVuIGlycQorCSAqLworCWlycV9zZXJ2ZXIgPSBnZXRfaXJxX3NlcnZlcihpcnEsIDEpOworCWlmIChpcnFfc2VydmVyID09IC0xKSB7CisJCWNoYXIgY3B1bGlzdFsxMjhdOworCQljcHVtYXNrX3NjbnByaW50ZihjcHVsaXN0LCBzaXplb2YoY3B1bGlzdCksIGNwdW1hc2spOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ4aWNzX3NldF9hZmZpbml0eTogTm8gb25saW5lIGNwdXMgaW4gIgorCQkJCSJ0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLCBjcHVsaXN0LCB2aXJxKTsKKwkJcmV0dXJuOwogCX0KIAogCXN0YXR1cyA9IHJ0YXNfY2FsbChpYm1fc2V0X3hpdmUsIDMsIDEsIE5VTEwsCi0JCQkJaXJxLCBuZXdtYXNrLCB4aWNzX3N0YXR1c1sxXSk7CisJCQkJaXJxLCBpcnFfc2VydmVyLCB4aWNzX3N0YXR1c1sxXSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieGljc19zZXRfYWZmaW5pdHk6IGlycT0ldSBpYm0sc2V0LXhpdmUgIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKaW5kZXggYzNjZTBiZC4uZjY1MDc4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCkBAIC01LDcgKzUsNiBAQAogbXBpYy1tc2ktb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IG1waWNfbXNpLm8gbXBpY191M21zaS5vCiBvYmotJChDT05GSUdfTVBJQykJCSs9IG1waWMubyAkKG1waWMtbXNpLW9iai15KQogCi1vYmotJChDT05GSUdfUFBDX0lORElSRUNUX1BDSSkJKz0gaW5kaXJlY3RfcGNpLm8KIG9iai0kKENPTkZJR19QUENfTVBDMTA2KQkrPSBncmFja2xlLm8KIG9iai0kKENPTkZJR19QUENfRENSKQkJKz0gZGNyLm8KIG9iai0kKENPTkZJR19QUENfRENSX05BVElWRSkJKz0gZGNyLWxvdy5vCkBAIC0xMywxNiArMTIsMTkgQEAKIG9iai0kKENPTkZJR19VM19EQVJUKQkJKz0gZGFydF9pb21tdS5vCiBvYmotJChDT05GSUdfTU1JT19OVlJBTSkJKz0gbW1pb19udnJhbS5vCiBvYmotJChDT05GSUdfRlNMX1NPQykJCSs9IGZzbF9zb2Mubwotb2JqLSQoQ09ORklHX0ZTTF9QQ0lFKQkJKz0gZnNsX3BjaWUubwogb2JqLSQoQ09ORklHX1RTSTEwOF9CUklER0UpCSs9IHRzaTEwOF9wY2kubyB0c2kxMDhfZGV2Lm8KIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpCSs9IHFlX2xpYi8KIG12NjR4NjAtJChDT05GSUdfUENJKQkJKz0gbXY2NHg2MF9wY2kubwogb2JqLSQoQ09ORklHX01WNjRYNjApCQkrPSAkKG12NjR4NjAteSkgbXY2NHg2MF9waWMubyBtdjY0eDYwX2Rldi5vCitvYmotJChDT05GSUdfUlRDX0RSVl9DTU9TKQkrPSBydGNfY21vc19zZXR1cC5vCiAKICMgY29udGFpbnMgb25seSB0aGUgc3VzcGVuZCBoYW5kbGVyIGZvciB0aW1lCitpZmVxICgkKENPTkZJR19SVENfQ0xBU1MpLCkKIG9iai0kKENPTkZJR19QTSkJCSs9IHRpbWVyLm8KK2VuZGlmCiAKIGlmZXEgKCQoQ09ORklHX1BQQ19NRVJHRSkseSkKK29iai0kKENPTkZJR19QUENfSU5ESVJFQ1RfUENJKQkrPSBpbmRpcmVjdF9wY2kubwogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KIG9iai0kKENPTkZJR19QUENfODN4eCkJCSs9IGlwaWMubwogb2JqLSQoQ09ORklHXzR4eCkJCSs9IHVpYy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2llLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWMwN2UuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggR2FicmllbCBQYXViZXJ0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIlRlbXBvcmFyeSIgTVBDODU0OCBFcnJhdGEgZmlsZSAtCi0gKiBUaGUgc3RhbmRhcmQgaW5kaXJlY3RfcGNpIGNvZGUgc2hvdWxkIHdvcmsgd2l0aCBmdXR1cmUgc2lsaWNvbiB2ZXJzaW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0KLSNkZWZpbmUgUENJX0NGR19PVVQgb3V0X2JlMzIKLQotLyogRVJSQVRBIFBDSS1FeCAxNCBQQ0lFIENvbnRyb2xsZXIgdGltZW91dCAqLwotI2RlZmluZSBQQ0lFX0ZJWAkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIrMHg0LCAweDA0MDBmZmZmKQotCi0KLXN0YXRpYyBpbnQKLWluZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAotCQkgICAgIGludCBsZW4sIHUzMiAqdmFsKQotewotCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKLQl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOwotCXUzMiB0ZW1wOwotCi0JaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCi0JCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JLyogUG9zc2libGUgYXJ0aWZhY3Qgb2YgQ0RDcHA1MDkzNyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gKi8KLQlpZiAoZGV2Zm4gIT0gMHgwICYmIGJ1cy0+bnVtYmVyID09IDB4ZmYpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlQQ0lFX0ZJWDsKLQlpZiAoYnVzLT5udW1iZXIgPT0gMHhmZikgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMCB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9IGVsc2UgewotCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKLQkJCSAgICAoMHg4MDAwMDAwMSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8Ci0JCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlQQ0lFX0ZJWDsKLQl0ZW1wID0gaW5fbGUzMihjZmdfZGF0YSk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkqOCkpICYgMHhmZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpKjgpKSAmIDB4ZmZmZjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IHRlbXA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50Ci1pbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCi0JCSAgICAgIGludCBsZW4sIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwotCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7Ci0JdTMyIHRlbXA7Ci0KLQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKLQkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQkvKiBQb3NzaWJsZSBhcnRpZmFjdCBvZiBDRENwcDUwOTM3IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiAqLwotCWlmIChkZXZmbiAhPSAweDAgJiYgYnVzLT5udW1iZXIgPT0gMHhmZikKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQotCVBDSUVfRklYOwotCWlmIChidXMtPm51bWJlciA9PSAweGZmKSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAwIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotCX0gZWxzZSB7Ci0JCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAotCQkJICAgICgweDgwMDAwMDAxIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKLQkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQotCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOwotICAgICAgICB9Ci0KLQkvKgotCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcwotCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KLQkgKi8KLQkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCi0JY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKLQlzd2l0Y2ggKGxlbikgewotCWNhc2UgMToKLQkJUENJRV9GSVg7Ci0JCXRlbXAgPSBpbl9sZTMyKGNmZ19kYXRhKTsKLQkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKLQkJCSh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKLQkJUENJRV9GSVg7Ci0JCW91dF9sZTMyKGNmZ19kYXRhLCB0ZW1wKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlQQ0lFX0ZJWDsKLQkJdGVtcCA9IGluX2xlMzIoY2ZnX2RhdGEpOwotCQl0ZW1wID0gKHRlbXAgJiB+KDB4ZmZmZiA8PCAoKG9mZnNldCAmIDMpICogOCkpKTsKLQkJdGVtcCB8PSAodmFsIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkgOwotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHRlbXApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQQ0lFX0ZJWDsKLQkJb3V0X2xlMzIoY2ZnX2RhdGEsIHZhbCk7Ci0JCWJyZWFrOwotCX0KLQlQQ0lFX0ZJWDsKLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgaW5kaXJlY3RfcGNpZV9vcHMgPSB7Ci0JaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZSwKLQlpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZQotfTsKLQotdm9pZCBfX2luaXQKLXNldHVwX2luZGlyZWN0X3BjaWVfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB2b2lkIF9faW9tZW0gKiBjZmdfYWRkciwKLQl2b2lkIF9faW9tZW0gKiBjZmdfZGF0YSkKLXsKLQlob3NlLT5jZmdfYWRkciA9IGNmZ19hZGRyOwotCWhvc2UtPmNmZ19kYXRhID0gY2ZnX2RhdGE7Ci0JaG9zZS0+b3BzID0gJmluZGlyZWN0X3BjaWVfb3BzOwotfQotCi12b2lkIF9faW5pdAotc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQotewotCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOwotCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKLQotCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOwotCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOwotCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCi0JCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKLQlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKLQlzZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKGhvc2UsIGFkZHIsIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwppbmRleCBjYWQxNzU3Li5jMGRkYzgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9zb2MuYwpAQCAtMTAyOCw2ICsxMDI4LDE5IEBACiAKIGFyY2hfaW5pdGNhbGwoZnNfZW5ldF9vZl9pbml0KTsKIAorc3RhdGljIGludCBfX2luaXQgZnNsX3BjbWNpYV9vZl9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJLyoKKwkgKiBSZWdpc3RlciBhbGwgdGhlIGRldmljZXMgd2hpY2ggdHlwZSBpcyAicGNtY2lhIgorCSAqLworCXdoaWxlICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwKKwkJCSJwY21jaWEiLCAiZnNsLHBxLXBjbWNpYSIpKSAhPSBOVUxMKQorCQkJICAgIG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJtOHh4LXBjbWNpYSIsIE5VTEwpOworCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKGZzbF9wY21jaWFfb2ZfaW5pdCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcmVncyA9ICJyZWdzIjsKIHN0YXRpYyBjb25zdCBjaGFyICpzbWNfcHJhbSA9ICJwcmFtIjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2luZGlyZWN0X3BjaS5jCmluZGV4IGU3MTQ4ODQuLmM3ZTZlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaW5kaXJlY3RfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pbmRpcmVjdF9wY2kuYwpAQCAtMzMsMTggKzMzLDI3IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOwogCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CiAJdTggY2ZnX3R5cGUgPSAwOworCXUzMiBidXNfbm8sIHJlZzsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2Zm4pKQorCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShob3NlLCBidXMtPm51bWJlciwgZGV2Zm4pKQogCQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAkKLQlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU0VUX0NGR19UWVBFKQogCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCiAJCQljZmdfdHlwZSA9IDE7CiAKLQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwgCQkJCQkgCi0JCSAoMHg4MDAwMDAwMCB8ICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKLQkJICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgfCBjZmdfdHlwZSkpKTsKKwlidXNfbm8gPSAoYnVzLT5udW1iZXIgPT0gaG9zZS0+Zmlyc3RfYnVzbm8pID8KKwkJCWhvc2UtPnNlbGZfYnVzbm8gOiBidXMtPm51bWJlcjsKKworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfRVhUX1JFRykKKwkJcmVnID0gKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwgKG9mZnNldCAmIDB4ZmMpOworCWVsc2UKKwkJcmVnID0gb2Zmc2V0ICYgMHhmYzsKKworCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkgKDB4ODAwMDAwMDAgfCAoYnVzX25vIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgcmVnIHwgY2ZnX3R5cGUpKTsKIAogCS8qCiAJICogTm90ZTogdGhlIGNhbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIHRoYXQgb2Zmc2V0IGlzCkBAIC03MiwxOCArODEsMzMgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKIAl1OCBjZmdfdHlwZSA9IDA7CisJdTMyIGJ1c19ubywgcmVnOwogCiAJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCi0JCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmbikpCiAJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCi0JaWYgKGhvc2UtPnNldF9jZmdfdHlwZSkKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX1NFVF9DRkdfVFlQRSkKIAkJaWYgKGJ1cy0+bnVtYmVyICE9IGhvc2UtPmZpcnN0X2J1c25vKQogCQkJY2ZnX3R5cGUgPSAxOwogCi0JUENJX0NGR19PVVQoaG9zZS0+Y2ZnX2FkZHIsIAkJCQkJIAotCQkgKDB4ODAwMDAwMDAgfCAoKGJ1cy0+bnVtYmVyIC0gaG9zZS0+YnVzX29mZnNldCkgPDwgMTYpCi0JCSAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUpKSk7CisJYnVzX25vID0gKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vKSA/CisJCQlob3NlLT5zZWxmX2J1c25vIDogYnVzLT5udW1iZXI7CisKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSAmIFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcpCisJCXJlZyA9ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8IChvZmZzZXQgJiAweGZjKTsKKwllbHNlCisJCXJlZyA9IG9mZnNldCAmIDB4ZmM7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKGJ1c19ubyA8PCAxNikKKwkJICB8IChkZXZmbiA8PCA4KSB8IHJlZyB8IGNmZ190eXBlKSk7CisKKwkvKiBzdXJwcmVzcyBzZXR0aW5nIG9mIFBDSV9QUklNQVJZX0JVUyAqLworCWlmIChob3NlLT5pbmRpcmVjdF90eXBlICYgUFBDX0lORElSRUNUX1RZUEVfU1VSUFJFU1NfUFJJTUFSWV9CVVMpCisJCWlmICgob2Zmc2V0ID09IFBDSV9QUklNQVJZX0JVUykgJiYKKwkJCShidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubykpCisJCXZhbCAmPSAweGZmZmZmZjAwOwogCiAJLyoKIAkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKaW5kZXggYWZhMmVlNi4uOWZlMDBlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmgKQEAgLTQsOSArNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi1leHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1wYzh4eF9waWM7Ci0KIGludCBtcGM4eHhfcGljX2luaXQodm9pZCk7CiB1bnNpZ25lZCBpbnQgbXBjOHh4X2dldF9pcnEodm9pZCk7CiAKKy8qCisgKiBTb21lIGludGVybmFsIGludGVycnVwdCByZWdpc3RlcnMgdXNlIGFuIDgtYml0IG1hc2sgZm9yIHRoZSBpbnRlcnJ1cHQKKyAqIGxldmVsIGluc3RlYWQgb2YgYSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludCBta19pbnRfaW50X21hc2sodWludCBtYXNrKQoreworCXJldHVybiAoMSA8PCAoNyAtIChtYXNrLzIpKSk7Cit9CisKICNlbmRpZiAvKiBfUFBDX0tFUk5FTF9QUEM4eHhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX2Rldi5jCmluZGV4IDRiMGE5YzguLmI2MThmYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIApAQCAtNDIwLDMgKzQyMSwzMCBAQAogCXJldHVybiBlcnI7CiB9CiBhcmNoX2luaXRjYWxsKG12NjR4NjBfZGV2aWNlX3NldHVwKTsKKworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9hZGRfbXBzY19jb25zb2xlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJY29uc3QgY2hhciAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkob2ZfY2hvc2VuLCAibGludXgsc3Rkb3V0LXBhdGgiLCBOVUxMKTsKKwlpZiAocHJvcCA9PSBOVUxMKQorCQlnb3RvIG5vdF9tcHNjOworCisJbnAgPSBvZl9maW5kX25vZGVfYnlfcGF0aChwcm9wKTsKKwlpZiAoIW5wKQorCQlnb3RvIG5vdF9tcHNjOworCisJaWYgKCFvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgIm1hcnZlbGwsbXBzYyIpKQorCQlnb3RvIG5vdF9tcHNjOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJsb2NrLWluZGV4IiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlnb3RvIG5vdF9tcHNjOworCisJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlNTSIsICooaW50ICopcHJvcCwgTlVMTCk7CisKK25vdF9tcHNjOgorCXJldHVybiAwOworfQorY29uc29sZV9pbml0Y2FsbChtdjY0eDYwX2FkZF9tcHNjX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCmluZGV4IGI1YWVmNGMuLjQ1ZGI4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGNpLmMKQEAgLTEzNywxOCArMTM3LDE1IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGdldCBidXMtcmFuZ2UgZm9yICVzLCBhc3N1bWUiCiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAKLQlob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKCk7CisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihkZXYpOwogCWlmICghaG9zZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKLQogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKIAogCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgNCk7Ci0JaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOworCWhvc2UtPnNlbGZfYnVzbm8gPSBob3NlLT5maXJzdF9idXNubzsKIAogCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1WNjR4NjAgUENJIGhvc3QgYnJpZGdlIGF0IDB4JTAxNmxseC4gIgogCSAgICAgICAiRmlybXdhcmUgYnVzIG51bWJlcjogJWQtPiVkXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwppbmRleCBhYzEyYTQ0Li5mOTcwZTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2MuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNDAsNiArNDEsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19zZXRfcWVfbXV4X21paV9tbmcpOwogCiBpbnQgdWNjX3NldF90eXBlKGludCB1Y2NfbnVtLCBzdHJ1Y3QgdWNjX2NvbW1vbiAqcmVncywKIAkJIGVudW0gdWNjX3NwZWVkX3R5cGUgc3BlZWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvdWNjX2Zhc3QuYwppbmRleCA5MTQzMjM2Li4zZGYyMDJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi91Y2NfZmFzdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3VjY19mYXN0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgpAQCAtNzAsNiArNzEsNyBAQAogCXByaW50ayhLRVJOX0lORk8gImd1ZW1yIDogYWRkciAtIDB4JTA4eCwgdmFsIC0gMHglMDJ4IiwKIAkJICAodTMyKSAmIHVjY2YtPnVmX3JlZ3MtPmd1ZW1yLCB1Y2NmLT51Zl9yZWdzLT5ndWVtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2R1bXBfcmVncyk7CiAKIHUzMiB1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2soaW50IHVjY2ZfbnVtKQogewpAQCAtODUsMTEgKzg3LDEzIEBACiAJZGVmYXVsdDogcmV0dXJuIFFFX0NSX1NVQkJMT0NLX0lOVkFMSUQ7CiAJfQogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9nZXRfcWVfY3Jfc3ViYmxvY2spOwogCiB2b2lkIHVjY19mYXN0X3RyYW5zbWl0X29uX2RlbWFuZChzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CiAJb3V0X2JlMTYoJnVjY2YtPnVmX3JlZ3MtPnV0b2RyLCBVQ0NfRkFTVF9UT0QpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF90cmFuc21pdF9vbl9kZW1hbmQpOwogCiB2b2lkIHVjY19mYXN0X2VuYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTExMCw2ICsxMTQsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2VuYWJsZSk7CiAKIHZvaWQgdWNjX2Zhc3RfZGlzYWJsZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YsIGVudW0gY29tbV9kaXIgbW9kZSkKIHsKQEAgLTEzMCw2ICsxMzUsNyBAQAogCX0KIAlvdXRfYmUzMigmdWZfcmVncy0+Z3VtciwgZ3Vtcik7CiB9CitFWFBPUlRfU1lNQk9MKHVjY19mYXN0X2Rpc2FibGUpOwogCiBpbnQgdWNjX2Zhc3RfaW5pdChzdHJ1Y3QgdWNjX2Zhc3RfaW5mbyAqIHVmX2luZm8sIHN0cnVjdCB1Y2NfZmFzdF9wcml2YXRlICoqIHVjY2ZfcmV0KQogewpAQCAtMzQxLDYgKzM0Nyw3IEBACiAJKnVjY2ZfcmV0ID0gdWNjZjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wodWNjX2Zhc3RfaW5pdCk7CiAKIHZvaWQgdWNjX2Zhc3RfZnJlZShzdHJ1Y3QgdWNjX2Zhc3RfcHJpdmF0ZSAqIHVjY2YpCiB7CkBAIC0zNTUsMyArMzYyLDQgQEAKIAogCWtmcmVlKHVjY2YpOwogfQorRVhQT1JUX1NZTUJPTCh1Y2NfZmFzdF9mcmVlKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcnRjX2Ntb3Nfc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9ydGNfY21vc19zZXR1cC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBTZXR1cCBjb2RlIGZvciBQQy1zdHlsZSBSZWFsLVRpbWUgQ2xvY2suCisgKgorICogQXV0aG9yOiBXYWRlIEZhcm5zd29ydGggPHdmYXJuc3dvcnRoQG12aXN0YS5jb20+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitzdGF0aWMgaW50ICBfX2luaXQgYWRkX3J0Yyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGQ7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlpbnQgcmV0OworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAicG5wUE5QLGIwMCIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFJUQ19QT1JUKHgpIGlzIGhhcmRjb2RlZCBpbiBhc20vbWMxNDY4MThydGMuaC4gIFZlcmlmeSB0aGF0IHRoZQorCSAqIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIGRldmljZSBub2RlIG1hdGNoZXMuCisJICovCisJaWYgKHJlcy5zdGFydCAhPSBSVENfUE9SVCgwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwZCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Y19jbW9zIiwgLTEsCisJCQkJCSAgICAgJnJlcywgMSk7CisJaWYgKElTX0VSUihwZCkpCisJCXJldHVybiBQVFJfRVJSKHBkKTsKKworCXJldHVybiAwOworfQorZnNfaW5pdGNhbGwoYWRkX3J0Yyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RpbWVyLmMKaW5kZXggNGEwMTc0OC4uZTgxZTdlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90aW1lci5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdGltZXIuYwpAQCAtMjQsNyArMjQsMTIgQEAKIAogCS8qIGdldCBjdXJyZW50IFJUQyB0aW1lIGFuZCBjb252ZXJ0IHRvIHNlY29uZHMgKi8KIAlnZXRfcnRjX3RpbWUoJmN1cl9ydGNfdG0pOwotCXJ0Y190bV90b190aW1lKCZjdXJfcnRjX3RtLCAmY3VyX3J0Y190aW1lKTsKKwljdXJfcnRjX3RpbWUgPSBta3RpbWUoY3VyX3J0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbW9uICsgMSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWRheSwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1faG91ciwKKwkJCSAgICAgIGN1cl9ydGNfdG0udG1fbWluLAorCQkJICAgICAgY3VyX3J0Y190bS50bV9zZWMpOwogCiAJZGlmZiA9IGN1cl9ydGNfdGltZSAtIHN1c3BlbmRfcnRjX3RpbWU7CiAKQEAgLTQ0LDcgKzQ5LDEyIEBACiAJV0FSTl9PTighcHBjX21kLmdldF9ydGNfdGltZSk7CiAKIAlnZXRfcnRjX3RpbWUoJnN1c3BlbmRfcnRjX3RtKTsKLQlydGNfdG1fdG9fdGltZSgmc3VzcGVuZF9ydGNfdG0sICZzdXNwZW5kX3J0Y190aW1lKTsKKwlzdXNwZW5kX3J0Y190aW1lID0gbWt0aW1lKHN1c3BlbmRfcnRjX3RtLnRtX3llYXIgKyAxOTAwLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbW9uICsgMSwKKwkJCQkgIHN1c3BlbmRfcnRjX3RtLnRtX21kYXksCisJCQkJICBzdXNwZW5kX3J0Y190bS50bV9ob3VyLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fbWluLAorCQkJCSAgc3VzcGVuZF9ydGNfdG0udG1fc2VjKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwppbmRleCA3ZDNiMDliLi5hMTEzZDgwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9kZXYuYwpAQCAtNzIsMTIgKzcyLDExIEBACiAJaW50IHJldDsKIAogCWZvciAobnAgPSBOVUxMLCBpID0gMDsKLQkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2ktZXRoZXJuZXQiKSkgIT0gTlVMTDsKKwkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAibmV0d29yayIsICJ0c2kxMDgtZXRoZXJuZXQiKSkgIT0gTlVMTDsKIAkgICAgIGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwaHk7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5LCAqbWRpbzsKIAkJaHdfaW5mbyB0c2lfZXRoX2RhdGE7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CiAJCWNvbnN0IHVuc2lnbmVkIGludCAqcGh5X2lkOwogCQljb25zdCB2b2lkICptYWNfYWRkcjsKIAkJY29uc3QgcGhhbmRsZSAqcGg7CkBAIC0xMTEsNiArMTEwLDEzIEBACiAJCWlmIChtYWNfYWRkcikKIAkJCW1lbWNweSh0c2lfZXRoX2RhdGEubWFjX2FkZHIsIG1hY19hZGRyLCA2KTsKIAorCQlwaCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1kaW8taGFuZGxlIiwgTlVMTCk7CisJCW1kaW8gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG1kaW8sIDAsICZyZXMpOworCQlvZl9ub2RlX3B1dChtZGlvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5yZWc7CisKIAkJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktaGFuZGxlIiwgTlVMTCk7CiAJCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CiAKQEAgLTExOSwyMCArMTI1LDI1IEBACiAJCQlnb3RvIHVucmVnOwogCQl9CiAKLQkJaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7Ci0JCXBoeV9pZCA9IG9mX2dldF9wcm9wZXJ0eShwaHksICJwaHktaWQiLCBOVUxMKTsKLQkJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwaHksIDAsICZyZXMpOwotCQlpZiAocmV0KSB7Ci0JCQlvZl9ub2RlX3B1dChwaHkpOwotCQkJZ290byB1bnJlZzsKLQkJfQorCQlwaHlfaWQgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisKIAkJdHNpX2V0aF9kYXRhLnJlZ3MgPSByWzBdLnN0YXJ0OwogCQl0c2lfZXRoX2RhdGEucGh5cmVncyA9IHJlcy5zdGFydDsKIAkJdHNpX2V0aF9kYXRhLnBoeSA9ICpwaHlfaWQ7CiAJCXRzaV9ldGhfZGF0YS5pcnFfbnVtID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGh5LCAiYmNtNTR4eCIpKQorCisJCS8qIFNvbWUgYm9hcmRzIHdpdGggdGhlIFRTSTEwOCBicmlkZ2UgKGUuZy4gSG9sbHkpCisJCSAqIGhhdmUgYSBtaXN3aXJpbmcgb2YgdGhlIGV0aGVybmV0IFBIWXMgd2hpY2gKKwkJICogcmVxdWlyZXMgYSB3b3JrYXJvdW5kLiAgVGhlIHNwZWNpYWwKKwkJICogInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIgcHJvcGVydHkgZW5hYmxlcyB0aGlzCisJCSAqIHdvcmthcm91bmQuICBGSVhNRTogTmVlZCB0byBwb3J0IHRoZSB0c2kxMDhfZXRoCisJCSAqIGRyaXZlciBpdHNlbGYgdG8gcGh5bGliIGFuZCB1c2UgYSBub24tbWlzbGVhZGluZworCQkgKiBuYW1lIGZvciB0aGUgd29ya2Fyb3VuZCBmbGFnIC0gaXQncyBub3QgYWN0dWFsbHkgdG8KKwkJICogZG8gd2l0aCB0aGUgbW9kZWwgb2YgUEhZIGluIHVzZSAqLworCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBoeSwgInR4Yy1yeGMtZGVsYXktZGlzYWJsZSIsIE5VTEwpKQogCQkJdHNpX2V0aF9kYXRhLnBoeV90eXBlID0gVFNJMTA4X1BIWV9CQ001NFhYOwogCQlvZl9ub2RlX3B1dChwaHkpOworCiAJCXJldCA9CiAJCSAgICBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEodHNpX2V0aF9kZXYsICZ0c2lfZXRoX2RhdGEsCiAJCQkJCSAgICAgc2l6ZW9mKGh3X2luZm8pKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvdHNpMTA4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKaW5kZXggMjE1MzE2My4uOTBkYjhhNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMKQEAgLTY0LDkgKzY0LDEwIEBACiAJCQkgICBpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgdmFsKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNmZ19hZGRyOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKIAogCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKQotCQlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZShidXMtPm51bWJlciwgZGV2ZnVuYykpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGhvc2UsIGJ1cy0+bnVtYmVyLCBkZXZmdW5jKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTE0OSwxMCArMTUwLDExIEBACiAJCQkgIGludCBsZW4sIHUzMiAqIHZhbCkKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjZmdfYWRkcjsKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CiAJdTMyIHRlbXA7CiAKIAlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKLQkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoaG9zZSwgYnVzLT5udW1iZXIsIGRldmZuKSkKIAkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAljZmdfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopKHRzaV9ta19jb25maWdfYWRkcihidXMtPm51bWJlciwKQEAgLTIxOSwxNCArMjIxLDEyIEBACiAJCSAgICAgICAiIGJ1cyAwXG4iLCBkZXYtPmZ1bGxfbmFtZSk7CiAJfQogCi0JaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoZGV2KTsKIAogCWlmICghaG9zZSkgewogCQlwcmludGsoIlBDSSBIb3N0IGJyaWRnZSBpbml0IGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlob3NlLT5hcmNoX2RhdGEgPSBkZXY7Ci0JaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKIAogCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKIAlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwppbmRleCAyOGZkZjRmLi42NjllNjU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogX19pbml0Y2FsbChzZXR1cF94bW9uX3N5c3JxKTsKICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAotaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgeG1vbl9lYXJseSwgeG1vbl9vZmY7CiAKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlX3htb24oY2hhciAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCmluZGV4IGQzMTlmOWIuLjBkYTU1MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwpAQCAtMzI4LDcgKzMyOCw3IEBACiAJbXRzcHIgICBTUFJOX0wxQ1NSMCxyMwogCWlzeW5jCiAJYmxyCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1VOSUZJRURfSURfQ0FDSEUpCiAJbWZzcHIJcjMsU1BSTl9MMUNTUjEKIAlvcmkJcjMscjMsTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSCiAJbXRzcHIJU1BSTl9MMUNTUjEscjMKQEAgLTM1NSw3ICszNTUsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCS8qIGZvciA2MDEsIGRvIG5vdGhpbmcgKi8KLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFKQogCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKIAlhbmRjCXIzLHIzLHI1CiAJc3ViZglyNCxyMyxyNApAQCAtNDcyLDcgKzQ3Miw3IEBACiBfR0xPQkFMKF9fZmx1c2hfZGNhY2hlX2ljYWNoZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAlybHdpbm0JcjMscjMsMCwwLDE5CQkJLyogR2V0IHBhZ2UgYmFzZSBhZGRyZXNzICovCiAJbGkJcjQsNDA5Ni9MMV9DQUNIRV9CWVRFUwkvKiBOdW1iZXIgb2YgbGluZXMgaW4gYSBwYWdlICovCiAJbXRjdHIJcjQKQEAgLTUwMCw3ICs1MDAsNyBAQAogX0dMT0JBTChfX2ZsdXNoX2RjYWNoZV9pY2FjaGVfcGh5cykKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJYmxyCQkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCi1FTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSkKIAltZm1zcglyMTAKIAlybHdpbm0JcjAscjEwLDAsMjgsMjYJCQkvKiBjbGVhciBEUiAqLwogCW10bXNyCXIwCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMgYi9hcmNoL3BwYy9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggYTQxNjUyMC4uNjNmMGE5OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BwY19rc3ltcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wcGNfa3N5bXMuYwpAQCAtNjQsNyArNjQsNiBAQAogCiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2VzKTsKIEVYUE9SVF9TWU1CT0woY2xlYXJfdXNlcl9wYWdlKTsKLUVYUE9SVF9TWU1CT0woZG9fc2lnbmFsKTsKIEVYUE9SVF9TWU1CT0wodHJhbnNmZXJfdG9faGFuZGxlcik7CiBFWFBPUlRfU1lNQk9MKGRvX0lSUSk7CiBFWFBPUlRfU1lNQk9MKG1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggYzc5NzA0Zi4uOTY3YzFlZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKQEAgLTUyNiw3ICs1MjYsNyBAQAogCSAqIFN5c3RlbXMgd2l0aCBPRiBjYW4gbG9vayBpbiB0aGUgcHJvcGVydGllcyBvbiB0aGUgY3B1IG5vZGUocykKIAkgKiBmb3IgYSBwb3NzaWJseSBtb3JlIGFjY3VyYXRlIHZhbHVlLgogCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSkpIHsKKwlpZiAoISBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKSkgewogCQlkY2FjaGVfYnNpemUgPSBjdXJfY3B1X3NwZWMtPmRjYWNoZV9ic2l6ZTsKIAkJaWNhY2hlX2JzaXplID0gY3VyX2NwdV9zcGVjLT5pY2FjaGVfYnNpemU7CiAJCXVjYWNoZV9ic2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCmluZGV4IGFlYTEwMGIuLjNmM2IyOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCkBAIC05Miw2ICs5Miw3IEBACiAJaWYgKG5sKQogCQlwcmludGsoIlxuIik7CiAJc2hvd19yZWdzKGZwKTsKKwlhZGRfdGFpbnQoVEFJTlRfRElFKTsKIAlzcGluX3VubG9ja19pcnEoJmRpZV9sb2NrKTsKIAkvKiBkb19leGl0KCkgc2hvdWxkIHRha2UgY2FyZSBvZiBwYW5pYydpbmcgZnJvbSBhbiBpbnRlcnJ1cHQKIAkgKiBjb250ZXh0IHNvIHdlIGRvbid0IGhhbmRsZSBpdCBoZXJlCkBAIC02MTksNyArNjIwLDcgQEAKIAkJCXJldHVybjsKIAogCQlpZiAoIShyZWdzLT5tc3IgJiBNU1JfUFIpICYmICAvKiBub3QgdXNlci1tb2RlICovCi0JCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCkgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CisJCSAgICByZXBvcnRfYnVnKHJlZ3MtPm5pcCwgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCQlyZWdzLT5uaXAgKz0gNDsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vdGxiLmMgYi9hcmNoL3BwYy9tbS90bGIuYwppbmRleCBmYTI5NzQwLi40ZmYyNjBiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS90bGIuYworKysgYi9hcmNoL3BwYy9tbS90bGIuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYwppbmRleCA2ZjIxMTEwLi4zYzU2NjU0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKQEAgLTY5LDkgKzY5LDYgQEAKIAogVE9EQ19BTExPQygpOwogCi11bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXY7Ci11bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXZNYWosIHVjQm9hcmRSZXZNaW47Ci0KIGV4dGVybiB1bnNpZ25lZCBjaGFyIHByZXBfbnZyYW1fcmVhZF92YWwoaW50IGFkZHIpOwogZXh0ZXJuIHZvaWQgcHJlcF9udnJhbV93cml0ZV92YWwoaW50IGFkZHIsCiAJCQkJIHVuc2lnbmVkIGNoYXIgdmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL3N5c2xpYi9NYWtlZmlsZQppbmRleCA5NTY5NDE1Li41NDM3OTViIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvc3lzbGliL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogCiB3ZHQtbXBjOHh4LSQoQ09ORklHXzh4eF9XRFQpCSs9IG04eHhfd2R0Lm8KIAorb2JqLSQoQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0kpCSs9IGluZGlyZWN0X3BjaS5vCiBvYmotJChDT05GSUdfUFBDQlVHX05WUkFNKQkrPSBwcmVwX252cmFtLm8KIG9iai0kKENPTkZJR19QUENfT0NQKQkJKz0gb2NwLm8KIG9iai0kKENPTkZJR19JQk1fT0NQKQkJKz0gaWJtX29jcC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMgYi9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiMzIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIFN1cHBvcnQgZm9yIGluZGlyZWN0IFBDSSBicmlkZ2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBHYWJyaWVsIFBhdWJlcnQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworI2lmZGVmIENPTkZJR19QUENfSU5ESVJFQ1RfUENJX0JFCisjZGVmaW5lIFBDSV9DRkdfT1VUIG91dF9iZTMyCisjZWxzZQorI2RlZmluZSBQQ0lfQ0ZHX09VVCBvdXRfbGUzMgorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2luZGlyZWN0X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICBpbnQgbGVuLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbCA9IGluXzgoY2ZnX2RhdGEpOworCQlicmVhazsKKwljYXNlIDI6CisJCSp2YWwgPSBpbl9sZTE2KGNmZ19kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnZhbCA9IGluX2xlMzIoY2ZnX2RhdGEpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludAoraW5kaXJlY3Rfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwKKwkJICAgICAgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBidXMtPnN5c2RhdGE7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKwl1OCBjZmdfdHlwZSA9IDA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoaG9zZS0+c2V0X2NmZ190eXBlKQorCQlpZiAoYnVzLT5udW1iZXIgIT0gaG9zZS0+Zmlyc3RfYnVzbm8pCisJCQljZmdfdHlwZSA9IDE7CisKKwlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJICgweDgwMDAwMDAwIHwgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkgIHwgKGRldmZuIDw8IDgpIHwgKChvZmZzZXQgJiAweGZjKSB8IGNmZ190eXBlKSkpOworCisJLyoKKwkgKiBOb3RlOiB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBvZmZzZXQgaXMKKwkgKiBzdWl0YWJseSBhbGlnbmVkIGFuZCB0aGF0IGxlbiBpcyAxLCAyIG9yIDQuCisJICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YSArIChvZmZzZXQgJiAzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0XzgoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJb3V0X2xlMTYoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW91dF9sZTMyKGNmZ19kYXRhLCB2YWwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIGluZGlyZWN0X3BjaV9vcHMgPQoreworCWluZGlyZWN0X3JlYWRfY29uZmlnLAorCWluZGlyZWN0X3dyaXRlX2NvbmZpZworfTsKKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHZvaWQgX19pb21lbSAqIGNmZ19hZGRyLAorCXZvaWQgX19pb21lbSAqIGNmZ19kYXRhKQoreworCWhvc2UtPmNmZ19hZGRyID0gY2ZnX2FkZHI7CisJaG9zZS0+Y2ZnX2RhdGEgPSBjZmdfZGF0YTsKKwlob3NlLT5vcHMgPSAmaW5kaXJlY3RfcGNpX29wczsKK30KKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOworCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKKworCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOworCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOworCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCisJCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKKwlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKKwlzZXR1cF9pbmRpcmVjdF9wY2lfbm9tYXAoaG9zZSwgYWRkciwgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuYyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCmluZGV4IDE2NTQ2NzguLmFjZTRlYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi92aXJ0ZXhfZGV2aWNlcy5jCkBAIC03MSw2ICs3MSwyMSBAQAogCX0sIFwKIH0KIAorLyoKKyAqIE1MMzAwL01MNDAzIFZpZGVvIERldmljZTogc2hvcnRjdXQgbWFjcm8gZm9yIHNpbmdsZSBpbnN0YW5jZQorICovCisjZGVmaW5lIFhQQVJfVEZUKG51bSkgeyBcCisJLm5hbWUgPSAieGlsaW54ZmIiLCBcCisJLmlkID0gbnVtLCBcCisJLm51bV9yZXNvdXJjZXMgPSAxLCBcCisJLnJlc291cmNlID0gKHN0cnVjdCByZXNvdXJjZVtdKSB7IFwKKwkJeyBcCisJCQkuc3RhcnQgPSBYUEFSX1RGVF8jI251bSMjX0JBU0VBRERSLCBcCisJCQkuZW5kID0gWFBBUl9URlRfIyNudW0jI19CQVNFQUREUis3LCBcCisJCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lPLCBcCisJCX0sIFwKKwl9LCBcCit9CiAKIC8qIFVBUlQgODI1MCBkcml2ZXIgcGxhdGZvcm0gZGF0YSB0YWJsZSAqLwogc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHZpcnRleF9zZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0gewpAQCAtMTQ2LDIwICsxNjEsMTcgQEAKIAlYUEFSX1NZU0FDRSgxKSwKICNlbmRpZgogCi0JLyogTUwzMDAvNDAzIHJlZmVyZW5jZSBkZXNpZ24gZnJhbWVidWZmZXIgKi8KICNpZiBkZWZpbmVkKFhQQVJfVEZUXzBfQkFTRUFERFIpCi0JewotCQkubmFtZQkJPSAieGlsaW54ZmIiLAotCQkuaWQJCT0gMCwKLQkJLm51bV9yZXNvdXJjZXMJPSAxLAotCQkucmVzb3VyY2UgPSAoc3RydWN0IHJlc291cmNlW10pIHsKLQkJCXsKLQkJCQkuc3RhcnQJPSBYUEFSX1RGVF8wX0JBU0VBRERSLAotCQkJCS5lbmQJPSBYUEFSX1RGVF8wX0JBU0VBRERSKzcsCi0JCQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKLQkJCX0sCi0JCX0sCi0JfSwKKwlYUEFSX1RGVCgwKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMV9CQVNFQUREUikKKwlYUEFSX1RGVCgxKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfMl9CQVNFQUREUikKKwlYUEFSX1RGVCgyKSwKKyNlbmRpZgorI2lmIGRlZmluZWQoWFBBUl9URlRfM19CQVNFQUREUikKKwlYUEFSX1RGVCgzKSwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3ZpcnRleF9kZXZpY2VzLmggYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAppbmRleCAzZDRiZTE0Li45ZjM4ZDkyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaAorKysgYi9hcmNoL3BwYy9zeXNsaWIvdmlydGV4X2RldmljZXMuaApAQCAtMzEsNCArMzEsMTEgQEAKICAqLwogaW50IHZpcnRleF9kZXZpY2VfZml4dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KTsKIAorLyogU1BJIENvbnRyb2xsZXIgSVAgKi8KK3N0cnVjdCB4c3BpX3BsYXRmb3JtX2RhdGEgeworCXMxNiBidXNfbnVtOworCXUxNiBudW1fY2hpcHNlbGVjdDsKKwl1MzIgc3BlZWRfaHo7Cit9OworCiAjZW5kaWYgIC8qIF9fQVNNX1ZJUlRFWF9ERVZJQ0VTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmE4ZjA4Ny4uZjQ1MDNjYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC0yOTQsNyArMjk0LDYgQEAKIHN0YXRpYyBpbnQKIGRvX3B0cmFjZV9ub3JtYWwoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIHRtcDsKIAlwdHJhY2VfYXJlYSBwYXJlYTsgCiAJaW50IGNvcGllZCwgcmV0OwogCkBAIC0zMDQsMTAgKzMwMyw3IEBACiAJCS8qIFJlbW92ZSBoaWdoIG9yZGVyIGJpdCBmcm9tIGFkZHJlc3MgKG9ubHkgZm9yIDMxIGJpdCkuICovCiAJCWFkZHIgJj0gUFNXX0FERFJfSU5TTjsKIAkJLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSBfX3VzZXIgKikgZGF0YSk7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgogCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KQEAgLTMxOCwxMCArMzE0LDcgQEAKIAkJLyogUmVtb3ZlIGhpZ2ggb3JkZXIgYml0IGZyb20gYWRkcmVzcyAob25seSBmb3IgMzEgYml0KS4gKi8KIAkJYWRkciAmPSBQU1dfQUREUl9JTlNOOwogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwxKTsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YoZGF0YSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgogCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCBlZTkxODZmLi44ZWM5ZGVmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCkBAIC0yNjIsNiArMjYyLDcgQEAKIAlwcmludF9tb2R1bGVzKCk7CiAJc2hvd19yZWdzKHJlZ3MpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKQEAgLTMxOSw3ICszMjAsNyBAQAogCQllbHNlIHsKIAkJCWVudW0gYnVnX3RyYXBfdHlwZSBidHQ7CiAKLQkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOKTsKKwkJCWJ0dCA9IHJlcG9ydF9idWcocmVncy0+cHN3LmFkZHIgJiBQU1dfQUREUl9JTlNOLCByZWdzKTsKIAkJCWlmIChidHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKQogCQkJCXJldHVybjsKIAkJCWRpZShzdHIsIHJlZ3MsIGludGVycnVwdGlvbl9jb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCAwMzgxNzllLi5kOGVkNjY3IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC01NSw4ICs1NSwyMSBAQAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlkZWZfYm9vbCBuCiAKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUE0KKwlib29sCisKIGNvbmZpZyBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgogCWJvb2wKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BNCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfU01QCisJYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX05VTUEKKwlib29sCisKK2NvbmZpZyBTWVNfU1VQUE9SVFNfUENJCisJYm9vbAogCiBjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAlib29sCkBAIC04MSwyNTcgKzk0LDggQEAKIAogbWVudSAiU3lzdGVtIHR5cGUiCiAKLWNvbmZpZyBTT0xVVElPTl9FTkdJTkUKLQlib29sCi0KLWNob2ljZQotCXByb21wdCAiU3VwZXJIIHN5c3RlbSB0eXBlIgotCWRlZmF1bHQgU0hfVU5LTk9XTgotCi1jb25maWcgU0hfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmUiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCWhlbHAKLQkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQotCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzIyX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzcyMiIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcyMgotCWhlbHAKLQkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKLQlzZWxlY3QgU09MVVRJT05fRU5HSU5FCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MQotCWhlbHAKLQkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCi0JICBldmFsdWF0aW9uIGJvYXJkLgotCSAgCi1jb25maWcgU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTc3ODAiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3ODAKLQloZWxwCi0JICBTZWxlY3QgNzc4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFNINzc4MAotCSAgZXZhbHVhdGlvbiBib2FyZC4KLQotY29uZmlnIFNIXzczMDBfU09MVVRJT05fRU5HSU5FCi0JYm9vbCAiU29sdXRpb25FbmdpbmU3MzAwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzAwCi0JaGVscAotCSAgU2VsZWN0IDczMDAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQotCSAgU0g3MzAwKFNILU1vYmlsZSBWKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzM0M19TT0xVVElPTl9FTkdJTkUKLQlib29sICJTb2x1dGlvbkVuZ2luZTczNDMiCi0Jc2VsZWN0IFNPTFVUSU9OX0VOR0lORQotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczNDMKLQloZWxwCi0JICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKLSAgICAgICBib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgotCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzE4MAotCWhlbHAKLQkgIFNlbGVjdCA3MzE4MCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCi0JICBTSDczMTgwKFNILU1vYmlsZSAzKSBldmFsdWF0aW9uIGJvYXJkLgotCi1jb25maWcgU0hfNzc1MV9TWVNURU1ICi0JYm9vbCAiU3lzdGVtSDc3NTFSIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFN5c3RlbUggaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFN5c3RlbUgKLQkgIDc3NTFSIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF9IUDZYWAotCWJvb2wgIkhQNlhYIgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgotCWhlbHAKLQkgIFNlbGVjdCBIUDZYWCBpZiBjb25maWd1cmluZyBmb3IgYSBIUCBqb3JuYWRhIEhQNnh4LgotCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKLQkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCi0KLWNvbmZpZyBTSF9TQVRVUk4KLQlib29sICJTYXR1cm4iCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzYwNAotCWhlbHAKLQkgIFNlbGVjdCBTYXR1cm4gaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBTYXR1cm4uCi0KLWNvbmZpZyBTSF9EUkVBTUNBU1QKLQlib29sICJEcmVhbWNhc3QiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzA5MQotCWhlbHAKLQkgIFNlbGVjdCBEcmVhbWNhc3QgaWYgY29uZmlndXJpbmcgZm9yIGEgU0VHQSBEcmVhbWNhc3QuCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0Ci0JICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKLQkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KLQotY29uZmlnIFNIX01QQzEyMTEKLQlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKLQloZWxwCi0JICBDVFAvUENJLVNIMDIgaXMgYSBDUFUgbW9kdWxlIGNvbXB1dGVyIHRoYXQgaXMgcHJvZHVjZWQKLQkgIGJ5IEludGVyZmFjZSBDb3Jwb3JhdGlvbi4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQgPGh0dHA6Ly93d3cuaW50ZXJmYWNlLmNvLmpwPgotCi1jb25maWcgU0hfU0gwMwotCWJvb2wgIkludGVyZmFjZSBDVFAvUENJLVNIMDMiCi0JaGVscAotCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCi0JICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCi0JICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KLQotY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCi0JYm9vbCAiU2VjdXJlRWRnZTU0MTAiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCi0JICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCi0JICBTTUUgcHJvZHVjdCBsaW5lLgotCi1jb25maWcgU0hfSFM3NzUxUlZPSVAKLQlib29sICJIUzc3NTFSVk9JUCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIFNlbGVjdCBIUzc3NTFSVk9JUCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKLQkgIFNhbGVzIFZvSVAgYm9hcmQuCi0KLWNvbmZpZyBTSF83NzEwVk9JUEdXCi0JYm9vbCAiU0g3NzEwLVZPSVAtR1ciCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcxMAotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIFNINzcxMCBiYXNlZAotCSAgVk9JUCBHVy4KLQotY29uZmlnIFNIX1JUUzc3NTFSMkQKLQlib29sICJSVFM3NzUxUjJEIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFJUUzc3NTFSMkQgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5Ci0JICBTYWxlcyBTSC1HcmFwaGljcyBib2FyZC4KLQotY29uZmlnIFNIX0hJR0hMQU5ERVIKLQlib29sICJIaWdobGFuZGVyIgotCi1jb25maWcgU0hfRURPU0s3NzA1Ci0JYm9vbCAiRURPU0s3NzA1IgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDUKLQotY29uZmlnIFNIX1NINDIwMl9NSUNST0RFVgotCWJvb2wgIlNINC0yMDIgTWljcm9EZXYiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINF8yMDIKLQloZWxwCi0JICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKLQkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCi0KLWNvbmZpZyBTSF9MQU5ESVNLCi0JYm9vbCAiTEFORElTSyIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUxUgotCWhlbHAKLQkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCi0KLWNvbmZpZyBTSF9USVRBTgotCWJvb2wgIlRJVEFOIgotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCi0JaGVscAotCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcwotCSAgTmV0RW5naW5lIE5QNTFSLgotCi1jb25maWcgU0hfU0hNSU4KLQlib29sICJTSE1JTiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzA2Ci0JaGVscAotCSAgU2VsZWN0IFNITUlOIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQuCi0KLWNvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JaGVscAotCSAgU2VsZWN0IDcyMDYgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDcyMDYKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0KLWNvbmZpZyBTSF83NjE5X1NPTFVUSU9OX0VOR0lORQotCWJvb2wgIlNvbHV0aW9uRW5naW5lNzYxOSIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NjE5Ci0JaGVscAotCSAgU2VsZWN0IDc2MTkgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc2MTkKLQkgIGV2YWx1YXRpb24gYm9hcmQuCi0JCi1jb25maWcgU0hfTEJPWF9SRTIKLQlib29sICJMLUJPWCBSRTIiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MVIKLQloZWxwCi0JICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgotCi1jb25maWcgU0hfVU5LTk9XTgotCWJvb2wgIkJhcmVDUFUiCi0JaGVscAotCSAgIkJhcmUgQ1BVIiBha2EgInVua25vd24iIG1lYW5zIGFuIFNILWJhc2VkIHN5c3RlbSB3aGljaCBpcyBub3Qgb25lCi0JICBvZiB0aGUgc3BlY2lmaWMgb25lcyBtZW50aW9uZWQgYWJvdmUsIHdoaWNoIG1lYW5zIHlvdSBuZWVkIHRvIGVudGVyCi0JICBhbGwgc29ydHMgb2Ygc3R1ZmYgbGlrZSBDT05GSUdfTUVNT1JZX1NUQVJUIGJlY2F1c2UgdGhlIGNvbmZpZwotCSAgc3lzdGVtIGRvZXNuJ3QgYWxyZWFkeSBrbm93IHdoYXQgaXQgaXMuICBZb3UgZ2V0IGEgbWFjaGluZSB2ZWN0b3IKLQkgIHdpdGhvdXQgYW55IHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgaW4gaXQsIHNvIHRoaW5ncyBsaWtlIHRoZSBSVEMgbWF5Ci0JICBub3Qgd29yay4KLQotCSAgVGhpcyBvcHRpb24gaXMgZm9yIHRoZSBlYXJseSBzdGFnZXMgb2YgcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lLgotCi1lbmRjaG9pY2UKLQotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCi1zb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgotc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyIKLQogc291cmNlICJhcmNoL3NoL21tL0tjb25maWciCiAKLWNvbmZpZyBDRl9FTkFCTEVSCi0JYm9vbCAiQ29tcGFjdCBGbGFzaCBFbmFibGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTSF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfVU5LTk9XTiB8fCBTSF9TSDAzCi0JLS0taGVscC0tLQotCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCi0JICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91Ci0JICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KLQkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0Ci0JICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCi0KLQkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKLQkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcwotCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KLQotCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCi0KLWNob2ljZQotCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCi0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCBDRl9BUkVBNgotCi1jb25maWcgQ0ZfQVJFQTUKLQlib29sICJBcmVhNSIKLQloZWxwCi0JICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKLQkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KLQotCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQotCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCi0KLQkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KLQotY29uZmlnIENGX0FSRUE2Ci0JYm9vbCAiQXJlYTYiCi0KLWVuZGNob2ljZQotCi1jb25maWcgQ0ZfQkFTRV9BRERSCi0JaGV4Ci0JZGVwZW5kcyBvbiBDRl9FTkFCTEVSCi0JZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKLQlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQotCiBtZW51ICJQcm9jZXNzb3IgZmVhdHVyZXMiCiAKIGNob2ljZQpAQCAtMzUxLDcgKzExNSw3IEBACiAKIGNvbmZpZyBTSF9GUFUKIAlib29sICJGUFUgc3VwcG9ydCIKLQlkZXBlbmRzIG9uICFDUFVfU0gzCisJZGVwZW5kcyBvbiBDUFVfU0g0CiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIFNIIHByb2Nlc3NvcnMgdGhhdApAQCAtNDM3LDYgKzIwMSwyMDkgQEAKIAogZW5kbWVudQogCittZW51ICJCb2FyZCBzdXBwb3J0IgorCitjb25maWcgU09MVVRJT05fRU5HSU5FCisJYm9vbAorCitjb25maWcgU0hfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmUiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzA5IHx8IENQVV9TVUJUWVBFX1NINzc1MAorCWhlbHAKKwkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQorCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MjA2X1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzIwNiIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcyMDYKKwloZWxwCisJICBTZWxlY3QgNzIwNiBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzIwNgorCSAgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc2MTlfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NjE5IgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzYxOQorCWhlbHAKKwkgIFNlbGVjdCA3NjE5IFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NjE5CisJICBldmFsdWF0aW9uIGJvYXJkLgorCQorY29uZmlnIFNIXzc3MjJfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzIyIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcyMgorCWhlbHAKKwkgIFNlbGVjdCA3NzIyIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzIKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEKKwloZWxwCisJICBTZWxlY3QgNzc1MSBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzc1MQorCSAgZXZhbHVhdGlvbiBib2FyZC4KKwkgIAorY29uZmlnIFNIXzc3ODBfU09MVVRJT05fRU5HSU5FCisJYm9vbCAiU29sdXRpb25FbmdpbmU3NzgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCisJaGVscAorCSAgU2VsZWN0IDc3ODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTSDc3ODAKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzAwX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzMwMCIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczMDAKKwloZWxwCisJICBTZWxlY3QgNzMwMCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczMDAoU0gtTW9iaWxlIFYpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzQzX1NPTFVUSU9OX0VOR0lORQorCWJvb2wgIlNvbHV0aW9uRW5naW5lNzM0MyIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDczNDMKKwloZWxwCisJICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCisKK2NvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzMxODAKKwloZWxwCisJICBTZWxlY3QgNzMxODAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQorCSAgU0g3MzE4MChTSC1Nb2JpbGUgMykgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIXzc3NTFfU1lTVEVNSAorCWJvb2wgIlN5c3RlbUg3NzUxUiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgU3lzdGVtSCBpZiB5b3UgYXJlIGNvbmZpZ3VyaW5nIGZvciBhIFJlbmVzYXMgU3lzdGVtSAorCSAgNzc1MVIgZXZhbHVhdGlvbiBib2FyZC4KKworY29uZmlnIFNIX0hQNlhYCisJYm9vbCAiSFA2WFgiCisJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCisJc2VsZWN0IEhENjQ0NlhfU0VSSUVTCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKKwloZWxwCisJICBTZWxlY3QgSFA2WFggaWYgY29uZmlndXJpbmcgZm9yIGEgSFAgam9ybmFkYSBIUDZ4eC4KKwkgIE1vcmUgaW5mb3JtYXRpb24gKGhhcmR3YXJlIG9ubHkpIGF0CisJICA8aHR0cDovL3d3dy5ocC5jb20vam9ybmFkYS8+LgorCitjb25maWcgU0hfRFJFQU1DQVNUCisJYm9vbCAiRHJlYW1jYXN0IgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDcwOTEKKwloZWxwCisJICBTZWxlY3QgRHJlYW1jYXN0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIFNFR0EgRHJlYW1jYXN0LgorCSAgTW9yZSBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubTE3bi5vcmcvbGludXgtc2gvZHJlYW1jYXN0Lz4uICBUaGVyZSBpcyBhCisJICBEcmVhbWNhc3QgcHJvamVjdCBpcyBhdCA8aHR0cDovL2xpbnV4ZGMuc291cmNlZm9yZ2UubmV0Lz4uCisKK2NvbmZpZyBTSF9NUEMxMjExCisJYm9vbCAiSW50ZXJmYWNlIE1QQzEyMTEiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTEgJiYgQlJPS0VOCisJaGVscAorCSAgQ1RQL1BDSS1TSDAyIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NIMDMKKwlib29sICJJbnRlcmZhY2UgQ1RQL1BDSS1TSDAzIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxICYmIEJST0tFTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgQ1RQL1BDSS1TSDAzIGlzIGEgQ1BVIG1vZHVsZSBjb21wdXRlciB0aGF0IGlzIHByb2R1Y2VkCisJICBieSBJbnRlcmZhY2UgQ29ycG9yYXRpb24uCisJICBNb3JlIGluZm9ybWF0aW9uIGF0IDxodHRwOi8vd3d3LmludGVyZmFjZS5jby5qcD4KKworY29uZmlnIFNIX1NFQ1VSRUVER0U1NDEwCisJYm9vbCAiU2VjdXJlRWRnZTU0MTAiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgU2VjdXJlRWRnZTU0MTAgaWYgY29uZmlndXJpbmcgZm9yIGEgU25hcEdlYXIgU0ggYm9hcmQuCisJICBUaGlzIGluY2x1ZGVzIGJvdGggdGhlIE9FTSBTZWN1cmVFZGdlIHByb2R1Y3RzIGFzIHdlbGwgYXMgdGhlCisJICBTTUUgcHJvZHVjdCBsaW5lLgorCitjb25maWcgU0hfSFM3NzUxUlZPSVAKKwlib29sICJIUzc3NTFSVk9JUCIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwloZWxwCisJICBTZWxlY3QgSFM3NzUxUlZPSVAgaWYgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBUZWNobm9sb2d5CisJICBTYWxlcyBWb0lQIGJvYXJkLgorCitjb25maWcgU0hfNzcxMFZPSVBHVworCWJvb2wgIlNINzcxMC1WT0lQLUdXIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzEwCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGJ1aWxkIGEga2VybmVsIGZvciB0aGUgU0g3NzEwIGJhc2VkCisJICBWT0lQIEdXLgorCitjb25maWcgU0hfUlRTNzc1MVIyRAorCWJvb2wgIlJUUzc3NTFSMkQiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKKwkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgorCitjb25maWcgU0hfSElHSExBTkRFUgorCWJvb2wgIkhpZ2hsYW5kZXIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1CisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKworY29uZmlnIFNIX0VET1NLNzcwNQorCWJvb2wgIkVET1NLNzcwNSIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNQorCitjb25maWcgU0hfU0g0MjAyX01JQ1JPREVWCisJYm9vbCAiU0g0LTIwMiBNaWNyb0RldiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKKwloZWxwCisJICBTZWxlY3QgU0g0LTIwMiBNaWNyb0RldiBpZiBjb25maWd1cmluZyBmb3IgYSBTdXBlckggTWljcm9EZXYgYm9hcmQKKwkgIHdpdGggYW4gU0g0LTIwMiBDUFUuCisKK2NvbmZpZyBTSF9MQU5ESVNLCisJYm9vbCAiTEFORElTSyIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc1MVIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1BDSQorCWhlbHAKKwkgIEktTyBEQVRBIERFVklDRSwgSU5DLiAiTEFORElTSyBTZXJpZXMiIHN1cHBvcnQuCisKK2NvbmZpZyBTSF9USVRBTgorCWJvb2wgIlRJVEFOIgorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCisJaGVscAorCSAgU2VsZWN0IFRpdGFuIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgTmltYmxlIE1pY3Jvc3lzdGVtcworCSAgTmV0RW5naW5lIE5QNTFSLgorCitjb25maWcgU0hfU0hNSU4KKwlib29sICJTSE1JTiIKKwlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzcwNgorCWhlbHAKKwkgIFNlbGVjdCBTSE1JTiBpZiBjb25maWd1cmluZyBmb3IgdGhlIFNITUlOIGJvYXJkLgorCitjb25maWcgU0hfTEJPWF9SRTIKKwlib29sICJMLUJPWCBSRTIiCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTFSCisJc2VsZWN0IFNZU19TVVBQT1JUU19QQ0kKKwloZWxwCisJICBTZWxlY3QgTC1CT1ggUkUyIGlmIGNvbmZpZ3VyaW5nIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyLgorCitlbmRtZW51CisKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWciCisKIG1lbnUgIlRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uIgogCiBjb25maWcgU0hfVE1VCkBAIC00NzMsMTMgKzQ0MCwxMyBAQAogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MCB8fCBDUFVfU1VCVFlQRV9TSDczNDMKIAlkZWZhdWx0ICIzMTI1MDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAiMzIwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzcyMgogCWRlZmF1bHQgIjMzMzMzMzMzIiBpZiBDUFVfU1VCVFlQRV9TSDczMDAgfHwgQ1BVX1NVQlRZUEVfU0g3NzcwIHx8IFwKIAkJCSAgICAgIENQVV9TVUJUWVBFX1NINzc2MCB8fCBDUFVfU1VCVFlQRV9TSDc3MDUgfHwgXAogCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JZGVmYXVsdCAiNTAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgXAotCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3Nzg1Ci0JZGVmYXVsdCAiNjAwMDAwMDAiIGlmIENQVV9TVUJUWVBFX1NINzc1MQorCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEgfHwgQ1BVX1NVQlRZUEVfU0g3NzUxUgogCWRlZmF1bHQgIjY2MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDRfMjAyCisJZGVmYXVsdCAiNTAwMDAwMDAiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeS4KIAkgIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkZXRlcm1pbmluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIHZhbHVlIG9uCkBAIC00ODcsOCArNDU0LDEwIEBACiAKIGNvbmZpZyBTSF9DTEtfTUQKIAlpbnQgIkNQVSBNb2RlIFBpbiBTZXR0aW5nIgotCWRlZmF1bHQgMAogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NjE5IHx8IENQVV9TVUJUWVBFX1NINzIwNgorCWRlZmF1bHQgNiBpZiBDUFVfU1VCVFlQRV9TSDcyMDYKKwlkZWZhdWx0IDUgaWYgQ1BVX1NVQlRZUEVfU0g3NjE5CisJZGVmYXVsdCAwCiAJaGVscAogCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgogCkBAIC01NjAsNiArNTI5LDcgQEAKIAogY29uZmlnIFNNUAogCWJvb2wgIlN5bW1ldHJpYyBtdWx0aS1wcm9jZXNzaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfU01QCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBtb3JlIHRoYW4gb25lIENQVS4gSWYgeW91IGhhdmUKIAkgIGEgc3lzdGVtIHdpdGggb25seSBvbmUgQ1BVLCBsaWtlIG1vc3QgcGVyc29uYWwgY29tcHV0ZXJzLCBzYXkgTi4gSWYKQEAgLTU4NCw2ICs1NTQsNyBAQAogCWludCAiTWF4aW11bSBudW1iZXIgb2YgQ1BVcyAoMi0zMikiCiAJcmFuZ2UgMiAzMgogCWRlcGVuZHMgb24gU01QCisJZGVmYXVsdCAiNCIgaWYgQ1BVX1NIWDMKIAlkZWZhdWx0ICIyIgogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBDUFVzIHdoaWNoIHRoaXMKQEAgLTYyMyw2ICs1OTQsNyBAQAogCiBjb25maWcgVUJDX1dBS0VVUAogCWJvb2wgIldha2V1cCBVQkMgb24gc3RhcnR1cCIKKwlkZXBlbmRzIG9uIENQVV9TSDQKIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCB3YWtldXAgdGhlIFVzZXIgQnJlYWsgQ29udHJvbGxlciAoVUJDKSBvbgogCSAgc3RhcnR1cC4gQWx0aG91Z2ggdGhlIFVCQyBpcyBsZWZ0IGluIGFuIGF3YWtlIHN0YXRlIHdoZW4gdGhlIHByb2Nlc3NvcgpAQCAtNjUxLDggKzYyMyw4IEBACiAjIHdlJ3JlIG5vdCB1c2luZyBQQ01DSUEsIHNvIHdlIG1ha2UgaXQgZGVwZW5kZW50IG9uCiAjIFBDTUNJQSBvdXRyaWdodC4gLS0gUEZNLgogY29uZmlnIElTQQotCWJvb2wKLQlkZWZhdWx0IHkgaWYgUENNQ0lBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gUENNQ0lBICYmIEhENjQ0NlhfU0VSSUVTCiAJaGVscAogCSAgRmluZCBvdXQgd2hldGhlciB5b3UgaGF2ZSBJU0Egc2xvdHMgb24geW91ciBtb3RoZXJib2FyZC4gIElTQSBpcyB0aGUKIAkgIG5hbWUgb2YgYSBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYKQEAgLTY5MCw2ICs2NjIsNDkgQEAKIAl0cmlzdGF0ZSAiU3VwZXJIeXdheSBCdXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINF8yMDIKIAorY29uZmlnIENGX0VOQUJMRVIKKwlib29sICJDb21wYWN0IEZsYXNoIEVuYWJsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPTFVUSU9OX0VOR0lORSB8fCBTSF9TSDAzCisJLS0taGVscC0tLQorCSAgQ29tcGFjdCBGbGFzaCBpcyBhIHNtYWxsLCByZW1vdmFibGUgbWFzcyBzdG9yYWdlIGRldmljZSBpbnRyb2R1Y2VkCisJICBpbiAxOTk0IG9yaWdpbmFsbHkgYXMgYSBQQ01DSUEgZGV2aWNlLiAgSWYgeW91IHNheSBgWScgaGVyZSwgeW91CisJICBjb21waWxlIGluIHN1cHBvcnQgZm9yIENvbXBhY3QgRmxhc2ggZGV2aWNlcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKwkgIGEgU3VwZXJIIHByb2Nlc3Nvci4gIEEgQ29tcGFjdCBGbGFzaCBGQVEgaXMgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy5jb21wYWN0Zmxhc2gub3JnL2ZhcXMvZmFxLmh0bT4uCisKKwkgIElmIHlvdXIgYm9hcmQgaGFzICJEaXJlY3RseSBDb25uZWN0ZWQiIENvbXBhY3RGbGFzaCBhdCBhcmVhIDUgb3IgNiwKKwkgIHlvdSBtYXkgd2FudCB0byBlbmFibGUgdGhpcyBvcHRpb24uICBUaGVuLCB5b3UgY2FuIHVzZSBDRiBhcworCSAgcHJpbWFyeSBJREUgZHJpdmUgKG9ubHkgdGVzdGVkIGZvciBTYW5EaXNrKS4KKworCSAgSWYgaW4gZG91YnQsIHNlbGVjdCAnTicuCisKK2Nob2ljZQorCXByb21wdCAiQ29tcGFjdCBGbGFzaCBDb25uZWN0aW9uIEFyZWEiCisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCBDRl9BUkVBNgorCitjb25maWcgQ0ZfQVJFQTUKKwlib29sICJBcmVhNSIKKwloZWxwCisJICBJZiB5b3VyIGJvYXJkIGhhcyAiRGlyZWN0bHkgQ29ubmVjdGVkIiBDb21wYWN0Rmxhc2gsIFlvdSBzaG91bGQKKwkgIHNlbGVjdCB0aGUgYXJlYSB3aGVyZSB5b3VyIENGIGlzIGNvbm5lY3RlZCB0by4KKworCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQorCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCisKKwkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4KKworY29uZmlnIENGX0FSRUE2CisJYm9vbCAiQXJlYTYiCisKK2VuZGNob2ljZQorCitjb25maWcgQ0ZfQkFTRV9BRERSCisJaGV4CisJZGVwZW5kcyBvbiBDRl9FTkFCTEVSCisJZGVmYXVsdCAiMHhiODAwMDAwMCIgaWYgQ0ZfQVJFQTYKKwlkZWZhdWx0ICIweGI0MDAwMDAwIiBpZiBDRl9BUkVBNQorCiBzb3VyY2UgImFyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgpAQCAtNzA3LDcgKzcyMiw3IEBACiBlbmRtZW51CiAKIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKSIKLWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCitkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTWVNfU1VQUE9SVFNfUE0KIAogc291cmNlIGtlcm5lbC9wb3dlci9LY29uZmlnCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwppbmRleCBiNTYzMDcyLi41MmY2YTk5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCkBAIC01Miw2ICs1MiwxMCBAQAogCSAgc2VsZWN0IGJvdGggdGhlIEVBUkxZX1NDSUZfQ09OU09MRSBhbmQgU0hfU1RBTkRBUkRfQklPUywgdXNpbmcKIAkgIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0b2dnbGUgYmFjayBhbmQgZm9ydGguCiAKK2NvbmZpZyBERUJVR19CT09UTUVNCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlib29sICJEZWJ1ZyBCT09UTUVNIGluaXRpYWxpemF0aW9uIgorCiBjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVwogCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKQEAgLTgyLDYgKzg2LDcgQEAKIAlib29sICJJbmNsdWRlIEtHREIga2VybmVsIGRlYnVnZ2VyIgogCXNlbGVjdCBGUkFNRV9QT0lOVEVSCiAJc2VsZWN0IERFQlVHX0lORk8KKwlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAogCWhlbHAKIAkgIEluY2x1ZGUgaW4ta2VybmVsIGhvb2tzIGZvciBrZ2RiLCB0aGUgTGludXgga2VybmVsIHNvdXJjZSBsZXZlbAogCSAgZGVidWdnZXIuICBTZWUgPGh0dHA6Ly9rZ2RiLnNvdXJjZWZvcmdlLm5ldC8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggODgzYjAzYi4uNzdmZWNjNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0zNCwyMCArMzQsMjAgQEAKIGVuZGlmCiBlbmRpZgogCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJOj0gLW0yYSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQotY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKLWNmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKK2NmbGFncy0kKENPTkZJR19DUFVfU0gyKQkJOj0gJChjYWxsIGNjLW9wdGlvbiwtbTIsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTJhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tMywpCitjZmxhZ3MtJChDT05GSUdfQ1BVX1NINCkJCTo9ICQoY2FsbCBjYy1vcHRpb24sLW00LCkgXAogCSQoY2FsbCBjYy1vcHRpb24sLW1uby1pbXBsaWNpdC1mcCwtbTQtbm9mcHUpCi1jZmxhZ3MtJChDT05GSUdfQ1BVX1NINEEpCQk6PSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEsKSAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDRBKQkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbTRhLCkgXAorCQkJCQkgICAkKGNhbGwgY2Mtb3B0aW9uLC1tNGEtbm9mcHUsKQogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX0JJR19FTkRJQU4pCQkrPSAtbWIKIGNmbGFncy0kKENPTkZJR19DUFVfTElUVExFX0VORElBTikJKz0gLW1sCiAKIGNmbGFncy15CSs9ICQoY2FsbCBhcy1vcHRpb24sLVdhJChjb21tYSktaXNhPSQoaXNhLXkpLCkgLWZmcmVlc3RhbmRpbmcKIAotY2ZsYWdzLSQoQ09ORklHX1NIX0RTUCkJCQkrPSAtV2EsLWRzcAotCiBjZmxhZ3MtJChDT05GSUdfTU9SRV9DT01QSUxFX09QVElPTlMpCSs9IFwKIAkkKHNoZWxsIGVjaG8gJChDT05GSUdfQ09NUElMRV9PUFRJT05TKSB8IHNlZCAtZSAncy8iLy9nJykKIApAQCAtODcsMzkgKzg3LDM3IEBACiBjb3JlLSQoQ09ORklHX1NIX0ZQVV9FTVUpCSs9IGFyY2gvc2gvbWF0aC1lbXUvCiAKICMgQm9hcmRzCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkJCTo9IHNlLzc3MHgKLW1hY2hkaXItJChDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3MjIKLW1hY2hkaXItJChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3NTEKLW1hY2hkaXItJChDT05GSUdfU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzc3ODAKLW1hY2hkaXItJChDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczMDAKLW1hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczNDMKLW1hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzE4MAotbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAotbWFjaGRpci0kKENPTkZJR19TSF9TQVRVUk4pCQkJOj0gc2F0dXJuCi1tYWNoZGlyLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCQk6PSBkcmVhbWNhc3QKLW1hY2hkaXItJChDT05GSUdfU0hfTVBDMTIxMSkJCQk6PSBtcGMxMjExCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NIMDMpCQkJOj0gc2gwMwotbWFjaGRpci0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCTo9IHNuYXBnZWFyCi1tYWNoZGlyLSQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKQkJOj0gcmVuZXNhcy9oczc3NTFydm9pcAotbWFjaGRpci0kKENPTkZJR19TSF9SVFM3NzUxUjJEKQkJCTo9IHJlbmVzYXMvcnRzNzc1MXIyZAotbWFjaGRpci0kKENPTkZJR19TSF83NzUxX1NZU1RFTUgpCQk6PSByZW5lc2FzL3N5c3RlbWgKLW1hY2hkaXItJChDT05GSUdfU0hfRURPU0s3NzA1KQkJCTo9IHJlbmVzYXMvZWRvc2s3NzA1Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0hJR0hMQU5ERVIpCQkJOj0gcmVuZXNhcy9yNzc4MHJwCi1tYWNoZGlyLSQoQ09ORklHX1NIXzc3MTBWT0lQR1cpCQkJOj0gcmVuZXNhcy9zaDc3MTB2b2lwZ3cKLW1hY2hkaXItJChDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWKQkJOj0gc3VwZXJoL21pY3JvZGV2Ci1tYWNoZGlyLSQoQ09ORklHX1NIX0xBTkRJU0spCQkJOj0gbGFuZGlzawotbWFjaGRpci0kKENPTkZJR19TSF9USVRBTikJCQk6PSB0aXRhbgotbWFjaGRpci0kKENPTkZJR19TSF9TSE1JTikJCQk6PSBzaG1pbgotbWFjaGRpci0kKENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzIwNgotbWFjaGRpci0kKENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzYxOQotbWFjaGRpci0kKENPTkZJR19TSF9MQk9YX1JFMikJCQk6PSBsYm94cmUyCi1tYWNoZGlyLSQoQ09ORklHX1NIX1VOS05PV04pCQkJOj0gdW5rbm93bgorbWFjaGRpci0kKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCQkrPSBzZS83NzB4CittYWNoZGlyLSQoQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzIyCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzUxCittYWNoZGlyLSQoQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NzgwCittYWNoZGlyLSQoQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzAwCittYWNoZGlyLSQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MzQzCittYWNoZGlyLSQoQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSkJKz0gc2UvNzMxODAKK21hY2hkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJKz0gaHA2eHgKK21hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCSs9IGRyZWFtY2FzdAorbWFjaGRpci0kKENPTkZJR19TSF9NUEMxMjExKQkJCSs9IG1wYzEyMTEKK21hY2hkaXItJChDT05GSUdfU0hfU0gwMykJCQkrPSBzaDAzCittYWNoZGlyLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJKz0gc25hcGdlYXIKK21hY2hkaXItJChDT05GSUdfU0hfSFM3NzUxUlZPSVApCQkrPSByZW5lc2FzL2hzNzc1MXJ2b2lwCittYWNoZGlyLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkJKz0gcmVuZXNhcy9ydHM3NzUxcjJkCittYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU1lTVEVNSCkJCSs9IHJlbmVzYXMvc3lzdGVtaAorbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJKz0gcmVuZXNhcy9lZG9zazc3MDUKK21hY2hkaXItJChDT05GSUdfU0hfSElHSExBTkRFUikJCQkrPSByZW5lc2FzL3I3NzgwcnAKK21hY2hkaXItJChDT05GSUdfU0hfNzcxMFZPSVBHVykJCQkrPSByZW5lc2FzL3NoNzcxMHZvaXBndworbWFjaGRpci0kKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCQkrPSBzdXBlcmgvbWljcm9kZXYKK21hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQkrPSBsYW5kaXNrCittYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCSs9IHRpdGFuCittYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCSs9IHNobWluCittYWNoZGlyLSQoQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83MjA2CittYWNoZGlyLSQoQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FKQkrPSBzZS83NjE5CittYWNoZGlyLSQoQ09ORklHX1NIX0xCT1hfUkUyKQkJCSs9IGxib3hyZTIKIAotaW5jZGlyLXkJCQk6PSAkKG5vdGRpciAkKG1hY2hkaXIteSkpCi1pbmNkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJOj0gaHA2eHgKK2luY2Rpci15CTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKIAogaWZuZXEgKCQobWFjaGRpci15KSwpCi1jb3JlLXkJCQkJKz0gYXJjaC9zaC9ib2FyZHMvJChtYWNoZGlyLXkpLworY29yZS15CSs9ICQoYWRkcHJlZml4IGFyY2gvc2gvYm9hcmRzLywgXAorCSAgICAgJChmaWx0ZXItb3V0IC4sICQocGF0c3Vic3QgJSwlLywkKG1hY2hkaXIteSkpKSkKIGVuZGlmCiAKICMgQ29tcGFuaW9uIGNoaXBzCkBAIC0xNTcsMTkgKzE1NSwzMSBAQAogIwlNb3N0IGJvYXJkcyBoYXZlIHRoZWlyIG93biBtYWNoIGRpcmVjdG9yaWVzLiAgRm9yIHRoZSBvbmVzIHRoYXQKICMJZG9uJ3QsIGp1c3QgcmVmZXJlbmNlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHNvIHRoZSBzZW1hbnRpY3MgYXJlCiAjCWtlcHQgcm91Z2hseSB0aGUgc2FtZS4KKyMKKyMJV2hlbiBtdWx0aXBsZSBib2FyZHMgYXJlIGNvbXBpbGVkIGluIGF0IHRoZSBzYW1lIHRpbWUsIHByZWZlcmVuY2UKKyMJZm9yIHRoZSBtYWNoIGxpbmsgaXMgZ2l2ZW4gdG8gd2hpY2hldmVyIGhhcyBhIGRpcmVjdG9yeSBmb3IgaXRzCisjCWhlYWRlcnMuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIHdvcmthcm91bmQgdW50aWwgcGxhdGZvcm1zIHRoYXQKKyMJY2FuIGxpdmUgaW4gdGhlIHNhbWUga2VybmVsIGltYWdlIGJhY2sgYXdheSBmcm9tIHJlbHlpbmcgb24gdGhlCisjCW1hY2ggbGluay4KIAogaW5jbHVkZS9hc20tc2gvLm1hY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvc2gvKi5oKSBcCiAJCSAgICAgIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiBGT1JDRQotCUBlY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnCiAJJChRKWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaCBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUvYXNtLXNoOyBmaQotCSQoUSlpZiBbIC1kICQoaW5jZGlyLXByZWZpeCkkKGluY2Rpci15KSBdOyB0aGVuIFwKLQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gvJChpbmNkaXIteSknOyBcCi0JCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQoaW5jZGlyLXkpIFwKKwkkKFEpcm0gLWYgaW5jbHVkZS9hc20tc2gvbWFjaAorCSQoUSlmb3IgaSBpbiAkKGluY2Rpci15KTsgZG8gXAorCWlmIFsgLWQgJChpbmNkaXItcHJlZml4KSQkaSBdOyB0aGVuIFwKKwkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQllY2hvIC1lICJpbmNsdWRlL2FzbS1zaC8kJGkiOyBcCisJCWxuIC1mc24gJChpbmNkaXItcHJlZml4KSQkaSBcCiAJCQlpbmNsdWRlL2FzbS1zaC9tYWNoOyBcCiAJZWxzZSBcCi0JCWVjaG8gLWUgJ2luY2x1ZGUvYXNtLXNoJzsgXAotCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAotCWZpCisJCWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaC9tYWNoIF07IHRoZW4gXAorCQkJZWNobyAtbiAnICBTWU1MSU5LIGluY2x1ZGUvYXNtLXNoL21hY2ggLT4gJzsgXAorCQkJZWNobyAtZSAnaW5jbHVkZS9hc20tc2gnOyBcCisJCQlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkgaW5jbHVkZS9hc20tc2gvbWFjaDsgXAorCQlmaTsgXAorCWZpOyBcCisJZG9uZQogCUB0b3VjaCAkQAogCiBhcmNocHJlcGFyZTogaW5jbHVkZS9hc20tc2gvLmNwdSBpbmNsdWRlL2FzbS1zaC8ubWFjaCBtYWtldG9vbHMKQEAgLTE4OCw3ICsxOTgsOSBAQAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAotQ0xFQU5fRklMRVMgKz0gaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oIFwKKwkgICAgICAgaW5jbHVkZS9hc20tc2gvY3B1IGluY2x1ZGUvYXNtLXNoLy5jcHUgXAorCSAgICAgICBpbmNsdWRlL2FzbS1zaC9tYWNoIGluY2x1ZGUvYXNtLXNoLy5tYWNoCiAKIGRlZmluZSBhcmNoaGVscAogCUBlY2hvICcqIHpJbWFnZSAJICAgICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlJwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCBmMTMwMTdlLi44Nzk5ZGY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwpAQCAtNjAsNyArNjAsNyBAQAogI2VuZGlmCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9kcmVhbWNhc3QgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2RyZWFtY2FzdCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU2VnYSBEcmVhbWNhc3QiLAogCS5tdl9zZXR1cAkJPSBkcmVhbWNhc3Rfc2V0dXAsCiAJLm12X2lycV9kZW11eAkJPSBzeXN0ZW1hc2ljX2lycV9kZW11eCwKQEAgLTcwLDQgKzcwLDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gZHJlYW1jYXN0X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKGRyZWFtY2FzdCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkYmJhOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaHA2eHgvbWFjaC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBNYWNoaW5lIHZlY3RvciBmb3IgdGhlIEhQNjgwCi0gKi8KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2eHggX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCi0KLQkubXZfaW5iID0gaGQ2NDQ2MV9pbmIsCi0JLm12X2ludyA9IGhkNjQ0NjFfaW53LAotCS5tdl9pbmwgPSBoZDY0NDYxX2lubCwKLQkubXZfb3V0YiA9IGhkNjQ0NjFfb3V0YiwKLQkubXZfb3V0dyA9IGhkNjQ0NjFfb3V0dywKLQkubXZfb3V0bCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbmJfcCA9IGhkNjQ0NjFfaW5iX3AsCi0JLm12X2lud19wID0gaGQ2NDQ2MV9pbncsCi0JLm12X2lubF9wID0gaGQ2NDQ2MV9pbmwsCi0JLm12X291dGJfcCA9IGhkNjQ0NjFfb3V0Yl9wLAotCS5tdl9vdXR3X3AgPSBoZDY0NDYxX291dHcsCi0JLm12X291dGxfcCA9IGhkNjQ0NjFfb3V0bCwKLQotCS5tdl9pbnNiID0gaGQ2NDQ2MV9pbnNiLAotCS5tdl9pbnN3ID0gaGQ2NDQ2MV9pbnN3LAotCS5tdl9pbnNsID0gaGQ2NDQ2MV9pbnNsLAotCS5tdl9vdXRzYiA9IGhkNjQ0NjFfb3V0c2IsCi0JLm12X291dHN3ID0gaGQ2NDQ2MV9vdXRzdywKLQkubXZfb3V0c2wgPSBoZDY0NDYxX291dHNsLAotCi0JLm12X3JlYWR3ID0gaGQ2NDQ2MV9yZWFkdywKLQkubXZfd3JpdGV3ID0gaGQ2NDQ2MV93cml0ZXcsCi0KLQkubXZfaXJxX2RlbXV4ID0gaGQ2NDQ2MV9pcnFfZGVtdXgsCi19OwotCi1BTElBU19NVihocDZ4eCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCmluZGV4IDZhZWVlODUuLjdhZTcwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYwpAQCAtOTgsMTAgKzk4LDkgQEAKIH0KIGRldmljZV9pbml0Y2FsbChocDZ4eF9kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hwNnh4IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ocDZ4eCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9ICJocDZ4eCIsCiAJLm12X3NldHVwID0gaHA2eHhfc2V0dXAsCiAJLm12X25yX2lycXMgPSBIRDY0NDYxX0lSUUJBU0UgKyBIRDY0NDYxX0lSUV9OVU0sCiAJLm12X2lycV9kZW11eCA9IGhkNjQ0NjFfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9zZXR1cC5jCmluZGV4IGY5NTNjNzQuLmVkYTcxNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMKQEAgLTk3LDEwICs5Nyw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9sYW5kaXNrIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIkxBTkRJU0siLAogCS5tdl9ucl9pcnFzID0gNzIsCiAJLm12X3NldHVwID0gbGFuZGlza19zZXR1cCwKIAkubXZfaW5pdF9pcnEgPSBpbml0X2xhbmRpc2tfSVJRLAogfTsKLUFMSUFTX01WKGxhbmRpc2spCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9sYm94cmUyL3NldHVwLmMKaW5kZXggNGUyMGY3Yy4uOWM4MzBmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbGJveHJlMi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xib3hyZTIvc2V0dXAuYwpAQCAtNzcsOSArNzcsOCBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGJveHJlMiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiTC1CT1ggUkUyIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9sYm94cmUyX0lSUSwKIH07Ci1BTElBU19NVihsYm94cmUyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCmluZGV4IDFhMDYwNGIuLjhjZTAzZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKQEAgLTMzOCwxMSArMzM4LDEwIEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJJbnRlcmZhY2UgTVBDLTEyMTEoQ1RQL1BDSS9NUEMtU0gwMikiLAogCS5tdl9zZXR1cAkJPSBtcGMxMjExX3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCiB9OwotQUxJQVNfTVYobXBjMTIxMSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9zZXR1cC5jCmluZGV4IGVjNWJlMDEuLmYwNzZjNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYwpAQCAtMjEsNyArMjEsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZWRvc2s3NzA1IF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lZG9zazc3MDUgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkVET1NLNzcwNSIsCiAJLm12X25yX2lycXMJCT0gODAsCiAKQEAgLTQxLDQgKzQxLDMgQEAKIAkubXZfaXNhX3BvcnQyYWRkcgk9IHNoX2Vkb3NrNzcwNV9pc2FfcG9ydDJhZGRyLAogCS5tdl9pbml0X2lycQkJPSBzaF9lZG9zazc3MDVfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoZWRvc2s3NzA1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCmluZGV4IGY3ZDBlMzAuLmZhNWZhMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgSFM3NzUxUlZvSVAtMiBzdXBwb3J0LlxuIik7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oczc3NTFydm9pcCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHM3NzUxcnZvaXAgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkhTNzc1MVJWb0lQIiwKIAkubXZfc2V0dXAJCT0gaHM3NzUxcnZvaXBfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xMTgsNCArMTE4LDMgQEAKIAkubXZfaW5pdF9pcnEJCT0gaHM3NzUxcnZvaXBfaW5pdF9pcnEsCiAJLm12X2lvcG9ydF9tYXAJCT0gaHM3NzUxcnZvaXBfaW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihoczc3NTFydm9pcCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKaW5kZXggOWZiMTE2NC4uZmM4ZjI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL0tjb25maWcKQEAgLTYsMTggKzYsMTggQEAKIAogY29uZmlnIFNIX1I3NzgwUlAKIAlib29sICJSNzc4MFJQLTEgYm9hcmQgc3VwcG9ydCIKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzgwCisJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3ODAKIAogY29uZmlnIFNIX1I3NzgwTVAKIAlib29sICJSNzc4ME1QIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4MAorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwCiAJaGVscAogCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBtYXNzLXByb2R1Y3Rpb24KIAkgIHZlcnNpb24gb2YgdGhlIFI3NzgwUlAuIElmIGluIGRvdWJ0LCBzYXkgWS4KIAogY29uZmlnIFNIX1I3Nzg1UlAKIAlib29sICJSNzc4NVJQIGJvYXJkIHN1cHBvcnQiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzc4NQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3Nzg1CiAKIGVuZGNob2ljZQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCmluZGV4IDA3MjdlZjkuLjVhZmI4NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCkBAIC0xNjYsMTAgKzE2Niw5IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oaWdobGFuZGVyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9oaWdobGFuZGVyIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJIaWdobGFuZGVyIiwKIAkubXZfbnJfaXJxcwkJPSAxMDksCiAJLm12X3NldHVwCQk9IGhpZ2hsYW5kZXJfc2V0dXAsCiAJLm12X2luaXRfaXJxCQk9IGhpZ2hsYW5kZXJfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoaGlnaGxhbmRlcikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKaW5kZXggNTkzZjI2YS4uNjU2ZmRhMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiUlRTNzc1MVIyRCIsCiAJLm12X3NldHVwCQk9IHJ0czc3NTFyMmRfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCkBAIC0xODksNCArMTg5LDMgQEAKIAkubXZfY29uc2lzdGVudF9mcmVlCT0gdm95YWdlcmd4X2NvbnNpc3RlbnRfZnJlZSwKICNlbmRpZgogfTsKLUFMSUFTX01WKHJ0czc3NTFyMmQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYwppbmRleCAxODA4MTBiLi4yZGNlOGJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKQEAgLTg4LDkgKzg4LDggQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNzcxMHZvaXBndyBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g3NzEwdm9pcGd3IF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTSDc3MTAgVm9JUCBHYXRld2F5IiwKIAkubXZfbnJfaXJxcwkJPSAxMDQsCiAJLm12X2luaXRfaXJxCQk9IHNoNzcxMHZvaXBnd19pbml0X2lycSwKIH07Ci1BTElBU19NVihzaDc3MTB2b2lwZ3cpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCmluZGV4IDkzNjExNzYuLmVlNzhhZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jCkBAIC0yOCw3ICsyOCw3IEBACiAJbWFrZV9zeXN0ZW1oX2lycSgweGIpOwkvKiBFdGhlcm5ldCBpbnRlcnJ1cHQgKi8KIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzeXN0ZW1oIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc3lzdGVtaCBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiNzc1MSBTeXN0ZW1IIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNTUsNCArNTUsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IHNoNzc1MXN5c3RlbWhfaW5pdF9pcnEsCiB9OwotQUxJQVNfTVYoNzc1MXN5c3RlbWgpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTMwNDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgU2VnYSBTYXR1cm4gc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAotIwotCi1vYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi0KLW9iai0kKENPTkZJR19TTVApICs9IHNtcC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTRmN2YuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lvLmMKLSAqCi0gKiBJL08gcm91dGluZXMgZm9yIHRoZSBTZWdhIFNhdHVybi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaW5jbHVkZSA8YXNtL3NhdHVybi9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0KLXVuc2lnbmVkIGxvbmcgc2F0dXJuX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIG9mZnNldDsKLX0KLQotdm9pZCAqc2F0dXJuX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gKHZvaWQgKilvZmZzZXQ7Ci19Ci0KLXZvaWQgc2F0dXJuX2lvdW5tYXAodm9pZCAqYWRkcikKLXsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQxZDNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL2lycS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qCi0gKiBJbnRlcnJ1cHRzIG1hcCBvdXQgYXMgZm9sbG93czoKLSAqCi0gKiAgVmVjdG9yCU5hbWUJCU1hc2sKLSAqCi0gKiAJNjQJVkJMQU5LSU4JMHgwMDAxCi0gKiAJNjUJVkJMQU5LT1VUCTB4MDAwMgotICoJNjYJSEJMQU5LSU4JMHgwMDA0Ci0gKgk2NwlUSU1FUjAJCTB4MDAwOAotICoJNjgJVElNRVIxCQkweDAwMTAKLSAqCTY5CURTUEVORAkJMHgwMDIwCi0gKgk3MAlTT1VORFJFUVVFU1QJMHgwMDQwCi0gKgk3MQlTWVNURU1NQU5BR0VSCTB4MDA4MAotICoJNzIJUEFECQkweDAxMDAKLSAqCTczCUxFVkVMMkRNQUVORAkweDAyMDAKLSAqCTc0CUxFVkVMMURNQUVORAkweDA0MDAKLSAqCTc1CUxFVkVMMERNQUVORAkweDA4MDAKLSAqCTc2CURNQUlMTEVHQUwJMHgxMDAwCi0gKgk3NwlTUklURURSQVdFTkQJMHgyMDAwCi0gKgk3OAlBQlVTCQkweDgwMDAKLSAqCi0gKi8KLSNkZWZpbmUgU0FUVVJOX0lSUV9NSU4JCTY0CS8qIFZCTEFOS0lOICovCi0jZGVmaW5lIFNBVFVSTl9JUlFfTUFYCQk3OAkvKiBBQlVTICovCi0KLSNkZWZpbmUgU0FUVVJOX0lSUV9NQVNLCQkweGJmZmYKLQotc3RhdGljIGlubGluZSB1MzIgc2F0dXJuX2lycV9tYXNrKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JdTMyIG1hc2s7Ci0KLQltYXNrID0gKDEgPDwgKGlycV9uciAtIFNBVFVSTl9JUlFfTUlOKSk7Ci0JbWFzayA8PD0gKGlycV9uciA9PSBTQVRVUk5fSVJRX01BWCk7Ci0JbWFzayAmPSBTQVRVUk5fSVJRX01BU0s7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1hc2tfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXUzMiBtYXNrOwotCi0JbWFzayA9IGN0cmxfaW5sKFNBVFVSTl9JTVIpOwotCW1hc2sgfD0gc2F0dXJuX2lycV9tYXNrKGlycV9ucik7Ci0JY3RybF9vdXRsKG1hc2ssIFNBVFVSTl9JTVIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5tYXNrX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1MzIgbWFzazsKLQotCW1hc2sgPSBjdHJsX2lubChTQVRVUk5fSU1SKTsKLQltYXNrICY9IH5zYXR1cm5faXJxX21hc2soaXJxX25yKTsKLQljdHJsX291dGwobWFzaywgU0FUVVJOX0lNUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCW1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2F0dXJuX2lycSh1bnNpZ25lZCBpbnQgaXJxX25yKQotewotCXVubWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JbWFza19zYXR1cm5faXJxKGlycV9ucik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9zYXR1cm5faXJxKHVuc2lnbmVkIGludCBpcnFfbnIpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxX25yXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKLQkJdW5tYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQl1bm1hc2tfc2F0dXJuX2lycShpcnFfbnIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX3NhdHVybl9pcnEodW5zaWduZWQgaW50IGlycV9ucikKLXsKLQltYXNrX3NhdHVybl9pcnEoaXJxX25yKTsKLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBzYXR1cm5faW50ID0gewotCS50eXBlbmFtZQk9ICJTYXR1cm4iLAotCS5lbmFibGUJCT0gZW5hYmxlX3NhdHVybl9pcnEsCi0JLmRpc2FibGUJPSBkaXNhYmxlX3NhdHVybl9pcnEsCi0JLmFjawkJPSBtYXNrX2FuZF9hY2tfc2F0dXJuX2lycSwKLQkuZW5kCQk9IGVuZF9zYXR1cm5faXJxLAotCS5zdGFydHVwCT0gc3RhcnR1cF9zYXR1cm5faXJxLAotCS5zaHV0ZG93bgk9IHNodXRkb3duX3NhdHVybl9pcnEsCi19OwotCi1pbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKQotewotCS8qIEZJWE1FICovCi0JcmV0dXJuIGlycV9ucjsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMzdjOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIAotICogYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMKLSAqCi0gKiBIYXJkd2FyZSBzdXBwb3J0IGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+Ci0KLWV4dGVybiBpbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKTsKLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2F0dXJuIF9faW5pdG12ID0gewotCS5tdl9uYW1lCQk9ICJTZWdhIFNhdHVybiIsCi0JLm12X25yX2lycXMJCT0gODAsCS8qIEZpeCB0aGlzIGxhdGVyICovCi0KLQkubXZfaXNhX3BvcnQyYWRkcgk9IHNhdHVybl9pc2FfcG9ydDJhZGRyLAotCS5tdl9pcnFfZGVtdXgJCT0gc2F0dXJuX2lycV9kZW11eCwKLQotCS5tdl9pb3JlbWFwCQk9IHNhdHVybl9pb3JlbWFwLAotCS5tdl9pb3VubWFwCQk9IHNhdHVybl9pb3VubWFwLAotfTsKLUFMSUFTX01WKHNhdHVybikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0NjA5MS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zYXR1cm4vc21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiAKLSAqIGFyY2gvc2gvYm9hcmRzL3NhdHVybi9zbXAuYwotICoKLSAqIFNNUCBzdXBwb3J0IGZvciB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS9zYXR1cm4vc21wYy5oPgotCi1leHRlcm4gdm9pZCBzdGFydF9zZWNvbmRhcnkodm9pZCk7Ci0KLXZvaWQgX19zbXBfc2VuZF9pcGkodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGFjdGlvbikKLXsKLQkvKiBOb3RoaW5nIGhlcmUgeWV0IC4uICovCi19Ci0KLXVuc2lnbmVkIGludCBfX3NtcF9wcm9iZV9jcHVzKHZvaWQpCi17Ci0JLyoKLQkgKiBUaGlzIGlzIGp1c3QgYSBzdHJhaWdodGZvcndhcmQgbWFzdGVyL3NsYXZlIGNvbmZpZ3VyYXRpb24sCi0JICogYW5kIHByb2JpbmcgaXNuJ3QgcmVhbGx5IHN1cHBvcnRlZC4uCi0JICovCi0JcmV0dXJuIDI7Ci19Ci0KLS8qCi0gKiBXZSdyZSBvbmx5IGFsbG93ZWQgdG8gZG8gYnl0ZS1hY2Nlc3MgdG8gU01QQyByZWdpc3RlcnMuIEluCi0gKiBhZGRpdGlvbiB0byB3aGljaCwgd2UgdHJlYXQgdGhlbSBhcyB3cml0ZS1vbmx5LCBzaW5jZQotICogcmVhZGluZyBmcm9tIHRoZW0gd2lsbCByZXR1cm4gdW5kZWZpbmVkIGRhdGEuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbXBjX3NsYXZlX3N0b3AodW5zaWduZWQgaW50IGNwdSkKLXsKLQlzbXBjX2JhcnJpZXIoKTsKLQljdHJsX291dGIoMSwgU01QQ19TVEFUVVMpOwotCi0JY3RybF9vdXRiKFNNUENfQ01EX1NTSE9GRiwgU01QQ19DT01NQU5EKTsKLQlzbXBjX2JhcnJpZXIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNtcGNfc2xhdmVfc3RhcnQodW5zaWduZWQgaW50IGNwdSkKLXsKLQljdHJsX291dGIoMSwgU01QQ19TVEFUVVMpOwotCWN0cmxfb3V0YihTTVBDX0NNRF9TU0hPTiwgU01QQ19DT01NQU5EKTsKLQotCXNtcGNfYmFycmllcigpOwotfQotCi12b2lkIF9fc21wX3NsYXZlX2luaXQodW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHZicjsKLQl2b2lkICoqZW50cnk7Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0YyB2YnIsICUwXG5cdCIgOiAiPXIiICh2YnIpKTsKLQllbnRyeSA9ICh2b2lkICoqKSh2YnIgKyAweDMxMCArIDB4OTQpOwotCi0Jc21wY19zbGF2ZV9zdG9wKGNwdSk7Ci0KLQkqKHZvaWQgKiopZW50cnkgPSAodm9pZCAqKXN0YXJ0X3NlY29uZGFyeTsKLQotCXNtcGNfc2xhdmVfc3RhcnQoY3B1KTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCmluZGV4IGNhNzE0ODcuLmEwNzRiNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKQEAgLTcwLDcgKzcwLDcgQEAKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIlNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSAyNTYsCiAJLm12X2luYgkJCT0gc2U3MjA2X2luYiwKQEAgLTk2LDQgKzk2LDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlNzIwNl9JUlEsCiB9OwotQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMKaW5kZXggZjE5NjA5NS4uZWI0NjlmNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwpAQCAtNDYsNyArNDYsNyBAQAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzMwMHNlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83MzAwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMwMCIsCiAJLm12X25yX2lycXMgPSAxMDksCiAJLm12X2luYiA9IHNoNzMwMHNlX2luYiwKQEAgLTcyLDQgKzcyLDMgQEAKIAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMwMHNlX0lSUSwKIH07Ci1BTElBU19NVig3MzAwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYwppbmRleCBlMTQzMDE3Li4xZGVlZTg1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczMTgwc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiU29sdXRpb25FbmdpbmUgNzMxODAiLAogCS5tdl9ucl9pcnFzID0gMTA4LAogCS5tdl9pbmIgPSBzaDczMTgwc2VfaW5iLApAQCAtNzMsNCArNzMsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMxODBzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKIH07Ci1BTElBU19NVig3MzE4MHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCmluZGV4IDNmZGIxNmYuLjhmZWMxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKQEAgLTY0LDcgKzY0LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczNDNzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzM0M3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczNDMiLAogCS5tdl9zZXR1cCA9IHNoNzM0M3NlX3NldHVwLAogCS5tdl9ucl9pcnFzID0gMTA4LApAQCAtOTIsNCArOTIsMyBAQAogCS5tdl9pbml0X2lycSA9IGluaXRfNzM0M3NlX0lSUSwKIAkubXZfaXJxX2RlbXV4ID0gc2htc2VfaXJxX2RlbXV4LAogfTsKLUFMSUFTX01WKDczNDNzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc2MTkvc2V0dXAuYwppbmRleCA1MmQyYzRkLi4xZDBlZjdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NjE5L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzYxOS9zZXR1cC5jCkBAIC0xNSw4ICsxNSw3IEBACiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwogCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTb2x1dGlvbkVuZ2luZSIsCiAJLm12X25yX2lycXMJCT0gMTA4LAogfTsKLUFMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKaW5kZXggYzhlY2NmZi4uY2RiMDgwNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCkBAIC0xNSw0NiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZS5oPgogCi0vKiAKLSAqIElmIHRoZSBwcm9ibGVtIG9mIG1ha2VfaXByX2lycSBpcyBzb2x2ZWQsIAotICogdGhpcyBjb2RlIHdpbGwgYmVjb21lIHVubmVjZXNzYXJ5LiA6LSkgCi0gKi8KLXN0YXRpYyB2b2lkIHNlNzcweF9kaXNhYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwotCi0JY3RybF9vdXR3KGN0cmxfaW53KHAtPmFkZHIpICYgKDB4ZmZmZiBeICgweGYgPDwgcC0+c2hpZnQpKSwgcC0+YWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNlNzcweF9lbmFibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzZTc3MHhfaXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gIk1TNzcweFNFLUZQR0EiLAotCS5tYXNrICAgICAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi0JLnVubWFzayAgICAgICAgID0gc2U3NzB4X2VuYWJsZV9pcHJfaXJxLAotCS5tYXNrX2FjayAgICAgICA9IHNlNzcweF9kaXNhYmxlX2lwcl9pcnEsCi19OwotCi12b2lkIG1ha2Vfc2U3NzB4X2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKLQkJdW5zaWduZWQgaW50IGlycSA9IHRhYmxlW2ldLmlycTsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJnNlNzcweF9pcnFfY2hpcCwKLQkJCWhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwotCQlzZXRfaXJxX2NoaXBfZGF0YShpcnEsICZ0YWJsZVtpXSk7Ci0JCXNlNzcweF9lbmFibGVfaXByX2lycShpcnEpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzZTc3MHhfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyoKIAkqIFN1cGVyIEkvTyAoSnVzdCBtaW1pYyBQQyk6CiAJKiAgMToga2V5Ym9hcmQKQEAgLTY4LDQ2ICsyOSw2NyBAQAogCSovCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCXsgMTMsIDAsIDgsICAweDBmLTEzICxCQ1JfSUxDUkF9LAotCXsgNSAsIDAsIDQsICAweDBmLSA1ICxCQ1JfSUxDUkF9LAotCXsgMTAsIDAsIDAsICAweDBmLTEwLCBCQ1JfSUxDUkJ9LAotCXsgNyAsIDAsIDQsICAweDBmLSA3LCBCQ1JfSUxDUkN9LAotCXsgMyAsIDAsIDAsICAweDBmLSAzLCBCQ1JfSUxDUkN9LAotCXsgMSAsIDAsIDEyLCAweDBmLSAxLCBCQ1JfSUxDUkR9LAotCXsgMTIsIDAsIDQsICAweDBmLTEyLCBCQ1JfSUxDUkR9LCAvKiBMQU4gKi8KLQl7IDIgLCAwLCA4LCAgMHgwZi0gMiwgQkNSX0lMQ1JFfSwgLyogUENJUlEyICovCi0JeyA2ICwgMCwgNCwgIDB4MGYtIDYsIEJDUl9JTENSRX0sIC8qIFBDSVJRMSAqLwotCXsgMTQsIDAsIDAsICAweDBmLTE0LCBCQ1JfSUxDUkV9LCAvKiBQQ0lSUTAgKi8KLQl7IDAgLCAwLCAxMiwgMHgwZiAgICwgQkNSX0lMQ1JGfSwgCi0JeyA0ICwgMCwgNCwgIDB4MGYtIDQsIEJDUl9JTENSRn0sCi0JeyA4ICwgMCwgMTIsIDB4MGYtIDgsIEJDUl9JTENSR30sCi0JeyA5ICwgMCwgOCwgIDB4MGYtIDksIEJDUl9JTENSR30sCi0JeyAxMSwgMCwgNCwgIDB4MGYtMTEsIEJDUl9JTENSR30sCisJeyAxMywgMCwgOCwgIDB4MGYtMTMsIH0sCisJeyA1ICwgMCwgNCwgIDB4MGYtIDUsIH0sCisJeyAxMCwgMSwgMCwgIDB4MGYtMTAsIH0sCisJeyA3ICwgMiwgNCwgIDB4MGYtIDcsIH0sCisJeyAzICwgMiwgMCwgIDB4MGYtIDMsIH0sCisJeyAxICwgMywgMTIsIDB4MGYtIDEsIH0sCisJeyAxMiwgMywgNCwgIDB4MGYtMTIsIH0sIC8qIExBTiAqLworCXsgMiAsIDQsIDgsICAweDBmLSAyLCB9LCAvKiBQQ0lSUTIgKi8KKwl7IDYgLCA0LCA0LCAgMHgwZi0gNiwgfSwgLyogUENJUlExICovCisJeyAxNCwgNCwgMCwgIDB4MGYtMTQsIH0sIC8qIFBDSVJRMCAqLworCXsgMCAsIDUsIDEyLCAweDBmICAgLCB9LCAKKwl7IDQgLCA1LCA0LCAgMHgwZi0gNCwgfSwKKwl7IDggLCA2LCAxMiwgMHgwZi0gOCwgfSwKKwl7IDkgLCA2LCA4LCAgMHgwZi0gOSwgfSwKKwl7IDExLCA2LCA0LCAgMHgwZi0xMSwgfSwKICNlbHNlCi0JeyAxNCwgMCwgIDgsIDB4MGYtMTQgLEJDUl9JTENSQX0sCi0JeyAxMiwgMCwgIDQsIDB4MGYtMTIgLEJDUl9JTENSQX0sCi0JeyAgOCwgMCwgIDQsIDB4MGYtIDggLEJDUl9JTENSQn0sCi0JeyAgNiwgMCwgMTIsIDB4MGYtIDYgLEJDUl9JTENSQ30sCi0JeyAgNSwgMCwgIDgsIDB4MGYtIDUgLEJDUl9JTENSQ30sCi0JeyAgNCwgMCwgIDQsIDB4MGYtIDQgLEJDUl9JTENSQ30sCi0JeyAgMywgMCwgIDAsIDB4MGYtIDMgLEJDUl9JTENSQ30sCi0JeyAgMSwgMCwgMTIsIDB4MGYtIDEgLEJDUl9JTENSRH0sCisJeyAxNCwgMCwgIDgsIDB4MGYtMTQsIH0sCisJeyAxMiwgMCwgIDQsIDB4MGYtMTIsIH0sCisJeyAgOCwgMSwgIDQsIDB4MGYtIDgsIH0sCisJeyAgNiwgMiwgMTIsIDB4MGYtIDYsIH0sCisJeyAgNSwgMiwgIDgsIDB4MGYtIDUsIH0sCisJeyAgNCwgMiwgIDQsIDB4MGYtIDQsIH0sCisJeyAgMywgMiwgIDAsIDB4MGYtIDMsIH0sCisJeyAgMSwgMywgMTIsIDB4MGYtIDEsIH0sCiAjaWYgZGVmaW5lZChDT05GSUdfU1ROSUMpCiAJLyogU1QgTklDICovCi0JeyAxMCwgMCwgIDQsIDB4MGYtMTAgLEJDUl9JTENSRH0sIAkvKiBMQU4gKi8KKwl7IDEwLCAzLCAgNCwgMHgwZi0xMCwgfSwgCS8qIExBTiAqLwogI2VuZGlmCiAJLyogTVJTSFBDIElSUXMgc2V0dGluZyAqLwotCXsgIDAsIDAsIDEyLCAweDBmLSAwICxCQ1JfSUxDUkV9LAkvKiBQQ0lSUTMgKi8KLQl7IDExLCAwLCAgOCwgMHgwZi0xMSAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMiAqLwotCXsgIDksIDAsICA0LCAweDBmLSA5ICxCQ1JfSUxDUkV9LCAJLyogUENJUlExICovCi0JeyAgNywgMCwgIDAsIDB4MGYtIDcgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTAgKi8KKwl7ICAwLCA0LCAxMiwgMHgwZi0gMCwgfSwJLyogUENJUlEzICovCisJeyAxMSwgNCwgIDgsIDB4MGYtMTEsIH0sIAkvKiBQQ0lSUTIgKi8KKwl7ICA5LCA0LCAgNCwgMHgwZi0gOSwgfSwgCS8qIFBDSVJRMSAqLworCXsgIDcsIDQsICAwLCAweDBmLSA3LCB9LCAJLyogUENJUlEwICovCiAJLyogIzIsICMxMyBhcmUgYWxsb2NhdGVkIGZvciBTTE9UIElSUSAjMSBhbmQgIzIgKGZvciBub3cpICovCiAJLyogTk9URTogIzIgYW5kICMxMyBhcmUgbm90IHVzZWQgb24gUEMgKi8KLQl7IDEzLCAwLCAgNCwgMHgwZi0xMyAsQkNSX0lMQ1JHfSwgCS8qIFNMT1RJUlEyICovCi0JeyAgMiwgMCwgIDAsIDB4MGYtIDIgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMSAqLworCXsgMTMsIDYsICA0LCAweDBmLTEzLCB9LCAJLyogU0xPVElSUTIgKi8KKwl7ICAyLCA2LCAgMCwgMHgwZi0gMiwgfSwgCS8qIFNMT1RJUlExICovCiAjZW5kaWYKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJQkNSX0lMQ1JBLAorCUJDUl9JTENSQiwKKwlCQ1JfSUxDUkMsCisJQkNSX0lMQ1JELAorCUJDUl9JTENSRSwKKwlCQ1JfSUxDUkYsCisJQkNSX0lMQ1JHLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2U3NzB4IiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtMTIyLDUgKzEwNCw1IEBACiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRik7CiAJY3RybF9vdXR3KDAsIEJDUl9JTENSRyk7CiAKLQltYWtlX3NlNzcweF9pcnEoc2U3NzB4X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2U3NzB4X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwppbmRleCAxN2EyNjMxLi4yOTYyZGExIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU29sdXRpb25FbmdpbmUiLAogCS5tdl9zZXR1cAkJPSBzbXNjX3NldHVwLAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCkBAIC0xNjAsNCArMTYwLDMgQEAKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlX0lSUSwKIH07Ci1BTElBU19NVihzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL2lycS5jCmluZGV4IDA5OWU1ZGUuLjI2Y2ZmMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9pcnEuYwpAQCAtMTksMTUgKzE5LDI0IEBACiAjZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0CiAjZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0CiAKK3N0cnVjdCBzZTc3MjJfZGF0YSB7CisJdW5zaWduZWQgY2hhciBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfaWR4OworCXVuc2lnbmVkIGNoYXIgc2hpZnQ7CisJdW5zaWduZWQgc2hvcnQgcHJpb3JpdHk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworfTsKKworCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NlNzcyMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXN0cnVjdCBzZTc3MjJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CiAJY3RybF9vdXR3KCBjdHJsX2ludyggcC0+YWRkciApIHwgcC0+cHJpb3JpdHkgLCBwLT5hZGRyICk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zZTc3MjJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0Jc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlzdHJ1Y3Qgc2U3NzIyX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOwogCWN0cmxfb3V0dyggY3RybF9pbncoIHAtPmFkZHIgKSAmIH5wLT5wcmlvcml0eSAsIHAtPmFkZHIgKTsKIH0KIApAQCAtMzgsNyArNDcsNyBAQAogCS5tYXNrX2FjayAgICAgICA9IGRpc2FibGVfc2U3NzIyX2lycSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworc3RhdGljIHN0cnVjdCBzZTc3MjJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogaXJxICAgICAgICAsaWR4LHNmdCwgcHJpb3JpdHkgICAgICwgYWRkciAgICovCiAJeyBNUlNIUENfSVJRMCAsIDAgLCAwICwgTVJTSFBDX0JJVDAgLCBJUlEwMV9NQVNLIH0gLAogCXsgTVJTSFBDX0lSUTEgLCAwICwgMCAsIE1SU0hQQ19CSVQxICwgSVJRMDFfTUFTSyB9ICwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvc2V0dXAuYwppbmRleCA2MzZjYTZjLi42Y2NhNmNiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzIyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcyMi9zZXR1cC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzcyMiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzIyIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzIyIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3MjJfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDEwOSAsCkBAIC0xNDUsNCArMTQ1LDMgQEAKIAkubXZfaXJxX2RlbXV4ICAgICAgICAgICA9IHNlNzcyMl9pcnFfZGVtdXgsCiAKIH07Ci1BTElBU19NVihzZTc3MjIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwppbmRleCBlNGM2M2E0Li5jM2QxMjU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKQEAgLTE0LDQ0ICsxNCwzMSBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc2U3NzUxLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2U3NzUxX2lwcl9tYXBbXSA9IHsKLSAgLyogTGVhdmUgb2xkIFNvbHV0aW9uIEVuZ2luZSBjb2RlIGluIGZvciByZWZlcmVuY2UuICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FKQotCS8qCi0JICogU3VwZXIgSS9PIChKdXN0IG1pbWljIFBDKToKLQkgKiAgMToga2V5Ym9hcmQKLQkgKiAgMzogc2VyaWFsIDAKLQkgKiAgNDogc2VyaWFsIDEKLQkgKiAgNTogcHJpbnRlcgotCSAqICA2OiBmbG9wcHkKLQkgKiAgODogcnRjCi0JICogMTI6IG1vdXNlCi0JICogMTQ6IGlkZTAKLQkgKi8KLQl7IDE0LCBCQ1JfSUxDUkEsIDIsIDB4MGYtMTQgfSwKLQl7IDEyLCBCQ1JfSUxDUkEsIDEsIDB4MGYtMTIgfSwKLQl7ICA4LCBCQ1JfSUxDUkIsIDEsIDB4MGYtIDggfSwKLQl7ICA2LCBCQ1JfSUxDUkMsIDMsIDB4MGYtIDYgfSwKLQl7ICA1LCBCQ1JfSUxDUkMsIDIsIDB4MGYtIDUgfSwKLQl7ICA0LCBCQ1JfSUxDUkMsIDEsIDB4MGYtIDQgfSwKLQl7ICAzLCBCQ1JfSUxDUkMsIDAsIDB4MGYtIDMgfSwKLQl7ICAxLCBCQ1JfSUxDUkQsIDMsIDB4MGYtIDEgfSwKLQotCXsgMTAsIEJDUl9JTENSRCwgMSwgMHgwZi0xMCB9LCAvKiBMQU4gKi8KLQotCXsgIDAsIEJDUl9JTENSRSwgMywgMHgwZi0gMCB9LCAvKiBQQ0lSUTMgKi8KLQl7IDExLCBCQ1JfSUxDUkUsIDIsIDB4MGYtMTEgfSwgLyogUENJUlEyICovCi0JeyAgOSwgQkNSX0lMQ1JFLCAxLCAweDBmLSA5IH0sIC8qIFBDSVJRMSAqLwotCXsgIDcsIEJDUl9JTENSRSwgMCwgMHgwZi0gNyB9LCAvKiBQQ0lSUTAgKi8KLQotCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwotCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgQkNSX0lMQ1JHLCAxLCAweDBmLTEzIH0sIC8qIFNMT1RJUlEyICovCi0JeyAgMiwgQkNSX0lMQ1JHLCAwLCAweDBmLSAyIH0sIC8qIFNMT1RJUlExICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSkKLQl7IDEzLCBCQ1JfSUxDUkQsIDMsIDIgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgMTMsIDMsIDMsIDIgfSwKIAkvKiBBZGQgYWRkaXRpb25hbCBlbnRyaWVzIGhlcmUgYXMgZHJpdmVycyBhcmUgYWRkZWQgYW5kIHRlc3RlZC4gKi8KLSNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlCQ1JfSUxDUkEsCisJQkNSX0lMQ1JCLAorCUJDUl9JTENSQywKKwlCQ1JfSUxDUkQsCisJQkNSX0lMQ1JFLAorCUJDUl9JTENSRiwKKwlCQ1JfSUxDUkcsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNlNzc1MSIsCisJfSwKIH07CiAKIC8qCkBAIC01OSw1ICs0Niw1IEBACiAgKi8KIHZvaWQgX19pbml0IGluaXRfNzc1MXNlX0lSUSh2b2lkKQogewotCW1ha2VfaXByX2lycShzZTc3NTFfaXByX21hcCwgQVJSQVlfU0laRShzZTc3NTFfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IDUyYzdiZmEuLjc4NzNkMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzZSBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzc1MXNlIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICI3NzUxIFNvbHV0aW9uRW5naW5lIiwKIAkubXZfbnJfaXJxcwkJPSA3MiwKIApAQCAtNzEsNCArNzEsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfNzc1MXNlX0lSUSwKIH07Ci1BTElBU19NVig3NzUxc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9pcnEuYwppbmRleCAzZDA2MjVjLi44NzQ5MTQ3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvaXJxLmMKQEAgLTE2LDI4ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlNzc4MC5oPgogCi0jZGVmaW5lIElOVENfSU5UTVNLMCAgICAgICAgICAgICAweEZGRDAwMDQ0Ci0jZGVmaW5lIElOVENfSU5UTVNLQ0xSMCAgICAgICAgICAweEZGRDAwMDY0Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfc2U3NzgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXN0cnVjdCBpbnRjMl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKLQljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIElOVENfSU5UTVNLQ0xSMCArIHAtPm1za19vZmZzZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzc4MF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lICAgICAgICAgICA9ICJTRTc3ODAiLAotCS5tYXNrICAgICAgICAgICA9IGRpc2FibGVfc2U3NzgwX2lycSwKLQkudW5tYXNrICAgICAgICAgPSBlbmFibGVfc2U3NzgwX2lycSwKLQkubWFza19hY2sgICAgICAgPSBkaXNhYmxlX3NlNzc4MF9pcnEsCi19OwotCiBzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7CiAJeyAyLCAgMCwgMzEsIDAsIDMxLCAzIH0sIC8qIGRhdWdodGVyIGJvYXJkIEVYVElOVDEgKi8KIAl7IDQsICAwLCAzMCwgMCwgMzAsIDMgfSwgLyogZGF1Z2h0ZXIgYm9hcmQgRVhUSU5UMiAqLwpAQCAtNTEsMTMgKzI5LDI0IEBACiAJeyAwICwgMCwgMjQsIDAsIDI0LCAzIH0sIC8qIFNNNTAxICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMCwgLyogTi9BICovCisJLm1za19iYXNlCT0gMHhmZmQwMDA0NCwKKwkubXNrY2xyX2Jhc2UJPSAweGZmZDAwMDY0LAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2U3NzgwIiwKKwl9LAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwogdm9pZCBfX2luaXQgaW5pdF9zZTc3ODBfSVJRKHZvaWQpCiB7Ci0JaW50IGkgOwotCiAJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHQgYXQgRlBHQSAqLwogCWN0cmxfb3V0dygwLCBGUEdBX0lOVE1TSzEpOwogCS8qIG1hc2sgU001MDEgaW50ZXJydXB0ICovCkBAIC03OSwxMSArNjgsNSBAQAogCS8qIEZQR0EgKyAweDBBICovCiAJY3RybF9vdXR3KChJUlFQSU5fUENDUFcgPDwgSVJRUE9TX1BDQ1BXKSwgRlBHQV9JTlRTRUwzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSk7IGkrKykgewotCQlkaXNhYmxlX2lycV9ub3N5bmMoaW50YzJfaXJxX3RhYmxlW2ldLmlycSk7Ci0JCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmc2U3NzgwX2lycV9jaGlwLAotCQkJaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7Ci0JCXNldF9pcnFfY2hpcF9kYXRhKCBpbnRjMl9pcnFfdGFibGVbaV0uaXJxLCAmaW50YzJfaXJxX3RhYmxlW2ldICk7Ci0JCWRpc2FibGVfc2U3NzgwX2lycShpbnRjMl9pcnFfdGFibGVbaV0uaXJxKTsKLQl9CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc4MC9zZXR1cC5jCmluZGV4IGRmN2QwOGEuLjcyM2YyZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3ODAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzgwL3NldHVwLmMKQEAgLTExMywxMCArMTEzLDkgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NlNzc4MCBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2U3NzgwIF9faW5pdG12ID0gewogCS5tdl9uYW1lICAgICAgICAgICAgICAgID0gIlNvbHV0aW9uIEVuZ2luZSA3NzgwIiAsCiAJLm12X3NldHVwICAgICAgICAgICAgICAgPSBzZTc3ODBfc2V0dXAgLAogCS5tdl9ucl9pcnFzCQk9IDExMSAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2U3NzgwX0lSUSwKIH07Ci1BTElBU19NVihzZTc3ODApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKaW5kZXggYzA2OWM0NC4uOWMwMzFhOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwpAQCAtMTUsMTcgKzE1LDMzIEBACiAjaW5jbHVkZSA8YXNtL3NoMDMvc2gwMy5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDAzX2lwcl9tYXBbXSA9IHsKLQl7IElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkgfSwKLQl7IElSTDFfSVJRLCBJUkwxX0lQUl9BRERSLCBJUkwxX0lQUl9QT1MsIElSTDFfUFJJT1JJVFkgfSwKLQl7IElSTDJfSVJRLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkgfSwKLQl7IElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkgfSwKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0geworCXsgSVJMMF9JUlEsIDAsIElSTDBfSVBSX1BPUywgSVJMMF9QUklPUklUWSB9LAorCXsgSVJMMV9JUlEsIDAsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSB9LAorCXsgSVJMMl9JUlEsIDAsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSB9LAorCXsgSVJMM19JUlEsIDAsIElSTDNfSVBSX1BPUywgSVJMM19QUklPUklUWSB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwlJTlRDX0lQUkQsCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoMDMiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zaDAzX0lSUSh2b2lkKQogewogCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7Ci0JbWFrZV9pcHJfaXJxKHNoMDNfaXByX21hcCwgQVJSQVlfU0laRShzaDAzX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogZXh0ZXJuIHZvaWQgKmNmX2lvX2Jhc2U7CkBAIC03NCwxMSArOTAsMTAgQEAKIH0KIF9faW5pdGNhbGwoc2gwM19kZXZpY2VzX3NldHVwKTsKIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMDMgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIkludGVyZmFjZSAoQ1RQL1BDSS1TSDAzKSIsCiAJLm12X3NldHVwCQk9IHNoMDNfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNDgsCiAJLm12X2lvcG9ydF9tYXAJCT0gc2gwM19pb3BvcnRfbWFwLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NoMDNfSVJRLAogfTsKLUFMSUFTX01WKHNoMDMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwppbmRleCA0YTlkZjRhLi5kZmQxMjQ1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKQEAgLTYsMjggKzYsNDQgQEAKICAqIFNITUlOIFN1cHBvcnQuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vc2htaW4uaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgUEZDX1BIQ1IJMHhhNDAwMDEwZVVMCiAjZGVmaW5lIElOVENfSUNSMQkweGE0MDAwMDEwVUwKICNkZWZpbmUgSU5UQ19JUFJDCTB4YTQwMDAwMTZVTAogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNobWluX2lwcl9tYXBbXSA9IHsKLQl7IC5pcnE9MzIsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSAwLCAucHJpb3JpdHk9MCB9LAotCXsgLmlycT0zMywgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDQsIC5wcmlvcml0eT0wIH0sCi0JeyAuaXJxPTM0LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gOCwgLnByaW9yaXR5PTggfSwKLQl7IC5pcnE9MzUsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PTEyLCAucHJpb3JpdHk9MCB9LAorc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyAzMiwgMCwgMCwgMCB9LAorCXsgMzMsIDAsIDQsIDAgfSwKKwl7IDM0LCAwLCA4LCA4IH0sCisJeyAzNSwgMCwgMTIsIDAgfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CisJSU5UQ19JUFJDLAorfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaG1pbiIsCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQogewogCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQogCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgotCW1ha2VfaXByX2lycShzaG1pbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNobWluX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqc2htaW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQpAQCAtNDMsOSArNTksOCBAQAogCiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaG1pbiBfX2luaXRtdiA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2htaW4gX19pbml0bXYgPSB7CiAJLm12X25hbWUJPSAiU0hNSU4iLAogCS5tdl9pbml0X2lycQk9IGluaXRfc2htaW5faXJxLAogCS5tdl9pb3BvcnRfbWFwCT0gc2htaW5faW9wb3J0X21hcCwKIH07Ci1BTElBU19NVihzaG1pbikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCmluZGV4IDY1MGZiMzYuLjg0MjcxZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYwpAQCAtNjgsMTEgKzY4LDI3IEBACiAgKiBJUkwzID0gY3J5cHRvCiAgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzbmFwZ2Vhcl9pcHJfbWFwW10gPSB7Ci0JbWFrZV9pcHJfaXJxKElSTDBfSVJRLCBJUkwwX0lQUl9BRERSLCBJUkwwX0lQUl9QT1MsIElSTDBfUFJJT1JJVFkpOwotCW1ha2VfaXByX2lycShJUkwxX0lSUSwgSVJMMV9JUFJfQUREUiwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZKTsKLQltYWtlX2lwcl9pcnEoSVJMMl9JUlEsIElSTDJfSVBSX0FERFIsIElSTDJfSVBSX1BPUywgSVJMMl9QUklPUklUWSk7Ci0JbWFrZV9pcHJfaXJxKElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkpOworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CisJeyBJUkwwX0lSUSwgMCwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZIH0sCisJeyBJUkwxX0lSUSwgMCwgSVJMMV9JUFJfUE9TLCBJUkwxX1BSSU9SSVRZIH0sCisJeyBJUkwyX0lSUSwgMCwgSVJMMl9JUFJfUE9TLCBJUkwyX1BSSU9SSVRZIH0sCisJeyBJUkwzX0lSUSwgMCwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZIH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCUlOVENfSVBSRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc25hcGdlYXIiLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zbmFwZ2Vhcl9JUlEodm9pZCkKQEAgLTgyLDcgKzk4LDcgQEAKIAogCXByaW50aygiU2V0dXAgU25hcEdlYXIgSVJRL0lQUiAuLi5cbiIpOwogCi0JbWFrZV9pcHJfaXJxKHNuYXBnZWFyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc25hcGdlYXJfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQogCiAvKgpAQCAtOTYsNyArMTEyLDcgQEAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NuYXBnZWFyIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zbmFwZ2VhciBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU25hcEdlYXIgU2VjdXJlRWRnZTU0MTAiLAogCS5tdl9zZXR1cAkJPSBzbmFwZ2Vhcl9zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA3MiwKQEAgLTExNyw0ICsxMzMsMyBAQAogCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc25hcGdlYXJfSVJRLAogfTsKLUFMSUFTX01WKHNuYXBnZWFyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwppbmRleCA2Mzk2Y2VhLi5mYzhjZDA2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDQyMDJfbWljcm9kZXYgX19pbml0bXYgPSB7CitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoNDIwMl9taWNyb2RldiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiU0g0LTIwMiBNaWNyb0RldiIsCiAJLm12X3NldHVwCQk9IG1pY3JvZGV2X3NldHVwLAogCS5tdl9ucl9pcnFzCQk9IDcyLAkJLyogUVFRIG5lZWQgdG8gY2hlY2sgdGhpcyAtIHVzZSB0aGUgTUFDUk8gKi8KQEAgLTQwMyw0ICs0MDMsMyBAQAogCS5tdl9oZWFydGJlYXQJCT0gbWljcm9kZXZfaGVhcnRiZWF0LAogI2VuZGlmCiB9OwotQUxJQVNfTVYoc2g0MjAyX21pY3JvZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMKaW5kZXggNmJjZDkzOS4uNjA2ZDI1YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8YXNtL3RpdGFuLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgdGl0YW5faXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFIgaWR4LCBzaGlmdCwgcHJpbyAqLwogCXsgVElUQU5fSVJRX1dBTiwgICAzLCAxMiwgOCB9LAkvKiBldGgwIChXQU4pICovCiAJeyBUSVRBTl9JUlFfTEFOLCAgIDMsICA4LCA4IH0sCS8qIGV0aDEgKExBTikgKi8KQEAgLTIwLDE1ICsyMCwzMyBAQAogCXsgVElUQU5fSVJRX1VTQiwgICAzLCAgMCwgOCB9LAkvKiBtUENJIEIgKGJvdHRvbSksIFVTQiAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsgLyogc3RvbGVuIGZyb20gc2V0dXAtc2g3NzUwLmMgKi8KKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItdGl0YW4iLAorCX0sCit9Owogc3RhdGljIHZvaWQgX19pbml0IGluaXRfdGl0YW5faXJxKHZvaWQpCiB7CiAJLyogZW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFscyAqLwogCWlwcl9pcnFfZW5hYmxlX2lybG0oKTsKIAkvKiByZWdpc3RlciBpcHIgaXJxcyAqLwotCW1ha2VfaXByX2lycSh0aXRhbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHRpdGFuX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KIAotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3RpdGFuIF9faW5pdG12ID0geworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKIAkubXZfbmFtZSA9CSJUaXRhbiIsCiAKIAkubXZfaW5iID0JdGl0YW5faW5iLApAQCAtNTIsNCArNzAsMyBAQAogCiAJLm12X2luaXRfaXJxID0JaW5pdF90aXRhbl9pcnEsCiB9OwotQUxJQVNfTVYodGl0YW4pCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxOGY0MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB1bmtub3duIFNIIGJvYXJkcyAKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU0NjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy91bmtub3duL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBTZXR1cCBjb2RlIGZvciBhbiB1bmtub3duIG1hY2hpbmUgKGludGVybmFsIHBlcmlwaGVyYWxzIG9ubHkpCi0gKgotICogVGhpcyBpcyB0aGUgc2ltcGxlc3Qgb2YgYWxsIGJvYXJkcywgYW5kIHNlcnZlcyBvbmx5IGFzIGEgcXVpY2sgYW5kIGRpcnR5Ci0gKiBtZXRob2QgdG8gc3RhcnQgZGVidWdnaW5nIGEgbmV3IGJvYXJkIGR1cmluZyBicmluZy11cCB1bnRpbCBwcm9wZXIgYm9hcmQKLSAqIHNldHVwIGNvZGUgaXMgd3JpdHRlbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdW5rbm93biBfX2luaXRtdiA9IHsKLQkubXZfbmFtZQkJPSAiVW5rbm93biIsCi19OwotQUxJQVNfTVYodW5rbm93bikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcgYi9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCmluZGV4IDA1ODJjYTguLjJlNTE2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKKysrIGIvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZwpAQCAtMTMsMTAgKzEzLDggQEAKIAkgIGFyZSBhZGRpdGlvbmFsIEdQSU8gYml0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVyZmFjZSB0bwogCSAgZXh0ZXJuYWwgYXMgd2VsbC4KIAotIyBBIGJvYXJkIG11c3QgaGF2ZSBkZWZpbmVkIEhENjQ0NlhfU0VSSUVTIGluIG9yZGVyIHRvIHNlZSB0aGVzZQogY29uZmlnIEhENjQ0NlhfU0VSSUVTCi0JYm9vbCAiSEQ2NDQ2eCBzdXBwb3J0IgotCWRlZmF1bHQgbgorCWJvb2wKIAogY2hvaWNlCiAJcHJvbXB0ICJIRDY0NDZ4IG9wdGlvbnMiCkBAIC0yNSw3ICsyMyw2IEBACiAKIGNvbmZpZyBIRDY0NDYxCiAJYm9vbCAiSGl0YWNoaSBIRDY0NDYxIGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3MDkKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDYxIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3MDkgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCkBAIC00MCw3ICszNyw2IEBACiAKIGNvbmZpZyBIRDY0NDY1CiAJYm9vbCAiSGl0YWNoaSBIRDY0NDY1IGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NTAKIAktLS1oZWxwLS0tCiAJICBUaGUgSGl0YWNoaSBIRDY0NDY1IHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IKIAkgIHRoZSBTSDc3NTAgQ1BVLCBzdXBwb3J0aW5nIGEgTENEIGNvbnRyb2xsZXIsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCmluZGV4IDhiNmI1YTcuLjNmZGQyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9kcmVhbWNhc3RfZGVmY29uZmlnCkBAIC0xLDE1ICsxLDIzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgVHVlIE9jdCAgMyAxMDo1MTo1NSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFNhdCBKdWwgIDcgMDM6NDc6NDUgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1lTX1NVUFBPUlRTX1BDST15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0yOCw2ICszNiw3IEBACiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKICMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKQEAgLTM1LDggKzQ0LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNTAsMTQgKzYxLDE5IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtOTMsNDQgKzEwOSw5IEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9EUkVBTUNBU1Q9eQotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfVU5LTk9XTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHNlbGVjdGlvbgotIwogQ09ORklHX0NQVV9TSDQ9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMyBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xMzgsNzkgKzExOSw5MyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAotCi0jCi0jIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTA9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxPXkKLUNPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDEwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CiBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfRlBVPXkKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKIENPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIENPTkZJR19DUFVfSEFTX1NSX1JCPXkKK0NPTkZJR19DUFVfSEFTX1BURUE9eQogCiAjCi0jIFRpbWVyIHN1cHBvcnQKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NIX0RSRUFNQ0FTVD15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgogQ09ORklHX1NIX1BDTEtfRlJFUT00OTg3NjUwNAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMzIsNiArMjI3LDcgQEAKICMKICMgRE1BIHN1cHBvcnQKICMKK0NPTkZJR19TSF9ETUFfQVBJPXkKIENPTkZJR19TSF9ETUE9eQogQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NAogQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MPXkKQEAgLTI0MCwxNyArMjM2LDIzIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCiAjIEtlcm5lbCBmZWF0dXJlcwogIwogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKIENPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUPXkKQEAgLTI2OSwzMyArMjcxLDIzIEBACiAjIEJ1cyBvcHRpb25zCiAjCiBDT05GSUdfUENJPXkKLSMgQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVCBpcyBub3Qgc2V0CitDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19QQ0lfQVVUTz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwogIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCiAjCiBDT05GSUdfQklORk1UX0VMRj15Ci0jIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogQ09ORklHX05FVD15CkBAIC0zMDMsMTMgKzI5NSwxMyBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzI3LDMwICszMTksMjAgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNzYsNyArMzU4LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zOTQsMTAgKzM4NSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKIAogIwpAQCAtNDA4LDYgKzM5NSw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtNDIxLDEzICs0MDksMTYgQEAKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDM2LDEwICs0MjcsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC00NTUsNiArNDQyLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC00NzAsMTUgKzQ1OCw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNTIxLDQ3ICs1MDEsMTYgQEAKICMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAogIyBDT05GSUdfVFIgaXMgbm90IHNldAogCiAjCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIyBXaXJlbGVzcyBMQU4KICMKLSMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CkBAIC02MDQsMTcgKzU1MywxOSBAQAogIyBJbnB1dCBEZXZpY2UgRHJpdmVycwogIwogQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKLUNPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9BVEtCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAogIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9NT1VTRT15Ci1DT05GSUdfTU9VU0VfUFMyPXkKKyMgQ09ORklHX01PVVNFX1BTMiBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjYwLDEwICs2MTEsNiBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiBDT05GSUdfV0FUQ0hET0c9eQogIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90IHNldAogCkBAIC02ODAsMTQgKzYyNyw4IEBACiAjIENPTkZJR19QQ0lQQ1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX1dEVFBDSSBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY5NSwxMSArNjM2LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC03MTEsNDQgKzY0OCw1MSBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKICMKLUNPTkZJR19IV01PTj15Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVlQxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVklERU9fVjRMMj15Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotQ09ORklHX0ZJUk1XQVJFX0VESUQ9eQorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogQ09ORklHX0ZCPXkKK0NPTkZJR19GSVJNV0FSRV9FRElEPXkKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIwogIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1BNMiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DWUJFUjIwMDAgaXMgbm90IHNldApAQCAtNzYzLDEzICs3MDcsMTcgQEAKICMgQ09ORklHX0ZCX1JBREVPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BVFkxMjggaXMgbm90IHNldAogIyBDT05GSUdfRkJfQVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTkVPTUFHSUMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVlQ4NjIzIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtNzg5LDEwICs3MzcsNiBAQAogIyBDT05GSUdfRk9OVF9TVU44eDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfU1VOMTJ4MjIgaXMgbm90IHNldAogIyBDT05GSUdfRk9OVF8xMHgxOCBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC04MDAsNyArNzQ0LDYgQEAKICMgQ09ORklHX0xPR09fU1VQRVJIX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKIAogIwogIyBTb3VuZApAQCAtODA4LDYgKzc1MSwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTgyMywxMCArNzcyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC04NzQsMTAgKzgxOSwxMiBAQAogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRERVZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfR0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05NTcsNiArOTA0LDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogQ09ORklHX1BST0ZJTElORz15CkBAIC05NjUsMTcgKzkxNywxOCBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfS0dEQiBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpAQCAtOTkxLDggKzk0NCwxMyBAQAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCitDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Zjc0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcKQEAgLTAsMCArMSwxMjIzIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIE1vbiBKdW4gMTEgMTA6MjQ6NTcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9OT09QPXkKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9Im5vb3AiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUVVJQ0tMSVNUPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKKyMgQ09ORklHXzMyQklUIGlzIG5vdCBzZXQKK0NPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRLPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NksgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1NIX0ZQVT15CisjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfU1BFQ1VMQVRJVkVfRVhFQ1VUSU9OPXkKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlE9eQorQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorCisjCisjIEJvYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9ISUdITEFOREVSPXkKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3NzgwTVA9eQorIyBDT05GSUdfU0hfUjc3ODVSUCBpcyBub3Qgc2V0CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0yOAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMjAwMDAwMAorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0hFQVJUQkVBVCBpcyBub3Qgc2V0CitDT05GSUdfUFVTSF9TV0lUQ0g9eQorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfUFJFRU1QVF9CS0w9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L3NkYTEiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKKyMgQ09ORklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorQ09ORklHX0JSSURHRT1tCisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CitDT05GSUdfTExDPW0KKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CitDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPW0KKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KKworIworIyBTQ1NJIFRyYW5zcG9ydHMKKyMKKyMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JU0NTSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RQVF9JMk8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9TQVMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TVlcgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1NJTD15CisjIENPTkZJR19TQVRBX1NJTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfVklURVNTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NDBfUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKK0NPTkZJR19QQ05FVDMyPW0KKyMgQ09ORklHX1BDTkVUMzJfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5Q1A9bQorQ09ORklHXzgxMzlUT089bQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19WSUFfUkhJTkU9bQorQ09ORklHX1ZJQV9SSElORV9NTUlPPXkKKyMgQ09ORklHX1ZJQV9SSElORV9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwPXkKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKK0NPTkZJR19FMTAwMD1tCisjIENPTkZJR19FMTAwMF9OQVBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorQ09ORklHX1I4MTY5PXkKKyMgQ09ORklHX1I4MTY5X05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAorQ09ORklHX05FVERFVl8xMDAwMD15CisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CisjIENPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZQT1JUPXkKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKworIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSU5JWF9GUz15CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CitDT05GSUdfSU5PVElGWV9VU0VSPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFX0ZTPW0KKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorQ09ORklHX05URlNfRlM9eQorIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfTlRGU19SVz15CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJGUz15CitDT05GSUdfSFVHRVRMQl9QQUdFPXkKK0NPTkZJR19SQU1GUz15CitDT05GSUdfQ09ORklHRlNfRlM9bQorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV83MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NTAgaXMgbm90IHNldAorQ09ORklHX05MU19DT0RFUEFHRV85MzI9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfSVNPODg1OV8xPXkKKyMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKKworIworIyBEaXN0cmlidXRlZCBMb2NrIE1hbmFnZXIKKyMKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPW0KKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0FMR0FQST15CitDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15CitDT05GSUdfQ1JZUFRPX0hBU0g9eQorQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKK0NPTkZJR19DUllQVE9fSE1BQz15CisjIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fTUQ1PXkKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fV1A1MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RHUjE5MiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19FQ0I9bQorQ09ORklHX0NSWVBUT19DQkM9eQorQ09ORklHX0NSWVBUT19QQ0JDPW0KKyMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZwppbmRleCAwZjVlYzY0Li41YzI5MzM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjMwotIyBNb24gTWFyIDEyIDE0OjI2OjMzIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgVGh1IEp1bCAxMiAxMjozMzoxNSAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19QQ0k9eQogQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CkBAIC00Myw2ICs0NSw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldApAQCAtNjAsMTMgKzYzLDE4IEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKIENPTkZJR19TSE1FTT15Ci1DT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTEwMiw1NSArMTEwLDExIEBACiAjCiAjIFN5c3RlbSB0eXBlCiAjCi0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotQ09ORklHX1NIX0hJR0hMQU5ERVI9eQotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SNzc4ME1QIGlzIG5vdCBzZXQKLUNPTkZJR19TSF9SNzc4NVJQPXkKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIND15CiBDT05GSUdfQ1BVX1NINEE9eQogQ09ORklHX0NQVV9TSFgyPXkKLQotIwotIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0Ci0jCi0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKLQotIwotIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKLQotIwotIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CkBAIC0xNTgsMTAgKzEyMiw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNCBQcm9jZXNzb3IgU3VwcG9ydAotIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CkBAIC0xNzAsMjMgKzEzMSwxMiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0KLSMKLSMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NT15Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CkBAIC0xOTQsNiArMTQ0LDcgQEAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwogIworQ09ORklHX1FVSUNLTElTVD15CiBDT05GSUdfTU1VPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKQEAgLTIwMSw2ICsxNTIsMTIgQEAKIENPTkZJR18zMkJJVD15CiAjIENPTkZJR19YMlRMQiBpcyBub3Qgc2V0CiBDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE1LDE3ICsxNzIsMTcgQEAKICMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAogQ09ORklHX0ZMQVRNRU09eQogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKICMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CiBDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgogCiAjCiAjIENhY2hlIGNvbmZpZ3VyYXRpb24KICMKICMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKQEAgLTI0MSwxMiArMTk4LDIyIEBACiBDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIworIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU0hfSElHSExBTkRFUj15CisjIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwTVAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3Nzg1UlA9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MjgKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMgbm90IHNldAogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjYxLDcgKzIyOCw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yNzgsNyArMjQ0LDcgQEAKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogQ09ORklHX0tFWEVDPXkKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFRfTk9ORSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiBDT05GSUdfUFJFRU1QVD15CkBAIC0zMDAsMzEgKzI2NiwyMiBAQAogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CiBDT05GSUdfUENJX0FVVE89eQogQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCiAjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKICMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIAogIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAogIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAogCiAjCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCiAjIE5ldHdvcmtpbmcKICMKIENPTkZJR19ORVQ9eQpAQCAtMzMyLDcgKzI4OSw2IEBACiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CkBAIC0zNzcsMjAgKzMzMyw4IEBACiAjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotCi0jCi0jIFRJUEMgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE0gaXMgbm90IHNldAogQ09ORklHX0JSSURHRT1tCkBAIC00MTcsOCArMzYxLDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKIENPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTQzOCwxMCArMzkwLDYgQEAKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwogIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCiAjIENPTkZJR19NVEQgaXMgbm90IHNldAogCiAjCkBAIC00NzUsMTIgKzQyMywxMCBAQAogIwogIyBNaXNjIGRldmljZXMKICMKKyMgQ09ORklHX1BIQU5UT00gaXMgbm90IHNldAogIyBDT05GSUdfU0dJX0lPQzQgaXMgbm90IHNldAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19JREUgaXMgbm90IHNldAogCiAjCkBAIC01MDksNiArNDU1LDcgQEAKICMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfV0FJVF9TQ0FOPW0KIAogIwogIyBTQ1NJIFRyYW5zcG9ydHMKQEAgLTU1NCwxMCArNTAxLDYgQEAKICMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NSUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQVRBX0FIQ0kgaXMgbm90IHNldApAQCAtNTgwLDYgKzUyMyw3IEBACiAjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjQwX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NNRDY0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQVRBX0NTNTUzMCBpcyBub3Qgc2V0CkBAIC02MjksNiArNTczLDcgQEAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAogIworIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAogCiAjCkBAIC02NDQsMTUgKzU4OSw3IEBACiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCiAjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIFBIWSBkZXZpY2Ugc3VwcG9ydAotIwogIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKIAogIwpAQCAtNjczLDEwICs2MTAsNyBAQAogIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCi0jCitDT05GSUdfTkVUREVWXzEwMDA9eQogIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAogIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldApAQCAtNjg5LDU1ICs2MjMsMjYgQEAKICMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDEgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIworQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIworIyBDT05GSUdfTUxYNF9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSIGlzIG5vdCBzZXQKIAogIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMgV2lyZWxlc3MgTEFOCiAjCi1DT05GSUdfTkVUX1JBRElPPXkKLSMgQ09ORklHX05FVF9XSVJFTEVTU19SVE5FVExJTksgaXMgbm90IHNldAotCi0jCi0jIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCi0jCi0jIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAotIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAotCi0jCi0jIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldAotIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfV0lSRUxFU1M9eQotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZEREkgaXMgbm90IHNldAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldApAQCAtNzg5LDYgKzY5NCw3IEBACiAjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTgzMSwxNCArNzM3LDggQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKQEAgLTg0OCwxMCArNzQ4LDcgQEAKICMgVFBNIGRldmljZXMKICMKICMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCitDT05GSUdfREVWUE9SVD15CiAjIENPTkZJR19JMkMgaXMgbm90IHNldAogCiAjCkBAIC04NjQsMTYgKzc2MSwxNSBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKIAogIwpAQCAtODg1LDIyICs3ODEsMzAgQEAKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05MDgsNyArODEyLDcgQEAKICMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBub3Qgc2V0CiAKICMKLSMgRnJhbWJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCisjIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiAjCiAjIENPTkZJR19GQl9DSVJSVVMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKQEAgLTkzMCwxMiArODM0LDExIEBACiAjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwogIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CiAKICMKQEAgLTk1MiwxMyArODU1LDEwIEBACiAjIE9wZW4gU291bmQgU3lzdGVtCiAjCiBDT05GSUdfU09VTkRfUFJJTUU9bQotIyBDT05GSUdfT0JTT0xFVEVfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19PU1NfT0JTT0xFVEUgaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CiAKICMKICMgSElEIERldmljZXMKQEAgLTk4MiwxMCArODgyLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC0xMDI2LDE4ICs5MjIsMzAgQEAKIENPTkZJR19SVENfSU5URl9QUk9DPXkKIENPTkZJR19SVENfSU5URl9ERVY9eQogIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAKICMKLSMgUlRDIGRyaXZlcnMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKICMKICMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKLUNPTkZJR19SVENfRFJWX1NIPXkKLSMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKIAogIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIwogIyBETUEgRW5naW5lIHN1cHBvcnQKICMKICMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldApAQCAtMTA1MSwxNCArOTU5LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTExNTcsNiArMTA1Nyw3IEBACiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0xMjM5LDcgKzExNDAsNiBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTEyNjYsNiArMTE2Niw3IEBACiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CiAjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CkBAIC0xMzAwLDYgKzEyMDEsNyBAQAogQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KICMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0RFUz15CiAjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CkBAIC0xMzI4LDcgKzEyMzAsOSBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwppbmRleCA4N2FiOTA4Li5mMmYyYTNjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MjA2X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTQ6NDA6MTUgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjM3OjQ2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTM0LDggKzM4LDEwIEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfRU1CRURERUQ9eQpAQCAtNDgsMTIgKzU0LDE3IEBACiAjIENPTkZJR19FTEZfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAogIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VQT0xMIGlzIG5vdCBzZXQKLUNPTkZJR19TTEFCPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiAjIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1RJTllfU0hNRU09eQogQ09ORklHX0JBU0VfU01BTEw9MQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTgzLDUzICs5NCwxMCBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzEwVk9JUEdXIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAotIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xBTkRJU0sgaXMgbm90IHNldAotIyBDT05GSUdfU0hfVElUQU4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0hNSU4gaXMgbm90IHNldAotQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0gyPXkKIENPTkZJR19DUFVfU0gyQT15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQKLSMKIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDY9eQotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzNywxMCArMTA1LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0OSwzMiArMTE0LDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODQsMzUgKzE0NSw0MiBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAotIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogIyBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4gaXMgbm90IHNldAogQ09ORklHX0NQVV9CSUdfRU5ESUFOPXkKLSMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19JUFJfSVJRPXkKIAogIwotIyBUaW1lciBzdXBwb3J0CisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FPXkKKworIworIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgogIwogQ09ORklHX1NIX0NNVD15CiAjIENPTkZJR19TSF9NVFUyIGlzIG5vdCBzZXQKIENPTkZJR19TSF9USU1FUl9JUlE9MTQwCi0jIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKIENPTkZJR19TSF9DTEtfTUQ9NgorIyBDT05GSUdfVElDS19PTkVTSE9UIGlzIG5vdCBzZXQKIAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKQEAgLTIyNywxMSArMTk1LDExIEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCiAjCisjIENPTkZJR19IRUFSVEJFQVQgaXMgbm90IHNldAogIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAogCiAjCkBAIC0yMzksMTAgKzIwNywxMSBAQAogIwogQ09ORklHX0haXzEwMD15CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTEwMAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFRfTk9ORT15CiAjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKQEAgLTI1MiwyMyArMjIxLDE4IEBACiAjCiBDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCi0jIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKICMKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAogIwogCiAjCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwogIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwogIwogQ09ORklHX0JJTkZNVF9GTEFUPXkKQEAgLTI3NywxMSArMjQxLDYgQEAKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTI4OSw3ICsyNDgsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VTklYIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldApAQCAtMzE0LDI1ICsyNzIsMTQgQEAKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX1RJUEMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKICMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CkBAIC0zNTgsNyArMzA1LDE2IEBACiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNzUsMTAgKzMzMSw2IEBACiAjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKICMKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwogQ09ORklHX01URD15CiAjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAogQ09ORklHX01URF9DT05DQVQ9eQpAQCAtMzkzLDYgKzM0NSw3IEBACiAjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCiAjCiBDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKIENPTkZJR19NVERfQkxPQ0s9eQogIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GVEwgaXMgbm90IHNldApAQCAtNDI0LDcgKzM3Nyw2IEBACiAjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAogCiAjCiAjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKQEAgLTQ1MiwxNiArNDA0LDEzIEBACiAjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIwotIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcwogIwotIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CiAKICMKICMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CkBAIC00NzEsNiArNDIwLDcgQEAKICMKICMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CiAjCisjIENPTkZJR19QTlBBQ1BJIGlzIG5vdCBzZXQKIAogIwogIyBCbG9jayBkZXZpY2VzCkBAIC00NzksMTggKzQyOSwxMyBAQAogIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjIGRldmljZXMKICMKLSMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk5LDEwICs0NDQsNiBAQAogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiAjIENPTkZJR19BVEEgaXMgbm90IHNldAogCiAjCkBAIC01MTEsMTkgKzQ1Miw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTMxLDEwICs0NTksNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU0NCwyNyArNDY4LDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MDQsNiArNTE1LDcgQEAKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjM5LDI5ICs1NTEsMTUgQEAKICMgSVBNSQogIwogIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3NCwyNyArNTcyLDMwIEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIwotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfREFCPXkKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzAzLDYgKzYwNCwxMiBAQAogIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAogCiAjCisjIEhJRCBEZXZpY2VzCisjCitDT05GSUdfSElEPXkKKyMgQ09ORklHX0hJRF9ERUJVRyBpcyBub3Qgc2V0CisKKyMKICMgVVNCIHN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldApAQCAtNzE3LDEwICs2MjQsNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMiw3ICs3MDUsNiBAQAogQ09ORklHX1BST0NfU1lTQ1RMPXkKICMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKIApAQCAtODE2LDcgKzcxOCw2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAogIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CkBAIC04NDksNiArNzUwLDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKQEAgLTg2MSwxNCArNzY3LDExIEBACiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfVU5XSU5EX0lORk8gaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKICMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC04ODMsOCArNzg2LDEzIEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAogQ09ORklHX0NSQzMyPXkKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwppbmRleCAyMGFjN2Y0Li4zYTNjM2MxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NjE5X2RlZmNvbmZpZwpAQCAtMSwxOCArMSwyMiBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE5Ci0jIFdlZCBEZWMgIDYgMTY6MzU6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIyLXJjNAorIyBGcmkgSnVuIDE1IDE5OjQzOjA2IDIwMDcKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKIENPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKICMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTIGlzIG5vdCBzZXQKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKIENPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCiAKICMKQEAgLTMxLDggKzM1LDEwIEBACiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CkBAIC00NSwxMiArNTEsMTcgQEAKICMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAotQ09ORklHX1NMQUI9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKICMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfVElOWV9TSE1FTT15CiBDT05GSUdfQkFTRV9TTUFMTD0xCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtODAsNTIgKzkxLDkgQEAKICMKICMgU3lzdGVtIHR5cGUKICMKLSMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAotIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLUNPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKLQotIwotIyBQcm9jZXNzb3Igc2VsZWN0aW9uCi0jCiBDT05GSUdfQ1BVX1NIMj15Ci0KLSMKLSMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAotIwotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTk9eQotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTEzMywxMCArMTAxLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKQEAgLTE0NSwzMiArMTEwLDI4IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKLQotIwotIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKLQotIwotIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAotCi0jCi0jIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAotIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCiAjCitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19QQUdFX09GRlNFVD0weDAwMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKIENPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX1BBR0VfU0laRV80S0I9eQogIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CkBAIC0xODAsMzQgKzE0MSw0MSBAQAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCiAKICMKICMgQ2FjaGUgY29uZmlndXJhdGlvbgogIwogIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CiBDT05GSUdfU0hfV1JJVEVUSFJPVUdIPXkKLSMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKIAogIwogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKICMgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19TSF9GUFUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfRlBVX0VNVSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9EU1AgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiAKICMKLSMgVGltZXIgc3VwcG9ydAorIyBCb2FyZCBzdXBwb3J0CisjCitDT05GSUdfU09MVVRJT05fRU5HSU5FPXkKK0NPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORT15CisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KICMKIENPTkZJR19TSF9DTVQ9eQogQ09ORklHX1NIX1RJTUVSX0lSUT04NgotIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTMxMjUwMDAwCiBDT05GSUdfU0hfQ0xLX01EPTUKKyMgQ09ORklHX1RJQ0tfT05FU0hPVCBpcyBub3Qgc2V0CiAKICMKICMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCkBAIC0yMjIsMTEgKzE5MCwxMSBAQAogIwogIyBDb21wYW5pb24gQ2hpcHMKICMKLSMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKIAogIwogIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycwogIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKICMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKIAogIwpAQCAtMjM0LDEwICsyMDIsMTEgQEAKICMKIENPTkZJR19IWl8xMDA9eQogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKIENPTkZJR19IWj0xMDAKICMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0yNDcsMjMgKzIxNiwxOCBAQAogIwogQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAotIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zCiAjCi0jIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRkxBVD15CkBAIC0yNzIsMTEgKzIzNiw2IEBACiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKICMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19QTSBpcyBub3Qgc2V0Ci0KLSMKICMgTmV0d29ya2luZwogIwogIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKQEAgLTI5NSwxMCArMjU0LDYgQEAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgogIwotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKIENPTkZJR19NVEQ9eQogIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19NVERfQ09OQ0FUPXkKQEAgLTMxMyw2ICsyNjgsNyBAQAogIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwogIwogQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CiBDT05GSUdfTVREX0JMT0NLPXkKICMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKQEAgLTM0NCw3ICszMDAsNiBAQAogIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKIAogIwogIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCkBAIC0zNzIsMTYgKzMyNywxMyBAQAogIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAogIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKLQotIwotIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CiAKICMKLSMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKICMKLSMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogCiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydApAQCAtMzkxLDYgKzM0Myw3IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIworIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0CiAKICMKICMgQmxvY2sgZGV2aWNlcwpAQCAtMzk4LDE3ICszNTEsMTIgQEAKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0jIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERSBpcyBub3Qgc2V0CiAKICMKQEAgLTQxNywxMCArMzY1LDYgQEAKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwotIwogIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKIAogIwpAQCAtNDI5LDE5ICszNzMsNiBAQAogIyBDT05GSUdfTUQgaXMgbm90IHNldAogCiAjCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIElTRE4gc3Vic3lzdGVtCiAjCiAKQEAgLTQ3MSw2ICs0MDIsNyBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCkBAIC01MDYsMjkgKzQzOCwxNSBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKICMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAogCiAjCiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtNTQxLDI2ICs0NTksMjkgQEAKICMgRGFsbGFzJ3MgMS13aXJlIGJ1cwogIwogIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAogCiAjCi0jIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiAjCi0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKIAogIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIworQ09ORklHX0RBQj15CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU2OSw2ICs0OTAsMTIgQEAKICMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKIAogIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKQEAgLTU4MywxMCArNTEwLDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC02NjgsNyArNTkxLDYgQEAKIENPTkZJR19QUk9DX1NZU0NUTD15CiAjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKQEAgLTY4Miw3ICs2MDQsNiBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldApAQCAtNzE1LDE0ICs2MzYsMTEgQEAKICMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CiAjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTczNyw4ICs2NTUsMTMgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCmluZGV4IGNhNGM2NjMuLjc2NGI4MTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjNwotIyBGcmkgQXByIDI3IDE2OjMwOjMwIDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMi1yYzQKKyMgV2VkIEp1biAyMCAxODowODowNCAyMDA3CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTExLDcgKzExLDkgQEAKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotIyBDT05GSUdfR0VORVJJQ19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX1NZU19TVVBQT1JUU19OVU1BPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApAQCAtNDMsNiArNDUsNyBAQAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CkBAIC02MCwxNCArNjMsMjAgQEAKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC0xMDMsNTcgKzExMiwxMiBAQAogIwogIyBTeXN0ZW0gdHlwZQogIwotQ09ORklHX1NPTFVUSU9OX0VOR0lORT15Ci0jIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAotQ09ORklHX1NIXzc3MjJfU09MVVRJT05fRU5HSU5FPXkKLSMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAotIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0hJR0hMQU5ERVIgaXMgbm90IHNldAotIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzcyMDZfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIXzc2MTlfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX0xCT1hfUkUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAotCi0jCi0jIFByb2Nlc3NvciBzZWxlY3Rpb24KLSMKIENPTkZJR19DUFVfU0g0PXkKIENPTkZJR19DUFVfU0g0QT15CiBDT05GSUdfQ1BVX1NINEFMX0RTUD15CiBDT05GSUdfQ1BVX1NIWDI9eQotCi0jCi0jIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKLSMKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAotCi0jCi0jIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotCi0jCi0jIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKQEAgLTE2MiwxMCArMTI2LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKLQotIwotIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldApAQCAtMTc0LDIzICsxMzQsMTEgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAotCi0jCi0jIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKLSMKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAotCi0jCi0jIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0Ci0KLSMKLSMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0Ci0jCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyPXkKQEAgLTE5OCwxNSArMTQ2LDIxIEBACiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKICMKK0NPTkZJR19RVUlDS0xJU1Q9eQogQ09ORklHX01NVT15CiBDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCiBDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAotIyBDT05GSUdfMzJCSVQgaXMgbm90IHNldAogIyBDT05GSUdfWDJUTEIgaXMgbm90IHNldAogQ09ORklHX1ZTWVNDQUxMPXkKLUNPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19OVU1BPXkKK0NPTkZJR19OT0RFU19TSElGVD0xCitDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKK0NPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlM9MgogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19QQUdFX1NJWkVfNEtCPXkKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldApAQCAtMjE2LDI2ICsxNzAsMjUgQEAKICMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNQiBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NE1CIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKLUNPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9eQorQ09ORklHX1NQQVJTRU1FTT15CitDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUz15CitDT05GSUdfSEFWRV9NRU1PUllfUFJFU0VOVD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CisjIENPTkZJR19NRU1PUllfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX01JR1JBVElPTj15CiAjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCiAjCiAjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfRU5BQkxFUj15Ci0jIENPTkZJR19DRl9BUkVBNSBpcyBub3Qgc2V0Ci1DT05GSUdfQ0ZfQVJFQTY9eQotQ09ORklHX0NGX0JBU0VfQUREUj0weGI4MDAwMDAwCiAKICMKICMgUHJvY2Vzc29yIGZlYXR1cmVzCkBAIC0yNTIsMTIgKzIwNSwyMCBAQAogQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKKyMgQm9hcmQgc3VwcG9ydAorIworQ09ORklHX1NPTFVUSU9OX0VOR0lORT15CitDT05GSUdfU0hfNzcyMl9TT0xVVElPTl9FTkdJTkU9eQorCisjCiAjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MTYKLUNPTkZJR19OT19JRExFX0haPXkKIENPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjcyLDcgKzIzMyw2IEBACiAjCiAjIENvbXBhbmlvbiBDaGlwcwogIwotIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAogCiAjCiAjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCkBAIC0yOTAsNyArMjUwLDYgQEAKIENPTkZJR19IWj0yNTAKIENPTkZJR19LRVhFQz15CiAjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQpAQCAtMzA3LDcgKzI2NiwxMSBAQAogIwogIyBCdXMgb3B0aW9ucwogIwotIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19DRl9FTkFCTEVSPXkKKyMgQ09ORklHX0NGX0FSRUE1IGlzIG5vdCBzZXQKK0NPTkZJR19DRl9BUkVBNj15CitDT05GSUdfQ0ZfQkFTRV9BRERSPTB4YjgwMDAwMDAKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0zMTUsMjIgKzI3OCwxMiBAQAogIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKIAogIwotIyBQQ0kgSG90cGx1ZyBTdXBwb3J0Ci0jCi0KLSMKICMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKICMKIENPTkZJR19CSU5GTVRfRUxGPXkKLSMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIAogIwotIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1BNIGlzIG5vdCBzZXQKLQotIwogIyBOZXR3b3JraW5nCiAjCiBDT05GSUdfTkVUPXkKQEAgLTMzOCw3ICsyOTEsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKQEAgLTM3NSwyMCArMzI3LDggQEAKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKICMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwogIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0KLSMKLSMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCiAjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CiAjIENPTkZJR19CUklER0UgaXMgbm90IHNldApAQCAtNDE0LDcgKzM1NCwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIAogIwogIyBEZXZpY2UgRHJpdmVycwpAQCAtNDMyLDEwICszODEsNiBAQAogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCiAjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKQEAgLTQ2NCwxMCArNDA5LDcgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIworIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwpAQCAtNDk2LDYgKzQzOCw3IEBACiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCiAKICMKICMgU0NTSSBUcmFuc3BvcnRzCkBAIC01MTEsMTAgKzQ1NCw2IEBACiAjCiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzCi0jCiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfUEFUQV9QTEFURk9STT15CkBAIC01MjUsMTkgKzQ2NCw2IEBACiAjIENPTkZJR19NRCBpcyBub3Qgc2V0CiAKICMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQpAQCAtNTQ1LDEwICs0NzEsNiBAQAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKICMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKQEAgLTU1OCwyNyArNDgwLDE0IEBACiBDT05GSUdfTUlJPXkKICMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKIENPTkZJR19TTUM5MVg9eQorQ09ORklHX05FVERFVl8xMDAwPXkKK0NPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCi0jIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjIFdpcmVsZXNzIExBTgogIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUFAgaXMgbm90IHNldAogIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CkBAIC02MjcsNiArNTM2LDcgQEAKICMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKIApAQCAtNjY3LDE0ICs1NzcsOCBAQAogIyBJUE1JCiAjCiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIApAQCAtNjgyLDEwICs1ODYsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY5OCwxNiArNTk4LDE1IEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAogCiAjCkBAIC03MTksMTYgKzYxOCwxOSBAQAogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19EQUI9eQogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzU3LDEwICs2NTksNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTgwMCwxOCArNjk4LDMwIEBACiBDT05GSUdfUlRDX0lOVEZfUFJPQz15CiBDT05GSUdfUlRDX0lOVEZfREVWPXkKICMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFJUQyBkcml2ZXJzCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCiAjCiAjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CiAjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0Ci1DT05GSUdfUlRDX0RSVl9TSD15Ci0jIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CiAKICMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisKKyMKICMgRE1BIEVuZ2luZSBzdXBwb3J0CiAjCiAjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKQEAgLTgyNSwxNCArNzM1LDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPXkKQEAgLTkzNywyMyArODM5LDI0IEBACiAjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CiAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKIENPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLSMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEtfVElNRT15CiAjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKICMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAorQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKIAogIwpAQCAtOTczLDggKzg3NiwxMCBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19QTElTVD15CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTliYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzU2IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjItcmM0CisjIFdlZCBKdW4gMjAgMTQ6MDk6MjcgMjAwNworIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfVElNRT15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19JUENfTlMgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorQ09ORklHX0tNT0Q9eQorCisjCisjIEJsb2NrIGxheWVyCisjCitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorCisjCisjIFN5c3RlbSB0eXBlCisjCitDT05GSUdfQ1BVX1NIND15CitDT05GSUdfQ1BVX1NINEE9eQorQ09ORklHX0NQVV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSFgzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1FVSUNLTElTVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0Sz15CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yNTZLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0VfU0laRV80TUIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNjRNQiBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfU1BBUlNFTUVNX1NUQVRJQz15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9EU1A9eQorQ09ORklHX1NIX1NUT1JFX1FVRVVFUz15CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSU5UQzJfSVJRPXkKK0NPTkZJR19DUFVfSEFTX1NSX1JCPXkKKworIworIyBCb2FyZCBzdXBwb3J0CisjCisKKyMKKyMgVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorQ09ORklHX1NIX1BDTEtfRlJFUT01MDAwMDAwMAorQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19IRUFSVEJFQVQ9eQorIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUPXkKK0NPTkZJR19QUkVFTVBUX0JLTD15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCisjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCBpcD0xOTIuMTY4LjEuMjo6OjI1NS4yNTUuMjU1LjAgcm9vdD0vZGV2L25mcyBuZnNyb290PTE5Mi4xNjguMS4xOi9leHBvcnRzL2RldmVsL3Jmcy9tb2JpbGVyIG5vYWxpZW5jYWNoZSBlYXJseXByaW50az1iaW9zIGlnbm9yZV9sb2dsZXZlbCIKKworIworIyBCdXMgb3B0aW9ucworIworIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX0JMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCisjIENPTkZJR19TQ1NJX01VTFRJX0xVTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CitDT05GSUdfUEFUQV9QTEFURk9STT15CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIEhJRCBEZXZpY2VzCisjCisjIENPTkZJR19ISUQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworCisjCisjIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQorIworCisjCisjIFJlYWwgVGltZSBDbG9jaworIworQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1YzMDIwIGlzIG5vdCBzZXQKKworIworIyBvbi1DUFUgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX1NIPXkKKworIworIyBETUEgRW5naW5lIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAorCisjCisjIERNQSBDbGllbnRzCisjCisKKyMKKyMgRE1BIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQkZTPXkKK0NPTkZJR19IVUdFVExCX1BBR0U9eQorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19PUFJPRklMRSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19QUklOVEtfVElNRT15CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CitDT05GSUdfREVCVUdfU0xBQl9MRUFLPXkKK0NPTkZJR19ERUJVR19QUkVFTVBUPXkKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TUElOTE9DSz15CitDT05GSUdfREVCVUdfTVVURVhFUz15CitDT05GSUdfREVCVUdfTE9DS19BTExPQz15CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLREVQPXkKK0NPTkZJR19ERUJVR19MT0NLREVQPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1ZNPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX0ZPUkNFRF9JTkxJTklORz15CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0VBUkxZX1BSSU5USz15CisjIENPTkZJR19ERUJVR19CT09UTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKK0NPTkZJR19ERUJVR19TVEFDS19VU0FHRT15CisjIENPTkZJR180S1NUQUNLUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCA5OTkzNWY5Li4zMzM4OTgwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0zNiwyMyArMzYsNiBAQAogCSAgc3VwcG9ydC4gU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIHZhbHVlIGFsbG93cyBmb3IgY2FzY2FkaW5nIERNQUNzCiAJICB3aXRoIGFkZGl0aW9uYWwgY2hhbm5lbHMuCiAKLWNvbmZpZyBETUFfUEFHRV9PUFMKLQlib29sICJVc2UgRE1BQyBmb3IgcGFnZSBjb3B5L2NsZWFyIgotCWRlcGVuZHMgb24gU0hfRE1BICYmIEJST0tFTgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHVzZSBhIGR1YWwtYWRkcmVzcyBtb2RlIGNvbmZpZ3VyZWQgY2hhbm5lbAotCSAgaW4gdGhlIFNIIERNQUMgZm9yIGNvcHlfcGFnZSgpL2NsZWFyX3BhZ2UoKS4gUHJpbWFyaWx5IGEgcGVyZm9ybWFuY2UKLQkgIGhhY2suCi0KLWNvbmZpZyBETUFfUEFHRV9PUFNfQ0hBTk5FTAotCWRlcGVuZHMgb24gRE1BX1BBR0VfT1BTCi0JaW50ICJETUEgY2hhbm5lbCBmb3Igc2ggbWVtb3J5LW1hbmFnZXIgcGFnZSBjb3B5L2NsZWFyIgotCWRlZmF1bHQgIjMiCi0JaGVscAotCSAgVGhpcyBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGR1YWwgYWRkcmVzcyBkbWEgY2hhbm5lbCwKLQkgIGluIGNhc2UgY2hhbm5lbCAzIGlzIHVuYXZhaWxhYmxlLiBPbiB0aGUgU0g0LCBjaGFubmVscyAxLDIsIGFuZCAzCi0JICBhcmUgZHVhbC1hZGRyZXNzIGNhcGFibGUuCi0KIGNvbmZpZyBTSF9ETUFCUkcKIAlib29sICJTSDc3NjAgRE1BQlJHIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc3NjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCA2ZDFjYmJlLi5mYmM2ZjJjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX1BDSQogCWhlbHAKIAkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCiAJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCmluZGV4IDkxMDRiNjIuLjFmMTQxYTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCkBAIC00LDEwICs0LDkgQEAKIAogZXh0cmEteQk6PSBoZWFkLm8gaW5pdF90YXNrLm8gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gcHJvY2Vzcy5vIHNpZ25hbC5vIHRyYXBzLm8gaXJxLm8gXAotCXB0cmFjZS5vIHNldHVwLm8gdGltZS5vIHN5c19zaC5vIHNlbWFwaG9yZS5vIFwKLQlpby5vIGlvX2dlbmVyaWMubyBzaF9rc3ltcy5vIHN5c2NhbGxzLm8gXAotCWRlYnVndHJhcHMubworb2JqLXkJOj0gZGVidWd0cmFwcy5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vIG1hY2h2ZWMubyBwcm9jZXNzLm8gcHRyYWNlLm8gXAorCSAgIHNlbWFwaG9yZS5vIHNldHVwLm8gc2lnbmFsLm8gc3lzX3NoLm8gc3lzY2FsbHMubyBcCisJICAgdGltZS5vIHRvcG9sb2d5Lm8gdHJhcHMubwogCiBvYmoteQkJCQkrPSBjcHUvIHRpbWVycy8KIG9iai0kKENPTkZJR19WU1lTQ0FMTCkJCSs9IHZzeXNjYWxsLwpAQCAtMTcsNyArMTYsNyBAQAogb2JqLSQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpCSs9IHNoX2Jpb3Mubwogb2JqLSQoQ09ORklHX1NIX0tHREIpCQkrPSBrZ2RiX3N0dWIubyBrZ2RiX2ptcC5vCiBvYmotJChDT05GSUdfU0hfQ1BVX0ZSRVEpCSs9IGNwdWZyZXEubwotb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubworb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBzaF9rc3ltcy5vIG1vZHVsZS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMgYi9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMKaW5kZXggZWJjNzNiOC4uMWMzYjk5NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NmLWVuYWJsZXIuYwpAQCAtNzUsMTEgKzc1LDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQogCWFsbG9jYXRlX2NmX2FyZWEoKTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi0JLyogVGhpcyBzaG91bGQgYmUgZG9uZSBpbiBlYWNoIGJvYXJkJ3MgaW5pdF94eHhfaXJxLiAqLwotCW1ha2VfaW1hc2tfaXJxKDE0KTsKLQlkaXNhYmxlX2lycSgxNCk7Ci0jZW5kaWYKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA2NDUxYWQ2Li45MTcyZTk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTIxLDggKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotCi1leHRlcm4gdm9pZCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCk7CisjaW5jbHVkZSA8YXNtL3ViYy5oPgogCiAvKgogICogR2VuZXJpYyB3cmFwcGVyIGZvciBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGRpc2FibGUgb24tY2hpcApAQCAtMTUyLDE1ICsxNTEsNiBAQAogCWZsYWdzIHw9IENDUl9DQUNIRV9DQjsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NIX09DUkFNCi0JLyogVHVybiBvbiBPQ1JBTSAtLSBoYWx2ZSB0aGUgT0MgKi8KLQlmbGFncyB8PSBDQ1JfQ0FDSEVfT1JBOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgPj49IDE7Ci0KLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfc2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgKgotCQkJCSAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3o7Ci0jZW5kaWYKLQogCWN0cmxfb3V0bChmbGFncywgQ0NSKTsKIAliYWNrX3RvX1AxKCk7CiB9CkBAIC0yNjksNyArMjU5LDYgQEAKIAl9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19VQkNfV0FLRVVQCiAJLyoKIAkgKiBTb21lIGJyYWluLWRhbWFnZWQgbG9hZGVycyBkZWNpZGVkIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHB1dAogCSAqIHRoZSBVQkMgdG8gc2xlZXAuIFRoaXMgY2F1c2VzIHNvbWUgaXNzdWVzIHdoZW4gaXQgY29tZXMgdG8gdGhpbmdzCkBAIC0yNzcsNyArMjY2LDUgQEAKIAkgKiB3ZSB3YWtlIGl0IHVwIGFuZCBob3BlIHRoYXQgYWxsIGlzIHdlbGwuCiAJICovCiAJdWJjX3dha2V1cCgpOwotI2VuZGlmCi0KIAlzcGVjdWxhdGl2ZV9leGVjdXRpb25faW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCmluZGV4IGQ4ZTIyZjQuLmNjNTIyMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKQEAgLTEzLDM2ICsxMywzMSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmUwODAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHg0MCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHg2MCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQotI2RlZmluZSBJTlRDMl9CQVNFCTB4ZmZkNDAwMDAKLSNkZWZpbmUgSU5UQzJfSU5UTVNLCShJTlRDMl9CQVNFICsgMHgzOCkKLSNkZWZpbmUgSU5UQzJfSU5UTVNLQ0xSCShJTlRDMl9CQVNFICsgMHgzYykKLSNlbmRpZgorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50YzJfZGVzYyAqZ2V0X2ludGMyX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGludGMyX2Rlc2MsIGNoaXApKTsKK30KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0sgKyBwLT5tc2tfb2Zmc2V0KTsKKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CisKKwljdHJsX291dGwoMSA8PCBwLT5tc2tfc2hpZnQsIGQtPm1za19iYXNlICsgcC0+bXNrX29mZnNldCArCisJCQkJICAgICAoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgKiA0KSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pbnRjMl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7Ci0JY3RybF9vdXRsKDEgPDwgcC0+bXNrX3NoaWZ0LCBJTlRDMl9JTlRNU0tDTFIgKyBwLT5tc2tfb2Zmc2V0KTsKLX0KKwlzdHJ1Y3QgaW50YzJfZGVzYyAqZCA9IGdldF9pbnRjMl9kZXNjKGlycSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW50YzJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklOVEMyIiwKLQkubWFzawkJPSBkaXNhYmxlX2ludGMyX2lycSwKLQkudW5tYXNrCQk9IGVuYWJsZV9pbnRjMl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pbnRjMl9pcnEsCi19OworCWN0cmxfb3V0bCgxIDw8IHAtPm1za19zaGlmdCwgZC0+bXNrY2xyX2Jhc2UgKyBwLT5tc2tfb2Zmc2V0ICsKKwkJCQkgICAgIChoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSAqIDQpKTsKK30KIAogLyoKICAqIFNldHVwIGFuIElOVEMyIHN0eWxlIGludGVycnVwdC4KQEAgLTU2LDMwICs1MSwzNiBAQAogICoKICAqIGluIHRoZSBpbnRjMl9kYXRhIHRhYmxlLgogICovCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpCit2b2lkIHJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoc3RydWN0IGludGMyX2Rlc2MgKmRlc2MpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJZGVzYy0+Y2hpcC5tYXNrID0gZGlzYWJsZV9pbnRjMl9pcnE7CisJZGVzYy0+Y2hpcC51bm1hc2sgPSBlbmFibGVfaW50YzJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2ludGMyX2lycTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKIAkJdW5zaWduZWQgbG9uZyBpcHIsIGZsYWdzOwotCQlzdHJ1Y3QgaW50YzJfZGF0YSAqcCA9IHRhYmxlICsgaTsKKwkJc3RydWN0IGludGMyX2RhdGEgKnAgPSBkZXNjLT5pbnRjMl9kYXRhICsgaTsKIAogCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKIAotCQkvKiBTZXQgdGhlIHByaW9yaXR5IGxldmVsICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJaWYgKGRlc2MtPnByaW9fYmFzZSkgeworCQkJLyogU2V0IHRoZSBwcmlvcml0eSBsZXZlbCAqLworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JCWlwciA9IGN0cmxfaW5sKElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKLQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7Ci0JCWlwciB8PSBwLT5wcmlvcml0eSA8PCBwLT5pcHJfc2hpZnQ7Ci0JCWN0cmxfb3V0bChpcHIsIElOVEMyX0JBU0UgKyBwLT5pcHJfb2Zmc2V0KTsKKwkJCWlwciA9IGN0cmxfaW5sKGRlc2MtPnByaW9fYmFzZSArIHAtPmlwcl9vZmZzZXQpOworCQkJaXByICY9IH4oMHhmIDw8IHAtPmlwcl9zaGlmdCk7CisJCQlpcHIgfD0gcC0+cHJpb3JpdHkgPDwgcC0+aXByX3NoaWZ0OworCQkJY3RybF9vdXRsKGlwciwgZGVzYy0+cHJpb19iYXNlICsgcC0+aXByX29mZnNldCk7CiAKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CiAKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmaW50YzJfaXJxX2NoaXAsCisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKHAtPmlycSwgJmRlc2MtPmNoaXAsCiAJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOwogCi0JCWVuYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKKwkJZGlzYWJsZV9pbnRjMl9pcnEocC0+aXJxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwppbmRleCAyMTAyODBiLi45OGU4NGY0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKQEAgLTIyLDU4ICsyMiw1NyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwcl9kZXNjICpnZXRfaXByX2Rlc2ModW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBnZXRfaXJxX2NoaXAoaXJxKTsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljaGlwIC0gb2Zmc2V0b2Yoc3RydWN0IGlwcl9kZXNjLCBjaGlwKSk7Cit9CisKIHN0YXRpYyB2b2lkIGRpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X2lwcl9kZXNjKGlycSktPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdOwogCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXByX2RhdGEgKnAgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGdldF9pcHJfZGVzYyhpcnEpLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XTsKIAkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBwLT5hZGRyKTsKKwljdHJsX291dHcoY3RybF9pbncoYWRkcikgfCAocC0+cHJpb3JpdHkgPDwgcC0+c2hpZnQpLCBhZGRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpcHJfaXJxX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIklQUiIsCi0JLm1hc2sJCT0gZGlzYWJsZV9pcHJfaXJxLAotCS51bm1hc2sJCT0gZW5hYmxlX2lwcl9pcnEsCi0JLm1hc2tfYWNrCT0gZGlzYWJsZV9pcHJfaXJxLAotfTsKKy8qCisgKiBUaGUgc2hpZnQgdmFsdWUgaXMgbm93IHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCwgbm90IHRoZSBudW1iZXIgb2YKKyAqIGJpdHMvNC4gVGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZQorICogZGF0YXNoZWV0cy4gVGhlIElQUiBhZGRyZXNzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGlwcl9vZmZzZXQgdGFibGUuCisgKi8KIAotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCXJldHVybiAwOwotfQotCi12b2lkIG1ha2VfaXByX2lycShzdHJ1Y3QgaXByX2RhdGEgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3ZvaWQgcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoc3RydWN0IGlwcl9kZXNjICpkZXNjKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCWRlc2MtPmNoaXAubWFzayA9IGRpc2FibGVfaXByX2lycTsKKwlkZXNjLT5jaGlwLnVubWFzayA9IGVuYWJsZV9pcHJfaXJxOworCWRlc2MtPmNoaXAubWFza19hY2sgPSBkaXNhYmxlX2lwcl9pcnE7CiAKLQkJaWYgKCFpcnEpCi0JCQlpcnEgPSB0YWJsZVtpXS5pcnEgPSBpOworCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl9pcnFzOyBpKyspIHsKKwkJc3RydWN0IGlwcl9kYXRhICpwID0gZGVzYy0+aXByX2RhdGEgKyBpOwogCi0JCS8qIGNvdWxkIHRoZSBJUFIgaW5kZXggYmUgbWFwcGVkLCBpZiBub3Qgd2UgaWdub3JlIHRoaXMgKi8KLQkJaWYgKCF0YWJsZVtpXS5hZGRyKSB7Ci0JCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOwotCQkJaWYgKCF0YWJsZVtpXS5hZGRyKQotCQkJCWNvbnRpbnVlOwotCQl9CisJCUJVR19PTihwLT5pcHJfaWR4ID49IGRlc2MtPm5yX29mZnNldHMpOworCQlCVUdfT04oIWRlc2MtPmlwcl9vZmZzZXRzW3AtPmlwcl9pZHhdKTsKIAotCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaXByX2lycV9jaGlwLAorCQlkaXNhYmxlX2lycV9ub3N5bmMocC0+aXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUocC0+aXJxLCAmZGVzYy0+Y2hpcCwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKLQkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCAmdGFibGVbaV0pOwotCQllbmFibGVfaXByX2lycShpcnEpOworCQlzZXRfaXJxX2NoaXBfZGF0YShwLT5pcnEsIHApOworCQlkaXNhYmxlX2lwcl9pcnEocC0+aXJxKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKG1ha2VfaXByX2lycSk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIpOwogCiAjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9IQVNfUElOVF9JUlEpCiBpbnQgaXByX2lycV9kZW11eChpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCmluZGV4IGMxNmRjOGYuLmVlOGYxZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2VudHJ5LlMKQEAgLTMxMSw2ICszMTEsNyBAQAogCXJ0ZQogCSBub3AKIAorCS5hbGlnbiAyCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAxOiAgICAgLmxvbmcgICB0cmFjZV9oYXJkaXJxc19vZmYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCmluZGV4IDEwOGU4MWIuLmFiYmYxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKQEAgLTksMjMgKzksMTQgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KIAogaW50IF9faW5pdCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCkKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQpCi0JY3VycmVudF9jcHVfZGF0YS50eXBlCQkJPSBDUFVfU0g3NjA0OwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMJCT0gNDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxPDwxMCk7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSA2NDsKLQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmZsYWdzCQk9IDA7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQogCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYxOTsKIAljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CiAJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKaW5kZXggZjgzZmY4YS4uMWExMDdmZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCkBAIC01Miw3ICs1Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzYxOV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc2MTlfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJeyA4NiwgMCwgIDQsIDIgfSwJLyogQ01JMCAqLwogCXsgODgsIDEsIDEyLCAzIH0sCS8qIFNDSUYwX0VSSSAqLwogCXsgODksIDEsIDEyLCAzIH0sCS8qIFNDSUYwX1JYSSAqLwpAQCAtNjgsNyArNjgsNyBAQAogCXsgOTksIDEsICA0LCAzIH0sCS8qIFNDSUYyX1RYSSAqLwogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBpcHJfb2Zmc2V0c1tdID0geworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKIAkweGY4MDgwMDAwLAkvKiBJUFJDICovCiAJMHhmODA4MDAwMiwJLyogSVBSRCAqLwogCTB4ZjgwODAwMDQsCS8qIElQUkUgKi8KQEAgLTc2LDE1ICs3NiwxOSBAQAogCTB4ZjgwODAwMDgsCS8qIElQUkcgKi8KIH07CiAKLS8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KLXVuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKLXsKLQlpZiAodW5saWtlbHkoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzYxOSIsCisJfSwKK307CiAKIHZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc2MTlfaXByX21hcCwgQVJSQVlfU0laRShzaDc2MTlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwppbmRleCA0ZWQ5MTEwLi5iNmUzYTYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogX19pbml0Y2FsbChzaDcyMDZfZGV2aWNlc19zZXR1cCk7CiAKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3MjA2X2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCXsgMTQwLCAgNywgMTIsIDIgfSwJLyogQ01JMCAqLwogCXsgMTY0LCAgOCwgIDQsIDIgfSwJLyogTVRVMl9UR0kxQSAqLwogCXsgMjQwLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfQlJJICovCkBAIC03OCw3ICs3OCw3IEBACiAJeyAyNTUsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19UWEkgKi8KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7CiAJMHhmZmZlMDgxOCwJLyogSVBSMDEgKi8KIAkweGZmZmUwODFhLAkvKiBJUFIwMiAqLwogCTAsCQkvKiB1bnVzZWQgKi8KQEAgLTk1LDE1ICs5NSwxOSBAQAogCTB4ZmZmZTBjMTAsCS8qIElQUjE0ICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDcyMDYiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3MjA2X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3MjA2X2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwppbmRleCBiMGI1OWQ0Li5kOGUxMjI5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCkBAIC0zNDAsOCArMzQwLDI3IEBACiBnZW5lcmFsX2V4Y2VwdGlvbjoKIAltb3YubAkxZiwgazIKIAltb3YubAkyZiwgazMKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMworCW1vdi5sCUBrMiwgazIKKworCSEgSXMgRVhQRVZUIGxhcmdlciB0aGFuIDB4ODAwPworCW1vdgkjMHg4LCBrMAorCXNobGw4CWswCisJY21wL2hzCWswLCBrMgorCWJmCTBmCisKKwkhIHRoZW4gYWRkIDB4NTgwIChrMiBpcyAweGQ4MCBvciAweGRhMCkKKwltb3YJIzB4NTgsIGswCisJc2hsbDIJazAKKwlzaGxsMglrMAorCWFkZAlrMCwgazIKKzA6CisJYnJhCWhhbmRsZV9leGNlcHRpb24KKwkgbm9wCisjZWxzZQogCWJyYQloYW5kbGVfZXhjZXB0aW9uCiAJIG1vdi5sCUBrMiwgazIKKyNlbmRpZgogCS5hbGlnbgkyCiAxOgkubG9uZwlFWFBFVlQKIDI6CS5sb25nCXJldF9mcm9tX2V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKaW5kZXggMTk4M2ZiNy4uYTU1YjhjZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCkBAIC00OCw3ICs0OCw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwNV9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDVfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzAsMjUgKzcwLDI5IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4RkZGRkZFRTIJLyogMDogSVBSQSAqLwotLAkweEZGRkZGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDAwMDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQwMDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MDAwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KKwkweEZGRkZGRUUyLAkvKiAwOiBJUFJBICovCisJMHhGRkZGRkVFNCwJLyogMTogSVBSQiAqLworCTB4QTQwMDAwMTYsCS8qIDI6IElQUkMgKi8KKwkweEE0MDAwMDE4LAkvKiAzOiBJUFJEICovCisJMHhBNDAwMDAxQSwJLyogNDogSVBSRSAqLworCTB4QTQwODAwMDAsCS8qIDU6IElQUkYgKi8KKwkweEE0MDgwMDAyLAkvKiA2OiBJUFJHICovCisJMHhBNDA4MDAwNCwJLyogNzogSVBSSCAqLwogfTsKIAotLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwotdW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQotewotCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKIAotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzA1IiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzcwNV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzcwNV9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwppbmRleCBjN2Q3YzM1Li5kNzllYzBjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKQEAgLTEyLDYgKzEyLDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPQl7CisJCS5zdGFydAk9IDB4ZmZmZmZlYzAsCisJCS5lbmQJPSAweGZmZmZmZWMwICsgMHgxZSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwlbMV0gPQl7CisJCS5zdGFydCAgPSAyMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPQl7CisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9CXsKKwkJLnN0YXJ0CT0gMjIsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZmZmZlODAsCkBAIC00MSw4ICs2MSwxNiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MDlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MDlfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtNTIsMzIgKzgwLDY2IEBACiB9CiBfX2luaXRjYWxsKHNoNzcwOV9kZXZpY2VzX3NldHVwKTsKIAotI2RlZmluZSBJUFJ4KEEsTikJLmFkZHI9QSwgLnNoaWZ0PU4KLSNkZWZpbmUgSVBSQShOKQlJUFJ4KDB4ZmZmZmZlZTJVTCxOKQotI2RlZmluZSBJUFJCKE4pCUlQUngoMHhmZmZmZmVlNFVMLE4pCi0jZGVmaW5lIElQUkMoTikJSVBSeCgweGE0MDAwMDE2VUwsTikKLSNkZWZpbmUgSVBSRChOKQlJUFJ4KDB4YTQwMDAwMThVTCxOKQotI2RlZmluZSBJUFJFKE4pCUlQUngoMHhhNDAwMDAxYVVMLE4pCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKKwl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KKwl7IDE3LCAwLCA4LCAgNCB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE4LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDE5LCAwLCA0LCAgMSB9LCAvKiBUTVUgVFVOSTEgKi8KKwl7IDIwLCAwLCAwLCAgMiB9LCAvKiBSVEMgQ1VJICovCisJeyAyMSwgMCwgMCwgIDIgfSwgLyogUlRDIENVSSAqLworCXsgMjIsIDAsIDAsICAyIH0sIC8qIFJUQyBDVUkgKi8KIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDlfaXByX21hcFtdID0gewotCVsxNl0JCT0geyBJUFJBKDEyKSwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KLQlbMTddCQk9IHsgSVBSQSg4KSwgIDQgfSwgLyogVE1VIFRVTkkxICovCi0JWzE4IC4uLiAxOV0JPSB7IElQUkEoNCksICAxIH0sIC8qIFRNVSBUVU5JMSAqLwotCVsyMCAuLi4gMjJdCT0geyBJUFJBKDApLCAgMiB9LCAvKiBSVEMgQ1VJICovCi0JWzIzIC4uLiAyNl0JPSB7IElQUkIoNCksICAzIH0sIC8qIFNDSSAqLwotCVsyN10JCT0geyBJUFJCKDEyKSwgMiB9LCAvKiBXRFQgSVRJICovCi0JWzMyXQkJPSB7IElQUkMoMCksICAxIH0sIC8qIElSUSAwICovCi0JWzMzXQkJPSB7IElQUkMoNCksICAxIH0sIC8qIElSUSAxICovCi0JWzM0XQkJPSB7IElQUkMoOCksICAxIH0sIC8qIElSUSAyIEFQTSAqLwotCVszNV0JCT0geyBJUFJDKDEyKSwgMSB9LCAvKiBJUlEgMyBUT1VDSFNDUkVFTiAqLwotCVszNl0JCT0geyBJUFJEKDApLCAgMSB9LCAvKiBJUlEgNCAqLwotCVszN10JCT0geyBJUFJEKDQpLCAgMSB9LCAvKiBJUlEgNSAqLwotCVs0OCAuLi4gNTFdCT0geyBJUFJFKDEyKSwgNyB9LCAvKiBETUEgKi8KLQlbNTIgLi4uIDU1XQk9IHsgSVBSRSg4KSwgIDMgfSwgLyogSVJEQSAqLwotCVs1NiAuLi4gNTldCT0geyBJUFJFKDQpLCAgMyB9LCAvKiBTQ0lGICovCisJeyAyMywgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNCwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNSwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNiwgMSwgNCwgIDMgfSwgLyogU0NJICovCisJeyAyNywgMSwgMTIsIDMgfSwgLyogV0RUIElUSSAqLworCisJeyAzMiwgMiwgMCwgIDEgfSwgLyogSVJRIDAgKi8KKwl7IDMzLCAyLCA0LCAgMSB9LCAvKiBJUlEgMSAqLworCXsgMzQsIDIsIDgsICAxIH0sIC8qIElSUSAyIEFQTSAqLworCXsgMzUsIDIsIDEyLCAxIH0sIC8qIElSUSAzIFRPVUNIU0NSRUVOICovCisKKwl7IDM2LCAzLCAwLCAgMSB9LCAvKiBJUlEgNCAqLworCXsgMzcsIDMsIDQsICAxIH0sIC8qIElSUSA1ICovCisKKwl7IDQ4LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDQ5LCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUwLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKwl7IDUxLCA0LCAxMiwgNyB9LCAvKiBETUEgKi8KKworCXsgNTIsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKwl7IDUzLCA0LCA4LCAgMyB9LCAvKiBJUkRBICovCisJeyA1NCwgNCwgOCwgIDMgfSwgLyogSVJEQSAqLworCXsgNTUsIDQsIDgsICAzIH0sIC8qIElSREEgKi8KKworCXsgNTYsIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KKwl7IDU3LCA0LCA0LCAgMyB9LCAvKiBTQ0lGICovCisJeyA1OCwgNCwgNCwgIDMgfSwgLyogU0NJRiAqLworCXsgNTksIDQsIDQsICAzIH0sIC8qIFNDSUYgKi8KIH07CiAKLXZvaWQgX19pbml0IGluaXRfSVJRX2lwcigpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4ZmZmZmZlZTIsCS8qIDA6IElQUkEgKi8KKwkweGZmZmZmZWU0LAkvKiAxOiBJUFJCICovCisJMHhhNDAwMDAxNiwJLyogMjogSVBSQyAqLworCTB4YTQwMDAwMTgsCS8qIDM6IElQUkQgKi8KKwkweGE0MDAwMDFhLAkvKiA0OiBJUFJFICovCit9OworCitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAorCisJLmlwcl9kYXRhCT0gaXByX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSVBSLXNoNzcwOSIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewotCW1ha2VfaXByX2lycShzaDc3MDlfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MDlfaXByX21hcCkpOworCXJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKCZpcHJfaXJxX2Rlc2MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKaW5kZXggNTE3NjBhNy4uZjQwZTZkYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzcxMF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtNzgsMjYgKzc4LDMwIEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0gewotCTB4QTQxNEZFRTIJLyogMDogSVBSQSAqLwotLAkweEE0MTRGRUU0CS8qIDE6IElQUkIgKi8KLSwJMHhBNDE0MDAxNgkvKiAyOiBJUFJDICovCi0sCTB4QTQxNDAwMTgJLyogMzogSVBSRCAqLwotLAkweEE0MTQwMDFBCS8qIDQ6IElQUkUgKi8KLSwJMHhBNDA4MDAwMAkvKiA1OiBJUFJGICovCi0sCTB4QTQwODAwMDIJLyogNjogSVBSRyAqLwotLAkweEE0MDgwMDA0CS8qIDc6IElQUkggKi8KLSwJMHhBNDA4MDAwNgkvKiA4OiBJUFJJICovCisJMHhBNDE0RkVFMiwJLyogMDogSVBSQSAqLworCTB4QTQxNEZFRTQsCS8qIDE6IElQUkIgKi8KKwkweEE0MTQwMDE2LAkvKiAyOiBJUFJDICovCisJMHhBNDE0MDAxOCwJLyogMzogSVBSRCAqLworCTB4QTQxNDAwMUEsCS8qIDQ6IElQUkUgKi8KKwkweEE0MDgwMDAwLAkvKiA1OiBJUFJGICovCisJMHhBNDA4MDAwMiwJLyogNjogSVBSRyAqLworCTB4QTQwODAwMDQsCS8qIDc6IElQUkggKi8KKwkweEE0MDgwMDA2LAkvKiA4OiBJUFJJICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pcHIoKQorCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MTAiLAorCX0sCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzEwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzEwX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCmluZGV4IDhhZGQxMGIuLmRhZGQ2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQpAQCAtMTAsNyArMTAsMTEgQEAKIAogIyBDUFUgc3VidHlwZSBzZXR1cAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKQkrPSBzZXR1cC1zaDc3NTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQkrPSBzZXR1cC1zaDc3NTAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkJKz0gc2V0dXAtc2g3NzYwLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQkrPSBzZXR1cC1zaDQtMjAyLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCmluZGV4IGZhYjJlYjAuLjY2YzNmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKQEAgLTE0MSw2ICsxNDEsMTQgQEAKIAkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQl9CiAJCWJyZWFrOworCWNhc2UgMHg0MDAwOgkvKiAxc3QgY3V0ICovCisJY2FzZSAweDQwMDE6CS8qIDJuZCBjdXQgKi8KKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NIWDM7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKKwkJCQkJICBDUFVfSEFTX0xMU0M7CisJCWJyZWFrOwogCWNhc2UgMHg4MDAwOgogCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU1Q0MFJBOwogCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggMDNiMTRjZi4uZGExNTNiYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC04Miw3ICs4Miw3IEBACiB9CiBfX2luaXRjYWxsKHNoNzc1MF9kZXZpY2VzX3NldHVwKTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NTBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBpcHJfaXJxX3RhYmxlW10gPSB7CiAJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KIAl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLwogCXsgMTcsIDAsIDEyLCAyIH0sIC8qIFRNVTEgVFVOSSAqLwpAQCAtMTA2LDggKzEwNiwyNyBAQAogCXsgMzgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLwogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2Rlc2MgaXByX2lycV9kZXNjID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzUwIiwKKwl9LAorfTsKKwogI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzUxX2lwcl9tYXBbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZV9zaDc3NTFbXSA9IHsKIAl7IDQ0LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU0ICovCiAJeyA0NSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNSAqLwogCXsgNDYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTYgKi8KQEAgLTExOCwyMSArMTM3LDI2IEBACiAJLyp7IDcyLCBJTlRQUkkwMCwgIDgsID8gfSwqLyAvKiBUTVUzIFRVTkkgKi8KIAkvKnsgNzYsIElOVFBSSTAwLCAxMiwgPyB9LCovIC8qIFRNVTQgVFVOSSAqLwogfTsKKworc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2Nfc2g3NzUxID0geworCS5pcHJfb2Zmc2V0cwk9IGlwcl9vZmZzZXRzLAorCS5ucl9vZmZzZXRzCT0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cyksCisKKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlX3NoNzc1MSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaXByX2lycV90YWJsZV9zaDc3NTEpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3NTEiLAorCX0sCit9OwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGlwcl9vZmZzZXRzW10gPSB7Ci0JMHhmZmQwMDAwNFVMLAkvKiAwOiBJUFJBICovCi0JMHhmZmQwMDAwOFVMLAkvKiAxOiBJUFJCICovCi0JMHhmZmQwMDAwY1VMLAkvKiAyOiBJUFJDICovCi0JMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCi19OwotCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQlpZiAoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKKyNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzY19zaDc3NTEpOworI2VuZGlmCiB9CiAKICNkZWZpbmUgSU5UQ19JQ1IJMHhmZmQwMDAwMFVMCkBAIC0xNDMsMTEgKzE2NywzIEBACiB7CiAJY3RybF9vdXR3KGN0cmxfaW53KElOVENfSUNSKSB8IElOVENfSUNSX0lSTE0sIElOVENfSUNSKTsKIH0KLQotdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKLXsKLQltYWtlX2lwcl9pcnEoc2g3NzUwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzUwX2lwcl9tYXApKTsKLSNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxCi0JbWFrZV9pcHJfaXJxKHNoNzc1MV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc1MV9pcHJfbWFwKSk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCmluZGV4IGI3YzcwMjguLjNkZjE2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpAQCAtOTYsNyArOTYsMjUgQEAKIAl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NjBfaXByX21hcFtdID0geworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmUwODAwMDAsCisJLm1za19iYXNlCT0gMHhmZTA4MDA0MCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlMDgwMDYwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgaXByX2lycV90YWJsZVtdID0gewogCS8qIElSUSwgSVBSLWlkeCwgc2hpZnQsIHByaW9yaXR5ICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCBUVU5JKi8KIAl7IDE3LCAwLCAgOCwgMiB9LCAvKiBUTVUxIFRVTkkgKi8KQEAgLTEzMywyMCArMTUxLDE5IEBACiAJMHhmZmQwMDAxMFVMLAkvKiAzOiBJUFJEICovCiB9OwogCi0vKiBnaXZlbiB0aGUgSVBSIGluZGV4IHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgSVBSIHJlZ2lzdGVyICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Ci19CitzdGF0aWMgc3RydWN0IGlwcl9kZXNjIGlwcl9pcnFfZGVzYyA9IHsKKwkuaXByX29mZnNldHMJPSBpcHJfb2Zmc2V0cywKKwkubnJfb2Zmc2V0cwk9IEFSUkFZX1NJWkUoaXByX29mZnNldHMpLAogCi12b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQotewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKLX0KKwkuaXByX2RhdGEJPSBpcHJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpcHJfaXJxX3RhYmxlKSwKIAotdm9pZCBfX2luaXQgIGluaXRfSVJRX2lwcih2b2lkKQorCS5jaGlwID0geworCQkubmFtZQk9ICJJUFItc2g3NzYwIiwKKwl9LAorfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7Ci0JbWFrZV9pcHJfaXJxKHNoNzc2MF9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzc2MF9pcHJfbWFwKSk7CisJcmVnaXN0ZXJfaXByX2NvbnRyb2xsZXIoJmlwcl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCmluZGV4IGFiNzQyMmYuLjQwMDYyMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCkBAIC05LDYgKzksNyBAQAogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCSs9IHNldHVwLXNoNzMxODAubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJKz0gc2V0dXAtc2g3MzQzLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCSs9IHNldHVwLXNoNzcyMi5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJCSs9IHNldHVwLXNoeDMubwogCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCTo9IGNsb2NrLXNoNzMxODAubwpAQCAtMTcsNSArMTgsNiBAQAogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQk6PSBjbG9jay1zaDc3ODUubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQk6PSBjbG9jay1zaDczNDMubwogY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQk6PSBjbG9jay1zaDc3MjIubworY2xvY2stJChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykJOj0gY2xvY2stc2h4My5vCiAKIG9iai15CSs9ICQoY2xvY2steSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjMwYjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaHgzLmMKKyAqCisgKiBTSC1YMyBzdXBwb3J0IGZvciB0aGUgY2xvY2sgZnJhbWV3b3JrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA3ICBSZW5lc2FzIFRlY2hub2xvZ3kgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9mcmVxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDEsIDIsIDQgLDYgfTsKK3N0YXRpYyBpbnQgYmZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDEsIDEsIDEsIDEyLCAxNiwgMTgsIDI0LCAzMiwgMzYsIDQ4IH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxOCwgMjQsIDMyLCAzNiwgNDggfTsKK3N0YXRpYyBpbnQgY2ZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDQsIDYgfTsKKworI2RlZmluZSBJRkNfUE9TCQkyOAorI2RlZmluZSBJRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX01TSwkJMHgwMDBmCisjZGVmaW5lIFBGQ19NU0sJCTB4MDAwZgorI2RlZmluZSBDRkNfTVNLCQkweDAwMDMKKyNkZWZpbmUgQkZDX1BPUwkJMTYKKyNkZWZpbmUgUEZDX1BPUwkJMAorI2RlZmluZSBDRkNfUE9TCQkyMAorCitzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQoreworCWNsay0+cmF0ZSAqPSBwZmNfZGl2aXNvcnNbKGN0cmxfaW5sKEZSUUNSKSA+PiBQRkNfUE9TKSAmIFBGQ19NU0tdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19tYXN0ZXJfY2xrX29wcyA9IHsKKwkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCit9OworCitzdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IFBGQ19QT1MpICYgUEZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfbW9kdWxlX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gQkZDX1BPUykgJiBCRkNfTVNLKTsKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19idXNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBJRkNfUE9TKSAmIElGQ19NU0spOworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX2NwdV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19vcHMgKnNoeDNfY2xrX29wc1tdID0geworCSZzaHgzX21hc3Rlcl9jbGtfb3BzLAorCSZzaHgzX21vZHVsZV9jbGtfb3BzLAorCSZzaHgzX2J1c19jbGtfb3BzLAorCSZzaHgzX2NwdV9jbGtfb3BzLAorfTsKKwordm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCit7CisJaWYgKGlkeCA8IEFSUkFZX1NJWkUoc2h4M19jbGtfb3BzKSkKKwkJKm9wcyA9IHNoeDNfY2xrX29wc1tpZHhdOworfQorCitzdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IENGQ19QT1MpICYgQ0ZDX01TSyk7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfc2h5d2F5X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBzaHl3YXlfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNoeDNfc2h5d2F5X2NsayA9IHsKKwkubmFtZQkJPSAic2h5d2F5X2NsayIsCisJLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkub3BzCQk9ICZzaHgzX3NoeXdheV9jbGtfb3BzLAorfTsKKworLyoKKyAqIEFkZGl0aW9uYWwgU0h4My1zcGVjaWZpYyBvbi1jaGlwIGNsb2NrcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHBhcnQgb2YgdGhlCisgKiBjbG9jayBmcmFtZXdvcmsKKyAqLworc3RhdGljIHN0cnVjdCBjbGsgKnNoeDNfb25jaGlwX2Nsb2Nrc1tdID0geworCSZzaHgzX3NoeXdheV9jbGssCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaHgzX2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2h4M19vbmNoaXBfY2xvY2tzKTsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsa3AgPSBzaHgzX29uY2hpcF9jbG9ja3NbaV07CisKKwkJY2xrcC0+cGFyZW50ID0gY2xrOworCQljbGtfcmVnaXN0ZXIoY2xrcCk7CisJCWNsa19lbmFibGUoY2xrcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bworCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKKwkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKKwkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KKwkgKi8KKwljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7CisKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwoc2h4M19jbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCmluZGV4IDExNDNmYmYuLmEzZTE1OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNINzcyMiBTZXR1cAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDA3ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW16b25lLmg+CiAjaW5jbHVkZSA8YXNtL3NjaS5oPgogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKQEAgLTQyLDcgKzQ0LDcgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzIyX2RldmljZXNfc2V0dXApOwogCi1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcyMl9pcHJfbWFwW10gPSB7CitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIGlwcl9pcnFfdGFibGVbXSA9IHsKIAkvKiBJUlEsIElQUi1pZHgsIHNoaWZ0LCBwcmlvICovCiAJeyAxNiwgMCwgMTIsIDIgfSwgLyogVE1VMCAqLwogCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgKi8KQEAgLTY3LDE0ICs2OSwyNSBAQAogCTB4YTQwODAwMmMsIC8qIDExOiBJUFJMICovCiB9OwogCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCi17Ci0JaWYgKHVubGlrZWx5KGlkeCA+PSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSkpCi0JCXJldHVybiAwOwotCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOwotfQorc3RhdGljIHN0cnVjdCBpcHJfZGVzYyBpcHJfaXJxX2Rlc2MgPSB7CisJLmlwcl9vZmZzZXRzCT0gaXByX29mZnNldHMsCisJLm5yX29mZnNldHMJPSBBUlJBWV9TSVpFKGlwcl9vZmZzZXRzKSwKKworCS5pcHJfZGF0YQk9IGlwcl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGlwcl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklQUi1zaDc3MjIiLAorCX0sCit9OwogCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIodm9pZCkKIHsKLQltYWtlX2lwcl9pcnEoc2g3NzIyX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzIyX2lwcl9tYXApKTsKKwlyZWdpc3Rlcl9pcHJfY29udHJvbGxlcigmaXByX2lycV9kZXNjKTsKK30KKwordm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKK3sKKwkvKiBSZWdpc3RlciB0aGUgVVJBTSBzcGFjZSBhcyBOb2RlIDEgKi8KKwlzZXR1cF9ib290bWVtX25vZGUoMSwgMHgwNTVmMDAwMCwgMHgwNTYxMDAwMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDlhZWFhMmQuLmI1N2M3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xMDIsNyArMTAyLDIwIEBACiAJeyA2OCwgMHgxNCwgIDgsIDAsIDE4LCAyIH0sCS8qIFBDSUM0ICovCiB9OwogCitzdGF0aWMgc3RydWN0IGludGMyX2Rlc2MgaW50YzJfaXJxX2Rlc2MgX19yZWFkX21vc3RseSA9IHsKKwkucHJpb19iYXNlCT0gMHhmZmQ0MDAwMCwKKwkubXNrX2Jhc2UJPSAweGZmZDQwMDM4LAorCS5tc2tjbHJfYmFzZQk9IDB4ZmZkNDAwM2MsCisKKwkuaW50YzJfZGF0YQk9IGludGMyX2lycV90YWJsZSwKKwkubnJfaXJxcwk9IEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSwKKworCS5jaGlwID0geworCQkubmFtZQk9ICJJTlRDMi1zaDc3ODAiLAorCX0sCit9OworCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQogewotCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKKwlyZWdpc3Rlcl9pbnRjMl9jb250cm9sbGVyKCZpbnRjMl9pcnFfZGVzYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCmluZGV4IDA3YjBkZTguLmNlMTBlYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCkBAIC05Nyw3ICs5NywyMSBAQAogCXsgNjAsIDEyLCAxNiwgMCwgNywgMyB9LAkvKiBTQ0lGNSBFUkksIFJYSSwgQlJJLCBUWEkgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaW50YzJfZGVzYyBpbnRjMl9pcnFfZGVzYyBfX3JlYWRfbW9zdGx5ID0geworCS5wcmlvX2Jhc2UJPSAweGZmZDQwMDAwLAorCS5tc2tfYmFzZQk9IDB4ZmZkNDAwMzgsCisJLm1za2Nscl9iYXNlCT0gMHhmZmQ0MDAzYywKKworCS5pbnRjMl9kYXRhCT0gaW50YzJfaXJxX3RhYmxlLAorCS5ucl9pcnFzCT0gQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpLAorCisJLmNoaXAgPSB7CisJCS5uYW1lCT0gIklOVEMyLXNoNzc4NSIsCisJfSwKK307CisKIHZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCiB7Ci0JbWFrZV9pbnRjMl9pcnEoaW50YzJfaXJxX3RhYmxlLCBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSkpOworCXJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoJmludGMyX2lycV9kZXNjKTsKIH0KKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2h4My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjgzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFNILVgzIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHhmZmMzMDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM0MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDQsIDQ1LCA0NywgNDYgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM1MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDgsIDQ5LCA1MSwgNTAgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmM2MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaHgzX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2h4M19kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoeDNfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaHgzX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2h4M19kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kYXRhIGludGMyX2lycV90YWJsZVtdID0geworCXsgMTYsIDAsIDAsIDAsIDEsIDIgfSwJCS8qIFRNVTAgKi8KKwl7IDQwLCA0LCAwLCAweDIwLCAwLCAzIH0sCS8qIFNDSUYwIEVSSSAqLworCXsgNDEsIDQsIDAsIDB4MjAsIDEsIDMgfSwJLyogU0NJRjAgUlhJICovCisJeyA0MiwgNCwgMCwgMHgyMCwgMiwgMyB9LAkvKiBTQ0lGMCBCUkkgKi8KKwl7IDQzLCA0LCAwLCAweDIwLCAzLCAzIH0sCS8qIFNDSUYwIFRYSSAqLworfTsKKworc3RhdGljIHN0cnVjdCBpbnRjMl9kZXNjIGludGMyX2lycV9kZXNjIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaW9fYmFzZQk9IDB4ZmU0MTAwMDAsCisJLm1za19iYXNlCT0gMHhmZTQxMDgyMCwKKwkubXNrY2xyX2Jhc2UJPSAweGZlNDEwODUwLAorCisJLmludGMyX2RhdGEJPSBpbnRjMl9pcnFfdGFibGUsCisJLm5yX2lycXMJPSBBUlJBWV9TSVpFKGludGMyX2lycV90YWJsZSksCisKKwkuY2hpcCA9IHsKKwkJLm5hbWUJPSAiSU5UQzItU0hYMyIsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGluaXRfSVJRX2ludGMyKHZvaWQpCit7CisJcmVnaXN0ZXJfaW50YzJfY29udHJvbGxlcigmaW50YzJfaXJxX2Rlc2MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCAyN2I5MjNjLi4yNzg5Nzc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMTU4LDE1ICsxNTgsMTEgQEAKIH0KIAogI2lmZGVmIENPTkZJR180S1NUQUNLUwotLyoKLSAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0Ci0gKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgotICovCiBzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KLQkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuYnNzLnBhZ2VfYWxpZ25lZCIpKSk7CiAKIHN0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQotCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKwkJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikpKTsKIAogLyoKICAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL21hY2h2ZWMuYworICoKKyAqIFRoZSBTdXBlckggbWFjaGluZSB2ZWN0b3Igc2V0dXAgaGFuZGxlcnMsIHlhbmtlZCBmcm9tIHNldHVwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBNVl9OQU1FX1NJWkUgMzIKKworI2RlZmluZSBmb3JfZWFjaF9tdihtdikgXAorCWZvciAoKG12KSA9IChzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OyBcCisJICAgICAobXYpICYmICh1bnNpZ25lZCBsb25nKShtdikgPCAodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZDsgXAorCSAgICAgKG12KSsrKQorCitzdGF0aWMgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12OworCisJZm9yX2VhY2hfbXYobXYpCisJCWlmIChzdHJjYXNlY21wKG5hbWUsIG12LT5tdl9uYW1lKSA9PSAwKQorCQkJcmV0dXJuIG12OworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYWNodmVjX3NlbGVjdGVkOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tdihjaGFyICpmcm9tKQoreworCWNoYXIgbXZfbmFtZVtNVl9OQU1FX1NJWkVdID0gIiI7CisJY2hhciAqbXZfZW5kOworCWNoYXIgKm12X2NvbW1hOworCWludCBtdl9sZW47CisJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdnA7CisKKwltdl9lbmQgPSBzdHJjaHIoZnJvbSwgJyAnKTsKKwlpZiAobXZfZW5kID09IE5VTEwpCisJCW12X2VuZCA9IGZyb20gKyBzdHJsZW4oZnJvbSk7CisKKwltdl9jb21tYSA9IHN0cmNocihmcm9tLCAnLCcpOworCW12X2xlbiA9IG12X2VuZCAtIGZyb207CisJaWYgKG12X2xlbiA+IChNVl9OQU1FX1NJWkUtMSkpCisJCW12X2xlbiA9IE1WX05BTUVfU0laRS0xOworCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOworCW12X25hbWVbbXZfbGVuXSA9ICdcMCc7CisJZnJvbSA9IG12X2VuZDsKKworCW1hY2h2ZWNfc2VsZWN0ZWQgPSAxOworCisJLyogQm9vdCB3aXRoIHRoZSBnZW5lcmljIHZlY3RvciAqLworCWlmIChzdHJjbXAobXZfbmFtZSwgImdlbmVyaWMiKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW12cCA9IGdldF9tdl9ieW5hbWUobXZfbmFtZSk7CisJaWYgKHVubGlrZWx5KCFtdnApKSB7CisJCXByaW50aygiQXZhaWxhYmxlIHZlY3RvcnM6XG5cblx0JyVzJywgIiwgc2hfbXYubXZfbmFtZSk7CisJCWZvcl9lYWNoX212KG12cCkKKwkJCXByaW50aygiJyVzJywgIiwgbXZwLT5tdl9uYW1lKTsKKwkJcHJpbnRrKCJcblxuIik7CisJCXBhbmljKCJGYWlsZWQgdG8gc2VsZWN0IG1hY2h2ZWMgJyVzJyAtLSBoYWx0aW5nLlxuIiwKKwkJICAgICAgbXZfbmFtZSk7CisJfSBlbHNlCisJCXNoX212ID0gKm12cDsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oInNoX212IiwgZWFybHlfcGFyc2VfbXYpOworCit2b2lkIF9faW5pdCBzaF9tdl9zZXR1cCh2b2lkKQoreworCS8qCisJICogT25seSBvdmVybG9hZCB0aGUgbWFjaHZlYyBpZiBvbmUgaGFzbid0IGJlZW4gc2VsZWN0ZWQgb24KKwkgKiB0aGUgY29tbWFuZCBsaW5lIHdpdGggc2hfbXY9CisJICovCisJaWYgKCFtYWNodmVjX3NlbGVjdGVkKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFjaHZlY19zaXplOworCisJCW1hY2h2ZWNfc2l6ZSA9ICgodW5zaWduZWQgbG9uZykmX19tYWNodmVjX2VuZCAtCisJCQkJKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCk7CisKKwkJLyoKKwkJICogSWYgdGhlIG1hY2h2ZWMgaGFzbid0IGJlZW4gcHJlc2VsZWN0ZWQsIHVzZSB0aGUgZmlyc3QKKwkJICogdmVjdG9yICh1c3VhbGx5IHRoZSBvbmx5IG9uZSkgZnJvbSAubWFjaHZlYy5pbml0LgorCQkgKi8KKwkJaWYgKG1hY2h2ZWNfc2l6ZSA+PSBzaXplb2Yoc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yKSkKKwkJCXNoX212ID0gKihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OworCX0KKworCXByaW50ayhLRVJOX05PVElDRSAiQm9vdGluZyBtYWNodmVjOiAlc1xuIiwgZ2V0X3N5c3RlbV90eXBlKCkpOworCisJLyoKKwkgKiBNYW51YWxseSB3YWxrIHRoZSB2ZWMsIGZpbGwgaW4gYW55dGhpbmcgdGhhdCB0aGUgYm9hcmQgaGFzbid0IHlldAorCSAqIGJ5IGhhbmQsIHdyYXBwaW5nIHRvIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uLgorCSAqLworI2RlZmluZSBtdl9zZXQoZWxlbSkgZG8geyBcCisJaWYgKCFzaF9tdi5tdl8jI2VsZW0pIFwKKwkJc2hfbXYubXZfIyNlbGVtID0gZ2VuZXJpY18jI2VsZW07IFwKK30gd2hpbGUgKDApCisKKwltdl9zZXQoaW5iKTsJbXZfc2V0KGludyk7CW12X3NldChpbmwpOworCW12X3NldChvdXRiKTsJbXZfc2V0KG91dHcpOwltdl9zZXQob3V0bCk7CisKKwltdl9zZXQoaW5iX3ApOwltdl9zZXQoaW53X3ApOwltdl9zZXQoaW5sX3ApOworCW12X3NldChvdXRiX3ApOwltdl9zZXQob3V0d19wKTsJbXZfc2V0KG91dGxfcCk7CisKKwltdl9zZXQoaW5zYik7CW12X3NldChpbnN3KTsJbXZfc2V0KGluc2wpOworCW12X3NldChvdXRzYik7CW12X3NldChvdXRzdyk7CW12X3NldChvdXRzbCk7CisKKwltdl9zZXQocmVhZGIpOwltdl9zZXQocmVhZHcpOwltdl9zZXQocmVhZGwpOworCW12X3NldCh3cml0ZWIpOwltdl9zZXQod3JpdGV3KTsJbXZfc2V0KHdyaXRlbCk7CisKKwltdl9zZXQoaW9wb3J0X21hcCk7CisJbXZfc2V0KGlvcG9ydF91bm1hcCk7CisJbXZfc2V0KGlycV9kZW11eCk7CisKKwlpZiAoIXNoX212Lm12X25yX2lycXMpCisJCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGExMWUyYWEuLjYzMzRhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0zMTksOSArMzIwLDcgQEAKIAljdHJsX291dGwocGMsIFVCQ19CQVJBKTsKIAogI2lmZGVmIENPTkZJR19NTVUKLQkvKiBXZSBkb24ndCBoYXZlIGFueSBBU0lEIHNldHRpbmdzIGZvciB0aGUgU0gtMiEgKi8KLQlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlICE9IENQVV9TSDc2MDQpCi0JCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOworCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOwogI2VuZGlmCiAKIAljdHJsX291dGwoMCwgVUJDX0JBTVJBKTsKQEAgLTQwNSw4ICs0MDQsOCBAQAogCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCXN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAjaWZkZWYgQ09ORklHX01NVQorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKIAlyZXR1cm4gZG9fZm9yayhTSUdDSExELCByZWdzLT5yZWdzWzE1XSwgcmVncywgMCwgTlVMTCwgTlVMTCk7CiAjZWxzZQogCS8qIGZvcmsgYWxtb3N0IHdvcmtzLCBlbm91Z2ggdG8gdHJpY2sgeW91IGludG8gbG9va2luZyBlbHNld2hlcmUgOi0oICovCkBAIC00NDksMjMgKzQ0OCwyMCBAQAogLyoKICAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgogICovCi1hc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgKnVmaWxlbmFtZSwgY2hhciAqKnVhcmd2LAotCQkJICBjaGFyICoqdWVudnAsIHVuc2lnbmVkIGxvbmcgcjcsCithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICp1ZmlsZW5hbWUsIGNoYXIgX191c2VyICogX191c2VyICp1YXJndiwKKwkJCSAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKnVlbnZwLCB1bnNpZ25lZCBsb25nIHI3LAogCQkJICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCWludCBlcnJvcjsKIAljaGFyICpmaWxlbmFtZTsKIAotCWZpbGVuYW1lID0gZ2V0bmFtZSgoY2hhciBfX3VzZXIgKil1ZmlsZW5hbWUpOworCWZpbGVuYW1lID0gZ2V0bmFtZSh1ZmlsZW5hbWUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CiAJaWYgKElTX0VSUihmaWxlbmFtZSkpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsCi0JCQkgIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKXVhcmd2LAotCQkJICAoY2hhciBfX3VzZXIgKiBfX3VzZXIgKil1ZW52cCwKLQkJCSAgcmVncyk7CisJZXJyb3IgPSBkb19leGVjdmUoZmlsZW5hbWUsIHVhcmd2LCB1ZW52cCwgcmVncyk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJdGFza19sb2NrKGN1cnJlbnQpOwogCQljdXJyZW50LT5wdHJhY2UgJj0gflBUX0RUUkFDRTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2ZiNWZjMC4uODkxZDFkNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlLmMKQEAgLTkxLDE3ICs5MSw4IEBACiAJc3dpdGNoIChyZXF1ZXN0KSB7CiAJLyogd2hlbiBJIGFuZCBEIHNwYWNlIGFyZSBzZXBhcmF0ZSwgdGhlc2Ugd2lsbCBuZWVkIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAKIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CkBAIC0xMjgsMTcgKzExOSwxNCBAQAogCQkJdG1wID0gISF0c2tfdXNlZF9tYXRoKGNoaWxkKTsKIAkJZWxzZQogCQkJdG1wID0gMDsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKWRhdGEpOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWRhdGEpOwogCQlicmVhazsKIAl9CiAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwpAQCAtMTk2LDcgKzE4NCw3IEBACiAKIAljYXNlIFBUUkFDRV9TSU5HTEVTVEVQOiB7ICAvKiBzZXQgdGhlIHRyYXAgZmxhZy4gKi8KIAkJbG9uZyBwYzsKLQkJc3RydWN0IHB0X3JlZ3MgKmR1bW15ID0gTlVMTDsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBOVUxMOwogCiAJCXJldCA9IC1FSU87CiAJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQpAQCAtMjA3LDcgKzE5NSw3IEBACiAJCQljaGlsZC0+cHRyYWNlIHw9IFBUX0RUUkFDRTsKIAkJfQogCi0JCXBjID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIChsb25nKSZkdW1teS0+cGMpOworCQlwYyA9IGdldF9zdGFja19sb25nKGNoaWxkLCAobG9uZykmcmVncy0+cGMpOwogCiAJCS8qIE5leHQgc2NoZWR1bGluZyB3aWxsIHNldCB1cCBVQkMgKi8KIAkJaWYgKGNoaWxkLT50aHJlYWQudWJjX3BjID09IDApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCBjMjc3MjkxLi5kZThlNmUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CkBAIC00MSwyMCArNDIsMTkgQEAKICAqIFRoZSBiaWdnZXIgdmFsdWUgbWVhbnMgbm8gcHJvYmxlbS4KICAqLwogc3RydWN0IHNoX2NwdWluZm8gYm9vdF9jcHVfZGF0YSA9IHsgQ1BVX1NIX05PTkUsIDEwMDAwMDAwLCB9OworCisvKgorICogVGhlIG1hY2hpbmUgdmVjdG9yLiBGaXJzdCBlbnRyeSBpbiAubWFjaHZlYy5pbml0LCBvciBjbG9iYmVyZWQgYnkKKyAqIHNoX212PSBvbiB0aGUgY29tbWFuZCBsaW5lLCBwcmlvciB0byAubWFjaHZlYy5pbml0IHRlYXJkb3duLgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXYgPSB7IC5tdl9uYW1lID0gImdlbmVyaWMiLCB9OworCiAjaWZkZWYgQ09ORklHX1ZUCiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3Igc2hfbXY7Ci0jZW5kaWYKLQogZXh0ZXJuIGludCByb290X21vdW50ZmxhZ3M7CiAKLSNkZWZpbmUgTVZfTkFNRV9TSVpFIDMyCi0KLXN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotCiAvKgogICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCiAgKi8KQEAgLTgwLDEzMSArODAsMTcgQEAKIAogdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jbWRsaW5lIChjaGFyICoqIGNtZGxpbmVfcCwgY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0sCi0JCQkJICBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqKiBtdnAsCi0JCQkJICB1bnNpZ25lZCBsb25nICptdl9pb19iYXNlKQorc3RhdGljIGludCBfX2luaXQgZWFybHlfcGFyc2VfbWVtKGNoYXIgKnApCiB7Ci0JY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmUsICpmcm9tID0gQ09NTUFORF9MSU5FOwotCWludCBsZW4gPSAwOwotCi0JLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwotCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JYm9vdF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCW1lbW9yeV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKVBBR0VfT0ZGU0VUK19fTUVNT1JZX1NUQVJUOwotCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBfX01FTU9SWV9TSVpFOwotCi0JZm9yICg7OykgewotCQkvKgotCQkgKiAibWVtPVhYWFtrS21NXSIgZGVmaW5lcyBhIHNpemUgb2YgbWVtb3J5LgotCQkgKi8KLQkJaWYgKGMgPT0gJyAnICYmICFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgewotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJewotCQkJCXVuc2lnbmVkIGxvbmcgbWVtX3NpemU7Ci0KLQkJCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20rNCwgJmZyb20pOwotCQkJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc3RhcnQgKyBtZW1fc2l6ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJzaF9tdj0iLCA2KSkgewotCQkJY2hhciogbXZfZW5kOwotCQkJY2hhciogbXZfY29tbWE7Ci0JCQlpbnQgbXZfbGVuOwotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJZnJvbSArPSA2OwotCQkJbXZfZW5kID0gc3RyY2hyKGZyb20sICcgJyk7Ci0JCQlpZiAobXZfZW5kID09IE5VTEwpCi0JCQkJbXZfZW5kID0gZnJvbSArIHN0cmxlbihmcm9tKTsKLQotCQkJbXZfY29tbWEgPSBzdHJjaHIoZnJvbSwgJywnKTsKLQkJCWlmICgobXZfY29tbWEgIT0gTlVMTCkgJiYgKG12X2NvbW1hIDwgbXZfZW5kKSkgewotCQkJCWludCBpbnRzWzNdOwotCQkJCWdldF9vcHRpb25zKG12X2NvbW1hKzEsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCQkJCSptdl9pb19iYXNlID0gaW50c1sxXTsKLQkJCQltdl9sZW4gPSBtdl9jb21tYSAtIGZyb207Ci0JCQl9IGVsc2UgewotCQkJCW12X2xlbiA9IG12X2VuZCAtIGZyb207Ci0JCQl9Ci0JCQlpZiAobXZfbGVuID4gKE1WX05BTUVfU0laRS0xKSkKLQkJCQltdl9sZW4gPSBNVl9OQU1FX1NJWkUtMTsKLQkJCW1lbWNweShtdl9uYW1lLCBmcm9tLCBtdl9sZW4pOwotCQkJbXZfbmFtZVttdl9sZW5dID0gJ1wwJzsKLQkJCWZyb20gPSBtdl9lbmQ7Ci0KLQkJCSptdnAgPSBnZXRfbXZfYnluYW1lKG12X25hbWUpOwotCQl9Ci0KLQkJYyA9ICooZnJvbSsrKTsKLQkJaWYgKCFjKQotCQkJYnJlYWs7Ci0JCWlmIChDT01NQU5EX0xJTkVfU0laRSA8PSArK2xlbikKLQkJCWJyZWFrOwotCQkqKHRvKyspID0gYzsKLQl9Ci0JKnRvID0gJ1wwJzsKLQkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzaF9tdl9zZXR1cChjaGFyICoqY21kbGluZV9wKQotewotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JZXh0ZXJuIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl91bmtub3duOwotI2VuZGlmCi0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICptdiA9IE5VTEw7Ci0JY2hhciBtdl9uYW1lW01WX05BTUVfU0laRV0gPSAiIjsKLQl1bnNpZ25lZCBsb25nIG12X2lvX2Jhc2UgPSAwOwotCi0JcGFyc2VfY21kbGluZShjbWRsaW5lX3AsIG12X25hbWUsICZtdiwgJm12X2lvX2Jhc2UpOwotCi0jaWZkZWYgQ09ORklHX1NIX1VOS05PV04KLQlpZiAobXYgPT0gTlVMTCkgewotCQltdiA9ICZtdl91bmtub3duOwotCQlpZiAoKm12X25hbWUgIT0gJ1wwJykgewotCQkJcHJpbnRrKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBtYWNoaW5lICVzLCB1c2luZyB1bmtub3duXG4iLAotCQkJICAgICAgIG12X25hbWUpOwotCQl9Ci0JfQotCXNoX212ID0gKm12OwotI2VuZGlmCi0KLQkvKgotCSAqIE1hbnVhbGx5IHdhbGsgdGhlIHZlYywgZmlsbCBpbiBhbnl0aGluZyB0aGF0IHRoZSBib2FyZCBoYXNuJ3QgeWV0Ci0JICogYnkgaGFuZCwgd3JhcHBpbmcgdG8gdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCi0JICovCi0jZGVmaW5lIG12X3NldChlbGVtKSBkbyB7IFwKLQlpZiAoIXNoX212Lm12XyMjZWxlbSkgXAotCQlzaF9tdi5tdl8jI2VsZW0gPSBnZW5lcmljXyMjZWxlbTsgXAotfSB3aGlsZSAoMCkKLQotCW12X3NldChpbmIpOwltdl9zZXQoaW53KTsJbXZfc2V0KGlubCk7Ci0JbXZfc2V0KG91dGIpOwltdl9zZXQob3V0dyk7CW12X3NldChvdXRsKTsKLQotCW12X3NldChpbmJfcCk7CW12X3NldChpbndfcCk7CW12X3NldChpbmxfcCk7Ci0JbXZfc2V0KG91dGJfcCk7CW12X3NldChvdXR3X3ApOwltdl9zZXQob3V0bF9wKTsKLQotCW12X3NldChpbnNiKTsJbXZfc2V0KGluc3cpOwltdl9zZXQoaW5zbCk7Ci0JbXZfc2V0KG91dHNiKTsJbXZfc2V0KG91dHN3KTsJbXZfc2V0KG91dHNsKTsKLQotCW12X3NldChyZWFkYik7CW12X3NldChyZWFkdyk7CW12X3NldChyZWFkbCk7Ci0JbXZfc2V0KHdyaXRlYik7CW12X3NldCh3cml0ZXcpOwltdl9zZXQod3JpdGVsKTsKLQotCW12X3NldChpb3BvcnRfbWFwKTsKLQltdl9zZXQoaW9wb3J0X3VubWFwKTsKLQltdl9zZXQoaXJxX2RlbXV4KTsKLQotI2lmZGVmIENPTkZJR19TSF9VTktOT1dOCi0JX19zZXRfaW9fcG9ydF9iYXNlKG12X2lvX2Jhc2UpOwotI2VuZGlmCi0KLQlpZiAoIXNoX212Lm12X25yX2lycXMpCi0JCXNoX212Lm12X25yX2lycXMgPSBOUl9JUlFTOworCXNpemUgPSBtZW1wYXJzZShwLCAmcCk7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIHNpemU7CiAKIAlyZXR1cm4gMDsKIH0KK2Vhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOwogCiAvKgogICogUmVnaXN0ZXIgZnVsbHkgYXZhaWxhYmxlIGxvdyBSQU0gcGFnZXMgd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCkBAIC0yMzAsNyArMTE2LDcgQEAKIAlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhwYWdlcykpOwogfQogCi12b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbikKK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKHVuc2lnbmVkIGxvbmcgZnJlZV9wZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBib290bWFwX3NpemU7CiAKQEAgLTIzOSw5ICsxMjUsMTAgQEAKIAkgKiBib290c3RyYXAgc3RlcCBhbGwgYWxsb2NhdGlvbnMgKHVudGlsIHRoZSBwYWdlIGFsbG9jYXRvcgogCSAqIGlzIGludGFjdCkgbXVzdCBiZSBkb25lIHZpYSBib290bWVtX2FsbG9jKCkuCiAJICovCi0JYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBmcmVlX3BmbiwKIAkJCQkJIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAKKwlhZGRfYWN0aXZlX3JhbmdlKDAsIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CiAJcmVnaXN0ZXJfYm9vdG1lbV9sb3dfcGFnZXMoKTsKIAogCW5vZGVfc2V0X29ubGluZSgwKTsKQEAgLTI1NCw3ICsxNDEsNyBAQAogCSAqIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJUK1BBR0VfU0laRSwKLQkJKFBGTl9QSFlTKHN0YXJ0X3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CisJCShQRk5fUEhZUyhmcmVlX3BmbikrYm9vdG1hcF9zaXplK1BBR0VfU0laRS0xKS1fX01FTU9SWV9TVEFSVCk7CiAKIAkvKgogCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCkBAIC0yNjIsNiArMTQ5LDggQEAKIAkgKi8KIAlyZXNlcnZlX2Jvb3RtZW0oX19NRU1PUllfU1RBUlQsIFBBR0VfU0laRSk7CiAKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKKwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCVJPT1RfREVWID0gTUtERVYoUkFNRElTS19NQUpPUiwgMCk7CiAJaWYgKCZfX3JkX3N0YXJ0ICE9ICZfX3JkX2VuZCkgewpAQCAtMzE1LDEwICsyMDQsNiBAQAogewogCWVuYWJsZV9tbXUoKTsKIAotI2lmZGVmIENPTkZJR19DTURMSU5FX0JPT0wKLQlzdHJjcHkoQ09NTUFORF9MSU5FLCBDT05GSUdfQ01ETElORSk7Ci0jZW5kaWYKLQogCVJPT1RfREVWID0gb2xkX2RlY29kZV9kZXYoT1JJR19ST09UX0RFVik7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KQEAgLTMzOSw5ICsyMjQsMjIgQEAKIAlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CiAJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOwogCisJbWVtb3J5X3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpUEFHRV9PRkZTRVQrX19NRU1PUllfU1RBUlQ7CisJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIF9fTUVNT1JZX1NJWkU7CisKKyNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCisJc3RybGNweShjb21tYW5kX2xpbmUsIENPTkZJR19DTURMSU5FLCBzaXplb2YoY29tbWFuZF9saW5lKSk7CisjZWxzZQorCXN0cmxjcHkoY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKKyNlbmRpZgorCisJLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLworCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKKwogCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKLQlzaF9tdl9zZXR1cChjbWRsaW5lX3ApOworCXNoX212X3NldHVwKCk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKQEAgLTM1NSw4ICsyNTMsOSBAQAogCW1pbl9sb3dfcGZuID0gX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVDsKIAogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CisKKwkvKiBTZXR1cCBib290bWVtIHdpdGggYXZhaWxhYmxlIFJBTSAqLwogCXNldHVwX21lbW9yeSgpOwotCXBhZ2luZ19pbml0KCk7CiAJc3BhcnNlX2luaXQoKTsKIAogI2lmZGVmIENPTkZJR19EVU1NWV9DT05TT0xFCkBAIC0zNjYsNDYgKzI2NSwxMyBAQAogCS8qIFBlcmZvcm0gdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb24gKi8KIAlpZiAobGlrZWx5KHNoX212Lm12X3NldHVwKSkKIAkJc2hfbXYubXZfc2V0dXAoY21kbGluZV9wKTsKKworCXBhZ2luZ19pbml0KCk7CiB9CiAKLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciogX19pbml0IGdldF9tdl9ieW5hbWUoY29uc3QgY2hhciogbmFtZSkKLXsKLQlleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7Ci0Jc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICphbGxfdmVjcyA9Ci0JCShzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OwotCi0JaW50IGksIG4gPSAoKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19lbmQKLQkJICAgIC0gKHVuc2lnbmVkIGxvbmcpJl9fbWFjaHZlY19zdGFydCkvCi0JCXNpemVvZihzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IpOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKm12ID0gJmFsbF92ZWNzW2ldOwotCQlpZiAobXYgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBnZXRfc3lzdGVtX3R5cGUoKSkgPT0gMCkgewotCQkJcmV0dXJuIG12OwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGNwdSBjcHVbTlJfQ1BVU107Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKLXsKLQlpbnQgY3B1X2lkOwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdV9pZCkKLQkJcmVnaXN0ZXJfY3B1KCZjcHVbY3B1X2lkXSwgY3B1X2lkKTsKLQotCXJldHVybiAwOwotfQotCi1zdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZVtdID0gewogCVtDUFVfU0g3MjA2XQk9ICJTSDcyMDYiLAlbQ1BVX1NINzYxOV0JPSAiU0g3NjE5IiwKLQlbQ1BVX1NINzYwNF0JPSAiU0g3NjA0IiwJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCisJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCiAJW0NQVV9TSDc3MDVdCT0gIlNINzcwNSIsCVtDUFVfU0g3NzA2XQk9ICJTSDc3MDYiLAogCVtDUFVfU0g3NzA3XQk9ICJTSDc3MDciLAlbQ1BVX1NINzcwOF0JPSAiU0g3NzA4IiwKIAlbQ1BVX1NINzcwOV0JPSAiU0g3NzA5IiwJW0NQVV9TSDc3MTBdCT0gIlNINzcxMCIsCkBAIC00MTksNyArMjg1LDcgQEAKIAlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwJW0NQVV9TSDc3ODBdCT0gIlNINzc4MCIsCiAJW0NQVV9TSDc3ODFdCT0gIlNINzc4MSIsCVtDUFVfU0g3MzQzXQk9ICJTSDczNDMiLAogCVtDUFVfU0g3Nzg1XQk9ICJTSDc3ODUiLAlbQ1BVX1NINzcyMl0JPSAiU0g3NzIyIiwKLQlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCisJW0NQVV9TSFgzXQk9ICJTSC1YMyIsCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKIH07CiAKIGNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYykKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCmluZGV4IGMxY2ZjYjkuLmM5NjhkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwpAQCAtNzgsNiArNzgsMTYgQEAKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtX2k0X2V2ZW4pOwogREVDTEFSRV9FWFBPUlQoX19tb3ZtZW1faTRfb2RkKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92bWVtU0kxMl9pNCk7CisKKyNpZiAoX19HTlVDX01JTk9SX18gPT0gMiB8fCBkZWZpbmVkKF9fR05VQ19TVE1fUkVMRUFTRV9fKSkKKy8qCisgKiBHQ0MgNC4yIGVtaXRzIHRoZXNlIGZvciBkaXZpc2lvbiwgYXMgZG8gR0NDIDQuMS54IHZlcnNpb25zIG9mIHRoZSBTVAorICogY29tcGlsZXIgd2hpY2ggaW5jbHVkZSBiYWNrcG9ydGVkIHBhdGNoZXMuCisgKi8KK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM19pNGkpOworREVDTEFSRV9FWFBPUlQoX191ZGl2X3Fybm5kXzE2KTsKK0RFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpM19pNGkpOworI2VuZGlmCiAjZWxzZSAvKiBHQ0MgMy54ICovCiBERUNMQVJFX0VYUE9SVChfX21vdnN0cl9pNF9ldmVuKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92c3RyX2k0X29kZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCmluZGV4IGUzMjNlMjkuLjcwNmQ4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yNjEsNyArMjYyLDcgQEAKIAkJZ290byBiYWRmcmFtZTsKIAkvKiBJdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBhdm9pZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhhbiB0bwogCSAgIGNhbGwgaXQgYW5kIGlnbm9yZSBlcnJvcnMuICAqLwotCWRvX3NpZ2FsdHN0YWNrKCZzdCwgTlVMTCwgcmVncy0+cmVnc1sxNV0pOworCWRvX3NpZ2FsdHN0YWNrKChjb25zdCBzdGFja190IF9fdXNlciAqKSZzdCwgTlVMTCwgKHVuc2lnbmVkIGxvbmcpZnJhbWUpOwogCiAJcmV0dXJuIHIwOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCA3ZGIxYzJkLi5mZjU2NTZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKQEAgLTMwOCw5ICszMDgsOSBAQAogCS5sb25nIHN5c191dGltZXMKICAJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NF93cmFwcGVyCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBSZXNlcnZlZCBmb3IgbWJpbmQgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAyNzUgLSBnZXRfbWVtcG9saWN5ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc2V0X21lbXBvbGljeSAqLworCS5sb25nIHN5c19tYmluZAorCS5sb25nIHN5c19nZXRfbWVtcG9saWN5CQkvKiAyNzUgKi8KKwkubG9uZyBzeXNfc2V0X21lbXBvbGljeQogCS5sb25nIHN5c19tcV9vcGVuCiAJLmxvbmcgc3lzX21xX3VubGluawogCS5sb25nIHN5c19tcV90aW1lZHNlbmQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYwppbmRleCAyZDk5N2UyLi4wOTdlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0YXJ0KHZvaWQpCiB7Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV9UU1RSKSB8IDB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpIHwgMHgzLCBUTVVfMDEyX1RTVFIpOwogCXJldHVybiAwOwogfQogCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgdG11X3RpbWVyX3N0b3Aodm9pZCkKIHsKLQljdHJsX291dGIoY3RybF9pbmIoVE1VX1RTVFIpICYgfjB4MywgVE1VX1RTVFIpOworCWN0cmxfb3V0YihjdHJsX2luYihUTVVfMDEyX1RTVFIpICYgfjB4MywgVE1VXzAxMl9UU1RSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0LDcgKzE3NCw4IEBACiAKICNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiBcCiAgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisgICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ODQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3RvcG9sb2d5LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdSwgY3B1X2RldmljZXMpOworCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJcmVnaXN0ZXJfb25lX25vZGUoaSk7CisjZW5kaWYKKworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfY3B1KCZwZXJfY3B1KGNwdV9kZXZpY2VzLCBpKSwgaSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlZ2lzdGVyX2NwdSAlZCBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGksIHJldCk7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKKwkvKgorCSAqIEluIHRoZSBVUCBjYXNlLCBtYWtlIHN1cmUgdGhlIENQVSBhc3NvY2lhdGlvbiBpcyBzdGlsbAorCSAqIHJlZ2lzdGVyZWQgdW5kZXIgZWFjaCBub2RlLiBXaXRob3V0IHRoaXMsIHN5c2ZzIGZhaWxzCisJICogdG8gbWFrZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzIG90aGVyIHRoYW4gbm9kZTAKKwkgKiBhbmQgY3B1MC4KKwkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKQorCQlpZiAoaSAhPSBudW1hX25vZGVfaWQoKSkKKwkJCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGkpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK3N1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCmluZGV4IDhmMTg5MzAuLjUwMmQ0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAJCQkgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKIAogCWJ1c3Rfc3BpbmxvY2tzKDApOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOwogCiAJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKQEAgLTU4NCw3ICs1ODUsNyBAQAogCQlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOwogCQlpbmZvLnNpX2Vycm5vID0gMDsKIAkJaW5mby5zaV9jb2RlID0gc2lfY29kZTsKLQkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgYWRkcmVzczsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgX191c2VyICopYWRkcmVzczsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CiAJfSBlbHNlIHsKIAkJaWYgKHJlZ3MtPnBjICYgMSkKQEAgLTYxNyw3ICs2MTgsNyBAQAogICovCiBpbnQgaXNfZHNwX2luc3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgc2hvcnQgaW5zdDsKKwl1bnNpZ25lZCBzaG9ydCBpbnN0ID0gMDsKIAogCS8qCiAJICogU2FmZSBndWFyZCBpZiBEU1AgbW9kZSBpcyBhbHJlYWR5IGVuYWJsZWQgb3Igd2UncmUgbGFja2luZwpAQCAtNjQ1LDcgKzY0Niw2IEBACiAJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkJCQlzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCXNpZ2luZm9fdCBpbmZvOwogCiAJc3dpdGNoIChyNCkgewpAQCAtODc0LDcgKzg3NCw3IEBACiB2b2lkIGhhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBidWdfdHJhcF90eXBlIHR0OwotCXR0ID0gcmVwb3J0X2J1ZyhyZWdzLT5wYyk7CisJdHQgPSByZXBvcnRfYnVnKHJlZ3MtPnBjLCByZWdzKTsKIAlpZiAodHQgPT0gQlVHX1RSQVBfVFlQRV9XQVJOKSB7CiAJCXJlZ3MtPnBjICs9IDI7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDRjNWI1N2UuLjA2OTY0MDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtOTcsMTggKzk3LDIwIEBACiAgIF9faW5pdHJhbWZzX2VuZCA9IC47CiAjZW5kaWYKIAorIC4gPSBBTElHTig0KTsKICAgX19tYWNodmVjX3N0YXJ0ID0gLjsKLSAgLmluaXQubWFjaHZlYyA6IHsgKiguaW5pdC5tYWNodmVjKSB9CisgIC5tYWNodmVjLmluaXQgOiB7ICooLm1hY2h2ZWMuaW5pdCkgfQogICBfX21hY2h2ZWNfZW5kID0gLjsKKwogICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgX19pbml0X2VuZCA9IC47Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcyA6IHsgKiguYnNzKSB9Ci0KLSAgLiA9IEFMSUdOKDQpOwotICBfZW5kID0gLiA7CisgIC5ic3MgOiB7CisJX19pbml0X2VuZCA9IC47CisJX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCisgIAkqKC5ic3MucGFnZV9hbGlnbmVkKQorICAJKiguYnNzKQorCS4gPSBBTElHTig0KTsKKwlfZW5kID0gLiA7CisgIH0KIAogICAvKiBXaGVuIHNvbWV0aGluZyBpbiB0aGUga2VybmVsIGlzIE5PVCBjb21waWxlZCBhcyBhIG1vZHVsZSwgdGhlCiAgICAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiAgQm90aApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jIGIvYXJjaC9zaC9saWIvZGl2NjQtZ2VuZXJpYy5jCmluZGV4IGMwMjQ3M2EuLjRiZWYzYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LWdlbmVyaWMuYworKysgYi9hcmNoL3NoL2xpYi9kaXY2NC1nZW5lcmljLmMKQEAgLTQsMTYgKzQsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLWV4dGVybiB1NjQgX194ZGl2NjRfMzIodTY0IG4sIHUzMiBkKTsKK2V4dGVybiB1aW50NjRfdCBfX3hkaXY2NF8zMih1NjQgbiwgdTMyIGQpOwogCi11NjQgX19kaXY2NF8zMih1NjQgKnhwLCB1MzIgeSkKK3VpbnQzMl90IF9fZGl2NjRfMzIodTY0ICp4cCwgdTMyIHkpCiB7Ci0JdTY0IHJlbTsKLQl1NjQgcSA9IF9feGRpdjY0XzMyKCp4cCwgeSk7CisJdWludDMyX3QgcmVtOworCXVpbnQ2NF90IHEgPSBfX3hkaXY2NF8zMigqeHAsIHkpOwogCiAJcmVtID0gKnhwIC0gcSAqIHk7CiAJKnhwID0gcTsKIAogCXJldHVybiByZW07CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbGliL2RpdjY0LlMgYi9hcmNoL3NoL2xpYi9kaXY2NC5TCmluZGV4IGVlZmMyNzUuLjVlZTczMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliL2RpdjY0LlMKKysrIGIvYXJjaC9zaC9saWIvZGl2NjQuUwpAQCAtMSwxMiArMSwxMiBAQAogLyoJCi0gKiB1bnNpZ25lZCBsb25nIGxvbmcgX194ZGl2NjRfMzIodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGxvbmcgZCk7IAorICogdW5zaWduZWQgbG9uZyBfX3hkaXY2NF8zMih1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgbG9uZyBkKTsgCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogLnRleHQKIEVOVFJZKF9feGRpdjY0XzMyKQotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyNCwgcjAKIAltb3YJcjUsIHIxCiAjZWxzZQpAQCAtMzQsNyArMzQsNyBAQAogCXJvdGNsCXIwCiAJZGl2MQlyNiwgcjEKIAkuZW5kcgotI2lmZGVmICBfX0xJVFRMRV9FTkRJQU5fXworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgogCW1vdglyMiwgcjEKIAlydHMKIAkgcm90Y2wJcjAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbWF0aC1lbXUvbWF0aC5jIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKaW5kZXggYTM4ZTFlZS4uYWMyZDdhYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKKysrIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKQEAgLTUwNyw2ICs1MDcsNyBAQAogCXVuc2lnbmVkIHNob3J0IGluc24gPSAqKHVuc2lnbmVkIHNob3J0ICopcmVncy0+cGM7CiAJdW5zaWduZWQgc2hvcnQgZmluc247CiAJdW5zaWduZWQgbG9uZyBuZXh0cGM7CisJc2lnaW5mb190IGluZm87CiAJaW50IG5pYls0XSA9IHsKIAkJKGluc24gPj4gMTIpICYgMHhmLAogCQkoaW5zbiA+PiA4KSAmIDB4ZiwKQEAgLTU1OSw5ICs1NjAsMTEgQEAKIAkJCQl+KEZQU0NSX0NBVVNFX01BU0sgfCBGUFNDUl9GTEFHX01BU0spOwogCQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9VU0VERlBVKTsKIAkJfSBlbHNlIHsKLQkJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQkJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwotCQkJZm9yY2Vfc2lnKFNJR0ZQRSwgdHNrKTsKKwkJCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRJTlY7CisJCQlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLT5wYzsKKwkJCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiAJCX0KIAogCQlyZWdzLT5wYyA9IG5leHRwYzsKQEAgLTU3NiwxNCArNTc5LDE3IEBACiAJCQkgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXNpZ2luZm9fdCBpbmZvOwogCiAJaWYgKGllZWVfZnBlX2hhbmRsZXIgKCZyZWdzKSkKIAkJcmV0dXJuOwogCiAJcmVncy5wYyArPSAyOwotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKLQlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOworCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gRlBFX0ZMVElOVjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCBfX3VzZXIgKilyZWdzLnBjOworCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9LY29uZmlnIGIvYXJjaC9zaC9tbS9LY29uZmlnCmluZGV4IDI1MzM0NmQuLjI4ZDc5YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vS2NvbmZpZworKysgYi9hcmNoL3NoL21tL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi1tZW51ICJQcm9jZXNzb3Igc2VsZWN0aW9uIgotCiAjCiAjIFByb2Nlc3NvciBmYW1pbGllcwogIwpAQCAtMzgsMjcgKzM2LDMxIEBACiBjb25maWcgQ1BVX1NIWDIKIAlib29sCiAKK2NvbmZpZyBDUFVfU0hYMworCWJvb2wKKworY2hvaWNlCisJcHJvbXB0ICJQcm9jZXNzb3Igc3ViLXR5cGUgc2VsZWN0aW9uIgorCiAjCiAjIFByb2Nlc3NvciBzdWJ0eXBlcwogIwogCi1jb21tZW50ICJTSC0yIFByb2Nlc3NvciBTdXBwb3J0IgotCi1jb25maWcgQ1BVX1NVQlRZUEVfU0g3NjA0Ci0JYm9vbCAiU3VwcG9ydCBTSDc2MDQgcHJvY2Vzc29yIgotCXNlbGVjdCBDUFVfU0gyCisjIFNILTIgUHJvY2Vzc29yIFN1cHBvcnQKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzYxOQogCWJvb2wgIlN1cHBvcnQgU0g3NjE5IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMgorCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAotY29tbWVudCAiU0gtMkEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTJBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyMDYKIAlib29sICJTdXBwb3J0IFNINzIwNiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCi1jb21tZW50ICJTSC0zIFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMDAKIAlib29sICJTdXBwb3J0IFNINzMwMCBwcm9jZXNzb3IiCkBAIC0xMTMsNyArMTE1LDcgQEAKIAloZWxwCiAJICBTZWxlY3QgU0g3NzEyIGlmIHlvdSBoYXZlIGEgU0gzLURTUCBTSDc3MTIgQ1BVLgogCi1jb21tZW50ICJTSC00IFByb2Nlc3NvciBTdXBwb3J0IgorIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKIAlib29sICJTdXBwb3J0IFNINzc1MCBwcm9jZXNzb3IiCkBAIC0xMjUsNyArMTI3LDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcwOTEKIAlib29sICJTdXBwb3J0IFNINzA5MSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCWhlbHAKIAkgIFNlbGVjdCBTSDcwOTEgaWYgeW91IGhhdmUgYW4gU0gtNCBiYXNlZCBTZWdhIGRldmljZSAoc3VjaCBhcwogCSAgdGhlIERyZWFtY2FzdCwgTmFvbWksIGFuZCBOYW9taSAyKS4KQEAgLTEzMywxMyArMTM1LDExIEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUgogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUwUwogCWJvb2wgIlN1cHBvcnQgU0g3NzUwUyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKLQlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3NzUwCiAJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzUxCkBAIC0xNTMsNyArMTUzLDYgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTFSCiAJYm9vbCAiU3VwcG9ydCBTSDc3NTFSIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINAotCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTEKIAlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NjAKQEAgLTE2Niw3ICsxNjUsNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g0LTIwMiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKIAotY29tbWVudCAiU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydCIKKyMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAogCiBjb25maWcgQ1BVX1NVQlRZUEVfU1Q0MFNUQjEKIAlib29sICJTdXBwb3J0IFNUNDBTVEIxL1NUNDBSQSBwcm9jZXNzb3JzIgpAQCAtMTgxLDcgKzE4MCw3IEBACiAJaGVscAogCSAgU2VsZWN0IFNUNDBHWDEgaWYgeW91IGhhdmUgYSBTVDQwR1gxIENQVS4KIAotY29tbWVudCAiU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQiCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NzAKIAlib29sICJTdXBwb3J0IFNINzc3MCBwcm9jZXNzb3IiCkBAIC0xOTgsNyArMTk3LDEzIEBACiAJc2VsZWN0IENQVV9TSFgyCiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCiAKLWNvbW1lbnQgIlNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydCIKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSFgzCisJYm9vbCAiU3VwcG9ydCBTSC1YMyBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDRBCisJc2VsZWN0IENQVV9TSFgzCisJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKKyMgU0g0QUwtRFNQIFByb2Nlc3NvciBTdXBwb3J0CiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMTgwCiAJYm9vbCAiU3VwcG9ydCBTSDczMTgwIHByb2Nlc3NvciIKQEAgLTIxMyw4ICsyMTgsMTAgQEAKIAlzZWxlY3QgQ1BVX1NINEFMX0RTUAogCXNlbGVjdCBDUFVfU0hYMgogCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKKwlzZWxlY3QgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCisJc2VsZWN0IFNZU19TVVBQT1JUU19OVU1BCiAKLWVuZG1lbnUKK2VuZGNob2ljZQogCiBtZW51ICJNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zIgogCkBAIC0yNjYsNyArMjczLDcgQEAKIAogY29uZmlnIDMyQklUCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIENQVV9TSDRBICYmIE1NVSAmJiAoIVgyVExCIHx8IEJST0tFTikKKwlkZXBlbmRzIG9uIE1NVSAmJiAoQ1BVX1NVQlRZUEVfU0g3NzgwIHx8IENQVV9TVUJUWVBFX1NINzc4NSkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgcGh5c2ljYWwgYWRkcmVzc2luZyB3aWxsIGJlIGV4dGVuZGVkIHRvCkBAIC0yOTUsNiArMzAyLDE3IEBACiAJICBGb3Igc3lzdGVtcyB3aXRoIGFuIE1NVSB0aGF0IGNhbiBhZmZvcmQgdG8gZ2l2ZSB1cCBhIHBhZ2UsCiAJICAodGhlIGRlZmF1bHQgdmFsdWUpIHNheSBZLgogCitjb25maWcgTlVNQQorCWJvb2wgIk5vbiBVbmlmb3JtIE1lbW9yeSBBY2Nlc3MgKE5VTUEpIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBNTVUgJiYgU1lTX1NVUFBPUlRTX05VTUEgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgU29tZSBTSCBzeXN0ZW1zIGhhdmUgbWFueSB2YXJpb3VzIG1lbW9yaWVzIHNjYXR0ZXJlZCBhcm91bmQKKwkgIHRoZSBhZGRyZXNzIHNwYWNlLCBlYWNoIHdpdGggdmFyeWluZyBsYXRlbmNpZXMuIFRoaXMgZW5hYmxlcworCSAgc3VwcG9ydCBmb3IgdGhlc2UgYmxvY2tzIGJ5IGJpbmRpbmcgdGhlbSB0byBub2RlcyBhbmQgYWxsb3dpbmcKKwkgIG1lbW9yeSBwb2xpY2llcyB0byBiZSB1c2VkIGZvciBwcmlvcml0aXppbmcgYW5kIGNvbnRyb2xsaW5nCisJICBhbGxvY2F0aW9uIGJlaGF2aW91ci4KKwogY29uZmlnIE5PREVTX1NISUZUCiAJaW50CiAJZGVmYXVsdCAiMSIKQEAgLTMwMiwxNCArMzIwLDM0IEBACiAKIGNvbmZpZyBBUkNIX0ZMQVRNRU1fRU5BQkxFCiAJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gIU5VTUEKKworY29uZmlnIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCWRlZl9ib29sIHkKKwlzZWxlY3QgU1BBUlNFTUVNX1NUQVRJQworCitjb25maWcgQVJDSF9TUEFSU0VNRU1fREVGQVVMVAorCWRlZl9ib29sIHkKIAogY29uZmlnIE1BWF9BQ1RJVkVfUkVHSU9OUwogCWludAorCWRlZmF1bHQgIjIiIGlmIChDUFVfU1VCVFlQRV9TSDc3MjIgJiYgU1BBUlNFTUVNKQogCWRlZmF1bHQgIjEiCiAKIGNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTAorCWRlZl9ib29sIHkKKworY29uZmlnIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gU1BBUlNFTUVNCisKK2NvbmZpZyBBUkNIX01FTU9SWV9QUk9CRQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE1FTU9SWV9IT1RQTFVHCisKIGNob2ljZQogCXByb21wdCAiS2VybmVsIHBhZ2Ugc2l6ZSIKIAlkZWZhdWx0IFBBR0VfU0laRV80S0IKQEAgLTM5NCwxNSArNDMyLDQgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFNIX09DUkFNCi0JYm9vbCAiT3BlcmFuZCBDYWNoZSBSQU0gKE9DUkFNKSBzdXBwb3J0IgotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgdGVhciBkb3duIHRoZSBudW1iZXIgb2YKLQkgIHNldHMgaW4gdGhlIGRjYWNoZSBieSBoYWxmLCB3aGljaCBpbiB0dXJuIGV4cG9zZXMgYSBtZW1vcnkgcmFuZ2UuCi0KLQkgIFRoZSBhZGRyZXNzZXMgZm9yIHRoZSBPQyBSQU0gYmFzZSB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIHRoZQotCSAgcHJvY2Vzc29yIHZlcnNpb24uIENvbnN1bHQgdmVuZG9yIGRvY3VtZW50YXRpb24gZm9yIHNwZWNpZmljcy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9NYWtlZmlsZSBiL2FyY2gvc2gvbW0vTWFrZWZpbGUKaW5kZXggM2ZmZDdmNi4uZDY3N2Q3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL21tL01ha2VmaWxlCkBAIC04LDkgKzgsNiBAQAogb2JqLSQoQ09ORklHX0NQVV9TSDMpCSs9IGNhY2hlLXNoMy5vCiBvYmotJChDT05GSUdfQ1BVX1NINCkJKz0gY2FjaGUtc2g0Lm8KIAotb2JqLSQoQ09ORklHX0RNQV9QQUdFX09QUykJKz0gcGctZG1hLm8KLW9iai0kKENPTkZJR19IVUdFVExCX1BBR0UpCSs9IGh1Z2V0bGJwYWdlLm8KLQogbW11LXkJCQk6PSBmYXVsdC1ub21tdS5vIHRsYi1ub21tdS5vIHBnLW5vbW11Lm8KIG1tdS0kKENPTkZJR19NTVUpCTo9IGZhdWx0Lm8gY2xlYXJfcGFnZS5vIGNvcHlfcGFnZS5vIHRsYi1mbHVzaC5vCVwKIAkJCSAgIGlvcmVtYXAubwpAQCAtMjcsNSArMjQsNyBAQAogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKSArPSBwZy1zaDc3MDUubwogZW5kaWYKIAorb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkJKz0gaHVnZXRsYnBhZ2Uubwogb2JqLSQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQkrPSBjYWNoZS1zaDc3MDUubwogb2JqLSQoQ09ORklHXzMyQklUKQkJKz0gcG1iLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2ZhdWx0LmMgYi9hcmNoL3NoL21tL2ZhdWx0LmMKaW5kZXggYzg3OGZhYS4uMGIzZWFmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc2gvbW0vZmF1bHQuYwpAQCAtMzIsNyArMzIsNiBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7CiAJaW50IHNpX2NvZGU7CiAJc2lnaW5mb190IGluZm87CiAKQEAgLTE3MCwyNCArMTY5LDM4IEBACiAgKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCiAgKgogICovCi0JaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIpOwotCXByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIiwgYWRkcmVzcyk7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKLQlwYWdlID0gKHVuc2lnbmVkIGxvbmcpZ2V0X1RUQigpOwotCWlmIChwYWdlKSB7Ci0JCXBhZ2UgPSAoKHVuc2lnbmVkIGxvbmcgKikgcGFnZSlbYWRkcmVzcyA+PiBQR0RJUl9TSElGVF07Ci0JCXByaW50ayhLRVJOX0FMRVJUICIqcGRlID0gJTA4bHhcbiIsIHBhZ2UpOwotCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKLQkJCXBhZ2UgJj0gUEFHRV9NQVNLOwotCQkJYWRkcmVzcyAmPSAweDAwM2ZmMDAwOwotCQkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOwotCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwdGUgPSAlMDhseFxuIiwgcGFnZSk7CisKKwlidXN0X3NwaW5sb2NrcygxKTsKKworCWlmIChvb3BzX21heV9wcmludCgpKSB7CisJCV9fdHlwZW9mX18ocHRlX3ZhbChfX3B0ZSgwKSkpIHBhZ2U7CisKKwkJaWYgKGFkZHJlc3MgPCBQQUdFX1NJWkUpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCAiCisJCQkJCSAgInBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIHBhZ2luZyAiCisJCQkJCSAgInJlcXVlc3QiKTsKKwkJcHJpbnRrKCIgYXQgdmlydHVhbCBhZGRyZXNzICUwOGx4XG4iLCBhZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgInBjID0gJTA4bHhcbiIsIHJlZ3MtPnBjKTsKKwkJcGFnZSA9ICh1bnNpZ25lZCBsb25nKWdldF9UVEIoKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXBhZ2UgPSAoKF9fdHlwZW9mX18ocGFnZSkgKikgX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCQkgUEdESVJfU0hJRlRdOworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIipwZGUgPSAlMDhseFxuIiwgcGFnZSk7CisJCQlpZiAocGFnZSAmIF9QQUdFX1BSRVNFTlQpIHsKKwkJCQlwYWdlICY9IFBBR0VfTUFTSzsKKwkJCQlhZGRyZXNzICY9IDB4MDAzZmYwMDA7CisJCQkJcGFnZSA9ICgoX190eXBlb2ZfXyhwYWdlKSAqKQorCQkJCQkJX192YShwYWdlKSlbYWRkcmVzcyA+PgorCQkJCQkJCSAgICBQQUdFX1NISUZUXTsKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiKnB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwkJCX0KIAkJfQogCX0KKwogCWRpZSgiT29wcyIsIHJlZ3MsIHdyaXRlYWNjZXNzKTsKKwlidXN0X3NwaW5sb2NrcygwKTsKIAlkb19leGl0KFNJR0tJTEwpOwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCBlMGU2NDRmLi44MmI2OGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwpAQCAtMzYsMTQgKzM3LDExIEBACiAJc2hvd19mcmVlX2FyZWFzKCk7CiAKIAlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGk7CiAKIAkJcGdkYXRfcmVzaXplX2xvY2socGdkYXQsICZmbGFncyk7Ci0JCXBhZ2UgPSBwZ2RhdC0+bm9kZV9tZW1fbWFwOwotCQllbmQgPSBwYWdlICsgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsKLQotCQlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGdkYXRfcGFnZV9ucihwZ2RhdCwgaSk7CiAJCQl0b3RhbCsrOwogCQkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJCQlyZXNlcnZlZCsrOwpAQCAtNTUsOSArNTMsNyBAQAogCQkJCWZyZWUrKzsKIAkJCWVsc2UKIAkJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChwYWdlKSAtIDE7Ci0JCQlwYWdlKys7Ci0JCX0gd2hpbGUgKHBhZ2UgPCBlbmQpOwotCisJCX0KIAkJcGdkYXRfcmVzaXplX3VubG9jayhwZ2RhdCwgJmZsYWdzKTsKIAl9CiAKQEAgLTEzNywxNiArMTMzLDEyIEBACiB9CiAjZW5kaWYJLyogQ09ORklHX01NVSAqLwogCi0vKiBSZWZlcmVuY2VzIHRvIHNlY3Rpb24gYm91bmRhcmllcyAqLwotCi1leHRlcm4gY2hhciBfdGV4dCwgX2V0ZXh0LCBfZWRhdGEsIF9fYnNzX3N0YXJ0LCBfZW5kOwotZXh0ZXJuIGNoYXIgX19pbml0X2JlZ2luLCBfX2luaXRfZW5kOwotCiAvKgogICogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBwYWdlIHRhYmxlcwogICovCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCWludCBuaWQ7CiAKIAkvKiBXZSBkb24ndCBuZWVkIHRvIG1hcCB0aGUga2VybmVsIHRocm91Z2ggdGhlIFRMQiwgYXMKQEAgLTE1OCw0MyArMTUwLDM5IEBACiAJICogY2hlY2sgZm9yIGEgbnVsbCB2YWx1ZS4gKi8KIAlzZXRfVFRCKHN3YXBwZXJfcGdfZGlyKTsKIAorCW1lbXNldChtYXhfem9uZV9wZm5zLCAwLCBzaXplb2YobWF4X3pvbmVfcGZucykpOworCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKLQkJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAJCXVuc2lnbmVkIGxvbmcgbG93LCBzdGFydF9wZm47CiAKLQkJbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7Ci0KIAkJc3RhcnRfcGZuID0gcGdkYXQtPmJkYXRhLT5ub2RlX2Jvb3Rfc3RhcnQgPj4gUEFHRV9TSElGVDsKIAkJbG93ID0gcGdkYXQtPmJkYXRhLT5ub2RlX2xvd19wZm47CiAKLQkJbWF4X3pvbmVfcGZuc1taT05FX05PUk1BTF0gPSBsb3c7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydF9wZm4sIGxvdyk7CisJCWlmIChtYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA8IGxvdykKKwkJCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbG93OwogCiAJCXByaW50aygiTm9kZSAldTogc3RhcnRfcGZuID0gMHglbHgsIGxvdyA9IDB4JWx4XG4iLAogCQkgICAgICAgbmlkLCBzdGFydF9wZm4sIGxvdyk7Ci0KLQkJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7Ci0KLQkJcHJpbnRrKCJOb2RlICV1OiBtZW1fbWFwIHN0YXJ0cyBhdCAlcFxuIiwKLQkJICAgICAgIHBnZGF0LT5ub2RlX2lkLCBwZ2RhdC0+bm9kZV9tZW1fbWFwKTsKIAl9CisKKwlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIH0KIAogc3RhdGljIHN0cnVjdCBrY29yZV9saXN0IGtjb3JlX21lbSwga2NvcmVfdm1hbGxvYzsKIAogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKLQlpbnQgY29kZXNpemUsIHJlc2VydmVkcGFnZXMsIGRhdGFzaXplLCBpbml0c2l6ZTsKKwlpbnQgY29kZXNpemUsIGRhdGFzaXplLCBpbml0c2l6ZTsKIAlpbnQgbmlkOwogCi0JcmVzZXJ2ZWRwYWdlcyA9IDA7CisJbnVtX3BoeXNwYWdlcyA9IDA7CisJaGlnaF9tZW1vcnkgPSBOVUxMOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKIAkJdW5zaWduZWQgbG9uZyBub2RlX3BhZ2VzID0gMDsKIAkJdm9pZCAqbm9kZV9oaWdoX21lbW9yeTsKLQkJaW50IGk7CiAKIAkJbnVtX3BoeXNwYWdlcyArPSBwZ2RhdC0+bm9kZV9wcmVzZW50X3BhZ2VzOwogCkBAIC0yMDMsMTMgKzE5MSw5IEBACiAKIAkJdG90YWxyYW1fcGFnZXMgKz0gbm9kZV9wYWdlczsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbm9kZV9wYWdlczsgaSsrKQotCQkJaWYgKFBhZ2VSZXNlcnZlZChwZ2RhdC0+bm9kZV9tZW1fbWFwICsgaSkpCi0JCQkJcmVzZXJ2ZWRwYWdlcysrOwotCi0JCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKSgocGdkYXQtPm5vZGVfc3RhcnRfcGZuICsKLQkJCQkJICAgICBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzKSA8PAotCQkJCQkJUEFHRV9TSElGVCk7CisJCW5vZGVfaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9fdmEoKHBnZGF0LT5ub2RlX3N0YXJ0X3BmbiArCisJCQkJCQkgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlcykgPDwKKwkJCQkJCSBQQUdFX1NISUZUKTsKIAkJaWYgKG5vZGVfaGlnaF9tZW1vcnkgPiBoaWdoX21lbW9yeSkKIAkJCWhpZ2hfbWVtb3J5ID0gbm9kZV9oaWdoX21lbW9yeTsKIAl9CkBAIC0yMzksMTEgKzIyMywxMCBAQAogCQkgICBWTUFMTE9DX0VORCAtIFZNQUxMT0NfU1RBUlQpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlICglZGsga2VybmVsIGNvZGUsICIKLQkgICAgICAgIiVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0KVxuIiwKKwkgICAgICAgIiVkayBkYXRhLCAlZGsgaW5pdClcbiIsCiAJCSh1bnNpZ25lZCBsb25nKSBucl9mcmVlX3BhZ2VzKCkgPDwgKFBBR0VfU0hJRlQtMTApLAotCQl0b3RhbHJhbV9wYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCisJCW51bV9waHlzcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLAogCQljb2Rlc2l6ZSA+PiAxMCwKLQkJcmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCksCiAJCWRhdGFzaXplID4+IDEwLAogCQlpbml0c2l6ZSA+PiAxMCk7CiAKQEAgLTI2NCw3ICsyNDcsOSBAQAogCQlmcmVlX3BhZ2UoYWRkcik7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6ICVkayBmcmVlZFxuIiwgKCZfX2luaXRfZW5kIC0gJl9faW5pdF9iZWdpbikgPj4gMTApOworCXByaW50aygiRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogJWxkayBmcmVlZFxuIiwKKwkgICAgICAgKCh1bnNpZ25lZCBsb25nKSZfX2luaXRfZW5kIC0KKwkgICAgICAgICh1bnNpZ25lZCBsb25nKSZfX2luaXRfYmVnaW4pID4+IDEwKTsKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRApAQCAtMjc3LDYgKzI2Miw1MCBAQAogCQlmcmVlX3BhZ2UocCk7CiAJCXRvdGFscmFtX3BhZ2VzKys7CiAJfQotCXByaW50ayAoIkZyZWVpbmcgaW5pdHJkIG1lbW9yeTogJWxkayBmcmVlZFxuIiwgKGVuZCAtIHN0YXJ0KSA+PiAxMCk7CisJcHJpbnRrKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsIChlbmQgLSBzdGFydCkgPj4gMTApOwogfQogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKK3ZvaWQgb25saW5lX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCV9fZnJlZV9wYWdlKHBhZ2UpOworCXRvdGFscmFtX3BhZ2VzKys7CisJbnVtX3BoeXNwYWdlcysrOworfQorCitpbnQgYXJjaF9hZGRfbWVtb3J5KGludCBuaWQsIHU2NCBzdGFydCwgdTY0IHNpemUpCit7CisJcGdfZGF0YV90ICpwZ2RhdDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwlpbnQgcmV0OworCisJcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKKworCS8qIFdlIG9ubHkgaGF2ZSBaT05FX05PUk1BTCwgc28gdGhpcyBpcyBlYXN5Li4gKi8KKwlyZXQgPSBfX2FkZF9wYWdlcyhwZ2RhdC0+bm9kZV96b25lcyArIFpPTkVfTk9STUFMLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJpbnRrKCIlczogRmFpbGVkLCBfX2FkZF9wYWdlcygpID09ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXJjaF9hZGRfbWVtb3J5KTsKKworaW50IHJlbW92ZV9tZW1vcnkodTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbW92ZV9tZW1vcnkpOworCisjaWZkZWYgQ09ORklHX05VTUEKK2ludCBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCh1NjQgYWRkcikKK3sKKwkvKiBOb2RlIDAgZm9yIG5vdy4uICovCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZCk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9udW1hLmMgYi9hcmNoL3NoL21tL251bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWZmMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9tbS9udW1hLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIGFyY2gvc2gvbW0vbnVtYS5jIC0gTXVsdGlwbGUgbm9kZSBzdXBwb3J0IGZvciBTSCBtYWNoaW5lcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKworc3RhdGljIGJvb3RtZW1fZGF0YV90IHBsYXRfbm9kZV9iZGF0YVtNQVhfTlVNTk9ERVNdOworc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbTUFYX05VTU5PREVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobm9kZV9kYXRhKTsKKworLyoKKyAqIE9uIFNIIG1hY2hpbmVzIHRoZSBjb252ZW50aW9uYWwgYXBwcm9hY2ggaXMgdG8gc3Rhc2ggc3lzdGVtIFJBTQorICogaW4gbm9kZSAwLCBhbmQgb3RoZXIgbWVtb3J5IGJsb2NrcyBpbiB0byBub2RlIDEgYW5kIHVwLCBvcmRlcmVkIGJ5CisgKiBsYXRlbmN5LiBFYWNoIG5vZGUncyBwZ2RhdCBpcyBub2RlLWxvY2FsIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5vZGUsCisgKiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB0aGUgbm9kZSBtZW0gbWFwLgorICovCit2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnkodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWVfcGZuID0gUEZOX1VQKF9fcGEoX2VuZCkpOworCisJLyoKKwkgKiBOb2RlIDAgc2V0cyB1cCBpdHMgcGdkYXQgYXQgdGhlIGZpcnN0IGF2YWlsYWJsZSBwZm4sCisJICogYW5kIGJ1bXBzIGl0IHVwIGJlZm9yZSBzZXR0aW5nIHVwIHRoZSBib290bWVtIGFsbG9jYXRvci4KKwkgKi8KKwlOT0RFX0RBVEEoMCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCW1lbXNldChOT0RFX0RBVEEoMCksIDAsIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlmcmVlX3BmbiArPSBQRk5fVVAoc2l6ZW9mKHN0cnVjdCBwZ2xpc3RfZGF0YSkpOworCU5PREVfREFUQSgwKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhWzBdOworCisJLyogU2V0IHVwIG5vZGUgMCAqLworCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKGZyZWVfcGZuKTsKKworCS8qIEdpdmUgdGhlIHBsYXRmb3JtcyBhIGNoYW5jZSB0byBob29rIHVwIHRoZWlyIG5vZGVzICovCisJcGxhdF9tZW1fc2V0dXAoKTsKK30KKwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBmcmVlX3BmbiwgZW5kX3BmbjsKKworCS8qIERvbid0IGFsbG93IGJvZ3VzIG5vZGUgYXNzaWdubWVudCAqLworCUJVR19PTihuaWQgPiBNQVhfTlVNTk9ERVMgfHwgbmlkID09IDApOworCisJLyoKKwkgKiBUaGUgZnJlZSBwZm4gc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhbmdlLCBhbmQgaXMKKwkgKiBhZHZhbmNlZCBhcyBuZWNlc3NhcnkgZm9yIHBnZGF0IGFuZCBub2RlIG1hcCBhbGxvY2F0aW9ucy4KKwkgKi8KKwlmcmVlX3BmbiA9IHN0YXJ0X3BmbiA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJZW5kX3BmbiA9IGVuZCA+PiBQQUdFX1NISUZUOworCisJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisKKwkvKiBOb2RlLWxvY2FsIHBnZGF0ICovCisJTk9ERV9EQVRBKG5pZCkgPSBwZm5fdG9fa2FkZHIoZnJlZV9wZm4pOworCWZyZWVfcGZuICs9IFBGTl9VUChzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJbWVtc2V0KE5PREVfREFUQShuaWQpLCAwLCBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisKKwlOT0RFX0RBVEEobmlkKS0+YmRhdGEgPSAmcGxhdF9ub2RlX2JkYXRhW25pZF07CisJTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuID0gc3RhcnRfcGZuOworCU5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMgPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCisJLyogTm9kZS1sb2NhbCBib290bWFwICovCisJYm9vdG1hcF9wYWdlcyA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhlbmRfcGZuIC0gc3RhcnRfcGZuKTsKKwlib290bWFwX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKGZyZWVfcGZuKTsKKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4sIHN0YXJ0X3BmbiwKKwkJCQkgICAgZW5kX3Bmbik7CisKKwlmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhuaWQsIGVuZF9wZm4pOworCisJLyogUmVzZXJ2ZSB0aGUgcGdkYXQgYW5kIGJvb3RtYXAgc3BhY2Ugd2l0aCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgKi8KKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpKTsKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgZnJlZV9wZm4gPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgYm9vdG1hcF9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKworCS8qIEl0J3MgdXAgKi8KKwlub2RlX3NldF9vbmxpbmUobmlkKTsKKworCS8qIEtpY2sgc3BhcnNlbWVtICovCisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctZG1hLmMgYi9hcmNoL3NoL21tL3BnLWRtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzNjc5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvbW0vcGctZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogYXJjaC9zaC9tbS9wZy1kbWEuYwotICoKLSAqIEZhc3QgY2xlYXJfcGFnZSgpL2NvcHlfcGFnZSgpIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBTSCBETUFDCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLS8qIENoYW5uZWwgdG8gdXNlIGZvciBwYWdlIG9wcywgbXVzdCBiZSBkdWFsLWFkZHJlc3MgbW9kZSBjYXBhYmxlLiAqLwotc3RhdGljIGludCBkbWFfY2hhbm5lbCA9IENPTkZJR19ETUFfUEFHRV9PUFNfQ0hBTk5FTDsKLQotc3RhdGljIHZvaWQgY29weV9wYWdlX2RtYSh2b2lkICp0bywgdm9pZCAqZnJvbSkKLXsKLQkvKiAKLQkgKiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byBnZXQgdHJpZ2dlcmVkIHVudGlsIGZ1cnRoZXIgYWxvbmcgaW4gdGhlCi0JICogYm9vdCBwcm9jZXNzLCBhdCB3aGljaCBwb2ludCB0aGUgRE1BQyBpcyBhbHJlYWR5IGluaXRpYWxpemVkLgotCSAqIEZpeCB0aGlzIGluIHRoZSBzYW1lIGZhc2hpb24gYXMgY2xlYXJfcGFnZV9kbWEoKSBpbiB0aGUgZXZlbnQKLQkgKiB0aGF0IHRoaXMgY3Jhc2hlcyBkdWUgdG8gdGhlIERNQUMgbm90IGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCi0JZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWZyb20sIFBBR0VfU0laRSk7Ci0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWZyb20sICh1bnNpZ25lZCBsb25nKXRvKTsKLQlkbWFfd2FpdF9mb3JfY29tcGxldGlvbihkbWFfY2hhbm5lbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX3BhZ2VfZG1hKHZvaWQgKnRvKQotewotCS8qCi0JICogV2UgZ2V0IGludm9rZWQgcXVpdGUgZWFybHkgb24sIGlmIHRoZSBETUFDIGhhc24ndCBiZWVuIGluaXRpYWxpemVkCi0JICogeWV0LCBmYWxsIGJhY2sgb24gdGhlIHNsb3cgbWFudWFsIGltcGxlbWVudGF0aW9uLgotCSAqLwotCWlmIChkbWFfaW5mb1tkbWFfY2hhbm5lbF0uY2hhbiAhPSBkbWFfY2hhbm5lbCkgewotCQljbGVhcl9wYWdlX3Nsb3codG8pOwotCQlyZXR1cm47Ci0JfQotCi0JZG1hX3dyaXRlX3BhZ2UoZG1hX2NoYW5uZWwsICh1bnNpZ25lZCBsb25nKWVtcHR5X3plcm9fcGFnZSwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpdG8pOwotCi0JLyoKLQkgKiBGSVhNRTogU29tZXRoaW5nIGlzIGEgYml0IHJhY3kgaGVyZSwgaWYgd2UgcG9sbCB0aGUgY291bnRlciByaWdodAotCSAqIGF3YXksIHdlIHNlZW0gdG8gbG9jay4gZmx1c2hpbmcgdGhlIHBhZ2UgZnJvbSB0aGUgZGNhY2hlIGRvZXNuJ3QKLQkgKiBzZWVtIHRvIG1ha2UgYSBkaWZmZXJlbmNlIG9uZSB3YXkgb3IgdGhlIG90aGVyLCB0aG91Z2ggZWl0aGVyIGEgZnVsbAotCSAqIGljYWNoZSBvciBkY2FjaGUgZmx1c2ggZG9lcy4KLQkgKgotCSAqIFRoZSBsb2NhdGlvbiBvZiB0aGlzIGlzIGltcG9ydGFudCBhcyB3ZWxsLCBhbmQgbXVzdCBoYXBwZW4gcHJpb3IgdG8KLQkgKiB0aGUgY29tcGxldGlvbiBsb29wIGJ1dCBhZnRlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC4KLQkgKgotCSAqIE9kZGx5IGVub3VnaCwgdGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBpc3N1ZSBmb3IgY29weV9wYWdlKCkuLgotCSAqLwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0bywgUEFHRV9TSVpFKTsKLQotCWRtYV93YWl0X2Zvcl9jb21wbGV0aW9uKGRtYV9jaGFubmVsKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcGdfZG1hX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCQotCXJldCA9IHJlcXVlc3RfZG1hKGRtYV9jaGFubmVsLCAicGFnZSBvcHMiKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQljb3B5X3BhZ2UgPSBjb3B5X3BhZ2VfZG1hOwotCWNsZWFyX3BhZ2UgPSBjbGVhcl9wYWdlX2RtYTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwZ19kbWFfZXhpdCh2b2lkKQotewotCWZyZWVfZG1hKGRtYV9jaGFubmVsKTsKLX0KLQotbW9kdWxlX2luaXQocGdfZG1hX2luaXQpOwotbW9kdWxlX2V4aXQocGdfZG1hX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJPcHRpbWl6ZWQgcGFnZSBjb3B5L2NsZWFyIHJvdXRpbmVzIHVzaW5nIGEgZHVhbC1hZGRyZXNzIG1vZGUgY2FwYWJsZSBETUFDIGNoYW5uZWwiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9NYWtlZmlsZSBiL2FyY2gvc2gvdG9vbHMvTWFrZWZpbGUKaW5kZXggM2MzNzBhMS4uNTY3NTE2YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC90b29scy9NYWtlZmlsZQorKysgYi9hcmNoL3NoL3Rvb2xzL01ha2VmaWxlCkBAIC0xMiw0ICsxMiw1IEBACiAKIGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oOiAkKHNyYykvZ2VuLW1hY2gtdHlwZXMgJChzcmMpL21hY2gtdHlwZXMKIAlAZWNobyAnICBHZW5lcmF0aW5nICRAJworCSQoUSlpZiBbICEgLWQgaW5jbHVkZS9hc20tc2ggXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlL2FzbS1zaDsgZmkKIAkkKFEpJChBV0spIC1mICReID4gJEAgfHwgeyBybSAtZiAkQDsgL2Jpbi9mYWxzZTsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCmluZGV4IGZiNDBmMTguLjRiNWU5MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTE4LDcgKzE4LDYgQEAKIEhQNlhYCQkJU0hfSFA2WFgKIEhENjQ0NjEJCQlIRDY0NDYxCiBIRDY0NDY1CQkJSEQ2NDQ2NQotU0FUVVJOCQkJU0hfU0FUVVJOCiBEUkVBTUNBU1QJCVNIX0RSRUFNQ0FTVAogTVBDMTIxMQkJCVNIX01QQzEyMTEKIFNOQVBHRUFSCQlTSF9TRUNVUkVFREdFNTQxMApAQCAtMzQsMyArMzMsNCBAQAogVElUQU4JCQlTSF9USVRBTgogU0hNSU4JCQlTSF9TSE1JTgogNzcxMFZPSVBHVwkJU0hfNzcxMFZPSVBHVworTEJPWFJFMgkJCVNIX0xCT1hfUkUyCmRpZmYgLS1naXQgYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zaDY0L2tlcm5lbC9wdHJhY2UuYwppbmRleCA0ZTk1ZTE4Li5kZjA2YzY0IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTEyOSwxNyArMTI5LDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwotCX0KIAogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKQEAgLTE2NiwxMCArMTU4LDcgQEAKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gMDsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKSA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CmRpZmYgLS1naXQgYS9hcmNoL3NoNjQvbGliL2MtY2hlY2tzdW0uYyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCmluZGV4IDRiMjY3NjMuLmJkNTUwMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCisrKyBiL2FyY2gvc2g2NC9saWIvYy1jaGVja3N1bS5jCkBAIC0yMTMsMyArMjEzLDQgQEAKIAogCXJldHVybiAoX193c3VtKXJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0woY3N1bV90Y3B1ZHBfbm9mb2xkKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCA4NTY3Y2M5Li43M2RmNzExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIE5PX0RNQQorCWRlZl9ib29sICFQQ0kKKwogY29uZmlnIFNVTl9PUEVOUFJPTUZTCiAJdHJpc3RhdGUgIk9wZW5wcm9tIHRyZWUgYXBwZWFycyBpbiAvcHJvYy9vcGVucHJvbSIKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHMuYwppbmRleCBkYzlmZmVhLi4zYmMzYmZmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogCiAJcHJpbnRrKCIlcyglZCk6ICVzIFsjJWRdXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHN0ciwgKytkaWVfY291bnRlcik7CiAJc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCiAJX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsgX19TQVZFOwogCV9fU0FWRTsgX19TQVZFOyBfX1NBVkU7IF9fU0FWRTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYyBiL2FyY2gvc3BhcmMvbW0vc3JtbXUuYwppbmRleCBlNWVhYTgwLi5jYTI2MjMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3NybW11LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCkBAIC0xNjAsOSArMTYwLDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHNybW11X3B0ZV9wcmVzZW50KHB0ZV90IHB0ZSkKIHsgcmV0dXJuICgocHRlX3ZhbChwdGUpICYgU1JNTVVfRVRfTUFTSykgPT0gU1JNTVVfRVRfUFRFKTsgfQogCi1zdGF0aWMgaW5saW5lIGludCBzcm1tdV9wdGVfcmVhZChwdGVfdCBwdGUpCi17IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIFNSTU1VX05PUkVBRCk7IH0KLQogc3RhdGljIGlubGluZSB2b2lkIHNybW11X3B0ZV9jbGVhcihwdGVfdCAqcHRlcCkKIHsgc3JtbXVfc2V0X3B0ZShwdGVwLCBfX3B0ZSgwKSk7IH0KIApAQCAtMjE4MSw3ICsyMTc4LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3JtbXVfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHNybW11X3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1dBUE8wRzApOwotCUJURklYVVBTRVRfQ0FMTChwdGVfcmVhZCwgc3JtbXVfcHRlX3JlYWQsIEJURklYVVBDQUxMX05PUk0pOwogCiAJQlRGSVhVUFNFVF9DQUxMKHBtZF9iYWQsIHNybW11X3BtZF9iYWQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwbWRfcHJlc2VudCwgc3JtbXVfcG1kX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jIGIvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCmluZGV4IDQzNjAyMWMuLmJkZDgzNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3VuNGMuYworKysgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKQEAgLTE3NDgsMTEgKzE3NDgsNiBAQAogfQogc3RhdGljIHZvaWQgc3VuNGNfcHRlX2NsZWFyKHB0ZV90ICpwdGVwKQl7ICpwdGVwID0gX19wdGUoMCk7IH0KIAotc3RhdGljIGludCBzdW40Y19wdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIChwdGVfdmFsKHB0ZSkgJiBfU1VONENfUEFHRV9SRUFEKTsKLX0KLQogc3RhdGljIGludCBzdW40Y19wbWRfYmFkKHBtZF90IHBtZCkKIHsKIAlyZXR1cm4gKCgocG1kX3ZhbChwbWQpICYgflBBR0VfTUFTSykgIT0gUEdEX1RBQkxFKSB8fApAQCAtMjIxMiw3ICsyMjA3LDYgQEAKIAogCUJURklYVVBTRVRfQ0FMTChwdGVfcHJlc2VudCwgc3VuNGNfcHRlX3ByZXNlbnQsIEJURklYVVBDQUxMX05PUk0pOwogCUJURklYVVBTRVRfQ0FMTChwdGVfY2xlYXIsIHN1bjRjX3B0ZV9jbGVhciwgQlRGSVhVUENBTExfU1RHME8wKTsKLQlCVEZJWFVQU0VUX0NBTEwocHRlX3JlYWQsIHN1bjRjX3B0ZV9yZWFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAogCUJURklYVVBTRVRfQ0FMTChwbWRfYmFkLCBzdW40Y19wbWRfYmFkLCBCVEZJWFVQQ0FMTF9OT1JNKTsKIAlCVEZJWFVQU0VUX0NBTEwocG1kX3ByZXNlbnQsIHN1bjRjX3BtZF9wcmVzZW50LCBCVEZJWFVQQ0FMTF9OT1JNKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggNjU2NmQxMy4uYjg0YjZhZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTEwOCw2ICsxMDgsMTUgQEAKIAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKK2NvbmZpZyBIT1RQTFVHX0NQVQorCWJvb2wgIlN1cHBvcnQgZm9yIGhvdC1wbHVnZ2FibGUgQ1BVcyIKKwlkZXBlbmRzIG9uIFNNUAorCXNlbGVjdCBIT1RQTFVHCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24uICBDUFVzCisJICBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSMuCisJICBTYXkgTiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIENQVSBob3RwbHVnLgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogY29uZmlnIFNZU1ZJUENfQ09NUEFUCkBAIC0zMDUsNiArMzE0LDEyIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgU1VOX0xET01TCisJYm9vbCAiU3VuIExvZ2ljYWwgRG9tYWlucyBzdXBwb3J0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaXMgeW91IHdhbnQgdG8gc3VwcG9ydCB2aXJ0dWFsIGRldmljZXMgdmlhCisJICBMb2dpY2FsIERvbWFpbnMuCisKIGNvbmZpZyBQQ0kKIAlib29sICJQQ0kgc3VwcG9ydCIKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGY5NjRiZjIuLmI2Njg3NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogb2JqLSQoQ09ORklHX1BDSSkJICs9IGVidXMubyBpc2EubyBwY2lfY29tbW9uLm8gcGNpX2lvbW11Lm8gXAogCQkJICAgIHBjaV9wc3ljaG8ubyBwY2lfc2FicmUubyBwY2lfc2NoaXpvLm8gXAogCQkJICAgIHBjaV9zdW40di5vIHBjaV9zdW40dl9hc20ubyBwY2lfZmlyZS5vCi1vYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfU01QKQkgKz0gc21wLm8gdHJhbXBvbGluZS5vIGh2dHJhbXAubwogb2JqLSQoQ09ORklHX1NQQVJDMzJfQ09NUEFUKSArPSBzeXMzMi5vIHN5c19zcGFyYzMyLm8gc2lnbmFsMzIubwogb2JqLSQoQ09ORklHX0JJTkZNVF9FTEYzMikgKz0gYmluZm10X2VsZjMyLm8KIG9iai0kKENPTkZJR19CSU5GTVRfQU9VVDMyKSArPSBiaW5mbXRfYW91dDMyLm8KQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19VUzNfRlJFUSkgKz0gdXMzX2NwdWZyZXEubwogb2JqLSQoQ09ORklHX1VTMkVfRlJFUSkgKz0gdXMyZV9jcHVmcmVxLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKSArPSBrcHJvYmVzLm8KK29iai0kKENPTkZJR19TVU5fTERPTVMpICs9IGxkYy5vIHZpby5vIHZpb2hzLm8gZHMubwogb2JqLSQoQ09ORklHX0FVRElUKSArPSBhdWRpdC5vCiBvYmotJChDT05GSUdfQVVESVQpJChDT05GSUdfU1BBUkMzMl9DT01QQVQpICs9IGNvbXBhdF9hdWRpdC5vCiBvYmoteSArPSAkKG9iai15eSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAxNTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9kcy5jCkBAIC0wLDAgKzEsMTE2OCBAQAorLyogZHMuYzogRG9tYWluIFNlcnZpY2VzIGRyaXZlciBmb3IgTG9naWNhbCBEb21haW5zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL2xkYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcG93ZXIuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vaGVhZC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJkcyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1bCAxMSwgMjAwNyIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdW4gTERPTSBkb21haW4gc2VydmljZXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCitzdHJ1Y3QgZHNfbXNnX3RhZyB7CisJX191MzIJCQl0eXBlOworI2RlZmluZSBEU19JTklUX1JFUQkJMHgwMAorI2RlZmluZSBEU19JTklUX0FDSwkJMHgwMQorI2RlZmluZSBEU19JTklUX05BQ0sJCTB4MDIKKyNkZWZpbmUgRFNfUkVHX1JFUQkJMHgwMworI2RlZmluZSBEU19SRUdfQUNLCQkweDA0CisjZGVmaW5lIERTX1JFR19OQUNLCQkweDA1CisjZGVmaW5lIERTX1VOUkVHX1JFUQkJMHgwNgorI2RlZmluZSBEU19VTlJFR19BQ0sJCTB4MDcKKyNkZWZpbmUgRFNfVU5SRUdfTkFDSwkJMHgwOAorI2RlZmluZSBEU19EQVRBCQkJMHgwOQorI2RlZmluZSBEU19OQUNLCQkJMHgwYQorCisJX191MzIJCQlsZW47Cit9OworCisvKiBSZXN1bHQgY29kZXMgKi8KKyNkZWZpbmUgRFNfT0sJCQkweDAwCisjZGVmaW5lIERTX1JFR19WRVJfTkFDSwkJMHgwMQorI2RlZmluZSBEU19SRUdfRFVQCQkweDAyCisjZGVmaW5lIERTX0lOVl9IREwJCTB4MDMKKyNkZWZpbmUgRFNfVFlQRV9VTktOT1dOCQkweDA0CisKK3N0cnVjdCBkc192ZXJzaW9uIHsKKwlfX3UxNgkJCW1ham9yOworCV9fdTE2CQkJbWlub3I7Cit9OworCitzdHJ1Y3QgZHNfdmVyX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCXN0cnVjdCBkc192ZXJzaW9uCXZlcjsKK307CisKK3N0cnVjdCBkc192ZXJfYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191MTYJCQltaW5vcjsKK307CisKK3N0cnVjdCBkc192ZXJfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTE2CQkJbWFqb3I7Cit9OworCitzdHJ1Y3QgZHNfcmVnX3JlcSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTE2CQkJbWFqb3I7CisJX191MTYJCQltaW5vcjsKKwljaGFyCQkJc3ZjX2lkWzBdOworfTsKKworc3RydWN0IGRzX3JlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKKwlfX3UxNgkJCW1pbm9yOworfTsKKworc3RydWN0IGRzX3JlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7CisJX191MTYJCQltYWpvcjsKK307CisKK3N0cnVjdCBkc191bnJlZ19yZXEgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19hY2sgeworCXN0cnVjdCBkc19tc2dfdGFnCXRhZzsKKwlfX3U2NAkJCWhhbmRsZTsKK307CisKK3N0cnVjdCBkc191bnJlZ19uYWNrIHsKKwlzdHJ1Y3QgZHNfbXNnX3RhZwl0YWc7CisJX191NjQJCQloYW5kbGU7Cit9OworCitzdHJ1Y3QgZHNfZGF0YSB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworfTsKKworc3RydWN0IGRzX2RhdGFfbmFjayB7CisJc3RydWN0IGRzX21zZ190YWcJdGFnOworCV9fdTY0CQkJaGFuZGxlOworCV9fdTY0CQkJcmVzdWx0OworfTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSB7CisJX191NjQJCQloYW5kbGU7CisKKwl2b2lkCQkJKCpkYXRhKShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworCWNvbnN0IGNoYXIJCSpzZXJ2aWNlX2lkOworCisJdTgJCQlzdGF0ZTsKKyNkZWZpbmUgQ0FQX1NUQVRFX1VOS05PV04JMHgwMAorI2RlZmluZSBDQVBfU1RBVEVfUkVHX1NFTlQJMHgwMQorI2RlZmluZSBDQVBfU1RBVEVfUkVHSVNURVJFRAkweDAyCit9OworCitzdGF0aWMgdm9pZCBtZF91cGRhdGVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBkb21haW5fc2h1dGRvd25fZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJCSBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRvbWFpbl9wYW5pY19kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICAgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwKKwkJCSAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbik7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworI2VuZGlmCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pOworc3RhdGljIHZvaWQgZHNfdmFyX2RhdGEoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLAorCQkJdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworc3RydWN0IGRzX2NhcF9zdGF0ZSBkc19zdGF0ZXNbXSA9IHsKKwl7CisJCS5zZXJ2aWNlX2lkCT0gIm1kLXVwZGF0ZSIsCisJCS5kYXRhCQk9IG1kX3VwZGF0ZV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJkb21haW4tc2h1dGRvd24iLAorCQkuZGF0YQkJPSBkb21haW5fc2h1dGRvd25fZGF0YSwKKwl9LAorCXsKKwkJLnNlcnZpY2VfaWQJPSAiZG9tYWluLXBhbmljIiwKKwkJLmRhdGEJCT0gZG9tYWluX3BhbmljX2RhdGEsCisJfSwKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwl7CisJCS5zZXJ2aWNlX2lkCT0gImRyLWNwdSIsCisJCS5kYXRhCQk9IGRyX2NwdV9kYXRhLAorCX0sCisjZW5kaWYKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInByaSIsCisJCS5kYXRhCQk9IGRzX3ByaV9kYXRhLAorCX0sCisJeworCQkuc2VydmljZV9pZAk9ICJ2YXItY29uZmlnIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKKwl7CisJCS5zZXJ2aWNlX2lkCT0gInZhci1jb25maWctYmFja3VwIiwKKwkJLmRhdGEJCT0gZHNfdmFyX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZHNfbG9jayk7CisKK3N0cnVjdCBkc19pbmZvIHsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwJKmxwOworCXU4CQkJaHNfc3RhdGU7CisjZGVmaW5lIERTX0hTX1NUQVJUCQkweDAxCisjZGVmaW5lIERTX0hTX0RPTkUJCTB4MDIKKworCXZvaWQJCQkqcmN2X2J1ZjsKKwlpbnQJCQlyY3ZfYnVmX2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHNfaW5mbyAqZHNfaW5mbzsKKworc3RhdGljIHN0cnVjdCBkc19jYXBfc3RhdGUgKmZpbmRfY2FwKHU2NCBoYW5kbGUpCit7CisJdW5zaWduZWQgaW50IGluZGV4ID0gaGFuZGxlID4+IDMyOworCisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUoZHNfc3RhdGVzKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZkc19zdGF0ZXNbaW5kZXhdOworfQorCitzdGF0aWMgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZmluZF9jYXBfYnlfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc19zdGF0ZXMpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChkc19zdGF0ZXNbaV0uc2VydmljZV9pZCwgbmFtZSkpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gJmRzX3N0YXRlc1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19kc19zZW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKGxwLCBkYXRhLCBsZW4pOworCQlpZiAoIWVyciB8fCAoZXJyICE9IC1FQUdBSU4pKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRzX3NlbmQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCWVyciA9IF9fZHNfc2VuZChscCwgZGF0YSwgbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSB7CisJX191NjQJCQkJcmVxX251bTsKK307CisKK3N0cnVjdCBkc19tZF91cGRhdGVfcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKK307CisKK3N0YXRpYyB2b2lkIG1kX3VwZGF0ZV9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkgICBzdHJ1Y3QgZHNfY2FwX3N0YXRlICpkcCwKKwkJCSAgIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqZHBrdCA9IGJ1ZjsKKwlzdHJ1Y3QgZHNfbWRfdXBkYXRlX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19tZF91cGRhdGVfcmVzCXJlczsKKwl9IHBrdDsKKworCXJwID0gKHN0cnVjdCBkc19tZF91cGRhdGVfcmVxICopIChkcGt0ICsgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTWFjaGluZSBkZXNjcmlwdGlvbiB1cGRhdGUuXG4iKTsKKworCW1kZXNjX3VwZGF0ZSgpOworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKwlwa3QuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJcGt0LmRhdGEudGFnLmxlbiA9IHNpemVvZihwa3QpIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBkcC0+aGFuZGxlOworCXBrdC5yZXMucmVxX251bSA9IHJwLT5yZXFfbnVtOworCXBrdC5yZXMucmVzdWx0ID0gRFNfT0s7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0cnVjdCBkc19zaHV0ZG93bl9yZXEgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJbXNfZGVsYXk7Cit9OworCitzdHJ1Y3QgZHNfc2h1dGRvd25fcmVzIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworCV9fdTMyCQkJCXJlc3VsdDsKKwljaGFyCQkJCXJlYXNvblsxXTsKK307CisKK3N0YXRpYyB2b2lkIGRvbWFpbl9zaHV0ZG93bl9kYXRhKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJIHN0cnVjdCBkc19jYXBfc3RhdGUgKmRwLAorCQkJCSB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3NodXRkb3duX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19zaHV0ZG93bl9yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3NodXRkb3duX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJTaHV0ZG93biByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwl3YWtlX3VwX3Bvd2VyZCgpOworfQorCitzdHJ1Y3QgZHNfcGFuaWNfcmVxIHsKKwlfX3U2NAkJCQlyZXFfbnVtOworfTsKKworc3RydWN0IGRzX3BhbmljX3JlcyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisJY2hhcgkJCQlyZWFzb25bMV07Cit9OworCitzdGF0aWMgdm9pZCBkb21haW5fcGFuaWNfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQkgICAgICB2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3BhbmljX3JlcSAqcnA7CisJc3RydWN0IHsKKwkJc3RydWN0IGRzX2RhdGEJCWRhdGE7CisJCXN0cnVjdCBkc19wYW5pY19yZXMJcmVzOworCX0gcGt0OworCisJcnAgPSAoc3RydWN0IGRzX3BhbmljX3JlcSAqKSAoZHBrdCArIDEpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJQYW5pYyByZXF1ZXN0IGZyb20gIgorCSAgICAgICAiTERPTSBtYW5hZ2VyIHJlY2VpdmVkLlxuIik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS50YWcubGVuID0gc2l6ZW9mKHBrdCkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXBrdC5kYXRhLmhhbmRsZSA9IGRwLT5oYW5kbGU7CisJcGt0LnJlcy5yZXFfbnVtID0gcnAtPnJlcV9udW07CisJcGt0LnJlcy5yZXN1bHQgPSBEU19PSzsKKwlwa3QucmVzLnJlYXNvblswXSA9IDA7CisKKwlkc19zZW5kKGxwLCAmcGt0LCBzaXplb2YocGt0KSk7CisKKwlwYW5pYygiUEFOSUMgcmVxdWVzdGVkIGJ5IExET00gbWFuYWdlci4iKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RydWN0IGRyX2NwdV90YWcgeworCV9fdTY0CQkJCXJlcV9udW07CisJX191MzIJCQkJdHlwZTsKKyNkZWZpbmUgRFJfQ1BVX0NPTkZJR1VSRQkJMHg0MworI2RlZmluZSBEUl9DUFVfVU5DT05GSUdVUkUJCTB4NTUKKyNkZWZpbmUgRFJfQ1BVX0ZPUkNFX1VOQ09ORklHVVJFCTB4NDYKKyNkZWZpbmUgRFJfQ1BVX1NUQVRVUwkJCTB4NTMKKworLyogUmVzcG9uc2VzICovCisjZGVmaW5lIERSX0NQVV9PSwkJCTB4NmYKKyNkZWZpbmUgRFJfQ1BVX0VSUk9SCQkJMHg2NQorCisJX191MzIJCQkJbnVtX3JlY29yZHM7Cit9OworCitzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgeworCV9fdTMyCQkJCWNwdTsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERSX0NQVV9SRVNfT0sJCQkweDAwCisjZGVmaW5lIERSX0NQVV9SRVNfRkFJTFVSRQkJMHgwMQorI2RlZmluZSBEUl9DUFVfUkVTX0JMT0NLRUQJCTB4MDIKKyNkZWZpbmUgRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkcJMHgwMworI2RlZmluZSBEUl9DUFVfUkVTX05PVF9JTl9NRAkJMHgwNAorCisJX191MzIJCQkJc3RhdDsKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfTk9UX1BSRVNFTlQJCTB4MDAKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfVU5DT05GSUdVUkVECTB4MDEKKyNkZWZpbmUgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRAkJMHgwMgorCisJX191MzIJCQkJc3RyX29mZjsKK307CisKK3N0YXRpYyB2b2lkIF9fZHJfY3B1X3NlbmRfZXJyb3Ioc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsIHN0cnVjdCBkc19kYXRhICpkYXRhKQoreworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKGRhdGEgKyAxKTsKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBkc19pbmZvOworCXN0cnVjdCB7CisJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQlzdHJ1Y3QgZHJfY3B1X3RhZwl0YWc7CisJfSBwa3Q7CisJaW50IG1zZ19sZW47CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5kYXRhLnRhZy50eXBlID0gRFNfREFUQTsKKwlwa3QuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCXBrdC50YWcucmVxX251bSA9IHRhZy0+cmVxX251bTsKKwlwa3QudGFnLnR5cGUgPSBEUl9DUFVfRVJST1I7CisJcGt0LnRhZy5udW1fcmVjb3JkcyA9IDA7CisKKwltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQkgICBzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpKTsKKworCXBrdC5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfc2VuZF9lcnJvcihzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCwgc3RydWN0IGRzX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJX19kcl9jcHVfc2VuZF9lcnJvcihjcCwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIENQVV9TRU5USU5FTAkweGZmZmZmZmZmCisKK3N0YXRpYyB2b2lkIHB1cmdlX2R1cHModTMyICpsaXN0LCB1MzIgbnVtX2VudHMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHM7IGkrKykgeworCQl1MzIgY3B1ID0gbGlzdFtpXTsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJaWYgKGNwdSA9PSBDUFVfU0VOVElORUwpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSBpICsgMTsgaiA8IG51bV9lbnRzOyBqKyspIHsKKwkJCWlmIChsaXN0W2pdID09IGNwdSkKKwkJCQlsaXN0W2pdID0gQ1BVX1NFTlRJTkVMOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGRyX2NwdV9zaXplX3Jlc3BvbnNlKGludCBuY3B1cykKK3sKKwlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgZHNfZGF0YSkgKworCQlzaXplb2Yoc3RydWN0IGRyX2NwdV90YWcpICsKKwkJKHNpemVvZihzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkpICogbmNwdXMpKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X2luaXRfcmVzcG9uc2Uoc3RydWN0IGRzX2RhdGEgKnJlc3AsIHU2NCByZXFfbnVtLAorCQkJCSB1NjQgaGFuZGxlLCBpbnQgcmVzcF9sZW4sIGludCBuY3B1cywKKwkJCQkgY3B1bWFza190ICptYXNrLCB1MzIgZGVmYXVsdF9zdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGksIGNwdTsKKworCXRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAocmVzcCArIDEpOworCWVudCA9IChzdHJ1Y3QgZHJfY3B1X3Jlc3BfZW50cnkgKikgKHRhZyArIDEpOworCisJcmVzcC0+dGFnLnR5cGUgPSBEU19EQVRBOworCXJlc3AtPnRhZy5sZW4gPSByZXNwX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZyk7CisJcmVzcC0+aGFuZGxlID0gaGFuZGxlOworCXRhZy0+cmVxX251bSA9IHJlcV9udW07CisJdGFnLT50eXBlID0gRFJfQ1BVX09LOworCXRhZy0+bnVtX3JlY29yZHMgPSBuY3B1czsKKworCWkgPSAwOworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJZW50W2ldLmNwdSA9IGNwdTsKKwkJZW50W2ldLnJlc3VsdCA9IERSX0NQVV9SRVNfT0s7CisJCWVudFtpXS5zdGF0ID0gZGVmYXVsdF9zdGF0OworCQlpKys7CisJfQorCUJVR19PTihpICE9IG5jcHVzKTsKK30KKworc3RhdGljIHZvaWQgZHJfY3B1X21hcmsoc3RydWN0IGRzX2RhdGEgKnJlc3AsIGludCBjcHUsIGludCBuY3B1cywKKwkJCXUzMiByZXMsIHUzMiBzdGF0KQoreworCXN0cnVjdCBkcl9jcHVfcmVzcF9lbnRyeSAqZW50OworCXN0cnVjdCBkcl9jcHVfdGFnICp0YWc7CisJaW50IGk7CisKKwl0YWcgPSAoc3RydWN0IGRyX2NwdV90YWcgKikgKHJlc3AgKyAxKTsKKwllbnQgPSAoc3RydWN0IGRyX2NwdV9yZXNwX2VudHJ5ICopICh0YWcgKyAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgaSsrKSB7CisJCWlmIChlbnRbaV0uY3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCQllbnRbaV0ucmVzdWx0ID0gcmVzOworCQllbnRbaV0uc3RhdCA9IHN0YXQ7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBkcl9jcHVfY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICBjcHVtYXNrX3QgKm1hc2spCit7CisJc3RydWN0IGRzX2RhdGEgKnJlc3A7CisJaW50IHJlc3BfbGVuLCBuY3B1cywgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluY3B1cyA9IGNwdXNfd2VpZ2h0KCptYXNrKTsKKwlyZXNwX2xlbiA9IGRyX2NwdV9zaXplX3Jlc3BvbnNlKG5jcHVzKTsKKwlyZXNwID0ga3phbGxvYyhyZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRyX2NwdV9pbml0X3Jlc3BvbnNlKHJlc3AsIHJlcV9udW0sIGNwLT5oYW5kbGUsCisJCQkgICAgIHJlc3BfbGVuLCBuY3B1cywgbWFzaywKKwkJCSAgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisKKwltZGVzY19maWxsX2luX2NwdV9kYXRhKCptYXNrKTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsKKwkJaW50IGVycjsKKworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRpbmcgY3B1ICVkLi4uXG4iLCBjcHUpOworCQllcnIgPSBjcHVfdXAoY3B1KTsKKwkJaWYgKGVycikgeworCQkJX191MzIgcmVzID0gRFJfQ1BVX1JFU19GQUlMVVJFOworCQkJX191MzIgc3RhdCA9IERSX0NQVV9TVEFUX1VOQ09ORklHVVJFRDsKKworCQkJaWYgKCFjcHVfcHJlc2VudChjcHUpKSB7CisJCQkJLyogQ1BVIG5vdCBwcmVzZW50IGluIE1EICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19OT1RfSU5fTUQ7CisJCQkJc3RhdCA9IERSX0NQVV9TVEFUX05PVF9QUkVTRU5UOworCQkJfSBlbHNlIGlmIChlcnIgPT0gLUVOT0RFVikgeworCQkJCS8qIENQVSBkaWQgbm90IGNhbGwgaW4gc3VjY2Vzc2Z1bGx5ICovCisJCQkJcmVzID0gRFJfQ1BVX1JFU19DUFVfTk9UX1JFU1BPTkRJTkc7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFUgc3RhcnR1cCBmYWlsZWQgZXJyPSVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlkcl9jcHVfbWFyayhyZXNwLCBjcHUsIG5jcHVzLCByZXMsIHN0YXQpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCS8qIFJlZGlzdHJpYnV0ZSBJUlFzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBuZXcgY3B1cy4gICovCisJZml4dXBfaXJxcygpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJfY3B1X3VuY29uZmlndXJlKHN0cnVjdCBkc19jYXBfc3RhdGUgKmNwLCB1NjQgcmVxX251bSwKKwkJCSAgICAgIGNwdW1hc2tfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgZHNfZGF0YSAqcmVzcDsKKwlpbnQgcmVzcF9sZW4sIG5jcHVzLCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5jcHVzID0gY3B1c193ZWlnaHQoKm1hc2spOworCXJlc3BfbGVuID0gZHJfY3B1X3NpemVfcmVzcG9uc2UobmNwdXMpOworCXJlc3AgPSBremFsbG9jKHJlc3BfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3ApCisJCXJldHVybiAtRU5PTUVNOworCisJZHJfY3B1X2luaXRfcmVzcG9uc2UocmVzcCwgcmVxX251bSwgY3AtPmhhbmRsZSwKKwkJCSAgICAgcmVzcF9sZW4sIG5jcHVzLCBtYXNrLAorCQkJICAgICBEUl9DUFVfU1RBVF9VTkNPTkZJR1VSRUQpOworCisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCAqbWFzaykgeworCQlpbnQgZXJyOworCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDUFVbJWRdOiBTaHV0dGluZyBkb3duIGNwdSAlZC4uLlxuIiwKKwkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKKwkJZXJyID0gY3B1X2Rvd24oY3B1KTsKKwkJaWYgKGVycikKKwkJCWRyX2NwdV9tYXJrKHJlc3AsIGNwdSwgbmNwdXMsCisJCQkJICAgIERSX0NQVV9SRVNfRkFJTFVSRSwKKwkJCQkgICAgRFJfQ1BVX1NUQVRfQ09ORklHVVJFRCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlfX2RzX3NlbmQoZHNfaW5mby0+bHAsIHJlc3AsIHJlc3BfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwlrZnJlZShyZXNwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkcl9jcHVfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRhdGEgPSBidWY7CisJc3RydWN0IGRyX2NwdV90YWcgKnRhZyA9IChzdHJ1Y3QgZHJfY3B1X3RhZyAqKSAoZGF0YSArIDEpOworCXUzMiAqY3B1X2xpc3QgPSAodTMyICopICh0YWcgKyAxKTsKKwl1NjQgcmVxX251bSA9IHRhZy0+cmVxX251bTsKKwljcHVtYXNrX3QgbWFzazsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyOworCisJc3dpdGNoICh0YWctPnR5cGUpIHsKKwljYXNlIERSX0NQVV9DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfVU5DT05GSUdVUkU6CisJY2FzZSBEUl9DUFVfRk9SQ0VfVU5DT05GSUdVUkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworCQlyZXR1cm47CisJfQorCisJcHVyZ2VfZHVwcyhjcHVfbGlzdCwgdGFnLT5udW1fcmVjb3Jkcyk7CisKKwljcHVzX2NsZWFyKG1hc2spOworCWZvciAoaSA9IDA7IGkgPCB0YWctPm51bV9yZWNvcmRzOyBpKyspIHsKKwkJaWYgKGNwdV9saXN0W2ldID09IENQVV9TRU5USU5FTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVfbGlzdFtpXSA8IE5SX0NQVVMpCisJCQljcHVfc2V0KGNwdV9saXN0W2ldLCBtYXNrKTsKKwl9CisKKwlpZiAodGFnLT50eXBlID09IERSX0NQVV9DT05GSUdVUkUpCisJCWVyciA9IGRyX2NwdV9jb25maWd1cmUoY3AsIHJlcV9udW0sICZtYXNrKTsKKwllbHNlCisJCWVyciA9IGRyX2NwdV91bmNvbmZpZ3VyZShjcCwgcmVxX251bSwgJm1hc2spOworCisJaWYgKGVycikKKwkJZHJfY3B1X3NlbmRfZXJyb3IoY3AsIGRhdGEpOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdHJ1Y3QgZHNfcHJpX21zZyB7CisJX191NjQJCQkJcmVxX251bTsKKwlfX3U2NAkJCQl0eXBlOworI2RlZmluZSBEU19QUklfUkVRVUVTVAkJCTB4MDAKKyNkZWZpbmUgRFNfUFJJX0RBVEEJCQkweDAxCisjZGVmaW5lIERTX1BSSV9VUERBVEUJCQkweDAyCit9OworCitzdGF0aWMgdm9pZCBkc19wcmlfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3ByaV9tc2cgKnJwOworCisJcnAgPSAoc3RydWN0IGRzX3ByaV9tc2cgKikgKGRwa3QgKyAxKTsKKworCXByaW50ayhLRVJOX0lORk8gUEZYICJQUkkgUkVRIFslbHg6JWx4XSwgbGVuPSVkXG4iLAorCSAgICAgICBycC0+cmVxX251bSwgcnAtPnR5cGUsIGxlbik7Cit9CisKK3N0cnVjdCBkc192YXJfaGRyIHsKKwlfX3UzMgkJCQl0eXBlOworI2RlZmluZSBEU19WQVJfU0VUX1JFUQkJCTB4MDAKKyNkZWZpbmUgRFNfVkFSX0RFTEVURV9SRVEJCTB4MDEKKyNkZWZpbmUgRFNfVkFSX1NFVF9SRVNQCQkJMHgwMgorI2RlZmluZSBEU19WQVJfREVMRVRFX1JFU1AJCTB4MDMKK307CisKK3N0cnVjdCBkc192YXJfc2V0X21zZyB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwljaGFyCQkJCW5hbWVfYW5kX3ZhbHVlWzBdOworfTsKKworc3RydWN0IGRzX3Zhcl9kZWxldGVfbXNnIHsKKwlzdHJ1Y3QgZHNfdmFyX2hkcgkJaGRyOworCWNoYXIJCQkJbmFtZVswXTsKK307CisKK3N0cnVjdCBkc192YXJfcmVzcCB7CisJc3RydWN0IGRzX3Zhcl9oZHIJCWhkcjsKKwlfX3UzMgkJCQlyZXN1bHQ7CisjZGVmaW5lIERTX1ZBUl9TVUNDRVNTCQkJMHgwMAorI2RlZmluZSBEU19WQVJfTk9fU1BBQ0UJCQkweDAxCisjZGVmaW5lIERTX1ZBUl9JTlZBTElEX1ZBUgkJMHgwMgorI2RlZmluZSBEU19WQVJfSU5WQUxJRF9WQUwJCTB4MDMKKyNkZWZpbmUgRFNfVkFSX05PVF9QUkVTRU5UCQkweDA0Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKGRzX3Zhcl9tdXRleCk7CitzdGF0aWMgaW50IGRzX3Zhcl9kb29yYmVsbDsKK3N0YXRpYyBpbnQgZHNfdmFyX3Jlc3BvbnNlOworCitzdGF0aWMgdm9pZCBkc192YXJfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqZHAsCisJCQl2b2lkICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSBidWY7CisJc3RydWN0IGRzX3Zhcl9yZXNwICpycDsKKworCXJwID0gKHN0cnVjdCBkc192YXJfcmVzcCAqKSAoZHBrdCArIDEpOworCisJaWYgKHJwLT5oZHIudHlwZSAhPSBEU19WQVJfU0VUX1JFU1AgJiYKKwkgICAgcnAtPmhkci50eXBlICE9IERTX1ZBUl9ERUxFVEVfUkVTUCkKKwkJcmV0dXJuOworCisJZHNfdmFyX3Jlc3BvbnNlID0gcnAtPnJlc3VsdDsKKwl3bWIoKTsKKwlkc192YXJfZG9vcmJlbGwgPSAxOworfQorCit2b2lkIGxkb21fc2V0X3Zhcihjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBkc19pbmZvICpkcCA9IGRzX2luZm87CisJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3A7CisKKwljcCA9IGZpbmRfY2FwX2J5X3N0cmluZygidmFyLWNvbmZpZyIpOworCWlmIChjcC0+c3RhdGUgIT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCWNwID0gZmluZF9jYXBfYnlfc3RyaW5nKCJ2YXItY29uZmlnLWJhY2t1cCIpOworCisJaWYgKGNwLT5zdGF0ZSA9PSBDQVBfU1RBVEVfUkVHSVNURVJFRCkgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBkc19kYXRhCQlkYXRhOworCQkJCXN0cnVjdCBkc192YXJfc2V0X21zZwltc2c7CisJCQl9IGhlYWRlcjsKKwkJCWNoYXIJCQlhbGxbNTEyXTsKKwkJfSBwa3Q7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWNoYXIgICpiYXNlLCAqcDsKKwkJaW50IG1zZ19sZW4sIGxvb3BzOworCisJCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJCXBrdC5oZWFkZXIuZGF0YS50YWcudHlwZSA9IERTX0RBVEE7CisJCXBrdC5oZWFkZXIuZGF0YS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwa3QuaGVhZGVyLm1zZy5oZHIudHlwZSA9IERTX1ZBUl9TRVRfUkVROworCQliYXNlID0gcCA9ICZwa3QuaGVhZGVyLm1zZy5uYW1lX2FuZF92YWx1ZVswXTsKKwkJc3RyY3B5KHAsIHZhcik7CisJCXAgKz0gc3RybGVuKHZhcikgKyAxOworCQlzdHJjcHkocCwgdmFsdWUpOworCQlwICs9IHN0cmxlbih2YWx1ZSkgKyAxOworCisJCW1zZ19sZW4gPSAoc2l6ZW9mKHN0cnVjdCBkc19kYXRhKSArCisJCQkgICBzaXplb2Yoc3RydWN0IGRzX3Zhcl9zZXRfbXNnKSArCisJCQkgICAocCAtIGJhc2UpKTsKKwkJbXNnX2xlbiA9IChtc2dfbGVuICsgMykgJiB+MzsKKwkJcGt0LmhlYWRlci5kYXRhLnRhZy5sZW4gPSBtc2dfbGVuIC0gc2l6ZW9mKHN0cnVjdCBkc19tc2dfdGFnKTsKKworCQltdXRleF9sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBmbGFncyk7CisJCWRzX3Zhcl9kb29yYmVsbCA9IDA7CisJCWRzX3Zhcl9yZXNwb25zZSA9IC0xOworCisJCV9fZHNfc2VuZChkcC0+bHAsICZwa3QsIG1zZ19sZW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBmbGFncyk7CisKKwkJbG9vcHMgPSAxMDAwOworCQl3aGlsZSAoZHNfdmFyX2Rvb3JiZWxsID09IDApIHsKKwkJCWlmIChsb29wcy0tIDwgMCkKKwkJCQlicmVhazsKKwkJCWJhcnJpZXIoKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZkc192YXJfbXV0ZXgpOworCisJCWlmIChkc192YXJfZG9vcmJlbGwgPT0gMCB8fAorCQkgICAgZHNfdmFyX3Jlc3BvbnNlICE9IERTX1ZBUl9TVUNDRVNTKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmFyLWNvbmZpZyBbJXM6JXNdICIKKwkJCSAgICAgICAiZmFpbGVkLCByZXNwb25zZSglZCkuXG4iLAorCQkJICAgICAgIHZhciwgdmFsdWUsCisJCQkgICAgICAgZHNfdmFyX3Jlc3BvbnNlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2YXItY29uZmlnIG5vdCByZWdpc3RlcmVkIHNvICIKKwkJICAgICAgICJjb3VsZCBub3Qgc2V0ICglcykgdmFyaWFibGUgdG8gKCVzKS5cbiIsCisJCSAgICAgICB2YXIsIHZhbHVlKTsKKwl9Cit9CisKK3ZvaWQgbGRvbV9yZWJvb3QoY29uc3QgY2hhciAqYm9vdF9jb21tYW5kKQoreworCS8qIERvbid0IGJvdGhlciB3aXRoIGFueSBvZiB0aGlzIGlmIHRoZSBib290X2NvbW1hbmQKKwkgKiBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoYm9vdF9jb21tYW5kICYmIHN0cmxlbihib290X2NvbW1hbmQpKSB7CisJCWNoYXIgZnVsbF9ib290X3N0clsyNTZdOworCisJCXN0cmNweShmdWxsX2Jvb3Rfc3RyLCAiYm9vdCAiKTsKKwkJc3RyY3B5KGZ1bGxfYm9vdF9zdHIgKyBzdHJsZW4oImJvb3QgIiksIGJvb3RfY29tbWFuZCk7CisKKwkJbGRvbV9zZXRfdmFyKCJyZWJvb3QtY29tbWFuZCIsIGZ1bGxfYm9vdF9zdHIpOworCX0KKwlzdW40dl9tYWNoX3NpcigpOworfQorCit2b2lkIGxkb21fcG93ZXJfb2ZmKHZvaWQpCit7CisJc3VuNHZfbWFjaF9leGl0KDApOworfQorCitzdGF0aWMgdm9pZCBkc19jb25uX3Jlc2V0KHN0cnVjdCBkc19pbmZvICpkcCkKK3sKKwlwcmludGsoS0VSTl9FUlIgUEZYICJkc19jb25uX3Jlc2V0KCkgZnJvbSAlcFxuIiwKKwkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9zZXJ2aWNlcyhzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzX3N0YXRlcyk7IGkrKykgeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGRzX3JlZ19yZXEgcmVxOworCQkJdTggaWRfYnVmWzI1Nl07CisJCX0gcGJ1ZjsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSAmZHNfc3RhdGVzW2ldOworCQlpbnQgZXJyLCBtc2dfbGVuOworCQl1NjQgbmV3X2NvdW50OworCisJCWlmIChjcC0+c3RhdGUgPT0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQpCisJCQljb250aW51ZTsKKworCQluZXdfY291bnQgPSBzY2hlZF9jbG9jaygpICYgMHhmZmZmZmZmZjsKKwkJY3AtPmhhbmRsZSA9ICgodTY0KSBpIDw8IDMyKSB8IG5ld19jb3VudDsKKworCQltc2dfbGVuID0gKHNpemVvZihzdHJ1Y3QgZHNfcmVnX3JlcSkgKworCQkJICAgc3RybGVuKGNwLT5zZXJ2aWNlX2lkKSk7CisKKwkJbWVtc2V0KCZwYnVmLCAwLCBzaXplb2YocGJ1ZikpOworCQlwYnVmLnJlcS50YWcudHlwZSA9IERTX1JFR19SRVE7CisJCXBidWYucmVxLnRhZy5sZW4gPSAobXNnX2xlbiAtIHNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpOworCQlwYnVmLnJlcS5oYW5kbGUgPSBjcC0+aGFuZGxlOworCQlwYnVmLnJlcS5tYWpvciA9IDE7CisJCXBidWYucmVxLm1pbm9yID0gMDsKKwkJc3RyY3B5KHBidWYucmVxLnN2Y19pZCwgY3AtPnNlcnZpY2VfaWQpOworCisJCWVyciA9IF9fZHNfc2VuZChscCwgJnBidWYsIG1zZ19sZW4pOworCQlpZiAoZXJyID4gMCkKKwkJCWNwLT5zdGF0ZSA9IENBUF9TVEFURV9SRUdfU0VOVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfaGFuZHNoYWtlKHN0cnVjdCBkc19pbmZvICpkcCwgc3RydWN0IGRzX21zZ190YWcgKnBrdCkKK3sKKworCWlmIChkcC0+aHNfc3RhdGUgPT0gRFNfSFNfU1RBUlQpIHsKKwkJaWYgKHBrdC0+dHlwZSAhPSBEU19JTklUX0FDSykKKwkJCWdvdG8gY29ubl9yZXNldDsKKworCQlkcC0+aHNfc3RhdGUgPSBEU19IU19ET05FOworCisJCXJldHVybiByZWdpc3Rlcl9zZXJ2aWNlcyhkcCk7CisJfQorCisJaWYgKGRwLT5oc19zdGF0ZSAhPSBEU19IU19ET05FKQorCQlnb3RvIGNvbm5fcmVzZXQ7CisKKwlpZiAocGt0LT50eXBlID09IERTX1JFR19BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19hY2sgKmFwID0gKHN0cnVjdCBkc19yZWdfYWNrICopIHBrdDsKKwkJc3RydWN0IGRzX2NhcF9zdGF0ZSAqY3AgPSBmaW5kX2NhcChhcC0+aGFuZGxlKTsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSRUcgQUNLIGZvciB1bmtub3duIGhhbmRsZSAlbHhcbiIsCisJCQkgICAgICAgYXAtPmhhbmRsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUmVnaXN0ZXJlZCAlcyBzZXJ2aWNlLlxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1JFR0lTVEVSRUQ7CisJfSBlbHNlIGlmIChwa3QtPnR5cGUgPT0gRFNfUkVHX05BQ0spIHsKKwkJc3RydWN0IGRzX3JlZ19uYWNrICpucCA9IChzdHJ1Y3QgZHNfcmVnX25hY2sgKikgcGt0OworCQlzdHJ1Y3QgZHNfY2FwX3N0YXRlICpjcCA9IGZpbmRfY2FwKG5wLT5oYW5kbGUpOworCisJCWlmICghY3ApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJFRyBOQUNLIGZvciAiCisJCQkgICAgICAgInVua25vd24gaGFuZGxlICVseFxuIiwKKwkJCSAgICAgICBucC0+aGFuZGxlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgJXMgc2VydmljZVxuIiwKKwkJICAgICAgIGNwLT5zZXJ2aWNlX2lkKTsKKwkJY3AtPnN0YXRlID0gQ0FQX1NUQVRFX1VOS05PV047CisJfQorCisJcmV0dXJuIDA7CisKK2Nvbm5fcmVzZXQ6CisJZHNfY29ubl9yZXNldChkcCk7CisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgdm9pZCBfX3NlbmRfZHNfbmFjayhzdHJ1Y3QgZHNfaW5mbyAqZHAsIHU2NCBoYW5kbGUpCit7CisJc3RydWN0IGRzX2RhdGFfbmFjayBuYWNrID0geworCQkudGFnID0geworCQkJLnR5cGUgPSBEU19OQUNLLAorCQkJLmxlbiA9IChzaXplb2Yoc3RydWN0IGRzX2RhdGFfbmFjaykgLQorCQkJCXNpemVvZihzdHJ1Y3QgZHNfbXNnX3RhZykpLAorCQl9LAorCQkuaGFuZGxlID0gaGFuZGxlLAorCQkucmVzdWx0ID0gRFNfSU5WX0hETCwKKwl9OworCisJX19kc19zZW5kKGRwLT5scCwgJm5hY2ssIHNpemVvZihuYWNrKSk7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoZHNfd29ya19saXN0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChkc193YWl0KTsKKworc3RydWN0IGRzX3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCWludAkJCQlyZXFfbGVuOworCWludAkJCQlfX3BhZDsKKwl1NjQJCQkJcmVxWzBdOworfTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc19kc193b3JrKHZvaWQpCit7CisJc3RydWN0IGRzX3F1ZXVlX2VudHJ5ICpxcCwgKnRtcDsKKwlzdGF0aWMgc3RydWN0IGRzX2luZm8gKmRwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKHRvZG8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X3NwbGljZSgmZHNfd29ya19saXN0LCAmdG9kbyk7CisJSU5JVF9MSVNUX0hFQUQoJmRzX3dvcmtfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCisJZHAgPSBkc19pbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFwLCB0bXAsICZ0b2RvLCBsaXN0KSB7CisJCXN0cnVjdCBkc19kYXRhICpkcGt0ID0gKHN0cnVjdCBkc19kYXRhICopIHFwLT5yZXE7CisJCXN0cnVjdCBkc19jYXBfc3RhdGUgKmNwID0gZmluZF9jYXAoZHBrdC0+aGFuZGxlKTsKKwkJaW50IHJlcV9sZW4gPSBxcC0+cmVxX2xlbjsKKworCQlpZiAoIWNwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJEYXRhIGZvciB1bmtub3duIGhhbmRsZSAlbHVcbiIsCisJCQkgICAgICAgZHBrdC0+aGFuZGxlKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJCV9fc2VuZF9kc19uYWNrKGRwLCBkcGt0LT5oYW5kbGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJY3AtPmRhdGEoZHAtPmxwLCBjcCwgZHBrdCwgcmVxX2xlbik7CisJCX0KKworCQlsaXN0X2RlbCgmcXAtPmxpc3QpOworCQlrZnJlZShxcCk7CisJfQorfQorCitzdGF0aWMgaW50IGRzX3RocmVhZCh2b2lkICpfX3VudXNlZCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXdoaWxlICgxKSB7CisJCXByZXBhcmVfdG9fd2FpdCgmZHNfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChsaXN0X2VtcHR5KCZkc193b3JrX2xpc3QpKQorCQkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmRzX3dhaXQsICZ3YWl0KTsKKworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CisKKwkJcHJvY2Vzc19kc193b3JrKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfZGF0YShzdHJ1Y3QgZHNfaW5mbyAqZHAsIHN0cnVjdCBkc19tc2dfdGFnICpwa3QsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RhdGEgKmRwa3QgPSAoc3RydWN0IGRzX2RhdGEgKikgcGt0OworCXN0cnVjdCBkc19xdWV1ZV9lbnRyeSAqcXA7CisKKwlxcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc19xdWV1ZV9lbnRyeSkgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghcXApIHsKKwkJX19zZW5kX2RzX25hY2soZHAsIGRwa3QtPmhhbmRsZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZxcC0+cmVxLCBwa3QsIGxlbik7CisJCWxpc3RfYWRkX3RhaWwoJnFwLT5saXN0LCAmZHNfd29ya19saXN0KTsKKwkJd2FrZV91cCgmZHNfd2FpdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc191cChzdHJ1Y3QgZHNfaW5mbyAqZHApCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwlzdHJ1Y3QgZHNfdmVyX3JlcSByZXE7CisJaW50IGVycjsKKworCXJlcS50YWcudHlwZSA9IERTX0lOSVRfUkVROworCXJlcS50YWcubGVuID0gc2l6ZW9mKHJlcSkgLSBzaXplb2Yoc3RydWN0IGRzX21zZ190YWcpOworCXJlcS52ZXIubWFqb3IgPSAxOworCXJlcS52ZXIubWlub3IgPSAwOworCisJZXJyID0gX19kc19zZW5kKGxwLCAmcmVxLCBzaXplb2YocmVxKSk7CisJaWYgKGVyciA+IDApCisJCWRwLT5oc19zdGF0ZSA9IERTX0hTX1NUQVJUOworfQorCitzdGF0aWMgdm9pZCBkc19ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3QgZHNfaW5mbyAqZHAgPSBhcmc7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRwLT5scDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHNfbG9jaywgZmxhZ3MpOworCisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQlkc191cChkcCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChldmVudCAhPSBMRENfRVZFTlRfREFUQV9SRUFEWSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gMDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZHNfbXNnX3RhZyAqdGFnOworCisJCWVyciA9IGxkY19yZWFkKGxwLCBkcC0+cmN2X2J1Ziwgc2l6ZW9mKCp0YWcpKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKworCQl0YWcgPSBkcC0+cmN2X2J1ZjsKKwkJZXJyID0gbGRjX3JlYWQobHAsIHRhZyArIDEsIHRhZy0+bGVuKTsKKworCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCQkJZHNfY29ubl9yZXNldChkcCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyIDwgdGFnLT5sZW4pCisJCQlicmVhazsKKworCQlpZiAodGFnLT50eXBlIDwgRFNfREFUQSkKKwkJCWVyciA9IGRzX2hhbmRzaGFrZShkcCwgZHAtPnJjdl9idWYpOworCQllbHNlCisJCQllcnIgPSBkc19kYXRhKGRwLCBkcC0+cmN2X2J1ZiwKKwkJCQkgICAgICBzaXplb2YoKnRhZykgKyBlcnIpOworCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkc19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgaW50IGRzX3ZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGRzX2NmZyA9IHsKKwkJLmV2ZW50CQk9IGRzX2V2ZW50LAorCQkubXR1CQk9IDQwOTYsCisJCS5tb2RlCQk9IExEQ19NT0RFX1NUUkVBTSwKKwl9OworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGRzX2luZm8gKmRwOworCWludCBlcnI7CisKKwlpZiAoZHNfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWRwKQorCQlnb3RvIG91dF9lcnI7CisKKwlkcC0+cmN2X2J1ZiA9IGt6YWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcC0+cmN2X2J1ZikKKwkJZ290byBvdXRfZnJlZV9kcDsKKworCWRwLT5yY3ZfYnVmX2xlbiA9IDQwOTY7CisKKwlkc19jZmcudHhfaXJxID0gdmRldi0+dHhfaXJxOworCWRzX2NmZy5yeF9pcnEgPSB2ZGV2LT5yeF9pcnE7CisKKwlscCA9IGxkY19hbGxvYyh2ZGV2LT5jaGFubmVsX2lkLCAmZHNfY2ZnLCBkcCk7CisJaWYgKElTX0VSUihscCkpIHsKKwkJZXJyID0gUFRSX0VSUihscCk7CisJCWdvdG8gb3V0X2ZyZWVfcmN2X2J1ZjsKKwl9CisJZHAtPmxwID0gbHA7CisKKwllcnIgPSBsZGNfYmluZChscCwgIkRTIik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlkc19pbmZvID0gZHA7CisKKwlzdGFydF9wb3dlcmQoKTsKKworCXJldHVybiBlcnI7CisKK291dF9mcmVlX2xkYzoKKwlsZGNfZnJlZShkcC0+bHApOworCitvdXRfZnJlZV9yY3ZfYnVmOgorCWtmcmVlKGRwLT5yY3ZfYnVmKTsKKworb3V0X2ZyZWVfZHA6CisJa2ZyZWUoZHApOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgZHNfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gImRvbWFpbi1zZXJ2aWNlcy1wb3J0IiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIGRzX2RyaXZlciA9IHsKKwkuaWRfdGFibGUJPSBkc19tYXRjaCwKKwkucHJvYmUJCT0gZHNfcHJvYmUsCisJLnJlbW92ZQkJPSBkc19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgZHNfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNfc3RhdGVzKTsgaSsrKQorCQlkc19zdGF0ZXNbaV0uaGFuZGxlID0gKCh1NjQpaSA8PCAzMik7CisKKwlrdGhyZWFkX3J1bihkc190aHJlYWQsIE5VTEwsICJrbGRvbWQiKTsKKworCXJldHVybiB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZkc19kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGwoZHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaHZ0cmFtcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTA5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2h2dHJhbXAuUwpAQCAtMCwwICsxLDEzOSBAQAorLyogaHZ0cmFtcC5TOiBIeXBlcnZpc29yIHN0YXJ0LWNwdSB0cmFtcG9saW5lIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vc2NyYXRjaHBhZC5oPgorI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9odnRyYW1wLmg+CisjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYXNpLmg+CisKKwkudGV4dAorCS5hbGlnbgkJOAorCS5nbG9ibAkJaHZfY3B1X3N0YXJ0dXAsIGh2X2NwdV9zdGFydHVwX2VuZAorCisJLyogVGhpcyBjb2RlIGV4ZWN1dGVzIGRpcmVjdGx5IG91dCBvZiB0aGUgaHlwZXJ2aXNvcgorCSAqIHdpdGggcGh5c2ljYWwgYWRkcmVzc2luZyAodmE9PXBhKS4gICVvMCBjb250YWlucworCSAqIG91ciBjbGllbnQgYXJndW1lbnQgd2hpY2ggZm9yIExpbnV4IHBvaW50cyB0bworCSAqIGEgZGVzY3JpcHRvciBkYXRhIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZQorCSAqIE1NVSBlbnRyaWVzIHdlIG5lZWQgdG8gbG9hZCB1cC4KKwkgKgorCSAqIEFmdGVyIHdlIHNldCB0aGluZ3MgdXAgd2UgZW5hYmxlIHRoZSBNTVUgYW5kIGNhbGwKKwkgKiBpbnRvIHRoZSBrZXJuZWwuCisJICoKKwkgKiBGaXJzdCBzZXR1cCBiYXNpYyBwcml2aWxlZ2VkIGNwdSBzdGF0ZS4KKwkgKi8KK2h2X2NwdV9zdGFydHVwOgorCXdycHIJCSVnMCwgMCwgJWdsCisJd3JwcgkJJWcwLCAxNSwgJXBpbAorCXdycHIJCSVnMCwgMCwgJWNhbnJlc3RvcmUKKwl3cnByCQklZzAsIDAsICVvdGhlcndpbgorCXdycHIJCSVnMCwgNiwgJWNhbnNhdmUKKwl3cnByCQklZzAsIDYsICVjbGVhbndpbgorCXdycHIJCSVnMCwgMCwgJWN3cAorCXdycHIJCSVnMCwgMCwgJXdzdGF0ZQorCXdycHIJCSVnMCwgMCwgJXRsCisKKwlzZXRoaQkJJWhpKHNwYXJjNjRfdHRhYmxlX3RsMCksICVnMQorCXdycHIJCSVnMSwgJXRiYQorCisJbW92CQklbzAsICVsMAorCisJbGR1dwkJWyVsMCArIEhWVFJBTVBfREVTQ1JfQ1BVXSwgJWcxCisJbW92CQlTQ1JBVENIUEFEX0NQVUlELCAlZzIKKwlzdHhhCQklZzEsIFslZzJdIEFTSV9TQ1JBVENIUEFECisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fVkFdLCAlZzIKKwlzdHhhCQklZzIsIFslZzBdIEFTSV9TQ1JBVENIUEFECisKKwltb3YJCTAsICVsMQorCWxkdXcJCVslbDAgKyBIVlRSQU1QX0RFU0NSX05VTV9NQVBQSU5HU10sICVsMgorCWFkZAkJJWwwLCBIVlRSQU1QX0RFU0NSX01BUFMsICVsMworCisxOglsZHgJCVslbDMgKyBIVlRSQU1QX01BUFBJTkdfVkFERFJdLCAlbzAKKwljbHIJCSVvMQorCWxkeAkJWyVsMyArIEhWVFJBTVBfTUFQUElOR19UVEVdLCAlbzIKKwltb3YJCUhWX01NVV9JTU1VIHwgSFZfTU1VX0RNTVUsICVvMworCW1vdgkJSFZfRkFTVF9NTVVfTUFQX1BFUk1fQUREUiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwlhZGQJCSVsMSwgMSwgJWwxCisJY21wCQklbDEsICVsMgorCWJsdCxhLHB0CSV4Y2MsIDFiCisJIGFkZAkJJWwzLCBIVlRSQU1QX01BUFBJTkdfU0laRSwgJWwzCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX0ZBVUxUX0lORk9fUEFdLCAlbzAKKwltb3YJCUhWX0ZBU1RfTU1VX0ZBVUxUX0FSRUFfQ09ORiwgJW81CisJdGEJCUhWX0ZBU1RfVFJBUAorCisJYnJueixwbgkJJW8wLCA4MGYKKwkgbm9wCisKKwl3cnByCQklZzAsIChQU1RBVEVfUFJJViB8IFBTVEFURV9QRUYpLCAlcHN0YXRlCisKKwlsZHgJCVslbDAgKyBIVlRSQU1QX0RFU0NSX1RIUkVBRF9SRUddLCAlbDYKKworCW1vdgkJMSwgJW8wCisJc2V0CQkxZiwgJW8xCisJbW92CQlIVl9GQVNUX01NVV9FTkFCTEUsICVvNQorCXRhCQlIVl9GQVNUX1RSQVAKKworCWJhLHB0CQkleGNjLCA4MGYKKwkgbm9wCisKKzE6CisJd3IJCSVnMCwgMCwgJWZwcnMKKwl3cgkJJWcwLCBBU0lfUCwgJWFzaQorCisJbW92CQlQUklNQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJU0VDT05EQVJZX0NPTlRFWFQsICVnNworCXN0eGEJCSVnMCwgWyVnN10gQVNJX01NVQorCW1lbWJhcgkJI1N5bmMKKworCW1vdgkJJWw2LCAlZzYKKwlsZHgJCVslZzYgKyBUSV9UQVNLXSwgJWc0CisKKwltb3YJCTEsICVnNQorCXNsbHgJCSVnNSwgVEhSRUFEX1NISUZULCAlZzUKKwlzdWIJCSVnNSwgKFNUQUNLRlJBTUVfU1ogKyBTVEFDS19CSUFTKSwgJWc1CisJYWRkCQklZzYsICVnNSwgJXNwCisJbW92CQkwLCAlZnAKKworCWNhbGwJCWluaXRfaXJxd29ya19jdXJjcHUKKwkgbm9wCisJY2FsbAkJaGFyZF9zbXBfcHJvY2Vzc29yX2lkCisJIG5vcAorCisJbW92CQklbzAsICVvMQorCW1vdgkJMCwgJW8wCisJbW92CQkwLCAlbzIKKwljYWxsCQlzdW40dl9pbml0X21vbmRvX3F1ZXVlcworCSBtb3YJCTEsICVvMworCisJY2FsbAkJaW5pdF9jdXJfY3B1X3RyYXAKKwkgbW92CQklZzYsICVvMAorCisJd3JwcgkJJWcwLCAoUFNUQVRFX1BSSVYgfCBQU1RBVEVfUEVGIHwgUFNUQVRFX0lFKSwgJXBzdGF0ZQorCisJY2FsbAkJc21wX2NhbGxpbgorCSBub3AKKwljYWxsCQljcHVfaWRsZQorCSBtb3YJCTAsICVvMAorCWNhbGwJCWNwdV9wYW5pYworCSBub3AKKworODA6CWJhLHB0CQkleGNjLCA4MGIKKwkgbm9wCisKKwkuYWxpZ24JCTgKK2h2X2NwdV9zdGFydHVwX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCmluZGV4IDZiNjE2NWQzLi44Y2IzMzU4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTI5Myw2ICsyOTMsMTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR1X3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlydF9pcnEsIGNwdW1hc2tfdCBtYXNrKQoreworCXN1bjR1X2lycV9lbmFibGUodmlydF9pcnEpOworfQorCiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlycV9oYW5kbGVyX2RhdGEgKmRhdGEgPSBnZXRfaXJxX2NoaXBfZGF0YSh2aXJ0X2lycSk7CkBAIC0zMDksNiArMzE0LDEwIEBACiBzdGF0aWMgdm9pZCBzdW40dV9pcnFfZW5kKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaXJxX2hhbmRsZXJfZGF0YSAqZGF0YSA9IGdldF9pcnFfY2hpcF9kYXRhKHZpcnRfaXJxKTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIHZpcnRfaXJxOworCisJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKKwkJcmV0dXJuOwogCiAJaWYgKGxpa2VseShkYXRhKSkKIAkJdXBhX3dyaXRlcShJQ0xSX0lETEUsIGRhdGEtPmljbHIpOwpAQCAtMzQwLDYgKzM0OSwyNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQ7CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZXJyID0gc3VuNHZfaW50cl9zZXR0YXJnZXQoaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl9pbnRyX3NldHRhcmdldCgleCwlbHUpOiBlcnIoJWQpXG4iLAorCQkJICAgICAgIGlubywgY3B1aWQsIGVycik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzdW40dl9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CkBAIC0zNzMsNiArNDAwLDEwIEBACiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CiAJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgdmlydF9pcnE7CisKKwlpZiAodW5saWtlbHkoZGVzYy0+c3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQorCQlyZXR1cm47CiAKIAlpZiAobGlrZWx5KGJ1Y2tldCkpIHsKIAkJaW50IGVycjsKQEAgLTQxOCw2ICs0NDksMjggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN1bjR2X3ZpcnRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwgY3B1bWFza190IG1hc2spCit7CisJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IHZpcnRfaXJxX3RvX2J1Y2tldCh2aXJ0X2lycSk7CisJdW5zaWduZWQgaW50IGlubyA9IGJ1Y2tldCAtICZpdmVjdG9yX3RhYmxlWzBdOworCisJaWYgKGxpa2VseShidWNrZXQpKSB7CisJCXVuc2lnbmVkIGxvbmcgY3B1aWQsIGRldl9oYW5kbGUsIGRldl9pbm87CisJCWludCBlcnI7CisKKwkJY3B1aWQgPSBpcnFfY2hvb3NlX2NwdSh2aXJ0X2lycSk7CisKKwkJZGV2X2hhbmRsZSA9IGlubyAmIElNQVBfSUdOOworCQlkZXZfaW5vID0gaW5vICYgSU1BUF9JTk87CisKKwkJZXJyID0gc3VuNHZfdmludHJfc2V0X3RhcmdldChkZXZfaGFuZGxlLCBkZXZfaW5vLCBjcHVpZCk7CisJCWlmIChlcnIgIT0gSFZfRU9LKQorCQkJcHJpbnRrKCJzdW40dl92aW50cl9zZXRfdGFyZ2V0KCVseCwlbHgsJWx1KTogIgorCQkJICAgICAgICJlcnIoJWQpXG4iLAorCQkJICAgICAgIGRldl9oYW5kbGUsIGRldl9pbm8sIGNwdWlkLCBlcnIpOworCX0KK30KKwogc3RhdGljIHZvaWQgc3VuNHZfdmlycV9kaXNhYmxlKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKQEAgLTQ0Myw2ICs0OTYsMTAgQEAKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gdmlydF9pcnFfdG9fYnVja2V0KHZpcnRfaXJxKTsKIAl1bnNpZ25lZCBpbnQgaW5vID0gYnVja2V0IC0gJml2ZWN0b3JfdGFibGVbMF07CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyB2aXJ0X2lycTsKKworCWlmICh1bmxpa2VseShkZXNjLT5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCXJldHVybjsKIAogCWlmIChsaWtlbHkoYnVja2V0KSkgewogCQl1bnNpZ25lZCBsb25nIGRldl9oYW5kbGUsIGRldl9pbm87CkBAIC00NzcsNiArNTM0LDcgQEAKIAkuZW5hYmxlCQk9IHN1bjR1X2lycV9lbmFibGUsCiAJLmRpc2FibGUJPSBzdW40dV9pcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR1X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR1X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHVfaXJxX2FjayA9IHsKQEAgLTQ4NSw2ICs1NDMsNyBAQAogCS5kaXNhYmxlCT0gc3VuNHVfaXJxX2Rpc2FibGUsCiAJLmFjawkJPSBydW5fcHJlX2hhbmRsZXIsCiAJLmVuZAkJPSBzdW40dV9pcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dV9zZXRfYWZmaW5pdHksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bjR2X2lycSA9IHsKQEAgLTQ5Miw2ICs1NTEsNyBAQAogCS5lbmFibGUJCT0gc3VuNHZfaXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X2lycV9kaXNhYmxlLAogCS5lbmQJCT0gc3VuNHZfaXJxX2VuZCwKKwkuc2V0X2FmZmluaXR5CT0gc3VuNHZfc2V0X2FmZmluaXR5LAogfTsKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW40dl9pcnFfYWNrID0gewpAQCAtNTAwLDYgKzU2MCw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9pcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAKICNpZmRlZiBDT05GSUdfUENJX01TSQpAQCAtNTExLDYgKzU3Miw3IEBACiAJLmRpc2FibGUJPSBzdW40dl9tc2lfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X2lycV9lbmQsCisJLnNldF9hZmZpbml0eQk9IHN1bjR2X3NldF9hZmZpbml0eSwKIH07CiAjZW5kaWYKIApAQCAtNTE5LDYgKzU4MSw3IEBACiAJLmVuYWJsZQkJPSBzdW40dl92aXJxX2VuYWJsZSwKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3VuNHZfdmlycV9hY2sgPSB7CkBAIC01MjcsNiArNTkwLDcgQEAKIAkuZGlzYWJsZQk9IHN1bjR2X3ZpcnFfZGlzYWJsZSwKIAkuYWNrCQk9IHJ1bl9wcmVfaGFuZGxlciwKIAkuZW5kCQk9IHN1bjR2X3ZpcnFfZW5kLAorCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKIHZvaWQgaXJxX2luc3RhbGxfcHJlX2hhbmRsZXIoaW50IHZpcnRfaXJxLApAQCAtNzM5LDYgKzgwMywyNiBAQAogCXNldF9pcnFfcmVncyhvbGRfcmVncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgZml4dXBfaXJxcyh2b2lkKQoreworCXVuc2lnbmVkIGludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCQlpZiAoaXJxX2Rlc2NbaXJxXS5hY3Rpb24gJiYKKwkJICAgICEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfUEVSX0NQVSkpIHsKKwkJCWlmIChpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eSkKKwkJCQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsCisJCQkJCWlycV9kZXNjW2lycV0uYWZmaW5pdHkpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9kZXNjW2lycV0ubG9jaywgZmxhZ3MpOworCX0KK30KKyNlbmRpZgorCiBzdHJ1Y3Qgc3VuNV90aW1lciB7CiAJdTY0CWNvdW50MDsKIAl1NjQJbGltaXQwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9sZGMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMmJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvbGRjLmMKQEAgLTAsMCArMSwyMzczIEBACisvKiBsZGMuYzogTG9naWNhbCBEb21haW4gQ2hhbm5lbCBsaW5rLWxheWVyIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJsZGMiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisjZGVmaW5lIExEQ19QQUNLRVRfU0laRQkJNjQKKworLyogUGFja2V0IGhlYWRlciBsYXlvdXQgZm9yIHVucmVsaWFibGUgYW5kIHJlbGlhYmxlIG1vZGUgZnJhbWVzLgorICogV2hlbiBpbiBSQVcgbW9kZSwgcGFja2V0cyBhcmUgc2ltcGx5IHN0cmFpZ2h0IDY0LWJ5dGUgcGF5bG9hZHMKKyAqIHdpdGggbm8gaGVhZGVycy4KKyAqLworc3RydWN0IGxkY19wYWNrZXQgeworCXU4CQkJdHlwZTsKKyNkZWZpbmUgTERDX0NUUkwJCTB4MDEKKyNkZWZpbmUgTERDX0RBVEEJCTB4MDIKKyNkZWZpbmUgTERDX0VSUgkJCTB4MTAKKworCXU4CQkJc3R5cGU7CisjZGVmaW5lIExEQ19JTkZPCQkweDAxCisjZGVmaW5lIExEQ19BQ0sJCQkweDAyCisjZGVmaW5lIExEQ19OQUNLCQkweDA0CisKKwl1OAkJCWN0cmw7CisjZGVmaW5lIExEQ19WRVJTCQkweDAxIC8qIExpbmsgVmVyc2lvbgkJKi8KKyNkZWZpbmUgTERDX1JUUwkJCTB4MDIgLyogUmVxdWVzdCBUbyBTZW5kCQkqLworI2RlZmluZSBMRENfUlRSCQkJMHgwMyAvKiBSZWFkeSBUbyBSZWNlaXZlCSovCisjZGVmaW5lIExEQ19SRFgJCQkweDA0IC8qIFJlYWR5IGZvciBEYXRhIGVYY2hhbmdlCSovCisjZGVmaW5lIExEQ19DVFJMX01TSwkJMHgwZgorCisJdTgJCQllbnY7CisjZGVmaW5lIExEQ19MRU4JCQkweDNmCisjZGVmaW5lIExEQ19GUkFHX01BU0sJCTB4YzAKKyNkZWZpbmUgTERDX1NUQVJUCQkweDQwCisjZGVmaW5lIExEQ19TVE9QCQkweDgwCisKKwl1MzIJCQlzZXFpZDsKKworCXVuaW9uIHsKKwkJdTgJCXVfZGF0YVtMRENfUEFDS0VUX1NJWkUgLSA4XTsKKwkJc3RydWN0IHsKKwkJCXUzMglwYWQ7CisJCQl1MzIJYWNraWQ7CisJCQl1OAlyX2RhdGFbTERDX1BBQ0tFVF9TSVpFIC0gOCAtIDhdOworCQl9IHI7CisJfSB1OworfTsKKworc3RydWN0IGxkY192ZXJzaW9uIHsKKwl1MTYgbWFqb3I7CisJdTE2IG1pbm9yOworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0LiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyX2FycltdID0geworCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMCB9LAorfTsKKworI2RlZmluZSBMRENfREVGQVVMVF9NVFUJCQkoNCAqIExEQ19QQUNLRVRfU0laRSkKKyNkZWZpbmUgTERDX0RFRkFVTFRfTlVNX0VOVFJJRVMJCShQQUdFX1NJWkUgLyBMRENfUEFDS0VUX1NJWkUpCisKK3N0cnVjdCBsZGNfY2hhbm5lbDsKKworc3RydWN0IGxkY19tb2RlX29wcyB7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBsZGNfY2hhbm5lbCAqLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGludCk7CisJaW50ICgqcmVhZCkoc3RydWN0IGxkY19jaGFubmVsICosIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIHJhd19vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyBub25yYXdfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wczsKKworaW50IGxkb21fZG9tYWluaW5nX2VuYWJsZWQ7CisKK3N0cnVjdCBsZGNfaW9tbXUgeworCS8qIFByb3RlY3RzIGFyZW5hIGFsbG9jL2ZyZWUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCBpb21tdV9hcmVuYQkJYXJlbmE7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworfTsKKworc3RydWN0IGxkY19jaGFubmVsIHsKKwkvKiBQcm90ZWN0cyBhbGwgb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCB1cG9uIGNoYW5uZWwgc3RhdGUuICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCisJdW5zaWduZWQgbG9uZwkJCWlkOworCisJdTgJCQkJKm1zc2J1ZjsKKwl1MzIJCQkJbXNzYnVmX2xlbjsKKwl1MzIJCQkJbXNzYnVmX29mZjsKKworCXN0cnVjdCBsZGNfcGFja2V0CQkqdHhfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJdHhfaGVhZDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfdGFpbDsKKwl1bnNpZ25lZCBsb25nCQkJdHhfbnVtX2VudHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCXR4X3JhOworCisJdW5zaWduZWQgbG9uZwkJCXR4X2Fja2VkOworCisJc3RydWN0IGxkY19wYWNrZXQJCSpyeF9iYXNlOworCXVuc2lnbmVkIGxvbmcJCQlyeF9oZWFkOworCXVuc2lnbmVkIGxvbmcJCQlyeF90YWlsOworCXVuc2lnbmVkIGxvbmcJCQlyeF9udW1fZW50cmllczsKKwl1bnNpZ25lZCBsb25nCQkJcnhfcmE7CisKKwl1MzIJCQkJcmN2X254dDsKKwl1MzIJCQkJc25kX254dDsKKworCXVuc2lnbmVkIGxvbmcJCQljaGFuX3N0YXRlOworCisJc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZwljZmc7CisJdm9pZAkJCQkqZXZlbnRfYXJnOworCisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcwkqbW9wczsKKworCXN0cnVjdCBsZGNfaW9tbXUJCWlvbW11OworCisJc3RydWN0IGxkY192ZXJzaW9uCQl2ZXI7CisKKwl1OAkJCQloc19zdGF0ZTsKKyNkZWZpbmUgTERDX0hTX0NMT1NFRAkJCTB4MDAKKyNkZWZpbmUgTERDX0hTX09QRU4JCQkweDAxCisjZGVmaW5lIExEQ19IU19HT1RWRVJTCQkJMHgwMgorI2RlZmluZSBMRENfSFNfU0VOVFJUUgkJCTB4MDMKKyNkZWZpbmUgTERDX0hTX0dPVFJUUgkJCTB4MDQKKyNkZWZpbmUgTERDX0hTX0NPTVBMRVRFCQkJMHgxMAorCisJdTgJCQkJZmxhZ3M7CisjZGVmaW5lIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTCQkweDAxCisjZGVmaW5lIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTCTB4MDIKKyNkZWZpbmUgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTCTB4MDQKKyNkZWZpbmUgTERDX0ZMQUdfUkVTRVQJCQkweDEwCisKKwl1OAkJCQltc3M7CisJdTgJCQkJc3RhdGU7CisKKyNkZWZpbmUgTERDX0lSUV9OQU1FX01BWAkJMzIKKwljaGFyCQkJCXJ4X2lycV9uYW1lW0xEQ19JUlFfTkFNRV9NQVhdOworCWNoYXIJCQkJdHhfaXJxX25hbWVbTERDX0lSUV9OQU1FX01BWF07CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJbWhfbGlzdDsKKworCXN0cnVjdCBobGlzdF9ub2RlCQlsaXN0OworfTsKKworI2RlZmluZSBsZGNkYmcoVFlQRSwgZiwgYS4uLikgXAorZG8gewlpZiAobHAtPmNmZy5kZWJ1ZyAmIExEQ19ERUJVR18jI1RZUEUpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIklEWyVsdV0gIiBmLCBscC0+aWQsICMjIGEpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVfdG9fc3RyKHU4IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIExEQ19TVEFURV9JTlZBTElEOgorCQlyZXR1cm4gIklOVkFMSUQiOworCWNhc2UgTERDX1NUQVRFX0lOSVQ6CisJCXJldHVybiAiSU5JVCI7CisJY2FzZSBMRENfU1RBVEVfQk9VTkQ6CisJCXJldHVybiAiQk9VTkQiOworCWNhc2UgTERDX1NUQVRFX1JFQURZOgorCQlyZXR1cm4gIlJFQURZIjsKKwljYXNlIExEQ19TVEFURV9DT05ORUNURUQ6CisJCXJldHVybiAiQ09OTkVDVEVEIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIjxVTktOT1dOPiI7CisJfQorfQorCitzdGF0aWMgdm9pZCBsZGNfc2V0X3N0YXRlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHU4IHN0YXRlKQoreworCWxkY2RiZyhTVEFURSwgIlNUQVRFICglcykgLS0+ICglcylcbiIsCisJICAgICAgIHN0YXRlX3RvX3N0cihscC0+c3RhdGUpLAorCSAgICAgICBzdGF0ZV90b19zdHIoc3RhdGUpKTsKKworCWxwLT5zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2FkdmFuY2UodW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMpCit7CisJb2ZmICs9IExEQ19QQUNLRVRfU0laRTsKKwlpZiAob2ZmID09IChudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRSkpCisJCW9mZiA9IDA7CisKKwlyZXR1cm4gb2ZmOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByeF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+cnhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0eF9hZHZhbmNlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXJldHVybiBfX2FkdmFuY2Uob2ZmLCBscC0+dHhfbnVtX2VudHJpZXMpOworfQorCitzdGF0aWMgc3RydWN0IGxkY19wYWNrZXQgKmhhbmRzaGFrZV9nZXRfdHhfcGFja2V0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgIHVuc2lnbmVkIGxvbmcgKm5ld190YWlsKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgdDsKKworCXQgPSB0eF9hZHZhbmNlKGxwLCBscC0+dHhfdGFpbCk7CisJaWYgKHQgPT0gbHAtPnR4X2hlYWQpCisJCXJldHVybiBOVUxMOworCisJKm5ld190YWlsID0gdDsKKworCXAgPSBscC0+dHhfYmFzZTsKKwlyZXR1cm4gcCArIChscC0+dHhfdGFpbCAvIExEQ19QQUNLRVRfU0laRSk7Cit9CisKKy8qIFdoZW4gd2UgYXJlIGluIHJlbGlhYmxlIG9yIHN0cmVhbSBtb2RlLCBoYXZlIHRvIHRyYWNrIHRoZSBuZXh0IHBhY2tldAorICogd2UgaGF2ZW4ndCBnb3R0ZW4gYW4gQUNLIGZvciBpbiB0aGUgVFggcXVldWUgdXNpbmcgdHhfYWNrZWQuICBXZSBoYXZlCisgKiB0byBiZSBjYXJlZnVsIG5vdCB0byBzdG9tcCBvdmVyIHRoZSBxdWV1ZSBwYXN0IHRoYXQgcG9pbnQuICBEdXJpbmcKKyAqIHRoZSBoYW5kc2hha2UsIHdlIGRvbid0IGhhdmUgVFggZGF0YSBwYWNrZXRzIHBlbmRpbmcgaW4gdGhlIHF1ZXVlCisgKiBhbmQgdGhhdCdzIHdoeSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldCgpIG5lZWQgbm90IGJlIG1pbmRmdWwgb2YKKyAqIGxwLT50eF9hY2tlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVhZF9mb3JfZGF0YShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKQorCQlyZXR1cm4gbHAtPnR4X2Fja2VkOworCXJldHVybiBscC0+dHhfaGVhZDsKK30KKworc3RhdGljIGludCB0eF9oYXNfc3BhY2VfZm9yKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbGltaXQsIHRhaWwsIG5ld190YWlsLCBkaWZmOworCXVuc2lnbmVkIGludCBtc3M7CisKKwlsaW1pdCA9IGhlYWRfZm9yX2RhdGEobHApOworCXRhaWwgPSBscC0+dHhfdGFpbDsKKwluZXdfdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCWlmIChuZXdfdGFpbCA9PSBsaW1pdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGltaXQgPiBuZXdfdGFpbCkKKwkJZGlmZiA9IGxpbWl0IC0gbmV3X3RhaWw7CisJZWxzZQorCQlkaWZmID0gKGxpbWl0ICsKKwkJCSgobHAtPnR4X251bV9lbnRyaWVzICogTERDX1BBQ0tFVF9TSVpFKSAtIG5ld190YWlsKSk7CisJZGlmZiAvPSBMRENfUEFDS0VUX1NJWkU7CisJbXNzID0gbHAtPm1zczsKKworCWlmIChkaWZmICogbXNzIDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpkYXRhX2dldF90eF9wYWNrZXQoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nICpuZXdfdGFpbCkKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwl1bnNpZ25lZCBsb25nIGgsIHQ7CisKKwloID0gaGVhZF9mb3JfZGF0YShscCk7CisJdCA9IHR4X2FkdmFuY2UobHAsIGxwLT50eF90YWlsKTsKKwlpZiAodCA9PSBoKQorCQlyZXR1cm4gTlVMTDsKKworCSpuZXdfdGFpbCA9IHQ7CisKKwlwID0gbHAtPnR4X2Jhc2U7CisJcmV0dXJuIHAgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpOworfQorCitzdGF0aWMgaW50IHNldF90eF90YWlsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgdGFpbCkKK3sKKwl1bnNpZ25lZCBsb25nIG9yaWdfdGFpbCA9IGxwLT50eF90YWlsOworCWludCBsaW1pdCA9IDEwMDA7CisKKwlscC0+dHhfdGFpbCA9IHRhaWw7CisJd2hpbGUgKGxpbWl0LS0gPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgZXJyOworCisJCWVyciA9IHN1bjR2X2xkY190eF9zZXRfcXRhaWwobHAtPmlkLCB0YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZXJyICE9IEhWX0VXT1VMREJMT0NLKSB7CisJCQlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlscC0+dHhfdGFpbCA9IG9yaWdfdGFpbDsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKiBUaGlzIGp1c3QgdXBkYXRlcyB0aGUgaGVhZCB2YWx1ZSBpbiB0aGUgaHlwZXJ2aXNvciB1c2luZworICogYSBwb2xsaW5nIGxvb3Agd2l0aCBhIHRpbWVvdXQuICBUaGUgY2FsbGVyIHRha2VzIGNhcmUgb2YKKyAqIHVwYXRpbmcgc29mdHdhcmUgc3RhdGUgcmVwcmVzZW50aW5nIHRoZSBoZWFkIGNoYW5nZSwgaWYgYW55LgorICovCitzdGF0aWMgaW50IF9fc2V0X3J4X2hlYWQoc3RydWN0IGxkY19jaGFubmVsICpscCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWludCBsaW1pdCA9IDEwMDA7CisKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBlcnI7CisKKwkJZXJyID0gc3VuNHZfbGRjX3J4X3NldF9xaGVhZChscC0+aWQsIGhlYWQpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAwOworCisJCWlmIChlcnIgIT0gSFZfRVdPVUxEQkxPQ0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3R4X3BhY2tldChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCwKKwkJCSAgdW5zaWduZWQgbG9uZyBuZXdfdGFpbCkKK3sKKwlCVUdfT04ocCAhPSAobHAtPnR4X2Jhc2UgKyAobHAtPnR4X3RhaWwgLyBMRENfUEFDS0VUX1NJWkUpKSk7CisKKwlyZXR1cm4gc2V0X3R4X3RhaWwobHAsIG5ld190YWlsKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfcGFja2V0ICpoYW5kc2hha2VfY29tcG9zZV9jdHJsKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJCQkgdTggc3R5cGUsIHU4IGN0cmwsCisJCQkJCQkgdm9pZCAqZGF0YSwgaW50IGRsZW4sCisJCQkJCQkgdW5zaWduZWQgbG9uZyAqbmV3X3RhaWwpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBoYW5kc2hha2VfZ2V0X3R4X3BhY2tldChscCwgbmV3X3RhaWwpOworCisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCQlwLT50eXBlID0gTERDX0NUUkw7CisJCXAtPnN0eXBlID0gc3R5cGU7CisJCXAtPmN0cmwgPSBjdHJsOworCQlpZiAoZGF0YSkKKwkJCW1lbWNweShwLT51LnVfZGF0YSwgZGF0YSwgZGxlbik7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IHN0YXJ0X2hhbmRzaGFrZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIgPSAmdmVyX2FyclswXTsKKworCWxkY2RiZyhIUywgIlNFTkQgVkVSIElORk8gbWFqWyV1XSBtaW5bJXVdXG4iLAorCSAgICAgICB2ZXItPm1ham9yLCB2ZXItPm1pbm9yKTsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1ZFUlMsCisJCQkJICAgdmVyLCBzaXplb2YoKnZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJaW50IGVyciA9IHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJCWlmICghZXJyKQorCQkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRVNFVDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3ZlcnNpb25fbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICB1MTYgbWFqb3IsIHUxNiBtaW5vcikKK3sKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gdmVyOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwl2ZXIubWFqb3IgPSBtYWpvcjsKKwl2ZXIubWlub3IgPSBtaW5vcjsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfTkFDSywgTERDX1ZFUlMsCisJCQkJICAgJnZlciwgc2l6ZW9mKHZlciksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgTkFDSyBtYWpbJXVdIG1pblsldV1cbiIsCisJCSAgICAgICB2ZXIubWFqb3IsIHZlci5taW5vcik7CisKKwkJcmV0dXJuIHNlbmRfdHhfcGFja2V0KGxwLCBwLCBuZXdfdGFpbCk7CisJfQorCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uX2FjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgIHN0cnVjdCBsZGNfdmVyc2lvbiAqdnApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfQUNLLCBMRENfVkVSUywKKwkJCQkgICB2cCwgc2l6ZW9mKCp2cCksICZuZXdfdGFpbCk7CisJaWYgKHApIHsKKwkJbGRjZGJnKEhTLCAiU0VORCBWRVIgQUNLIG1halsldV0gbWluWyV1XVxuIiwKKwkJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX3J0cyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisKKwlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19SVFMsIE5VTEwsIDAsCisJCQkJICAgJm5ld190YWlsKTsKKwlpZiAocCkgeworCQlwLT5lbnYgPSBscC0+Y2ZnLm1vZGU7CisJCXAtPnNlcWlkID0gMDsKKwkJbHAtPnJjdl9ueHQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRTIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcnRyKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JUUiwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IGxwLT5jZmcubW9kZTsKKwkJcC0+c2VxaWQgPSAwOworCisJCWxkY2RiZyhIUywgIlNFTkQgUlRSIGVudlsweCV4XSBzZXFpZFsweCV4XVxuIiwKKwkJICAgICAgIHAtPmVudiwgcC0+c2VxaWQpOworCisJCXJldHVybiBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCX0KKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCXAgPSBoYW5kc2hha2VfY29tcG9zZV9jdHJsKGxwLCBMRENfSU5GTywgTERDX1JEWCwgTlVMTCwgMCwKKwkJCQkgICAmbmV3X3RhaWwpOworCWlmIChwKSB7CisJCXAtPmVudiA9IDA7CisJCXAtPnNlcWlkID0gKytscC0+c25kX254dDsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJbGRjZGJnKEhTLCAiU0VORCBSRFggZW52WzB4JXhdIHNlcWlkWzB4JXhdIGFja2lkWzB4JXhdXG4iLAorCQkgICAgICAgcC0+ZW52LCBwLT5zZXFpZCwgcC0+dS5yLmFja2lkKTsKKworCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwl9CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBzZW5kX2RhdGFfbmFjayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3BhY2tldCAqZGF0YV9wa3QpCit7CisJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlpbnQgZXJyOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUJVU1k7CisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXAtPnR5cGUgPSBkYXRhX3BrdC0+dHlwZTsKKwlwLT5zdHlwZSA9IExEQ19OQUNLOworCXAtPmN0cmwgPSBkYXRhX3BrdC0+Y3RybCAmIExEQ19DVFJMX01TSzsKKwlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwlwLT51LnIuYWNraWQgPSBscC0+cmN2X254dDsKKworCWxkY2RiZyhIUywgIlNFTkQgREFUQSBOQUNLIHR5cGVbMHgleF0gY3RsWzB4JXhdIHNlcVsweCV4XSBhY2tbMHgleF1cbiIsCisJICAgICAgIHAtPnR5cGUsIHAtPmN0cmwsIHAtPnNlcWlkLCBwLT51LnIuYWNraWQpOworCisJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwlpZiAoIWVycikKKwkJbHAtPnNuZF9ueHQrKzsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbGRjX2Fib3J0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwlsZGNkYmcoU1RBVEUsICJBQk9SVFxuIik7CisKKwkvKiBXZSByZXBvcnQgYnV0IGRvIG5vdCBhY3QgdXBvbiB0aGUgaHlwZXJ2aXNvciBlcnJvcnMgYmVjYXVzZQorCSAqIHRoZXJlIHJlYWxseSBpc24ndCBtdWNoIHdlIGNhbiBkbyBpZiB0aGV5IGZhaWwgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3R4X3Fjb25mKCVseCwlbHgsJWx4KSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGxwLT50eF9yYSwgbHAtPnR4X251bV9lbnRyaWVzLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+dHhfaGVhZCwKKwkJCQkJJmxwLT50eF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY190eF9nZXRfc3RhdGUoJWx4LC4uLikgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBodl9lcnIpOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19hYm9ydDogIgorCQkgICAgICAgInN1bjR2X2xkY19yeF9xY29uZiglbHgsJWx4LCVseCkgZmFpbGVkLCBlcnI9JWx1XG4iLAorCQkgICAgICAgbHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcywgaHZfZXJyKTsKKworCS8qIFJlZmV0Y2ggdGhlIFJYIHF1ZXVlIHN0YXRlIGFzIHdlbGwsIGJlY2F1c2Ugd2UgY291bGQgYmUgaW52b2tlZAorCSAqIGhlcmUgaW4gdGhlIHF1ZXVlIHByb2Nlc3NpbmcgY29udGV4dC4KKwkgKi8KKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKGh2X2VycikKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2Fib3J0OiAiCisJCSAgICAgICAic3VuNHZfbGRjX3J4X2dldF9zdGF0ZSglbHgsLi4uKSBmYWlsZWQsIGVycj0lbHVcbiIsCisJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisKKwlyZXR1cm4gLUVDT05OUkVTRVQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGRjX3ZlcnNpb24gKmZpbmRfYnlfbWFqb3IodTE2IG1ham9yKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZlcl9hcnIpOyBpKyspIHsKKwkJc3RydWN0IGxkY192ZXJzaW9uICp2ID0gJnZlcl9hcnJbaV07CisJCWlmICh2LT5tYWpvciA8PSBtYWpvcikgeworCQkJcmV0ID0gdjsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc192ZXJfaW5mbyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZwKQoreworCXN0cnVjdCBsZGNfdmVyc2lvbiAqdmFwOworCWludCBlcnI7CisKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBJTkZPIG1ham9yWyV4XSBtaW5vclsleF1cbiIsCisJICAgICAgIHZwLT5tYWpvciwgdnAtPm1pbm9yKTsKKworCWlmIChscC0+aHNfc3RhdGUgPT0gTERDX0hTX0dPVFZFUlMpIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJCW1lbXNldCgmbHAtPnZlciwgMCwgc2l6ZW9mKGxwLT52ZXIpKTsKKwl9CisKKwl2YXAgPSBmaW5kX2J5X21ham9yKHZwLT5tYWpvcik7CisJaWYgKCF2YXApIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIDAsIDApOworCX0gZWxzZSBpZiAodmFwLT5tYWpvciAhPSB2cC0+bWFqb3IpIHsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX25hY2sobHAsIHZhcC0+bWFqb3IsIHZhcC0+bWlub3IpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsZGNfdmVyc2lvbiB2ZXIgPSAqdnA7CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJZXJyID0gc2VuZF92ZXJzaW9uX2FjayhscCwgJnZlcik7CisJCWlmICghZXJyKSB7CisJCQlscC0+dmVyID0gdmVyOworCQkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJCX0KKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3Zlcl9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgVkVSU0lPTiBBQ0sgbWFqb3JbJXhdIG1pbm9yWyV4XVxuIiwKKwkgICAgICAgdnAtPm1ham9yLCB2cC0+bWlub3IpOworCisJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfR09UVkVSUykgeworCQlpZiAobHAtPnZlci5tYWpvciAhPSB2cC0+bWFqb3IgfHwKKwkJICAgIGxwLT52ZXIubWlub3IgIT0gdnAtPm1pbm9yKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfSBlbHNlIHsKKwkJbHAtPnZlciA9ICp2cDsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0dPVFZFUlM7CisJfQorCWlmIChzZW5kX3J0cyhscCkpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY192ZXJzaW9uICp2cCkKK3sKKwlzdHJ1Y3QgbGRjX3ZlcnNpb24gKnZhcDsKKworCWlmICgodnAtPm1ham9yID09IDAgJiYgdnAtPm1pbm9yID09IDApIHx8CisJICAgICEodmFwID0gZmluZF9ieV9tYWpvcih2cC0+bWFqb3IpKSkgeworCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKworCQlwID0gaGFuZHNoYWtlX2NvbXBvc2VfY3RybChscCwgTERDX0lORk8sIExEQ19WRVJTLAorCQkJCQkgICB2YXAsIHNpemVvZigqdmFwKSwKKwkJCQkJICAgJm5ld190YWlsKTsKKwkJaWYgKHApCisJCQlyZXR1cm4gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJZWxzZQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyc2lvbihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3RydWN0IGxkY192ZXJzaW9uICp2cDsKKworCXZwID0gKHN0cnVjdCBsZGNfdmVyc2lvbiAqKSBwLT51LnVfZGF0YTsKKworCXN3aXRjaCAocC0+c3R5cGUpIHsKKwljYXNlIExEQ19JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyhscCwgdnApOworCisJY2FzZSBMRENfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfYWNrKGxwLCB2cCk7CisKKwljYXNlIExEQ19OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfbmFjayhscCwgdnApOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgICAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqcCkKK3sKKwlsZGNkYmcoSFMsICJHT1QgUlRTIHN0eXBlWyV4XSBzZXFpZFsleF0gZW52WyV4XVxuIiwKKwkgICAgICAgcC0+c3R5cGUsIHAtPnNlcWlkLCBwLT5lbnYpOworCisJaWYgKHAtPnN0eXBlICAgICAhPSBMRENfSU5GTwkgICB8fAorCSAgICBscC0+aHNfc3RhdGUgIT0gTERDX0hTX0dPVFZFUlMgfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5yY3Zfbnh0ID0gcC0+c2VxaWQ7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX1NFTlRSVFI7CisJaWYgKHNlbmRfcnRyKGxwKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3J0cihzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJUUiBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF1cbiIsCisJICAgICAgIHAtPnN0eXBlLCBwLT5zZXFpZCwgcC0+ZW52KTsKKworCWlmIChwLT5zdHlwZSAgICAgIT0gTERDX0lORk8gfHwKKwkgICAgcC0+ZW52ICAgICAgICE9IGxwLT5jZmcubW9kZSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+c25kX254dCA9IHAtPnNlcWlkOworCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKwlzZW5kX3JkeChscCk7CisKKwlyZXR1cm4gTERDX0VWRU5UX1VQOworfQorCitzdGF0aWMgaW50IHJ4X3NlcV9vayhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1MzIgc2VxaWQpCit7CisJcmV0dXJuIGxwLT5yY3Zfbnh0ICsgMSA9PSBzZXFpZDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJbGRjZGJnKEhTLCAiR09UIFJEWCBzdHlwZVsleF0gc2VxaWRbJXhdIGVudlsleF0gYWNraWRbJXhdXG4iLAorCSAgICAgICBwLT5zdHlwZSwgcC0+c2VxaWQsIHAtPmVudiwgcC0+dS5yLmFja2lkKTsKKworCWlmIChwLT5zdHlwZSAhPSBMRENfSU5GTyB8fAorCSAgICAhKHJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlscC0+cmN2X254dCA9IHAtPnNlcWlkOworCisJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9DT05ORUNURUQpOworCisJcmV0dXJuIExEQ19FVkVOVF9VUDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NvbnRyb2xfZnJhbWUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgc3RydWN0IGxkY19wYWNrZXQgKnApCit7CisJc3dpdGNoIChwLT5jdHJsKSB7CisJY2FzZSBMRENfVkVSUzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyc2lvbihscCwgcCk7CisKKwljYXNlIExEQ19SVFM6CisJCXJldHVybiBwcm9jZXNzX3J0cyhscCwgcCk7CisKKwljYXNlIExEQ19SVFI6CisJCXJldHVybiBwcm9jZXNzX3J0cihscCwgcCk7CisKKwljYXNlIExEQ19SRFg6CisJCXJldHVybiBwcm9jZXNzX3JkeChscCwgcCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19lcnJvcl9mcmFtZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLAorCQkJICAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCXJldHVybiBsZGNfYWJvcnQobHApOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZGF0YV9hY2soc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgICBzdHJ1Y3QgbGRjX3BhY2tldCAqYWNrKQoreworCXVuc2lnbmVkIGxvbmcgaGVhZCA9IGxwLT50eF9hY2tlZDsKKwl1MzIgYWNraWQgPSBhY2stPnUuci5hY2tpZDsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBsZGNfcGFja2V0ICpwID0gbHAtPnR4X2Jhc2UgKyAoaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJaGVhZCA9IHR4X2FkdmFuY2UobHAsIGhlYWQpOworCisJCWlmIChwLT5zZXFpZCA9PSBhY2tpZCkgeworCQkJbHAtPnR4X2Fja2VkID0gaGVhZDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChoZWFkID09IGxwLT50eF90YWlsKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZXZlbnRzKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBldmVudF9tYXNrKQoreworCWlmIChldmVudF9tYXNrICYgTERDX0VWRU5UX1JFU0VUKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9SRVNFVCk7CisJaWYgKGV2ZW50X21hc2sgJiBMRENfRVZFTlRfVVApCisJCWxwLT5jZmcuZXZlbnQobHAtPmV2ZW50X2FyZywgTERDX0VWRU5UX1VQKTsKKwlpZiAoZXZlbnRfbWFzayAmIExEQ19FVkVOVF9EQVRBX1JFQURZKQorCQlscC0+Y2ZnLmV2ZW50KGxwLT5ldmVudF9hcmcsIExEQ19FVkVOVF9EQVRBX1JFQURZKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGxkY19yeChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGxkY19jaGFubmVsICpscCA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIG9yaWdfc3RhdGUsIGh2X2VyciwgZmxhZ3M7CisJdW5zaWduZWQgaW50IGV2ZW50X21hc2s7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT5yeF9oZWFkLAorCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoUlgsICJSWCBzdGF0ZVsweCUwMmx4OjB4JTAybHhdIGhlYWRbMHglMDRseF0gdGFpbFsweCUwNGx4XVxuIiwKKwkgICAgICAgb3JpZ19zdGF0ZSwgbHAtPmNoYW5fc3RhdGUsIGxwLT5yeF9oZWFkLCBscC0+cnhfdGFpbCk7CisKKwlldmVudF9tYXNrID0gMDsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfUkFXICYmCisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1VQKSB7CisJCWxwLT5oc19zdGF0ZSA9IExEQ19IU19DT01QTEVURTsKKwkJbGRjX3NldF9zdGF0ZShscCwgTERDX1NUQVRFX0NPTk5FQ1RFRCk7CisKKwkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfVVA7CisKKwkJb3JpZ19zdGF0ZSA9IGxwLT5jaGFuX3N0YXRlOworCX0KKworCS8qIElmIHdlIGFyZSBpbiByZXNldCBzdGF0ZSwgZmx1c2ggdGhlIFJYIHF1ZXVlIGFuZCBpZ25vcmUKKwkgKiBldmVyeXRoaW5nLgorCSAqLworCWlmIChscC0+ZmxhZ3MgJiBMRENfRkxBR19SRVNFVCkgeworCQkodm9pZCkgX19zZXRfcnhfaGVhZChscCwgbHAtPnJ4X3RhaWwpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBPbmNlIHdlIGZpbmlzaCB0aGUgaGFuZHNoYWtlLCB3ZSBsZXQgdGhlIGxkY19yZWFkKCkKKwkgKiBwYXRocyBkbyBhbGwgb2YgdGhlIGNvbnRyb2wgZnJhbWUgYW5kIHN0YXRlIG1hbmFnZW1lbnQuCisJICogSnVzdCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4KKwkgKi8KKwlpZiAobHAtPmhzX3N0YXRlID09IExEQ19IU19DT01QTEVURSkgeworaGFuZHNoYWtlX2NvbXBsZXRlOgorCQlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkgeworCQkJdW5zaWduZWQgaW50IGV2ZW50ID0gTERDX0VWRU5UX1JFU0VUOworCisJCQlpZiAobHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApCisJCQkJZXZlbnQgPSBMRENfRVZFTlRfVVA7CisKKwkJCWV2ZW50X21hc2sgfD0gZXZlbnQ7CisJCX0KKwkJaWYgKGxwLT5yeF9oZWFkICE9IGxwLT5yeF90YWlsKQorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobHAtPmNoYW5fc3RhdGUgIT0gb3JpZ19zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAobHAtPnJ4X2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnA7CisJCXVuc2lnbmVkIGxvbmcgbmV3OworCQlpbnQgZXJyOworCisJCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisKKwkJc3dpdGNoIChwLT50eXBlKSB7CisJCWNhc2UgTERDX0NUUkw6CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA+IDApCisJCQkJZXZlbnRfbWFzayB8PSBlcnI7CisJCQlicmVhazsKKworCQljYXNlIExEQ19EQVRBOgorCQkJZXZlbnRfbWFzayB8PSBMRENfRVZFTlRfREFUQV9SRUFEWTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKworCQljYXNlIExEQ19FUlI6CisJCQllcnIgPSBwcm9jZXNzX2Vycm9yX2ZyYW1lKGxwLCBwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnIgPSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCW5ldyA9IGxwLT5yeF9oZWFkOworCQluZXcgKz0gTERDX1BBQ0tFVF9TSVpFOworCQlpZiAobmV3ID09IChscC0+cnhfbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkUpKQorCQkJbmV3ID0gMDsKKwkJbHAtPnJ4X2hlYWQgPSBuZXc7CisKKwkJZXJyID0gX19zZXRfcnhfaGVhZChscCwgbmV3KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCSh2b2lkKSBsZGNfYWJvcnQobHApOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGxwLT5oc19zdGF0ZSA9PSBMRENfSFNfQ09NUExFVEUpCisJCQlnb3RvIGhhbmRzaGFrZV9jb21wbGV0ZTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGRjX3R4KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGh2X2Vyciwgb3JpZ19zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfbWFzayA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW9yaWdfc3RhdGUgPSBscC0+Y2hhbl9zdGF0ZTsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisKKwlsZGNkYmcoVFgsICIgVFggc3RhdGVbMHglMDJseDoweCUwMmx4XSBoZWFkWzB4JTA0bHhdIHRhaWxbMHglMDRseF1cbiIsCisJICAgICAgIG9yaWdfc3RhdGUsIGxwLT5jaGFuX3N0YXRlLCBscC0+dHhfaGVhZCwgbHAtPnR4X3RhaWwpOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcgJiYKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfVVApIHsKKwkJbHAtPmhzX3N0YXRlID0gTERDX0hTX0NPTVBMRVRFOworCQlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQ09OTkVDVEVEKTsKKworCQlldmVudF9tYXNrIHw9IExEQ19FVkVOVF9VUDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJc2VuZF9ldmVudHMobHAsIGV2ZW50X21hc2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBYWFggbGRjX2FsbG9jKCkgYW5kIGxkY19mcmVlKCkgbmVlZHMgdG8gcnVuIHVuZGVyIGEgbXV0ZXggc28KKyAqIFhYWCB0aGF0IGFkZGl0aW9uIGFuZCByZW1vdmFsIGZyb20gdGhlIGxkY19jaGFubmVsX2xpc3QgaGFzCisgKiBYWFggYXRvbWljaXR5LCBvdGhlcndpc2UgdGhlIF9fbGRjX2NoYW5uZWxfZXhpc3RzKCkgY2hlY2sgaXMKKyAqIFhYWCB0b3RhbGx5IHBvaW50bGVzcyBhcyBhbm90aGVyIHRocmVhZCBjYW4gc2xpcCBpbnRvIGxkY19hbGxvYygpCisgKiBYWFggYW5kIGFkZCBhIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSBJRC4gIFRoZXJlIGFsc28gbmVlZHMgdG8gYmUKKyAqIFhYWCBhIHNwaW5sb2NrIGZvciBsZGNfY2hhbm5lbF9saXN0LgorICovCitzdGF0aWMgSExJU1RfSEVBRChsZGNfY2hhbm5lbF9saXN0KTsKKworc3RhdGljIGludCBfX2xkY19jaGFubmVsX2V4aXN0cyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShscCwgbiwgJmxkY19jaGFubmVsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGxwLT5pZCA9PSBpZCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19xdWV1ZShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzLAorCQkgICAgICAgc3RydWN0IGxkY19wYWNrZXQgKipiYXNlLCB1bnNpZ25lZCBsb25nICpyYSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIG9yZGVyOworCXZvaWQgKnE7CisKKwlzaXplID0gbnVtX2VudHJpZXMgKiBMRENfUEFDS0VUX1NJWkU7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwlxID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CisJaWYgKCFxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkFsbG9jIG9mICVzIHF1ZXVlIGZhaWxlZCB3aXRoICIKKwkJICAgICAgICJzaXplPSVsdSBvcmRlcj0lbHVcbiIsIG5hbWUsIHNpemUsIG9yZGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHEsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwkqYmFzZSA9IHE7CisJKnJhID0gX19wYShxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgbnVtX2VudHJpZXMsIHN0cnVjdCBsZGNfcGFja2V0ICpxKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb3JkZXI7CisKKwlpZiAoIXEpCisJCXJldHVybjsKKworCXNpemUgPSBudW1fZW50cmllcyAqIExEQ19QQUNLRVRfU0laRTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcSwgb3JkZXIpOworfQorCisvKiBYWFggTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS4uLiBYWFggKi8KKyNkZWZpbmUgTERDX0lPVEFCTEVfU0laRQkoOCAqIDEwMjQpCisKK3N0YXRpYyBpbnQgbGRjX2lvbW11X2luaXQoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwl1bnNpZ25lZCBsb25nIHN6LCBudW1fdHNiX2VudHJpZXMsIHRzYnNpemUsIG9yZGVyOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqdGFibGU7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisJaW50IGVycjsKKworCW51bV90c2JfZW50cmllcyA9IExEQ19JT1RBQkxFX1NJWkU7CisJdHNic2l6ZSA9IG51bV90c2JfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSk7CisKKwlzcGluX2xvY2tfaW5pdCgmaW9tbXUtPmxvY2spOworCisJc3ogPSBudW1fdHNiX2VudHJpZXMgLyA4OworCXN6ID0gKHN6ICsgN1VMKSAmIH43VUw7CisJaW9tbXUtPmFyZW5hLm1hcCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghaW9tbXUtPmFyZW5hLm1hcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBbGxvYyBvZiBhcmVuYSBtYXAgZmFpbGVkLCBzej0lbHVcbiIsIHN6KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9tbXUtPmFyZW5hLmxpbWl0ID0gbnVtX3RzYl9lbnRyaWVzOworCisJb3JkZXIgPSBnZXRfb3JkZXIodHNic2l6ZSk7CisKKwl0YWJsZSA9IChzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqKQorCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghdGFibGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQWxsb2Mgb2YgTVRFIHRhYmxlIGZhaWxlZCwgIgorCQkgICAgICAgInNpemU9JWx1IG9yZGVyPSVsdVxuIiwgdHNic2l6ZSwgb3JkZXIpOworCQlnb3RvIG91dF9mcmVlX21hcDsKKwl9CisKKwltZW1zZXQodGFibGUsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7CisKKwlpb21tdS0+cGFnZV90YWJsZSA9IHRhYmxlOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCBfX3BhKHRhYmxlKSwKKwkJCQkJIG51bV90c2JfZW50cmllcyk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9mcmVlX3RhYmxlOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3RhYmxlOgorCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHRhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCitvdXRfZnJlZV9tYXA6CisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBsZGNfaW9tbXVfcmVsZWFzZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11ID0gJmxwLT5pb21tdTsKKwl1bnNpZ25lZCBsb25nIG51bV90c2JfZW50cmllcywgdHNic2l6ZSwgb3JkZXI7CisKKwkodm9pZCkgc3VuNHZfbGRjX3NldF9tYXBfdGFibGUobHAtPmlkLCAwLCAwKTsKKworCW51bV90c2JfZW50cmllcyA9IGlvbW11LT5hcmVuYS5saW1pdDsKKwl0c2JzaXplID0gbnVtX3RzYl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5KTsKKwlvcmRlciA9IGdldF9vcmRlcih0c2JzaXplKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGlvbW11LT5wYWdlX3RhYmxlLCBvcmRlcik7CisJaW9tbXUtPnBhZ2VfdGFibGUgPSBOVUxMOworCisJa2ZyZWUoaW9tbXUtPmFyZW5hLm1hcCk7CisJaW9tbXUtPmFyZW5hLm1hcCA9IE5VTEw7Cit9CisKK3N0cnVjdCBsZGNfY2hhbm5lbCAqbGRjX2FsbG9jKHVuc2lnbmVkIGxvbmcgaWQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpjZmdwLAorCQkJICAgICAgdm9pZCAqZXZlbnRfYXJnKQoreworCXN0cnVjdCBsZGNfY2hhbm5lbCAqbHA7CisJY29uc3Qgc3RydWN0IGxkY19tb2RlX29wcyAqbW9wczsKKwl1bnNpZ25lZCBsb25nIGR1bW15MSwgZHVtbXkyLCBodl9lcnI7CisJdTggbXNzLCAqbXNzYnVmOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PREVWOworCWlmICghbGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWNmZ3ApCisJCWdvdG8gb3V0X2VycjsKKworCXN3aXRjaCAoY2ZncC0+bW9kZSkgeworCWNhc2UgTERDX01PREVfUkFXOgorCQltb3BzID0gJnJhd19vcHM7CisJCW1zcyA9IExEQ19QQUNLRVRfU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1VOUkVMSUFCTEU6CisJCW1vcHMgPSAmbm9ucmF3X29wczsKKwkJbXNzID0gTERDX1BBQ0tFVF9TSVpFIC0gODsKKwkJYnJlYWs7CisKKwljYXNlIExEQ19NT0RFX1NUUkVBTToKKwkJbW9wcyA9ICZzdHJlYW1fb3BzOworCQltc3MgPSBMRENfUEFDS0VUX1NJWkUgLSA4IC0gODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKCFjZmdwLT5ldmVudCB8fCAhZXZlbnRfYXJnIHx8ICFjZmdwLT5yeF9pcnEgfHwgIWNmZ3AtPnR4X2lycSkKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3FpbmZvKGlkLCAmZHVtbXkxLCAmZHVtbXkyKTsKKwllcnIgPSAtRU5PREVWOworCWlmIChodl9lcnIgPT0gSFZfRUNIQU5ORUwpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IC1FRVhJU1Q7CisJaWYgKF9fbGRjX2NoYW5uZWxfZXhpc3RzKGlkKSkKKwkJZ290byBvdXRfZXJyOworCisJbXNzYnVmID0gTlVMTDsKKworCWxwID0ga3phbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWxwKQorCQlnb3RvIG91dF9lcnI7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJbHAtPmlkID0gaWQ7CisKKwllcnIgPSBsZGNfaW9tbXVfaW5pdChscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9sZGM7CisKKwlscC0+bW9wcyA9IG1vcHM7CisJbHAtPm1zcyA9IG1zczsKKworCWxwLT5jZmcgPSAqY2ZncDsKKwlpZiAoIWxwLT5jZmcubXR1KQorCQlscC0+Y2ZnLm10dSA9IExEQ19ERUZBVUxUX01UVTsKKworCWlmIChscC0+Y2ZnLm1vZGUgPT0gTERDX01PREVfU1RSRUFNKSB7CisJCW1zc2J1ZiA9IGt6YWxsb2MobHAtPmNmZy5tdHUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1zc2J1ZikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfaW9tbXU7CisJCX0KKwkJbHAtPm1zc2J1ZiA9IG1zc2J1ZjsKKwl9CisKKwlscC0+ZXZlbnRfYXJnID0gZXZlbnRfYXJnOworCisJLyogWFhYIGFsbG93IHNldHRpbmcgdmlhIGxkY19jaGFubmVsX2NvbmZpZyB0byBvdmVycmlkZSBkZWZhdWx0cworCSAqIFhYWCBvciB1c2Ugc29tZSBmb3JtdWxhIGJhc2VkIHVwb24gbXR1CisJICovCisJbHAtPnR4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisJbHAtPnJ4X251bV9lbnRyaWVzID0gTERDX0RFRkFVTFRfTlVNX0VOVFJJRVM7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiVFgiLCBscC0+dHhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+dHhfYmFzZSwgJmxwLT50eF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9tc3NidWY7CisKKwllcnIgPSBhbGxvY19xdWV1ZSgiUlgiLCBscC0+cnhfbnVtX2VudHJpZXMsCisJCQkgICZscC0+cnhfYmFzZSwgJmxwLT5yeF9yYSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV90eHE7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfQ0xPU0VEOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCUlOSVRfSExJU1RfTk9ERSgmbHAtPmxpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZscC0+bGlzdCwgJmxkY19jaGFubmVsX2xpc3QpOworCisJSU5JVF9ITElTVF9IRUFEKCZscC0+bWhfbGlzdCk7CisKKwlyZXR1cm4gbHA7CisKK291dF9mcmVlX3R4cToKKwlmcmVlX3F1ZXVlKGxwLT50eF9udW1fZW50cmllcywgbHAtPnR4X2Jhc2UpOworCitvdXRfZnJlZV9tc3NidWY6CisJaWYgKG1zc2J1ZikKKwkJa2ZyZWUobXNzYnVmKTsKKworb3V0X2ZyZWVfaW9tbXU6CisJbGRjX2lvbW11X3JlbGVhc2UobHApOworCitvdXRfZnJlZV9sZGM6CisJa2ZyZWUobHApOworCitvdXRfZXJyOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvYyk7CisKK3ZvaWQgbGRjX2ZyZWUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlpZiAobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9JUlFTKSB7CisJCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisJCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJfQorCisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFR0lTVEVSRURfUVVFVUVTKSB7CisJCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCQlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwkJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwl9CisJaWYgKGxwLT5mbGFncyAmIExEQ19GTEFHX0FMTE9DRURfUVVFVUVTKSB7CisJCWZyZWVfcXVldWUobHAtPnR4X251bV9lbnRyaWVzLCBscC0+dHhfYmFzZSk7CisJCWZyZWVfcXVldWUobHAtPnJ4X251bV9lbnRyaWVzLCBscC0+cnhfYmFzZSk7CisJCWxwLT5mbGFncyAmPSB+TERDX0ZMQUdfQUxMT0NFRF9RVUVVRVM7CisJfQorCisJaGxpc3RfZGVsKCZscC0+bGlzdCk7CisKKwlpZiAobHAtPm1zc2J1ZikKKwkJa2ZyZWUobHAtPm1zc2J1Zik7CisKKwlsZGNfaW9tbXVfcmVsZWFzZShscCk7CisKKwlrZnJlZShscCk7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlKTsKKworLyogQmluZCB0aGUgY2hhbm5lbC4gIFRoaXMgcmVnaXN0ZXJzIHRoZSBMREMgcXVldWVzIHdpdGgKKyAqIHRoZSBoeXBlcnZpc29yIGFuZCBwdXRzIHRoZSBjaGFubmVsIGludG8gYSBwc2V1ZG8tbGlzdGVuaW5nCisgKiBzdGF0ZS4gIFRoaXMgZG9lcyBub3QgaW5pdGlhdGUgYSBoYW5kc2hha2UsIGxkY19jb25uZWN0KCkgZG9lcworICogdGhhdC4KKyAqLworaW50IGxkY19iaW5kKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIGZsYWdzOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIW5hbWUpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChscC0+c3RhdGUgIT0gTERDX1NUQVRFX0lOSVQpCisJCWdvdG8gb3V0X2VycjsKKworCXNucHJpbnRmKGxwLT5yeF9pcnFfbmFtZSwgTERDX0lSUV9OQU1FX01BWCwgIiVzIFJYIiwgbmFtZSk7CisJc25wcmludGYobHAtPnR4X2lycV9uYW1lLCBMRENfSVJRX05BTUVfTUFYLCAiJXMgVFgiLCBuYW1lKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGxwLT5jZmcucnhfaXJxLCBsZGNfcngsCisJCQkgIElSUUZfU0FNUExFX1JBTkRPTSB8IElSUUZfU0hBUkVELAorCQkJICBscC0+cnhfaXJxX25hbWUsIGxwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShscC0+Y2ZnLnR4X2lycSwgbGRjX3R4LAorCQkJICBJUlFGX1NBTVBMRV9SQU5ET00gfCBJUlFGX1NIQVJFRCwKKwkJCSAgbHAtPnR4X2lycV9uYW1lLCBscCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9yeF9pcnE7CisKKworCWxwLT5mbGFncyB8PSBMRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisKKwllcnIgPSAtRU5PREVWOworCWh2X2VyciA9IHN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3R4X3Fjb25mKGxwLT5pZCwgbHAtPnR4X3JhLCBscC0+dHhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2ZyZWVfdHhfaXJxOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCBscC0+cnhfcmEsIGxwLT5yeF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfdW5tYXBfdHg7CisKKwlscC0+ZmxhZ3MgfD0gTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVM7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwKKwkJCQkJJmxwLT50eF9oZWFkLAorCQkJCQkmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJZXJyID0gLUVCVVNZOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X3VubWFwX3J4OworCisJbHAtPnR4X2Fja2VkID0gbHAtPnR4X2hlYWQ7CisKKwlscC0+aHNfc3RhdGUgPSBMRENfSFNfT1BFTjsKKwlsZGNfc2V0X3N0YXRlKGxwLCBMRENfU1RBVEVfQk9VTkQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXBfcng6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUzsKKwlzdW40dl9sZGNfcnhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKworb3V0X3VubWFwX3R4OgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCitvdXRfZnJlZV90eF9pcnE6CisJbHAtPmZsYWdzICY9IH5MRENfRkxBR19SRUdJU1RFUkVEX0lSUVM7CisJZnJlZV9pcnEobHAtPmNmZy50eF9pcnEsIGxwKTsKKworb3V0X2ZyZWVfcnhfaXJxOgorCWZyZWVfaXJxKGxwLT5jZmcucnhfaXJxLCBscCk7CisKK291dF9lcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19iaW5kKTsKKworaW50IGxkY19jb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIShscC0+ZmxhZ3MgJiBMRENfRkxBR19BTExPQ0VEX1FVRVVFUykgfHwKKwkgICAgIShscC0+ZmxhZ3MgJiBMRENfRkxBR19SRUdJU1RFUkVEX1FVRVVFUykgfHwKKwkgICAgbHAtPmhzX3N0YXRlICE9IExEQ19IU19PUEVOKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gc3RhcnRfaGFuZHNoYWtlKGxwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfY29ubmVjdCk7CisKK2ludCBsZGNfZGlzY29ubmVjdChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEobHAtPmZsYWdzICYgTERDX0ZMQUdfQUxMT0NFRF9RVUVVRVMpIHx8CisJICAgICEobHAtPmZsYWdzICYgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZXJyID0gLUVOT0RFVjsKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCAwLCAwKTsKKwlpZiAoaHZfZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfcWNvbmYobHAtPmlkLCBscC0+dHhfcmEsIGxwLT50eF9udW1fZW50cmllcyk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgMCwgMCk7CisJaWYgKGh2X2VycikKKwkJZ290byBvdXRfZXJyOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X3Fjb25mKGxwLT5pZCwgbHAtPnJ4X3JhLCBscC0+cnhfbnVtX2VudHJpZXMpOworCWlmIChodl9lcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9CT1VORCk7CisJbHAtPmhzX3N0YXRlID0gTERDX0hTX09QRU47CisJbHAtPmZsYWdzIHw9IExEQ19GTEFHX1JFU0VUOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCXN1bjR2X2xkY190eF9xY29uZihscC0+aWQsIDAsIDApOworCXN1bjR2X2xkY19yeF9xY29uZihscC0+aWQsIDAsIDApOworCWZyZWVfaXJxKGxwLT5jZmcudHhfaXJxLCBscCk7CisJZnJlZV9pcnEobHAtPmNmZy5yeF9pcnEsIGxwKTsKKwlscC0+ZmxhZ3MgJj0gfihMRENfRkxBR19SRUdJU1RFUkVEX0lSUVMgfAorCQkgICAgICAgTERDX0ZMQUdfUkVHSVNURVJFRF9RVUVVRVMpOworCWxkY19zZXRfc3RhdGUobHAsIExEQ19TVEFURV9JTklUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChsZGNfZGlzY29ubmVjdCk7CisKK2ludCBsZGNfc3RhdGUoc3RydWN0IGxkY19jaGFubmVsICpscCkKK3sKKwlyZXR1cm4gbHAtPnN0YXRlOworfQorRVhQT1JUX1NZTUJPTChsZGNfc3RhdGUpOworCitzdGF0aWMgaW50IHdyaXRlX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgbmV3X3RhaWw7CisJaW50IGVycjsKKworCWlmIChzaXplID4gTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcCA9IGRhdGFfZ2V0X3R4X3BhY2tldChscCwgJm5ld190YWlsKTsKKwlpZiAoIXApCisJCXJldHVybiAtRUFHQUlOOworCisJbWVtY3B5KHAsIGJ1Ziwgc2l6ZSk7CisKKwllcnIgPSBzZW5kX3R4X3BhY2tldChscCwgcCwgbmV3X3RhaWwpOworCWlmICghZXJyKQorCQllcnIgPSBzaXplOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZWFkX3JhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpwOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVycjsKKworCWlmIChzaXplIDwgTERDX1BBQ0tFVF9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWh2X2VyciA9IHN1bjR2X2xkY19yeF9nZXRfc3RhdGUobHAtPmlkLAorCQkJCQkmbHAtPnJ4X2hlYWQsCisJCQkJCSZscC0+cnhfdGFpbCwKKwkJCQkJJmxwLT5jaGFuX3N0YXRlKTsKKwlpZiAoaHZfZXJyKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmIChscC0+Y2hhbl9zdGF0ZSA9PSBMRENfQ0hBTk5FTF9ET1dOIHx8CisJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCisJaWYgKGxwLT5yeF9oZWFkID09IGxwLT5yeF90YWlsKQorCQlyZXR1cm4gMDsKKworCXAgPSBscC0+cnhfYmFzZSArIChscC0+cnhfaGVhZCAvIExEQ19QQUNLRVRfU0laRSk7CisJbWVtY3B5KGJ1ZiwgcCwgTERDX1BBQ0tFVF9TSVpFKTsKKworCW5ldyA9IHJ4X2FkdmFuY2UobHAsIGxwLT5yeF9oZWFkKTsKKwlscC0+cnhfaGVhZCA9IG5ldzsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIG5ldyk7CisJaWYgKGVyciA8IDApCisJCWVyciA9IC1FQ09OTlJFU0VUOworCWVsc2UKKwkJZXJyID0gTERDX1BBQ0tFVF9TSVpFOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgcmF3X29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfcmF3LAorCS5yZWFkCQk9CXJlYWRfcmF3LAorfTsKKworc3RhdGljIGludCB3cml0ZV9ub25yYXcoc3RydWN0IGxkY19jaGFubmVsICpscCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBodl9lcnIsIHRhaWw7CisJdW5zaWduZWQgaW50IGNvcGllZDsKKwl1MzIgc2VxOworCWludCBlcnI7CisKKwlodl9lcnIgPSBzdW40dl9sZGNfdHhfZ2V0X3N0YXRlKGxwLT5pZCwgJmxwLT50eF9oZWFkLCAmbHAtPnR4X3RhaWwsCisJCQkJCSZscC0+Y2hhbl9zdGF0ZSk7CisJaWYgKHVubGlrZWx5KGh2X2VycikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodW5saWtlbHkobHAtPmNoYW5fc3RhdGUgIT0gTERDX0NIQU5ORUxfVVApKQorCQlyZXR1cm4gbGRjX2Fib3J0KGxwKTsKKworCWlmICghdHhfaGFzX3NwYWNlX2ZvcihscCwgc2l6ZSkpCisJCXJldHVybiAtRUFHQUlOOworCisJc2VxID0gbHAtPnNuZF9ueHQ7CisJY29waWVkID0gMDsKKwl0YWlsID0gbHAtPnR4X3RhaWw7CisJd2hpbGUgKGNvcGllZCA8IHNpemUpIHsKKwkJc3RydWN0IGxkY19wYWNrZXQgKnAgPSBscC0+dHhfYmFzZSArICh0YWlsIC8gTERDX1BBQ0tFVF9TSVpFKTsKKwkJdTggKmRhdGEgPSAoKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFKSA/CisJCQkgICAgcC0+dS51X2RhdGEgOgorCQkJICAgIHAtPnUuci5yX2RhdGEpOworCQlpbnQgZGF0YV9sZW47CisKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19JTkZPOworCQlwLT5jdHJsID0gMDsKKworCQlkYXRhX2xlbiA9IHNpemUgLSBjb3BpZWQ7CisJCWlmIChkYXRhX2xlbiA+IGxwLT5tc3MpCisJCQlkYXRhX2xlbiA9IGxwLT5tc3M7CisKKwkJQlVHX09OKGRhdGFfbGVuID4gTERDX0xFTik7CisKKwkJcC0+ZW52ID0gKGRhdGFfbGVuIHwKKwkJCSAgKGNvcGllZCA9PSAwID8gTERDX1NUQVJUIDogMCkgfAorCQkJICAoZGF0YV9sZW4gPT0gc2l6ZSAtIGNvcGllZCA/IExEQ19TVE9QIDogMCkpOworCisJCXAtPnNlcWlkID0gKytzZXE7CisKKwkJbGRjZGJnKERBVEEsICJTRU5UIERBVEEgWyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eF1cbiIsCisJCSAgICAgICBwLT50eXBlLAorCQkgICAgICAgcC0+c3R5cGUsCisJCSAgICAgICBwLT5jdHJsLAorCQkgICAgICAgcC0+ZW52LAorCQkgICAgICAgcC0+c2VxaWQpOworCisJCW1lbWNweShkYXRhLCBidWYsIGRhdGFfbGVuKTsKKwkJYnVmICs9IGRhdGFfbGVuOworCQljb3BpZWQgKz0gZGF0YV9sZW47CisKKwkJdGFpbCA9IHR4X2FkdmFuY2UobHAsIHRhaWwpOworCX0KKworCWVyciA9IHNldF90eF90YWlsKGxwLCB0YWlsKTsKKwlpZiAoIWVycikgeworCQlscC0+c25kX254dCA9IHNlcTsKKwkJZXJyID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJ4X2JhZF9zZXEoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY19wYWNrZXQgKnAsCisJCSAgICAgIHN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnKQoreworCWludCBlcnI7CisKKwlpZiAoZmlyc3RfZnJhZykKKwkJbHAtPnJjdl9ueHQgPSBmaXJzdF9mcmFnLT5zZXFpZCAtIDE7CisKKwllcnIgPSBzZW5kX2RhdGFfbmFjayhscCwgcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGxwLT5yeF90YWlsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXRhX2Fja19uYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfcGFja2V0ICpwKQoreworCWlmIChwLT5zdHlwZSAmIExEQ19BQ0spIHsKKwkJaW50IGVyciA9IHByb2Nlc3NfZGF0YV9hY2sobHAsIHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHAtPnN0eXBlICYgTERDX05BQ0spCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZGF0YV93YWl0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGxvbmcgY3VyX2hlYWQpCit7CisJdW5zaWduZWQgbG9uZyBkdW1teTsKKwlpbnQgbGltaXQgPSAxMDAwOworCisJbGRjZGJnKERBVEEsICJEQVRBIFdBSVQgY3VyX2hlYWRbJWx4XSByeF9oZWFkWyVseF0gcnhfdGFpbFslbHhdXG4iLAorCSAgICAgICBjdXJfaGVhZCwgbHAtPnJ4X2hlYWQsIGxwLT5yeF90YWlsKTsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCQkmZHVtbXksCisJCQkJCQkmbHAtPnJ4X3RhaWwsCisJCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCQlpZiAoaHZfZXJyKQorCQkJcmV0dXJuIGxkY19hYm9ydChscCk7CisKKwkJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkJICAgIGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX1JFU0VUVElORykKKwkJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCQlpZiAoY3VyX2hlYWQgIT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWxkY2RiZyhEQVRBLCAiREFUQSBXQUlUIERPTkUgIgorCQkJICAgICAgICJoZWFkWyVseF0gdGFpbFslbHhdIGNoYW5fc3RhdGVbJWx4XVxuIiwKKwkJCSAgICAgICBkdW1teSwgbHAtPnJ4X3RhaWwsIGxwLT5jaGFuX3N0YXRlKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCByeF9zZXRfaGVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJaW50IGVyciA9IF9fc2V0X3J4X2hlYWQobHAsIGhlYWQpOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJbHAtPnJ4X2hlYWQgPSBoZWFkOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2RhdGFfYWNrKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApCit7CisJdW5zaWduZWQgbG9uZyBuZXdfdGFpbDsKKwlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKworCXAgPSBkYXRhX2dldF90eF9wYWNrZXQobHAsICZuZXdfdGFpbCk7CisJaWYgKGxpa2VseShwKSkgeworCQlpbnQgZXJyOworCisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJcC0+dHlwZSA9IExEQ19EQVRBOworCQlwLT5zdHlwZSA9IExEQ19BQ0s7CisJCXAtPmN0cmwgPSAwOworCQlwLT5zZXFpZCA9IGxwLT5zbmRfbnh0ICsgMTsKKwkJcC0+dS5yLmFja2lkID0gbHAtPnJjdl9ueHQ7CisKKwkJZXJyID0gc2VuZF90eF9wYWNrZXQobHAsIHAsIG5ld190YWlsKTsKKwkJaWYgKCFlcnIpCisJCQlscC0+c25kX254dCsrOworCX0KK30KKworc3RhdGljIGludCByZWFkX25vbnJhdyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBsZGNfcGFja2V0ICpmaXJzdF9mcmFnOworCXVuc2lnbmVkIGxvbmcgaHZfZXJyLCBuZXc7CisJaW50IGVyciwgY29waWVkOworCisJaHZfZXJyID0gc3VuNHZfbGRjX3J4X2dldF9zdGF0ZShscC0+aWQsCisJCQkJCSZscC0+cnhfaGVhZCwKKwkJCQkJJmxwLT5yeF90YWlsLAorCQkJCQkmbHAtPmNoYW5fc3RhdGUpOworCWlmIChodl9lcnIpCisJCXJldHVybiBsZGNfYWJvcnQobHApOworCisJaWYgKGxwLT5jaGFuX3N0YXRlID09IExEQ19DSEFOTkVMX0RPV04gfHwKKwkgICAgbHAtPmNoYW5fc3RhdGUgPT0gTERDX0NIQU5ORUxfUkVTRVRUSU5HKQorCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisKKwlpZiAobHAtPnJ4X2hlYWQgPT0gbHAtPnJ4X3RhaWwpCisJCXJldHVybiAwOworCisJZmlyc3RfZnJhZyA9IE5VTEw7CisJY29waWVkID0gZXJyID0gMDsKKwluZXcgPSBscC0+cnhfaGVhZDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbGRjX3BhY2tldCAqcDsKKwkJaW50IHBrdF9sZW47CisKKwkJQlVHX09OKG5ldyA9PSBscC0+cnhfdGFpbCk7CisJCXAgPSBscC0+cnhfYmFzZSArIChuZXcgLyBMRENfUEFDS0VUX1NJWkUpOworCisJCWxkY2RiZyhSWCwgIlJYIHJlYWQgcGt0WyUwMng6JTAyeDolMDJ4OiUwMng6JTA4eDolMDh4XSAiCisJCSAgICAgICAicmN2X254dFslMDh4XVxuIiwKKwkJICAgICAgIHAtPnR5cGUsCisJCSAgICAgICBwLT5zdHlwZSwKKwkJICAgICAgIHAtPmN0cmwsCisJCSAgICAgICBwLT5lbnYsCisJCSAgICAgICBwLT5zZXFpZCwKKwkJICAgICAgIHAtPnUuci5hY2tpZCwKKwkJICAgICAgIGxwLT5yY3Zfbnh0KTsKKworCQlpZiAodW5saWtlbHkoIXJ4X3NlcV9vayhscCwgcC0+c2VxaWQpKSkgeworCQkJZXJyID0gcnhfYmFkX3NlcShscCwgcCwgZmlyc3RfZnJhZyk7CisJCQljb3BpZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocC0+dHlwZSAmIExEQ19DVFJMKSB7CisJCQllcnIgPSBwcm9jZXNzX2NvbnRyb2xfZnJhbWUobHAsIHApOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSAwOworCQl9CisKKwkJbHAtPnJjdl9ueHQgPSBwLT5zZXFpZDsKKworCQlpZiAoIShwLT50eXBlICYgTERDX0RBVEEpKSB7CisJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCQkJZ290byBub19kYXRhOworCQl9CisJCWlmIChwLT5zdHlwZSAmIChMRENfQUNLIHwgTERDX05BQ0spKSB7CisJCQllcnIgPSBkYXRhX2Fja19uYWNrKGxwLCBwKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEocC0+c3R5cGUgJiBMRENfSU5GTykpIHsKKwkJCW5ldyA9IHJ4X2FkdmFuY2UobHAsIG5ldyk7CisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCQlnb3RvIG5vX2RhdGE7CisJCX0KKworCQlwa3RfbGVuID0gcC0+ZW52ICYgTERDX0xFTjsKKworCQkvKiBFdmVyeSBpbml0aWFsIHBhY2tldCBzdGFydHMgd2l0aCB0aGUgU1RBUlQgYml0IHNldC4KKwkJICoKKwkJICogU2luZ2xldG9uIHBhY2tldHMgd2lsbCBoYXZlIGJvdGggU1RBUlQrU1RPUCBzZXQuCisJCSAqCisJCSAqIEZyYWdtZW50cyB3aWxsIGhhdmUgU1RBUlQgc2V0IGluIHRoZSBmaXJzdCBmcmFtZSwgU1RPUAorCQkgKiBzZXQgaW4gdGhlIGxhc3QgZnJhbWUsIGFuZCBuZWl0aGVyIGJpdCBzZXQgaW4gbWlkZGxlCisJCSAqIGZyYW1lcyBvZiB0aGUgcGFja2V0LgorCQkgKgorCQkgKiBUaGVyZWZvcmUgaWYgd2UgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBwYWNrZXQgYW5kCisJCSAqIHdlIGRvbid0IHNlZSBTVEFSVCwgb3Igd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBmcmFnbWVudGVkCisJCSAqIHBhY2tldCBhbmQgZG8gc2VlIFNUQVJULCB3ZSBhcmUgdW5zeW5jaHJvbml6ZWQgYW5kIHNob3VsZAorCQkgKiBmbHVzaCB0aGUgUlggcXVldWUuCisJCSAqLworCQlpZiAoKGZpcnN0X2ZyYWcgPT0gTlVMTCAmJiAhKHAtPmVudiAmIExEQ19TVEFSVCkpIHx8CisJCSAgICAoZmlyc3RfZnJhZyAhPSBOVUxMICYmICAocC0+ZW52ICYgTERDX1NUQVJUKSkpIHsKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQluZXcgPSByeF9hZHZhbmNlKGxwLCBuZXcpOworCisJCQllcnIgPSByeF9zZXRfaGVhZChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCWlmICghZmlyc3RfZnJhZykKKwkJCQlnb3RvIG5vX2RhdGE7CisJCX0KKwkJaWYgKCFmaXJzdF9mcmFnKQorCQkJZmlyc3RfZnJhZyA9IHA7CisKKwkJaWYgKHBrdF9sZW4gPiBzaXplIC0gY29waWVkKSB7CisJCQkvKiBVc2VyIGRpZG4ndCBnaXZlIHVzIGEgYmlnIGVub3VnaCBidWZmZXIsCisJCQkgKiB3aGF0IHRvIGRvPyAgVGhpcyBpcyBhIHByZXR0eSBzZXJpb3VzIGVycm9yLgorCQkJICoKKwkJCSAqIFNpbmNlIHdlIGhhdmVuJ3QgdXBkYXRlZCB0aGUgUlggcmluZyBoZWFkIHRvCisJCQkgKiBjb25zdW1lIGFueSBvZiB0aGUgcGFja2V0cywgc2lnbmFsIHRoZSBlcnJvcgorCQkJICogdG8gdGhlIHVzZXIgYW5kIGp1c3QgbGVhdmUgdGhlIFJYIHJpbmcgYWxvbmUuCisJCQkgKgorCQkJICogVGhpcyBzZWVtcyB0aGUgYmVzdCBiZWhhdmlvciBiZWNhdXNlIHRoaXMgYWxsb3dzCisJCQkgKiBhIHVzZXIgb2YgdGhlIExEQyBsYXllciB0byBzdGFydCB3aXRoIGEgc21hbGwKKwkJCSAqIFJYIGJ1ZmZlciBmb3IgbGRjX3JlYWQoKSBjYWxscyBhbmQgdXNlIC1FTVNHU0laRQorCQkJICogYXMgYSBjdWUgdG8gZW5sYXJnZSBpdCdzIHJlYWQgYnVmZmVyLgorCQkJICovCisJCQllcnIgPSAtRU1TR1NJWkU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9rLCB3ZSBhcmUgZ29ubmEgZWF0IHRoaXMgb25lLiAgKi8KKwkJbmV3ID0gcnhfYWR2YW5jZShscCwgbmV3KTsKKworCQltZW1jcHkoYnVmLAorCQkgICAgICAgKGxwLT5jZmcubW9kZSA9PSBMRENfTU9ERV9VTlJFTElBQkxFID8KKwkJCXAtPnUudV9kYXRhIDogcC0+dS5yLnJfZGF0YSksIHBrdF9sZW4pOworCQlidWYgKz0gcGt0X2xlbjsKKwkJY29waWVkICs9IHBrdF9sZW47CisKKwkJaWYgKHAtPmVudiAmIExEQ19TVE9QKQorCQkJYnJlYWs7CisKK25vX2RhdGE6CisJCWlmIChuZXcgPT0gbHAtPnJ4X3RhaWwpIHsKKwkJCWVyciA9IHJ4X2RhdGFfd2FpdChscCwgbmV3KTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWVycikKKwkJZXJyID0gcnhfc2V0X2hlYWQobHAsIG5ldyk7CisKKwlpZiAoZXJyICYmIGZpcnN0X2ZyYWcpCisJCWxwLT5yY3Zfbnh0ID0gZmlyc3RfZnJhZy0+c2VxaWQgLSAxOworCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gY29waWVkOworCQlpZiAoZXJyID4gMCAmJiBscC0+Y2ZnLm1vZGUgIT0gTERDX01PREVfVU5SRUxJQUJMRSkKKwkJCXNlbmRfZGF0YV9hY2sobHApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGRjX21vZGVfb3BzIG5vbnJhd19vcHMgPSB7CisJLndyaXRlCQk9CXdyaXRlX25vbnJhdywKKwkucmVhZAkJPQlyZWFkX25vbnJhdywKK307CisKK3N0YXRpYyBpbnQgd3JpdGVfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCXVuc2lnbmVkIGludCBzaXplKQoreworCWlmIChzaXplID4gbHAtPmNmZy5tdHUpCisJCXNpemUgPSBscC0+Y2ZnLm10dTsKKwlyZXR1cm4gd3JpdGVfbm9ucmF3KGxwLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IHJlYWRfc3RyZWFtKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKCFscC0+bXNzYnVmX2xlbikgeworCQlpbnQgZXJyID0gcmVhZF9ub25yYXcobHAsIGxwLT5tc3NidWYsIGxwLT5jZmcubXR1KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWxwLT5tc3NidWZfbGVuID0gZXJyOworCQlscC0+bXNzYnVmX29mZiA9IDA7CisJfQorCisJaWYgKHNpemUgPiBscC0+bXNzYnVmX2xlbikKKwkJc2l6ZSA9IGxwLT5tc3NidWZfbGVuOworCW1lbWNweShidWYsIGxwLT5tc3NidWYgKyBscC0+bXNzYnVmX29mZiwgc2l6ZSk7CisKKwlscC0+bXNzYnVmX29mZiArPSBzaXplOworCWxwLT5tc3NidWZfbGVuIC09IHNpemU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZGNfbW9kZV9vcHMgc3RyZWFtX29wcyA9IHsKKwkud3JpdGUJCT0Jd3JpdGVfc3RyZWFtLAorCS5yZWFkCQk9CXJlYWRfc3RyZWFtLAorfTsKKworaW50IGxkY193cml0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+aHNfc3RhdGUgIT0gTERDX0hTX0NPTVBMRVRFKQorCQllcnIgPSAtRU5PVENPTk47CisJZWxzZQorCQllcnIgPSBscC0+bW9wcy0+d3JpdGUobHAsIGJ1Ziwgc2l6ZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3dyaXRlKTsKKworaW50IGxkY19yZWFkKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUpCisJCWVyciA9IC1FTk9UQ09OTjsKKwllbHNlCisJCWVyciA9IGxwLT5tb3BzLT5yZWFkKGxwLCBidWYsIHNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19yZWFkKTsKKworc3RhdGljIGxvbmcgYXJlbmFfYWxsb2Moc3RydWN0IGxkY19pb21tdSAqaW9tbXUsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKQoreworCXN0cnVjdCBpb21tdV9hcmVuYSAqYXJlbmEgPSAmaW9tbXUtPmFyZW5hOworCXVuc2lnbmVkIGxvbmcgbiwgaSwgc3RhcnQsIGVuZCwgbGltaXQ7CisJaW50IHBhc3M7CisKKwlsaW1pdCA9IGFyZW5hLT5saW1pdDsKKwlzdGFydCA9IGFyZW5hLT5oaW50OworCXBhc3MgPSAwOworCithZ2FpbjoKKwluID0gZmluZF9uZXh0X3plcm9fYml0KGFyZW5hLT5tYXAsIGxpbWl0LCBzdGFydCk7CisJZW5kID0gbiArIG5wYWdlczsKKwlpZiAodW5saWtlbHkoZW5kID49IGxpbWl0KSkgeworCQlpZiAobGlrZWx5KHBhc3MgPCAxKSkgeworCQkJbGltaXQgPSBzdGFydDsKKwkJCXN0YXJ0ID0gMDsKKwkJCXBhc3MrKzsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSB7CisJCQkvKiBTY2FubmVkIHRoZSB3aG9sZSB0aGluZywgZ2l2ZSB1cC4gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWZvciAoaSA9IG47IGkgPCBlbmQ7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgYXJlbmEtPm1hcCkpIHsKKwkJCXN0YXJ0ID0gaSArIDE7CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJZm9yIChpID0gbjsgaSA8IGVuZDsgaSsrKQorCQlfX3NldF9iaXQoaSwgYXJlbmEtPm1hcCk7CisKKwlhcmVuYS0+aGludCA9IGVuZDsKKworCXJldHVybiBuOworfQorCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREUJMHhmMDAwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENPT0tJRV9QR1NaX0NPREVfU0hJRlQJNjBVTEwKKworc3RhdGljIHU2NCBwYWdlc2l6ZV9jb2RlKHZvaWQpCit7CisJc3dpdGNoIChQQUdFX1NJWkUpIHsKKwlkZWZhdWx0OgorCWNhc2UgKDhVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDA7CisJY2FzZSAoNjRVTEwgKiAxMDI0VUxMKToKKwkJcmV0dXJuIDE7CisJY2FzZSAoNTEyVUxMICogMTAyNFVMTCk6CisJCXJldHVybiAyOworCWNhc2UgKDRVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiAzOworCWNhc2UgKDMyVUxMICogMTAyNFVMTCAqIDEwMjRVTEwpOgorCQlyZXR1cm4gNDsKKwljYXNlICgyNTZVTEwgKiAxMDI0VUxMICogMTAyNFVMTCk6CisJCXJldHVybiA1OworCX0KK30KKworc3RhdGljIHU2NCBtYWtlX2Nvb2tpZSh1NjQgaW5kZXgsIHU2NCBwZ3N6X2NvZGUsIHU2NCBwYWdlX29mZnNldCkKK3sKKwlyZXR1cm4gKChwZ3N6X2NvZGUgPDwgQ09PS0lFX1BHU1pfQ09ERV9TSElGVCkgfAorCQkoaW5kZXggPDwgUEFHRV9TSElGVCkgfAorCQlwYWdlX29mZnNldCk7Cit9CisKK3N0YXRpYyB1NjQgY29va2llX3RvX2luZGV4KHU2NCBjb29raWUsIHVuc2lnbmVkIGxvbmcgKnNoaWZ0KQoreworCXU2NCBzemNvZGUgPSBjb29raWUgPj4gQ09PS0lFX1BHU1pfQ09ERV9TSElGVDsKKworCWNvb2tpZSAmPSB+Q09PS0lFX1BHU1pfQ09ERTsKKworCSpzaGlmdCA9IHN6Y29kZSAqIDM7CisKKwlyZXR1cm4gKGNvb2tpZSA+PiAoMTNVTEwgKyAoc3pjb2RlICogM1VMTCkpKTsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfbXRhYmxlX2VudHJ5ICphbGxvY19ucGFnZXMoc3RydWN0IGxkY19pb21tdSAqaW9tbXUsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBucGFnZXMpCit7CisJbG9uZyBlbnRyeTsKKworCWVudHJ5ID0gYXJlbmFfYWxsb2MoaW9tbXUsIG5wYWdlcyk7CisJaWYgKHVubGlrZWx5KGVudHJ5IDwgMCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGlvbW11LT5wYWdlX3RhYmxlICsgZW50cnk7Cit9CisKK3N0YXRpYyB1NjQgcGVybV90b19tdGUodW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXU2NCBtdGVfYmFzZTsKKworCW10ZV9iYXNlID0gcGFnZXNpemVfY29kZSgpOworCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9TSEFET1cpIHsKKwkJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQkJbXRlX2Jhc2UgfD0gTERDX01URV9DT1BZX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfQ09QWV9XOworCX0KKwlpZiAobWFwX3Blcm0gJiBMRENfTUFQX0RJUkVDVCkgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX1JFQUQ7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfV1JJVEU7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfWCkKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfRVhFQzsKKwl9CisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9JTykgeworCQlpZiAobWFwX3Blcm0gJiBMRENfTUFQX1IpCisJCQltdGVfYmFzZSB8PSBMRENfTVRFX0lPTU1VX1I7CisJCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJCW10ZV9iYXNlIHw9IExEQ19NVEVfSU9NTVVfVzsKKwl9CisKKwlyZXR1cm4gbXRlX2Jhc2U7Cit9CisKK3N0YXRpYyBpbnQgcGFnZXNfaW5fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgbG9uZyBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBuZXcgPSAoYmFzZSArIFBBR0VfU0laRSkgJiBQQUdFX01BU0s7CisKKwkJbGVuIC09IChuZXcgLSBiYXNlKTsKKwkJYmFzZSA9IG5ldzsKKwkJY291bnQrKzsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RydWN0IGNvb2tpZV9zdGF0ZSB7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkJCSpwYWdlX3RhYmxlOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCQkqY29va2llczsKKwl1NjQJCQkJbXRlX2Jhc2U7CisJdTY0CQkJCXByZXZfY29va2llOworCXUzMgkJCQlwdGVfaWR4OworCXUzMgkJCQluYzsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxfY29va2llcyhzdHJ1Y3QgY29va2llX3N0YXRlICpzcCwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSB1bnNpZ25lZCBsb25nIG9mZiwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJZG8geworCQl1bnNpZ25lZCBsb25nIHRsZW4sIG5ldyA9IHBhICsgUEFHRV9TSVpFOworCQl1NjQgdGhpc19jb29raWU7CisKKwkJc3AtPnBhZ2VfdGFibGVbc3AtPnB0ZV9pZHhdLm10ZSA9IHNwLT5tdGVfYmFzZSB8IHBhOworCisJCXRsZW4gPSBQQUdFX1NJWkU7CisJCWlmIChvZmYpCisJCQl0bGVuID0gUEFHRV9TSVpFIC0gb2ZmOworCQlpZiAodGxlbiA+IGxlbikKKwkJCXRsZW4gPSBsZW47CisKKwkJdGhpc19jb29raWUgPSBtYWtlX2Nvb2tpZShzcC0+cHRlX2lkeCwKKwkJCQkJICBwYWdlc2l6ZV9jb2RlKCksIG9mZik7CisKKwkJb2ZmID0gMDsKKworCQlpZiAodGhpc19jb29raWUgPT0gc3AtPnByZXZfY29va2llKSB7CisJCQlzcC0+Y29va2llc1tzcC0+bmMgLSAxXS5jb29raWVfc2l6ZSArPSB0bGVuOworCQl9IGVsc2UgeworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfYWRkciA9IHRoaXNfY29va2llOworCQkJc3AtPmNvb2tpZXNbc3AtPm5jXS5jb29raWVfc2l6ZSA9IHRsZW47CisJCQlzcC0+bmMrKzsKKwkJfQorCQlzcC0+cHJldl9jb29raWUgPSB0aGlzX2Nvb2tpZSArIHRsZW47CisKKwkJc3AtPnB0ZV9pZHgrKzsKKworCQlsZW4gLT0gdGxlbjsKKwkJcGEgPSBuZXc7CisJfSB3aGlsZSAobGVuID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgc2dfY291bnRfb25lKHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gcGFnZV90b19wZm4oc2ctPnBhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJbG9uZyBsZW4gPSBzZy0+bGVuZ3RoOworCisJaWYgKChzZy0+b2Zmc2V0IHwgbGVuKSAmICg4VUwgLSAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gcGFnZXNfaW5fcmVnaW9uKGJhc2UgKyBzZy0+b2Zmc2V0LCBsZW4pOworfQorCitzdGF0aWMgaW50IHNnX2NvdW50X3BhZ2VzKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2cpCit7CisJaW50IGNvdW50OworCWludCBpOworCisJY291bnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykgeworCQlpbnQgZXJyID0gc2dfY291bnRfb25lKHNnICsgaSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJY291bnQgKz0gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworaW50IGxkY19tYXBfc2coc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG51bV9zZywKKwkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzLCBmbGFnczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKwlzdHJ1Y3QgY29va2llX3N0YXRlIHN0YXRlOworCXN0cnVjdCBsZGNfaW9tbXUgKmlvbW11OworCWludCBlcnI7CisKKwlpZiAobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gc2dfY291bnRfcGFnZXMoc2csIG51bV9zZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlucGFnZXMgPSBlcnI7CisJaWYgKGVyciA+IG5jb29raWVzKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaW9tbXUgPSAmbHAtPmlvbW11OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CisJYmFzZSA9IGFsbG9jX25wYWdlcyhpb21tdSwgbnBhZ2VzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLnBhZ2VfdGFibGUgPSBpb21tdS0+cGFnZV90YWJsZTsKKwlzdGF0ZS5jb29raWVzID0gY29va2llczsKKwlzdGF0ZS5tdGVfYmFzZSA9IHBlcm1fdG9fbXRlKG1hcF9wZXJtKTsKKwlzdGF0ZS5wcmV2X2Nvb2tpZSA9IH4odTY0KTA7CisJc3RhdGUucHRlX2lkeCA9IChiYXNlIC0gaW9tbXUtPnBhZ2VfdGFibGUpOworCXN0YXRlLm5jID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2c7IGkrKykKKwkJZmlsbF9jb29raWVzKCZzdGF0ZSwgcGFnZV90b19wZm4oc2dbaV0ucGFnZSkgPDwgUEFHRV9TSElGVCwKKwkJCSAgICAgc2dbaV0ub2Zmc2V0LCBzZ1tpXS5sZW5ndGgpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NnKTsKKworaW50IGxkY19tYXBfc2luZ2xlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcywKKwkJICAgdW5zaWduZWQgaW50IG1hcF9wZXJtKQoreworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzLCBwYSwgZmxhZ3M7CisJc3RydWN0IGxkY19tdGFibGVfZW50cnkgKmJhc2U7CisJc3RydWN0IGNvb2tpZV9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgbGRjX2lvbW11ICppb21tdTsKKworCWlmICgobWFwX3Blcm0gJiB+TERDX01BUF9BTEwpIHx8IChuY29va2llcyA8IDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhID0gX19wYShidWYpOworCWlmICgocGEgfCBsZW4pICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5wYWdlcyA9IHBhZ2VzX2luX3JlZ2lvbihwYSwgbGVuKTsKKworCWlvbW11ID0gJmxwLT5pb21tdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCWJhc2UgPSBhbGxvY19ucGFnZXMoaW9tbXUsIG5wYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWlmICghYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0ZS5wYWdlX3RhYmxlID0gaW9tbXUtPnBhZ2VfdGFibGU7CisJc3RhdGUuY29va2llcyA9IGNvb2tpZXM7CisJc3RhdGUubXRlX2Jhc2UgPSBwZXJtX3RvX210ZShtYXBfcGVybSk7CisJc3RhdGUucHJldl9jb29raWUgPSB+KHU2NCkwOworCXN0YXRlLnB0ZV9pZHggPSAoYmFzZSAtIGlvbW11LT5wYWdlX3RhYmxlKTsKKwlzdGF0ZS5uYyA9IDA7CisJZmlsbF9jb29raWVzKCZzdGF0ZSwgKHBhICYgUEFHRV9NQVNLKSwgKHBhICYgflBBR0VfTUFTSyksIGxlbik7CisJQlVHX09OKHN0YXRlLm5jICE9IDEpOworCisJcmV0dXJuIHN0YXRlLm5jOworfQorRVhQT1JUX1NZTUJPTChsZGNfbWFwX3NpbmdsZSk7CisKK3N0YXRpYyB2b2lkIGZyZWVfbnBhZ2VzKHVuc2lnbmVkIGxvbmcgaWQsIHN0cnVjdCBsZGNfaW9tbXUgKmlvbW11LAorCQkJdTY0IGNvb2tpZSwgdTY0IHNpemUpCit7CisJc3RydWN0IGlvbW11X2FyZW5hICphcmVuYSA9ICZpb21tdS0+YXJlbmE7CisJdW5zaWduZWQgbG9uZyBpLCBzaGlmdCwgaW5kZXgsIG5wYWdlczsKKwlzdHJ1Y3QgbGRjX210YWJsZV9lbnRyeSAqYmFzZTsKKworCW5wYWdlcyA9IFBBR0VfQUxJR04oKChjb29raWUgJiB+UEFHRV9NQVNLKSArIHNpemUpKSA+PiBQQUdFX1NISUZUOworCWluZGV4ID0gY29va2llX3RvX2luZGV4KGNvb2tpZSwgJnNoaWZ0KTsKKwliYXNlID0gaW9tbXUtPnBhZ2VfdGFibGUgKyBpbmRleDsKKworCUJVR19PTihpbmRleCA+IGFyZW5hLT5saW1pdCB8fAorCSAgICAgICAoaW5kZXggKyBucGFnZXMpID4gYXJlbmEtPmxpbWl0KTsKKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQlpZiAoYmFzZS0+Y29va2llKQorCQkJc3VuNHZfbGRjX3Jldm9rZShpZCwgY29va2llICsgKGkgPDwgc2hpZnQpLAorCQkJCQkgYmFzZS0+Y29va2llKTsKKwkJYmFzZS0+bXRlID0gMDsKKwkJX19jbGVhcl9iaXQoaW5kZXggKyBpLCBhcmVuYS0+bWFwKTsKKwl9Cit9CisKK3ZvaWQgbGRjX3VubWFwKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCSAgICAgICBpbnQgbmNvb2tpZXMpCit7CisJc3RydWN0IGxkY19pb21tdSAqaW9tbXUgPSAmbHAtPmlvbW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmNvb2tpZXM7IGkrKykgeworCQl1NjQgYWRkciA9IGNvb2tpZXNbaV0uY29va2llX2FkZHI7CisJCXU2NCBzaXplID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKworCQlmcmVlX25wYWdlcyhscC0+aWQsIGlvbW11LCBhZGRyLCBzaXplKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobGRjX3VubWFwKTsKKworaW50IGxkY19jb3B5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIGludCBjb3B5X2RpciwKKwkgICAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCXVuc2lnbmVkIGludCBvcmlnX2xlbjsKKwl1bnNpZ25lZCBsb25nIHJhOworCWludCBpOworCisJaWYgKGNvcHlfZGlyICE9IExEQ19DT1BZX0lOICYmIGNvcHlfZGlyICE9IExEQ19DT1BZX09VVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBCYWQgY29weV9kaXJbJWRdXG4iLAorCQkgICAgICAgbHAtPmlkLCBjb3B5X2Rpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJhID0gX19wYShidWYpOworCWlmICgocmEgfCBsZW4gfCBvZmZzZXQpICYgKDhVTCAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImxkY19jb3B5OiBJRFslbHVdIFVuYWxpZ25lZCBidWZmZXIgIgorCQkgICAgICAgInJhWyVseF0gbGVuWyV4XSBvZmZzZXRbJWx4XVxuIiwKKwkJICAgICAgIGxwLT5pZCwgcmEsIGxlbiwgb2Zmc2V0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJsZGNfY29weTogSURbJWx1XSBMaW5rIGRvd24gaHNfc3RhdGVbJXhdICIKKwkJICAgICAgICJmbGFnc1sleF1cbiIsIGxwLT5pZCwgbHAtPmhzX3N0YXRlLCBscC0+ZmxhZ3MpOworCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJfQorCisJb3JpZ19sZW4gPSBsZW47CisJZm9yIChpID0gMDsgaSA8IG5jb29raWVzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBjb29raWVfcmFkZHIgPSBjb29raWVzW2ldLmNvb2tpZV9hZGRyOworCQl1bnNpZ25lZCBsb25nIHRoaXNfbGVuID0gY29va2llc1tpXS5jb29raWVfc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBhY3R1YWxfbGVuOworCisJCWlmICh1bmxpa2VseShvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBsb25nIHRoaXNfb2ZmID0gb2Zmc2V0OworCisJCQlpZiAodGhpc19vZmYgPiB0aGlzX2xlbikKKwkJCQl0aGlzX29mZiA9IHRoaXNfbGVuOworCisJCQlvZmZzZXQgLT0gdGhpc19vZmY7CisJCQl0aGlzX2xlbiAtPSB0aGlzX29mZjsKKwkJCWlmICghdGhpc19sZW4pCisJCQkJY29udGludWU7CisJCQljb29raWVfcmFkZHIgKz0gdGhpc19vZmY7CisJCX0KKworCQlpZiAodGhpc19sZW4gPiBsZW4pCisJCQl0aGlzX2xlbiA9IGxlbjsKKworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwkJCWh2X2VyciA9IHN1bjR2X2xkY19jb3B5KGxwLT5pZCwgY29weV9kaXIsCisJCQkJCQljb29raWVfcmFkZHIsIHJhLAorCQkJCQkJdGhpc19sZW4sICZhY3R1YWxfbGVuKTsKKwkJCWlmICh1bmxpa2VseShodl9lcnIpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX2NvcHk6IElEWyVsdV0gIgorCQkJCSAgICAgICAiSFYgZXJyb3IgJWx1XG4iLAorCQkJCSAgICAgICBscC0+aWQsIGh2X2Vycik7CisJCQkJaWYgKGxwLT5oc19zdGF0ZSAhPSBMRENfSFNfQ09NUExFVEUgfHwKKwkJCQkgICAgKGxwLT5mbGFncyAmIExEQ19GTEFHX1JFU0VUKSkKKwkJCQkJcmV0dXJuIC1FQ09OTlJFU0VUOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKwkJCWNvb2tpZV9yYWRkciArPSBhY3R1YWxfbGVuOworCQkJcmEgKz0gYWN0dWFsX2xlbjsKKwkJCWxlbiAtPSBhY3R1YWxfbGVuOworCQkJaWYgKGFjdHVhbF9sZW4gPT0gdGhpc19sZW4pCisJCQkJYnJlYWs7CisKKwkJCXRoaXNfbGVuIC09IGFjdHVhbF9sZW47CisJCX0KKworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCX0KKworCS8qIEl0IGlzIGNhbGxlciBwb2xpY3kgd2hhdCB0byBkbyBhYm91dCBzaG9ydCBjb3BpZXMuCisJICogRm9yIGV4YW1wbGUsIGEgbmV0d29ya2luZyBkcml2ZXIgY2FuIGRlY2xhcmUgdGhlCisJICogcGFja2V0IGEgcnVudCBhbmQgZHJvcCBpdC4KKwkgKi8KKworCXJldHVybiBvcmlnX2xlbiAtIGxlbjsKK30KK0VYUE9SVF9TWU1CT0wobGRjX2NvcHkpOworCit2b2lkICpsZGNfYWxsb2NfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgKm5jb29raWVzLAorCQkJICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pCit7CisJdm9pZCAqYnVmOworCWludCBlcnI7CisKKwlpZiAobGVuICYgKDhVTCAtIDEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWJ1ZiA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSBsZGNfbWFwX3NpbmdsZShscCwgYnVmLCBsZW4sIGNvb2tpZXMsICpuY29va2llcywgbWFwX3Blcm0pOworCWlmIChlcnIgPCAwKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCSpuY29va2llcyA9IGVycjsKKworCXJldHVybiBidWY7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19hbGxvY19leHBfZHJpbmcpOworCit2b2lkIGxkY19mcmVlX2V4cF9kcmluZyhzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCQlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCWxkY191bm1hcChscCwgY29va2llcywgbmNvb2tpZXMpOworCWtmcmVlKGJ1Zik7Cit9CitFWFBPUlRfU1lNQk9MKGxkY19mcmVlX2V4cF9kcmluZyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxkY19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtYWpvciwgbWlub3I7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJY29uc3QgdTY0ICp2OworCXU2NCBtcDsKKworCWhwID0gbWRlc2NfZ3JhYigpOworCWlmICghaHApCisJCXJldHVybiAtRU5PREVWOworCisJbXAgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgInBsYXRmb3JtIik7CisJaWYgKG1wID09IE1ERVNDX05PREVfTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRvbWFpbmluZy1lbmFibGVkIiwgTlVMTCk7CisJaWYgKCF2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1ham9yID0gMTsKKwltaW5vciA9IDA7CisJaWYgKHN1bjR2X2h2YXBpX3JlZ2lzdGVyKEhWX0dSUF9MRE9NLCBtYWpvciwgJm1pbm9yKSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyIExET00gaHZhcGkuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWlmICghKnYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkRvbWFpbmluZyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbGRvbV9kb21haW5pbmdfZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChsZGNfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKaW5kZXggZjBlMTYwNDUuLmRlNTMxMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvbWRlc2MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL21kZXNjLmMKQEAgLTYsNiArNiw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CkBAIC0yOSw3ICszMiw3IEBACiAJdTMyCW5vZGVfc3o7IC8qIG5vZGUgYmxvY2sgc2l6ZSAqLwogCXUzMgluYW1lX3N6OyAvKiBuYW1lIGJsb2NrIHNpemUgKi8KIAl1MzIJZGF0YV9zejsgLyogZGF0YSBibG9jayBzaXplICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwogCiBzdHJ1Y3QgbWRlc2NfZWxlbSB7CiAJdTgJdGFnOwpAQCAtNTMsMzA2ICs1NiwzOTYgQEAKIAl9IGQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX2hkciAqbWFpbl9tZGVzYzsKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqYWxsbm9kZXM7CitzdHJ1Y3QgbWRlc2NfbWVtX29wcyB7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqKCphbGxvYykodW5zaWduZWQgaW50IG1kZXNjX3NpemUpOworCXZvaWQgKCpmcmVlKShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpoYW5kbGUpOworfTsKIAotc3RhdGljIHN0cnVjdCBtZGVzY19ub2RlICphbGxub2Rlc190YWlsOwotc3RhdGljIHVuc2lnbmVkIGludCB1bmlxdWVfaWQ7CitzdHJ1Y3QgbWRlc2NfaGFuZGxlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IG1kZXNjX21lbV9vcHMJKm1vcHM7CisJdm9pZAkJCSpzZWxmX2Jhc2U7CisJYXRvbWljX3QJCXJlZmNudDsKKwl1bnNpZ25lZCBpbnQJCWhhbmRsZV9zaXplOworCXN0cnVjdCBtZGVzY19oZHIJbWRlc2M7Cit9OwogCi1zdGF0aWMgc3RydWN0IG1kZXNjX25vZGUgKiptZGVzY19oYXNoOwotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19oYXNoX3NpemU7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5vZGVfaGFzaGZuKHU2NCBub2RlKQorc3RhdGljIHZvaWQgbWRlc2NfaGFuZGxlX2luaXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsCisJCQkgICAgICB2b2lkICpiYXNlKQogewotCXJldHVybiAoKHVuc2lnbmVkIGludCkgKG5vZGUgXiAobm9kZSA+PiA4KSBeIChub2RlID4+IDE2KSkpCi0JCSYgKG1kZXNjX2hhc2hfc2l6ZSAtIDEpOworCUJVR19PTigoKHVuc2lnbmVkIGxvbmcpJmhwLT5tZGVzYykgJiAoMTZVTCAtIDEpKTsKKworCW1lbXNldChocCwgMCwgaGFuZGxlX3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZocC0+bGlzdCk7CisJaHAtPnNlbGZfYmFzZSA9IGJhc2U7CisJYXRvbWljX3NldCgmaHAtPnJlZmNudCwgMSk7CisJaHAtPmhhbmRsZV9zaXplID0gaGFuZGxlX3NpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX25vZGUoc3RydWN0IG1kZXNjX25vZGUgKm1wKQorc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2Jvb3RtZW1fYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKipoZWFkID0gJm1kZXNjX2hhc2hbbm9kZV9oYXNoZm4obXAtPm5vZGUpXTsKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemUsIGFsbG9jX3NpemU7CiAKLQltcC0+aGFzaF9uZXh0ID0gKmhlYWQ7Ci0JKmhlYWQgPSBtcDsKKwloYW5kbGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IG1kZXNjX2hhbmRsZSkgLQorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZGVzY19oZHIpICsKKwkJICAgICAgIG1kZXNjX3NpemUpOworCWFsbG9jX3NpemUgPSBQQUdFX0FMSUdOKGhhbmRsZV9zaXplKTsKIAotCWlmIChhbGxub2Rlc190YWlsKSB7Ci0JCWFsbG5vZGVzX3RhaWwtPmFsbG5vZGVzX25leHQgPSBtcDsKLQkJYWxsbm9kZXNfdGFpbCA9IG1wOwotCX0gZWxzZSB7Ci0JCWFsbG5vZGVzID0gYWxsbm9kZXNfdGFpbCA9IG1wOworCWhwID0gX19hbGxvY19ib290bWVtKGFsbG9jX3NpemUsIFBBR0VfU0laRSwgMFVMKTsKKwlpZiAoaHApCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgaHApOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19ib290bWVtX2ZyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCit7CisJdW5zaWduZWQgaW50IGFsbG9jX3NpemUsIGhhbmRsZV9zaXplID0gaHAtPmhhbmRsZV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOworCisJYWxsb2Nfc2l6ZSA9IFBBR0VfQUxJR04oaGFuZGxlX3NpemUpOworCisJc3RhcnQgPSAodW5zaWduZWQgbG9uZykgaHA7CisJZW5kID0gc3RhcnQgKyBhbGxvY19zaXplOworCisJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCXN0cnVjdCBwYWdlICpwOworCisJCXAgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnQpOworCQlDbGVhclBhZ2VSZXNlcnZlZChwKTsKKwkJX19mcmVlX3BhZ2UocCk7CisJCXN0YXJ0ICs9IFBBR0VfU0laRTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWRlc2Nfbm9kZSAqZmluZF9ub2RlKHU2NCBub2RlKQorc3RhdGljIHN0cnVjdCBtZGVzY19tZW1fb3BzIGJvb3RtZW1fbWRlc2NfbWVtb3BzID0geworCS5hbGxvYyA9IG1kZXNjX2Jvb3RtZW1fYWxsb2MsCisJLmZyZWUgID0gbWRlc2NfYm9vdG1lbV9mcmVlLAorfTsKKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2ttYWxsb2ModW5zaWduZWQgaW50IG1kZXNjX3NpemUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wID0gbWRlc2NfaGFzaFtub2RlX2hhc2hmbihub2RlKV07CisJdW5zaWduZWQgaW50IGhhbmRsZV9zaXplOworCXZvaWQgKmJhc2U7CiAKLQl3aGlsZSAobXApIHsKLQkJaWYgKG1wLT5ub2RlID09IG5vZGUpCi0JCQlyZXR1cm4gbXA7CisJaGFuZGxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBtZGVzY19oYW5kbGUpIC0KKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWRlc2NfaGRyKSArCisJCSAgICAgICBtZGVzY19zaXplKTsKIAotCQltcCA9IG1wLT5oYXNoX25leHQ7CisJYmFzZSA9IGttYWxsb2MoaGFuZGxlX3NpemUgKyAxNSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJhc2UpIHsKKwkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwkJYWRkciA9IChhZGRyICsgMTVVTCkgJiB+MTVVTDsKKwkJaHAgPSAoc3RydWN0IG1kZXNjX2hhbmRsZSAqKSBhZGRyOworCisJCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgYmFzZSk7CisJCXJldHVybiBocDsKIAl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IHByb3BlcnR5ICptZF9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICBpbnQgKmxlbnApCitzdGF0aWMgdm9pZCBtZGVzY19rZnJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCkKIHsKLQlzdHJ1Y3QgcHJvcGVydHkgKnBwOworCUJVR19PTihhdG9taWNfcmVhZCgmaHAtPnJlZmNudCkgIT0gMCk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZocC0+bGlzdCkpOwogCi0JZm9yIChwcCA9IG1wLT5wcm9wZXJ0aWVzOyBwcCAhPSAwOyBwcCA9IHBwLT5uZXh0KSB7Ci0JCWlmIChzdHJjYXNlY21wKHBwLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobGVucCkKLQkJCQkqbGVucCA9IHBwLT5sZW5ndGg7Ci0JCQlicmVhazsKLQkJfQorCWtmcmVlKGhwLT5zZWxmX2Jhc2UpOworfQorCitzdGF0aWMgc3RydWN0IG1kZXNjX21lbV9vcHMga21hbGxvY19tZGVzY19tZW1vcHMgPSB7CisJLmFsbG9jID0gbWRlc2Nfa21hbGxvYywKKwkuZnJlZSAgPSBtZGVzY19rZnJlZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZGVzY19hbGxvYyh1bnNpZ25lZCBpbnQgbWRlc2Nfc2l6ZSwKKwkJCQkJc3RydWN0IG1kZXNjX21lbV9vcHMgKm1vcHMpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtb3BzLT5hbGxvYyhtZGVzY19zaXplKTsKKworCWlmIChocCkKKwkJaHAtPm1vcHMgPSBtb3BzOworCisJcmV0dXJuIGhwOworfQorCitzdGF0aWMgdm9pZCBtZGVzY19mcmVlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCWhwLT5tb3BzLT5mcmVlKGhwKTsKK30KKworc3RhdGljIHN0cnVjdCBtZGVzY19oYW5kbGUgKmN1cl9tZGVzYzsKK3N0YXRpYyBMSVNUX0hFQUQobWRlc2Nfem9tYmllX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtZGVzY19sb2NrKTsKKworc3RydWN0IG1kZXNjX2hhbmRsZSAqbWRlc2NfZ3JhYih2b2lkKQoreworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWhwID0gY3VyX21kZXNjOworCWlmIChocCkKKwkJYXRvbWljX2luYygmaHAtPnJlZmNudCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGhwOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19ncmFiKTsKKwordm9pZCBtZGVzY19yZWxlYXNlKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRlc2NfbG9jaywgZmxhZ3MpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZocC0+cmVmY250KSkgeworCQlsaXN0X2RlbF9pbml0KCZocC0+bGlzdCk7CisJCWhwLT5tb3BzLT5mcmVlKGhwKTsKIAl9Ci0JcmV0dXJuIHBwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXNjX2xvY2ssIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0wobWRfZmluZF9wcm9wZXJ0eSk7CitFWFBPUlRfU1lNQk9MKG1kZXNjX3JlbGVhc2UpOwogCi0vKgotICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKLSAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgotICovCi1jb25zdCB2b2lkICptZF9nZXRfcHJvcGVydHkoY29uc3Qgc3RydWN0IG1kZXNjX25vZGUgKm1wLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIGludCAqbGVucCkKK3ZvaWQgbWRlc2NfdXBkYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpwcCA9IG1kX2ZpbmRfcHJvcGVydHkobXAsIG5hbWUsIGxlbnApOwotCXJldHVybiBwcCA/IHBwLT52YWx1ZSA6IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2dldF9wcm9wZXJ0eSk7CisJdW5zaWduZWQgbG9uZyBsZW4sIHJlYWxfbGVuLCBzdGF0dXM7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsICpvcmlnX2hwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLXN0cnVjdCBtZGVzY19ub2RlICptZF9maW5kX25vZGVfYnlfbmFtZShzdHJ1Y3QgbWRlc2Nfbm9kZSAqZnJvbSwKLQkJCQkJY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7CisJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKLQltcCA9IGZyb20gPyBmcm9tLT5hbGxub2Rlc19uZXh0IDogYWxsbm9kZXM7Ci0JZm9yICg7IG1wICE9IE5VTEw7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJaWYgKHN0cmNtcChtcC0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbXA7Ci19Ci1FWFBPUlRfU1lNQk9MKG1kX2ZpbmRfbm9kZV9ieV9uYW1lKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBtZGVzY19lYXJseV9hbGxvY2F0ZWQ7Ci0KLXN0YXRpYyB2b2lkICogX19pbml0IG1kZXNjX2Vhcmx5X2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2b2lkICpyZXQ7Ci0KLQlyZXQgPSBfX2FsbG9jX2Jvb3RtZW0oc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCAwVUwpOwotCWlmIChyZXQgPT0gTlVMTCkgewotCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBzaXplKTsKLQkJcHJvbV9oYWx0KCk7CisJaHAgPSBtZGVzY19hbGxvYyhsZW4sICZrbWFsbG9jX21kZXNjX21lbW9wcyk7CisJaWYgKCFocCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyBhbGxvYyBmYWlsc1xuIik7CisJCXJldHVybjsKIAl9CiAKLQltZW1zZXQocmV0LCAwLCBzaXplKTsKLQotCW1kZXNjX2Vhcmx5X2FsbG9jYXRlZCArPSBzaXplOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgY291bnRfYXJjcyhzdHJ1Y3QgbWRlc2NfZWxlbSAqZXApCi17Ci0JdW5zaWduZWQgaW50IHJldCA9IDA7Ci0KLQllcCsrOwotCXdoaWxlIChlcC0+dGFnICE9IE1EX05PREVfRU5EKSB7Ci0JCWlmIChlcC0+dGFnID09IE1EX1BST1BfQVJDKQotCQkJcmV0Kys7Ci0JCWVwKys7CisJc3RhdHVzID0gc3VuNHZfbWFjaF9kZXNjKF9fcGEoJmhwLT5tZGVzYyksIGxlbiwgJnJlYWxfbGVuKTsKKwlpZiAoc3RhdHVzICE9IEhWX0VPSyB8fCByZWFsX2xlbiA+IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgIk1EOiBtZGVzYyByZXJlYWQgZmFpbHMgd2l0aCAlbHVcbiIsCisJCSAgICAgICBzdGF0dXMpOworCQlhdG9taWNfZGVjKCZocC0+cmVmY250KTsKKwkJbWRlc2NfZnJlZShocCk7CisJCXJldHVybjsKIAl9Ci0JcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGVzY19sb2NrLCBmbGFncyk7CisJb3JpZ19ocCA9IGN1cl9tZGVzYzsKKwljdXJfbWRlc2MgPSBocDsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvcmlnX2hwLT5yZWZjbnQpKQorCQltZGVzY19mcmVlKG9yaWdfaHApOworCWVsc2UKKwkJbGlzdF9hZGQoJm9yaWdfaHAtPmxpc3QsICZtZGVzY196b21iaWVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRlc2NfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWRlc2Nfbm9kZV9hbGxvYyh1NjQgbm9kZSwgc3RydWN0IG1kZXNjX2VsZW0gKmVwLCBjb25zdCBjaGFyICpuYW1lcykKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2FyY3MgPSBjb3VudF9hcmNzKGVwKTsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0KLQltcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqbXApICsKLQkJCSAgICAgICAobnVtX2FyY3MgKiBzaXplb2Yoc3RydWN0IG1kZXNjX2FyYykpKTsKLQltcC0+bmFtZSA9IG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCW1wLT5ub2RlID0gbm9kZTsKLQltcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JbXAtPm51bV9hcmNzID0gbnVtX2FyY3M7Ci0KLQloYXNoX25vZGUobXApOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQorc3RhdGljIHN0cnVjdCBtZGVzY19lbGVtICpub2RlX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoc3RydWN0IG1kZXNjX2VsZW0gKikgKG1kZXNjICsgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqbmFtZV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpuYW1lX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbm9kZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5vZGVfc3o7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZGF0YV9ibG9jayhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKK3N0YXRpYyB2b2lkICpkYXRhX2Jsb2NrKHN0cnVjdCBtZGVzY19oZHIgKm1kZXNjKQogewogCXJldHVybiAoKHZvaWQgKikgbmFtZV9ibG9jayhtZGVzYykpICsgbWRlc2MtPm5hbWVfc3o7CiB9CiAKLS8qIEluIG9yZGVyIHRvIGF2b2lkIHJlY3Vyc2lvbiAodGhlIGdyYXBoIGNhbiBiZSB2ZXJ5IGRlZXApIHdlIHVzZSBhCi0gKiB0d28gcGFzcyBhbGdvcml0aG0uICBGaXJzdCB3ZSBhbGxvY2F0ZSBhbGwgdGhlIG5vZGVzIGFuZCBoYXNoIHRoZW0uCi0gKiBUaGVuIHdlIGl0ZXJhdGUgb3ZlciBlYWNoIG5vZGUsIGZpbGxpbmcgaW4gdGhlIGFyY3MgYW5kIHByb3BlcnRpZXMuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBidWlsZF9hbGxfbm9kZXMoc3RydWN0IG1kZXNjX2hkciAqbWRlc2MpCit1NjQgbWRlc2Nfbm9kZV9ieV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkgICAgICAgdTY0IGZyb21fbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgbWRlc2NfZWxlbSAqc3RhcnQsICplcDsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXA7Ci0JY29uc3QgY2hhciAqbmFtZXM7Ci0Jdm9pZCAqZGF0YTsKLQl1NjQgbGFzdF9ub2RlOworCXN0cnVjdCBtZGVzY19lbGVtICplcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisJY29uc3QgY2hhciAqbmFtZXMgPSBuYW1lX2Jsb2NrKCZocC0+bWRlc2MpOworCXU2NCBsYXN0X25vZGUgPSBocC0+bWRlc2Mubm9kZV9zeiAvIDE2OworCXU2NCByZXQ7CiAKLQlzdGFydCA9IGVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0JbGFzdF9ub2RlID0gbWRlc2MtPm5vZGVfc3ogLyAxNjsKKwlpZiAoZnJvbV9ub2RlID09IE1ERVNDX05PREVfTlVMTCkgeworCQlyZXQgPSBmcm9tX25vZGUgPSAwOworCX0gZWxzZSBpZiAoZnJvbV9ub2RlID49IGxhc3Rfbm9kZSkgeworCQlyZXR1cm4gTURFU0NfTk9ERV9OVUxMOworCX0gZWxzZSB7CisJCXJldCA9IGVwW2Zyb21fbm9kZV0uZC52YWw7CisJfQogCi0JbmFtZXMgPSBuYW1lX2Jsb2NrKG1kZXNjKTsKKwl3aGlsZSAocmV0IDwgbGFzdF9ub2RlKSB7CisJCWlmIChlcFtyZXRdLnRhZyAhPSBNRF9OT0RFKQorCQkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKwkJaWYgKCFzdHJjbXAobmFtZXMgKyBlcFtyZXRdLm5hbWVfb2Zmc2V0LCBuYW1lKSkKKwkJCWJyZWFrOworCQlyZXQgPSBlcFtyZXRdLmQudmFsOworCX0KKwlpZiAocmV0ID49IGxhc3Rfbm9kZSkKKwkJcmV0ID0gTURFU0NfTk9ERV9OVUxMOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25vZGVfYnlfbmFtZSk7CiAKLQl3aGlsZSAoMSkgewotCQl1NjQgbm9kZSA9IGVwIC0gc3RhcnQ7Citjb25zdCB2b2lkICptZGVzY19nZXRfcHJvcGVydHkoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqbGVucCkKK3sKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisJdm9pZCAqZGF0YSA9IGRhdGFfYmxvY2soJmhwLT5tZGVzYyk7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwOwogCi0JCWlmIChlcC0+dGFnID09IE1EX0xJU1RfRU5EKQorCWlmIChub2RlID09IE1ERVNDX05PREVfTlVMTCB8fCBub2RlID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwllcCA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYykgKyBub2RlOworCWVwKys7CisJZm9yICg7IGVwLT50YWcgIT0gTURfTk9ERV9FTkQ7IGVwKyspIHsKKwkJdm9pZCAqdmFsID0gTlVMTDsKKwkJaW50IGxlbiA9IDA7CisKKwkJc3dpdGNoIChlcC0+dGFnKSB7CisJCWNhc2UgTURfUFJPUF9WQUw6CisJCQl2YWwgPSAmZXAtPmQudmFsOworCQkJbGVuID0gODsKIAkJCWJyZWFrOwogCi0JCWlmIChlcC0+dGFnICE9IE1EX05PREUpIHsKLQkJCXByb21fcHJpbnRmKCJNREVTQzogSW5jb25zaXN0ZW50IGVsZW1lbnQgbGlzdC5cbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KKwkJY2FzZSBNRF9QUk9QX1NUUjoKKwkJY2FzZSBNRF9QUk9QX0RBVEE6CisJCQl2YWwgPSBkYXRhICsgZXAtPmQuZGF0YS5kYXRhX29mZnNldDsKKwkJCWxlbiA9IGVwLT5kLmRhdGEuZGF0YV9sZW47CisJCQlicmVhazsKIAotCQltZGVzY19ub2RlX2FsbG9jKG5vZGUsIGVwLCBuYW1lcyk7Ci0KLQkJaWYgKGVwLT5kLnZhbCA+PSBsYXN0X25vZGUpIHsKLQkJCXByaW50aygiTURFU0M6IFdhcm5pbmcsIGVhcmx5IGJyZWFrIG91dCBvZiBub2RlIHNjYW4uXG4iKTsKLQkJCXByaW50aygiTURFU0M6IE5leHQgbm9kZSBbJWx1XSBsYXN0X25vZGUgWyVsdV0uXG4iLAotCQkJICAgICAgIG5vZGUsIGxhc3Rfbm9kZSk7CisJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQorCQlpZiAoIXZhbCkKKwkJCWNvbnRpbnVlOwogCi0JCWVwID0gc3RhcnQgKyBlcC0+ZC52YWw7Ci0JfQotCi0JZGF0YSA9IGRhdGFfYmxvY2sobWRlc2MpOwotCWZvciAobXAgPSBhbGxub2RlczsgbXA7IG1wID0gbXAtPmFsbG5vZGVzX25leHQpIHsKLQkJc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gc3RhcnQgKyBtcC0+bm9kZTsKLQkJc3RydWN0IHByb3BlcnR5ICoqbGluayA9ICZtcC0+cHJvcGVydGllczsKLQkJdW5zaWduZWQgaW50IHRoaXNfYXJjID0gMDsKLQotCQllcCsrOwotCQl3aGlsZSAoZXAtPnRhZyAhPSBNRF9OT0RFX0VORCkgewotCQkJc3dpdGNoIChlcC0+dGFnKSB7Ci0JCQljYXNlIE1EX1BST1BfQVJDOiB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKnRhcmdldDsKLQotCQkJCWlmICh0aGlzX2FyYyA+PSBtcC0+bnVtX2FyY3MpIHsKLQkJCQkJcHJvbV9wcmludGYoIk1ERVNDOiBBUkMgb3ZlcnJ1biBbJXU6JXVdXG4iLAotCQkJCQkJICAgIHRoaXNfYXJjLCBtcC0+bnVtX2FyY3MpOwotCQkJCQlwcm9tX2hhbHQoKTsKLQkJCQl9Ci0JCQkJdGFyZ2V0ID0gZmluZF9ub2RlKGVwLT5kLnZhbCk7Ci0JCQkJaWYgKCF0YXJnZXQpIHsKLQkJCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgYXJjIHBvaW50cyB0byAiCi0JCQkJCSAgICAgICAibWlzc2luZyBub2RlLCBpZ25vcmluZy5cbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbXAtPmFyY3NbdGhpc19hcmNdLm5hbWUgPQotCQkJCQkobmFtZXMgKyBlcC0+bmFtZV9vZmZzZXQpOwotCQkJCW1wLT5hcmNzW3RoaXNfYXJjXS5hcmMgPSB0YXJnZXQ7Ci0JCQkJdGhpc19hcmMrKzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZSBNRF9QUk9QX1ZBTDoKLQkJCWNhc2UgTURfUFJPUF9TVFI6Ci0JCQljYXNlIE1EX1BST1BfREFUQTogewotCQkJCXN0cnVjdCBwcm9wZXJ0eSAqcCA9IG1kZXNjX2Vhcmx5X2FsbG9jKHNpemVvZigqcCkpOwotCi0JCQkJcC0+dW5pcXVlX2lkID0gdW5pcXVlX2lkKys7Ci0JCQkJcC0+bmFtZSA9IChjaGFyICopIG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0OwotCQkJCWlmIChlcC0+dGFnID09IE1EX1BST1BfVkFMKSB7Ci0JCQkJCXAtPnZhbHVlID0gJmVwLT5kLnZhbDsKLQkJCQkJcC0+bGVuZ3RoID0gODsKLQkJCQl9IGVsc2UgewotCQkJCQlwLT52YWx1ZSA9IGRhdGEgKyBlcC0+ZC5kYXRhLmRhdGFfb2Zmc2V0OwotCQkJCQlwLT5sZW5ndGggPSBlcC0+ZC5kYXRhLmRhdGFfbGVuOwotCQkJCX0KLQkJCQkqbGluayA9IHA7Ci0JCQkJbGluayA9ICZwLT5uZXh0OwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlIE1EX05PT1A6Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCJNREVTQzogV2FybmluZywgaWdub3JpbmcgdW5rbm93biB0YWcgdHlwZSAlMDJ4XG4iLAotCQkJCSAgICAgICBlcC0+dGFnKTsKLQkJCX0KLQkJCWVwKys7CisJCWlmICghc3RyY21wKG5hbWVzICsgZXAtPm5hbWVfb2Zmc2V0LCBuYW1lKSkgeworCQkJaWYgKGxlbnApCisJCQkJKmxlbnAgPSBsZW47CisJCQlyZXR1cm4gdmFsOwogCQl9CiAJfQotfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBjb3VudF9ub2RlcyhzdHJ1Y3QgbWRlc2NfaGRyICptZGVzYykKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2NfZ2V0X3Byb3BlcnR5KTsKKwordTY0IG1kZXNjX25leHRfYXJjKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgZnJvbSwgY29uc3QgY2hhciAqYXJjX3R5cGUpCiB7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVwID0gbm9kZV9ibG9jayhtZGVzYyk7Ci0Jc3RydWN0IG1kZXNjX2VsZW0gKmVuZDsKLQl1bnNpZ25lZCBpbnQgY250ID0gMDsKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CiAKLQllbmQgPSAoKHZvaWQgKillcCkgKyBtZGVzYy0+bm9kZV9zejsKLQl3aGlsZSAoZXAgPCBlbmQpIHsKLQkJaWYgKGVwLT50YWcgPT0gTURfTk9ERSkKLQkJCWNudCsrOwotCQllcCsrOworCWlmIChmcm9tID09IE1ERVNDX05PREVfTlVMTCB8fCBmcm9tID49IGxhc3Rfbm9kZSkKKwkJcmV0dXJuIE1ERVNDX05PREVfTlVMTDsKKworCWVwID0gYmFzZSArIGZyb207CisKKwllcCsrOworCWZvciAoOyBlcC0+dGFnICE9IE1EX05PREVfRU5EOyBlcCsrKSB7CisJCWlmIChlcC0+dGFnICE9IE1EX1BST1BfQVJDKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lcyArIGVwLT5uYW1lX29mZnNldCwgYXJjX3R5cGUpKQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIGVwIC0gYmFzZTsKIAl9Ci0JcmV0dXJuIGNudDsKKworCXJldHVybiBNREVTQ19OT0RFX05VTEw7CiB9CitFWFBPUlRfU1lNQk9MKG1kZXNjX25leHRfYXJjKTsKKwordTY0IG1kZXNjX2FyY190YXJnZXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBhcmMpCit7CisJc3RydWN0IG1kZXNjX2VsZW0gKmVwLCAqYmFzZSA9IG5vZGVfYmxvY2soJmhwLT5tZGVzYyk7CisKKwllcCA9IGJhc2UgKyBhcmM7CisKKwlyZXR1cm4gZXAtPmQudmFsOworfQorRVhQT1JUX1NZTUJPTChtZGVzY19hcmNfdGFyZ2V0KTsKKworY29uc3QgY2hhciAqbWRlc2Nfbm9kZV9uYW1lKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbm9kZSkKK3sKKwlzdHJ1Y3QgbWRlc2NfZWxlbSAqZXAsICpiYXNlID0gbm9kZV9ibG9jaygmaHAtPm1kZXNjKTsKKwljb25zdCBjaGFyICpuYW1lcyA9IG5hbWVfYmxvY2soJmhwLT5tZGVzYyk7CisJdTY0IGxhc3Rfbm9kZSA9IGhwLT5tZGVzYy5ub2RlX3N6IC8gMTY7CisKKwlpZiAobm9kZSA9PSBNREVTQ19OT0RFX05VTEwgfHwgbm9kZSA+PSBsYXN0X25vZGUpCisJCXJldHVybiBOVUxMOworCisJZXAgPSBiYXNlICsgbm9kZTsKKwlpZiAoZXAtPnRhZyAhPSBNRF9OT0RFKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBuYW1lcyArIGVwLT5uYW1lX29mZnNldDsKK30KK0VYUE9SVF9TWU1CT0wobWRlc2Nfbm9kZV9uYW1lKTsKIAogc3RhdGljIHZvaWQgX19pbml0IHJlcG9ydF9wbGF0Zm9ybV9wcm9wZXJ0aWVzKHZvaWQpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKnBuID0gbWRfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBsYXRmb3JtIik7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAgPSBtZGVzY19ncmFiKCk7CisJdTY0IHBuID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJwbGF0Zm9ybSIpOwogCWNvbnN0IGNoYXIgKnM7CiAJY29uc3QgdTY0ICp2OwogCi0JaWYgKCFwbikgeworCWlmIChwbiA9PSBNREVTQ19OT0RFX05VTEwpIHsKIAkJcHJvbV9wcmludGYoIk5vIHBsYXRmb3JtIG5vZGUgaW4gbWFjaGluZS1kZXNjcmlwdGlvbi5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlzID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAiYmFubmVyLW5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgImJhbm5lci1uYW1lIiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogYmFubmVyLW5hbWUgWyVzXVxuIiwgcyk7Ci0JcyA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIm5hbWUiLCBOVUxMKTsKKwlzID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm5hbWUiLCBOVUxMKTsKIAlwcmludGsoIlBMQVRGT1JNOiBuYW1lIFslc11cbiIsIHMpOwogCi0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgImhvc3RpZCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAiaG9zdGlkIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IGhvc3RpZCBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInNlcmlhbCMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgInNlcmlhbCMiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogc2VyaWFsIyBbJTA4bHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAic3RpY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJcHJpbnRrKCJQTEFURk9STTogc3RpY2stZnJlcXVlbmN5IFslMDhseF1cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWFjLWFkZHJlc3MiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1hYy1hZGRyZXNzIFslbHhdXG4iLCAqdik7Ci0JdiA9IG1kX2dldF9wcm9wZXJ0eShwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIndhdGNoZG9nLXJlc29sdXRpb24iLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctcmVzb2x1dGlvbiBbJWx1IG1zXVxuIiwgKnYpOwotCXYgPSBtZF9nZXRfcHJvcGVydHkocG4sICJ3YXRjaGRvZy1tYXgtdGltZW91dCIsIE5VTEwpOworCXYgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHBuLCAid2F0Y2hkb2ctbWF4LXRpbWVvdXQiLCBOVUxMKTsKIAlpZiAodikKIAkJcHJpbnRrKCJQTEFURk9STTogd2F0Y2hkb2ctbWF4LXRpbWVvdXQgWyVsdSBtc11cbiIsICp2KTsKLQl2ID0gbWRfZ2V0X3Byb3BlcnR5KHBuLCAibWF4LWNwdXMiLCBOVUxMKTsKKwl2ID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBwbiwgIm1heC1jcHVzIiwgTlVMTCk7CiAJaWYgKHYpCiAJCXByaW50aygiUExBVEZPUk06IG1heC1jcHVzIFslbHVdXG4iLCAqdik7CisKKyNpZmRlZiBDT05GSUdfU01QCisJeworCQlpbnQgbWF4X2NwdSwgaTsKKworCQlpZiAodikgeworCQkJbWF4X2NwdSA9ICp2OworCQkJaWYgKG1heF9jcHUgPiBOUl9DUFVTKQorCQkJCW1heF9jcHUgPSBOUl9DUFVTOworCQl9IGVsc2UgeworCQkJbWF4X2NwdSA9IE5SX0NQVVM7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IG1heF9jcHU7IGkrKykKKwkJCWNwdV9zZXQoaSwgY3B1X3Bvc3NpYmxlX21hcCk7CisJfQorI2VuZGlmCisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogc3RhdGljIGludCBpbmxpbmUgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwgaW50IGxlbikKQEAgLTM2OSwxNSArNDYyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmaWxsX2luX29uZV9jYWNoZShjcHVpbmZvX3NwYXJjICpjLCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXApCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZmlsbF9pbl9vbmVfY2FjaGUoY3B1aW5mb19zcGFyYyAqYywKKwkJCQkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsCisJCQkJCXU2NCBtcCkKIHsKLQljb25zdCB1NjQgKmxldmVsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAibGV2ZWwiLCBOVUxMKTsKLQljb25zdCB1NjQgKnNpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJzaXplIiwgTlVMTCk7Ci0JY29uc3QgdTY0ICpsaW5lX3NpemUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJsaW5lLXNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CisJY29uc3QgdTY0ICpzaXplID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInNpemUiLCBOVUxMKTsKKwljb25zdCB1NjQgKmxpbmVfc2l6ZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJsaW5lLXNpemUiLCBOVUxMKTsKIAljb25zdCBjaGFyICp0eXBlOwogCWludCB0eXBlX2xlbjsKIAotCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJnR5cGVfbGVuKTsKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmdHlwZV9sZW4pOwogCiAJc3dpdGNoICgqbGV2ZWwpIHsKIAljYXNlIDE6CkBAIC00MDAsNDggKzQ5NSw0NSBAQAogCX0KIAogCWlmICgqbGV2ZWwgPT0gMSkgewotCQl1bnNpZ25lZCBpbnQgaTsKKwkJdTY0IGE7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKKwkJbWRlc2NfZm9yX2VhY2hfYXJjKGEsIGhwLCBtcCwgTURFU0NfQVJDX1RZUEVfRldEKSB7CisJCQl1NjQgdGFyZ2V0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICpuYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0YXJnZXQpOwogCi0JCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJmd2QiKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFzdHJjbXAodC0+bmFtZSwgImNhY2hlIikpCi0JCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgdCk7CisJCQlpZiAoIXN0cmNtcChuYW1lLCAiY2FjaGUiKSkKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdGFyZ2V0KTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfY29yZV9pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgY29yZV9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX2NvcmVfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBjb3JlX2lkKQogewotCXVuc2lnbmVkIGludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY3B1IikpIHsKLQkJCWlkID0gbWRfZ2V0X3Byb3BlcnR5KHQsICJpZCIsIE5VTEwpOworCQluYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJaWYgKCFzdHJjbXAobmFtZSwgImNwdSIpKSB7CisJCQlpZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdCwgImlkIiwgTlVMTCk7CiAJCQlpZiAoKmlkIDwgTlJfQ1BVUykKIAkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGo7CisJCQl1NjQgajsKIAotCQkJZm9yIChqID0gMDsgaiA8IHQtPm51bV9hcmNzOyBqKyspIHsKLQkJCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqbiA9IHQtPmFyY3Nbal0uYXJjOworCQkJbWRlc2NfZm9yX2VhY2hfYXJjKGosIGhwLCB0LCBNREVTQ19BUkNfVFlQRV9CQUNLKSB7CisJCQkJdTY0IG4gPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBqKTsKKwkJCQljb25zdCBjaGFyICpuX25hbWU7CiAKLQkJCQlpZiAoc3RyY21wKHQtPmFyY3Nbal0ubmFtZSwgImJhY2siKSkKKwkJCQluX25hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIG4pOworCQkJCWlmIChzdHJjbXAobl9uYW1lLCAiY3B1IikpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJaWYgKHN0cmNtcChuLT5uYW1lLCAiY3B1IikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWQgPSBtZF9nZXRfcHJvcGVydHkobiwgImlkIiwgTlVMTCk7CisJCQkJaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG4sICJpZCIsIE5VTEwpOwogCQkJCWlmICgqaWQgPCBOUl9DUFVTKQogCQkJCQljcHVfZGF0YSgqaWQpLmNvcmVfaWQgPSBjb3JlX2lkOwogCQkJfQpAQCAtNDQ5LDc4ICs1NDEsODEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY29yZV9pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfY29yZV9pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMTsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsICJjYWNoZSIpIHsKLQkJY29uc3QgdTY0ICpsZXZlbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImxldmVsIiwgTlVMTCk7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgImNhY2hlIikgeworCQljb25zdCB1NjQgKmxldmVsOwogCQljb25zdCBjaGFyICp0eXBlOwogCQlpbnQgbGVuOwogCisJCWxldmVsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImxldmVsIiwgTlVMTCk7CiAJCWlmICgqbGV2ZWwgIT0gMSkKIAkJCWNvbnRpbnVlOwogCi0JCXR5cGUgPSBtZF9nZXRfcHJvcGVydHkobXAsICJ0eXBlIiwgJmxlbik7CisJCXR5cGUgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAidHlwZSIsICZsZW4pOwogCQlpZiAoIWZpbmRfaW5fcHJvcGxpc3QodHlwZSwgImluc3RuIiwgbGVuKSkKIAkJCWNvbnRpbnVlOwogCi0JCW1hcmtfY29yZV9pZHMobXAsIGlkeCk7CisJCW1hcmtfY29yZV9pZHMoaHAsIG1wLCBpZHgpOwogCiAJCWlkeCsrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1hcmtfcHJvY19pZHMoc3RydWN0IG1kZXNjX25vZGUgKm1wLCBpbnQgcHJvY19pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBtYXJrX3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgIGludCBwcm9jX2lkKQogewotCWludCBpOworCXU2NCBhOwogCi0JZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCXN0cnVjdCBtZGVzY19ub2RlICp0ID0gbXAtPmFyY3NbaV0uYXJjOworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0JBQ0spIHsKKwkJdTY0IHQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJY29uc3QgdTY0ICppZDsKIAotCQlpZiAoc3RyY21wKG1wLT5hcmNzW2ldLm5hbWUsICJiYWNrIikpCisJCW5hbWUgPSBtZGVzY19ub2RlX25hbWUoaHAsIHQpOworCQlpZiAoc3RyY21wKG5hbWUsICJjcHUiKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgImNwdSIpKQotCQkJY29udGludWU7Ci0KLQkJaWQgPSBtZF9nZXRfcHJvcGVydHkodCwgImlkIiwgTlVMTCk7CisJCWlkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0LCAiaWQiLCBOVUxMKTsKIAkJaWYgKCppZCA8IE5SX0NQVVMpCiAJCQljcHVfZGF0YSgqaWQpLnByb2NfaWQgPSBwcm9jX2lkOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fc2V0X3Byb2NfaWRzKGNvbnN0IGNoYXIgKmV4ZWNfdW5pdF9uYW1lKQorc3RhdGljIHZvaWQgX19kZXZpbml0IF9fc2V0X3Byb2NfaWRzKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLAorCQkJCSAgICAgY29uc3QgY2hhciAqZXhlY191bml0X25hbWUpCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOwogCWludCBpZHg7CisJdTY0IG1wOwogCiAJaWR4ID0gMDsKLQltZF9mb3JfZWFjaF9ub2RlX2J5X25hbWUobXAsIGV4ZWNfdW5pdF9uYW1lKSB7CisJbWRlc2NfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGhwLCBtcCwgZXhlY191bml0X25hbWUpIHsKIAkJY29uc3QgY2hhciAqdHlwZTsKIAkJaW50IGxlbjsKIAotCQl0eXBlID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAidHlwZSIsICZsZW4pOworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInR5cGUiLCAmbGVuKTsKIAkJaWYgKCFmaW5kX2luX3Byb3BsaXN0KHR5cGUsICJpbnQiLCBsZW4pICYmCiAJCSAgICAhZmluZF9pbl9wcm9wbGlzdCh0eXBlLCAiaW50ZWdlciIsIGxlbikpCiAJCQljb250aW51ZTsKIAotCQltYXJrX3Byb2NfaWRzKG1wLCBpZHgpOworCQltYXJrX3Byb2NfaWRzKGhwLCBtcCwgaWR4KTsKIAogCQlpZHgrKzsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfcHJvY19pZHModm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXRfcHJvY19pZHMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCiB7Ci0JX19zZXRfcHJvY19pZHMoImV4ZWNfdW5pdCIpOwotCV9fc2V0X3Byb2NfaWRzKCJleGVjLXVuaXQiKTsKKwlfX3NldF9wcm9jX2lkcyhocCwgImV4ZWNfdW5pdCIpOworCV9fc2V0X3Byb2NfaWRzKGhwLCAiZXhlYy11bml0Iik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfb25lX21vbmRvX2JpdHMoY29uc3QgdTY0ICpwLCB1bnNpZ25lZCBpbnQgKm1hc2ssIHVuc2lnbmVkIGNoYXIgZGVmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9vbmVfbW9uZG9fYml0cyhjb25zdCB1NjQgKnAsIHVuc2lnbmVkIGludCAqbWFzaywKKwkJCQkJIHVuc2lnbmVkIGNoYXIgZGVmKQogewogCXU2NCB2YWw7CiAKQEAgLTUzOCwzNSArNjMzLDM3IEBACiAJKm1hc2sgPSAoKDFVIDw8IGRlZikgKiA2NFUpIC0gMVU7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfbW9uZG9fZGF0YShzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsIHN0cnVjdCB0cmFwX3Blcl9jcHUgKnRiKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGdldF9tb25kb19kYXRhKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICAgICBzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YikKIHsKIAljb25zdCB1NjQgKnZhbDsKIAotCXZhbCA9IG1kX2dldF9wcm9wZXJ0eShtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CisJdmFsID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgInEtY3B1LW1vbmRvLSNiaXRzIiwgTlVMTCk7CiAJZ2V0X29uZV9tb25kb19iaXRzKHZhbCwgJnRiLT5jcHVfbW9uZG9fcW1hc2ssIDcpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1kZXYtbW9uZG8tI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPmRldl9tb25kb19xbWFzaywgNyk7CiAKLQl2YWwgPSBtZF9nZXRfcHJvcGVydHkobXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOworCXZhbCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJxLXJlc3VtYWJsZS0jYml0cyIsIE5VTEwpOwogCWdldF9vbmVfbW9uZG9fYml0cyh2YWwsICZ0Yi0+cmVzdW1fcW1hc2ssIDYpOwogCi0JdmFsID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKKwl2YWwgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAicS1ub25yZXN1bWFibGUtI2JpdHMiLCBOVUxMKTsKIAlnZXRfb25lX21vbmRvX2JpdHModmFsLCAmdGItPm5vbnJlc3VtX3FtYXNrLCAyKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEodm9pZCkKK3ZvaWQgX19kZXZpbml0IG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoY3B1bWFza190IG1hc2spCiB7Ci0Jc3RydWN0IG1kZXNjX25vZGUgKm1wOworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwID0gbWRlc2NfZ3JhYigpOworCXU2NCBtcDsKIAogCW5jcHVzX3Byb2JlZCA9IDA7Ci0JbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKG1wLCAiY3B1IikgewotCQljb25zdCB1NjQgKmlkID0gbWRfZ2V0X3Byb3BlcnR5KG1wLCAiaWQiLCBOVUxMKTsKLQkJY29uc3QgdTY0ICpjZnJlcSA9IG1kX2dldF9wcm9wZXJ0eShtcCwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCW1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShocCwgbXAsICJjcHUiKSB7CisJCWNvbnN0IHU2NCAqaWQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiaWQiLCBOVUxMKTsKKwkJY29uc3QgdTY0ICpjZnJlcSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgbXAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CiAJCWNwdWluZm9fc3BhcmMgKmM7Ci0JCXVuc2lnbmVkIGludCBpOwogCQlpbnQgY3B1aWQ7CisJCXU2NCBhOwogCiAJCW5jcHVzX3Byb2JlZCsrOwogCkBAIC01NzUsNiArNjcyLDggQEAKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChjcHVpZCA+PSBOUl9DUFVTKQogCQkJY29udGludWU7CisJCWlmICghY3B1X2lzc2V0KGNwdWlkLCBtYXNrKSkKKwkJCWNvbnRpbnVlOwogI2Vsc2UKIAkJLyogT24gdW5pcHJvY2Vzc29yIHdlIG9ubHkgd2FudCB0aGUgdmFsdWVzIGZvciB0aGUKIAkJICogcmVhbCBwaHlzaWNhbCBjcHUgdGhlIGtlcm5lbCBib290ZWQgb250bywgaG93ZXZlcgpAQCAtNTg5LDM1ICs2ODgsMzAgQEAKIAkJYy0+Y2xvY2tfdGljayA9ICpjZnJlcTsKIAogCQl0YiA9ICZ0cmFwX2Jsb2NrW2NwdWlkXTsKLQkJZ2V0X21vbmRvX2RhdGEobXAsIHRiKTsKKwkJZ2V0X21vbmRvX2RhdGEoaHAsIG1wLCB0Yik7CiAKLQkJZm9yIChpID0gMDsgaSA8IG1wLT5udW1fYXJjczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWRlc2Nfbm9kZSAqdCA9IG1wLT5hcmNzW2ldLmFyYzsKLQkJCXVuc2lnbmVkIGludCBqOworCQltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG1wLCBNREVTQ19BUkNfVFlQRV9GV0QpIHsKKwkJCXU2NCBqLCB0ID0gbWRlc2NfYXJjX3RhcmdldChocCwgYSk7CisJCQljb25zdCBjaGFyICp0X25hbWU7CiAKLQkJCWlmIChzdHJjbXAobXAtPmFyY3NbaV0ubmFtZSwgImZ3ZCIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXN0cmNtcCh0LT5uYW1lLCAiY2FjaGUiKSkgewotCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIHQpOworCQkJdF9uYW1lID0gbWRlc2Nfbm9kZV9uYW1lKGhwLCB0KTsKKwkJCWlmICghc3RyY21wKHRfbmFtZSwgImNhY2hlIikpIHsKKwkJCQlmaWxsX2luX29uZV9jYWNoZShjLCBocCwgdCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWZvciAoaiA9IDA7IGogPCB0LT5udW1fYXJjczsgaisrKSB7Ci0JCQkJc3RydWN0IG1kZXNjX25vZGUgKm47CisJCQltZGVzY19mb3JfZWFjaF9hcmMoaiwgaHAsIHQsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQkJCXU2NCBuID0gbWRlc2NfYXJjX3RhcmdldChocCwgaik7CisJCQkJY29uc3QgY2hhciAqbl9uYW1lOwogCi0JCQkJbiA9IHQtPmFyY3Nbal0uYXJjOwotCQkJCWlmIChzdHJjbXAodC0+YXJjc1tqXS5uYW1lLCAiZndkIikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKCFzdHJjbXAobi0+bmFtZSwgImNhY2hlIikpCi0JCQkJCWZpbGxfaW5fb25lX2NhY2hlKGMsIG4pOworCQkJCW5fbmFtZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbik7CisJCQkJaWYgKCFzdHJjbXAobl9uYW1lLCAiY2FjaGUiKSkKKwkJCQkJZmlsbF9pbl9vbmVfY2FjaGUoYywgaHAsIG4pOwogCQkJfQogCQl9CiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKICNlbmRpZgogCiAJCWMtPmNvcmVfaWQgPSAwOwpAQCAtNjI4LDQ1ICs3MjIsNDMgQEAKIAlzcGFyYzY0X211bHRpX2NvcmUgPSAxOwogI2VuZGlmCiAKLQlzZXRfY29yZV9pZHMoKTsKLQlzZXRfcHJvY19pZHMoKTsKKwlzZXRfY29yZV9pZHMoaHApOworCXNldF9wcm9jX2lkcyhocCk7CiAKIAlzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKIH0KIAogdm9pZCBfX2luaXQgc3VuNHZfbWRlc2NfaW5pdCh2b2lkKQogeworCXN0cnVjdCBtZGVzY19oYW5kbGUgKmhwOwogCXVuc2lnbmVkIGxvbmcgbGVuLCByZWFsX2xlbiwgc3RhdHVzOworCWNwdW1hc2tfdCBtYXNrOwogCiAJKHZvaWQpIHN1bjR2X21hY2hfZGVzYygwVUwsIDBVTCwgJmxlbik7CiAKIAlwcmludGsoIk1ERVNDOiBTaXplIGlzICVsdSBieXRlcy5cbiIsIGxlbik7CiAKLQltYWluX21kZXNjID0gbWRlc2NfZWFybHlfYWxsb2MobGVuKTsKKwlocCA9IG1kZXNjX2FsbG9jKGxlbiwgJmJvb3RtZW1fbWRlc2NfbWVtb3BzKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlwcm9tX3ByaW50ZigiTURFU0M6IGFsbG9jIG9mICVsdSBieXRlcyBmYWlsZWQuXG4iLCBsZW4pOworCQlwcm9tX2hhbHQoKTsKKwl9CiAKLQlzdGF0dXMgPSBzdW40dl9tYWNoX2Rlc2MoX19wYShtYWluX21kZXNjKSwgbGVuLCAmcmVhbF9sZW4pOworCXN0YXR1cyA9IHN1bjR2X21hY2hfZGVzYyhfX3BhKCZocC0+bWRlc2MpLCBsZW4sICZyZWFsX2xlbik7CiAJaWYgKHN0YXR1cyAhPSBIVl9FT0sgfHwgcmVhbF9sZW4gPiBsZW4pIHsKIAkJcHJvbV9wcmludGYoInN1bjR2X21hY2hfZGVzYyBmYWlscywgZXJyKCVsdSksICIKIAkJCSAgICAibGVuKCVsdSksIHJlYWxfbGVuKCVsdSlcbiIsCiAJCQkgICAgc3RhdHVzLCBsZW4sIHJlYWxfbGVuKTsKKwkJbWRlc2NfZnJlZShocCk7CiAJCXByb21faGFsdCgpOwogCX0KIAotCWxlbiA9IGNvdW50X25vZGVzKG1haW5fbWRlc2MpOwotCXByaW50aygiTURFU0M6ICVsdSBub2Rlcy5cbiIsIGxlbik7Ci0KLQlsZW4gPSByb3VuZHVwX3Bvd19vZl90d28obGVuKTsKLQotCW1kZXNjX2hhc2ggPSBtZGVzY19lYXJseV9hbGxvYyhsZW4gKiBzaXplb2Yoc3RydWN0IG1kZXNjX25vZGUgKikpOwotCW1kZXNjX2hhc2hfc2l6ZSA9IGxlbjsKLQotCXByaW50aygiTURFU0M6IEhhc2ggc2l6ZSAlbHUgZW50cmllcy5cbiIsIGxlbik7Ci0KLQlidWlsZF9hbGxfbm9kZXMobWFpbl9tZGVzYyk7Ci0KLQlwcmludGsoIk1ERVNDOiBCdWlsdCBncmFwaCB3aXRoICV1IGJ5dGVzIG9mIG1lbW9yeS5cbiIsCi0JICAgICAgIG1kZXNjX2Vhcmx5X2FsbG9jYXRlZCk7CisJY3VyX21kZXNjID0gaHA7CiAKIAlyZXBvcnRfcGxhdGZvcm1fcHJvcGVydGllcygpOwotCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoKTsKKworCWNwdXNfc2V0YWxsKG1hc2spOworCW1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEobWFzayk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKaW5kZXggNWQ2YWRlYS4uOGRkNDI5NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogcG93ZXIuYyx2IDEuMTAgMjAwMS8xMi8xMSAwMTo1NzoxNiBkYXZlbSBFeHAgJAotICogcG93ZXIuYzogUG93ZXIgbWFuYWdlbWVudCBkcml2ZXIuCisvKiBwb3dlci5jOiBQb3dlciBtYW5hZ2VtZW50IGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xOSw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Bvd2VyLmg+CiAjaW5jbHVkZSA8YXNtL3NzdGF0ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC0yOSwyNCArMjksMjYgQEAKICAqLwogaW50IHNjb25zX3B3cm9mZiA9IDE7IAogCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogc3RhdGljIHZvaWQgX19pb21lbSAqcG93ZXJfcmVnOwogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocG93ZXJkX3dhaXQpOwogc3RhdGljIGludCBidXR0b25fcHJlc3NlZDsKIAotc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQordm9pZCB3YWtlX3VwX3Bvd2VyZCh2b2lkKQogewogCWlmIChidXR0b25fcHJlc3NlZCA9PSAwKSB7CiAJCWJ1dHRvbl9wcmVzc2VkID0gMTsKIAkJd2FrZV91cCgmcG93ZXJkX3dhaXQpOwogCX0KK30KKworc3RhdGljIGlycXJldHVybl90IHBvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXdha2VfdXBfcG93ZXJkKCk7CiAKIAkvKiBGSVhNRTogQ2hlY2sgcmVnaXN0ZXJzIGZvciBzdGF0dXMuLi4gKi8KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCiBleHRlcm4gdm9pZCBtYWNoaW5lX2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX2FsdF9wb3dlcl9vZmYodm9pZCk7CkBAIC01NiwxOSArNTgsMTggQEAKIHsKIAlzc3RhdGVfcG93ZXJvZmYoKTsKIAlpZiAoIXNlcmlhbF9jb25zb2xlIHx8IHNjb25zX3B3cm9mZikgewotI2lmZGVmIENPTkZJR19QQ0kKIAkJaWYgKHBvd2VyX3JlZykgewogCQkJLyogQm90aCByZWdpc3RlciBiaXRzIHNlZW0gdG8gaGF2ZSB0aGUKIAkJCSAqIHNhbWUgZWZmZWN0LCBzbyB1bnRpbCBJIGZpZ3VyZSBvdXQKIAkJCSAqIHdoYXQgdGhlIGRpZmZlcmVuY2UgaXMuLi4KIAkJCSAqLwogCQkJd3JpdGVsKEFVWElPX1BDSU9fQ1BXUl9PRkYgfCBBVVhJT19QQ0lPX1NQV1JfT0ZGLCBwb3dlcl9yZWcpOwotCQl9IGVsc2UKLSNlbmRpZiAvKiBDT05GSUdfUENJICovCisJCX0gZWxzZSB7CiAJCQlpZiAocG93ZXJvZmZfbWV0aG9kICE9IE5VTEwpIHsKIAkJCQlwb3dlcm9mZl9tZXRob2QoKTsKIAkJCQkvKiBub3QgcmVhY2hlZCAqLwogCQkJfQorCQl9CiAJfQogCW1hY2hpbmVfaGFsdCgpOwogfQpAQCAtNzYsNyArNzcsNiBAQAogdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCkgPSBtYWNoaW5lX3Bvd2VyX29mZjsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgcG93ZXJkKHZvaWQgKl9fdW51c2VkKQogewogCXN0YXRpYyBjaGFyICplbnZwW10gPSB7ICJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluIiwgTlVMTCB9OwpAQCAtODYsNyArODYsNyBAQAogCWRhZW1vbml6ZSgicG93ZXJkIik7CiAKIAlhZGRfd2FpdF9xdWV1ZSgmcG93ZXJkX3dhaXQsICZ3YWl0KTsKLWFnYWluOgorCiAJZm9yICg7OykgewogCQlzZXRfdGFza19zdGF0ZShjdXJyZW50LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoYnV0dG9uX3ByZXNzZWQpCkBAIC0xMDAsMTYgKzEwMCwyOCBAQAogCS8qIE9rLCBkb3duIHdlIGdvLi4uICovCiAJYnV0dG9uX3ByZXNzZWQgPSAwOwogCWlmIChrZXJuZWxfZXhlY3ZlKCIvc2Jpbi9zaHV0ZG93biIsIGFyZ3YsIGVudnApIDwgMCkgewotCQlwcmludGsoInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7Ci0JCWFkZF93YWl0X3F1ZXVlKCZwb3dlcmRfd2FpdCwgJndhaXQpOwotCQlnb3RvIGFnYWluOworCQlwcmludGsoS0VSTl9FUlIgInBvd2VyZDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7CisJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CiAJfQogCXJldHVybiAwOwogfQogCitpbnQgc3RhcnRfcG93ZXJkKHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGtlcm5lbF90aHJlYWQocG93ZXJkLCBOVUxMLCBDTE9ORV9GUyk7CisJaWYgKGVyciA8IDApCisJCXByaW50ayhLRVJOX0VSUiAicG93ZXI6IEZhaWxlZCB0byBzdGFydCBwb3dlciBkYWVtb24uXG4iKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBwb3dlcmQgcnVubmluZy5cbiIpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBfX2luaXQgaGFzX2J1dHRvbl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKLQlpZiAoaXJxID09IFBDSV9JUlFfTk9ORSkKKwlpZiAoaXJxID09IDB4ZmZmZmZmZmYpCiAJCXJldHVybiAwOwogCWlmICghb2ZfZmluZF9wcm9wZXJ0eShkcCwgImJ1dHRvbiIsIE5VTEwpKQogCQlyZXR1cm4gMDsKQEAgLTEzMCwxNyArMTQyLDE0IEBACiAJcG93ZXJvZmZfbWV0aG9kID0gbWFjaGluZV9oYWx0OyAgLyogYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGhhbHQgKi8KIAogCWlmIChoYXNfYnV0dG9uX2ludGVycnVwdChpcnEsIG9wLT5ub2RlKSkgewotCQlpZiAoa2VybmVsX3RocmVhZChwb3dlcmQsIE5VTEwsIENMT05FX0ZTKSA8IDApIHsKLQkJCXByaW50aygiRmFpbGVkIHRvIHN0YXJ0IHBvd2VyIGRhZW1vbi5cbiIpOworCQlpZiAoc3RhcnRfcG93ZXJkKCkgPCAwKQogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHJpbnRrKCJwb3dlcmQgcnVubmluZy5cbiIpOwogCiAJCWlmIChyZXF1ZXN0X2lycShpcnEsCiAJCQkJcG93ZXJfaGFuZGxlciwgMCwgInBvd2VyIiwgTlVMTCkgPCAwKQotCQkJcHJpbnRrKCJwb3dlcjogRXJyb3IsIGNhbm5vdCByZWdpc3RlciBJUlEgaGFuZGxlci5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcjogQ2Fubm90IHNldHVwIElSUSBoYW5kbGVyLlxuIik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKCJub3QgdXNpbmcgcG93ZXJkLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBvd2VyOiBOb3QgdXNpbmcgcG93ZXJkLlxuIik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjQsNCArMTczLDMgQEAKIAlvZl9yZWdpc3Rlcl9kcml2ZXIoJnBvd2VyX2RyaXZlciwgJm9mX2J1c190eXBlKTsKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBmNWY5N2UyLi45MzU1NzUwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDksNyArNTAsNyBAQAogCiAvKiAjZGVmaW5lIFZFUkJPU0VfU0hPV1JFR1MgKi8KIAotc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZCh2b2lkKQorc3RhdGljIHZvaWQgc3BhcmM2NF95aWVsZChpbnQgY3B1KQogewogCWlmICh0bGJfdHlwZSAhPSBoeXBlcnZpc29yKQogCQlyZXR1cm47CkBAIC01Nyw3ICs1OCw3IEBACiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAlzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpOwogCi0Jd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKIAkJdW5zaWduZWQgbG9uZyBwc3RhdGU7CiAKIAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLwpAQCAtNjgsNyArNjksNyBAQAogCQkJOiAiPSZyIiAocHN0YXRlKQogCQkJOiAiaSIgKFBTVEFURV9JRSkpOwogCi0JCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCWlmICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCQlzdW40dl9jcHVfeWllbGQoKTsKIAogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cy4gKi8KQEAgLTg2LDE1ICs4NywyNSBAQAogLyogVGhlIGlkbGUgbG9vcCBvbiBzcGFyYzY0LiAqLwogdm9pZCBjcHVfaWRsZSh2b2lkKQogeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAogCXdoaWxlKDEpIHsKIAkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygpOwotCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQotCQkJc3BhcmM2NF95aWVsZCgpOworCisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpCisJCQlzcGFyYzY0X3lpZWxkKGNwdSk7CisKIAkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOwogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSkKKwkJCWNwdV9wbGF5X2RlYWQoKTsKKyNlbmRpZgorCiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggNjEwMzZiMy4uNWQyMjAzMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTE4MDgsNyArMTgwOCw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJCWNwdV9zZXQoY3B1aWQsIGNwdV9wcmVzZW50X21hcCk7Ci0JCWNwdV9zZXQoY3B1aWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwkJY3B1X3NldChjcHVpZCwgY3B1X3Bvc3NpYmxlX21hcCk7CiAjZW5kaWYKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCA3NDkwY2M2Li5hYWZkZTNkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC00NDIsNyArNDQyLDYgQEAKIAkJICAgIkQkIHBhcml0eSB0bDFcdDogJXVcbiIKIAkJICAgIkkkIHBhcml0eSB0bDFcdDogJXVcbiIKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAiQ3B1MEJvZ29cdDogJWx1LiUwMmx1XG4iCiAJCSAgICJDcHUwQ2xrVGNrXHQ6ICUwMTZseFxuIgogI2VuZGlmCiAJCSAgICwKQEAgLTQ1Nyw5ICs0NTYsNyBAQAogCQkgICBkY2FjaGVfcGFyaXR5X3RsMV9vY2N1cnJlZCwKIAkJICAgaWNhY2hlX3Bhcml0eV90bDFfb2NjdXJyZWQKICNpZm5kZWYgQ09ORklHX1NNUAotCQkgICAsIGNwdV9kYXRhKDApLnVkZWxheV92YWwvKDUwMDAwMC9IWiksCi0JCSAgIChjcHVfZGF0YSgwKS51ZGVsYXlfdmFsLyg1MDAwL0haKSkgJSAxMDAsCi0JCSAgIGNwdV9kYXRhKDApLmNsb2NrX3RpY2sKKwkJICAgLCBjcHVfZGF0YSgwKS5jbG9ja190aWNrCiAjZW5kaWYKIAkJKTsKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwppbmRleCA0MGU0MGY5Li5iNDQ4ZDMzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTEsNiArMSw2IEBACiAvKiBzbXAuYzogU3BhcmM2NCBTTVAgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDA3IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KKyNpbmNsdWRlIDxhc20vaHZ0cmFtcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgpAQCAtNDEsMjIgKzQzLDI2IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KIAogZXh0ZXJuIHZvaWQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpOwogCiBpbnQgc3BhcmM2NF9tdWx0aV9jb3JlIF9fcmVhZF9tb3N0bHk7CiAKLS8qIFBsZWFzZSBkb24ndCBtYWtlIHRoaXMgc3R1ZmYgaW5pdGRhdGEhISEgIC0tRGF2ZU0gKi8KLXVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7Ci0KK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9vbmxpbmVfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwotY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwIF9fcmVhZF9tb3N0bHkgPSBDUFVfTUFTS19OT05FOwogY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OwogY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0KIAl7IFswIC4uLiBOUl9DUFVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OworCitFWFBPUlRfU1lNQk9MKGNwdV9wb3NzaWJsZV9tYXApOworRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9zaWJsaW5nX21hcCk7CitFWFBPUlRfU1lNQk9MKGNwdV9jb3JlX21hcCk7CisKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwotc3RhdGljIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiAKIHZvaWQgc21wX2luZm8oc3RydWN0IHNlcV9maWxlICptKQogewpAQCAtNzMsMTggKzc5LDE3IEBACiAJCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKQogCQlzZXFfcHJpbnRmKG0sCi0JCQkgICAiQ3B1JWRCb2dvXHQ6ICVsdS4lMDJsdVxuIgogCQkJICAgIkNwdSVkQ2xrVGNrXHQ6ICUwMTZseFxuIiwKLQkJCSAgIGksIGNwdV9kYXRhKGkpLnVkZWxheV92YWwgLyAoNTAwMDAwL0haKSwKLQkJCSAgIChjcHVfZGF0YShpKS51ZGVsYXlfdmFsIC8gKDUwMDAvSFopKSAlIDEwMCwKIAkJCSAgIGksIGNwdV9kYXRhKGkpLmNsb2NrX3RpY2spOwogfQogCitzdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CisKIGV4dGVybiB2b2lkIHNldHVwX3NwYXJjNjRfdGltZXIodm9pZCk7CiAKIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGNhbGxpbl9mbGFnID0gMDsKIAotdm9pZCBfX2luaXQgc21wX2NhbGxpbih2b2lkKQordm9pZCBfX2RldmluaXQgc21wX2NhbGxpbih2b2lkKQogewogCWludCBjcHVpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0xMDIsOCArMTA3LDYgQEAKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWNhbGlicmF0ZV9kZWxheSgpOwotCWNwdV9kYXRhKGNwdWlkKS51ZGVsYXlfdmFsID0gbG9vcHNfcGVyX2ppZmZ5OwogCWNhbGxpbl9mbGFnID0gMTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWVtYmFyICNTeW5jXG5cdCIKIAkJCSAgICAgImZsdXNoICAlJWc2IiA6IDogOiAibWVtb3J5Iik7CkBAIC0xMjAsNyArMTIzLDkgQEAKIAl3aGlsZSAoIWNwdV9pc3NldChjcHVpZCwgc21wX2NvbW1lbmNlZF9tYXNrKSkKIAkJcm1iKCk7CiAKKwlzcGluX2xvY2soJmNhbGxfbG9jayk7CiAJY3B1X3NldChjcHVpZCwgY3B1X29ubGluZV9tYXApOworCXNwaW5fdW5sb2NrKCZjYWxsX2xvY2spOwogCiAJLyogaWRsZSB0aHJlYWQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBwcmVlbXB0IGRpc2FibGVkICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CkBAIC0yNjgsNiArMjczLDY3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXRjX3N5bmNfbG9jaywgZmxhZ3MpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU1VOX0xET01TKSAmJiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkKKy8qIFhYWCBQdXQgdGhpcyBpbiBzb21lIGNvbW1vbiBwbGFjZS4gWFhYICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBraW1hZ2VfYWRkcl90b19yYSh2b2lkICpwKQoreworCXVuc2lnbmVkIGxvbmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIHA7CisKKwlyZXR1cm4ga2Vybl9iYXNlICsgKHZhbCAtIEtFUk5CQVNFKTsKK30KKworc3RhdGljIHZvaWQgbGRvbV9zdGFydGNwdV9jcHVpZCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHRocmVhZF9yZWcpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF90dGFibGVfdGwwOworCWV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5fbG9ja2VkX3R0ZV9kYXRhOworCWV4dGVybiBpbnQgYmlna2VybmVsOworCXN0cnVjdCBodnRyYW1wX2Rlc2NyICpoZGVzYzsKKwl1bnNpZ25lZCBsb25nIHRyYW1wb2xpbmVfcmE7CisJc3RydWN0IHRyYXBfcGVyX2NwdSAqdGI7CisJdTY0IHR0ZV92YWRkciwgdHRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBodl9lcnI7CisKKwloZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpoZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghaGRlc2MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsZG9tX3N0YXJ0Y3B1X2NwdWlkOiBDYW5ub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImh2dHJhbXBfZGVzY3IuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWhkZXNjLT5jcHUgPSBjcHU7CisJaGRlc2MtPm51bV9tYXBwaW5ncyA9IChiaWdrZXJuZWwgPyAyIDogMSk7CisKKwl0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisJdGItPmhkZXNjID0gaGRlc2M7CisKKwloZGVzYy0+ZmF1bHRfaW5mb192YSA9ICh1bnNpZ25lZCBsb25nKSAmdGItPmZhdWx0X2luZm87CisJaGRlc2MtPmZhdWx0X2luZm9fcGEgPSBraW1hZ2VfYWRkcl90b19yYSgmdGItPmZhdWx0X2luZm8pOworCisJaGRlc2MtPnRocmVhZF9yZWcgPSB0aHJlYWRfcmVnOworCisJdHRlX3ZhZGRyID0gKHVuc2lnbmVkIGxvbmcpIEtFUk5CQVNFOworCXR0ZV9kYXRhID0ga2Vybl9sb2NrZWRfdHRlX2RhdGE7CisKKwloZGVzYy0+bWFwc1swXS52YWRkciA9IHR0ZV92YWRkcjsKKwloZGVzYy0+bWFwc1swXS50dGUgICA9IHR0ZV9kYXRhOworCWlmIChiaWdrZXJuZWwpIHsKKwkJdHRlX3ZhZGRyICs9IDB4NDAwMDAwOworCQl0dGVfZGF0YSAgKz0gMHg0MDAwMDA7CisJCWhkZXNjLT5tYXBzWzFdLnZhZGRyID0gdHRlX3ZhZGRyOworCQloZGVzYy0+bWFwc1sxXS50dGUgICA9IHR0ZV9kYXRhOworCX0KKworCXRyYW1wb2xpbmVfcmEgPSBraW1hZ2VfYWRkcl90b19yYShodl9jcHVfc3RhcnR1cCk7CisKKwlodl9lcnIgPSBzdW40dl9jcHVfc3RhcnQoY3B1LCB0cmFtcG9saW5lX3JhLAorCQkJCSBraW1hZ2VfYWRkcl90b19yYSgmc3BhcmM2NF90dGFibGVfdGwwKSwKKwkJCQkgX19wYShoZGVzYykpOworCWlmIChodl9lcnIpCisJCXByaW50ayhLRVJOX0VSUiAibGRvbV9zdGFydGNwdV9jcHVpZDogc3VuNHZfY3B1X3N0YXJ0KCkgIgorCQkgICAgICAgImdpdmVzIGVycm9yICVsdVxuIiwgaHZfZXJyKTsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBzdW40dl9pbml0X21vbmRvX3F1ZXVlcyhpbnQgdXNlX2Jvb3RtZW0sIGludCBjcHUsIGludCBhbGxvYywgaW50IGxvYWQpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyYzY0X2NwdV9zdGFydHVwOwpAQCAtMjgwLDYgKzM0Niw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNtcF9ib290X29uZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKKwlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CiAJdW5zaWduZWQgbG9uZyBlbnRyeSA9CiAJCSh1bnNpZ25lZCBsb25nKSgmc3BhcmM2NF9jcHVfc3RhcnR1cCk7CiAJdW5zaWduZWQgbG9uZyBjb29raWUgPQpAQCAtMjkwLDIwICszNTcsMjUgQEAKIAlwID0gZm9ya19pZGxlKGNwdSk7CiAJY2FsbGluX2ZsYWcgPSAwOwogCWNwdV9uZXdfdGhyZWFkID0gdGFza190aHJlYWRfaW5mbyhwKTsKLQljcHVfc2V0KGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsKIAogCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CiAJCS8qIEFsbG9jIHRoZSBtb25kbyBxdWV1ZXMsIGNwdSB3aWxsIGxvYWQgdGhlbS4gICovCiAJCXN1bjR2X2luaXRfbW9uZG9fcXVldWVzKDAsIGNwdSwgMSwgMCk7CiAKLQkJcHJvbV9zdGFydGNwdV9jcHVpZChjcHUsIGVudHJ5LCBjb29raWUpOworI2lmIGRlZmluZWQoQ09ORklHX1NVTl9MRE9NUykgJiYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpCisJCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQkJbGRvbV9zdGFydGNwdV9jcHVpZChjcHUsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZykgY3B1X25ld190aHJlYWQpOworCQllbHNlCisjZW5kaWYKKwkJCXByb21fc3RhcnRjcHVfY3B1aWQoY3B1LCBlbnRyeSwgY29va2llKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb2ZfZmluZF9ub2RlX2J5X2NwdWlkKGNwdSk7CiAKIAkJcHJvbV9zdGFydGNwdShkcC0+bm9kZSwgZW50cnksIGNvb2tpZSk7CiAJfQogCi0JZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwMDA7IHRpbWVvdXQrKykgeworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA1MDAwMDsgdGltZW91dCsrKSB7CiAJCWlmIChjYWxsaW5fZmxhZykKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMTAwKTsKQEAgLTMxMywxMSArMzg1LDE1IEBACiAJCXJldCA9IDA7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKCJQcm9jZXNzb3IgJWQgaXMgc3R1Y2suXG4iLCBjcHUpOwotCQljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbG91dF9tYXApOwogCQlyZXQgPSAtRU5PREVWOwogCX0KIAljcHVfbmV3X3RocmVhZCA9IE5VTEw7CiAKKwlpZiAodGItPmhkZXNjKSB7CisJCWtmcmVlKHRiLT5oZGVzYyk7CisJCXRiLT5oZGVzYyA9IE5VTEw7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzIwLDcgKzc5Niw2IEBACiAJaW50IHdhaXQ7CiB9OwogCi1zdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGNhbGxfbG9jayk7CiBzdGF0aWMgc3RydWN0IGNhbGxfZGF0YV9zdHJ1Y3QgKmNhbGxfZGF0YTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeGNhbGxfY2FsbF9mdW5jdGlvbjsKQEAgLTExNTIsMzQgKzEyMjcsMTQgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi12b2lkIF9faW5pdCBzbXBfdGlja19pbml0KHZvaWQpCi17Ci0JYm9vdF9jcHVfaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLX0KLQogLyogL3Byb2MvcHJvZmlsZSB3cml0ZXMgY2FuIGNhbGwgdGhpcywgZG9uJ3QgX19pbml0IGl0IHBsZWFzZS4gKi8KIGludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLS8qIENvbnN0cmFpbiB0aGUgbnVtYmVyIG9mIGNwdXMgdG8gbWF4X2NwdXMuICAqLwogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7Ci0JaW50IGk7Ci0KLQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IG1heF9jcHVzKSB7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCQlpZiAoaSAhPSBib290X2NwdV9pZCkgewotCQkJCWNwdV9jbGVhcihpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0JCQkJY3B1X2NsZWFyKGksIGNwdV9wcmVzZW50X21hcCk7Ci0JCQkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPD0gbWF4X2NwdXMpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JY3B1X2RhdGEoYm9vdF9jcHVfaWQpLnVkZWxheV92YWwgPSBsb29wc19wZXJfamlmZnk7CiB9CiAKIHZvaWQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCkBAIC0xMTkwLDMwICsxMjQ1LDMyIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkuY29yZV9pZCA9PSAwKSB7CiAJCQljcHVfc2V0KGksIGNwdV9jb3JlX21hcFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGopIHsKIAkJCWlmIChjcHVfZGF0YShpKS5jb3JlX2lkID09CiAJCQkgICAgY3B1X2RhdGEoaikuY29yZV9pZCkKIAkJCQljcHVfc2V0KGosIGNwdV9jb3JlX21hcFtpXSk7CiAJCX0KIAl9CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGo7CiAKKwkJY3B1c19jbGVhcihjcHVfc2libGluZ19tYXBbaV0pOwogCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PSAtMSkgewogCQkJY3B1X3NldChpLCBjcHVfc2libGluZ19tYXBbaV0pOwogCQkJY29udGludWU7CiAJCX0KIAotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaikgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShqKSB7CiAJCQlpZiAoY3B1X2RhdGEoaSkucHJvY19pZCA9PQogCQkJICAgIGNwdV9kYXRhKGopLnByb2NfaWQpCiAJCQkJY3B1X3NldChqLCBjcHVfc2libGluZ19tYXBbaV0pOwpAQCAtMTI0MiwxOCArMTI5OSwxMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgY3B1X3BsYXlfZGVhZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgYm9nb3N1bSA9IDA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1bnNpZ25lZCBsb25nIHBzdGF0ZTsKKworCWlkbGVfdGFza19leGl0KCk7CisKKwlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgeworCQlzdHJ1Y3QgdHJhcF9wZXJfY3B1ICp0YiA9ICZ0cmFwX2Jsb2NrW2NwdV07CisKKwkJc3VuNHZfY3B1X3Fjb25mKEhWX0NQVV9RVUVVRV9DUFVfTU9ORE8sCisJCQkJdGItPmNwdV9tb25kb19wYSwgMCk7CisJCXN1bjR2X2NwdV9xY29uZihIVl9DUFVfUVVFVUVfREVWSUNFX01PTkRPLAorCQkJCXRiLT5kZXZfbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX1JFU19FUlJPUiwKKwkJCQl0Yi0+cmVzdW1fbW9uZG9fcGEsIDApOworCQlzdW40dl9jcHVfcWNvbmYoSFZfQ1BVX1FVRVVFX05PTlJFU19FUlJPUiwKKwkJCQl0Yi0+bm9ucmVzdW1fbW9uZG9fcGEsIDApOworCX0KKworCWNwdV9jbGVhcihjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CisJbWVtYmFyX3NhZmUoIiNTeW5jIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJyZHByCSUlcHN0YXRlLCAlMFxuXHQiCisJCSJ3cnByCSUwLCAlMSwgJSVwc3RhdGUiCisJCTogIj1yIiAocHN0YXRlKQorCQk6ICJpIiAoUFNUQVRFX0lFKSk7CisKKwl3aGlsZSAoMSkKKwkJYmFycmllcigpOworfQorCitpbnQgX19jcHVfZGlzYWJsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1aW5mb19zcGFyYyAqYzsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKLQkJYm9nb3N1bSArPSBjcHVfZGF0YShpKS51ZGVsYXlfdmFsOwotCXByaW50aygiVG90YWwgb2YgJWxkIHByb2Nlc3NvcnMgYWN0aXZhdGVkICIKLQkgICAgICAgIiglbHUuJTAybHUgQm9nb01JUFMpLlxuIiwKLQkgICAgICAgKGxvbmcpIG51bV9vbmxpbmVfY3B1cygpLAotCSAgICAgICBib2dvc3VtLyg1MDAwMDAvSFopLAotCSAgICAgICAoYm9nb3N1bS8oNTAwMC9IWikpJTEwMCk7CisJZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X2NvcmVfbWFwW2NwdV0pCisJCWNwdV9jbGVhcihjcHUsIGNwdV9jb3JlX21hcFtpXSk7CisJY3B1c19jbGVhcihjcHVfY29yZV9tYXBbY3B1XSk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBjcHVfc2libGluZ19tYXBbY3B1XSkKKwkJY3B1X2NsZWFyKGNwdSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKKwljcHVzX2NsZWFyKGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKworCWMgPSAmY3B1X2RhdGEoY3B1KTsKKworCWMtPmNvcmVfaWQgPSAwOworCWMtPnByb2NfaWQgPSAtMTsKKworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CisJc3Bpbl91bmxvY2soJmNhbGxfbG9jayk7CisKKwlzbXBfd21iKCk7CisKKwkvKiBNYWtlIHN1cmUgbm8gaW50ZXJydXB0cyBwb2ludCB0byB0aGlzIGNwdS4gICovCisJZml4dXBfaXJxcygpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1kZWxheSgxKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJc21wX3JtYigpOworCQlpZiAoIWNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCWlmIChjcHVfaXNzZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7CisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TVU5fTERPTVMpCisJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCQlpbnQgbGltaXQgPSAxMDA7CisKKwkJZG8geworCQkJaHZfZXJyID0gc3VuNHZfY3B1X3N0b3AoY3B1KTsKKwkJCWlmIChodl9lcnIgPT0gSFZfRU9LKSB7CisJCQkJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoLS1saW1pdCA+IDApOworCQlpZiAobGltaXQgPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9jcHVfc3RvcCgpIGZhaWxzIGVycj0lbHVcbiIsCisJCQkgICAgICAgaHZfZXJyKTsKKwkJfQorI2VuZGlmCisJfQorfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQorewogfQogCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggNmZhNzYxNi4uNzE5ZDY3NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTEsNyArMSw2IEBACi0vKiAkSWQ6IHNwYXJjNjRfa3N5bXMuYyx2IDEuMTIxIDIwMDIvMDIvMDkgMTk6NDk6MzEgZGF2ZW0gRXhwICQKLSAqIGFyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jOiBTcGFyYzY0IHNwZWNpZmljIGtzeW1zIHN1cHBvcnQuCisvKiBhcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYzogU3BhcmM2NCBzcGVjaWZpYyBrc3ltcyBzdXBwb3J0LgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk2IEVkZGllIEMuIERvc3QgKGVjZEBza3luZXQuYmUpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opCiAgKi8KQEAgLTI4LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTEyNCwxMCArMTIyLDYgQEAKIEVYUE9SVF9TWU1CT0woX193cml0ZV91bmxvY2spOwogRVhQT1JUX1NZTUJPTChfX3dyaXRlX3RyeWxvY2spOwogCi0vKiBDUFUgb25saW5lIG1hcCBhbmQgYWN0aXZlIGNvdW50LiAgKi8KLUVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwotRVhQT1JUX1NZTUJPTChwaHlzX2NwdV9wcmVzZW50X21hcCk7Ci0KIEVYUE9SVF9TWU1CT0woc21wX2NhbGxfZnVuY3Rpb24pOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzMwLDEyICszMjQsNiBAQAogRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKIEVYUE9SVF9TWU1CT0woc3RybmNtcCk7CiAKLS8qIERlbGF5IHJvdXRpbmVzLiAqLwotRVhQT1JUX1NZTUJPTChfX3VkZWxheSk7Ci1FWFBPUlRfU1lNQk9MKF9fbmRlbGF5KTsKLUVYUE9SVF9TWU1CT0woX19jb25zdF91ZGVsYXkpOwotRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKLQogdm9pZCBWSVNlbnRlcih2b2lkKTsKIC8qIFJBSUQgY29kZSBuZWVkcyB0aGlzICovCiBFWFBPUlRfU1lNQk9MKFZJU2VudGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzZnMuYwppbmRleCBjZGIxNDc3Li41MjgxNmM3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c2ZzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNmcy5jCkBAIC0xOTMsNyArMTkzLDYgQEAKIH0KIAogU0hPV19DUFVEQVRBX1VMT05HX05BTUUoY2xvY2tfdGljaywgY2xvY2tfdGljayk7Ci1TSE9XX0NQVURBVEFfVUxPTkdfTkFNRSh1ZGVsYXlfdmFsLCB1ZGVsYXlfdmFsKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX3NpemUsIGRjYWNoZV9zaXplKTsKIFNIT1dfQ1BVREFUQV9VSU5UX05BTUUobDFfZGNhY2hlX2xpbmVfc2l6ZSwgZGNhY2hlX2xpbmVfc2l6ZSk7CiBTSE9XX0NQVURBVEFfVUlOVF9OQU1FKGwxX2ljYWNoZV9zaXplLCBpY2FjaGVfc2l6ZSk7CkBAIC0yMDMsNyArMjAyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlIGNwdV9jb3JlX2F0dHJzW10gPSB7CiAJX1NZU0RFVl9BVFRSKGNsb2NrX3RpY2ssICAgICAgICAgIDA0NDQsIHNob3dfY2xvY2tfdGljaywgTlVMTCksCi0JX1NZU0RFVl9BVFRSKHVkZWxheV92YWwsICAgICAgICAgIDA0NDQsIHNob3dfdWRlbGF5X3ZhbCwgTlVMTCksCiAJX1NZU0RFVl9BVFRSKGwxX2RjYWNoZV9zaXplLCAgICAgIDA0NDQsIHNob3dfbDFfZGNhY2hlX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9kY2FjaGVfbGluZV9zaXplLCAwNDQ0LCBzaG93X2wxX2RjYWNoZV9saW5lX3NpemUsIE5VTEwpLAogCV9TWVNERVZfQVRUUihsMV9pY2FjaGVfc2l6ZSwgICAgICAwNDQ0LCBzaG93X2wxX2ljYWNoZV9zaXplLCBOVUxMKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKaW5kZXggYTMxYTA0My4uNjJlMzE2YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMKQEAgLTg0OSw5ICs4NDksNiBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJdW5zaWduZWQgbG9uZyBjbG9jazsKLSNpZmRlZiBDT05GSUdfU01QCi0JZXh0ZXJuIHZvaWQgc21wX3RpY2tfaW5pdCh2b2lkKTsKLSNlbmRpZgogCiAJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewpAQCAtODc0LDEwICs4NzEsNiBAQAogCQljbG9jayA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgInN0aWNrLWZyZXF1ZW5jeSIsIDApOwogCX0KIAotI2lmZGVmIENPTkZJR19TTVAKLQlzbXBfdGlja19pbml0KCk7Ci0jZW5kaWYKLQogCXJldHVybiBjbG9jazsKIH0KIApAQCAtMTAzOCwxMCArMTAzMSwzMSBAQAogCXNwYXJjNjRfY2xvY2tldmVudC5tdWx0ID0gbXVsdDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdGJfdGlja3NfcGVyX3VzZWMgX19yZWFkX21vc3RseTsKKwordm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKKworCWJjbG9jayA9IHRpY2tfb3BzLT5nZXRfdGljaygpOworCWRvIHsKKwkJbm93ID0gdGlja19vcHMtPmdldF90aWNrKCk7CisJfSB3aGlsZSAoKG5vdy1iY2xvY2spIDwgbG9vcHMpOworfQorRVhQT1JUX1NZTUJPTChfX2RlbGF5KTsKKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwlfX2RlbGF5KHRiX3RpY2tzX3Blcl91c2VjICogdXNlY3MpOworfQorRVhQT1JUX1NZTUJPTCh1ZGVsYXkpOworCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNsb2NrID0gc3BhcmM2NF9pbml0X3RpbWVycygpOwogCisJdGJfdGlja3NfcGVyX3VzZWMgPSBjbG9jayAvIFVTRUNfUEVSX1NFQzsKKwogCXRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50ID0KIAkJY2xvY2tzb3VyY2VfaHoybXVsdChjbG9jaywgU1BBUkM2NF9OU0VDX1BFUl9DWUNfU0hJRlQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKaW5kZXggMDBhOWUzMi4uNmVmMmQyOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwpAQCAtMjIyNSw2ICsyMjI1LDcgQEAKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIDAsIDI1NSwgU0lHU0VHVik7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oImZsdXNodyIpOwogCV9fc2hvd19yZWdzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCWlmIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikgewogCQlzdHJ1Y3QgcmVnX3dpbmRvdyAqcncgPSAoc3RydWN0IHJlZ193aW5kb3cgKikKIAkJCShyZWdzLT51X3JlZ3NbVVJFR19GUF0gKyBTVEFDS19CSUFTKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTY5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpby5jCkBAIC0wLDAgKzEsMzk1IEBACisvKiB2aW8uYzogVmlydHVhbCBJL08gY2hhbm5lbCBkZXZpY2VzIHByb2JpbmcgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgSUJNIENvcnAuCisgKiAgICAgRGF2ZSBFbmdlYnJldHNlbiBlbmdlYnJldEB1cy5pYm0uY29tCisgKiAgICAgU2FudGlhZ28gTGVvbiBzYW50aWxAdXMuaWJtLmNvbQorICogICAgIEhvbGxpcyBCbGFuY2hhcmQgPGhvbGxpc2JAdXMuaWJtLmNvbT4KKyAqICAgICBTdGVwaGVuIFJvdGh3ZWxsCisgKgorICogQWRhcHRlZCB0byBzcGFyYzY0IGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKworc3RhdGljIGlubGluZSBpbnQgZmluZF9pbl9wcm9wbGlzdChjb25zdCBjaGFyICpsaXN0LCBjb25zdCBjaGFyICptYXRjaCwKKwkJCQkgICBpbnQgbGVuKQoreworCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCBsOworCisJCWlmICghc3RyY21wKGxpc3QsIG1hdGNoKSkKKwkJCXJldHVybiAxOworCQlsID0gc3RybGVuKGxpc3QpICsgMTsKKwkJbGlzdCArPSBsOworCQlsZW4gLT0gbDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqdmlvX21hdGNoX2RldmljZSgKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqbWF0Y2hlcywKKwljb25zdCBzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCWNvbnN0IGNoYXIgKnR5cGUsICpjb21wYXQ7CisJaW50IGxlbjsKKworCXR5cGUgPSBkZXYtPnR5cGU7CisJY29tcGF0ID0gZGV2LT5jb21wYXQ7CisJbGVuID0gZGV2LT5jb21wYXRfbGVuOworCisJd2hpbGUgKG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQorCQkJbWF0Y2ggJj0gIXN0cmNtcChtYXRjaGVzLT50eXBlLCB0eXBlKTsKKworCQlpZiAobWF0Y2hlcy0+Y29tcGF0WzBdKSB7CisJCQltYXRjaCAmPSBsZW4gJiYKKwkJCQlmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgbWF0Y2hlcy0+Y29tcGF0LCBsZW4pOworCQl9CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBtYXRjaGVzOworCQltYXRjaGVzKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHZpb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9fZGV2ID0gdG9fdmlvX2RldihkZXYpOworCXN0cnVjdCB2aW9fZHJpdmVyICp2aW9fZHJ2ID0gdG9fdmlvX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICptYXRjaGVzID0gdmlvX2Rydi0+aWRfdGFibGU7CisKKwlpZiAoIW1hdGNoZXMpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZpb19tYXRjaF9kZXZpY2UobWF0Y2hlcywgdmlvX2RldikgIT0gTlVMTDsKK30KKworc3RhdGljIGludCB2aW9fZGV2aWNlX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAoZHJ2LT5wcm9iZSkgeworCQlpZCA9IHZpb19tYXRjaF9kZXZpY2UoZHJ2LT5pZF90YWJsZSwgdmRldik7CisJCWlmIChpZCkKKwkJCWVycm9yID0gZHJ2LT5wcm9iZSh2ZGV2LCBpZCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHZpb19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2ID0gdG9fdmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpCisJCXJldHVybiBkcnYtPnJlbW92ZSh2ZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBkZXZzcGVjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2ID0gdG9fdmlvX2RldihkZXYpOworCWNvbnN0IGNoYXIgKnN0ciA9ICJub25lIjsKKworCWlmICghc3RyY21wKHZkZXYtPnR5cGUsICJuZXR3b3JrIikpCisJCXN0ciA9ICJ2bmV0IjsKKwllbHNlIGlmICghc3RyY21wKHZkZXYtPnR5cGUsICJibG9jayIpKQorCQlzdHIgPSAidmRpc2siOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHR5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZpb19kZXYgKnZkZXYgPSB0b192aW9fZGV2KGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHZkZXYtPnR5cGUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdmlvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhkZXZzcGVjKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgdmlvX2J1c190eXBlID0geworCS5uYW1lCQk9ICJ2aW8iLAorCS5kZXZfYXR0cnMJPSB2aW9fZGV2X2F0dHJzLAorCS5tYXRjaAkJPSB2aW9fYnVzX21hdGNoLAorCS5wcm9iZQkJPSB2aW9fZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gdmlvX2RldmljZV9yZW1vdmUsCit9OworCitpbnQgdmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCXZpb2Rydi0+ZHJpdmVyLmJ1cyA9ICZ2aW9fYnVzX3R5cGU7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIHZpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqdmlvZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZ2aW9kcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MKHZpb191bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWtmcmVlKHRvX3Zpb19kZXYoZGV2KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3BjaW9icHBhdGhfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJdmRldiA9IHRvX3Zpb19kZXYoZGV2KTsKKwlkcCA9IHZkZXYtPmRwOworCisJcmV0dXJuIHNucHJpbnRmIChidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkcC0+ZnVsbF9uYW1lKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG9icHBhdGgsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJICAgc2hvd19wY2lvYnBwYXRoX2F0dHIsIE5VTEwpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKmNkZXZfbm9kZTsKKworc3RhdGljIHN0cnVjdCB2aW9fZGV2ICpyb290X3ZkZXY7CitzdGF0aWMgdTY0IGNkZXZfY2ZnX2hhbmRsZTsKKworc3RhdGljIHZvaWQgdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhwLCB1NjQgbXAsCisJCQkJICBzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwl1NjQgYTsKKworCW1kZXNjX2Zvcl9lYWNoX2FyYyhhLCBocCwgbXAsIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQljb25zdCB1NjQgKmNoYW5faWQ7CisJCWNvbnN0IHU2NCAqaXJxOworCQl1NjQgdGFyZ2V0OworCisJCXRhcmdldCA9IG1kZXNjX2FyY190YXJnZXQoaHAsIGEpOworCisJCWlycSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdGFyZ2V0LCAidHgtaW5vIiwgTlVMTCk7CisJCWlmIChpcnEpCisJCQl2ZGV2LT50eF9pcnEgPSBzdW40dl9idWlsZF92aXJxKGNkZXZfY2ZnX2hhbmRsZSwgKmlycSk7CisKKwkJaXJxID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJyeC1pbm8iLCBOVUxMKTsKKwkJaWYgKGlycSkKKwkJCXZkZXYtPnJ4X2lycSA9IHN1bjR2X2J1aWxkX3ZpcnEoY2Rldl9jZmdfaGFuZGxlLCAqaXJxKTsKKworCQljaGFuX2lkID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB0YXJnZXQsICJpZCIsIE5VTEwpOworCQlpZiAoY2hhbl9pZCkKKwkJCXZkZXYtPmNoYW5uZWxfaWQgPSAqY2hhbl9pZDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqdmlvX2NyZWF0ZV9vbmUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBtcCwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJY29uc3QgY2hhciAqdHlwZSwgKmNvbXBhdDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCXN0cnVjdCB2aW9fZGV2ICp2ZGV2OworCWludCBlcnIsIHRsZW4sIGNsZW47CisKKwl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgImRldmljZS10eXBlIiwgJnRsZW4pOworCWlmICghdHlwZSkgeworCQl0eXBlID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCBtcCwgIm5hbWUiLCAmdGxlbik7CisJCWlmICghdHlwZSkgeworCQkJdHlwZSA9IG1kZXNjX25vZGVfbmFtZShocCwgbXApOworCQkJdGxlbiA9IHN0cmxlbih0eXBlKSArIDE7CisJCX0KKwl9CisJaWYgKHRsZW4gPiBWSU9fTUFYX1RZUEVfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBUeXBlIHN0cmluZyBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljb21wYXQgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIG1wLCAiZGV2aWNlLXR5cGUiLCAmY2xlbik7CisJaWYgKCFjb21wYXQpIHsKKwkJY2xlbiA9IDA7CisJfSBlbHNlIGlmIChjbGVuID4gVklPX01BWF9DT01QQVRfTEVOKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb21wYXQgbGVuICVkIGZvciBbJXNdIGlzIHRvbyBsb25nLlxuIiwKKwkJICAgICAgIGNsZW4sIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoKnZkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCBhbGxvY2F0ZSB2aW9fZGV2XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmRldi0+bXAgPSBtcDsKKwltZW1jcHkodmRldi0+dHlwZSwgdHlwZSwgdGxlbik7CisJaWYgKGNvbXBhdCkKKwkJbWVtY3B5KHZkZXYtPmNvbXBhdCwgY29tcGF0LCBjbGVuKTsKKwllbHNlCisJCW1lbXNldCh2ZGV2LT5jb21wYXQsIDAsIHNpemVvZih2ZGV2LT5jb21wYXQpKTsKKwl2ZGV2LT5jb21wYXRfbGVuID0gY2xlbjsKKworCXZkZXYtPmNoYW5uZWxfaWQgPSB+MFVMOworCXZkZXYtPnR4X2lycSA9IH4wOworCXZkZXYtPnJ4X2lycSA9IH4wOworCisJdmlvX2ZpbGxfY2hhbm5lbF9pbmZvKGhwLCBtcCwgdmRldik7CisKKwlzbnByaW50Zih2ZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVseCIsIG1wKTsKKwl2ZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworCXZkZXYtPmRldi5idXMgPSAmdmlvX2J1c190eXBlOworCXZkZXYtPmRldi5yZWxlYXNlID0gdmlvX2Rldl9yZWxlYXNlOworCisJaWYgKHBhcmVudCA9PSBOVUxMKSB7CisJCWRwID0gY2Rldl9ub2RlOworCX0gZWxzZSBpZiAodG9fdmlvX2RldihwYXJlbnQpID09IHJvb3RfdmRldikgeworCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgTlVMTCk7CisJCXdoaWxlIChkcCkgeworCQkJaWYgKCFzdHJjbXAoZHAtPnR5cGUsIHR5cGUpKQorCQkJCWJyZWFrOworCisJCQlkcCA9IG9mX2dldF9uZXh0X2NoaWxkKGNkZXZfbm9kZSwgZHApOworCQl9CisJfSBlbHNlIHsKKwkJZHAgPSB0b192aW9fZGV2KHBhcmVudCktPmRwOworCX0KKwl2ZGV2LT5kcCA9IGRwOworCisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UgJXMsIGVycj0lZFxuIiwKKwkJICAgICAgIHZkZXYtPmRldi5idXNfaWQsIGVycik7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZkZXYtPmRwKQorCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmdmRldi0+ZGV2LmtvYmosCisJCQkJCSZkZXZfYXR0cl9vYnBwYXRoLmF0dHIpOworCisJcmV0dXJuIHZkZXY7Cit9CisKK3N0YXRpYyB2b2lkIHdhbGtfdHJlZShzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocCwgdTY0IG4sIHN0cnVjdCB2aW9fZGV2ICpwYXJlbnQpCit7CisJdTY0IGE7CisKKwltZGVzY19mb3JfZWFjaF9hcmMoYSwgaHAsIG4sIE1ERVNDX0FSQ19UWVBFX0ZXRCkgeworCQlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKKwkJdTY0IHRhcmdldDsKKworCQl0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhwLCBhKTsKKwkJdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCB0YXJnZXQsICZwYXJlbnQtPmRldik7CisJCWlmICh2ZGV2KQorCQkJd2Fsa190cmVlKGhwLCB0YXJnZXQsIHZkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2RldmljZXMoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCByb290KQoreworCXU2NCBtcDsKKworCXJvb3RfdmRldiA9IHZpb19jcmVhdGVfb25lKGhwLCByb290LCBOVUxMKTsKKwlpZiAoIXJvb3RfdmRldikgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ291bHQgbm90IGNyZWF0ZSByb290IGRldmljZS5cbiIpOworCQlyZXR1cm47CisJfQorCisJd2Fsa190cmVlKGhwLCByb290LCByb290X3ZkZXYpOworCisJLyogRG9tYWluIHNlcnZpY2VzIGlzIG9kZCBhcyBpdCBkb2Vzbid0IHNpdCB1bmRlcm5lYXRoIHRoZQorCSAqIGNoYW5uZWwtZGV2aWNlcyBub2RlLCBzbyB3ZSBwbHVnIGl0IGluIG1hbnVhbGx5LgorCSAqLworCW1wID0gbWRlc2Nfbm9kZV9ieV9uYW1lKGhwLCBNREVTQ19OT0RFX05VTEwsICJkb21haW4tc2VydmljZXMiKTsKKwlpZiAobXAgIT0gTURFU0NfTk9ERV9OVUxMKSB7CisJCXN0cnVjdCB2aW9fZGV2ICpwYXJlbnQgPSB2aW9fY3JlYXRlX29uZShocCwgbXAsCisJCQkJCQkJJnJvb3RfdmRldi0+ZGV2KTsKKworCQlpZiAocGFyZW50KQorCQkJd2Fsa190cmVlKGhwLCBtcCwgcGFyZW50KTsKKwl9Cit9CisKK2NvbnN0IGNoYXIgKmNoYW5uZWxfZGV2aWNlc19ub2RlID0gImNoYW5uZWwtZGV2aWNlcyI7Citjb25zdCBjaGFyICpjaGFubmVsX2RldmljZXNfY29tcGF0ID0gIlNVTlcsc3VuNHYtY2hhbm5lbC1kZXZpY2VzIjsKK2NvbnN0IGNoYXIgKmNmZ19oYW5kbGVfcHJvcCA9ICJjZmctaGFuZGxlIjsKKworc3RhdGljIGludCBfX2luaXQgdmlvX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwljb25zdCBjaGFyICpjb21wYXQ7CisJY29uc3QgdTY0ICpjZmdfaGFuZGxlOworCWludCBlcnIsIGxlbjsKKwl1NjQgcm9vdDsKKworCWVyciA9IGJ1c19yZWdpc3RlcigmdmlvX2J1c190eXBlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVklPOiBDb3VsZCBub3QgcmVnaXN0ZXIgYnVzIHR5cGUgZXJyPSVkXG4iLAorCQkgICAgICAgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gMDsKKworCXJvb3QgPSBtZGVzY19ub2RlX2J5X25hbWUoaHAsIE1ERVNDX05PREVfTlVMTCwgY2hhbm5lbF9kZXZpY2VzX25vZGUpOworCWlmIChyb290ID09IE1ERVNDX05PREVfTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBNREVTQyBub2RlLlxuIik7CisJCW1kZXNjX3JlbGVhc2UoaHApOworCQlyZXR1cm4gMDsKKwl9CisKKwljZGV2X25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiY2hhbm5lbC1kZXZpY2VzIik7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWNkZXZfbm9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJWSU86IE5vIGNoYW5uZWwtZGV2aWNlcyBPQlAgbm9kZS5cbiIpOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCWNvbXBhdCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgImNvbXBhdGlibGUiLCAmbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIGxhY2tzIGNvbXBhdGlibGUgIgorCQkgICAgICAgInByb3BlcnR5XG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJaWYgKCFmaW5kX2luX3Byb3BsaXN0KGNvbXBhdCwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCwgbGVuKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZJTzogQ2hhbm5lbCBkZXZpY2VzIG5vZGUgbGFja3MgKCVzKSAiCisJCSAgICAgICAiY29tcGF0IGVudHJ5LlxuIiwgY2hhbm5lbF9kZXZpY2VzX2NvbXBhdCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2ZnX2hhbmRsZSA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgcm9vdCwgY2ZnX2hhbmRsZV9wcm9wLCBOVUxMKTsKKwlpZiAoIWNmZ19oYW5kbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWSU86IENoYW5uZWwgZGV2aWNlcyBsYWNrcyAlcyBwcm9wZXJ0eVxuIiwKKwkJICAgICAgIGNmZ19oYW5kbGVfcHJvcCk7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJY2Rldl9jZmdfaGFuZGxlID0gKmNmZ19oYW5kbGU7CisKKwljcmVhdGVfZGV2aWNlcyhocCwgcm9vdCk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitvdXRfcmVsZWFzZToKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitwb3N0Y29yZV9pbml0Y2FsbCh2aW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Zpb2hzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdmlvaHMuYwpAQCAtMCwwICsxLDc5MiBAQAorLyogdmlvaHMuYzogTERPTSBWaXJ0dWFsIEkvTyBoYW5kc2hha2UgaGVscGVyIGxheWVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbGRjLmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorCitpbnQgdmlvX2xkY19zZW5kKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGVyciwgbGltaXQgPSAxMDAwOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAobGltaXQtLSA+IDApIHsKKwkJZXJyID0gbGRjX3dyaXRlKHZpby0+bHAsIGRhdGEsIGxlbik7CisJCWlmICghZXJyIHx8IChlcnIgIT0gLUVBR0FJTikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfc2VuZCk7CisKK3N0YXRpYyBpbnQgc2VuZF9jdHJsKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCSAgICAgc3RydWN0IHZpb19tc2dfdGFnICp0YWcsIGludCBsZW4pCit7CisJdGFnLT5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKwlyZXR1cm4gdmlvX2xkY19zZW5kKHZpbywgdGFnLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBpbml0X3RhZyhzdHJ1Y3QgdmlvX21zZ190YWcgKnRhZywgdTggdHlwZSwgdTggc3R5cGUsIHUxNiBzdHlwZV9lbnYpCit7CisJdGFnLT50eXBlID0gdHlwZTsKKwl0YWctPnN0eXBlID0gc3R5cGU7CisJdGFnLT5zdHlwZV9lbnYgPSBzdHlwZV9lbnY7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF92ZXJzaW9uKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHUxNiBtYWpvciwgdTE2IG1pbm9yKQoreworCXN0cnVjdCB2aW9fdmVyX2luZm8gcGt0OworCisJdmlvLT5fbG9jYWxfc2lkID0gKHUzMikgc2NoZWRfY2xvY2soKTsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisJaW5pdF90YWcoJnBrdC50YWcsIFZJT19UWVBFX0NUUkwsIFZJT19TVUJUWVBFX0lORk8sIFZJT19WRVJfSU5GTyk7CisJcGt0Lm1ham9yID0gbWFqb3I7CisJcGt0Lm1pbm9yID0gbWlub3I7CisJcGt0LmRldl9jbGFzcyA9IHZpby0+ZGV2X2NsYXNzOworCisJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgbWFqb3IsIG1pbm9yLCB2aW8tPmRldl9jbGFzcyk7CisKKwlyZXR1cm4gc2VuZF9jdHJsKHZpbywgJnBrdC50YWcsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCBzdGFydF9oYW5kc2hha2Uoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlpbnQgZXJyOworCisJdmlvZGJnKEhTLCAiU1RBUlQgSEFORFNIQUtFXG4iKTsKKworCXZpby0+aHNfc3RhdGUgPSBWSU9fSFNfSU5WQUxJRDsKKworCWVyciA9IHNlbmRfdmVyc2lvbih2aW8sCisJCQkgICB2aW8tPnZlcl90YWJsZVswXS5tYWpvciwKKwkJCSAgIHZpby0+dmVyX3RhYmxlWzBdLm1pbm9yKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCit2b2lkIHZpb19saW5rX3N0YXRlX2NoYW5nZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXZlbnQpCit7CisJaWYgKGV2ZW50ID09IExEQ19FVkVOVF9VUCkgeworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisKKwkJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCQljYXNlIFZERVZfTkVUV09SSzoKKwkJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCQkJdmlvLT5kcl9zdGF0ZSA9IChWSU9fRFJfU1RBVEVfVFhSRVEgfAorCQkJCQkgVklPX0RSX1NUQVRFX1JYUkVRKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkRFVl9ESVNLOgorCQkJdmlvLT5kcl9zdGF0ZSA9IFZJT19EUl9TVEFURV9UWFJFUTsKKwkJCWJyZWFrOworCQljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCQl2aW8tPmRyX3N0YXRlID0gVklPX0RSX1NUQVRFX1JYUkVROworCQkJYnJlYWs7CisJCX0KKwkJc3RhcnRfaGFuZHNoYWtlKHZpbyk7CisJfQorfQorRVhQT1JUX1NZTUJPTCh2aW9fbGlua19zdGF0ZV9jaGFuZ2UpOworCitzdGF0aWMgaW50IGhhbmRzaGFrZV9mYWlsdXJlKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwkvKiBYWFggUHV0IHBvbGljeSBoZXJlLi4uICBQZXJoYXBzIHN0YXJ0IGEgdGltZXIgdG8gZmlyZQorCSAqIFhYWCBpbiAxMDAgbXMsIHdoaWNoIHdpbGwgYnJpbmcgdGhlIGxpbmsgdXAgYW5kIHJldHJ5CisJICogWFhYIHRoZSBoYW5kc2hha2UuCisJICovCisKKwl2aW9kYmcoSFMsICJIQU5EU0hBS0UgRkFJTFVSRVxuIik7CisKKwl2aW8tPmRyX3N0YXRlICY9IH4oVklPX0RSX1NUQVRFX1RYUkVHIHwKKwkJCSAgIFZJT19EUl9TVEFURV9SWFJFRyk7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1JYX1JJTkddOworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19JTlZBTElEOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdW5rbm93bihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwl2aW9kYmcoSFMsICJVTktOT1dOIENPTlRST0wgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCSAgICAgICBwa3QtPnR5cGUsIHBrdC0+c3R5cGUsIHBrdC0+c3R5cGVfZW52LCBwa3QtPnNpZCk7CisKKwlwcmludGsoS0VSTl9FUlIgInZpbzogSURbJWx1XSBSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIsCisJICAgICAgIHZpby0+dmRldi0+Y2hhbm5lbF9pZCk7CisKKwlsZGNfZGlzY29ubmVjdCh2aW8tPmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCBzZW5kX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXVuaW9uIHsKKwkJc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciBwa3Q7CisJCWNoYXIgYWxsW3NpemVvZihzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyKSArCisJCQkgKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKgorCQkJICBkci0+bmNvb2tpZXMpXTsKKwl9IHU7CisJaW50IGk7CisKKwltZW1zZXQoJnUsIDAsIHNpemVvZih1KSk7CisJaW5pdF90YWcoJnUucGt0LnRhZywgVklPX1RZUEVfQ1RSTCwgVklPX1NVQlRZUEVfSU5GTywgVklPX0RSSU5HX1JFRyk7CisJdS5wa3QuZHJpbmdfaWRlbnQgPSAwOworCXUucGt0Lm51bV9kZXNjciA9IGRyLT5udW1fZW50cmllczsKKwl1LnBrdC5kZXNjcl9zaXplID0gZHItPmVudHJ5X3NpemU7CisJdS5wa3Qub3B0aW9ucyA9IFZJT19UWF9EUklORzsKKwl1LnBrdC5udW1fY29va2llcyA9IGRyLT5uY29va2llczsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIElORk8gbmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdICIKKwkgICAgICAgIm5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgdS5wa3QubnVtX2Rlc2NyLCB1LnBrdC5kZXNjcl9zaXplLCB1LnBrdC5vcHRpb25zLAorCSAgICAgICB1LnBrdC5udW1fY29va2llcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHItPm5jb29raWVzOyBpKyspIHsKKwkJdS5wa3QuY29va2llc1tpXSA9IGRyLT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdS5wa3QuY29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHUucGt0LmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXJldHVybiBzZW5kX2N0cmwodmlvLCAmdS5wa3QudGFnLCBzaXplb2YodSkpOworfQorCitzdGF0aWMgaW50IHNlbmRfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZpb19yZHggcGt0OworCisJbWVtc2V0KCZwa3QsIDAsIHNpemVvZihwa3QpKTsKKworCWluaXRfdGFnKCZwa3QudGFnLCBWSU9fVFlQRV9DVFJMLCBWSU9fU1VCVFlQRV9JTkZPLCBWSU9fUkRYKTsKKworCXZpb2RiZyhIUywgIlNFTkQgUkRYIElORk9cbiIpOworCisJcmV0dXJuIHNlbmRfY3RybCh2aW8sICZwa3QudGFnLCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIHZpby0+b3BzLT5zZW5kX2F0dHIodmlvKTsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiAqZmluZF9ieV9tYWpvcihzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJCQkgdTE2IG1ham9yKQoreworCXN0cnVjdCB2aW9fdmVyc2lvbiAqcmV0ID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2aW8tPnZlcl90YWJsZV9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IHZpb192ZXJzaW9uICp2ID0gJnZpby0+dmVyX3RhYmxlW2ldOworCQlpZiAodi0+bWFqb3IgPD0gbWFqb3IpIHsKKwkJCXJldCA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICp2YXA7CisJaW50IGVycjsKKworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIElORk8gbWFqWyV1XSBtaW5bJXVdIGRldmNsYXNzWyV1XVxuIiwKKwkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vciwgcGt0LT5kZXZfY2xhc3MpOworCisJaWYgKHZpby0+aHNfc3RhdGUgIT0gVklPX0hTX0lOVkFMSUQpIHsKKwkJLyogWFhYIFBlcmhhcHMgaW52b2tlIHN0YXJ0X2hhbmRzaGFrZT8gWFhYICovCisJCW1lbXNldCgmdmlvLT52ZXIsIDAsIHNpemVvZih2aW8tPnZlcikpOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX0lOVkFMSUQ7CisJfQorCisJdmFwID0gZmluZF9ieV9tYWpvcih2aW8sIHBrdC0+bWFqb3IpOworCisJdmlvLT5fcGVlcl9zaWQgPSBwa3QtPnRhZy5zaWQ7CisKKwlpZiAoIXZhcCkgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSAwOworCQlwa3QtPm1pbm9yID0gMDsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWzBdIG1pblswXVxuIik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgaWYgKHZhcC0+bWFqb3IgIT0gcGt0LT5tYWpvcikgeworCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCXBrdC0+bWFqb3IgPSB2YXAtPm1ham9yOworCQlwa3QtPm1pbm9yID0gdmFwLT5taW5vcjsKKwkJdmlvZGJnKEhTLCAiU0VORCBWRVJTSU9OIE5BQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgdmlvX3ZlcnNpb24gdmVyID0geworCQkJLm1ham9yID0gcGt0LT5tYWpvciwKKwkJCS5taW5vciA9IHBrdC0+bWlub3IsCisJCX07CisJCWlmICh2ZXIubWlub3IgPiB2YXAtPm1pbm9yKQorCQkJdmVyLm1pbm9yID0gdmFwLT5taW5vcjsKKwkJcGt0LT5taW5vciA9IHZlci5taW5vcjsKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisJCXZpb2RiZyhIUywgIlNFTkQgVkVSU0lPTiBBQ0sgbWFqWyV1XSBtaW5bJXVdXG4iLAorCQkgICAgICAgcGt0LT5tYWpvciwgcGt0LT5taW5vcik7CisJCWVyciA9IHNlbmRfY3RybCh2aW8sICZwa3QtPnRhZywgc2l6ZW9mKCpwa3QpKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCXZpby0+dmVyID0gdmVyOworCQkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCQl9CisJfQorCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX2FjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgc3RydWN0IHZpb192ZXJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBWRVJTSU9OIEFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSB7CisJCWlmICh2aW8tPnZlci5tYWpvciAhPSBwa3QtPm1ham9yIHx8CisJCSAgICB2aW8tPnZlci5taW5vciAhPSBwa3QtPm1pbm9yKSB7CisJCQlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX05BQ0s7CisJCQkodm9pZCkgc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBzaXplb2YoKnBrdCkpOworCQkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJCX0KKwl9IGVsc2UgeworCQl2aW8tPnZlci5tYWpvciA9IHBrdC0+bWFqb3I7CisJCXZpby0+dmVyLm1pbm9yID0gcGt0LT5taW5vcjsKKwkJdmlvLT5oc19zdGF0ZSA9IFZJT19IU19HT1RWRVJTOworCX0KKworCXN3aXRjaCAodmlvLT5kZXZfY2xhc3MpIHsKKwljYXNlIFZERVZfTkVUV09SSzoKKwljYXNlIFZERVZfRElTSzoKKwkJaWYgKHNlbmRfYXR0cih2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyX25hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICBzdHJ1Y3QgdmlvX3Zlcl9pbmZvICpwa3QpCit7CisJc3RydWN0IHZpb192ZXJzaW9uICpudmVyOworCisJdmlvZGJnKEhTLCAiR09UIFZFUlNJT04gTkFDSyBtYWpbJXVdIG1pblsldV0gZGV2Y2xhc3NbJXVdXG4iLAorCSAgICAgICBwa3QtPm1ham9yLCBwa3QtPm1pbm9yLCBwa3QtPmRldl9jbGFzcyk7CisKKwlpZiAoKHBrdC0+bWFqb3IgPT0gMCAmJiBwa3QtPm1pbm9yID09IDApIHx8CisJICAgICEobnZlciA9IGZpbmRfYnlfbWFqb3IodmlvLCBwa3QtPm1ham9yKSkpCisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJaWYgKHNlbmRfdmVyc2lvbih2aW8sIG52ZXItPm1ham9yLCBudmVyLT5taW5vcikgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfdmVyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fdmVyX2luZm8gKnBrdCkKK3sKKwlzd2l0Y2ggKHBrdC0+dGFnLnN0eXBlKSB7CisJY2FzZSBWSU9fU1VCVFlQRV9JTkZPOgorCQlyZXR1cm4gcHJvY2Vzc192ZXJfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfdmVyX2Fjayh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX05BQ0s6CisJCXJldHVybiBwcm9jZXNzX3Zlcl9uYWNrKHZpbywgcGt0KTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX07Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKnBrdCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19HT1RWRVJTKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwllcnIgPSB2aW8tPm9wcy0+aGFuZGxlX2F0dHIodmlvLCBwa3QpOworCWlmIChlcnIgPCAwKSB7CisJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCX0gZWxzZSB7CisJCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX0dPVF9BVFRSOworCisJCWlmICgodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSkgJiYKKwkJICAgICEodmlvLT5oc19zdGF0ZSAmIFZJT19IU19TRU5UX0RSRUcpKSB7CisJCQlpZiAoc2VuZF9kcmVnKHZpbykgPCAwKQorCQkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCisJCQl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19TRU5UX0RSRUc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsX2RyaW5nc19yZWdpc3RlcmVkKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJaW50IG5lZWRfcngsIG5lZWRfdHg7CisKKwluZWVkX3J4ID0gKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpOworCW5lZWRfdHggPSAodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFUSk7CisKKwlpZiAobmVlZF9yeCAmJgorCSAgICAhKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRUcpKQorCQlyZXR1cm4gMDsKKworCWlmIChuZWVkX3R4ICYmCisJICAgICEodmlvLT5kcl9zdGF0ZSAmIFZJT19EUl9TVEFURV9UWFJFRykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19kcmVnX2luZm8oc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCWludCBpLCBsZW47CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfUkVHIElORk8gaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWlmICghKHZpby0+ZHJfc3RhdGUgJiBWSU9fRFJfU1RBVEVfUlhSRVEpKQorCQlnb3RvIHNlbmRfbmFjazsKKworCWlmICh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1JYUkVHKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWYgPSBremFsbG9jKHBrdC0+ZGVzY3Jfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCF2aW8tPmRlc2NfYnVmKQorCQlnb3RvIHNlbmRfbmFjazsKKworCXZpby0+ZGVzY19idWZfbGVuID0gcGt0LT5kZXNjcl9zaXplOworCisJZHIgPSAmdmlvLT5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKworCWRyLT5udW1fZW50cmllcyA9IHBrdC0+bnVtX2Rlc2NyOworCWRyLT5lbnRyeV9zaXplID0gcGt0LT5kZXNjcl9zaXplOworCWRyLT5uY29va2llcyA9IHBrdC0+bnVtX2Nvb2tpZXM7CisJZm9yIChpID0gMDsgaSA8IGRyLT5uY29va2llczsgaSsrKSB7CisJCWRyLT5jb29raWVzW2ldID0gcGt0LT5jb29raWVzW2ldOworCisJCXZpb2RiZyhIUywgIkRSSU5HIENPT0tJRSglZCkgWyUwMTZsbHg6JTAxNmxseF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIHBrdC0+Y29va2llc1tpXS5jb29raWVfYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBwa3QtPmNvb2tpZXNbaV0uY29va2llX3NpemUpOworCX0KKworCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfQUNLOworCXBrdC0+ZHJpbmdfaWRlbnQgPSArK2RyLT5pZGVudDsKKworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIEFDSyBpZGVudFslbGx4XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCk7CisKKwlsZW4gPSAoc2l6ZW9mKCpwa3QpICsKKwkgICAgICAgKGRyLT5uY29va2llcyAqIHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkpKTsKKwlpZiAoc2VuZF9jdHJsKHZpbywgJnBrdC0+dGFnLCBsZW4pIDwgMCkKKwkJZ290byBzZW5kX25hY2s7CisKKwl2aW8tPmRyX3N0YXRlIHw9IFZJT19EUl9TVEFURV9SWFJFRzsKKworCXJldHVybiAwOworCitzZW5kX25hY2s6CisJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9OQUNLOworCXZpb2RiZyhIUywgIlNFTkQgRFJJTkdfUkVHIE5BQ0tcbiIpOworCSh2b2lkKSBzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBBQ0sgaWRlbnRbJWxseF0gIgorCSAgICAgICAibmRlc2NbJXVdIGRzelsldV0gb3B0WzB4JXhdIG5jb29raWVzWyV1XVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5kcmluZ19pZGVudCwKKwkgICAgICAgcGt0LT5udW1fZGVzY3IsIHBrdC0+ZGVzY3Jfc2l6ZSwgcGt0LT5vcHRpb25zLAorCSAgICAgICBwa3QtPm51bV9jb29raWVzKTsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlpZiAoISh2aW8tPmRyX3N0YXRlICYgVklPX0RSX1NUQVRFX1RYUkVRKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwlkci0+aWRlbnQgPSBwa3QtPmRyaW5nX2lkZW50OworCXZpby0+ZHJfc3RhdGUgfD0gVklPX0RSX1NUQVRFX1RYUkVHOworCisJaWYgKGFsbF9kcmluZ3NfcmVnaXN0ZXJlZCh2aW8pKSB7CisJCWlmIChzZW5kX3JkeCh2aW8pIDwgMCkKKwkJCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworCQl2aW8tPmhzX3N0YXRlID0gVklPX0hTX1NFTlRfUkRYOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWdfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgICBzdHJ1Y3QgdmlvX2RyaW5nX3JlZ2lzdGVyICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIERSSU5HX1JFRyBOQUNLIGlkZW50WyVsbHhdICIKKwkgICAgICAgIm5kZXNjWyV1XSBkc3pbJXVdIG9wdFsweCV4XSBuY29va2llc1sldV1cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC0+ZHJpbmdfaWRlbnQsCisJICAgICAgIHBrdC0+bnVtX2Rlc2NyLCBwa3QtPmRlc2NyX3NpemUsIHBrdC0+b3B0aW9ucywKKwkgICAgICAgcGt0LT5udW1fY29va2llcyk7CisKKwlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2RyZWcoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCXN0cnVjdCB2aW9fZHJpbmdfcmVnaXN0ZXIgKnBrdCkKK3sKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0dPVFZFUlMpKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX2RyZWdfaW5mbyh2aW8sIHBrdCk7CisKKwljYXNlIFZJT19TVUJUWVBFX0FDSzoKKwkJcmV0dXJuIHByb2Nlc3NfZHJlZ19hY2sodmlvLCBwa3QpOworCisJY2FzZSBWSU9fU1VCVFlQRV9OQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19kcmVnX25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZHVucmVnKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgIHN0cnVjdCB2aW9fZHJpbmdfdW5yZWdpc3RlciAqcGt0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisKKwl2aW9kYmcoSFMsICJHT1QgRFJJTkdfVU5SRUdcbiIpOworCisJaWYgKHBrdC0+ZHJpbmdfaWRlbnQgIT0gZHItPmlkZW50KQorCQlyZXR1cm4gMDsKKworCXZpby0+ZHJfc3RhdGUgJj0gflZJT19EUl9TVEFURV9SWFJFRzsKKworCW1lbXNldChkciwgMCwgc2l6ZW9mKCpkcikpOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19yZHhfaW5mbyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX3JkeCAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBSRFggSU5GT1xuIik7CisKKwlwa3QtPnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0FDSzsKKwl2aW9kYmcoSFMsICJTRU5EIFJEWCBBQ0tcbiIpOworCWlmIChzZW5kX2N0cmwodmlvLCAmcGt0LT50YWcsIHNpemVvZigqcGt0KSkgPCAwKQorCQlyZXR1cm4gaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXZpby0+aHNfc3RhdGUgfD0gVklPX0hTX1NFTlRfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19yZHggKnBrdCkKK3sKKwl2aW9kYmcoSFMsICJHT1QgUkRYIEFDS1xuIik7CisKKwlpZiAoISh2aW8tPmhzX3N0YXRlICYgVklPX0hTX1NFTlRfUkRYKSkKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisKKwl2aW8tPmhzX3N0YXRlIHw9IFZJT19IU19HT1RfUkRYX0FDSzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3JkeF9uYWNrKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIFJEWCBOQUNLXG4iKTsKKworCXJldHVybiBoYW5kc2hha2VfZmFpbHVyZSh2aW8pOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfcmR4KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fcmR4ICpwa3QpCit7CisJaWYgKCFhbGxfZHJpbmdzX3JlZ2lzdGVyZWQodmlvKSkKKwkJaGFuZHNoYWtlX2ZhaWx1cmUodmlvKTsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBwcm9jZXNzX3JkeF9pbmZvKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfQUNLOgorCQlyZXR1cm4gcHJvY2Vzc19yZHhfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIHByb2Nlc3NfcmR4X25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhhbmRzaGFrZV9mYWlsdXJlKHZpbyk7CisJfQorfQorCitpbnQgdmlvX2NvbnRyb2xfcGt0X2VuZ2luZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpwa3QpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICp0YWcgPSBwa3Q7CisJdTggcHJldl9zdGF0ZSA9IHZpby0+aHNfc3RhdGU7CisJaW50IGVycjsKKworCXN3aXRjaCAodGFnLT5zdHlwZV9lbnYpIHsKKwljYXNlIFZJT19WRVJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc192ZXIodmlvLCBwa3QpOworCQlicmVhazsKKworCWNhc2UgVklPX0FUVFJfSU5GTzoKKwkJZXJyID0gcHJvY2Vzc19hdHRyKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19EUklOR19SRUc6CisJCWVyciA9IHByb2Nlc3NfZHJlZyh2aW8sIHBrdCk7CisJCWJyZWFrOworCisJY2FzZSBWSU9fRFJJTkdfVU5SRUc6CisJCWVyciA9IHByb2Nlc3NfZHVucmVnKHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwljYXNlIFZJT19SRFg6CisJCWVyciA9IHByb2Nlc3NfcmR4KHZpbywgcGt0KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSBwcm9jZXNzX3Vua25vd24odmlvLCBwa3QpOworCQlicmVhazsKKwl9CisJaWYgKCFlcnIgJiYKKwkgICAgdmlvLT5oc19zdGF0ZSAhPSBwcmV2X3N0YXRlICYmCisJICAgICh2aW8tPmhzX3N0YXRlICYgVklPX0hTX0NPTVBMRVRFKSkKKwkJdmlvLT5vcHMtPmhhbmRzaGFrZV9jb21wbGV0ZSh2aW8pOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2NvbnRyb2xfcGt0X2VuZ2luZSk7CisKK3ZvaWQgdmlvX2Nvbm5fcmVzZXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKK30KK0VYUE9SVF9TWU1CT0wodmlvX2Nvbm5fcmVzZXQpOworCisvKiBUaGUgaXNzdWUgaXMgdGhhdCB0aGUgU29sYXJpcyB2aXJ0dWFsIGRpc2sgc2VydmVyIGp1c3QgbWlycm9ycyB0aGUKKyAqIFNJRCB2YWx1ZXMgaXQgZ2V0cyBmcm9tIHRoZSBjbGllbnQgcGVlci4gIFNvIHdlIHdvcmsgYXJvdW5kIHRoYXQKKyAqIGhlcmUgaW4gdmlvX3t2YWxpZGF0ZSxzZW5kfV9zaWQoKSBzbyB0aGF0IHRoZSBkcml2ZXJzIGRvbid0IG5lZWQKKyAqIHRvIGJlIGF3YXJlIG9mIHRoaXMgY3JhcC4KKyAqLworaW50IHZpb192YWxpZGF0ZV9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgc3RydWN0IHZpb19tc2dfdGFnICp0cCkKK3sKKwl1MzIgc2lkOworCisJLyogQWx3YXlzIGxldCBWRVJTSU9OK0lORk8gcGFja2V0cyB0aHJvdWdoIHVuY2hlY2tlZCwgdGhleQorCSAqIGRlZmluZSB0aGUgbmV3IFNJRC4KKwkgKi8KKwlpZiAodHAtPnR5cGUgPT0gVklPX1RZUEVfQ1RSTCAmJgorCSAgICB0cC0+c3R5cGUgPT0gVklPX1NVQlRZUEVfSU5GTyAmJgorCSAgICB0cC0+c3R5cGVfZW52ID09IFZJT19WRVJfSU5GTykKKwkJcmV0dXJuIDA7CisKKwkvKiBPaywgbm93IGZpZ3VyZSBvdXQgd2hpY2ggU0lEIHRvIHVzZS4gICovCisJc3dpdGNoICh2aW8tPmRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJZGVmYXVsdDoKKwkJc2lkID0gdmlvLT5fcGVlcl9zaWQ7CisJCWJyZWFrOworCisJY2FzZSBWREVWX0RJU0s6CisJCXNpZCA9IHZpby0+X2xvY2FsX3NpZDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNpZCA9PSB0cC0+c2lkKQorCQlyZXR1cm4gMDsKKwl2aW9kYmcoREFUQSwgIkJBRCBTSUQgdGFnLT5zaWRbJTA4eF0gcGVlcl9zaWRbJTA4eF0gbG9jYWxfc2lkWyUwOHhdXG4iLAorCSAgICAgICB0cC0+c2lkLCB2aW8tPl9wZWVyX3NpZCwgdmlvLT5fbG9jYWxfc2lkKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3ZhbGlkYXRlX3NpZCk7CisKK3UzMiB2aW9fc2VuZF9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzd2l0Y2ggKHZpby0+ZGV2X2NsYXNzKSB7CisJY2FzZSBWREVWX05FVFdPUks6CisJY2FzZSBWREVWX05FVFdPUktfU1dJVENIOgorCWNhc2UgVkRFVl9ESVNLOgorCWRlZmF1bHQ6CisJCXJldHVybiB2aW8tPl9sb2NhbF9zaWQ7CisKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCXJldHVybiB2aW8tPl9wZWVyX3NpZDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHZpb19zZW5kX3NpZCk7CisKK2V4dGVybiBpbnQgdmlvX2xkY19hbGxvYyhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgKmJhc2VfY2ZnLAorCQkJIHZvaWQgKmV2ZW50X2FyZykKK3sKKwlzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnIGNmZyA9ICpiYXNlX2NmZzsKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwOworCisJY2ZnLnR4X2lycSA9IHZpby0+dmRldi0+dHhfaXJxOworCWNmZy5yeF9pcnEgPSB2aW8tPnZkZXYtPnJ4X2lycTsKKworCWxwID0gbGRjX2FsbG9jKHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgJmNmZywgZXZlbnRfYXJnKTsKKwlpZiAoSVNfRVJSKGxwKSkKKwkJcmV0dXJuIFBUUl9FUlIobHApOworCisJdmlvLT5scCA9IGxwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19sZGNfYWxsb2MpOworCit2b2lkIHZpb19sZGNfZnJlZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCWxkY19mcmVlKHZpby0+bHApOworCXZpby0+bHAgPSBOVUxMOworCisJa2ZyZWUodmlvLT5kZXNjX2J1Zik7CisJdmlvLT5kZXNjX2J1ZiA9IE5VTEw7CisJdmlvLT5kZXNjX2J1Zl9sZW4gPSAwOworfQorRVhQT1JUX1NZTUJPTCh2aW9fbGRjX2ZyZWUpOworCit2b2lkIHZpb19wb3J0X3VwKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyLCBzdGF0ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCXN0YXRlID0gbGRjX3N0YXRlKHZpby0+bHApOworCisJZXJyID0gMDsKKwlpZiAoc3RhdGUgPT0gTERDX1NUQVRFX0lOSVQpIHsKKwkJZXJyID0gbGRjX2JpbmQodmlvLT5scCwgdmlvLT5uYW1lKTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQb3J0ICVsdSBiaW5kIGZhaWxlZCwgIgorCQkJICAgICAgICJlcnI9JWRcbiIsCisJCQkgICAgICAgdmlvLT5uYW1lLCB2aW8tPnZkZXYtPmNoYW5uZWxfaWQsIGVycik7CisJfQorCisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbGRjX2Nvbm5lY3QodmlvLT5scCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9ydCAlbHUgY29ubmVjdCBmYWlsZWQsICIKKwkJCSAgICAgICAiZXJyPSVkXG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwgdmlvLT52ZGV2LT5jaGFubmVsX2lkLCBlcnIpOworCX0KKwlpZiAoZXJyKSB7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKworCQlleHBpcmVzID0gcm91bmRfamlmZmllcyhleHBpcmVzKTsKKwkJbW9kX3RpbWVyKCZ2aW8tPnRpbWVyLCBleHBpcmVzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wodmlvX3BvcnRfdXApOworCitzdGF0aWMgdm9pZCB2aW9fcG9ydF90aW1lcih1bnNpZ25lZCBsb25nIF9hcmcpCit7CisJc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyA9IChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqKSBfYXJnOworCisJdmlvX3BvcnRfdXAodmlvKTsKK30KKworaW50IHZpb19kcml2ZXJfaW5pdChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJICAgIHU4IGRldl9jbGFzcywgc3RydWN0IHZpb192ZXJzaW9uICp2ZXJfdGFibGUsCisJCSAgICBpbnQgdmVyX3RhYmxlX3NpemUsIHN0cnVjdCB2aW9fZHJpdmVyX29wcyAqb3BzLAorCQkgICAgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKGRldl9jbGFzcykgeworCWNhc2UgVkRFVl9ORVRXT1JLOgorCWNhc2UgVkRFVl9ORVRXT1JLX1NXSVRDSDoKKwljYXNlIFZERVZfRElTSzoKKwljYXNlIFZERVZfRElTS19TRVJWRVI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFvcHMtPnNlbmRfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kbGVfYXR0ciB8fAorCSAgICAhb3BzLT5oYW5kc2hha2VfY29tcGxldGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF2ZXJfdGFibGUgfHwgdmVyX3RhYmxlX3NpemUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaW5pdCgmdmlvLT5sb2NrKTsKKworCXZpby0+bmFtZSA9IG5hbWU7CisKKwl2aW8tPmRldl9jbGFzcyA9IGRldl9jbGFzczsKKwl2aW8tPnZkZXYgPSB2ZGV2OworCisJdmlvLT52ZXJfdGFibGUgPSB2ZXJfdGFibGU7CisJdmlvLT52ZXJfdGFibGVfZW50cmllcyA9IHZlcl90YWJsZV9zaXplOworCisJdmlvLT5vcHMgPSBvcHM7CisKKwlzZXR1cF90aW1lcigmdmlvLT50aW1lciwgdmlvX3BvcnRfdGltZXIsICh1bnNpZ25lZCBsb25nKSB2aW8pOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZpb19kcml2ZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlIGIvYXJjaC9zcGFyYzY0L2xpYi9NYWtlZmlsZQppbmRleCA0YTcyNWQ4Li5jNGE2ZDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDYgQEAKIAkgTkdtZW1jcHkubyBOR2NvcHlfZnJvbV91c2VyLm8gTkdjb3B5X3RvX3VzZXIubyBOR3BhdGNoLm8gXAogCSBOR3BhZ2UubyBOR2J6ZXJvLm8gXAogCSBjb3B5X2luX3VzZXIubyB1c2VyX2ZpeHVwLm8gbWVtbW92ZS5vIFwKLQkgbWNvdW50Lm8gaXBjc3VtLm8gcndzZW0ubyB4b3IubyBkZWxheS5vCisJIG1jb3VudC5vIGlwY3N1bS5vIHJ3c2VtLm8geG9yLm8KIAogb2JqLXkgKz0gaW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jIGIvYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI3ZTU0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc3BhcmM2NC9saWIvZGVsYXkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIGRlbGF5LmM6IERlbGF5IGxvb3BzIGZvciBzcGFyYzY0Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KLSAqCi0gKiBCYXNlZCBoZWF2aWx5IHVwb24geDg2IHZhcmlhbnQgd2hpY2ggaXM6Ci0gKglDb3B5cmlnaHQgKEMpIDE5OTMgTGludXMgVG9ydmFsZHMKLSAqCUNvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLQotdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCi17Ci0JdW5zaWduZWQgbG9uZyBiY2xvY2ssIG5vdzsKLQkKLQliY2xvY2sgPSB0aWNrX29wcy0+Z2V0X3RpY2soKTsKLQlkbyB7Ci0JCW5vdyA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwotCX0gd2hpbGUgKChub3ctYmNsb2NrKSA8IGxvb3BzKTsKLX0KLQotLyogV2UgdXNlZCB0byBtdWx0aXBseSBieSBIWiBhZnRlciBzaGlmdGluZyBkb3duIGJ5IDMyIGJpdHMKLSAqIGJ1dCB0aGF0IHJ1bnMgaW50byBwcm9ibGVtcyBmb3IgaGlnaGVyIHZhbHVlcyBvZiBIWiBhbmQKLSAqIHNsb3cgY3B1cy4KLSAqLwotdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JbiAqPSA0OwotCi0JbiAqPSAoY3B1X2RhdGEocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkudWRlbGF5X3ZhbCAqIChIWi80KSk7Ci0JbiA+Pj0gMzI7Ci0KLQlfX2RlbGF5KG4gKyAxKTsKLX0KLQotdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIG4pCi17Ci0JX19jb25zdF91ZGVsYXkobiAqIDB4MTBjN1VMKTsKLX0KLQotCi12b2lkIF9fbmRlbGF5KHVuc2lnbmVkIGxvbmcgbikKLXsKLQlfX2NvbnN0X3VkZWxheShuICogMHg1VUwpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jIGIvYXJjaC9zcGFyYzY0L3Byb20vbWlzYy5jCmluZGV4IGYzZTBjMTQuLjMzYzViN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL21pc2MuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS9taXNjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgogCiBpbnQgcHJvbV9zZXJ2aWNlX2V4aXN0cyhjb25zdCBjaGFyICpzZXJ2aWNlX25hbWUpCiB7CkBAIC0zNyw2ICszOCwxMCBAQAogLyogUmVzZXQgYW5kIHJlYm9vdCB0aGUgbWFjaGluZSB3aXRoIHRoZSBjb21tYW5kICdiY29tbWFuZCcuICovCiB2b2lkIHByb21fcmVib290KGNvbnN0IGNoYXIgKmJjb21tYW5kKQogeworI2lmZGVmIENPTkZJR19TVU5fTERPTVMKKwlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkKKwkJbGRvbV9yZWJvb3QoYmNvbW1hbmQpOworI2VuZGlmCiAJcDEyNzVfY21kKCJib290IiwgUDEyNzVfQVJHKDAsIFAxMjc1X0FSR19JTl9TVFJJTkcpIHwKIAkJICBQMTI3NV9JTk9VVCgxLCAwKSwgYmNvbW1hbmQpOwogfQpAQCAtOTEsNiArOTYsMTAgQEAKICAqLwogdm9pZCBwcm9tX2hhbHQodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfU1VOX0xET01TCisJaWYgKGxkb21fZG9tYWluaW5nX2VuYWJsZWQpCisJCWxkb21fcG93ZXJfb2ZmKCk7CisjZW5kaWYKIGFnYWluOgogCXAxMjc1X2NtZCgiZXhpdCIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAlnb3RvIGFnYWluOyAvKiBQUk9NIGlzIG91dCB0byBnZXQgbWUgLURhdmVNICovCkBAIC05OCw2ICsxMDcsMTAgQEAKIAogdm9pZCBwcm9tX2hhbHRfcG93ZXJfb2ZmKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKQorCQlsZG9tX3Bvd2VyX29mZigpOworI2VuZGlmCiAJcDEyNzVfY21kKCJTVU5XLHBvd2VyLW9mZiIsIFAxMjc1X0lOT1VUKDAsIDApKTsKIAogCS8qIGlmIG5vdGhpbmcgZWxzZSBoZWxwcywgd2UganVzdCBoYWx0ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vcDEyNzUuYwppbmRleCAyYjMyYzQ4Li43ZmNjY2MwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvcHJvbS9wMTI3NS5jCisrKyBiL2FyY2gvc3BhcmM2NC9wcm9tL3AxMjc1LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NwaXRmaXJlLmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogc3RydWN0IHsKIAlsb25nIHByb21fY2FsbGJhY2s7CQkJLyogMHgwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jIGIvYXJjaC9zcGFyYzY0L3Byb20vdHJlZS5jCmluZGV4IDUwMGYwNWUuLjE3YjdlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL3RyZWUuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS90cmVlLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KIAogLyogUmV0dXJuIHRoZSBjaGlsZCBvZiBub2RlICdub2RlJyBvciB6ZXJvIGlmIG5vIHRoaXMgbm9kZSBoYXMgbm8KICAqIGRpcmVjdCBkZXNjZW5kZW50LgpAQCAtMjYxLDkgKzI2MiwxNyBAQAogaW50CiBwcm9tX3NldHByb3AoaW50IG5vZGUsIGNvbnN0IGNoYXIgKnBuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHNpemUpCiB7Ci0JaWYoc2l6ZSA9PSAwKSByZXR1cm4gMDsKLQlpZigocG5hbWUgPT0gMCkgfHwgKHZhbHVlID09IDApKSByZXR1cm4gMDsKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoKHBuYW1lID09IDApIHx8ICh2YWx1ZSA9PSAwKSkKKwkJcmV0dXJuIDA7CiAJCisjaWZkZWYgQ09ORklHX1NVTl9MRE9NUworCWlmIChsZG9tX2RvbWFpbmluZ19lbmFibGVkKSB7CisJCWxkb21fc2V0X3ZhcihwbmFtZSwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKIAlyZXR1cm4gcDEyNzVfY21kICgic2V0cHJvcCIsIFAxMjc1X0FSRygxLFAxMjc1X0FSR19JTl9TVFJJTkcpfAogCQkJCQkgIFAxMjc1X0FSRygyLFAxMjc1X0FSR19JTl9CVUYpfAogCQkJCQkgIFAxMjc1X0lOT1VUKDQsIDEpLCAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwppbmRleCAwOWMxYWNhLi5jODZmNWViIDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC91bS9LY29uZmlnLmRlYnVnCkBAIC00Nyw0ICs0NywxMyBAQAogICAgICAgICBJZiB5b3UncmUgaW52b2x2ZWQgaW4gVU1MIGtlcm5lbCBkZXZlbG9wbWVudCBhbmQgd2FudCB0byB1c2UgZ2NvdiwKICAgICAgICAgc2F5IFkuICBJZiB5b3UncmUgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCisJYm9vbCAiU3RhY2sgdXRpbGl6YXRpb24gaW5zdHJ1bWVudGF0aW9uIgorCWRlZmF1bHQgTgorCWhlbHAKKwkgIFRyYWNrIHRoZSBtYXhpbXVtIGtlcm5lbCBzdGFjayB1c2FnZSAtIHRoaXMgd2lsbCBsb29rIGF0IGVhY2gKKwkgIGtlcm5lbCBzdGFjayBhdCBwcm9jZXNzIGV4aXQgYW5kIGxvZyBpdCBpZiBpdCdzIHRoZSBkZWVwZXN0CisJICBzdGFjayBzZWVuIHNvIGZhci4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gc29tZXdoYXQuCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3VtL2NvbmZpZy5yZWxlYXNlIGIvYXJjaC91bS9jb25maWcucmVsZWFzZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2OGJjYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2NvbmZpZy5yZWxlYXNlCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMKLUNPTkZJR19VU0VSTU9ERT15Ci0jIENPTkZJR19JU0EgaXMgbm90IHNldAotIyBDT05GSUdfU0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLQotIwotIyBHZW5lcmFsIFNldHVwCi0jCi1DT05GSUdfU1RESU9fQ09OU09MRT15Ci1DT05GSUdfTkVUPXkKLUNPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0JJTkZNVF9BT1VUPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfTUlTQz15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX1VOSVg5OF9QVFlfQ09VTlQ9MjU2Ci1DT05GSUdfU1NMPXkKLUNPTkZJR19IT1NURlM9eQotQ09ORklHX01DT05TT0xFPXkKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19IT1NUXzJHXzJHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VNTF9TTVAgaXMgbm90IHNldAotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLUNPTkZJR19DT05fWkVST19DSEFOPSJmZDowLGZkOjEiCi1DT05GSUdfQ09OX0NIQU49Inh0ZXJtIgotQ09ORklHX1NTTF9DSEFOPSJwdHkiCi1DT05GSUdfTkVTVF9MRVZFTD0wCi1DT05GSUdfS0VSTkVMX0hBTEZfR0lHUz0xCi0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19LTU9EPXkKLQotIwotIyBEZXZpY2VzCi0jCi1DT05GSUdfQkxLX0RFVl9VQkQ9eQotIyBDT05GSUdfQkxLX0RFVl9VQkRfU1lOQyBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9MT09QPXkKLUNPTkZJR19CTEtfREVWX05CRD15Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgotQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKLSMgQ09ORklHX01NQVBQRVIgaXMgbm90IHNldAotQ09ORklHX1VNTF9TT1VORD15Ci1DT05GSUdfU09VTkQ9eQotQ09ORklHX0hPU1RBVURJTz15Ci0jIENPTkZJR19VTUxfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfVFRZX0xPRyBpcyBub3Qgc2V0Ci1DT05GSUdfRkRfQ0hBTj15Ci0jIENPTkZJR19OVUxMX0NIQU4gaXMgbm90IHNldAotQ09ORklHX1BPUlRfQ0hBTj15Ci1DT05GSUdfUFRZX0NIQU49eQotQ09ORklHX1RUWV9DSEFOPXkKLUNPTkZJR19YVEVSTV9DSEFOPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotQ09ORklHX1BBQ0tFVF9NTUFQPXkKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSUxURVIgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX0lORVQ9eQotIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FQ04gaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19LSFRUUEQgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotCi0jCi0jICAKLSMKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9IV19GTE9XQ09OVFJPTCBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19VTUxfTkVUPXkKLUNPTkZJR19VTUxfTkVUX0VUSEVSVEFQPXkKLUNPTkZJR19VTUxfTkVUX1RVTlRBUD15Ci1DT05GSUdfVU1MX05FVF9TTElQPXkKLUNPTkZJR19VTUxfTkVUX0RBRU1PTj15Ci1DT05GSUdfVU1MX05FVF9NQ0FTVD15Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0KLSMKLSMgQVJDbmV0IGRldmljZXMKLSMKLSMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVk9eQotQ09ORklHX0JPTkRJTkc9bQotQ09ORklHX0VRVUFMSVpFUj1tCi1DT05GSUdfVFVOPXkKLSMgQ09ORklHX0VUSEVSVEFQIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLSMgQ09ORklHX05FVF9FVEhFUk5FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ZUklfU0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAotIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci1DT05GSUdfUExJUD1tCi1DT05GSUdfUFBQPW0KLUNPTkZJR19QUFBfTVVMVElMSU5LPXkKLSMgQ09ORklHX1BQUF9GSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfUFBQX0FTWU5DIGlzIG5vdCBzZXQKLUNPTkZJR19QUFBfU1lOQ19UVFk9bQotQ09ORklHX1BQUF9ERUZMQVRFPW0KLUNPTkZJR19QUFBfQlNEQ09NUD1tCi1DT05GSUdfUFBQT0U9bQotQ09ORklHX1NMSVA9bQotQ09ORklHX1NMSVBfQ09NUFJFU1NFRD15Ci1DT05GSUdfU0xJUF9TTUFSVD15Ci0jIENPTkZJR19TTElQX01PREVfU0xJUDYgaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1BDSSBpcyBub3Qgc2V0Ci1DT05GSUdfU0hBUEVSPW0KLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19RVU9UQT15Ci1DT05GSUdfQVVUT0ZTX0ZTPW0KLUNPTkZJR19BVVRPRlM0X0ZTPW0KLUNPTkZJR19SRUlTRVJGU19GUz1tCi0jIENPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19QUk9DX0lORk8gaXMgbm90IHNldAotQ09ORklHX0FERlNfRlM9bQotIyBDT05GSUdfQURGU19GU19SVyBpcyBub3Qgc2V0Ci1DT05GSUdfQUZGU19GUz1tCi1DT05GSUdfSEZTX0ZTPW0KLUNPTkZJR19CRlNfRlM9bQotQ09ORklHX0VYVDNfRlM9eQotQ09ORklHX0pCRD15Ci0jIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0ZBVF9GUz15Ci1DT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1VNU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15Ci1DT05GSUdfRUZTX0ZTPW0KLSMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAotQ09ORklHX0NSQU1GUz1tCi1DT05GSUdfVE1QRlM9eQotQ09ORklHX1JBTUZTPW0KLUNPTkZJR19JU085NjYwX0ZTPXkKLSMgQ09ORklHX0pPTElFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlMgaXMgbm90IHNldAotQ09ORklHX01JTklYX0ZTPW0KLUNPTkZJR19WWEZTX0ZTPW0KLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19SVyBpcyBub3Qgc2V0Ci1DT05GSUdfSFBGU19GUz1tCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfREVWRlNfRlM9eQotQ09ORklHX0RFVkZTX01PVU5UPXkKLSMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZQVFNfRlM9eQotQ09ORklHX1FOWDRGU19GUz1tCi0jIENPTkZJR19RTlg0RlNfUlcgaXMgbm90IHNldAotQ09ORklHX1JPTUZTX0ZTPW0KLUNPTkZJR19FWFQyX0ZTPXkKLUNPTkZJR19TWVNWX0ZTPW0KLUNPTkZJR19VREZfRlM9bQotQ09ORklHX1VGU19GUz1tCi0jIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi0jIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVSTUVaWk9fRlMgaXMgbm90IHNldAotQ09ORklHX05GU19GUz15Ci1DT05GSUdfTkZTX1YzPXkKLSMgQ09ORklHX1JPT1RfTkZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORlNEPXkKLUNPTkZJR19ORlNEX1YzPXkKLUNPTkZJR19TVU5SUEM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19MT0NLRF9WND15Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkcgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU1RST05HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX05GU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BGU19PUzJfTlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfU01BTExET1MgaXMgbm90IHNldAotIyBDT05GSUdfTkNQRlNfTkxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05DUEZTX0VYVFJBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19aSVNPRlNfRlMgaXMgbm90IHNldAotQ09ORklHX1pMSUJfRlNfSU5GTEFURT1tCi0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0jIENPTkZJR19TTUJfTkxTIGlzIG5vdCBzZXQKLUNPTkZJR19OTFM9eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX01EIGlzIG5vdCBzZXQKLSMgQ09ORklHX01EX0xJTkVBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlEMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlEMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9SQUlENSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRF9NVUxUSVBBVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9MVk0gaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QVF9QUk9YWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUFJPRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQ09WIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZGVmY29uZmlnIGIvYXJjaC91bS9kZWZjb25maWcKaW5kZXggYTU0ZDBlZi4uYTI1Y2QyNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kZWZjb25maWcKKysrIGIvYXJjaC91bS9kZWZjb25maWcKQEAgLTE4OSw3ICsxODksNyBAQAogIyBDT05GSUdfTk9DT05GSUdfQ0hBTiBpcyBub3Qgc2V0CiBDT05GSUdfQ09OX1pFUk9fQ0hBTj0iZmQ6MCxmZDoxIgogQ09ORklHX0NPTl9DSEFOPSJ4dGVybSIKLUNPTkZJR19TU0xfQ0hBTj0icHR5IgorQ09ORklHX1NTTF9DSEFOPSJwdHMiCiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgpAQCAtNTI3LDMgKzUyNyw0IEBACiAjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0dQUk9GIGlzIG5vdCBzZXQKICMgQ09ORklHX0dDT1YgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCmluZGV4IDNhYTM1MTYuLjM2OGQzZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKQEAgLTIwMywyMiArMjAzLDM3IEBACiAJfQogfQogCi12b2lkIGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKQoraW50IGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmVsZTsKIAlzdHJ1Y3QgY2hhbiAqY2hhbjsKKwlpbnQgZXJyOwogCiAJbGlzdF9mb3JfZWFjaChlbGUsICZsaW5lLT5jaGFuX2xpc3QpewogCQljaGFuID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBjaGFuLCBsaXN0KTsKLQkJaWYob3Blbl9vbmVfY2hhbihjaGFuKSkKKwkJZXJyID0gb3Blbl9vbmVfY2hhbihjaGFuKTsKKwkJaWYgKGVycikgeworCQkJaWYgKGNoYW4tPnByaW1hcnkpCisJCQkJZ290byBvdXRfY2xvc2U7CisKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJaWYoY2hhbi0+ZW5hYmxlZCkKIAkJCWNvbnRpbnVlOwotCQlsaW5lX3NldHVwX2lycShjaGFuLT5mZCwgY2hhbi0+aW5wdXQsIGNoYW4tPm91dHB1dCwgbGluZSwKLQkJCSAgICAgICBjaGFuKTsKKwkJZXJyID0gbGluZV9zZXR1cF9pcnEoY2hhbi0+ZmQsIGNoYW4tPmlucHV0LCBjaGFuLT5vdXRwdXQsIGxpbmUsCisJCQkJICAgICBjaGFuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Nsb3NlOworCiAJCWNoYW4tPmVuYWJsZWQgPSAxOwogCX0KKworCXJldHVybiAwOworCisgb3V0X2Nsb3NlOgorCWNsb3NlX2NoYW4oJmxpbmUtPmNoYW5fbGlzdCwgMCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogSXRlbXMgYXJlIGFkZGVkIGluIElSUSBjb250ZXh0LCB3aGVuIGZyZWVfaXJxIGNhbid0IGJlIGNhbGxlZCwgYW5kCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl91c2VyLmMKaW5kZXggMTNmMGJmOC4uNGQ0MzhmMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9jaGFuX3VzZXIuYwpAQCAtNTEsMTkgKzUxLDIxIEBACiAvKgogICogVU1MIFNJR1dJTkNIIGhhbmRsaW5nCiAgKgotICogVGhlIHBvaW50IG9mIHRoaXMgaXMgdG8gaGFuZGxlIFNJR1dJTkNIIG9uIGNvbnNvbGVzIHdoaWNoIGhhdmUgaG9zdCB0dHlzIGFuZAotICogcmVsYXkgdGhlbSBpbnNpZGUgVU1MIHRvIHdoYXRldmVyIG1pZ2h0IGJlIHJ1bm5pbmcgb24gdGhlIGNvbnNvbGUgYW5kIGNhcmVzCi0gKiBhYm91dCB0aGUgd2luZG93IHNpemUgKHNpbmNlIFNJR1dJTkNIIG5vdGlmaWVzIGFib3V0IHRlcm1pbmFsIHNpemUgY2hhbmdlcykuCisgKiBUaGUgcG9pbnQgb2YgdGhpcyBpcyB0byBoYW5kbGUgU0lHV0lOQ0ggb24gY29uc29sZXMgd2hpY2ggaGF2ZSBob3N0CisgKiB0dHlzIGFuZCByZWxheSB0aGVtIGluc2lkZSBVTUwgdG8gd2hhdGV2ZXIgbWlnaHQgYmUgcnVubmluZyBvbiB0aGUKKyAqIGNvbnNvbGUgYW5kIGNhcmVzIGFib3V0IHRoZSB3aW5kb3cgc2l6ZSAoc2luY2UgU0lHV0lOQ0ggbm90aWZpZXMKKyAqIGFib3V0IHRlcm1pbmFsIHNpemUgY2hhbmdlcykuCiAgKgotICogU28sIHdlIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgZm9yIGVhY2ggaG9zdCB0dHkgYXR0YWNoZWQgdG8gYSBVTUwgZGV2aWNlCi0gKiAoc2lkZS1pc3N1ZSAtIEknbSBhbm5veWVkIHRoYXQgb25lIHRocmVhZCBjYW4ndCBoYXZlIG11bHRpcGxlIGNvbnRyb2xsaW5nCi0gKiB0dHlzIGZvciBwdXJwb3NlZCBvZiBoYW5kbGluZyBTSUdXSU5DSCwgYnV0IEkgaW1hZ2luZSB0aGVyZSBhcmUgb3RoZXIgcmVhc29ucwotICogdGhhdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlKS4KKyAqIFNvLCB3ZSBoYXZlIGEgc2VwYXJhdGUgdGhyZWFkIGZvciBlYWNoIGhvc3QgdHR5IGF0dGFjaGVkIHRvIGEgVU1MCisgKiBkZXZpY2UgKHNpZGUtaXNzdWUgLSBJJ20gYW5ub3llZCB0aGF0IG9uZSB0aHJlYWQgY2FuJ3QgaGF2ZQorICogbXVsdGlwbGUgY29udHJvbGxpbmcgdHR5cyBmb3IgdGhlIHB1cnBvc2Ugb2YgaGFuZGxpbmcgU0lHV0lOQ0gsIGJ1dAorICogSSBpbWFnaW5lIHRoZXJlIGFyZSBvdGhlciByZWFzb25zIHRoYXQgZG9lc24ndCBtYWtlIGFueSBzZW5zZSkuCiAgKgotICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvIHJlY2VpdmUgaXQKLSAqIGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0byB3YWl0IGZvciBpdCwgaXQgaXMKLSAqIGNvbnZlbmllbnQgdG8gc2l0IGluIHNpZ3N1c3BlbmQoKSBhbmQgd2FpdCBmb3IgdGhlIHNpZ25hbCB0byBib3VuY2UgeW91IG91dCBvZgotICogaXQgKHNlZSBiZWxvdyBmb3IgaG93IHdlIG1ha2Ugc3VyZSB0byBleGl0IG9ubHkgb24gU0lHV0lOQ0gpLgorICogU0lHV0lOQ0ggY2FuJ3QgYmUgcmVjZWl2ZWQgc3luY2hyb25vdXNseSwgc28geW91IGhhdmUgdG8gc2V0IHVwIHRvCisgKiByZWNlaXZlIGl0IGFzIGEgc2lnbmFsLiAgVGhhdCBiZWluZyB0aGUgY2FzZSwgaWYgeW91IGFyZSBnb2luZyB0bworICogd2FpdCBmb3IgaXQsIGl0IGlzIGNvbnZlbmllbnQgdG8gc2l0IGluIHNpZ3N1c3BlbmQoKSBhbmQgd2FpdCBmb3IKKyAqIHRoZSBzaWduYWwgdG8gYm91bmNlIHlvdSBvdXQgb2YgaXQgKHNlZSBiZWxvdyBmb3IgaG93IHdlIG1ha2Ugc3VyZQorICogdG8gZXhpdCBvbmx5IG9uIFNJR1dJTkNIKS4KICAqLwogCiBzdGF0aWMgdm9pZCB3aW5jaF9oYW5kbGVyKGludCBzaWcpCkBAIC0xMTIsNyArMTE0LDggQEAKIAogCWVyciA9IG9zX25ld190dHlfcGdycChwdHlfZmQsIG9zX2dldHBpZCgpKTsKIAlpZihlcnIgPCAwKXsKLQkJcHJpbnRrKCJ3aW5jaF90aHJlYWQgOiBuZXdfdHR5X3BncnAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCXByaW50aygid2luY2hfdGhyZWFkIDogbmV3X3R0eV9wZ3JwIGZhaWxlZCBvbiBmZCAlZCwgIgorCQkgICAgICAgImVyciA9ICVkXG4iLCBwdHlfZmQsIC1lcnIpOwogCQlleGl0KDEpOwogCX0KIApAQCAtMTI2LDggKzEyOSw5IEBACiAJCSAgICAgICAiZXJyID0gJWRcbiIsIC1jb3VudCk7CiAKIAl3aGlsZSgxKXsKLQkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlIG90aGVyIHNpZ25hbHMKLQkJICogYXJlIGJsb2NrZWQuKi8KKwkJLyogVGhpcyB3aWxsIGJlIGludGVycnVwdGVkIGJ5IFNJR1dJTkNIIG9ubHksIHNpbmNlCisJCSAqIG90aGVyIHNpZ25hbHMgYXJlIGJsb2NrZWQuCisJCSAqLwogCQlzaWdzdXNwZW5kKCZzaWdzKTsKIAogCQljb3VudCA9IG9zX3dyaXRlX2ZpbGUocGlwZV9mZCwgJmMsIHNpemVvZihjKSk7CkBAIC0xMzcsMTAgKzE0MSwxMCBAQAogCX0KIH0KIAotc3RhdGljIGludCB3aW5jaF90cmFtcChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCAqZmRfb3V0KQorc3RhdGljIGludCB3aW5jaF90cmFtcChpbnQgZmQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCAqZmRfb3V0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQogewogCXN0cnVjdCB3aW5jaF9kYXRhIGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBzdGFjazsKIAlpbnQgZmRzWzJdLCBuLCBlcnI7CiAJY2hhciBjOwogCkBAIC0xNTMsOSArMTU3LDExIEBACiAJZGF0YSA9ICgoc3RydWN0IHdpbmNoX2RhdGEpIHsgLnB0eV9mZCAJCT0gZmQsCiAJCQkJICAgICAgLnBpcGVfZmQgCQk9IGZkc1sxXSB9ICk7CiAJLyogQ0xPTkVfRklMRVMgc28gdGhpcyB0aHJlYWQgZG9lc24ndCBob2xkIG9wZW4gZmlsZXMgd2hpY2ggYXJlIG9wZW4KLQkgKiBub3csIGJ1dCBsYXRlciBjbG9zZWQuICBUaGlzIGlzIGEgcHJvYmxlbSB3aXRoIC9kZXYvbmV0L3R1bi4KKwkgKiBub3csIGJ1dCBsYXRlciBjbG9zZWQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiAgVGhpcyBpcyBhCisJICogcHJvYmxlbSB3aXRoIC9kZXYvbmV0L3R1biwgd2hpY2ggaWYgaGVsZCBvcGVuIGJ5IHRoaXMKKwkgKiB0aHJlYWQsIHByZXZlbnRzIHRoZSBUVU4vVEFQIGRldmljZSBmcm9tIGJlaW5nIHJldXNlZC4KIAkgKi8KLQllcnIgPSBydW5faGVscGVyX3RocmVhZCh3aW5jaF90aHJlYWQsICZkYXRhLCBDTE9ORV9GSUxFUywgJnN0YWNrLCAwKTsKKwllcnIgPSBydW5faGVscGVyX3RocmVhZCh3aW5jaF90aHJlYWQsICZkYXRhLCBDTE9ORV9GSUxFUywgc3RhY2tfb3V0KTsKIAlpZihlcnIgPCAwKXsKIAkJcHJpbnRrKCJmb3JrIG9mIHdpbmNoX3RocmVhZCBmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCAtZXJyKTsKIAkJZ290byBvdXRfY2xvc2U7CkBAIC0xNzAsNyArMTc2LDEzIEBACiAgICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXRfY2xvc2U7CiAJfQotCXJldHVybiBlcnIgOworCisJaWYgKG9zX3NldF9mZF9ibG9jaygqZmRfb3V0LCAwKSkgeworCQlwcmludGsoIndpbmNoX3RyYW1wOiBmYWlsZWQgdG8gc2V0IHRocmVhZF9mZCBub24tYmxvY2tpbmcuXG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJcmV0dXJuIGVycjsKIAogIG91dF9jbG9zZToKIAlvc19jbG9zZV9maWxlKGZkc1sxXSk7CkBAIC0xODEsMjUgKzE5MywyNSBAQAogCiB2b2lkIHJlZ2lzdGVyX3dpbmNoKGludCBmZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlpbnQgcGlkLCB0aHJlYWQsIHRocmVhZF9mZCA9IC0xOwotCWludCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCWludCBwaWQsIHRocmVhZCwgY291bnQsIHRocmVhZF9mZCA9IC0xOwogCWNoYXIgYyA9IDE7CiAKIAlpZighaXNhdHR5KGZkKSkKIAkJcmV0dXJuOwogCiAJcGlkID0gdGNnZXRwZ3JwKGZkKTsKLQlpZighQ0hPT1NFX01PREVfUFJPQyhpc190cmFjZXJfd2luY2gsIGlzX3NrYXNfd2luY2gsIHBpZCwgZmQsCi0JCQkgICAgIHR0eSkgJiYgKHBpZCA9PSAtMSkpewotCQl0aHJlYWQgPSB3aW5jaF90cmFtcChmZCwgdHR5LCAmdGhyZWFkX2ZkKTsKLQkJaWYodGhyZWFkID4gMCl7Ci0JCQlyZWdpc3Rlcl93aW5jaF9pcnEodGhyZWFkX2ZkLCBmZCwgdGhyZWFkLCB0dHkpOworCWlmICghQ0hPT1NFX01PREVfUFJPQyhpc190cmFjZXJfd2luY2gsIGlzX3NrYXNfd2luY2gsIHBpZCwgZmQsIHR0eSkgJiYKKwkgICAgKHBpZCA9PSAtMSkpIHsKKwkJdGhyZWFkID0gd2luY2hfdHJhbXAoZmQsIHR0eSwgJnRocmVhZF9mZCwgJnN0YWNrKTsKKwkJaWYgKHRocmVhZCA8IDApCisJCQlyZXR1cm47CiAKLQkJCWNvdW50ID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZjLCBzaXplb2YoYykpOwotCQkJaWYoY291bnQgIT0gc2l6ZW9mKGMpKQotCQkJCXByaW50aygicmVnaXN0ZXJfd2luY2ggOiBmYWlsZWQgdG8gd3JpdGUgIgotCQkJCSAgICAgICAic3luY2hyb25pemF0aW9uIGJ5dGUsIGVyciA9ICVkXG4iLAotCQkJCQktY291bnQpOwotCQl9CisJCXJlZ2lzdGVyX3dpbmNoX2lycSh0aHJlYWRfZmQsIGZkLCB0aHJlYWQsIHR0eSwgc3RhY2spOworCisJCWNvdW50ID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZjLCBzaXplb2YoYykpOworCQlpZihjb3VudCAhPSBzaXplb2YoYykpCisJCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoIDogZmFpbGVkIHRvIHdyaXRlICIKKwkJCSAgICAgICAic3luY2hyb25pemF0aW9uIGJ5dGUsIGVyciA9ICVkXG4iLCAtY291bnQpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmggYi9hcmNoL3VtL2RyaXZlcnMvY293X3N5cy5oCmluZGV4IDE1NDUzODQuLmNhOGM5ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jb3dfc3lzLmgKKysrIGIvYXJjaC91bS9kcml2ZXJzL2Nvd19zeXMuaApAQCAtOCw3ICs4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkICpjb3dfbWFsbG9jKGludCBzaXplKQogewotCXJldHVybiB1bV9rbWFsbG9jKHNpemUpOworCXJldHVybiBrbWFsbG9jKHNpemUsIFVNX0dGUF9LRVJORUwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY293X2ZyZWUodm9pZCAqcHRyKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwppbmRleCBiODY5ZTM4Li44ZDIwMDhmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX3VzZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogewogCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOwogCi0Jc3VuID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisJc3VuID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoc3VuID09IE5VTEwpewogCQlwcmludGsoIm5ld19hZGRyOiBhbGxvY2F0aW9uIG9mIHNvY2thZGRyX3VuIGZhaWxlZFxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtODMsNyArODMsNyBAQAogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKLQlzdW4gPSB1bV9rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKwlzdW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihzdW4gPT0gTlVMTCl7CiAJCXByaW50aygibmV3X2FkZHI6IGFsbG9jYXRpb24gb2Ygc29ja2FkZHJfdW4gZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9mZC5jIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKaW5kZXggN2YwODNlYy4uMzljMDFmZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2ZkLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJcHJpbnRrKCJmZF9pbml0IDogY291bGRuJ3QgcGFyc2UgZmlsZSBkZXNjcmlwdG9yICclcydcbiIsIHN0cik7CiAJCXJldHVybihOVUxMKTsKIAl9Ci0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CiAJKmRhdGEgPSAoKHN0cnVjdCBmZF9jaGFuKSB7IC5mZCAgCT0gbiwKIAkJCQkgICAgLnJhdyAgCT0gb3B0cy0+cmF3IH0pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCmluZGV4IDVlZWVjZjg5Li4xMTcxNzkwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ191c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfdXNlci5jCkBAIC02OCw3ICs2OCw3IEBACiAJCWFyZ3MgPSBwaWRfYXJnczsKIAl9CiAKLQlwaWQgPSBydW5faGVscGVyKHByZV9leGVjLCAmZGF0YSwgYXJncywgTlVMTCk7CisJcGlkID0gcnVuX2hlbHBlcihwcmVfZXhlYywgJmRhdGEsIGFyZ3MpOwogCiAJb3NfY2xvc2VfZmlsZShvdXRfZmRzWzBdKTsKIAlvc19jbG9zZV9maWxlKGluX2Zkc1sxXSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCA0YmQ0MGJiLi4zZTBiNjhlIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTQ1NCw3ICs0NTQsMTAgQEAKIAl0dHktPmRyaXZlcl9kYXRhID0gbGluZTsKIAlsaW5lLT50dHkgPSB0dHk7CiAKLQllbmFibGVfY2hhbihsaW5lKTsKKwllcnIgPSBlbmFibGVfY2hhbihsaW5lKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJSU5JVF9ERUxBWUVEX1dPUksoJmxpbmUtPnRhc2ssIGxpbmVfdGltZXJfY2IpOwogCiAJaWYoIWxpbmUtPnNpZ2lvKXsKQEAgLTc0Niw4ICs3NDksMjQgQEAKIAlpbnQgdHR5X2ZkOwogCWludCBwaWQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOwogfTsKIAorc3RhdGljIHZvaWQgZnJlZV93aW5jaChzdHJ1Y3Qgd2luY2ggKndpbmNoLCBpbnQgZnJlZV9pcnFfb2spCit7CisJbGlzdF9kZWwoJndpbmNoLT5saXN0KTsKKworCWlmICh3aW5jaC0+cGlkICE9IC0xKQorCQlvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7CisJaWYgKHdpbmNoLT5mZCAhPSAtMSkKKwkJb3NfY2xvc2VfZmlsZSh3aW5jaC0+ZmQpOworCWlmICh3aW5jaC0+c3RhY2sgIT0gMCkKKwkJZnJlZV9zdGFjayh3aW5jaC0+c3RhY2ssIDApOworCWlmIChmcmVlX2lycV9vaykKKwkJZnJlZV9pcnEoV0lOQ0hfSVJRLCB3aW5jaCk7CisJa2ZyZWUod2luY2gpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3Qgd2luY2hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaCA9IGRhdGE7CkBAIC03NjQsMTIgKzc4MywxMyBAQAogCQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgLWVycik7CiAJCQkJcHJpbnRrKCJmZCAlZCBpcyBsb3NpbmcgU0lHV0lOQ0ggc3VwcG9ydFxuIiwKIAkJCQkgICAgICAgd2luY2gtPnR0eV9mZCk7CisJCQkJZnJlZV93aW5jaCh3aW5jaCwgMCk7CiAJCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQkJfQogCQkJZ290byBvdXQ7CiAJCX0KIAl9Ci0JdHR5ICA9IHdpbmNoLT50dHk7CisJdHR5ID0gd2luY2gtPnR0eTsKIAlpZiAodHR5ICE9IE5VTEwpIHsKIAkJbGluZSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJCWNoYW5fd2luZG93X3NpemUoJmxpbmUtPmNoYW5fbGlzdCwgJnR0eS0+d2luc2l6ZS53c19yb3csCkBAIC03ODIsNDMgKzgwMiw0NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQordm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJdW5zaWduZWQgbG9uZyBzdGFjaykKIHsKIAlzdHJ1Y3Qgd2luY2ggKndpbmNoOwogCiAJd2luY2ggPSBrbWFsbG9jKHNpemVvZigqd2luY2gpLCBHRlBfS0VSTkVMKTsKIAlpZiAod2luY2ggPT0gTlVMTCkgewogCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGttYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJKndpbmNoID0gKChzdHJ1Y3Qgd2luY2gpIHsgLmxpc3QgIAk9IExJU1RfSEVBRF9JTklUKHdpbmNoLT5saXN0KSwKIAkJCQkgICAuZmQgIAk9IGZkLAogCQkJCSAgIC50dHlfZmQgCT0gdHR5X2ZkLAogCQkJCSAgIC5waWQgIAk9IHBpZCwKLQkJCQkgICAudHR5IAk9IHR0eSB9KTsKKwkJCQkgICAudHR5IAk9IHR0eSwKKwkJCQkgICAuc3RhY2sJPSBzdGFjayB9KTsKKworCWlmICh1bV9yZXF1ZXN0X2lycShXSU5DSF9JUlEsIGZkLCBJUlFfUkVBRCwgd2luY2hfaW50ZXJydXB0LAorCQkJICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAorCQkJICAgIndpbmNoIiwgd2luY2gpIDwgMCkgeworCQlwcmludGsoInJlZ2lzdGVyX3dpbmNoX2lycSAtIGZhaWxlZCB0byByZWdpc3RlciBJUlFcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KIAogCXNwaW5fbG9jaygmd2luY2hfaGFuZGxlcl9sb2NrKTsKIAlsaXN0X2FkZCgmd2luY2gtPmxpc3QsICZ3aW5jaF9oYW5kbGVycyk7CiAJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKLQlpZih1bV9yZXF1ZXN0X2lycShXSU5DSF9JUlEsIGZkLCBJUlFfUkVBRCwgd2luY2hfaW50ZXJydXB0LAotCQkJICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQgfCBJUlFGX1NBTVBMRV9SQU5ET00sCi0JCQkgICJ3aW5jaCIsIHdpbmNoKSA8IDApCi0JCXByaW50aygicmVnaXN0ZXJfd2luY2hfaXJxIC0gZmFpbGVkIHRvIHJlZ2lzdGVyIElSUVxuIik7Ci19CisJcmV0dXJuOwogCi1zdGF0aWMgdm9pZCBmcmVlX3dpbmNoKHN0cnVjdCB3aW5jaCAqd2luY2gpCi17Ci0JbGlzdF9kZWwoJndpbmNoLT5saXN0KTsKLQotCWlmKHdpbmNoLT5waWQgIT0gLTEpCi0JCW9zX2tpbGxfcHJvY2Vzcyh3aW5jaC0+cGlkLCAxKTsKLQlpZih3aW5jaC0+ZmQgIT0gLTEpCi0JCW9zX2Nsb3NlX2ZpbGUod2luY2gtPmZkKTsKLQotCWZyZWVfaXJxKFdJTkNIX0lSUSwgd2luY2gpOworIG91dF9mcmVlOgogCWtmcmVlKHdpbmNoKTsKKyBjbGVhbnVwOgorCW9zX2tpbGxfcHJvY2VzcyhwaWQsIDEpOworCW9zX2Nsb3NlX2ZpbGUoZmQpOworCWlmIChzdGFjayAhPSAwKQorCQlmcmVlX3N0YWNrKHN0YWNrLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtODMxLDcgKzg1Miw3IEBACiAJbGlzdF9mb3JfZWFjaChlbGUsICZ3aW5jaF9oYW5kbGVycyl7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAgICAgICAgICAgICAgICAgaWYod2luY2gtPnR0eSA9PSB0dHkpewotCQkJZnJlZV93aW5jaCh3aW5jaCk7CisJCQlmcmVlX3dpbmNoKHdpbmNoLCAxKTsKIAkJCWJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODQ3LDcgKzg2OCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUoZWxlLCBuZXh0LCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwotCQlmcmVlX3dpbmNoKHdpbmNoKTsKKwkJZnJlZV93aW5jaCh3aW5jaCwgMSk7CiAJfQogCiAJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYwppbmRleCBkMzE5ZGIxLi4yMzZhM2RmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAotCXNpbiA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCXNpbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIFVNX0dGUF9LRVJORUwpOwogCWlmKHNpbiA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZXdfYWRkcjogYWxsb2NhdGlvbiBvZiBzb2NrYWRkcl9pbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfdXNlci5jCmluZGV4IDYyZTVhZDYuLmYzMWU3MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX3VzZXIuYwpAQCAtODYsOCArODYsOSBAQAogCWludCBsZW47CiAKIAlyZXEtPm9yaWdpbmxlbiA9IHNpemVvZihyZXEtPm9yaWdpbik7Ci0JcmVxLT5sZW4gPSByZWN2ZnJvbShmZCwgJnJlcS0+cmVxdWVzdCwgc2l6ZW9mKHJlcS0+cmVxdWVzdCksIDAsCi0JCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSByZXEtPm9yaWdpbiwgJnJlcS0+b3JpZ2lubGVuKTsKKwlyZXEtPmxlbiA9IHJlY3Zmcm9tKGZkLCAmcmVxLT5yZXF1ZXN0LCBzaXplb2YocmVxLT5yZXF1ZXN0KSwKKwkJCSAgICBNU0dfRE9OVFdBSVQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgcmVxLT5vcmlnaW4sCisJCQkgICAgJnJlcS0+b3JpZ2lubGVuKTsKIAlpZiAocmVxLT5sZW4gPCAwKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL25ldF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYwppbmRleCAzNTAzY2ZmLi5kYTk0NmUzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X3VzZXIuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJfQogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07CiAJcGVfZGF0YS5zdGRvdXQgPSBmZHNbMV07Ci0JcGlkID0gcnVuX2hlbHBlcihjaGFuZ2VfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2LCBOVUxMKTsKKwlwaWQgPSBydW5faGVscGVyKGNoYW5nZV9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3YpOwogCiAJaWYgKHBpZCA+IDApCS8qIEF2b2lkIGhhbmcgYXMgd2Ugd29uJ3QgZ2V0IGRhdGEgaW4gZmFpbHVyZSBjYXNlLiAqLwogCQlyZWFkX291dHB1dChmZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJbmV0bWFza1syXSwgbmV0bWFza1szXSk7CiAKIAlvdXRwdXRfbGVuID0gVU1fS0VSTl9QQUdFX1NJWkU7Ci0Jb3V0cHV0ID0gdW1fa21hbGxvYyhvdXRwdXRfbGVuKTsKKwlvdXRwdXQgPSBrbWFsbG9jKG91dHB1dF9sZW4sIFVNX0dGUF9LRVJORUwpOwogCWlmKG91dHB1dCA9PSBOVUxMKQogCQlwcmludGsoImNoYW5nZSA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCmluZGV4IDQ4M2FhMTUuLjEzMTY0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJcHJpLT5jb21waWxlZCA9IHVtX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ3JhbSkpOworCQlwcmktPmNvbXBpbGVkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJwZl9wcm9ncmFtKSwgVU1fR0ZQX0tFUk5FTCk7CiAJCWlmKHByaS0+Y29tcGlsZWQgPT0gTlVMTCl7CiAJCQlwcmludGsoVU1fS0VSTl9FUlIgInBjYXBfb3BlbiA6IGttYWxsb2MgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCmluZGV4IDNmNjM1N2QuLmM3OTliMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlpZihrZXJuX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gdW1fa21hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihkYXRhID09IE5VTEwpCiAJCWdvdG8gZXJyOwogCkBAIC0xODgsNyArMTg4LDcgQEAKIAkJeyAuc29ja19mZCAgCQk9IG5ldywKIAkJICAucGlwZV9mZCAJCT0gc29ja2V0WzFdIH0pOwogCi0JZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihwb3J0X3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfc2h1dGRvd247CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwppbmRleCBkZjQ5NzZjLi4xZTNmZDYxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCkBAIC0xLDUgKzEsNSBAQAogLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtNywxMiArNywxNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlICJjaGFuX3VzZXIuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ1bV9tYWxsb2MuaCIKIAogc3RydWN0IHB0eV9jaGFuIHsKQEAgLTI3LDEyICsyOSwxNCBAQAogewogCXN0cnVjdCBwdHlfY2hhbiAqZGF0YTsKIAotCWRhdGEgPSB1bV9rbWFsbG9jKHNpemVvZigqZGF0YSkpOwotCWlmKGRhdGEgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIFVNX0dGUF9LRVJORUwpOworCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCiAJKmRhdGEgPSAoKHN0cnVjdCBwdHlfY2hhbikgeyAuYW5ub3VuY2UgIAk9IG9wdHMtPmFubm91bmNlLCAKIAkJCQkgICAgIC5kZXYgIAkJPSBkZXZpY2UsCiAJCQkJICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0pOwotCXJldHVybihkYXRhKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogc3RhdGljIGludCBwdHNfb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLApAQCAtNDMsMzEgKzQ3LDM1IEBACiAJaW50IGZkLCBlcnI7CiAKIAlmZCA9IGdldF9wdHkoKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoIm9wZW5fcHRzIDogRmFpbGVkIHRvIG9wZW4gcHRzXG4iKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJvcGVuX3B0cyA6IEZhaWxlZCB0byBvcGVuIHB0c1xuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWlmKGRhdGEtPnJhdyl7CisKKwlpZiAoZGF0YS0+cmF3KSB7CiAJCUNBVENIX0VJTlRSKGVyciA9IHRjZ2V0YXR0cihmZCwgJmRhdGEtPnR0KSk7Ci0JCWlmKGVycikKLQkJCXJldHVybihlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQllcnIgPSByYXcoZmQpOwotCQlpZihlcnIpCi0JCQlyZXR1cm4oZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJZGV2ID0gcHRzbmFtZShmZCk7CiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOworCiAJaWYgKGRhdGEtPmFubm91bmNlKQogCQkoKmRhdGEtPmFubm91bmNlKShkZXYsIGRhdGEtPmRldik7Ci0JcmV0dXJuKGZkKTsKKworCXJldHVybiBmZDsKIH0KIAogc3RhdGljIGludCBnZXRtYXN0ZXIoY2hhciAqbGluZSkKIHsKKwlzdHJ1Y3Qgc3RhdCBidWY7CiAJY2hhciAqcHR5LCAqYmFuaywgKmNwOwogCWludCBtYXN0ZXIsIGVycjsKIApAQCAtNzUsMjQgKzgzLDI5IEBACiAJZm9yIChiYW5rID0gInBxcnMiOyAqYmFuazsgYmFuaysrKSB7CiAJCWxpbmVbc3RybGVuKCIvZGV2L3B0eSIpXSA9ICpiYW5rOwogCQkqcHR5ID0gJzAnOwotCQlpZiAob3Nfc3RhdF9maWxlKGxpbmUsIE5VTEwpIDwgMCkKKwkJLyogRGlkIHdlIGhpdCB0aGUgZW5kID8gKi8KKwkJaWYgKChzdGF0KGxpbmUsICZidWYpIDwgMCkgJiYgKGVycm5vID09IEVOT0VOVCkpCiAJCQlicmVhazsKKwogCQlmb3IgKGNwID0gIjAxMjM0NTY3ODlhYmNkZWYiOyAqY3A7IGNwKyspIHsKIAkJCSpwdHkgPSAqY3A7Ci0JCQltYXN0ZXIgPSBvc19vcGVuX2ZpbGUobGluZSwgb2ZfcmR3cihPUEVORkxBR1MoKSksIDApOworCQkJbWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IpOwogCQkJaWYgKG1hc3RlciA+PSAwKSB7CiAJCQkJY2hhciAqdHAgPSAmbGluZVtzdHJsZW4oIi9kZXYvIildOwogCiAJCQkJLyogdmVyaWZ5IHNsYXZlIHNpZGUgaXMgdXNhYmxlICovCiAJCQkJKnRwID0gJ3QnOwotCQkJCWVyciA9IG9zX2FjY2VzcyhsaW5lLCBPU19BQ0NfUldfT0spOworCQkJCWVyciA9IGFjY2VzcyhsaW5lLCBSX09LIHwgV19PSyk7CiAJCQkJKnRwID0gJ3AnOwotCQkJCWlmKGVyciA9PSAwKSByZXR1cm4obWFzdGVyKTsKLQkJCQkodm9pZCkgb3NfY2xvc2VfZmlsZShtYXN0ZXIpOworCQkJCWlmKCFlcnIpCisJCQkJCXJldHVybiBtYXN0ZXI7CisJCQkJY2xvc2UobWFzdGVyKTsKIAkJCX0KIAkJfQogCX0KLQlyZXR1cm4oLTEpOworCisJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRtYXN0ZXIgLSBubyB1c2FibGUgaG9zdCBwdHkgZGV2aWNlc1xuIik7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIHN0YXRpYyBpbnQgcHR5X29wZW4oaW50IGlucHV0LCBpbnQgb3V0cHV0LCBpbnQgcHJpbWFyeSwgdm9pZCAqZCwKQEAgLTEwMywyMCArMTE2LDIyIEBACiAJY2hhciBkZXZbc2l6ZW9mKCIvZGV2L3B0eXh4XDAiKV0gPSAiL2Rldi9wdHl4eCI7CiAKIAlmZCA9IGdldG1hc3RlcihkZXYpOwotCWlmKGZkIDwgMCkKLQkJcmV0dXJuKC1lcnJubyk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOwogCiAJaWYoZGF0YS0+cmF3KXsKIAkJZXJyID0gcmF3KGZkKTsKLQkJaWYoZXJyKQotCQkJcmV0dXJuKGVycik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAkKLQlpZihkYXRhLT5hbm5vdW5jZSkgKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOworCWlmIChkYXRhLT5hbm5vdW5jZSkKKwkJKCpkYXRhLT5hbm5vdW5jZSkoZGV2LCBkYXRhLT5kZXYpOwogCiAJc3ByaW50ZihkYXRhLT5kZXZfbmFtZSwgIiVzIiwgZGV2KTsKIAkqZGV2X291dCA9IGRhdGEtPmRldl9uYW1lOwotCXJldHVybihmZCk7CisKKwlyZXR1cm4gZmQ7CiB9CiAKIGNvbnN0IHN0cnVjdCBjaGFuX29wcyBwdHlfb3BzID0gewpAQCAtMTQ0LDE0ICsxNTksMyBAQAogCS5mcmVlCQk9IGdlbmVyaWNfZnJlZSwKIAkud2luY2gJCT0gMCwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKaW5kZXggNzhmMGU1MS4uYzBiNzNjMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwpAQCAtODUsMTMgKzg1LDEzIEBACiAJcGVfZGF0YS5zdGRpbiA9IGZkOwogCXBlX2RhdGEuc3Rkb3V0ID0gZmRzWzFdOwogCXBlX2RhdGEuY2xvc2VfbWUgPSBmZHNbMF07Ci0JZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndiwgTlVMTCk7CisJZXJyID0gcnVuX2hlbHBlcihzbGlwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2U7CiAJcGlkID0gZXJyOwogCiAJb3V0cHV0X2xlbiA9IFVNX0tFUk5fUEFHRV9TSVpFOwotCW91dHB1dCA9IHVtX2ttYWxsb2Mob3V0cHV0X2xlbik7CisJb3V0cHV0ID0ga21hbGxvYyhvdXRwdXRfbGVuLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCl7CiAJCXByaW50aygic2xpcF90cmFtcCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAkJb3Nfa2lsbF9wcm9jZXNzKHBpZCwgMSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCAzOWY4ODlmLi4wZTQ2MmY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCXBlX2RhdGEuc3RkaW4gPSBmZDsKIAlwZV9kYXRhLnN0ZG91dCA9IGZkOwotCXBpZCA9IHJ1bl9oZWxwZXIoc2xpcnBfcHJlX2V4ZWMsICZwZV9kYXRhLCBhcmd2LCBOVUxMKTsKKwlwaWQgPSBydW5faGVscGVyKHNsaXJwX3ByZV9leGVjLCAmcGVfZGF0YSwgYXJndik7CiAKIAlyZXR1cm4ocGlkKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYyBiL2FyY2gvdW0vZHJpdmVycy9zc2wuYwppbmRleCBmZDA5YWQ5Li44NzVkNjBkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCkBAIC00Miw4ICs0Miw2IEBACiAJLmFubm91bmNlIAk9IHNzbF9hbm5vdW5jZSwKIAkueHRlcm1fdGl0bGUJPSAiU2VyaWFsIExpbmUgIyVkIiwKIAkucmF3CQk9IDEsCi0JLnRyYW1wX3N0YWNrIAk9IDAsCi0JLmluX2tlcm5lbCAJPSAxLAogfTsKIAogc3RhdGljIGludCBzc2xfY29uZmlnKGNoYXIgKnN0ciwgY2hhciAqKmVycm9yX291dCk7CkBAIC05OSw3ICs5NywxMyBAQAogCiBzdGF0aWMgaW50IHNzbF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXJldHVybiBsaW5lX29wZW4oc2VyaWFsX2xpbmVzLCB0dHkpOworCWludCBlcnIgPSBsaW5lX29wZW4oc2VyaWFsX2xpbmVzLCB0dHkpOworCisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gb3BlbiBzZXJpYWwgbGluZSAlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICB0dHktPmluZGV4LCBlcnIpOworCisJcmV0dXJuIGVycjsKIH0KIAogI2lmIDAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMgYi9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCmluZGV4IDJiYjQxOTMuLjY1NjAzNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwpAQCAtNDYsOCArNDYsNiBAQAogCS5hbm5vdW5jZSAJPSBzdGRpb19hbm5vdW5jZSwKIAkueHRlcm1fdGl0bGUJPSAiVmlydHVhbCBDb25zb2xlICMlZCIsCiAJLnJhdwkJPSAxLAotCS50cmFtcF9zdGFjayAJPSAwLAotCS5pbl9rZXJuZWwgCT0gMSwKIH07CiAKIHN0YXRpYyBpbnQgY29uX2NvbmZpZyhjaGFyICpzdHIsIGNoYXIgKiplcnJvcl9vdXQpOwpAQCAtMTAxLDcgKzk5LDEyIEBACiAKIHN0YXRpYyBpbnQgY29uX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JcmV0dXJuIGxpbmVfb3Blbih2dHMsIHR0eSk7CisJaW50IGVyciA9IGxpbmVfb3Blbih2dHMsIHR0eSk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gb3BlbiBjb25zb2xlICVkLCBlcnIgPSAlZFxuIiwKKwkJICAgICAgIHR0eS0+aW5kZXgsIGVycik7CisKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBTZXQgaW4gYW4gaW5pdGNhbGwsIGNoZWNrZWQgaW4gYW4gZXhpdGNhbGwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy90dHkuYyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwppbmRleCBjMDdkMGQ1Li5hOWY4N2UxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3R0eS5jCkBAIC0yOSw3ICsyOSw3IEBACiAJfQogCXN0cisrOwogCi0JZGF0YSA9IHVtX2ttYWxsb2Moc2l6ZW9mKCpkYXRhKSk7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYoZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAkqZGF0YSA9ICgoc3RydWN0IHR0eV9jaGFuKSB7IC5kZXYgCT0gc3RyLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwppbmRleCAyZTA5ZjE2Li5mYzI3ZjZjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwpAQCAtNzEyLDYgKzcxMiw4IEBACiAJdWJkX2Rldi0+cXVldWUtPnF1ZXVlZGF0YSA9IHViZF9kZXY7CiAKIAlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHViZF9kZXYtPnF1ZXVlLCBNQVhfU0cpOworCWlmKHViZF9kZXYtPmNvdy5maWxlICE9IE5VTEwpCisJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyh1YmRfZGV2LT5xdWV1ZSwgOCAqIHNpemVvZihsb25nKSk7CiAJZXJyID0gdWJkX2Rpc2tfcmVnaXN0ZXIoTUFKT1JfTlIsIHViZF9kZXYtPnNpemUsIG4sICZ1YmRfZ2VuZGlza1tuXSk7CiAJaWYoZXJyKXsKIAkJKmVycm9yX291dCA9ICJGYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIjsKQEAgLTEwODMsNyArMTA4NSw3IEBACiB7CiAJc3RydWN0IGlvX3RocmVhZF9yZXEgKmlvX3JlcTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwotCWludCBuOworCWludCBuLCBsYXN0X3NlY3RvcnM7CiAKIAl3aGlsZSgxKXsKIAkJc3RydWN0IHViZCAqZGV2ID0gcS0+cXVldWVkYXRhOwpAQCAtMTA5OSw5ICsxMTAxLDExIEBACiAJCX0KIAogCQlyZXEgPSBkZXYtPnJlcXVlc3Q7CisJCWxhc3Rfc2VjdG9ycyA9IDA7CiAJCXdoaWxlKGRldi0+c3RhcnRfc2cgPCBkZXYtPmVuZF9zZyl7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmRldi0+c2dbZGV2LT5zdGFydF9zZ107CiAKKwkJCXJlcS0+c2VjdG9yICs9IGxhc3Rfc2VjdG9yczsKIAkJCWlvX3JlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxKSwKIAkJCQkJIEdGUF9BVE9NSUMpOwogCQkJaWYoaW9fcmVxID09IE5VTEwpewpAQCAtMTExMyw2ICsxMTE3LDcgQEAKIAkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5zZWN0b3IgPDwgOSwKIAkJCQkJc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgc2ctPnBhZ2UpOwogCisJCQlsYXN0X3NlY3RvcnMgPSBzZy0+bGVuZ3RoID4+IDk7CiAJCQluID0gb3Nfd3JpdGVfZmlsZSh0aHJlYWRfZmQsICZpb19yZXEsCiAJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxICopKTsKIAkJCWlmKG4gIT0gc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxICopKXsKQEAgLTExMjQsNyArMTEyOSw2IEBACiAJCQkJcmV0dXJuOwogCQkJfQogCi0JCQlyZXEtPnNlY3RvciArPSBzZy0+bGVuZ3RoID4+IDk7CiAJCQlkZXYtPnN0YXJ0X3NnKys7CiAJCX0KIAkJZGV2LT5lbmRfc2cgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYwppbmRleCA0NzA3YjNmLi40MWQyNTRiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX3VzZXIuYwpAQCAtNDMsNiArNDMsMTIgQEAKIAlrZXJuZWxfZmQgPSBmZHNbMF07CiAJKmZkX291dCA9IGZkc1sxXTsKIAorCWVyciA9IG9zX3NldF9mZF9ibG9jaygqZmRfb3V0LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50aygic3RhcnRfaW9fdGhyZWFkIC0gZmFpbGVkIHRvIHNldCBub25ibG9ja2luZyBJL08uXG4iKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCiAJcGlkID0gY2xvbmUoaW9fdGhyZWFkLCAodm9pZCAqKSBzcCwgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsCiAJCSAgICBOVUxMKTsKIAlpZihwaWQgPCAwKXsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy94dGVybS5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKaW5kZXggNTcxYzJiMy4uZmQ4MTdlNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKQEAgLTEsMjIgKzEsMjAgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSAia2Vybl91dGlsLmgiCiAjaW5jbHVkZSAiY2hhbl91c2VyLmgiCi0jaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ4dGVybS5oIgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAKIHN0cnVjdCB4dGVybV9jaGFuIHsKIAlpbnQgcGlkOwpAQCAtMjUsMjUgKzIzLDIxIEBACiAJaW50IGRldmljZTsKIAlpbnQgcmF3OwogCXN0cnVjdCB0ZXJtaW9zIHR0OwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7Ci0JaW50IGRpcmVjdF9yY3Y7CiB9OwogCi0vKiBOb3Qgc3RhdGljIGJlY2F1c2UgaXQncyBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlIHR0IG1vZGUgZ2RiIGNvZGUgKi8KLXZvaWQgKnh0ZXJtX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQorc3RhdGljIHZvaWQgKnh0ZXJtX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhOwogCiAJZGF0YSA9IG1hbGxvYyhzaXplb2YoKmRhdGEpKTsKLQlpZihkYXRhID09IE5VTEwpIHJldHVybihOVUxMKTsKLQkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX2NoYW4pIHsgLnBpZCAJCT0gLTEsIAorCWlmIChkYXRhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fY2hhbikgeyAucGlkIAkJPSAtMSwKIAkJCQkgICAgICAgLmhlbHBlcl9waWQgCT0gLTEsCi0JCQkJICAgICAgIC5kZXZpY2UgCQk9IGRldmljZSwgCisJCQkJICAgICAgIC5kZXZpY2UgCQk9IGRldmljZSwKIAkJCQkgICAgICAgLnRpdGxlIAkJPSBvcHRzLT54dGVybV90aXRsZSwKLQkJCQkgICAgICAgLnJhdyAgCQk9IG9wdHMtPnJhdywKLQkJCQkgICAgICAgLnN0YWNrIAkJPSBvcHRzLT50cmFtcF9zdGFjaywKLQkJCQkgICAgICAgLmRpcmVjdF9yY3YgCT0gIW9wdHMtPmluX2tlcm5lbCB9ICk7Ci0JcmV0dXJuKGRhdGEpOworCQkJCSAgICAgICAucmF3ICAJCT0gb3B0cy0+cmF3IH0gKTsKKwlyZXR1cm4gZGF0YTsKIH0KIAogLyogT25seSBjaGFuZ2VkIGJ5IHh0ZXJtX3NldHVwLCB3aGljaCBpcyBhIHNldHVwICovCkBAIC01NywxNiArNTEsMjIgQEAKIAl0ZXJtaW5hbF9lbXVsYXRvciA9IGxpbmU7CiAKIAlsaW5lID0gc3RyY2hyKGxpbmUsICcsJyk7Ci0JaWYobGluZSA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAkqbGluZSsrID0gJ1wwJzsKLQlpZigqbGluZSkgdGl0bGVfc3dpdGNoID0gbGluZTsKKwlpZiAoKmxpbmUpCisJCXRpdGxlX3N3aXRjaCA9IGxpbmU7CiAKIAlsaW5lID0gc3RyY2hyKGxpbmUsICcsJyk7Ci0JaWYobGluZSA9PSBOVUxMKSByZXR1cm4oMCk7Ci0JKmxpbmUrKyA9ICdcMCc7Ci0JaWYoKmxpbmUpIGV4ZWNfc3dpdGNoID0gbGluZTsKKwlpZiAobGluZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAotCXJldHVybigwKTsKKwkqbGluZSsrID0gJ1wwJzsKKwlpZiAoKmxpbmUpCisJCWV4ZWNfc3dpdGNoID0gbGluZTsKKworCXJldHVybiAwOwogfQogCiBfX3VtbF9zZXR1cCgieHRlcm09IiwgeHRlcm1fc2V0dXAsCkBAIC04MiwxMDcgKzgyLDEyOCBAQAogIiAgICBhcmUgJ3h0ZXJtPWdub21lLXRlcm1pbmFsLC10LC14Jy5cblxuIgogKTsKIAotLyogWFhYIFRoaXMgYmFkbHkgbmVlZHMgc29tZSBjbGVhbmluZyB1cCBpbiB0aGUgZXJyb3IgcGF0aHMKLSAqIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZQotICovCi1pbnQgeHRlcm1fb3BlbihpbnQgaW5wdXQsIGludCBvdXRwdXQsIGludCBwcmltYXJ5LCB2b2lkICpkLAorc3RhdGljIGludCB4dGVybV9vcGVuKGludCBpbnB1dCwgaW50IG91dHB1dCwgaW50IHByaW1hcnksIHZvaWQgKmQsCiAJCSAgICAgIGNoYXIgKipkZXZfb3V0KQogewogCXN0cnVjdCB4dGVybV9jaGFuICpkYXRhID0gZDsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBwaWQsIGZkLCBuZXcsIGVycjsKIAljaGFyIHRpdGxlWzI1Nl0sIGZpbGVbXSA9ICIvdG1wL3h0ZXJtLXBpcGVYWFhYWFgiOwotCWNoYXIgKmFyZ3ZbXSA9IHsgdGVybWluYWxfZW11bGF0b3IsIHRpdGxlX3N3aXRjaCwgdGl0bGUsIGV4ZWNfc3dpdGNoLCAKKwljaGFyICphcmd2W10gPSB7IHRlcm1pbmFsX2VtdWxhdG9yLCB0aXRsZV9zd2l0Y2gsIHRpdGxlLCBleGVjX3N3aXRjaCwKIAkJCSAiL3Vzci9saWIvdW1sL3BvcnQtaGVscGVyIiwgIi11bWwtc29ja2V0IiwKIAkJCSBmaWxlLCBOVUxMIH07CiAKLQlpZihvc19hY2Nlc3MoYXJndls0XSwgT1NfQUNDX1hfT0spIDwgMCkKKwlpZiAoYWNjZXNzKGFyZ3ZbNF0sIFhfT0spIDwgMCkKIAkJYXJndls0XSA9ICJwb3J0LWhlbHBlciI7CiAKIAkvKiBDaGVjayB0aGF0IERJU1BMQVkgaXMgc2V0LCB0aGlzIGRvZXNuJ3QgZ3VhcmFudGVlIHRoZSB4dGVybQogCSAqIHdpbGwgd29yayBidXQgdy9vIGl0IHdlIGNhbiBiZSBwcmV0dHkgc3VyZSBpdCB3b24ndC4gKi8KLQlpZiAoIWdldGVudigiRElTUExBWSIpKSB7Ci0JCXByaW50aygieHRlcm1fb3BlbjogJERJU1BMQVkgbm90IHNldC5cbiIpOworCWlmIChnZXRlbnYoIkRJU1BMQVkiKSA9PSBOVUxMKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbjogJERJU1BMQVkgbm90IHNldC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKgorCSAqIFRoaXMgYnVzaW5lc3Mgb2YgZ2V0dGluZyBhIGRlc2NyaXB0b3IgdG8gYSB0ZW1wIGZpbGUsCisJICogZGVsZXRpbmcgdGhlIGZpbGUgYW5kIGNsb3NpbmcgdGhlIGRlc2NyaXB0b3IgaXMganVzdCB0byBnZXQKKwkgKiBhIGtub3duLXVudXNlZCBuYW1lIGZvciB0aGUgVW5peCBzb2NrZXQgdGhhdCB3ZSByZWFsbHkKKwkgKiB3YW50LgorCSAqLwogCWZkID0gbWtzdGVtcChmaWxlKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoInh0ZXJtX29wZW4gOiBta3N0ZW1wIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgZXJybm8pOworCQlwcmludGsoVU1fS0VSTl9FUlIgInh0ZXJtX29wZW4gOiBta3N0ZW1wIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJICAgICAgIGVycm5vKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZih1bmxpbmsoZmlsZSkpeworCWlmICh1bmxpbmsoZmlsZSkpIHsKIAkJZXJyID0gLWVycm5vOwotCQlwcmludGsoInh0ZXJtX29wZW4gOiB1bmxpbmsgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IHVubGluayBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCSAgICAgICBlcnJubyk7CiAJCXJldHVybiBlcnI7CiAJfQotCW9zX2Nsb3NlX2ZpbGUoZmQpOworCWNsb3NlKGZkKTsKIAogCWZkID0gb3NfY3JlYXRlX3VuaXhfc29ja2V0KGZpbGUsIHNpemVvZihmaWxlKSwgMSk7Ci0JaWYoZmQgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogY3JlYXRlX3VuaXhfc29ja2V0IGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgCi0JCSAgICAgICAtZmQpOwotCQlyZXR1cm4oZmQpOworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogY3JlYXRlX3VuaXhfc29ja2V0IGZhaWxlZCwgIgorCQkgICAgICAgImVycm5vID0gJWRcbiIsIC1mZCk7CisJCXJldHVybiBmZDsKIAl9CiAKIAlzcHJpbnRmKHRpdGxlLCBkYXRhLT50aXRsZSwgZGF0YS0+ZGV2aWNlKTsKLQlzdGFjayA9IGRhdGEtPnN0YWNrOwotCXBpZCA9IHJ1bl9oZWxwZXIoTlVMTCwgTlVMTCwgYXJndiwgJnN0YWNrKTsKLQlpZihwaWQgPCAwKXsKLQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogcnVuX2hlbHBlciBmYWlsZWQsIGVycm5vID0gJWRcbiIsIC1waWQpOwotCQlyZXR1cm4ocGlkKTsKKwlwaWQgPSBydW5faGVscGVyKE5VTEwsIE5VTEwsIGFyZ3YpOworCWlmIChwaWQgPCAwKSB7CisJCWVyciA9IHBpZDsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogcnVuX2hlbHBlciBmYWlsZWQsICIKKwkJICAgICAgICJlcnJubyA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfY2xvc2UxOwogCX0KIAotCWlmIChkYXRhLT5kaXJlY3RfcmN2KSB7Ci0JCW5ldyA9IG9zX3Jjdl9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOwotCX0gZWxzZSB7Ci0JCWVyciA9IG9zX3NldF9mZF9ibG9jayhmZCwgMCk7Ci0JCWlmKGVyciA8IDApewotCQkJcHJpbnRrKCJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCBkZXNjcmlwdG9yICIKLQkJCSAgICAgICAibm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7Ci0JCQlyZXR1cm4oZXJyKTsKLQkJfQotCQluZXcgPSB4dGVybV9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOworCWVyciA9IG9zX3NldF9mZF9ibG9jayhmZCwgMCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogZmFpbGVkIHRvIHNldCBkZXNjcmlwdG9yICIKKwkJICAgICAgICJub24tYmxvY2tpbmcsIGVyciA9ICVkXG4iLCAtZXJyKTsKKwkJZ290byBvdXRfa2lsbDsKIAl9Ci0JaWYobmV3IDwgMCl7Ci0JCXByaW50aygieHRlcm1fb3BlbiA6IG9zX3Jjdl9mZCBmYWlsZWQsIGVyciA9ICVkXG4iLCAtbmV3KTsKLQkJZ290byBvdXQ7CisKKwluZXcgPSB4dGVybV9mZChmZCwgJmRhdGEtPmhlbHBlcl9waWQpOworCWlmIChuZXcgPCAwKSB7CisJCWVyciA9IG5ldzsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJ4dGVybV9vcGVuIDogb3NfcmN2X2ZkIGZhaWxlZCwgZXJyID0gJWRcbiIsCisJCSAgICAgICAtZXJyKTsKKwkJZ290byBvdXRfa2lsbDsKKwl9CisKKwllcnIgPSBvc19zZXRfZmRfYmxvY2sobmV3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAieHRlcm1fb3BlbiA6IGZhaWxlZCB0byBzZXQgeHRlcm0gIgorCQkgICAgICAgImRlc2NyaXB0b3Igbm9uLWJsb2NraW5nLCBlcnIgPSAlZFxuIiwgLWVycik7CisJCWdvdG8gb3V0X2Nsb3NlMjsKIAl9CiAKIAlDQVRDSF9FSU5UUihlcnIgPSB0Y2dldGF0dHIobmV3LCAmZGF0YS0+dHQpKTsKLQlpZihlcnIpeworCWlmIChlcnIpIHsKIAkJbmV3ID0gZXJyOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfY2xvc2UyOwogCX0KIAotCWlmKGRhdGEtPnJhdyl7CisJaWYgKGRhdGEtPnJhdykgewogCQllcnIgPSByYXcobmV3KTsKLQkJaWYoZXJyKXsKKwkJaWYgKGVycikgewogCQkJbmV3ID0gZXJyOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9jbG9zZTI7CiAJCX0KIAl9CiAKKwl1bmxpbmsoZmlsZSk7CiAJZGF0YS0+cGlkID0gcGlkOwogCSpkZXZfb3V0ID0gTlVMTDsKLSBvdXQ6Ci0JdW5saW5rKGZpbGUpOwotCXJldHVybihuZXcpOworCisJcmV0dXJuIG5ldzsKKworIG91dF9jbG9zZTI6CisJY2xvc2UobmV3KTsKKyBvdXRfa2lsbDoKKwlvc19raWxsX3Byb2Nlc3MocGlkLCAxKTsKKyBvdXRfY2xvc2UxOgorCWNsb3NlKGZkKTsKKworCXJldHVybiBlcnI7CiB9CiAKLS8qIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZSAqLwotdm9pZCB4dGVybV9jbG9zZShpbnQgZmQsIHZvaWQgKmQpCitzdGF0aWMgdm9pZCB4dGVybV9jbG9zZShpbnQgZmQsIHZvaWQgKmQpCiB7CiAJc3RydWN0IHh0ZXJtX2NoYW4gKmRhdGEgPSBkOwogCQotCWlmKGRhdGEtPnBpZCAhPSAtMSkgCisJaWYgKGRhdGEtPnBpZCAhPSAtMSkKIAkJb3Nfa2lsbF9wcm9jZXNzKGRhdGEtPnBpZCwgMSk7CiAJZGF0YS0+cGlkID0gLTE7Ci0JaWYoZGF0YS0+aGVscGVyX3BpZCAhPSAtMSkgCisKKwlpZiAoZGF0YS0+aGVscGVyX3BpZCAhPSAtMSkKIAkJb3Nfa2lsbF9wcm9jZXNzKGRhdGEtPmhlbHBlcl9waWQsIDApOwogCWRhdGEtPmhlbHBlcl9waWQgPSAtMTsKKwogCW9zX2Nsb3NlX2ZpbGUoZmQpOwogfQogCkBAIC0yMDMsMTQgKzIyNCwzIEBACiAJLmZyZWUJCT0geHRlcm1fZnJlZSwKIAkud2luY2gJCT0gMSwKIH07Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtX2tlcm4uYwppbmRleCBhNGNlNzA1Li5iNjQ2YmNjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMveHRlcm1fa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy94dGVybV9rZXJuLmMKQEAgLTEsMTggKzEsMTQgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKLSNpbmNsdWRlICJsaW51eC9lcnJuby5oIgotI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKLSNpbmNsdWRlICJsaW51eC9zaWduYWwuaCIKLSNpbmNsdWRlICJsaW51eC9pbnRlcnJ1cHQuaCIKLSNpbmNsdWRlICJhc20vaXJxLmgiCi0jaW5jbHVkZSAiaXJxX3VzZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlICJpcnFfa2Vybi5oIgotI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSAieHRlcm0uaCIKIAogc3RydWN0IHh0ZXJtX3dhaXQgewogCXN0cnVjdCBjb21wbGV0aW9uIHJlYWR5OwpAQCAtMjcsMTIgKzIzLDEzIEBACiAJaW50IGZkOwogCiAJZmQgPSBvc19yY3ZfZmQoeHRlcm0tPmZkLCAmeHRlcm0tPnBpZCk7Ci0JaWYoZmQgPT0gLUVBR0FJTikKLQkJcmV0dXJuKElSUV9OT05FKTsKKwlpZiAoZmQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIElSUV9OT05FOwogCiAJeHRlcm0tPm5ld19mZCA9IGZkOwogCWNvbXBsZXRlKCZ4dGVybS0+cmVhZHkpOwotCXJldHVybihJUlFfSEFORExFRCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIGludCB4dGVybV9mZChpbnQgc29ja2V0LCBpbnQgKnBpZF9vdXQpCkBAIC00MSwyMiArMzgsMjEgQEAKIAlpbnQgZXJyLCByZXQ7CiAKIAlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZihkYXRhID09IE5VTEwpeworCWlmIChkYXRhID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ4dGVybV9mZCA6IGZhaWxlZCB0byBhbGxvY2F0ZSB4dGVybV93YWl0XG4iKTsKLQkJcmV0dXJuKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAkvKiBUaGlzIGlzIGEgbG9ja2VkIHNlbWFwaG9yZS4uLiAqLwotCSpkYXRhID0gKChzdHJ1Y3QgeHRlcm1fd2FpdCkgCi0JCXsgLmZkIAkJPSBzb2NrZXQsCi0JCSAgLnBpZCAJCT0gLTEsCi0JCSAgLm5ld19mZCAJPSAtMSB9KTsKKwkqZGF0YSA9ICgoc3RydWN0IHh0ZXJtX3dhaXQpIHsgLmZkIAkJPSBzb2NrZXQsCisJCQkJICAgICAgIC5waWQgCQk9IC0xLAorCQkJCSAgICAgICAubmV3X2ZkCSAJPSAtMSB9KTsKIAlpbml0X2NvbXBsZXRpb24oJmRhdGEtPnJlYWR5KTsKIAotCWVyciA9IHVtX3JlcXVlc3RfaXJxKFhURVJNX0lSUSwgc29ja2V0LCBJUlFfUkVBRCwgeHRlcm1faW50ZXJydXB0LCAKKwllcnIgPSB1bV9yZXF1ZXN0X2lycShYVEVSTV9JUlEsIHNvY2tldCwgSVJRX1JFQUQsIHh0ZXJtX2ludGVycnVwdCwKIAkJCSAgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLAogCQkJICAgICAieHRlcm0iLCBkYXRhKTsKLQlpZiAoZXJyKXsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAieHRlcm1fZmQgOiBmYWlsZWQgdG8gZ2V0IElSUSBmb3IgeHRlcm0sICIKIAkJICAgICAgICJlcnIgPSAlZFxuIiwgIGVycik7CiAJCXJldCA9IGVycjsKQEAgLTc2LDE2ICs3Miw1IEBACiAgb3V0OgogCWtmcmVlKGRhdGEpOwogCi0JcmV0dXJuKHJldCk7CisJcmV0dXJuIHJldDsKIH0KLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaAppbmRleCBjNGI0MWJiLi42MjRiNTEwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCkBAIC00MCw3ICs0MCw3IEBACiBleHRlcm4gdm9pZCBkZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgcmVhY3RpdmF0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBpbnQgaXJxKTsKIGV4dGVybiB2b2lkIGNoYW5fZW5hYmxlX3dpbmNoKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKLWV4dGVybiB2b2lkIGVuYWJsZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lKTsKK2V4dGVybiBpbnQgZW5hYmxlX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUpOwogZXh0ZXJuIHZvaWQgY2xvc2VfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGRlbGF5X2ZyZWVfaXJxKTsKIGV4dGVybiBpbnQgY2hhbl93aW5kb3dfc2l6ZShzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgCiAJCQkgICAgIHVuc2lnbmVkIHNob3J0ICpyb3dzX291dCwgCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmgKaW5kZXggMzhmMTZkOC4uNWEyMjYzZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaApAQCAtMTIsOCArMTIsNiBAQAogCXZvaWQgKCpjb25zdCBhbm5vdW5jZSkoY2hhciAqZGV2X25hbWUsIGludCBkZXYpOwogCWNoYXIgKnh0ZXJtX3RpdGxlOwogCWNvbnN0IGludCByYXc7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyB0cmFtcF9zdGFjazsKLQljb25zdCBpbnQgaW5fa2VybmVsOwogfTsKIAogZW51bSBjaGFuX2luaXRfcHJpIHsgSU5JVF9TVEFUSUMsIElOSVRfQUxMLCBJTklUX09ORSB9OwpAQCAtNDQsNyArNDIsOCBAQAogCiBzdHJ1Y3QgdHR5X3N0cnVjdDsKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX3dpbmNoKGludCBmZCwgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2luY2hfaXJxKGludCBmZCwgaW50IHR0eV9mZCwgaW50IHBpZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCByZWdpc3Rlcl93aW5jaF9pcnEoaW50IGZkLCBpbnQgdHR5X2ZkLCBpbnQgcGlkLAorCQkJICAgICAgIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGxvbmcgc3RhY2spOwogCiAjZGVmaW5lIF9fY2hhbm5lbF9oZWxwKGZuLCBwcmVmaXgpIFwKIF9fdW1sX2hlbHAoZm4sIHByZWZpeCAiWzAtOV0qPTxjaGFubmVsIGRlc2NyaXB0aW9uPlxuIiBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY29tbW9uLW9mZnNldHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCmluZGV4IDczNzZlZTQuLjZlZWUzNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oCkBAIC0yNyw2ICsyNyw5IEBACiAKIERFRklORShVTV9OUl9DUFVTLCBOUl9DUFVTKTsKIAorREVGSU5FKFVNX0dGUF9LRVJORUwsIEdGUF9LRVJORUwpOworREVGSU5FKFVNX0dGUF9BVE9NSUMsIEdGUF9BVE9NSUMpOworCiAvKiBGb3IgY3J5cHRvIGFzc2VtYmxlciBjb2RlLiAqLwogREVGSU5FKGNyeXB0b190Zm1fY3R4X29mZnNldCwgb2Zmc2V0b2Yoc3RydWN0IGNyeXB0b190Zm0sIF9fY3J0X2N0eCkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCmluZGV4IDRkOWZiMjYuLjkzMGIyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC0yMzksMTEgKzIzOSw5IEBACiAvKiBleGVjdnAuYyAqLwogZXh0ZXJuIGludCBleGVjdnBfbm9hbGxvYyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSk7CiAvKiBoZWxwZXIuYyAqLwotZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2LAotCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOworZXh0ZXJuIGludCBydW5faGVscGVyKHZvaWQgKCpwcmVfZXhlYykodm9pZCAqKSwgdm9pZCAqcHJlX2RhdGEsIGNoYXIgKiphcmd2KTsKIGV4dGVybiBpbnQgcnVuX2hlbHBlcl90aHJlYWQoaW50ICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnLAotCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCwKLQkJCSAgICAgaW50IHN0YWNrX29yZGVyKTsKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBsb25nICpzdGFja19vdXQpOwogZXh0ZXJuIGludCBoZWxwZXJfd2FpdChpbnQgcGlkKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmggYi9hcmNoL3VtL2luY2x1ZGUvdW1fbWFsbG9jLmgKaW5kZXggZTZkN2M1YS4uMGFkMTdjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3VtX21hbGxvYy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS91bV9tYWxsb2MuaApAQCAtNiwxMSArNiwxNyBAQAogI2lmbmRlZiBfX1VNX01BTExPQ19IX18KICNkZWZpbmUgX19VTV9NQUxMT0NfSF9fCiAKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKTsKLWV4dGVybiB2b2lkICp1bV9rbWFsbG9jX2F0b21pYyhpbnQgc2l6ZSk7CisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKworZXh0ZXJuIHZvaWQgKl9fa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCiBleHRlcm4gdm9pZCBrZnJlZShjb25zdCB2b2lkICpwdHIpOwogCi1leHRlcm4gdm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCAqdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgdmZyZWUodm9pZCAqcHRyKTsKIAogI2VuZGlmIC8qIF9fVU1fTUFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCBkYmEwNGQ4Li45ODcwZmViIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImlycV9rZXJuLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJzaWdpby5oIgotI2luY2x1ZGUgInVtX21hbGxvYy5oIgogI2luY2x1ZGUgIm1pc2NfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiYXMtbGF5b3V0LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwppbmRleCA4ZDJjNTQ5Li5iZmE1MmYyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSAibW9kZS5oIgogI2luY2x1ZGUgIm1vZGVfa2Vybi5oIgogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCi0jaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAKIC8qIFRoaXMgaXMgYSBwZXItY3B1IGFycmF5LiAgQSBwcm9jZXNzb3Igb25seSBtb2RpZmllcyBpdHMgZW50cnkgYW5kIGl0IG9ubHkKICAqIGNhcmVzIGFib3V0IGl0cyBlbnRyeSwgc28gaXQncyBPSyBpZiBhbm90aGVyIHByb2Nlc3NvciBpcyBtb2RpZnlpbmcgaXRzCkBAIC0yNjIsMjEgKzI2MSw2IEBACiB7CiB9CiAKLXZvaWQgKnVtX2ttYWxsb2MoaW50IHNpemUpCi17Ci0JcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci19Ci0KLXZvaWQgKnVtX2ttYWxsb2NfYXRvbWljKGludCBzaXplKQotewotCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotfQotCi12b2lkICp1bV92bWFsbG9jKGludCBzaXplKQotewotCXJldHVybiB2bWFsbG9jKHNpemUpOwotfQotCiBpbnQgX19jYW50X3NsZWVwKHZvaWQpIHsKIAlyZXR1cm4gaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpIHx8IGluX2ludGVycnVwdCgpOwogCS8qIElzIGluX2ludGVycnVwdCgpIHJlYWxseSBuZWVkZWQ/ICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCmluZGV4IDYyNzc0MmQuLjY5MTZjODggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3B0cmFjZS5jCkBAIC01MiwxNyArNTIsOSBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQlyZXQgPSAtRUlPOwotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgcCk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAgICAgICAgIGNhc2UgUFRSQUNFX1BFRUtVU1I6CkBAIC03MiwxMSArNjQsNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAtRUlPOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIAotCQkJCSAgICAgIDEpICE9IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAwOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jIGIvYXJjaC91bS9vcy1MaW51eC9haW8uYwppbmRleCA5YmY5NDRmLi5iMTI2ZGY0IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogc3RhdGljIGludCBhaW9fcmVxX2ZkX3IgPSAtMTsKIHN0YXRpYyBpbnQgYWlvX3JlcV9mZF93ID0gLTE7CiBzdGF0aWMgaW50IGFpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFpb19zdGFjazsKIAogc3RhdGljIGludCBub3RfYWlvX3RocmVhZCh2b2lkICphcmcpCiB7CkBAIC0yMTIsNyArMjEzLDYgQEAKIAogc3RhdGljIGludCBpbml0X2Fpb18yNCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJaW50IGZkc1syXSwgZXJyOwogCiAJZXJyID0gb3NfcGlwZShmZHMsIDEsIDEpOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCWdvdG8gb3V0X2Nsb3NlX3BpcGU7CiAKIAllcnIgPSBydW5faGVscGVyX3RocmVhZChub3RfYWlvX3RocmVhZCwgTlVMTCwKLQkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJnN0YWNrLCAwKTsKKwkJCQlDTE9ORV9GSUxFUyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgJmFpb19zdGFjayk7CiAJaWYoZXJyIDwgMCkKIAkJZ290byBvdXRfY2xvc2VfcGlwZTsKIApAQCAtMjUyLDcgKzI1Miw2IEBACiAjZGVmaW5lIERFRkFVTFRfMjRfQUlPIDAKIHN0YXRpYyBpbnQgaW5pdF9haW9fMjYodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOwogCWludCBlcnI7CiAKIAlpZihpb19zZXR1cCgyNTYsICZjdHgpKXsKQEAgLTI2Myw3ICsyNjIsNyBAQAogCX0KIAogCWVyciA9IHJ1bl9oZWxwZXJfdGhyZWFkKGFpb190aHJlYWQsIE5VTEwsCi0JCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZzdGFjaywgMCk7CisJCQkJQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSB8IFNJR0NITEQsICZhaW9fc3RhY2spOwogCWlmKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTM2NSw4ICszNjQsMTAgQEAKIAogc3RhdGljIHZvaWQgZXhpdF9haW8odm9pZCkKIHsKLQlpZihhaW9fcGlkICE9IC0xKQorCWlmIChhaW9fcGlkICE9IC0xKSB7CiAJCW9zX2tpbGxfcHJvY2VzcyhhaW9fcGlkLCAxKTsKKwkJZnJlZV9zdGFjayhhaW9fc3RhY2ssIDApOworCX0KIH0KIAogX191bWxfZXhpdGNhbGwoZXhpdF9haW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKaW5kZXggYWNiYTMwMS4uNjFkMzk1MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX3VzZXIuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCkBAIC01NCw3ICs1NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFKTsKKwlvdXRwdXQgPSBrbWFsbG9jKFVNX0tFUk5fUEFHRV9TSVpFLCBVTV9HRlBfS0VSTkVMKTsKIAlpZihvdXRwdXQgPT0gTlVMTCkKIAkJcHJpbnRrKCJldGFwX2NoYW5nZSA6IEZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyXG4iKTsKIAlyZWFkX291dHB1dChmZCwgb3V0cHV0LCBVTV9LRVJOX1BBR0VfU0laRSk7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwZV9kYXRhLmNvbnRyb2xfcmVtb3RlID0gY29udHJvbF9yZW1vdGU7CiAJcGVfZGF0YS5jb250cm9sX21lID0gY29udHJvbF9tZTsKIAlwZV9kYXRhLmRhdGFfbWUgPSBkYXRhX21lOwotCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIoZXRhcF9wcmVfZXhlYywgJnBlX2RhdGEsIGFyZ3MpOwogCiAJaWYocGlkIDwgMCkKIAkJZXJyID0gcGlkOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJZXJyID0gZXRhcF90cmFtcChwcmktPmRldl9uYW1lLCBwcmktPmdhdGVfYWRkciwgY29udHJvbF9mZHNbMF0sIAogCQkJIGNvbnRyb2xfZmRzWzFdLCBkYXRhX2Zkc1swXSwgZGF0YV9mZHNbMV0pOwogCW91dHB1dF9sZW4gPSBVTV9LRVJOX1BBR0VfU0laRTsKLQlvdXRwdXQgPSB1bV9rbWFsbG9jKG91dHB1dF9sZW4pOworCW91dHB1dCA9IGttYWxsb2Mob3V0cHV0X2xlbiwgVU1fR0ZQX0tFUk5FTCk7CiAJcmVhZF9vdXRwdXQoY29udHJvbF9mZHNbMF0sIG91dHB1dCwgb3V0cHV0X2xlbik7CiAKIAlpZihvdXRwdXQgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKaW5kZXggMTFhOTc3OS4uZjg0OGI0ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF91c2VyLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlkYXRhLnN0ZG91dCA9IHJlbW90ZTsKIAlkYXRhLmNsb3NlX21lID0gbWU7CiAKLQlwaWQgPSBydW5faGVscGVyKHR1bnRhcF9wcmVfZXhlYywgJmRhdGEsIGFyZ3YsIE5VTEwpOworCXBpZCA9IHJ1bl9oZWxwZXIodHVudGFwX3ByZV9leGVjLCAmZGF0YSwgYXJndik7CiAKIAlpZihwaWQgPCAwKQogCQlyZXR1cm4gLXBpZDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2hlbHBlci5jCmluZGV4IDk3YmVkMTYuLmQ4MWFmN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvaGVscGVyLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9oZWxwZXIuYwpAQCAtNDQsMTcgKzQ0LDEzIEBACiAvKiBSZXR1cm5zIGVpdGhlciB0aGUgcGlkIG9mIHRoZSBjaGlsZCBwcm9jZXNzIHdlIHJ1biBvciAtRSogb24gZmFpbHVyZS4KICAqIFhYWCBUaGUgYWxsb2Nfc3RhY2sgaGVyZSBicmVha3MgaWYgdGhpcyBpcyBjYWxsZWQgaW4gdGhlIHRyYWNpbmcgdGhyZWFkLCBzbwogICogd2UgbmVlZCB0byByZWNlaXZlIGEgcHJlYWxsb2NhdGVkIHN0YWNrIChhIGxvY2FsIGJ1ZmZlciBpcyBvaykuICovCi1pbnQgcnVuX2hlbHBlcih2b2lkICgqcHJlX2V4ZWMpKHZvaWQgKiksIHZvaWQgKnByZV9kYXRhLCBjaGFyICoqYXJndiwKLQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0KQoraW50IHJ1bl9oZWxwZXIodm9pZCAoKnByZV9leGVjKSh2b2lkICopLCB2b2lkICpwcmVfZGF0YSwgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IGhlbHBlcl9kYXRhIGRhdGE7CiAJdW5zaWduZWQgbG9uZyBzdGFjaywgc3A7CiAJaW50IHBpZCwgZmRzWzJdLCByZXQsIG47CiAKLQlpZiAoKHN0YWNrX291dCAhPSBOVUxMKSAmJiAoKnN0YWNrX291dCAhPSAwKSkKLQkJc3RhY2sgPSAqc3RhY2tfb3V0OwotCWVsc2UKLQkJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CisJc3RhY2sgPSBhbGxvY19zdGFjaygwLCBfX2NhbnRfc2xlZXAoKSk7CiAJaWYgKHN0YWNrID09IDApCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03Niw4ICs3Miw4IEBACiAJZGF0YS5wcmVfZGF0YSA9IHByZV9kYXRhOwogCWRhdGEuYXJndiA9IGFyZ3Y7CiAJZGF0YS5mZCA9IGZkc1sxXTsKLQlkYXRhLmJ1ZiA9IF9fY2FudF9zbGVlcCgpID8gdW1fa21hbGxvY19hdG9taWMoUEFUSF9NQVgpIDoKLQkJCQkJdW1fa21hbGxvYyhQQVRIX01BWCk7CisJZGF0YS5idWYgPSBfX2NhbnRfc2xlZXAoKSA/IGttYWxsb2MoUEFUSF9NQVgsIFVNX0dGUF9BVE9NSUMpIDoKKwkJCQkJa21hbGxvYyhQQVRIX01BWCwgVU1fR0ZQX0tFUk5FTCk7CiAJcGlkID0gY2xvbmUoaGVscGVyX2NoaWxkLCAodm9pZCAqKSBzcCwgQ0xPTkVfVk0gfCBTSUdDSExELCAmZGF0YSk7CiAJaWYgKHBpZCA8IDApIHsKIAkJcmV0ID0gLWVycm5vOwpAQCAtMTEzLDIyICsxMDksMjEgQEAKIAkJY2xvc2UoZmRzWzFdKTsKIAljbG9zZShmZHNbMF0pOwogb3V0X2ZyZWU6Ci0JaWYgKChzdGFja19vdXQgPT0gTlVMTCkgfHwgKCpzdGFja19vdXQgPT0gMCkpCi0JCWZyZWVfc3RhY2soc3RhY2ssIDApOworCWZyZWVfc3RhY2soc3RhY2ssIDApOwogCXJldHVybiByZXQ7CiB9CiAKIGludCBydW5faGVscGVyX3RocmVhZChpbnQgKCpwcm9jKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGludCBmbGFncywKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2tfb3V0LCBpbnQgc3RhY2tfb3JkZXIpCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrX291dCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YWNrLCBzcDsKIAlpbnQgcGlkLCBzdGF0dXMsIGVycjsKIAotCXN0YWNrID0gYWxsb2Nfc3RhY2soc3RhY2tfb3JkZXIsIF9fY2FudF9zbGVlcCgpKTsKKwlzdGFjayA9IGFsbG9jX3N0YWNrKDAsIF9fY2FudF9zbGVlcCgpKTsKIAlpZiAoc3RhY2sgPT0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcCA9IHN0YWNrICsgKFVNX0tFUk5fUEFHRV9TSVpFIDw8IHN0YWNrX29yZGVyKSAtIHNpemVvZih2b2lkICopOworCXNwID0gc3RhY2sgKyBVTV9LRVJOX1BBR0VfU0laRSAtIHNpemVvZih2b2lkICopOwogCXBpZCA9IGNsb25lKHByb2MsICh2b2lkICopIHNwLCBmbGFncyB8IFNJR0NITEQsIGFyZyk7CiAJaWYgKHBpZCA8IDApIHsKIAkJZXJyID0gLWVycm5vOwpAQCAtMTQ3LDcgKzE0Miw3IEBACiAJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkpCiAJCQlwcmludGsoInJ1bl9oZWxwZXJfdGhyZWFkIC0gdGhyZWFkIHJldHVybmVkIHN0YXR1cyAiCiAJCQkgICAgICAgIjB4JXhcbiIsIHN0YXR1cyk7Ci0JCWZyZWVfc3RhY2soc3RhY2ssIHN0YWNrX29yZGVyKTsKKwkJZnJlZV9zdGFjayhzdGFjaywgMCk7CiAJfSBlbHNlCiAJCSpzdGFja19vdXQgPSBzdGFjazsKIAlyZXR1cm4gcGlkOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9tYWluLmMgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwppbmRleCBmYjUxMGQ0Li5lODVmNDk5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L21haW4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L21haW4uYwpAQCAtMjM1LDggKzIzNSw4IEBACiAJCXJldHVybiBfX3JlYWxfbWFsbG9jKHNpemUpOwogCWVsc2UgaWYoc2l6ZSA8PSBVTV9LRVJOX1BBR0VfU0laRSkKIAkJLyogZmluZGluZyBjb250aWd1b3VzIHBhZ2VzIGNhbiBiZSBoYXJkKi8KLQkJcmV0ID0gdW1fa21hbGxvYyhzaXplKTsKLQllbHNlIHJldCA9IHVtX3ZtYWxsb2Moc2l6ZSk7CisJCXJldCA9IGttYWxsb2Moc2l6ZSwgVU1fR0ZQX0tFUk5FTCk7CisJZWxzZSByZXQgPSB2bWFsbG9jKHNpemUpOwogCiAJLyogZ2xpYmMgcGVvcGxlIGluc2lzdCB0aGF0IGlmIG1hbGxvYyBmYWlscywgZXJybm8gc2hvdWxkIGJlCiAJICogc2V0IGJ5IG1hbGxvYyBhcyB3ZWxsLiBTbyB3ZSBkby4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwppbmRleCA4ZDRlMGM2Li5kYzAzZTljIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKiBleGl0Y2FsbC4KICAqLwogc3RhdGljIGludCB3cml0ZV9zaWdpb19waWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdyaXRlX3NpZ2lvX3N0YWNrOwogCiAvKiBUaGVzZSBhcnJheXMgYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgc2lnaW8gdGhyZWFkIGlzIHN0YXJ0ZWQsIGFuZAogICogdGhlIGRlc2NyaXB0b3JzIGNsb3NlZCBhZnRlciBpdCBpcyBraWxsZWQuICBTbywgaXQgY2FuJ3Qgc2VlIHRoZW0gY2hhbmdlLgpAQCAtMTA0LDcgKzEwNSw3IEBACiAJaWYobiA8PSBwb2xscy0+c2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQluZXcgPSB1bV9rbWFsbG9jX2F0b21pYyhuICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwluZXcgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCksIFVNX0dGUF9BVE9NSUMpOwogCWlmKG5ldyA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZWVkX3BvbGwgOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBvbGxmZHNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE0NCw4ICsxNDUsMTAgQEAKIAlyZXR1cm47CiAgZmFpbDoKIAkvKiBDcml0aWNhbCBzZWN0aW9uIHN0YXJ0ICovCi0JaWYod3JpdGVfc2lnaW9fcGlkICE9IC0xKQorCWlmICh3cml0ZV9zaWdpb19waWQgIT0gLTEpIHsKIAkJb3Nfa2lsbF9wcm9jZXNzKHdyaXRlX3NpZ2lvX3BpZCwgMSk7CisJCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCX0KIAl3cml0ZV9zaWdpb19waWQgPSAtMTsKIAljbG9zZShzaWdpb19wcml2YXRlWzBdKTsKIAljbG9zZShzaWdpb19wcml2YXRlWzFdKTsKQEAgLTIzMCw3ICsyMzMsNyBAQAogewogCXN0cnVjdCBwb2xsZmQgKnA7CiAKLQlwID0gdW1fa21hbGxvYyhzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSwgVU1fR0ZQX0tFUk5FTCk7CiAJaWYgKHAgPT0gTlVMTCkgewogCQlwcmludGsoInNldHVwX2luaXRpYWxfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBwb2xsXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNDMsNyArMjQ2LDYgQEAKIAogc3RhdGljIHZvaWQgd3JpdGVfc2lnaW9fd29ya2Fyb3VuZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJc3RydWN0IHBvbGxmZCAqcDsKIAlpbnQgZXJyOwogCWludCBsX3dyaXRlX3NpZ2lvX2Zkc1syXTsKQEAgLTI5Myw3ICsyOTUsOCBAQAogCW1lbWNweShzaWdpb19wcml2YXRlLCBsX3NpZ2lvX3ByaXZhdGUsIHNpemVvZihsX3NpZ2lvX3ByaXZhdGUpKTsKIAogCXdyaXRlX3NpZ2lvX3BpZCA9IHJ1bl9oZWxwZXJfdGhyZWFkKHdyaXRlX3NpZ2lvX3RocmVhZCwgTlVMTCwKLQkJCQkJICAgIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0sICZzdGFjaywgMCk7CisJCQkJCSAgICBDTE9ORV9GSUxFUyB8IENMT05FX1ZNLAorCQkJCQkgICAgJndyaXRlX3NpZ2lvX3N0YWNrKTsKIAogCWlmICh3cml0ZV9zaWdpb19waWQgPCAwKQogCQlnb3RvIG91dF9jbGVhcjsKQEAgLTM1NiwxMCArMzU5LDEyIEBACiAKIHN0YXRpYyB2b2lkIHNpZ2lvX2NsZWFudXAodm9pZCkKIHsKLQlpZih3cml0ZV9zaWdpb19waWQgIT0gLTEpewotCQlvc19raWxsX3Byb2Nlc3Mod3JpdGVfc2lnaW9fcGlkLCAxKTsKLQkJd3JpdGVfc2lnaW9fcGlkID0gLTE7Ci0JfQorCWlmICh3cml0ZV9zaWdpb19waWQgPT0gLTEpCisJCXJldHVybjsKKworCW9zX2tpbGxfcHJvY2Vzcyh3cml0ZV9zaWdpb19waWQsIDEpOworCWZyZWVfc3RhY2sod3JpdGVfc2lnaW9fc3RhY2ssIDApOworCXdyaXRlX3NpZ2lvX3BpZCA9IC0xOwogfQogCiBfX3VtbF9leGl0Y2FsbChzaWdpb19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IDQ2YzAwY2MuLmJhOWFmOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtNDEsNyArNDEsNyBAQAogCWlmKHBpZCAhPSBvc19nZXRwZ3JwKCkpCiAJCXJldHVybigwKTsKIAotCXJlZ2lzdGVyX3dpbmNoX2lycSgtMSwgZmQsIC0xLCBkYXRhKTsKKwlyZWdpc3Rlcl93aW5jaF9pcnEoLTEsIGZkLCAtMSwgZGF0YSwgMCk7CiAJcmV0dXJuKDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwppbmRleCAzZjMzMTY1Li40MTliMmQ1IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKQEAgLTUsNyArNSw4IEBACiAgKiBzbyBJICptdXN0KiBkZWNsYXJlIGdvb2QgcHJvdG90eXBlcyBmb3IgdGhlbSBhbmQgdGhlbiBFWFBPUlQgdGhlbS4KICAqIFRoZSBrZXJuZWwgY29kZSB1c2VzIHRoZSBtYWNybyBkZWZpbmVkIGJ5IGluY2x1ZGUvbGludXgvc3RyaW5nLmgsCiAgKiBzbyBJIHVuZGVmIG1hY3JvczsgdGhlIHVzZXJzcGFjZSBjb2RlIGRvZXMgbm90IGluY2x1ZGUgdGhhdCBhbmQgSQotICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4qLworICogYWRkIGFuIEVYUE9SVCBmb3IgdGhlIGdsaWJjIG9uZS4KKyAqLwogCiAjdW5kZWYgc3RybGVuCiAjdW5kZWYgc3Ryc3RyCkBAIC02MSwxMiArNjIsMTggQEAKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX194c3RhdCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9fbHhzdGF0KTsKIEVYUE9SVF9TWU1CT0xfUFJPVE8oX19seHN0YXQ2NCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKF9fZnhzdGF0NjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhsc2Vlayk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKGxzZWVrNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG93bik7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG93bik7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHRydW5jYXRlKTsKK0VYUE9SVF9TWU1CT0xfUFJPVE8oZnRydW5jYXRlNjQpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyh1dGltZSk7CitFWFBPUlRfU1lNQk9MX1BST1RPKHV0aW1lcyk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZ1dGltZXMpOwogRVhQT1JUX1NZTUJPTF9QUk9UTyhjaG1vZCk7CitFWFBPUlRfU1lNQk9MX1BST1RPKGZjaG1vZCk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKHJlbmFtZSk7CiBFWFBPUlRfU1lNQk9MX1BST1RPKF9feG1rbm9kKTsKIApAQCAtMTAyLDE0ICsxMDksMyBAQAogCiBleHRlcm4gbG9uZyBfX2d1YXJkIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIEVYUE9SVF9TWU1CT0woX19ndWFyZCk7Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC92ODUwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhOWIwOTM0Li5hNDU4YWM5IDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTExNywyNCArMTE3LDE2IEBACiAJaW50IHJ2YWw7CiAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKLQkJdW5zaWduZWQgbG9uZyB2YWwsIGNvcGllZDsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSwgMCk7Ci0JCXJ2YWwgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih2YWwpKQotCQkJYnJlYWs7Ci0JCXJ2YWwgPSBwdXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopZGF0YSk7CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCiAJY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCXJ2YWwgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpCi0JCSAgICA9PSBzaXplb2YoZGF0YSkpCi0JCQlicmVhazsKLQkJcnZhbCA9IC1FSU87CisJCXJ2YWwgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWdvdG8gb3V0OwogCiAJLyogUmVhZC93cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBBRERSIGluIHRoZSByZWdpc3RlcnMuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggOGJkZDI1YS4uMTRiZjhjZSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC03NzQsOCArNzc0LDggQEAKIHNvdXJjZSAiYXJjaC94ODZfNjQvb3Byb2ZpbGUvS2NvbmZpZyIKIAogY29uZmlnIEtQUk9CRVMKLQlib29sICJLcHJvYmVzIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgRVhQRVJJTUVOVEFMICYmIE1PRFVMRVMKKwlib29sICJLcHJvYmVzIgorCWRlcGVuZHMgb24gS0FMTFNZTVMgJiYgTU9EVUxFUwogCWhlbHAKIAkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCiAJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggNDc1NjVjMy4uNzgyZGVhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCkBAIC01MjYsNyArNTI2LDcgQEAKIAkucXVhZCBzeXNfaW5pdF9tb2R1bGUKIAkucXVhZCBzeXNfZGVsZXRlX21vZHVsZQogCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJCS8qIDEzMCAgZ2V0X2tlcm5lbF9zeW1zICovCi0JLnF1YWQgc3lzX3F1b3RhY3RsCisJLnF1YWQgc3lzMzJfcXVvdGFjdGwKIAkucXVhZCBzeXNfZ2V0cGdpZAogCS5xdWFkIHN5c19mY2hkaXIKIAkucXVhZCBxdWlldF9uaV9zeXNjYWxsCS8qIGJkZmx1c2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCmluZGV4IDFmYWI0ODcuLjk0MWM4NGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwpAQCAtNzMsNyArNzMsMTEgQEAKIAlhZGRxCSVyYnAsIGluaXRfbGV2ZWw0X3BndCArICg1MTEqOCkoJXJpcCkKIAogCWFkZHEJJXJicCwgbGV2ZWwzX2lkZW50X3BndCArIDAoJXJpcCkKKwogCWFkZHEJJXJicCwgbGV2ZWwzX2tlcm5lbF9wZ3QgKyAoNTEwKjgpKCVyaXApCisJYWRkcQklcmJwLCBsZXZlbDNfa2VybmVsX3BndCArICg1MTEqOCkoJXJpcCkKKworCWFkZHEJJXJicCwgbGV2ZWwyX2ZpeG1hcF9wZ3QgKyAoNTA2KjgpKCVyaXApCiAKIAkvKiBBZGQgYW4gSWRlbnRpdHkgbWFwcGluZyBpZiBJIGFtIGFib3ZlIDFHICovCiAJbGVhcQlfdGV4dCglcmlwKSwgJXJkaQpAQCAtMzE0LDcgKzMxOCwxNiBAQAogCS5maWxsCTUxMCw4LDAKIAkvKiAoMl40OC0oMioxMDI0KjEwMjQqMTAyNCktKCgyXjM5KSo1MTEpKS8oMl4zMCkgPSA1MTAgKi8KIAkucXVhZAlsZXZlbDJfa2VybmVsX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9LRVJOUEdfVEFCTEUKLQkuZmlsbAkxLDgsMAorCS5xdWFkCWxldmVsMl9maXhtYXBfcGd0IC0gX19TVEFSVF9LRVJORUxfbWFwICsgX1BBR0VfVEFCTEUKKworTkVYVF9QQUdFKGxldmVsMl9maXhtYXBfcGd0KQorCS5maWxsCTUwNiw4LDAKKwkucXVhZAlsZXZlbDFfZml4bWFwX3BndCAtIF9fU1RBUlRfS0VSTkVMX21hcCArIF9QQUdFX1RBQkxFCisJLyogOE1CIHJlc2VydmVkIGZvciB2c3lzY2FsbHMgKyBhIDJNQiBob2xlID0gNCArIDEgZW50cmllcyAqLworCS5maWxsCTUsOCwwCisKK05FWFRfUEFHRShsZXZlbDFfZml4bWFwX3BndCkKKwkuZmlsbAk1MTIsOCwwCiAKIE5FWFRfUEFHRShsZXZlbDJfaWRlbnRfcGd0KQogCS8qIFNpbmNlIEkgZWFzaWx5IGNhbiwgbWFwIHRoZSBmaXJzdCAxRy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCA5MzFjNjRiLi5lZGJiYzU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0yOTYsNyArMjk2LDcgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShsb2NhbF90LCBhbGVydF9jb3VudGVyKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIG5taV90b3VjaCk7CiAKLXZvaWQgdG91Y2hfbm1pX3dhdGNoZG9nICh2b2lkKQordm9pZCB0b3VjaF9ubWlfd2F0Y2hkb2codm9pZCkKIHsKIAlpZiAobm1pX3dhdGNoZG9nID4gMCkgewogCQl1bnNpZ25lZCBjcHU7CkBAIC0zMDYsOCArMzA2LDEwIEBACiAJCSAqIGRvIGl0IG91cnNlbHZlcyBiZWNhdXNlIHRoZSBhbGVydCBjb3VudCBpbmNyZWFzZSBpcyBub3QKIAkJICogYXRvbWljLgogCQkgKi8KLQkJZm9yX2VhY2hfcHJlc2VudF9jcHUgKGNwdSkKLQkJCXBlcl9jcHUobm1pX3RvdWNoLCBjcHUpID0gMTsKKwkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCQlpZiAocGVyX2NwdShubWlfdG91Y2gsIGNwdSkgIT0gMSkKKwkJCQlwZXJfY3B1KG5taV90b3VjaCwgY3B1KSA9IDE7CisJCX0KIAl9CiAKICAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDk0MDkxMTcuLmZhNjc3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKQEAgLTMxMywxNyArMzEzLDkgQEAKIAlzd2l0Y2ggKHJlcXVlc3QpIHsKIAkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgZml4ZWQuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7CisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7Ci0JfQogCiAJLyogcmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICovCiAJY2FzZSBQVFJBQ0VfUEVFS1VTUjogewpAQCAtMzY3LDEwICszNTksNyBAQAogCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwogCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRUlPOworCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGFhYzFjMGIuLjc0Y2JlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC0zMzAsNiArMzMwLDcgQEAKIAogc3RhdGljIHZvaWQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJcHJpbnRrX2FkZHJlc3MoYWRkcik7CiB9CiAKQEAgLTUxOCw2ICs1MTksNyBAQAogCXByaW50aygiXG4iKTsKIAlub3RpZnlfZGllKERJRV9PT1BTLCBzdHIsIHJlZ3MsIGVyciwgY3VycmVudC0+dGhyZWFkLnRyYXBfbm8sIFNJR1NFR1YpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCWFkZF90YWludChUQUlOVF9ESUUpOwogCS8qIEV4ZWN1dGl2ZSBzdW1tYXJ5IGluIGNhc2UgdGhlIG9vcHMgc2Nyb2xsZWQgYXdheSAqLwogCXByaW50ayhLRVJOX0FMRVJUICJSSVAgIik7CiAJcHJpbnRrX2FkZHJlc3MocmVncy0+cmlwKTsgCkBAIC01MzEsNyArNTMzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gb29wc19iZWdpbigpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJlcG9ydF9idWcocmVncy0+cmlwKTsKKwkJcmVwb3J0X2J1ZyhyZWdzLT5yaXAsIHJlZ3MpOwogCiAJX19kaWUoc3RyLCByZWdzLCBlcnIpOwogCW9vcHNfZW5kKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwppbmRleCAxNDEwNGZmLi4wNmExM2Q5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC01MCwxOCArNTAsOCBAQAogCXN3aXRjaCAocmVxdWVzdCkgewogCWNhc2UgUFRSQUNFX1BFRUtURVhUOiAvKiByZWFkIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QRUVLREFUQToKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgY29waWVkOwotCi0JCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3BpZWQgIT0gc2l6ZW9mKHRtcCkpCi0JCQlicmVhazsKLQkJcmV0ID0gcHV0X3VzZXIodG1wLCh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7Ci0JfQogCiAJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICAqLwogCkBAIC0xMzgsMTAgKzEyOCw3IEBACiAKIAljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KIAljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKQotCQkgICAgPT0gc2l6ZW9mKGRhdGEpKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKIAkJZ290byBvdXQ7CiAKIAljYXNlIFBUUkFDRV9QT0tFVVNSOgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwppbmRleCA2OTNhYjI2Li5jNWU2MmY5IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwpAQCAtNDgyLDYgKzQ4Miw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXNob3dfc3RhY2soTlVMTCwgKHVuc2lnbmVkIGxvbmcqKXJlZ3MtPmFyZWdbMV0pOwogCisJYWRkX3RhaW50KFRBSU5UX0RJRSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CiAKIAlpZiAoaW5faW50ZXJydXB0KCkpCmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCAyODU5MzUxLi42NTk3YjYwIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTUxLDQgKzUxLDEyIEBACiAKIGVuZGlmICMgQkxPQ0sKIAorY29uZmlnIEJMS19ERVZfQlNHCisJYm9vbCAiQmxvY2sgbGF5ZXIgU0cgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChTQ1NJPXkpICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlTYXlpbmcgWSBoZXJlIHdpbGwgZW5hYmxlIGdlbmVyaWMgU0cgKFNDU0kgZ2VuZXJpYykgdjQKKwlzdXBwb3J0IGZvciBhbnkgYmxvY2sgZGV2aWNlLgorCiBzb3VyY2UgYmxvY2svS2NvbmZpZy5pb3NjaGVkCmRpZmYgLS1naXQgYS9ibG9jay9NYWtlZmlsZSBiL2Jsb2NrL01ha2VmaWxlCmluZGV4IDRiODRkMGQuLjk1OWZlZWIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL01ha2VmaWxlCisrKyBiL2Jsb2NrL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfQkxPQ0spIDo9IGVsZXZhdG9yLm8gbGxfcndfYmxrLm8gaW9jdGwubyBnZW5oZC5vIHNjc2lfaW9jdGwubwogCitvYmotJChDT05GSUdfQkxLX0RFVl9CU0cpCSs9IGJzZy5vCiBvYmotJChDT05GSUdfSU9TQ0hFRF9OT09QKQkrPSBub29wLWlvc2NoZWQubwogb2JqLSQoQ09ORklHX0lPU0NIRURfQVMpCSs9IGFzLWlvc2NoZWQubwogb2JqLSQoQ09ORklHX0lPU0NIRURfREVBRExJTkUpCSs9IGRlYWRsaW5lLWlvc2NoZWQubwpkaWZmIC0tZ2l0IGEvYmxvY2svYXMtaW9zY2hlZC5jIGIvYmxvY2svYXMtaW9zY2hlZC5jCmluZGV4IDEwOWU5MWIuLjNlMzE2ZGQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2FzLWlvc2NoZWQuYworKysgYi9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTEzMjIsMTAgKzEzMjIsOSBAQAogewogCXN0cnVjdCBhc19kYXRhICphZDsKIAotCWFkID0ga21hbGxvY19ub2RlKHNpemVvZigqYWQpLCBHRlBfS0VSTkVMLCBxLT5ub2RlKTsKKwlhZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmFkKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICghYWQpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChhZCwgMCwgc2l6ZW9mKCphZCkpOwogCiAJYWQtPnEgPSBxOyAvKiBJZGVudGlmeSB3aGF0IHF1ZXVlIHRoZSBkYXRhIGJlbG9uZ3MgdG8gKi8KIApkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY5MzNmCi0tLSAvZGV2L251bGwKKysrIGIvYmxvY2svYnNnLmMKQEAgLTAsMCArMSwxMTE0IEBACisvKgorICogYnNnLmMgLSBibG9jayBsYXllciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2cgdjMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplbnMgQXhib2UgPGF4Ym9lQHN1c2UuZGU+IFNVU0UgTGFicworICogQ29weXJpZ2h0IChDKSAyMDA0IFBldGVyIE0uIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIHZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAqICBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisvKgorICogVE9ETworICoJLSBTaG91bGQgdGhpcyBnZXQgbWVyZ2VkLCBibG9jay9zY3NpX2lvY3RsLmMgd2lsbCBiZSBtaWdyYXRlZCBpbnRvCisgKgkgIHRoaXMgZmlsZS4gVG8ga2VlcCBtYWludGVuYW5jZSBkb3duLCBpdCdzIGVhc2llciB0byBoYXZlIHRoZW0KKyAqCSAgc2VwZXJhdGVkIHJpZ2h0IG5vdy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvYnNnLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZHJpdmVyLmg+CisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCitzdGF0aWMgY2hhciBic2dfdmVyc2lvbltdID0gImJsb2NrIGxheWVyIHNnIChic2cpIDAuNCI7CisKK3N0cnVjdCBic2dfZGV2aWNlIHsKKwlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c3lfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRvbmVfbGlzdDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZXZfbGlzdDsKKwlhdG9taWNfdCByZWZfY291bnQ7CisJaW50IG1pbm9yOworCWludCBxdWV1ZWRfY21kczsKKwlpbnQgZG9uZV9jbWRzOworCXdhaXRfcXVldWVfaGVhZF90IHdxX2RvbmU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfZnJlZTsKKwljaGFyIG5hbWVbQlVTX0lEX1NJWkVdOworCWludCBtYXhfcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK307CisKK2VudW0geworCUJTR19GX0JMT0NLCQk9IDEsCisJQlNHX0ZfV1JJVEVfUEVSTQk9IDIsCit9OworCisjZGVmaW5lIEJTR19ERUZBVUxUX0NNRFMJNjQKKyNkZWZpbmUgQlNHX01BWF9ERVZTCQkzMjc2OAorCisjdW5kZWYgQlNHX0RFQlVHCisKKyNpZmRlZiBCU0dfREVCVUcKKyNkZWZpbmUgZHByaW50ayhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgbGlzdF9lbnRyeV9iYyhlbnRyeSkJbGlzdF9lbnRyeSgoZW50cnkpLCBzdHJ1Y3QgYnNnX2NvbW1hbmQsIGxpc3QpCisKKy8qCisgKiBqdXN0IGZvciB0ZXN0aW5nCisgKi8KKyNkZWZpbmUgQlNHX01BSk9SCSgyNDApCisKK3N0YXRpYyBERUZJTkVfTVVURVgoYnNnX211dGV4KTsKK3N0YXRpYyBpbnQgYnNnX2RldmljZV9uciwgYnNnX21pbm9yX2lkeDsKKworI2RlZmluZSBCU0dfTElTVF9TSVpFCSg4KQorI2RlZmluZSBic2dfbGlzdF9pZHgobWlub3IpCSgobWlub3IpICYgKEJTR19MSVNUX1NJWkUgLSAxKSkKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBic2dfZGV2aWNlX2xpc3RbQlNHX0xJU1RfU0laRV07CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmJzZ19jbGFzczsKK3N0YXRpYyBMSVNUX0hFQUQoYnNnX2NsYXNzX2xpc3QpOworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJzZ19jbWRfY2FjaGVwOworCisvKgorICogb3VyIGludGVybmFsIGNvbW1hbmQgdHlwZQorICovCitzdHJ1Y3QgYnNnX2NvbW1hbmQgeworCXN0cnVjdCBic2dfZGV2aWNlICpiZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3QgYmlvICpiaWRpX2JpbzsKKwlpbnQgZXJyOworCXN0cnVjdCBzZ19pb192NCBoZHI7CisJc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqdWhkcjsKKwljaGFyIHNlbnNlW1NDU0lfU0VOU0VfQlVGRkVSU0laRV07Cit9OworCitzdGF0aWMgdm9pZCBic2dfZnJlZV9jb21tYW5kKHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gYmMtPmJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYnNnX2NtZF9jYWNoZXAsIGJjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZC0+bG9jaywgZmxhZ3MpOworCWJkLT5xdWV1ZWRfY21kcy0tOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJkLT5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZiZC0+d3FfZnJlZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJzZ19hbGxvY19jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjID0gRVJSX1BUUigtRUlOVkFMKTsKKworCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKworCWlmIChiZC0+cXVldWVkX2NtZHMgPj0gYmQtPm1heF9xdWV1ZSkKKwkJZ290byBvdXQ7CisKKwliZC0+cXVldWVkX2NtZHMrKzsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKworCWJjID0ga21lbV9jYWNoZV9hbGxvYyhic2dfY21kX2NhY2hlcCwgR0ZQX1VTRVIpOworCWlmICh1bmxpa2VseSghYmMpKSB7CisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJYmQtPnF1ZXVlZF9jbWRzLS07CisJCWJjID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KGJjLCAwLCBzaXplb2YoKmJjKSk7CisJYmMtPmJkID0gYmQ7CisJSU5JVF9MSVNUX0hFQUQoJmJjLT5saXN0KTsKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nIGZyZWUgY21kICVwXG4iLCBiZC0+bmFtZSwgYmMpOworCXJldHVybiBiYzsKK291dDoKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlyZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYnNnX2RlbF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJYmQtPmRvbmVfY21kcy0tOworCWxpc3RfZGVsKCZiYy0+bGlzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYnNnX2FkZF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBic2dfY29tbWFuZCAqYmMpCit7CisJYmQtPmRvbmVfY21kcysrOworCWxpc3RfYWRkX3RhaWwoJmJjLT5saXN0LCAmYmQtPmRvbmVfbGlzdCk7CisJd2FrZV91cCgmYmQtPndxX2RvbmUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBic2dfaW9fc2NoZWR1bGUoc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBpbnQgc3RhdGUpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlCVUdfT04oYmQtPmRvbmVfY21kcyA+IGJkLT5xdWV1ZWRfY21kcyk7CisKKwkvKgorCSAqIC1FTk9TUEMgb3IgLUVOT0RBVEE/ICBJJ20gZ29pbmcgZm9yIC1FTk9EQVRBLCBtZWFuaW5nICJJIGhhdmUgbm8KKwkgKiB3b3JrIHRvIGRvIiwgZXZlbiB0aG91Z2ggd2UgcmV0dXJuIC1FTk9TUEMgYWZ0ZXIgdGhpcyBzYW1lIHRlc3QKKwkgKiBkdXJpbmcgYnNnX3dyaXRlKCkgLS0gdGhlcmUsIGl0IG1lYW5zIG91ciBidWZmZXIgY2FuJ3QgaGF2ZSBtb3JlCisJICogYnNnX2NvbW1hbmRzIGFkZGVkIHRvIGl0LCB0aHVzIGhhcyBubyBzcGFjZSBsZWZ0LgorCSAqLworCWlmIChiZC0+ZG9uZV9jbWRzID09IGJkLT5xdWV1ZWRfY21kcykgeworCQlyZXQgPSAtRU5PREFUQTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKCF0ZXN0X2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncykpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byB1bmxvY2s7CisJfQorCisJcHJlcGFyZV90b193YWl0KCZiZC0+d3FfZG9uZSwgJndhaXQsIHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwlpb19zY2hlZHVsZSgpOworCWZpbmlzaF93YWl0KCZiZC0+d3FfZG9uZSwgJndhaXQpOworCisJaWYgKChzdGF0ZSA9PSBUQVNLX0lOVEVSUlVQVElCTEUpICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisKKwlyZXR1cm4gcmV0OwordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmxrX2ZpbGxfc2d2NF9oZHJfcnEocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkJc3RydWN0IHNnX2lvX3Y0ICpoZHIsIGludCBoYXNfd3JpdGVfcGVybSkKK3sKKwltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKHJxLT5jbWQsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaGRyLT5yZXF1ZXN0LAorCQkJICAgaGRyLT5yZXF1ZXN0X2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGhkci0+c3VicHJvdG9jb2wgPT0gQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX0NNRCkgeworCQlpZiAoYmxrX3ZlcmlmeV9jb21tYW5kKHJxLT5jbWQsIGhhc193cml0ZV9wZXJtKSkKKwkJCXJldHVybiAtRVBFUk07CisJfSBlbHNlIGlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogZmlsbCBpbiByZXF1ZXN0IHN0cnVjdHVyZQorCSAqLworCXJxLT5jbWRfbGVuID0gaGRyLT5yZXF1ZXN0X2xlbjsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCXJxLT50aW1lb3V0ID0gKGhkci0+dGltZW91dCAqIEhaKSAvIDEwMDA7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgc2dfaW9fdjQgZnJvbSB1c2VyIGlzIGFsbG93ZWQgYW5kIHZhbGlkCisgKi8KK3N0YXRpYyBpbnQKK2JzZ192YWxpZGF0ZV9zZ3Y0X2hkcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBzZ19pb192NCAqaGRyLCBpbnQgKnJ3KQoreworCWludCByZXQgPSAwOworCisJaWYgKGhkci0+Z3VhcmQgIT0gJ1EnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaGRyLT5yZXF1ZXN0X2xlbiA+IEJMS19NQVhfQ0RCKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaGRyLT5kb3V0X3hmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpIHx8CisJICAgIGhkci0+ZGluX3hmZXJfbGVuID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQorCQlyZXR1cm4gLUVJTzsKKworCXN3aXRjaCAoaGRyLT5wcm90b2NvbCkgeworCWNhc2UgQlNHX1BST1RPQ09MX1NDU0k6CisJCXN3aXRjaCAoaGRyLT5zdWJwcm90b2NvbCkgeworCQljYXNlIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9DTUQ6CisJCWNhc2UgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RSQU5TUE9SVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCSpydyA9IGhkci0+ZG91dF94ZmVyX2xlbiA/IFdSSVRFIDogUkVBRDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbWFwIHNnX2lvX3Y0IHRvIGEgcmVxdWVzdC4KKyAqLworc3RhdGljIHN0cnVjdCByZXF1ZXN0ICoKK2JzZ19tYXBfaGRyKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgc3RydWN0IHNnX2lvX3Y0ICpoZHIpCit7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gYmQtPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpycSwgKm5leHRfcnEgPSBOVUxMOworCWludCByZXQsIHJ3ID0gMDsgLyogc2h1dCB1cCBnY2MgKi8KKwl1bnNpZ25lZCBpbnQgZHhmZXJfbGVuOworCXZvaWQgKmR4ZmVycCA9IE5VTEw7CisKKwlkcHJpbnRrKCJtYXAgaGRyICVsbHgvJXUgJWxseC8ldVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgaGRyLT5kb3V0X3hmZXJwLAorCQloZHItPmRvdXRfeGZlcl9sZW4sICh1bnNpZ25lZCBsb25nIGxvbmcpIGhkci0+ZGluX3hmZXJwLAorCQloZHItPmRpbl94ZmVyX2xlbik7CisKKwlyZXQgPSBic2dfdmFsaWRhdGVfc2d2NF9oZHIocSwgaGRyLCAmcncpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwkvKgorCSAqIG1hcCBzY2F0dGVyLWdhdGhlciBlbGVtZW50cyBzZXBlcmF0ZWx5IGFuZCBzdHJpbmcgdGhlbSB0byByZXF1ZXN0CisJICovCisJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgcncsIEdGUF9LRVJORUwpOworCWlmICghcnEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJldCA9IGJsa19maWxsX3NndjRfaGRyX3JxKHEsIHJxLCBoZHIsIHRlc3RfYml0KEJTR19GX1dSSVRFX1BFUk0sCisJCQkJCQkgICAgICAgJmJkLT5mbGFncykpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHJ3ID09IFdSSVRFICYmIGhkci0+ZGluX3hmZXJfbGVuKSB7CisJCWlmICghdGVzdF9iaXQoUVVFVUVfRkxBR19CSURJLCAmcS0+cXVldWVfZmxhZ3MpKSB7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbmV4dF9ycSA9IGJsa19nZXRfcmVxdWVzdChxLCBSRUFELCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXh0X3JxKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnEtPm5leHRfcnEgPSBuZXh0X3JxOworCisJCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwkJcmV0ID0gIGJsa19ycV9tYXBfdXNlcihxLCBuZXh0X3JxLCBkeGZlcnAsIGhkci0+ZGluX3hmZXJfbGVuKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChoZHItPmRvdXRfeGZlcl9sZW4pIHsKKwkJZHhmZXJfbGVuID0gaGRyLT5kb3V0X3hmZXJfbGVuOworCQlkeGZlcnAgPSAodm9pZCopKHVuc2lnbmVkIGxvbmcpaGRyLT5kb3V0X3hmZXJwOworCX0gZWxzZSBpZiAoaGRyLT5kaW5feGZlcl9sZW4pIHsKKwkJZHhmZXJfbGVuID0gaGRyLT5kaW5feGZlcl9sZW47CisJCWR4ZmVycCA9ICh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPmRpbl94ZmVycDsKKwl9IGVsc2UKKwkJZHhmZXJfbGVuID0gMDsKKworCWlmIChkeGZlcl9sZW4pIHsKKwkJcmV0ID0gYmxrX3JxX21hcF91c2VyKHEsIHJxLCBkeGZlcnAsIGR4ZmVyX2xlbik7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJcmV0dXJuIHJxOworb3V0OgorCWJsa19wdXRfcmVxdWVzdChycSk7CisJaWYgKG5leHRfcnEpIHsKKwkJYmxrX3JxX3VubWFwX3VzZXIobmV4dF9ycS0+YmlvKTsKKwkJYmxrX3B1dF9yZXF1ZXN0KG5leHRfcnEpOworCX0KKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCisvKgorICogYXN5bmMgY29tcGxldGlvbiBjYWxsLWJhY2sgZnJvbSB0aGUgYmxvY2sgbGF5ZXIsIHdoZW4gc2NzaS9pZGUvd2hhdGV2ZXIKKyAqIGNhbGxzIGVuZF90aGF0X3JlcXVlc3RfbGFzdCgpIG9uIGEgcmVxdWVzdAorICovCitzdGF0aWMgdm9pZCBic2dfcnFfZW5kX2lvKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKQoreworCXN0cnVjdCBic2dfY29tbWFuZCAqYmMgPSBycS0+ZW5kX2lvX2RhdGE7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gYmMtPmJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCIlczogZmluaXNoZWQgcnEgJXAgYmMgJXAsIGJpbyAlcCBzdGF0ICVkXG4iLAorCQliZC0+bmFtZSwgcnEsIGJjLCBiYy0+YmlvLCB1cHRvZGF0ZSk7CisKKwliYy0+aGRyLmR1cmF0aW9uID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gYmMtPmhkci5kdXJhdGlvbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmYmMtPmxpc3QpOworCWJzZ19hZGRfZG9uZV9jbWQoYmQsIGJjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogZG8gZmluYWwgc2V0dXAgb2YgYSAnYmMnIGFuZCBzdWJtaXQgdGhlIG1hdGNoaW5nICdycScgdG8gdGhlIGJsb2NrCisgKiBsYXllciBmb3IgaW8KKyAqLworc3RhdGljIHZvaWQgYnNnX2FkZF9jb21tYW5kKHN0cnVjdCBic2dfZGV2aWNlICpiZCwgcmVxdWVzdF9xdWV1ZV90ICpxLAorCQkJICAgIHN0cnVjdCBic2dfY29tbWFuZCAqYmMsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlycS0+c2Vuc2UgPSBiYy0+c2Vuc2U7CisJcnEtPnNlbnNlX2xlbiA9IDA7CisKKwkvKgorCSAqIGFkZCBiYyBjb21tYW5kIHRvIGJ1c3kgcXVldWUgYW5kIHN1Ym1pdCBycSBmb3IgaW8KKwkgKi8KKwliYy0+cnEgPSBycTsKKwliYy0+YmlvID0gcnEtPmJpbzsKKwlpZiAocnEtPm5leHRfcnEpCisJCWJjLT5iaWRpX2JpbyA9IHJxLT5uZXh0X3JxLT5iaW87CisJYmMtPmhkci5kdXJhdGlvbiA9IGppZmZpZXM7CisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWxpc3RfYWRkX3RhaWwoJmJjLT5saXN0LCAmYmQtPmJ1c3lfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlkcHJpbnRrKCIlczogcXVldWVpbmcgcnEgJXAsIGJjICVwXG4iLCBiZC0+bmFtZSwgcnEsIGJjKTsKKworCXJxLT5lbmRfaW9fZGF0YSA9IGJjOworCWJsa19leGVjdXRlX3JxX25vd2FpdChxLCBOVUxMLCBycSwgMSwgYnNnX3JxX2VuZF9pbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJzZ19jb21tYW5kICpic2dfbmV4dF9kb25lX2NtZChzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYyA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxKCZiZC0+bG9jayk7CisJaWYgKGJkLT5kb25lX2NtZHMpIHsKKwkJYmMgPSBsaXN0X2VudHJ5X2JjKGJkLT5kb25lX2xpc3QubmV4dCk7CisJCWJzZ19kZWxfZG9uZV9jbWQoYmQsIGJjKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwlyZXR1cm4gYmM7Cit9CisKKy8qCisgKiBHZXQgYSBmaW5pc2hlZCBjb21tYW5kIGZyb20gdGhlIGRvbmUgbGlzdAorICovCitzdGF0aWMgc3RydWN0IGJzZ19jb21tYW5kICpic2dfZ2V0X2RvbmVfY21kKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjOworCWludCByZXQ7CisKKwlkbyB7CisJCWJjID0gYnNnX25leHRfZG9uZV9jbWQoYmQpOworCQlpZiAoYmMpCisJCQlicmVhazsKKworCQlpZiAoIXRlc3RfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKSkgeworCQkJYmMgPSBFUlJfUFRSKC1FQUdBSU4pOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmQtPndxX2RvbmUsIGJkLT5kb25lX2NtZHMpOworCQlpZiAocmV0KSB7CisJCQliYyA9IEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlkcHJpbnRrKCIlczogcmV0dXJuaW5nIGRvbmUgJXBcbiIsIGJkLT5uYW1lLCBiYyk7CisKKwlyZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBpbnQgYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX3Y0ICpoZHIsCisJCQkJICAgIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlkaV9iaW8pCit7CisJaW50IHJldCA9IDA7CisKKwlkcHJpbnRrKCJycSAlcCBiaW8gJXAgJXVcbiIsIHJxLCBiaW8sIHJxLT5lcnJvcnMpOworCS8qCisJICogZmlsbCBpbiBhbGwgdGhlIG91dHB1dCBtZW1iZXJzCisJICovCisJaGRyLT5kZXZpY2Vfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT50cmFuc3BvcnRfc3RhdHVzID0gaG9zdF9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+ZHJpdmVyX3N0YXR1cyA9IGRyaXZlcl9ieXRlKHJxLT5lcnJvcnMpOworCWhkci0+aW5mbyA9IDA7CisJaWYgKGhkci0+ZGV2aWNlX3N0YXR1cyB8fCBoZHItPnRyYW5zcG9ydF9zdGF0dXMgfHwgaGRyLT5kcml2ZXJfc3RhdHVzKQorCQloZHItPmluZm8gfD0gU0dfSU5GT19DSEVDSzsKKwloZHItPmRpbl9yZXNpZCA9IHJxLT5kYXRhX2xlbjsKKwloZHItPnJlc3BvbnNlX2xlbiA9IDA7CisKKwlpZiAocnEtPnNlbnNlX2xlbiAmJiBoZHItPnJlc3BvbnNlKSB7CisJCWludCBsZW4gPSBtaW4oKHVuc2lnbmVkIGludCkgaGRyLT5tYXhfcmVzcG9uc2VfbGVuLAorCQkJICAgICAgcnEtPnNlbnNlX2xlbik7CisKKwkJcmV0ID0gY29weV90b191c2VyKCh2b2lkKikodW5zaWduZWQgbG9uZyloZHItPnJlc3BvbnNlLAorCQkJCSAgIHJxLT5zZW5zZSwgbGVuKTsKKwkJaWYgKCFyZXQpCisJCQloZHItPnJlc3BvbnNlX2xlbiA9IGxlbjsKKwkJZWxzZQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlpZiAocnEtPm5leHRfcnEpIHsKKwkJYmxrX3JxX3VubWFwX3VzZXIoYmlkaV9iaW8pOworCQlibGtfcHV0X3JlcXVlc3QocnEtPm5leHRfcnEpOworCX0KKworCWJsa19ycV91bm1hcF91c2VyKGJpbyk7CisJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnNnX2NvbXBsZXRlX2FsbF9jb21tYW5kcyhzdHJ1Y3QgYnNnX2RldmljZSAqYmQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlpbnQgcmV0LCB0cmV0OworCisJZHByaW50aygiJXM6IGVudGVyZWRcbiIsIGJkLT5uYW1lKTsKKworCXNldF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCisJLyoKKwkgKiB3YWl0IGZvciBhbGwgY29tbWFuZHMgdG8gY29tcGxldGUKKwkgKi8KKwlyZXQgPSAwOworCWRvIHsKKwkJcmV0ID0gYnNnX2lvX3NjaGVkdWxlKGJkLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCS8qCisJCSAqIGxvb2sgZm9yIC1FTk9EQVRBIHNwZWNpZmljYWxseSAtLSB3ZSdsbCBzb21ldGltZXMgZ2V0CisJCSAqIC1FUkVTVEFSVFNZUyB3aGVuIHdlJ3ZlIHRha2VuIGEgc2lnbmFsLCBidXQgd2UgY2FuJ3QKKwkJICogcmV0dXJuIHVudGlsIHdlJ3JlIGRvbmUgZnJlZWluZyB0aGUgcXVldWUsIHNvIGlnbm9yZQorCQkgKiBpdC4gIFRoZSBzaWduYWwgd2lsbCBnZXQgaGFuZGxlZCB3aGVuIHdlJ3JlIGRvbmUgZnJlZWluZworCQkgKiB0aGUgYnNnX2RldmljZS4KKwkJICovCisJfSB3aGlsZSAocmV0ICE9IC1FTk9EQVRBKTsKKworCS8qCisJICogZGlzY2FyZCBkb25lIGNvbW1hbmRzCisJICovCisJcmV0ID0gMDsKKwlkbyB7CisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJaWYgKCFiZC0+cXVldWVkX2NtZHMpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmYmQtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZiZC0+bG9jayk7CisKKwkJYmMgPSBic2dfZ2V0X2RvbmVfY21kKGJkKTsKKwkJaWYgKElTX0VSUihiYykpCisJCQlicmVhazsKKworCQl0cmV0ID0gYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKGJjLT5ycSwgJmJjLT5oZHIsIGJjLT5iaW8sCisJCQkJCQliYy0+YmlkaV9iaW8pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyZXQ7CisKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorX19ic2dfcmVhZChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHN0cnVjdCBic2dfZGV2aWNlICpiZCwKKwkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgc3NpemVfdCAqYnl0ZXNfcmVhZCkKK3sKKwlzdHJ1Y3QgYnNnX2NvbW1hbmQgKmJjOworCWludCBucl9jb21tYW5kcywgcmV0OworCisJaWYgKGNvdW50ICUgc2l6ZW9mKHN0cnVjdCBzZ19pb192NCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gMDsKKwlucl9jb21tYW5kcyA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJd2hpbGUgKG5yX2NvbW1hbmRzKSB7CisJCWJjID0gYnNnX2dldF9kb25lX2NtZChiZCk7CisJCWlmIChJU19FUlIoYmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogdGhpcyBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gY29weSBkYXRhIGJhY2sKKwkJICogYWZ0ZXIgY29tcGxldGluZyB0aGUgcmVxdWVzdC4gc28gZG8gdGhhdCBoZXJlLAorCQkgKiBic2dfY29tcGxldGVfd29yaygpIGNhbm5vdCBkbyB0aGF0IGZvciB1cworCQkgKi8KKwkJcmV0ID0gYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKGJjLT5ycSwgJmJjLT5oZHIsIGJjLT5iaW8sCisJCQkJCSAgICAgICBiYy0+YmlkaV9iaW8pOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoY2hhciAqKSAmYmMtPmhkciwgc2l6ZW9mKGJjLT5oZHIpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisKKwkJYnNnX2ZyZWVfY29tbWFuZChiYyk7CisKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KTsKKwkJKmJ5dGVzX3JlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJCW5yX2NvbW1hbmRzLS07CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzZ19zZXRfYmxvY2soc3RydWN0IGJzZ19kZXZpY2UgKmJkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWNsZWFyX2JpdChCU0dfRl9CTE9DSywgJmJkLT5mbGFncyk7CisJZWxzZQorCQlzZXRfYml0KEJTR19GX0JMT0NLLCAmYmQtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzZ19zZXRfd3JpdGVfcGVybShzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJc2V0X2JpdChCU0dfRl9XUklURV9QRVJNLCAmYmQtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChCU0dfRl9XUklURV9QRVJNLCAmYmQtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXJyX2Jsb2NrX2VycihpbnQgcmV0KQoreworCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9TUEMgJiYgcmV0ICE9IC1FTk9EQVRBICYmIHJldCAhPSAtRUFHQUlOKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYnNnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXNzaXplX3QgYnl0ZXNfcmVhZDsKKworCWRwcmludGsoIiVzOiByZWFkICVaZCBieXRlc1xuIiwgYmQtPm5hbWUsIGNvdW50KTsKKworCWJzZ19zZXRfYmxvY2soYmQsIGZpbGUpOworCWJ5dGVzX3JlYWQgPSAwOworCXJldCA9IF9fYnNnX3JlYWQoYnVmLCBjb3VudCwgYmQsIE5VTEwsICZieXRlc19yZWFkKTsKKwkqcHBvcyA9IGJ5dGVzX3JlYWQ7CisKKwlpZiAoIWJ5dGVzX3JlYWQgfHwgKGJ5dGVzX3JlYWQgJiYgZXJyX2Jsb2NrX2VycihyZXQpKSkKKwkJYnl0ZXNfcmVhZCA9IHJldDsKKworCXJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgc3NpemVfdCBfX2JzZ193cml0ZShzdHJ1Y3QgYnNnX2RldmljZSAqYmQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICBzaXplX3QgY291bnQsIHNzaXplX3QgKmJ5dGVzX3JlYWQpCit7CisJc3RydWN0IGJzZ19jb21tYW5kICpiYzsKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHJldCwgbnJfY29tbWFuZHM7CisKKwlpZiAoY291bnQgJSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlucl9jb21tYW5kcyA9IGNvdW50IC8gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJcnEgPSBOVUxMOworCWJjID0gTlVMTDsKKwlyZXQgPSAwOworCXdoaWxlIChucl9jb21tYW5kcykgeworCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZC0+cXVldWU7CisKKwkJYmMgPSBic2dfYWxsb2NfY29tbWFuZChiZCk7CisJCWlmIChJU19FUlIoYmMpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGJjKTsKKwkJCWJjID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJYmMtPnVoZHIgPSAoc3RydWN0IHNnX2lvX3Y0IF9fdXNlciAqKSBidWY7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmMtPmhkciwgYnVmLCBzaXplb2YoYmMtPmhkcikpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBnZXQgYSByZXF1ZXN0LCBmaWxsIGluIHRoZSBibGFua3MsIGFuZCBhZGQgdG8gcmVxdWVzdCBxdWV1ZQorCQkgKi8KKwkJcnEgPSBic2dfbWFwX2hkcihiZCwgJmJjLT5oZHIpOworCQlpZiAoSVNfRVJSKHJxKSkgeworCQkJcmV0ID0gUFRSX0VSUihycSk7CisJCQlycSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWJzZ19hZGRfY29tbWFuZChiZCwgcSwgYmMsIHJxKTsKKwkJYmMgPSBOVUxMOworCQlycSA9IE5VTEw7CisJCW5yX2NvbW1hbmRzLS07CisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNnX2lvX3Y0KTsKKwkJKmJ5dGVzX3JlYWQgKz0gc2l6ZW9mKHN0cnVjdCBzZ19pb192NCk7CisJfQorCisJaWYgKGJjKQorCQlic2dfZnJlZV9jb21tYW5kKGJjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citic2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IGJ5dGVzX3JlYWQ7CisJaW50IHJldDsKKworCWRwcmludGsoIiVzOiB3cml0ZSAlWmQgYnl0ZXNcbiIsIGJkLT5uYW1lLCBjb3VudCk7CisKKwlic2dfc2V0X2Jsb2NrKGJkLCBmaWxlKTsKKwlic2dfc2V0X3dyaXRlX3Blcm0oYmQsIGZpbGUpOworCisJYnl0ZXNfcmVhZCA9IDA7CisJcmV0ID0gX19ic2dfd3JpdGUoYmQsIGJ1ZiwgY291bnQsICZieXRlc19yZWFkKTsKKwkqcHBvcyA9IGJ5dGVzX3JlYWQ7CisKKwkvKgorCSAqIHJldHVybiBieXRlcyB3cml0dGVuIG9uIG5vbi1mYXRhbCBlcnJvcnMKKwkgKi8KKwlpZiAoIWJ5dGVzX3JlYWQgfHwgKGJ5dGVzX3JlYWQgJiYgZXJyX2Jsb2NrX2VycihyZXQpKSkKKwkJYnl0ZXNfcmVhZCA9IHJldDsKKworCWRwcmludGsoIiVzOiByZXR1cm5pbmcgJVpkXG4iLCBiZC0+bmFtZSwgYnl0ZXNfcmVhZCk7CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqYnNnX2FsbG9jX2RldmljZSh2b2lkKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZDsKKworCWJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJzZ19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWJkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmYmQtPmxvY2spOworCisJYmQtPm1heF9xdWV1ZSA9IEJTR19ERUZBVUxUX0NNRFM7CisKKwlJTklUX0xJU1RfSEVBRCgmYmQtPmJ1c3lfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJkLT5kb25lX2xpc3QpOworCUlOSVRfSExJU1RfTk9ERSgmYmQtPmRldl9saXN0KTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJkLT53cV9mcmVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZiZC0+d3FfZG9uZSk7CisJcmV0dXJuIGJkOworfQorCitzdGF0aWMgaW50IGJzZ19wdXRfZGV2aWNlKHN0cnVjdCBic2dfZGV2aWNlICpiZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmJkLT5yZWZfY291bnQpKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoIiVzOiB0ZWFyaW5nIGRvd25cbiIsIGJkLT5uYW1lKTsKKworCS8qCisJICogY2xvc2UgY2FuIGFsd2F5cyBibG9jaworCSAqLworCXNldF9iaXQoQlNHX0ZfQkxPQ0ssICZiZC0+ZmxhZ3MpOworCisJLyoKKwkgKiBjb3JyZWN0IGVycm9yIGRldGVjdGlvbiBiYWRkaWVzIGhlcmUgYWdhaW4uIGl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5CisJICogb2YgdGhlIGFwcCB0byBwcm9wZXJseSByZWFwIGNvbW1hbmRzIGJlZm9yZSBjbG9zZSgpIGlmIGl0IHdhbnRzCisJICogZm9vbC1wcm9vZiBlcnJvciBkZXRlY3Rpb24KKwkgKi8KKwlyZXQgPSBic2dfY29tcGxldGVfYWxsX2NvbW1hbmRzKGJkKTsKKworCWJsa19wdXRfcXVldWUoYmQtPnF1ZXVlKTsKKwlobGlzdF9kZWwoJmJkLT5kZXZfbGlzdCk7CisJa2ZyZWUoYmQpOworb3V0OgorCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGJzZ19kZXZpY2UgKmJzZ19hZGRfZGV2aWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBOVUxMOworI2lmZGVmIEJTR19ERUJVRworCXVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKKyNlbmRpZgorCisJYmQgPSBic2dfYWxsb2NfZGV2aWNlKCk7CisJaWYgKCFiZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwliZC0+cXVldWUgPSBycTsKKwlrb2JqZWN0X2dldCgmcnEtPmtvYmopOworCWJzZ19zZXRfYmxvY2soYmQsIGZpbGUpOworCisJYXRvbWljX3NldCgmYmQtPnJlZl9jb3VudCwgMSk7CisJYmQtPm1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwltdXRleF9sb2NrKCZic2dfbXV0ZXgpOworCWhsaXN0X2FkZF9oZWFkKCZiZC0+ZGV2X2xpc3QsICZic2dfZGV2aWNlX2xpc3RbYnNnX2xpc3RfaWR4KGJkLT5taW5vcildKTsKKworCXN0cm5jcHkoYmQtPm5hbWUsIHJxLT5ic2dfZGV2LmNsYXNzX2Rldi0+Y2xhc3NfaWQsIHNpemVvZihiZC0+bmFtZSkgLSAxKTsKKwlkcHJpbnRrKCJib3VuZCB0byA8JXM+LCBtYXggcXVldWUgJWRcbiIsCisJCWZvcm1hdF9kZXZfdChidWYsIGlub2RlLT5pX3JkZXYpLCBiZC0+bWF4X3F1ZXVlKTsKKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gYmQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNnX2RldmljZSAqX19ic2dfZ2V0X2RldmljZShpbnQgbWlub3IpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3QgPSAmYnNnX2RldmljZV9saXN0W2JzZ19saXN0X2lkeChtaW5vcildOworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IE5VTEw7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKworCWhsaXN0X2Zvcl9lYWNoKGVudHJ5LCBsaXN0KSB7CisJCWJkID0gaGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBic2dfZGV2aWNlLCBkZXZfbGlzdCk7CisJCWlmIChiZC0+bWlub3IgPT0gbWlub3IpIHsKKwkJCWF0b21pY19pbmMoJmJkLT5yZWZfY291bnQpOworCQkJYnJlYWs7CisJCX0KKworCQliZCA9IE5VTEw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZic2dfbXV0ZXgpOworCXJldHVybiBiZDsKK30KKworc3RhdGljIHN0cnVjdCBic2dfZGV2aWNlICpic2dfZ2V0X2RldmljZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBfX2JzZ19nZXRfZGV2aWNlKGltaW5vcihpbm9kZSkpOworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QsICpfX2JjZDsKKworCWlmIChiZCkKKwkJcmV0dXJuIGJkOworCisJLyoKKwkgKiBmaW5kIHRoZSBjbGFzcyBkZXZpY2UKKwkgKi8KKwliY2QgPSBOVUxMOworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShfX2JjZCwgJmJzZ19jbGFzc19saXN0LCBsaXN0KSB7CisJCWlmIChfX2JjZC0+bWlub3IgPT0gaW1pbm9yKGlub2RlKSkgeworCQkJYmNkID0gX19iY2Q7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7CisKKwlpZiAoIWJjZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlyZXR1cm4gYnNnX2FkZF9kZXZpY2UoaW5vZGUsIGJjZC0+cXVldWUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGJzZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBic2dfZGV2aWNlICpiZCA9IGJzZ19nZXRfZGV2aWNlKGlub2RlLCBmaWxlKTsKKworCWlmIChJU19FUlIoYmQpKQorCQlyZXR1cm4gUFRSX0VSUihiZCk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBiZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBic2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiBic2dfcHV0X2RldmljZShiZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnNnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGJzZ19kZXZpY2UgKmJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmYmQtPndxX2RvbmUsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmYmQtPndxX2ZyZWUsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycSgmYmQtPmxvY2spOworCWlmICghbGlzdF9lbXB0eSgmYmQtPmRvbmVfbGlzdCkpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoYmQtPnF1ZXVlZF9jbWRzID49IGJkLT5tYXhfcXVldWUpCisJCW1hc2sgfD0gUE9MTE9VVDsKKwlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50Citic2dfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYnNnX2RldmljZSAqYmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IF9fdXNlciAqdWFyZyA9IChpbnQgX191c2VyICopIGFyZzsKKworCWlmICghYmQpCisJCXJldHVybiAtRU5YSU87CisKKwlzd2l0Y2ggKGNtZCkgeworCQkvKgorCQkgKiBvdXIgb3duIGlvY3RscworCQkgKi8KKwljYXNlIFNHX0dFVF9DT01NQU5EX1E6CisJCXJldHVybiBwdXRfdXNlcihiZC0+bWF4X3F1ZXVlLCB1YXJnKTsKKwljYXNlIFNHX1NFVF9DT01NQU5EX1E6IHsKKwkJaW50IHF1ZXVlOworCisJCWlmIChnZXRfdXNlcihxdWV1ZSwgdWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHF1ZXVlIDwgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJYmQtPm1heF9xdWV1ZSA9IHF1ZXVlOworCQlzcGluX3VubG9ja19pcnEoJmJkLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTQ1NJL3NnIGlvY3RscworCSAqLworCWNhc2UgU0dfR0VUX1ZFUlNJT05fTlVNOgorCWNhc2UgU0NTSV9JT0NUTF9HRVRfSURMVU46CisJY2FzZSBTQ1NJX0lPQ1RMX0dFVF9CVVNfTlVNQkVSOgorCWNhc2UgU0dfU0VUX1RJTUVPVVQ6CisJY2FzZSBTR19HRVRfVElNRU9VVDoKKwljYXNlIFNHX0dFVF9SRVNFUlZFRF9TSVpFOgorCWNhc2UgU0dfU0VUX1JFU0VSVkVEX1NJWkU6CisJY2FzZSBTR19FTVVMQVRFRF9IT1NUOgorCWNhc2UgU0NTSV9JT0NUTF9TRU5EX0NPTU1BTkQ6IHsKKwkJdm9pZCBfX3VzZXIgKnVhcmcgPSAodm9pZCBfX3VzZXIgKikgYXJnOworCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmQtPnF1ZXVlLCBOVUxMLCBjbWQsIHVhcmcpOworCX0KKwljYXNlIFNHX0lPOiB7CisJCXN0cnVjdCByZXF1ZXN0ICpycTsKKwkJc3RydWN0IGJpbyAqYmlvLCAqYmlkaV9iaW8gPSBOVUxMOworCQlzdHJ1Y3Qgc2dfaW9fdjQgaGRyOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCB1YXJnLCBzaXplb2YoaGRyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlycSA9IGJzZ19tYXBfaGRyKGJkLCAmaGRyKTsKKwkJaWYgKElTX0VSUihycSkpCisJCQlyZXR1cm4gUFRSX0VSUihycSk7CisKKwkJYmlvID0gcnEtPmJpbzsKKwkJaWYgKHJxLT5uZXh0X3JxKQorCQkJYmlkaV9iaW8gPSBycS0+bmV4dF9ycS0+YmlvOworCQlibGtfZXhlY3V0ZV9ycShiZC0+cXVldWUsIE5VTEwsIHJxLCAwKTsKKwkJYmxrX2NvbXBsZXRlX3NndjRfaGRyX3JxKHJxLCAmaGRyLCBiaW8sIGJpZGlfYmlvKTsKKworCQlpZiAoY29weV90b191c2VyKHVhcmcsICZoZHIsIHNpemVvZihoZHIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIGJsb2NrIGRldmljZSBpb2N0bHMKKwkgKi8KKwlkZWZhdWx0OgorI2lmIDAKKwkJcmV0dXJuIGlvY3RsX2J5X2JkZXYoYmQtPmJkZXYsIGNtZCwgYXJnKTsKKyNlbHNlCisJCXJldHVybiAtRU5PVFRZOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBic2dfZm9wcyA9IHsKKwkucmVhZAkJPQlic2dfcmVhZCwKKwkud3JpdGUJCT0JYnNnX3dyaXRlLAorCS5wb2xsCQk9CWJzZ19wb2xsLAorCS5vcGVuCQk9CWJzZ19vcGVuLAorCS5yZWxlYXNlCT0JYnNnX3JlbGVhc2UsCisJLmlvY3RsCQk9CWJzZ19pb2N0bCwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCit9OworCit2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCBic2dfY2xhc3NfZGV2aWNlICpiY2QgPSAmcS0+YnNnX2RldjsKKworCWlmICghYmNkLT5jbGFzc19kZXYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJzZ19tdXRleCk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnEtPmtvYmosICJic2ciKTsKKwljbGFzc19kZXZpY2VfZGVzdHJveShic2dfY2xhc3MsIE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcikpOworCWJjZC0+Y2xhc3NfZGV2ID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZiY2QtPmxpc3QpOworCWJzZ19kZXZpY2VfbnItLTsKKwltdXRleF91bmxvY2soJmJzZ19tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChic2dfdW5yZWdpc3Rlcl9xdWV1ZSk7CisKK2ludCBic2dfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGJzZ19jbGFzc19kZXZpY2UgKmJjZCwgKl9fYmNkOworCWRldl90IGRldjsKKwlpbnQgcmV0ID0gLUVNRklMRTsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSBOVUxMOworCisJLyoKKwkgKiB3ZSBuZWVkIGEgcHJvcGVyIHRyYW5zcG9ydCB0byBzZW5kIGNvbW1hbmRzLCBub3QgYSBzdGFja2VkIGRldmljZQorCSAqLworCWlmICghcS0+cmVxdWVzdF9mbikKKwkJcmV0dXJuIDA7CisKKwliY2QgPSAmcS0+YnNnX2RldjsKKwltZW1zZXQoYmNkLCAwLCBzaXplb2YoKmJjZCkpOworCUlOSVRfTElTVF9IRUFEKCZiY2QtPmxpc3QpOworCisJbXV0ZXhfbG9jaygmYnNnX211dGV4KTsKKwlpZiAoYnNnX2RldmljZV9uciA9PSBCU0dfTUFYX0RFVlMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IHRvbyBtYW55IGJzZyBkZXZpY2VzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCityZXRyeToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9fYmNkLCAmYnNnX2NsYXNzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKF9fYmNkLT5taW5vciA9PSBic2dfbWlub3JfaWR4KSB7CisJCQlic2dfbWlub3JfaWR4Kys7CisJCQlpZiAoYnNnX21pbm9yX2lkeCA9PSBCU0dfTUFYX0RFVlMpCisJCQkJYnNnX21pbm9yX2lkeCA9IDA7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJYmNkLT5taW5vciA9IGJzZ19taW5vcl9pZHgrKzsKKwlpZiAoYnNnX21pbm9yX2lkeCA9PSBCU0dfTUFYX0RFVlMpCisJCWJzZ19taW5vcl9pZHggPSAwOworCisJYmNkLT5xdWV1ZSA9IHE7CisJZGV2ID0gTUtERVYoQlNHX01BSk9SLCBiY2QtPm1pbm9yKTsKKwljbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGJzZ19jbGFzcywgTlVMTCwgZGV2LCBiY2QtPmRldiwgIiVzIiwgbmFtZSk7CisJaWYgKElTX0VSUihjbGFzc19kZXYpKSB7CisJCXJldCA9IFBUUl9FUlIoY2xhc3NfZGV2KTsKKwkJZ290byBlcnI7CisJfQorCWJjZC0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2OworCisJaWYgKHEtPmtvYmouc2QpIHsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJnEtPmtvYmosICZiY2QtPmNsYXNzX2Rldi0+a29iaiwgImJzZyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmYmNkLT5saXN0LCAmYnNnX2NsYXNzX2xpc3QpOworCWJzZ19kZXZpY2VfbnIrKzsKKworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gMDsKK2VycjoKKwlpZiAoY2xhc3NfZGV2KQorCQljbGFzc19kZXZpY2VfZGVzdHJveShic2dfY2xhc3MsIE1LREVWKEJTR19NQUpPUiwgYmNkLT5taW5vcikpOworCW11dGV4X3VubG9jaygmYnNnX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnNnX3JlZ2lzdGVyX3F1ZXVlKTsKKworc3RhdGljIGludCBic2dfYWRkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsX2Rldiwgc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xfaW50ZikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RwID0gdG9fc2NzaV9kZXZpY2UoY2xfZGV2LT5kZXYpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSA9IHNkcC0+cmVxdWVzdF9xdWV1ZTsKKworCWlmIChycS0+a29iai5wYXJlbnQpCisJCXJldCA9IGJzZ19yZWdpc3Rlcl9xdWV1ZShycSwga29iamVjdF9uYW1lKHJxLT5rb2JqLnBhcmVudCkpOworCWVsc2UKKwkJcmV0ID0gYnNnX3JlZ2lzdGVyX3F1ZXVlKHJxLCBrb2JqZWN0X25hbWUoJnNkcC0+c2Rldl9nZW5kZXYua29iaikpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJzZ19yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xfZGV2LCBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbF9pbnRmKQoreworCWJzZ191bnJlZ2lzdGVyX3F1ZXVlKHRvX3Njc2lfZGV2aWNlKGNsX2Rldi0+ZGV2KS0+cmVxdWVzdF9xdWV1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlIGJzZ19pbnRmID0geworCS5hZGQJPSBic2dfYWRkLAorCS5yZW1vdmUJPSBic2dfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBjZGV2IGJzZ19jZGV2ID0geworCS5rb2JqICAgPSB7Lm5hbWUgPSAiYnNnIiwgfSwKKwkub3duZXIgID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBic2dfaW5pdCh2b2lkKQoreworCWludCByZXQsIGk7CisKKwlic2dfY21kX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJic2dfY21kIiwKKwkJCQlzaXplb2Yoc3RydWN0IGJzZ19jb21tYW5kKSwgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKCFic2dfY21kX2NhY2hlcCkgeworCQlwcmludGsoS0VSTl9FUlIgImJzZzogZmFpbGVkIGNyZWF0aW5nIHNsYWIgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQlNHX0xJU1RfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJmJzZ19kZXZpY2VfbGlzdFtpXSk7CisKKwlic2dfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJic2ciKTsKKwlpZiAoSVNfRVJSKGJzZ19jbGFzcykpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJcmV0dXJuIFBUUl9FUlIoYnNnX2NsYXNzKTsKKwl9CisKKwlyZXQgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKEJTR19NQUpPUiwgMCksIEJTR19NQVhfREVWUywgImJzZyIpOworCWlmIChyZXQpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNkZXZfaW5pdCgmYnNnX2NkZXYsICZic2dfZm9wcyk7CisJcmV0ID0gY2Rldl9hZGQoJmJzZ19jZGV2LCBNS0RFVihCU0dfTUFKT1IsIDApLCBCU0dfTUFYX0RFVlMpOworCWlmIChyZXQpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoQlNHX01BSk9SLCAwKSwgQlNHX01BWF9ERVZTKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzY3NpX3JlZ2lzdGVyX2ludGVyZmFjZSgmYnNnX2ludGYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJic2c6IGZhaWxlZCByZWdpc3RlciBzY3NpIGludGVyZmFjZSAlZFxuIiwgcmV0KTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGJzZ19jbWRfY2FjaGVwKTsKKwkJY2xhc3NfZGVzdHJveShic2dfY2xhc3MpOworCQl1bnJlZ2lzdGVyX2NocmRldihCU0dfTUFKT1IsICJic2ciKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyBsb2FkZWRcbiIsIGJzZ192ZXJzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiSmVucyBBeGJvZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbG9jayBsYXllciBTR1NJIGdlbmVyaWMgKHNnKSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworZGV2aWNlX2luaXRjYWxsKGJzZ19pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IGUwYWE0ZGEuLjk3NTVhM2MgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMTI1MSw5ICsxMjUxLDkgQEAKIHsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYzsKIAotCWNpYyA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfaW9jX3Bvb2wsIGdmcF9tYXNrLCBjZnFkLT5xdWV1ZS0+bm9kZSk7CisJY2ljID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9pb2NfcG9vbCwgZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQkJCWNmcWQtPnF1ZXVlLT5ub2RlKTsKIAlpZiAoY2ljKSB7Ci0JCW1lbXNldChjaWMsIDAsIHNpemVvZigqY2ljKSk7CiAJCWNpYy0+bGFzdF9lbmRfcmVxdWVzdCA9IGppZmZpZXM7CiAJCUlOSVRfTElTVF9IRUFEKCZjaWMtPnF1ZXVlX2xpc3QpOwogCQljaWMtPmR0b3IgPSBjZnFfZnJlZV9pb19jb250ZXh0OwpAQCAtMTM3NiwxNyArMTM3NiwxOSBAQAogCQkJICogZnJlZSBtZW1vcnkuCiAJCQkgKi8KIAkJCXNwaW5fdW5sb2NrX2lycShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7Ci0JCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwgZ2ZwX21hc2t8X19HRlBfTk9GQUlMLCBjZnFkLT5xdWV1ZS0+bm9kZSk7CisJCQluZXdfY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwKKwkJCQkJZ2ZwX21hc2sgfCBfX0dGUF9OT0ZBSUwgfCBfX0dGUF9aRVJPLAorCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJCQlzcGluX2xvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0gZWxzZSB7Ci0JCQljZnFxID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNmcV9wb29sLCBnZnBfbWFzaywgY2ZxZC0+cXVldWUtPm5vZGUpOworCQkJY2ZxcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjZnFfcG9vbCwKKwkJCQkJZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLAorCQkJCQljZnFkLT5xdWV1ZS0+bm9kZSk7CiAJCQlpZiAoIWNmcXEpCiAJCQkJZ290byBvdXQ7CiAJCX0KIAotCQltZW1zZXQoY2ZxcSwgMCwgc2l6ZW9mKCpjZnFxKSk7Ci0KIAkJUkJfQ0xFQVJfTk9ERSgmY2ZxcS0+cmJfbm9kZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvKTsKIApAQCAtMjA3OSwxMiArMjA4MSwxMCBAQAogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZDsKIAotCWNmcWQgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpjZnFkKSwgR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CisJY2ZxZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmNmcWQpLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgcS0+bm9kZSk7CiAJaWYgKCFjZnFkKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChjZnFkLCAwLCBzaXplb2YoKmNmcWQpKTsKLQogCWNmcWQtPnNlcnZpY2VfdHJlZSA9IENGUV9SQl9ST09UOwogCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5jaWNfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwppbmRleCA2ZDY3M2U5Li44N2NhMDJhYyAxMDA2NDQKLS0tIGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtMzYwLDEwICszNjAsOSBAQAogewogCXN0cnVjdCBkZWFkbGluZV9kYXRhICpkZDsKIAotCWRkID0ga21hbGxvY19ub2RlKHNpemVvZigqZGQpLCBHRlBfS0VSTkVMLCBxLT5ub2RlKTsKKwlkZCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKmRkKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICghZGQpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChkZCwgMCwgc2l6ZW9mKCpkZCkpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRkLT5maWZvX2xpc3RbUkVBRF0pOwogCUlOSVRfTElTVF9IRUFEKCZkZC0+Zmlmb19saXN0W1dSSVRFXSk7CmRpZmYgLS1naXQgYS9ibG9jay9lbGV2YXRvci5jIGIvYmxvY2svZWxldmF0b3IuYwppbmRleCA0NzY5YTI1Li5kMjY1OTYzIDEwMDY0NAotLS0gYS9ibG9jay9lbGV2YXRvci5jCisrKyBiL2Jsb2NrL2VsZXZhdG9yLmMKQEAgLTE3NywxMSArMTc3LDEwIEBACiAJZWxldmF0b3JfdCAqZXE7CiAJaW50IGk7CiAKLQllcSA9IGttYWxsb2Nfbm9kZShzaXplb2YoZWxldmF0b3JfdCksIEdGUF9LRVJORUwsIHEtPm5vZGUpOworCWVxID0ga21hbGxvY19ub2RlKHNpemVvZihlbGV2YXRvcl90KSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIHEtPm5vZGUpOwogCWlmICh1bmxpa2VseSghZXEpKQogCQlnb3RvIGVycjsKIAotCW1lbXNldChlcSwgMCwgc2l6ZW9mKCplcSkpOwogCWVxLT5vcHMgPSAmZS0+b3BzOwogCWVxLT5lbGV2YXRvcl90eXBlID0gZTsKIAlrb2JqZWN0X2luaXQoJmVxLT5rb2JqKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2dlbmhkLmMgYi9ibG9jay9nZW5oZC5jCmluZGV4IDg2M2E4YzAuLjNhZjFlN2EgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2dlbmhkLmMKKysrIGIvYmxvY2svZ2VuaGQuYwpAQCAtMTA4LDI4ICsxMDgsMjQgQEAKIAogRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9ibGtkZXYpOwogCi0vKiB0b2RvOiBtYWtlIHZvaWQgLSBlcnJvciBwcmludGsgaGVyZSAqLwotaW50IHVucmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCBtYWpvciwgY29uc3QgY2hhciAqbmFtZSkKK3ZvaWQgdW5yZWdpc3Rlcl9ibGtkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBibGtfbWFqb3JfbmFtZSAqKm47CiAJc3RydWN0IGJsa19tYWpvcl9uYW1lICpwID0gTlVMTDsKIAlpbnQgaW5kZXggPSBtYWpvcl90b19pbmRleChtYWpvcik7Ci0JaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZibG9ja19zdWJzeXNfbG9jayk7CiAJZm9yIChuID0gJm1ham9yX25hbWVzW2luZGV4XTsgKm47IG4gPSAmKCpuKS0+bmV4dCkKIAkJaWYgKCgqbiktPm1ham9yID09IG1ham9yKQogCQkJYnJlYWs7Ci0JaWYgKCEqbiB8fCBzdHJjbXAoKCpuKS0+bmFtZSwgbmFtZSkpCi0JCXJldCA9IC1FSU5WQUw7Ci0JZWxzZSB7CisJaWYgKCEqbiB8fCBzdHJjbXAoKCpuKS0+bmFtZSwgbmFtZSkpIHsKKwkJV0FSTl9PTigxKTsKKwl9IGVsc2UgewogCQlwID0gKm47CiAJCSpuID0gcC0+bmV4dDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZibG9ja19zdWJzeXNfbG9jayk7CiAJa2ZyZWUocCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYmxrZGV2KTsKQEAgLTcyNiwyMSArNzIyLDIxIEBACiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAKLQlkaXNrID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZ2VuZGlzayksIEdGUF9LRVJORUwsIG5vZGVfaWQpOworCWRpc2sgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBnZW5kaXNrKSwKKwkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbm9kZV9pZCk7CiAJaWYgKGRpc2spIHsKLQkJbWVtc2V0KGRpc2ssIDAsIHNpemVvZihzdHJ1Y3QgZ2VuZGlzaykpOwogCQlpZiAoIWluaXRfZGlza19zdGF0cyhkaXNrKSkgewogCQkJa2ZyZWUoZGlzayk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlpZiAobWlub3JzID4gMSkgewogCQkJaW50IHNpemUgPSAobWlub3JzIC0gMSkgKiBzaXplb2Yoc3RydWN0IGhkX3N0cnVjdCAqKTsKLQkJCWRpc2stPnBhcnQgPSBrbWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CisJCQlkaXNrLT5wYXJ0ID0ga21hbGxvY19ub2RlKHNpemUsCisJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIG5vZGVfaWQpOwogCQkJaWYgKCFkaXNrLT5wYXJ0KSB7CiAJCQkJa2ZyZWUoZGlzayk7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9Ci0JCQltZW1zZXQoZGlzay0+cGFydCwgMCwgc2l6ZSk7CiAJCX0KIAkJZGlzay0+bWlub3JzID0gbWlub3JzOwogCQlrb2JqX3NldF9rc2V0X3MoZGlzayxibG9ja19zdWJzeXMpOwpkaWZmIC0tZ2l0IGEvYmxvY2svbGxfcndfYmxrLmMgYi9ibG9jay9sbF9yd19ibGsuYwppbmRleCBlZjQyYmIyLi5kN2NhZGYzIDEwMDY0NAotLS0gYS9ibG9jay9sbF9yd19ibGsuYworKysgYi9ibG9jay9sbF9yd19ibGsuYwpAQCAtMjU2LDYgKzI1Niw3IEBACiAJcnEtPmVuZF9pbyA9IE5VTEw7CiAJcnEtPmVuZF9pb19kYXRhID0gTlVMTDsKIAlycS0+Y29tcGxldGlvbl9kYXRhID0gTlVMTDsKKwlycS0+bmV4dF9ycSA9IE5VTEw7CiB9CiAKIC8qKgpAQCAtMTgyOCwxMSArMTgyOSwxMSBAQAogewogCXJlcXVlc3RfcXVldWVfdCAqcTsKIAotCXEgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUocmVxdWVzdHFfY2FjaGVwLCBnZnBfbWFzaywgbm9kZV9pZCk7CisJcSA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShyZXF1ZXN0cV9jYWNoZXAsCisJCQkJZ2ZwX21hc2sgfCBfX0dGUF9aRVJPLCBub2RlX2lkKTsKIAlpZiAoIXEpCiAJCXJldHVybiBOVUxMOwogCi0JbWVtc2V0KHEsIDAsIHNpemVvZigqcSkpOwogCWluaXRfdGltZXIoJnEtPnVucGx1Z190aW1lcik7CiAKIAlzbnByaW50ZihxLT5rb2JqLm5hbWUsIEtPQkpfTkFNRV9MRU4sICIlcyIsICJxdWV1ZSIpOwpkaWZmIC0tZ2l0IGEvYmxvY2svc2NzaV9pb2N0bC5jIGIvYmxvY2svc2NzaV9pb2N0bC5jCmluZGV4IGU4M2YxZGIuLmEyNmJhMDcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTQxLDggKzQxLDYgQEAKIAogRVhQT1JUX1NZTUJPTChzY3NpX2NvbW1hbmRfc2l6ZSk7CiAKLSNkZWZpbmUgQkxLX0RFRkFVTFRfVElNRU9VVAkoNjAgKiBIWikKLQogI2luY2x1ZGUgPHNjc2kvc2cuaD4KIAogc3RhdGljIGludCBzZ19nZXRfdmVyc2lvbihpbnQgX191c2VyICpwKQpAQCAtMTE0LDcgKzExMiw3IEBACiAjZGVmaW5lIHNhZmVfZm9yX3JlYWQoY21kKQlbY21kXSA9IENNRF9SRUFEX1NBRkUKICNkZWZpbmUgc2FmZV9mb3Jfd3JpdGUoY21kKQlbY21kXSA9IENNRF9XUklURV9TQUZFCiAKLXN0YXRpYyBpbnQgdmVyaWZ5X2NvbW1hbmQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNoYXIgKmNtZCkKK2ludCBibGtfdmVyaWZ5X2NvbW1hbmQodW5zaWduZWQgY2hhciAqY21kLCBpbnQgaGFzX3dyaXRlX3Blcm0pCiB7CiAJc3RhdGljIHVuc2lnbmVkIGNoYXIgY21kX3R5cGVbMjU2XSA9IHsKIApAQCAtMTkzLDE4ICsxOTEsMTEgQEAKIAkJc2FmZV9mb3Jfd3JpdGUoR1BDTURfU0VUX1NUUkVBTUlORyksCiAJfTsKIAl1bnNpZ25lZCBjaGFyIHR5cGUgPSBjbWRfdHlwZVtjbWRbMF1dOwotCWludCBoYXNfd3JpdGVfcGVybSA9IDA7CiAKIAkvKiBBbnlib2R5IHdobyBjYW4gb3BlbiB0aGUgZGV2aWNlIGNhbiBkbyBhIHJlYWQtc2FmZSBjb21tYW5kICovCiAJaWYgKHR5cGUgJiBDTURfUkVBRF9TQUZFKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogZmlsZSBjYW4gYmUgTlVMTCBmcm9tIGlvY3RsX2J5X2JkZXYoKS4uLgotCSAqLwotCWlmIChmaWxlKQotCQloYXNfd3JpdGVfcGVybSA9IGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFOwotCiAJLyogV3JpdGUtc2FmZSBjb21tYW5kcyBqdXN0IHJlcXVpcmUgYSB3cml0YWJsZSBvcGVuLi4gKi8KIAlpZiAoKHR5cGUgJiBDTURfV1JJVEVfU0FGRSkgJiYgaGFzX3dyaXRlX3Blcm0pCiAJCXJldHVybiAwOwpAQCAtMjIxLDI1ICsyMTIsOTYgQEAKIAkvKiBPdGhlcndpc2UgZmFpbCBpdCB3aXRoIGFuICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIgKi8KIAlyZXR1cm4gLUVQRVJNOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3ZlcmlmeV9jb21tYW5kKTsKKworaW50IGJsa19maWxsX3NnaGRyX3JxKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkgICAgICBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIsIGludCBoYXNfd3JpdGVfcGVybSkKK3sKKwltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKHJxLT5jbWQsIGhkci0+Y21kcCwgaGRyLT5jbWRfbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGJsa192ZXJpZnlfY29tbWFuZChycS0+Y21kLCBoYXNfd3JpdGVfcGVybSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKgorCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKKwkgKi8KKwlycS0+Y21kX2xlbiA9IGhkci0+Y21kX2xlbjsKKwlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKKworCXJxLT50aW1lb3V0ID0gKGhkci0+dGltZW91dCAqIEhaKSAvIDEwMDA7CisJaWYgKCFycS0+dGltZW91dCkKKwkJcnEtPnRpbWVvdXQgPSBxLT5zZ190aW1lb3V0OworCWlmICghcnEtPnRpbWVvdXQpCisJCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2ZpbGxfc2doZHJfcnEpOworCisvKgorICogdW5tYXAgYSByZXF1ZXN0IHRoYXQgd2FzIHByZXZpb3VzbHkgbWFwcGVkIHRvIHRoaXMgc2dfaW9faGRyLiBoYW5kbGVzCisgKiBib3RoIHNnIGFuZCBub24tc2cgc2dfaW9faGRyLgorICovCitpbnQgYmxrX3VubWFwX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX2hkciAqaGRyKQoreworCWJsa19ycV91bm1hcF91c2VyKHJxLT5iaW8pOworCWJsa19wdXRfcmVxdWVzdChycSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfdW5tYXBfc2doZHJfcnEpOworCitpbnQgYmxrX2NvbXBsZXRlX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IHNnX2lvX2hkciAqaGRyLAorCQkJICBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHIsIHJldCA9IDA7CisKKwkvKgorCSAqIGZpbGwgaW4gYWxsIHRoZSBvdXRwdXQgbWVtYmVycworCSAqLworCWhkci0+c3RhdHVzID0gcnEtPmVycm9ycyAmIDB4ZmY7CisJaGRyLT5tYXNrZWRfc3RhdHVzID0gc3RhdHVzX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT5tc2dfc3RhdHVzID0gbXNnX2J5dGUocnEtPmVycm9ycyk7CisJaGRyLT5ob3N0X3N0YXR1cyA9IGhvc3RfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmRyaXZlcl9zdGF0dXMgPSBkcml2ZXJfYnl0ZShycS0+ZXJyb3JzKTsKKwloZHItPmluZm8gPSAwOworCWlmIChoZHItPm1hc2tlZF9zdGF0dXMgfHwgaGRyLT5ob3N0X3N0YXR1cyB8fCBoZHItPmRyaXZlcl9zdGF0dXMpCisJCWhkci0+aW5mbyB8PSBTR19JTkZPX0NIRUNLOworCWhkci0+cmVzaWQgPSBycS0+ZGF0YV9sZW47CisJaGRyLT5zYl9sZW5fd3IgPSAwOworCisJaWYgKHJxLT5zZW5zZV9sZW4gJiYgaGRyLT5zYnApIHsKKwkJaW50IGxlbiA9IG1pbigodW5zaWduZWQgaW50KSBoZHItPm14X3NiX2xlbiwgcnEtPnNlbnNlX2xlbik7CisKKwkJaWYgKCFjb3B5X3RvX3VzZXIoaGRyLT5zYnAsIHJxLT5zZW5zZSwgbGVuKSkKKwkJCWhkci0+c2JfbGVuX3dyID0gbGVuOworCQllbHNlCisJCQlyZXQgPSAtRUZBVUxUOworCX0KKworCXJxLT5iaW8gPSBiaW87CisJciA9IGJsa191bm1hcF9zZ2hkcl9ycShycSwgaGRyKTsKKwlpZiAocmV0KQorCQlyID0gcmV0OworCisJcmV0dXJuIHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfY29tcGxldGVfc2doZHJfcnEpOwogCiBzdGF0aWMgaW50IHNnX2lvKHN0cnVjdCBmaWxlICpmaWxlLCByZXF1ZXN0X3F1ZXVlX3QgKnEsCiAJCXN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLCBzdHJ1Y3Qgc2dfaW9faGRyICpoZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCB0aW1lb3V0OwotCWludCB3cml0aW5nID0gMCwgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWU7CisJaW50IHdyaXRpbmcgPSAwLCByZXQgPSAwLCBoYXNfd3JpdGVfcGVybSA9IDA7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCWNoYXIgc2Vuc2VbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKLQl1bnNpZ25lZCBjaGFyIGNtZFtCTEtfTUFYX0NEQl07CiAJc3RydWN0IGJpbyAqYmlvOwogCiAJaWYgKGhkci0+aW50ZXJmYWNlX2lkICE9ICdTJykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGhkci0+Y21kX2xlbiA+IEJMS19NQVhfQ0RCKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIoY21kLCBoZHItPmNtZHAsIGhkci0+Y21kX2xlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmICh2ZXJpZnlfY29tbWFuZChmaWxlLCBjbWQpKQotCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKGhkci0+ZHhmZXJfbGVuID4gKHEtPm1heF9od19zZWN0b3JzIDw8IDkpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTI2MCwyNSArMzIyLDEzIEBACiAJaWYgKCFycSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKgotCSAqIGZpbGwgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKLQkgKi8KLQlycS0+Y21kX2xlbiA9IGhkci0+Y21kX2xlbjsKLQltZW1zZXQocnEtPmNtZCwgMCwgQkxLX01BWF9DREIpOyAvKiBBVEFQSSBoYXRlcyBnYXJiYWdlIGFmdGVyIENEQiAqLwotCW1lbWNweShycS0+Y21kLCBjbWQsIGhkci0+Y21kX2xlbik7CisJaWYgKGZpbGUpCisJCWhhc193cml0ZV9wZXJtID0gZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEU7CiAKLQltZW1zZXQoc2Vuc2UsIDAsIHNpemVvZihzZW5zZSkpOwotCXJxLT5zZW5zZSA9IHNlbnNlOwotCXJxLT5zZW5zZV9sZW4gPSAwOwotCi0JcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7Ci0KLQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhoZHItPnRpbWVvdXQpOwotCXJxLT50aW1lb3V0ID0gKHRpbWVvdXQgPCBJTlRfTUFYKSA/IHRpbWVvdXQgOiBJTlRfTUFYOwotCWlmICghcnEtPnRpbWVvdXQpCi0JCXJxLT50aW1lb3V0ID0gcS0+c2dfdGltZW91dDsKLQlpZiAoIXJxLT50aW1lb3V0KQotCQlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1RJTUVPVVQ7CisJaWYgKGJsa19maWxsX3NnaGRyX3JxKHEsIHJxLCBoZHIsIGhhc193cml0ZV9wZXJtKSkgeworCQlibGtfcHV0X3JlcXVlc3QocnEpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAKIAlpZiAoaGRyLT5pb3ZlY19jb3VudCkgewogCQljb25zdCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2dfaW92ZWMpICogaGRyLT5pb3ZlY19jb3VudDsKQEAgLTMwNiw2ICszNTYsOSBAQAogCQlnb3RvIG91dDsKIAogCWJpbyA9IHJxLT5iaW87CisJbWVtc2V0KHNlbnNlLCAwLCBzaXplb2Yoc2Vuc2UpKTsKKwlycS0+c2Vuc2UgPSBzZW5zZTsKKwlycS0+c2Vuc2VfbGVuID0gMDsKIAlycS0+cmV0cmllcyA9IDA7CiAKIAlzdGFydF90aW1lID0gamlmZmllczsKQEAgLTMxNiwzMSArMzY5LDkgQEAKIAkgKi8KIAlibGtfZXhlY3V0ZV9ycShxLCBiZF9kaXNrLCBycSwgMCk7CiAKLQkvKiB3cml0ZSB0byBhbGwgb3V0cHV0IG1lbWJlcnMgKi8KLQloZHItPnN0YXR1cyA9IDB4ZmYgJiBycS0+ZXJyb3JzOwotCWhkci0+bWFza2VkX3N0YXR1cyA9IHN0YXR1c19ieXRlKHJxLT5lcnJvcnMpOwotCWhkci0+bXNnX3N0YXR1cyA9IG1zZ19ieXRlKHJxLT5lcnJvcnMpOwotCWhkci0+aG9zdF9zdGF0dXMgPSBob3N0X2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5kcml2ZXJfc3RhdHVzID0gZHJpdmVyX2J5dGUocnEtPmVycm9ycyk7Ci0JaGRyLT5pbmZvID0gMDsKLQlpZiAoaGRyLT5tYXNrZWRfc3RhdHVzIHx8IGhkci0+aG9zdF9zdGF0dXMgfHwgaGRyLT5kcml2ZXJfc3RhdHVzKQotCQloZHItPmluZm8gfD0gU0dfSU5GT19DSEVDSzsKLQloZHItPnJlc2lkID0gcnEtPmRhdGFfbGVuOwogCWhkci0+ZHVyYXRpb24gPSAoKGppZmZpZXMgLSBzdGFydF90aW1lKSAqIDEwMDApIC8gSFo7Ci0JaGRyLT5zYl9sZW5fd3IgPSAwOwogCi0JaWYgKHJxLT5zZW5zZV9sZW4gJiYgaGRyLT5zYnApIHsKLQkJaW50IGxlbiA9IG1pbigodW5zaWduZWQgaW50KSBoZHItPm14X3NiX2xlbiwgcnEtPnNlbnNlX2xlbik7Ci0KLQkJaWYgKCFjb3B5X3RvX3VzZXIoaGRyLT5zYnAsIHJxLT5zZW5zZSwgbGVuKSkKLQkJCWhkci0+c2JfbGVuX3dyID0gbGVuOwotCX0KLQotCWlmIChibGtfcnFfdW5tYXBfdXNlcihiaW8pKQotCQlyZXQgPSAtRUZBVUxUOwotCi0JLyogbWF5IG5vdCBoYXZlIHN1Y2NlZWRlZCwgYnV0IG91dHB1dCB2YWx1ZXMgd3JpdHRlbiB0byBjb250cm9sCi0JICogc3RydWN0dXJlIChzdHJ1Y3Qgc2dfaW9faGRyKS4gICovCisJcmV0dXJuIGJsa19jb21wbGV0ZV9zZ2hkcl9ycShycSwgaGRyLCBiaW8pOwogb3V0OgogCWJsa19wdXRfcmVxdWVzdChycSk7CiAJcmV0dXJuIHJldDsKQEAgLTQyNyw3ICs0NTgsNyBAQAogCWlmIChpbl9sZW4gJiYgY29weV9mcm9tX3VzZXIoYnVmZmVyLCBzaWMtPmRhdGEgKyBjbWRsZW4sIGluX2xlbikpCiAJCWdvdG8gZXJyb3I7CiAKLQllcnIgPSB2ZXJpZnlfY29tbWFuZChmaWxlLCBycS0+Y21kKTsKKwllcnIgPSBibGtfdmVyaWZ5X2NvbW1hbmQocnEtPmNtZCwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTQ1NCw3ICs0ODUsNyBAQAogCQlycS0+cmV0cmllcyA9IDE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwkJcnEtPnRpbWVvdXQgPSBCTEtfREVGQVVMVF9TR19USU1FT1VUOwogCQlicmVhazsKIAl9CiAKQEAgLTUwMSw3ICs1MzIsNyBAQAogCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOwogCXJxLT5kYXRhID0gTlVMTDsKIAlycS0+ZGF0YV9sZW4gPSAwOwotCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfVElNRU9VVDsKKwlycS0+dGltZW91dCA9IEJMS19ERUZBVUxUX1NHX1RJTUVPVVQ7CiAJbWVtc2V0KHJxLT5jbWQsIDAsIHNpemVvZihycS0+Y21kKSk7CiAJcnEtPmNtZFswXSA9IGNtZDsKIAlycS0+Y21kWzRdID0gZGF0YTsKQEAgLTUxNywxNiArNTQ4LDEyIEBACiAJcmV0dXJuIF9fYmxrX3NlbmRfZ2VuZXJpYyhxLCBiZF9kaXNrLCBHUENNRF9TVEFSVF9TVE9QX1VOSVQsIGRhdGEpOwogfQogCi1pbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBnZW5kaXNrICpiZF9kaXNrLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoraW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJICAgc3RydWN0IGdlbmRpc2sgKmJkX2Rpc2ssIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxOwogCWludCBlcnI7CiAKLQlxID0gYmRfZGlzay0+cXVldWU7Ci0JaWYgKCFxKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKGJsa19nZXRfcXVldWUocSkpCisJaWYgKCFxIHx8IGJsa19nZXRfcXVldWUocSkpCiAJCXJldHVybiAtRU5YSU87CiAKIAlzd2l0Y2ggKGNtZCkgewpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Byb2MuYyBiL2NyeXB0by9wcm9jLmMKaW5kZXggMTAyYzc1MS4uM2Q3MzMyMyAxMDA2NDQKLS0tIGEvY3J5cHRvL3Byb2MuYworKysgYi9jcnlwdG8vcHJvYy5jCkBAIC0yMywyNCArMjMsMTMgQEAKIAogc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp2OwotCWxvZmZfdCBuID0gKnBvczsKLQogCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOwotCWxpc3RfZm9yX2VhY2godiwgJmNyeXB0b19hbGdfbGlzdCkKLQkJaWYgKCFuLS0pCi0JCQlyZXR1cm4gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY3J5cHRvX2FsZywgY3JhX2xpc3QpOwotCXJldHVybiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmY3J5cHRvX2FsZ19saXN0LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKmNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnAsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnYgPSBwOwotCQotCSgqcG9zKSsrOwotCXYgPSB2LT5uZXh0OwotCXJldHVybiAodiA9PSAmY3J5cHRvX2FsZ19saXN0KSA/Ci0JCU5VTEwgOiBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7CisJcmV0dXJuIHNlcV9saXN0X25leHQocCwgJmNyeXB0b19hbGdfbGlzdCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKQEAgLTUwLDcgKzM5LDcgQEAKIAogc3RhdGljIGludCBjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewotCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSAoc3RydWN0IGNyeXB0b19hbGcgKilwOworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBjcnlwdG9fYWxnLCBjcmFfbGlzdCk7CiAJCiAJc2VxX3ByaW50ZihtLCAibmFtZSAgICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX25hbWUpOwogCXNlcV9wcmludGYobSwgImRyaXZlciAgICAgICA6ICVzXG4iLCBhbGctPmNyYV9kcml2ZXJfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9LY29uZmlnIGIvZHJpdmVycy9hdG0vS2NvbmZpZwppbmRleCA1YjRmYWIyLi5iYjRhZTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRtL0tjb25maWcKQEAgLTE0Miw3ICsxNDIsNyBAQAogCiBjb25maWcgQVRNX0ZJUkVTVFJFQU0KIAl0cmlzdGF0ZSAiRnVqaXRzdSBGaXJlU3RyZWFtIChGUzUwL0ZTMTU1KSAiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIEZ1aml0c3UgRmlyZVN0cmVhbSAxNTUgKE1CODY2OTcpIGFuZAogCSAgRmlyZVN0cmVhbSA1MCAoTUI4NjY5NSkgQVRNIFBDSSBjaGlwcy4KQEAgLTE1Miw3ICsxNTIsNyBAQAogCiBjb25maWcgQVRNX1pBVE0KIAl0cmlzdGF0ZSAiWmVpdE5ldCBaTjEyMjEvWk4xMjI1IgotCWRlcGVuZHMgb24gUENJCisJZGVwZW5kcyBvbiBQQ0kgJiYgVklSVF9UT19CVVMKIAloZWxwCiAJICBEcml2ZXIgZm9yIHRoZSBaZWl0TmV0IFpOMTIyMSAoTU1GKSBhbmQgWk4xMjI1IChVVFAtNSkgMTU1IE1icHMgQVRNCiAJICBhZGFwdGVycy4KQEAgLTI0MCw3ICsyNDAsNyBAQAogCiBjb25maWcgQVRNX0FNQkFTU0FET1IKIAl0cmlzdGF0ZSAiTWFkZ2UgQW1iYXNzYWRvciAoQ29sbGFnZSBQQ0kgMTU1IFNlcnZlcikiCi0JZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIFBDSSAmJiBWSVJUX1RPX0JVUwogCXNlbGVjdCBCSVRSRVZFUlNFCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgQVRNaXplciBiYXNlZCBBVE0gY2FyZCBwcm9kdWNlZCBieSBNYWRnZQpAQCAtMjY1LDcgKzI2NSw3IEBACiAKIGNvbmZpZyBBVE1fSE9SSVpPTgogCXRyaXN0YXRlICJNYWRnZSBIb3Jpem9uIFtVbHRyYV0gKENvbGxhZ2UgUENJIDI1IGFuZCBDb2xsYWdlIFBDSSAxNTUgQ2xpZW50KSIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEhvcml6b24gY2hpcHNldCBBVE0gYWRhcHRlciBjYXJkcyBvbmNlCiAJICBwcm9kdWNlZCBieSBNYWRnZSBOZXR3b3JrcyBMdGQuIFNheSBZIChvciBNIHRvIGNvbXBpbGUgYXMgYSBtb2R1bGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXV4ZGlzcGxheS9LY29uZmlnIGIvZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWcKaW5kZXggZWE0ZmUzZS4uZGUyZmNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWcKKysrIGIvZHJpdmVycy9hdXhkaXNwbGF5L0tjb25maWcKQEAgLTUsOCArNSwxMSBAQAogIyBBdXhpbGlhcnkgZGlzcGxheSBkcml2ZXJzIGNvbmZpZ3VyYXRpb24uCiAjCiAKLW1lbnUgIkF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQiCittZW51Y29uZmlnIEFVWERJU1BMQVkKIAlkZXBlbmRzIG9uIFBBUlBPUlQKKwlib29sICJBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0IgorCitpZiBBVVhESVNQTEFZICYmIFBBUlBPUlQKIAogY29uZmlnIEtTMDEwOAogCXRyaXN0YXRlICJLUzAxMDggTENEIENvbnRyb2xsZXIiCkBAIC0xMTEsNCArMTE0LDUgQEAKIAogCSAgSWYgeW91IGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgeW91IGNhbiBzdGlsbCBvdmVycmlkZSB0aGlzCiAJICB2YWx1ZSB1c2luZyB0aGUgbW9kdWxlIHBhcmFtZXRlcnMuCi1lbmRtZW51CisKK2VuZGlmICMgQVVYRElTUExBWQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYXBvb2wuYyBiL2RyaXZlcnMvYmFzZS9kbWFwb29sLmMKaW5kZXggOTE5NzBlOS4uNzY0N2FiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYXBvb2wuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hcG9vbC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAl9IGVsc2UgaWYgKGFsbG9jYXRpb24gPCBzaXplKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghKHJldHZhbCA9IGttYWxsb2MgKHNpemVvZiAqcmV0dmFsLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEocmV0dmFsID0ga21hbGxvY19ub2RlIChzaXplb2YgKnJldHZhbCwgR0ZQX0tFUk5FTCwgZGV2X3RvX25vZGUoZGV2KSkpKQogCQlyZXR1cm4gcmV0dmFsOwogCiAJc3RybGNweSAocmV0dmFsLT5uYW1lLCBuYW1lLCBzaXplb2YgcmV0dmFsLT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svS2NvbmZpZyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwppbmRleCA2ZTIzYWYxLi44ZjY1Yjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcKKysrIGIvZHJpdmVycy9ibG9jay9LY29uZmlnCkBAIC01OSwxNyArNTksNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgejJyYW0uCiAKLWNvbmZpZyBBVEFSSV9TTE0KLQl0cmlzdGF0ZSAiQXRhcmkgU0xNIGxhc2VyIHByaW50ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJCi0JaGVscAotCSAgSWYgeW91IGhhdmUgYW4gQXRhcmkgU0xNIGxhc2VyIHByaW50ZXIsIHNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IKLQkgIGl0IGluIHRoZSBrZXJuZWwuIE90aGVyd2lzZSwgc2F5IE4uIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzCi0JICBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUKLQkgIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAotCSAgYWNzaV9zbG0uIEJlIHdhcm5lZDogdGhlIGRyaXZlciBuZWVkcyBtdWNoIFNULVJBTSBhbmQgY2FuIGNhdXNlCi0JICBwcm9ibGVtcyBkdWUgdG8gdGhhdCBmYWN0IQotCiBjb25maWcgQkxLX0RFVl9YRAogCXRyaXN0YXRlICJYVCBoYXJkIGRpc2sgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElTQSAmJiBJU0FfRE1BX0FQSQpAQCAtMTEzLDcgKzEwMiw3IEBACiAKIGNvbmZpZyBCTEtfQ1BRX0RBCiAJdHJpc3RhdGUgIkNvbXBhcSBTTUFSVDIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciBDb21wYXEgU21hcnQgQXJyYXkgY29udHJvbGxlcnMuICBFdmVyeW9uZQogCSAgdXNpbmcgdGhlc2UgYm9hcmRzIHNob3VsZCBzYXkgWSBoZXJlLiAgU2VlIHRoZSBmaWxlCkBAIC00MjMsNiArNDEyLDE5IEBACiAJVGhpcyBkcml2ZXIgcHJvdmlkZXMgU3VwcG9ydCBmb3IgQVRBIG92ZXIgRXRoZXJuZXQgYmxvY2sKIAlkZXZpY2VzIGxpa2UgdGhlIENvcmFpZCBFdGhlckRyaXZlIChSKSBTdG9yYWdlIEJsYWRlLgogCitjb25maWcgU1VOVkRDCisJdHJpc3RhdGUgIlN1biBWaXJ0dWFsIERpc2sgQ2xpZW50IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTVU5fTERPTVMKKwloZWxwCisJICBTdXBwb3J0IGZvciB2aXJ0dWFsIGRpc2sgZGV2aWNlcyBhcyBhIGNsaWVudCB1bmRlciBTdW4KKwkgIExvZ2ljYWwgRG9tYWlucy4KKwogc291cmNlICJkcml2ZXJzL3MzOTAvYmxvY2svS2NvbmZpZyIKIAorY29uZmlnIFhJTElOWF9TWVNBQ0UKKwl0cmlzdGF0ZSAiWGlsaW54IFN5c3RlbUFDRSBzdXBwb3J0IgorCWRlcGVuZHMgb24gNHh4CisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgWGlsaW54IFN5c3RlbUFDRSBDb21wYWN0Rmxhc2ggaW50ZXJmYWNlCisKIGVuZGlmICMgQkxLX0RFVgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9NYWtlZmlsZSBiL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKaW5kZXggZTVmOThhYy4uOWVlMDhhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCkBAIC05LDcgKzksNiBAQAogb2JqLSQoQ09ORklHX0JMS19ERVZfRkQpCSs9IGZsb3BweS5vCiBvYmotJChDT05GSUdfQU1JR0FfRkxPUFBZKQkrPSBhbWlmbG9wLm8KIG9iai0kKENPTkZJR19BVEFSSV9GTE9QUFkpCSs9IGF0YWZsb3Aubwotb2JqLSQoQ09ORklHX0FUQVJJX1NMTSkJCSs9IGFjc2lfc2xtLm8KIG9iai0kKENPTkZJR19BTUlHQV9aMlJBTSkJKz0gejJyYW0ubwogb2JqLSQoQ09ORklHX0JMS19ERVZfUkFNKQkrPSByZC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9MT09QKQkrPSBsb29wLm8KQEAgLTE4LDcgKzE3LDkgQEAKIG9iai0kKENPTkZJR19CTEtfQ1BRX0RBKQkrPSBjcHFhcnJheS5vCiBvYmotJChDT05GSUdfQkxLX0NQUV9DSVNTX0RBKSAgKz0gY2Npc3Mubwogb2JqLSQoQ09ORklHX0JMS19ERVZfREFDOTYwKQkrPSBEQUM5NjAubworb2JqLSQoQ09ORklHX1hJTElOWF9TWVNBQ0UpCSs9IHhzeXNhY2Uubwogb2JqLSQoQ09ORklHX0NEUk9NX1BLVENEVkQpCSs9IHBrdGNkdmQubworb2JqLSQoQ09ORklHX1NVTlZEQykJCSs9IHN1bnZkYy5vCiAKIG9iai0kKENPTkZJR19CTEtfREVWX1VNRU0pCSs9IHVtZW0ubwogb2JqLSQoQ09ORklHX0JMS19ERVZfTkJEKQkrPSBuYmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jIGIvZHJpdmVycy9ibG9jay9hY3NpX3NsbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDlkOWI0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYmxvY2svYWNzaV9zbG0uYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzIgKzAsMCBAQAotLyoKLSAqIGFjc2lfc2xtLmMgLS0gRGV2aWNlIGRyaXZlciBmb3IgdGhlIEF0YXJpIFNMTSBsYXNlciBwcmludGVyCi0gKgotICogQ29weXJpZ2h0IDE5OTUgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqIAotICovCi0KLS8qCi0KLU5vdGVzOgotCi1UaGUgbWFqb3IgbnVtYmVyIGZvciBTTE0gcHJpbnRlcnMgaXMgMjggKGxpa2UgQUNTSSksIGJ1dCBhcyBhIGNoYXJhY3RlcgotZGV2aWNlLCBub3QgYmxvY2sgZGV2aWNlLiBUaGUgbWlub3IgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgdGhlIHByaW50ZXIgKGlmCi15b3UgaGF2ZSBtb3JlIHRoYW4gb25lIFNMTTsgY3VycmVudGx5IG1heC4gMiAoI2RlZmluZS1jb25zdGFudCkgU0xNcyBhcmUKLXN1cHBvcnRlZCkuIFRoZSBkZXZpY2UgY2FuIGJlIG9wZW5lZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gSWYgcmVhZGluZyBpdCwKLXlvdSBnZXQgc29tZSBzdGF0dXMgaW5mb3MgKE1PREUgU0VOU0UgZGF0YSkuIFdyaXRpbmcgbW9kZSBpcyB1c2VkIGZvciB0aGUgZGF0YQotdG8gYmUgcHJpbnRlZC4gU29tZSBpb2N0bHMgYWxsb3cgdG8gZ2V0IHRoZSBwcmludGVyIHN0YXR1cyBhbmQgdG8gdHVuZSBwcmludGVyCi1tb2RlcyBhbmQgc29tZSBpbnRlcm5hbCB2YXJpYWJsZXMuCi0KLUEgc3BlY2lhbCBwcm9ibGVtIG9mIHRoZSBTTE0gZHJpdmVyIGlzIHRoZSB0aW1pbmcgYW5kIHRodXMgdGhlIGJ1ZmZlcmluZyBvZgotdGhlIHByaW50IGRhdGEuIFRoZSBwcm9ibGVtIGlzIHRoYXQgYWxsIHRoZSBkYXRhIGZvciBvbmUgcGFnZSBtdXN0IGJlIHByZXNlbnQKLWluIG1lbW9yeSB3aGVuIHByaW50aW5nIHN0YXJ0cywgZWxzZSAtLXdoZW4gc3dhcHBpbmcgb2NjdXJzLS0gdGhlIHRpbWluZyBjb3VsZAotbm90IGJlIGd1YXJhbnRlZWQuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gYXNzdXJlIHRoaXM6Ci0KLSAxKSBSZXNlcnZlIGEgYnVmZmVyIG9mIDExOTZrIChtYXhpbXVtIHBhZ2Ugc2l6ZSkgc3RhdGljYWxseSBieQotICAgIGF0YXJpX3N0cmFtX2FsbG9jKCkuIFRoZSBkYXRhIGFyZSBjb2xsZWN0ZWQgdGhlcmUgdW50aWwgdGhleSdyZSBjb21wbGV0ZSwKLQlhbmQgdGhlbiBwcmludGluZyBzdGFydHMuIFNpbmNlIHRoZSBidWZmZXIgaXMgcmVzZXJ2ZWQsIG5vIGZ1cnRoZXIKLQljb25zaWRlcmF0aW9ucyBhYm91dCBtZW1vcnkgYW5kIHN3YXBwaW5nIGFyZSBuZWVkZWQuIFNvIHRoaXMgaXMgdGhlCi0Jc2ltcGxlc3QgbWV0aG9kLCBidXQgaXQgbmVlZHMgYSBsb3Qgb2YgbWVtb3J5IGZvciBqdXN0IHRoZSBTTE0uCi0KLSAgICBBbiBzdHJpa2luZyBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgKHN1cHBvc2VkIHRoZSBTTE1fQ09OVF9DTlRfUkVQUk9HCi0JbWV0aG9kIHdvcmtzLCBzZWUgdGhlcmUpLCB0aGF0IHRoZXJlIGFyZSBubyB0aW1pbmcgcHJvYmxlbXMgd2l0aCB0aGUgRE1BCi0JYW55bW9yZS4KLQkKLSAyKSBUaGUgb3RoZXIgbWV0aG9kIHdvdWxkIGJlIHRvIHJlc2VydmUgdGhlIGJ1ZmZlciBkeW5hbWljYWxseSBlYWNoIHRpbWUKLSAgICBwcmludGluZyBpcyByZXF1aXJlZC4gSSBjb3VsZCB0aGluayBvZiBsb29raW5nIGF0IG1lbV9tYXAgd2hlcmUgdGhlCi0JbGFyZ2VzdCB1bmFsbG9jdGVkIFNULVJBTSBhcmVhIGlzLCB0YWtpbmcgdGhlIGFyZWEsIGFuZCB0aGVuIGV4dGVuZGluZyBpdAotCWJ5IHN3YXBwaW5nIG91dCB0aGUgbmVpZ2hib3JlZCBwYWdlcywgdW50aWwgdGhlIG5lZWRlZCBzaXplIGlzIHJlYWNoZWQuCi0JVGhpcyByZXF1aXJlcyBzb21lIG1tIGhhY2tpbmcsIGJ1dCBzZWVtcyBwb3NzaWJsZS4gVGhlIG9ubHkgb2JzdGFjbGUgY291bGQKLQliZSBwYWdlcyB0aGF0IGNhbm5vdCBiZSBzd2FwcGVkIG91dCAocmVzZXJ2ZWQgcGFnZXMpLi4uCi0KLSAzKSBBbm90aGVyIHBvc3NpYmlsaXR5IHdvdWxkIGJlIHRvIGxlYXZlIHRoZSByZWFsIGRhdGEgaW4gdXNlciBzcGFjZSBhbmQgdG8KLSAgICB3b3JrIHdpdGggdHdvIGRyaWJibGUgYnVmZmVycyBvZiBhYm91dCAzMmsgaW4gdGhlIGRyaXZlcjogV2hpbGUgdGhlIG9uZQotCWJ1ZmZlciBpcyBETUFlZCB0byB0aGUgU0xNLCB0aGUgb3RoZXIgY2FuIGJlIGZpbGxlZCB3aXRoIG5ldyBkYXRhLiBCdXQKLQl0byBrZWVwIHRoZSB0aW1pbmcsIHRoYXQgcmVxdWlyZXMgdGhhdCB0aGUgdXNlciBkYXRhIHJlbWFpbiBpbiBtZW1vcnkgYW5kCi0JYXJlIG5vdCBzd2FwcGVkIG91dC4gUmVxdWlyZXMgbW0gaGFja2luZywgdG9vLCBidXQgbWF5YmUgbm90IHNvIGJhZCBhcwotCW1ldGhvZCAyKS4KLQotKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlody5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KLSNpbmNsdWRlIDxhc20vYXRhcmlfYWNzaS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9zdGRtYS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9zdHJhbS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9TTE0uaD4KLQotCi0jdW5kZWYJREVCVUcKLQotLyogRGVmaW5lIHRoaXMgaWYgdGhlIHBhZ2UgZGF0YSBhcmUgY29udGludW91cyBpbiBwaHlzaWNhbCBtZW1vcnkuIFRoYXQKLSAqIHJlcXVpcmVzIGxlc3MgcmVwcm9ncmFtbWluZyBvZiB0aGUgU1QtRE1BICovCi0jZGVmaW5lCVNMTV9DT05USU5VT1VTX0RNQQotCi0vKiBVc2UgY29udGludW91cyByZXByb2dyYW1taW5nIG9mIHRoZSBTVC1ETUEgY291bnRlciByZWdpc3Rlci4gVGhpcyBpcwotICogLS1zdHJpY3RseSBzcGVha2luZy0tIG5vdCBhbGxvd2VkLCBBdGFyaSByZWNvbW1lbmRzIG5vdCB0byBsb29rIGF0IHRoZQotICogY291bnRlciByZWdpc3RlciB3aGlsZSBhIERNQSBpcyBnb2luZyBvbi4gQnV0IEkgZG9uJ3Qga25vdyBpZiB0aGF0IGFwcGxpZXMKLSAqIG9ubHkgZm9yIHJlYWRpbmcgdGhlIHJlZ2lzdGVyLCBvciBhbHNvIHdyaXRpbmcgdG8gaXQuIFdyaXRpbmcgb25seSB3b3JrcwotICogZmluZSBmb3IgbWUuLi4gVGhlIGFkdmFudGFnZSBpcyB0aGF0IHRoZSB0aW1pbmcgYmVjb21lcyBhYnNvbHV0ZWx5Ci0gKiB1bmNyaXRpY2FsOiBKdXN0IHVwZGF0ZSBlYWNoLCBzYXkgMjAwbXMsIHRoZSBjb3VudGVyIHJlZyB0byBpdHMgbWF4aW11bSwKLSAqIGFuZCB0aGUgRE1BIHdpbGwgd29yayB1bnRpbCB0aGUgc3RhdHVzIGJ5dGUgaW50ZXJydXB0IG9jY3Vycy4KLSAqLwotI2RlZmluZQlTTE1fQ09OVF9DTlRfUkVQUk9HCi0KLSNkZWZpbmUgQ01EU0VUX1RBUkdfTFVOKGNtZCx0YXJnLGx1bikJCQlcCi0gICAgZG8gewkJCQkJCQkJCQlcCi0JCWNtZFswXSA9IChjbWRbMF0gJiB+MHhlMCkgfCAodGFyZyk8PDU7CVwKLQkJY21kWzFdID0gKGNtZFsxXSAmIH4weGUwKSB8IChsdW4pPDw1OwlcCi0JfSB3aGlsZSgwKQotCi0jZGVmaW5lCVNUQVJUX1RJTUVSKHRvKQltb2RfdGltZXIoJnNsbV90aW1lciwgamlmZmllcyArICh0bykpCi0jZGVmaW5lCVNUT1BfVElNRVIoKQlkZWxfdGltZXIoJnNsbV90aW1lcikKLQotCi1zdGF0aWMgY2hhciBzbG1yZXFzZW5zZV9jbWRbNl0gPSB7IDB4MDMsIDAsIDAsIDAsIDAsIDAgfTsKLXN0YXRpYyBjaGFyIHNsbXByaW50X2NtZFs2XSAgICA9IHsgMHgwYSwgMCwgMCwgMCwgMCwgMCB9Owotc3RhdGljIGNoYXIgc2xtaW5xdWlyeV9jbWRbNl0gID0geyAweDEyLCAwLCAwLCAwLCAwLCAweDgwIH07Ci1zdGF0aWMgY2hhciBzbG1tc2Vuc2VfY21kWzZdICAgPSB7IDB4MWEsIDAsIDAsIDAsIDI1NSwgMCB9OwotI2lmIDAKLXN0YXRpYyBjaGFyIHNsbW1zZWxlY3RfY21kWzZdICA9IHsgMHgxNSwgMCwgMCwgMCwgMCwgMCB9OwotI2VuZGlmCi0KLQotI2RlZmluZQlNQVhfU0xNCQkyCi0KLXN0YXRpYyBzdHJ1Y3Qgc2xtIHsKLQl1bnNpZ25lZAl0YXJnZXQ7CQkJLyogdGFyZ2V0IG51bWJlciAqLwotCXVuc2lnbmVkCWx1bjsJCQkvKiBMVU4gaW4gdGFyZ2V0IGNvbnRyb2xsZXIgKi8KLQlhdG9taWNfdAl3cl9vazsgCQkJLyogc2V0IHRvIDAgaWYgb3V0cHV0IHBhcnQgYnVzeSAqLwotCWF0b21pY190CXJkX29rOwkJCS8qIHNldCB0byAwIGlmIHN0YXR1cyBwYXJ0IGJ1c3kgKi8KLX0gc2xtX2luZm9bTUFYX1NMTV07Ci0KLWludCBOX1NMTV9QcmludGVycyA9IDA7Ci0KLS8qIHByaW50ZXIgYnVmZmVyICovCi1zdGF0aWMgdW5zaWduZWQgY2hhcgkqU0xNQnVmZmVyOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCSpCdWZmZXJQOwkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLwotc3RhdGljIGludAkJCQlCdWZmZXJTaXplOwkvKiBsZW5ndGggb2YgYnVmZmVyIGZvciBwYWdlIHNpemUgKi8KLQotdHlwZWRlZiBlbnVtIHsgSURMRSwgRklMTElORywgUFJJTlRJTkcgfSBTTE1TVEFURTsKLXN0YXRpYyBTTE1TVEFURQkJCVNMTVN0YXRlOwotc3RhdGljIGludAkJCQlTTE1CdWZPd25lcjsJLyogU0xNIyBjdXJyZW50bHkgdXNpbmcgdGhlIGJ1ZmZlciAqLwotCi0vKiBETUEgdmFyaWFibGVzICovCi0jaWZuZGVmIFNMTV9DT05UX0NOVF9SRVBST0cKLXN0YXRpYyB1bnNpZ25lZCBsb25nCVNMTUN1ckFkZHI7CQkvKiBjdXJyZW50IGJhc2UgYWRkciBvZiBETUEgY2h1bmsgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCVNMTUVuZEFkZHI7CQkvKiBleHBlY3RlZCBlbmQgYWRkciAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcJU0xNU2xpY2VTaXplOwkvKiBzaXplIG9mIG9uZSBETUEgY2h1bmsgKi8KLSNlbmRpZgotc3RhdGljIGludAkJCQlTTE1FcnJvcjsKLQotLyogd2FpdCBxdWV1ZXMgKi8KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzbG1fd2FpdCk7CS8qIHdhaXRpbmcgZm9yIGJ1ZmZlciAqLwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHByaW50X3dhaXQpOwkvKiB3YWl0aW5nIGZvciBwcmludGluZyBmaW5pc2hlZCAqLwotCi0vKiBzdGF0dXMgY29kZXMgKi8KLSNkZWZpbmUJU0xNU1RBVF9PSwkJMHgwMAotI2RlZmluZQlTTE1TVEFUX09STkVSWQkweDAyCi0jZGVmaW5lCVNMTVNUQVRfVE9ORVIJMHgwMwotI2RlZmluZQlTTE1TVEFUX1dBUk1VUAkweDA0Ci0jZGVmaW5lCVNMTVNUQVRfUEFQRVIJMHgwNQotI2RlZmluZQlTTE1TVEFUX0RSVU0JMHgwNgotI2RlZmluZQlTTE1TVEFUX0lOSkFNCTB4MDcKLSNkZWZpbmUJU0xNU1RBVF9USFJKQU0JMHgwOAotI2RlZmluZQlTTE1TVEFUX09VVEpBTQkweDA5Ci0jZGVmaW5lCVNMTVNUQVRfQ09WRVIJMHgwYQotI2RlZmluZQlTTE1TVEFUX0ZVU0VSCTB4MGIKLSNkZWZpbmUJU0xNU1RBVF9JTUFHRVIJMHgwYwotI2RlZmluZQlTTE1TVEFUX01PVE9SCTB4MGQKLSNkZWZpbmUJU0xNU1RBVF9WSURFTwkweDBlCi0jZGVmaW5lCVNMTVNUQVRfU1lTVE8JMHgxMAotI2RlZmluZQlTTE1TVEFUX09QQ09ERQkweDEyCi0jZGVmaW5lCVNMTVNUQVRfREVWTlVNCTB4MTUKLSNkZWZpbmUJU0xNU1RBVF9QQVJBTQkweDFhCi0jZGVmaW5lCVNMTVNUQVRfQUNTSVRPCTB4MWIJLyogZHJpdmVyIGRlZmluZWQgKi8KLSNkZWZpbmUJU0xNU1RBVF9OT1RBTEwJMHgxYwkvKiBkcml2ZXIgZGVmaW5lZCAqLwotCi1zdGF0aWMgY2hhciAqU0xNRXJyb3JzW10gPSB7Ci0JLyogMHgwMCAqLwkiT0sgYW5kIHJlYWR5IiwKLQkvKiAweDAxICovCU5VTEwsCi0JLyogMHgwMiAqLwkib3JuZXJ5IHByaW50ZXIiLAotCS8qIDB4MDMgKi8JInRvbmVyIGVtcHR5IiwKLQkvKiAweDA0ICovCSJ3YXJtaW5nIHVwIiwKLQkvKiAweDA1ICovCSJwYXBlciBlbXB0eSIsCi0JLyogMHgwNiAqLwkiZHJ1bSBlbXB0eSIsCi0JLyogMHgwNyAqLwkiaW5wdXQgamFtIiwKLQkvKiAweDA4ICovCSJ0aHJvdWdoIGphbSIsCi0JLyogMHgwOSAqLwkib3V0cHV0IGphbSIsCi0JLyogMHgwYSAqLwkiY292ZXIgb3BlbiIsCi0JLyogMHgwYiAqLwkiZnVzZXIgbWFsZnVuY3Rpb24iLAotCS8qIDB4MGMgKi8JImltYWdlciBtYWxmdW5jdGlvbiIsCi0JLyogMHgwZCAqLwkibW90b3IgbWFsZnVuY3Rpb24iLAotCS8qIDB4MGUgKi8JInZpZGVvIG1hbGZ1bmN0aW9uIiwKLQkvKiAweDBmICovCU5VTEwsCi0JLyogMHgxMCAqLwkicHJpbnRlciBzeXN0ZW0gdGltZW91dCIsCi0JLyogMHgxMSAqLwlOVUxMLAotCS8qIDB4MTIgKi8JImludmFsaWQgb3BlcmF0aW9uIGNvZGUiLAotCS8qIDB4MTMgKi8JTlVMTCwKLQkvKiAweDE0ICovCU5VTEwsCi0JLyogMHgxNSAqLwkiaW52YWxpZCBkZXZpY2UgbnVtYmVyIiwKLQkvKiAweDE2ICovCU5VTEwsCi0JLyogMHgxNyAqLwlOVUxMLAotCS8qIDB4MTggKi8JTlVMTCwKLQkvKiAweDE5ICovCU5VTEwsCi0JLyogMHgxYSAqLwkiaW52YWxpZCBwYXJhbWV0ZXIgbGlzdCIsCi0JLyogMHgxYiAqLwkiQUNTSSB0aW1lb3V0IiwKLQkvKiAweDFjICovCSJub3QgYWxsIHByaW50ZWQiCi19OwotCi0jZGVmaW5lCU5fRVJST1JTCShzaXplb2YoU0xNRXJyb3JzKS9zaXplb2YoKlNMTUVycm9ycykpCi0KLS8qIHJlYWwgKGRyaXZlciBjYXVzZWQpIGVycm9yPyAqLwotI2RlZmluZQlJU19SRUFMX0VSUk9SKHgpCSh4ID4gMHgxMCkKLQotCi1zdGF0aWMgc3RydWN0IHsKLQljaGFyCSpuYW1lOwotCWludCAJdywgaDsKLX0gU3RkUGFnZVNpemVbXSA9IHsKLQl7ICJMZXR0ZXIiLCAyNDAwLCAzMTgwIH0sCi0JeyAiTGVnYWwiLCAgMjQwMCwgNDA4MCB9LAotCXsgIkE0IiwgICAgIDIzMzYsIDMzODYgfSwKLQl7ICJCNSIsICAgICAyMDE2LCAyOTE0IH0KLX07Ci0KLSNkZWZpbmUJTl9TVERfU0laRVMJCShzaXplb2YoU3RkUGFnZVNpemUpL3NpemVvZigqU3RkUGFnZVNpemUpKQotCi0jZGVmaW5lCVNMTV9CVUZGRVJfU0laRQkoMjMzNiozMzg2LzgpCS8qIEE0IGZvciBub3cgKi8KLSNkZWZpbmUJU0xNX0RNQV9BTU9VTlQJMjU1CQkJCS8qICNzZWN0b3JzIHRvIHByb2dyYW0gdGhlIERNQSBmb3IgKi8KLQotI2lmZGVmCVNMTV9DT05USU5VT1VTX0RNQQotIyBkZWZpbmUJU0xNX0RNQV9JTlRfT0ZGU0VUCTAJCS8qIERNQSBnb2VzIHVudGlsIHNlY2NudCAwLCBubyBvZmZzICovCi0jIGRlZmluZQlTTE1fRE1BX0VORF9PRkZTRVQJMzIJCS8qIDMyIEJ5dGUgU1QtRE1BIEZJRk8gKi8KLSMgZGVmaW5lCVNMTV9TTElDRV9TSVpFKHcpIAkoMjU1KjUxMikKLSNlbHNlCi0jIGRlZmluZQlTTE1fRE1BX0lOVF9PRkZTRVQJMzIJCS8qIDMyIEJ5dGUgU1QtRE1BIEZJRk8gKi8KLSMgZGVmaW5lCVNMTV9ETUFfRU5EX09GRlNFVAkzMgkJLyogMzIgQnl0ZSBTVC1ETUEgRklGTyAqLwotIyBkZWZpbmUJU0xNX1NMSUNFX1NJWkUodykJKCgyNTQqNTEyKS8ody84KSoody84KSkKLSNlbmRpZgotCi0vKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBqaWZmaWVzIHRvIHdhaXQgZm9yICduJyBieXRlcyAqLwotI2lmZGVmIFNMTV9DT05UX0NOVF9SRVBST0cKLSNkZWZpbmUJRE1BX1RJTUVfRk9SKG4pCQk1MAotI2RlZmluZQlETUFfU1RBUlRVUF9USU1FCTAKLSNlbHNlCi0jZGVmaW5lCURNQV9USU1FX0ZPUihuKQkJKG4vMTQwMC0xKQotI2RlZmluZQlETUFfU1RBUlRVUF9USU1FCTY1MAotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgY2hhciAqc2xtX2VycnN0ciggaW50IHN0YXQgKTsKLXN0YXRpYyBpbnQgc2xtX2dldHN0YXRzKCBjaGFyICpidWZmZXIsIGludCBkZXZpY2UgKTsKLXN0YXRpYyBzc2l6ZV90IHNsbV9yZWFkKCBzdHJ1Y3QgZmlsZSogZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdAotICAgICAgICAgICAgICAgICAgICAgICAgICpwcG9zICk7Ci1zdGF0aWMgdm9pZCBzdGFydF9wcmludCggaW50IGRldmljZSApOwotc3RhdGljIGlycXJldHVybl90IHNsbV9pbnRlcnJ1cHQoaW50IGlyYywgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBzbG1fdGVzdF9yZWFkeSggdW5zaWduZWQgbG9uZyBkdW1teSApOwotc3RhdGljIHZvaWQgc2V0X2RtYV9hZGRyKCB1bnNpZ25lZCBsb25nIHBhZGRyICk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZG1hX2FkZHIoIHZvaWQgKTsKLXN0YXRpYyBzc2l6ZV90IHNsbV93cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKnBwb3MgKTsKLXN0YXRpYyBpbnQgc2xtX2lvY3RsKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50Ci0gICAgICAgICAgICAgICAgICAgICAgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwotc3RhdGljIGludCBzbG1fb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKLXN0YXRpYyBpbnQgc2xtX3JlbGVhc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7Ci1zdGF0aWMgaW50IHNsbV9yZXFfc2Vuc2UoIGludCBkZXZpY2UgKTsKLXN0YXRpYyBpbnQgc2xtX21vZGVfc2Vuc2UoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGFic19mbGFnICk7Ci0jaWYgMAotc3RhdGljIGludCBzbG1fbW9kZV9zZWxlY3QoIGludCBkZXZpY2UsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiwgaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9mbGFnICk7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgc2xtX2dldF9wYWdlc2l6ZSggaW50IGRldmljZSwgaW50ICp3LCBpbnQgKmggKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RhdGljIERFRklORV9USU1FUihzbG1fdGltZXIsIHNsbV90ZXN0X3JlYWR5LCAwLCAwKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2xtX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLnJlYWQgPQkJc2xtX3JlYWQsCi0JLndyaXRlID0Jc2xtX3dyaXRlLAotCS5pb2N0bCA9CXNsbV9pb2N0bCwKLQkub3BlbiA9CQlzbG1fb3BlbiwKLQkucmVsZWFzZSA9CXNsbV9yZWxlYXNlLAotfTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgICBTdGF0dXMgRnVuY3Rpb25zCQkJCQkJCSAgKi8KLQotCi1zdGF0aWMgY2hhciAqc2xtX2VycnN0ciggaW50IHN0YXQgKQotCi17CWNoYXIgKnA7Ci0Jc3RhdGljIGNoYXIJc3RyWzIyXTsKLQotCXN0YXQgJj0gMHgxZjsKLQlpZiAoc3RhdCA+PSAwICYmIHN0YXQgPCBOX0VSUk9SUyAmJiAocCA9IFNMTUVycm9yc1tzdGF0XSkpCi0JCXJldHVybiggcCApOwotCXNwcmludGYoIHN0ciwgInVua25vd24gc3RhdHVzIDB4JTAyeCIsIHN0YXQgKTsKLQlyZXR1cm4oIHN0ciApOwotfQotCi0KLXN0YXRpYyBpbnQgc2xtX2dldHN0YXRzKCBjaGFyICpidWZmZXIsIGludCBkZXZpY2UgKQotCi17CWludCAJCQlsZW4gPSAwLCBzdGF0LCBpLCB3LCBoOwotCXVuc2lnbmVkIGNoYXIJYnVmWzI1Nl07Ci0JCi0Jc3RhdCA9IHNsbV9tb2RlX3NlbnNlKCBkZXZpY2UsIGJ1ZiwgMCApOwotCWlmIChJU19SRUFMX0VSUk9SKHN0YXQpKQotCQlyZXR1cm4oIC1FSU8gKTsKLQkKLSNkZWZpbmUgU0hPUlREQVRBKGkpCQkoKGJ1ZltpXSA8PCA4KSB8IGJ1ZltpKzFdKQotI2RlZmluZQlCT09MREFUQShpLG1hc2spCSgoYnVmW2ldICYgbWFzaykgPyAib24iIDogIm9mZiIpCi0KLQl3ID0gU0hPUlREQVRBKCAzICk7Ci0JaCA9IFNIT1JUREFUQSggMSApOwotCQkKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlN0YXR1c1x0XHQlc1xuIiwKLQkJCQkJc2xtX2VycnN0ciggc3RhdCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJQYWdlIFNpemVcdCVkeCVkIiwKLQkJCQkJdywgaCApOwotCi0JZm9yKCBpID0gMDsgaSA8IE5fU1REX1NJWkVTOyArK2kgKSB7Ci0JCWlmICh3ID09IFN0ZFBhZ2VTaXplW2ldLncgJiYgaCA9PSBTdGRQYWdlU2l6ZVtpXS5oKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpIDwgTl9TVERfU0laRVMpCi0JCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiICglcykiLCBTdGRQYWdlU2l6ZVtpXS5uYW1lICk7Ci0JYnVmZmVyW2xlbisrXSA9ICdcbic7Ci0KLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlRvcC9MZWZ0IE1hcmdpblx0JWQvJWRcbiIsCi0JCQkJCVNIT1JUREFUQSggNSApLCBTSE9SVERBVEEoIDcgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiTWFudWFsIEZlZWRcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHgwMSApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJJbnB1dCBTZWxlY3RcdCVkXG4iLAotCQkJCQkoYnVmWzldID4+IDEpICYgNyApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiQXV0byBTZWxlY3RcdCVzXG4iLAotCQkJCQlCT09MREFUQSggOSwgMHgxMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJQcmVmZWVkIFBhcGVyXHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDksIDB4MjAgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiVGhpY2sgUGl4ZWxzXHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDksIDB4NDAgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiSC9WIFJlc29sLlx0JWQvJWQgZHBpXG4iLAotCQkJCQlTSE9SVERBVEEoIDEyICksIFNIT1JUREFUQSggMTAgKSApOwotCWxlbiArPSBzcHJpbnRmKCBidWZmZXIrbGVuLCAiU3lzdGVtIFRpbWVvdXRcdCVkXG4iLAotCQkJCQlidWZbMTRdICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJTY2FuIFRpbWVcdCVkXG4iLAotCQkJCQlTSE9SVERBVEEoIDE1ICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlBhZ2UgQ291bnRcdCVkXG4iLAotCQkJCQlTSE9SVERBVEEoIDE3ICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkluL091dCBDYXAuXHQlZC8lZFxuIiwKLQkJCQkJU0hPUlREQVRBKCAxOSApLCBTSE9SVERBVEEoIDIxICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIlN0YWdnZXIgT3V0cHV0XHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDIzLCAweDAxICkgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIk91dHB1dCBTZWxlY3RcdCVkXG4iLAotCQkJCQkoYnVmWzIzXSA+PiAxKSAmIDcgKTsKLQlsZW4gKz0gc3ByaW50ZiggYnVmZmVyK2xlbiwgIkR1cGxleCBQcmludFx0JXNcbiIsCi0JCQkJCUJPT0xEQVRBKCAyMywgMHgxMCApICk7Ci0JbGVuICs9IHNwcmludGYoIGJ1ZmZlcitsZW4sICJDb2xvciBTZXAuXHQlc1xuIiwKLQkJCQkJQk9PTERBVEEoIDIzLCAweDIwICkgKTsKLQotCXJldHVybiggbGVuICk7Ci19Ci0KLQotc3RhdGljIHNzaXplX3Qgc2xtX3JlYWQoIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJCSBsb2ZmX3QgKnBwb3MgKQotCi17Ci0Jc3RydWN0IGlub2RlICpub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7Ci0JaW50IGxlbmd0aDsKLQlpbnQgZW5kOwotCi0JaWYgKCEocGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZSggR0ZQX0tFUk5FTCApKSkKLQkJcmV0dXJuKCAtRU5PTUVNICk7Ci0JCi0JbGVuZ3RoID0gc2xtX2dldHN0YXRzKCAoY2hhciAqKXBhZ2UsIGltaW5vcihub2RlKSApOwotCWlmIChsZW5ndGggPCAwKSB7Ci0JCWNvdW50ID0gbGVuZ3RoOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGZpbGUtPmZfcG9zID49IGxlbmd0aCkgewotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoY291bnQgKyBmaWxlLT5mX3BvcyA+IGxlbmd0aCkKLQkJY291bnQgPSBsZW5ndGggLSBmaWxlLT5mX3BvczsKLQllbmQgPSBjb3VudCArIGZpbGUtPmZfcG9zOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoY2hhciAqKXBhZ2UgKyBmaWxlLT5mX3BvcywgY291bnQpKSB7Ci0JCWNvdW50ID0gLUVGQVVMVDsKLQkJZ290byBvdXQ7Ci0JfQotCWZpbGUtPmZfcG9zID0gZW5kOwotb3V0OglmcmVlX3BhZ2UoIHBhZ2UgKTsKLQlyZXR1cm4oIGNvdW50ICk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJCSAgIFByaW50aW5nCQkJCQkJCQkgICovCi0KLQotc3RhdGljIHZvaWQgc3RhcnRfcHJpbnQoIGludCBkZXZpY2UgKQotCi17CXN0cnVjdCBzbG0gKnNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCXVuc2lnbmVkIGNoYXIJKmNtZDsKLQl1bnNpZ25lZCBsb25nCXBhZGRyOwotCWludAkJCQlpOwotCQotCXN0ZG1hX2xvY2soIHNsbV9pbnRlcnJ1cHQsIE5VTEwgKTsKLQotCUNNRFNFVF9UQVJHX0xVTiggc2xtcHJpbnRfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQljbWQgPSBzbG1wcmludF9jbWQ7Ci0JcGFkZHIgPSB2aXJ0X3RvX3BoeXMoIFNMTUJ1ZmZlciApOwotCWRtYV9jYWNoZV9tYWludGVuYW5jZSggcGFkZHIsIHZpcnRfdG9fcGh5cyhCdWZmZXJQKS1wYWRkciwgMSApOwotCURJU0FCTEVfSVJRKCk7Ci0KLQkvKiBMb3cgb24gQTEgKi8KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg4ODsKLQlNRlBERUxBWSgpOwotCi0JLyogc2VuZCB0aGUgY29tbWFuZCBieXRlcyBleGNlcHQgdGhlIGxhc3QgKi8KLQlmb3IoIGkgPSAwOyBpIDwgNTsgKytpICkgewotCQlETUFfTE9OR19XUklURSggKmNtZCsrLCAweDhhICk7Ci0JCXVkZWxheSgyMCk7Ci0JCWlmICghYWNzaV93YWl0X2Zvcl9JUlEoIEhaLzIgKSkgewotCQkJU0xNRXJyb3IgPSAxOwotCQkJcmV0dXJuOyAvKiB0aW1lb3V0ICovCi0JCX0KLQl9Ci0JLyogbGFzdCBjb21tYW5kIGJ5dGUgKi8KLQlETUFfTE9OR19XUklURSggKmNtZCsrLCAweDgyICk7Ci0JTUZQREVMQVkoKTsKLQkvKiBzZXQgRE1BIGFkZHJlc3MgKi8KLQlzZXRfZG1hX2FkZHIoIHBhZGRyICk7Ci0JLyogcHJvZ3JhbSBETUEgZm9yIHdyaXRlIGFuZCBzZWxlY3Qgc2VjdG9yIGNvdW50ZXIgcmVnICovCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4MTkyOwotCU1GUERFTEFZKCk7Ci0JLyogcHJvZ3JhbSBmb3IgMjU1KjUxMiBieXRlcyBhbmQgc3RhcnQgRE1BICovCi0JRE1BX0xPTkdfV1JJVEUoIFNMTV9ETUFfQU1PVU5ULCAweDExMiApOwotCi0jaWZuZGVmIFNMTV9DT05UX0NOVF9SRVBST0cKLQlTTE1DdXJBZGRyID0gcGFkZHI7Ci0JU0xNRW5kQWRkciA9IHBhZGRyICsgU0xNU2xpY2VTaXplICsgU0xNX0RNQV9JTlRfT0ZGU0VUOwotI2VuZGlmCi0JU1RBUlRfVElNRVIoIERNQV9TVEFSVFVQX1RJTUUgKyBETUFfVElNRV9GT1IoIFNMTVNsaWNlU2l6ZSApKTsKLSNpZiAhZGVmaW5lZChTTE1fQ09OVF9DTlRfUkVQUk9HKSAmJiBkZWZpbmVkKERFQlVHKQotCXByaW50ayggIlNMTTogQ3VyQWRkcj0lI2x4IEVuZEFkZHI9JSNseCB0aW1lcj0lbGRcbiIsCi0JCQlTTE1DdXJBZGRyLCBTTE1FbmRBZGRyLCBETUFfVElNRV9GT1IoIFNMTVNsaWNlU2l6ZSApICk7Ci0jZW5kaWYKLQkKLQlFTkFCTEVfSVJRKCk7Ci19Ci0KLQotLyogT25seSBjYWxsZWQgd2hlbiBhbiBlcnJvciBoYXBwZW5lZCBvciBhdCB0aGUgZW5kIG9mIGEgcGFnZSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2xtX2ludGVycnVwdChpbnQgaXJjLCB2b2lkICpkYXRhKQotCi17CXVuc2lnbmVkIGxvbmcJYWRkcjsKLQlpbnQJCQkJc3RhdDsKLQkKLQlTVE9QX1RJTUVSKCk7Ci0JYWRkciA9IGdldF9kbWFfYWRkcigpOwotCXN0YXQgPSBhY3NpX2dldHN0YXR1cygpOwotCVNMTUVycm9yID0gKHN0YXQgPCAwKSAgICAgICAgICAgICA/IFNMTVNUQVRfQUNTSVRPIDoKLQkJICAgICAgIChhZGRyIDwgdmlydF90b19waHlzKEJ1ZmZlclApKSA/IFNMTVNUQVRfTk9UQUxMIDoKLQkJCQkJCQkJCSAgICBzdGF0OwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODA7Ci0JTUZQREVMQVkoKTsKLSNpZmRlZiBERUJVRwotCXByaW50ayggIlNMTTogaW50ZXJydXB0LCBhZGRyPSUjbHgsIGVycm9yPSVkXG4iLCBhZGRyLCBTTE1FcnJvciApOwotI2VuZGlmCi0KLQl3YWtlX3VwKCAmcHJpbnRfd2FpdCApOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlFTkFCTEVfSVJRKCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0KLXN0YXRpYyB2b2lkIHNsbV90ZXN0X3JlYWR5KCB1bnNpZ25lZCBsb25nIGR1bW15ICkKLQotewotI2lmZGVmIFNMTV9DT05UX0NOVF9SRVBST0cKLQkvKiBwcm9ncmFtIGZvciAyNTUqNTEyIGJ5dGVzIGFnYWluICovCi0JZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IFNMTV9ETUFfQU1PVU5UOwotCVNUQVJUX1RJTUVSKCBETUFfVElNRV9GT1IoMCkgKTsKLSNpZmRlZiBERUJVRwotCXByaW50ayggIlNMTTogcmVwcm9ncmFtbWluZyB0aW1lciBmb3IgJWQgamlmZmllcywgYWRkcj0lI2x4XG4iLAotCQkJRE1BX1RJTUVfRk9SKDApLCBnZXRfZG1hX2FkZHIoKSApOwotI2VuZGlmCi0JCi0jZWxzZSAvKiAhU0xNX0NPTlRfQ05UX1JFUFJPRyAqLwotCi0JdW5zaWduZWQgbG9uZwlmbGFncywgYWRkcjsKLQlpbnQJCQkJZCwgdGk7Ci0jaWZkZWYgREVCVUcKLQlzdHJ1Y3QgdGltZXZhbCBzdGFydF90bSwgZW5kX3RtOwotCWludAkJCSAgIGRpZF93YWl0ID0gMDsKLSNlbmRpZgotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JYWRkciA9IGdldF9kbWFfYWRkcigpOwotCWlmICgoZCA9IFNMTUVuZEFkZHIgLSBhZGRyKSA+IDApIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkKLQkJLyogc2xpY2Ugbm90IHlldCBmaW5pc2hlZCwgZGVjaWRlIHdoZXRoZXIgdG8gc3RhcnQgYW5vdGhlciB0aW1lciBvciB0bwotCQkgKiBidXN5LXdhaXQgKi8KLQkJdGkgPSBETUFfVElNRV9GT1IoIGQgKTsKLQkJaWYgKHRpID4gMCkgewotI2lmZGVmIERFQlVHCi0JCQlwcmludGsoICJTTE06IHJlcHJvZ3JhbW1pbmcgdGltZXIgZm9yICVkIGppZmZpZXMsIHJlc3QgJWQgYnl0ZXNcbiIsCi0JCQkJCXRpLCBkICk7Ci0jZW5kaWYKLQkJCVNUQVJUX1RJTUVSKCB0aSApOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8qIHdhaXQgZm9yIGRlc2lyZWQgZW5kIGFkZHJlc3MgdG8gYmUgcmVhY2hlZCAqLwotI2lmZGVmIERFQlVHCi0JCWRvX2dldHRpbWVvZmRheSggJnN0YXJ0X3RtICk7Ci0JCWRpZF93YWl0ID0gMTsKLSNlbmRpZgotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQl3aGlsZSggZ2V0X2RtYV9hZGRyKCkgPCBTTE1FbmRBZGRyICkKLQkJCWJhcnJpZXIoKTsKLQl9Ci0KLQkvKiBzbGljZSBmaW5pc2hlZCwgc3RhcnQgbmV4dCBvbmUgKi8KLQlTTE1DdXJBZGRyICs9IFNMTVNsaWNlU2l6ZTsKLQotI2lmZGVmIFNMTV9DT05USU5VT1VTX0RNQQotCS8qIHByb2dyYW0gZm9yIDI1NSo1MTIgYnl0ZXMgYWdhaW4gKi8KLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50ID0gU0xNX0RNQV9BTU9VTlQ7Ci0jZWxzZQotCS8qIHNldCBETUEgYWRkcmVzczsKLQkgKiBhZGQgMiBieXRlcyBmb3IgdGhlIG9uZXMgaW4gdGhlIFNMTSBjb250cm9sbGVyIEZJRk8hICovCi0Jc2V0X2RtYV9hZGRyKCBTTE1DdXJBZGRyICsgMiApOwotCS8qIHRvZ2dsZSBETUEgdG8gd3JpdGUgYW5kIHNlbGVjdCBzZWN0b3IgY291bnRlciByZWcgKi8KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gMHg5MjsKLQlNRlBERUxBWSgpOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDE5MjsKLQlNRlBERUxBWSgpOwotCS8qIHByb2dyYW0gZm9yIDI1NSo1MTIgYnl0ZXMgYW5kIHN0YXJ0IERNQSAqLwotCURNQV9MT05HX1dSSVRFKCBTTE1fRE1BX0FNT1VOVCwgMHgxMTIgKTsKLSNlbmRpZgotCQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotI2lmZGVmIERFQlVHCi0JaWYgKGRpZF93YWl0KSB7Ci0JCWludCBtczsKLQkJZG9fZ2V0dGltZW9mZGF5KCAmZW5kX3RtICk7Ci0JCW1zID0gKGVuZF90bS50dl9zZWMqMTAwMDAwMCtlbmRfdG0udHZfdXNlYykgLQotCQkJIChzdGFydF90bS50dl9zZWMqMTAwMDAwMCtzdGFydF90bS50dl91c2VjKTsgCi0JCXByaW50ayggIlNMTTogZGlkICVsZC4lbGQgbXMgYnVzeSB3YWl0aW5nIGZvciAlZCBieXRlc1xuIiwKLQkJCQltcy8xMDAwLCBtcyUxMDAwLCBkICk7Ci0JfQotCWVsc2UKLQkJcHJpbnRrKCAiU0xNOiBkaWRuJ3Qgd2FpdCAoISlcbiIgKTsKLSNlbmRpZgotCi0JaWYgKCh1bnNpZ25lZCBjaGFyICopUFRPViggU0xNQ3VyQWRkciArIFNMTVNsaWNlU2l6ZSApID49IEJ1ZmZlclApIHsKLQkJLyogd2lsbCBiZSBsYXN0IHNsaWNlLCBubyB0aW1lciBuZWNlc3NhcnkgKi8KLSNpZmRlZiBERUJVRwotCQlwcmludGsoICJTTE06IEN1ckFkZHI9JSNseCBFbmRBZGRyPSUjbHggbGFzdCBzbGljZSAtPiBubyB0aW1lclxuIiwKLQkJCQlTTE1DdXJBZGRyLCBTTE1FbmRBZGRyICk7Ci0jZW5kaWYKLQl9Ci0JZWxzZSB7Ci0JCS8qIG5vdCBsYXN0IHNsaWNlICovCi0JCVNMTUVuZEFkZHIgPSBTTE1DdXJBZGRyICsgU0xNU2xpY2VTaXplICsgU0xNX0RNQV9JTlRfT0ZGU0VUOwotCQlTVEFSVF9USU1FUiggRE1BX1RJTUVfRk9SKCBTTE1TbGljZVNpemUgKSk7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKCAiU0xNOiBDdXJBZGRyPSUjbHggRW5kQWRkcj0lI2x4IHRpbWVyPSVsZFxuIiwKLQkJCQlTTE1DdXJBZGRyLCBTTE1FbmRBZGRyLCBETUFfVElNRV9GT1IoIFNMTVNsaWNlU2l6ZSApICk7Ci0jZW5kaWYKLQl9Ci0jZW5kaWYgLyogU0xNX0NPTlRfQ05UX1JFUFJPRyAqLwotfQotCi0KLXN0YXRpYyB2b2lkIHNldF9kbWFfYWRkciggdW5zaWduZWQgbG9uZyBwYWRkciApCi0KLXsJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlkbWFfd2QuZG1hX2xvID0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JTUZQREVMQVkoKTsKLQlkbWFfd2QuZG1hX21kID0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JTUZQREVMQVkoKTsKLQlpZiAoQVRBUklIV19QUkVTRU5UKCBFWFREX0RNQSApKQotCQlzdF9kbWFfZXh0X2RtYWhpID0gKHVuc2lnbmVkIHNob3J0KXBhZGRyOwotCWVsc2UKLQkJZG1hX3dkLmRtYV9oaSA9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCU1GUERFTEFZKCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9kbWFfYWRkciggdm9pZCApCi0KLXsJdW5zaWduZWQgbG9uZwlhZGRyOwotCQotCWFkZHIgPSBkbWFfd2QuZG1hX2xvICYgMHhmZjsKLQlNRlBERUxBWSgpOwotCWFkZHIgfD0gKGRtYV93ZC5kbWFfbWQgJiAweGZmKSA8PCA4OwotCU1GUERFTEFZKCk7Ci0JYWRkciB8PSAoZG1hX3dkLmRtYV9oaSAmIDB4ZmYpIDw8IDE2OwotCU1GUERFTEFZKCk7Ci0KLQlyZXR1cm4oIGFkZHIgKTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBzbG1fd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkJCSAgbG9mZl90ICpwcG9zICkKLQotewotCXN0cnVjdCBpbm9kZSAqbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JaW50CQlkZXZpY2UgPSBpbWlub3Iobm9kZSk7Ci0JaW50CQluLCBmaWxsZWQsIHcsIGg7Ci0KLQl3aGlsZSggU0xNU3RhdGUgPT0gUFJJTlRJTkcgfHwKLQkJICAgKFNMTVN0YXRlID09IEZJTExJTkcgJiYgU0xNQnVmT3duZXIgIT0gZGV2aWNlKSApIHsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbiggJnNsbV93YWl0ICk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHVybiggLUVSRVNUQVJUU1lTICk7Ci0JfQotCWlmIChTTE1TdGF0ZSA9PSBJRExFKSB7Ci0JCS8qIGZpcnN0IGRhdGEgb2YgcGFnZTogZ2V0IGN1cnJlbnQgcGFnZSBzaXplICAqLwotCQlpZiAoc2xtX2dldF9wYWdlc2l6ZSggZGV2aWNlLCAmdywgJmggKSkKLQkJCXJldHVybiggLUVJTyApOwotCQlCdWZmZXJTaXplID0gdypoLzg7Ci0JCWlmIChCdWZmZXJTaXplID4gU0xNX0JVRkZFUl9TSVpFKQotCQkJcmV0dXJuKCAtRU5PTUVNICk7Ci0KLQkJU0xNU3RhdGUgPSBGSUxMSU5HOwotCQlTTE1CdWZPd25lciA9IGRldmljZTsKLQl9Ci0KLQluID0gY291bnQ7Ci0JZmlsbGVkID0gQnVmZmVyUCAtIFNMTUJ1ZmZlcjsKLQlpZiAoZmlsbGVkICsgbiA+IEJ1ZmZlclNpemUpCi0JCW4gPSBCdWZmZXJTaXplIC0gZmlsbGVkOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKEJ1ZmZlclAsIGJ1ZiwgbikpCi0JCXJldHVybiAtRUZBVUxUOwotCUJ1ZmZlclAgKz0gbjsKLQlmaWxsZWQgKz0gbjsKLQotCWlmIChmaWxsZWQgPT0gQnVmZmVyU2l6ZSkgewotCQkvKiBDaGVjayB0aGUgcGFwZXIgc2l6ZSBhZ2FpbiEgVGhlIHVzZXIgbWF5IGhhdmUgc3dpdGNoZWQgaXQgaW4gdGhlCi0JCSAqIHRpbWUgYmV0d2VlbiBzdGFydGluZyB0aGUgZGF0YSBhbmQgZmluaXNoaW5nIHRoZW0uIFdvdWxkIGVuZCB1cCBpbgotCQkgKiBhIHRyYXNoeSBwYWdlLi4uICovCi0JCWlmIChzbG1fZ2V0X3BhZ2VzaXplKCBkZXZpY2UsICZ3LCAmaCApKQotCQkJcmV0dXJuKCAtRUlPICk7Ci0JCWlmIChCdWZmZXJTaXplICE9IHcqaC84KSB7Ci0JCQlwcmludGsoIEtFUk5fTk9USUNFICJzbG0lZDogcGFnZSBzaXplIGNoYW5nZWQgd2hpbGUgcHJpbnRpbmdcbiIsCi0JCQkJCWRldmljZSApOwotCQkJcmV0dXJuKCAtRUFHQUlOICk7Ci0JCX0KLQotCQlTTE1TdGF0ZSA9IFBSSU5USU5HOwotCQkvKiBjaG9vc2UgYSBzbGljZSBzaXplIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgbGluZSBzaXplICovCi0jaWZuZGVmIFNMTV9DT05UX0NOVF9SRVBST0cKLQkJU0xNU2xpY2VTaXplID0gU0xNX1NMSUNFX1NJWkUodyk7Ci0jZW5kaWYKLQkJCi0JCXN0YXJ0X3ByaW50KCBkZXZpY2UgKTsKLQkJc2xlZXBfb24oICZwcmludF93YWl0ICk7Ci0JCWlmIChTTE1FcnJvciAmJiBJU19SRUFMX0VSUk9SKFNMTUVycm9yKSkgewotCQkJcHJpbnRrKCBLRVJOX0VSUiAic2xtJWQ6ICVzXG4iLCBkZXZpY2UsIHNsbV9lcnJzdHIoU0xNRXJyb3IpICk7Ci0JCQluID0gLUVJTzsKLQkJfQotCi0JCVNMTVN0YXRlID0gSURMRTsKLQkJQnVmZmVyUCA9IFNMTUJ1ZmZlcjsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCAmc2xtX3dhaXQgKTsKLQl9Ci0JCi0JcmV0dXJuKCBuICk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJICAgaW9jdGwgRnVuY3Rpb25zCQkJCQkJCSAgKi8KLQotCi1zdGF0aWMgaW50IHNsbV9pb2N0bCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQotCi17CWludAkJZGV2aWNlID0gaW1pbm9yKGlub2RlKSwgZXJyOwotCQotCS8qIEkgY2FuIHRoaW5rIG9mIHNldHRpbmc6Ci0JICogIC0gbWFudWFsIGZlZWQKLQkgKiAgLSBwYXBlciBmb3JtYXQKLQkgKiAgLSBjb3B5IGNvdW50Ci0JICogIC0gLi4uCi0JICogYnV0IGhhdmVuJ3QgaW1wbGVtZW50ZWQgdGhhdCB5ZXQgOi0pCi0JICogQlRXLCBoYXMgYW55Ym9keSBiZXR0ZXIgZG9jcyBhYm91dCB0aGUgTU9ERSBTRU5TRS9NT0RFIFNFTEVDVCBkYXRhPwotCSAqLwotCXN3aXRjaCggY21kICkgewotCi0JICBjYXNlIFNMTUlPUkVTRVQ6CQkvKiByZXNldCBidWZmZXIsIGkuZS4gZW1wdHkgdGhlIGJ1ZmZlciAqLwotCQlpZiAoIShmaWxlLT5mX21vZGUgJiAyKSkKLQkJCXJldHVybiggLUVJTlZBTCApOwotCQlpZiAoU0xNU3RhdGUgPT0gUFJJTlRJTkcpCi0JCQlyZXR1cm4oIC1FQlVTWSApOwotCQlTTE1TdGF0ZSA9IElETEU7Ci0JCUJ1ZmZlclAgPSBTTE1CdWZmZXI7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSggJnNsbV93YWl0ICk7Ci0JCXJldHVybiggMCApOwotCQkKLQkgIGNhc2UgU0xNSU9HU1RBVDogewkvKiBnZXQgc3RhdHVzICovCi0JCWludCBzdGF0OwotCQljaGFyICpzdHI7Ci0KLQkJc3RhdCA9IHNsbV9yZXFfc2Vuc2UoIGRldmljZSApOwotCQlpZiAoYXJnKSB7Ci0JCQlzdHIgPSBzbG1fZXJyc3RyKCBzdGF0ICk7Ci0JCQlpZiAocHV0X3VzZXIoc3RhdCwKLSAgICAJICAgIAkgICAgCSAgICAJICAgICAobG9uZyAqKSYoKHN0cnVjdCBTTE1fc3RhdHVzICopYXJnKS0+c3RhdCkpCi0gICAgCSAgICAJICAgIAkgICAgCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKGNvcHlfdG9fdXNlciggKChzdHJ1Y3QgU0xNX3N0YXR1cyAqKWFyZyktPnN0ciwgc3RyLAotCQkJCQkJIHN0cmxlbihzdHIpICsgMSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuKCBzdGF0ICk7Ci0JICB9Ci0JCQotCSAgY2FzZSBTTE1JT0dQU0laRTogewkvKiBnZXQgcGFwZXIgc2l6ZSAqLwotCQlpbnQgdywgaDsKLQkJCi0JCWlmICgoZXJyID0gc2xtX2dldF9wYWdlc2l6ZSggZGV2aWNlLCAmdywgJmggKSkpIHJldHVybiggZXJyICk7Ci0JCQotICAgIAkgICAgCWlmIChwdXRfdXNlcih3LCAobG9uZyAqKSYoKHN0cnVjdCBTTE1fcGFwZXJfc2l6ZSAqKWFyZyktPndpZHRoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAocHV0X3VzZXIoaCwgKGxvbmcgKikmKChzdHJ1Y3QgU0xNX3BhcGVyX3NpemUgKilhcmcpLT5oZWlnaHQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiggMCApOwotCSAgfQotCQkKLQkgIGNhc2UgU0xNSU9HTUZFRUQ6CS8qIGdldCBtYW51YWwgZmVlZCAqLwotCQlyZXR1cm4oIC1FSU5WQUwgKTsKLQotCSAgY2FzZSBTTE1JT1NQU0laRToJLyogc2V0IHBhcGVyIHNpemUgKi8KLQkJcmV0dXJuKCAtRUlOVkFMICk7Ci0KLQkgIGNhc2UgU0xNSU9TTUZFRUQ6CS8qIHNldCBtYW51YWwgZmVlZCAqLwotCQlyZXR1cm4oIC1FSU5WQUwgKTsKLQotCX0KLQlyZXR1cm4oIC1FSU5WQUwgKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgT3BlbmluZyBhbmQgQ2xvc2luZwkJCQkJCSAgKi8KLQotCi1zdGF0aWMgaW50IHNsbV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApCi0KLXsJaW50IGRldmljZTsKLQlzdHJ1Y3Qgc2xtICpzaXA7Ci0JCi0JZGV2aWNlID0gaW1pbm9yKGlub2RlKTsKLQlpZiAoZGV2aWNlID49IE5fU0xNX1ByaW50ZXJzKQotCQlyZXR1cm4oIC1FTlhJTyApOwotCXNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIDIpIHsKLQkJLyogb3BlbiBmb3Igd3JpdGluZyBpcyBleGNsdXNpdmUgKi8KLQkJaWYgKCAhYXRvbWljX2RlY19hbmRfdGVzdCgmc2lwLT53cl9vaykgKSB7Ci0JCQlhdG9taWNfaW5jKCZzaXAtPndyX29rKTsJCi0JCQlyZXR1cm4oIC1FQlVTWSApOwotCQl9Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiAxKSB7Ci0JCS8qIG9wZW4gZm9yIHJlYWRpbmcgaXMgZXhjbHVzaXZlICovCi0gICAgICAgICAgICAgICAgaWYgKCAhYXRvbWljX2RlY19hbmRfdGVzdCgmc2lwLT5yZF9vaykgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdG9taWNfaW5jKCZzaXAtPnJkX29rKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiggLUVCVVNZICk7Ci0gICAgICAgICAgICAgICAgfQotCX0KLQotCXJldHVybiggMCApOwotfQotCi0KLXN0YXRpYyBpbnQgc2xtX3JlbGVhc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkKLQotewlpbnQgZGV2aWNlOwotCXN0cnVjdCBzbG0gKnNpcDsKLQkKLQlkZXZpY2UgPSBpbWlub3IoaW5vZGUpOwotCXNpcCA9ICZzbG1faW5mb1tkZXZpY2VdOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIDIpCi0JCWF0b21pY19pbmMoICZzaXAtPndyX29rICk7Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIDEpCi0JCWF0b21pY19pbmMoICZzaXAtPnJkX29rICk7Ci0JCi0JcmV0dXJuKCAwICk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkgQUNTSSBQcmltaXRpdmVzIGZvciB0aGUgU0xNCQkJCQkgICovCi0KLQotc3RhdGljIGludCBzbG1fcmVxX3NlbnNlKCBpbnQgZGV2aWNlICkKLQotewlpbnQJCQlzdGF0LCBydjsKLQlzdHJ1Y3Qgc2xtICpzaXAgPSAmc2xtX2luZm9bZGV2aWNlXTsKLQkKLQlzdGRtYV9sb2NrKCBOVUxMLCBOVUxMICk7Ci0KLQlDTURTRVRfVEFSR19MVU4oIHNsbXJlcXNlbnNlX2NtZCwgc2lwLT50YXJnZXQsIHNpcC0+bHVuICk7Ci0JaWYgKCFhY3NpY21kX25vZG1hKCBzbG1yZXFzZW5zZV9jbWQsIDAgKSB8fAotCQkoc3RhdCA9IGFjc2lfZ2V0c3RhdHVzKCkpIDwgMCkKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQllbHNlCi0JCXJ2ID0gc3RhdCAmIDB4MWY7Ci0KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybiggcnYgKTsKLX0KLQotCi1zdGF0aWMgaW50IHNsbV9tb2RlX3NlbnNlKCBpbnQgZGV2aWNlLCBjaGFyICpidWZmZXIsIGludCBhYnNfZmxhZyApCi0KLXsJdW5zaWduZWQgY2hhcglzdGF0LCBsZW47Ci0JaW50CQkJCXJ2ID0gMDsKLQlzdHJ1Y3Qgc2xtCQkqc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0JCi0Jc3RkbWFfbG9jayggTlVMTCwgTlVMTCApOwotCi0JQ01EU0VUX1RBUkdfTFVOKCBzbG1tc2Vuc2VfY21kLCBzaXAtPnRhcmdldCwgc2lwLT5sdW4gKTsKLQlzbG1tc2Vuc2VfY21kWzVdID0gYWJzX2ZsYWcgPyAweDgwIDogMDsKLQlpZiAoIWFjc2ljbWRfbm9kbWEoIHNsbW1zZW5zZV9jbWQsIDAgKSkgewotCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQlnb3RvIHRoZV9lbmQ7Ci0JfQotCi0JaWYgKCFhY3NpX2V4dHN0YXR1cyggJnN0YXQsIDEgKSkgewotCQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQkKLQlpZiAoIWFjc2lfZXh0c3RhdHVzKCAmbGVuLCAxICkpIHsKLQkJYWNzaV9lbmRfZXh0c3RhdHVzKCk7Ci0JCXJ2ID0gU0xNU1RBVF9BQ1NJVE87Ci0JCWdvdG8gdGhlX2VuZDsKLQl9Ci0JYnVmZmVyWzBdID0gbGVuOwotCWlmICghYWNzaV9leHRzdGF0dXMoIGJ1ZmZlcisxLCBsZW4gKSkgewotCQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQkKLQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQlydiA9IHN0YXQgJiAweDFmOwotCi0gIHRoZV9lbmQ6Ci0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4oIHJ2ICk7Ci19Ci0KLQotI2lmIDAKLS8qIGN1cnJlbnRseSB1bnVzZWQgKi8KLXN0YXRpYyBpbnQgc2xtX21vZGVfc2VsZWN0KCBpbnQgZGV2aWNlLCBjaGFyICpidWZmZXIsIGludCBsZW4sCi0JCQkJCQkJaW50IGRlZmF1bHRfZmxhZyApCi0KLXsJaW50CQkJc3RhdCwgcnY7Ci0Jc3RydWN0IHNsbQkqc2lwID0gJnNsbV9pbmZvW2RldmljZV07Ci0JCi0Jc3RkbWFfbG9jayggTlVMTCwgTlVMTCApOwotCi0JQ01EU0VUX1RBUkdfTFVOKCBzbG1tc2VsZWN0X2NtZCwgc2lwLT50YXJnZXQsIHNpcC0+bHVuICk7Ci0Jc2xtbXNlbGVjdF9jbWRbNV0gPSBkZWZhdWx0X2ZsYWcgPyAweDgwIDogMDsKLQlpZiAoIWFjc2ljbWRfbm9kbWEoIHNsbW1zZWxlY3RfY21kLCAwICkpIHsKLQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJZ290byB0aGVfZW5kOwotCX0KLQotCWlmICghZGVmYXVsdF9mbGFnKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IGxlbjsKLQkJaWYgKCFhY3NpX2V4dGNtZCggJmMsIDEgKSkgewotCQkJcnYgPSBTTE1TVEFUX0FDU0lUTzsKLQkJCWdvdG8gdGhlX2VuZDsKLQkJfQotCQlpZiAoIWFjc2lfZXh0Y21kKCBidWZmZXIsIGxlbiApKSB7Ci0JCQlydiA9IFNMTVNUQVRfQUNTSVRPOwotCQkJZ290byB0aGVfZW5kOwotCQl9Ci0JfQotCQotCXN0YXQgPSBhY3NpX2dldHN0YXR1cygpOwotCXJ2ID0gKHN0YXQgPCAwID8gU0xNU1RBVF9BQ1NJVE8gOiBzdGF0KTsKLQotICB0aGVfZW5kOgotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcmV0dXJuKCBydiApOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGludCBzbG1fZ2V0X3BhZ2VzaXplKCBpbnQgZGV2aWNlLCBpbnQgKncsIGludCAqaCApCi0KLXsJY2hhcglidWZbMjU2XTsKLQlpbnQJCXN0YXQ7Ci0JCi0Jc3RhdCA9IHNsbV9tb2RlX3NlbnNlKCBkZXZpY2UsIGJ1ZiwgMCApOwotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQlpZiAoc3RhdCAhPSBTTE1TVEFUX09LKQotCQlyZXR1cm4oIC1FSU8gKTsKLQotCSp3ID0gKGJ1ZlszXSA8PCA4KSB8IGJ1Zls0XTsKLQkqaCA9IChidWZbMV0gPDwgOCkgfCBidWZbMl07Ci0JcmV0dXJuKCAwICk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJCUluaXRpYWxpemF0aW9uCQkJCQkJCSAgKi8KLQotCi1pbnQgYXR0YWNoX3NsbSggaW50IHRhcmdldCwgaW50IGx1biApCi0KLXsJc3RhdGljIGludAlkaWRfcmVnaXN0ZXI7Ci0JaW50CQkJbGVuOwotCi0JaWYgKE5fU0xNX1ByaW50ZXJzID49IE1BWF9TTE0pIHsKLQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIlRvbyBtdWNoIFNMTXNcbiIgKTsKLQkJcmV0dXJuKCAwICk7Ci0JfQotCQotCS8qIGRvIGFuIElOUVVJUlkgKi8KLQl1ZGVsYXkoMTAwKTsKLQlDTURTRVRfVEFSR19MVU4oIHNsbWlucXVpcnlfY21kLCB0YXJnZXQsIGx1biApOwotCWlmICghYWNzaWNtZF9ub2RtYSggc2xtaW5xdWlyeV9jbWQsIDAgKSkgewotCSAgaW5xX3RpbWVvdXQ6Ci0JCXByaW50ayggS0VSTl9FUlIgIlNMTSBpbnF1aXJ5IGNvbW1hbmQgdGltZWQgb3V0LlxuIiApOwotCSAgaW5xX2ZhaWw6Ci0JCWFjc2lfZW5kX2V4dHN0YXR1cygpOwotCQlyZXR1cm4oIDAgKTsKLQl9Ci0JLyogcmVhZCBzdGF0dXMgYW5kIGhlYWRlciBvZiByZXR1cm4gZGF0YSAqLwotCWlmICghYWNzaV9leHRzdGF0dXMoIFNMTUJ1ZmZlciwgNiApKQotCQlnb3RvIGlucV90aW1lb3V0OwotCi0JaWYgKFNMTUJ1ZmZlclsxXSAhPSAyKSB7IC8qIGRldmljZSB0eXBlID09IHByaW50ZXI/ICovCi0JCXByaW50ayggS0VSTl9FUlIgIlNMTSBpbnF1aXJ5IHJldHVybmVkIGRldmljZSB0eXBlICE9IHByaW50ZXJcbiIgKTsKLQkJZ290byBpbnFfZmFpbDsKLQl9Ci0JbGVuID0gU0xNQnVmZmVyWzVdOwotCQotCS8qIHJlYWQgaWQgc3RyaW5nICovCi0JaWYgKCFhY3NpX2V4dHN0YXR1cyggU0xNQnVmZmVyLCBsZW4gKSkKLQkJZ290byBpbnFfdGltZW91dDsKLQlhY3NpX2VuZF9leHRzdGF0dXMoKTsKLQlTTE1CdWZmZXJbbGVuXSA9IDA7Ci0KLQlpZiAoIWRpZF9yZWdpc3RlcikgewotCQlkaWRfcmVnaXN0ZXIgPSAxOwotCX0KLQotCXNsbV9pbmZvW05fU0xNX1ByaW50ZXJzXS50YXJnZXQgPSB0YXJnZXQ7Ci0Jc2xtX2luZm9bTl9TTE1fUHJpbnRlcnNdLmx1biAgICA9IGx1bjsKLQlhdG9taWNfc2V0KCZzbG1faW5mb1tOX1NMTV9QcmludGVyc10ud3Jfb2ssIDEgKTsgCi0JYXRvbWljX3NldCgmc2xtX2luZm9bTl9TTE1fUHJpbnRlcnNdLnJkX29rLCAxICk7Ci0JCi0JcHJpbnRrKCBLRVJOX0lORk8gIiAgUHJpbnRlcjogJXNcbiIsIFNMTUJ1ZmZlciApOwotCXByaW50ayggS0VSTl9JTkZPICJEZXRlY3RlZCBzbG0lZCBhdCBpZCAlZCBsdW4gJWRcbiIsCi0JCQlOX1NMTV9QcmludGVycywgdGFyZ2V0LCBsdW4gKTsKLQlOX1NMTV9QcmludGVycysrOwotCXJldHVybiggMSApOwotfQotCi1pbnQgc2xtX2luaXQoIHZvaWQgKQotCi17Ci0JaW50IGk7Ci0JaWYgKHJlZ2lzdGVyX2NocmRldiggQUNTSV9NQUpPUiwgInNsbSIsICZzbG1fZm9wcyApKSB7Ci0JCXByaW50ayggS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIEFDU0kgU0xNXG4iLCBBQ1NJX01BSk9SICk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCQotCWlmICghKFNMTUJ1ZmZlciA9IGF0YXJpX3N0cmFtX2FsbG9jKCBTTE1fQlVGRkVSX1NJWkUsICJTTE0iICkpKSB7Ci0JCXByaW50ayggS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgU0xNIFNULVJhbSBidWZmZXIuXG4iICk7Ci0JCXVucmVnaXN0ZXJfY2hyZGV2KCBBQ1NJX01BSk9SLCAic2xtIiApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JQnVmZmVyUCA9IFNMTUJ1ZmZlcjsKLQlTTE1TdGF0ZSA9IElETEU7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBNT0RVTEUKLQotLyogZnJvbSBhY3NpLmMgKi8KLXZvaWQgYWNzaV9hdHRhY2hfU0xNcyggaW50ICgqYXR0YWNoX2Z1bmMpKCBpbnQsIGludCApICk7Ci0KLWludCBpbml0X21vZHVsZSh2b2lkKQotewotCWludCBlcnI7Ci0KLQlpZiAoKGVyciA9IHNsbV9pbml0KCkpKQotCQlyZXR1cm4oIGVyciApOwotCS8qIFRoaXMgY2FsbHMgYXR0YWNoX3NsbSgpIGZvciBldmVyeSB0YXJnZXQvbHVuIHdoZXJlIGFjc2kuYyBkZXRlY3RlZCBhCi0JICogcHJpbnRlciAqLwotCWFjc2lfYXR0YWNoX1NMTXMoIGF0dGFjaF9zbG0gKTsKLQlyZXR1cm4oIDAgKTsKLX0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWlmICh1bnJlZ2lzdGVyX2NocmRldiggQUNTSV9NQUpPUiwgInNsbSIgKSAhPSAwKQotCQlwcmludGsoIEtFUk5fRVJSICJhY3NpX3NsbTogY2xlYW51cF9tb2R1bGUgZmFpbGVkXG4iKTsKLQlhdGFyaV9zdHJhbV9mcmVlKCBTTE1CdWZmZXIgKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5jIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCmluZGV4IDBmY2FkNDMuLmEyZDY2MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKQEAgLTExNzAsNyArMTE3MCw3IEBACiAJY2FzZSBTR19FTVVMQVRFRF9IT1NUOgogCWNhc2UgU0dfSU86CiAJY2FzZSBTQ1NJX0lPQ1RMX1NFTkRfQ09NTUFORDoKLQkJcmV0dXJuIHNjc2lfY21kX2lvY3RsKGZpbGVwLCBkaXNrLCBjbWQsIGFyZ3ApOworCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZXAsIGRpc2stPnF1ZXVlLCBkaXNrLCBjbWQsIGFyZ3ApOwogCiAJLyogc2NzaV9jbWRfaW9jdGwgd291bGQgbm9ybWFsbHkgaGFuZGxlIHRoZXNlLCBiZWxvdywgYnV0ICovCiAJLyogdGhleSBhcmVuJ3QgYSBnb29kIGZpdCBmb3IgY2Npc3MsIGFzIENELVJPTXMgYXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IDQ1MDMyOTAuLmU0MjVkYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC02OCw2ICs2OCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9vcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBpbnZhbGlkYXRlX2JkZXYoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KQEAgLTYwMCwxMyArNjAxLDYgQEAKIAlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gZGF0YTsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKLQkvKgotCSAqIGxvb3AgY2FuIGJlIHVzZWQgaW4gYW4gZW5jcnlwdGVkIGRldmljZSwKLQkgKiBoZW5jZSwgaXQgbXVzdG4ndCBiZSBzdG9wcGVkIGF0IGFsbAotCSAqIGJlY2F1c2UgaXQgY291bGQgYmUgaW5kaXJlY3RseSB1c2VkIGR1cmluZyBzdXNwZW5zaW9uCi0JICovCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBsby0+bG9fYmlvKSB7CkBAIC0xNTc0LDggKzE1NjgsNyBAQAogCQlsb29wX2RlbF9vbmUobG8pOwogCiAJYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKExPT1BfTUFKT1IsIDApLCByYW5nZSk7Ci0JaWYgKHVucmVnaXN0ZXJfYmxrZGV2KExPT1BfTUFKT1IsICJsb29wIikpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxvb3A6IGNhbm5vdCB1bnJlZ2lzdGVyIGJsa2RldlxuIik7CisJdW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKTsKIH0KIAogbW9kdWxlX2luaXQobG9vcF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbmJkLmMgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCmluZGV4IGM1NzVmYjEuLmMxMjk1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9uYmQuYwpAQCAtMTIyLDE3ICsxMjIsMTIgQEAKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBtc2doZHIgbXNnOwogCXN0cnVjdCBrdmVjIGlvdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNpZ3NldF90IG9sZHNldDsKKwlzaWdzZXRfdCBibG9ja2VkLCBvbGRzZXQ7CiAKIAkvKiBBbGxvdyBpbnRlcmNlcHRpb24gb2YgU0lHS0lMTCBvbmx5CiAJICogRG9uJ3QgYWxsb3cgb3RoZXIgc2lnbmFscyB0byBpbnRlcnJ1cHQgdGhlIHRyYW5zbWlzc2lvbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0Jb2xkc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKLQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsKLQlzaWdkZWxzZXRtYXNrKCZjdXJyZW50LT5ibG9ja2VkLCBzaWdtYXNrKFNJR0tJTEwpKTsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwlzaWdpbml0c2V0aW52KCZibG9ja2VkLCBzaWdtYXNrKFNJR0tJTEwpKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmJsb2NrZWQsICZvbGRzZXQpOwogCiAJZG8gewogCQlzb2NrLT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9OT0lPOwpAQCAtMTUxLDExICsxNDYsOSBAQAogCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJc2lnaW5mb190IGluZm87Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmJkIChwaWQgJWQ6ICVzKSBnb3Qgc2lnbmFsICVkXG4iLAotCQkJCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgCi0JCQkJZGVxdWV1ZV9zaWduYWwoY3VycmVudCwgJmN1cnJlbnQtPmJsb2NrZWQsICZpbmZvKSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLAorCQkJCWRlcXVldWVfc2lnbmFsX2xvY2soY3VycmVudCwgJmN1cnJlbnQtPmJsb2NrZWQsICZpbmZvKSk7CiAJCQlyZXN1bHQgPSAtRUlOVFI7CiAJCQlicmVhazsKIAkJfQpAQCAtMTY5LDEwICsxNjIsNyBAQAogCQlidWYgKz0gcmVzdWx0OwogCX0gd2hpbGUgKHNpemUgPiAwKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IG9sZHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwppbmRleCBjZTY0ZTg2Li4zMWJlMzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwpAQCAtMTU5Myw2ICsxNTkzLDcgQEAKIAlsb25nIG1pbl9zbGVlcF90aW1lLCByZXNpZHVlOwogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMjApOworCXNldF9mcmVlemFibGUoKTsKIAogCWZvciAoOzspIHsKIAkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CkBAIC0xNjUyLDkgKzE2NTMsNiBAQAogCQkJCX0KIAkJCX0KIAotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKLQkJCX0KIAkJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3VudmRjLmMgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWUzY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCkBAIC0wLDAgKzEsOTcyIEBACisvKiBzdW52ZGMuYzogU3VuIExET00gVmlydHVhbCBEaXNrIENsaWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBkYXZlbWxvZnQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS9sZGMuaD4KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJzdW52ZGMiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1biBMRE9NIHZpcnR1YWwgZGlzayBjbGllbnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOworCisjZGVmaW5lIFZEQ19UWF9SSU5HX1NJWkUJMjU2CisKKyNkZWZpbmUgV0FJVElOR19GT1JfTElOS19VUAkweDAxCisjZGVmaW5lIFdBSVRJTkdfRk9SX1RYX1NQQUNFCTB4MDIKKyNkZWZpbmUgV0FJVElOR19GT1JfR0VOX0NNRAkweDA0CisjZGVmaW5lIFdBSVRJTkdfRk9SX0FOWQkJLTEKKworc3RydWN0IHZkY19yZXFfZW50cnkgeworCXN0cnVjdCByZXF1ZXN0CQkqcmVxOworfTsKKworc3RydWN0IHZkY19wb3J0IHsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZQl2aW87CisKKwlzdHJ1Y3QgdmRjCQkqdnA7CisKKwlzdHJ1Y3QgZ2VuZGlzawkJKmRpc2s7CisKKwlzdHJ1Y3QgdmRjX2NvbXBsZXRpb24JKmNtcDsKKworCXU2NAkJCXJlcV9pZDsKKwl1NjQJCQlzZXE7CisJc3RydWN0IHZkY19yZXFfZW50cnkJcnFfYXJyW1ZEQ19UWF9SSU5HX1NJWkVdOworCisJdW5zaWduZWQgbG9uZwkJcmluZ19jb29raWVzOworCisJdTY0CQkJbWF4X3hmZXJfc2l6ZTsKKwl1MzIJCQl2ZGlza19ibG9ja19zaXplOworCisJLyogVGhlIHNlcnZlciBmaWxscyB0aGVzZSBpbiBmb3IgdXMgaW4gdGhlIGRpc2sgYXR0cmlidXRlCisJICogQUNLIHBhY2tldC4KKwkgKi8KKwl1NjQJCQlvcGVyYXRpb25zOworCXUzMgkJCXZkaXNrX3NpemU7CisJdTgJCQl2ZGlza190eXBlOworCXU4CQkJZGV2X25vOworCisJY2hhcgkJCWRpc2tfbmFtZVszMl07CisKKwlzdHJ1Y3QgdmlvX2Rpc2tfZ2VvbQlnZW9tOworCXN0cnVjdCB2aW9fZGlza192dG9jCWxhYmVsOworCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmRjX3BvcnQgKnRvX3ZkY19wb3J0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2aW8sIHN0cnVjdCB2ZGNfcG9ydCwgdmlvKTsKK30KKworc3RydWN0IHZkYyB7CisJLyogUHJvdGVjdHMgcHJvdF9saXN0LiAgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IHZpb19kZXYJCSpkZXY7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBvcnRfbGlzdDsKK307CisKKy8qIE9yZGVyZWQgZnJvbSBsYXJnZXN0IG1ham9yIHRvIGxvd2VzdCAqLworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiB2ZGNfdmVyc2lvbnNbXSA9IHsKKwl7IC5tYWpvciA9IDEsIC5taW5vciA9IDAgfSwKK307CisKKyNkZWZpbmUgVkRDQkxLX05BTUUJInZkaXNrIgorc3RhdGljIGludCB2ZGNfbWFqb3I7CisjZGVmaW5lIFBBUlRJVElPTl9TSElGVAkzCisKK3N0YXRpYyBpbmxpbmUgdTMyIHZkY190eF9kcmluZ19hdmFpbChzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlyZXR1cm4gdmlvX2RyaW5nX2F2YWlsKGRyLCBWRENfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIGludCB2ZGNfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisKKwlnZW8tPmhlYWRzID0gKHU4KSBwb3J0LT5nZW9tLm51bV9oZDsKKwlnZW8tPnNlY3RvcnMgPSAodTgpIHBvcnQtPmdlb20ubnVtX3NlYzsKKwlnZW8tPmN5bGluZGVycyA9IHBvcnQtPmdlb20ubnVtX2N5bDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIHZkY19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0Z2VvCQk9IHZkY19nZXRnZW8sCit9OworCitzdGF0aWMgdm9pZCB2ZGNfZmluaXNoKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIGludCBlcnIsIGludCB3YWl0aW5nX2ZvcikKK3sKKwlpZiAodmlvLT5jbXAgJiYKKwkgICAgKHdhaXRpbmdfZm9yID09IC0xIHx8CisJICAgICB2aW8tPmNtcC0+d2FpdGluZ19mb3IgPT0gd2FpdGluZ19mb3IpKSB7CisJCXZpby0+Y21wLT5lcnIgPSBlcnI7CisJCWNvbXBsZXRlKCZ2aW8tPmNtcC0+Y29tKTsKKwkJdmlvLT5jbXAgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdmRjX2hhbmRzaGFrZV9jb21wbGV0ZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKQoreworCXZkY19maW5pc2godmlvLCAwLCBXQUlUSU5HX0ZPUl9MSU5LX1VQKTsKK30KKworc3RhdGljIGludCB2ZGNfaGFuZGxlX3Vua25vd24oc3RydWN0IHZkY19wb3J0ICpwb3J0LCB2b2lkICphcmcpCit7CisJc3RydWN0IHZpb19tc2dfdGFnICpwa3QgPSBhcmc7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSZWNlaXZlZCB1bmtub3duIG1zZyBbJTAyeDolMDJ4OiUwNHg6JTA4eF1cbiIsCisJICAgICAgIHBrdC0+dHlwZSwgcGt0LT5zdHlwZSwgcGt0LT5zdHlwZV9lbnYsIHBrdC0+c2lkKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJSZXNldHRpbmcgY29ubmVjdGlvbi5cbiIpOworCisJbGRjX2Rpc2Nvbm5lY3QocG9ydC0+dmlvLmxwKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCB2ZGNfc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gdG9fdmRjX3BvcnQodmlvKTsKKwlzdHJ1Y3QgdmlvX2Rpc2tfYXR0cl9pbmZvIHBrdDsKKworCW1lbXNldCgmcGt0LCAwLCBzaXplb2YocGt0KSk7CisKKwlwa3QudGFnLnR5cGUgPSBWSU9fVFlQRV9DVFJMOworCXBrdC50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9JTkZPOworCXBrdC50YWcuc3R5cGVfZW52ID0gVklPX0FUVFJfSU5GTzsKKwlwa3QudGFnLnNpZCA9IHZpb19zZW5kX3NpZCh2aW8pOworCisJcGt0LnhmZXJfbW9kZSA9IFZJT19EUklOR19NT0RFOworCXBrdC52ZGlza19ibG9ja19zaXplID0gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZTsKKwlwa3QubWF4X3hmZXJfc2l6ZSA9IHBvcnQtPm1heF94ZmVyX3NpemU7CisKKwl2aW9kYmcoSFMsICJTRU5EIEFUVFIgeGZlcl9tb2RlWzB4JXhdIGJsa3N6WyV1XSBtYXhfeGZlclslbHVdXG4iLAorCSAgICAgICBwa3QueGZlcl9tb2RlLCBwa3QudmRpc2tfYmxvY2tfc2l6ZSwgcGt0Lm1heF94ZmVyX3NpemUpOworCisJcmV0dXJuIHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmcGt0LCBzaXplb2YocGt0KSk7Cit9CisKK3N0YXRpYyBpbnQgdmRjX2hhbmRsZV9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQgPSB0b192ZGNfcG9ydCh2aW8pOworCXN0cnVjdCB2aW9fZGlza19hdHRyX2luZm8gKnBrdCA9IGFyZzsKKworCXZpb2RiZyhIUywgIkdPVCBBVFRSIHN0eXBlWzB4JXhdIG9wc1slbHhdIGRpc2tfc2l6ZVslbHVdIGRpc2tfdHlwZVsleF0gIgorCSAgICAgICAieGZlcl9tb2RlWzB4JXhdIGJsa3N6WyV1XSBtYXhfeGZlclslbHVdXG4iLAorCSAgICAgICBwa3QtPnRhZy5zdHlwZSwgcGt0LT5vcGVyYXRpb25zLAorCSAgICAgICBwa3QtPnZkaXNrX3NpemUsIHBrdC0+dmRpc2tfdHlwZSwKKwkgICAgICAgcGt0LT54ZmVyX21vZGUsIHBrdC0+dmRpc2tfYmxvY2tfc2l6ZSwKKwkgICAgICAgcGt0LT5tYXhfeGZlcl9zaXplKTsKKworCWlmIChwa3QtPnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9BQ0spIHsKKwkJc3dpdGNoIChwa3QtPnZkaXNrX3R5cGUpIHsKKwkJY2FzZSBWRF9ESVNLX1RZUEVfRElTSzoKKwkJY2FzZSBWRF9ESVNLX1RZUEVfU0xJQ0U6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJvZ3VzIHZkaXNrX3R5cGUgMHgleFxuIiwKKwkJCSAgICAgICB2aW8tPm5hbWUsIHBrdC0+dmRpc2tfdHlwZSk7CisJCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisJCX0KKworCQlpZiAocGt0LT52ZGlza19ibG9ja19zaXplID4gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJMT0NLIHNpemUgaW5jcmVhc2VkICIKKwkJCSAgICAgICAiJXUgLS0+ICV1XG4iLAorCQkJICAgICAgIHZpby0+bmFtZSwKKwkJCSAgICAgICBwb3J0LT52ZGlza19ibG9ja19zaXplLCBwa3QtPnZkaXNrX2Jsb2NrX3NpemUpOworCQkJcmV0dXJuIC1FQ09OTlJFU0VUOworCQl9CisKKwkJcG9ydC0+b3BlcmF0aW9ucyA9IHBrdC0+b3BlcmF0aW9uczsKKwkJcG9ydC0+dmRpc2tfc2l6ZSA9IHBrdC0+dmRpc2tfc2l6ZTsKKwkJcG9ydC0+dmRpc2tfdHlwZSA9IHBrdC0+dmRpc2tfdHlwZTsKKwkJaWYgKHBrdC0+bWF4X3hmZXJfc2l6ZSA8IHBvcnQtPm1heF94ZmVyX3NpemUpCisJCQlwb3J0LT5tYXhfeGZlcl9zaXplID0gcGt0LT5tYXhfeGZlcl9zaXplOworCQlwb3J0LT52ZGlza19ibG9ja19zaXplID0gcGt0LT52ZGlza19ibG9ja19zaXplOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQXR0cmlidXRlIE5BQ0tcbiIsIHZpby0+bmFtZSk7CisKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCX0KK30KKworc3RhdGljIHZvaWQgdmRjX2VuZF9zcGVjaWFsKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgc3RydWN0IHZpb19kaXNrX2Rlc2MgKmRlc2MpCit7CisJaW50IGVyciA9IGRlc2MtPnN0YXR1czsKKworCXZkY19maW5pc2goJnBvcnQtPnZpbywgLWVyciwgV0FJVElOR19GT1JfR0VOX0NNRCk7Cit9CisKK3N0YXRpYyB2b2lkIHZkY19lbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgdXB0b2RhdGUsIGludCBudW1fc2VjdG9ycykKK3sKKwlpZiAoZW5kX3RoYXRfcmVxdWVzdF9maXJzdChyZXEsIHVwdG9kYXRlLCBudW1fc2VjdG9ycykpCisJCXJldHVybjsKKwlhZGRfZGlza19yYW5kb21uZXNzKHJlcS0+cnFfZGlzayk7CisJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJlcSwgdXB0b2RhdGUpOworfQorCitzdGF0aWMgdm9pZCB2ZGNfZW5kX29uZShzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkJdW5zaWduZWQgaW50IGluZGV4KQoreworCXN0cnVjdCB2aW9fZGlza19kZXNjICpkZXNjID0gdmlvX2RyaW5nX2VudHJ5KGRyLCBpbmRleCk7CisJc3RydWN0IHZkY19yZXFfZW50cnkgKnJxZSA9ICZwb3J0LT5ycV9hcnJbaW5kZXhdOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisKKwlpZiAodW5saWtlbHkoZGVzYy0+aGRyLnN0YXRlICE9IFZJT19ERVNDX0RPTkUpKQorCQlyZXR1cm47CisKKwlsZGNfdW5tYXAocG9ydC0+dmlvLmxwLCBkZXNjLT5jb29raWVzLCBkZXNjLT5uY29va2llcyk7CisJZGVzYy0+aGRyLnN0YXRlID0gVklPX0RFU0NfRlJFRTsKKwlkci0+Y29ucyA9IChpbmRleCArIDEpICYgKFZEQ19UWF9SSU5HX1NJWkUgLSAxKTsKKworCXJlcSA9IHJxZS0+cmVxOworCWlmIChyZXEgPT0gTlVMTCkgeworCQl2ZGNfZW5kX3NwZWNpYWwocG9ydCwgZGVzYyk7CisJCXJldHVybjsKKwl9CisKKwlycWUtPnJlcSA9IE5VTEw7CisKKwl2ZGNfZW5kX3JlcXVlc3QocmVxLCAhZGVzYy0+c3RhdHVzLCBkZXNjLT5zaXplID4+IDkpOworCisJaWYgKGJsa19xdWV1ZV9zdG9wcGVkKHBvcnQtPmRpc2stPnF1ZXVlKSkKKwkJYmxrX3N0YXJ0X3F1ZXVlKHBvcnQtPmRpc2stPnF1ZXVlKTsKK30KKworc3RhdGljIGludCB2ZGNfYWNrKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgKnBrdCA9IG1zZ2J1ZjsKKworCWlmICh1bmxpa2VseShwa3QtPmRyaW5nX2lkZW50ICE9IGRyLT5pZGVudCB8fAorCQkgICAgIHBrdC0+c3RhcnRfaWR4ICE9IHBrdC0+ZW5kX2lkeCB8fAorCQkgICAgIHBrdC0+c3RhcnRfaWR4ID49IFZEQ19UWF9SSU5HX1NJWkUpKQorCQlyZXR1cm4gMDsKKworCXZkY19lbmRfb25lKHBvcnQsIGRyLCBwa3QtPnN0YXJ0X2lkeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZGNfbmFjayhzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwkvKiBYWFggSW1wbGVtZW50IG1lIFhYWCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZGNfZXZlbnQodm9pZCAqYXJnLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHZkY19wb3J0ICpwb3J0ID0gYXJnOworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAmcG9ydC0+dmlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseShldmVudCA9PSBMRENfRVZFTlRfUkVTRVQgfHwKKwkJICAgICBldmVudCA9PSBMRENfRVZFTlRfVVApKSB7CisJCXZpb19saW5rX3N0YXRlX2NoYW5nZSh2aW8sIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodW5saWtlbHkoZXZlbnQgIT0gTERDX0VWRU5UX0RBVEFfUkVBRFkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJVbmV4cGVjdGVkIExEQyBldmVudCAlZFxuIiwgZXZlbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IDA7CisJd2hpbGUgKDEpIHsKKwkJdW5pb24geworCQkJc3RydWN0IHZpb19tc2dfdGFnIHRhZzsKKwkJCXU2NCByYXdbOF07CisJCX0gbXNnYnVmOworCisJCWVyciA9IGxkY19yZWFkKHZpby0+bHAsICZtc2didWYsIHNpemVvZihtc2didWYpKTsKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJCXZpb19jb25uX3Jlc2V0KHZpbyk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyID09IDApCisJCQlicmVhazsKKwkJdmlvZGJnKERBVEEsICJUQUcgWyUwMng6JTAyeDolMDR4OiUwOHhdXG4iLAorCQkgICAgICAgbXNnYnVmLnRhZy50eXBlLAorCQkgICAgICAgbXNnYnVmLnRhZy5zdHlwZSwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc3R5cGVfZW52LAorCQkgICAgICAgbXNnYnVmLnRhZy5zaWQpOworCQllcnIgPSB2aW9fdmFsaWRhdGVfc2lkKHZpbywgJm1zZ2J1Zi50YWcpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCisJCWlmIChsaWtlbHkobXNnYnVmLnRhZy50eXBlID09IFZJT19UWVBFX0RBVEEpKSB7CisJCQlpZiAobXNnYnVmLnRhZy5zdHlwZSA9PSBWSU9fU1VCVFlQRV9BQ0spCisJCQkJZXJyID0gdmRjX2Fjayhwb3J0LCAmbXNnYnVmKTsKKwkJCWVsc2UgaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfTkFDSykKKwkJCQllcnIgPSB2ZGNfbmFjayhwb3J0LCAmbXNnYnVmKTsKKwkJCWVsc2UKKwkJCQllcnIgPSB2ZGNfaGFuZGxlX3Vua25vd24ocG9ydCwgJm1zZ2J1Zik7CisJCX0gZWxzZSBpZiAobXNnYnVmLnRhZy50eXBlID09IFZJT19UWVBFX0NUUkwpIHsKKwkJCWVyciA9IHZpb19jb250cm9sX3BrdF9lbmdpbmUodmlvLCAmbXNnYnVmKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IHZkY19oYW5kbGVfdW5rbm93bihwb3J0LCAmbXNnYnVmKTsKKwkJfQorCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyIDwgMCkKKwkJdmRjX2ZpbmlzaCgmcG9ydC0+dmlvLCBlcnIsIFdBSVRJTkdfRk9SX0FOWSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX192ZGNfdHhfdHJpZ2dlcihzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSBoZHIgPSB7CisJCS50YWcgPSB7CisJCQkudHlwZQkJPSBWSU9fVFlQRV9EQVRBLAorCQkJLnN0eXBlCQk9IFZJT19TVUJUWVBFX0lORk8sCisJCQkuc3R5cGVfZW52CT0gVklPX0RSSU5HX0RBVEEsCisJCQkuc2lkCQk9IHZpb19zZW5kX3NpZCgmcG9ydC0+dmlvKSwKKwkJfSwKKwkJLmRyaW5nX2lkZW50CQk9IGRyLT5pZGVudCwKKwkJLnN0YXJ0X2lkeAkJPSBkci0+cHJvZCwKKwkJLmVuZF9pZHgJCT0gZHItPnByb2QsCisJfTsKKwlpbnQgZXJyLCBkZWxheTsKKworCWhkci5zZXEgPSBkci0+c25kX254dDsKKwlkZWxheSA9IDE7CisJZG8geworCQllcnIgPSB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJmhkciwgc2l6ZW9mKGhkcikpOworCQlpZiAoZXJyID4gMCkgeworCQkJZHItPnNuZF9ueHQrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheShkZWxheSk7CisJCWlmICgoZGVsYXkgPDw9IDEpID4gMTI4KQorCQkJZGVsYXkgPSAxMjg7CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX3NlbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbcG9ydC0+cmluZ19jb29raWVzXTsKKwlzdHJ1Y3QgdmRjX3JlcV9lbnRyeSAqcnFlOworCXN0cnVjdCB2aW9fZGlza19kZXNjICpkZXNjOworCXVuc2lnbmVkIGludCBtYXBfcGVybTsKKwlpbnQgbnNnLCBlcnIsIGk7CisJdTY0IGxlbjsKKwl1OCBvcDsKKworCW1hcF9wZXJtID0gTERDX01BUF9TSEFET1cgfCBMRENfTUFQX0RJUkVDVCB8IExEQ19NQVBfSU87CisKKwlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CisJCW1hcF9wZXJtIHw9IExEQ19NQVBfVzsKKwkJb3AgPSBWRF9PUF9CUkVBRDsKKwl9IGVsc2UgeworCQltYXBfcGVybSB8PSBMRENfTUFQX1I7CisJCW9wID0gVkRfT1BfQldSSVRFOworCX0KKworCW5zZyA9IGJsa19ycV9tYXBfc2cocmVxLT5xLCByZXEsIHNnKTsKKworCWxlbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5zZzsgaSsrKQorCQlsZW4gKz0gc2dbaV0ubGVuZ3RoOworCisJaWYgKHVubGlrZWx5KHZkY190eF9kcmluZ19hdmFpbChkcikgPCAxKSkgeworCQlibGtfc3RvcF9xdWV1ZShwb3J0LT5kaXNrLT5xdWV1ZSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWRlc2MgPSB2aW9fZHJpbmdfY3VyKGRyKTsKKworCWVyciA9IGxkY19tYXBfc2cocG9ydC0+dmlvLmxwLCBzZywgbnNnLAorCQkJIGRlc2MtPmNvb2tpZXMsIHBvcnQtPnJpbmdfY29va2llcywKKwkJCSBtYXBfcGVybSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibGRjX21hcF9zZygpIGZhaWx1cmUsIGVycj0lZC5cbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcnFlID0gJnBvcnQtPnJxX2Fycltkci0+cHJvZF07CisJcnFlLT5yZXEgPSByZXE7CisKKwlkZXNjLT5oZHIuYWNrID0gVklPX0FDS19FTkFCTEU7CisJZGVzYy0+cmVxX2lkID0gcG9ydC0+cmVxX2lkOworCWRlc2MtPm9wZXJhdGlvbiA9IG9wOworCWlmIChwb3J0LT52ZGlza190eXBlID09IFZEX0RJU0tfVFlQRV9ESVNLKSB7CisJCWRlc2MtPnNsaWNlID0gMjsKKwl9IGVsc2UgeworCQlkZXNjLT5zbGljZSA9IDA7CisJfQorCWRlc2MtPnN0YXR1cyA9IH4wOworCWRlc2MtPm9mZnNldCA9IChyZXEtPnNlY3RvciA8PCA5KSAvIHBvcnQtPnZkaXNrX2Jsb2NrX3NpemU7CisJZGVzYy0+c2l6ZSA9IGxlbjsKKwlkZXNjLT5uY29va2llcyA9IGVycjsKKworCS8qIFRoaXMgaGFzIHRvIGJlIGEgbm9uLVNNUCB3cml0ZSBiYXJyaWVyIGJlY2F1c2Ugd2UgYXJlIHdyaXRpbmcKKwkgKiB0byBtZW1vcnkgd2hpY2ggaXMgc2hhcmVkIHdpdGggdGhlIHBlZXIgTERPTS4KKwkgKi8KKwl3bWIoKTsKKwlkZXNjLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19SRUFEWTsKKworCWVyciA9IF9fdmRjX3R4X3RyaWdnZXIocG9ydCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidmRjX3R4X3RyaWdnZXIoKSBmYWlsdXJlLCBlcnI9JWRcbiIsIGVycik7CisJfSBlbHNlIHsKKwkJcG9ydC0+cmVxX2lkKys7CisJCWRyLT5wcm9kID0gKGRyLT5wcm9kICsgMSkgJiAoVkRDX1RYX1JJTkdfU0laRSAtIDEpOworCX0KK291dDoKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3ZkY19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSkKK3sKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gZWx2X25leHRfcmVxdWVzdChxKTsKKworCQlpZiAoIXJlcSkKKwkJCWJyZWFrOworCisJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKKwkJaWYgKF9fc2VuZF9yZXF1ZXN0KHJlcSkgPCAwKQorCQkJdmRjX2VuZF9yZXF1ZXN0KHJlcSwgMCwgcmVxLT5oYXJkX25yX3NlY3RvcnMpOworCX0KK30KKworc3RhdGljIGludCBnZW5lcmljX3JlcXVlc3Qoc3RydWN0IHZkY19wb3J0ICpwb3J0LCB1OCBvcCwgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCXN0cnVjdCB2aW9fY29tcGxldGlvbiBjb21wOworCXN0cnVjdCB2aW9fZGlza19kZXNjICpkZXNjOworCXVuc2lnbmVkIGludCBtYXBfcGVybTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvcF9sZW4sIGVycjsKKwl2b2lkICpyZXFfYnVmOworCisJaWYgKCEoKCh1NjQpMSA8PCAoKHU2NClvcCAtIDEpKSAmIHBvcnQtPm9wZXJhdGlvbnMpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBWRF9PUF9CUkVBRDoKKwljYXNlIFZEX09QX0JXUklURToKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgVkRfT1BfRkxVU0g6CisJCW9wX2xlbiA9IDA7CisJCW1hcF9wZXJtID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX0dFVF9XQ0U6CisJCW9wX2xlbiA9IHNpemVvZih1MzIpOworCQltYXBfcGVybSA9IExEQ19NQVBfVzsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX1NFVF9XQ0U6CisJCW9wX2xlbiA9IHNpemVvZih1MzIpOworCQltYXBfcGVybSA9IExEQ19NQVBfUjsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX0dFVF9WVE9DOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX3Z0b2MpOworCQltYXBfcGVybSA9IExEQ19NQVBfVzsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX1NFVF9WVE9DOgorCQlvcF9sZW4gPSBzaXplb2Yoc3RydWN0IHZpb19kaXNrX3Z0b2MpOworCQltYXBfcGVybSA9IExEQ19NQVBfUjsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX0dFVF9ESVNLR0VPTToKKwkJb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza19nZW9tKTsKKwkJbWFwX3Blcm0gPSBMRENfTUFQX1c7CisJCWJyZWFrOworCisJY2FzZSBWRF9PUF9TRVRfRElTS0dFT006CisJCW9wX2xlbiA9IHNpemVvZihzdHJ1Y3QgdmlvX2Rpc2tfZ2VvbSk7CisJCW1hcF9wZXJtID0gTERDX01BUF9SOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfU0NTSUNNRDoKKwkJb3BfbGVuID0gMTY7CisJCW1hcF9wZXJtID0gTERDX01BUF9SVzsKKwkJYnJlYWs7CisKKwljYXNlIFZEX09QX0dFVF9ERVZJRDoKKwkJb3BfbGVuID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza19kZXZpZCk7CisJCW1hcF9wZXJtID0gTERDX01BUF9XOworCQlicmVhazsKKworCWNhc2UgVkRfT1BfR0VUX0VGSToKKwljYXNlIFZEX09QX1NFVF9FRkk6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfTsKKworCW1hcF9wZXJtIHw9IExEQ19NQVBfU0hBRE9XIHwgTERDX01BUF9ESVJFQ1QgfCBMRENfTUFQX0lPOworCisJb3BfbGVuID0gKG9wX2xlbiArIDcpICYgfjc7CisJcmVxX2J1ZiA9IGt6YWxsb2Mob3BfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcV9idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGxlbiA+IG9wX2xlbikKKwkJbGVuID0gb3BfbGVuOworCisJaWYgKG1hcF9wZXJtICYgTERDX01BUF9SKQorCQltZW1jcHkocmVxX2J1ZiwgYnVmLCBsZW4pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisKKwlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwkvKiBYWFggSWYgd2Ugd2FudCB0byB1c2UgdGhpcyBjb2RlIGdlbmVyaWNhbGx5IHdlIGhhdmUgdG8KKwkgKiBYWFggaGFuZGxlIFRYIHJpbmcgZXhoYXVzdGlvbiBldGMuCisJICovCisJZGVzYyA9IHZpb19kcmluZ19jdXIoZHIpOworCisJZXJyID0gbGRjX21hcF9zaW5nbGUocG9ydC0+dmlvLmxwLCByZXFfYnVmLCBvcF9sZW4sCisJCQkgICAgIGRlc2MtPmNvb2tpZXMsIHBvcnQtPnJpbmdfY29va2llcywKKwkJCSAgICAgbWFwX3Blcm0pOworCWlmIChlcnIgPCAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisJCWtmcmVlKHJlcV9idWYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWluaXRfY29tcGxldGlvbigmY29tcC5jb20pOworCWNvbXAud2FpdGluZ19mb3IgPSBXQUlUSU5HX0ZPUl9HRU5fQ01EOworCXBvcnQtPnZpby5jbXAgPSAmY29tcDsKKworCWRlc2MtPmhkci5hY2sgPSBWSU9fQUNLX0VOQUJMRTsKKwlkZXNjLT5yZXFfaWQgPSBwb3J0LT5yZXFfaWQ7CisJZGVzYy0+b3BlcmF0aW9uID0gb3A7CisJZGVzYy0+c2xpY2UgPSAwOworCWRlc2MtPnN0YXR1cyA9IH4wOworCWRlc2MtPm9mZnNldCA9IDA7CisJZGVzYy0+c2l6ZSA9IG9wX2xlbjsKKwlkZXNjLT5uY29va2llcyA9IGVycjsKKworCS8qIFRoaXMgaGFzIHRvIGJlIGEgbm9uLVNNUCB3cml0ZSBiYXJyaWVyIGJlY2F1c2Ugd2UgYXJlIHdyaXRpbmcKKwkgKiB0byBtZW1vcnkgd2hpY2ggaXMgc2hhcmVkIHdpdGggdGhlIHBlZXIgTERPTS4KKwkgKi8KKwl3bWIoKTsKKwlkZXNjLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19SRUFEWTsKKworCWVyciA9IF9fdmRjX3R4X3RyaWdnZXIocG9ydCk7CisJaWYgKGVyciA+PSAwKSB7CisJCXBvcnQtPnJlcV9pZCsrOworCQlkci0+cHJvZCA9IChkci0+cHJvZCArIDEpICYgKFZEQ19UWF9SSU5HX1NJWkUgLSAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wLmNvbSk7CisJCWVyciA9IGNvbXAuZXJyOworCX0gZWxzZSB7CisJCXBvcnQtPnZpby5jbXAgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCX0KKworCWlmIChtYXBfcGVybSAmIExEQ19NQVBfVykKKwkJbWVtY3B5KGJ1ZiwgcmVxX2J1ZiwgbGVuKTsKKworCWtmcmVlKHJlcV9idWYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdmRjX2FsbG9jX3R4X3Jpbmcoc3RydWN0IHZkY19wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwl1bnNpZ25lZCBsb25nIGxlbiwgZW50cnlfc2l6ZTsKKwlpbnQgbmNvb2tpZXM7CisJdm9pZCAqZHJpbmc7CisKKwllbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2aW9fZGlza19kZXNjKSArCisJCShzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpICogcG9ydC0+cmluZ19jb29raWVzKTsKKwlsZW4gPSAoVkRDX1RYX1JJTkdfU0laRSAqIGVudHJ5X3NpemUpOworCisJbmNvb2tpZXMgPSBWSU9fTUFYX1JJTkdfQ09PS0lFUzsKKwlkcmluZyA9IGxkY19hbGxvY19leHBfZHJpbmcocG9ydC0+dmlvLmxwLCBsZW4sCisJCQkJICAgIGRyLT5jb29raWVzLCAmbmNvb2tpZXMsCisJCQkJICAgIChMRENfTUFQX1NIQURPVyB8CisJCQkJICAgICBMRENfTUFQX0RJUkVDVCB8CisJCQkJICAgICBMRENfTUFQX1JXKSk7CisJaWYgKElTX0VSUihkcmluZykpCisJCXJldHVybiBQVFJfRVJSKGRyaW5nKTsKKworCWRyLT5iYXNlID0gZHJpbmc7CisJZHItPmVudHJ5X3NpemUgPSBlbnRyeV9zaXplOworCWRyLT5udW1fZW50cmllcyA9IFZEQ19UWF9SSU5HX1NJWkU7CisJZHItPnByb2QgPSBkci0+Y29ucyA9IDA7CisJZHItPnBlbmRpbmcgPSBWRENfVFhfUklOR19TSVpFOworCWRyLT5uY29va2llcyA9IG5jb29raWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkY19mcmVlX3R4X3Jpbmcoc3RydWN0IHZkY19wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKworCWlmIChkci0+YmFzZSkgeworCQlsZGNfZnJlZV9leHBfZHJpbmcocG9ydC0+dmlvLmxwLCBkci0+YmFzZSwKKwkJCQkgICAoZHItPmVudHJ5X3NpemUgKiBkci0+bnVtX2VudHJpZXMpLAorCQkJCSAgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCQlkci0+YmFzZSA9IE5VTEw7CisJCWRyLT5lbnRyeV9zaXplID0gMDsKKwkJZHItPm51bV9lbnRyaWVzID0gMDsKKwkJZHItPnBlbmRpbmcgPSAwOworCQlkci0+bmNvb2tpZXMgPSAwOworCX0KK30KKworc3RhdGljIGludCBwcm9iZV9kaXNrKHN0cnVjdCB2ZGNfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdmlvX2NvbXBsZXRpb24gY29tcDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZzsKKwlpbnQgZXJyOworCisJaW5pdF9jb21wbGV0aW9uKCZjb21wLmNvbSk7CisJY29tcC5lcnIgPSAwOworCWNvbXAud2FpdGluZ19mb3IgPSBXQUlUSU5HX0ZPUl9MSU5LX1VQOworCXBvcnQtPnZpby5jbXAgPSAmY29tcDsKKworCXZpb19wb3J0X3VwKCZwb3J0LT52aW8pOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcC5jb20pOworCWlmIChjb21wLmVycikKKwkJcmV0dXJuIGNvbXAuZXJyOworCisJZXJyID0gZ2VuZXJpY19yZXF1ZXN0KHBvcnQsIFZEX09QX0dFVF9WVE9DLAorCQkJICAgICAgJnBvcnQtPmxhYmVsLCBzaXplb2YocG9ydC0+bGFiZWwpKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJWRF9PUF9HRVRfVlRPQyByZXR1cm5zIGVycm9yICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGdlbmVyaWNfcmVxdWVzdChwb3J0LCBWRF9PUF9HRVRfRElTS0dFT00sCisJCQkgICAgICAmcG9ydC0+Z2VvbSwgc2l6ZW9mKHBvcnQtPmdlb20pKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJWRF9PUF9HRVRfRElTS0dFT00gcmV0dXJucyAiCisJCSAgICAgICAiZXJyb3IgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcG9ydC0+dmRpc2tfc2l6ZSA9ICgodTY0KXBvcnQtPmdlb20ubnVtX2N5bCAqCisJCQkgICAgKHU2NClwb3J0LT5nZW9tLm51bV9oZCAqCisJCQkgICAgKHU2NClwb3J0LT5nZW9tLm51bV9zZWMpOworCisJcSA9IGJsa19pbml0X3F1ZXVlKGRvX3ZkY19yZXF1ZXN0LCAmcG9ydC0+dmlvLmxvY2spOworCWlmICghcSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQ291bGQgbm90IGFsbG9jYXRlIHF1ZXVlLlxuIiwKKwkJICAgICAgIHBvcnQtPnZpby5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWcgPSBhbGxvY19kaXNrKDEgPDwgUEFSVElUSU9OX1NISUZUKTsKKwlpZiAoIWcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBnZW5kaXNrLlxuIiwKKwkJICAgICAgIHBvcnQtPnZpby5uYW1lKTsKKwkJYmxrX2NsZWFudXBfcXVldWUocSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBvcnQtPmRpc2sgPSBnOworCisJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhxLCBwb3J0LT5yaW5nX2Nvb2tpZXMpOworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxLCBwb3J0LT5yaW5nX2Nvb2tpZXMpOworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBwb3J0LT5tYXhfeGZlcl9zaXplKTsKKwlnLT5tYWpvciA9IHZkY19tYWpvcjsKKwlnLT5maXJzdF9taW5vciA9IHBvcnQtPmRldl9ubyA8PCBQQVJUSVRJT05fU0hJRlQ7CisJc3RyY3B5KGctPmRpc2tfbmFtZSwgcG9ydC0+ZGlza19uYW1lKTsKKworCWctPmZvcHMgPSAmdmRjX2ZvcHM7CisJZy0+cXVldWUgPSBxOworCWctPnByaXZhdGVfZGF0YSA9IHBvcnQ7CisJZy0+ZHJpdmVyZnNfZGV2ID0gJnBvcnQtPnZpby52ZGV2LT5kZXY7CisKKwlzZXRfY2FwYWNpdHkoZywgcG9ydC0+dmRpc2tfc2l6ZSk7CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6ICV1IHNlY3RvcnMgKCV1IE1CKVxuIiwKKwkgICAgICAgZy0+ZGlza19uYW1lLAorCSAgICAgICBwb3J0LT52ZGlza19zaXplLCAocG9ydC0+dmRpc2tfc2l6ZSA+PiAoMjAgLSA5KSkpOworCisJYWRkX2Rpc2soZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgdmRjX2xkY19jZmcgPSB7CisJLmV2ZW50CQk9IHZkY19ldmVudCwKKwkubXR1CQk9IDY0LAorCS5tb2RlCQk9IExEQ19NT0RFX1VOUkVMSUFCTEUsCit9OworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXJfb3BzIHZkY192aW9fb3BzID0geworCS5zZW5kX2F0dHIJCT0gdmRjX3NlbmRfYXR0ciwKKwkuaGFuZGxlX2F0dHIJCT0gdmRjX2hhbmRsZV9hdHRyLAorCS5oYW5kc2hha2VfY29tcGxldGUJPSB2ZGNfaGFuZHNoYWtlX2NvbXBsZXRlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdmRjX3BvcnRfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbWRlc2NfaGFuZGxlICpocDsKKwlzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdmRjICp2cDsKKwljb25zdCB1NjQgKnBvcnRfaWQ7CisJaW50IGVycjsKKworCXZwID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPmRldi5wYXJlbnQpOworCWlmICghdnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgcG9ydCBwYXJlbnQgdmRjLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhwID0gbWRlc2NfZ3JhYigpOworCisJcG9ydF9pZCA9IG1kZXNjX2dldF9wcm9wZXJ0eShocCwgdmRldi0+bXAsICJpZCIsIE5VTEwpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFwb3J0X2lkKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlBvcnQgbGFja3MgaWQgcHJvcGVydHkuXG4iKTsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2VfbWRlc2M7CisJfQorCWlmICgoKnBvcnRfaWQgPDwgUEFSVElUSU9OX1NISUZUKSAmIH4odTY0KU1JTk9STUFTSykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJQb3J0IGlkIFslbHVdIHRvbyBsYXJnZS5cbiIsICpwb3J0X2lkKTsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2VfbWRlc2M7CisJfQorCisJcG9ydCA9IGt6YWxsb2Moc2l6ZW9mKCpwb3J0KSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXBvcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIHZkY19wb3J0LlxuIik7CisJCWdvdG8gZXJyX291dF9yZWxlYXNlX21kZXNjOworCX0KKworCXBvcnQtPnZwID0gdnA7CisJcG9ydC0+ZGV2X25vID0gKnBvcnRfaWQ7CisKKwlpZiAocG9ydC0+ZGV2X25vID49IDI2KQorCQlzbnByaW50Zihwb3J0LT5kaXNrX25hbWUsIHNpemVvZihwb3J0LT5kaXNrX25hbWUpLAorCQkJIFZEQ0JMS19OQU1FICIlYyVjIiwKKwkJCSAnYScgKyAocG9ydC0+ZGV2X25vIC8gMjYpIC0gMSwKKwkJCSAnYScgKyAocG9ydC0+ZGV2X25vICUgMjYpKTsKKwllbHNlCisJCXNucHJpbnRmKHBvcnQtPmRpc2tfbmFtZSwgc2l6ZW9mKHBvcnQtPmRpc2tfbmFtZSksCisJCQkgVkRDQkxLX05BTUUgIiVjIiwgJ2EnICsgKHBvcnQtPmRldl9ubyAlIDI2KSk7CisKKwllcnIgPSB2aW9fZHJpdmVyX2luaXQoJnBvcnQtPnZpbywgdmRldiwgVkRFVl9ESVNLLAorCQkJICAgICAgdmRjX3ZlcnNpb25zLCBBUlJBWV9TSVpFKHZkY192ZXJzaW9ucyksCisJCQkgICAgICAmdmRjX3Zpb19vcHMsIHBvcnQtPmRpc2tfbmFtZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcG9ydDsKKworCXBvcnQtPnZkaXNrX2Jsb2NrX3NpemUgPSA1MTI7CisJcG9ydC0+bWF4X3hmZXJfc2l6ZSA9ICgoMTI4ICogMTAyNCkgLyBwb3J0LT52ZGlza19ibG9ja19zaXplKTsKKwlwb3J0LT5yaW5nX2Nvb2tpZXMgPSAoKHBvcnQtPm1heF94ZmVyX3NpemUgKgorCQkJICAgICAgIHBvcnQtPnZkaXNrX2Jsb2NrX3NpemUpIC8gUEFHRV9TSVpFKSArIDI7CisKKwllcnIgPSB2aW9fbGRjX2FsbG9jKCZwb3J0LT52aW8sICZ2ZGNfbGRjX2NmZywgcG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcG9ydDsKKworCWVyciA9IHZkY19hbGxvY190eF9yaW5nKHBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX2xkYzsKKworCWVyciA9IHByb2JlX2Rpc2socG9ydCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfdHhfcmluZzsKKworCUlOSVRfTElTVF9IRUFEKCZwb3J0LT5saXN0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZwb3J0LT5saXN0LCAmdnAtPnBvcnRfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2LCBwb3J0KTsKKworCW1kZXNjX3JlbGVhc2UoaHApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV90eF9yaW5nOgorCXZkY19mcmVlX3R4X3JpbmcocG9ydCk7CisKK2Vycl9vdXRfZnJlZV9sZGM6CisJdmlvX2xkY19mcmVlKCZwb3J0LT52aW8pOworCitlcnJfb3V0X2ZyZWVfcG9ydDoKKwlrZnJlZShwb3J0KTsKKworZXJyX291dF9yZWxlYXNlX21kZXNjOgorCW1kZXNjX3JlbGVhc2UoaHApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmRjX3BvcnRfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXN0cnVjdCB2ZGNfcG9ydCAqcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCWlmIChwb3J0KSB7CisJCWRlbF90aW1lcl9zeW5jKCZwb3J0LT52aW8udGltZXIpOworCisJCXZkY19mcmVlX3R4X3JpbmcocG9ydCk7CisJCXZpb19sZGNfZnJlZSgmcG9ydC0+dmlvKTsKKworCQlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgTlVMTCk7CisKKwkJa2ZyZWUocG9ydCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmRjX3BvcnRfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gInZkYy1wb3J0IiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2ZGNfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgdmRjX3BvcnRfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHZkY19wb3J0X21hdGNoLAorCS5wcm9iZQkJPSB2ZGNfcG9ydF9wcm9iZSwKKwkucmVtb3ZlCQk9IHZkY19wb3J0X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidmRjX3BvcnQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZGNfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBpbnQgdmRjX3ZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgdmRjICp2cDsKKworCWlmICh2ZGNfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCXZwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZkYyksIEdGUF9LRVJORUwpOworCWlmICghdnApCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnZwLT5sb2NrKTsKKwl2cC0+ZGV2ID0gdmRldjsKKwlJTklUX0xJU1RfSEVBRCgmdnAtPnBvcnRfbGlzdCk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgdnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRjX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKworCXN0cnVjdCB2ZGMgKnZwID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHZwKSB7CisJCWtmcmVlKHZwKTsKKwkJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZkY19tYXRjaFtdID0geworCXsKKwkJLnR5cGUgPSAiYmxvY2siLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZkY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciB2ZGNfZHJpdmVyID0geworCS5pZF90YWJsZQk9IHZkY19tYXRjaCwKKwkucHJvYmUJCT0gdmRjX3Byb2JlLAorCS5yZW1vdmUJCT0gdmRjX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAidmRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgdmRjX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnaXN0ZXJfYmxrZGV2KDAsIFZEQ0JMS19OQU1FKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJdmRjX21ham9yID0gZXJyOworCWVyciA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZkY19kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfYmxrZGV2OworCisJZXJyID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmdmRjX3BvcnRfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3ZkYzsKKworCXJldHVybiAwOworCitvdXRfdW5yZWdpc3Rlcl92ZGM6CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfZHJpdmVyKTsKKworb3V0X3VucmVnaXN0ZXJfYmxrZGV2OgorCXVucmVnaXN0ZXJfYmxrZGV2KHZkY19tYWpvciwgVkRDQkxLX05BTUUpOworCXZkY19tYWpvciA9IDA7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZkY19leGl0KHZvaWQpCit7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZGNfcG9ydF9kcml2ZXIpOworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdmRjX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9ibGtkZXYodmRjX21ham9yLCBWRENCTEtfTkFNRSk7Cit9CisKK21vZHVsZV9pbml0KHZkY19pbml0KTsKK21vZHVsZV9leGl0KHZkY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCAxOGM4YjZjLi44YjEzZDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC0xNzA5LDcgKzE3MDksNyBAQAogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKIAl2b2lkIF9fdXNlciAqdXNlcm1lbSA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CiAKLQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzaywgY21kLCB1c2VybWVtKTsKKwlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzay0+cXVldWUsIGRpc2ssIGNtZCwgdXNlcm1lbSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3VtZW0uYyBiL2RyaXZlcnMvYmxvY2svdW1lbS5jCmluZGV4IDZmNWQ2MjAuLmRlYzc0YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdW1lbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svdW1lbS5jCkBAIC0xMDUsMTIgKzEwNSw2IEBACiAJdW5zaWduZWQgbG9uZwljc3JfYmFzZTsKIAl1bnNpZ25lZCBjaGFyCV9faW9tZW0gKmNzcl9yZW1hcDsKIAl1bnNpZ25lZCBsb25nCWNzcl9sZW47Ci0jaWZkZWYgQ09ORklHX01NX01BUF9NRU1PUlkKLQl1bnNpZ25lZCBsb25nCW1lbV9iYXNlOwotCXVuc2lnbmVkIGNoYXIJX19pb21lbSAqbWVtX3JlbWFwOwotCXVuc2lnbmVkIGxvbmcJbWVtX2xlbjsKLSNlbmRpZgotCiAJdW5zaWduZWQgaW50CXdpbl9zaXplOyAvKiBQQ0kgd2luZG93IHNpemUgKi8KIAl1bnNpZ25lZCBpbnQJbW1fc2l6ZTsgIC8qIHNpemUgaW4ga2J5dGVzICovCiAKQEAgLTg3MiwxMCArODY2LDYgQEAKIAogCWNhcmQtPmNzcl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCk7CiAJY2FyZC0+Y3NyX2xlbiAgPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgMCk7Ci0jaWZkZWYgQ09ORklHX01NX01BUF9NRU1PUlkKLQljYXJkLT5tZW1fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDEpOwotCWNhcmQtPm1lbV9sZW4gID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIDEpOwotI2VuZGlmCiAKIAlwcmludGsoS0VSTl9JTkZPICJNaWNybyBNZW1vcnkodG0pIGNvbnRyb2xsZXIgIyVkIGZvdW5kIGF0ICUwMng6JTAyeCAoUENJIE1lbSBNb2R1bGUgKEJhdHRlcnkgQmFja3VwKSlcbiIsCiAJICAgICAgIGNhcmQtPmNhcmRfbnVtYmVyLCBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKQEAgLTkwMywyNyArODkzLDYgQEAKIAlwcmludGsoS0VSTl9JTkZPICJNTSVkOiBDU1IgMHglMDhseCAtPiAweCVwICgweCVseClcbiIsIGNhcmQtPmNhcmRfbnVtYmVyLAogCSAgICAgICBjYXJkLT5jc3JfYmFzZSwgY2FyZC0+Y3NyX3JlbWFwLCBjYXJkLT5jc3JfbGVuKTsKIAotI2lmZGVmIENPTkZJR19NTV9NQVBfTUVNT1JZCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+bWVtX2Jhc2UsIGNhcmQtPm1lbV9sZW4sICJNaWNybyBNZW1vcnkiKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1NJWQ6IFVuYWJsZSB0byByZXF1ZXN0IG1lbW9yeSByZWdpb25cbiIsIGNhcmQtPmNhcmRfbnVtYmVyKTsKLQkJcmV0ID0gLUVOT01FTTsKLQotCQlnb3RvIGZhaWxlZF9yZXFfbWVtOwotCX0KLQotCWlmICghKGNhcmQtPm1lbV9yZW1hcCA9IGlvcmVtYXAoY2FyZC0+bWVtX2Jhc2UsIGNhcmRzLT5tZW1fbGVuKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNTSVkOiBVbmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvblxuIiwgY2FyZC0+Y2FyZF9udW1iZXIpOwotCQlyZXQgPSAtRU5PTUVNOwotCi0JCWdvdG8gZmFpbGVkX3JlbWFwX21lbTsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJNTSVkOiBNRU0gMHglOGx4IC0+IDB4JThseCAoMHglbHgpXG4iLCBjYXJkLT5jYXJkX251bWJlciwKLQkgICAgICAgY2FyZC0+bWVtX2Jhc2UsIGNhcmQtPm1lbV9yZW1hcCwgY2FyZC0+bWVtX2xlbik7Ci0jZWxzZQotCXByaW50ayhLRVJOX0lORk8gIk1NJWQ6IE1FTSBhcmVhIG5vdCByZW1hcHBlZCAoQ09ORklHX01NX01BUF9NRU1PUlkgbm90IHNldClcbiIsCi0JICAgICAgIGNhcmQtPmNhcmRfbnVtYmVyKTsKLSNlbmRpZgogCXN3aXRjaChjYXJkLT5kZXYtPmRldmljZSkgewogCWNhc2UgMHg1NDE1OgogCQljYXJkLT5mbGFncyB8PSBVTV9GTEFHX05PX0JZVEVfU1RBVFVTIHwgVU1fRkxBR19OT19CQVRUUkVHOwpAQCAtMTA5MSwxMiArMTA2MCw2IEBACiAJCQkJICAgIGNhcmQtPm1tX3BhZ2VzWzFdLmRlc2MsCiAJCQkJICAgIGNhcmQtPm1tX3BhZ2VzWzFdLnBhZ2VfZG1hKTsKICBmYWlsZWRfbWFnaWM6Ci0jaWZkZWYgQ09ORklHX01NX01BUF9NRU1PUlkKLQlpb3VubWFwKGNhcmQtPm1lbV9yZW1hcCk7Ci0gZmFpbGVkX3JlbWFwX21lbToKLQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+bWVtX2Jhc2UsIGNhcmQtPm1lbV9sZW4pOwotIGZhaWxlZF9yZXFfbWVtOgotI2VuZGlmCiAJaW91bm1hcChjYXJkLT5jc3JfcmVtYXApOwogIGZhaWxlZF9yZW1hcF9jc3I6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmNzcl9iYXNlLCBjYXJkLT5jc3JfbGVuKTsKQEAgLTExMTYsMTAgKzEwNzksNiBAQAogCXRhc2tsZXRfa2lsbCgmY2FyZC0+dGFza2xldCk7CiAJaW91bm1hcChjYXJkLT5jc3JfcmVtYXApOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5jc3JfYmFzZSwgY2FyZC0+Y3NyX2xlbik7Ci0jaWZkZWYgQ09ORklHX01NX01BUF9NRU1PUlkKLQlpb3VubWFwKGNhcmQtPm1lbV9yZW1hcCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPm1lbV9iYXNlLCBjYXJkLT5tZW1fbGVuKTsKLSNlbmRpZgogCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CiAKIAlpZiAoY2FyZC0+bW1fcGFnZXNbMF0uZGVzYykKQEAgLTExMzMsMjMgKzEwOTIsMTggQEAKIAlibGtfY2xlYW51cF9xdWV1ZShjYXJkLT5xdWV1ZSk7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtbV9wY2lfaWRzW10gPSB7IHsKLQkudmVuZG9yID0JUENJX1ZFTkRPUl9JRF9NSUNST19NRU1PUlksCi0JLmRldmljZSA9CVBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzU0MTVDTiwKLQl9LCB7Ci0JLnZlbmRvciA9CVBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLAotCS5kZXZpY2UgPQlQQ0lfREVWSUNFX0lEX01JQ1JPX01FTU9SWV81NDI1Q04sCi0JfSwgewotCS52ZW5kb3IgPQlQQ0lfVkVORE9SX0lEX01JQ1JPX01FTU9SWSwKLQkuZGV2aWNlID0JUENJX0RFVklDRV9JRF9NSUNST19NRU1PUllfNjE1NSwKLQl9LCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbW1fcGNpX2lkc1tdID0geworICAgIHtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLFBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzU0MTVDTil9LAorICAgIHtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLFBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzU0MjVDTil9LAorICAgIHtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUlDUk9fTUVNT1JZLFBDSV9ERVZJQ0VfSURfTUlDUk9fTUVNT1JZXzYxNTUpfSwKKyAgICB7CiAJLnZlbmRvcgk9CTB4ODA4NiwKIAkuZGV2aWNlCT0JMHhCNTU1LAogCS5zdWJ2ZW5kb3I9CTB4MTMzMiwKIAkuc3ViZGV2aWNlPQkweDU0NjAsCiAJLmNsYXNzCT0JMHgwNTAwMDAsCiAJLmNsYXNzX21hc2s9CTAsCi0JfSwgeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorICAgIH0sIHsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtbV9wY2lfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdmlvZGFzZC5jIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKaW5kZXggNjg1OTJjMy4uZGFlMzk5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKKysrIGIvZHJpdmVycy9ibG9jay92aW9kYXNkLmMKQEAgLTI1MiwxMCArMjUyLDEwIEBACiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOwogCXN0cnVjdCB2aW9kYXNkX2RldmljZSAqZCA9IGRpc2stPnByaXZhdGVfZGF0YTsKIAotCWdlby0+c2VjdG9ycyA9IGQtPnNlY3RvcnMgPyBkLT5zZWN0b3JzIDogMDsKKwlnZW8tPnNlY3RvcnMgPSBkLT5zZWN0b3JzID8gZC0+c2VjdG9ycyA6IDMyOwogCWdlby0+aGVhZHMgPSBkLT50cmFja3MgPyBkLT50cmFja3MgIDogNjQ7CiAJZ2VvLT5jeWxpbmRlcnMgPSBkLT5jeWxpbmRlcnMgPyBkLT5jeWxpbmRlcnMgOgotCQlnZXRfY2FwYWNpdHkoZGlzaykgLyAoZ2VvLT5jeWxpbmRlcnMgKiBnZW8tPmhlYWRzKTsKKwkJZ2V0X2NhcGFjaXR5KGRpc2spIC8gKGdlby0+c2VjdG9ycyAqIGdlby0+aGVhZHMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYyBiL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMmVjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Jsb2NrL3hzeXNhY2UuYwpAQCAtMCwwICsxLDExNjQgQEAKKy8qCisgKiBYaWxpbnggU3lzdGVtQUNFIGRldmljZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogVGhlIFN5c3RlbUFDRSBjaGlwIGlzIGRlc2lnbmVkIHRvIGNvbmZpZ3VyZSBGUEdBcyBieSBsb2FkaW5nIGFuIEZQR0EKKyAqIGJpdHN0cmVhbSBmcm9tIGEgZmlsZSBvbiBhIENGIGNhcmQgYW5kIHNxdWlydGluZyBpdCBpbnRvIEZQR0FzIGNvbm5lY3RlZAorICogdG8gdGhlIFN5c3RlbUFDRSBKVEFHIGNoYWluLiAgSXQgYWxzbyBoYXMgdGhlIGFkdmFudGFnZSBvZiBwcm92aWRpbmcgYW4KKyAqIE1QVSBpbnRlcmZhY2Ugd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgRlBHQSBjb25maWd1cmF0aW9uIHByb2Nlc3MKKyAqIGFuZCB0byB1c2UgdGhlIGF0dGFjaGVkIENGIGNhcmQgZm9yIGdlbmVyYWwgcHVycG9zZSBzdG9yYWdlLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGEgYmxvY2sgZGV2aWNlIGRyaXZlciBmb3IgdGhlIFN5c3RlbUFDRS4KKyAqCisgKiBJbml0aWFsaXphdGlvbjoKKyAqICAgIFRoZSBkcml2ZXIgcmVnaXN0ZXJzIGl0c2VsZiBhcyBhIHBsYXRmb3JtX2RldmljZSBkcml2ZXIgYXQgbW9kdWxlCisgKiAgICBsb2FkIHRpbWUuICBUaGUgcGxhdGZvcm0gYnVzIHdpbGwgdGFrZSBjYXJlIG9mIGNhbGxpbmcgdGhlCisgKiAgICBhY2VfcHJvYmUoKSBtZXRob2QgZm9yIGFsbCBTeXN0ZW1BQ0UgaW5zdGFuY2VzIGluIHRoZSBzeXN0ZW0uICBBbnkKKyAqICAgIG51bWJlciBvZiBTeXN0ZW1BQ0UgaW5zdGFuY2VzIGFyZSBzdXBwb3J0ZWQuICBhY2VfcHJvYmUoKSBjYWxscworICogICAgYWNlX3NldHVwKCkgd2hpY2ggaW5pdGlhbGl6ZWQgYWxsIGRhdGEgc3RydWN0dXJlcywgcmVhZHMgdGhlIENGCisgKiAgICBpZCBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdGVycyB0aGUgZGV2aWNlLgorICoKKyAqIFByb2Nlc3Npbmc6CisgKiAgICBKdXN0IGFib3V0IGFsbCBvZiB0aGUgaGVhdnkgbGlmdGluZyBpbiB0aGlzIGRyaXZlciBpcyBwZXJmb3JtZWQgYnkKKyAqICAgIGEgRmluaXRlIFN0YXRlIE1hY2hpbmUgKEZTTSkuICBUaGUgZHJpdmVyIG5lZWRzIHRvIHdhaXQgb24gYSBudW1iZXIKKyAqICAgIG9mIGV2ZW50czsgc29tZSByYWlzZWQgYnkgaW50ZXJydXB0cywgc29tZSB3aGljaCBuZWVkIHRvIGJlIHBvbGxlZAorICogICAgZm9yLiAgRGVzY3JpYmluZyBhbGwgb2YgdGhlIGJlaGF2aW91ciBpbiBhIEZTTSBzZWVtcyB0byBiZSB0aGUKKyAqICAgIGVhc2llc3Qgd2F5IHRvIGtlZXAgdGhlIGNvbXBsZXhpdHkgbG93IGFuZCBtYWtlIGl0IGVhc3kgdG8KKyAqICAgIHVuZGVyc3RhbmQgd2hhdCB0aGUgZHJpdmVyIGlzIGRvaW5nLiAgSWYgdGhlIGJsb2NrIG9wcyBvciB0aGUKKyAqICAgIHJlcXVlc3QgZnVuY3Rpb24gbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBoYXJkd2FyZSwgdGhlbiB0aGV5CisgKiAgICBzaW1wbHkgbmVlZCB0byBmbGFnIHRoZSByZXF1ZXN0IGFuZCBraWNrIG9mIEZTTSBwcm9jZXNzaW5nLgorICoKKyAqICAgIFRoZSBGU00gaXRzZWxmIGlzIGF0b21pYy1zYWZlIGNvZGUgd2hpY2ggY2FuIGJlIHJ1biBmcm9tIGFueQorICogICAgY29udGV4dC4gIFRoZSBnZW5lcmFsIHByb2Nlc3MgZmxvdyBpczoKKyAqICAgIDEuIG9idGFpbiB0aGUgYWNlLT5sb2NrIHNwaW5sb2NrLgorICogICAgMi4gbG9vcCBvbiBhY2VfZnNtX2Rvc3RhdGUoKSB1bnRpbCB0aGUgYWNlLT5mc21fY29udGludWUgZmxhZyBpcworICogICAgICAgY2xlYXJlZC4KKyAqICAgIDMuIHJlbGVhc2UgdGhlIGxvY2suCisgKgorICogICAgSW5kaXZpZHVhbCBzdGF0ZXMgZG8gbm90IHNsZWVwIGluIGFueSB3YXkuICBJZiBhIGNvbmRpdGlvbiBuZWVkcyB0bworICogICAgYmUgd2FpdGVkIGZvciB0aGVuIHRoZSBzdGF0ZSBtdWNoIGNsZWFyIHRoZSBmc21fY29udGludWUgZmxhZyBhbmQKKyAqICAgIGVpdGhlciBzY2hlZHVsZSB0aGUgRlNNIHRvIGJlIHJ1biBhZ2FpbiBhdCBhIGxhdGVyIHRpbWUsIG9yIGV4cGVjdAorICogICAgYW4gaW50ZXJydXB0IHRvIGNhbGwgdGhlIEZTTSB3aGVuIHRoZSBkZXNpcmVkIGNvbmRpdGlvbiBpcyBtZXQuCisgKgorICogICAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhlIEZTTSBpcyBwcm9jZXNzZWQgYXQgaW50ZXJydXB0IGNvbnRleHQKKyAqICAgIGVpdGhlciB3aGVuIHRoZSBkcml2ZXIncyB0YXNrbGV0IGlzIHNjaGVkdWxlZCwgb3Igd2hlbiBhbiBpcnEgaXMKKyAqICAgIHJhaXNlZCBieSB0aGUgaGFyZHdhcmUuICBUaGUgdGFza2xldCBjYW4gYmUgc2NoZWR1bGVkIGF0IGFueSB0aW1lLgorICogICAgVGhlIHJlcXVlc3QgbWV0aG9kIGluIHBhcnRpY3VsYXIgc2NoZWR1bGVzIHRoZSB0YXNrbGV0IHdoZW4gYSBuZXcKKyAqICAgIHJlcXVlc3QgaGFzIGJlZW4gaW5kaWNhdGVkIGJ5IHRoZSBibG9jayBsYXllci4gIE9uY2Ugc3RhcnRlZCwgdGhlCisgKiAgICBGU00gcHJvY2VlZHMgYXMgZmFyIGFzIGl0IGNhbiBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IHVudGlsIGl0CisgKiAgICBuZWVkcyBvbiBhIGhhcmR3YXJlIGV2ZW50LiAgQXQgdGhpcyBwb2ludCwgaXQgbXVzdCB5aWVsZCBleGVjdXRpb24uCisgKgorICogICAgQSBzdGF0ZSBoYXMgdHdvIG9wdGlvbnMgd2hlbiB5aWVsZGluZyBleGVjdXRpb246CisgKiAgICAxLiBhY2VfZnNtX3lpZWxkKCkKKyAqICAgICAgIC0gQ2FsbCBpZiBuZWVkIHRvIHBvbGwgZm9yIGV2ZW50LgorICogICAgICAgLSBjbGVhcnMgdGhlIGZzbV9jb250aW51ZSBmbGFnIHRvIGV4aXQgdGhlIHByb2Nlc3NpbmcgbG9vcAorICogICAgICAgLSByZXNjaGVkdWxlcyB0aGUgdGFza2xldCB0byBydW4gYWdhaW4gYXMgc29vbiBhcyBwb3NzaWJsZQorICogICAgMi4gYWNlX2ZzbV95aWVsZGlycSgpCisgKiAgICAgICAtIENhbGwgaWYgYW4gaXJxIGlzIGV4cGVjdGVkIGZyb20gdGhlIEhXCisgKiAgICAgICAtIGNsZWFycyB0aGUgZnNtX2NvbnRpbnVlIGZsYWcgdG8gZXhpdCB0aGUgcHJvY2Vzc2luZyBsb29wCisgKiAgICAgICAtIGRvZXMgbm90IHJlc2NoZWR1bGUgdGhlIHRhc2tsZXQgc28gdGhlIEZTTSB3aWxsIG5vdCBiZSBwcm9jZXNzZWQKKyAqICAgICAgICAgYWdhaW4gdW50aWwgYW4gaXJxIGlzIHJlY2VpdmVkLgorICogICAgQWZ0ZXIgY2FsbGluZyBhIHlpZWxkIGZ1bmN0aW9uLCB0aGUgc3RhdGUgbXVzdCByZXR1cm4gY29udHJvbCBiYWNrCisgKiAgICB0byB0aGUgRlNNIG1haW4gbG9vcC4KKyAqCisgKiAgICBBZGRpdGlvbmFsbHksIHRoZSBkcml2ZXIgbWFpbnRhaW5zIGEga2VybmVsIHRpbWVyIHdoaWNoIGNhbiBwcm9jZXNzCisgKiAgICB0aGUgRlNNLiAgSWYgdGhlIEZTTSBnZXRzIHN0YWxsZWQsIHR5cGljYWxseSBkdWUgdG8gYSBtaXNzZWQKKyAqICAgIGludGVycnVwdCwgdGhlbiB0aGUga2VybmVsIHRpbWVyIHdpbGwgZXhwaXJlIGFuZCB0aGUgZHJpdmVyIGNhbgorICogICAgY29udGludWUgd2hlcmUgaXQgbGVmdCBvZmYuCisgKgorICogVG8gRG86CisgKiAgICAtIEFkZCBGUEdBIGNvbmZpZ3VyYXRpb24gY29udHJvbCBpbnRlcmZhY2UuCisgKiAgICAtIFJlcXVlc3QgbWFqb3IgbnVtYmVyIGZyb20gbGFuYW5hCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK01PRFVMRV9BVVRIT1IoIkdyYW50IExpa2VseSA8Z3JhbnQubGlrZWx5QHNlY3JldGxhYi5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFN5c3RlbUFDRSBkZXZpY2UgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFN5c3RlbUFDRSByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBBQ0VfQlVTTU9ERSAoMHgwMCkKKworI2RlZmluZSBBQ0VfU1RBVFVTICgweDA0KQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGR0xPQ0sgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgQUNFX1NUQVRVU19NUFVMT0NLICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHRVJST1IgICAgICgweDAwMDAwMDA0KQkvKiBjb25maWcgY29udHJvbGxlciBlcnJvciAqLworI2RlZmluZSBBQ0VfU1RBVFVTX0NGQ0VSUk9SICAgICAoMHgwMDAwMDAwOCkJLyogQ0YgY29udHJvbGxlciBlcnJvciAqLworI2RlZmluZSBBQ0VfU1RBVFVTX0NGREVURUNUICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19EQVRBQlVGUkRZICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIEFDRV9TVEFUVVNfREFUQUJVRk1PREUgICgweDAwMDAwMDQwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGR0RPTkUgICAgICAoMHgwMDAwMDA4MCkKKyNkZWZpbmUgQUNFX1NUQVRVU19SRFlGT1JDRkNNRCAgKDB4MDAwMDAxMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZHTU9ERVBJTiAgICgweDAwMDAwMjAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGR0FERFJfTUFTSyAoMHgwMDAwZTAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkJTWSAgICAgICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZSRFkgICAgICAgICgweDAwMDQwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGRFdGICAgICAgICAoMHgwMDA4MDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkRTQyAgICAgICAgKDB4MDAxMDAwMDApCisjZGVmaW5lIEFDRV9TVEFUVVNfQ0ZEUlEgICAgICAgICgweDAwMjAwMDAwKQorI2RlZmluZSBBQ0VfU1RBVFVTX0NGQ09SUiAgICAgICAoMHgwMDQwMDAwMCkKKyNkZWZpbmUgQUNFX1NUQVRVU19DRkVSUiAgICAgICAgKDB4MDA4MDAwMDApCisKKyNkZWZpbmUgQUNFX0VSUk9SICgweDA4KQorI2RlZmluZSBBQ0VfQ0ZHTEJBICgweDBjKQorI2RlZmluZSBBQ0VfTVBVTEJBICgweDEwKQorCisjZGVmaW5lIEFDRV9TRUNDTlRDTUQgKDB4MTQpCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfUkVTRVQgICAgICAoMHgwMTAwKQorI2RlZmluZSBBQ0VfU0VDQ05UQ01EX0lERU5USUZZICAgKDB4MDIwMCkKKyNkZWZpbmUgQUNFX1NFQ0NOVENNRF9SRUFEX0RBVEEgICgweDAzMDApCisjZGVmaW5lIEFDRV9TRUNDTlRDTURfV1JJVEVfREFUQSAoMHgwNDAwKQorI2RlZmluZSBBQ0VfU0VDQ05UQ01EX0FCT1JUICAgICAgKDB4MDYwMCkKKworI2RlZmluZSBBQ0VfVkVSU0lPTiAoMHgxNikKKyNkZWZpbmUgQUNFX1ZFUlNJT05fUkVWSVNJT05fTUFTSyAoMHgwMEZGKQorI2RlZmluZSBBQ0VfVkVSU0lPTl9NSU5PUl9NQVNLICAgICgweDBGMDApCisjZGVmaW5lIEFDRV9WRVJTSU9OX01BSk9SX01BU0sgICAgKDB4RjAwMCkKKworI2RlZmluZSBBQ0VfQ1RSTCAoMHgxOCkKKyNkZWZpbmUgQUNFX0NUUkxfRk9SQ0VMT0NLUkVRICAgKDB4MDAwMSkKKyNkZWZpbmUgQUNFX0NUUkxfTE9DS1JFUSAgICAgICAgKDB4MDAwMikKKyNkZWZpbmUgQUNFX0NUUkxfRk9SQ0VDRkdBRERSICAgKDB4MDAwNCkKKyNkZWZpbmUgQUNFX0NUUkxfRk9SQ0VDRkdNT0RFICAgKDB4MDAwOCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHTU9ERSAgICAgICAgKDB4MDAxMCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHU1RBUlQgICAgICAgKDB4MDAyMCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHU0VMICAgICAgICAgKDB4MDA0MCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHUkVTRVQgICAgICAgKDB4MDA4MCkKKyNkZWZpbmUgQUNFX0NUUkxfREFUQUJVRlJEWUlSUSAgKDB4MDEwMCkKKyNkZWZpbmUgQUNFX0NUUkxfRVJST1JJUlEgICAgICAgKDB4MDIwMCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHRE9ORUlSUSAgICAgKDB4MDQwMCkKKyNkZWZpbmUgQUNFX0NUUkxfUkVTRVRJUlEgICAgICAgKDB4MDgwMCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHUFJPRyAgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgQUNFX0NUUkxfQ0ZHQUREUl9NQVNLICAgKDB4ZTAwMCkKKworI2RlZmluZSBBQ0VfRkFUU1RBVCAoMHgxYykKKworI2RlZmluZSBBQ0VfTlVNX01JTk9SUyAxNgorI2RlZmluZSBBQ0VfU0VDVE9SX1NJWkUgKDUxMikKKyNkZWZpbmUgQUNFX0ZJRk9fU0laRSAoMzIpCisjZGVmaW5lIEFDRV9CVUZfUEVSX1NFQ1RPUiAoQUNFX1NFQ1RPUl9TSVpFIC8gQUNFX0ZJRk9fU0laRSkKKworc3RydWN0IGFjZV9yZWdfb3BzOworCitzdHJ1Y3QgYWNlX2RldmljZSB7CisJLyogZHJpdmVyIHN0YXRlIGRhdGEgKi8KKwlpbnQgaWQ7CisJaW50IG1lZGlhX2NoYW5nZTsKKwlpbnQgdXNlcnM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLyogZmluaXRlIHN0YXRlIG1hY2hpbmUgZGF0YSAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBmc21fdGFza2xldDsKKwl1aW50IGZzbV90YXNrOwkJLyogQ3VycmVudCBhY3Rpdml0eSAoQUNFX1RBU0tfKikgKi8KKwl1aW50IGZzbV9zdGF0ZTsJCS8qIEN1cnJlbnQgc3RhdGUgKEFDRV9GU01fU1RBVEVfKikgKi8KKwl1aW50IGZzbV9jb250aW51ZV9mbGFnOwkvKiBjbGVhcmVkIHRvIGV4aXQgRlNNIG1haW5sb29wICovCisJdWludCBmc21faXRlcl9udW07CisJc3RydWN0IHRpbWVyX2xpc3Qgc3RhbGxfdGltZXI7CisKKwkvKiBUcmFuc2ZlciBzdGF0ZS9yZXN1bHQsIHVzZSBmb3IgYm90aCBpZCBhbmQgYmxvY2sgcmVxdWVzdCAqLworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CS8qIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkICovCisJdm9pZCAqZGF0YV9wdHI7CQkvKiBwb2ludGVyIHRvIEkvTyBidWZmZXIgKi8KKwlpbnQgZGF0YV9jb3VudDsJCS8qIG51bWJlciBvZiBidWZmZXJzIHJlbWFpbmluZyAqLworCWludCBkYXRhX3Jlc3VsdDsJLyogUmVzdWx0IG9mIHRyYW5zZmVyOyAwIDo9IHN1Y2Nlc3MgKi8KKworCWludCBpZF9yZXFfY291bnQ7CS8qIGNvdW50IG9mIGlkIHJlcXVlc3RzICovCisJaW50IGlkX3Jlc3VsdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBpZF9jb21wbGV0aW9uOwkvKiB1c2VkIHdoZW4gaWQgcmVxIGZpbmlzaGVzICovCisJaW50IGluX2lycTsKKworCS8qIERldGFpbHMgb2YgaGFyZHdhcmUgZGV2aWNlICovCisJdW5zaWduZWQgbG9uZyBwaHlzYWRkcjsKKwl2b2lkICpiYXNlYWRkcjsKKwlpbnQgaXJxOworCWludCBidXNfd2lkdGg7CQkvKiAwIDo9IDggYml0OyAxIDo9IDE2IGJpdCAqLworCXN0cnVjdCBhY2VfcmVnX29wcyAqcmVnX29wczsKKwlpbnQgbG9ja19jb3VudDsKKworCS8qIEJsb2NrIGRldmljZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CisKKwkvKiBJbnNlcnRlZCBDRiBjYXJkIHBhcmFtZXRlcnMgKi8KKwlzdHJ1Y3QgaGRfZHJpdmVpZCBjZl9pZDsKK307CisKK3N0YXRpYyBpbnQgYWNlX21ham9yOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvdyBsZXZlbCByZWdpc3RlciBhY2Nlc3MKKyAqLworCitzdHJ1Y3QgYWNlX3JlZ19vcHMgeworCXUxNigqaW4pIChzdHJ1Y3QgYWNlX2RldmljZSAqIGFjZSwgaW50IHJlZyk7CisJdm9pZCAoKm91dCkgKHN0cnVjdCBhY2VfZGV2aWNlICogYWNlLCBpbnQgcmVnLCB1MTYgdmFsKTsKKwl2b2lkICgqZGF0YWluKSAoc3RydWN0IGFjZV9kZXZpY2UgKiBhY2UpOworCXZvaWQgKCpkYXRhb3V0KSAoc3RydWN0IGFjZV9kZXZpY2UgKiBhY2UpOworfTsKKworLyogOCBCaXQgYnVzIHdpZHRoICovCitzdGF0aWMgdTE2IGFjZV9pbl84KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcpCit7CisJdm9pZCAqciA9IGFjZS0+YmFzZWFkZHIgKyByZWc7CisJcmV0dXJuIGluXzgocikgfCAoaW5fOChyICsgMSkgPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9vdXRfOChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXZvaWQgKnIgPSBhY2UtPmJhc2VhZGRyICsgcmVnOworCW91dF84KHIsIHZhbCk7CisJb3V0XzgociArIDEsIHZhbCA+PiA4KTsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFpbl84KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJdm9pZCAqciA9IGFjZS0+YmFzZWFkZHIgKyAweDQwOworCXU4ICpkc3QgPSBhY2UtPmRhdGFfcHRyOworCWludCBpID0gQUNFX0ZJRk9fU0laRTsKKwl3aGlsZSAoaS0tKQorCQkqZHN0KysgPSBpbl84KHIrKyk7CisJYWNlLT5kYXRhX3B0ciA9IGRzdDsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFvdXRfOChzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCXZvaWQgKnIgPSBhY2UtPmJhc2VhZGRyICsgMHg0MDsKKwl1OCAqc3JjID0gYWNlLT5kYXRhX3B0cjsKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkU7CisJd2hpbGUgKGktLSkKKwkJb3V0XzgocisrLCAqc3JjKyspOworCWFjZS0+ZGF0YV9wdHIgPSBzcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNlX3JlZ19vcHMgYWNlX3JlZ184X29wcyA9IHsKKwkuaW4gPSBhY2VfaW5fOCwKKwkub3V0ID0gYWNlX291dF84LAorCS5kYXRhaW4gPSBhY2VfZGF0YWluXzgsCisJLmRhdGFvdXQgPSBhY2VfZGF0YW91dF84LAorfTsKKworLyogMTYgYml0IGJpZyBlbmRpYW4gYnVzIGF0dGFjaG1lbnQgKi8KK3N0YXRpYyB1MTYgYWNlX2luX2JlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZykKK3sKKwlyZXR1cm4gaW5fYmUxNihhY2UtPmJhc2VhZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgYWNlX291dF9iZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcsIHUxNiB2YWwpCit7CisJb3V0X2JlMTYoYWNlLT5iYXNlYWRkciArIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFpbl9iZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaW50IGkgPSBBQ0VfRklGT19TSVpFIC8gMjsKKwl1MTYgKmRzdCA9IGFjZS0+ZGF0YV9wdHI7CisJd2hpbGUgKGktLSkKKwkJKmRzdCsrID0gaW5fbGUxNihhY2UtPmJhc2VhZGRyICsgMHg0MCk7CisJYWNlLT5kYXRhX3B0ciA9IGRzdDsKK30KKworc3RhdGljIHZvaWQgYWNlX2RhdGFvdXRfYmUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWludCBpID0gQUNFX0ZJRk9fU0laRSAvIDI7CisJdTE2ICpzcmMgPSBhY2UtPmRhdGFfcHRyOworCXdoaWxlIChpLS0pCisJCW91dF9sZTE2KGFjZS0+YmFzZWFkZHIgKyAweDQwLCAqc3JjKyspOworCWFjZS0+ZGF0YV9wdHIgPSBzcmM7Cit9CisKKy8qIDE2IGJpdCBsaXR0bGUgZW5kaWFuIGJ1cyBhdHRhY2htZW50ICovCitzdGF0aWMgdTE2IGFjZV9pbl9sZTE2KHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcpCit7CisJcmV0dXJuIGluX2xlMTYoYWNlLT5iYXNlYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9vdXRfbGUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCW91dF9sZTE2KGFjZS0+YmFzZWFkZHIgKyByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9kYXRhaW5fbGUxNihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCWludCBpID0gQUNFX0ZJRk9fU0laRSAvIDI7CisJdTE2ICpkc3QgPSBhY2UtPmRhdGFfcHRyOworCXdoaWxlIChpLS0pCisJCSpkc3QrKyA9IGluX2JlMTYoYWNlLT5iYXNlYWRkciArIDB4NDApOworCWFjZS0+ZGF0YV9wdHIgPSBkc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9kYXRhb3V0X2xlMTYoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSkKK3sKKwlpbnQgaSA9IEFDRV9GSUZPX1NJWkUgLyAyOworCXUxNiAqc3JjID0gYWNlLT5kYXRhX3B0cjsKKwl3aGlsZSAoaS0tKQorCQlvdXRfYmUxNihhY2UtPmJhc2VhZGRyICsgMHg0MCwgKnNyYysrKTsKKwlhY2UtPmRhdGFfcHRyID0gc3JjOworfQorCitzdGF0aWMgc3RydWN0IGFjZV9yZWdfb3BzIGFjZV9yZWdfYmUxNl9vcHMgPSB7CisJLmluID0gYWNlX2luX2JlMTYsCisJLm91dCA9IGFjZV9vdXRfYmUxNiwKKwkuZGF0YWluID0gYWNlX2RhdGFpbl9iZTE2LAorCS5kYXRhb3V0ID0gYWNlX2RhdGFvdXRfYmUxNiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNlX3JlZ19vcHMgYWNlX3JlZ19sZTE2X29wcyA9IHsKKwkuaW4gPSBhY2VfaW5fbGUxNiwKKwkub3V0ID0gYWNlX291dF9sZTE2LAorCS5kYXRhaW4gPSBhY2VfZGF0YWluX2xlMTYsCisJLmRhdGFvdXQgPSBhY2VfZGF0YW91dF9sZTE2LAorfTsKKworc3RhdGljIGlubGluZSB1MTYgYWNlX2luKHN0cnVjdCBhY2VfZGV2aWNlICphY2UsIGludCByZWcpCit7CisJcmV0dXJuIGFjZS0+cmVnX29wcy0+aW4oYWNlLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBhY2VfaW4zMihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnKQoreworCXJldHVybiBhY2VfaW4oYWNlLCByZWcpIHwgKGFjZV9pbihhY2UsIHJlZyArIDIpIDw8IDE2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFjZV9vdXQoc3RydWN0IGFjZV9kZXZpY2UgKmFjZSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlhY2UtPnJlZ19vcHMtPm91dChhY2UsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFjZV9vdXQzMihzdHJ1Y3QgYWNlX2RldmljZSAqYWNlLCBpbnQgcmVnLCB1MzIgdmFsKQoreworCWFjZV9vdXQoYWNlLCByZWcsIHZhbCk7CisJYWNlX291dChhY2UsIHJlZyArIDIsIHZhbCA+PiAxNik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVidWcgc3VwcG9ydCBmdW5jdGlvbnMKKyAqLworCisjaWYgZGVmaW5lZChERUJVRykKK3N0YXRpYyB2b2lkIGFjZV9kdW1wX21lbSh2b2lkICpiYXNlLCBpbnQgbGVuKQoreworCWNvbnN0IGNoYXIgKnB0ciA9IGJhc2U7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDE2KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiUuOHg6IiwgaSk7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlpZiAoIShqICUgNCkpCisJCQkJcHJpbnRrKCIgIik7CisJCQlwcmludGsoIiUuMngiLCBwdHJbaSArIGpdKTsKKwkJfQorCQlwcmludGsoIiAiKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCQlwcmludGsoIiVjIiwgaXNwcmludChwdHJbaSArIGpdKSA/IHB0cltpICsgal0gOiAnLicpOworCQlwcmludGsoIlxuIik7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2VfZHVtcF9tZW0odm9pZCAqYmFzZSwgaW50IGxlbikKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhY2VfZHVtcF9yZWdzKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJZGV2X2luZm8oYWNlLT5kZXYsICIgICAgY3RybDogICUuOHggIHNlY2NudC9jbWQ6ICUuNHggICAgICB2ZXI6JS40eFxuIgorCQkgIiAgICBzdGF0dXM6JS44eCAgbXB1X2xiYTolLjh4ICBidXNtb2RlOiU0eFxuIgorCQkgIiAgICBlcnJvcjogJS44eCAgY2ZnX2xiYTolLjh4ICBmYXRzdGF0OiUuNHhcbiIsCisJCSBhY2VfaW4zMihhY2UsIEFDRV9DVFJMKSwKKwkJIGFjZV9pbihhY2UsIEFDRV9TRUNDTlRDTUQpLAorCQkgYWNlX2luKGFjZSwgQUNFX1ZFUlNJT04pLAorCQkgYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKSwKKwkJIGFjZV9pbjMyKGFjZSwgQUNFX01QVUxCQSksCisJCSBhY2VfaW4oYWNlLCBBQ0VfQlVTTU9ERSksCisJCSBhY2VfaW4zMihhY2UsIEFDRV9FUlJPUiksCisJCSBhY2VfaW4zMihhY2UsIEFDRV9DRkdMQkEpLCBhY2VfaW4oYWNlLCBBQ0VfRkFUU1RBVCkpOworfQorCit2b2lkIGFjZV9maXhfZHJpdmVpZChzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQpCit7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJdTE2ICpidWYgPSAodm9pZCAqKWlkOworCWludCBpOworCisJLyogQWxsIGhhbGYgd29yZHMgaGF2ZSB3cm9uZyBieXRlIG9yZGVyOyBzd2FwIHRoZSBieXRlcyAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGhkX2RyaXZlaWQpOyBpICs9IDIsIGJ1ZisrKQorCQkqYnVmID0gbGUxNl90b19jcHUoKmJ1Zik7CisKKwkvKiBTb21lIG9mIHRoZSBkYXRhIHZhbHVlcyBhcmUgMzJiaXQ7IHN3YXAgdGhlIGhhbGYgd29yZHMgICovCisJaWQtPmxiYV9jYXBhY2l0eSA9ICgoaWQtPmxiYV9jYXBhY2l0eSA+PiAxNikgJiAweDAwMDBGRkZGKSB8CisJICAgICgoaWQtPmxiYV9jYXBhY2l0eSA8PCAxNikgJiAweEZGRkYwMDAwKTsKKwlpZC0+c3BnID0gKChpZC0+c3BnID4+IDE2KSAmIDB4MDAwMEZGRkYpIHwKKwkgICAgKChpZC0+c3BnIDw8IDE2KSAmIDB4RkZGRjAwMDApOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRmluaXRlIFN0YXRlIE1hY2hpbmUgKEZTTSkgaW1wbGVtZW50YXRpb24KKyAqLworCisvKiBGU00gdGFza3M7IHVzZWQgdG8gZGlyZWN0IHN0YXRlIHRyYW5zaXRpb25zICovCisjZGVmaW5lIEFDRV9UQVNLX0lETEUgICAgICAwCisjZGVmaW5lIEFDRV9UQVNLX0lERU5USUZZICAxCisjZGVmaW5lIEFDRV9UQVNLX1JFQUQgICAgICAyCisjZGVmaW5lIEFDRV9UQVNLX1dSSVRFICAgICAzCisjZGVmaW5lIEFDRV9GU01fTlVNX1RBU0tTICA0CisKKy8qIEZTTSBzdGF0ZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBBQ0VfRlNNX1NUQVRFX0lETEUgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfUkVRX0xPQ0sgICAgICAgICAgIDEKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9XQUlUX0xPQ0sgICAgICAgICAgMgorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1dBSVRfQ0ZSRUFEWSAgICAgICAzCisjZGVmaW5lIEFDRV9GU01fU1RBVEVfSURFTlRJRllfUFJFUEFSRSAgIDQKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9JREVOVElGWV9UUkFOU0ZFUiAgNQorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX0NPTVBMRVRFICA2CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfUkVRX1BSRVBBUkUgICAgICAgIDcKKyNkZWZpbmUgQUNFX0ZTTV9TVEFURV9SRVFfVFJBTlNGRVIgICAgICAgOAorI2RlZmluZSBBQ0VfRlNNX1NUQVRFX1JFUV9DT01QTEVURSAgICAgICA5CisjZGVmaW5lIEFDRV9GU01fU1RBVEVfRVJST1IgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQUNFX0ZTTV9OVU1fU1RBVEVTICAgICAgICAgICAgICAxMQorCisvKiBTZXQgZmxhZyB0byBleGl0IEZTTSBsb29wIGFuZCByZXNjaGVkdWxlIHRhc2tsZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2VfZnNtX3lpZWxkKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9mc21feWllbGQoKVxuIik7CisJdGFza2xldF9zY2hlZHVsZSgmYWNlLT5mc21fdGFza2xldCk7CisJYWNlLT5mc21fY29udGludWVfZmxhZyA9IDA7Cit9CisKKy8qIFNldCBmbGFnIHRvIGV4aXQgRlNNIGxvb3AgYW5kIHdhaXQgZm9yIElSUSB0byByZXNjaGVkdWxlIHRhc2tsZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2VfZnNtX3lpZWxkaXJxKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9mc21feWllbGRpcnEoKVxuIik7CisKKwlpZiAoYWNlLT5pcnEgPT0gTk9fSVJRKQorCQkvKiBObyBJUlEgYXNzaWduZWQsIHNvIG5lZWQgdG8gcG9sbCAqLworCQl0YXNrbGV0X3NjaGVkdWxlKCZhY2UtPmZzbV90YXNrbGV0KTsKKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMDsKK30KKworLyogR2V0IHRoZSBuZXh0IHJlYWQvd3JpdGUgcmVxdWVzdDsgZW5kaW5nIHJlcXVlc3RzIHRoYXQgd2UgZG9uJ3QgaGFuZGxlICovCitzdHJ1Y3QgcmVxdWVzdCAqYWNlX2dldF9uZXh0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICogcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7CisJCWlmIChibGtfZnNfcmVxdWVzdChyZXEpKQorCQkJYnJlYWs7CisJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJfQorCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9mc21fZG9zdGF0ZShzdHJ1Y3QgYWNlX2RldmljZSAqYWNlKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJdTMyIHN0YXR1czsKKwl1MTYgdmFsOworCWludCBjb3VudDsKKwlpbnQgaTsKKworI2lmIGRlZmluZWQoREVCVUcpCisJZGV2X2RiZyhhY2UtPmRldiwgImZzbV9zdGF0ZT0laSwgaWRfcmVxX2NvdW50PSVpXG4iLAorCQlhY2UtPmZzbV9zdGF0ZSwgYWNlLT5pZF9yZXFfY291bnQpOworI2VuZGlmCisKKwlzd2l0Y2ggKGFjZS0+ZnNtX3N0YXRlKSB7CisJY2FzZSBBQ0VfRlNNX1NUQVRFX0lETEU6CisJCS8qIFNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBkbyAqLworCQlpZiAoYWNlLT5pZF9yZXFfY291bnQgfHwgYWNlX2dldF9uZXh0X3JlcXVlc3QoYWNlLT5xdWV1ZSkpIHsKKwkJCWFjZS0+ZnNtX2l0ZXJfbnVtKys7CisJCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfUkVRX0xPQ0s7CisJCQltb2RfdGltZXIoJmFjZS0+c3RhbGxfdGltZXIsIGppZmZpZXMgKyBIWik7CisJCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmFjZS0+c3RhbGxfdGltZXIpKQorCQkJCWFkZF90aW1lcigmYWNlLT5zdGFsbF90aW1lcik7CisJCQlicmVhazsKKwkJfQorCQlkZWxfdGltZXIoJmFjZS0+c3RhbGxfdGltZXIpOworCQlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfUkVRX0xPQ0s6CisJCWlmIChhY2VfaW4oYWNlLCBBQ0VfU1RBVFVTKSAmIEFDRV9TVEFUVVNfTVBVTE9DSykgeworCQkJLyogQWxyZWFkeSBoYXZlIHRoZSBsb2NrLCBqdW1wIHRvIG5leHQgc3RhdGUgKi8KKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9XQUlUX0NGUkVBRFk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlcXVlc3QgdGhlIGxvY2sgKi8KKwkJdmFsID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCQlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIHZhbCB8IEFDRV9DVFJMX0xPQ0tSRVEpOworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfV0FJVF9MT0NLOworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9XQUlUX0xPQ0s6CisJCWlmIChhY2VfaW4oYWNlLCBBQ0VfU1RBVFVTKSAmIEFDRV9TVEFUVVNfTVBVTE9DSykgeworCQkJLyogZ290IHRoZSBsb2NrOyBtb3ZlIHRvIG5leHQgc3RhdGUgKi8KKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9XQUlUX0NGUkVBRFk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHdhaXQgYSBiaXQgZm9yIHRoZSBsb2NrICovCisJCWFjZV9mc21feWllbGQoYWNlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfV0FJVF9DRlJFQURZOgorCQlzdGF0dXMgPSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpOworCQlpZiAoIShzdGF0dXMgJiBBQ0VfU1RBVFVTX1JEWUZPUkNGQ01EKSB8fAorCQkgICAgKHN0YXR1cyAmIEFDRV9TVEFUVVNfQ0ZCU1kpKSB7CisJCQkvKiBDRiBjYXJkIGlzbid0IHJlYWR5OyBpdCBuZWVkcyB0byBiZSBwb2xsZWQgKi8KKwkJCWFjZV9mc21feWllbGQoYWNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogRGV2aWNlIGlzIHJlYWR5IGZvciBjb21tYW5kOyBkZXRlcm1pbmUgd2hhdCB0byBkbyBuZXh0ICovCisJCWlmIChhY2UtPmlkX3JlcV9jb3VudCkKKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JREVOVElGWV9QUkVQQVJFOworCQllbHNlCisJCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfUkVRX1BSRVBBUkU7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX0lERU5USUZZX1BSRVBBUkU6CisJCS8qIFNlbmQgaWRlbnRpZnkgY29tbWFuZCAqLworCQlhY2UtPmZzbV90YXNrID0gQUNFX1RBU0tfSURFTlRJRlk7CisJCWFjZS0+ZGF0YV9wdHIgPSAmYWNlLT5jZl9pZDsKKwkJYWNlLT5kYXRhX2NvdW50ID0gQUNFX0JVRl9QRVJfU0VDVE9SOworCQlhY2Vfb3V0KGFjZSwgQUNFX1NFQ0NOVENNRCwgQUNFX1NFQ0NOVENNRF9JREVOVElGWSk7CisKKwkJLyogQXMgcGVyIGRhdGFzaGVldCwgcHV0IGNvbmZpZyBjb250cm9sbGVyIGluIHJlc2V0ICovCisJCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwkJYWNlX291dChhY2UsIEFDRV9DVFJMLCB2YWwgfCBBQ0VfQ1RSTF9DRkdSRVNFVCk7CisKKwkJLyogaXJxIGhhbmRsZXIgdGFrZXMgb3ZlciBmcm9tIHRoaXMgcG9pbnQ7IHdhaXQgZm9yIHRoZQorCQkgKiB0cmFuc2ZlciB0byBjb21wbGV0ZSAqLworCQlhY2UtPmZzbV9zdGF0ZSA9IEFDRV9GU01fU1RBVEVfSURFTlRJRllfVFJBTlNGRVI7CisJCWFjZV9mc21feWllbGRpcnEoYWNlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfSURFTlRJRllfVFJBTlNGRVI6CisJCS8qIENoZWNrIHRoYXQgdGhlIHN5c2FjZSBpcyByZWFkeSB0byByZWNlaXZlIGRhdGEgKi8KKwkJc3RhdHVzID0gYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIEFDRV9TVEFUVVNfQ0ZCU1kpIHsKKwkJCWRldl9kYmcoYWNlLT5kZXYsICJDRkJTWSBzZXQ7IHQ9JWkgaXRlcj0laSBkYz0laVxuIiwKKwkJCQlhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9pdGVyX251bSwKKwkJCQlhY2UtPmRhdGFfY291bnQpOworCQkJYWNlX2ZzbV95aWVsZChhY2UpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEoc3RhdHVzICYgQUNFX1NUQVRVU19EQVRBQlVGUkRZKSkgeworCQkJYWNlX2ZzbV95aWVsZChhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUcmFuc2ZlciB0aGUgbmV4dCBidWZmZXIgKi8KKwkJYWNlLT5yZWdfb3BzLT5kYXRhaW4oYWNlKTsKKwkJYWNlLT5kYXRhX2NvdW50LS07CisKKwkJLyogSWYgdGhlcmUgYXJlIHN0aWxsIGJ1ZmZlcnMgdG8gYmUgdHJhbnNmZXJzOyBqdW1wIG91dCBoZXJlICovCisJCWlmIChhY2UtPmRhdGFfY291bnQgIT0gMCkgeworCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB0cmFuc2ZlciBmaW5pc2hlZDsga2ljayBzdGF0ZSBtYWNoaW5lICovCisJCWRldl9kYmcoYWNlLT5kZXYsICJpZGVudGlmeSBmaW5pc2hlZFxuIik7CisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JREVOVElGWV9DT01QTEVURTsKKwkJYnJlYWs7CisKKwljYXNlIEFDRV9GU01fU1RBVEVfSURFTlRJRllfQ09NUExFVEU6CisJCWFjZV9maXhfZHJpdmVpZCgmYWNlLT5jZl9pZCk7CisJCWFjZV9kdW1wX21lbSgmYWNlLT5jZl9pZCwgNTEyKTsJLyogRGVidWc6IER1bXAgb3V0IGRpc2sgSUQgKi8KKworCQlpZiAoYWNlLT5kYXRhX3Jlc3VsdCkgeworCQkJLyogRXJyb3Igb2NjdXJlZCwgZGlzYWJsZSB0aGUgZGlzayAqLworCQkJYWNlLT5tZWRpYV9jaGFuZ2UgPSAxOworCQkJc2V0X2NhcGFjaXR5KGFjZS0+Z2QsIDApOworCQkJZGV2X2VycihhY2UtPmRldiwgImVycm9yIGZldGNoaW5nIENGIGlkICglaSlcbiIsCisJCQkJYWNlLT5kYXRhX3Jlc3VsdCk7CisJCX0gZWxzZSB7CisJCQlhY2UtPm1lZGlhX2NoYW5nZSA9IDA7CisKKwkJCS8qIFJlY29yZCBkaXNrIHBhcmFtZXRlcnMgKi8KKwkJCXNldF9jYXBhY2l0eShhY2UtPmdkLCBhY2UtPmNmX2lkLmxiYV9jYXBhY2l0eSk7CisJCQlkZXZfaW5mbyhhY2UtPmRldiwgImNhcGFjaXR5OiAlaSBzZWN0b3JzXG4iLAorCQkJCSBhY2UtPmNmX2lkLmxiYV9jYXBhY2l0eSk7CisJCX0KKworCQkvKiBXZSdyZSBkb25lLCBkcm9wIHRvIElETEUgc3RhdGUgYW5kIG5vdGlmeSB3YWl0ZXJzICovCisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JRExFOworCQlhY2UtPmlkX3Jlc3VsdCA9IGFjZS0+ZGF0YV9yZXN1bHQ7CisJCXdoaWxlIChhY2UtPmlkX3JlcV9jb3VudCkgeworCQkJY29tcGxldGUoJmFjZS0+aWRfY29tcGxldGlvbik7CisJCQlhY2UtPmlkX3JlcV9jb3VudC0tOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1JFUV9QUkVQQVJFOgorCQlyZXEgPSBhY2VfZ2V0X25leHRfcmVxdWVzdChhY2UtPnF1ZXVlKTsKKwkJaWYgKCFyZXEpIHsKKwkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JRExFOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBPa2F5LCBpdCdzIGEgZGF0YSByZXF1ZXN0LCBzZXQgaXQgdXAgZm9yIHRyYW5zZmVyICovCisJCWRldl9kYmcoYWNlLT5kZXYsCisJCQkicmVxdWVzdDogc2VjPSVseCBoY250PSVseCwgY2NudD0leCwgZGlyPSVpXG4iLAorCQkJcmVxLT5zZWN0b3IsIHJlcS0+aGFyZF9ucl9zZWN0b3JzLAorCQkJcmVxLT5jdXJyZW50X25yX3NlY3RvcnMsIHJxX2RhdGFfZGlyKHJlcSkpOworCisJCWFjZS0+cmVxID0gcmVxOworCQlhY2UtPmRhdGFfcHRyID0gcmVxLT5idWZmZXI7CisJCWFjZS0+ZGF0YV9jb3VudCA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogQUNFX0JVRl9QRVJfU0VDVE9SOworCQlhY2Vfb3V0MzIoYWNlLCBBQ0VfTVBVTEJBLCByZXEtPnNlY3RvciAmIDB4MEZGRkZGRkYpOworCisJCWNvdW50ID0gcmVxLT5oYXJkX25yX3NlY3RvcnM7CisJCWlmIChycV9kYXRhX2RpcihyZXEpKSB7CisJCQkvKiBLaWNrIG9mZiB3cml0ZSByZXF1ZXN0ICovCisJCQlkZXZfZGJnKGFjZS0+ZGV2LCAid3JpdGUgZGF0YVxuIik7CisJCQlhY2UtPmZzbV90YXNrID0gQUNFX1RBU0tfV1JJVEU7CisJCQlhY2Vfb3V0KGFjZSwgQUNFX1NFQ0NOVENNRCwKKwkJCQljb3VudCB8IEFDRV9TRUNDTlRDTURfV1JJVEVfREFUQSk7CisJCX0gZWxzZSB7CisJCQkvKiBLaWNrIG9mZiByZWFkIHJlcXVlc3QgKi8KKwkJCWRldl9kYmcoYWNlLT5kZXYsICJyZWFkIGRhdGFcbiIpOworCQkJYWNlLT5mc21fdGFzayA9IEFDRV9UQVNLX1JFQUQ7CisJCQlhY2Vfb3V0KGFjZSwgQUNFX1NFQ0NOVENNRCwKKwkJCQljb3VudCB8IEFDRV9TRUNDTlRDTURfUkVBRF9EQVRBKTsKKwkJfQorCisJCS8qIEFzIHBlciBkYXRhc2hlZXQsIHB1dCBjb25maWcgY29udHJvbGxlciBpbiByZXNldCAqLworCQl2YWwgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgdmFsIHwgQUNFX0NUUkxfQ0ZHUkVTRVQpOworCisJCS8qIE1vdmUgdG8gdGhlIHRyYW5zZmVyIHN0YXRlLiAgVGhlIHN5c3RlbWFjZSB3aWxsIHJhaXNlCisJCSAqIGFuIGludGVycnVwdCBvbmNlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbworCQkgKi8KKwkJYWNlLT5mc21fc3RhdGUgPSBBQ0VfRlNNX1NUQVRFX1JFUV9UUkFOU0ZFUjsKKwkJaWYgKGFjZS0+ZnNtX3Rhc2sgPT0gQUNFX1RBU0tfUkVBRCkKKwkJCWFjZV9mc21feWllbGRpcnEoYWNlKTsJLyogd2FpdCBmb3IgZGF0YSByZWFkeSAqLworCQlicmVhazsKKworCWNhc2UgQUNFX0ZTTV9TVEFURV9SRVFfVFJBTlNGRVI6CisJCS8qIENoZWNrIHRoYXQgdGhlIHN5c2FjZSBpcyByZWFkeSB0byByZWNlaXZlIGRhdGEgKi8KKwkJc3RhdHVzID0gYWNlX2luMzIoYWNlLCBBQ0VfU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIEFDRV9TVEFUVVNfQ0ZCU1kpIHsKKwkJCWRldl9kYmcoYWNlLT5kZXYsCisJCQkJIkNGQlNZIHNldDsgdD0laSBpdGVyPSVpIGM9JWkgZGM9JWkgaXJxPSVpXG4iLAorCQkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX2l0ZXJfbnVtLAorCQkJCWFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiAxNiwKKwkJCQlhY2UtPmRhdGFfY291bnQsIGFjZS0+aW5faXJxKTsKKwkJCWFjZV9mc21feWllbGQoYWNlKTsJLyogbmVlZCB0byBwb2xsIENGQlNZIGJpdCAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEoc3RhdHVzICYgQUNFX1NUQVRVU19EQVRBQlVGUkRZKSkgeworCQkJZGV2X2RiZyhhY2UtPmRldiwKKwkJCQkiREFUQUJVRiBub3Qgc2V0OyB0PSVpIGl0ZXI9JWkgYz0laSBkYz0laSBpcnE9JWlcbiIsCisJCQkJYWNlLT5mc21fdGFzaywgYWNlLT5mc21faXRlcl9udW0sCisJCQkJYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyAqIDE2LAorCQkJCWFjZS0+ZGF0YV9jb3VudCwgYWNlLT5pbl9pcnEpOworCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUcmFuc2ZlciB0aGUgbmV4dCBidWZmZXIgKi8KKwkJaSA9IDE2OworCQlpZiAoYWNlLT5mc21fdGFzayA9PSBBQ0VfVEFTS19XUklURSkKKwkJCWFjZS0+cmVnX29wcy0+ZGF0YW91dChhY2UpOworCQllbHNlCisJCQlhY2UtPnJlZ19vcHMtPmRhdGFpbihhY2UpOworCQlhY2UtPmRhdGFfY291bnQtLTsKKworCQkvKiBJZiB0aGVyZSBhcmUgc3RpbGwgYnVmZmVycyB0byBiZSB0cmFuc2ZlcnM7IGp1bXAgb3V0IGhlcmUgKi8KKwkJaWYgKGFjZS0+ZGF0YV9jb3VudCAhPSAwKSB7CisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGJpbyBmaW5pc2hlZDsgaXMgdGhlcmUgYW5vdGhlciBvbmU/ICovCisJCWkgPSBhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzOworCQlpZiAoZW5kX3RoYXRfcmVxdWVzdF9maXJzdChhY2UtPnJlcSwgMSwgaSkpIHsKKwkJCS8qIGRldl9kYmcoYWNlLT5kZXYsICJuZXh0IGJsb2NrOyBoPSVsaSBjPSVpXG4iLAorCQkJICogICAgICBhY2UtPnJlcS0+aGFyZF9ucl9zZWN0b3JzLAorCQkJICogICAgICBhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKKwkJCSAqLworCQkJYWNlLT5kYXRhX3B0ciA9IGFjZS0+cmVxLT5idWZmZXI7CisJCQlhY2UtPmRhdGFfY291bnQgPSBhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogMTY7CisJCQlhY2VfZnNtX3lpZWxkaXJxKGFjZSk7CisJCQlicmVhazsKKwkJfQorCisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9SRVFfQ09NUExFVEU7CisJCWJyZWFrOworCisJY2FzZSBBQ0VfRlNNX1NUQVRFX1JFUV9DT01QTEVURToKKwkJLyogQ29tcGxldGUgdGhlIGJsb2NrIHJlcXVlc3QgKi8KKwkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChhY2UtPnJlcSk7CisJCWVuZF90aGF0X3JlcXVlc3RfbGFzdChhY2UtPnJlcSwgMSk7CisJCWFjZS0+cmVxID0gTlVMTDsKKworCQkvKiBGaW5pc2hlZCByZXF1ZXN0OyBnbyB0byBpZGxlIHN0YXRlICovCisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JRExFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JRExFOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9mc21fdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9ICh2b2lkICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCisJLyogTG9vcCBvdmVyIHN0YXRlIG1hY2hpbmUgdW50aWwgdG9sZCB0byBzdG9wICovCisJYWNlLT5mc21fY29udGludWVfZmxhZyA9IDE7CisJd2hpbGUgKGFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcpCisJCWFjZV9mc21fZG9zdGF0ZShhY2UpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNlLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZV9zdGFsbF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9ICh2b2lkICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X3dhcm4oYWNlLT5kZXYsCisJCSAia2lja2luZyBzdGFsbGVkIGZzbTsgc3RhdGU9JWkgdGFzaz0laSBpdGVyPSVpIGRjPSVpXG4iLAorCQkgYWNlLT5mc21fc3RhdGUsIGFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX2l0ZXJfbnVtLAorCQkgYWNlLT5kYXRhX2NvdW50KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWNlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBSZWFybSB0aGUgc3RhbGwgdGltZXIgKmJlZm9yZSogZW50ZXJpbmcgRlNNICh3aGljaCBtYXkgdGhlbgorCSAqIGRlbGV0ZSB0aGUgdGltZXIpICovCisJbW9kX3RpbWVyKCZhY2UtPnN0YWxsX3RpbWVyLCBqaWZmaWVzICsgSFopOworCisJLyogTG9vcCBvdmVyIHN0YXRlIG1hY2hpbmUgdW50aWwgdG9sZCB0byBzdG9wICovCisJYWNlLT5mc21fY29udGludWVfZmxhZyA9IDE7CisJd2hpbGUgKGFjZS0+ZnNtX2NvbnRpbnVlX2ZsYWcpCisJCWFjZV9mc21fZG9zdGF0ZShhY2UpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNlLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgYWNlX2ludGVycnVwdF9jaGVja3N0YXRlKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJdTMyIHNyZWcgPSBhY2VfaW4zMihhY2UsIEFDRV9TVEFUVVMpOworCXUxNiBjcmVnID0gYWNlX2luKGFjZSwgQUNFX0NUUkwpOworCisJLyogQ2hlY2sgZm9yIGVycm9yIG9jY3VyYW5jZSAqLworCWlmICgoc3JlZyAmIChBQ0VfU1RBVFVTX0NGR0VSUk9SIHwgQUNFX1NUQVRVU19DRkNFUlJPUikpICYmCisJICAgIChjcmVnICYgQUNFX0NUUkxfRVJST1JJUlEpKSB7CisJCWRldl9lcnIoYWNlLT5kZXYsICJ0cmFuc2ZlciBmYWlsdXJlXG4iKTsKKwkJYWNlX2R1bXBfcmVncyhhY2UpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFjZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUxNiBjcmVnOworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBkZXZfaWQ7CisKKwkvKiBiZSBzYWZlIGFuZCBnZXQgdGhlIGxvY2sgKi8KKwlzcGluX2xvY2soJmFjZS0+bG9jayk7CisJYWNlLT5pbl9pcnEgPSAxOworCisJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLworCWNyZWcgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJYWNlX291dChhY2UsIEFDRV9DVFJMLCBjcmVnIHwgQUNFX0NUUkxfUkVTRVRJUlEpOworCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgY3JlZyk7CisKKwkvKiBjaGVjayBmb3IgSU8gZmFpbHVyZXMgKi8KKwlpZiAoYWNlX2ludGVycnVwdF9jaGVja3N0YXRlKGFjZSkpCisJCWFjZS0+ZGF0YV9yZXN1bHQgPSAtRUlPOworCisJaWYgKGFjZS0+ZnNtX3Rhc2sgPT0gMCkgeworCQlkZXZfZXJyKGFjZS0+ZGV2LAorCQkJInNwdXJpb3VzIGlycTsgc3RhdD0lLjh4IGN0cmw9JS44eCBjbWQ9JS40eFxuIiwKKwkJCWFjZV9pbjMyKGFjZSwgQUNFX1NUQVRVUyksIGFjZV9pbjMyKGFjZSwgQUNFX0NUUkwpLAorCQkJYWNlX2luKGFjZSwgQUNFX1NFQ0NOVENNRCkpOworCQlkZXZfZXJyKGFjZS0+ZGV2LCAiZnNtX3Rhc2s9JWkgZnNtX3N0YXRlPSVpIGRhdGFfY291bnQ9JWlcbiIsCisJCQlhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9zdGF0ZSwgYWNlLT5kYXRhX2NvdW50KTsKKwl9CisKKwkvKiBMb29wIG92ZXIgc3RhdGUgbWFjaGluZSB1bnRpbCB0b2xkIHRvIHN0b3AgKi8KKwlhY2UtPmZzbV9jb250aW51ZV9mbGFnID0gMTsKKwl3aGlsZSAoYWNlLT5mc21fY29udGludWVfZmxhZykKKwkJYWNlX2ZzbV9kb3N0YXRlKGFjZSk7CisKKwkvKiBkb25lIHdpdGggaW50ZXJydXB0OyBkcm9wIHRoZSBsb2NrICovCisJYWNlLT5pbl9pcnEgPSAwOworCXNwaW5fdW5sb2NrKCZhY2UtPmxvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJsb2NrIG9wcworICovCitzdGF0aWMgdm9pZCBhY2VfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiBxKQoreworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZTsKKworCXJlcSA9IGFjZV9nZXRfbmV4dF9yZXF1ZXN0KHEpOworCisJaWYgKHJlcSkgeworCQlhY2UgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJdGFza2xldF9zY2hlZHVsZSgmYWNlLT5mc21fdGFza2xldCk7CisJfQorfQorCitzdGF0aWMgaW50IGFjZV9tZWRpYV9jaGFuZ2VkKHN0cnVjdCBnZW5kaXNrICpnZCkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gZ2QtPnByaXZhdGVfZGF0YTsKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX21lZGlhX2NoYW5nZWQoKTogJWlcbiIsIGFjZS0+bWVkaWFfY2hhbmdlKTsKKworCXJldHVybiBhY2UtPm1lZGlhX2NoYW5nZTsKK30KKworc3RhdGljIGludCBhY2VfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpnZCkKK3sKKwlzdHJ1Y3QgYWNlX2RldmljZSAqYWNlID0gZ2QtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9yZXZhbGlkYXRlX2Rpc2soKVxuIik7CisKKwlpZiAoYWNlLT5tZWRpYV9jaGFuZ2UpIHsKKwkJZGV2X2RiZyhhY2UtPmRldiwgInJlcXVlc3RpbmcgY2YgaWQgYW5kIHNjaGVkdWxpbmcgdGFza2xldFxuIik7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCQlhY2UtPmlkX3JlcV9jb3VudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZhY2UtPmZzbV90YXNrbGV0KTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmYWNlLT5pZF9jb21wbGV0aW9uKTsKKwl9CisKKwlkZXZfZGJnKGFjZS0+ZGV2LCAicmV2YWxpZGF0ZSBjb21wbGV0ZVxuIik7CisJcmV0dXJuIGFjZS0+aWRfcmVzdWx0OworfQorCitzdGF0aWMgaW50IGFjZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoYWNlLT5kZXYsICJhY2Vfb3BlbigpIHVzZXJzPSVpXG4iLCBhY2UtPnVzZXJzICsgMSk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBhY2U7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjZS0+bG9jaywgZmxhZ3MpOworCWFjZS0+dXNlcnMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKworCWNoZWNrX2Rpc2tfY2hhbmdlKGlub2RlLT5pX2JkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBhY2VfZGV2aWNlICphY2UgPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgdmFsOworCisJZGV2X2RiZyhhY2UtPmRldiwgImFjZV9yZWxlYXNlKCkgdXNlcnM9JWlcbiIsIGFjZS0+dXNlcnMgLSAxKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKwlhY2UtPnVzZXJzLS07CisJaWYgKGFjZS0+dXNlcnMgPT0gMCkgeworCQl2YWwgPSBhY2VfaW4oYWNlLCBBQ0VfQ1RSTCk7CisJCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgdmFsICYgfkFDRV9DVFJMX0xPQ0tSRVEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY2UtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY2VfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgX191c2VyICpnZW8gPSAoc3RydWN0IGhkX2dlb21ldHJ5IF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZzsKKwlkZXZfZGJnKGFjZS0+ZGV2LCAiYWNlX2lvY3RsKClcbiIpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhESU9fR0VUR0VPOgorCQlnLmhlYWRzID0gYWNlLT5jZl9pZC5oZWFkczsKKwkJZy5zZWN0b3JzID0gYWNlLT5jZl9pZC5zZWN0b3JzOworCQlnLmN5bGluZGVycyA9IGFjZS0+Y2ZfaWQuY3lsczsKKwkJZy5zdGFydCA9IDA7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoZ2VvLCAmZywgc2l6ZW9mKGcpKSA/IC1FRkFVTFQgOiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGFjZV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYWNlX29wZW4sCisJLnJlbGVhc2UgPSBhY2VfcmVsZWFzZSwKKwkubWVkaWFfY2hhbmdlZCA9IGFjZV9tZWRpYV9jaGFuZ2VkLAorCS5yZXZhbGlkYXRlX2Rpc2sgPSBhY2VfcmV2YWxpZGF0ZV9kaXNrLAorCS5pb2N0bCA9IGFjZV9pb2N0bCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTeXN0ZW1BQ0UgZGV2aWNlIHNldHVwL3RlYXJkb3duIGNvZGUKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgYWNlX3NldHVwKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJdTE2IHZlcnNpb247CisJdTE2IHZhbDsKKworCWludCByYzsKKworCXNwaW5fbG9ja19pbml0KCZhY2UtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmYWNlLT5pZF9jb21wbGV0aW9uKTsKKworCS8qCisJICogTWFwIHRoZSBkZXZpY2UKKwkgKi8KKwlhY2UtPmJhc2VhZGRyID0gaW9yZW1hcChhY2UtPnBoeXNhZGRyLCAweDgwKTsKKwlpZiAoIWFjZS0+YmFzZWFkZHIpCisJCWdvdG8gZXJyX2lvcmVtYXA7CisKKwlpZiAoYWNlLT5pcnEgIT0gTk9fSVJRKSB7CisJCXJjID0gcmVxdWVzdF9pcnEoYWNlLT5pcnEsIGFjZV9pbnRlcnJ1cHQsIDAsICJzeXN0ZW1hY2UiLCBhY2UpOworCQlpZiAocmMpIHsKKwkJCS8qIEZhaWx1cmUgLSBmYWxsIGJhY2sgdG8gcG9sbGVkIG1vZGUgKi8KKwkJCWRldl9lcnIoYWNlLT5kZXYsICJyZXF1ZXN0X2lycSBmYWlsZWRcbiIpOworCQkJYWNlLT5pcnEgPSBOT19JUlE7CisJCX0KKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHN0YXRlIG1hY2hpbmUgdGFza2xldCBhbmQgc3RhbGwgdGltZXIKKwkgKi8KKwl0YXNrbGV0X2luaXQoJmFjZS0+ZnNtX3Rhc2tsZXQsIGFjZV9mc21fdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpYWNlKTsKKwlzZXR1cF90aW1lcigmYWNlLT5zdGFsbF90aW1lciwgYWNlX3N0YWxsX3RpbWVyLCAodW5zaWduZWQgbG9uZylhY2UpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSByZXF1ZXN0IHF1ZXVlCisJICovCisJYWNlLT5xdWV1ZSA9IGJsa19pbml0X3F1ZXVlKGFjZV9yZXF1ZXN0LCAmYWNlLT5sb2NrKTsKKwlpZiAoYWNlLT5xdWV1ZSA9PSBOVUxMKQorCQlnb3RvIGVycl9ibGtfaW5pdHE7CisJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoYWNlLT5xdWV1ZSwgNTEyKTsKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgR0Qgc3RydWN0dXJlCisJICovCisJYWNlLT5nZCA9IGFsbG9jX2Rpc2soQUNFX05VTV9NSU5PUlMpOworCWlmICghYWNlLT5nZCkKKwkJZ290byBlcnJfYWxsb2NfZGlzazsKKworCWFjZS0+Z2QtPm1ham9yID0gYWNlX21ham9yOworCWFjZS0+Z2QtPmZpcnN0X21pbm9yID0gYWNlLT5pZCAqIEFDRV9OVU1fTUlOT1JTOworCWFjZS0+Z2QtPmZvcHMgPSAmYWNlX2ZvcHM7CisJYWNlLT5nZC0+cXVldWUgPSBhY2UtPnF1ZXVlOworCWFjZS0+Z2QtPnByaXZhdGVfZGF0YSA9IGFjZTsKKwlzbnByaW50ZihhY2UtPmdkLT5kaXNrX25hbWUsIDMyLCAieHMlYyIsIGFjZS0+aWQgKyAnYScpOworCisJLyogc2V0IGJ1cyB3aWR0aCAqLworCWlmIChhY2UtPmJ1c193aWR0aCA9PSAxKSB7CisJCS8qIDB4MDEwMSBzaG91bGQgd29yayByZWdhcmRsZXNzIG9mIGVuZGlhbmVzcyAqLworCQlhY2Vfb3V0X2xlMTYoYWNlLCBBQ0VfQlVTTU9ERSwgMHgwMTAxKTsKKworCQkvKiByZWFkIGl0IGJhY2sgdG8gZGV0ZXJtaW5lIGVuZGlhbmVzcyAqLworCQlpZiAoYWNlX2luX2xlMTYoYWNlLCBBQ0VfQlVTTU9ERSkgPT0gMHgwMDAxKQorCQkJYWNlLT5yZWdfb3BzID0gJmFjZV9yZWdfbGUxNl9vcHM7CisJCWVsc2UKKwkJCWFjZS0+cmVnX29wcyA9ICZhY2VfcmVnX2JlMTZfb3BzOworCX0gZWxzZSB7CisJCWFjZV9vdXRfOChhY2UsIEFDRV9CVVNNT0RFLCAweDAwKTsKKwkJYWNlLT5yZWdfb3BzID0gJmFjZV9yZWdfOF9vcHM7CisJfQorCisJLyogTWFrZSBzdXJlIHZlcnNpb24gcmVnaXN0ZXIgaXMgc2FuZSAqLworCXZlcnNpb24gPSBhY2VfaW4oYWNlLCBBQ0VfVkVSU0lPTik7CisJaWYgKCh2ZXJzaW9uID09IDApIHx8ICh2ZXJzaW9uID09IDB4RkZGRikpCisJCWdvdG8gZXJyX3JlYWQ7CisKKwkvKiBQdXQgc3lzYWNlIGluIGEgc2FuZSBzdGF0ZSBieSBjbGVhcmluZyBtb3N0IGNvbnRyb2wgcmVnIGJpdHMgKi8KKwlhY2Vfb3V0KGFjZSwgQUNFX0NUUkwsIEFDRV9DVFJMX0ZPUkNFQ0ZHTU9ERSB8CisJCUFDRV9DVFJMX0RBVEFCVUZSRFlJUlEgfCBBQ0VfQ1RSTF9FUlJPUklSUSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCXZhbCA9IGFjZV9pbihhY2UsIEFDRV9DVFJMKTsKKwl2YWwgfD0gQUNFX0NUUkxfREFUQUJVRlJEWUlSUSB8IEFDRV9DVFJMX0VSUk9SSVJROworCWFjZV9vdXQoYWNlLCBBQ0VfQ1RSTCwgdmFsKTsKKworCS8qIFByaW50IHRoZSBpZGVudGlmaWNhdGlvbiAqLworCWRldl9pbmZvKGFjZS0+ZGV2LCAiWGlsaW54IFN5c3RlbUFDRSByZXZpc2lvbiAlaS4laS4laVxuIiwKKwkJICh2ZXJzaW9uID4+IDEyKSAmIDB4ZiwgKHZlcnNpb24gPj4gOCkgJiAweDBmLCB2ZXJzaW9uICYgMHhmZik7CisJZGV2X2RiZyhhY2UtPmRldiwgInBoeXNhZGRyIDB4JWx4LCBtYXBwZWQgdG8gMHglcCwgaXJxPSVpXG4iLAorCQlhY2UtPnBoeXNhZGRyLCBhY2UtPmJhc2VhZGRyLCBhY2UtPmlycSk7CisKKwlhY2UtPm1lZGlhX2NoYW5nZSA9IDE7CisJYWNlX3JldmFsaWRhdGVfZGlzayhhY2UtPmdkKTsKKworCS8qIE1ha2UgdGhlIHN5c2FjZSBkZXZpY2UgJ2xpdmUnICovCisJYWRkX2Rpc2soYWNlLT5nZCk7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX3JlYWQ6CisJcHV0X2Rpc2soYWNlLT5nZCk7CisgICAgICBlcnJfYWxsb2NfZGlzazoKKwlibGtfY2xlYW51cF9xdWV1ZShhY2UtPnF1ZXVlKTsKKyAgICAgIGVycl9ibGtfaW5pdHE6CisJaW91bm1hcChhY2UtPmJhc2VhZGRyKTsKKwlpZiAoYWNlLT5pcnEgIT0gTk9fSVJRKQorCQlmcmVlX2lycShhY2UtPmlycSwgYWNlKTsKKyAgICAgIGVycl9pb3JlbWFwOgorCXByaW50ayhLRVJOX0lORk8gInhzeXNhY2U6IGVycm9yIGluaXRpYWxpemluZyBkZXZpY2UgYXQgMHglbHhcbiIsCisJICAgICAgIGFjZS0+cGh5c2FkZHIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWNlX3RlYXJkb3duKHN0cnVjdCBhY2VfZGV2aWNlICphY2UpCit7CisJaWYgKGFjZS0+Z2QpIHsKKwkJZGVsX2dlbmRpc2soYWNlLT5nZCk7CisJCXB1dF9kaXNrKGFjZS0+Z2QpOworCX0KKworCWlmIChhY2UtPnF1ZXVlKQorCQlibGtfY2xlYW51cF9xdWV1ZShhY2UtPnF1ZXVlKTsKKworCXRhc2tsZXRfa2lsbCgmYWNlLT5mc21fdGFza2xldCk7CisKKwlpZiAoYWNlLT5pcnEgIT0gTk9fSVJRKQorCQlmcmVlX2lycShhY2UtPmlycSwgYWNlKTsKKworCWlvdW5tYXAoYWNlLT5iYXNlYWRkcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUGxhdGZvcm0gQnVzIFN1cHBvcnQKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXZpY2UpOworCXN0cnVjdCBhY2VfZGV2aWNlICphY2U7CisJaW50IGk7CisKKwlkZXZfZGJnKGRldmljZSwgImFjZV9wcm9iZSglcClcbiIsIGRldmljZSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBhY2UgZGV2aWNlIHN0cnVjdHVyZQorCSAqLworCWFjZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY2VfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY2UpCisJCWdvdG8gZXJyX2FsbG9jOworCisJYWNlLT5kZXYgPSBkZXZpY2U7CisJYWNlLT5pZCA9IGRldi0+aWQ7CisJYWNlLT5pcnEgPSBOT19JUlE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fcmVzb3VyY2VzOyBpKyspIHsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJCWFjZS0+cGh5c2FkZHIgPSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OworCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfSVJRKQorCQkJYWNlLT5pcnEgPSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OworCX0KKworCS8qIEZJWE1FOiBTaG91bGQgZ2V0IGJ1c193aWR0aCBmcm9tIHRoZSBwbGF0Zm9ybV9kZXZpY2Ugc3RydWN0ICovCisJYWNlLT5idXNfd2lkdGggPSAxOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgYWNlKTsKKworCS8qIENhbGwgdGhlIGJ1cy1pbmRlcGVuZGFudCBzZXR1cCBjb2RlICovCisJaWYgKGFjZV9zZXR1cChhY2UpICE9IDApCisJCWdvdG8gZXJyX3NldHVwOworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycl9zZXR1cDoKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwlrZnJlZShhY2UpOworICAgICAgZXJyX2FsbG9jOgorCXByaW50ayhLRVJOX0VSUiAieHN5c2FjZTogY291bGQgbm90IGluaXRpYWxpemUgZGV2aWNlXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIFBsYXRmb3JtIGJ1cyByZW1vdmUoKSBtZXRob2QKKyAqLworc3RhdGljIGludCBfX2RldmV4aXQgYWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGFjZV9kZXZpY2UgKmFjZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCisJZGV2X2RiZyhkZXZpY2UsICJhY2VfcmVtb3ZlKCVwKVxuIiwgZGV2aWNlKTsKKworCWlmIChhY2UpIHsKKwkJYWNlX3RlYXJkb3duKGFjZSk7CisJCWtmcmVlKGFjZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBhY2VfZHJpdmVyID0geworCS5uYW1lID0gInhzeXNhY2UiLAorCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlID0gYWNlX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhY2VfcmVtb3ZlKSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTW9kdWxlIGluaXQvZXhpdCByb3V0aW5lcworICovCitzdGF0aWMgaW50IF9faW5pdCBhY2VfaW5pdCh2b2lkKQoreworCWFjZV9tYWpvciA9IHJlZ2lzdGVyX2Jsa2RldihhY2VfbWFqb3IsICJ4c3lzYWNlIik7CisJaWYgKGFjZV9tYWpvciA8PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInhzeXNhY2U6IHJlZ2lzdGVyX2Jsa2RldigpIGZhaWxlZFxuIik7CisJCXJldHVybiBhY2VfbWFqb3I7CisJfQorCisJcHJfZGVidWcoIlJlZ2lzdGVyaW5nIFhpbGlueCBTeXN0ZW1BQ0UgZHJpdmVyLCBtYWpvcj0laVxuIiwgYWNlX21ham9yKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZhY2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjZV9leGl0KHZvaWQpCit7CisJcHJfZGVidWcoIlVucmVnaXN0ZXJpbmcgWGlsaW54IFN5c3RlbUFDRSBkcml2ZXJcbiIpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZhY2VfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihhY2VfbWFqb3IsICJ4c3lzYWNlIik7Cit9CisKK21vZHVsZV9pbml0KGFjZV9pbml0KTsKK21vZHVsZV9leGl0KGFjZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svejJyYW0uYyBiL2RyaXZlcnMvYmxvY2svejJyYW0uYwppbmRleCA3Y2MyNjg1Li5lNDBmYTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKKysrIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCkBAIC00NCw5ICs0NCw2IEBACiBleHRlcm4gaW50IG02OGtfcmVhbG51bV9tZW1vcnk7CiBleHRlcm4gc3RydWN0IG1lbV9pbmZvIG02OGtfbWVtb3J5W05VTV9NRU1JTkZPXTsKIAotI2RlZmluZSBUUlVFICAgICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAgICAoMCkKLQogI2RlZmluZSBaMk1JTk9SX0NPTUJJTkVEICAgICAgKDApCiAjZGVmaW5lIFoyTUlOT1JfWjJPTkxZICAgICAgICAoMSkKICNkZWZpbmUgWjJNSU5PUl9DSElQT05MWSAgICAgICgyKQpAQCAtMzc0LDkgKzM3MSw3IEBACiB7CiAgICAgaW50IGksIGo7CiAgICAgYmxrX3VucmVnaXN0ZXJfcmVnaW9uKE1LREVWKFoyUkFNX01BSk9SLCAwKSwgMjU2KTsKLSAgICBpZiAoIHVucmVnaXN0ZXJfYmxrZGV2KCBaMlJBTV9NQUpPUiwgREVWSUNFX05BTUUgKSAhPSAwICkKLQlwcmludGsoIEtFUk5fRVJSIERFVklDRV9OQU1FICI6IHVucmVnaXN0ZXIgb2YgZGV2aWNlIGZhaWxlZFxuIik7Ci0KKyAgICB1bnJlZ2lzdGVyX2Jsa2RldihaMlJBTV9NQUpPUiwgREVWSUNFX05BTUUpOwogICAgIGRlbF9nZW5kaXNrKHoycmFtX2dlbmRpc2spOwogICAgIHB1dF9kaXNrKHoycmFtX2dlbmRpc2spOwogICAgIGJsa19jbGVhbnVwX3F1ZXVlKHoyX3F1ZXVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwppbmRleCBhYTU0NjhmLi40OTkwMTliZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jCisrKyBiL2RyaXZlcnMvY2Ryb20vY2Ryb20uYwpAQCAtMjY5NSwxMSArMjY5NSwxMiBAQAogewogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCByZXQ7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpcC0+aV9iZGV2LT5iZF9kaXNrOwogCiAJLyoKIAkgKiBUcnkgdGhlIGdlbmVyaWMgU0NTSSBjb21tYW5kIGlvY3RsJ3MgZmlyc3QuCiAJICovCi0JcmV0ID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgaXAtPmlfYmRldi0+YmRfZGlzaywgY21kLCBhcmdwKTsKKwlyZXQgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBkaXNrLT5xdWV1ZSwgZGlzaywgY21kLCBhcmdwKTsKIAlpZiAocmV0ICE9IC1FTk9UVFkpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggZjY2NDg2OC4uZDhkNzEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTExNCw3ICsxMTQsNyBAQAogCiBjb25maWcgUk9DS0VUUE9SVAogCXRyaXN0YXRlICJDb210cm9sIFJvY2tldFBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQ29tdHJvbCBSb2NrZXRQb3J0IGFuZCBSb2NrZXRNb2RlbSBQQ0kgYm9hcmRzLiAgIAogICAgICAgICAgIFRoZXNlIGJvYXJkcyBwcm92aWRlIDIsIDQsIDgsIDE2LCBvciAzMiBoaWdoLXNwZWVkIHNlcmlhbCBwb3J0cyBvcgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAKIGNvbmZpZyBESUdJRVBDQQogCXRyaXN0YXRlICJEaWdpYm9hcmQgSW50ZWxsaWdlbnQgQXN5bmMgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNFUklBTF9OT05TVEFOREFSRAorCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChJU0EgfHwgRUlTQSB8fCBQQ0kpCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgRGlnaSBJbnRlcm5hdGlvbmFsJ3MgWHgsIFhldmUsIGFuZCBYZW0gc2VyaWVzCiAJICBvZiBjYXJkcyB3aGljaCBwcm92aWRlIG11bHRpcGxlIHNlcmlhbCBwb3J0cy4gWW91IHdvdWxkIG5lZWQKQEAgLTIxMyw4ICsyMTMsNiBAQAogCSAgVGhpcyBpcyB1cGdyYWRlZCAoMS45LjEpIGRyaXZlciBmcm9tIG9yaWdpbmFsIE1veGEgZHJpdmVycyB3aXRoCiAJICBjaGFuZ2VzIGZpbmFsbHkgcmVzdWx0aW5nIGluIFBDSSBwcm9iaW5nLgogCi0JICBVc2UgYXQgeW91ciBvd24gcmlzay4KLQogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKIAkgIG14c2VyX25ldy4gSWYgeW91IHdhbnQgdG8gZG8gdGhhdCwgc2F5IE0gaGVyZS4KIApAQCAtMzU0LDcgKzM1Miw3IEBACiAKIGNvbmZpZyBTVEFMTElPTgogCXRyaXN0YXRlICJTdGFsbGlvbiBFYXN5SU8gb3IgRUM4LzMyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGFuIEVhc3lJTyBvciBFYXN5Q29ubmVjdGlvbiA4LzMyIG11bHRpcG9ydCBTdGFsbGlvbgogCSAgY2FyZCwgdGhlbiB0aGlzIGlzIGZvciB5b3U7IHNheSBZLiAgTWFrZSBzdXJlIHRvIHJlYWQKQEAgLTM2NSw3ICszNjMsNyBAQAogCiBjb25maWcgSVNUQUxMSU9OCiAJdHJpc3RhdGUgIlN0YWxsaW9uIEVDOC82NCwgT05ib2FyZCwgQnJ1bWJ5IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTVEFMRFJWICYmIEJST0tFTl9PTl9TTVAKKwlkZXBlbmRzIG9uIFNUQUxEUlYgJiYgQlJPS0VOX09OX1NNUCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQogCWhlbHAKIAkgIElmIHlvdSBoYXZlIGFuIEVhc3lDb25uZWN0aW9uIDgvNjQsIE9OYm9hcmQsIEJydW1ieSBvciBTdGFsbGlvbgogCSAgc2VyaWFsIG11bHRpcG9ydCBjYXJkLCBzYXkgWSBoZXJlLiBNYWtlIHN1cmUgdG8gcmVhZApAQCAtOTc5LDE1ICs5NzcsMTQgQEAKIAlkZXBlbmRzIG9uIENQVV9WUjQxWFgKIAogY29uZmlnIFJBV19EUklWRVIKLQl0cmlzdGF0ZSAiUkFXIGRyaXZlciAoL2Rldi9yYXcvcmF3TikgKE9CU09MRVRFKSIKKwl0cmlzdGF0ZSAiUkFXIGRyaXZlciAoL2Rldi9yYXcvcmF3TikiCiAJZGVwZW5kcyBvbiBCTE9DSwogCWhlbHAKLQkgIFRoZSByYXcgZHJpdmVyIHBlcm1pdHMgYmxvY2sgZGV2aWNlcyB0byBiZSBib3VuZCB0byAvZGV2L3Jhdy9yYXdOLiAKLQkgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4gCisJICBUaGUgcmF3IGRyaXZlciBwZXJtaXRzIGJsb2NrIGRldmljZXMgdG8gYmUgYm91bmQgdG8gL2Rldi9yYXcvcmF3Ti4KKwkgIE9uY2UgYm91bmQsIEkvTyBhZ2FpbnN0IC9kZXYvcmF3L3Jhd04gdXNlcyBlZmZpY2llbnQgemVyby1jb3B5IEkvTy4KIAkgIFNlZSB0aGUgcmF3KDgpIG1hbnBhZ2UgZm9yIG1vcmUgZGV0YWlscy4KIAotICAgICAgICAgIFRoZSByYXcgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBzb29uLgotICAgICAgICAgIEFwcGxpY2F0aW9ucyBzaG91bGQgc2ltcGx5IG9wZW4gdGhlIGRldmljZSAoZWcgL2Rldi9oZGExKQorICAgICAgICAgIEFwcGxpY2F0aW9ucyBzaG91bGQgcHJlZmVyYWJseSBvcGVuIHRoZSBkZXZpY2UgKGVnIC9kZXYvaGRhMSkKICAgICAgICAgICB3aXRoIHRoZSBPX0RJUkVDVCBmbGFnLgogCiBjb25maWcgTUFYX1JBV19ERVZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggMmY1NmVjYy4uZjI5OTZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtMTUsNiArMTUsNyBAQAogb2JqLSQoQ09ORklHX1ZUKQkJKz0gdnRfaW9jdGwubyB2Y19zY3JlZW4ubyBjb25zb2xlbWFwLm8gXAogCQkJCSAgIGNvbnNvbGVtYXBfZGVmdGJsLm8gc2VsZWN0aW9uLm8ga2V5Ym9hcmQubwogb2JqLSQoQ09ORklHX0hXX0NPTlNPTEUpCSs9IHZ0Lm8gZGVma2V5bWFwLm8KK29iai0kKENPTkZJR19BVURJVCkJCSs9IHR0eV9hdWRpdC5vCiBvYmotJChDT05GSUdfTUFHSUNfU1lTUlEpCSs9IHN5c3JxLm8KIG9iai0kKENPTkZJR19FU1BTRVJJQUwpCQkrPSBlc3Aubwogb2JqLSQoQ09ORklHX01WTUUxNDdfU0NDKQkrPSBnZW5lcmljX3NlcmlhbC5vIHZtZV9zY2MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCmluZGV4IDRlYWNlYWIuLjdiMDJiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKQEAgLTczOCw2ICs3MzgsNyBAQAogCX0KIAkvKiBJZiB0aGUgcXVvdGllbnQgaXMgemVybyByZWZ1c2UgdGhlIGNoYW5nZSAqLwogCWlmICghcXVvdCAmJiBvbGRfdGVybWlvcykgeworCQkvKiBGSVhNRTogV2lsbCBuZWVkIHVwZGF0aW5nIGZvciBuZXcgdHR5IGluIHRoZSBlbmQgKi8KIAkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKIAkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENCQVVEKTsKIAkJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7CkBAIC03ODMsNyArNzg0LDYgQEAKIAkvKgogCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwogCSAqLwotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykgKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDSykpCiAKIAlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9EUjsKIAlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQpAQCAtMTM2NywxMSArMTM2Nyw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAKLQlpZiAoICAgKGNmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkgIHJldHVybjsKLQogCWNoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CiAKIAkvKiBIYW5kbGUgdHJhbnNpdGlvbiB0byBCMCBzdGF0dXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMgYi9kcml2ZXJzL2NoYXIvYXBtLWVtdWxhdGlvbi5jCmluZGV4IDE3OWM3YTMuLmVjMTE2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hcG0tZW11bGF0aW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2FwbS1lbXVsYXRpb24uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9hcG0tZW11bGF0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTMyOSwxMyArMzMwLDggQEAKIAkJCS8qCiAJCQkgKiBXYWl0IGZvciB0aGUgc3VzcGVuZC9yZXN1bWUgdG8gY29tcGxldGUuICBJZiB0aGVyZQogCQkJICogYXJlIHBlbmRpbmcgYWNrbm93bGVkZ2VzLCB3ZSB3YWl0IGhlcmUgZm9yIHRoZW0uCi0JCQkgKgotCQkJICogTm90ZTogd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgUE0gc3Vic3lzdGVtIGRvZXMKLQkJCSAqIG5vdCBraWNrIHVzIG91dCBvZiB0aGUgd2FpdCB3aGVuIGl0IHN1c3BlbmRzIHRoZQotCQkJICogdGhyZWFkcy4KIAkJCSAqLwogCQkJZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKLQkJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJCQl3YWl0X2V2ZW50KGFwbV9zdXNwZW5kX3dhaXRxdWV1ZSwKIAkJCQkgICBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOwpAQCAtMzY1LDEzICszNjEsOCBAQAogCQkJLyoKIAkJCSAqIFdhaXQgZm9yIHRoZSBzdXNwZW5kL3Jlc3VtZSB0byBjb21wbGV0ZS4gIElmIHRoZXJlCiAJCQkgKiBhcmUgcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KLQkJCSAqCi0JCQkgKiBOb3RlOiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBQTSBzdWJzeXN0ZW0gZG9lcwotCQkJICogbm90IGtpY2sgdXMgb3V0IG9mIHRoZSB3YWl0IHdoZW4gaXQgc3VzcGVuZHMgdGhlCi0JCQkgKiB0aHJlYWRzLgogCQkJICovCiAJCQlmbGFncyA9IGN1cnJlbnQtPmZsYWdzOwotCQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhcG1fc3VzcGVuZF93YWl0cXVldWUsCiAJCQkJCSBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOwpAQCAtNTk4LDcgKzU4OSw2IEBACiAJCWthcG1kX3RzayA9IE5VTEw7CiAJCXJldHVybiByZXQ7CiAJfQotCWthcG1kX3Rzay0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAJd2FrZV91cF9wcm9jZXNzKGthcG1kX3Rzayk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYyBiL2RyaXZlcnMvY2hhci9icmlxX3BhbmVsLmMKaW5kZXggZWQ1M2Y1NC4uYjZmMjYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2JyaXFfcGFuZWwuYworKysgYi9kcml2ZXJzL2NoYXIvYnJpcV9wYW5lbC5jCkBAIC05MSwxMSArOTEsNiBAQAogCXVuc2lnbmVkIHNob3J0IGM7CiAJdW5zaWduZWQgY2hhciBjcDsKIAotI2lmIDAJLyogIENhbid0IHNlZWsgKHByZWFkKSBvbiB0aGlzIGRldmljZSAgKi8KLQlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCi0JCXJldHVybiAtRVNQSVBFOwotI2VuZGlmCi0KIAlpZiAoIXZmZF9pc19vcGVuKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMTM5LDExICsxMzQsNiBAQAogCXNpemVfdCBpbmR4ID0gbGVuOwogCWludCBpLCBlc2MgPSAwOwogCi0jaWYgMAkvKiAgQ2FuJ3Qgc2VlayAocHdyaXRlKSBvbiB0aGlzIGRldmljZSAgKi8KLQlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCi0JCXJldHVybiAtRVNQSVBFOwotI2VuZGlmCi0KIAlpZiAoIXZmZF9pc19vcGVuKQogCQlyZXR1cm4gLUVCVVNZOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jIGIvZHJpdmVycy9jaGFyL2NvbnNvbGVtYXAuYwppbmRleCBmZDQwYjk1Li40YjM5MTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY29uc29sZW1hcC5jCisrKyBiL2RyaXZlcnMvY2hhci9jb25zb2xlbWFwLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCXVuc2lnbmVkIGxvbmcJcmVmY291bnQ7CiAJdW5zaWduZWQgbG9uZwlzdW07CiAJdW5zaWduZWQgY2hhcgkqaW52ZXJzZV90cmFuc2xhdGlvbnNbNF07CisJdTE2CQkqaW52ZXJzZV90cmFuc191bmljb2RlOwogCWludAkJcmVhZG9ubHk7CiB9OwogCkBAIC0yMDcsNiArMjA4LDQxIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBzZXRfaW52ZXJzZV90cmFuc191bmljb2RlKHN0cnVjdCB2Y19kYXRhICpjb25wLAorCQkJCSAgICAgIHN0cnVjdCB1bmlfcGFnZWRpciAqcCkKK3sKKwlpbnQgaSwgaiwgaywgZ2x5cGg7CisJdTE2ICoqcDEsICpwMjsKKwl1MTYgKnE7CisKKwlpZiAoIXApIHJldHVybjsKKwlxID0gcC0+aW52ZXJzZV90cmFuc191bmljb2RlOworCWlmICghcSkgeworCQlxID0gcC0+aW52ZXJzZV90cmFuc191bmljb2RlID0KKwkJCWttYWxsb2MoTUFYX0dMWVBIICogc2l6ZW9mKHUxNiksIEdGUF9LRVJORUwpOworCQlpZiAoIXEpCisJCQlyZXR1cm47CisJfQorCW1lbXNldChxLCAwLCBNQVhfR0xZUEggKiBzaXplb2YodTE2KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlwMSA9IHAtPnVuaV9wZ2RpcltpXTsKKwkJaWYgKCFwMSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgeworCQkJcDIgPSBwMVtqXTsKKwkJCWlmICghcDIpCisJCQkJY29udGludWU7CisJCQlmb3IgKGsgPSAwOyBrIDwgNjQ7IGsrKykgeworCQkJCWdseXBoID0gcDJba107CisJCQkJaWYgKGdseXBoID49IDAgJiYgZ2x5cGggPCBNQVhfR0xZUEgKKwkJCQkJICAgICAgICYmIHFbZ2x5cGhdIDwgMzIpCisJCSAgCQkJcVtnbHlwaF0gPSAoaSA8PCAxMSkgKyAoaiA8PCA2KSArIGs7CisJCQl9CisJCX0KKwl9Cit9CisKIHVuc2lnbmVkIHNob3J0ICpzZXRfdHJhbnNsYXRlKGludCBtLCBzdHJ1Y3QgdmNfZGF0YSAqdmMpCiB7CiAJaW52X3RyYW5zbGF0ZVt2Yy0+dmNfbnVtXSA9IG07CkBAIC0yMTcsMTkgKzI1MywyOSBAQAogICogSW52ZXJzZSB0cmFuc2xhdGlvbiBpcyBpbXBvc3NpYmxlIGZvciBzZXZlcmFsIHJlYXNvbnM6CiAgKiAxLiBUaGUgZm9udDwtPmNoYXJhY3RlciBtYXBzIGFyZSBub3QgMS0xLgogICogMi4gVGhlIHRleHQgbWF5IGhhdmUgYmVlbiB3cml0dGVuIHdoaWxlIGEgZGlmZmVyZW50IHRyYW5zbGF0aW9uIG1hcAotICogICAgd2FzIGFjdGl2ZSwgb3IgdXNpbmcgVW5pY29kZS4KKyAqICAgIHdhcyBhY3RpdmUuCiAgKiBTdGlsbCwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGEgY2VydGFpbiBleHRlbnQgdG8gY3V0IGFuZCBwYXN0ZSBub24tQVNDSUkuCiAgKi8KLXVuc2lnbmVkIGNoYXIgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCkKK3UxNiBpbnZlcnNlX3RyYW5zbGF0ZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgaW50IGdseXBoLCBpbnQgdXNlX3VuaWNvZGUpCiB7CiAJc3RydWN0IHVuaV9wYWdlZGlyICpwOworCWludCBtOwogCWlmIChnbHlwaCA8IDAgfHwgZ2x5cGggPj0gTUFYX0dMWVBIKQogCQlyZXR1cm4gMDsKLQllbHNlIGlmICghKHAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKmNvbnAtPnZjX3VuaV9wYWdlZGlyX2xvYykgfHwKLQkJICFwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpbnZfdHJhbnNsYXRlW2NvbnAtPnZjX251bV1dKQorCWVsc2UgaWYgKCEocCA9IChzdHJ1Y3QgdW5pX3BhZ2VkaXIgKikqY29ucC0+dmNfdW5pX3BhZ2VkaXJfbG9jKSkKIAkJcmV0dXJuIGdseXBoOwotCWVsc2UKLQkJcmV0dXJuIHAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ludl90cmFuc2xhdGVbY29ucC0+dmNfbnVtXV1bZ2x5cGhdOworCWVsc2UgaWYgKHVzZV91bmljb2RlKSB7CisJCWlmICghcC0+aW52ZXJzZV90cmFuc191bmljb2RlKQorCQkJcmV0dXJuIGdseXBoOworCQllbHNlCisJCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc191bmljb2RlW2dseXBoXTsKKwl9IGVsc2UgeworCQltID0gaW52X3RyYW5zbGF0ZVtjb25wLT52Y19udW1dOworCQlpZiAoIXAtPmludmVyc2VfdHJhbnNsYXRpb25zW21dKQorCQkJcmV0dXJuIGdseXBoOworCQllbHNlCisJCQlyZXR1cm4gcC0+aW52ZXJzZV90cmFuc2xhdGlvbnNbbV1bZ2x5cGhdOworCX0KIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3VzZXJfbWFwcyh2b2lkKQpAQCAtMjQzLDYgKzI4OSw3IEBACiAJCXAgPSAoc3RydWN0IHVuaV9wYWdlZGlyICopKnZjX2NvbnNbaV0uZC0+dmNfdW5pX3BhZ2VkaXJfbG9jOwogCQlpZiAocCAmJiBwICE9IHEpIHsKIAkJCXNldF9pbnZlcnNlX3RyYW5zbCh2Y19jb25zW2ldLmQsIHAsIFVTRVJfTUFQKTsKKwkJCXNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUodmNfY29uc1tpXS5kLCBwKTsKIAkJCXEgPSBwOwogCQl9CiAJfQpAQCAtMzUzLDYgKzQwMCwxMCBAQAogCQlrZnJlZShwLT5pbnZlcnNlX3RyYW5zbGF0aW9uc1tpXSk7CiAJCXAtPmludmVyc2VfdHJhbnNsYXRpb25zW2ldID0gTlVMTDsKIAl9CisJaWYgKHAtPmludmVyc2VfdHJhbnNfdW5pY29kZSkgeworCQlrZnJlZShwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUpOworCQlwLT5pbnZlcnNlX3RyYW5zX3VuaWNvZGUgPSBOVUxMOworCX0KIH0KIAogdm9pZCBjb25fZnJlZV91bmltYXAoc3RydWN0IHZjX2RhdGEgKnZjKQpAQCAtNTExLDYgKzU2Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKIAkJc2V0X2ludmVyc2VfdHJhbnNsKHZjLCBwLCBpKTsgLyogVXBkYXRlIGFsbCBpbnZlcnNlIHRyYW5zbGF0aW9ucyAqLworCXNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUodmMsIHApOwogICAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTYxLDYgKzYxMyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKIAkJc2V0X2ludmVyc2VfdHJhbnNsKHZjLCBwLCBpKTsJLyogVXBkYXRlIGFsbCBpbnZlcnNlIHRyYW5zbGF0aW9ucyAqLworCXNldF9pbnZlcnNlX3RyYW5zX3VuaWNvZGUodmMsIHApOwogCWRmbHQgPSBwOwogCXJldHVybiBlcnI7CiB9CkBAIC02MTcsNiArNjcwLDE5IEBACiAJCXAtPnJlYWRvbmx5ID0gcmRvbmx5OwogfQogCisvKiBtYXkgYmUgY2FsbGVkIGR1cmluZyBhbiBpbnRlcnJ1cHQgKi8KK3UzMiBjb252XzhiaXRfdG9fdW5pKHVuc2lnbmVkIGNoYXIgYykKK3sKKwkvKgorCSAqIEFsd2F5cyB1c2UgVVNFUl9NQVAuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUga2V5Ym9hcmQsCisJICogd2hpY2ggc2hvdWxkbid0IGJlIGFmZmVjdGVkIGJ5IEcwL0cxIHN3aXRjaGluZywgZXRjLgorCSAqIElmIHRoZSB1c2VyIG1hcCBzdGlsbCBjb250YWlucyBkZWZhdWx0IHZhbHVlcywgaS5lLiB0aGUKKwkgKiBkaXJlY3QtdG8tZm9udCBtYXBwaW5nLCB0aGVuIGFzc3VtZSB1c2VyIGlzIHVzaW5nIExhdGluMS4KKwkgKi8KKwl1bnNpZ25lZCBzaG9ydCB1bmkgPSB0cmFuc2xhdGlvbnNbVVNFUl9NQVBdW2NdOworCXJldHVybiB1bmkgPT0gKDB4ZjAwMCB8IGMpID8gYyA6IHVuaTsKK30KKwogaW50CiBjb252X3VuaV90b19wYyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgbG9uZyB1Y3MpIAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwppbmRleCBjYTM3NmI5Li43YjA4Mzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYworKysgYi9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYwpAQCAtNjQ2LDYgKzY0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC02ODAsNiArNjgxLDQ0IEBACiAKICNkZWZpbmUgU1REX0NPTV9GTEFHUyAoMCkKIAorLyogZmlybXdhcmUgc3R1ZmYgKi8KKyNkZWZpbmUgWkxfTUFYX0JMT0NLUwkxNgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkweDAyMDEwMjAzCisjZGVmaW5lIFJBTV9TSVpFIDB4ODAwMDAKKworI2RlZmluZSBaX0ZQR0FfTE9BREVEKFgpCSgocmVhZGwoJihYKS0+aW5pdF9jdHJsKSAmICgxPDwxNykpICE9IDApCisKK2VudW0gemJsb2NrX3R5cGUgeworCVpCTE9DS19QUkcgPSAwLAorCVpCTE9DS19GUEdBID0gMQorfTsKKworc3RydWN0IHpmaWxlX2hlYWRlciB7CisJY2hhciBuYW1lWzY0XTsKKwljaGFyIGRhdGVbMzJdOworCWNoYXIgYXV4WzMyXTsKKwl1MzIgbl9jb25maWc7CisJdTMyIGNvbmZpZ19vZmZzZXQ7CisJdTMyIG5fYmxvY2tzOworCXUzMiBibG9ja19vZmZzZXQ7CisJdTMyIHJlc2VydmVkWzldOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCB6ZmlsZV9jb25maWcgeworCWNoYXIgbmFtZVs2NF07CisJdTMyIG1haWxib3g7CisJdTMyIGZ1bmN0aW9uOworCXUzMiBuX2Jsb2NrczsKKwl1MzIgYmxvY2tfbGlzdFtaTF9NQVhfQkxPQ0tTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgemZpbGVfYmxvY2sgeworCXUzMiB0eXBlOworCXUzMiBmaWxlX29mZnNldDsKKwl1MzIgcmFtX29mZnNldDsKKwl1MzIgc2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmN5X3NlcmlhbF9kcml2ZXI7CiAKICNpZmRlZiBDT05GSUdfSVNBCkBAIC0xODUxLDExICsxODkwLDExIEBACiAJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvOwogCXN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RhdGljIHN0cnVjdCBGSVJNX0lEICpmaXJtX2lkOwotCXN0YXRpYyBzdHJ1Y3QgWkZXX0NUUkwgKnpmd19jdHJsOwotCXN0YXRpYyBzdHJ1Y3QgQk9BUkRfQ1RSTCAqYm9hcmRfY3RybDsKLQlzdGF0aWMgc3RydWN0IENIX0NUUkwgKmNoX2N0cmw7Ci0Jc3RhdGljIHN0cnVjdCBCVUZfQ1RSTCAqYnVmX2N0cmw7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZDsKKwlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7CisJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKKwlzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOworCXN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CiAJaW50IGNhcmQsIHBvcnQ7CiAKQEAgLTE5OTksNyArMjAzOCw2IEBACiAJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKIAkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKIAkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKLQkJaW50IHJldHZhbDsKIAogCQliYXNlX2FkZHIgPSBjYXJkLT5iYXNlX2FkZHI7CiAKQEAgLTIzNzEsNyArMjQwOSw2IEBACiAJCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKIAkJc3RydWN0IEJPQVJEX0NUUkwgX19pb21lbSAqYm9hcmRfY3RybDsKIAkJc3RydWN0IENIX0NUUkwgX19pb21lbSAqY2hfY3RybDsKLQkJaW50IHJldHZhbDsKIAogCQliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyOwogCQlmaXJtX2lkID0gYmFzZV9hZGRyICsgSURfQUREUkVTUzsKQEAgLTQxMjcsMTAgKzQxNjQsNiBAQAogCXByaW50ayhLRVJOX0RFQlVHICJjeWM6Y3lfc2V0X3Rlcm1pb3MgdHR5QyVkXG4iLCBpbmZvLT5saW5lKTsKICNlbmRpZgogCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZyAmJgotCQkJKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIChJWE9OIHwgSVhBTlkpKSA9PQotCQkJKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgKElYT04gfCBJWEFOWSkpKQotCQlyZXR1cm47CiAJc2V0X2xpbmVfY2hhcihpbmZvKTsKIAogCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgpAQCAtNDczOSwxNyArNDc3MiwyOTUgQEAKIH0JCQkJLyogY3lfZGV0ZWN0X2lzYSAqLwogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIHZvaWQgX19kZXZpbml0IHBseF9pbml0KHZvaWQgX19pb21lbSAqIGFkZHIsIF9fdTMyIGluaXRjdGwpCitzdGF0aWMgaW5saW5lIGludCBfX2RldmluaXQgY3ljX2lzZndzdHIoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYTsKKworCWZvciAoYSA9IDA7IGEgPCBzaXplICYmICpzdHI7IGErKywgc3RyKyspCisJCWlmICgqc3RyICYgMHg4MCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJZm9yICg7IGEgPCBzaXplOyBhKyssIHN0cisrKQorCQlpZiAoKnN0cikKKwkJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RldmluaXQgY3l6X2ZwZ2FfY29weSh2b2lkIF9faW9tZW0gKmZwZ2EsIHU4ICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlmb3IgKDsgc2l6ZSA+IDA7IHNpemUtLSkgeworCQljeV93cml0ZWwoZnBnYSwgKmRhdGErKyk7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGx4X2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpcnEsCisJCXN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqYWRkcikKIHsKIAkvKiBSZXNldCBQTFggKi8KLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSB8IDB4NDAwMDAwMDApOworCWN5X3dyaXRlbCgmYWRkci0+aW5pdF9jdHJsLCByZWFkbCgmYWRkci0+aW5pdF9jdHJsKSB8IDB4NDAwMDAwMDApOwogCXVkZWxheSgxMDBMKTsKLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSAmIH4weDQwMDAwMDAwKTsKKwljeV93cml0ZWwoJmFkZHItPmluaXRfY3RybCwgcmVhZGwoJmFkZHItPmluaXRfY3RybCkgJiB+MHg0MDAwMDAwMCk7CiAKIAkvKiBSZWxvYWQgQ29uZmlnLiBSZWdpc3RlcnMgZnJvbSBFRVBST00gKi8KLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSB8IDB4MjAwMDAwMDApOworCWN5X3dyaXRlbCgmYWRkci0+aW5pdF9jdHJsLCByZWFkbCgmYWRkci0+aW5pdF9jdHJsKSB8IDB4MjAwMDAwMDApOwogCXVkZWxheSgxMDBMKTsKLQljeV93cml0ZWwoYWRkciArIGluaXRjdGwsIHJlYWRsKGFkZHIgKyBpbml0Y3RsKSAmIH4weDIwMDAwMDAwKTsKKwljeV93cml0ZWwoJmFkZHItPmluaXRfY3RybCwgcmVhZGwoJmFkZHItPmluaXRfY3RybCkgJiB+MHgyMDAwMDAwMCk7CisKKwkvKiBGb3Igc29tZSB5ZXQgdW5rbm93biByZWFzb24sIG9uY2UgdGhlIFBMWDkwNjAgcmVsb2FkcyB0aGUgRUVQUk9NLAorCSAqIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8gcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuCisJICogcmVnaXN0ZXJzLiBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudCBmaXguCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgX19jeXpfbG9hZF9mdyhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAorCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB1MzIgbWFpbGJveCwgdm9pZCBfX2lvbWVtICpiYXNlLAorCQl2b2lkIF9faW9tZW0gKmZwZ2EpCit7CisJdm9pZCAqcHRyID0gZnctPmRhdGE7CisJc3RydWN0IHpmaWxlX2hlYWRlciAqaCA9IHB0cjsKKwlzdHJ1Y3QgemZpbGVfY29uZmlnICpjLCAqY3M7CisJc3RydWN0IHpmaWxlX2Jsb2NrICpiLCAqYnM7CisJdW5zaWduZWQgaW50IGEsIHRtcCwgbGVuID0gZnctPnNpemU7CisjZGVmaW5lIEJBRF9GVyBLRVJOX0VSUiAiQmFkIGZpcm13YXJlOiAiCisJaWYgKGxlbiA8IHNpemVvZigqaCkpIHsKKwkJcHJpbnRrKEJBRF9GVyAidG9vIHNob3J0OiAldTwlenVcbiIsIGxlbiwgc2l6ZW9mKCpoKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNzID0gcHRyICsgaC0+Y29uZmlnX29mZnNldDsKKwlicyA9IHB0ciArIGgtPmJsb2NrX29mZnNldDsKKworCWlmICgodm9pZCAqKShjcyArIGgtPm5fY29uZmlnKSA+IHB0ciArIGxlbiB8fAorCQkJKHZvaWQgKikoYnMgKyBoLT5uX2Jsb2NrcykgPiBwdHIgKyBsZW4pIHsKKwkJcHJpbnRrKEJBRF9GVyAidG9vIHNob3J0Iik7CisJCXJldHVybiAgLUVJTlZBTDsKKwl9CisKKwlpZiAoY3ljX2lzZndzdHIoaC0+bmFtZSwgc2l6ZW9mKGgtPm5hbWUpKSB8fAorCQkJY3ljX2lzZndzdHIoaC0+ZGF0ZSwgc2l6ZW9mKGgtPmRhdGUpKSkgeworCQlwcmludGsoQkFEX0ZXICJiYWQgZm9ybWF0dGVkIGhlYWRlciBzdHJpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RybmNtcChuYW1lLCBoLT5uYW1lLCBzaXplb2YoaC0+bmFtZSkpKSB7CisJCXByaW50ayhCQURfRlcgImJhZCBuYW1lICclcycgKGV4cGVjdGVkICclcycpXG4iLCBoLT5uYW1lLCBuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdG1wID0gMDsKKwlmb3IgKGMgPSBjczsgYyA8IGNzICsgaC0+bl9jb25maWc7IGMrKykgeworCQlmb3IgKGEgPSAwOyBhIDwgYy0+bl9ibG9ja3M7IGErKykKKwkJCWlmIChjLT5ibG9ja19saXN0W2FdID4gaC0+bl9ibG9ja3MpIHsKKwkJCQlwcmludGsoQkFEX0ZXICJiYWQgYmxvY2sgcmVmIG51bWJlciBpbiBjZmdzXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJaWYgKGMtPm1haWxib3ggPT0gbWFpbGJveCAmJiBjLT5mdW5jdGlvbiA9PSAwKSAvKiAwIGlzIG5vcm1hbCAqLworCQkJdG1wKys7CisJfQorCWlmICghdG1wKSB7CisJCXByaW50ayhCQURfRlcgIm5vdGhpbmcgYXBwcm9wcmlhdGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGIgPSBiczsgYiA8IGJzICsgaC0+bl9ibG9ja3M7IGIrKykKKwkJaWYgKGItPmZpbGVfb2Zmc2V0ICsgYi0+c2l6ZSA+IGxlbikgeworCQkJcHJpbnRrKEJBRF9GVyAiYmFkIGJsb2NrIGRhdGEgb2Zmc2V0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkvKiBldmVyeXRoaW5nIGlzIE9LLCBsZXQncyBzZWVrJ24nbG9hZCBpdCAqLworCWZvciAoYyA9IGNzOyBjIDwgY3MgKyBoLT5uX2NvbmZpZzsgYysrKQorCQlpZiAoYy0+bWFpbGJveCA9PSBtYWlsYm94ICYmIGMtPmZ1bmN0aW9uID09IDApCisJCQlicmVhazsKKworCWZvciAoYSA9IDA7IGEgPCBjLT5uX2Jsb2NrczsgYSsrKSB7CisJCWIgPSAmYnNbYy0+YmxvY2tfbGlzdFthXV07CisJCWlmIChiLT50eXBlID09IFpCTE9DS19GUEdBKSB7CisJCQlpZiAoZnBnYSAhPSBOVUxMKQorCQkJCWN5el9mcGdhX2NvcHkoZnBnYSwgcHRyICsgYi0+ZmlsZV9vZmZzZXQsCisJCQkJCQliLT5zaXplKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChiYXNlICE9IE5VTEwpCisJCQkJbWVtY3B5X3RvaW8oYmFzZSArIGItPnJhbV9vZmZzZXQsCisJCQkJCSAgICAgICBwdHIgKyBiLT5maWxlX29mZnNldCwgYi0+c2l6ZSk7CisJCX0KKwl9CisjdW5kZWYgQkFEX0ZXCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN5el9sb2FkX2Z3KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmJhc2VfYWRkciwKKwkJc3RydWN0IFJVTlRJTUVfOTA2MCBfX2lvbWVtICpjdGxfYWRkciwgaW50IGlycSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXN0cnVjdCBGSVJNX0lEIF9faW9tZW0gKmZpZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7CisJc3RydWN0IENVU1RPTV9SRUcgX19pb21lbSAqY3VzdCA9IGJhc2VfYWRkcjsKKwlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqcHRfemZ3Y3RybDsKKwl2b2lkIF9faW9tZW0gKnRtcDsKKwl1MzIgbWFpbGJveCwgc3RhdHVzOworCXVuc2lnbmVkIGludCBpOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgImN5emZpcm0uYmluIiwgJnBkZXYtPmRldik7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgZmlybXdhcmVcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBmaXJtd2FyZSBpcyBhbHJlYWR5IGxvYWRlZCBhbmQgcnVubmluZy4gSWYKKwkgICBwb3NpdGl2ZSwgc2tpcCB0aGlzIGJvYXJkICovCisJaWYgKFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpICYmIHJlYWRsKCZmaWQtPnNpZ25hdHVyZSkgPT0gWkZJUk1fSUQpIHsKKwkJdTMyIGNudHZhbCA9IHJlYWRsKGJhc2VfYWRkciArIDB4MTkwKTsKKworCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKGNudHZhbCAhPSByZWFkbChiYXNlX2FkZHIgKyAweDE5MCkpIHsKKwkJCS8qIEZXIGNvdW50ZXIgaXMgd29ya2luZywgRlcgaXMgcnVubmluZyAqLworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiQ3ljbGFkZXMtWiBGVyBhbHJlYWR5IGxvYWRlZC4gIgorCQkJCQkiU2tpcHBpbmcgYm9hcmQuXG4iKTsKKwkJCXJldHZhbCA9IDA7CisJCQlnb3RvIGVycl9yZWw7CisJCX0KKwl9CisKKwkvKiBzdGFydCBib290ICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQsIHJlYWRsKCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQpICYKKwkJCX4weDAwMDMwODAwVUwpOworCisJbWFpbGJveCA9IHJlYWRsKCZjdGxfYWRkci0+bWFpbF9ib3hfMCk7CisKKwlpZiAobWFpbGJveCA9PSAwIHx8IFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKSB7CisJCS8qIHN0b3BzIENQVSBhbmQgc2V0IHdpbmRvdyB0byBiZWdpbm5pbmcgb2YgUkFNICovCisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9DUkVHKTsKKwkJY3lfd3JpdGVsKCZjdXN0LT5jcHVfc3RvcCwgMCk7CisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlwbHhfaW5pdChwZGV2LCBpcnEsIGN0bF9hZGRyKTsKKworCWlmIChtYWlsYm94ICE9IDApIHsKKwkJLyogbG9hZCBGUEdBICovCisJCXJldHZhbCA9IF9fY3l6X2xvYWRfZncoZncsICJDeWNsb20tWiIsIG1haWxib3gsIE5VTEwsCisJCQkJYmFzZV9hZGRyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyX3JlbDsKKwkJaWYgKCFaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZncgdXBsb2FkIHN1Y2Nlc3NmdWwsIGJ1dCBmdyBpcyAiCisJCQkJCSJub3QgbG9hZGVkXG4iKTsKKwkJCWdvdG8gZXJyX3JlbDsKKwkJfQorCX0KKworCS8qIHN0b3BzIENQVSBhbmQgc2V0IHdpbmRvdyB0byBiZWdpbm5pbmcgb2YgUkFNICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCWN5X3dyaXRlbCgmY3VzdC0+Y3B1X3N0b3AsIDApOworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCXVkZWxheSgxMDApOworCisJLyogY2xlYXIgbWVtb3J5ICovCisJZm9yICh0bXAgPSBiYXNlX2FkZHI7IHRtcCA8IGJhc2VfYWRkciArIFJBTV9TSVpFOyB0bXArKykKKwkJY3lfd3JpdGViKHRtcCwgMjU1KTsKKwlpZiAobWFpbGJveCAhPSAwKSB7CisJCS8qIHNldCB3aW5kb3cgdG8gbGFzdCA1MTJLIG9mIFJBTSAqLworCQljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNICsgUkFNX1NJWkUpOworCQkvL3NsZWVwKDEpOworCQlmb3IgKHRtcCA9IGJhc2VfYWRkcjsgdG1wIDwgYmFzZV9hZGRyICsgUkFNX1NJWkU7IHRtcCsrKQorCQkJY3lfd3JpdGViKHRtcCwgMjU1KTsKKwkJLyogc2V0IHdpbmRvdyB0byBiZWdpbm5pbmcgb2YgUkFNICovCisJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9SQU0pOworCQkvL3NsZWVwKDEpOworCX0KKworCXJldHZhbCA9IF9fY3l6X2xvYWRfZncoZncsICJDeWNsb20tWiIsIG1haWxib3gsIGJhc2VfYWRkciwgTlVMTCk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CisKKwkvKiBmaW5pc2ggYm9vdCBhbmQgc3RhcnQgYm9hcmRzICovCisJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOworCWN5X3dyaXRlbCgmY3VzdC0+Y3B1X3N0YXJ0LCAwKTsKKwljeV93cml0ZWwoJmN0bF9hZGRyLT5sb2NfYWRkcl9iYXNlLCBXSU5fUkFNKTsKKwlpID0gMDsKKwl3aGlsZSAoKHN0YXR1cyA9IHJlYWRsKCZmaWQtPnNpZ25hdHVyZSkpICE9IFpGSVJNX0lEICYmIGkrKyA8IDQwKQorCQltc2xlZXAoMTAwKTsKKwlpZiAoc3RhdHVzICE9IFpGSVJNX0lEKSB7CisJCWlmIChzdGF0dXMgPT0gWkZJUk1fSExUKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ5b3UgbmVlZCBhbiBleHRlcm5hbCBwb3dlciBzdXBwbHkgIgorCQkJCSJmb3IgdGhpcyBudW1iZXIgb2YgcG9ydHMuIEZpcm13YXJlIGhhbHRlZCBhbmQgIgorCQkJCSJib2FyZCByZXNldC5cbiIpOworCQkJcmV0dmFsID0gLUVJTzsKKwkJCWdvdG8gZXJyOworCQl9CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmaWQtPnNpZ25hdHVyZSA9IDB4JXguLi4gV2FpdGluZyAiCisJCQkJInNvbWUgbW9yZSB0aW1lXG4iLCBzdGF0dXMpOworCQl3aGlsZSAoKHN0YXR1cyA9IHJlYWRsKCZmaWQtPnNpZ25hdHVyZSkpICE9IFpGSVJNX0lEICYmCisJCQkJaSsrIDwgMjAwKQorCQkJbXNsZWVwKDEwMCk7CisJCWlmIChzdGF0dXMgIT0gWkZJUk1fSUQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkJvYXJkIG5vdCBzdGFydGVkIGluIDIwIHNlY29uZHMhICIKKwkJCQkJIkdpdmluZyB1cC4gKGZpZC0+c2lnbmF0dXJlID0gMHgleClcbiIsCisJCQkJCXN0YXR1cyk7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiKioqIFdhcm5pbmcgKioqOiBpZiB5b3UgYXJlICIKKwkJCQkidXBncmFkaW5nIHRoZSBGVywgcGxlYXNlIHBvd2VyIGN5Y2xlIHRoZSAiCisJCQkJInN5c3RlbSBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IEZXIHRvIHRoZSAiCisJCQkJIkN5Y2xhZGVzLVouXG4iKTsKKworCQkJaWYgKFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKQorCQkJCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBlcnI7CisJCX0KKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRmlybXdhcmUgc3RhcnRlZCBhZnRlciAlZCBzZWNvbmRzLlxuIiwKKwkJCQlpIC8gMTApOworCX0KKwlwdF96ZndjdHJsID0gYmFzZV9hZGRyICsgcmVhZGwoJmZpZC0+emZ3Y3RybF9hZGRyKTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgImZpZD0+ICVwLCB6ZndjdHJsX2FkZHI9PiAleCwgbnB0X3pmd2N0cmw9PiAlcFxuIiwKKwkJCWJhc2VfYWRkciArIElEX0FERFJFU1MsIHJlYWRsKCZmaWQtPnpmd2N0cmxfYWRkciksCisJCQliYXNlX2FkZHIgKyByZWFkbCgmZmlkLT56ZndjdHJsX2FkZHIpKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDeWNsYWRlcy1aIEZXIGxvYWRlZDogdmVyc2lvbiA9ICV4LCBwb3J0cyA9ICV1XG4iLAorCQlyZWFkbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5md192ZXJzaW9uKSwKKwkJcmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwubl9jaGFubmVsKSk7CisKKwlpZiAocmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwubl9jaGFubmVsKSA9PSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJubyBDeWNsYWRlcy1aIHBvcnRzIHdlcmUgZm91bmQuIFBsZWFzZSAiCisJCQkiY2hlY2sgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgWiBob3N0IGNhcmQgYW5kIHRoZSAiCisJCQkic2VyaWFsIGV4cGFuZGVycy5cbiIpOworCisJCWlmIChaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkKKwkJCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJOdWxsIG51bWJlciBvZiBwb3J0cyBkZXRlY3RlZC4gQm9hcmQgIgorCQkJCSJyZXNldC5cbiIpOworCQlyZXR2YWwgPSAwOworCQlnb3RvIGVycjsKKwl9CisKKwljeV93cml0ZWwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwub3Bfc3lzdGVtLCBDX09TX0xJTlVYKTsKKwljeV93cml0ZWwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwuZHJfdmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04pOworCisJLyoKKwkgICBFYXJseSBmaXJtd2FyZSBmYWlsZWQgdG8gc3RhcnQgbG9va2luZyBmb3IgY29tbWFuZHMuCisJICAgVGhpcyBlbmFibGVzIGZpcm13YXJlIGludGVycnVwdHMgZm9yIHRob3NlIGNvbW1hbmRzLgorCSAqLworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0LCByZWFkbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0KSB8CisJCQkoMSA8PCAxNykpOworCWN5X3dyaXRlbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0LCByZWFkbCgmY3RsX2FkZHItPmludHJfY3RybF9zdGF0KSB8CisJCQkweDAwMDMwODAwVUwpOworCisJcGx4X2luaXQocGRldiwgaXJxLCBjdGxfYWRkcik7CisKKwlyZXR1cm4gMDsKK2Vycl9yZWw6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CitlcnI6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgY3lfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApAQCAtNDgzMSwxNiArNTE0Miw5IEBACiAJCX0KIAogCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBiZWZvcmUgcmVzZXR0aW5nIGl0ICovCi0JCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsCi0JCQlyZWFkdyhhZGRyMCArIDB4NjgpICYgfjB4MDkwMCk7CisJCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsIHJlYWR3KGFkZHIwICsgMHg2OCkgJiB+MHgwOTAwKTsKIAotCQlwbHhfaW5pdChhZGRyMCwgMHg2Yyk7Ci0JCS8qIEZvciBzb21lIHlldCB1bmtub3duIHJlYXNvbiwgb25jZSB0aGUgUExYOTA2MCByZWxvYWRzCi0JCSAgIHRoZSBFRVBST00sIHRoZSBJUlEgaXMgbG9zdCBhbmQsIHRodXMsIHdlIGhhdmUgdG8KLQkJICAgcmUtd3JpdGUgaXQgdG8gdGhlIFBDSSBjb25maWcuIHJlZ2lzdGVycy4KLQkJICAgVGhpcyB3aWxsIHJlbWFpbiBoZXJlIHVudGlsIHdlIGZpbmQgYSBwZXJtYW5lbnQKLQkJICAgZml4LiAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworCQlwbHhfaW5pdChwZGV2LCBpcnEsIGFkZHIwKTsKIAogCQltYWlsYm94ID0gKHUzMilyZWFkbCgmY3RsX2FkZHItPm1haWxfYm94XzApOwogCkBAIC00ODgxLDYgKzUxODUsOSBAQAogCQkJaWYgKChtYWlsYm94ID09IFpPX1YxKSB8fCAobWFpbGJveCA9PSBaT19WMikpCiAJCQkJY3lfd3JpdGVsKGFkZHIyICsgSURfQUREUkVTUywgMEwpOwogCisJCQlyZXR2YWwgPSBjeXpfbG9hZF9mdyhwZGV2LCBhZGRyMiwgYWRkcjAsIGlycSk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXJyX3VubWFwOwogCQkJLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCiAJCQkgICB2ZXJzaW9uIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBkZXZpY2VfaWQgYW5kIHdpbGwKIAkJCSAgIGJlIGFsbG9jYXRlZCBpdHMgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMuICovCkBAIC00OTU3LDE1ICs1MjY0LDcgQEAKIAkJY2FzZSBQTFhfOTA2MDoKIAkJY2FzZSBQTFhfOTA4MDoKIAkJZGVmYXVsdDoJLyogT2xkIGJvYXJkcywgdXNlIFBMWF85MDYwICovCi0KLQkJCXBseF9pbml0KGFkZHIwLCAweDZjKTsKLQkJLyogRm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29uLCBvbmNlIHRoZSBQTFg5MDYwIHJlbG9hZHMKLQkJICAgdGhlIEVFUFJPTSwgdGhlIElSUSBpcyBsb3N0IGFuZCwgdGh1cywgd2UgaGF2ZSB0bwotCQkgICByZS13cml0ZSBpdCB0byB0aGUgUENJIGNvbmZpZy4gcmVnaXN0ZXJzLgotCQkgICBUaGlzIHdpbGwgcmVtYWluIGhlcmUgdW50aWwgd2UgZmluZCBhIHBlcm1hbmVudAotCQkgICBmaXguICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwotCisJCQlwbHhfaW5pdChwZGV2LCBpcnEsIGFkZHIwKTsKIAkJCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsIHJlYWR3KGFkZHIwICsgMHg2OCkgfCAweDA5MDApOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYwppbmRleCA1YjkxYmMwLi4zMzQ1NjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCkBAIC03Myw5ICs3Myw5IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhZGRyZXNzLCBvcmRlcik7CiB9CiAKLWludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKK2ludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKmdhcnRfaW5mbykKIHsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5ID0gZGV2LT5zZzsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnkgPSBkZXYtPnNnOwogCXVuc2lnbmVkIGxvbmcgcGFnZXM7CiAJaW50IGk7CiAJaW50IG9yZGVyOwpAQCAtMTIyLDkgKzEyMiw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9hdGlfcGNpZ2FydF9jbGVhbnVwKTsKIAotaW50IGRybV9hdGlfcGNpZ2FydF9pbml0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQoraW50IGRybV9hdGlfcGNpZ2FydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqZ2FydF9pbmZvKQogewotCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXN0cnVjdCBkcm1fc2dfbWVtICplbnRyeSA9IGRldi0+c2c7CiAJdm9pZCAqYWRkcmVzcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBwYWdlczsKIAl1MzIgKnBjaV9nYXJ0LCBwYWdlX2Jhc2UsIGJ1c19hZGRyZXNzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCmluZGV4IDA4OTE5ODQuLjJkNmYyZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm0uaApAQCAtMTA5LDMxICsxMDksMzEgQEAKICAqIFxub3RlIEtXOiBBY3R1YWxseSBpdCdzIGlsbGVnYWwgdG8gY2hhbmdlIGVpdGhlciBmb3IKICAqIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jbGlwX3JlY3Qgeworc3RydWN0IGRybV9jbGlwX3JlY3QgewogCXVuc2lnbmVkIHNob3J0IHgxOwogCXVuc2lnbmVkIHNob3J0IHkxOwogCXVuc2lnbmVkIHNob3J0IHgyOwogCXVuc2lnbmVkIHNob3J0IHkyOwotfSBkcm1fY2xpcF9yZWN0X3Q7Cit9OwogCiAvKioKICAqIERyYXdhYmxlIGluZm9ybWF0aW9uLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyB7CitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gewogCXVuc2lnbmVkIGludCBudW1fcmVjdHM7Ci0JZHJtX2NsaXBfcmVjdF90ICpyZWN0czsKLX0gZHJtX2RyYXdhYmxlX2luZm9fdDsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcmVjdHM7Cit9OwogCiAvKioKICAqIFRleHR1cmUgcmVnaW9uLAogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB7CitzdHJ1Y3QgZHJtX3RleF9yZWdpb24gewogCXVuc2lnbmVkIGNoYXIgbmV4dDsKIAl1bnNpZ25lZCBjaGFyIHByZXY7CiAJdW5zaWduZWQgY2hhciBpbl91c2U7CiAJdW5zaWduZWQgY2hhciBwYWRkaW5nOwogCXVuc2lnbmVkIGludCBhZ2U7Ci19IGRybV90ZXhfcmVnaW9uX3Q7Cit9OwogCiAvKioKICAqIEhhcmR3YXJlIGxvY2suCkBAIC0xNDIsMTcgKzE0MiwxNyBAQAogICogcHJvY2Vzc29yIGJ1cyBjb250ZW50aW9uIG9uIGEgbXVsdGlwcm9jZXNzb3Igc3lzdGVtLCB0aGVyZSBzaG91bGQgbm90IGJlIGFueQogICogb3RoZXIgZGF0YSBzdG9yZWQgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2h3X2xvY2sgeworc3RydWN0IGRybV9od19sb2NrIHsKIAlfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50IGxvY2s7CQkvKio8IGxvY2sgdmFyaWFibGUgKi8KIAljaGFyIHBhZGRpbmdbNjBdOwkJCS8qKjwgUGFkIHRvIGNhY2hlIGxpbmUgKi8KLX0gZHJtX2h3X2xvY2tfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1ZFUlNJT04gaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtR2V0VmVyc2lvbigpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fdmVyc2lvbiB7CitzdHJ1Y3QgZHJtX3ZlcnNpb24gewogCWludCB2ZXJzaW9uX21ham9yOwkgIC8qKjwgTWFqb3IgdmVyc2lvbiAqLwogCWludCB2ZXJzaW9uX21pbm9yOwkgIC8qKjwgTWlub3IgdmVyc2lvbiAqLwogCWludCB2ZXJzaW9uX3BhdGNobGV2ZWw7CSAgLyoqPCBQYXRjaCBsZXZlbCAqLwpAQCAtMTYyLDMzICsxNjIsMzMgQEAKIAljaGFyIF9fdXNlciAqZGF0ZTsJICAvKio8IFVzZXItc3BhY2UgYnVmZmVyIHRvIGhvbGQgZGF0ZSAqLwogCXNpemVfdCBkZXNjX2xlbjsJICAvKio8IExlbmd0aCBvZiBkZXNjIGJ1ZmZlciAqLwogCWNoYXIgX191c2VyICpkZXNjOwkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkZXNjICovCi19IGRybV92ZXJzaW9uX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9HRVRfVU5JUVVFIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUdldEJ1c2lkKCkgYW5kIGRybVNldEJ1c0lkKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV91bmlxdWUgeworc3RydWN0IGRybV91bmlxdWUgewogCXNpemVfdCB1bmlxdWVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSAqLwogCWNoYXIgX191c2VyICp1bmlxdWU7CSAgLyoqPCBVbmlxdWUgbmFtZSBmb3IgZHJpdmVyIGluc3RhbnRpYXRpb24gKi8KLX0gZHJtX3VuaXF1ZV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2xpc3Qgeworc3RydWN0IGRybV9saXN0IHsKIAlpbnQgY291bnQ7CQkgIC8qKjwgTGVuZ3RoIG9mIHVzZXItc3BhY2Ugc3RydWN0dXJlcyAqLwotCWRybV92ZXJzaW9uX3QgX191c2VyICp2ZXJzaW9uOwotfSBkcm1fbGlzdF90OworCXN0cnVjdCBkcm1fdmVyc2lvbiBfX3VzZXIgKnZlcnNpb247Cit9OwogCi10eXBlZGVmIHN0cnVjdCBkcm1fYmxvY2sgeworc3RydWN0IGRybV9ibG9jayB7CiAJaW50IHVudXNlZDsKLX0gZHJtX2Jsb2NrX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9DT05UUk9MIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUN0bEluc3RIYW5kbGVyKCkgYW5kIGRybUN0bFVuaW5zdEhhbmRsZXIoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2NvbnRyb2wgeworc3RydWN0IGRybV9jb250cm9sIHsKIAllbnVtIHsKIAkJRFJNX0FERF9DT01NQU5ELAogCQlEUk1fUk1fQ09NTUFORCwKQEAgLTE5NiwyNCArMTk2LDI0IEBACiAJCURSTV9VTklOU1RfSEFORExFUgogCX0gZnVuYzsKIAlpbnQgaXJxOwotfSBkcm1fY29udHJvbF90OworfTsKIAogLyoqCiAgKiBUeXBlIG9mIG1lbW9yeSB0byBtYXAuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fbWFwX3R5cGUgeworZW51bSBkcm1fbWFwX3R5cGUgewogCV9EUk1fRlJBTUVfQlVGRkVSID0gMCwJICAvKio8IFdDIChubyBjYWNoaW5nKSwgbm8gY29yZSBkdW1wICovCiAJX0RSTV9SRUdJU1RFUlMgPSAxLAkgIC8qKjwgbm8gY2FjaGluZywgbm8gY29yZSBkdW1wICovCiAJX0RSTV9TSE0gPSAyLAkJICAvKio8IHNoYXJlZCwgY2FjaGVkICovCiAJX0RSTV9BR1AgPSAzLAkJICAvKio8IEFHUC9HQVJUICovCiAJX0RSTV9TQ0FUVEVSX0dBVEhFUiA9IDQsICAvKio8IFNjYXR0ZXIvZ2F0aGVyIG1lbW9yeSBmb3IgUENJIERNQSAqLwogCV9EUk1fQ09OU0lTVEVOVCA9IDUsCSAgLyoqPCBDb25zaXN0ZW50IG1lbW9yeSBmb3IgUENJIERNQSAqLwotfSBkcm1fbWFwX3R5cGVfdDsKK307CiAKIC8qKgogICogTWVtb3J5IG1hcHBpbmcgZmxhZ3MuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fbWFwX2ZsYWdzIHsKK2VudW0gZHJtX21hcF9mbGFncyB7CiAJX0RSTV9SRVNUUklDVEVEID0gMHgwMSwJICAgICAvKio8IENhbm5vdCBiZSBtYXBwZWQgdG8gdXNlci12aXJ0dWFsICovCiAJX0RSTV9SRUFEX09OTFkgPSAweDAyLAogCV9EUk1fTE9DS0VEID0gMHgwNCwJICAgICAvKio8IHNoYXJlZCwgY2FjaGVkLCBsb2NrZWQgKi8KQEAgLTIyMSwxMiArMjIxLDEyIEBACiAJX0RSTV9XUklURV9DT01CSU5JTkcgPSAweDEwLCAvKio8IHVzZSB3cml0ZS1jb21iaW5pbmcgaWYgYXZhaWxhYmxlICovCiAJX0RSTV9DT05UQUlOU19MT0NLID0gMHgyMCwgICAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLwogCV9EUk1fUkVNT1ZBQkxFID0gMHg0MAkgICAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KLX0gZHJtX21hcF9mbGFnc190OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCB7CitzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCB7CiAJdW5zaWduZWQgaW50IGN0eF9pZDsJIC8qKjwgQ29udGV4dCByZXF1ZXN0aW5nIHByaXZhdGUgbWFwcGluZyAqLwogCXZvaWQgKmhhbmRsZTsJCSAvKio8IEhhbmRsZSBvZiBtYXAgKi8KLX0gZHJtX2N0eF9wcml2X21hcF90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX01BUCwgRFJNX0lPQ1RMX0FERF9NQVAgYW5kIERSTV9JT0NUTF9STV9NQVAgaW9jdGxzCkBAIC0yMzQsMzAgKzIzNCwzMCBAQAogICoKICAqIFxzYSBkcm1BZGRNYXAoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCB7CitzdHJ1Y3QgZHJtX21hcCB7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CSAvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICgwIGZvciBTQVJFQSkqLwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsJIC8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIHNpemUgKGJ5dGVzKSAqLwotCWRybV9tYXBfdHlwZV90IHR5cGU7CSAvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLwotCWRybV9tYXBfZmxhZ3NfdCBmbGFnczsJIC8qKjwgRmxhZ3MgKi8KKwllbnVtIGRybV9tYXBfdHlwZSB0eXBlOwkgLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwllbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3M7CSAvKio8IEZsYWdzICovCiAJdm9pZCAqaGFuZGxlOwkJIC8qKjwgVXNlci1zcGFjZTogIkhhbmRsZSIgdG8gcGFzcyB0byBtbWFwKCkgKi8KIAkJCQkgLyoqPCBLZXJuZWwtc3BhY2U6IGtlcm5lbC12aXJ0dWFsIGFkZHJlc3MgKi8KIAlpbnQgbXRycjsJCSAvKio8IE1UUlIgc2xvdCB1c2VkICovCiAJLyogICBQcml2YXRlIGRhdGEgKi8KLX0gZHJtX21hcF90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX0NMSUVOVCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY2xpZW50IHsKK3N0cnVjdCBkcm1fY2xpZW50IHsKIAlpbnQgaWR4OwkJLyoqPCBXaGljaCBjbGllbnQgZGVzaXJlZD8gKi8KIAlpbnQgYXV0aDsJCS8qKjwgSXMgY2xpZW50IGF1dGhlbnRpY2F0ZWQ/ICovCiAJdW5zaWduZWQgbG9uZyBwaWQ7CS8qKjwgUHJvY2VzcyBJRCAqLwogCXVuc2lnbmVkIGxvbmcgdWlkOwkvKio8IFVzZXIgSUQgKi8KIAl1bnNpZ25lZCBsb25nIG1hZ2ljOwkvKio8IE1hZ2ljICovCiAJdW5zaWduZWQgbG9uZyBpb2NzOwkvKio8IElvY3RsIGNvdW50ICovCi19IGRybV9jbGllbnRfdDsKK307CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIGRybV9zdGF0X3R5cGUgewogCV9EUk1fU1RBVF9MT0NLLAogCV9EUk1fU1RBVF9PUEVOUywKIAlfRFJNX1NUQVRfQ0xPU0VTLApAQCAtMjc1LDIzICsyNzUsMjMgQEAKIAlfRFJNX1NUQVRfU1BFQ0lBTCwJLyoqPCBTcGVjaWFsIERNQSAoZS5nLiwgcHJpb3JpdHkgb3IgcG9sbGVkKSAqLwogCV9EUk1fU1RBVF9NSVNTRUQJLyoqPCBNaXNzZWQgRE1BIG9wcG9ydHVuaXR5ICovCiAJICAgIC8qIEFkZCB0byB0aGUgKkVORCogb2YgdGhlIGxpc3QgKi8KLX0gZHJtX3N0YXRfdHlwZV90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfR0VUX1NUQVRTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zdGF0cyB7CitzdHJ1Y3QgZHJtX3N0YXRzIHsKIAl1bnNpZ25lZCBsb25nIGNvdW50OwogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0JCWRybV9zdGF0X3R5cGVfdCB0eXBlOworCQllbnVtIGRybV9zdGF0X3R5cGUgdHlwZTsKIAl9IGRhdGFbMTVdOwotfSBkcm1fc3RhdHNfdDsKK307CiAKIC8qKgogICogSGFyZHdhcmUgbG9ja2luZyBmbGFncy4KICAqLwotdHlwZWRlZiBlbnVtIGRybV9sb2NrX2ZsYWdzIHsKK2VudW0gZHJtX2xvY2tfZmxhZ3MgewogCV9EUk1fTE9DS19SRUFEWSA9IDB4MDEsCSAgICAgLyoqPCBXYWl0IHVudGlsIGhhcmR3YXJlIGlzIHJlYWR5IGZvciBETUEgKi8KIAlfRFJNX0xPQ0tfUVVJRVNDRU5UID0gMHgwMiwgIC8qKjwgV2FpdCB1bnRpbCBoYXJkd2FyZSBxdWllc2NlbnQgKi8KIAlfRFJNX0xPQ0tfRkxVU0ggPSAweDA0LAkgICAgIC8qKjwgRmx1c2ggdGhpcyBjb250ZXh0J3MgRE1BIHF1ZXVlIGZpcnN0ICovCkBAIC0zMDEsMTcgKzMwMSwxNyBAQAogCSAgIGZ1bGwtc2NyZWVuIERHQS1saWtlIG1vZGUuICovCiAJX0RSTV9IQUxUX0FMTF9RVUVVRVMgPSAweDEwLCAvKio8IEhhbHQgYWxsIGN1cnJlbnQgYW5kIGZ1dHVyZSBxdWV1ZXMgKi8KIAlfRFJNX0hBTFRfQ1VSX1FVRVVFUyA9IDB4MjAgIC8qKjwgSGFsdCBhbGwgY3VycmVudCBxdWV1ZXMgKi8KLX0gZHJtX2xvY2tfZmxhZ3NfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0xPQ0ssIERSTV9JT0NUTF9VTkxPQ0sgYW5kIERSTV9JT0NUTF9GSU5JU0ggaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqCiAgKiBcc2EgZHJtR2V0TG9jaygpIGFuZCBkcm1VbmxvY2soKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2xvY2sgeworc3RydWN0IGRybV9sb2NrIHsKIAlpbnQgY29udGV4dDsKLQlkcm1fbG9ja19mbGFnc190IGZsYWdzOwotfSBkcm1fbG9ja190OworCWVudW0gZHJtX2xvY2tfZmxhZ3MgZmxhZ3M7Cit9OwogCiAvKioKICAqIERNQSBmbGFncwpAQCAtMzIxLDcgKzMyMSw3IEBACiAgKgogICogXHNhIGRybV9kbWEuCiAgKi8KLXR5cGVkZWYgZW51bSBkcm1fZG1hX2ZsYWdzIHsKK2VudW0gZHJtX2RtYV9mbGFncyB7CiAJLyogRmxhZ3MgZm9yIERNQSBidWZmZXIgZGlzcGF0Y2ggKi8KIAlfRFJNX0RNQV9CTE9DSyA9IDB4MDEsCSAgICAgIC8qKjwKIAkJCQkgICAgICAgKiBCbG9jayB1bnRpbCBidWZmZXIgZGlzcGF0Y2hlZC4KQEAgLTM0MCwxNCArMzQwLDE0IEBACiAJX0RSTV9ETUFfV0FJVCA9IDB4MTAsCSAgICAgIC8qKjwgV2FpdCBmb3IgZnJlZSBidWZmZXJzICovCiAJX0RSTV9ETUFfU01BTExFUl9PSyA9IDB4MjAsICAgLyoqPCBTbWFsbGVyLXRoYW4tcmVxdWVzdGVkIGJ1ZmZlcnMgT0sgKi8KIAlfRFJNX0RNQV9MQVJHRVJfT0sgPSAweDQwICAgICAvKio8IExhcmdlci10aGFuLXJlcXVlc3RlZCBidWZmZXJzIE9LICovCi19IGRybV9kbWFfZmxhZ3NfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FERF9CVUZTIGFuZCBEUk1fSU9DVExfTUFSS19CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKgogICogXHNhIGRybUFkZEJ1ZnMoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHsKK3N0cnVjdCBkcm1fYnVmX2Rlc2MgewogCWludCBjb3VudDsJCSAvKio8IE51bWJlciBvZiBidWZmZXJzIG9mIHRoaXMgc2l6ZSAqLwogCWludCBzaXplOwkJIC8qKjwgU2l6ZSBpbiBieXRlcyAqLwogCWludCBsb3dfbWFyazsJCSAvKio8IExvdyB3YXRlciBtYXJrICovCkBAIC0zNjMsNDQgKzM2Myw0NCBAQAogCQkJCSAgKiBTdGFydCBhZGRyZXNzIG9mIHdoZXJlIHRoZSBBR1AgYnVmZmVycyBhcmUKIAkJCQkgICogaW4gdGhlIEFHUCBhcGVydHVyZQogCQkJCSAgKi8KLX0gZHJtX2J1Zl9kZXNjX3Q7Cit9OwogCiAvKioKICAqIERSTV9JT0NUTF9JTkZPX0JVRlMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHsKK3N0cnVjdCBkcm1fYnVmX2luZm8gewogCWludCBjb3VudDsJCS8qKjwgRW50cmllcyBpbiBsaXN0ICovCi0JZHJtX2J1Zl9kZXNjX3QgX191c2VyICpsaXN0OwotfSBkcm1fYnVmX2luZm9fdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqbGlzdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0ZSRUVfQlVGUyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2ZyZWUgeworc3RydWN0IGRybV9idWZfZnJlZSB7CiAJaW50IGNvdW50OwogCWludCBfX3VzZXIgKmxpc3Q7Ci19IGRybV9idWZfZnJlZV90OworfTsKIAogLyoqCiAgKiBCdWZmZXIgaW5mb3JtYXRpb24KICAqCiAgKiBcc2EgZHJtX2J1Zl9tYXAuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfcHViIHsKK3N0cnVjdCBkcm1fYnVmX3B1YiB7CiAJaW50IGlkeDsJCSAgICAgICAvKio8IEluZGV4IGludG8gdGhlIG1hc3RlciBidWZmZXIgbGlzdCAqLwogCWludCB0b3RhbDsJCSAgICAgICAvKio8IEJ1ZmZlciBzaXplICovCiAJaW50IHVzZWQ7CQkgICAgICAgLyoqPCBBbW91bnQgb2YgYnVmZmVyIGluIHVzZSAoZm9yIERNQSkgKi8KIAl2b2lkIF9fdXNlciAqYWRkcmVzczsJICAgICAgIC8qKjwgQWRkcmVzcyBvZiBidWZmZXIgKi8KLX0gZHJtX2J1Zl9wdWJfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX01BUF9CVUZTIGlvY3RsIGFyZ3VtZW50IHR5cGUuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9idWZfbWFwIHsKK3N0cnVjdCBkcm1fYnVmX21hcCB7CiAJaW50IGNvdW50OwkJLyoqPCBMZW5ndGggb2YgdGhlIGJ1ZmZlciBsaXN0ICovCiAJdm9pZCBfX3VzZXIgKnZpcnR1YWw7CQkvKio8IE1tYXAnZCBhcmVhIGluIHVzZXItdmlydHVhbCAqLwotCWRybV9idWZfcHViX3QgX191c2VyICpsaXN0OwkvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLwotfSBkcm1fYnVmX21hcF90OworCXN0cnVjdCBkcm1fYnVmX3B1YiBfX3VzZXIgKmxpc3Q7CS8qKjwgQnVmZmVyIGluZm9ybWF0aW9uICovCit9OwogCiAvKioKICAqIERSTV9JT0NUTF9ETUEgaW9jdGwgYXJndW1lbnQgdHlwZS4KQEAgLTQwOSw0OCArNDA5LDQ4IEBACiAgKgogICogXHNhIGRybURNQSgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZG1hIHsKK3N0cnVjdCBkcm1fZG1hIHsKIAlpbnQgY29udGV4dDsJCQkgIC8qKjwgQ29udGV4dCBoYW5kbGUgKi8KIAlpbnQgc2VuZF9jb3VudDsJCQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgdG8gc2VuZCAqLwogCWludCBfX3VzZXIgKnNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCiAJaW50IF9fdXNlciAqc2VuZF9zaXplczsJCSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLwotCWRybV9kbWFfZmxhZ3NfdCBmbGFnczsJCSAgLyoqPCBGbGFncyAqLworCWVudW0gZHJtX2RtYV9mbGFncyBmbGFnczsJICAvKio8IEZsYWdzICovCiAJaW50IHJlcXVlc3RfY291bnQ7CQkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCiAJaW50IHJlcXVlc3Rfc2l6ZTsJCSAgLyoqPCBEZXNpcmVkIHNpemUgZm9yIGJ1ZmZlcnMgKi8KIAlpbnQgX191c2VyICpyZXF1ZXN0X2luZGljZXM7CSAgLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KIAlpbnQgX191c2VyICpyZXF1ZXN0X3NpemVzOwogCWludCBncmFudGVkX2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIGdyYW50ZWQgKi8KLX0gZHJtX2RtYV90OworfTsKIAotdHlwZWRlZiBlbnVtIHsKK2VudW0gZHJtX2N0eF9mbGFncyB7CiAJX0RSTV9DT05URVhUX1BSRVNFUlZFRCA9IDB4MDEsCiAJX0RSTV9DT05URVhUXzJET05MWSA9IDB4MDIKLX0gZHJtX2N0eF9mbGFnc190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUREX0NUWCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1DcmVhdGVDb250ZXh0KCkgYW5kIGRybURlc3Ryb3lDb250ZXh0KCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9jdHggeworc3RydWN0IGRybV9jdHggewogCWRybV9jb250ZXh0X3QgaGFuZGxlOwotCWRybV9jdHhfZmxhZ3NfdCBmbGFnczsKLX0gZHJtX2N0eF90OworCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1JFU19DVFggaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMgeworc3RydWN0IGRybV9jdHhfcmVzIHsKIAlpbnQgY291bnQ7Ci0JZHJtX2N0eF90IF9fdXNlciAqY29udGV4dHM7Ci19IGRybV9jdHhfcmVzX3Q7CisJc3RydWN0IGRybV9jdHggX191c2VyICpjb250ZXh0czsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FERF9EUkFXIGFuZCBEUk1fSU9DVExfUk1fRFJBVyBpb2N0bCBhcmd1bWVudCB0eXBlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZHJhdyB7CitzdHJ1Y3QgZHJtX2RyYXcgewogCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKLX0gZHJtX2RyYXdfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX1VQREFURV9EUkFXIGlvY3RsIGFyZ3VtZW50IHR5cGUuCkBAIC00NTksNTIgKzQ1OSw1MiBAQAogCURSTV9EUkFXQUJMRV9DTElQUkVDVFMsCiB9IGRybV9kcmF3YWJsZV9pbmZvX3R5cGVfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IHsKK3N0cnVjdCBkcm1fdXBkYXRlX2RyYXcgewogCWRybV9kcmF3YWJsZV90IGhhbmRsZTsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKIAl1bnNpZ25lZCBpbnQgbnVtOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhOwotfSBkcm1fdXBkYXRlX2RyYXdfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0dFVF9NQUdJQyBhbmQgRFJNX0lPQ1RMX0FVVEhfTUFHSUMgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2F1dGggeworc3RydWN0IGRybV9hdXRoIHsKIAlkcm1fbWFnaWNfdCBtYWdpYzsKLX0gZHJtX2F1dGhfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0lSUV9CVVNJRCBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1HZXRJbnRlcnJ1cHRGcm9tQnVzSUQoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2lycV9idXNpZCB7CitzdHJ1Y3QgZHJtX2lycV9idXNpZCB7CiAJaW50IGlycTsJLyoqPCBJUlEgbnVtYmVyICovCiAJaW50IGJ1c251bTsJLyoqPCBidXMgbnVtYmVyICovCiAJaW50IGRldm51bTsJLyoqPCBkZXZpY2UgbnVtYmVyICovCiAJaW50IGZ1bmNudW07CS8qKjwgZnVuY3Rpb24gbnVtYmVyICovCi19IGRybV9pcnFfYnVzaWRfdDsKK307CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgewogCV9EUk1fVkJMQU5LX0FCU09MVVRFID0gMHgwLAkvKio8IFdhaXQgZm9yIHNwZWNpZmljIHZibGFuayBzZXF1ZW5jZSBudW1iZXIgKi8KIAlfRFJNX1ZCTEFOS19SRUxBVElWRSA9IDB4MSwJLyoqPCBXYWl0IGZvciBnaXZlbiBudW1iZXIgb2YgdmJsYW5rcyAqLwogCV9EUk1fVkJMQU5LX05FWFRPTk1JU1MgPSAweDEwMDAwMDAwLAkvKio8IElmIG1pc3NlZCwgd2FpdCBmb3IgbmV4dCB2YmxhbmsgKi8KIAlfRFJNX1ZCTEFOS19TRUNPTkRBUlkgPSAweDIwMDAwMDAwLAkvKio8IFNlY29uZGFyeSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KIAlfRFJNX1ZCTEFOS19TSUdOQUwgPSAweDQwMDAwMDAwCS8qKjwgU2VuZCBzaWduYWwgaW5zdGVhZCBvZiBibG9ja2luZyAqLwotfSBkcm1fdmJsYW5rX3NlcV90eXBlX3Q7Cit9OwogCiAjZGVmaW5lIF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgKF9EUk1fVkJMQU5LX0FCU09MVVRFIHwgX0RSTV9WQkxBTktfUkVMQVRJVkUpCiAjZGVmaW5lIF9EUk1fVkJMQU5LX0ZMQUdTX01BU0sgKF9EUk1fVkJMQU5LX1NJR05BTCB8IF9EUk1fVkJMQU5LX1NFQ09OREFSWSB8IFwKIAkJCQlfRFJNX1ZCTEFOS19ORVhUT05NSVNTKQogCiBzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcXVlc3QgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAl1bnNpZ25lZCBsb25nIHNpZ25hbDsKIH07CiAKIHN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAlsb25nIHR2YWxfc2VjOwogCWxvbmcgdHZhbF91c2VjOwpAQCAtNTE1LDQxICs1MTUsNDEgQEAKICAqCiAgKiBcc2EgZHJtV2FpdFZCbGFuaygpLgogICovCi10eXBlZGVmIHVuaW9uIGRybV93YWl0X3ZibGFuayB7Cit1bmlvbiBkcm1fd2FpdF92YmxhbmsgewogCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdCByZXF1ZXN0OwogCXN0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkgcmVwbHk7Ci19IGRybV93YWl0X3ZibGFua190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUdQX0VOQUJMRSBpb2N0bCBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZ3BFbmFibGUoKS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9tb2RlIHsKK3N0cnVjdCBkcm1fYWdwX21vZGUgewogCXVuc2lnbmVkIGxvbmcgbW9kZTsJLyoqPCBBR1AgbW9kZSAqLwotfSBkcm1fYWdwX21vZGVfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FHUF9BTExPQyBhbmQgRFJNX0lPQ1RMX0FHUF9GUkVFIGlvY3RscyBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZ3BBbGxvYygpIGFuZCBkcm1BZ3BGcmVlKCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfYnVmZmVyIHsKK3N0cnVjdCBkcm1fYWdwX2J1ZmZlciB7CiAJdW5zaWduZWQgbG9uZyBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLwogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwkvKio8IFVzZWQgZm9yIGJpbmRpbmcgLyB1bmJpbmRpbmcgKi8KIAl1bnNpZ25lZCBsb25nIHR5cGU7CS8qKjwgVHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKi8KIAl1bnNpZ25lZCBsb25nIHBoeXNpY2FsOwkvKio8IFBoeXNpY2FsIHVzZWQgYnkgaTgxMCAqLwotfSBkcm1fYWdwX2J1ZmZlcl90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfQUdQX0JJTkQgYW5kIERSTV9JT0NUTF9BR1BfVU5CSU5EIGlvY3RscyBhcmd1bWVudCB0eXBlLgogICoKICAqIFxzYSBkcm1BZ3BCaW5kKCkgYW5kIGRybUFncFVuYmluZCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgeworc3RydWN0IGRybV9hZ3BfYmluZGluZyB7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CS8qKjwgRnJvbSBkcm1fYWdwX2J1ZmZlciAqLwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLwotfSBkcm1fYWdwX2JpbmRpbmdfdDsKK307CiAKIC8qKgogICogRFJNX0lPQ1RMX0FHUF9JTkZPIGlvY3RsIGFyZ3VtZW50IHR5cGUuCkBAIC01NTgsNyArNTU4LDcgQEAKICAqIGRybUFncEJhc2UoKSwgZHJtQWdwU2l6ZSgpLCBkcm1BZ3BNZW1vcnlVc2VkKCksIGRybUFncE1lbW9yeUF2YWlsKCksCiAgKiBkcm1BZ3BWZW5kb3JJZCgpIGFuZCBkcm1BZ3BEZXZpY2VJZCgpLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYWdwX2luZm8geworc3RydWN0IGRybV9hZ3BfaW5mbyB7CiAJaW50IGFncF92ZXJzaW9uX21ham9yOwogCWludCBhZ3BfdmVyc2lvbl9taW5vcjsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CkBAIC01NzAsMjUgKzU3MCwyNSBAQAogCS8qIFBDSSBpbmZvcm1hdGlvbiAqLwogCXVuc2lnbmVkIHNob3J0IGlkX3ZlbmRvcjsKIAl1bnNpZ25lZCBzaG9ydCBpZF9kZXZpY2U7Ci19IGRybV9hZ3BfaW5mb190OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfU0dfQUxMT0MgaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHsKK3N0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgewogCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyoqPCBJbiBieXRlcyAtLSB3aWxsIHJvdW5kIHRvIHBhZ2UgYm91bmRhcnkgKi8KIAl1bnNpZ25lZCBsb25nIGhhbmRsZTsJLyoqPCBVc2VkIGZvciBtYXBwaW5nIC8gdW5tYXBwaW5nICovCi19IGRybV9zY2F0dGVyX2dhdGhlcl90OworfTsKIAogLyoqCiAgKiBEUk1fSU9DVExfU0VUX1ZFUlNJT04gaW9jdGwgYXJndW1lbnQgdHlwZS4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHsKK3N0cnVjdCBkcm1fc2V0X3ZlcnNpb24gewogCWludCBkcm1fZGlfbWFqb3I7CiAJaW50IGRybV9kaV9taW5vcjsKIAlpbnQgZHJtX2RkX21ham9yOwogCWludCBkcm1fZGRfbWlub3I7Ci19IGRybV9zZXRfdmVyc2lvbl90OworfTsKIAogI2RlZmluZSBEUk1fSU9DVExfQkFTRQkJCSdkJwogI2RlZmluZSBEUk1fSU8obnIpCQkJX0lPKERSTV9JT0NUTF9CQVNFLG5yKQpAQCAtNTk2LDYxICs1OTYsNjEgQEAKICNkZWZpbmUgRFJNX0lPVyhucix0eXBlKQkJX0lPVyhEUk1fSU9DVExfQkFTRSxucix0eXBlKQogI2RlZmluZSBEUk1fSU9XUihucix0eXBlKQkJX0lPV1IoRFJNX0lPQ1RMX0JBU0UsbnIsdHlwZSkKIAotI2RlZmluZSBEUk1fSU9DVExfVkVSU0lPTgkJRFJNX0lPV1IoMHgwMCwgZHJtX3ZlcnNpb25fdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9VTklRVUUJCURSTV9JT1dSKDB4MDEsIGRybV91bmlxdWVfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQUdJQwkJRFJNX0lPUiggMHgwMiwgZHJtX2F1dGhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0lSUV9CVVNJRAkJRFJNX0lPV1IoMHgwMywgZHJtX2lycV9idXNpZF90KQotI2RlZmluZSBEUk1fSU9DVExfR0VUX01BUCAgICAgICAgICAgICAgIERSTV9JT1dSKDB4MDQsIGRybV9tYXBfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DTElFTlQgICAgICAgICAgICBEUk1fSU9XUigweDA1LCBkcm1fY2xpZW50X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfU1RBVFMgICAgICAgICAgICAgRFJNX0lPUiggMHgwNiwgZHJtX3N0YXRzX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9TRVRfVkVSU0lPTgkJRFJNX0lPV1IoMHgwNywgZHJtX3NldF92ZXJzaW9uX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WRVJTSU9OCQlEUk1fSU9XUigweDAwLCBzdHJ1Y3QgZHJtX3ZlcnNpb24pCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfVU5JUVVFCQlEUk1fSU9XUigweDAxLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQUdJQwkJRFJNX0lPUiggMHgwMiwgc3RydWN0IGRybV9hdXRoKQorI2RlZmluZSBEUk1fSU9DVExfSVJRX0JVU0lECQlEUk1fSU9XUigweDAzLCBzdHJ1Y3QgZHJtX2lycV9idXNpZCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9NQVAgICAgICAgICAgICAgICBEUk1fSU9XUigweDA0LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DTElFTlQgICAgICAgICAgICBEUk1fSU9XUigweDA1LCBzdHJ1Y3QgZHJtX2NsaWVudCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TVEFUUyAgICAgICAgICAgICBEUk1fSU9SKCAweDA2LCBzdHJ1Y3QgZHJtX3N0YXRzKQorI2RlZmluZSBEUk1fSU9DVExfU0VUX1ZFUlNJT04JCURSTV9JT1dSKDB4MDcsIHN0cnVjdCBkcm1fc2V0X3ZlcnNpb24pCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1NFVF9VTklRVUUJCURSTV9JT1coIDB4MTAsIGRybV91bmlxdWVfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIGRybV9hdXRoX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9CTE9DSwkJCURSTV9JT1dSKDB4MTIsIGRybV9ibG9ja190KQotI2RlZmluZSBEUk1fSU9DVExfVU5CTE9DSwkJRFJNX0lPV1IoMHgxMywgZHJtX2Jsb2NrX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBkcm1fY29udHJvbF90KQotI2RlZmluZSBEUk1fSU9DVExfQUREX01BUAkJRFJNX0lPV1IoMHgxNSwgZHJtX21hcF90KQotI2RlZmluZSBEUk1fSU9DVExfQUREX0JVRlMJCURSTV9JT1dSKDB4MTYsIGRybV9idWZfZGVzY190KQotI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBkcm1fYnVmX2Rlc2NfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0lORk9fQlVGUwkJRFJNX0lPV1IoMHgxOCwgZHJtX2J1Zl9pbmZvX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9NQVBfQlVGUwkJRFJNX0lPV1IoMHgxOSwgZHJtX2J1Zl9tYXBfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgZHJtX2J1Zl9mcmVlX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFCQlEUk1fSU9XKCAweDEwLCBzdHJ1Y3QgZHJtX3VuaXF1ZSkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FVVEhfTUFHSUMJCURSTV9JT1coIDB4MTEsIHN0cnVjdCBkcm1fYXV0aCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0JMT0NLCQkJRFJNX0lPV1IoMHgxMiwgc3RydWN0IGRybV9ibG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOQkxPQ0sJCURSTV9JT1dSKDB4MTMsIHN0cnVjdCBkcm1fYmxvY2spCisjZGVmaW5lIERSTV9JT0NUTF9DT05UUk9MCQlEUk1fSU9XKCAweDE0LCBzdHJ1Y3QgZHJtX2NvbnRyb2wpCisjZGVmaW5lIERSTV9JT0NUTF9BRERfTUFQCQlEUk1fSU9XUigweDE1LCBzdHJ1Y3QgZHJtX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTCQlEUk1fSU9XUigweDE2LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfTUFSS19CVUZTCQlEUk1fSU9XKCAweDE3LCBzdHJ1Y3QgZHJtX2J1Zl9kZXNjKQorI2RlZmluZSBEUk1fSU9DVExfSU5GT19CVUZTCQlEUk1fSU9XUigweDE4LCBzdHJ1Y3QgZHJtX2J1Zl9pbmZvKQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMJCURSTV9JT1dSKDB4MTksIHN0cnVjdCBkcm1fYnVmX21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0ZSRUVfQlVGUwkJRFJNX0lPVyggMHgxYSwgc3RydWN0IGRybV9idWZfZnJlZSkKIAotI2RlZmluZSBEUk1fSU9DVExfUk1fTUFQCQlEUk1fSU9XKCAweDFiLCBkcm1fbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9STV9NQVAJCURSTV9JT1coIDB4MWIsIHN0cnVjdCBkcm1fbWFwKQogCi0jZGVmaW5lIERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYCQlEUk1fSU9XKCAweDFjLCBkcm1fY3R4X3ByaXZfbWFwX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYIAlEUk1fSU9XUigweDFkLCBkcm1fY3R4X3ByaXZfbWFwX3QpCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfU0FSRUFfQ1RYCQlEUk1fSU9XKCAweDFjLCBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFggCURSTV9JT1dSKDB4MWQsIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwKQogCi0jZGVmaW5lIERSTV9JT0NUTF9BRERfQ1RYCQlEUk1fSU9XUigweDIwLCBkcm1fY3R4X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9STV9DVFgJCURSTV9JT1dSKDB4MjEsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9DVFgJCURSTV9JT1dSKDB4MjMsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1NXSVRDSF9DVFgJCURSTV9JT1coIDB4MjQsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIGRybV9jdHhfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1JFU19DVFgJCURSTV9JT1dSKDB4MjYsIGRybV9jdHhfcmVzX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9BRERfRFJBVwkJRFJNX0lPV1IoMHgyNywgZHJtX2RyYXdfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIGRybV9kcmF3X3QpCi0jZGVmaW5lIERSTV9JT0NUTF9ETUEJCQlEUk1fSU9XUigweDI5LCBkcm1fZG1hX3QpCi0jZGVmaW5lIERSTV9JT0NUTF9MT0NLCQkJRFJNX0lPVyggMHgyYSwgZHJtX2xvY2tfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgZHJtX2xvY2tfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0ZJTklTSAkJRFJNX0lPVyggMHgyYywgZHJtX2xvY2tfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9DVFgJCURSTV9JT1dSKDB4MjAsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfUk1fQ1RYCQlEUk1fSU9XUigweDIxLCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX01PRF9DVFgJCURSTV9JT1coIDB4MjIsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NUWAkJRFJNX0lPV1IoMHgyMywgc3RydWN0IGRybV9jdHgpCisjZGVmaW5lIERSTV9JT0NUTF9TV0lUQ0hfQ1RYCQlEUk1fSU9XKCAweDI0LCBzdHJ1Y3QgZHJtX2N0eCkKKyNkZWZpbmUgRFJNX0lPQ1RMX05FV19DVFgJCURSTV9JT1coIDB4MjUsIHN0cnVjdCBkcm1fY3R4KQorI2RlZmluZSBEUk1fSU9DVExfUkVTX0NUWAkJRFJNX0lPV1IoMHgyNiwgc3RydWN0IGRybV9jdHhfcmVzKQorI2RlZmluZSBEUk1fSU9DVExfQUREX0RSQVcJCURSTV9JT1dSKDB4MjcsIHN0cnVjdCBkcm1fZHJhdykKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX0RSQVcJCURSTV9JT1dSKDB4MjgsIHN0cnVjdCBkcm1fZHJhdykKKyNkZWZpbmUgRFJNX0lPQ1RMX0RNQQkJCURSTV9JT1dSKDB4MjksIHN0cnVjdCBkcm1fZG1hKQorI2RlZmluZSBEUk1fSU9DVExfTE9DSwkJCURSTV9JT1coIDB4MmEsIHN0cnVjdCBkcm1fbG9jaykKKyNkZWZpbmUgRFJNX0lPQ1RMX1VOTE9DSwkJRFJNX0lPVyggMHgyYiwgc3RydWN0IGRybV9sb2NrKQorI2RlZmluZSBEUk1fSU9DVExfRklOSVNICQlEUk1fSU9XKCAweDJjLCBzdHJ1Y3QgZHJtX2xvY2spCiAKICNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BQ1FVSVJFCQlEUk1fSU8oICAweDMwKQogI2RlZmluZSBEUk1fSU9DVExfQUdQX1JFTEVBU0UJCURSTV9JTyggIDB4MzEpCi0jZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBkcm1fYWdwX21vZGVfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9JTkZPCQlEUk1fSU9SKCAweDMzLCBkcm1fYWdwX2luZm9fdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9BTExPQwkJRFJNX0lPV1IoMHgzNCwgZHJtX2FncF9idWZmZXJfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9GUkVFCQlEUk1fSU9XKCAweDM1LCBkcm1fYWdwX2J1ZmZlcl90KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX0JJTkQJCURSTV9JT1coIDB4MzYsIGRybV9hZ3BfYmluZGluZ190KQotI2RlZmluZSBEUk1fSU9DVExfQUdQX1VOQklORAkJRFJNX0lPVyggMHgzNywgZHJtX2FncF9iaW5kaW5nX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfRU5BQkxFCQlEUk1fSU9XKCAweDMyLCBzdHJ1Y3QgZHJtX2FncF9tb2RlKQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0lORk8JCURSTV9JT1IoIDB4MzMsIHN0cnVjdCBkcm1fYWdwX2luZm8pCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUxMT0MJCURSTV9JT1dSKDB4MzQsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlcikKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9GUkVFCQlEUk1fSU9XKCAweDM1LCBzdHJ1Y3QgZHJtX2FncF9idWZmZXIpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQklORAkJRFJNX0lPVyggMHgzNiwgc3RydWN0IGRybV9hZ3BfYmluZGluZykKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQJCURSTV9JT1coIDB4MzcsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcpCiAKLSNkZWZpbmUgRFJNX0lPQ1RMX1NHX0FMTE9DCQlEUk1fSU9XKCAweDM4LCBkcm1fc2NhdHRlcl9nYXRoZXJfdCkKLSNkZWZpbmUgRFJNX0lPQ1RMX1NHX0ZSRUUJCURSTV9JT1coIDB4MzksIGRybV9zY2F0dGVyX2dhdGhlcl90KQorI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MJCURSTV9JT1coIDB4MzgsIHN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIpCisjZGVmaW5lIERSTV9JT0NUTF9TR19GUkVFCQlEUk1fSU9XKCAweDM5LCBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyKQogCi0jZGVmaW5lIERSTV9JT0NUTF9XQUlUX1ZCTEFOSwkJRFJNX0lPV1IoMHgzYSwgZHJtX3dhaXRfdmJsYW5rX3QpCisjZGVmaW5lIERSTV9JT0NUTF9XQUlUX1ZCTEFOSwkJRFJNX0lPV1IoMHgzYSwgdW5pb24gZHJtX3dhaXRfdmJsYW5rKQogCi0jZGVmaW5lIERSTV9JT0NUTF9VUERBVEVfRFJBVwkJRFJNX0lPVygweDNmLCBkcm1fdXBkYXRlX2RyYXdfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1VQREFURV9EUkFXCQlEUk1fSU9XKDB4M2YsIHN0cnVjdCBkcm1fdXBkYXRlX2RyYXcpCiAKIC8qKgogICogRGV2aWNlIHNwZWNpZmljIGlvY3RscyBzaG91bGQgb25seSBiZSBpbiB0aGVpciByZXNwZWN0aXZlIGhlYWRlcnMKQEAgLTY2Myw0ICs2NjMsNDkgQEAKICNkZWZpbmUgRFJNX0NPTU1BTkRfQkFTRSAgICAgICAgICAgICAgICAweDQwCiAjZGVmaW5lIERSTV9DT01NQU5EX0VORAkJCTB4QTAKIAorLyogdHlwZWRlZiBhcmVhICovCisjaWZuZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgc3RydWN0IGRybV9jbGlwX3JlY3QgZHJtX2NsaXBfcmVjdF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gZHJtX2RyYXdhYmxlX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV90ZXhfcmVnaW9uIGRybV90ZXhfcmVnaW9uX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1faHdfbG9jayBkcm1faHdfbG9ja190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZlcnNpb24gZHJtX3ZlcnNpb25fdDsKK3R5cGVkZWYgc3RydWN0IGRybV91bmlxdWUgZHJtX3VuaXF1ZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2xpc3QgZHJtX2xpc3RfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9ibG9jayBkcm1fYmxvY2tfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jb250cm9sIGRybV9jb250cm9sX3Q7Cit0eXBlZGVmIGVudW0gZHJtX21hcF90eXBlIGRybV9tYXBfdHlwZV90OwordHlwZWRlZiBlbnVtIGRybV9tYXBfZmxhZ3MgZHJtX21hcF9mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBkcm1fY3R4X3ByaXZfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbWFwIGRybV9tYXBfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9jbGllbnQgZHJtX2NsaWVudF90OwordHlwZWRlZiBlbnVtIGRybV9zdGF0X3R5cGUgZHJtX3N0YXRfdHlwZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3N0YXRzIGRybV9zdGF0c190OwordHlwZWRlZiBlbnVtIGRybV9sb2NrX2ZsYWdzIGRybV9sb2NrX2ZsYWdzX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fbG9jayBkcm1fbG9ja190OwordHlwZWRlZiBlbnVtIGRybV9kbWFfZmxhZ3MgZHJtX2RtYV9mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIGRybV9idWZfZGVzY190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9pbmZvIGRybV9idWZfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9mcmVlIGRybV9idWZfZnJlZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9wdWIgZHJtX2J1Zl9wdWJfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfbWFwIGRybV9idWZfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fZG1hIGRybV9kbWFfdDsKK3R5cGVkZWYgdW5pb24gZHJtX3dhaXRfdmJsYW5rIGRybV93YWl0X3ZibGFua190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9tb2RlIGRybV9hZ3BfbW9kZV90OwordHlwZWRlZiBlbnVtIGRybV9jdHhfZmxhZ3MgZHJtX2N0eF9mbGFnc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eCBkcm1fY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1fY3R4X3JlcyBkcm1fY3R4X3Jlc190OwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RyYXcgZHJtX2RyYXdfdDsKK3R5cGVkZWYgc3RydWN0IGRybV91cGRhdGVfZHJhdyBkcm1fdXBkYXRlX2RyYXdfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hdXRoIGRybV9hdXRoX3Q7Cit0eXBlZGVmIHN0cnVjdCBkcm1faXJxX2J1c2lkIGRybV9pcnFfYnVzaWRfdDsKK3R5cGVkZWYgZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIGRybV92Ymxhbmtfc2VxX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9idWZmZXIgZHJtX2FncF9idWZmZXJfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYmluZGluZyBkcm1fYWdwX2JpbmRpbmdfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfaW5mbyBkcm1fYWdwX2luZm9fdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBkcm1fc2NhdHRlcl9nYXRoZXJfdDsKK3R5cGVkZWYgc3RydWN0IGRybV9zZXRfdmVyc2lvbiBkcm1fc2V0X3ZlcnNpb25fdDsKKyNlbmRpZgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKaW5kZXggZDQ5NDMxNS4uMGRmODdmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKQEAgLTc1LDYgKzc1LDggQEAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgImRybS5oIgogCisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKICNkZWZpbmUgX19PU19IQVNfQUdQIChkZWZpbmVkKENPTkZJR19BR1ApIHx8IChkZWZpbmVkKENPTkZJR19BR1BfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpKQogI2RlZmluZSBfX09TX0hBU19NVFJSIChkZWZpbmVkKENPTkZJR19NVFJSKSkKIApAQCAtMjc0LDMyICsyNzYsMjMgQEAKIAlpbnQgZmxhZ3M7CiB9IGRybV9pb2N0bF9kZXNjX3Q7CiAKLXR5cGVkZWYgc3RydWN0IGRybV9kZXZzdGF0ZSB7Ci0JcGlkX3Qgb3duZXI7CQkJLyoqPCBYIHNlcnZlciBwaWQgaG9sZGluZyB4X2xvY2sgKi8KLX0gZHJtX2RldnN0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGRybV9tYWdpY19lbnRyeSB7Ci0JZHJtX2hhc2hfaXRlbV90IGhhc2hfaXRlbTsKK3N0cnVjdCBkcm1fbWFnaWNfZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoX2l0ZW07CiAJc3RydWN0IGRybV9maWxlICpwcml2OwogCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKm5leHQ7Ci19IGRybV9tYWdpY19lbnRyeV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX21hZ2ljX2hlYWQgewotCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKmhlYWQ7Ci0Jc3RydWN0IGRybV9tYWdpY19lbnRyeSAqdGFpbDsKLX0gZHJtX21hZ2ljX2hlYWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSB7CitzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXN0cnVjdCBkcm1fdm1hX2VudHJ5ICpuZXh0OwogCXBpZF90IHBpZDsKLX0gZHJtX3ZtYV9lbnRyeV90OworfTsKIAogLyoqCiAgKiBETUEgYnVmZmVyLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fYnVmIHsKK3N0cnVjdCBkcm1fYnVmIHsKIAlpbnQgaWR4OwkJICAgICAgIC8qKjwgSW5kZXggaW50byBtYXN0ZXIgYnVmbGlzdCAqLwogCWludCB0b3RhbDsJCSAgICAgICAvKio8IEJ1ZmZlciBzaXplICovCiAJaW50IG9yZGVyOwkJICAgICAgIC8qKjwgbG9nLWJhc2UtMih0b3RhbCkgKi8KQEAgLTMyNSwzMCArMzE4LDMwIEBACiAKIAlpbnQgZGV2X3ByaXZfc2l6ZTsJCSAvKio8IFNpemUgb2YgYnVmZmVyIHByaXZhdGUgc3RvcmFnZSAqLwogCXZvaWQgKmRldl9wcml2YXRlOwkJIC8qKjwgUGVyLWJ1ZmZlciBwcml2YXRlIHN0b3JhZ2UgKi8KLX0gZHJtX2J1Zl90OworfTsKIAogLyoqIGJ1ZnMgaXMgb25lIGxvbmdlciB0aGFuIGl0IGhhcyB0byBiZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX3dhaXRsaXN0IHsKK3N0cnVjdCBkcm1fd2FpdGxpc3QgewogCWludCBjb3VudDsJCQkvKio8IE51bWJlciBvZiBwb3NzaWJsZSBidWZmZXJzICovCi0JZHJtX2J1Zl90ICoqYnVmczsJCS8qKjwgTGlzdCBvZiBwb2ludGVycyB0byBidWZmZXJzICovCi0JZHJtX2J1Zl90ICoqcnA7CQkJLyoqPCBSZWFkIHBvaW50ZXIgKi8KLQlkcm1fYnVmX3QgKip3cDsJCQkvKio8IFdyaXRlIHBvaW50ZXIgKi8KLQlkcm1fYnVmX3QgKiplbmQ7CQkvKio8IEVuZCBwb2ludGVyICovCisJc3RydWN0IGRybV9idWYgKipidWZzOwkJLyoqPCBMaXN0IG9mIHBvaW50ZXJzIHRvIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKnJwOwkJCS8qKjwgUmVhZCBwb2ludGVyICovCisJc3RydWN0IGRybV9idWYgKip3cDsJCQkvKio8IFdyaXRlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKmVuZDsJCS8qKjwgRW5kIHBvaW50ZXIgKi8KIAlzcGlubG9ja190IHJlYWRfbG9jazsKIAlzcGlubG9ja190IHdyaXRlX2xvY2s7Ci19IGRybV93YWl0bGlzdF90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX2ZyZWVsaXN0IHsKK3N0cnVjdCBkcm1fZnJlZWxpc3QgewogCWludCBpbml0aWFsaXplZDsJICAgICAgIC8qKjwgRnJlZWxpc3QgaW4gdXNlICovCiAJYXRvbWljX3QgY291bnQ7CQkgICAgICAgLyoqPCBOdW1iZXIgb2YgZnJlZSBidWZmZXJzICovCi0JZHJtX2J1Zl90ICpuZXh0OwkgICAgICAgLyoqPCBFbmQgcG9pbnRlciAqLworCXN0cnVjdCBkcm1fYnVmICpuZXh0OwkgICAgICAgLyoqPCBFbmQgcG9pbnRlciAqLwogCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdGluZzsgICAgIC8qKjwgUHJvY2Vzc2VzIHdhaXRpbmcgb24gZnJlZSBidWZzICovCiAJaW50IGxvd19tYXJrOwkJICAgICAgIC8qKjwgTG93IHdhdGVyIG1hcmsgKi8KIAlpbnQgaGlnaF9tYXJrOwkJICAgICAgIC8qKjwgSGlnaCB3YXRlciBtYXJrICovCiAJYXRvbWljX3Qgd2ZoOwkJICAgICAgIC8qKjwgSWYgd2FpdGluZyBmb3IgaGlnaCBtYXJrICovCiAJc3BpbmxvY2tfdCBsb2NrOwotfSBkcm1fZnJlZWxpc3RfdDsKK307CiAKIHR5cGVkZWYgc3RydWN0IGRybV9kbWFfaGFuZGxlIHsKIAlkbWFfYWRkcl90IGJ1c2FkZHI7CkBAIC0zNTksMTkgKzM1MiwxOSBAQAogLyoqCiAgKiBCdWZmZXIgZW50cnkuICBUaGVyZSBpcyBvbmUgb2YgdGhpcyBmb3IgZWFjaCBidWZmZXIgc2l6ZSBvcmRlci4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSB7CitzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSB7CiAJaW50IGJ1Zl9zaXplOwkJCS8qKjwgc2l6ZSAqLwogCWludCBidWZfY291bnQ7CQkJLyoqPCBudW1iZXIgb2YgYnVmZmVycyAqLwotCWRybV9idWZfdCAqYnVmbGlzdDsJCS8qKjwgYnVmZmVyIGxpc3QgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmbGlzdDsJCS8qKjwgYnVmZmVyIGxpc3QgKi8KIAlpbnQgc2VnX2NvdW50OwogCWludCBwYWdlX29yZGVyOwotCWRybV9kbWFfaGFuZGxlX3QgKipzZWdsaXN0OworCXN0cnVjdCBkcm1fZG1hX2hhbmRsZSAqKnNlZ2xpc3Q7CiAKLQlkcm1fZnJlZWxpc3RfdCBmcmVlbGlzdDsKLX0gZHJtX2J1Zl9lbnRyeV90OworCXN0cnVjdCBkcm1fZnJlZWxpc3QgZnJlZWxpc3Q7Cit9OwogCiAvKiogRmlsZSBwcml2YXRlIGRhdGEgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9maWxlIHsKK3N0cnVjdCBkcm1fZmlsZSB7CiAJaW50IGF1dGhlbnRpY2F0ZWQ7CiAJaW50IG1hc3RlcjsKIAlpbnQgbWlub3I7CkBAIC0zNzksMTYgKzM3MiwxNSBAQAogCXVpZF90IHVpZDsKIAlkcm1fbWFnaWNfdCBtYWdpYzsKIAl1bnNpZ25lZCBsb25nIGlvY3RsX2NvdW50OwotCXN0cnVjdCBkcm1fZmlsZSAqbmV4dDsKLQlzdHJ1Y3QgZHJtX2ZpbGUgKnByZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaGVhZDsKIAlzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQ7CiAJaW50IHJlbW92ZV9hdXRoX29uX2Nsb3NlOwogCXVuc2lnbmVkIGxvbmcgbG9ja19jb3VudDsKIAl2b2lkICpkcml2ZXJfcHJpdjsKLX0gZHJtX2ZpbGVfdDsKK307CiAKIC8qKiBXYWl0IHF1ZXVlICovCi10eXBlZGVmIHN0cnVjdCBkcm1fcXVldWUgeworc3RydWN0IGRybV9xdWV1ZSB7CiAJYXRvbWljX3QgdXNlX2NvdW50OwkJLyoqPCBPdXRzdGFuZGluZyB1c2VzICgrMSkgKi8KIAlhdG9taWNfdCBmaW5hbGl6YXRpb247CQkvKio8IEZpbmFsaXphdGlvbiBpbiBwcm9ncmVzcyAqLwogCWF0b21pY190IGJsb2NrX2NvdW50OwkJLyoqPCBDb3VudCBvZiBwcm9jZXNzZXMgd2FpdGluZyAqLwpAQCAtNDAxLDE2ICszOTMsMTYgQEAKIAlhdG9taWNfdCB0b3RhbF9mbHVzaGVkOwkJLyoqPCBUb3RhbCBmbHVzaGVzIHN0YXRpc3RpYyAqLwogCWF0b21pY190IHRvdGFsX2xvY2tzOwkJLyoqPCBUb3RhbCBsb2NrcyBzdGF0aXN0aWNzICovCiAjZW5kaWYKLQlkcm1fY3R4X2ZsYWdzX3QgZmxhZ3M7CQkvKio8IENvbnRleHQgcHJlc2VydmluZyBhbmQgMkQtb25seSAqLwotCWRybV93YWl0bGlzdF90IHdhaXRsaXN0OwkvKio8IFBlbmRpbmcgYnVmZmVycyAqLworCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsJLyoqPCBDb250ZXh0IHByZXNlcnZpbmcgYW5kIDJELW9ubHkgKi8KKwlzdHJ1Y3QgZHJtX3dhaXRsaXN0IHdhaXRsaXN0OwkvKio8IFBlbmRpbmcgYnVmZmVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGZsdXNoX3F1ZXVlOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHVudGlsIGZsdXNoICovCi19IGRybV9xdWV1ZV90OworfTsKIAogLyoqCiAgKiBMb2NrIGRhdGEuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9sb2NrX2RhdGEgewotCWRybV9od19sb2NrX3QgKmh3X2xvY2s7CQkvKio8IEhhcmR3YXJlIGxvY2sgKi8KK3N0cnVjdCBkcm1fbG9ja19kYXRhIHsKKwlzdHJ1Y3QgZHJtX2h3X2xvY2sgKmh3X2xvY2s7CS8qKjwgSGFyZHdhcmUgbG9jayAqLwogCXN0cnVjdCBmaWxlICpmaWxwOwkJLyoqPCBGaWxlIGRlc2NyIG9mIGxvY2sgaG9sZGVyICgwPWtlcm5lbCkgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBsb2NrX3F1ZXVlOwkvKio8IFF1ZXVlIG9mIGJsb2NrZWQgcHJvY2Vzc2VzICovCiAJdW5zaWduZWQgbG9uZyBsb2NrX3RpbWU7CS8qKjwgVGltZSBvZiBsYXN0IGxvY2sgaW4gamlmZmllcyAqLwpAQCAtNDE4LDE2ICs0MTAsMTYgQEAKIAl1aW50MzJfdCBrZXJuZWxfd2FpdGVyczsKIAl1aW50MzJfdCB1c2VyX3dhaXRlcnM7CiAJaW50IGlkbGVfaGFzX2xvY2s7Ci19IGRybV9sb2NrX2RhdGFfdDsKK307CiAKIC8qKgogICogRE1BIGRhdGEuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9kZXZpY2VfZG1hIHsKK3N0cnVjdCBkcm1fZGV2aWNlX2RtYSB7CiAKLQlkcm1fYnVmX2VudHJ5X3QgYnVmc1tEUk1fTUFYX09SREVSICsgMV07CS8qKjwgYnVmZmVycywgZ3JvdXBlZCBieSB0aGVpciBzaXplIG9yZGVyICovCisJc3RydWN0IGRybV9idWZfZW50cnkgYnVmc1tEUk1fTUFYX09SREVSICsgMV07CS8qKjwgYnVmZmVycywgZ3JvdXBlZCBieSB0aGVpciBzaXplIG9yZGVyICovCiAJaW50IGJ1Zl9jb3VudDsJCQkvKio8IHRvdGFsIG51bWJlciBvZiBidWZmZXJzICovCi0JZHJtX2J1Zl90ICoqYnVmbGlzdDsJCS8qKjwgVmVjdG9yIG9mIHBvaW50ZXJzIGludG8gZHJtX2RldmljZV9kbWE6OmJ1ZnMgKi8KKwlzdHJ1Y3QgZHJtX2J1ZiAqKmJ1Zmxpc3Q7CQkvKio8IFZlY3RvciBvZiBwb2ludGVycyBpbnRvIGRybV9kZXZpY2VfZG1hOjpidWZzICovCiAJaW50IHNlZ19jb3VudDsKIAlpbnQgcGFnZV9jb3VudDsJCQkvKio8IG51bWJlciBvZiBwYWdlcyAqLwogCXVuc2lnbmVkIGxvbmcgKnBhZ2VsaXN0OwkvKio8IHBhZ2UgbGlzdCAqLwpAQCAtNDM5LDI4ICs0MzEsMjcgQEAKIAkJX0RSTV9ETUFfVVNFX1BDSV9STyA9IDB4MDgKIAl9IGZsYWdzOwogCi19IGRybV9kZXZpY2VfZG1hX3Q7Cit9OwogCiAvKioKICAqIEFHUCBtZW1vcnkgZW50cnkuICBTdG9yZWQgYXMgYSBkb3VibHkgbGlua2VkIGxpc3QuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfbWVtIHsKK3N0cnVjdCBkcm1fYWdwX21lbSB7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGU7CQkvKio8IGhhbmRsZSAqLwogCURSTV9BR1BfTUVNICptZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBib3VuZDsJCS8qKjwgYWRkcmVzcyAqLwogCWludCBwYWdlczsKLQlzdHJ1Y3QgZHJtX2FncF9tZW0gKnByZXY7CS8qKjwgcHJldmlvdXMgZW50cnkgKi8KLQlzdHJ1Y3QgZHJtX2FncF9tZW0gKm5leHQ7CS8qKjwgbmV4dCBlbnRyeSAqLwotfSBkcm1fYWdwX21lbV90OworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKK307CiAKIC8qKgogICogQUdQIGRhdGEuCiAgKgogICogXHNhIGRybV9hZ3BfaW5pdCgpIGFuZCBkcm1fZGV2aWNlOjphZ3AuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9hZ3BfaGVhZCB7CitzdHJ1Y3QgZHJtX2FncF9oZWFkIHsKIAlEUk1fQUdQX0tFUk4gYWdwX2luZm87CQkvKio8IEFHUCBkZXZpY2UgaW5mb3JtYXRpb24gKi8KLQlkcm1fYWdwX21lbV90ICptZW1vcnk7CQkvKio8IG1lbW9yeSBlbnRyaWVzICovCisJc3RydWN0IGxpc3RfaGVhZCBtZW1vcnk7CiAJdW5zaWduZWQgbG9uZyBtb2RlOwkJLyoqPCBBR1AgbW9kZSAqLwogCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKIAlpbnQgZW5hYmxlZDsJCQkvKio8IHdoZXRoZXIgdGhlIEFHUCBidXMgYXMgYmVlbiBlbmFibGVkICovCkBAIC00NjksNTEgKzQ2MCw1MSBAQAogCWludCBhZ3BfbXRycjsKIAlpbnQgY2FudF91c2VfYXBlcnR1cmU7CiAJdW5zaWduZWQgbG9uZyBwYWdlX21hc2s7Ci19IGRybV9hZ3BfaGVhZF90OworfTsKIAogLyoqCiAgKiBTY2F0dGVyLWdhdGhlciBtZW1vcnkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zZ19tZW0geworc3RydWN0IGRybV9zZ19tZW0gewogCXVuc2lnbmVkIGxvbmcgaGFuZGxlOwogCXZvaWQgKnZpcnR1YWw7CiAJaW50IHBhZ2VzOwogCXN0cnVjdCBwYWdlICoqcGFnZWxpc3Q7CiAJZG1hX2FkZHJfdCAqYnVzYWRkcjsKLX0gZHJtX3NnX21lbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3NpZ2RhdGEgeworc3RydWN0IGRybV9zaWdkYXRhIHsKIAlpbnQgY29udGV4dDsKLQlkcm1faHdfbG9ja190ICpsb2NrOwotfSBkcm1fc2lnZGF0YV90OworCXN0cnVjdCBkcm1faHdfbG9jayAqbG9jazsKK307CiAKIC8qKgogICogTWFwcGluZ3MgbGlzdAogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fbWFwX2xpc3Qgeworc3RydWN0IGRybV9tYXBfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwkJLyoqPCBsaXN0IGhlYWQgKi8KLQlkcm1faGFzaF9pdGVtX3QgaGFzaDsKLQlkcm1fbWFwX3QgKm1hcDsJCQkvKio8IG1hcHBpbmcgKi8KKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoOworCXN0cnVjdCBkcm1fbWFwICptYXA7CQkJLyoqPCBtYXBwaW5nICovCiAJdW5zaWduZWQgaW50IHVzZXJfdG9rZW47Ci19IGRybV9tYXBfbGlzdF90OworfTsKIAotdHlwZWRlZiBkcm1fbWFwX3QgZHJtX2xvY2FsX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hcCBkcm1fbG9jYWxfbWFwX3Q7CiAKIC8qKgogICogQ29udGV4dCBoYW5kbGUgbGlzdAogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fY3R4X2xpc3Qgeworc3RydWN0IGRybV9jdHhfbGlzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBoZWFkOwkJLyoqPCBsaXN0IGhlYWQgKi8KIAlkcm1fY29udGV4dF90IGhhbmRsZTsJCS8qKjwgY29udGV4dCBoYW5kbGUgKi8KLQlkcm1fZmlsZV90ICp0YWc7CQkvKio8IGFzc29jaWF0ZWQgZmQgcHJpdmF0ZSBkYXRhICovCi19IGRybV9jdHhfbGlzdF90OworCXN0cnVjdCBkcm1fZmlsZSAqdGFnOwkJLyoqPCBhc3NvY2lhdGVkIGZkIHByaXZhdGUgZGF0YSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX3ZibF9zaWcgeworc3RydWN0IGRybV92Ymxfc2lnIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCXN0cnVjdCBzaWdpbmZvIGluZm87CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotfSBkcm1fdmJsX3NpZ190OworfTsKIAogLyogbG9jYXRpb24gb2YgR0FSVCB0YWJsZSAqLwogI2RlZmluZSBEUk1fQVRJX0dBUlRfTUFJTiAxCkBAIC01MjMsMTkgKzUxNCwxOSBAQAogI2RlZmluZSBEUk1fQVRJX0dBUlRfUENJRSAyCiAjZGVmaW5lIERSTV9BVElfR0FSVF9JR1AgMwogCi10eXBlZGVmIHN0cnVjdCBhdGlfcGNpZ2FydF9pbmZvIHsKK3N0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyB7CiAJaW50IGdhcnRfdGFibGVfbG9jYXRpb247CiAJaW50IGdhcnRfcmVnX2lmOwogCXZvaWQgKmFkZHI7CiAJZG1hX2FkZHJfdCBidXNfYWRkcjsKIAlkcm1fbG9jYWxfbWFwX3QgbWFwcGluZzsKIAlpbnQgdGFibGVfc2l6ZTsKLX0gZHJtX2F0aV9wY2lnYXJ0X2luZm87Cit9OwogCiAvKgogICogR2VuZXJpYyBtZW1vcnkgbWFuYWdlciBzdHJ1Y3RzCiAgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9tbV9ub2RlIHsKK3N0cnVjdCBkcm1fbW1fbm9kZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBmbF9lbnRyeTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG1sX2VudHJ5OwogCWludCBmcmVlOwpAQCAtNTQzLDEyICs1MzQsMTIgQEAKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJc3RydWN0IGRybV9tbSAqbW07CiAJdm9pZCAqcHJpdmF0ZTsKLX0gZHJtX21tX25vZGVfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9tbSB7CitzdHJ1Y3QgZHJtX21tIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZsX2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQgbWxfZW50cnk7Ci19IGRybV9tbV90OworfTsKIAogLyoqCiAgKiBEUk0gZHJpdmVyIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50IHRoZSBjb21tb24gY29kZSBmb3IKQEAgLTU2MCwyMSArNTUxLDIxIEBACiBzdHJ1Y3QgZHJtX2RyaXZlciB7CiAJaW50ICgqbG9hZCkgKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCWludCAoKmZpcnN0b3BlbikgKHN0cnVjdCBkcm1fZGV2aWNlICopOwotCWludCAoKm9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBkcm1fZmlsZV90ICopOworCWludCAoKm9wZW4pIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAJdm9pZCAoKnByZWNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKLQl2b2lkICgqcG9zdGNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgZHJtX2ZpbGVfdCAqKTsKKwl2b2lkICgqcG9zdGNsb3NlKSAoc3RydWN0IGRybV9kZXZpY2UgKiwgc3RydWN0IGRybV9maWxlICopOwogCXZvaWQgKCpsYXN0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCp1bmxvYWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpkbWFfaW9jdGwpIChEUk1fSU9DVExfQVJHUyk7CiAJdm9pZCAoKmRtYV9yZWFkeSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKmRtYV9xdWllc2NlbnQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKLQlpbnQgKCpjb250ZXh0X2N0b3IpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwotCWludCAoKmNvbnRleHRfZHRvcikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY29udGV4dCk7Ci0JaW50ICgqa2VybmVsX2NvbnRleHRfc3dpdGNoKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBvbGQsCisJaW50ICgqY29udGV4dF9jdG9yKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNvbnRleHQpOworCWludCAoKmNvbnRleHRfZHRvcikgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KTsKKwlpbnQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2gpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgb2xkLAogCQkJCSAgICAgIGludCBuZXcpOwotCXZvaWQgKCprZXJuZWxfY29udGV4dF9zd2l0Y2hfdW5sb2NrKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCWludCAoKnZibGFua193YWl0KSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotCWludCAoKnZibGFua193YWl0MikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKKwl2b2lkICgqa2VybmVsX2NvbnRleHRfc3dpdGNoX3VubG9jaykgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCWludCAoKnZibGFua193YWl0KSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisJaW50ICgqdmJsYW5rX3dhaXQyKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CiAJaW50ICgqZHJpX2xpYnJhcnlfbmFtZSkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGNoYXIgKmJ1Zik7CiAKIAkvKioKQEAgLTU4OCwyMiArNTc5LDIzIEBACiAJICogY2FyZCBpcyBhYnNvbHV0ZWx5IFxiIG5vdCBBR1AgKHJldHVybiBvZiAwKSwgYWJzb2x1dGVseSBcYiBpcyBBR1AKIAkgKiAocmV0dXJuIG9mIDEpLCBvciBtYXkgb3IgbWF5IG5vdCBiZSBBR1AgKHJldHVybiBvZiAyKS4KIAkgKi8KLQlpbnQgKCpkZXZpY2VfaXNfYWdwKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworCWludCAoKmRldmljZV9pc19hZ3ApIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCS8qIHRoZXNlIGhhdmUgdG8gYmUgZmlsbGVkIGluICovCiAKIAlpcnFyZXR1cm5fdCgqaXJxX2hhbmRsZXIpIChEUk1fSVJRX0FSR1MpOwotCXZvaWQgKCppcnFfcHJlaW5zdGFsbCkgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKLQl2b2lkICgqaXJxX3Bvc3RpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCppcnFfdW5pbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCpyZWNsYWltX2J1ZmZlcnMpIChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKKwl2b2lkICgqaXJxX3ByZWluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICgqaXJxX3Bvc3RpbnN0YWxsKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKmlycV91bmluc3RhbGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmVjbGFpbV9idWZmZXJzKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKiBmaWxwKTsKIAl2b2lkICgqcmVjbGFpbV9idWZmZXJzX2xvY2tlZCkgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKIAl2b2lkICgqcmVjbGFpbV9idWZmZXJzX2lkbGVsb2NrZWQpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZmlsZSAqIGZpbHApOwotCXVuc2lnbmVkIGxvbmcgKCpnZXRfbWFwX29mcykgKGRybV9tYXBfdCAqIG1hcCk7Ci0JdW5zaWduZWQgbG9uZyAoKmdldF9yZWdfb2ZzKSAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCpzZXRfdmVyc2lvbikgKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fc2V0X3ZlcnNpb25fdCAqIHN2KTsKKwl1bnNpZ25lZCBsb25nICgqZ2V0X21hcF9vZnMpIChzdHJ1Y3QgZHJtX21hcCAqIG1hcCk7CisJdW5zaWduZWQgbG9uZyAoKmdldF9yZWdfb2ZzKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CisJdm9pZCAoKnNldF92ZXJzaW9uKSAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRybV9zZXRfdmVyc2lvbiAqc3YpOwogCiAJaW50IG1ham9yOwogCWludCBtaW5vcjsKQEAgLTYyNSwxOSArNjE3LDE5IEBACiAgKiB0aGF0IG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLiBFbWJlZCBvbmUgcGVyIGhlYWQgb2YgdGhlc2UgaW4gdGhlCiAgKiBwcml2YXRlIGRybV9kZXZpY2Ugc3RydWN0dXJlLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1faGVhZCB7CitzdHJ1Y3QgZHJtX2hlYWQgewogCWludCBtaW5vcjsJCQkvKio8IE1pbm9yIGRldmljZSBudW1iZXIgKi8KIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2X3Jvb3Q7ICAvKio8IHByb2MgZGlyZWN0b3J5IGVudHJ5ICovCiAJZGV2X3QgZGV2aWNlOwkJCS8qKjwgRGV2aWNlIG51bWJlciBmb3IgbWtub2QgKi8KIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXZfY2xhc3M7Ci19IGRybV9oZWFkX3Q7Cit9OwogCiAvKioKICAqIERSTSBkZXZpY2Ugc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnQgYSBjb21wbGV0ZSBjYXJkIHRoYXQKICAqIG1heSBjb250YWluIG11bHRpcGxlIGhlYWRzLgogICovCi10eXBlZGVmIHN0cnVjdCBkcm1fZGV2aWNlIHsKK3N0cnVjdCBkcm1fZGV2aWNlIHsKIAljaGFyICp1bmlxdWU7CQkJLyoqPCBVbmlxdWUgaWRlbnRpZmllcjogZS5nLiwgYnVzaWQgKi8KIAlpbnQgdW5pcXVlX2xlbjsJCQkvKio8IExlbmd0aCBvZiB1bmlxdWUgZmllbGQgKi8KIAljaGFyICpkZXZuYW1lOwkJCS8qKjwgRm9yIC9wcm9jL2ludGVycnVwdHMgKi8KQEAgLTY2MywzNSArNjU1LDMzIEBACiAJLyoqIFxuYW1lIFBlcmZvcm1hbmNlIGNvdW50ZXJzICovCiAJLypAeyAqLwogCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7Ci0JZHJtX3N0YXRfdHlwZV90IHR5cGVzWzE1XTsKKwllbnVtIGRybV9zdGF0X3R5cGUgdHlwZXNbMTVdOwogCWF0b21pY190IGNvdW50c1sxNV07CiAJLypAfSAqLwogCiAJLyoqIFxuYW1lIEF1dGhlbnRpY2F0aW9uICovCiAJLypAeyAqLwotCWRybV9maWxlX3QgKmZpbGVfZmlyc3Q7CQkvKio8IGZpbGUgbGlzdCBoZWFkICovCi0JZHJtX2ZpbGVfdCAqZmlsZV9sYXN0OwkJLyoqPCBmaWxlIGxpc3QgdGFpbCAqLwotCWRybV9vcGVuX2hhc2hfdCBtYWdpY2xpc3Q7CS8qKjwgbWFnaWMgaGFzaCB0YWJsZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZmlsZWxpc3Q7CisJc3RydWN0IGRybV9vcGVuX2hhc2ggbWFnaWNsaXN0OwkvKio8IG1hZ2ljIGhhc2ggdGFibGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1hZ2ljZnJlZTsKIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgTWVtb3J5IG1hbmFnZW1lbnQgKi8KIAkvKkB7ICovCi0JZHJtX21hcF9saXN0X3QgKm1hcGxpc3Q7CS8qKjwgTGlua2VkIGxpc3Qgb2YgcmVnaW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbWFwbGlzdDsJLyoqPCBMaW5rZWQgbGlzdCBvZiByZWdpb25zICovCiAJaW50IG1hcF9jb3VudDsJCQkvKio8IE51bWJlciBvZiBtYXBwYWJsZSByZWdpb25zICovCi0JZHJtX29wZW5faGFzaF90IG1hcF9oYXNoOwkvKio8IFVzZXIgdG9rZW4gaGFzaCB0YWJsZSBmb3IgbWFwcyAqLworCXN0cnVjdCBkcm1fb3Blbl9oYXNoIG1hcF9oYXNoOwkvKio8IFVzZXIgdG9rZW4gaGFzaCB0YWJsZSBmb3IgbWFwcyAqLwogCiAJLyoqIFxuYW1lIENvbnRleHQgaGFuZGxlIG1hbmFnZW1lbnQgKi8KIAkvKkB7ICovCi0JZHJtX2N0eF9saXN0X3QgKmN0eGxpc3Q7CS8qKjwgTGlua2VkIGxpc3Qgb2YgY29udGV4dCBoYW5kbGVzICovCisJc3RydWN0IGxpc3RfaGVhZCBjdHhsaXN0OwkvKio8IExpbmtlZCBsaXN0IG9mIGNvbnRleHQgaGFuZGxlcyAqLwogCWludCBjdHhfY291bnQ7CQkJLyoqPCBOdW1iZXIgb2YgY29udGV4dCBoYW5kbGVzICovCiAJc3RydWN0IG11dGV4IGN0eGxpc3RfbXV0ZXg7CS8qKjwgRm9yIGN0eGxpc3QgKi8KIAotCWRybV9tYXBfdCAqKmNvbnRleHRfc2FyZWFzOwkgICAgLyoqPCBwZXItY29udGV4dCBTQVJFQSdzICovCi0JaW50IG1heF9jb250ZXh0OworCXN0cnVjdCBpZHIgY3R4X2lkcjsKIAotCWRybV92bWFfZW50cnlfdCAqdm1hbGlzdDsJLyoqPCBMaXN0IG9mIHZtYXMgKGZvciBkZWJ1Z2dpbmcpICovCi0JZHJtX2xvY2tfZGF0YV90IGxvY2s7CQkvKio8IEluZm9ybWF0aW9uIG9uIGhhcmR3YXJlIGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZtYWxpc3Q7CS8qKjwgTGlzdCBvZiB2bWFzIChmb3IgZGVidWdnaW5nKSAqLworCXN0cnVjdCBkcm1fbG9ja19kYXRhIGxvY2s7CS8qKjwgSW5mb3JtYXRpb24gb24gaGFyZHdhcmUgbG9jayAqLwogCS8qQH0gKi8KIAogCS8qKiBcbmFtZSBETUEgcXVldWVzIChjb250ZXh0cykgKi8KQEAgLTY5OSw4ICs2ODksOCBAQAogCWludCBxdWV1ZV9jb3VudDsJCS8qKjwgTnVtYmVyIG9mIGFjdGl2ZSBETUEgcXVldWVzICovCiAJaW50IHF1ZXVlX3Jlc2VydmVkOwkJICAvKio8IE51bWJlciBvZiByZXNlcnZlZCBETUEgcXVldWVzICovCiAJaW50IHF1ZXVlX3Nsb3RzOwkJLyoqPCBBY3R1YWwgbGVuZ3RoIG9mIHF1ZXVlbGlzdCAqLwotCWRybV9xdWV1ZV90ICoqcXVldWVsaXN0OwkvKio8IFZlY3RvciBvZiBwb2ludGVycyB0byBETUEgcXVldWVzICovCi0JZHJtX2RldmljZV9kbWFfdCAqZG1hOwkJLyoqPCBPcHRpb25hbCBwb2ludGVyIGZvciBETUEgc3VwcG9ydCAqLworCXN0cnVjdCBkcm1fcXVldWUgKipxdWV1ZWxpc3Q7CS8qKjwgVmVjdG9yIG9mIHBvaW50ZXJzIHRvIERNQSBxdWV1ZXMgKi8KKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYTsJCS8qKjwgT3B0aW9uYWwgcG9pbnRlciBmb3IgRE1BIHN1cHBvcnQgKi8KIAkvKkB9ICovCiAKIAkvKiogXG5hbWUgQ29udGV4dCBzdXBwb3J0ICovCkBAIC03MjUsOCArNzE1LDggQEAKIAlhdG9taWNfdCB2YmxfcmVjZWl2ZWQ7CiAJYXRvbWljX3QgdmJsX3JlY2VpdmVkMjsJCS8qKjwgbnVtYmVyIG9mIHNlY29uZGFyeSBWQkxBTksgaW50ZXJydXB0cyAqLwogCXNwaW5sb2NrX3QgdmJsX2xvY2s7Ci0JZHJtX3ZibF9zaWdfdCB2Ymxfc2lnczsJCS8qKjwgc2lnbmFsIGxpc3QgdG8gc2VuZCBvbiBWQkxBTksgKi8KLQlkcm1fdmJsX3NpZ190IHZibF9zaWdzMjsJLyoqPCBzaWduYWxzIHRvIHNlbmQgb24gc2Vjb25kYXJ5IFZCTEFOSyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdmJsX3NpZ3M7CQkvKio8IHNpZ25hbCBsaXN0IHRvIHNlbmQgb24gVkJMQU5LICovCisJc3RydWN0IGxpc3RfaGVhZCB2Ymxfc2lnczI7CS8qKjwgc2lnbmFscyB0byBzZW5kIG9uIHNlY29uZGFyeSBWQkxBTksgKi8KIAl1bnNpZ25lZCBpbnQgdmJsX3BlbmRpbmc7CiAJc3BpbmxvY2tfdCB0YXNrbGV0X2xvY2s7CS8qKjwgRm9yIGRybV9sb2NrZWRfdGFza2xldCAqLwogCXZvaWQgKCpsb2NrZWRfdGFza2xldF9mdW5jKShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKQEAgLTczOSw3ICs3MjksNyBAQAogCXdhaXRfcXVldWVfaGVhZF90IGJ1Zl9yZWFkZXJzOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHRvIHJlYWQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBidWZfd3JpdGVyczsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyB0byBjdHggc3dpdGNoICovCiAKLQlkcm1fYWdwX2hlYWRfdCAqYWdwOwkvKio8IEFHUCBkYXRhICovCisJc3RydWN0IGRybV9hZ3BfaGVhZCAqYWdwOwkvKio8IEFHUCBkYXRhICovCiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJCS8qKjwgUENJIGRldmljZSBzdHJ1Y3R1cmUgKi8KIAlpbnQgcGNpX3ZlbmRvcjsJCQkvKio8IFBDSSB2ZW5kb3IgaWQgKi8KQEAgLTc0NywyNiArNzM3LDIzIEBACiAjaWZkZWYgX19hbHBoYV9fCiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOwogI2VuZGlmCi0JZHJtX3NnX21lbV90ICpzZzsJLyoqPCBTY2F0dGVyIGdhdGhlciBtZW1vcnkgKi8KKwlzdHJ1Y3QgZHJtX3NnX21lbSAqc2c7CS8qKjwgU2NhdHRlciBnYXRoZXIgbWVtb3J5ICovCiAJdW5zaWduZWQgbG9uZyAqY3R4X2JpdG1hcDsJLyoqPCBjb250ZXh0IGJpdG1hcCAqLwogCXZvaWQgKmRldl9wcml2YXRlOwkJLyoqPCBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCi0JZHJtX3NpZ2RhdGFfdCBzaWdkYXRhOwkgICAvKio8IEZvciBibG9ja19hbGxfc2lnbmFscyAqLworCXN0cnVjdCBkcm1fc2lnZGF0YSBzaWdkYXRhOwkgICAvKio8IEZvciBibG9ja19hbGxfc2lnbmFscyAqLwogCXNpZ3NldF90IHNpZ21hc2s7CiAKIAlzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyOwogCWRybV9sb2NhbF9tYXBfdCAqYWdwX2J1ZmZlcl9tYXA7CiAJdW5zaWduZWQgaW50IGFncF9idWZmZXJfdG9rZW47Ci0JZHJtX2hlYWRfdCBwcmltYXJ5OwkJLyoqPCBwcmltYXJ5IHNjcmVlbiBoZWFkICovCisJc3RydWN0IGRybV9oZWFkIHByaW1hcnk7CQkvKio8IHByaW1hcnkgc2NyZWVuIGhlYWQgKi8KIAogCS8qKiBcbmFtZSBEcmF3YWJsZSBpbmZvcm1hdGlvbiAqLwogCS8qQHsgKi8KIAlzcGlubG9ja190IGRyd19sb2NrOwotCXVuc2lnbmVkIGludCBkcndfYml0ZmllbGRfbGVuZ3RoOwotCXUzMiAqZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGludCBkcndfaW5mb19sZW5ndGg7Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqKmRyd19pbmZvOworCXN0cnVjdCBpZHIgZHJ3X2lkcjsKIAkvKkB9ICovCi19IGRybV9kZXZpY2VfdDsKK307CiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBkcm1fY29yZV9jaGVja19mZWF0dXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgaW50IGZlYXR1cmUpCkBAIC04MzgsNyArODI1LDcgQEAKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gbG9uZyBkcm1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBkcm1fbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAJCQkJLyogRGV2aWNlIHN1cHBvcnQgKGRybV9mb3BzLmgpICovCiBleHRlcm4gaW50IGRybV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKQEAgLTg1Nyw3ICs4NDQsNyBAQAogCQkJaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkICpkcm1fcmVhbGxvYyh2b2lkICpvbGRwdCwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplLCBpbnQgYXJlYSk7CiAKLWV4dGVybiBEUk1fQUdQX01FTSAqZHJtX2FsbG9jX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpOworZXh0ZXJuIERSTV9BR1BfTUVNICpkcm1fYWxsb2NfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpOwogZXh0ZXJuIGludCBkcm1fZnJlZV9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUsIGludCBwYWdlcyk7CiBleHRlcm4gaW50IGRybV9iaW5kX2FncChEUk1fQUdQX01FTSAqIGhhbmRsZSwgdW5zaWduZWQgaW50IHN0YXJ0KTsKIGV4dGVybiBpbnQgZHJtX3VuYmluZF9hZ3AoRFJNX0FHUF9NRU0gKiBoYW5kbGUpOwpAQCAtODk2LDkgKzg4Myw5IEBACiBleHRlcm4gaW50IGRybV9ybWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKLWV4dGVybiBpbnQgZHJtX2N0eGJpdG1hcF9pbml0KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBkcm1fY3R4Yml0bWFwX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9jdHhiaXRtYXBfZnJlZShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjdHhfaGFuZGxlKTsKK2V4dGVybiBpbnQgZHJtX2N0eGJpdG1hcF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZHJtX2N0eGJpdG1hcF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjdHhfaGFuZGxlKTsKIAogZXh0ZXJuIGludCBkcm1fc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC05MTIsOCArODk5LDkgQEAKIAkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCBkcm1fdXBkYXRlX2RyYXdhYmxlX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gZHJtX2RyYXdhYmxlX2luZm9fdCAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRybV9kZXZpY2VfdCAqZGV2LAorZXh0ZXJuIHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqZHJtX2dldF9kcmF3YWJsZV9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCQkgIGRybV9kcmF3YWJsZV90IGlkKTsKK2V4dGVybiB2b2lkIGRybV9kcmF3YWJsZV9mcmVlX2FsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogCQkJCS8qIEF1dGhlbnRpY2F0aW9uIElPQ1RMIHN1cHBvcnQgKGRybV9hdXRoLmgpICovCiBleHRlcm4gaW50IGRybV9nZXRtYWdpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKQEAgLTkyNiwxMCArOTE0LDEwIEBACiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV91bmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2xvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludCBkcm1fbG9ja19mcmVlKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCk7Ci1leHRlcm4gdm9pZCBkcm1faWRsZWxvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSk7Ci1leHRlcm4gdm9pZCBkcm1faWRsZWxvY2tfcmVsZWFzZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSk7CitleHRlcm4gaW50IGRybV9sb2NrX3Rha2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCBkcm1fbG9ja19mcmVlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsIHVuc2lnbmVkIGludCBjb250ZXh0KTsKK2V4dGVybiB2b2lkIGRybV9pZGxlbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpOworZXh0ZXJuIHZvaWQgZHJtX2lkbGVsb2NrX3JlbGVhc2Uoc3RydWN0IGRybV9sb2NrX2RhdGEgKmxvY2tfZGF0YSk7CiAKIC8qCiAgKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gZHJpdmVycyBzbyB0aGF0IHRoZXkgY2FuIGltcGxlbWVudCBmZW5jaW5nIHVzaW5nCkBAIC05NDAsMTUgKzkyOCwxNSBAQAogZXh0ZXJuIGludCBkcm1fa2VybmVsX3Rha2VfaHdfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKIAkJCQkvKiBCdWZmZXIgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fYnVmcy5oKSAqLwotZXh0ZXJuIGludCBkcm1fYWRkYnVmc19hZ3AoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpOwotZXh0ZXJuIGludCBkcm1fYWRkYnVmc19wY2koZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX2Rlc2NfdCAqIHJlcXVlc3QpOwotZXh0ZXJuIGludCBkcm1fYWRkbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkJICAgICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCi0JCSAgICAgIGRybV9tYXBfZmxhZ3NfdCBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpOworZXh0ZXJuIGludCBkcm1fYWRkYnVmc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWRkYnVmc19wY2koc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWRkbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCSAgICAgIHVuc2lnbmVkIGludCBzaXplLCBlbnVtIGRybV9tYXBfdHlwZSB0eXBlLAorCQkgICAgICBlbnVtIGRybV9tYXBfZmxhZ3MgZmxhZ3MsIGRybV9sb2NhbF9tYXBfdCAqKiBtYXBfcHRyKTsKIGV4dGVybiBpbnQgZHJtX2FkZG1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9ybW1hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9sb2NhbF9tYXBfdCAqIG1hcCk7Ci1leHRlcm4gaW50IGRybV9ybW1hcF9sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApOworZXh0ZXJuIGludCBkcm1fcm1tYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2xvY2FsX21hcF90ICogbWFwKTsKK2V4dGVybiBpbnQgZHJtX3JtbWFwX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKiBtYXApOwogZXh0ZXJuIGludCBkcm1fcm1tYXBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAKQEAgLTk2Myw1NiArOTUxLDU2IEBACiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV9tYXBidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9zdGFydChkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCSAgICB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2dldF9yZXNvdXJjZV9sZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJICB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpOwogCiAJCQkJLyogRE1BIHN1cHBvcnQgKGRybV9kbWEuaCkgKi8KLWV4dGVybiBpbnQgZHJtX2RtYV9zZXR1cChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RtYV90YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2ZyZWVfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKTsKLWV4dGVybiB2b2lkIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiBpbnQgZHJtX2RtYV9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kbWFfdGFrZWRvd24oc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZnJlZV9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9idWYgKiBidWYpOworZXh0ZXJuIHZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKIAogCQkJCS8qIElSUSBzdXBwb3J0IChkcm1faXJxLmgpICovCiBleHRlcm4gaW50IGRybV9jb250cm9sKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGlycXJldHVybl90IGRybV9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIGludCBkcm1faXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqdmJsX3NlcSk7Ci1leHRlcm4gdm9pZCBkcm1fdmJsX3NlbmRfc2lnbmFscyhkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KGRybV9kZXZpY2VfdCAqZGV2LCB2b2lkKCpmdW5jKShkcm1fZGV2aWNlX3QqKSk7CitleHRlcm4gaW50IGRybV92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnZibF9zZXEpOworZXh0ZXJuIHZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCgqZnVuYykoc3RydWN0IGRybV9kZXZpY2UqKSk7CiAKIAkJCQkvKiBBR1AvR0FSVCBzdXBwb3J0IChkcm1fYWdwc3VwcG9ydC5oKSAqLwotZXh0ZXJuIGRybV9hZ3BfaGVhZF90ICpkcm1fYWdwX2luaXQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiBpbnQgZHJtX2FncF9hY3F1aXJlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gc3RydWN0IGRybV9hZ3BfaGVhZCAqZHJtX2FncF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBkcm1fYWdwX2FjcXVpcmUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGRybV9hZ3BfYWNxdWlyZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgZHJtX2FncF9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBkcm1fYWdwX3JlbGVhc2VfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9lbmFibGUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX21vZGVfdCBtb2RlKTsKK2V4dGVybiBpbnQgZHJtX2FncF9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlKTsKIGV4dGVybiBpbnQgZHJtX2FncF9lbmFibGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2luZm8oZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX2luZm9fdCAqIGluZm8pOworZXh0ZXJuIGludCBkcm1fYWdwX2luZm8oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfaW5mbyAqIGluZm8pOwogZXh0ZXJuIGludCBkcm1fYWdwX2luZm9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGRybV9hZ3BfYWxsb2MoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciAqcmVxdWVzdCk7CiBleHRlcm4gaW50IGRybV9hZ3BfYWxsb2NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYnVmZmVyICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF9mcmVlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBkcm1fYWdwX3VuYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpOworZXh0ZXJuIGludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF91bmJpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZHJtX2FncF9iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCk7CitleHRlcm4gaW50IGRybV9hZ3BfYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KTsKIGV4dGVybiBpbnQgZHJtX2FncF9iaW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIERSTV9BR1BfTUVNICpkcm1fYWdwX2FsbG9jYXRlX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCkBAIC0xMDI0LDE2ICsxMDEyLDE4IEBACiAJCQkJLyogU3R1YiBzdXBwb3J0IChkcm1fc3R1Yi5oKSAqLwogZXh0ZXJuIGludCBkcm1fZ2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKIAkJICAgICAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpOwotZXh0ZXJuIGludCBkcm1fcHV0X2Rldihkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqIGhlYWQpOworZXh0ZXJuIGludCBkcm1fcHV0X2RldihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgZHJtX3B1dF9oZWFkKHN0cnVjdCBkcm1faGVhZCAqaGVhZCk7CiBleHRlcm4gdW5zaWduZWQgaW50IGRybV9kZWJ1ZzsKIGV4dGVybiB1bnNpZ25lZCBpbnQgZHJtX2NhcmRzX2xpbWl0OwotZXh0ZXJuIGRybV9oZWFkX3QgKipkcm1faGVhZHM7CitleHRlcm4gc3RydWN0IGRybV9oZWFkICoqZHJtX2hlYWRzOwogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqZHJtX2NsYXNzOwogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJtX3Byb2Nfcm9vdDsKIAorZXh0ZXJuIGRybV9sb2NhbF9tYXBfdCAqZHJtX2dldHNhcmVhKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCiAJCQkJLyogUHJvYyBzdXBwb3J0IChkcm1fcHJvYy5oKSAqLwotZXh0ZXJuIGludCBkcm1fcHJvY19pbml0KGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiBpbnQgZHJtX3Byb2NfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJIGludCBtaW5vciwKIAkJCSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJvb3QsCiAJCQkgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqZGV2X3Jvb3QpOwpAQCAtMTA0Miw0NSArMTAzMiw0NSBAQAogCQkJICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2X3Jvb3QpOwogCiAJCQkJLyogU2NhdHRlciBHYXRoZXIgU3VwcG9ydCAoZHJtX3NjYXR0ZXIuaCkgKi8KLWV4dGVybiB2b2lkIGRybV9zZ19jbGVhbnVwKGRybV9zZ19tZW1fdCAqIGVudHJ5KTsKK2V4dGVybiB2b2lkIGRybV9zZ19jbGVhbnVwKHN0cnVjdCBkcm1fc2dfbWVtICogZW50cnkpOwogZXh0ZXJuIGludCBkcm1fc2dfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50IGRybV9zZ19mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiAJCQkgICAgICAgLyogQVRJIFBDSUdBUlQgc3VwcG9ydCAoYXRpX3BjaWdhcnQuaCkgKi8KLWV4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoZHJtX2RldmljZV90ICogZGV2LAotCQkJCWRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKTsKLWV4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgIGRybV9hdGlfcGNpZ2FydF9pbmZvICogZ2FydF9pbmZvKTsKK2V4dGVybiBpbnQgZHJtX2F0aV9wY2lnYXJ0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gKiBnYXJ0X2luZm8pOworZXh0ZXJuIGludCBkcm1fYXRpX3BjaWdhcnRfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyAqIGdhcnRfaW5mbyk7CiAKLWV4dGVybiBkcm1fZG1hX2hhbmRsZV90ICpkcm1fcGNpX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgc2l6ZV90IHNpemUsCitleHRlcm4gZHJtX2RtYV9oYW5kbGVfdCAqZHJtX3BjaV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgICAgc2l6ZV90IGFsaWduLCBkbWFfYWRkcl90IG1heGFkZHIpOwotZXh0ZXJuIHZvaWQgX19kcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7Ci1leHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CitleHRlcm4gdm9pZCBfX2RybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CitleHRlcm4gdm9pZCBkcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX2RtYV9oYW5kbGVfdCAqIGRtYWgpOwogCiAJCQkgICAgICAgLyogc3lzZnMgc3VwcG9ydCAoZHJtX3N5c2ZzLmMpICovCiBleHRlcm4gc3RydWN0IGNsYXNzICpkcm1fc3lzZnNfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIGRybV9zeXNmc19kZXN0cm95KHN0cnVjdCBjbGFzcyAqY3MpOwogZXh0ZXJuIHN0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsCi0JCQkJCQkgZHJtX2hlYWRfdCAqaGVhZCk7CisJCQkJCQkgc3RydWN0IGRybV9oZWFkICpoZWFkKTsKIGV4dGVybiB2b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2Rldik7CiAKIC8qCiAgKiBCYXNpYyBtZW1vcnkgbWFuYWdlciBzdXBwb3J0IChkcm1fbW0uYykKICAqLwotZXh0ZXJuIGRybV9tbV9ub2RlX3QgKmRybV9tbV9nZXRfYmxvY2soZHJtX21tX25vZGVfdCAqIHBhcmVudCwKK2V4dGVybiBzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9nZXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogcGFyZW50LAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICAgICAgIHVuc2lnbmVkIGFsaWdubWVudCk7Ci12b2lkIGRybV9tbV9wdXRfYmxvY2soZHJtX21tX25vZGVfdCAqIGN1cik7Ci1leHRlcm4gZHJtX21tX25vZGVfdCAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplLAordm9pZCBkcm1fbW1fcHV0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqIGN1cik7CitleHRlcm4gc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3Qgc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJIHVuc2lnbmVkIGFsaWdubWVudCwgaW50IGJlc3RfbWF0Y2gpOwotZXh0ZXJuIGludCBkcm1fbW1faW5pdChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gdm9pZCBkcm1fbW1fdGFrZWRvd24oZHJtX21tX3QgKm1tKTsKLWV4dGVybiBpbnQgZHJtX21tX2NsZWFuKGRybV9tbV90ICptbSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShkcm1fbW1fdCAqbW0pOwotZXh0ZXJuIGludCBkcm1fbW1fcmVtb3ZlX3NwYWNlX2Zyb21fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1leHRlcm4gaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50IGRybV9tbV9pbml0KHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgZHJtX21tX3Rha2Vkb3duKHN0cnVjdCBkcm1fbW0gKm1tKTsKK2V4dGVybiBpbnQgZHJtX21tX2NsZWFuKHN0cnVjdCBkcm1fbW0gKm1tKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9tbV90YWlsX3NwYWNlKHN0cnVjdCBkcm1fbW0gKm1tKTsKK2V4dGVybiBpbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogZXh0ZXJuIHZvaWQgZHJtX2NvcmVfaW9yZW1hcChzdHJ1Y3QgZHJtX21hcCAqbWFwLCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIGRybV9jb3JlX2lvcmVtYXBmcmVlKHN0cnVjdCBkcm1fbWFwICptYXAsIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTA4OCwxNCArMTA3OCwxNCBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IGRybV9tYXAgKmRybV9jb3JlX2ZpbmRtYXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKIAkJCQkJCSAgIHVuc2lnbmVkIGludCB0b2tlbikKIHsKLQlkcm1fbWFwX2xpc3RfdCAqX2VudHJ5OwotCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkKQorCXN0cnVjdCBkcm1fbWFwX2xpc3QgKl9lbnRyeTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkKIAkgICAgaWYgKF9lbnRyeS0+dXNlcl90b2tlbiA9PSB0b2tlbikKIAkJcmV0dXJuIF9lbnRyeS0+bWFwOwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+ZHJpdmVyLT5kZXZpY2VfaXNfYWdwICE9IE5VTEwpIHsKIAkJaW50IGVyciA9ICgqZGV2LT5kcml2ZXItPmRldmljZV9pc19hZ3ApIChkZXYpOwpAQCAtMTEwOCw3ICsxMDk4LDcgQEAKIAlyZXR1cm4gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYtPnBkZXYsIFBDSV9DQVBfSURfQUdQKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IGRybV9kZXZpY2VfaXNfcGNpZShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZHJtX2RldmljZV9pc19wY2llKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CiB9CkBAIC0xMTQzLDcgKzExMzMsNyBAQAogCiAvKkB9Ki8KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICogbWFwKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKHN0cnVjdCBkcm1fbWFwICogbWFwKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9yZWdfb2ZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCmluZGV4IDQwYmZkOWIuLjM1NGYwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKQEAgLTQ4LDcgKzQ4LDcgQEAKICAqIFZlcmlmaWVzIHRoZSBBR1AgZGV2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCBhY3F1aXJlZCBhbmQgZmlsbHMgaW4gdGhlCiAgKiBkcm1fYWdwX2luZm8gc3RydWN0dXJlIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIGRybV9hZ3BfaGVhZDo6YWdwX2luZm8uCiAgKi8KLWludCBkcm1fYWdwX2luZm8oZHJtX2RldmljZV90ICogZGV2LCBkcm1fYWdwX2luZm9fdCAqIGluZm8pCitpbnQgZHJtX2FncF9pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2luZm8gKmluZm8pCiB7CiAJRFJNX0FHUF9LRVJOICprZXJuOwogCkBAIC03NCwxNiArNzQsMTYgQEAKIGludCBkcm1fYWdwX2luZm9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfaW5mb190IGluZm87CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfaW5mbyBpbmZvOwogCWludCBlcnI7CiAKIAllcnIgPSBkcm1fYWdwX2luZm8oZGV2LCAmaW5mbyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChjb3B5X3RvX3VzZXIoKGRybV9hZ3BfaW5mb190IF9fdXNlciAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBkcm1fYWdwX2luZm8gX191c2VyICopIGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtOTcsNyArOTcsNyBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzbid0IGJlZW4gYWNxdWlyZWQgYmVmb3JlIGFuZCBjYWxscwogICogXGMgYWdwX2JhY2tlbmRfYWNxdWlyZS4KICAqLwotaW50IGRybV9hZ3BfYWNxdWlyZShkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgZHJtX2FncF9hY3F1aXJlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWlmICghZGV2LT5hZ3ApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTI2LDkgKzEyNiw5IEBACiBpbnQgZHJtX2FncF9hY3F1aXJlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAotCXJldHVybiBkcm1fYWdwX2FjcXVpcmUoKGRybV9kZXZpY2VfdCAqKSBwcml2LT5oZWFkLT5kZXYpOworCXJldHVybiBkcm1fYWdwX2FjcXVpcmUoKHN0cnVjdCBkcm1fZGV2aWNlICopIHByaXYtPmhlYWQtPmRldik7CiB9CiAKIC8qKgpAQCAtMTM5LDcgKzEzOSw3IEBACiAgKgogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaGFzIGJlZW4gYWNxdWlyZWQgYW5kIGNhbGxzIFxjIGFncF9iYWNrZW5kX3JlbGVhc2UuCiAgKi8KLWludCBkcm1fYWdwX3JlbGVhc2UoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9hZ3BfcmVsZWFzZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpZiAoIWRldi0+YWdwIHx8ICFkZXYtPmFncC0+YWNxdWlyZWQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUyLDggKzE1Miw4IEBACiBpbnQgZHJtX2FncF9yZWxlYXNlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJcmV0dXJuIGRybV9hZ3BfcmVsZWFzZShkZXYpOwogfQpAQCAtMTY4LDcgKzE2OCw3IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBoYXMgYmVlbiBhY3F1aXJlZCBidXQgbm90IGVuYWJsZWQsIGFuZCBjYWxscwogICogXGMgYWdwX2VuYWJsZS4KICAqLwotaW50IGRybV9hZ3BfZW5hYmxlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2FncF9tb2RlX3QgbW9kZSkKK2ludCBkcm1fYWdwX2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlKQogewogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODUsMTEgKzE4NSwxMSBAQAogaW50IGRybV9hZ3BfZW5hYmxlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2FncF9tb2RlX3QgbW9kZTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9tb2RlIG1vZGU7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIChkcm1fYWdwX21vZGVfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YobW9kZSkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgKHN0cnVjdCBkcm1fYWdwX21vZGUgX191c2VyICopIGFyZywgc2l6ZW9mKG1vZGUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF9lbmFibGUoZGV2LCBtb2RlKTsKQEAgLTIwNyw5ICsyMDcsOSBAQAogICogVmVyaWZpZXMgdGhlIEFHUCBkZXZpY2UgaXMgcHJlc2VudCBhbmQgaGFzIGJlZW4gYWNxdWlyZWQsIGFsbG9jYXRlcyB0aGUKICAqIG1lbW9yeSB2aWEgYWxsb2NfYWdwKCkgYW5kIGNyZWF0ZXMgYSBkcm1fYWdwX21lbSBlbnRyeSBmb3IgaXQuCiAgKi8KLWludCBkcm1fYWdwX2FsbG9jKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2J1ZmZlcl90ICpyZXF1ZXN0KQoraW50IGRybV9hZ3BfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hZ3BfYnVmZmVyICpyZXF1ZXN0KQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJRFJNX0FHUF9NRU0gKm1lbW9yeTsKIAl1bnNpZ25lZCBsb25nIHBhZ2VzOwogCXUzMiB0eXBlOwpAQCAtMjMyLDExICsyMzIsNyBAQAogCWVudHJ5LT5tZW1vcnkgPSBtZW1vcnk7CiAJZW50cnktPmJvdW5kID0gMDsKIAllbnRyeS0+cGFnZXMgPSBwYWdlczsKLQllbnRyeS0+cHJldiA9IE5VTEw7Ci0JZW50cnktPm5leHQgPSBkZXYtPmFncC0+bWVtb3J5OwotCWlmIChkZXYtPmFncC0+bWVtb3J5KQotCQlkZXYtPmFncC0+bWVtb3J5LT5wcmV2ID0gZW50cnk7Ci0JZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5OworCWxpc3RfYWRkKCZlbnRyeS0+aGVhZCwgJmRldi0+YWdwLT5tZW1vcnkpOwogCiAJcmVxdWVzdC0+aGFuZGxlID0gZW50cnktPmhhbmRsZTsKIAlyZXF1ZXN0LT5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CkBAIC0yNDgsMTAgKzI0NCwxMCBAQAogaW50IGRybV9hZ3BfYWxsb2NfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYnVmZmVyX3QgcmVxdWVzdDsKLQlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSkpCkBAIC0yNjIsMTAgKzI1OCwxMiBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpKSkgewotCQlkcm1fYWdwX21lbV90ICplbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7Ci0KLQkJZGV2LT5hZ3AtPm1lbW9yeSA9IGVudHJ5LT5uZXh0OwotCQlkZXYtPmFncC0+bWVtb3J5LT5wcmV2ID0gTlVMTDsKKwkJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKKwkJCWlmIChlbnRyeS0+aGFuZGxlID09IHJlcXVlc3QuaGFuZGxlKQorCQkJCWJyZWFrOworCQl9CisJCWxpc3RfZGVsKCZlbnRyeS0+aGVhZCk7CiAJCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOwogCQlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fQUdQTElTVFMpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTI4MywxMiArMjgxLDEyIEBACiAgKgogICogV2Fsa3MgdGhyb3VnaCBkcm1fYWdwX2hlYWQ6Om1lbW9yeSB1bnRpbCBmaW5kaW5nIGEgbWF0Y2hpbmcgaGFuZGxlLgogICovCi1zdGF0aWMgZHJtX2FncF9tZW1fdCAqZHJtX2FncF9sb29rdXBfZW50cnkoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHN0cnVjdCBkcm1fYWdwX21lbSAqZHJtX2FncF9sb29rdXBfZW50cnkoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgaGFuZGxlKQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAKLQlmb3IgKGVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQlpZiAoZW50cnktPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlyZXR1cm4gZW50cnk7CiAJfQpAQCAtMzA3LDkgKzMwNSw5IEBACiAgKiBWZXJpZmllcyB0aGUgQUdQIGRldmljZSBpcyBwcmVzZW50IGFuZCBhY3F1aXJlZCwgbG9va3MtdXAgdGhlIEFHUCBtZW1vcnkKICAqIGVudHJ5IGFuZCBwYXNzZXMgaXQgdG8gdGhlIHVuYmluZF9hZ3AoKSBmdW5jdGlvbi4KICAqLwotaW50IGRybV9hZ3BfdW5iaW5kKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYWdwX2JpbmRpbmdfdCAqcmVxdWVzdCkKK2ludCBkcm1fYWdwX3VuYmluZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nICpyZXF1ZXN0KQogewotCWRybV9hZ3BfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJaW50IHJldDsKIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5hY3F1aXJlZCkKQEAgLTMyOCwxMiArMzI2LDEyIEBACiBpbnQgZHJtX2FncF91bmJpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2JpbmRpbmdfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgcmVxdWVzdDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcgotCSAgICAoJnJlcXVlc3QsIChkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCSAgICAoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIGRybV9hZ3BfdW5iaW5kKGRldiwgJnJlcXVlc3QpOwpAQCAtMzUyLDkgKzM1MCw5IEBACiAgKiBpcyBjdXJyZW50bHkgYm91bmQgaW50byB0aGUgR0FUVC4gTG9va3MtdXAgdGhlIEFHUCBtZW1vcnkgZW50cnkgYW5kIHBhc3NlcwogICogaXQgdG8gYmluZF9hZ3AoKSBmdW5jdGlvbi4KICAqLwotaW50IGRybV9hZ3BfYmluZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2FncF9iaW5kaW5nX3QgKnJlcXVlc3QpCitpbnQgZHJtX2FncF9iaW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgKnJlcXVlc3QpCiB7Ci0JZHJtX2FncF9tZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeTsKIAlpbnQgcmV0Y29kZTsKIAlpbnQgcGFnZTsKIApAQCAtMzc3LDEyICszNzUsMTIgQEAKIGludCBkcm1fYWdwX2JpbmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9hZ3BfYmluZGluZ190IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyByZXF1ZXN0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCi0JICAgICgmcmVxdWVzdCwgKGRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJICAgICgmcmVxdWVzdCwgKHN0cnVjdCBkcm1fYWdwX2JpbmRpbmcgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF9iaW5kKGRldiwgJnJlcXVlc3QpOwpAQCAtNDAyLDkgKzQwMCw5IEBACiAgKiB1bmJpbmRfYWdwKCkuIEZyZWVzIGl0IHZpYSBmcmVlX2FncCgpIGFzIHdlbGwgYXMgdGhlIGVudHJ5IGl0c2VsZgogICogYW5kIHVubGlua3MgZnJvbSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IGl0J3MgaW5zZXJ0ZWQgaW4uCiAgKi8KLWludCBkcm1fYWdwX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsIGRybV9hZ3BfYnVmZmVyX3QgKnJlcXVlc3QpCitpbnQgZHJtX2FncF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYWdwX2J1ZmZlciAqcmVxdWVzdCkKIHsKLQlkcm1fYWdwX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2FncF9tZW0gKmVudHJ5OwogCiAJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmFjcXVpcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxMywxMyArNDExLDcgQEAKIAlpZiAoZW50cnktPmJvdW5kKQogCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKIAotCWlmIChlbnRyeS0+cHJldikKLQkJZW50cnktPnByZXYtPm5leHQgPSBlbnRyeS0+bmV4dDsKLQllbHNlCi0JCWRldi0+YWdwLT5tZW1vcnkgPSBlbnRyeS0+bmV4dDsKLQotCWlmIChlbnRyeS0+bmV4dCkKLQkJZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKKwlsaXN0X2RlbCgmZW50cnktPmhlYWQpOwogCiAJZHJtX2ZyZWVfYWdwKGVudHJ5LT5tZW1vcnksIGVudHJ5LT5wYWdlcyk7CiAJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKQEAgLTQzMCwxMiArNDIyLDEyIEBACiBpbnQgZHJtX2FncF9mcmVlX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYWdwX2J1ZmZlcl90IHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hZ3BfYnVmZmVyIHJlcXVlc3Q7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIKLQkgICAgKCZyZXF1ZXN0LCAoZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQorCSAgICAoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZHJtX2FncF9mcmVlKGRldiwgJnJlcXVlc3QpOwpAQCAtNDUwLDkgKzQ0Miw5IEBACiAgKiB2aWEgdGhlIGludGVyX21vZHVsZV8qIGZ1bmN0aW9ucy4gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBkcm1fYWdwX2hlYWQKICAqIHN0cnVjdHVyZS4KICAqLwotZHJtX2FncF9oZWFkX3QgKmRybV9hZ3BfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdHJ1Y3QgZHJtX2FncF9oZWFkICpkcm1fYWdwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKLQlkcm1fYWdwX2hlYWRfdCAqaGVhZCA9IE5VTEw7CisJc3RydWN0IGRybV9hZ3BfaGVhZCAqaGVhZCA9IE5VTEw7CiAKIAlpZiAoIShoZWFkID0gZHJtX2FsbG9jKHNpemVvZigqaGVhZCksIERSTV9NRU1fQUdQTElTVFMpKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC00NzIsNyArNDY0LDcgQEAKIAkJZHJtX2ZyZWUoaGVhZCwgc2l6ZW9mKCpoZWFkKSwgRFJNX01FTV9BR1BMSVNUUyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQloZWFkLT5tZW1vcnkgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZoZWFkLT5tZW1vcnkpOwogCWhlYWQtPmNhbnRfdXNlX2FwZXJ0dXJlID0gaGVhZC0+YWdwX2luZm8uY2FudF91c2VfYXBlcnR1cmU7CiAJaGVhZC0+cGFnZV9tYXNrID0gaGVhZC0+YWdwX2luZm8ucGFnZV9tYXNrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKaW5kZXggYzdiMTlkMy4uN2Y3NzdkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYwpAQCAtNDUsMTUgKzQ1LDE1IEBACiAgKiB0aGUgb25lIHdpdGggbWF0Y2hpbmcgbWFnaWMgbnVtYmVyLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXgKICAqIGxvY2suCiAgKi8KLXN0YXRpYyBkcm1fZmlsZV90ICpkcm1fZmluZF9maWxlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgc3RydWN0IGRybV9maWxlICpkcm1fZmluZF9maWxlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKIHsKLQlkcm1fZmlsZV90ICpyZXR2YWwgPSBOVUxMOwotCWRybV9tYWdpY19lbnRyeV90ICpwdDsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2g7CisJc3RydWN0IGRybV9maWxlICpyZXR2YWwgPSBOVUxMOworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKnB0OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmICghZHJtX2h0X2ZpbmRfaXRlbSgmZGV2LT5tYWdpY2xpc3QsICh1bnNpZ25lZCBsb25nKW1hZ2ljLCAmaGFzaCkpIHsKLQkJcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBkcm1fbWFnaWNfZW50cnlfdCwgaGFzaF9pdGVtKTsKKwkJcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5LCBoYXNoX2l0ZW0pOwogCQlyZXR2YWwgPSBwdC0+cHJpdjsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC03MSwxMCArNzEsMTAgQEAKICAqIGFzc29jaWF0ZWQgdGhlIG1hZ2ljIG51bWJlciBoYXNoIGtleSBpbiBkcm1fZGV2aWNlOjptYWdpY2xpc3QsIHdoaWxlIGhvbGRpbmcKICAqIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotc3RhdGljIGludCBkcm1fYWRkX21hZ2ljKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIHByaXYsCitzdGF0aWMgaW50IGRybV9hZGRfbWFnaWMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIHByaXYsCiAJCQkgZHJtX21hZ2ljX3QgbWFnaWMpCiB7Ci0JZHJtX21hZ2ljX2VudHJ5X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKmVudHJ5OwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgbWFnaWMpOwogCkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogICogU2VhcmNoZXMgYW5kIHVubGlua3MgdGhlIGVudHJ5IGluIGRybV9kZXZpY2U6Om1hZ2ljbGlzdCB3aXRoIHRoZSBtYWdpYwogICogbnVtYmVyIGhhc2gga2V5LCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotc3RhdGljIGludCBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21hZ2ljX3QgbWFnaWMpCitzdGF0aWMgaW50IGRybV9yZW1vdmVfbWFnaWMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9tYWdpY190IG1hZ2ljKQogewotCWRybV9tYWdpY19lbnRyeV90ICpwdDsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2g7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQ7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmhhc2g7CiAKIAlEUk1fREVCVUcoIiVkXG4iLCBtYWdpYyk7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXB0ID0gZHJtX2hhc2hfZW50cnkoaGFzaCwgZHJtX21hZ2ljX2VudHJ5X3QsIGhhc2hfaXRlbSk7CisJcHQgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hZ2ljX2VudHJ5LCBoYXNoX2l0ZW0pOwogCWRybV9odF9yZW1vdmVfaXRlbSgmZGV2LT5tYWdpY2xpc3QsIGhhc2gpOwogCWxpc3RfZGVsKCZwdC0+aGVhZCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0xNDIsOSArMTQyLDkgQEAKIHsKIAlzdGF0aWMgZHJtX21hZ2ljX3Qgc2VxdWVuY2UgPSAwOwogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fYXV0aF90IGF1dGg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hdXRoIGF1dGg7CiAKIAkvKiBGaW5kIHVuaXF1ZSBtYWdpYyAqLwogCWlmIChwcml2LT5tYWdpYykgewpAQCAtMTYyLDcgKzE2Miw3IEBACiAJfQogCiAJRFJNX0RFQlVHKCIldVxuIiwgYXV0aC5tYWdpYyk7Ci0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX2F1dGhfdCBfX3VzZXIgKikgYXJnLCAmYXV0aCwgc2l6ZW9mKGF1dGgpKSkKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZHJtX2F1dGggX191c2VyICopIGFyZywgJmF1dGgsIHNpemVvZihhdXRoKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMTgxLDEyICsxODEsMTIgQEAKIGludCBkcm1fYXV0aG1hZ2ljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2F1dGhfdCBhdXRoOwotCWRybV9maWxlX3QgKmZpbGU7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9hdXRoIGF1dGg7CisJc3RydWN0IGRybV9maWxlICpmaWxlOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZhdXRoLCAoZHJtX2F1dGhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoYXV0aCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aCwgKHN0cnVjdCBkcm1fYXV0aCBfX3VzZXIgKikgYXJnLCBzaXplb2YoYXV0aCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlEUk1fREVCVUcoIiV1XG4iLCBhdXRoLm1hZ2ljKTsKIAlpZiAoKGZpbGUgPSBkcm1fZmluZF9maWxlKGRldiwgYXV0aC5tYWdpYykpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggYzExMzQ1OC4uOTIzMTc0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMzYsMjYgKzM2LDI0IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgImRybVAuaCIKIAotdW5zaWduZWQgbG9uZyBkcm1fZ2V0X3Jlc291cmNlX3N0YXJ0KGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCit1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlc291cmNlKQogewogCXJldHVybiBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCByZXNvdXJjZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQpOwogCi11bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzb3VyY2UpCit1bnNpZ25lZCBsb25nIGRybV9nZXRfcmVzb3VyY2VfbGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZXNvdXJjZSkKIHsKIAlyZXR1cm4gcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIHJlc291cmNlKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X3Jlc291cmNlX2xlbik7CiAKLXN0YXRpYyBkcm1fbWFwX2xpc3RfdCAqZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRybV9kZXZpY2VfdCAqZGV2LAorc3RhdGljIHN0cnVjdCBkcm1fbWFwX2xpc3QgKmRybV9maW5kX21hdGNoaW5nX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCQkgICAgIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0KLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKmVudHJ5ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqZW50cnk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAoZW50cnktPm1hcCAmJiBtYXAtPnR5cGUgPT0gZW50cnktPm1hcC0+dHlwZSAmJgogCQkgICAgKChlbnRyeS0+bWFwLT5vZmZzZXQgPT0gbWFwLT5vZmZzZXQpIHx8CiAJCSAgICAgKG1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJiBtYXAtPmZsYWdzPT1fRFJNX0NPTlRBSU5TX0xPQ0spKSkgewpAQCAtNjYsNyArNjQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGRybV9tYXBfaGFuZGxlKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1faGFzaF9pdGVtX3QgKmhhc2gsCitzdGF0aWMgaW50IGRybV9tYXBfaGFuZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoLAogCQkJICB1bnNpZ25lZCBsb25nIHVzZXJfdG9rZW4sIGludCBoYXNoZWRfaGFuZGxlKQogewogCWludCB1c2VfaGFzaGVkX2hhbmRsZTsKQEAgLTEwMywxMiArMTAxLDEzIEBACiAgKiB0eXBlLiAgQWRkcyB0aGUgbWFwIHRvIHRoZSBtYXAgbGlzdCBkcm1fZGV2aWNlOjptYXBsaXN0LiBBZGRzIE1UUlIncyB3aGVyZQogICogYXBwbGljYWJsZSBhbmQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2FkZG1hcF9jb3JlKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkJCSAgIHVuc2lnbmVkIGludCBzaXplLCBkcm1fbWFwX3R5cGVfdCB0eXBlLAotCQkJICAgZHJtX21hcF9mbGFnc190IGZsYWdzLCBkcm1fbWFwX2xpc3RfdCAqKiBtYXBsaXN0KQorc3RhdGljIGludCBkcm1fYWRkbWFwX2NvcmUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSwgZW51bSBkcm1fbWFwX3R5cGUgdHlwZSwKKwkJCSAgIGVudW0gZHJtX21hcF9mbGFncyBmbGFncywKKwkJCSAgIHN0cnVjdCBkcm1fbWFwX2xpc3QgKiogbWFwbGlzdCkKIHsKLQlkcm1fbWFwX3QgKm1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKmxpc3Q7CiAJZHJtX2RtYV9oYW5kbGVfdCAqZG1haDsKIAl1bnNpZ25lZCBsb25nIHVzZXJfdG9rZW47CiAJaW50IHJldDsKQEAgLTIxNCw3ICsyMTMsNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgX0RSTV9BR1A6IHsKLQkJZHJtX2FncF9tZW1fdCAqZW50cnk7CisJCXN0cnVjdCBkcm1fYWdwX21lbSAqZW50cnk7CiAJCWludCB2YWxpZCA9IDA7CiAKIAkJaWYgKCFkcm1fY29yZV9oYXNfQUdQKGRldikpIHsKQEAgLTIzNywxNCArMjM2LDE0IEBACiAJCSAqIHNraXBwZWQgYW5kIHdlIGRvdWJsZSBjaGVjayB0aGF0IGRldi0+YWdwLT5tZW1vcnkgaXMKIAkJICogYWN0dWFsbHkgc2V0IGFzIHdlbGwgYXMgYmVpbmcgaW52YWxpZCBiZWZvcmUgRVBFUk0naW5nCiAJCSAqLwotCQlmb3IgKGVudHJ5ID0gZGV2LT5hZ3AtPm1lbW9yeTsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJCWlmICgobWFwLT5vZmZzZXQgPj0gZW50cnktPmJvdW5kKSAmJgogCQkJICAgIChtYXAtPm9mZnNldCArIG1hcC0+c2l6ZSA8PSBlbnRyeS0+Ym91bmQgKyBlbnRyeS0+cGFnZXMgKiBQQUdFX1NJWkUpKSB7CiAJCQkJdmFsaWQgPSAxOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWlmIChkZXYtPmFncC0+bWVtb3J5ICYmICF2YWxpZCkgeworCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+YWdwLT5tZW1vcnkpICYmICF2YWxpZCkgewogCQkJZHJtX2ZyZWUobWFwLCBzaXplb2YoKm1hcCksIERSTV9NRU1fTUFQUyk7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC0yODksNyArMjg4LDcgQEAKIAlsaXN0LT5tYXAgPSBtYXA7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JbGlzdF9hZGQoJmxpc3QtPmhlYWQsICZkZXYtPm1hcGxpc3QtPmhlYWQpOworCWxpc3RfYWRkKCZsaXN0LT5oZWFkLCAmZGV2LT5tYXBsaXN0KTsKIAogCS8qIEFzc2lnbiBhIDMyLWJpdCBoYW5kbGUgKi8KIAkvKiBXZSBkbyBpdCBoZXJlIHNvIHRoYXQgZGV2LT5zdHJ1Y3RfbXV0ZXggcHJvdGVjdHMgdGhlIGluY3JlbWVudCAqLwpAQCAtMzEyLDExICszMTEsMTEgQEAKIAlyZXR1cm4gMDsKIAl9CiAKLWludCBkcm1fYWRkbWFwKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKLQkgICAgICAgdW5zaWduZWQgaW50IHNpemUsIGRybV9tYXBfdHlwZV90IHR5cGUsCi0JICAgICAgIGRybV9tYXBfZmxhZ3NfdCBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpCitpbnQgZHJtX2FkZG1hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkgICAgICAgdW5zaWduZWQgaW50IHNpemUsIGVudW0gZHJtX21hcF90eXBlIHR5cGUsCisJICAgICAgIGVudW0gZHJtX21hcF9mbGFncyBmbGFncywgZHJtX2xvY2FsX21hcF90ICoqIG1hcF9wdHIpCiB7Ci0JZHJtX21hcF9saXN0X3QgKmxpc3Q7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbGlzdDsKIAlpbnQgcmM7CiAKIAlyYyA9IGRybV9hZGRtYXBfY29yZShkZXYsIG9mZnNldCwgc2l6ZSwgdHlwZSwgZmxhZ3MsICZsaXN0KTsKQEAgLTMzMCwxMSArMzI5LDExIEBACiBpbnQgZHJtX2FkZG1hcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCBtYXA7Ci0JZHJtX21hcF9saXN0X3QgKm1hcGxpc3Q7Ci0JZHJtX21hcF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCBtYXA7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqbWFwbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGVycjsKIAogCWlmICghKGZpbHAtPmZfbW9kZSAmIDMpKQpAQCAtMzUzLDcgKzM1Miw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbWFwbGlzdC0+bWFwLCBzaXplb2YoZHJtX21hcF90KSkpCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBtYXBsaXN0LT5tYXAsIHNpemVvZihzdHJ1Y3QgZHJtX21hcCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCS8qIGF2b2lkIGEgd2FybmluZyBvbiA2NC1iaXQsIHRoaXMgY2FzdGluZyBpc24ndCB2ZXJ5IG5pY2UsIGJ1dCB0aGUgQVBJIGlzIHNldCBzbyB0b28gbGF0ZSAqLwpAQCAtMzY5LDcgKzM2OCw3IEBACiAgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgogICogXHBhcmFtIGZpbHAgZmlsZSBwb2ludGVyLgogICogXHBhcmFtIGNtZCBjb21tYW5kLgotICogXHBhcmFtIGFyZyBwb2ludGVyIHRvIGEgZHJtX21hcF90IHN0cnVjdHVyZS4KKyAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIHN0cnVjdCBkcm1fbWFwIHN0cnVjdHVyZS4KICAqIFxyZXR1cm4gemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCiAgKgogICogU2VhcmNoZXMgdGhlIG1hcCBvbiBkcm1fZGV2aWNlOjptYXBsaXN0LCByZW1vdmVzIGl0IGZyb20gdGhlIGxpc3QsIHNlZSBpZgpAQCAtMzc4LDMxICszNzcsMjYgQEAKICAqCiAgKiBcc2EgZHJtX2FkZG1hcAogICovCi1pbnQgZHJtX3JtbWFwX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCitpbnQgZHJtX3JtbWFwX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fbG9jYWxfbWFwX3QgKm1hcCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBOVUxMOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCA9IE5VTEwsICpsaXN0X3Q7CiAJZHJtX2RtYV9oYW5kbGVfdCBkbWFoOworCWludCBmb3VuZCA9IDA7CiAKIAkvKiBGaW5kIHRoZSBsaXN0IGVudHJ5IGZvciB0aGUgbWFwIGFuZCByZW1vdmUgaXQgKi8KLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9saXN0LCBsaXN0X3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwID09IG1hcCkgewotCQkJbGlzdF9kZWwobGlzdCk7CisJCQlsaXN0X2RlbCgmcl9saXN0LT5oZWFkKTsKIAkJCWRybV9odF9yZW1vdmVfa2V5KCZkZXYtPm1hcF9oYXNoLAogCQkJCQkgIHJfbGlzdC0+dXNlcl90b2tlbiA+PiBQQUdFX1NISUZUKTsKLQkJCWRybV9mcmVlKGxpc3QsIHNpemVvZigqbGlzdCksIERSTV9NRU1fTUFQUyk7CisJCQlkcm1fZnJlZShyX2xpc3QsIHNpemVvZigqcl9saXN0KSwgRFJNX01FTV9NQVBTKTsKKwkJCWZvdW5kID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JLyogTGlzdCBoYXMgd3JhcHBlZCBhcm91bmQgdG8gdGhlIGhlYWQgcG9pbnRlciwgb3IgaXQncyBlbXB0eSBhbmQgd2UKLQkgKiBkaWRuJ3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlpZiAobGlzdCA9PSAoJmRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwlpZiAoIWZvdW5kKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlzd2l0Y2ggKG1hcC0+dHlwZSkgewogCWNhc2UgX0RSTV9SRUdJU1RFUlM6CkBAIC00MzMsNyArNDI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV9ybW1hcChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2xvY2FsX21hcF90ICptYXApCitpbnQgZHJtX3JtbWFwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV9sb2NhbF9tYXBfdCAqbWFwKQogewogCWludCByZXQ7CiAKQEAgLTQ1NiwyMSArNDUwLDE5IEBACiBpbnQgZHJtX3JtbWFwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCByZXF1ZXN0OwogCWRybV9sb2NhbF9tYXBfdCAqbWFwID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAlpbnQgcmV0OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX21hcF90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpIHsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKSB7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJZHJtX21hcF9saXN0X3QgKnJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwICYmCiAJCSAgICByX2xpc3QtPnVzZXJfdG9rZW4gPT0gKHVuc2lnbmVkIGxvbmcpcmVxdWVzdC5oYW5kbGUgJiYKIAkJICAgIHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fUkVNT1ZBQkxFKSB7CkBAIC00ODIsNyArNDc0LDcgQEAKIAkvKiBMaXN0IGhhcyB3cmFwcGVkIGFyb3VuZCB0byB0aGUgaGVhZCBwb2ludGVyLCBvciBpdHMgZW1wdHkgd2UgZGlkbid0CiAJICogZmluZCBhbnl0aGluZy4KIAkgKi8KLQlpZiAobGlzdCA9PSAoJmRldi0+bWFwbGlzdC0+aGVhZCkpIHsKKwlpZiAobGlzdF9lbXB0eSgmZGV2LT5tYXBsaXN0KSB8fCAhbWFwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC01MTMsNyArNTA1LDggQEAKICAqCiAgKiBGcmVlcyBhbnkgcGFnZXMgYW5kIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBlbnRyeS4KICAqLwotc3RhdGljIHZvaWQgZHJtX2NsZWFudXBfYnVmX2Vycm9yKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9lbnRyeV90ICogZW50cnkpCitzdGF0aWMgdm9pZCBkcm1fY2xlYW51cF9idWZfZXJyb3Ioc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICBzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqIGVudHJ5KQogewogCWludCBpOwogCkBAIC01NTAsMjAgKzU0MywyMCBAQAogLyoqCiAgKiBBZGQgQUdQIGJ1ZmZlcnMgZm9yIERNQSB0cmFuc2ZlcnMuCiAgKgotICogXHBhcmFtIGRldiBkcm1fZGV2aWNlX3QgdG8gd2hpY2ggdGhlIGJ1ZmZlcnMgYXJlIHRvIGJlIGFkZGVkLgotICogXHBhcmFtIHJlcXVlc3QgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QuCisgKiBccGFyYW0gZGV2IHN0cnVjdCBkcm1fZGV2aWNlIHRvIHdoaWNoIHRoZSBidWZmZXJzIGFyZSB0byBiZSBhZGRlZC4KKyAqIFxwYXJhbSByZXF1ZXN0IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIEFmdGVyIHNvbWUgc2FuaXR5IGNoZWNrcyBjcmVhdGVzIGEgZHJtX2J1ZiBzdHJ1Y3R1cmUgZm9yIGVhY2ggYnVmZmVyIGFuZAogICogcmVhbGxvY2F0ZXMgdGhlIGJ1ZmZlciBsaXN0IG9mIHRoZSBzYW1lIHNpemUgb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIG5ldwogICogYnVmZmVycy4KICAqLwotaW50IGRybV9hZGRidWZzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK2ludCBkcm1fYWRkYnVmc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7Ci0JZHJtX2FncF9tZW1fdCAqYWdwX2VudHJ5OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZW50cnkgKmVudHJ5OworCXN0cnVjdCBkcm1fYWdwX21lbSAqYWdwX2VudHJ5OworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfb2Zmc2V0OwogCWludCBjb3VudDsKQEAgLTU3NCw3ICs1NjcsNyBAQAogCWludCB0b3RhbDsKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgaSwgdmFsaWQ7Ci0JZHJtX2J1Zl90ICoqdGVtcF9idWZsaXN0OworCXN0cnVjdCBkcm1fYnVmICoqdGVtcF9idWZsaXN0OwogCiAJaWYgKCFkbWEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjA2LDE0ICs1OTksMTQgQEAKIAogCS8qIE1ha2Ugc3VyZSBidWZmZXJzIGFyZSBsb2NhdGVkIGluIEFHUCBtZW1vcnkgdGhhdCB3ZSBvd24gKi8KIAl2YWxpZCA9IDA7Ci0JZm9yIChhZ3BfZW50cnkgPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BfZW50cnk7IGFncF9lbnRyeSA9IGFncF9lbnRyeS0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWdwX2VudHJ5LCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQlpZiAoKGFncF9vZmZzZXQgPj0gYWdwX2VudHJ5LT5ib3VuZCkgJiYKIAkJICAgIChhZ3Bfb2Zmc2V0ICsgdG90YWwgKiBjb3VudCA8PSBhZ3BfZW50cnktPmJvdW5kICsgYWdwX2VudHJ5LT5wYWdlcyAqIFBBR0VfU0laRSkpIHsKIAkJCXZhbGlkID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChkZXYtPmFncC0+bWVtb3J5ICYmICF2YWxpZCkgeworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5hZ3AtPm1lbW9yeSkgJiYgIXZhbGlkKSB7CiAJCURSTV9ERUJVRygiem9uZSBpbnZhbGlkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNzI4LDI0ICs3MjEsMjQgQEAKIEVYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfYWdwKTsKICNlbmRpZgkJCQkvKiBfX09TX0hBU19BR1AgKi8KIAotaW50IGRybV9hZGRidWZzX3BjaShkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK2ludCBkcm1fYWRkYnVmc19wY2koc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IGNvdW50OwogCWludCBvcmRlcjsKIAlpbnQgc2l6ZTsKIAlpbnQgdG90YWw7CiAJaW50IHBhZ2Vfb3JkZXI7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CiAJZHJtX2RtYV9oYW5kbGVfdCAqZG1haDsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBhbGlnbm1lbnQ7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJaW50IGk7CiAJaW50IGJ5dGVfY291bnQ7CiAJaW50IHBhZ2VfY291bnQ7CiAJdW5zaWduZWQgbG9uZyAqdGVtcF9wYWdlbGlzdDsKLQlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7CisJc3RydWN0IGRybV9idWYgKip0ZW1wX2J1Zmxpc3Q7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfUENJX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTU0LDExICs5NDcsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX2FkZGJ1ZnNfcGNpKTsKIAotc3RhdGljIGludCBkcm1fYWRkYnVmc19zZyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfZGVzY190ICogcmVxdWVzdCkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfc2coc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmX2Rlc2MgKiByZXF1ZXN0KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfZW50cnlfdCAqZW50cnk7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGFncF9vZmZzZXQ7CiAJaW50IGNvdW50OwpAQCAtOTY5LDcgKzk2Miw3IEBACiAJaW50IHRvdGFsOwogCWludCBieXRlX2NvdW50OwogCWludCBpOwotCWRybV9idWZfdCAqKnRlbXBfYnVmbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1ZiAqKnRlbXBfYnVmbGlzdDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTExNiwxMSArMTEwOSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRybV9hZGRidWZzX2ZiKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl9kZXNjX3QgKiByZXF1ZXN0KQorc3RhdGljIGludCBkcm1fYWRkYnVmc19mYihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWZfZGVzYyAqIHJlcXVlc3QpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9lbnRyeV90ICplbnRyeTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgYWdwX29mZnNldDsKIAlpbnQgY291bnQ7CkBAIC0xMTMxLDcgKzExMjQsNyBAQAogCWludCB0b3RhbDsKIAlpbnQgYnl0ZV9jb3VudDsKIAlpbnQgaTsKLQlkcm1fYnVmX3QgKip0ZW1wX2J1Zmxpc3Q7CisJc3RydWN0IGRybV9idWYgKip0ZW1wX2J1Zmxpc3Q7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfRkJfRE1BKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjgzLDcgKzEyNzYsNyBAQAogICogXHBhcmFtIGlub2RlIGRldmljZSBpbm9kZS4KICAqIFxwYXJhbSBmaWxwIGZpbGUgcG9pbnRlci4KICAqIFxwYXJhbSBjbWQgY29tbWFuZC4KLSAqIFxwYXJhbSBhcmcgcG9pbnRlciB0byBhIGRybV9idWZfZGVzY190IHJlcXVlc3QuCisgKiBccGFyYW0gYXJnIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcXVlc3QuCiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIEFjY29yZGluZyB3aXRoIHRoZSBtZW1vcnkgdHlwZSBzcGVjaWZpZWQgaW4gZHJtX2J1Zl9kZXNjOjpmbGFncyBhbmQgdGhlCkBAIC0xMjk0LDE1ICsxMjg3LDE1IEBACiBpbnQgZHJtX2FkZGJ1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9idWZfZGVzY190IHJlcXVlc3Q7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcXVlc3Q7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldDsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LCAoZHJtX2J1Zl9kZXNjX3QgX191c2VyICopIGFyZywKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIChzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqKSBhcmcsCiAJCQkgICBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMTM0NiwxMSArMTMzOSwxMSBAQAogaW50IGRybV9pbmZvYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9pbmZvX3QgcmVxdWVzdDsKLQlkcm1fYnVmX2luZm9fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1Zl9pbmZvIHJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfaW5mbyBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IGk7CiAJaW50IGNvdW50OwogCkBAIC0xMzgxLDEwICsxMzc0LDEwIEBACiAJaWYgKHJlcXVlc3QuY291bnQgPj0gY291bnQpIHsKIAkJZm9yIChpID0gMCwgY291bnQgPSAwOyBpIDwgRFJNX01BWF9PUkRFUiArIDE7IGkrKykgewogCQkJaWYgKGRtYS0+YnVmc1tpXS5idWZfY291bnQpIHsKLQkJCQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKnRvID0KKwkJCQlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqdG8gPQogCQkJCSAgICAmcmVxdWVzdC5saXN0W2NvdW50XTsKLQkJCQlkcm1fYnVmX2VudHJ5X3QgKmZyb20gPSAmZG1hLT5idWZzW2ldOwotCQkJCWRybV9mcmVlbGlzdF90ICpsaXN0ID0gJmRtYS0+YnVmc1tpXS5mcmVlbGlzdDsKKwkJCQlzdHJ1Y3QgZHJtX2J1Zl9lbnRyeSAqZnJvbSA9ICZkbWEtPmJ1ZnNbaV07CisJCQkJc3RydWN0IGRybV9mcmVlbGlzdCAqbGlzdCA9ICZkbWEtPmJ1ZnNbaV0uZnJlZWxpc3Q7CiAJCQkJaWYgKGNvcHlfdG9fdXNlcigmdG8tPmNvdW50LAogCQkJCQkJICZmcm9tLT5idWZfY291bnQsCiAJCQkJCQkgc2l6ZW9mKGZyb20tPmJ1Zl9jb3VudCkpIHx8CkBAIC0xNDM0LDEyICsxNDI3LDEyIEBACiBpbnQgZHJtX21hcmtidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX2Rlc2NfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfZGVzYyByZXF1ZXN0OwogCWludCBvcmRlcjsKLQlkcm1fYnVmX2VudHJ5X3QgKmVudHJ5OworCXN0cnVjdCBkcm1fYnVmX2VudHJ5ICplbnRyeTsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ0OCw3ICsxNDQxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCi0JCQkgICAoZHJtX2J1Zl9kZXNjX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCSAgIChzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZCwgJWQsICVkXG4iLApAQCAtMTQ4NCwxMyArMTQ3NywxMyBAQAogaW50IGRybV9mcmVlYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl9mcmVlX3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmX2ZyZWUgcmVxdWVzdDsKIAlpbnQgaTsKIAlpbnQgaWR4OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9ETUEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0OTksNyArMTQ5Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXF1ZXN0LAotCQkJICAgKGRybV9idWZfZnJlZV90IF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXF1ZXN0KSkpCisJCQkgICAoc3RydWN0IGRybV9idWZfZnJlZSBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWRcbiIsIHJlcXVlc3QuY291bnQpOwpAQCAtMTU0MCwxNSArMTUzMywxNSBAQAogaW50IGRybV9tYXBidWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWZfbWFwIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcmV0Y29kZSA9IDA7CiAJY29uc3QgaW50IHplcm8gPSAwOwogCXVuc2lnbmVkIGxvbmcgdmlydHVhbDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JZHJtX2J1Zl9tYXBfdCByZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX21hcCByZXF1ZXN0OwogCWludCBpOwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKQEAgLTE1NzQsNyArMTU2Nyw3IEBACiAJCQkmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9TRykpCiAJCSAgICB8fCAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9GQl9ETUEpCiAJCQkmJiAoZG1hLT5mbGFncyAmIF9EUk1fRE1BX1VTRV9GQikpKSB7Ci0JCQlkcm1fbWFwX3QgKm1hcCA9IGRldi0+YWdwX2J1ZmZlcl9tYXA7CisJCQlzdHJ1Y3QgZHJtX21hcCAqbWFwID0gZGV2LT5hZ3BfYnVmZmVyX21hcDsKIAkJCXVuc2lnbmVkIGxvbmcgdG9rZW4gPSBkZXYtPmFncF9idWZmZXJfdG9rZW47CiAKIAkJCWlmICghbWFwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKaW5kZXggODMwOTRjNy4uNjFhZDk4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwpAQCAtNTMsMjYgKzUzLDE0IEBACiAgKiBccGFyYW0gY3R4X2hhbmRsZSBjb250ZXh0IGhhbmRsZS4KICAqCiAgKiBDbGVhcnMgdGhlIGJpdCBzcGVjaWZpZWQgYnkgXHAgY3R4X2hhbmRsZSBpbiBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCB0aGUgZW50cnkKLSAqIGluIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzLCB3aGlsZSBob2xkaW5nIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXgKKyAqIGluIGRybV9kZXZpY2U6OmN0eF9pZHIsIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleAogICogbG9jay4KICAqLwotdm9pZCBkcm1fY3R4Yml0bWFwX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBpbnQgY3R4X2hhbmRsZSkKK3ZvaWQgZHJtX2N0eGJpdG1hcF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgY3R4X2hhbmRsZSkKIHsKLQlpZiAoY3R4X2hhbmRsZSA8IDApCi0JCWdvdG8gZmFpbGVkOwotCWlmICghZGV2LT5jdHhfYml0bWFwKQotCQlnb3RvIGZhaWxlZDsKLQotCWlmIChjdHhfaGFuZGxlIDwgRFJNX01BWF9DVFhCSVRNQVApIHsKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQljbGVhcl9iaXQoY3R4X2hhbmRsZSwgZGV2LT5jdHhfYml0bWFwKTsKLQkJZGV2LT5jb250ZXh0X3NhcmVhc1tjdHhfaGFuZGxlXSA9IE5VTEw7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm47Ci0JfQotICAgICAgZmFpbGVkOgotCURSTV9FUlJPUigiQXR0ZW1wdCB0byBmcmVlIGludmFsaWQgY29udGV4dCBoYW5kbGU6ICVkXG4iLCBjdHhfaGFuZGxlKTsKLQlyZXR1cm47CisJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlkcl9yZW1vdmUoJmRldi0+Y3R4X2lkciwgY3R4X2hhbmRsZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKIC8qKgpAQCAtODEsNjIgKzY5LDI4IEBACiAgKiBccGFyYW0gZGV2IERSTSBkZXZpY2UuCiAgKiBccmV0dXJuIChub24tbmVnYXRpdmUpIGNvbnRleHQgaGFuZGxlIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCi0gKiBGaW5kIHRoZSBmaXJzdCB6ZXJvIGJpdCBpbiBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCAocmUpYWxsb2NhdGVzCi0gKiBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3IGVudHJ5IHdoaWxlIGhvbGRpbmcgdGhlCisgKiBBbGxvY2F0ZSBhIG5ldyBpZHIgZnJvbSBkcm1fZGV2aWNlOjpjdHhfaWRyIHdoaWxlIGhvbGRpbmcgdGhlCiAgKiBkcm1fZGV2aWNlOjpzdHJ1Y3RfbXV0ZXggbG9jay4KICAqLwotc3RhdGljIGludCBkcm1fY3R4Yml0bWFwX25leHQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1fY3R4Yml0bWFwX25leHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JaW50IGJpdDsKKwlpbnQgbmV3X2lkOworCWludCByZXQ7CiAKLQlpZiAoIWRldi0+Y3R4X2JpdG1hcCkKLQkJcmV0dXJuIC0xOwotCithZ2FpbjoKKwlpZiAoaWRyX3ByZV9nZXQoJmRldi0+Y3R4X2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgeworCQlEUk1fRVJST1IoIk91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIGRyYXdhYmxlIGlkclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JYml0ID0gZmluZF9maXJzdF96ZXJvX2JpdChkZXYtPmN0eF9iaXRtYXAsIERSTV9NQVhfQ1RYQklUTUFQKTsKLQlpZiAoYml0IDwgRFJNX01BWF9DVFhCSVRNQVApIHsKLQkJc2V0X2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCURSTV9ERUJVRygiZHJtX2N0eGJpdG1hcF9uZXh0IGJpdCA6ICVkXG4iLCBiaXQpOwotCQlpZiAoKGJpdCArIDEpID4gZGV2LT5tYXhfY29udGV4dCkgewotCQkJZGV2LT5tYXhfY29udGV4dCA9IChiaXQgKyAxKTsKLQkJCWlmIChkZXYtPmNvbnRleHRfc2FyZWFzKSB7Ci0JCQkJZHJtX21hcF90ICoqY3R4X3NhcmVhczsKLQotCQkJCWN0eF9zYXJlYXMgPSBkcm1fcmVhbGxvYyhkZXYtPmNvbnRleHRfc2FyZWFzLAotCQkJCQkJCSAoZGV2LT5tYXhfY29udGV4dCAtCi0JCQkJCQkJICAxKSAqCi0JCQkJCQkJIHNpemVvZigqZGV2LT4KLQkJCQkJCQkJY29udGV4dF9zYXJlYXMpLAotCQkJCQkJCSBkZXYtPm1heF9jb250ZXh0ICoKLQkJCQkJCQkgc2l6ZW9mKCpkZXYtPgotCQkJCQkJCQljb250ZXh0X3NhcmVhcyksCi0JCQkJCQkJIERSTV9NRU1fTUFQUyk7Ci0JCQkJaWYgKCFjdHhfc2FyZWFzKSB7Ci0JCQkJCWNsZWFyX2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPSBjdHhfc2FyZWFzOwotCQkJCWRldi0+Y29udGV4dF9zYXJlYXNbYml0XSA9IE5VTEw7Ci0JCQl9IGVsc2UgewotCQkJCS8qIG1heF9jb250ZXh0ID09IDEgYXQgdGhpcyBwb2ludCAqLwotCQkJCWRldi0+Y29udGV4dF9zYXJlYXMgPQotCQkJCSAgICBkcm1fYWxsb2MoZGV2LT5tYXhfY29udGV4dCAqCi0JCQkJCSAgICAgIHNpemVvZigqZGV2LT5jb250ZXh0X3NhcmVhcyksCi0JCQkJCSAgICAgIERSTV9NRU1fTUFQUyk7Ci0JCQkJaWYgKCFkZXYtPmNvbnRleHRfc2FyZWFzKSB7Ci0JCQkJCWNsZWFyX2JpdChiaXQsIGRldi0+Y3R4X2JpdG1hcCk7Ci0JCQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWRldi0+Y29udGV4dF9zYXJlYXNbYml0XSA9IE5VTEw7Ci0JCQl9Ci0JCX0KKwlyZXQgPSBpZHJfZ2V0X25ld19hYm92ZSgmZGV2LT5jdHhfaWRyLCBOVUxMLAorCQkJCURSTV9SRVNFUlZFRF9DT05URVhUUywgJm5ld19pZCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm4gYml0OworCQlnb3RvIGFnYWluOwogCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIG5ld19pZDsKIH0KIAogLyoqCkBAIC0xNDQsMzEgKzk4LDExIEBACiAgKgogICogXHBhcmFtIGRldiBEUk0gZGV2aWNlLgogICoKLSAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZwotICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgorICogSW5pdGlhbGlzZSB0aGUgZHJtX2RldmljZTo6Y3R4X2lkcgogICovCi1pbnQgZHJtX2N0eGJpdG1hcF9pbml0KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fY3R4Yml0bWFwX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JaW50IGk7Ci0JaW50IHRlbXA7Ci0KLQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZGV2LT5jdHhfYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilkcm1fYWxsb2MoUEFHRV9TSVpFLAotCQkJCQkJICAgICBEUk1fTUVNX0NUWEJJVE1BUCk7Ci0JaWYgKGRldi0+Y3R4X2JpdG1hcCA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtc2V0KCh2b2lkICopZGV2LT5jdHhfYml0bWFwLCAwLCBQQUdFX1NJWkUpOwotCWRldi0+Y29udGV4dF9zYXJlYXMgPSBOVUxMOwotCWRldi0+bWF4X2NvbnRleHQgPSAtMTsKLQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQotCWZvciAoaSA9IDA7IGkgPCBEUk1fUkVTRVJWRURfQ09OVEVYVFM7IGkrKykgewotCQl0ZW1wID0gZHJtX2N0eGJpdG1hcF9uZXh0KGRldik7Ci0JCURSTV9ERUJVRygiZHJtX2N0eGJpdG1hcF9pbml0IDogJWRcbiIsIHRlbXApOwotCX0KLQorCWlkcl9pbml0KCZkZXYtPmN0eF9pZHIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzcsMTcgKzExMSwxMyBAQAogICoKICAqIFxwYXJhbSBkZXYgRFJNIGRldmljZS4KICAqCi0gKiBGcmVlcyBkcm1fZGV2aWNlOjpjdHhfYml0bWFwIGFuZCBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcywgd2hpbGUgaG9sZGluZwotICogdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9tdXRleCBsb2NrLgorICogRnJlZSBhbGwgaWRyIG1lbWJlcnMgdXNpbmcgZHJtX2N0eF9zYXJlYV9mcmVlIGhlbHBlciBmdW5jdGlvbgorICogd2hpbGUgaG9sZGluZyB0aGUgZHJtX2RldmljZTo6c3RydWN0X211dGV4IGxvY2suCiAgKi8KLXZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgZHJtX2N0eGJpdG1hcF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAoZGV2LT5jb250ZXh0X3NhcmVhcykKLQkJZHJtX2ZyZWUoZGV2LT5jb250ZXh0X3NhcmVhcywKLQkJCSBzaXplb2YoKmRldi0+Y29udGV4dF9zYXJlYXMpICoKLQkJCSBkZXYtPm1heF9jb250ZXh0LCBEUk1fTUVNX01BUFMpOwotCWRybV9mcmVlKCh2b2lkICopZGV2LT5jdHhfYml0bWFwLCBQQUdFX1NJWkUsIERSTV9NRU1fQ1RYQklUTUFQKTsKKwlpZHJfcmVtb3ZlX2FsbCgmZGV2LT5jdHhfaWRyKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIH0KIApAQCAtMjA2LDM0ICsxMzYsMzQgQEAKICAqIFxwYXJhbSBhcmcgdXNlciBhcmd1bWVudCBwb2ludGluZyB0byBhIGRybV9jdHhfcHJpdl9tYXAgc3RydWN0dXJlLgogICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KICAqCi0gKiBHZXRzIHRoZSBtYXAgZnJvbSBkcm1fZGV2aWNlOjpjb250ZXh0X3NhcmVhcyB3aXRoIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGFuZAorICogR2V0cyB0aGUgbWFwIGZyb20gZHJtX2RldmljZTo6Y3R4X2lkciB3aXRoIHRoZSBoYW5kbGUgc3BlY2lmaWVkIGFuZAogICogcmV0dXJucyBpdHMgaGFuZGxlLgogICovCiBpbnQgZHJtX2dldHNhcmVhY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OwotCWRybV9tYXBfdCAqbWFwOwotCWRybV9tYXBfbGlzdF90ICpfZW50cnk7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHJlcXVlc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsIGFyZ3AsIHNpemVvZihyZXF1ZXN0KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmIChkZXYtPm1heF9jb250ZXh0IDwgMAotCSAgICB8fCByZXF1ZXN0LmN0eF9pZCA+PSAodW5zaWduZWQpZGV2LT5tYXhfY29udGV4dCkgeworCisJbWFwID0gaWRyX2ZpbmQoJmRldi0+Y3R4X2lkciwgcmVxdWVzdC5jdHhfaWQpOworCWlmICghbWFwKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltYXAgPSBkZXYtPmNvbnRleHRfc2FyZWFzW3JlcXVlc3QuY3R4X2lkXTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAogCXJlcXVlc3QuaGFuZGxlID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChfZW50cnktPm1hcCA9PSBtYXApIHsKIAkJCXJlcXVlc3QuaGFuZGxlID0KIAkJCSAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKV9lbnRyeS0+dXNlcl90b2tlbjsKQEAgLTI1OCwyNSArMTg4LDI0IEBACiAgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlLgogICoKICAqIFNlYXJjaGVzIHRoZSBtYXBwaW5nIHNwZWNpZmllZCBpbiBccCBhcmcgYW5kIHVwZGF0ZSB0aGUgZW50cnkgaW4KLSAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHdpdGggaXQuCisgKiBkcm1fZGV2aWNlOjpjdHhfaWRyIHdpdGggaXQuCiAgKi8KIGludCBkcm1fc2V0c2FyZWFjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfcHJpdl9tYXBfdCByZXF1ZXN0OwotCWRybV9tYXBfdCAqbWFwID0gTlVMTDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHJlcXVlc3Q7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IE5VTEw7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0ID0gTlVMTDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwKLQkJCSAgIChkcm1fY3R4X3ByaXZfbWFwX3QgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCSAgIChzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBfX3VzZXIgKikgYXJnLAorCQkJICAgc2l6ZW9mKHJlcXVlc3QpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocl9saXN0LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChyX2xpc3QtPm1hcAogCQkgICAgJiYgcl9saXN0LT51c2VyX3Rva2VuID09ICh1bnNpZ25lZCBsb25nKXJlcXVlc3QuaGFuZGxlKQogCQkJZ290byBmb3VuZDsKQEAgLTI4OSwxMSArMjE4LDEwIEBACiAJbWFwID0gcl9saXN0LT5tYXA7CiAJaWYgKCFtYXApCiAJCWdvdG8gYmFkOwotCWlmIChkZXYtPm1heF9jb250ZXh0IDwgMCkKKworCWlmIChJU19FUlIoaWRyX3JlcGxhY2UoJmRldi0+Y3R4X2lkciwgbWFwLCByZXF1ZXN0LmN0eF9pZCkpKQogCQlnb3RvIGJhZDsKLQlpZiAocmVxdWVzdC5jdHhfaWQgPj0gKHVuc2lnbmVkKWRldi0+bWF4X2NvbnRleHQpCi0JCWdvdG8gYmFkOwotCWRldi0+Y29udGV4dF9zYXJlYXNbcmVxdWVzdC5jdHhfaWRdID0gbWFwOworCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTQsNyArMjQyLDcgQEAKICAqCiAgKiBBdHRlbXB0IHRvIHNldCBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcuCiAgKi8KLXN0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG9sZCwgaW50IG5ldykKK3N0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgb2xkLCBpbnQgbmV3KQogewogCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkZXYtPmNvbnRleHRfZmxhZykpIHsKIAkJRFJNX0VSUk9SKCJSZWVudGVyaW5nIC0tIEZJWE1FXG4iKTsKQEAgLTM0Miw3ICsyNzAsNyBAQAogICogaGFyZHdhcmUgbG9jayBpcyBoZWxkLCBjbGVhcnMgdGhlIGRybV9kZXZpY2U6OmNvbnRleHRfZmxhZyBhbmQgd2FrZXMgdXAKICAqIGRybV9kZXZpY2U6OmNvbnRleHRfd2FpdC4KICAqLwotc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbmV3KQorc3RhdGljIGludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuZXcpCiB7CiAJZGV2LT5sYXN0X2NvbnRleHQgPSBuZXc7CS8qIFBSRS9QT1NUOiBUaGlzIGlzIHRoZSBfb25seV8gd3JpdGVyLiAqLwogCWRldi0+bGFzdF9zd2l0Y2ggPSBqaWZmaWVzOwpAQCAtMzcyLDkgKzMwMCw5IEBACiBpbnQgZHJtX3Jlc2N0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2N0eF9yZXNfdCByZXM7Ci0JZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fY3R4X3JlcyByZXM7CisJc3RydWN0IGRybV9jdHhfcmVzIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAJaW50IGk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcywgYXJncCwgc2l6ZW9mKHJlcykpKQpAQCAtNDA5LDExICszMzcsMTEgQEAKIGludCBkcm1fYWRkY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfbGlzdF90ICpjdHhfZW50cnk7Ci0JZHJtX2N0eF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY3R4X3QgY3R4OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fY3R4X2xpc3QgKmN0eF9lbnRyeTsKKwlzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9jdHggY3R4OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIGFyZ3AsIHNpemVvZihjdHgpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC00NDksNyArMzc3LDcgQEAKIAljdHhfZW50cnktPnRhZyA9IHByaXY7CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwotCWxpc3RfYWRkKCZjdHhfZW50cnktPmhlYWQsICZkZXYtPmN0eGxpc3QtPmhlYWQpOworCWxpc3RfYWRkKCZjdHhfZW50cnktPmhlYWQsICZkZXYtPmN0eGxpc3QpOwogCSsrZGV2LT5jdHhfY291bnQ7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwogCkBAIC00NzcsOCArNDA1LDggQEAKIGludCBkcm1fZ2V0Y3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fY3R4X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9jdHggX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fY3R4IGN0eDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCBhcmdwLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNTA1LDExICs0MzMsMTEgQEAKIGludCBkcm1fc3dpdGNoY3R4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CkBAIC01MzAsMTEgKzQ1OCwxMSBAQAogaW50IGRybV9uZXdjdHgoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2N0eF90IGN0eDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2N0eCBjdHg7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmN0eCwgKGRybV9jdHhfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3R4KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJRFJNX0RFQlVHKCIlZFxuIiwgY3R4LmhhbmRsZSk7CkBAIC01NTcsMTEgKzQ4NSwxMSBAQAogaW50IGRybV9ybWN0eChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9jdHhfdCBjdHg7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jdHggY3R4OwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjdHgsIChkcm1fY3R4X3QgX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmY3R4LCAoc3RydWN0IGRybV9jdHggX191c2VyICopIGFyZywgc2l6ZW9mKGN0eCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCURSTV9ERUJVRygiJWRcbiIsIGN0eC5oYW5kbGUpOwpAQCAtNTc1LDEwICs1MDMsMTAgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmZGV2LT5jdHhsaXN0LT5oZWFkKSkgewotCQlkcm1fY3R4X2xpc3RfdCAqcG9zLCAqbjsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdCkpIHsKKwkJc3RydWN0IGRybV9jdHhfbGlzdCAqcG9zLCAqbjsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZkZXYtPmN0eGxpc3QsIGhlYWQpIHsKIAkJCWlmIChwb3MtPmhhbmRsZSA9PSBjdHguaGFuZGxlKSB7CiAJCQkJbGlzdF9kZWwoJnBvcy0+aGVhZCk7CiAJCQkJZHJtX2ZyZWUocG9zLCBzaXplb2YoKnBvcyksIERSTV9NRU1fQ1RYTElTVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jCmluZGV4IDMyZWQxOWMuLjgwMmZiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RtYS5jCkBAIC00Myw3ICs0Myw3IEBACiAgKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBkcm1fZGV2aWNlX2RtYSBzdHJ1Y3R1cmUuCiAgKi8KLWludCBkcm1fZG1hX3NldHVwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fZG1hX3NldHVwKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IGk7CiAKQEAgLTY3LDkgKzY3LDkgQEAKICAqIEZyZWUgYWxsIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBETUEgYnVmZmVycywgdGhlIGJ1ZmZlcnMgYW5kIHBhZ2VzIGxpc3RzLCBhbmQKICAqIGZpbmFsbHkgdGhlIGRybV9kZXZpY2U6OmRtYSBzdHJ1Y3R1cmUgaXRzZWxmLgogICovCi12b2lkIGRybV9kbWFfdGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KQordm9pZCBkcm1fZG1hX3Rha2Vkb3duKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaSwgajsKIAogCWlmICghZG1hKQpAQCAtMTI5LDcgKzEyOSw3IEBACiAgKgogICogUmVzZXRzIHRoZSBmaWVsZHMgb2YgXHAgYnVmLgogICovCi12b2lkIGRybV9mcmVlX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3ZvaWQgZHJtX2ZyZWVfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWlmICghYnVmKQogCQlyZXR1cm47CkBAIC0xNTIsOSArMTUyLDkgQEAKICAqCiAgKiBGcmVlcyBlYWNoIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggXHAgZmlscCBub3QgYWxyZWFkeSBvbiB0aGUgaGFyZHdhcmUuCiAgKi8KLXZvaWQgZHJtX2NvcmVfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIGRybV9jb3JlX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJhd2FibGUuYwppbmRleCBiMzMzMTNiLi5kNmNkYmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcmF3YWJsZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2RyYXdhYmxlLmMKQEAgLTQ0LDgzICs0NCwzMCBAQAogewogCURSTV9ERVZJQ0U7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQlpbnQgaSwgajsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgaW50IGJpdGZpZWxkX2xlbmd0aCA9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aDsKLQlkcm1fZHJhd2FibGVfaW5mb190ICoqaW5mbyA9IGRldi0+ZHJ3X2luZm87Ci0JdW5zaWduZWQgaW50IGluZm9fbGVuZ3RoID0gZGV2LT5kcndfaW5mb19sZW5ndGg7Ci0JZHJtX2RyYXdfdCBkcmF3OworCXN0cnVjdCBkcm1fZHJhdyBkcmF3OworCWludCBuZXdfaWQgPSAwOworCWludCByZXQ7CiAKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGJpdGZpZWxkX2xlbmd0aDsgaSsrKSB7Ci0JCWlmIChiaXRmaWVsZFtpXSA9PSB+MCkKLQkJCWNvbnRpbnVlOwotCi0JCWZvciAoOyBqIDwgOCAqIHNpemVvZigqYml0ZmllbGQpOyBqKyspCi0JCQlpZiAoIShiaXRmaWVsZFtpXSAmICgxIDw8IGopKSkKLQkJCQlnb3RvIGRvbmU7CithZ2FpbjoKKwlpZiAoaWRyX3ByZV9nZXQoJmRldi0+ZHJ3X2lkciwgR0ZQX0tFUk5FTCkgPT0gMCkgeworCQlEUk1fRVJST1IoIk91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIGRyYXdhYmxlIGlkclxuIik7CisJCXJldHVybiAtRU5PTUVNOwogCX0KLWRvbmU6Ci0KLQlpZiAoaSA9PSBiaXRmaWVsZF9sZW5ndGgpIHsKLQkJYml0ZmllbGRfbGVuZ3RoKys7Ci0KLQkJYml0ZmllbGQgPSBkcm1fYWxsb2MoYml0ZmllbGRfbGVuZ3RoICogc2l6ZW9mKCpiaXRmaWVsZCksCi0JCQkJICAgICBEUk1fTUVNX0JVRlMpOwotCi0JCWlmICghYml0ZmllbGQpIHsKLQkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBkcmF3YWJsZSBiaXRmaWVsZFxuIik7Ci0JCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwotCQl9Ci0KLQkJaWYgKDggKiBzaXplb2YoKmJpdGZpZWxkKSAqIGJpdGZpZWxkX2xlbmd0aCA+IGluZm9fbGVuZ3RoKSB7Ci0JCQlpbmZvX2xlbmd0aCArPSA4ICogc2l6ZW9mKCpiaXRmaWVsZCk7Ci0KLQkJCWluZm8gPSBkcm1fYWxsb2MoaW5mb19sZW5ndGggKiBzaXplb2YoKmluZm8pLAotCQkJCQkgRFJNX01FTV9CVUZTKTsKLQotCQkJaWYgKCFpbmZvKSB7Ci0JCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgbmV3IGRyYXdhYmxlIGluZm8iCi0JCQkJCSAgIiBhcnJheVxuIik7Ci0KLQkJCQlkcm1fZnJlZShiaXRmaWVsZCwKLQkJCQkJIGJpdGZpZWxkX2xlbmd0aCAqIHNpemVvZigqYml0ZmllbGQpLAotCQkJCQkgRFJNX01FTV9CVUZTKTsKLQkJCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOwotCQkJfQotCQl9Ci0KLQkJYml0ZmllbGRbaV0gPSAwOwotCX0KLQotCWRyYXcuaGFuZGxlID0gaSAqIDggKiBzaXplb2YoKmJpdGZpZWxkKSArIGogKyAxOwotCURSTV9ERUJVRygiJWRcbiIsIGRyYXcuaGFuZGxlKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0KLQliaXRmaWVsZFtpXSB8PSAxIDw8IGo7Ci0JaW5mb1tkcmF3LmhhbmRsZSAtIDFdID0gTlVMTDsKLQotCWlmIChiaXRmaWVsZCAhPSBkZXYtPmRyd19iaXRmaWVsZCkgewotCQltZW1jcHkoYml0ZmllbGQsIGRldi0+ZHJ3X2JpdGZpZWxkLCBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggKgotCQkgICAgICAgc2l6ZW9mKCpiaXRmaWVsZCkpOwotCQlkcm1fZnJlZShkZXYtPmRyd19iaXRmaWVsZCwgc2l6ZW9mKCpiaXRmaWVsZCkgKgotCQkJIGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCwgRFJNX01FTV9CVUZTKTsKLQkJZGV2LT5kcndfYml0ZmllbGQgPSBiaXRmaWVsZDsKLQkJZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoID0gYml0ZmllbGRfbGVuZ3RoOwotCX0KLQotCWlmIChpbmZvICE9IGRldi0+ZHJ3X2luZm8pIHsKLQkJbWVtY3B5KGluZm8sIGRldi0+ZHJ3X2luZm8sIGRldi0+ZHJ3X2luZm9fbGVuZ3RoICoKLQkJICAgICAgIHNpemVvZigqaW5mbykpOwotCQlkcm1fZnJlZShkZXYtPmRyd19pbmZvLCBzaXplb2YoKmluZm8pICogZGV2LT5kcndfaW5mb19sZW5ndGgsCi0JCQkgRFJNX01FTV9CVUZTKTsKLQkJZGV2LT5kcndfaW5mbyA9IGluZm87Ci0JCWRldi0+ZHJ3X2luZm9fbGVuZ3RoID0gaW5mb19sZW5ndGg7CisJcmV0ID0gaWRyX2dldF9uZXdfYWJvdmUoJmRldi0+ZHJ3X2lkciwgTlVMTCwgMSwgJm5ld19pZCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKKwkJZ290byBhZ2FpbjsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7CiAKLQlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fZHJhd190IF9fdXNlciAqKWRhdGEsIGRyYXcsIHNpemVvZihkcmF3KSk7CisJZHJhdy5oYW5kbGUgPSBuZXdfaWQ7CisKKwlEUk1fREVCVUcoIiVkXG4iLCBkcmF3LmhhbmRsZSk7CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChzdHJ1Y3QgZHJtX2RyYXcgX191c2VyICopZGF0YSwgZHJhdywgc2l6ZW9mKGRyYXcpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMxLDE0MSArNzgsNTIgQEAKIGludCBkcm1fcm1kcmF3KERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RyYXdfdCBkcmF3OwotIAlpbnQgaWQsIGlkeDsKLSAJdW5zaWduZWQgaW50IHNoaWZ0OworCXN0cnVjdCBkcm1fZHJhdyBkcmF3OwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JdTMyICpiaXRmaWVsZCA9IGRldi0+ZHJ3X2JpdGZpZWxkOwotCXVuc2lnbmVkIGludCBiaXRmaWVsZF9sZW5ndGggPSBkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGg7Ci0JZHJtX2RyYXdhYmxlX2luZm9fdCAqKmluZm8gPSBkZXYtPmRyd19pbmZvOwotCXVuc2lnbmVkIGludCBpbmZvX2xlbmd0aCA9IGRldi0+ZHJ3X2luZm9fbGVuZ3RoOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGRyYXcsIChkcm1fZHJhd190IF9fdXNlciAqKSBkYXRhLAorCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkcmF3LCAoc3RydWN0IGRybV9kcmF3IF9fdXNlciAqKSBkYXRhLAogCQkJCSBzaXplb2YoZHJhdykpOwogCi0JaWQgPSBkcmF3LmhhbmRsZSAtIDE7Ci0JaWR4ID0gaWQgLyAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQlzaGlmdCA9IGlkICUgKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0KLQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gYml0ZmllbGRfbGVuZ3RoIHx8Ci0JICAgICEoYml0ZmllbGRbaWR4XSAmICgxIDw8IHNoaWZ0KSkpIHsKLQkJRFJNX0RFQlVHKCJObyBzdWNoIGRyYXdhYmxlICVkXG4iLCBkcmF3LmhhbmRsZSk7Ci0JCXJldHVybiAwOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7CiAKLQliaXRmaWVsZFtpZHhdICY9IH4oMSA8PCBzaGlmdCk7CisJZHJtX2ZyZWUoZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRldiwgZHJhdy5oYW5kbGUpLAorCQkgc2l6ZW9mKHN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyksIERSTV9NRU1fQlVGUyk7CisKKwlpZHJfcmVtb3ZlKCZkZXYtPmRyd19pZHIsIGRyYXcuaGFuZGxlKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKLQotCWlmIChpbmZvW2lkXSkgewotCQlkcm1fZnJlZShpbmZvW2lkXS0+cmVjdHMsIGluZm9baWRdLT5udW1fcmVjdHMgKgotCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOwotCQlkcm1fZnJlZShpbmZvW2lkXSwgc2l6ZW9mKCoqaW5mbyksIERSTV9NRU1fQlVGUyk7Ci0JfQotCi0JLyogQ2FuIHdlIHNocmluayB0aGUgYXJyYXlzPyAqLwotCWlmIChpZHggPT0gYml0ZmllbGRfbGVuZ3RoIC0gMSkgewotCQl3aGlsZSAoaWR4ID49IDAgJiYgIWJpdGZpZWxkW2lkeF0pCi0JCQktLWlkeDsKLQotCQliaXRmaWVsZF9sZW5ndGggPSBpZHggKyAxOwotCi0JCWJpdGZpZWxkID0gTlVMTDsKLQotCQlpZiAoYml0ZmllbGRfbGVuZ3RoKSB7Ci0JCQlpZiAoYml0ZmllbGRfbGVuZ3RoICE9IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCkKLQkJCQliaXRmaWVsZCA9IGRybV9hbGxvYyhiaXRmaWVsZF9sZW5ndGggKgotCQkJCQkJICAgICBzaXplb2YoKmJpdGZpZWxkKSwKLQkJCQkJCSAgICAgRFJNX01FTV9CVUZTKTsKLQotCQkJaWYgKCFiaXRmaWVsZCkgewotCQkJCWJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JCQkJYml0ZmllbGRfbGVuZ3RoID0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGJpdGZpZWxkICE9IGRldi0+ZHJ3X2JpdGZpZWxkKSB7Ci0JCWluZm9fbGVuZ3RoID0gOCAqIHNpemVvZigqYml0ZmllbGQpICogYml0ZmllbGRfbGVuZ3RoOwotCi0JCWlmIChpbmZvX2xlbmd0aCkgewotCQkJaW5mbyA9IGRybV9hbGxvYyhpbmZvX2xlbmd0aCAqIHNpemVvZigqaW5mbyksCi0JCQkJCSBEUk1fTUVNX0JVRlMpOwotCi0JCQlpZiAoIWluZm8pIHsKLQkJCQlpbmZvID0gZGV2LT5kcndfaW5mbzsKLQkJCQlpbmZvX2xlbmd0aCA9IGRldi0+ZHJ3X2luZm9fbGVuZ3RoOwotCQkJfQotCQl9IGVsc2UKLQkJCWluZm8gPSBOVUxMOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0KLQkJaWYgKGJpdGZpZWxkKQotCQkJbWVtY3B5KGJpdGZpZWxkLCBkZXYtPmRyd19iaXRmaWVsZCwgYml0ZmllbGRfbGVuZ3RoICoKLQkJCSAgICAgICBzaXplb2YoKmJpdGZpZWxkKSk7Ci0JCWRybV9mcmVlKGRldi0+ZHJ3X2JpdGZpZWxkLCBzaXplb2YoKmJpdGZpZWxkKSAqCi0JCQkgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoLCBEUk1fTUVNX0JVRlMpOwotCQlkZXYtPmRyd19iaXRmaWVsZCA9IGJpdGZpZWxkOwotCQlkZXYtPmRyd19iaXRmaWVsZF9sZW5ndGggPSBiaXRmaWVsZF9sZW5ndGg7Ci0KLQkJaWYgKGluZm8gIT0gZGV2LT5kcndfaW5mbykgewotCQkJaWYgKGluZm8pCi0JCQkJbWVtY3B5KGluZm8sIGRldi0+ZHJ3X2luZm8sIGluZm9fbGVuZ3RoICoKLQkJCQkgICAgICAgc2l6ZW9mKCppbmZvKSk7Ci0JCQlkcm1fZnJlZShkZXYtPmRyd19pbmZvLCBzaXplb2YoKmluZm8pICoKLQkJCQkgZGV2LT5kcndfaW5mb19sZW5ndGgsIERSTV9NRU1fQlVGUyk7Ci0JCQlkZXYtPmRyd19pbmZvID0gaW5mbzsKLQkJCWRldi0+ZHJ3X2luZm9fbGVuZ3RoID0gaW5mb19sZW5ndGg7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRyd19sb2NrLCBpcnFmbGFncyk7Ci0JfQotCiAJRFJNX0RFQlVHKCIlZFxuIiwgZHJhdy5oYW5kbGUpOwogCXJldHVybiAwOwogfQogCi1pbnQgZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvKERSTV9JT0NUTF9BUkdTKSB7CitpbnQgZHJtX3VwZGF0ZV9kcmF3YWJsZV9pbmZvKERSTV9JT0NUTF9BUkdTKQorewogCURSTV9ERVZJQ0U7Ci0JZHJtX3VwZGF0ZV9kcmF3X3QgdXBkYXRlOwotCXVuc2lnbmVkIGludCBpZCwgaWR4LCBzaGlmdDsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFncywgYml0ZmllbGRfbGVuZ3RoID0gZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoOwotCWRybV9kcmF3YWJsZV9pbmZvX3QgKmluZm87Ci0JZHJtX2NsaXBfcmVjdF90ICpyZWN0czsKKwlzdHJ1Y3QgZHJtX3VwZGF0ZV9kcmF3IHVwZGF0ZTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpyZWN0czsKKwlzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmluZm87CiAJaW50IGVycjsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh1cGRhdGUsIChkcm1fdXBkYXRlX2RyYXdfdCBfX3VzZXIgKikgZGF0YSwKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwodXBkYXRlLCAoc3RydWN0IGRybV91cGRhdGVfZHJhdyBfX3VzZXIgKikgZGF0YSwKIAkJCQkgc2l6ZW9mKHVwZGF0ZSkpOwogCi0JaWQgPSB1cGRhdGUuaGFuZGxlIC0gMTsKLQlpZHggPSBpZCAvICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCXNoaWZ0ID0gaWQgJSAoOCAqIHNpemVvZigqYml0ZmllbGQpKTsKLQotCWlmIChpZHggPCAwIHx8IGlkeCA+PSBiaXRmaWVsZF9sZW5ndGggfHwKLQkgICAgIShiaXRmaWVsZFtpZHhdICYgKDEgPDwgc2hpZnQpKSkgewotCQlEUk1fRVJST1IoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIHVwZGF0ZS5oYW5kbGUpOwotCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwotCX0KLQotCWluZm8gPSBkZXYtPmRyd19pbmZvW2lkXTsKLQorCWluZm8gPSBpZHJfZmluZCgmZGV2LT5kcndfaWRyLCB1cGRhdGUuaGFuZGxlKTsKIAlpZiAoIWluZm8pIHsKLQkJaW5mbyA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKGRybV9kcmF3YWJsZV9pbmZvX3QpLCBEUk1fTUVNX0JVRlMpOwotCi0JCWlmICghaW5mbykgewotCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZHJhd2FibGUgaW5mbyBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwkJaW5mbyA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKKwkJaWYgKCFpbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChJU19FUlIoaWRyX3JlcGxhY2UoJmRldi0+ZHJ3X2lkciwgaW5mbywgdXBkYXRlLmhhbmRsZSkpKSB7CisJCQlEUk1fRVJST1IoIk5vIHN1Y2ggZHJhd2FibGUgJWRcbiIsIHVwZGF0ZS5oYW5kbGUpOworCQkJZHJtX2ZyZWUoaW5mbywgc2l6ZW9mKCppbmZvKSwgRFJNX01FTV9CVUZTKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCiAJc3dpdGNoICh1cGRhdGUudHlwZSkgewogCWNhc2UgRFJNX0RSQVdBQkxFX0NMSVBSRUNUUzoKIAkJaWYgKHVwZGF0ZS5udW0gIT0gaW5mby0+bnVtX3JlY3RzKSB7Ci0JCQlyZWN0cyA9IGRybV9hbGxvYyh1cGRhdGUubnVtICogc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksCisJCQlyZWN0cyA9IGRybV9hbGxvYyh1cGRhdGUubnVtICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwKIAkJCQkJIERSTV9NRU1fQlVGUyk7CiAJCX0gZWxzZQogCQkJcmVjdHMgPSBpbmZvLT5yZWN0czsKQEAgLTI3Nyw3ICsxMzUsNyBAQAogCQl9CiAKIAkJaWYgKHVwZGF0ZS5udW0gJiYgRFJNX0NPUFlfRlJPTV9VU0VSKHJlY3RzLAotCQkJCQkJICAgICAoZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqKQorCQkJCQkJICAgICAoc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICopCiAJCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKXVwZGF0ZS5kYXRhLAogCQkJCQkJICAgICB1cGRhdGUubnVtICoKIAkJCQkJCSAgICAgc2l6ZW9mKCpyZWN0cykpKSB7CkBAIC0yOTAsMTcgKzE0OCwxNiBAQAogCiAJCWlmIChyZWN0cyAhPSBpbmZvLT5yZWN0cykgewogCQkJZHJtX2ZyZWUoaW5mby0+cmVjdHMsIGluZm8tPm51bV9yZWN0cyAqCi0JCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCQkJCSBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLCBEUk1fTUVNX0JVRlMpOwogCQl9CiAKIAkJaW5mby0+cmVjdHMgPSByZWN0czsKIAkJaW5mby0+bnVtX3JlY3RzID0gdXBkYXRlLm51bTsKLQkJZGV2LT5kcndfaW5mb1tpZF0gPSBpbmZvOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZHJ3X2xvY2ssIGlycWZsYWdzKTsKIAogCQlEUk1fREVCVUcoIlVwZGF0ZWQgJWQgY2xpcHJlY3RzIGZvciBkcmF3YWJsZSAlZFxuIiwKLQkJCSAgaW5mby0+bnVtX3JlY3RzLCBpZCk7CisJCQkgIGluZm8tPm51bV9yZWN0cywgdXBkYXRlLmhhbmRsZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigiSW52YWxpZCB1cGRhdGUgdHlwZSAlZFxuIiwgdXBkYXRlLnR5cGUpOwpAQCAtMzEwLDExICsxNjcsOSBAQAogCXJldHVybiAwOwogCiBlcnJvcjoKLQlpZiAoIWRldi0+ZHJ3X2luZm9baWRdKQotCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOwotCWVsc2UgaWYgKHJlY3RzICE9IGRldi0+ZHJ3X2luZm9baWRdLT5yZWN0cykKLQkJZHJtX2ZyZWUocmVjdHMsIHVwZGF0ZS5udW0gKgotCQkJIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLCBEUk1fTUVNX0JVRlMpOworCWlmIChyZWN0cyAhPSBpbmZvLT5yZWN0cykKKwkJZHJtX2ZyZWUocmVjdHMsIHVwZGF0ZS5udW0gKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLAorCQkJIERSTV9NRU1fQlVGUyk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzIyLDIwICsxNzcsMjcgQEAKIC8qKgogICogQ2FsbGVyIG11c3QgaG9sZCB0aGUgZHJhd2FibGUgc3BpbmxvY2shCiAgKi8KLWRybV9kcmF3YWJsZV9pbmZvX3QgKmRybV9nZXRfZHJhd2FibGVfaW5mbyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RyYXdhYmxlX3QgaWQpIHsKLQl1MzIgKmJpdGZpZWxkID0gZGV2LT5kcndfYml0ZmllbGQ7Ci0JdW5zaWduZWQgaW50IGlkeCwgc2hpZnQ7Ci0KLQlpZC0tOwotCWlkeCA9IGlkIC8gKDggKiBzaXplb2YoKmJpdGZpZWxkKSk7Ci0Jc2hpZnQgPSBpZCAlICg4ICogc2l6ZW9mKCpiaXRmaWVsZCkpOwotCi0JaWYgKGlkeCA8IDAgfHwgaWR4ID49IGRldi0+ZHJ3X2JpdGZpZWxkX2xlbmd0aCB8fAotCSAgICAhKGJpdGZpZWxkW2lkeF0gJiAoMSA8PCBzaGlmdCkpKSB7Ci0JCURSTV9ERUJVRygiTm8gc3VjaCBkcmF3YWJsZSAlZFxuIiwgaWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gZGV2LT5kcndfaW5mb1tpZF07CitzdHJ1Y3QgZHJtX2RyYXdhYmxlX2luZm8gKmRybV9nZXRfZHJhd2FibGVfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZHJhd2FibGVfdCBpZCkKK3sKKwlyZXR1cm4gaWRyX2ZpbmQoJmRldi0+ZHJ3X2lkciwgaWQpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fZ2V0X2RyYXdhYmxlX2luZm8pOworCitzdGF0aWMgaW50IGRybV9kcmF3YWJsZV9mcmVlKGludCBpZHIsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICppbmZvID0gcDsKKworCWlmIChpbmZvKSB7CisJCWRybV9mcmVlKGluZm8tPnJlY3RzLCBpbmZvLT5udW1fcmVjdHMgKgorCQkJIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCksIERSTV9NRU1fQlVGUyk7CisJCWRybV9mcmVlKGluZm8sIHNpemVvZigqaW5mbyksIERSTV9NRU1fQlVGUyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZHJtX2RyYXdhYmxlX2ZyZWVfYWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJaWRyX2Zvcl9lYWNoKCZkZXYtPmRyd19pZHIsIGRybV9kcmF3YWJsZV9mcmVlLCBOVUxMKTsKKwlpZHJfcmVtb3ZlX2FsbCgmZGV2LT5kcndfaWRyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKaW5kZXggOGU3N2I3ZS4uMTk5OTRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKQEAgLTEyOSwxMSArMTI5LDExIEBACiAgKgogICogXHNhIGRybV9kZXZpY2UKICAqLwotaW50IGRybV9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQoraW50IGRybV9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX21hZ2ljX2VudHJ5X3QgKnB0LCAqbmV4dDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0OwotCWRybV92bWFfZW50cnlfdCAqdm1hLCAqdm1hX25leHQ7CisJc3RydWN0IGRybV9tYWdpY19lbnRyeSAqcHQsICpuZXh0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCwgKmxpc3RfdDsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqdm1hLCAqdm1hX3RlbXA7CiAJaW50IGk7CiAKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xNTEsMTkgKzE1MSwxMCBAQAogCWlmIChkZXYtPmlycV9lbmFibGVkKQogCQlkcm1faXJxX3VuaW5zdGFsbChkZXYpOwogCi0JLyogRnJlZSBkcmF3YWJsZSBpbmZvcm1hdGlvbiBtZW1vcnkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5kcndfYml0ZmllbGRfbGVuZ3RoIC8gc2l6ZW9mKCpkZXYtPmRyd19iaXRmaWVsZCk7Ci0JICAgICBpKyspIHsKLQkJZHJtX2RyYXdhYmxlX2luZm9fdCAqaW5mbyA9IGRybV9nZXRfZHJhd2FibGVfaW5mbyhkZXYsIGkpOwotCi0JCWlmIChpbmZvKSB7Ci0JCQlkcm1fZnJlZShpbmZvLT5yZWN0cywgaW5mby0+bnVtX3JlY3RzICoKLQkJCQkgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCksIERSTV9NRU1fQlVGUyk7Ci0JCQlkcm1fZnJlZShpbmZvLCBzaXplb2YoKmluZm8pLCBEUk1fTUVNX0JVRlMpOwotCQl9Ci0JfQotCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJLyogRnJlZSBkcmF3YWJsZSBpbmZvcm1hdGlvbiBtZW1vcnkgKi8KKwlkcm1fZHJhd2FibGVfZnJlZV9hbGwoZGV2KTsKIAlkZWxfdGltZXIoJmRldi0+dGltZXIpOwogCiAJLyogQ2xlYXIgcGlkIGxpc3QgKi8KQEAgLTE3OCwxOSArMTY5LDE3IEBACiAKIAkvKiBDbGVhciBBR1AgaW5mb3JtYXRpb24gKi8KIAlpZiAoZHJtX2NvcmVfaGFzX0FHUChkZXYpICYmIGRldi0+YWdwKSB7Ci0JCWRybV9hZ3BfbWVtX3QgKmVudHJ5OwotCQlkcm1fYWdwX21lbV90ICpuZXh0ZTsKKwkJc3RydWN0IGRybV9hZ3BfbWVtICplbnRyeSwgKnRlbXBlOwogCiAJCS8qIFJlbW92ZSBBR1AgcmVzb3VyY2VzLCBidXQgbGVhdmUgZGV2LT5hZ3AKIAkJICAgaW50YWN0IHVudGlsIGRydl9jbGVhbnVwIGlzIGNhbGxlZC4gKi8KLQkJZm9yIChlbnRyeSA9IGRldi0+YWdwLT5tZW1vcnk7IGVudHJ5OyBlbnRyeSA9IG5leHRlKSB7Ci0JCQluZXh0ZSA9IGVudHJ5LT5uZXh0OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRlbXBlLCAmZGV2LT5hZ3AtPm1lbW9yeSwgaGVhZCkgewogCQkJaWYgKGVudHJ5LT5ib3VuZCkKIAkJCQlkcm1fdW5iaW5kX2FncChlbnRyeS0+bWVtb3J5KTsKIAkJCWRybV9mcmVlX2FncChlbnRyeS0+bWVtb3J5LCBlbnRyeS0+cGFnZXMpOwogCQkJZHJtX2ZyZWUoZW50cnksIHNpemVvZigqZW50cnkpLCBEUk1fTUVNX0FHUExJU1RTKTsKIAkJfQotCQlkZXYtPmFncC0+bWVtb3J5ID0gTlVMTDsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldi0+YWdwLT5tZW1vcnkpOwogCiAJCWlmIChkZXYtPmFncC0+YWNxdWlyZWQpCiAJCQlkcm1fYWdwX3JlbGVhc2UoZGV2KTsKQEAgLTIwNCwyMCArMTkzLDE0IEBACiAJfQogCiAJLyogQ2xlYXIgdm1hIGxpc3QgKG9ubHkgYnVpbHQgZm9yIGRlYnVnZ2luZykgKi8KLQlpZiAoZGV2LT52bWFsaXN0KSB7Ci0JCWZvciAodm1hID0gZGV2LT52bWFsaXN0OyB2bWE7IHZtYSA9IHZtYV9uZXh0KSB7Ci0JCQl2bWFfbmV4dCA9IHZtYS0+bmV4dDsKLQkJCWRybV9mcmVlKHZtYSwgc2l6ZW9mKCp2bWEpLCBEUk1fTUVNX1ZNQVMpOwotCQl9Ci0JCWRldi0+dm1hbGlzdCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZtYSwgdm1hX3RlbXAsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKKwkJbGlzdF9kZWwoJnZtYS0+aGVhZCk7CisJCWRybV9mcmVlKHZtYSwgc2l6ZW9mKCp2bWEpLCBEUk1fTUVNX1ZNQVMpOwogCX0KIAotCWlmIChkZXYtPm1hcGxpc3QpIHsKLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPm1hcGxpc3QtPmhlYWQpKSB7Ci0JCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gZGV2LT5tYXBsaXN0LT5oZWFkLm5leHQ7Ci0JCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKLQkJCWRybV9ybW1hcF9sb2NrZWQoZGV2LCByX2xpc3QtPm1hcCk7Ci0JCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocl9saXN0LCBsaXN0X3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKKwkJZHJtX3JtbWFwX2xvY2tlZChkZXYsIHJfbGlzdC0+bWFwKTsKKwkJcl9saXN0ID0gTlVMTDsKIAl9CiAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9ETUFfUVVFVUUpICYmIGRldi0+cXVldWVsaXN0KSB7CkBAIC0yOTgsNyArMjgxLDcgQEAKICAqCiAgKiBcc2EgZHJtX2luaXQKICAqLwotc3RhdGljIHZvaWQgZHJtX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgZHJtX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJRFJNX0RFQlVHKCJcbiIpOwogCkBAIC0zMDksMTEgKzI5Miw3IEBACiAKIAlkcm1fbGFzdGNsb3NlKGRldik7CiAKLQlpZiAoZGV2LT5tYXBsaXN0KSB7Ci0JCWRybV9mcmVlKGRldi0+bWFwbGlzdCwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOwotCQlkZXYtPm1hcGxpc3QgPSBOVUxMOwotCQlkcm1faHRfcmVtb3ZlKCZkZXYtPm1hcF9oYXNoKTsKLQl9CisJZHJtX2h0X3JlbW92ZSgmZGV2LT5tYXBfaGFzaCk7CiAKIAlkcm1fY3R4Yml0bWFwX2NsZWFudXAoZGV2KTsKIApAQCAtMzQyLDggKzMyMSw4IEBACiB2b2lkIGRybV9leGl0KHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCiB7CiAJaW50IGk7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBOVUxMOwotCWRybV9oZWFkX3QgKmhlYWQ7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGRybV9oZWFkICpoZWFkOwogCiAJRFJNX0RFQlVHKCJcbiIpOwogCkBAIC00NDIsMTAgKzQyMSwxMCBAQAogc3RhdGljIGludCBkcm1fdmVyc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3ZlcnNpb25fdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3ZlcnNpb25fdCB2ZXJzaW9uOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdmVyc2lvbiBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV92ZXJzaW9uIHZlcnNpb247CiAJaW50IGxlbjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdmVyc2lvbiwgYXJncCwgc2l6ZW9mKHZlcnNpb24pKSkKQEAgLTQ3OCw4ICs0NTcsOCBAQAogaW50IGRybV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pb2N0bF9kZXNjX3QgKmlvY3RsOwogCWRybV9pb2N0bF90ICpmdW5jOwogCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOwpAQCAtNTI5LDMgKzUwOCwxNyBAQAogfQogCiBFWFBPUlRfU1lNQk9MKGRybV9pb2N0bCk7CisKK2RybV9sb2NhbF9tYXBfdCAqZHJtX2dldHNhcmVhKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqZW50cnk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CisJCWlmIChlbnRyeS0+bWFwICYmIGVudHJ5LT5tYXAtPnR5cGUgPT0gX0RSTV9TSE0gJiYKKwkJICAgIChlbnRyeS0+bWFwLT5mbGFncyAmIF9EUk1fQ09OVEFJTlNfTE9DSykpIHsKKwkJCXJldHVybiBlbnRyeS0+bWFwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcm1fZ2V0c2FyZWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCmluZGV4IDNiMTU5Y2EuLjdiYzUxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKQEAgLTM5LDkgKzM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAKIHN0YXRpYyBpbnQgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgZHJtX2RldmljZV90ICogZGV2KTsKKwkJCSAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAotc3RhdGljIGludCBkcm1fc2V0dXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1fc2V0dXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2xvY2FsX21hcF90ICptYXA7CiAJaW50IGk7CkBAIC03OSwxMyArNzksNiBAQAogCWRybV9odF9jcmVhdGUoJmRldi0+bWFnaWNsaXN0LCBEUk1fTUFHSUNfSEFTSF9PUkRFUik7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFnaWNmcmVlKTsKIAotCWRldi0+Y3R4bGlzdCA9IGRybV9hbGxvYyhzaXplb2YoKmRldi0+Y3R4bGlzdCksIERSTV9NRU1fQ1RYTElTVCk7Ci0JaWYgKGRldi0+Y3R4bGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZGV2LT5jdHhsaXN0LCAwLCBzaXplb2YoKmRldi0+Y3R4bGlzdCkpOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eGxpc3QtPmhlYWQpOwotCi0JZGV2LT52bWFsaXN0ID0gTlVMTDsKIAlkZXYtPnNpZ2RhdGEubG9jayA9IE5VTEw7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5sb2NrLmxvY2tfcXVldWUpOwogCWRldi0+cXVldWVfY291bnQgPSAwOwpAQCAtMTM1LDcgKzEyOCw3IEBACiAgKi8KIGludCBkcm1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAlpbnQgcmV0Y29kZSA9IDA7CiAKQEAgLTE3NCw3ICsxNjcsNyBAQAogICovCiBpbnQgZHJtX3N0dWJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IE5VTEw7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IE5VTEw7CiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAlpbnQgZXJyID0gLUVOT0RFVjsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKQEAgLTIzMCwxMCArMjIzLDEwIEBACiAgKiBmaWxwIGFuZCBhZGQgaXQgaW50byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IGluIFxwIGRldi4KICAqLwogc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCQkgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCWRybV9maWxlX3QgKnByaXY7CisJc3RydWN0IGRybV9maWxlICpwcml2OwogCWludCByZXQ7CiAKIAlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRVhDTCkKQEAgLTI1OCw2ICsyNTEsOCBAQAogCXByaXYtPmF1dGhlbnRpY2F0ZWQgPSBjYXBhYmxlKENBUF9TWVNfQURNSU4pOwogCXByaXYtPmxvY2tfY291bnQgPSAwOwogCisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmxoZWFkKTsKKwogCWlmIChkZXYtPmRyaXZlci0+b3BlbikgewogCQlyZXQgPSBkZXYtPmRyaXZlci0+b3BlbihkZXYsIHByaXYpOwogCQlpZiAocmV0IDwgMCkKQEAgLTI2NSwxOSArMjYwLDEwIEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmICghZGV2LT5maWxlX2xhc3QpIHsKLQkJcHJpdi0+bmV4dCA9IE5VTEw7Ci0JCXByaXYtPnByZXYgPSBOVUxMOwotCQlkZXYtPmZpbGVfZmlyc3QgPSBwcml2OwotCQlkZXYtPmZpbGVfbGFzdCA9IHByaXY7Ci0JCS8qIGZpcnN0IG9wZW5lciBhdXRvbWF0aWNhbGx5IGJlY29tZXMgbWFzdGVyICovCisJaWYgKGxpc3RfZW1wdHkoJmRldi0+ZmlsZWxpc3QpKQogCQlwcml2LT5tYXN0ZXIgPSAxOwotCX0gZWxzZSB7Ci0JCXByaXYtPm5leHQgPSBOVUxMOwotCQlwcml2LT5wcmV2ID0gZGV2LT5maWxlX2xhc3Q7Ci0JCWRldi0+ZmlsZV9sYXN0LT5uZXh0ID0gcHJpdjsKLQkJZGV2LT5maWxlX2xhc3QgPSBwcml2OwotCX0KKworCWxpc3RfYWRkKCZwcml2LT5saGVhZCwgJmRldi0+ZmlsZWxpc3QpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAjaWZkZWYgX19hbHBoYV9fCkBAIC0zMDksOCArMjk1LDggQEAKIC8qKiBOby1vcC4gKi8KIGludCBkcm1fZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWludCByZXRjb2RlOwogCiAJRFJNX0RFQlVHKCJmZCA9ICVkLCBkZXZpY2UgPSAweCVseFxuIiwgZmQsCkBAIC0zMzYsOCArMzIyLDggQEAKICAqLwogaW50IGRybV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJaW50IHJldGNvZGUgPSAwOwogCiAJbG9ja19rZXJuZWwoKTsKQEAgLTQxNCwxMCArNDAwLDEwIEBACiAJZHJtX2Zhc3luYygtMSwgZmlscCwgMCk7CiAKIAltdXRleF9sb2NrKCZkZXYtPmN0eGxpc3RfbXV0ZXgpOwotCWlmIChkZXYtPmN0eGxpc3QgJiYgKCFsaXN0X2VtcHR5KCZkZXYtPmN0eGxpc3QtPmhlYWQpKSkgewotCQlkcm1fY3R4X2xpc3RfdCAqcG9zLCAqbjsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdCkpIHsKKwkJc3RydWN0IGRybV9jdHhfbGlzdCAqcG9zLCAqbjsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZkZXYtPmN0eGxpc3QsIGhlYWQpIHsKIAkJCWlmIChwb3MtPnRhZyA9PSBwcml2ICYmCiAJCQkgICAgcG9zLT5oYW5kbGUgIT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CiAJCQkJaWYgKGRldi0+ZHJpdmVyLT5jb250ZXh0X2R0b3IpCkBAIC00MzYsMjIgKzQyMiwxMiBAQAogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChwcml2LT5yZW1vdmVfYXV0aF9vbl9jbG9zZSA9PSAxKSB7Ci0JCWRybV9maWxlX3QgKnRlbXAgPSBkZXYtPmZpbGVfZmlyc3Q7Ci0JCXdoaWxlICh0ZW1wKSB7CisJCXN0cnVjdCBkcm1fZmlsZSAqdGVtcDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlbXAsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkKIAkJCXRlbXAtPmF1dGhlbnRpY2F0ZWQgPSAwOwotCQkJdGVtcCA9IHRlbXAtPm5leHQ7Ci0JCX0KIAl9Ci0JaWYgKHByaXYtPnByZXYpIHsKLQkJcHJpdi0+cHJldi0+bmV4dCA9IHByaXYtPm5leHQ7Ci0JfSBlbHNlIHsKLQkJZGV2LT5maWxlX2ZpcnN0ID0gcHJpdi0+bmV4dDsKLQl9Ci0JaWYgKHByaXYtPm5leHQpIHsKLQkJcHJpdi0+bmV4dC0+cHJldiA9IHByaXYtPnByZXY7Ci0JfSBlbHNlIHsKLQkJZGV2LT5maWxlX2xhc3QgPSBwcml2LT5wcmV2OwotCX0KKwlsaXN0X2RlbCgmcHJpdi0+bGhlYWQpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCiAJaWYgKGRldi0+ZHJpdmVyLT5wb3N0Y2xvc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMKaW5kZXggMzFhY2I2Mi4uM2FkMzE5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgImRybV9oYXNodGFiLmgiCiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogCi1pbnQgZHJtX2h0X2NyZWF0ZShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBpbnQgb3JkZXIpCitpbnQgZHJtX2h0X2NyZWF0ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNjMsOSArNjMsOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGRybV9odF92ZXJib3NlX2xpc3QoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpCit2b2lkIGRybV9odF92ZXJib3NlX2xpc3Qoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaF9saXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0OwogCXVuc2lnbmVkIGludCBoYXNoZWRfa2V5OwpAQCAtNzUsMTUgKzc1LDE1IEBACiAJRFJNX0RFQlVHKCJLZXkgaXMgMHglMDhseCwgSGFzaGVkIGtleSBpcyAweCUwOHhcbiIsIGtleSwgaGFzaGVkX2tleSk7CiAJaF9saXN0ID0gJmh0LT50YWJsZVtoYXNoZWRfa2V5XTsKIAlobGlzdF9mb3JfZWFjaChsaXN0LCBoX2xpc3QpIHsKLQkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBkcm1faGFzaF9pdGVtX3QsIGhlYWQpOworCQllbnRyeSA9IGhsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1faGFzaF9pdGVtLCBoZWFkKTsKIAkJRFJNX0RFQlVHKCJjb3VudCAlZCwga2V5OiAweCUwOGx4XG4iLCBjb3VudCsrLCBlbnRyeS0+a2V5KTsKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZHJtX2h0X2ZpbmRfa2V5KGRybV9vcGVuX2hhc2hfdCAqaHQsIAorc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpkcm1faHRfZmluZF9rZXkoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCAKIAkJCQkJICB1bnNpZ25lZCBsb25nIGtleSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaF9saXN0OwogCXN0cnVjdCBobGlzdF9ub2RlICpsaXN0OwogCXVuc2lnbmVkIGludCBoYXNoZWRfa2V5OwpAQCAtOTEsNyArOTEsNyBAQAogCWhhc2hlZF9rZXkgPSBoYXNoX2xvbmcoa2V5LCBodC0+b3JkZXIpOwogCWhfbGlzdCA9ICZodC0+dGFibGVbaGFzaGVkX2tleV07CiAJaGxpc3RfZm9yX2VhY2gobGlzdCwgaF9saXN0KSB7Ci0JCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSwgaGVhZCk7CiAJCWlmIChlbnRyeS0+a2V5ID09IGtleSkKIAkJCXJldHVybiBsaXN0OwogCQlpZiAoZW50cnktPmtleSA+IGtleSkKQEAgLTEwMSw5ICsxMDEsOSBAQAogfQogCiAKLWludCBkcm1faHRfaW5zZXJ0X2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtKQoraW50IGRybV9odF9pbnNlcnRfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtKQogewotCWRybV9oYXNoX2l0ZW1fdCAqZW50cnk7CisJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmVudHJ5OwogCXN0cnVjdCBobGlzdF9oZWFkICpoX2xpc3Q7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3QsICpwYXJlbnQ7CiAJdW5zaWduZWQgaW50IGhhc2hlZF9rZXk7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAloX2xpc3QgPSAmaHQtPnRhYmxlW2hhc2hlZF9rZXldOwogCXBhcmVudCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2gobGlzdCwgaF9saXN0KSB7Ci0JCWVudHJ5ID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkJZW50cnkgPSBobGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSwgaGVhZCk7CiAJCWlmIChlbnRyeS0+a2V5ID09IGtleSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAoZW50cnktPmtleSA+IGtleSkKQEAgLTEzMiw3ICsxMzIsNyBAQAogICogSnVzdCBpbnNlcnQgYW4gaXRlbSBhbmQgcmV0dXJuIGFueSAiYml0cyIgYml0IGtleSB0aGF0IGhhc24ndCBiZWVuIAogICogdXNlZCBiZWZvcmUuCiAgKi8KLWludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSwKK2ludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0sCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHNlZWQsIGludCBiaXRzLCBpbnQgc2hpZnQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZCkKIHsKQEAgLTE1Niw4ICsxNTYsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHJtX2h0X2ZpbmRfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSwKLQkJICAgICBkcm1faGFzaF9pdGVtX3QgKippdGVtKQoraW50IGRybV9odF9maW5kX2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSwKKwkJICAgICBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqKml0ZW0pCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3Q7CiAKQEAgLTE2NSwxMSArMTY1LDExIEBACiAJaWYgKCFsaXN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSppdGVtID0gaGxpc3RfZW50cnkobGlzdCwgZHJtX2hhc2hfaXRlbV90LCBoZWFkKTsKKwkqaXRlbSA9IGhsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1faGFzaF9pdGVtLCBoZWFkKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRybV9odF9yZW1vdmVfa2V5KGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGxvbmcga2V5KQoraW50IGRybV9odF9yZW1vdmVfa2V5KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXkpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKmxpc3Q7CiAKQEAgLTE4MiwxNCArMTgyLDE0IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLWludCBkcm1faHRfcmVtb3ZlX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtKQoraW50IGRybV9odF9yZW1vdmVfaXRlbShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtKQogewogCWhsaXN0X2RlbF9pbml0KCZpdGVtLT5oZWFkKTsKIAlodC0+ZmlsbC0tOwogCXJldHVybiAwOwogfQogCi12b2lkIGRybV9odF9yZW1vdmUoZHJtX29wZW5faGFzaF90ICpodCkKK3ZvaWQgZHJtX2h0X3JlbW92ZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQpCiB7CiAJaWYgKGh0LT50YWJsZSkgewogCQlpZiAoaHQtPnVzZV92bWFsbG9jKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oCmluZGV4IDYxMzA5MWMuLjBmMTM3NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmgKQEAgLTM3LDMxICszNywzMSBAQAogCiAjZGVmaW5lIGRybV9oYXNoX2VudHJ5KF9wdHIsIF90eXBlLCBfbWVtYmVyKSBjb250YWluZXJfb2YoX3B0ciwgX3R5cGUsIF9tZW1iZXIpCiAKLXR5cGVkZWYgc3RydWN0IGRybV9oYXNoX2l0ZW17CitzdHJ1Y3QgZHJtX2hhc2hfaXRlbSB7CiAJc3RydWN0IGhsaXN0X25vZGUgaGVhZDsKIAl1bnNpZ25lZCBsb25nIGtleTsKLX0gZHJtX2hhc2hfaXRlbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX29wZW5faGFzaHsKK3N0cnVjdCBkcm1fb3Blbl9oYXNoIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAl1bnNpZ25lZCBpbnQgb3JkZXI7CiAJdW5zaWduZWQgaW50IGZpbGw7CiAJc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlOwogCWludCB1c2Vfdm1hbGxvYzsKLX0gZHJtX29wZW5faGFzaF90OworfTsKIAogCi1leHRlcm4gaW50IGRybV9odF9jcmVhdGUoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgaW50IG9yZGVyKTsKLWV4dGVybiBpbnQgZHJtX2h0X2luc2VydF9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSk7Ci1leHRlcm4gaW50IGRybV9odF9qdXN0X2luc2VydF9wbGVhc2UoZHJtX29wZW5faGFzaF90ICpodCwgZHJtX2hhc2hfaXRlbV90ICppdGVtLAorZXh0ZXJuIGludCBkcm1faHRfY3JlYXRlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgaW50IG9yZGVyKTsKK2V4dGVybiBpbnQgZHJtX2h0X2luc2VydF9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0pOworZXh0ZXJuIGludCBkcm1faHRfanVzdF9pbnNlcnRfcGxlYXNlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgc3RydWN0IGRybV9oYXNoX2l0ZW0gKml0ZW0sCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIHNlZWQsIGludCBiaXRzLCBpbnQgc2hpZnQsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZCk7Ci1leHRlcm4gaW50IGRybV9odF9maW5kX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXksIGRybV9oYXNoX2l0ZW1fdCAqKml0ZW0pOworZXh0ZXJuIGludCBkcm1faHRfZmluZF9pdGVtKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXksIHN0cnVjdCBkcm1faGFzaF9pdGVtICoqaXRlbSk7CiAKLWV4dGVybiB2b2lkIGRybV9odF92ZXJib3NlX2xpc3QoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOwotZXh0ZXJuIGludCBkcm1faHRfcmVtb3ZlX2tleShkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7Ci1leHRlcm4gaW50IGRybV9odF9yZW1vdmVfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0pOwotZXh0ZXJuIHZvaWQgZHJtX2h0X3JlbW92ZShkcm1fb3Blbl9oYXNoX3QgKmh0KTsKK2V4dGVybiB2b2lkIGRybV9odF92ZXJib3NlX2xpc3Qoc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7CitleHRlcm4gaW50IGRybV9odF9yZW1vdmVfa2V5KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOworZXh0ZXJuIGludCBkcm1faHRfcmVtb3ZlX2l0ZW0oc3RydWN0IGRybV9vcGVuX2hhc2ggKmh0LCBzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaXRlbSk7CitleHRlcm4gdm9pZCBkcm1faHRfcmVtb3ZlKHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCk7CiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYwppbmRleCBmYWZlYjM0Li40NjJmNDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV92ZXJzaW9uMzJfdCB2MzI7Ci0JZHJtX3ZlcnNpb25fdCBfX3VzZXIgKnZlcnNpb247CisJc3RydWN0IGRybV92ZXJzaW9uIF9fdXNlciAqdmVyc2lvbjsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ2MzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHYzMikpKQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX3VuaXF1ZTMyX3QgdXEzMjsKLQlkcm1fdW5pcXVlX3QgX191c2VyICp1OworCXN0cnVjdCBkcm1fdW5pcXVlIF9fdXNlciAqdTsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1cTMyKSkpCkBAIC0xNTksNyArMTU5LDcgQEAKIAkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fdW5pcXVlMzJfdCB1cTMyOwotCWRybV91bmlxdWVfdCBfX3VzZXIgKnU7CisJc3RydWN0IGRybV91bmlxdWUgX191c2VyICp1OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1cTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTc5LDggKzE3OSw4IEBACiB0eXBlZGVmIHN0cnVjdCBkcm1fbWFwMzIgewogCXUzMiBvZmZzZXQ7CQkvKio8IFJlcXVlc3RlZCBwaHlzaWNhbCBhZGRyZXNzICgwIGZvciBTQVJFQSkqLwogCXUzMiBzaXplOwkJLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgc2l6ZSAoYnl0ZXMpICovCi0JZHJtX21hcF90eXBlX3QgdHlwZTsJLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KLQlkcm1fbWFwX2ZsYWdzX3QgZmxhZ3M7CS8qKjwgRmxhZ3MgKi8KKwllbnVtIGRybV9tYXBfdHlwZSB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIG1hcCAqLworCWVudW0gZHJtX21hcF9mbGFncyBmbGFnczsJLyoqPCBGbGFncyAqLwogCXUzMiBoYW5kbGU7CQkvKio8IFVzZXItc3BhY2U6ICJIYW5kbGUiIHRvIHBhc3MgdG8gbW1hcCgpICovCiAJaW50IG10cnI7CQkvKio8IE1UUlIgc2xvdCB1c2VkICovCiB9IGRybV9tYXAzMl90OwpAQCAtMTkwLDcgKzE5MCw3IEBACiB7CiAJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9tYXAzMl90IG0zMjsKLQlkcm1fbWFwX3QgX191c2VyICptYXA7CisJc3RydWN0IGRybV9tYXAgX191c2VyICptYXA7CiAJaW50IGlkeCwgZXJyOwogCXZvaWQgKmhhbmRsZTsKIApAQCAtMjI4LDcgKzIyOCw3IEBACiB7CiAJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9tYXAzMl90IG0zMjsKLQlkcm1fbWFwX3QgX191c2VyICptYXA7CisJc3RydWN0IGRybV9tYXAgX191c2VyICptYXA7CiAJaW50IGVycjsKIAl2b2lkICpoYW5kbGU7CiAKQEAgLTI3MCw3ICsyNzAsNyBAQAogCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fbWFwX3QgX191c2VyICptYXA7CisJc3RydWN0IGRybV9tYXAgX191c2VyICptYXA7CiAJdTMyIGhhbmRsZTsKIAogCWlmIChnZXRfdXNlcihoYW5kbGUsICZhcmdwLT5oYW5kbGUpKQpAQCAtMzAwLDcgKzMwMCw3IEBACiB7CiAJZHJtX2NsaWVudDMyX3QgYzMyOwogCWRybV9jbGllbnQzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fY2xpZW50X3QgX191c2VyICpjbGllbnQ7CisJc3RydWN0IGRybV9jbGllbnQgX191c2VyICpjbGllbnQ7CiAJaW50IGlkeCwgZXJyOwogCiAJaWYgKGdldF91c2VyKGlkeCwgJmFyZ3AtPmlkeCkpCkBAIC0zMzMsNyArMzMzLDcgQEAKIAl1MzIgY291bnQ7CiAJc3RydWN0IHsKIAkJdTMyIHZhbHVlOwotCQlkcm1fc3RhdF90eXBlX3QgdHlwZTsKKwkJZW51bSBkcm1fc3RhdF90eXBlIHR5cGU7CiAJfSBkYXRhWzE1XTsKIH0gZHJtX3N0YXRzMzJfdDsKIApAQCAtMzQyLDcgKzM0Miw3IEBACiB7CiAJZHJtX3N0YXRzMzJfdCBzMzI7CiAJZHJtX3N0YXRzMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3N0YXRzX3QgX191c2VyICpzdGF0czsKKwlzdHJ1Y3QgZHJtX3N0YXRzIF9fdXNlciAqc3RhdHM7CiAJaW50IGksIGVycjsKIAogCXN0YXRzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpzdGF0cykpOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fYnVmX2Rlc2MzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIF9fdXNlciAqYnVmOwogCWludCBlcnI7CiAJdW5zaWduZWQgbG9uZyBhZ3Bfc3RhcnQ7CiAKQEAgLTQxMSw3ICs0MTEsNyBAQAogewogCWRybV9idWZfZGVzYzMyX3QgYjMyOwogCWRybV9idWZfZGVzYzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9idWZfZGVzY190IF9fdXNlciAqYnVmOworCXN0cnVjdCBkcm1fYnVmX2Rlc2MgX191c2VyICpidWY7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmIzMiwgYXJncCwgc2l6ZW9mKGIzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTQ0MCw4ICs0NDAsOCBAQAogCWRybV9idWZfaW5mbzMyX3QgcmVxMzI7CiAJZHJtX2J1Zl9pbmZvMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKnRvOwotCWRybV9idWZfaW5mb190IF9fdXNlciAqcmVxdWVzdDsKLQlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmxpc3Q7CisJc3RydWN0IGRybV9idWZfaW5mbyBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfZGVzYyBfX3VzZXIgKmxpc3Q7CiAJc2l6ZV90IG5ieXRlczsKIAlpbnQgaSwgZXJyOwogCWludCBjb3VudCwgYWN0dWFsOwpAQCAtNDU3LDExICs0NTcsMTEgQEAKIAkgICAgJiYgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBjb3VudCAqIHNpemVvZihkcm1fYnVmX2Rlc2MzMl90KSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JbmJ5dGVzID0gc2l6ZW9mKCpyZXF1ZXN0KSArIGNvdW50ICogc2l6ZW9mKGRybV9idWZfZGVzY190KTsKKwluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2Yoc3RydWN0IGRybV9idWZfZGVzYyk7CiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5ieXRlcyk7CiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBuYnl0ZXMpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlsaXN0ID0gKGRybV9idWZfZGVzY190ICopIChyZXF1ZXN0ICsgMSk7CisJbGlzdCA9IChzdHJ1Y3QgZHJtX2J1Zl9kZXNjICopIChyZXF1ZXN0ICsgMSk7CiAKIAlpZiAoX19wdXRfdXNlcihjb3VudCwgJnJlcXVlc3QtPmNvdW50KQogCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCWlmIChjb3VudCA+PSBhY3R1YWwpCiAJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWw7ICsraSkKIAkJCWlmIChfX2NvcHlfaW5fdXNlcigmdG9baV0sICZsaXN0W2ldLAotCQkJCQkgICBvZmZzZXRvZihkcm1fYnVmX2Rlc2NfdCwgZmxhZ3MpKSkKKwkJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGRybV9idWZfZGVzYywgZmxhZ3MpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChfX3B1dF91c2VyKGFjdHVhbCwgJmFyZ3AtPmNvdW50KSkKQEAgLTUwNSw4ICs1MDUsOCBAQAogCWRybV9idWZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2J1Zl9tYXAzMl90IHJlcTMyOwogCWRybV9idWZfcHViMzJfdCBfX3VzZXIgKmxpc3QzMjsKLQlkcm1fYnVmX21hcF90IF9fdXNlciAqcmVxdWVzdDsKLQlkcm1fYnVmX3B1Yl90IF9fdXNlciAqbGlzdDsKKwlzdHJ1Y3QgZHJtX2J1Zl9tYXAgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYnVmX3B1YiBfX3VzZXIgKmxpc3Q7CiAJaW50IGksIGVycjsKIAlpbnQgY291bnQsIGFjdHVhbDsKIAlzaXplX3QgbmJ5dGVzOwpAQCAtNTE5LDExICs1MTksMTEgQEAKIAogCWlmIChjb3VudCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwotCW5ieXRlcyA9IHNpemVvZigqcmVxdWVzdCkgKyBjb3VudCAqIHNpemVvZihkcm1fYnVmX3B1Yl90KTsKKwluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2Yoc3RydWN0IGRybV9idWZfcHViKTsKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobmJ5dGVzKTsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIG5ieXRlcykpCiAJCXJldHVybiAtRUZBVUxUOwotCWxpc3QgPSAoZHJtX2J1Zl9wdWJfdCAqKSAocmVxdWVzdCArIDEpOworCWxpc3QgPSAoc3RydWN0IGRybV9idWZfcHViICopIChyZXF1ZXN0ICsgMSk7CiAKIAlpZiAoX19wdXRfdXNlcihjb3VudCwgJnJlcXVlc3QtPmNvdW50KQogCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKQEAgLTUzOSw3ICs1MzksNyBAQAogCWlmIChjb3VudCA+PSBhY3R1YWwpCiAJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWw7ICsraSkKIAkJCWlmIChfX2NvcHlfaW5fdXNlcigmbGlzdDMyW2ldLCAmbGlzdFtpXSwKLQkJCQkJICAgb2Zmc2V0b2YoZHJtX2J1Zl9wdWJfdCwgYWRkcmVzcykpCisJCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBkcm1fYnVmX3B1YiwgYWRkcmVzcykpCiAJCQkgICAgfHwgX19nZXRfdXNlcihhZGRyLCAmbGlzdFtpXS5hZGRyZXNzKQogCQkJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpYWRkciwKIAkJCQkJICAmbGlzdDMyW2ldLmFkZHJlc3MpKQpAQCAtNTYyLDcgKzU2Miw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2J1Zl9mcmVlMzJfdCByZXEzMjsKLQlkcm1fYnVmX2ZyZWVfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9idWZfZnJlZSBfX3VzZXIgKnJlcXVlc3Q7CiAJZHJtX2J1Zl9mcmVlMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKQEAgLTU4OSw3ICs1ODksNyBAQAogCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2N0eF9wcml2X21hcDMyX3QgcmVxMzI7Ci0JZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2N0eF9wcml2X21hcCBfX3VzZXIgKnJlcXVlc3Q7CiAJZHJtX2N0eF9wcml2X21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCkBAIC02MTAsNyArNjEwLDcgQEAKIHN0YXRpYyBpbnQgY29tcGF0X2RybV9nZXRzYXJlYWN0eChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9jdHhfcHJpdl9tYXAgX191c2VyICpyZXF1ZXN0OwogCWRybV9jdHhfcHJpdl9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCBjdHhfaWQ7CkBAIC02NDgsNyArNjQ4LDcgQEAKIHsKIAlkcm1fY3R4X3JlczMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWRybV9jdHhfcmVzMzJfdCByZXMzMjsKLQlkcm1fY3R4X3Jlc190IF9fdXNlciAqcmVzOworCXN0cnVjdCBkcm1fY3R4X3JlcyBfX3VzZXIgKnJlczsKIAlpbnQgZXJyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXMzMiwgYXJncCwgc2l6ZW9mKHJlczMyKSkpCkBAIC02NTgsNyArNjU4LDcgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcywgc2l6ZW9mKCpyZXMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKF9fcHV0X3VzZXIocmVzMzIuY291bnQsICZyZXMtPmNvdW50KQotCSAgICB8fCBfX3B1dF91c2VyKChkcm1fY3R4X3QgX191c2VyICopICh1bnNpZ25lZCBsb25nKXJlczMyLmNvbnRleHRzLAorCSAgICB8fCBfX3B1dF91c2VyKChzdHJ1Y3QgZHJtX2N0eCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpcmVzMzIuY29udGV4dHMsCiAJCQkgICZyZXMtPmNvbnRleHRzKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTY3OSw3ICs2NzksNyBAQAogCWludCBzZW5kX2NvdW50OwkJICAvKio8IE51bWJlciBvZiBidWZmZXJzIHRvIHNlbmQgKi8KIAl1MzIgc2VuZF9pbmRpY2VzOwkgIC8qKjwgTGlzdCBvZiBoYW5kbGVzIHRvIGJ1ZmZlcnMgKi8KIAl1MzIgc2VuZF9zaXplczsJCSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLwotCWRybV9kbWFfZmxhZ3NfdCBmbGFnczsJCSAgLyoqPCBGbGFncyAqLworCWVudW0gZHJtX2RtYV9mbGFncyBmbGFnczsJCSAgLyoqPCBGbGFncyAqLwogCWludCByZXF1ZXN0X2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCiAJaW50IHJlcXVlc3Rfc2l6ZTsJICAvKio8IERlc2lyZWQgc2l6ZSBmb3IgYnVmZmVycyAqLwogCXUzMiByZXF1ZXN0X2luZGljZXM7CSAgLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KQEAgLTY5Miw3ICs2OTIsNyBAQAogewogCWRybV9kbWEzMl90IGQzMjsKIAlkcm1fZG1hMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2RtYV90IF9fdXNlciAqZDsKKwlzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKmQ7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmZDMyLCBhcmdwLCBzaXplb2YoZDMyKSkpCkBAIC03NDAsNyArNzQwLDcgQEAKIHsKIAlkcm1fYWdwX21vZGUzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX21vZGUzMl90IG0zMjsKLQlkcm1fYWdwX21vZGVfdCBfX3VzZXIgKm1vZGU7CisJc3RydWN0IGRybV9hZ3BfbW9kZSBfX3VzZXIgKm1vZGU7CiAKIAlpZiAoZ2V0X3VzZXIobTMyLm1vZGUsICZhcmdwLT5tb2RlKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC03NzIsNyArNzcyLDcgQEAKIHsKIAlkcm1fYWdwX2luZm8zMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX2luZm8zMl90IGkzMjsKLQlkcm1fYWdwX2luZm9fdCBfX3VzZXIgKmluZm87CisJc3RydWN0IGRybV9hZ3BfaW5mbyBfX3VzZXIgKmluZm87CiAJaW50IGVycjsKIAogCWluZm8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmluZm8pKTsKQEAgLTgxMyw3ICs4MTMsNyBAQAogewogCWRybV9hZ3BfYnVmZmVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJZHJtX2FncF9idWZmZXIzMl90IHJlcTMyOwotCWRybV9hZ3BfYnVmZmVyX3QgX191c2VyICpyZXF1ZXN0OworCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBfX3VzZXIgKnJlcXVlc3Q7CiAJaW50IGVycjsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQpAQCAtODQ1LDcgKzg0NSw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZHJtX2FncF9idWZmZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYWdwX2J1ZmZlcl90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgX191c2VyICpyZXF1ZXN0OwogCXUzMiBoYW5kbGU7CiAKIAlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CkBAIC04NjgsNyArODY4LDcgQEAKIHsKIAlkcm1fYWdwX2JpbmRpbmczMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fYWdwX2JpbmRpbmczMl90IHJlcTMyOwotCWRybV9hZ3BfYmluZGluZ190IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIF9fdXNlciAqcmVxdWVzdDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTg4Nyw3ICs4ODcsNyBAQAogCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fYWdwX2JpbmRpbmczMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9hZ3BfYmluZGluZyBfX3VzZXIgKnJlcXVlc3Q7CiAJdTMyIGhhbmRsZTsKIAogCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKQEAgLTkxMCw3ICs5MTAsNyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWRybV9zY2F0dGVyX2dhdGhlcjMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwotCWRybV9zY2F0dGVyX2dhdGhlcl90IF9fdXNlciAqcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIF9fdXNlciAqcmVxdWVzdDsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGxvbmcgeDsKIApAQCAtOTM4LDcgKzkzOCw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlkcm1fc2NhdHRlcl9nYXRoZXIzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJc3RydWN0IGRybV9zY2F0dGVyX2dhdGhlciBfX3VzZXIgKnJlcXVlc3Q7CiAJdW5zaWduZWQgbG9uZyB4OwogCiAJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOwpAQCAtOTUzLDEzICs5NTMsMTMgQEAKIH0KIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0MzIgewotCWRybV92Ymxhbmtfc2VxX3R5cGVfdCB0eXBlOworCWVudW0gZHJtX3ZibGFua19zZXFfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKIAl1MzIgc2lnbmFsOwogfTsKIAogc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseTMyIHsKLQlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwllbnVtIGRybV92Ymxhbmtfc2VxX3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJczMyIHR2YWxfc2VjOwogCXMzMiB0dmFsX3VzZWM7CkBAIC05NzUsNyArOTc1LDcgQEAKIHsKIAlkcm1fd2FpdF92YmxhbmszMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlkcm1fd2FpdF92YmxhbmszMl90IHJlcTMyOwotCWRybV93YWl0X3ZibGFua190IF9fdXNlciAqcmVxdWVzdDsKKwl1bmlvbiBkcm1fd2FpdF92YmxhbmsgX191c2VyICpyZXF1ZXN0OwogCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCmluZGV4IDU2NTg5NTUuLmIxOTVlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwpAQCAtNTIsMTAgKzUyLDEwIEBACiBpbnQgZHJtX2dldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV91bmlxdWVfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3VuaXF1ZV90IHU7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV91bmlxdWUgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fdW5pcXVlIHU7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnUsIGFyZ3AsIHNpemVvZih1KSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtODYsMTUgKzg2LDE1IEBACiBpbnQgZHJtX3NldHVuaXF1ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV91bmlxdWVfdCB1OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fdW5pcXVlIHU7CiAJaW50IGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jLCByZXQ7CiAKIAlpZiAoZGV2LT51bmlxdWVfbGVuIHx8IGRldi0+dW5pcXVlKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCAoZHJtX3VuaXF1ZV90IF9fdXNlciAqKSBhcmcsIHNpemVvZih1KSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1LCAoc3RydWN0IGRybV91bmlxdWUgX191c2VyICopIGFyZywgc2l6ZW9mKHUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoIXUudW5pcXVlX2xlbiB8fCB1LnVuaXF1ZV9sZW4gPiAxMDI0KQpAQCAtMTM2LDcgKzEzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHJtX3NldF9idXNpZChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGRybV9zZXRfYnVzaWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaW50IGxlbjsKIApAQCAtMTg0LDExICsxODQsMTEgQEAKIGludCBkcm1fZ2V0bWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9tYXBfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX21hcF90IG1hcDsKLQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX21hcCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGRybV9tYXAgbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdCA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAlpbnQgaWR4OwogCWludCBpOwpAQCAtMjA0LDkgKzIwNCw5IEBACiAJfQogCiAJaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0KSB7CiAJCWlmIChpID09IGlkeCkgewotCQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJCQlyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1fbWFwX2xpc3QsIGhlYWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJaSsrOwpAQCAtMjQ1LDExICsyNDUsMTEgQEAKIGludCBkcm1fZ2V0Y2xpZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2NsaWVudF90IF9fdXNlciAqYXJncCA9IChkcm1fY2xpZW50X3QgX191c2VyICopYXJnOwotCWRybV9jbGllbnRfdCBjbGllbnQ7Ci0JZHJtX2ZpbGVfdCAqcHQ7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jbGllbnQgX191c2VyICphcmdwID0gKHN0cnVjdCBkcm1fY2xpZW50IF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgZHJtX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGRybV9maWxlICpwdDsKIAlpbnQgaWR4OwogCWludCBpOwogCkBAIC0yNTcsMTIgKzI1NywxOCBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZHggPSBjbGllbnQuaWR4OwogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKLQlmb3IgKGkgPSAwLCBwdCA9IGRldi0+ZmlsZV9maXJzdDsgaSA8IGlkeCAmJiBwdDsgaSsrLCBwdCA9IHB0LT5uZXh0KSA7Ci0KLQlpZiAoIXB0KSB7CisJCisJaWYgKGxpc3RfZW1wdHkoJmRldi0+ZmlsZWxpc3QpKSB7CiAJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0LCAmZGV2LT5maWxlbGlzdCwgbGhlYWQpIHsKKwkJaWYgKGkrKyA+PSBpZHgpCisJCQlicmVhazsKKwl9CisKIAljbGllbnQuYXV0aCA9IHB0LT5hdXRoZW50aWNhdGVkOwogCWNsaWVudC5waWQgPSBwdC0+cGlkOwogCWNsaWVudC51aWQgPSBwdC0+dWlkOwpAQCAtMjg4LDkgKzI5NCw5IEBACiBpbnQgZHJtX2dldHN0YXRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fc3RhdHNfdCBzdGF0czsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3N0YXRzIHN0YXRzOwogCWludCBpOwogCiAJbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CkBAIC0zMTAsNyArMzE2LDcgQEAKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JaWYgKGNvcHlfdG9fdXNlcigoZHJtX3N0YXRzX3QgX191c2VyICopIGFyZywgJnN0YXRzLCBzaXplb2Yoc3RhdHMpKSkKKwlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZHJtX3N0YXRzIF9fdXNlciAqKSBhcmcsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQpAQCAtMzI5LDEwICszMzUsMTAgQEAKIGludCBkcm1fc2V0dmVyc2lvbihEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9zZXRfdmVyc2lvbl90IHN2OwotCWRybV9zZXRfdmVyc2lvbl90IHJldHY7CisJc3RydWN0IGRybV9zZXRfdmVyc2lvbiBzdjsKKwlzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIHJldHY7CiAJaW50IGlmX3ZlcnNpb247Ci0JZHJtX3NldF92ZXJzaW9uX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX3NldF92ZXJzaW9uIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CiAJaW50IHJldDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmc3YsIGFyZ3AsIHNpemVvZihzdikpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwppbmRleCAyZTc1MzMxLi44NzFkMmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwpAQCAtNTMsMTAgKzUzLDEwIEBACiBpbnQgZHJtX2lycV9ieV9idXNpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9pcnFfYnVzaWRfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX2lycV9idXNpZF90IHA7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9pcnFfYnVzaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1faXJxX2J1c2lkIHA7CiAKIAlpZiAoIWRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSEFWRV9JUlEpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg3LDcgKzg3LDcgQEAKICAqIFxjIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoKSBhbmQgXGMgZHJtX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoKSBmdW5jdGlvbnMKICAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbi4KICAqLwotc3RhdGljIGludCBkcm1faXJxX2luc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBkcm1faXJxX2luc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHNoX2ZsYWdzID0gMDsKQEAgLTEyMCw4ICsxMjAsOCBAQAogCiAJCXNwaW5fbG9ja19pbml0KCZkZXYtPnZibF9sb2NrKTsKIAotCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52Ymxfc2lncy5oZWFkKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmRldi0+dmJsX3NpZ3MyLmhlYWQpOworCQlJTklUX0xJU1RfSEVBRCgmZGV2LT52Ymxfc2lncyk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZibF9zaWdzMik7CiAKIAkJZGV2LT52YmxfcGVuZGluZyA9IDA7CiAJfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAgKgogICogQ2FsbHMgdGhlIGRyaXZlcidzIFxjIGRybV9kcml2ZXJfaXJxX3VuaW5zdGFsbCgpIGZ1bmN0aW9uLCBhbmQgc3RvcHMgdGhlIGlycS4KICAqLwotaW50IGRybV9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1faXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpbnQgaXJxX2VuYWJsZWQ7CiAKQEAgLTE5NywxMyArMTk3LDEzIEBACiBpbnQgZHJtX2NvbnRyb2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2NvbnRyb2xfdCBjdGw7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9jb250cm9sIGN0bDsKIAogCS8qIGlmIHdlIGhhdmVuJ3QgaXJxIHdlIGZhbGxiYWNrIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgLSB0aGlzIHVzZWQgdG8gYmUgYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbiBkcm1fZG1hLmggKi8KIAotCWlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCAoZHJtX2NvbnRyb2xfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YoY3RsKSkpCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdGwsIChzdHJ1Y3QgZHJtX2NvbnRyb2wgX191c2VyICopIGFyZywgc2l6ZW9mKGN0bCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXN3aXRjaCAoY3RsLmZ1bmMpIHsKQEAgLTI0NCwxMCArMjQ0LDEwIEBACiAgKi8KIGludCBkcm1fd2FpdF92YmxhbmsoRFJNX0lPQ1RMX0FSR1MpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fd2FpdF92YmxhbmtfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwotCWRybV93YWl0X3ZibGFua190IHZibHdhaXQ7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJdW5pb24gZHJtX3dhaXRfdmJsYW5rIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJdW5pb24gZHJtX3dhaXRfdmJsYW5rIHZibHdhaXQ7CiAJc3RydWN0IHRpbWV2YWwgbm93OwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGludCBmbGFncywgc2VxOwpAQCAtMjkyLDkgKzI5Miw5IEBACiAKIAlpZiAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TSUdOQUwpIHsKIAkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZ3MgPSAoZmxhZ3MgJiBfRFJNX1ZCTEFOS19TRUNPTkRBUlkpCisJCXN0cnVjdCBsaXN0X2hlYWQgKnZibF9zaWdzID0gKGZsYWdzICYgX0RSTV9WQkxBTktfU0VDT05EQVJZKQogCQkJCSAgICAgID8gJmRldi0+dmJsX3NpZ3MyIDogJmRldi0+dmJsX3NpZ3M7Ci0JCWRybV92Ymxfc2lnX3QgKnZibF9zaWc7CisJCXN0cnVjdCBkcm1fdmJsX3NpZyAqdmJsX3NpZzsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwogCkBAIC0zMDIsNyArMzAyLDcgQEAKIAkJICogZm9yIHRoZSBzYW1lIHZibGFuayBzZXF1ZW5jZSBudW1iZXI7IG5vdGhpbmcgdG8gYmUgZG9uZSBpbgogCQkgKiB0aGF0IGNhc2UKIAkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodmJsX3NpZywgJnZibF9zaWdzLT5oZWFkLCBoZWFkKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodmJsX3NpZywgdmJsX3NpZ3MsIGhlYWQpIHsKIAkJCWlmICh2Ymxfc2lnLT5zZXF1ZW5jZSA9PSB2Ymx3YWl0LnJlcXVlc3Quc2VxdWVuY2UKIAkJCSAgICAmJiB2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vID09IHZibHdhaXQucmVxdWVzdC5zaWduYWwKIAkJCSAgICAmJiB2Ymxfc2lnLT50YXNrID09IGN1cnJlbnQpIHsKQEAgLTMyNCw3ICszMjQsNyBAQAogCiAJCWlmICghCiAJCSAgICAodmJsX3NpZyA9Ci0JCSAgICAgZHJtX2FsbG9jKHNpemVvZihkcm1fdmJsX3NpZ190KSwgRFJNX01FTV9EUklWRVIpKSkgeworCQkgICAgIGRybV9hbGxvYyhzaXplb2Yoc3RydWN0IGRybV92Ymxfc2lnKSwgRFJNX01FTV9EUklWRVIpKSkgewogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtMzM2LDcgKzMzNiw3IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIAotCQlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopdmJsX3NpZywgJnZibF9zaWdzLT5oZWFkKTsKKwkJbGlzdF9hZGRfdGFpbCgmdmJsX3NpZy0+aGVhZCwgdmJsX3NpZ3MpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKIApAQCAtMzcxLDcgKzM3MSw3IEBACiAgKgogICogSWYgYSBzaWduYWwgaXMgbm90IHJlcXVlc3RlZCwgdGhlbiBjYWxscyB2Ymxhbmtfd2FpdCgpLgogICovCi12b2lkIGRybV92Ymxfc2VuZF9zaWduYWxzKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgZHJtX3ZibF9zZW5kX3NpZ25hbHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKQEAgLTM3OSwyMCArMzc5LDE4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGZsYWdzKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKnRtcDsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZzsKLQkJZHJtX3ZibF9zaWdfdCAqdmJsX3NpZ3MgPSBpID8gJmRldi0+dmJsX3NpZ3MyIDogJmRldi0+dmJsX3NpZ3M7CisJCXN0cnVjdCBkcm1fdmJsX3NpZyAqdmJsX3NpZywgKnRtcDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdmJsX3NpZ3MgPSBpID8gJmRldi0+dmJsX3NpZ3MyIDogJmRldi0+dmJsX3NpZ3M7CiAJCXVuc2lnbmVkIGludCB2Ymxfc2VxID0gYXRvbWljX3JlYWQoaSA/ICZkZXYtPnZibF9yZWNlaXZlZDIgOgogCQkJCQkJICAgJmRldi0+dmJsX3JlY2VpdmVkKTsKIAotCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdG1wLCAmdmJsX3NpZ3MtPmhlYWQpIHsKLQkJCXZibF9zaWcgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV92Ymxfc2lnX3QsIGhlYWQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmJsX3NpZywgdG1wLCB2Ymxfc2lncywgaGVhZCkgewogCQkJaWYgKCh2Ymxfc2VxIC0gdmJsX3NpZy0+c2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkgewogCQkJCXZibF9zaWctPmluZm8uc2lfY29kZSA9IHZibF9zZXE7CiAJCQkJc2VuZF9zaWdfaW5mbyh2Ymxfc2lnLT5pbmZvLnNpX3NpZ25vLAogCQkJCQkgICAgICAmdmJsX3NpZy0+aW5mbywgdmJsX3NpZy0+dGFzayk7CiAKLQkJCQlsaXN0X2RlbChsaXN0KTsKKwkJCQlsaXN0X2RlbCgmdmJsX3NpZy0+aGVhZCk7CiAKIAkJCQlkcm1fZnJlZSh2Ymxfc2lnLCBzaXplb2YoKnZibF9zaWcpLAogCQkJCQkgRFJNX01FTV9EUklWRVIpOwpAQCAtNDE4LDcgKzQxNiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRybV9sb2NrZWRfdGFza2xldF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QqKWRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnRhc2tsZXRfbG9jaywgaXJxZmxhZ3MpOwpAQCAtNDU1LDcgKzQ1Myw3IEBACiAgKiBjb250ZXh0LCBpdCBtdXN0IG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGlzLiBBbHNvLCB0aGUgSFcgbG9jayB3aWxsCiAgKiBiZSBoZWxkIHdpdGggdGhlIGtlcm5lbCBjb250ZXh0IG9yIGFueSBjbGllbnQgY29udGV4dC4KICAqLwotdm9pZCBkcm1fbG9ja2VkX3Rhc2tsZXQoZHJtX2RldmljZV90ICpkZXYsIHZvaWQgKCpmdW5jKShkcm1fZGV2aWNlX3QqKSkKK3ZvaWQgZHJtX2xvY2tlZF90YXNrbGV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKCpmdW5jKShzdHJ1Y3QgZHJtX2RldmljZSAqKSkKIHsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCXN0YXRpYyBERUNMQVJFX1RBU0tMRVQoZHJtX3Rhc2tsZXQsIGRybV9sb2NrZWRfdGFza2xldF9mdW5jLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYwppbmRleCBiZWZkMWFmLi5jMDUzNGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCkBAIC01MSwxNSArNTEsMTUgQEAKIGludCBkcm1fbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJREVDTEFSRV9XQUlUUVVFVUUoZW50cnksIGN1cnJlbnQpOwotCWRybV9sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2xvY2sgbG9jazsKIAlpbnQgcmV0ID0gMDsKIAogCSsrcHJpdi0+bG9ja19jb3VudDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKGRybV9sb2NrX3QgX191c2VyICopIGFyZywgc2l6ZW9mKGxvY2spKSkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmxvY2ssIChzdHJ1Y3QgZHJtX2xvY2sgX191c2VyICopIGFyZywgc2l6ZW9mKGxvY2spKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAobG9jay5jb250ZXh0ID09IERSTV9LRVJORUxfQ09OVEVYVCkgewpAQCAtMTUyLDEyICsxNTIsMTIgQEAKIGludCBkcm1fdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2xvY2sgbG9jazsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmbG9jaywgKHN0cnVjdCBkcm1fbG9jayBfX3VzZXIgKikgYXJnLCBzaXplb2YobG9jaykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChsb2NrLmNvbnRleHQgPT0gRFJNX0tFUk5FTF9DT05URVhUKSB7CkBAIC0yMDIsNyArMjAyLDcgQEAKICAqCiAgKiBBdHRlbXB0IHRvIG1hcmsgdGhlIGxvY2sgYXMgaGVsZCBieSB0aGUgZ2l2ZW4gY29udGV4dCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLgogICovCi1pbnQgZHJtX2xvY2tfdGFrZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwKK2ludCBkcm1fbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEsCiAJCSAgdW5zaWduZWQgaW50IGNvbnRleHQpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgbmV3LCBwcmV2OwpAQCAtMjUxLDcgKzI1MSw3IEBACiAgKiBSZXNldHMgdGhlIGxvY2sgZmlsZSBwb2ludGVyLgogICogTWFya3MgdGhlIGxvY2sgYXMgaGVsZCBieSB0aGUgZ2l2ZW4gY29udGV4dCwgdmlhIHRoZSBccCBjbXB4Y2hnIGluc3RydWN0aW9uLgogICovCi1zdGF0aWMgaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9sb2NrX2RhdGFfdCAqbG9ja19kYXRhLAorc3RhdGljIGludCBkcm1fbG9ja190cmFuc2ZlcihzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CkBAIC0yNzcsNyArMjc3LDcgQEAKICAqIE1hcmtzIHRoZSBsb2NrIGFzIG5vdCBoZWxkLCB2aWEgdGhlIFxwIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uIFdha2VzIGFueSB0YXNrCiAgKiB3YWl0aW5nIG9uIHRoZSBsb2NrIHF1ZXVlLgogICovCi1pbnQgZHJtX2xvY2tfZnJlZShkcm1fbG9ja19kYXRhX3QgKmxvY2tfZGF0YSwgdW5zaWduZWQgaW50IGNvbnRleHQpCitpbnQgZHJtX2xvY2tfZnJlZShzdHJ1Y3QgZHJtX2xvY2tfZGF0YSAqbG9ja19kYXRhLCB1bnNpZ25lZCBpbnQgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpsb2NrID0gJmxvY2tfZGF0YS0+aHdfbG9jay0+bG9jazsKQEAgLTMxOSw3ICszMTksNyBAQAogICovCiBzdGF0aWMgaW50IGRybV9ub3RpZmllcih2b2lkICpwcml2KQogewotCWRybV9zaWdkYXRhX3QgKnMgPSAoZHJtX3NpZ2RhdGFfdCAqKSBwcml2OworCXN0cnVjdCBkcm1fc2lnZGF0YSAqcyA9IChzdHJ1Y3QgZHJtX3NpZ2RhdGEgKikgcHJpdjsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CiAKIAkvKiBBbGxvdyBzaWduYWwgZGVsaXZlcnkgaWYgbG9jayBpc24ndCBoZWxkICovCkBAIC0zNTAsNyArMzUwLDcgQEAKICAqIGhhdmluZyB0byB3b3JyeSBhYm91dCBzdGFydmF0aW9uLgogICovCiAKLXZvaWQgZHJtX2lkbGVsb2NrX3Rha2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEpCit2b2lkIGRybV9pZGxlbG9ja190YWtlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTM2OSw3ICszNjksNyBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1faWRsZWxvY2tfdGFrZSk7CiAKLXZvaWQgZHJtX2lkbGVsb2NrX3JlbGVhc2UoZHJtX2xvY2tfZGF0YV90ICpsb2NrX2RhdGEpCit2b2lkIGRybV9pZGxlbG9ja19yZWxlYXNlKHN0cnVjdCBkcm1fbG9ja19kYXRhICpsb2NrX2RhdGEpCiB7CiAJdW5zaWduZWQgaW50IG9sZCwgcHJldjsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmxvY2sgPSAmbG9ja19kYXRhLT5od19sb2NrLT5sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwppbmRleCA5MmE4NjcwLi45MzAxOTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpAQCAtODAsNyArODAsNyBAQAogCiAjaWYgX19PU19IQVNfQUdQCiBzdGF0aWMgdm9pZCAqYWdwX3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCSAgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCSAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAl1bnNpZ25lZCBsb25nICpwaHlzX2FkZHJfbWFwLCBpLCBudW1fcGFnZXMgPQogCSAgICBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOwpAQCAtOTQsNyArOTQsNyBAQAogCW9mZnNldCAtPSBkZXYtPmhvc2UtPm1lbV9zcGFjZS0+c3RhcnQ7CiAjZW5kaWYKIAotCWZvciAoYWdwbWVtID0gZGV2LT5hZ3AtPm1lbW9yeTsgYWdwbWVtOyBhZ3BtZW0gPSBhZ3BtZW0tPm5leHQpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZ3BtZW0sICZkZXYtPmFncC0+bWVtb3J5LCBoZWFkKQogCQlpZiAoYWdwbWVtLT5ib3VuZCA8PSBvZmZzZXQKIAkJICAgICYmIChhZ3BtZW0tPmJvdW5kICsgKGFncG1lbS0+cGFnZXMgPDwgUEFHRV9TSElGVCkpID49CiAJCSAgICAob2Zmc2V0ICsgc2l6ZSkpCkBAIC0xMjMsNyArMTIzLDcgQEAKIH0KIAogLyoqIFdyYXBwZXIgYXJvdW5kIGFncF9hbGxvY2F0ZV9tZW1vcnkoKSAqLwotRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3AoZHJtX2RldmljZV90ICogZGV2LCBpbnQgcGFnZXMsIHUzMiB0eXBlKQorRFJNX0FHUF9NRU0gKmRybV9hbGxvY19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBwYWdlcywgdTMyIHR5cGUpCiB7CiAJcmV0dXJuIGRybV9hZ3BfYWxsb2NhdGVfbWVtb3J5KGRldi0+YWdwLT5icmlkZ2UsIHBhZ2VzLCB0eXBlKTsKIH0KQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAjZWxzZSAgLyogIF9fT1NfSEFTX0FHUCAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqYWdwX3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYpCisJCQkgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tbS5jCmluZGV4IDJlYzFkOWYuLjNlNmJjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbW0uYwpAQCAtNDQsMjYgKzQ0LDI2IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotdW5zaWduZWQgbG9uZyBkcm1fbW1fdGFpbF9zcGFjZShkcm1fbW1fdCAqbW0pCit1bnNpZ25lZCBsb25nIGRybV9tbV90YWlsX3NwYWNlKHN0cnVjdCBkcm1fbW0gKm1tKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCiAJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCWlmICghZW50cnktPmZyZWUpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIGVudHJ5LT5zaXplOwogfQogCi1pbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpCitpbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7CisJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKIAogCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwotCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAlpZiAoIWVudHJ5LT5mcmVlKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNzUsMTMgKzc1LDEzIEBACiB9CiAKIAotc3RhdGljIGludCBkcm1fbW1fY3JlYXRlX3RhaWxfbm9kZShkcm1fbW1fdCAqbW0sCitzdGF0aWMgaW50IGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKHN0cnVjdCBkcm1fbW0gKm1tLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWRybV9tbV9ub2RlX3QgKmNoaWxkOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqY2hpbGQ7CiAKLQljaGlsZCA9IChkcm1fbW1fbm9kZV90ICopCisJY2hpbGQgPSAoc3RydWN0IGRybV9tbV9ub2RlICopCiAJCWRybV9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CiAJaWYgKCFjaGlsZCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC05OCwxMyArOTgsMTMgQEAKIH0KIAogCi1pbnQgZHJtX21tX2FkZF9zcGFjZV90b190YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQoraW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKLQlkcm1fbW1fbm9kZV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwogCiAJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwogCWlmICghZW50cnktPmZyZWUpIHsKIAkJcmV0dXJuIGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKG1tLCBlbnRyeS0+c3RhcnQgKyBlbnRyeS0+c2l6ZSwgc2l6ZSk7CiAJfQpAQCAtMTEyLDEyICsxMTIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGRybV9tbV9ub2RlX3QgKmRybV9tbV9zcGxpdF9hdF9zdGFydChkcm1fbW1fbm9kZV90ICpwYXJlbnQsCitzdGF0aWMgc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fc3BsaXRfYXRfc3RhcnQoc3RydWN0IGRybV9tbV9ub2RlICpwYXJlbnQsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0JZHJtX21tX25vZGVfdCAqY2hpbGQ7CisJc3RydWN0IGRybV9tbV9ub2RlICpjaGlsZDsKIAotCWNoaWxkID0gKGRybV9tbV9ub2RlX3QgKikKKwljaGlsZCA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikKIAkJZHJtX2FsbG9jKHNpemVvZigqY2hpbGQpLCBEUk1fTUVNX01NKTsKIAlpZiAoIWNoaWxkKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEzOSwxMiArMTM5LDEyIEBACiAKIAogCi1kcm1fbW1fbm9kZV90ICpkcm1fbW1fZ2V0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBwYXJlbnQsCitzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9nZXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogcGFyZW50LAogCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KQogewogCi0JZHJtX21tX25vZGVfdCAqYWxpZ25fc3BsaXRvZmYgPSBOVUxMOwotCWRybV9tbV9ub2RlX3QgKmNoaWxkOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqYWxpZ25fc3BsaXRvZmYgPSBOVUxMOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqY2hpbGQ7CiAJdW5zaWduZWQgdG1wID0gMDsKIAogCWlmIChhbGlnbm1lbnQpCkBAIC0xNzUsMjYgKzE3NSwyNiBAQAogICogT3RoZXJ3aXNlIGFkZCB0byB0aGUgZnJlZSBzdGFjay4KICAqLwogCi12b2lkIGRybV9tbV9wdXRfYmxvY2soZHJtX21tX25vZGVfdCAqIGN1cikKK3ZvaWQgZHJtX21tX3B1dF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBjdXIpCiB7CiAKLQlkcm1fbW1fdCAqbW0gPSBjdXItPm1tOworCXN0cnVjdCBkcm1fbW0gKm1tID0gY3VyLT5tbTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpjdXJfaGVhZCA9ICZjdXItPm1sX2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQgKnJvb3RfaGVhZCA9ICZtbS0+bWxfZW50cnk7Ci0JZHJtX21tX25vZGVfdCAqcHJldl9ub2RlID0gTlVMTDsKLQlkcm1fbW1fbm9kZV90ICpuZXh0X25vZGU7CisJc3RydWN0IGRybV9tbV9ub2RlICpwcmV2X25vZGUgPSBOVUxMOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbmV4dF9ub2RlOwogCiAJaW50IG1lcmdlZCA9IDA7CiAKIAlpZiAoY3VyX2hlYWQtPnByZXYgIT0gcm9vdF9oZWFkKSB7Ci0JCXByZXZfbm9kZSA9IGxpc3RfZW50cnkoY3VyX2hlYWQtPnByZXYsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKKwkJcHJldl9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CiAJCWlmIChwcmV2X25vZGUtPmZyZWUpIHsKIAkJCXByZXZfbm9kZS0+c2l6ZSArPSBjdXItPnNpemU7CiAJCQltZXJnZWQgPSAxOwogCQl9CiAJfQogCWlmIChjdXJfaGVhZC0+bmV4dCAhPSByb290X2hlYWQpIHsKLQkJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+bmV4dCwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOworCQluZXh0X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5uZXh0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKIAkJaWYgKG5leHRfbm9kZS0+ZnJlZSkgewogCQkJaWYgKG1lcmdlZCkgewogCQkJCXByZXZfbm9kZS0+c2l6ZSArPSBuZXh0X25vZGUtPnNpemU7CkBAIC0yMTgsMTQgKzIxOCwxNCBAQAogCX0KIH0KIAotZHJtX21tX25vZGVfdCAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IGRybV9tbV90ICogbW0sCitzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBzdHJ1Y3QgZHJtX21tICogbW0sCiAJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQsIGludCBiZXN0X21hdGNoKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqZnJlZV9zdGFjayA9ICZtbS0+ZmxfZW50cnk7Ci0JZHJtX21tX25vZGVfdCAqZW50cnk7Ci0JZHJtX21tX25vZGVfdCAqYmVzdDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqYmVzdDsKIAl1bnNpZ25lZCBsb25nIGJlc3Rfc2l6ZTsKIAl1bnNpZ25lZCB3YXN0ZWQ7CiAKQEAgLTIzMyw3ICsyMzMsNyBAQAogCWJlc3Rfc2l6ZSA9IH4wVUw7CiAKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsIGZyZWVfc3RhY2spIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tbV9ub2RlX3QsIGZsX2VudHJ5KTsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1fbW1fbm9kZSwgZmxfZW50cnkpOwogCQl3YXN0ZWQgPSAwOwogCiAJCWlmIChlbnRyeS0+c2l6ZSA8IHNpemUpCkBAIC0yNTksMTQgKzI1OSwxNCBAQAogCXJldHVybiBiZXN0OwogfQogCi1pbnQgZHJtX21tX2NsZWFuKGRybV9tbV90ICogbW0pCitpbnQgZHJtX21tX2NsZWFuKHN0cnVjdCBkcm1fbW0gKiBtbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJm1tLT5tbF9lbnRyeTsKIAogCXJldHVybiAoaGVhZC0+bmV4dC0+bmV4dCA9PSBoZWFkKTsKIH0KIAotaW50IGRybV9tbV9pbml0KGRybV9tbV90ICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBkcm1fbW1faW5pdChzdHJ1Y3QgZHJtX21tICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPm1sX2VudHJ5KTsKIAlJTklUX0xJU1RfSEVBRCgmbW0tPmZsX2VudHJ5KTsKQEAgLTI3NSwxMiArMjc1LDEyIEBACiB9CiAKIAotdm9pZCBkcm1fbW1fdGFrZWRvd24oZHJtX21tX3QgKiBtbSkKK3ZvaWQgZHJtX21tX3Rha2Vkb3duKHN0cnVjdCBkcm1fbW0gKiBtbSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpibm9kZSA9IG1tLT5mbF9lbnRyeS5uZXh0OwotCWRybV9tbV9ub2RlX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CiAKLQllbnRyeSA9IGxpc3RfZW50cnkoYm5vZGUsIGRybV9tbV9ub2RlX3QsIGZsX2VudHJ5KTsKKwllbnRyeSA9IGxpc3RfZW50cnkoYm5vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgZmxfZW50cnkpOwogCiAJaWYgKGVudHJ5LT5tbF9lbnRyeS5uZXh0ICE9ICZtbS0+bWxfZW50cnkgfHwKIAkgICAgZW50cnktPmZsX2VudHJ5Lm5leHQgIT0gJm1tLT5mbF9lbnRyeSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKaW5kZXggMGZlN2I0NC4uMGI4ZDM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCkBAIC0zNCw4ICszNCw4IEBACiAvKiogUmVhZC93cml0ZSBtZW1vcnkgYmFycmllciAqLwogI2RlZmluZSBEUk1fTUVNT1JZQkFSUklFUigpCQltYigpCiAvKiogRFJNIGRldmljZSBsb2NhbCBkZWNsYXJhdGlvbiAqLwotI2RlZmluZSBEUk1fREVWSUNFCWRybV9maWxlX3QJKnByaXYJPSBmaWxwLT5wcml2YXRlX2RhdGE7IFwKLQkJCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2CisjZGVmaW5lIERSTV9ERVZJQ0UJc3RydWN0IGRybV9maWxlCSpwcml2CT0gZmlscC0+cHJpdmF0ZV9kYXRhOyBcCisJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2CiAKIC8qKiBJUlEgaGFuZGxlciBhcmd1bWVudHMgYW5kIHJldHVybiB0eXBlIGFuZCB2YWx1ZXMgKi8KICNkZWZpbmUgRFJNX0lSUV9BUkdTCQlpbnQgaXJxLCB2b2lkICphcmcKQEAgLTk2LDI0ICs5Niw2IEBACiAKICNkZWZpbmUgRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKF9wcml2LCBfZmlscCkgX3ByaXYgPSBfZmlscC0+cHJpdmF0ZV9kYXRhCiAKLS8qKgotICogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBTQVJFQS4KLSAqCi0gKiBTZWFyY2hlcyB0aGUgU0FSRUEgb24gdGhlIG1hcHBpbmcgbGlzdHMgYW5kIHBvaW50cyBkcm1fZGV2aWNlOjpzYXJlYSB0byBpdC4KLSAqLwotI2RlZmluZSBEUk1fR0VUU0FSRUEoKQkJCQkJCQkgXAotZG8geyAJCQkJCQkJCQkgXAotCWRybV9tYXBfbGlzdF90ICplbnRyeTsJCQkJCQkgXAotCWxpc3RfZm9yX2VhY2hfZW50cnkoIGVudHJ5LCAmZGV2LT5tYXBsaXN0LT5oZWFkLCBoZWFkICkgewkgXAotCQlpZiAoIGVudHJ5LT5tYXAgJiYJCQkJCSBcCi0JCSAgICAgZW50cnktPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgkJCSBcCi0JCSAgICAgKGVudHJ5LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSApIHsJIFwKLQkJCWRldl9wcml2LT5zYXJlYSA9IGVudHJ5LT5tYXA7CQkJIFwKLSAJCQlicmVhazsJCQkJCQkgXAotIAkJfQkJCQkJCQkgXAotIAl9CQkJCQkJCQkgXAotfSB3aGlsZSAoMCkKLQogI2RlZmluZSBEUk1fSFogSFoKIAogI2RlZmluZSBEUk1fV0FJVF9PTiggcmV0LCBxdWV1ZSwgdGltZW91dCwgY29uZGl0aW9uICkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKaW5kZXggODZhMGYxYy4uZTI5MmJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcGNpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIC8qKgogICogXGJyaWVmIEFsbG9jYXRlIGEgUENJIGNvbnNpc3RlbnQgbWVtb3J5IGJsb2NrLCBmb3IgRE1BLgogICovCi1kcm1fZG1hX2hhbmRsZV90ICpkcm1fcGNpX2FsbG9jKGRybV9kZXZpY2VfdCAqIGRldiwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKK2RybV9kbWFfaGFuZGxlX3QgKmRybV9wY2lfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCiAJCQkJZG1hX2FkZHJfdCBtYXhhZGRyKQogewogCWRybV9kbWFfaGFuZGxlX3QgKmRtYWg7CkBAIC0xMjYsNyArMTI2LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIExpbnV4LXNwZWNpZmljIERSTSBjb3JlIGNvZGUuCiAgKi8KLXZvaWQgX19kcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKK3ZvaWQgX19kcm1fcGNpX2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGRybV9kbWFfaGFuZGxlX3QgKiBkbWFoKQogewogI2lmIDEKIAl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC0xNzIsNyArMTcyLDcgQEAKIC8qKgogICogXGJyaWVmIEZyZWUgYSBQQ0kgY29uc2lzdGVudCBtZW1vcnkgYmxvY2sKICAqLwotdm9pZCBkcm1fcGNpX2ZyZWUoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKK3ZvaWQgZHJtX3BjaV9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCkKIHsKIAlfX2RybV9wY2lfZnJlZShkZXYsIGRtYWgpOwogCWtmcmVlKGRtYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCmluZGV4IGIyMDQ0OTguLjEyZGZlYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKQEAgLTg3LDcgKzg3LDcgQEAKICAqICIvcHJvYy9kcmkvJW1pbm9yJS8iLCBhbmQgZWFjaCBlbnRyeSBpbiBwcm9jX2xpc3QgYXMKICAqICIvcHJvYy9kcmkvJW1pbm9yJS8lbmFtZSUiLgogICovCi1pbnQgZHJtX3Byb2NfaW5pdChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBtaW5vciwKK2ludCBkcm1fcHJvY19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbWlub3IsCiAJCSAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipkZXZfcm9vdCkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKQEAgLTE2Myw3ICsxNjMsNyBAQAogc3RhdGljIGludCBkcm1fbmFtZV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKIAogCWlmIChvZmZzZXQgPiBEUk1fUFJPQ19MSU1JVCkgewpAQCAtMjA1LDExICsyMDUsMTAgQEAKIHN0YXRpYyBpbnQgZHJtX192bV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwotCWRybV9tYXBfdCAqbWFwOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAogCS8qIEhhcmRjb2RlZCBmcm9tIF9EUk1fRlJBTUVfQlVGRkVSLAogCSAgIF9EUk1fUkVHSVNURVJTLCBfRFJNX1NITSwgX0RSTV9BR1AsIGFuZApAQCAtMjI5LDkgKzIyOCw3IEBACiAJRFJNX1BST0NfUFJJTlQoInNsb3QJIG9mZnNldAkgICAgICBzaXplIHR5cGUgZmxhZ3MJICIKIAkJICAgICAgICJhZGRyZXNzIG10cnJcblxuIik7CiAJaSA9IDA7Ci0JaWYgKGRldi0+bWFwbGlzdCAhPSBOVUxMKQotCQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJbWFwID0gcl9saXN0LT5tYXA7CiAJCWlmICghbWFwKQogCQkJY29udGludWU7CkBAIC0yNDIsMTQgKzIzOSwxNSBAQAogCQlEUk1fUFJPQ19QUklOVCgiJTRkIDB4JTA4bHggMHglMDhseCAlNC40cyAgMHglMDJ4IDB4JTA4eCAiLAogCQkJICAgICAgIGksCiAJCQkgICAgICAgbWFwLT5vZmZzZXQsCi0JCQkgICAgICAgbWFwLT5zaXplLCB0eXBlLCBtYXAtPmZsYWdzLCByX2xpc3QtPnVzZXJfdG9rZW4pOworCQkJICAgICAgIG1hcC0+c2l6ZSwgdHlwZSwgbWFwLT5mbGFncywKKwkJCSAgICAgICByX2xpc3QtPnVzZXJfdG9rZW4pOwogCQlpZiAobWFwLT5tdHJyIDwgMCkgewogCQkJRFJNX1BST0NfUFJJTlQoIm5vbmVcbiIpOwogCQl9IGVsc2UgewogCQkJRFJNX1BST0NfUFJJTlQoIiU0ZFxuIiwgbWFwLT5tdHJyKTsKIAkJfQogCQlpKys7Ci0JCX0KKwl9CiAKIAlpZiAobGVuID4gcmVxdWVzdCArIG9mZnNldCkKIAkJcmV0dXJuIHJlcXVlc3Q7CkBAIC0yNjMsNyArMjYxLDcgQEAKIHN0YXRpYyBpbnQgZHJtX3ZtX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTI4NiwxMCArMjg0LDEwIEBACiBzdGF0aWMgaW50IGRybV9fcXVldWVzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCBsZW4gPSAwOwogCWludCBpOwotCWRybV9xdWV1ZV90ICpxOworCXN0cnVjdCBkcm1fcXVldWUgKnE7CiAKIAlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKIAkJKmVvZiA9IDE7CkBAIC0zMzYsNyArMzM0LDcgQEAKIHN0YXRpYyBpbnQgZHJtX3F1ZXVlc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC0zNTksOSArMzU3LDkgQEAKIHN0YXRpYyBpbnQgZHJtX19idWZzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IHJlcXVlc3QsCiAJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgbGVuID0gMDsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEgfHwgb2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKQEAgLTQwOCw3ICs0MDYsNyBAQAogc3RhdGljIGludCBkcm1fYnVmc19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBkYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgZGF0YTsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtNDMxLDkgKzQyOSw5IEBACiBzdGF0aWMgaW50IGRybV9fY2xpZW50c19pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkgICAgIGludCByZXF1ZXN0LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7Ci0JZHJtX2ZpbGVfdCAqcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXY7CiAKIAlpZiAob2Zmc2V0ID4gRFJNX1BST0NfTElNSVQpIHsKIAkJKmVvZiA9IDE7CkBAIC00NDQsNyArNDQyLDcgQEAKIAkqZW9mID0gMDsKIAogCURSTV9QUk9DX1BSSU5UKCJhIGRldglwaWQgICAgdWlkCW1hZ2ljCSAgaW9jdGxzXG5cbiIpOwotCWZvciAocHJpdiA9IGRldi0+ZmlsZV9maXJzdDsgcHJpdjsgcHJpdiA9IHByaXYtPm5leHQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByaXYsICZkZXYtPmZpbGVsaXN0LCBsaGVhZCkgewogCQlEUk1fUFJPQ19QUklOVCgiJWMgJTNkICU1ZCAlNWQgJTEwdSAlMTBsdVxuIiwKIAkJCSAgICAgICBwcml2LT5hdXRoZW50aWNhdGVkID8gJ3knIDogJ24nLAogCQkJICAgICAgIHByaXYtPm1pbm9yLApAQCAtNDY0LDcgKzQ2Miw3IEBACiBzdGF0aWMgaW50IGRybV9jbGllbnRzX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKIAkJCSAgICBpbnQgcmVxdWVzdCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CkBAIC00NzgsOSArNDc2LDkgQEAKIHN0YXRpYyBpbnQgZHJtX192bWFfaW5mbyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgcmVxdWVzdCwKIAkJCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGRhdGE7CiAJaW50IGxlbiA9IDA7Ci0JZHJtX3ZtYV9lbnRyeV90ICpwdDsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqcHQ7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAjaWYgZGVmaW5lZChfX2kzODZfXykKIAl1bnNpZ25lZCBpbnQgcGdwcm90OwpAQCAtNDk3LDcgKzQ5NSw3IEBACiAJRFJNX1BST0NfUFJJTlQoInZtYSB1c2UgY291bnQ6ICVkLCBoaWdoX21lbW9yeSA9ICVwLCAweCUwOGx4XG4iLAogCQkgICAgICAgYXRvbWljX3JlYWQoJmRldi0+dm1hX2NvdW50KSwKIAkJICAgICAgIGhpZ2hfbWVtb3J5LCB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKTsKLQlmb3IgKHB0ID0gZGV2LT52bWFsaXN0OyBwdDsgcHQgPSBwdC0+bmV4dCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkocHQsICZkZXYtPnZtYWxpc3QsIGhlYWQpIHsKIAkJaWYgKCEodm1hID0gcHQtPnZtYSkpCiAJCQljb250aW51ZTsKIAkJRFJNX1BST0NfUFJJTlQoIlxuJTVkIDB4JTA4bHgtMHglMDhseCAlYyVjJWMlYyVjJWMgMHglMDhseDAwMCIsCkBAIC01MzcsNyArNTM1LDcgQEAKIHN0YXRpYyBpbnQgZHJtX3ZtYV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCByZXF1ZXN0LAogCQkJaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGRhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBkYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2FyZWEuaAppbmRleCBlOTQyOTdiLi5mNTQ2Njk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmgKQEAgLTUwLDI5ICs1MCwzNSBAQAogI2RlZmluZSBTQVJFQV9EUkFXQUJMRV9DTEFJTUVEX0VOVFJZICAgIDB4ODAwMDAwMDAKIAogLyoqIFNBUkVBIGRyYXdhYmxlICovCi10eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgeworc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSB7CiAJdW5zaWduZWQgaW50IHN0YW1wOwogCXVuc2lnbmVkIGludCBmbGFnczsKLX0gZHJtX3NhcmVhX2RyYXdhYmxlX3Q7Cit9OwogCiAvKiogU0FSRUEgZnJhbWUgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9mcmFtZSB7CitzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKIAl1bnNpZ25lZCBpbnQgeDsKIAl1bnNpZ25lZCBpbnQgeTsKIAl1bnNpZ25lZCBpbnQgd2lkdGg7CiAJdW5zaWduZWQgaW50IGhlaWdodDsKIAl1bnNpZ25lZCBpbnQgZnVsbHNjcmVlbjsKLX0gZHJtX3NhcmVhX2ZyYW1lX3Q7Cit9OwogCiAvKiogU0FSRUEgKi8KLXR5cGVkZWYgc3RydWN0IGRybV9zYXJlYSB7CitzdHJ1Y3QgZHJtX3NhcmVhIHsKICAgICAvKiogZmlyc3QgdGhpbmcgaXMgYWx3YXlzIHRoZSBEUk0gbG9ja2luZyBzdHJ1Y3R1cmUgKi8KLQlkcm1faHdfbG9ja190IGxvY2s7CisJc3RydWN0IGRybV9od19sb2NrIGxvY2s7CiAgICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KLQlkcm1faHdfbG9ja190IGRyYXdhYmxlX2xvY2s7Ci0JZHJtX3NhcmVhX2RyYXdhYmxlX3QgZHJhd2FibGVUYWJsZVtTQVJFQV9NQVhfRFJBV0FCTEVTXTsJLyoqPCBkcmF3YWJsZXMgKi8KLQlkcm1fc2FyZWFfZnJhbWVfdCBmcmFtZTsJLyoqPCBmcmFtZSAqLworCXN0cnVjdCBkcm1faHdfbG9jayBkcmF3YWJsZV9sb2NrOworCXN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgZHJhd2FibGVUYWJsZVtTQVJFQV9NQVhfRFJBV0FCTEVTXTsJLyoqPCBkcmF3YWJsZXMgKi8KKwlzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGZyYW1lOwkvKio8IGZyYW1lICovCiAJZHJtX2NvbnRleHRfdCBkdW1teV9jb250ZXh0OwotfSBkcm1fc2FyZWFfdDsKK307CisKKyNpZm5kZWYgX19LRVJORUxfXwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIGRybV9zYXJlYV9kcmF3YWJsZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGRybV9zYXJlYV9mcmFtZV90OwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhIGRybV9zYXJlYV90OworI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfRFJNX1NBUkVBX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKaW5kZXggMDZlZjdkZC4uMDY3ZDI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjZGVmaW5lIERFQlVHX1NDQVRURVIgMAogCi12b2lkIGRybV9zZ19jbGVhbnVwKGRybV9zZ19tZW1fdCAqIGVudHJ5KQordm9pZCBkcm1fc2dfY2xlYW51cChzdHJ1Y3QgZHJtX3NnX21lbSAqIGVudHJ5KQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBpOwpAQCAtNjUsMTEgKzY1LDExIEBACiBpbnQgZHJtX3NnX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fc2NhdHRlcl9nYXRoZXJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgcmVxdWVzdDsKLQlkcm1fc2dfbWVtX3QgKmVudHJ5OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN0cnVjdCBkcm1fc2NhdHRlcl9nYXRoZXIgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBwYWdlcywgaSwgajsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0yMDEsMTYgKzIwMSwxNiBAQAogaW50IGRybV9zZ19mcmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9zY2F0dGVyX2dhdGhlcl90IHJlcXVlc3Q7Ci0JZHJtX3NnX21lbV90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIHJlcXVlc3Q7CisJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5OwogCiAJaWYgKCFkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX1NHKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcXVlc3QsCi0JCQkgICAoZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICopIGFyZywKKwkJCSAgIChzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyIF9fdXNlciAqKSBhcmcsCiAJCQkgICBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5jCmluZGV4IGUxNWRiNmQuLjg0MjFhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmMKQEAgLTM4LDEzICszOCwxMyBAQAogCiAjaW5jbHVkZSAiZHJtX3NtYW4uaCIKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gewotCWRybV9oYXNoX2l0ZW1fdCBvd25lcl9oYXNoOworc3RydWN0IGRybV9vd25lcl9pdGVtIHsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBvd25lcl9oYXNoOwogCXN0cnVjdCBsaXN0X2hlYWQgc21hbl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbWVtX2Jsb2NrczsKLX0gZHJtX293bmVyX2l0ZW1fdDsKK307CiAKLXZvaWQgZHJtX3NtYW5fdGFrZWRvd24oZHJtX3NtYW5fdCAqIHNtYW4pCit2b2lkIGRybV9zbWFuX3Rha2Vkb3duKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4pCiB7CiAJZHJtX2h0X3JlbW92ZSgmc21hbi0+dXNlcl9oYXNoX3RhYik7CiAJZHJtX2h0X3JlbW92ZSgmc21hbi0+b3duZXJfaGFzaF90YWIpOwpAQCAtNTYsMTIgKzU2LDEyIEBACiBFWFBPUlRfU1lNQk9MKGRybV9zbWFuX3Rha2Vkb3duKTsKIAogaW50Ci1kcm1fc21hbl9pbml0KGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAorZHJtX3NtYW5faW5pdChzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAogCSAgICAgIHVuc2lnbmVkIGludCB1c2VyX29yZGVyLCB1bnNpZ25lZCBpbnQgb3duZXJfb3JkZXIpCiB7CiAJaW50IHJldCA9IDA7CiAKLQlzbWFuLT5tbSA9IChkcm1fc21hbl9tbV90ICopIGRybV9jYWxsb2MobnVtX21hbmFnZXJzLCBzaXplb2YoKnNtYW4tPm1tKSwKKwlzbWFuLT5tbSA9IChzdHJ1Y3QgZHJtX3NtYW5fbW0gKikgZHJtX2NhbGxvYyhudW1fbWFuYWdlcnMsIHNpemVvZigqc21hbi0+bW0pLAogCQkJCQkJRFJNX01FTV9NTSk7CiAJaWYgKCFzbWFuLT5tbSkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtODgsOCArODgsOCBAQAogc3RhdGljIHZvaWQgKmRybV9zbWFuX21tX2FsbG9jYXRlKHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCkKIHsKLQlkcm1fbW1fdCAqbW0gPSAoZHJtX21tX3QgKikgcHJpdmF0ZTsKLQlkcm1fbW1fbm9kZV90ICp0bXA7CisJc3RydWN0IGRybV9tbSAqbW0gPSAoc3RydWN0IGRybV9tbSAqKSBwcml2YXRlOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqdG1wOwogCiAJdG1wID0gZHJtX21tX3NlYXJjaF9mcmVlKG1tLCBzaXplLCBhbGlnbm1lbnQsIDEpOwogCWlmICghdG1wKSB7CkBAIC0xMDEsMzAgKzEwMSwzMCBAQAogCiBzdGF0aWMgdm9pZCBkcm1fc21hbl9tbV9mcmVlKHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZikKIHsKLQlkcm1fbW1fbm9kZV90ICpub2RlID0gKGRybV9tbV9ub2RlX3QgKikgcmVmOworCXN0cnVjdCBkcm1fbW1fbm9kZSAqbm9kZSA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikgcmVmOwogCiAJZHJtX21tX3B1dF9ibG9jayhub2RlKTsKIH0KIAogc3RhdGljIHZvaWQgZHJtX3NtYW5fbW1fZGVzdHJveSh2b2lkICpwcml2YXRlKQogewotCWRybV9tbV90ICptbSA9IChkcm1fbW1fdCAqKSBwcml2YXRlOworCXN0cnVjdCBkcm1fbW0gKm1tID0gKHN0cnVjdCBkcm1fbW0gKikgcHJpdmF0ZTsKIAlkcm1fbW1fdGFrZWRvd24obW0pOwogCWRybV9mcmVlKG1tLCBzaXplb2YoKm1tKSwgRFJNX01FTV9NTSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRybV9zbWFuX21tX29mZnNldCh2b2lkICpwcml2YXRlLCB2b2lkICpyZWYpCiB7Ci0JZHJtX21tX25vZGVfdCAqbm9kZSA9IChkcm1fbW1fbm9kZV90ICopIHJlZjsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm5vZGUgPSAoc3RydWN0IGRybV9tbV9ub2RlICopIHJlZjsKIAlyZXR1cm4gbm9kZS0+c3RhcnQ7CiB9CiAKIGludAotZHJtX3NtYW5fc2V0X3JhbmdlKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKK2RybV9zbWFuX3NldF9yYW5nZShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKIAkJICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWRybV9zbWFuX21tX3QgKnNtYW5fbW07Ci0JZHJtX21tX3QgKm1tOworCXN0cnVjdCBkcm1fc21hbl9tbSAqc21hbl9tbTsKKwlzdHJ1Y3QgZHJtX21tICptbTsKIAlpbnQgcmV0OwogCiAJQlVHX09OKG1hbmFnZXIgPj0gc21hbi0+bnVtX21hbmFnZXJzKTsKQEAgLTE1Myw4ICsxNTMsOCBAQAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9zZXRfcmFuZ2UpOwogCiBpbnQKLWRybV9zbWFuX3NldF9tYW5hZ2VyKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKLQkJICAgICBkcm1fc21hbl9tbV90ICogYWxsb2NhdG9yKQorZHJtX3NtYW5fc2V0X21hbmFnZXIoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCisJCSAgICAgc3RydWN0IGRybV9zbWFuX21tICogYWxsb2NhdG9yKQogewogCUJVR19PTihtYW5hZ2VyID49IHNtYW4tPm51bV9tYW5hZ2Vycyk7CiAJc21hbi0+bW1bbWFuYWdlcl0gPSAqYWxsb2NhdG9yOwpAQCAtMTYzLDE2ICsxNjMsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fc2V0X21hbmFnZXIpOwogCi1zdGF0aWMgZHJtX293bmVyX2l0ZW1fdCAqZHJtX3NtYW5fZ2V0X293bmVyX2l0ZW0oZHJtX3NtYW5fdCAqIHNtYW4sCitzdGF0aWMgc3RydWN0IGRybV9vd25lcl9pdGVtICpkcm1fc21hbl9nZXRfb3duZXJfaXRlbShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLAogCQkJCQkJIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAJaW50IHJldDsKLQlkcm1faGFzaF9pdGVtX3QgKm93bmVyX2hhc2hfaXRlbTsKLQlkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpvd25lcl9oYXNoX2l0ZW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOwogCiAJcmV0ID0gZHJtX2h0X2ZpbmRfaXRlbSgmc21hbi0+b3duZXJfaGFzaF90YWIsIG93bmVyLCAmb3duZXJfaGFzaF9pdGVtKTsKIAlpZiAoIXJldCkgewotCQlyZXR1cm4gZHJtX2hhc2hfZW50cnkob3duZXJfaGFzaF9pdGVtLCBkcm1fb3duZXJfaXRlbV90LAorCQlyZXR1cm4gZHJtX2hhc2hfZW50cnkob3duZXJfaGFzaF9pdGVtLCBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0sCiAJCQkJICAgICAgb3duZXJfaGFzaCk7CiAJfQogCkBAIC0xOTQsMTQgKzE5NCwxNCBAQAogCXJldHVybiBOVUxMOwogfQogCi1kcm1fbWVtYmxvY2tfaXRlbV90ICpkcm1fc21hbl9hbGxvYyhkcm1fc21hbl90ICpzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKK3N0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqZHJtX3NtYW5fYWxsb2Moc3RydWN0IGRybV9zbWFuICpzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAJdm9pZCAqdG1wOwotCWRybV9zbWFuX21tX3QgKnNtYW5fbW07Ci0JZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbTsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICptZW1ibG9jazsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKnNtYW5fbW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqbWVtYmxvY2s7CiAKIAlCVUdfT04obWFuYWdlciA+PSBzbWFuLT5udW1fbWFuYWdlcnMpOwogCkBAIC0yNDYsOSArMjQ2LDkgQEAKIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9hbGxvYyk7CiAKLXN0YXRpYyB2b2lkIGRybV9zbWFuX2ZyZWUoZHJtX21lbWJsb2NrX2l0ZW1fdCAqaXRlbSkKK3N0YXRpYyB2b2lkIGRybV9zbWFuX2ZyZWUoc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICppdGVtKQogewotCWRybV9zbWFuX3QgKnNtYW4gPSBpdGVtLT5zbWFuOworCXN0cnVjdCBkcm1fc21hbiAqc21hbiA9IGl0ZW0tPnNtYW47CiAKIAlsaXN0X2RlbCgmaXRlbS0+b3duZXJfbGlzdCk7CiAJZHJtX2h0X3JlbW92ZV9pdGVtKCZzbWFuLT51c2VyX2hhc2hfdGFiLCAmaXRlbS0+dXNlcl9oYXNoKTsKQEAgLTI1Niw0MCArMjU2LDQxIEBACiAJZHJtX2ZyZWUoaXRlbSwgc2l6ZW9mKCppdGVtKSwgRFJNX01FTV9NTSk7CiB9CiAKLWludCBkcm1fc21hbl9mcmVlX2tleShkcm1fc21hbl90ICpzbWFuLCB1bnNpZ25lZCBpbnQga2V5KQoraW50IGRybV9zbWFuX2ZyZWVfa2V5KHN0cnVjdCBkcm1fc21hbiAqc21hbiwgdW5zaWduZWQgaW50IGtleSkKIHsKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2hfaXRlbTsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICptZW1ibG9ja19pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoX2l0ZW07CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICptZW1ibG9ja19pdGVtOwogCiAJaWYgKGRybV9odF9maW5kX2l0ZW0oJnNtYW4tPnVzZXJfaGFzaF90YWIsIGtleSwgJmhhc2hfaXRlbSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtYmxvY2tfaXRlbSA9IGRybV9oYXNoX2VudHJ5KGhhc2hfaXRlbSwgZHJtX21lbWJsb2NrX2l0ZW1fdCwgdXNlcl9oYXNoKTsKKwltZW1ibG9ja19pdGVtID0gZHJtX2hhc2hfZW50cnkoaGFzaF9pdGVtLCBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0sCisJCQkJICAgICAgIHVzZXJfaGFzaCk7CiAJZHJtX3NtYW5fZnJlZShtZW1ibG9ja19pdGVtKTsKIAlyZXR1cm4gMDsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9mcmVlX2tleSk7CiAKLXN0YXRpYyB2b2lkIGRybV9zbWFuX3JlbW92ZV9vd25lcihkcm1fc21hbl90ICpzbWFuLAotCQkJCSAgZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbSkKK3N0YXRpYyB2b2lkIGRybV9zbWFuX3JlbW92ZV9vd25lcihzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sCisJCQkJICBzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKm93bmVyX2l0ZW0pCiB7CiAJbGlzdF9kZWwoJm93bmVyX2l0ZW0tPnNtYW5fbGlzdCk7CiAJZHJtX2h0X3JlbW92ZV9pdGVtKCZzbWFuLT5vd25lcl9oYXNoX3RhYiwgJm93bmVyX2l0ZW0tPm93bmVyX2hhc2gpOwogCWRybV9mcmVlKG93bmVyX2l0ZW0sIHNpemVvZigqb3duZXJfaXRlbSksIERSTV9NRU1fTU0pOwogfQogCi1pbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oZHJtX3NtYW5fdCAqc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcikKK2ludCBkcm1fc21hbl9vd25lcl9jbGVhbihzdHJ1Y3QgZHJtX3NtYW4gKnNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpCiB7CiAKLQlkcm1faGFzaF9pdGVtX3QgKmhhc2hfaXRlbTsKLQlkcm1fb3duZXJfaXRlbV90ICpvd25lcl9pdGVtOworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoX2l0ZW07CisJc3RydWN0IGRybV9vd25lcl9pdGVtICpvd25lcl9pdGVtOwogCiAJaWYgKGRybV9odF9maW5kX2l0ZW0oJnNtYW4tPm93bmVyX2hhc2hfdGFiLCBvd25lciwgJmhhc2hfaXRlbSkpIHsKIAkJcmV0dXJuIC0xOwogCX0KIAotCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIGRybV9vd25lcl9pdGVtX3QsIG93bmVyX2hhc2gpOworCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIHN0cnVjdCBkcm1fb3duZXJfaXRlbSwgb3duZXJfaGFzaCk7CiAJaWYgKG93bmVyX2l0ZW0tPm1lbV9ibG9ja3MubmV4dCA9PSAmb3duZXJfaXRlbS0+bWVtX2Jsb2NrcykgewogCQlkcm1fc21hbl9yZW1vdmVfb3duZXIoc21hbiwgb3duZXJfaXRlbSk7CiAJCXJldHVybiAtMTsKQEAgLTMwMCwxMCArMzAxLDEwIEBACiAKIEVYUE9SVF9TWU1CT0woZHJtX3NtYW5fb3duZXJfY2xlYW4pOwogCi1zdGF0aWMgdm9pZCBkcm1fc21hbl9kb19vd25lcl9jbGVhbnVwKGRybV9zbWFuX3QgKnNtYW4sCi0JCQkJICAgICAgZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbSkKK3N0YXRpYyB2b2lkIGRybV9zbWFuX2RvX293bmVyX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICpzbWFuLAorCQkJCSAgICAgIHN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbSkKIHsKLQlkcm1fbWVtYmxvY2tfaXRlbV90ICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICplbnRyeSwgKm5leHQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZvd25lcl9pdGVtLT5tZW1fYmxvY2tzLAogCQkJCSBvd25lcl9saXN0KSB7CkBAIC0zMTIsMjggKzMxMywyOCBAQAogCWRybV9zbWFuX3JlbW92ZV9vd25lcihzbWFuLCBvd25lcl9pdGVtKTsKIH0KIAotdm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKGRybV9zbWFuX3QgKnNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpCit2b2lkIGRybV9zbWFuX293bmVyX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICpzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKQogewogCi0JZHJtX2hhc2hfaXRlbV90ICpoYXNoX2l0ZW07Ci0JZHJtX293bmVyX2l0ZW1fdCAqb3duZXJfaXRlbTsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaF9pdGVtOworCXN0cnVjdCBkcm1fb3duZXJfaXRlbSAqb3duZXJfaXRlbTsKIAogCWlmIChkcm1faHRfZmluZF9pdGVtKCZzbWFuLT5vd25lcl9oYXNoX3RhYiwgb3duZXIsICZoYXNoX2l0ZW0pKSB7CiAKIAkJcmV0dXJuOwogCX0KIAotCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIGRybV9vd25lcl9pdGVtX3QsIG93bmVyX2hhc2gpOworCW93bmVyX2l0ZW0gPSBkcm1faGFzaF9lbnRyeShoYXNoX2l0ZW0sIHN0cnVjdCBkcm1fb3duZXJfaXRlbSwgb3duZXJfaGFzaCk7CiAJZHJtX3NtYW5fZG9fb3duZXJfY2xlYW51cChzbWFuLCBvd25lcl9pdGVtKTsKIH0KIAogRVhQT1JUX1NZTUJPTChkcm1fc21hbl9vd25lcl9jbGVhbnVwKTsKIAotdm9pZCBkcm1fc21hbl9jbGVhbnVwKGRybV9zbWFuX3QgKnNtYW4pCit2b2lkIGRybV9zbWFuX2NsZWFudXAoc3RydWN0IGRybV9zbWFuICpzbWFuKQogewotCWRybV9vd25lcl9pdGVtX3QgKmVudHJ5LCAqbmV4dDsKKwlzdHJ1Y3QgZHJtX293bmVyX2l0ZW0gKmVudHJ5LCAqbmV4dDsKIAl1bnNpZ25lZCBpbnQgaTsKLQlkcm1fc21hbl9tbV90ICpzbWFuX21tOworCXN0cnVjdCBkcm1fc21hbl9tbSAqc21hbl9tbTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJnNtYW4tPm93bmVyX2l0ZW1zLCBzbWFuX2xpc3QpIHsKIAkJZHJtX3NtYW5fZG9fb3duZXJfY2xlYW51cChzbWFuLCBlbnRyeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zbWFuLmgKaW5kZXggZGRjNzMyYS4uMzlhMzlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc21hbi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NtYW4uaApAQCAtNTAsNyArNTAsNyBAQAogICogZm9yIG1lbW9yeSBtYW5hZ2VtZW50LgogICovCiAKLXR5cGVkZWYgc3RydWN0IGRybV9zbWFuX21tIHsKK3N0cnVjdCBkcm1fc21hbl9tbSB7CiAJLyogcHJpdmF0ZSBpbmZvLiBJZiBhbGxvY2F0ZWQsIG5lZWRzIHRvIGJlIGRlc3Ryb3llZCBieSB0aGUgZGVzdHJveQogCSAgIGZ1bmN0aW9uICovCiAJdm9pZCAqcHJpdmF0ZTsKQEAgLTc0LDMwICs3NCwzMCBAQAogCSAgICJhbGxvYyIgZnVuY3Rpb24gKi8KIAogCXVuc2lnbmVkIGxvbmcgKCpvZmZzZXQpICh2b2lkICpwcml2YXRlLCB2b2lkICpyZWYpOwotfSBkcm1fc21hbl9tbV90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0geworc3RydWN0IGRybV9tZW1ibG9ja19pdGVtIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG93bmVyX2xpc3Q7Ci0JZHJtX2hhc2hfaXRlbV90IHVzZXJfaGFzaDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSB1c2VyX2hhc2g7CiAJdm9pZCAqbW1faW5mbzsKLQlkcm1fc21hbl9tbV90ICptbTsKKwlzdHJ1Y3QgZHJtX3NtYW5fbW0gKm1tOwogCXN0cnVjdCBkcm1fc21hbiAqc21hbjsKLX0gZHJtX21lbWJsb2NrX2l0ZW1fdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGRybV9zbWFuIHsKLQlkcm1fc21hbl9tbV90ICptbTsKK3N0cnVjdCBkcm1fc21hbiB7CisJc3RydWN0IGRybV9zbWFuX21tICptbTsKIAlpbnQgbnVtX21hbmFnZXJzOwotCWRybV9vcGVuX2hhc2hfdCBvd25lcl9oYXNoX3RhYjsKLQlkcm1fb3Blbl9oYXNoX3QgdXNlcl9oYXNoX3RhYjsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCBvd25lcl9oYXNoX3RhYjsKKwlzdHJ1Y3QgZHJtX29wZW5faGFzaCB1c2VyX2hhc2hfdGFiOwogCXN0cnVjdCBsaXN0X2hlYWQgb3duZXJfaXRlbXM7Ci19IGRybV9zbWFuX3Q7Cit9OwogCiAvKgogICogVGFrZSBkb3duIGEgbWVtb3J5IG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEKICAqIHN1Y2Nlc3NmdWwgaW5pdCBhbmQgYWZ0ZXIgYSBjYWxsIHRvIGRybV9zbWFuX2NsZWFudXAuCiAgKi8KIAotZXh0ZXJuIHZvaWQgZHJtX3NtYW5fdGFrZWRvd24oZHJtX3NtYW5fdCAqIHNtYW4pOworZXh0ZXJuIHZvaWQgZHJtX3NtYW5fdGFrZWRvd24oc3RydWN0IGRybV9zbWFuICogc21hbik7CiAKIC8qCiAgKiBBbGxvY2F0ZSBzdHJ1Y3R1cmVzIGZvciBhIG1hbmFnZXIuCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9pbml0KGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbnVtX21hbmFnZXJzLAorZXh0ZXJuIGludCBkcm1fc21hbl9pbml0KHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBudW1fbWFuYWdlcnMsCiAJCQkgdW5zaWduZWQgaW50IHVzZXJfb3JkZXIsIHVuc2lnbmVkIGludCBvd25lcl9vcmRlcik7CiAKIC8qCkBAIC0xMjAsNyArMTIwLDcgQEAKICAqIG1hbmFnZXIgdW5sZXNzIGEgY3VzdG9taXplZCBhbGxvZ2F0b3IgaXMgdXNlZC4KICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX3NldF9yYW5nZShkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCitleHRlcm4gaW50IGRybV9zbWFuX3NldF9yYW5nZShzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYWdlciwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKIC8qCkBAIC0xMjksMjMgKzEyOSwyMyBAQAogICogc28gaXQgY2FuIGJlIGRlc3Ryb3llZCBhZnRlciB0aGlzIGNhbGwuCiAgKi8KIAotZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfbWFuYWdlcihkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFuZ2VyLAotCQkJCWRybV9zbWFuX21tX3QgKiBhbGxvY2F0b3IpOworZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfbWFuYWdlcihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYW5nZXIsCisJCQkJc3RydWN0IGRybV9zbWFuX21tICogYWxsb2NhdG9yKTsKIAogLyoKICAqIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrLiBBbGlnbWVudCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgogICovCiAKLWV4dGVybiBkcm1fbWVtYmxvY2tfaXRlbV90ICpkcm1fc21hbl9hbGxvYyhkcm1fc21hbl90ICogc21hbiwKLQkJCQkJICAgdW5zaWduZWQgaW50IG1hbmFnZXIsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkJICAgdW5zaWduZWQgYWxpZ25tZW50LAotCQkJCQkgICB1bnNpZ25lZCBsb25nIG93bmVyKTsKK2V4dGVybiBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKmRybV9zbWFuX2FsbG9jKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sCisJCQkJCQl1bnNpZ25lZCBpbnQgbWFuYWdlciwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJCXVuc2lnbmVkIGFsaWdubWVudCwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgb3duZXIpOwogLyoKICAqIEZyZWUgYSBtZW1vcnkgYmxvY2sgaWRlbnRpZmllZCBieSBpdHMgdXNlciBoYXNoIGtleS4KICAqLwogCi1leHRlcm4gaW50IGRybV9zbWFuX2ZyZWVfa2V5KGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQga2V5KTsKK2V4dGVybiBpbnQgZHJtX3NtYW5fZnJlZV9rZXkoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IGtleSk7CiAKIC8qCiAgKiByZXR1cm5zIDEgaWZmIHRoZXJlIGFyZSBubyBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG93bmVyLgpAQCAtMTU0LDcgKzE1NCw3IEBACiAgKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIG93bmVyLgogICovCiAKLWV4dGVybiBpbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOworZXh0ZXJuIGludCBkcm1fc21hbl9vd25lcl9jbGVhbihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBsb25nIG93bmVyKTsKIAogLyoKICAqIEZyZWVzIGFsbCBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG93bmVyLiBOb3RlIHRoYXQgdGhpcwpAQCAtMTY0LDEzICsxNjQsMTMgQEAKICAqIGlzIG5vdCBnb2luZyB0byBiZSByZWZlcmVuY2VkIGFueW1vcmUuCiAgKi8KIAotZXh0ZXJuIHZvaWQgZHJtX3NtYW5fb3duZXJfY2xlYW51cChkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CitleHRlcm4gdm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOwogCiAvKgogICogRnJlZXMgYWxsIHN0YWxlIG1lbW9yeSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkgbWFuYWdlci4KICAqIFNlZSBpZGxpbmcgYWJvdmUuCiAgKi8KIAotZXh0ZXJuIHZvaWQgZHJtX3NtYW5fY2xlYW51cChkcm1fc21hbl90ICogc21hbik7CitleHRlcm4gdm9pZCBkcm1fc21hbl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYwppbmRleCAxOTQwOGFkLi5lZTgzZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCkBAIC00OSwxNiArNDksMjEgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChjYXJkc19saW1pdCwgZHJtX2NhcmRzX2xpbWl0LCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkcm1fZGVidWcsIGludCwgMDYwMCk7CiAKLWRybV9oZWFkX3QgKipkcm1faGVhZHM7CitzdHJ1Y3QgZHJtX2hlYWQgKipkcm1faGVhZHM7CiBzdHJ1Y3QgY2xhc3MgKmRybV9jbGFzczsKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHJtX3Byb2Nfcm9vdDsKIAotc3RhdGljIGludCBkcm1fZmlsbF9pbl9kZXYoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKK3N0YXRpYyBpbnQgZHJtX2ZpbGxfaW5fZGV2KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCQkgICBzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQogewogCWludCByZXRjb2RlOwogCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZmlsZWxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmN0eGxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnZtYWxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPm1hcGxpc3QpOworCiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+Y291bnRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+ZHJ3X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnRhc2tsZXRfbG9jayk7CkBAIC02Nyw2ICs3Miw4IEBACiAJbXV0ZXhfaW5pdCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldi0+Y3R4bGlzdF9tdXRleCk7CiAKKwlpZHJfaW5pdCgmZGV2LT5kcndfaWRyKTsKKwogCWRldi0+cGRldiA9IHBkZXY7CiAJZGV2LT5wY2lfZGV2aWNlID0gcGRldi0+ZGV2aWNlOwogCWRldi0+cGNpX3ZlbmRvciA9IHBkZXYtPnZlbmRvcjsKQEAgLTc2LDEyICs4Myw3IEBACiAjZW5kaWYKIAlkZXYtPmlycSA9IHBkZXYtPmlycTsKIAotCWRldi0+bWFwbGlzdCA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCpkZXYtPm1hcGxpc3QpLCBEUk1fTUVNX01BUFMpOwotCWlmIChkZXYtPm1hcGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+bWFwbGlzdC0+aGVhZCk7CiAJaWYgKGRybV9odF9jcmVhdGUoJmRldi0+bWFwX2hhc2gsIDEyKSkgewotCQlkcm1fZnJlZShkZXYtPm1hcGxpc3QsIHNpemVvZigqZGV2LT5tYXBsaXN0KSwgRFJNX01FTV9NQVBTKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xNDMsOSArMTQ1LDkgQEAKICAqIGNyZWF0ZSB0aGUgcHJvYyBpbml0IGVudHJ5IHZpYSBwcm9jX2luaXQoKS4gVGhpcyByb3V0aW5lcyBhc3NpZ25zCiAgKiBtaW5vciBudW1iZXJzIHRvIHNlY29uZGFyeSBoZWFkcyBvZiBtdWx0aS1oZWFkZWQgY2FyZHMKICAqLwotc3RhdGljIGludCBkcm1fZ2V0X2hlYWQoZHJtX2RldmljZV90ICogZGV2LCBkcm1faGVhZF90ICogaGVhZCkKK3N0YXRpYyBpbnQgZHJtX2dldF9oZWFkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2hlYWQgKiBoZWFkKQogewotCWRybV9oZWFkX3QgKipoZWFkcyA9IGRybV9oZWFkczsKKwlzdHJ1Y3QgZHJtX2hlYWQgKipoZWFkcyA9IGRybV9oZWFkczsKIAlpbnQgcmV0OwogCWludCBtaW5vcjsKIApAQCAtMTU0LDcgKzE1Niw3IEBACiAJZm9yIChtaW5vciA9IDA7IG1pbm9yIDwgZHJtX2NhcmRzX2xpbWl0OyBtaW5vcisrLCBoZWFkcysrKSB7CiAJCWlmICghKmhlYWRzKSB7CiAKLQkJCSpoZWFkID0gKGRybV9oZWFkX3QpIHsKKwkJCSpoZWFkID0gKHN0cnVjdCBkcm1faGVhZCkgewogCQkJLmRldiA9IGRldiwuZGV2aWNlID0KIAkJCQkgICAgTUtERVYoRFJNX01BSk9SLCBtaW5vciksLm1pbm9yID0gbWlub3IsfTsKIApAQCAtMTg0LDcgKzE4Niw3IEBACiAgICAgICBlcnJfZzI6CiAJZHJtX3Byb2NfY2xlYW51cChtaW5vciwgZHJtX3Byb2Nfcm9vdCwgaGVhZC0+ZGV2X3Jvb3QpOwogICAgICAgZXJyX2cxOgotCSpoZWFkID0gKGRybV9oZWFkX3QpIHsKKwkqaGVhZCA9IChzdHJ1Y3QgZHJtX2hlYWQpIHsKIAkuZGV2ID0gTlVMTH07CiAJcmV0dXJuIHJldDsKIH0KQEAgLTIwMyw3ICsyMDUsNyBAQAogaW50IGRybV9nZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQlzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKQogewotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJaW50IHJldDsKIAogCURSTV9ERUJVRygiXG4iKTsKQEAgLTI0Niw3ICsyNDgsNyBAQAogICogImRybSIgZGF0YSwgb3RoZXJ3aXNlIHVucmVnaXN0ZXJzIHRoZSAiZHJtIiBkYXRhLCBmcmVlcyB0aGUgZGV2IGxpc3QgYW5kCiAgKiB1bnJlZ2lzdGVycyB0aGUgY2hhcmFjdGVyIGRldmljZS4KICAqLwotaW50IGRybV9wdXRfZGV2KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBkcm1fcHV0X2RldihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlEUk1fREVCVUcoInJlbGVhc2UgcHJpbWFyeSAlc1xuIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSk7CiAKQEAgLTI3NCw3ICsyNzYsNyBAQAogICogbGFzdCBtaW5vciByZWxlYXNlZC4KICAqCiAgKi8KLWludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqIGhlYWQpCitpbnQgZHJtX3B1dF9oZWFkKHN0cnVjdCBkcm1faGVhZCAqIGhlYWQpCiB7CiAJaW50IG1pbm9yID0gaGVhZC0+bWlub3I7CiAKQEAgLTI4Myw3ICsyODUsNyBAQAogCWRybV9wcm9jX2NsZWFudXAobWlub3IsIGRybV9wcm9jX3Jvb3QsIGhlYWQtPmRldl9yb290KTsKIAlkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShoZWFkLT5kZXZfY2xhc3MpOwogCi0JKmhlYWQgPSAoZHJtX2hlYWRfdCkgey5kZXYgPSBOVUxMfTsKKwkqaGVhZCA9IChzdHJ1Y3QgZHJtX2hlYWQpIHsuZGV2ID0gTlVMTH07CiAKIAlkcm1faGVhZHNbbWlub3JdID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKaW5kZXggY2M4ZTJlYi4uY2Y0MzQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCkBAIC04MCw3ICs4MCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfZHJpKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQogewotCWRybV9kZXZpY2VfdCAqIGRldiA9ICgoZHJtX2hlYWRfdCAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSkpLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKiBkZXYgPSAoKHN0cnVjdCBkcm1faGVhZCAqKWNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSkpLT5kZXY7CiAJaWYgKGRldi0+ZHJpdmVyLT5kcmlfbGlicmFyeV9uYW1lKQogCQlyZXR1cm4gZGV2LT5kcml2ZXItPmRyaV9saWJyYXJ5X25hbWUoZGV2LCBidWYpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZXYtPmRyaXZlci0+cGNpX2RyaXZlci5uYW1lKTsKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogTm90ZTogdGhlIHN0cnVjdCBjbGFzcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuCiAgKiBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGRybV9zeXNmc19jcmVhdGUoKS4KICAqLwotc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzICpjcywgZHJtX2hlYWRfdCAqaGVhZCkKK3N0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsIHN0cnVjdCBkcm1faGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CiAJaW50IGksIGosIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCmluZGV4IGI1YzViOWYuLjY4ZTM2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwpAQCAtNzksMTEgKzc5LDExIEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX21hcF90ICptYXAgPSBOVUxMOwotCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7Ci0JZHJtX2hhc2hfaXRlbV90ICpoYXNoOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IE5VTEw7CisJc3RydWN0IGRybV9tYXBfbGlzdCAqcl9saXN0OworCXN0cnVjdCBkcm1faGFzaF9pdGVtICpoYXNoOwogCiAJLyoKIAkgKiBGaW5kIHRoZSByaWdodCBtYXAKQEAgLTk3LDcgKzk3LDcgQEAKIAlpZiAoZHJtX2h0X2ZpbmRfaXRlbSgmZGV2LT5tYXBfaGFzaCwgdm1hLT52bV9wZ29mZiwgJmhhc2gpKQogCQlnb3RvIHZtX25vcGFnZV9lcnJvcjsKIAotCXJfbGlzdCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIGRybV9tYXBfbGlzdF90LCBoYXNoKTsKKwlyX2xpc3QgPSBkcm1faGFzaF9lbnRyeShoYXNoLCBzdHJ1Y3QgZHJtX21hcF9saXN0LCBoYXNoKTsKIAltYXAgPSByX2xpc3QtPm1hcDsKIAogCWlmIChtYXAgJiYgbWFwLT50eXBlID09IF9EUk1fQUdQKSB7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJLyoKIAkJICogSXQncyBBR1AgbWVtb3J5IC0gZmluZCB0aGUgcmVhbCBwaHlzaWNhbCBwYWdlIHRvIG1hcAogCQkgKi8KLQkJZm9yIChhZ3BtZW0gPSBkZXYtPmFncC0+bWVtb3J5OyBhZ3BtZW07IGFncG1lbSA9IGFncG1lbS0+bmV4dCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFncG1lbSwgJmRldi0+YWdwLT5tZW1vcnksIGhlYWQpIHsKIAkJCWlmIChhZ3BtZW0tPmJvdW5kIDw9IGJhZGRyICYmCiAJCQkgICAgYWdwbWVtLT5ib3VuZCArIGFncG1lbS0+cGFnZXMgKiBQQUdFX1NJWkUgPiBiYWRkcikKIAkJCQlicmVhazsKQEAgLTE2Myw3ICsxNjMsNyBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9zaG1fbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fbWFwX3QgKm1hcCA9IChkcm1fbWFwX3QgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IChzdHJ1Y3QgZHJtX21hcCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAl1bnNpZ25lZCBsb25nIGk7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xOTQsMTIgKzE5NCwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdm1fc2htX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fdm1hX2VudHJ5X3QgKnB0LCAqcHJldiwgKm5leHQ7Ci0JZHJtX21hcF90ICptYXA7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnB0LCAqdGVtcDsKKwlzdHJ1Y3QgZHJtX21hcCAqbWFwOworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAlpbnQgZm91bmRfbWFwcyA9IDA7CiAKIAlEUk1fREVCVUcoIjB4JTA4bHgsMHglMDhseFxuIiwKQEAgLTIwOSwzMCArMjA4LDIyIEBACiAJbWFwID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JZm9yIChwdCA9IGRldi0+dm1hbGlzdCwgcHJldiA9IE5VTEw7IHB0OyBwdCA9IG5leHQpIHsKLQkJbmV4dCA9IHB0LT5uZXh0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgdGVtcCwgJmRldi0+dm1hbGlzdCwgaGVhZCkgewogCQlpZiAocHQtPnZtYS0+dm1fcHJpdmF0ZV9kYXRhID09IG1hcCkKIAkJCWZvdW5kX21hcHMrKzsKIAkJaWYgKHB0LT52bWEgPT0gdm1hKSB7Ci0JCQlpZiAocHJldikgewotCQkJCXByZXYtPm5leHQgPSBwdC0+bmV4dDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2LT52bWFsaXN0ID0gcHQtPm5leHQ7Ci0JCQl9CisJCQlsaXN0X2RlbCgmcHQtPmhlYWQpOwogCQkJZHJtX2ZyZWUocHQsIHNpemVvZigqcHQpLCBEUk1fTUVNX1ZNQVMpOwotCQl9IGVsc2UgewotCQkJcHJldiA9IHB0OwogCQl9CiAJfQorCiAJLyogV2Ugd2VyZSB0aGUgb25seSBtYXAgdGhhdCB3YXMgZm91bmQgKi8KIAlpZiAoZm91bmRfbWFwcyA9PSAxICYmIG1hcC0+ZmxhZ3MgJiBfRFJNX1JFTU9WQUJMRSkgewogCQkvKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIHRoZSBtYXBsaXN0LCBpZiB3ZSBhcmUgbm90LCB0aGVuCiAJCSAqIHdlIGRlbGV0ZSB0aGlzIG1hcHBpbmdzIGluZm9ybWF0aW9uLgogCQkgKi8KIAkJZm91bmRfbWFwcyA9IDA7Ci0JCWxpc3QgPSAmZGV2LT5tYXBsaXN0LT5oZWFkOwotCQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQkJaWYgKHJfbGlzdC0+bWFwID09IG1hcCkKIAkJCQlmb3VuZF9tYXBzKys7CiAJCX0KQEAgLTI4Myw5ICsyNzQsOSBAQAogc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBhZ2UgKmRybV9kb192bV9kbWFfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgcGFnZV9ucjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTMxOSwxMCArMzEwLDEwIEBACiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcGFnZSAqZHJtX2RvX3ZtX3NnX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlkcm1fbWFwX3QgKm1hcCA9IChkcm1fbWFwX3QgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCXN0cnVjdCBkcm1fbWFwICptYXAgPSAoc3RydWN0IGRybV9tYXAgKikgdm1hLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnkgPSBkZXYtPnNnOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCXVuc2lnbmVkIGxvbmcgbWFwX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OwpAQCAtNDE0LDkgKzQwNSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRybV92bV9vcGVuX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX3ZtYV9lbnRyeV90ICp2bWFfZW50cnk7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSAqdm1hX2VudHJ5OwogCiAJRFJNX0RFQlVHKCIweCUwOGx4LDB4JTA4bHhcbiIsCiAJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KTsKQEAgLTQyNSwxNiArNDE2LDE1IEBACiAJdm1hX2VudHJ5ID0gZHJtX2FsbG9jKHNpemVvZigqdm1hX2VudHJ5KSwgRFJNX01FTV9WTUFTKTsKIAlpZiAodm1hX2VudHJ5KSB7CiAJCXZtYV9lbnRyeS0+dm1hID0gdm1hOwotCQl2bWFfZW50cnktPm5leHQgPSBkZXYtPnZtYWxpc3Q7CiAJCXZtYV9lbnRyeS0+cGlkID0gY3VycmVudC0+cGlkOwotCQlkZXYtPnZtYWxpc3QgPSB2bWFfZW50cnk7CisJCWxpc3RfYWRkKCZ2bWFfZW50cnktPmhlYWQsICZkZXYtPnZtYWxpc3QpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZHJtX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJZHJtX3ZtX29wZW5fbG9ja2VkKHZtYSk7CkBAIC00NTEsMjIgKzQ0MSwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwotCWRybV92bWFfZW50cnlfdCAqcHQsICpwcmV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV92bWFfZW50cnkgKnB0LCAqdGVtcDsKIAogCURSTV9ERUJVRygiMHglMDhseCwweCUwOGx4XG4iLAogCQkgIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CiAJYXRvbWljX2RlYygmZGV2LT52bWFfY291bnQpOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWZvciAocHQgPSBkZXYtPnZtYWxpc3QsIHByZXYgPSBOVUxMOyBwdDsgcHJldiA9IHB0LCBwdCA9IHB0LT5uZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCB0ZW1wLCAmZGV2LT52bWFsaXN0LCBoZWFkKSB7CiAJCWlmIChwdC0+dm1hID09IHZtYSkgewotCQkJaWYgKHByZXYpIHsKLQkJCQlwcmV2LT5uZXh0ID0gcHQtPm5leHQ7Ci0JCQl9IGVsc2UgewotCQkJCWRldi0+dm1hbGlzdCA9IHB0LT5uZXh0OwotCQkJfQorCQkJbGlzdF9kZWwoJnB0LT5oZWFkKTsKIAkJCWRybV9mcmVlKHB0LCBzaXplb2YoKnB0KSwgRFJNX01FTV9WTUFTKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00ODYsOSArNDcyLDkgQEAKICAqLwogc3RhdGljIGludCBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hOworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hOwogCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwogCiAJZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwpAQCAtNTI2LDcgKzUxMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoZHJtX21hcF90ICogbWFwKQordW5zaWduZWQgbG9uZyBkcm1fY29yZV9nZXRfbWFwX29mcyhzdHJ1Y3QgZHJtX21hcCAqIG1hcCkKIHsKIAlyZXR1cm4gbWFwLT5vZmZzZXQ7CiB9CkBAIC01NTksMTEgKzU0NSwxMSBAQAogICovCiBzdGF0aWMgaW50IGRybV9tbWFwX2xvY2tlZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fbWFwX3QgKm1hcCA9IE5VTEw7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9tYXAgKm1hcCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotCWRybV9oYXNoX2l0ZW1fdCAqaGFzaDsKKwlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSAqaGFzaDsKIAogCURSTV9ERUJVRygic3RhcnQgPSAweCVseCwgZW5kID0gMHglbHgsIHBhZ2Ugb2Zmc2V0ID0gMHglbHhcbiIsCiAJCSAgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHZtYS0+dm1fcGdvZmYpOwpAQCAtNTg4LDcgKzU3NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1hcCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIGRybV9tYXBfbGlzdF90LCBoYXNoKS0+bWFwOworCW1hcCA9IGRybV9oYXNoX2VudHJ5KGhhc2gsIHN0cnVjdCBkcm1fbWFwX2xpc3QsIGhhc2gpLT5tYXA7CiAJaWYgKCFtYXAgfHwgKChtYXAtPmZsYWdzICYgX0RSTV9SRVNUUklDVEVEKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTY3Nyw4ICs2NjMsOCBAQAogCiBpbnQgZHJtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwppbmRleCA2MDNkMTdmLi5jYjQ0OTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCkBAIC00NSwxNiArNDUsMTYgQEAKICNkZWZpbmUgSTgxMF9CVUZfVU5NQVBQRUQgMAogI2RlZmluZSBJODEwX0JVRl9NQVBQRUQgICAxCiAKLXN0YXRpYyBkcm1fYnVmX3QgKmk4MTBfZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBzdHJ1Y3QgZHJtX2J1ZiAqaTgxMF9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAlpbnQgdXNlZDsKIAogCS8qIExpbmVhciBzZWFyY2ggbWlnaHQgbm90IGJlIHRoZSBiZXN0IHNvbHV0aW9uICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQkvKiBJbiB1c2UgaXMgYWxyZWFkeSBhIHBvaW50ZXIgKi8KIAkJdXNlZCA9IGNtcHhjaGcoYnVmX3ByaXYtPmluX3VzZSwgSTgxMF9CVUZfRlJFRSwKQEAgLTcwLDcgKzcwLDcgQEAKICAqIHlldCwgdGhlIGhhcmR3YXJlIHVwZGF0ZXMgaW4gdXNlIGZvciB1cyBvbmNlIGl0cyBvbiB0aGUgcmluZyBidWZmZXIuCiAgKi8KIAotc3RhdGljIGludCBpODEwX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlpbnQgdXNlZDsKQEAgLTg3LDEwICs4NywxMCBAQAogCiBzdGF0aWMgaW50IGk4MTBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXY7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogCS5mYXN5bmMgPSBkcm1fZmFzeW5jLAogfTsKIAotc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoZHJtX2J1Zl90ICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgaTgxMF9tYXBfYnVmZmVyKHN0cnVjdCBkcm1fYnVmICogYnVmLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wczsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MTBfdW5tYXBfYnVmZmVyKGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyBpbnQgaTgxMF91bm1hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCByZXRjb2RlID0gMDsKQEAgLTE3MiwxMCArMTcyLDEwIEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9kbWFfZ2V0X2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9pODEwX2RtYV90ICogZCwKK3N0YXRpYyBpbnQgaTgxMF9kbWFfZ2V0X2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MTBfZG1hX3QgKiBkLAogCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJaW50IHJldGNvZGUgPSAwOwogCkBAIC0yMDIsOSArMjAyLDkgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODEwX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgxMF9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCiAJICogbWF5IG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gdXNlcnNwYWNlIGFuZCBhZnRlciBkZXZfcHJpdmF0ZQpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJCWlmIChidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgJiYgYnVmLT50b3RhbCkKQEAgLTI0Myw3ICsyNDMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MTBfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4pCitzdGF0aWMgaW50IGk4MTBfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yNzYsNyArMjc2LDcgQEAKIAlyZXR1cm4gaXRlcnM7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfcmluZ19idWZmZXJfdCAqcmluZyA9ICYoZGV2X3ByaXYtPnJpbmcpOwpAQCAtMjg4LDkgKzI4OCw5IEBACiAJCXJpbmctPnNwYWNlICs9IHJpbmctPlNpemU7CiB9CiAKLXN0YXRpYyBpbnQgaTgxMF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2k4MTBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCitzdGF0aWMgaW50IGk4MTBfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k4MTBfcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgbXlfaWR4ID0gMjQ7CiAJdTMyICpod19zdGF0dXMgPSAodTMyICopIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UgKyBteV9pZHgpOwogCWludCBpOwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9pODEwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAogCQlidWZfcHJpdi0+aW5fdXNlID0gaHdfc3RhdHVzKys7CkBAIC0zMjMsMTYgKzMyMywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk4MTBfZG1hX2luaXRpYWxpemUoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpODEwX2RtYV9pbml0aWFsaXplKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICAgIGRybV9pODEwX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJICAgICAgIGRybV9pODEwX2luaXRfdCAqIGluaXQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQorCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTgxMF9wcml2YXRlX3QpKTsKIAotCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRldi0+bWFwbGlzdC0+aGVhZCkgewotCQlkcm1fbWFwX2xpc3RfdCAqcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJaWYgKHJfbGlzdC0+bWFwICYmCiAJCSAgICByX2xpc3QtPm1hcC0+dHlwZSA9PSBfRFJNX1NITSAmJgogCQkgICAgcl9saXN0LT5tYXAtPmZsYWdzICYgX0RSTV9DT05UQUlOU19MT0NLKSB7CkBAIC00NzgsOCArNDc2LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9kbWFfaW5pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJZHJtX2k4MTBfaW5pdF90IGluaXQ7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtNTM2LDcgKzUzNCw3IEBACiAgKiBVc2UgJ3ZvbGF0aWxlJyAmIGxvY2FsIHZhciB0bXAgdG8gZm9yY2UgdGhlIGVtaXR0ZWQgdmFsdWVzIHRvIGJlCiAgKiBpZGVudGljYWwgdG8gdGhlIHZlcmlmaWVkIG9uZXMuCiAgKi8KLXN0YXRpYyB2b2lkIGk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MTBFbWl0Q29udGV4dFZlcmlmaWVkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmNvZGUpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC01NjksNyArNTY3LDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgxMEVtaXRUZXhWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKK3N0YXRpYyB2b2lkIGk4MTBFbWl0VGV4VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaSwgaiA9IDA7CkBAIC02MDIsNyArNjAwLDcgQEAKIAogLyogTmVlZCB0byBkbyBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgd2hlbiBzZXR0aW5nIHRoZSBkZXN0IGJ1ZmZlci4KICAqLwotc3RhdGljIHZvaWQgaTgxMEVtaXREZXN0VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgaTgxMEVtaXREZXN0VmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqY29kZSkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYzNyw3ICs2MzUsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODEwRW1pdFN0YXRlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBFbWl0U3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNjY4LDE0ICs2NjYsMTQgQEAKIAogLyogbmVlZCB0byB2ZXJpZnkKICAqLwotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LCBpbnQgZmxhZ3MsCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGZsYWdzLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3IsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl96dmFsKQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IDI7CiAJaW50IGk7CkBAIC03NDMsMTIgKzc0MSwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJaW50IGNwcCA9IDI7CiAJaW50IGk7CkBAIC03ODksMTMgKzc4NywxMyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgICAgIGRybV9idWZfdCAqIGJ1ZiwgaW50IGRpc2NhcmQsIGludCB1c2VkKQorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgc3RydWN0IGRybV9idWYgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9jbGlwX3JlY3RfdCAqYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylidWYtPmJ1c19hZGRyZXNzOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBhZGRyZXNzIC0gZGV2LT5hZ3AtPmJhc2U7CkBAIC04NjksNyArODY3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MTBfZG1hX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kbWFfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CkBAIC05MTYsNyArOTE0LDcgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgxMF9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtOTM1LDEwICs5MzMsMTAgQEAKIAlpODEwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4KTsKIH0KIAotc3RhdGljIGludCBpODEwX2ZsdXNoX3F1ZXVlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgxMF9mbHVzaF9xdWV1ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpLCByZXQgPSAwOwogCVJJTkdfTE9DQUxTOwogCkBAIC05NTQsNyArOTUyLDcgQEAKIAlpODEwX3dhaXRfcmluZyhkZXYsIGRldl9wcml2LT5yaW5nLlNpemUgLSA4KTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgxMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaW50IHVzZWQgPSBjbXB4Y2hnKGJ1Zl9wcml2LT5pbl91c2UsIEk4MTBfQlVGX0hBUkRXQVJFLApAQCAtOTcwLDkgKzk2OCw5IEBACiB9CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQgaTgxMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGk4MTBfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEpCkBAIC05ODUsNyArOTgzLDcgQEAKIAlpODEwX2ZsdXNoX3F1ZXVlKGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MTBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWlmIChidWYtPmZpbHAgPT0gZmlscCAmJiBidWZfcHJpdikgewpAQCAtMTAwMyw4ICsxMDAxLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9mbHVzaF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKQEAgLTEwMTUsOSArMTAxMyw5IEBACiBzdGF0aWMgaW50IGk4MTBfZG1hX3ZlcnRleChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQpAQCAtMTA1MSw4ICsxMDQ5LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9jbGVhcl9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9jbGVhcl90IGNsZWFyOwogCiAJaWYgKGNvcHlfZnJvbV91c2VyCkBAIC0xMDc0LDggKzEwNzIsOCBAQAogc3RhdGljIGludCBpODEwX3N3YXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAogCURSTV9ERUJVRygiaTgxMF9zd2FwX2J1ZnNcbiIpOwogCkBAIC0xMDg4LDggKzEwODYsOCBAQAogc3RhdGljIGludCBpODEwX2dldGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgxMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODEwX3NhcmVhX3QgKikKQEAgLTExMDIsOCArMTEwMCw4IEBACiBzdGF0aWMgaW50IGk4MTBfZ2V0YnVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlpbnQgcmV0Y29kZSA9IDA7CiAJZHJtX2k4MTBfZG1hX3QgZDsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTEyMyw3ICsxMTIxLDcgQEAKIAlEUk1fREVCVUcoImk4MTBfZG1hOiAlZCByZXR1cm5pbmcgJWQsIGdyYW50ZWQgPSAlZFxuIiwKIAkJICBjdXJyZW50LT5waWQsIHJldGNvZGUsIGQuZ3JhbnRlZCk7CiAKLQlpZiAoY29weV90b191c2VyKChkcm1fZG1hX3QgX191c2VyICopIGFyZywgJmQsIHNpemVvZihkKSkpCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmZCwgc2l6ZW9mKGQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpaHdfc3RhdHVzWzVdOwogCkBAIC0xMTQ0LDcgKzExNDIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9tYyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZiwgaW50IHVzZWQsCitzdGF0aWMgdm9pZCBpODEwX2RtYV9kaXNwYXRjaF9tYyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYsIGludCB1c2VkLAogCQkJCSB1bnNpZ25lZCBpbnQgbGFzdF9yZW5kZXIpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMjA3LDkgKzEyMDUsOSBAQAogc3RhdGljIGludCBpODEwX2RtYV9tYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiAqaHdfc3RhdHVzID0gZGV2X3ByaXYtPmh3X3N0YXR1c19wYWdlOwogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSAoZHJtX2k4MTBfc2FyZWFfdCAqKQpAQCAtMTIzOCw4ICsxMjM2LDggQEAKIHN0YXRpYyBpbnQgaTgxMF9yc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJcmV0dXJuIChpbnQpKCgodTMyICopIChkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2UpKVs0XSk7CkBAIC0xMjQ4LDggKzEyNDYsOCBAQAogc3RhdGljIGludCBpODEwX292MF9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgxMF9vdmVybGF5X3QgZGF0YTsKIApAQCAtMTI2NCw4ICsxMjYyLDggQEAKIHN0YXRpYyBpbnQgaTgxMF9mc3RhdHVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODEwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CkBAIC0xMjc2LDggKzEyNzQsOCBAQAogc3RhdGljIGludCBpODEwX292MF9mbGlwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgxMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwpAQCAtMTI5MCw3ICsxMjg4LDcgQEAKIAogLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKICAqLwotc3RhdGljIHZvaWQgaTgxMF9kb19pbml0X3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MTBfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTMwMCw3ICsxMjk4LDcgQEAKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIH0KIAotc3RhdGljIGludCBpODEwX2RvX2NsZWFudXBfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODEwX2RvX2NsZWFudXBfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzMTUsOCArMTMxMyw4IEBACiBzdGF0aWMgaW50IGk4MTBfZmxpcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCiAJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTEzMzAsNyArMTMyOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpODEwX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoraW50IGk4MTBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAkvKiBpODEwIGhhcyA0IG1vcmUgY291bnRlcnMgKi8KIAlkZXYtPmNvdW50ZXJzICs9IDQ7CkBAIC0xMzQyLDEyICsxMzQwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWk4MTBfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAotdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgaTgxMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEzNTcsMTIgKzEzNTUsMTIgQEAKIAl9CiB9CiAKLXZvaWQgaTgxMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpODEwX3JlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogfQogCi1pbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlpODEwX2RtYV9xdWllc2NlbnQoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTEzOTksNyArMTM5Nyw3IEBACiAgKiBccmV0dXJucwogICogQSB2YWx1ZSBvZiAxIGlzIGFsd2F5cyByZXR1cmVkIHRvIGluZGljdGF0ZSBldmVyeSBpODEwIGlzIEFHUC4KICAqLwotaW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJtLmgKaW5kZXggMmRlYjkyNS4uNjE0OTc3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcm0uaApAQCAtMTU4LDcgKzE1OCw3IEBACiAJdW5zaWduZWQgaW50IGRpcnR5OwogCiAJdW5zaWduZWQgaW50IG5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90IGJveGVzW0k4MTBfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tJODEwX05SX1NBUkVBX0NMSVBSRUNUU107CiAKIAkvKiBNYWludGFpbiBhbiBMUlUgb2YgY29udGlndW91cyByZWdpb25zIG9mIHRleHR1cmUgc3BhY2UuICBJZgogCSAqIHlvdSB0aGluayB5b3Ugb3duIGEgcmVnaW9uIG9mIHRleHR1cmUgbWVtb3J5LCBhbmQgaXQgaGFzIGFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKaW5kZXggZTZkZjQ5Zi4uNjQ4ODMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaApAQCAtNzcsOCArNzcsOCBAQAogfSBkcm1faTgxMF9yaW5nX2J1ZmZlcl90OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1faTgxMF9wcml2YXRlIHsKLQlkcm1fbWFwX3QgKnNhcmVhX21hcDsKLQlkcm1fbWFwX3QgKm1taW9fbWFwOworCXN0cnVjdCBkcm1fbWFwICpzYXJlYV9tYXA7CisJc3RydWN0IGRybV9tYXAgKm1taW9fbWFwOwogCiAJZHJtX2k4MTBfc2FyZWFfdCAqc2FyZWFfcHJpdjsKIAlkcm1faTgxMF9yaW5nX2J1ZmZlcl90IHJpbmc7CkBAIC04OCw3ICs4OCw3IEBACiAKIAlkbWFfYWRkcl90IGRtYV9zdGF0dXNfcGFnZTsKIAotCWRybV9idWZfdCAqbW1hcF9idWZmZXI7CisJc3RydWN0IGRybV9idWYgKm1tYXBfYnVmZmVyOwogCiAJdTMyIGZyb250X2RpMSwgYmFja19kaTEsIHppMTsKIApAQCAtMTE1LDE1ICsxMTUsMTUgQEAKIH0gZHJtX2k4MTBfcHJpdmF0ZV90OwogCiAJCQkJLyogaTgxMF9kbWEuYyAqLwotZXh0ZXJuIGludCBpODEwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiBpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCBpODEwX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICosIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgaTgxMF9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7Ci1leHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIGk4MTBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gaW50IGk4MTBfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgaTgxMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKIGV4dGVybiBkcm1faW9jdGxfZGVzY190IGk4MTBfaW9jdGxzW107CiBleHRlcm4gaW50IGk4MTBfbWF4X2lvY3RsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCmluZGV4IDMzMTRhOWYuLmRjMjBjMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTQ3LDE2ICs0NywxNiBAQAogI2RlZmluZSBJODMwX0JVRl9VTk1BUFBFRCAwCiAjZGVmaW5lIEk4MzBfQlVGX01BUFBFRCAgIDEKIAotc3RhdGljIGRybV9idWZfdCAqaTgzMF9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHN0cnVjdCBkcm1fYnVmICppODMwX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCWludCB1c2VkOwogCiAJLyogTGluZWFyIHNlYXJjaCBtaWdodCBub3QgYmUgdGhlIGJlc3Qgc29sdXRpb24gKi8KIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCS8qIEluIHVzZSBpcyBhbHJlYWR5IGEgcG9pbnRlciAqLwogCQl1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9GUkVFLApAQCAtNzIsNyArNzIsNyBAQAogICogeWV0LCB0aGUgaGFyZHdhcmUgdXBkYXRlcyBpbiB1c2UgZm9yIHVzIG9uY2UgaXRzIG9uIHRoZSByaW5nIGJ1ZmZlci4KICAqLwogCi1zdGF0aWMgaW50IGk4MzBfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWludCB1c2VkOwpAQCAtODksMTAgKzg5LDEwIEBACiAKIHN0YXRpYyBpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdjsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCiAJbG9ja19rZXJuZWwoKTsKQEAgLTEyMiwxMCArMTIyLDEwIEBACiAJLmZhc3luYyA9IGRybV9mYXN5bmMsCiB9OwogCi1zdGF0aWMgaW50IGk4MzBfbWFwX2J1ZmZlcihkcm1fYnVmX3QgKiBidWYsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBpODMwX21hcF9idWZmZXIoc3RydWN0IGRybV9idWYgKiBidWYsIHN0cnVjdCBmaWxlICpmaWxwKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKm9sZF9mb3BzOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJcmV0dXJuIHJldGNvZGU7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF91bm1hcF9idWZmZXIoZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIGludCBpODMwX3VubWFwX2J1ZmZlcihzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKIHsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldGNvZGUgPSAwOwpAQCAtMTc2LDEwICsxNzYsMTAgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCBpODMwX2RtYV9nZXRfYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2k4MzBfZG1hX3QgKiBkLAorc3RhdGljIGludCBpODMwX2RtYV9nZXRfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1faTgzMF9kbWFfdCAqIGQsCiAJCQkgICAgICAgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlpbnQgcmV0Y29kZSA9IDA7CiAKQEAgLTIwNiw5ICsyMDYsOSBAQAogCXJldHVybiByZXRjb2RlOwogfQogCi1zdGF0aWMgaW50IGk4MzBfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpODMwX2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKIAkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJZGV2LT5kZXZfcHJpdmF0ZSA9IE5VTEw7CiAKIAkJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJCWRybV9pODMwX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKIAkJCWlmIChidWZfcHJpdi0+a2VybmVsX3ZpcnR1YWwgJiYgYnVmLT50b3RhbCkKIAkJCQlkcm1fY29yZV9pb3JlbWFwZnJlZSgmYnVmX3ByaXYtPm1hcCwgZGV2KTsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTgzMF93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQoraW50IGk4MzBfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTI4MSw3ICsyODEsNyBAQAogCXJldHVybiBpdGVyczsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9yaW5nX2J1ZmZlcl90ICpyaW5nID0gJihkZXZfcHJpdi0+cmluZyk7CkBAIC0yOTYsOSArMjk2LDkgQEAKIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTgzMF9CT1hfUklOR19FTVBUWTsKIH0KIAotc3RhdGljIGludCBpODMwX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1faTgzMF9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3N0YXRpYyBpbnQgaTgzMF9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1faTgzMF9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBteV9pZHggPSAzNjsKIAl1MzIgKmh3X3N0YXR1cyA9ICh1MzIgKikgKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSArIG15X2lkeCk7CiAJaW50IGk7CkBAIC0zMDksNyArMzA5LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWJ1Zl9wcml2LT5pbl91c2UgPSBod19zdGF0dXMrKzsKQEAgLTMzMCwxNiArMzMwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kbWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IGk4MzBfZG1hX2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgICAgICAgZHJtX2k4MzBfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkgICAgICAgZHJtX2k4MzBfaW5pdF90ICogaW5pdCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBkcm1fbWFwX2xpc3QgKnJfbGlzdDsKIAogCW1lbXNldChkZXZfcHJpdiwgMCwgc2l6ZW9mKGRybV9pODMwX3ByaXZhdGVfdCkpOwogCi0JbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7Ci0JCWRybV9tYXBfbGlzdF90ICpyX2xpc3QgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tYXBfbGlzdF90LCBoZWFkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJfbGlzdCwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQlpZiAocl9saXN0LT5tYXAgJiYKIAkJICAgIHJfbGlzdC0+bWFwLT50eXBlID09IF9EUk1fU0hNICYmCiAJCSAgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX0NPTlRBSU5TX0xPQ0spIHsKQEAgLTQ1NSw4ICs0NTQsOCBAQAogc3RhdGljIGludCBpODMwX2RtYV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlkcm1faTgzMF9pbml0X3QgaW5pdDsKIAlpbnQgcmV0Y29kZSA9IDA7CkBAIC00OTAsNyArNDg5LDcgQEAKIC8qIE1vc3QgZWZmaWNpZW50IHdheSB0byB2ZXJpZnkgc3RhdGUgZm9yIHRoZSBpODMwIGlzIGFzIGl0IGlzCiAgKiBlbWl0dGVkLiAgTm9uLWNvbmZvcm1hbnQgc3RhdGUgaXMgc2lsZW50bHkgZHJvcHBlZC4KICAqLwotc3RhdGljIHZvaWQgaTgzMEVtaXRDb250ZXh0VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODMwRW1pdENvbnRleHRWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCBqID0gMDsKQEAgLTUzNSw3ICs1MzQsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwRW1pdFRleFZlcmlmaWVkKGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQorc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpLCBqID0gMDsKQEAgLTU2OSw3ICs1NjgsNyBAQAogCQlwcmludGsoInJlamVjdGVkIHBhY2tldCAleFxuIiwgY29kZVswXSk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0VGV4QmxlbmRWZXJpZmllZChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCBpODMwRW1pdFRleEJsZW5kVmVyaWZpZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNvZGUsIHVuc2lnbmVkIGludCBudW0pCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC01OTQsNyArNTkzLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRUZXhQYWxldHRlKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIGk4MzBFbWl0VGV4UGFsZXR0ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnBhbGV0dGUsIGludCBudW1iZXIsIGludCBpc19zaGFyZWQpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC02MjEsNyArNjIwLDcgQEAKIAogLyogTmVlZCB0byBkbyBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcgd2hlbiBzZXR0aW5nIHRoZSBkZXN0IGJ1ZmZlci4KICAqLwotc3RhdGljIHZvaWQgaTgzMEVtaXREZXN0VmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODMwRW1pdERlc3RWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCB0bXA7CkBAIC02ODIsNyArNjgxLDcgQEAKIAlBRFZBTkNFX0xQX1JJTkcoKTsKIH0KIAotc3RhdGljIHZvaWQgaTgzMEVtaXRTdGlwcGxlVmVyaWZpZWQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKmNvZGUpCitzdGF0aWMgdm9pZCBpODMwRW1pdFN0aXBwbGVWZXJpZmllZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpjb2RlKQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNjkzLDcgKzY5Miw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBFbWl0U3RhdGUoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgaTgzMEVtaXRTdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CkBAIC03OTYsNyArNzk1LDcgQEAKICAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIHZvaWQgaTgzMF9maWxsX2JveChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCBpODMwX2ZpbGxfYm94KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHIsIGludCBnLCBpbnQgYikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTgzNCw3ICs4MzMsNyBAQAogCUFEVkFOQ0VfTFBfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCBpODMwX2NwX3BlcmZvcm1hbmNlX2JveGVzKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfY3BfcGVyZm9ybWFuY2VfYm94ZXMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTg3OSw3ICs4NzgsNyBAQAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZXJmX2JveGVzID0gMDsKIH0KIAotc3RhdGljIHZvaWQgaTgzMF9kbWFfZGlzcGF0Y2hfY2xlYXIoZHJtX2RldmljZV90ICogZGV2LCBpbnQgZmxhZ3MsCitzdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGZsYWdzLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3IsCiAJCQkJICAgIHVuc2lnbmVkIGludCBjbGVhcl96dmFsLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgY2xlYXJfZGVwdGhtYXNrKQpAQCAtODg3LDcgKzg4Niw3IEBACiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKIAlpbnQgY3BwID0gZGV2X3ByaXYtPmNwcDsKIAlpbnQgaTsKQEAgLTk3NCwxMiArOTczLDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9zd2FwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3N3YXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBwaXRjaCA9IGRldl9wcml2LT5waXRjaDsKIAlpbnQgY3BwID0gZGV2X3ByaXYtPmNwcDsKIAlpbnQgaTsKQEAgLTEwNDQsNyArMTA0Myw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpODMwX2RtYV9kaXNwYXRjaF9mbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0xMDg3LDEzICsxMDg2LDEzIEBACiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3ZlcnRleChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICBkcm1fYnVmX3QgKiBidWYsIGludCBkaXNjYXJkLCBpbnQgdXNlZCkKK3N0YXRpYyB2b2lkIGk4MzBfZG1hX2Rpc3BhdGNoX3ZlcnRleChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgIHN0cnVjdCBkcm1fYnVmICogYnVmLCBpbnQgZGlzY2FyZCwgaW50IHVzZWQpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCWRybV9pODMwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fY2xpcF9yZWN0X3QgKmJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpYnVmLT5idXNfYWRkcmVzczsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcmVzcyAtIGRldi0+YWdwLT5iYXNlOwpAQCAtMTE5OSw3ICsxMTk4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGk4MzBfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0xMjE2LDEwICsxMjE1LDEwIEBACiAJaTgzMF93YWl0X3JpbmcoZGV2LCBkZXZfcHJpdi0+cmluZy5TaXplIC0gOCwgX19GVU5DVElPTl9fKTsKIH0KIAotc3RhdGljIGludCBpODMwX2ZsdXNoX3F1ZXVlKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9mbHVzaF9xdWV1ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpLCByZXQgPSAwOwogCVJJTkdfTE9DQUxTOwogCkBAIC0xMjMzLDcgKzEyMzIsNyBAQAogCWk4MzBfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX2k4MzBfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCiAJCWludCB1c2VkID0gY21weGNoZyhidWZfcHJpdi0+aW5fdXNlLCBJODMwX0JVRl9IQVJEV0FSRSwKQEAgLTEyNDksOSArMTI0OCw5IEBACiB9CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQgaTgzMF9yZWNsYWltX2J1ZmZlcnMoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGk4MzBfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCBpOwogCiAJaWYgKCFkbWEpCkBAIC0xMjY0LDcgKzEyNjMsNyBAQAogCWk4MzBfZmx1c2hfcXVldWUoZGV2KTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1faTgzMF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaWYgKGJ1Zi0+ZmlscCA9PSBmaWxwICYmIGJ1Zl9wcml2KSB7CkBAIC0xMjgyLDggKzEyODEsOCBAQAogc3RhdGljIGludCBpODMwX2ZsdXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIApAQCAtMTI5NCw5ICsxMjkzLDkgQEAKIHN0YXRpYyBpbnQgaTgzMF9kbWFfdmVydGV4KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyICpod19zdGF0dXMgPSBkZXZfcHJpdi0+aHdfc3RhdHVzX3BhZ2U7CiAJZHJtX2k4MzBfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IChkcm1faTgzMF9zYXJlYV90ICopCkBAIC0xMzI4LDggKzEzMjcsOCBAQAogc3RhdGljIGludCBpODMwX2NsZWFyX2J1ZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCWRybV9pODMwX2NsZWFyX3QgY2xlYXI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIKQEAgLTEzNTIsOCArMTM1MSw4IEBACiBzdGF0aWMgaW50IGk4MzBfc3dhcF9idWZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OworCXN0cnVjdCBkcm1fZmlsZSAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwogCiAJRFJNX0RFQlVHKCJpODMwX3N3YXBfYnVmc1xuIik7CiAKQEAgLTEzNjUsNyArMTM2NCw3IEBACiAKIC8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6CiAgKi8KLXN0YXRpYyB2b2lkIGk4MzBfZG9faW5pdF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCBpODMwX2RvX2luaXRfcGFnZWZsaXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEzNzUsNyArMTM3NCw3IEBACiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSA9IGRldl9wcml2LT5jdXJyZW50X3BhZ2U7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9kb19jbGVhbnVwX3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzkwLDggKzEzODksOCBAQAogc3RhdGljIGludCBpODMwX2ZsaXBfYnVmcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xNDA4LDggKzE0MDcsOCBAQAogc3RhdGljIGludCBpODMwX2dldGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgKmh3X3N0YXR1cyA9IGRldl9wcml2LT5od19zdGF0dXNfcGFnZTsKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2ID0gKGRybV9pODMwX3NhcmVhX3QgKikKQEAgLTE0MjIsOCArMTQyMSw4IEBACiBzdGF0aWMgaW50IGk4MzBfZ2V0YnVmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKIAlpbnQgcmV0Y29kZSA9IDA7CiAJZHJtX2k4MzBfZG1hX3QgZDsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pODMwX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTQ0NCw3ICsxNDQzLDcgQEAKIAlEUk1fREVCVUcoImk4MzBfZG1hOiAlZCByZXR1cm5pbmcgJWQsIGdyYW50ZWQgPSAlZFxuIiwKIAkJICBjdXJyZW50LT5waWQsIHJldGNvZGUsIGQuZ3JhbnRlZCk7CiAKLQlpZiAoY29weV90b191c2VyKChkcm1fZG1hX3QgX191c2VyICopIGFyZywgJmQsIHNpemVvZihkKSkpCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgYXJnLCAmZCwgc2l6ZW9mKGQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJc2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaCA9IChpbnQpaHdfc3RhdHVzWzVdOwogCkBAIC0xNDY3LDggKzE0NjYsOCBAQAogc3RhdGljIGludCBpODMwX2dldHBhcmFtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfZ2V0cGFyYW1fdCBwYXJhbTsKIAlpbnQgdmFsdWU7CkBAIC0xNTAxLDggKzE1MDAsOCBAQAogc3RhdGljIGludCBpODMwX3NldHBhcmFtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfc2V0cGFyYW1fdCBwYXJhbTsKIApAQCAtMTUyNiw3ICsxNTI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk4MzBfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgaTgzMF9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCS8qIGk4MzAgaGFzIDQgbW9yZSBjb3VudGVycyAqLwogCWRldi0+Y291bnRlcnMgKz0gNDsKQEAgLTE1MzgsMTIgKzE1MzcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaTgzMF9kbWFfY2xlYW51cChkZXYpOwogfQogCi12b2lkIGk4MzBfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTU1MywxMiArMTU1MiwxMiBAQAogCX0KIH0KIAotdm9pZCBpODMwX2RyaXZlcl9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWk4MzBfcmVjbGFpbV9idWZmZXJzKGRldiwgZmlscCk7CiB9CiAKLWludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBpODMwX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWk4MzBfZG1hX3F1aWVzY2VudChkZXYpOwogCXJldHVybiAwOwpAQCAtMTU5NCw3ICsxNTkzLDcgQEAKICAqIFxyZXR1cm5zCiAgKiBBIHZhbHVlIG9mIDEgaXMgYWx3YXlzIHJldHVyZWQgdG8gaW5kaWN0YXRlIGV2ZXJ5IGk4eHggaXMgQUdQLgogICovCi1pbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgaTgzMF9kcml2ZXJfZGV2aWNlX2lzX2FncChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaAppbmRleCA2NmRkNzUwLi45NjhhNmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCkBAIC0xOTEsNyArMTkxLDcgQEAKIAl1bnNpZ25lZCBpbnQgZGlydHk7CiAKIAl1bnNpZ25lZCBpbnQgbmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbSTgzMF9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW0k4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAogCS8qIE1haW50YWluIGFuIExSVSBvZiBjb250aWd1b3VzIHJlZ2lvbnMgb2YgdGV4dHVyZSBzcGFjZS4gIElmCiAJICogeW91IHRoaW5rIHlvdSBvd24gYSByZWdpb24gb2YgdGV4dHVyZSBtZW1vcnksIGFuZCBpdCBoYXMgYW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaAppbmRleCBlOTFmOTRhLi5kZGRhNjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCkBAIC04NCw4ICs4NCw4IEBACiB9IGRybV9pODMwX3JpbmdfYnVmZmVyX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9pODMwX3ByaXZhdGUgewotCWRybV9tYXBfdCAqc2FyZWFfbWFwOwotCWRybV9tYXBfdCAqbW1pb19tYXA7CisJc3RydWN0IGRybV9tYXAgKnNhcmVhX21hcDsKKwlzdHJ1Y3QgZHJtX21hcCAqbW1pb19tYXA7CiAKIAlkcm1faTgzMF9zYXJlYV90ICpzYXJlYV9wcml2OwogCWRybV9pODMwX3JpbmdfYnVmZmVyX3QgcmluZzsKQEAgLTk1LDcgKzk1LDcgQEAKIAogCWRtYV9hZGRyX3QgZG1hX3N0YXR1c19wYWdlOwogCi0JZHJtX2J1Zl90ICptbWFwX2J1ZmZlcjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqbW1hcF9idWZmZXI7CiAKIAl1MzIgZnJvbnRfZGkxLCBiYWNrX2RpMSwgemkxOwogCkBAIC0xMzIsMTYgKzEzMiwxNiBAQAogCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogZXh0ZXJuIGlycXJldHVybl90IGk4MzBfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gaW50IGk4MzBfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCk7Ci1leHRlcm4gdm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk4MzBfZHJpdmVyX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCBpODMwX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTgzMF9kcml2ZXJfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiBpbnQgaTgzMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGk4MzBfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCBpODMwX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogI2RlZmluZSBJODMwX1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgcmVnKQogI2RlZmluZSBJODMwX1dSSVRFKHJlZyx2YWwpICAgICBEUk1fV1JJVEUzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZywgdmFsKQpAQCAtMTgwLDcgKzE4MCw3IEBACiAJSTgzMF9XUklURShMUF9SSU5HICsgUklOR19UQUlMLCBvdXRyaW5nKTsJCQlcCiB9IHdoaWxlKDApCiAKLWV4dGVybiBpbnQgaTgzMF93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKK2V4dGVybiBpbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCiAjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVCAJCSgoMDw8MjkpfCgyPDwyMykpCiAjZGVmaW5lIEdGWF9PUF9CUkVBS1BPSU5UX0lOVEVSUlVQVAkoKDA8PDI5KXwoMTw8MjMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCmluZGV4IDU4NDFmNzYuLmExYjVjNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogaXJxcmV0dXJuX3QgaTgzMF9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQogewotCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgZHJtX2RldmljZSAqKSBhcmc7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MTYgdGVtcDsKIApAQCAtNTMsNyArNTMsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBpODMwX2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTgzMF9lbWl0X2lycShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTcwLDcgKzcwLDcgQEAKIAlyZXR1cm4gYXRvbWljX3JlYWQoJmRldl9wcml2LT5pcnFfZW1pdHRlZCk7CiB9CiAKLXN0YXRpYyBpbnQgaTgzMF93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpCitzdGF0aWMgaW50IGk4MzBfd2FpdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBpcnFfbnIpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlERUNMQVJFX1dBSVRRVUVVRShlbnRyeSwgY3VycmVudCk7CkBAIC0xMTcsOCArMTE3LDggQEAKIGludCBpODMwX2lycV9lbWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfaXJxX2VtaXRfdCBlbWl0OwogCWludCByZXN1bHQ7CkBAIC0xNDksOCArMTQ5LDggQEAKIGludCBpODMwX2lycV93YWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2k4MzBfaXJxX3dhaXRfdCBpcnF3YWl0OwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAogLyogZHJtX2RtYS5oIGhvb2tzCiAqLwotdm9pZCBpODMwX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTE4MCwxNCArMTgwLDE0IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTgzMF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k4MzBfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlJODMwX1dSSVRFMTYoSTgzMFJFR19JTlRfRU5BQkxFX1IsIDB4Mik7CiB9CiAKLXZvaWQgaTgzMF9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk4MzBfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k4MzBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTgzMF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoIWRldl9wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCmluZGV4IGVhNTI3NDBhLi4zMzU5Y2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgKiB0aGUgaGVhZCBwb2ludGVyIGNoYW5nZXMsIHNvIHRoYXQgRUJVU1kgb25seSBoYXBwZW5zIGlmIHRoZSByaW5nCiAgKiBhY3R1YWxseSBzdGFsbHMgZm9yIChlZykgMyBzZWNvbmRzLgogICovCi1pbnQgaTkxNV93YWl0X3JpbmcoZHJtX2RldmljZV90ICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQoraW50IGk5MTVfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pOTE1X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTczLDcgKzczLDcgQEAKIAlyZXR1cm4gRFJNX0VSUihFQlVTWSk7CiB9CiAKLXZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9pOTE1X3JpbmdfYnVmZmVyX3QgKnJpbmcgPSAmKGRldl9wcml2LT5yaW5nKTsKQEAgLTg4LDcgKzg4LDcgQEAKIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfUklOR19FTVBUWTsKIH0KIAotc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9kbWFfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKIAkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCkBAIC0xMjYsMTMgKzEyNiwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IGk5MTVfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgIGRybV9pOTE1X3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJICAgZHJtX2k5MTVfaW5pdF90ICogaW5pdCkKIHsKIAltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTkxNV9wcml2YXRlX3QpKTsKIAotCURSTV9HRVRTQVJFQSgpOworCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwpAQCAtMjExLDcgKzIxMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kbWFfcmVzdW1lKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9kbWFfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTM1Nyw3ICszNTcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9lbWl0X2NtZHMoZHJtX2RldmljZV90ICogZGV2LCBpbnQgX191c2VyICogYnVmZmVyLCBpbnQgZHdvcmRzKQorc3RhdGljIGludCBpOTE1X2VtaXRfY21kcyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IF9fdXNlciAqIGJ1ZmZlciwgaW50IGR3b3JkcykKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKQEAgLTM5NiwxMiArMzk2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9lbWl0X2JveChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkgZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqIGJveGVzLAorc3RhdGljIGludCBpOTE1X2VtaXRfYm94KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJIHN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqIGJveGVzLAogCQkJIGludCBpLCBpbnQgRFIxLCBpbnQgRFI0KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9jbGlwX3JlY3RfdCBib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94OwogCVJJTkdfTE9DQUxTOwogCiAJaWYgKERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoJmJveCwgJmJveGVzW2ldLCBzaXplb2YoYm94KSkpIHsKQEAgLTQzOSw3ICs0MzksNyBAQAogICogZW1pdC4gRm9yIG5vdywgZG8gaXQgaW4gYm90aCBwbGFjZXM6CiAgKi8KIAotc3RhdGljIHZvaWQgaTkxNV9lbWl0X2JyZWFkY3J1bWIoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgdm9pZCBpOTE1X2VtaXRfYnJlYWRjcnVtYihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAJQURWQU5DRV9MUF9SSU5HKCk7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9jbWRidWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBpOTE1X2Rpc3BhdGNoX2NtZGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICBkcm1faTkxNV9jbWRidWZmZXJfdCAqIGNtZCkKIHsKIAlpbnQgbmJveCA9IGNtZC0+bnVtX2NsaXByZWN0czsKQEAgLTQ4OSwxMSArNDg5LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kaXNwYXRjaF9iYXRjaGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfYmF0Y2hidWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICBkcm1faTkxNV9iYXRjaGJ1ZmZlcl90ICogYmF0Y2gpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXMgPSBiYXRjaC0+Y2xpcHJlY3RzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94ZXMgPSBiYXRjaC0+Y2xpcHJlY3RzOwogCWludCBuYm94ID0gYmF0Y2gtPm51bV9jbGlwcmVjdHM7CiAJaW50IGkgPSAwLCBjb3VudDsKIAlSSU5HX0xPQ0FMUzsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTU4Myw3ICs1ODMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGk5MTVfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTYyNSw3ICs2MjUsNyBAQAogCiAJaWYgKGJhdGNoLm51bV9jbGlwcmVjdHMgJiYgRFJNX1ZFUklGWUFSRUFfUkVBRChiYXRjaC5jbGlwcmVjdHMsCiAJCQkJCQkgICAgICAgYmF0Y2gubnVtX2NsaXByZWN0cyAqCi0JCQkJCQkgICAgICAgc2l6ZW9mKGRybV9jbGlwX3JlY3RfdCkpKQorCQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCkpKQogCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCiAJcmV0ID0gaTkxNV9kaXNwYXRjaF9iYXRjaGJ1ZmZlcihkZXYsICZiYXRjaCk7CkBAIC02NTUsNyArNjU1LDcgQEAKIAlpZiAoY21kYnVmLm51bV9jbGlwcmVjdHMgJiYKIAkgICAgRFJNX1ZFUklGWUFSRUFfUkVBRChjbWRidWYuY2xpcHJlY3RzLAogCQkJCWNtZGJ1Zi5udW1fY2xpcHJlY3RzICoKLQkJCQlzaXplb2YoZHJtX2NsaXBfcmVjdF90KSkpIHsKKwkJCQlzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpKSkgewogCQlEUk1fRVJST1IoIkZhdWx0IGFjY2Vzc2luZyBjbGlwcmVjdHNcbiIpOwogCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCX0KQEAgLTc5Miw3ICs3OTIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaTkxNV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncykKK2ludCBpOTE1X2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJLyogaTkxNSBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwpAQCAtODA0LDcgKzgwNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTkxNV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtODEzLDcgKzgxMyw3IEBACiAJaTkxNV9kbWFfY2xlYW51cChkZXYpOwogfQogCi12b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtODU0LDcgKzg1NCw3IEBACiAgKiBccmV0dXJucwogICogQSB2YWx1ZSBvZiAxIGlzIGFsd2F5cyByZXR1cmVkIHRvIGluZGljdGF0ZSBldmVyeSBpOXg1IGlzIEFHUC4KICAqLwotaW50IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQoraW50IGk5MTVfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKaW5kZXggN2I3YjY4Yi4uMDVjNjZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaApAQCAtNjQsNyArNjQsNyBAQAogfSBkcm1faTkxNV9pbml0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9zYXJlYSB7Ci0JZHJtX3RleF9yZWdpb25fdCB0ZXhMaXN0W0k5MTVfTlJfVEVYX1JFR0lPTlMgKyAxXTsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gdGV4TGlzdFtJOTE1X05SX1RFWF9SRUdJT05TICsgMV07CiAJaW50IGxhc3RfdXBsb2FkOwkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KIAlpbnQgbGFzdF9lbnF1ZXVlOwkvKiBsYXN0IHRpbWUgYSBidWZmZXIgd2FzIGVucXVldWVkICovCiAJaW50IGxhc3RfZGlzcGF0Y2g7CS8qIGFnZSBvZiB0aGUgbW9zdCByZWNlbnRseSBkaXNwYXRjaGVkIGJ1ZmZlciAqLwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLwogCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/ICovCi0JZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCiB9IGRybV9pOTE1X2JhdGNoYnVmZmVyX3Q7CiAKIC8qIEFzIGFib3ZlLCBidXQgcGFzcyBhIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGJ1ZmZlciB3aGljaCBjYW4gYmUKQEAgLTE4Miw3ICsxODIsNyBAQAogCWludCBEUjE7CQkvKiBodyBmbGFncyBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KIAlpbnQgRFI0OwkJLyogd2luZG93IG9yaWdpbiBmb3IgR0ZYX09QX0RSQVdSRUNUX0lORk8gKi8KIAlpbnQgbnVtX2NsaXByZWN0czsJLyogbXVsaXRwYXNzIHdpdGggbXVsdGlwbGUgY2xpcHJlY3RzPyAqLwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCisJc3RydWN0IGRybV9jbGlwX3JlY3QgX191c2VyICpjbGlwcmVjdHM7CS8qIHBvaW50ZXIgdG8gdXNlcnNwYWNlIGNsaXByZWN0cyAqLwogfSBkcm1faTkxNV9jbWRidWZmZXJfdDsKIAogLyogVXNlcnNwYWNlIGNhbiByZXF1ZXN0ICYgd2FpdCBvbiBpcnEnczoKQEAgLTI1OSw3ICsyNTksNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBkcm1faTkxNV92Ymxhbmtfc3dhcCB7CiAJZHJtX2RyYXdhYmxlX3QgZHJhd2FibGU7Ci0JZHJtX3ZibGFua19zZXFfdHlwZV90IHNlcXR5cGU7CisJZW51bSBkcm1fdmJsYW5rX3NlcV90eXBlIHNlcXR5cGU7CiAJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogfSBkcm1faTkxNV92Ymxhbmtfc3dhcF90OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKaW5kZXggODVlMzIzYS4uZmQ5MTg1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtMTIwLDExICsxMjAsMTEgQEAKIGV4dGVybiBpbnQgaTkxNV9tYXhfaW9jdGw7CiAKIAkJCQkvKiBpOTE1X2RtYS5jICovCi1leHRlcm4gdm9pZCBpOTE1X2tlcm5lbF9sb3N0X2NvbnRleHQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gaW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKLWV4dGVybiBpbnQgaTkxNV9kcml2ZXJfZGV2aWNlX2lzX2FncChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApOworZXh0ZXJuIGludCBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIGV4dGVybiBsb25nIGk5MTVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogCkBAIC0xMzIsMTIgKzEzMiwxMiBAQAogZXh0ZXJuIGludCBpOTE1X2lycV9lbWl0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgaTkxNV9pcnFfd2FpdChEUk1fSU9DVExfQVJHUyk7CiAKLWV4dGVybiBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwotZXh0ZXJuIGludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKK2V4dGVybiBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogZXh0ZXJuIGlycXJldHVybl90IGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfc2V0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgaTkxNV92YmxhbmtfcGlwZV9nZXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X3ZibGFua19zd2FwKERSTV9JT0NUTF9BUkdTKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogZXh0ZXJuIGludCBpOTE1X21lbV9pbml0X2hlYXAoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X21lbV9kZXN0cm95X2hlYXAoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIHZvaWQgaTkxNV9tZW1fdGFrZWRvd24oc3RydWN0IG1lbV9ibG9jayAqKmhlYXApOwotZXh0ZXJuIHZvaWQgaTkxNV9tZW1fcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsCitleHRlcm4gdm9pZCBpOTE1X21lbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJICAgICBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApOwogCiAjZGVmaW5lIEk5MTVfUkVBRChyZWcpICAgICAgICAgIERSTV9SRUFEMzIoZGV2X3ByaXYtPm1taW9fbWFwLCAocmVnKSkKQEAgLTE4OCw3ICsxODgsNyBAQAogCUk5MTVfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CQkJXAogfSB3aGlsZSgwKQogCi1leHRlcm4gaW50IGk5MTVfd2FpdF9yaW5nKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IG4sIGNvbnN0IGNoYXIgKmNhbGxlcik7CitleHRlcm4gaW50IGk5MTVfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKIAogI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQogI2RlZmluZSBHRlhfT1BfQlJFQUtQT0lOVF9JTlRFUlJVUFQJKCgwPDwyOSl8KDE8PDIzKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwppbmRleCBiOTIwNjJhLi40YjRiMmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCkBAIC00Miw3ICs0Miw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBIVyBsb2NrIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkIGk5MTVfdmJsYW5rX3Rhc2tsZXQoZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgdm9pZCBpOTE1X3ZibGFua190YXNrbGV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwpAQCAtNTAsNyArNTAsNyBAQAogCWludCBuaGl0cywgbnJlY3RzLCBzbGljZVsyXSwgdXBwZXJbMl0sIGxvd2VyWzJdLCBpOwogCXVuc2lnbmVkIGNvdW50ZXJbMl0gPSB7IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCksCiAJCQkJYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkMikgfTsKLQlkcm1fZHJhd2FibGVfaW5mb190ICpkcnc7CisJc3RydWN0IGRybV9kcmF3YWJsZV9pbmZvICpkcnc7CiAJZHJtX2k5MTVfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCXUzMiBjcHAgPSBkZXZfcHJpdi0+Y3BwOwogCXUzMiBjbWQgPSAoY3BwID09IDQpID8gKFhZX1NSQ19DT1BZX0JMVF9DTUQgfApAQCAtOTUsNyArOTUsNyBAQAogCQlsaXN0X2Zvcl9lYWNoKGhpdCwgJmhpdHMpIHsKIAkJCWRybV9pOTE1X3ZibF9zd2FwX3QgKnN3YXBfY21wID0KIAkJCQlsaXN0X2VudHJ5KGhpdCwgZHJtX2k5MTVfdmJsX3N3YXBfdCwgaGVhZCk7Ci0JCQlkcm1fZHJhd2FibGVfaW5mb190ICpkcndfY21wID0KKwkJCXN0cnVjdCBkcm1fZHJhd2FibGVfaW5mbyAqZHJ3X2NtcCA9CiAJCQkJZHJtX2dldF9kcmF3YWJsZV9pbmZvKGRldiwgc3dhcF9jbXAtPmRyd19pZCk7CiAKIAkJCWlmIChkcndfY21wICYmCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJbGlzdF9mb3JfZWFjaChoaXQsICZoaXRzKSB7CiAJCQlkcm1faTkxNV92Ymxfc3dhcF90ICpzd2FwX2hpdCA9CiAJCQkJbGlzdF9lbnRyeShoaXQsIGRybV9pOTE1X3ZibF9zd2FwX3QsIGhlYWQpOwotCQkJZHJtX2NsaXBfcmVjdF90ICpyZWN0OworCQkJc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3Q7CiAJCQlpbnQgbnVtX3JlY3RzLCBwaXBlOwogCQkJdW5zaWduZWQgc2hvcnQgdG9wLCBib3R0b207CiAKQEAgLTIxMSw3ICsyMTEsNyBAQAogCiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiB0ZW1wOwogCkBAIC0yNTcsNyArMjU3LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IGk5MTVfZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0yODMsNyArMjgzLDcgQEAKIAlyZXR1cm4gZGV2X3ByaXYtPmNvdW50ZXI7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpCitzdGF0aWMgaW50IGk5MTVfd2FpdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBpcnFfbnIpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKQEAgLTMwOSw3ICszMDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaTkxNV9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UsCitzdGF0aWMgaW50IGk5MTVfZHJpdmVyX3ZibGFua19kb193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UsCiAJCQkJICAgICAgYXRvbWljX3QgKmNvdW50ZXIpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zMzEsMTIgKzMzMSwxMiBAQAogfQogCiAKLWludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCXJldHVybiBpOTE1X2RyaXZlcl92YmxhbmtfZG9fd2FpdChkZXYsIHNlcXVlbmNlLCAmZGV2LT52YmxfcmVjZWl2ZWQpOwogfQogCi1pbnQgaTkxNV9kcml2ZXJfdmJsYW5rX3dhaXQyKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IGk5MTVfZHJpdmVyX3ZibGFua193YWl0MihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCXJldHVybiBpOTE1X2RyaXZlcl92YmxhbmtfZG9fd2FpdChkZXYsIHNlcXVlbmNlLCAmZGV2LT52YmxfcmVjZWl2ZWQyKTsKIH0KQEAgLTM4OSw3ICszODksNyBAQAogCXJldHVybiBpOTE1X3dhaXRfaXJxKGRldiwgaXJxd2FpdC5pcnFfc2VxKTsKIH0KIAotc3RhdGljIHZvaWQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyB2b2lkIGk5MTVfZW5hYmxlX2ludGVycnVwdCAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUxNiBmbGFnOwpAQCAtNTY5LDcgKzU2OSw3IEBACiAKIC8qIGRybV9kbWEuaCBob29rcwogKi8KLXZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC01NzgsNyArNTc4LDcgQEAKIAlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIDB4MCk7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTU5Miw3ICs1OTIsNyBAQAogCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiB9CiAKLXZvaWQgaTkxNV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIGk5MTVfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MTYgdGVtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwppbmRleCA1MmM2NzMyLi41MGI0YmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCkBAIC00MywxMSArNDMsMTEgQEAKICAqIGJsb2NrIHRvIGFsbG9jYXRlLCBhbmQgdGhlIHJpbmcgaXMgZHJhaW5lZCBwcmlvciB0byBhbGxvY2F0aW9ucyAtLQogICogaW4gb3RoZXIgd29yZHMgYWxsb2NhdGlvbiBpcyBleHBlbnNpdmUuCiAgKi8KLXN0YXRpYyB2b2lkIG1hcmtfYmxvY2soZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgbWVtX2Jsb2NrICpwLCBpbnQgaW5fdXNlKQorc3RhdGljIHZvaWQgbWFya19ibG9jayhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IG1lbV9ibG9jayAqcCwgaW50IGluX3VzZSkKIHsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1faTkxNV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Ci0JZHJtX3RleF9yZWdpb25fdCAqbGlzdDsKKwlzdHJ1Y3QgZHJtX3RleF9yZWdpb24gKmxpc3Q7CiAJdW5zaWduZWQgc2hpZnQsIG5yOwogCXVuc2lnbmVkIHN0YXJ0OwogCXVuc2lnbmVkIGVuZDsKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAvKiBGcmVlIGFsbCBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWxlYXNpbmcgZmlsZS4KICAqLwotdm9pZCBpOTE1X21lbV9yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwLCBzdHJ1Y3QgbWVtX2Jsb2NrICpoZWFwKQordm9pZCBpOTE1X21lbV9yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHAsIHN0cnVjdCBtZW1fYmxvY2sgKmhlYXApCiB7CiAJc3RydWN0IG1lbV9ibG9jayAqcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYwppbmRleCBjMmE0YmFjLi45YzczYTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kbWEuYwpAQCAtNDYsNyArNDYsNyBAQAogCiAjZGVmaW5lIE1JTklNQUxfQ0xFQU5VUCAwCiAjZGVmaW5lIEZVTExfQ0xFQU5VUCAxCi1zdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZ1bGxfY2xlYW51cCk7CitzdGF0aWMgaW50IG1nYV9kb19jbGVhbnVwX2RtYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRW5naW5lIGNvbnRyb2wKQEAgLTIyNCw3ICsyMjQsNyBAQAogI2RlZmluZSBNR0FfQlVGRkVSX0ZSRUUJCTAKIAogI2lmIE1HQV9GUkVFTElTVF9ERUJVRwotc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3ByaW50KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9wcmludChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2FfZnJlZWxpc3RfdCAqZW50cnk7CkBAIC0yNDUsMTAgKzI0NSwxMCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgbWdhX2ZyZWVsaXN0X2luaXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KQorc3RhdGljIGludCBtZ2FfZnJlZWxpc3RfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKmVudHJ5OwogCWludCBpOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9mcmVlbGlzdF90ICplbnRyeTsKQEAgLTMxMSwxMCArMzExLDEwIEBACiAjaWYgMAogLyogRklYTUU6IFN0aWxsIG5lZWRlZD8KICAqLwotc3RhdGljIHZvaWQgbWdhX2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIG1nYV9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlpbnQgaTsKIApAQCAtMzI2LDcgKzMyNiw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGRybV9idWZfdCAqbWdhX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKm1nYV9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2ZyZWVsaXN0X3QgKm5leHQ7CkBAIC0zNTksNyArMzU5LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotaW50IG1nYV9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitpbnQgbWdhX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTM5Myw3ICszOTMsNyBAQAogICogRE1BIGluaXRpYWxpemF0aW9uLCBjbGVhbnVwCiAgKi8KIAotaW50IG1nYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitpbnQgbWdhX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIApAQCAtNDM0LDcgKzQzNCw3IEBACiAgKgogICogXHNhIG1nYV9kb19kbWFfYm9vdHN0cmFwLCBtZ2FfZG9fcGNpX2RtYV9ib290c3RyYXAKICAqLwotc3RhdGljIGludCBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCBtZ2FfZG9fYWdwX2RtYV9ib290c3RyYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgIGRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICogZG1hX2JzKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpjb25zdCBkZXZfcHJpdiA9CkBAIC00NDUsMTEgKzQ0NSwxMSBAQAogCWNvbnN0IHVuc2lnbmVkIHNlY29uZGFyeV9zaXplID0gZG1hX2JzLT5zZWNvbmRhcnlfYmluX2NvdW50CiAJICAgICogZG1hX2JzLT5zZWNvbmRhcnlfYmluX3NpemU7CiAJY29uc3QgdW5zaWduZWQgYWdwX3NpemUgPSAoZG1hX2JzLT5hZ3Bfc2l6ZSA8PCAyMCk7Ci0JZHJtX2J1Zl9kZXNjX3QgcmVxOwotCWRybV9hZ3BfbW9kZV90IG1vZGU7Ci0JZHJtX2FncF9pbmZvX3QgaW5mbzsKLQlkcm1fYWdwX2J1ZmZlcl90IGFncF9yZXE7Ci0JZHJtX2FncF9iaW5kaW5nX3QgYmluZF9yZXE7CisJc3RydWN0IGRybV9idWZfZGVzYyByZXE7CisJc3RydWN0IGRybV9hZ3BfbW9kZSBtb2RlOworCXN0cnVjdCBkcm1fYWdwX2luZm8gaW5mbzsKKwlzdHJ1Y3QgZHJtX2FncF9idWZmZXIgYWdwX3JlcTsKKwlzdHJ1Y3QgZHJtX2FncF9iaW5kaW5nIGJpbmRfcmVxOwogCiAJLyogQWNxdWlyZSBBR1AuICovCiAJZXJyID0gZHJtX2FncF9hY3F1aXJlKGRldik7CkBAIC01NDgsMTAgKzU0OCwxMCBAQAogCX0KIAogCXsKLQkJZHJtX21hcF9saXN0X3QgKl9lbnRyeTsKKwkJc3RydWN0IGRybV9tYXBfbGlzdCAqX2VudHJ5OwogCQl1bnNpZ25lZCBsb25nIGFncF90b2tlbiA9IDA7CiAJCQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdC0+aGVhZCwgaGVhZCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9lbnRyeSwgJmRldi0+bWFwbGlzdCwgaGVhZCkgewogCQkJaWYgKF9lbnRyeS0+bWFwID09IGRldi0+YWdwX2J1ZmZlcl9tYXApCiAJCQkJYWdwX3Rva2VuID0gX2VudHJ5LT51c2VyX3Rva2VuOwogCQl9CkBAIC01ODgsNyArNTg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi1zdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC02MDksNyArNjA5LDcgQEAKICAqCiAgKiBcc2EgbWdhX2RvX2RtYV9ib290c3RyYXAsIG1nYV9kb19hZ3BfZG1hX2Jvb3RzdHJhcAogICovCi1zdGF0aWMgaW50IG1nYV9kb19wY2lfZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IG1nYV9kb19wY2lfZG1hX2Jvb3RzdHJhcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgZHJtX21nYV9kbWFfYm9vdHN0cmFwX3QgKiBkbWFfYnMpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmNvbnN0IGRldl9wcml2ID0KQEAgLTYxOCw3ICs2MTgsNyBAQAogCXVuc2lnbmVkIGludCBwcmltYXJ5X3NpemU7CiAJdW5zaWduZWQgaW50IGJpbl9jb3VudDsKIAlpbnQgZXJyOwotCWRybV9idWZfZGVzY190IHJlcTsKKwlzdHJ1Y3QgZHJtX2J1Zl9kZXNjIHJlcTsKIAogCWlmIChkZXYtPmRtYSA9PSBOVUxMKSB7CiAJCURSTV9FUlJPUigiZGV2LT5kbWEgaXMgTlVMTFxuIik7CkBAIC02OTksNyArNjk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtZ2FfZG9fZG1hX2Jvb3RzdHJhcChkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IG1nYV9kb19kbWFfYm9vdHN0cmFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCWRybV9tZ2FfZG1hX2Jvb3RzdHJhcF90ICogZG1hX2JzKQogewogCWNvbnN0IGludCBpc19hZ3AgPSAoZG1hX2JzLT5hZ3BfbW9kZSAhPSAwKSAmJiBkcm1fZGV2aWNlX2lzX2FncChkZXYpOwpAQCAtNzkzLDcgKzc5Myw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtZ2FfZG9faW5pdF9kbWEoZHJtX2RldmljZV90ICogZGV2LCBkcm1fbWdhX2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IG1nYV9kb19pbml0X2RtYShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX21nYV9pbml0X3QgKiBpbml0KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdjsKIAlpbnQgcmV0OwpAQCAtODIzLDggKzgyMyw3IEBACiAJZGV2X3ByaXYtPnRleHR1cmVfb2Zmc2V0ID0gaW5pdC0+dGV4dHVyZV9vZmZzZXRbMF07CiAJZGV2X3ByaXYtPnRleHR1cmVfc2l6ZSA9IGluaXQtPnRleHR1cmVfc2l6ZVswXTsKIAotCURSTV9HRVRTQVJFQSgpOwotCisJZGV2X3ByaXYtPnNhcmVhID0gZHJtX2dldHNhcmVhKGRldik7CiAJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZmluZCBzYXJlYSFcbiIpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtOTM0LDcgKzkzMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWdhX2RvX2NsZWFudXBfZG1hKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZnVsbF9jbGVhbnVwKQorc3RhdGljIGludCBtZ2FfZG9fY2xlYW51cF9kbWEoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGZ1bGxfY2xlYW51cCkKIHsKIAlpbnQgZXJyID0gMDsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC05NjMsOCArOTYyLDggQEAKIAkJaWYgKGRldl9wcml2LT51c2VkX25ld19kbWFfaW5pdCkgewogI2lmIF9fT1NfSEFTX0FHUAogCQkJaWYgKGRldl9wcml2LT5hZ3BfaGFuZGxlICE9IDApIHsKLQkJCQlkcm1fYWdwX2JpbmRpbmdfdCB1bmJpbmRfcmVxOwotCQkJCWRybV9hZ3BfYnVmZmVyX3QgZnJlZV9yZXE7CisJCQkJc3RydWN0IGRybV9hZ3BfYmluZGluZyB1bmJpbmRfcmVxOworCQkJCXN0cnVjdCBkcm1fYWdwX2J1ZmZlciBmcmVlX3JlcTsKIAogCQkJCXVuYmluZF9yZXEuaGFuZGxlID0gZGV2X3ByaXYtPmFncF9oYW5kbGU7CiAJCQkJZHJtX2FncF91bmJpbmQoZGV2LCAmdW5iaW5kX3JlcSk7CkBAIC0xMDQxLDExICsxMDQwLDExIEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fbG9ja190IGxvY2s7CisJc3RydWN0IGRybV9sb2NrIGxvY2s7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChsb2NrLCAoZHJtX2xvY2tfdCBfX3VzZXIgKikgZGF0YSwKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobG9jaywgKHN0cnVjdCBkcm1fbG9jayBfX3VzZXIgKikgZGF0YSwKIAkJCQkgc2l6ZW9mKGxvY2spKTsKIAogCURSTV9ERUJVRygiJXMlcyVzXG4iLApAQCAtMTA4Nyw5ICsxMDg2LDkgQEAKICAqIERNQSBidWZmZXIgbWFuYWdlbWVudAogICovCiAKLXN0YXRpYyBpbnQgbWdhX2RtYV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2RtYV90ICogZCkKK3N0YXRpYyBpbnQgbWdhX2RtYV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2RtYSAqIGQpCiB7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IGQtPmdyYW50ZWRfY291bnQ7IGkgPCBkLT5yZXF1ZXN0X2NvdW50OyBpKyspIHsKQEAgLTExMTQsMTAgKzExMTMsMTAgQEAKIGludCBtZ2FfZG1hX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwotCWRybV9kbWFfdCBkOworCXN0cnVjdCBkcm1fZG1hIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJc3RydWN0IGRybV9kbWEgZDsKIAlpbnQgcmV0ID0gMDsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwpAQCAtMTE1Niw3ICsxMTU1LDcgQEAKIC8qKgogICogQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQuCiAgKi8KLWludCBtZ2FfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKiBkZXYpCitpbnQgbWdhX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9tZ2FfcHJpdmF0ZV90KSwgRFJNX01FTV9EUklWRVIpOwogCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOwpAQCAtMTE2NywxMiArMTE2NiwxMiBAQAogLyoqCiAgKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCBvcGVuZXIgb2YgdGhlIGRldmljZSBpcyBjbG9zZWQuCiAgKi8KLXZvaWQgbWdhX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCBtZ2FfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAltZ2FfZG9fY2xlYW51cF9kbWEoZGV2LCBGVUxMX0NMRUFOVVApOwogfQogCi1pbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldikKK2ludCBtZ2FfZHJpdmVyX2RtYV9xdWllc2NlbnQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlyZXR1cm4gbWdhX2RvX3dhaXRfZm9yX2lkbGUoZGV2X3ByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaAppbmRleCA0NGQxMjkzLi45NDRiNTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcm0uaApAQCAtMTgxLDcgKzE4MSw3IEBACiAKIAkvKiBUaGUgY3VycmVudCBjbGlwcmVjdHMsIG9yIGEgc3Vic2V0IHRoZXJlb2YuCiAJICovCi0JZHJtX2NsaXBfcmVjdF90IGJveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW01HQV9OUl9TQVJFQV9DTElQUkVDVFNdOwogCXVuc2lnbmVkIGludCBuYm94OwogCiAJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCAzZCBkcmF3YWJsZS4gIFRoZQpAQCAtMjAyLDcgKzIwMiw3IEBACiAJdW5zaWduZWQgaW50IGV4cG9ydGVkX25iYWNrOwogCWludCBleHBvcnRlZF9iYWNrX3gsIGV4cG9ydGVkX2Zyb250X3gsIGV4cG9ydGVkX3c7CiAJaW50IGV4cG9ydGVkX2JhY2tfeSwgZXhwb3J0ZWRfZnJvbnRfeSwgZXhwb3J0ZWRfaDsKLQlkcm1fY2xpcF9yZWN0X3QgZXhwb3J0ZWRfYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgZXhwb3J0ZWRfYm94ZXNbTUdBX05SX1NBUkVBX0NMSVBSRUNUU107CiAKIAkvKiBDb3VudGVycyBmb3IgYWdpbmcgdGV4dHVyZXMgYW5kIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nLgogCSAqLwpAQCAtMjE2LDcgKzIxNiw3IEBACiAKIAkvKiBMUlUgbGlzdHMgZm9yIHRleHR1cmUgbWVtb3J5IGluIGFncCBzcGFjZSBhbmQgb24gdGhlIGNhcmQuCiAJICovCi0JZHJtX3RleF9yZWdpb25fdCB0ZXhMaXN0W01HQV9OUl9URVhfSEVBUFNdW01HQV9OUl9URVhfUkVHSU9OUyArIDFdOworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W01HQV9OUl9URVhfSEVBUFNdW01HQV9OUl9URVhfUkVHSU9OUyArIDFdOwogCXVuc2lnbmVkIGludCB0ZXhBZ2VbTUdBX05SX1RFWF9IRUFQU107CiAKIAkvKiBNZWNoYW5pc20gdG8gdmFsaWRhdGUgY2FyZCBzdGF0ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKaW5kZXggYmU0OWRiYi4uNTU3MjkzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KTsKK3N0YXRpYyBpbnQgbWdhX2RyaXZlcl9kZXZpY2VfaXNfYWdwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaWlkbGlzdFtdID0gewogCW1nYV9QQ0lfSURTCkBAIC0xMTgsNyArMTE4LDcgQEAKICAqIFxyZXR1cm5zCiAgKiBJZiB0aGUgZGV2aWNlIGlzIGEgUENJIEc0NTAsIHplcm8gaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgMiBpcyByZXR1cm5lZC4KICAqLwotc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3AoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBtZ2FfZHJpdmVyX2RldmljZV9pc19hZ3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJY29uc3Qgc3RydWN0IHBjaV9kZXYgKmNvbnN0IHBkZXYgPSBkZXYtPnBkZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKaW5kZXggNmIwYzUzMS4uNDkyNTNhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKQEAgLTY1LDcgKzY1LDcgQEAKIAlzdHJ1Y3QgZHJtX21nYV9mcmVlbGlzdCAqbmV4dDsKIAlzdHJ1Y3QgZHJtX21nYV9mcmVlbGlzdCAqcHJldjsKIAlkcm1fbWdhX2FnZV90IGFnZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogfSBkcm1fbWdhX2ZyZWVsaXN0X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTE1NywxMCArMTU3LDEwIEBACiBleHRlcm4gaW50IG1nYV9kbWFfZmx1c2goRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBtZ2FfZG1hX3Jlc2V0KERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiBpbnQgbWdhX2RtYV9idWZmZXJzKERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgbWdhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBpbnQgbWdhX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IG1nYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IG1nYV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgbWdhX2RyaXZlcl9kbWFfcXVpZXNjZW50KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogZXh0ZXJuIGludCBtZ2FfZG9fd2FpdF9mb3JfaWRsZShkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIApAQCAtMTY4LDcgKzE2OCw3IEBACiBleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfc3RhcnQoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiBleHRlcm4gdm9pZCBtZ2FfZG9fZG1hX3dyYXBfZW5kKGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogCi1leHRlcm4gaW50IG1nYV9mcmVlbGlzdF9wdXQoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpOworZXh0ZXJuIGludCBtZ2FfZnJlZWxpc3RfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1Zik7CiAKIAkJCQkvKiBtZ2Ffd2FycC5jICovCiBleHRlcm4gdW5zaWduZWQgaW50IG1nYV93YXJwX21pY3JvY29kZV9zaXplKGNvbnN0IGRybV9tZ2FfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwpAQCAtMTc2LDEyICsxNzYsMTIgQEAKIGV4dGVybiBpbnQgbWdhX3dhcnBfaW5pdChkcm1fbWdhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIAogCQkJCS8qIG1nYV9pcnEuYyAqLwotZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKLWV4dGVybiBpbnQgbWdhX2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOworZXh0ZXJuIGludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBtZ2FfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIG1nYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gbG9uZyBtZ2FfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfaXJxLmMKaW5kZXggZWI5NjQ0MC4uOTMwMmNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfaXJxLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogaXJxcmV0dXJuX3QgbWdhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgc3RhdHVzOwogCWludCBoYW5kbGVkID0gMDsKQEAgLTc4LDcgKzc4LDcgQEAKIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKLWludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCBtZ2FfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQogewogCXVuc2lnbmVkIGludCBjdXJfdmJsYW5rOwogCWludCByZXQgPSAwOwpAQCAtOTYsNyArOTYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBtZ2FfZHJpdmVyX2ZlbmNlX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IG1nYV9kcml2ZXJfZmVuY2Vfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgY3VyX2ZlbmNlOwpAQCAtMTE1LDcgKzExNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX21nYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJTUdBX1dSSVRFKE1HQV9JQ0xFQVIsIH4wKTsKIH0KIAotdm9pZCBtZ2FfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIG1nYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAlNR0FfV1JJVEUoTUdBX0lFTiwgTUdBX1ZMSU5FSUVOIHwgTUdBX1NPRlRSQVBFTik7CiB9CiAKLXZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgbWdhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fbWdhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWlmICghZGV2X3ByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwppbmRleCAyODM3ZTY2Li5kNDQ4YjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZCBtZ2FfZW1pdF9jbGlwX3JlY3QoZHJtX21nYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgICBkcm1fY2xpcF9yZWN0X3QgKiBib3gpCisJCQkgICAgICAgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBib3gpCiB7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CkBAIC00ODAsMTIgKzQ4MCwxMiBAQAogICoKICAqLwogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21nYV9jbGVhcl90ICogY2xlYXIpCitzdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2NsZWFyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX2NsZWFyX3QgKiBjbGVhcikKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9tZ2Ffc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9tZ2FfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwogCWludCBpOwogCURNQV9MT0NBTFM7CkBAIC01MDAsNyArNTAwLDcgQEAKIAlBRFZBTkNFX0RNQSgpOwogCiAJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgewotCQlkcm1fY2xpcF9yZWN0X3QgKmJveCA9ICZwYm94W2ldOworCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqYm94ID0gJnBib3hbaV07CiAJCXUzMiBoZWlnaHQgPSBib3gtPnkyIC0gYm94LT55MTsKIAogCQlEUk1fREVCVUcoIiAgIGZyb209JWQsJWQgdG89JWQsJWRcbiIsCkBAIC01NjgsMTIgKzU2OCwxMiBAQAogCUZMVVNIX0RNQSgpOwogfQogCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX21nYV9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJaW50IGk7CiAJRE1BX0xPQ0FMUzsKQEAgLTU5OCw3ICs1OTgsNyBAQAogCQkgIE1HQV9QTE5XVCwgMHhmZmZmZmZmZiwgTUdBX0RXR0NUTCwgTUdBX0RXR0NUTF9DT1BZKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKLQkJZHJtX2NsaXBfcmVjdF90ICpib3ggPSAmcGJveFtpXTsKKwkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmJveCA9ICZwYm94W2ldOwogCQl1MzIgaGVpZ2h0ID0gYm94LT55MiAtIGJveC0+eTE7CiAJCXUzMiBzdGFydCA9IGJveC0+eTEgKiBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2g7CiAKQEAgLTYyMiw3ICs2MjIsNyBAQAogCURSTV9ERUJVRygiJXMuLi4gZG9uZS5cbiIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLXN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKQorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9tZ2FfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC02NjksNyArNjY5LDcgQEAKIAlGTFVTSF9ETUEoKTsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbmRpY2VzKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmLAorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbmRpY2VzKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzE4LDcgKzcxOCw3IEBACiAvKiBUaGlzIGNvcGllcyBhIDY0IGJ5dGUgYWxpZ25lZCBhZ3AgcmVnaW9uIHRvIHRoZSBmcmFtYnVmZmVyIHdpdGggYQogICogc3RhbmRhcmQgYmxpdCwgdGhlIGlvY3RsIG5lZWRzIHRvIGRvIGNoZWNraW5nLgogICovCi1zdGF0aWMgdm9pZCBtZ2FfZG1hX2Rpc3BhdGNoX2lsb2FkKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmLAorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9pbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYsCiAJCQkJICAgdW5zaWduZWQgaW50IGRzdG9yZywgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNzY2LDEyICs3NjYsMTIgQEAKIAlGTFVTSF9ETUEoKTsKIH0KIAotc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9ibGl0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX21nYV9ibGl0X3QgKiBibGl0KQorc3RhdGljIHZvaWQgbWdhX2RtYV9kaXNwYXRjaF9ibGl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fbWdhX2JsaXRfdCAqIGJsaXQpCiB7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fbWdhX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fbWdhX2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKIAl1MzIgc2NhbmRpciA9IDAsIGk7CiAJRE1BX0xPQ0FMUzsKQEAgLTg4MCw4ICs4ODAsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX21nYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fbWdhX3ZlcnRleF90IHZlcnRleDsKIApAQCAtOTIwLDggKzkyMCw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fbWdhX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9tZ2FfaW5kaWNlc190IGluZGljZXM7CiAKQEAgLTk1OSw5ICs5NTksOSBAQAogc3RhdGljIGludCBtZ2FfZG1hX2lsb2FkKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fbWdhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX21nYV9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fbWdhX2lsb2FkX3QgaWxvYWQ7CiAJRFJNX0RFQlVHKCJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCmluZGV4IDEwMTQ2MDIuLmIxNjNlZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiB9OwogCi1zdGF0aWMgaW50IFIxMjhfUkVBRF9QTEwoZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWRkcikKK3N0YXRpYyBpbnQgUjEyOF9SRUFEX1BMTChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGFkZHIpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiAvKiBSZXNldCB0aGUgZW5naW5lLiAgVGhpcyB3aWxsIHN0b3AgdGhlIENDRSBpZiBpdCBpcyBydW5uaW5nLgogICovCi1zdGF0aWMgaW50IHIxMjhfZG9fZW5naW5lX3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9kb19lbmdpbmVfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGNsb2NrX2NudGxfaW5kZXgsIG1jbGtfY250bCwgZ2VuX3Jlc2V0X2NudGw7CkBAIC0zMDgsNyArMzA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfaW5pdF9yaW5nX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCByMTI4X2NjZV9pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgIGRybV9yMTI4X3ByaXZhdGVfdCAqIGRldl9wcml2KQogewogCXUzMiByaW5nX3N0YXJ0OwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJUjEyOF9XUklURShSMTI4X0JVU19DTlRMLCB0bXApOwogfQogCi1zdGF0aWMgaW50IHIxMjhfZG9faW5pdF9jY2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fcjEyOF9pbml0X3QgKiBpbml0KQorc3RhdGljIGludCByMTI4X2RvX2luaXRfY2NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fcjEyOF9pbml0X3QgKiBpbml0KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAKQEAgLTQ1Niw4ICs0NTYsNyBAQAogCWRldl9wcml2LT5zcGFuX3BpdGNoX29mZnNldF9jID0gKCgoZGV2X3ByaXYtPmRlcHRoX3BpdGNoIC8gOCkgPDwgMjEpIHwKIAkJCQkJIChkZXZfcHJpdi0+c3Bhbl9vZmZzZXQgPj4gNSkpOwogCi0JRFJNX0dFVFNBUkVBKCk7Ci0KKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwpAQCAtNTg1LDcgKzU4NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByMTI4X2RvX2NsZWFudXBfY2NlKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCByMTI4X2RvX2NsZWFudXBfY2NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCiAJLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB0aGUgdW5pbnN0YWxsIGlvY3RsCkBAIC03NzAsMTEgKzc2OSwxMSBAQAogI2RlZmluZSBSMTI4X0JVRkZFUl9GUkVFCTAKIAogI2lmIDAKLXN0YXRpYyBpbnQgcjEyOF9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcjEyOF9mcmVlbGlzdF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fcjEyOF9mcmVlbGlzdF90ICplbnRyeTsKIAlpbnQgaTsKQEAgLTgxNiwxMiArODE1LDEyIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGRybV9idWZfdCAqcjEyOF9mcmVlbGlzdF9nZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHN0cnVjdCBkcm1fYnVmICpyMTI4X2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGksIHQ7CiAKIAkvKiBGSVhNRTogT3B0aW1pemUgLS0gdXNlIGZyZWVsaXN0IGNvZGUgKi8KQEAgLTg1NCwxMyArODUzLDEzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgcjEyOF9mcmVlbGlzdF9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZnJlZWxpc3RfcmVzZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkbWEtPmJ1Zl9jb3VudDsgaSsrKSB7Ci0JCWRybV9idWZfdCAqYnVmID0gZG1hLT5idWZsaXN0W2ldOworCQlzdHJ1Y3QgZHJtX2J1ZiAqYnVmID0gZG1hLT5idWZsaXN0W2ldOwogCQlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAJCWJ1Zl9wcml2LT5hZ2UgPSAwOwogCX0KQEAgLTg4NywxMCArODg2LDEwIEBACiAJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwogfQogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgZHJtX2RldmljZV90ICogZGV2LCBkcm1fZG1hX3QgKiBkKQorc3RhdGljIGludCByMTI4X2NjZV9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2RtYSAqIGQpCiB7CiAJaW50IGk7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAogCWZvciAoaSA9IGQtPmdyYW50ZWRfY291bnQ7IGkgPCBkLT5yZXF1ZXN0X2NvdW50OyBpKyspIHsKIAkJYnVmID0gcjEyOF9mcmVlbGlzdF9nZXQoZGV2KTsKQEAgLTkxNCwxMCArOTEzLDEwIEBACiBpbnQgcjEyOF9jY2VfYnVmZmVycyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJaW50IHJldCA9IDA7Ci0JZHJtX2RtYV90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7Ci0JZHJtX2RtYV90IGQ7CisJc3RydWN0IGRybV9kbWEgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlzdHJ1Y3QgZHJtX2RtYSBkOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcm0uaAppbmRleCA2ZThhZjMxLi5lOTRhMzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2RybS5oCkBAIC0xNTMsNyArMTUzLDcgQEAKIAogCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KIAkgKi8KLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbUjEyOF9OUl9TQVJFQV9DTElQUkVDVFNdOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IGJveGVzW1IxMjhfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAl1bnNpZ25lZCBpbnQgbmJveDsKIAogCS8qIENvdW50ZXJzIGZvciBjbGllbnQtc2lkZSB0aHJvdHRsaW5nIG9mIHJlbmRlcmluZyBjbGllbnRzLgpAQCAtMTYxLDcgKzE2MSw3IEBACiAJdW5zaWduZWQgaW50IGxhc3RfZnJhbWU7CiAJdW5zaWduZWQgaW50IGxhc3RfZGlzcGF0Y2g7CiAKLQlkcm1fdGV4X3JlZ2lvbl90IHRleF9saXN0W1IxMjhfTlJfVEVYX0hFQVBTXVtSMTI4X05SX1RFWF9SRUdJT05TICsgMV07CisJc3RydWN0IGRybV90ZXhfcmVnaW9uIHRleF9saXN0W1IxMjhfTlJfVEVYX0hFQVBTXVtSMTI4X05SX1RFWF9SRUdJT05TICsgMV07CiAJdW5zaWduZWQgaW50IHRleF9hZ2VbUjEyOF9OUl9URVhfSEVBUFNdOwogCWludCBjdHhfb3duZXI7CiAJaW50IHBmQWxsb3dQYWdlRmxpcDsJLyogbnVtYmVyIG9mIDNkIHdpbmRvd3MgKDAsMSwyIG9yIG1vcmUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKaW5kZXggOTA4NjgzNS4uNzIyNDlmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaApAQCAtNTcsNyArNTcsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCB7CiAJdW5zaWduZWQgaW50IGFnZTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCXN0cnVjdCBkcm1fcjEyOF9mcmVlbGlzdCAqbmV4dDsKIAlzdHJ1Y3QgZHJtX3IxMjhfZnJlZWxpc3QgKnByZXY7CiB9IGRybV9yMTI4X2ZyZWVsaXN0X3Q7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAlkcm1fbG9jYWxfbWFwX3QgKmNjZV9yaW5nOwogCWRybV9sb2NhbF9tYXBfdCAqcmluZ19ycHRyOwogCWRybV9sb2NhbF9tYXBfdCAqYWdwX3RleHR1cmVzOwotCWRybV9hdGlfcGNpZ2FydF9pbmZvIGdhcnRfaW5mbzsKKwlzdHJ1Y3QgZHJtX2F0aV9wY2lnYXJ0X2luZm8gZ2FydF9pbmZvOwogfSBkcm1fcjEyOF9wcml2YXRlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IGRybV9yMTI4X2J1Zl9wcml2IHsKQEAgLTE0MiwyMSArMTQyLDIxIEBACiBleHRlcm4gaW50IHIxMjhfZnVsbHNjcmVlbihEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IHIxMjhfY2NlX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpOwogCi1leHRlcm4gdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCByMTI4X2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogZXh0ZXJuIGludCByMTI4X3dhaXRfcmluZyhkcm1fcjEyOF9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IG4pOwogCiBleHRlcm4gaW50IHIxMjhfZG9fY2NlX2lkbGUoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwotZXh0ZXJuIGludCByMTI4X2RvX2NsZWFudXBfY2NlKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IHIxMjhfZG9fY2xlYW51cF9jY2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCi1leHRlcm4gaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IHIxMjhfZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKTsKIAogZXh0ZXJuIGlycXJldHVybl90IHIxMjhfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByMTI4X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHIxMjhfZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiB2b2lkIHIxMjhfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCByMTI4X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKIAogZXh0ZXJuIGxvbmcgcjEyOF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaXJxLmMKaW5kZXggODdmOGNhMi4uYzc2ZmRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9pcnEuYwpAQCAtMzcsNyArMzcsNyBAQAogCiBpcnFyZXR1cm5fdCByMTI4X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yMTI4X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCBzdGF0dXM7CiAKQEAgLTU0LDcgKzU0LDcgQEAKIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKLWludCByMTI4X2RyaXZlcl92Ymxhbmtfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCitpbnQgcjEyOF9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CiAJaW50IHJldCA9IDA7CkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCByMTI4X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHIxMjhfZHJpdmVyX2lycV9wcmVpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3IxMjhfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAlSMTI4X1dSSVRFKFIxMjhfR0VOX0lOVF9TVEFUVVMsIFIxMjhfQ1JUQ19WQkxBTktfSU5UX0FLKTsKIH0KIAotdm9pZCByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByMTI4X2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fcjEyOF9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtOTAsNyArOTAsNyBAQAogCVIxMjhfV1JJVEUoUjEyOF9HRU5fSU5UX0NOVEwsIFIxMjhfQ1JUQ19WQkxBTktfSU5UX0VOKTsKIH0KIAotdm9pZCByMTI4X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcjEyOF9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yMTI4X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWlmICghZGV2X3ByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCmluZGV4IDE3YjExZTcuLjdiMzM0ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jCkBAIC0zOCw3ICszOCw3IEBACiAgKi8KIAogc3RhdGljIHZvaWQgcjEyOF9lbWl0X2NsaXBfcmVjdHMoZHJtX3IxMjhfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJIGRybV9jbGlwX3JlY3RfdCAqIGJveGVzLCBpbnQgY291bnQpCisJCQkJIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogYm94ZXMsIGludCBjb3VudCkKIHsKIAl1MzIgYXV4X3NjX2NudGwgPSAweDAwMDAwMDAwOwogCVJJTkdfTE9DQUxTOwpAQCAtMzUyLDEzICszNTIsMTMgQEAKIAkJIChmbGFncyAmIFIxMjhfUkVRVUlSRV9RVUlFU0NFTkNFKSA/ICJxdWllc2NlbmNlLCAiIDogIiIpOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9jbGVhcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgZHJtX3IxMjhfY2xlYXJfdCAqIGNsZWFyKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbGVhci0+ZmxhZ3M7CiAJaW50IGk7CiAJUklOR19MT0NBTFM7CkBAIC00NTgsMTIgKzQ1OCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Ci0JZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKIAlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNTI0LDcgKzUyNCw3IEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCitzdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTYzNyw4ICs2MzcsOCBAQAogCXNhcmVhX3ByaXYtPm5ib3ggPSAwOwogfQogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9pbmRpcmVjdChkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICAgIGRybV9idWZfdCAqIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKQorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaXJlY3Qoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkcm1fYnVmICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwpAQCAtNjkyLDggKzY5Miw4IEBACiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2grKzsKIH0KIAotc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaWNlcyhkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICAgZHJtX2J1Zl90ICogYnVmLAorc3RhdGljIHZvaWQgcjEyOF9jY2VfZGlzcGF0Y2hfaW5kaWNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZiwKIAkJCQkgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBjb3VudCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTc3NywxMSArNzc3LDExIEBACiB9CiAKIHN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfYmxpdChEUk1GSUxFIGZpbHAsCi0JCQkJICBkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9yMTI4X2JsaXRfdCAqIGJsaXQpCisJCQkJICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3IxMjhfYmxpdF90ICogYmxpdCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3IxMjhfYnVmX3ByaXZfdCAqYnVmX3ByaXY7CiAJdTMyICpkYXRhOwogCWludCBkd29yZF9zaGlmdCwgZHdvcmRzOwpAQCAtODg3LDcgKzg4Nyw3IEBACiAgKiBoYXZlIGhhcmR3YXJlIHN0ZW5jaWwgc3VwcG9ydC4KICAqLwogCi1zdGF0aWMgaW50IHIxMjhfY2NlX2Rpc3BhdGNoX3dyaXRlX3NwYW4oZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9zcGFuKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCQlkcm1fcjEyOF9kZXB0aF90ICogZGVwdGgpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC05ODMsNyArOTgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9waXhlbHMoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF93cml0ZV9waXhlbHMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJCSAgZHJtX3IxMjhfZGVwdGhfdCAqIGRlcHRoKQogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTEwNSw3ICsxMTA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3NwYW4oZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3NwYW4oc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgIGRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTExNDgsNyArMTE0OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcjEyOF9jY2VfZGlzcGF0Y2hfcmVhZF9waXhlbHMoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIGludCByMTI4X2NjZV9kaXNwYXRjaF9yZWFkX3BpeGVscyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkJIGRybV9yMTI4X2RlcHRoX3QgKiBkZXB0aCkKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEyMjAsNyArMTIyMCw3IEBACiAgKiBQb2x5Z29uIHN0aXBwbGUKICAqLwogCi1zdGF0aWMgdm9pZCByMTI4X2NjZV9kaXNwYXRjaF9zdGlwcGxlKGRybV9kZXZpY2VfdCAqIGRldiwgdTMyICogc3RpcHBsZSkKK3N0YXRpYyB2b2lkIHIxMjhfY2NlX2Rpc3BhdGNoX3N0aXBwbGUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHUzMiAqIHN0aXBwbGUpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfZG9faW5pdF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHIxMjhfZG9faW5pdF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xMjg4LDcgKzEyODgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHIxMjhfZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHIxMjhfZG9fY2xlYW51cF9wYWdlZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xMzU0LDggKzEzNTQsOCBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWRybV9yMTI4X2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwogCWRybV9yMTI4X3ZlcnRleF90IHZlcnRleDsKIApAQCAtMTQxMyw4ICsxNDEzLDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fcjEyOF9pbmRpY2VzX3QgZWx0czsKIAlpbnQgY291bnQ7CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogc3RhdGljIGludCByMTI4X2NjZV9ibGl0KERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcjEyOF9ibGl0X3QgYmxpdDsKIAlpbnQgcmV0OwpAQCAtMTU3MSw4ICsxNTcxLDggQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcjEyOF9idWZfcHJpdl90ICpidWZfcHJpdjsKIAlkcm1fcjEyOF9pbmRpcmVjdF90IGluZGlyZWN0OwogI2lmIDAKQEAgLTE2NzUsNyArMTY3NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcjEyOF9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApCit2b2lkIHIxMjhfZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBEUk1GSUxFIGZpbHApCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNjg1LDcgKzE2ODUsNyBAQAogCX0KIH0KIAotdm9pZCByMTI4X2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByMTI4X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJcjEyOF9kb19jbGVhbnVwX2NjZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCmluZGV4IDAzMmEwMjIuLjRlNWFjYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9jbWRidWYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKQEAgLTU1LDcgKzU1LDcgQEAKIHN0YXRpYyBpbnQgcjMwMF9lbWl0X2NsaXByZWN0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCiAJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsIGludCBuKQogewotCWRybV9jbGlwX3JlY3RfdCBib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94OwogCWludCBucjsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTE0OCwxNSArMTQ4LDE2IEBACiAKIAkvKiB0aGVzZSBtYXRjaCBjbWR1Y3MoKSBjb21tYW5kIGluIHIzMDBfZHJpdmVyL3IzMDAvcjMwMF9jbWRidWYuYyAqLwogCUFERF9SQU5HRShSMzAwX1NFX1ZQT1JUX1hTQ0FMRSwgNik7Ci0JQUREX1JBTkdFKDB4MjA4MCwgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX0NOVEwsIDEpOwogCUFERF9SQU5HRShSMzAwX1NFX1ZURV9DTlRMLCAyKTsKIAlBRERfUkFOR0UoMHgyMTM0LCAyKTsKLQlBRERfUkFOR0UoMHgyMTQwLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9WQVBfQ05UTF9TVEFUVVMsIDEpOwogCUFERF9SQU5HRShSMzAwX1ZBUF9JTlBVVF9DTlRMXzAsIDIpOwogCUFERF9SQU5HRSgweDIxREMsIDEpOwotCUFERF9SQU5HRSgweDIyMUMsIDEpOwotCUFERF9SQU5HRSgweDIyMjAsIDQpOwotCUFERF9SQU5HRSgweDIyODgsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9VTktOT1dOXzIyMUMsIDEpOworCUFERF9SQU5HRShSMzAwX1ZBUF9DTElQX1hfMCwgNCk7CisJQUREX1JBTkdFKFIzMDBfVkFQX1BWU19XQUlUSURMRSwgMSk7CisJQUREX1JBTkdFKFIzMDBfVkFQX1VOS05PV05fMjI4OCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzAsIDIpOwogCUFERF9SQU5HRShSMzAwX1ZBUF9QVlNfQ05UTF8xLCAzKTsKIAlBRERfUkFOR0UoUjMwMF9HQl9FTkFCTEUsIDEpOwpAQCAtMTY4LDEzICsxNjksMTMgQEAKIAlBRERfUkFOR0UoUjMwMF9SRV9QT0lOVFNJWkUsIDEpOwogCUFERF9SQU5HRSgweDQyMzAsIDMpOwogCUFERF9SQU5HRShSMzAwX1JFX0xJTkVfQ05ULCAxKTsKLQlBRERfUkFOR0UoMHg0MjM4LCAxKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9VTks0MjM4LCAxKTsKIAlBRERfUkFOR0UoMHg0MjYwLCAzKTsKLQlBRERfUkFOR0UoMHg0Mjc0LCA0KTsKLQlBRERfUkFOR0UoMHg0Mjg4LCA1KTsKLQlBRERfUkFOR0UoMHg0MkEwLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9SRV9TSEFERSwgNCk7CisJQUREX1JBTkdFKFIzMDBfUkVfUE9MWUdPTl9NT0RFLCA1KTsKKwlBRERfUkFOR0UoUjMwMF9SRV9aQklBU19DTlRMLCAxKTsKIAlBRERfUkFOR0UoUjMwMF9SRV9aQklBU19UX0ZBQ1RPUiwgNCk7Ci0JQUREX1JBTkdFKDB4NDJCNCwgMSk7CisJQUREX1JBTkdFKFIzMDBfUkVfT0NDTFVTSU9OX0NOVEwsIDEpOwogCUFERF9SQU5HRShSMzAwX1JFX0NVTExfQ05UTCwgMSk7CiAJQUREX1JBTkdFKDB4NDJDMCwgMik7CiAJQUREX1JBTkdFKFIzMDBfUlNfQ05UTF8wLCAyKTsKQEAgLTE5MCwyMiArMTkxLDIyIEBACiAJQUREX1JBTkdFKFIzMDBfUEZTX0lOU1RSMV8wLCA2NCk7CiAJQUREX1JBTkdFKFIzMDBfUEZTX0lOU1RSMl8wLCA2NCk7CiAJQUREX1JBTkdFKFIzMDBfUEZTX0lOU1RSM18wLCA2NCk7Ci0JQUREX1JBTkdFKDB4NEJDMCwgMSk7Ci0JQUREX1JBTkdFKDB4NEJDOCwgMyk7CisJQUREX1JBTkdFKFIzMDBfUkVfRk9HX1NUQVRFLCAxKTsKKwlBRERfUkFOR0UoUjMwMF9GT0dfQ09MT1JfUiwgMyk7CiAJQUREX1JBTkdFKFIzMDBfUFBfQUxQSEFfVEVTVCwgMik7CiAJQUREX1JBTkdFKDB4NEJEOCwgMSk7CiAJQUREX1JBTkdFKFIzMDBfUEZTX1BBUkFNXzBfWCwgNjQpOwogCUFERF9SQU5HRSgweDRFMDAsIDEpOwogCUFERF9SQU5HRShSMzAwX1JCM0RfQ0JMRU5ELCAyKTsKIAlBRERfUkFOR0UoUjMwMF9SQjNEX0NPTE9STUFTSywgMSk7Ci0JQUREX1JBTkdFKDB4NEUxMCwgMyk7CisJQUREX1JBTkdFKFIzMDBfUkIzRF9CTEVORF9DT0xPUiwgMyk7CiAJQUREX1JBTkdFX01BUksoUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMCwgMSwgTUFSS19DSEVDS19PRkZTRVQpOwkvKiBjaGVjayBvZmZzZXQgKi8KIAlBRERfUkFOR0UoUjMwMF9SQjNEX0NPTE9SUElUQ0gwLCAxKTsKIAlBRERfUkFOR0UoMHg0RTUwLCA5KTsKIAlBRERfUkFOR0UoMHg0RTg4LCAxKTsKIAlBRERfUkFOR0UoMHg0RUEwLCAyKTsKIAlBRERfUkFOR0UoUjMwMF9SQjNEX1pTVEVOQ0lMX0NOVExfMCwgMyk7Ci0JQUREX1JBTkdFKDB4NEYxMCwgNCk7CisJQUREX1JBTkdFKFIzMDBfUkIzRF9aU1RFTkNJTF9GT1JNQVQsIDQpOwogCUFERF9SQU5HRV9NQVJLKFIzMDBfUkIzRF9ERVBUSE9GRlNFVCwgMSwgTUFSS19DSEVDS19PRkZTRVQpOwkvKiBjaGVjayBvZmZzZXQgKi8KIAlBRERfUkFOR0UoUjMwMF9SQjNEX0RFUFRIUElUQ0gsIDEpOwogCUFERF9SQU5HRSgweDRGMjgsIDEpOwpAQCAtMjI0LDcgKzIyNSw3IEBACiAJQUREX1JBTkdFKFIzMDBfVFhfQk9SREVSX0NPTE9SXzAsIDE2KTsKIAogCS8qIFNwb3JhZGljIHJlZ2lzdGVycyB1c2VkIGFzIHByaW1pdGl2ZXMgYXJlIGVtaXR0ZWQgKi8KLQlBRERfUkFOR0UoMHg0ZjE4LCAxKTsKKwlBRERfUkFOR0UoUjMwMF9SQjNEX1pDQUNIRV9DVExTVEFULCAxKTsKIAlBRERfUkFOR0UoUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVQsIDEpOwogCUFERF9SQU5HRShSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzAsIDgpOwogCUFERF9SQU5HRShSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzAsIDgpOwpAQCAtNjkyLDkgKzY5Myw5IEBACiAKIAlCRUdJTl9SSU5HKDYpOwogCU9VVF9SSU5HKENQX1BBQ0tFVDAoUjMwMF9SQjNEX0RTVENBQ0hFX0NUTFNUQVQsIDApKTsKLQlPVVRfUklORygweGEpOwotCU9VVF9SSU5HKENQX1BBQ0tFVDAoMHg0ZjE4LCAwKSk7Ci0JT1VUX1JJTkcoMHgzKTsKKwlPVVRfUklORyhSMzAwX1JCM0RfRFNUQ0FDSEVfVU5LTk9XTl8wQSk7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMChSMzAwX1JCM0RfWkNBQ0hFX0NUTFNUQVQsIDApKTsKKwlPVVRfUklORyhSMzAwX1JCM0RfWkNBQ0hFX1VOS05PV05fMDMpOwogCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OX0NQX05PUCwgMCkpOwogCU9VVF9SSU5HKDB4MCk7CiAJQURWQU5DRV9SSU5HKCk7CkBAIC03MDUsNyArNzA2LDcgQEAKICAqIFRoZSBhY3R1YWwgYWdlIGVtaXQgaXMgZG9uZSBieSByMzAwX2RvX2NwX2NtZGJ1Ziwgd2hpY2ggaXMgd2h5IHlvdSBtdXN0CiAgKiBiZSBjYXJlZnVsIGFib3V0IGhvdyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAqLwotc3RhdGljIHZvaWQgcjMwMF9kaXNjYXJkX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyB2b2lkIHIzMDBfZGlzY2FyZF9idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CkBAIC03NjYsOCArNzY3LDggQEAKIAl9CiAJCiAJQkVHSU5fUklORygyKTsKLQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TQ1JBVENIX1JFRzAgKyBoZWFkZXIuc2NyYXRjaC5yZWcgKiA0LCAwKSk7Ci0JT1VUX1JJTkcoZGV2X3ByaXYtPnNjcmF0Y2hfYWdlc1toZWFkZXIuc2NyYXRjaC5yZWddKTsKKwlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NDUkFUQ0hfUkVHMCArIGhlYWRlci5zY3JhdGNoLnJlZyAqIDQsIDAgKSApOworCU9VVF9SSU5HKCBkZXZfcHJpdi0+c2NyYXRjaF9hZ2VzW2hlYWRlci5zY3JhdGNoLnJlZ10gKTsKIAlBRFZBTkNFX1JJTkcoKTsKIAkKIAlyZXR1cm4gMDsKQEAgLTc3OCwxNCArNzc5LDE0IEBACiAgKiBjb21tYW5kcyBvbiB0aGUgRE1BIHJpbmcgYnVmZmVyLgogICogQ2FsbGVkIGJ5IHRoZSBpb2N0bCBoYW5kbGVyIGZ1bmN0aW9uIHJhZGVvbl9jcF9jbWRidWYuCiAgKi8KLWludCByMzAwX2RvX2NwX2NtZGJ1Zihkcm1fZGV2aWNlX3QgKmRldiwKK2ludCByMzAwX2RvX2NwX2NtZGJ1ZihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkgICAgICBEUk1GSUxFIGZpbHAsCi0JCSAgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJICAgICAgc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXYsCiAJCSAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWYgPSBOVUxMOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZiA9IE5VTEw7CiAJaW50IGVtaXRfZGlzcGF0Y2hfYWdlID0gMDsKIAlpbnQgcmV0ID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCmluZGV4IGVjZGE3NjAuLjNhZTU3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKQEAgLTQ3LDEyICs0NywxMiBAQAogIwlkZWZpbmUgUjMwMF9NQ19NSVNDX19NQ19HTE9CV19GVUxMX0xBVF9TSElGVAkyOAogCiAvKgotVGhpcyBmaWxlIGNvbnRhaW5zIHJlZ2lzdGVycyBhbmQgY29uc3RhbnRzIGZvciB0aGUgUjMwMC4gVGhleSBoYXZlIGJlZW4KLWZvdW5kIG1vc3RseSBieSBleGFtaW5pbmcgY29tbWFuZCBidWZmZXJzIGNhcHR1cmVkIHVzaW5nIGdseHRlc3QsIGFzIHdlbGwKLWFzIGJ5IGV4dHJhcG9sYXRpbmcgc29tZSBrbm93biByZWdpc3RlcnMgYW5kIGNvbnN0YW50cyBmcm9tIHRoZSBSMjAwLgotCi1JIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgdGhleSBhcmUgY29ycmVjdCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZSBpbiBjb21tZW50cy4KLSovCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXJzIGFuZCBjb25zdGFudHMgZm9yIHRoZSBSMzAwLiBUaGV5IGhhdmUgYmVlbgorICogZm91bmQgbW9zdGx5IGJ5IGV4YW1pbmluZyBjb21tYW5kIGJ1ZmZlcnMgY2FwdHVyZWQgdXNpbmcgZ2x4dGVzdCwgYXMgd2VsbAorICogYXMgYnkgZXh0cmFwb2xhdGluZyBzb21lIGtub3duIHJlZ2lzdGVycyBhbmQgY29uc3RhbnRzIGZyb20gdGhlIFIyMDAuCisgKiBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgdGhleSBhcmUgY29ycmVjdCB1bmxlc3Mgc3RhdGVkIG90aGVyd2lzZQorICogaW4gY29tbWVudHMuCisgKi8KIAogI2RlZmluZSBSMzAwX1NFX1ZQT1JUX1hTQ0FMRSAgICAgICAgICAgICAgICAweDFEOTgKICNkZWZpbmUgUjMwMF9TRV9WUE9SVF9YT0ZGU0VUICAgICAgICAgICAgICAgMHgxRDlDCkBAIC02MSw0OSArNjEsNjAgQEAKICNkZWZpbmUgUjMwMF9TRV9WUE9SVF9aU0NBTEUgICAgICAgICAgICAgICAgMHgxREE4CiAjZGVmaW5lIFIzMDBfU0VfVlBPUlRfWk9GRlNFVCAgICAgICAgICAgICAgIDB4MURBQwogCi0vKiBUaGlzIHJlZ2lzdGVyIGlzIHdyaXR0ZW4gZGlyZWN0bHkgYW5kIGFsc28gc3RhcnRzIGRhdGEgc2VjdGlvbiBpbiBtYW55IDNkIENQX1BBQ0tFVDMncyAqLworCisvKgorICogVmVydGV4IEFycmF5IFByb2Nlc3NpbmcgKFZBUCkgQ29udHJvbAorICogU3RvbGVuIGZyb20gcjIwMCBjb2RlIGZyb20gQ2hyaXN0b3BoIEJyaWxsIChJdCdzIGEgZ3Vlc3MhKQorICovCisjZGVmaW5lIFIzMDBfVkFQX0NOVEwJMHgyMDgwCisKKy8qIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdHRlbiBkaXJlY3RseSBhbmQgYWxzbyBzdGFydHMgZGF0YSBzZWN0aW9uCisgKiBpbiBtYW55IDNkIENQX1BBQ0tFVDMncworICovCiAjZGVmaW5lIFIzMDBfVkFQX1ZGX0NOVEwJMHgyMDg0CisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RZUEVfX1NISUZUICAgICAgICAgICAgICAwCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9OT05FICAgICAgICAgICAgICAgICAgICAgKDA8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9QT0lOVFMgICAgICAgICAgICAgICAgICAgKDE8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9MSU5FUyAgICAgICAgICAgICAgICAgICAgKDI8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9MSU5FX1NUUklQICAgICAgICAgICAgICAgKDM8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRVMgICAgICAgICAgICAgICAgKDQ8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9GQU4gICAgICAgICAgICAgKDU8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgKDY8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9MSU5FX0xPT1AgICAgICAgICAgICAgICAgKDEyPDwwKQorIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUVVBRFMgICAgICAgICAgICAgICAgICAgICgxMzw8MCkKKyMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1FVQURfU1RSSVAgICAgICAgICAgICAgICAoMTQ8PDApCisjCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9QT0xZR09OICAgICAgICAgICAgICAgICAgKDE1PDwwKQogCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1RZUEVfX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9OT05FCQkJCSAoMDw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1BPSU5UUwkJCQkgKDE8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9MSU5FUwkJCQkgKDI8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9MSU5FX1NUUklQCQkJICgzPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFJJQU5HTEVTCQkJICg0PDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFJJQU5HTEVfRkFOCQkJICg1PDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fVFJJQU5HTEVfU1RSSVAJCQkgKDY8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9MSU5FX0xPT1AJCQkgKDEyPDwwKQotIwlkZWZpbmUgIFIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fUVVBRFMJCQkgCSAoMTM8PDApCi0jCWRlZmluZSAgUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9RVUFEX1NUUklQCQkJICgxNDw8MCkKLSMJZGVmaW5lICBSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1BPTFlHT04JCQkgCSAoMTU8PDApCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfX1NISUZUICAgICAgICAgICAgICA0CisJLyogU3RhdGUgYmFzZWQgLSBkaXJlY3Qgd3JpdGVzIHRvIHJlZ2lzdGVycyB0cmlnZ2VyIHZlcnRleAorICAgICAgICAgICBnZW5lcmF0aW9uICovCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfU1RBVEVfQkFTRUQgICAgICAgICAoMDw8NCkKKyMJZGVmaW5lCVIzMDBfVkFQX1ZGX0NOVExfX1BSSU1fV0FMS19JTkRJQ0VTICAgICAgICAgICAgICgxPDw0KQorIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1ZFUlRFWF9MSVNUICAgICAgICAgKDI8PDQpCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUklNX1dBTEtfVkVSVEVYX0VNQkVEREVEICAgICAoMzw8NCkKIAotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgNAotCS8qIFN0YXRlIGJhc2VkIC0gZGlyZWN0IHdyaXRlcyB0byByZWdpc3RlcnMgdHJpZ2dlciB2ZXJ0ZXggZ2VuZXJhdGlvbiAqLwotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1NUQVRFX0JBU0VEICAgICAgICAgICAgICAgICAgICAgICgwPDw0KQotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX0lORElDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICgxPDw0KQotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1ZFUlRFWF9MSVNUICAgICAgICAgICAgICAgICAgICAgICgyPDw0KQotIwlkZWZpbmUJUjMwMF9WQVBfVkZfQ05UTF9fUFJJTV9XQUxLX1ZFUlRFWF9FTUJFRERFRCAgICAgICAgICAgICAgICAgICgzPDw0KQorCS8qIEkgZG9uJ3QgdGhpbmsgSSBzYXcgdGhlc2UgdGhyZWUgdXNlZC4uICovCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19DT0xPUl9PUkRFUl9fU0hJRlQgICAgICAgICAgICA2CisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19UQ0xfT1VUUFVUX0NUTF9FTkFfX1NISUZUICAgICA5CisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUk9HX1NUUkVBTV9FTkFfX1NISUZUICAgICAgICAxMAogCi0JCS8qIEkgZG9uJ3QgdGhpbmsgSSBzYXcgdGhlc2UgdGhyZWUgdXNlZC4uICovCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19DT0xPUl9PUkRFUl9fU0hJRlQgICAgICAgICAgICAgICAgICAgICA2Ci0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19UQ0xfT1VUUFVUX0NUTF9FTkFfX1NISUZUICAgICAgICAgICAgICA5Ci0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19QUk9HX1NUUkVBTV9FTkFfX1NISUZUICAgICAgICAgICAgICAgICAxMAotCi0JCS8qIGluZGV4IHNpemUgLSB3aGVuIG5vdCBzZXQgdGhlIGluZGljZXMgYXJlIGFzc3VtZWQgdG8gYmUgMTYgYml0ICovCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19JTkRFWF9TSVpFXzMyYml0ICAgICAgICAgICAgICAgICAgICAgICgxPDwxMSkKLQkJLyogbnVtYmVyIG9mIHZlcnRpY2VzICovCi0jCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19OVU1fVkVSVElDRVNfX1NISUZUICAgICAgICAgICAgICAgICAgICAxNgorCS8qIGluZGV4IHNpemUgLSB3aGVuIG5vdCBzZXQgdGhlIGluZGljZXMgYXJlIGFzc3VtZWQgdG8gYmUgMTYgYml0ICovCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19JTkRFWF9TSVpFXzMyYml0ICAgICAgICAgICAgICAoMTw8MTEpCisJLyogbnVtYmVyIG9mIHZlcnRpY2VzICovCisjCWRlZmluZQlSMzAwX1ZBUF9WRl9DTlRMX19OVU1fVkVSVElDRVNfX1NISUZUICAgICAgICAgICAxNgogCiAvKiBCRUdJTjogV2lsZCBndWVzc2VzICovCiAjZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzAgICAgICAgICAgIDB4MjA5MAogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fUE9TX1BSRVNFTlQgICAgICgxPDwwKQogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfUFJFU0VOVCAgICgxPDwxKQotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMV9QUkVTRU5UICgxPDwyKQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfMl9QUkVTRU5UICgxPDwzKQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfM19QUkVTRU5UICgxPDw0KQkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fUFRfU0laRV9QUkVTRU5UICgxPDwxNikJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX0NPTE9SXzFfUFJFU0VOVCAoMTw8MikgIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8wX19DT0xPUl8yX1BSRVNFTlQgKDE8PDMpICAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMF9fQ09MT1JfM19QUkVTRU5UICgxPDw0KSAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzBfX1BUX1NJWkVfUFJFU0VOVCAoMTw8MTYpIC8qIEdVRVNTICovCiAKICNkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMSAgICAgICAgICAgMHgyMDk0CisJLyogZWFjaCBvZiB0aGUgZm9sbG93aW5nIGlzIDMgYml0cyB3aWRlLCBzcGVjaWZpZXMgbnVtYmVyCisJICAgb2YgY29tcG9uZW50cyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzBfQ09NUF9DTlRfU0hJRlQgMAogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzFfQ09NUF9DTlRfU0hJRlQgMwogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzJfQ09NUF9DTlRfU0hJRlQgNgpAQCAtMTEyLDcgKzEyMyw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX1ZBUF9PVVRQVVRfVlRYX0ZNVF8xX19URVhfNV9DT01QX0NOVF9TSElGVCAxNQogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfT1VUUFVUX1ZUWF9GTVRfMV9fVEVYXzZfQ09NUF9DTlRfU0hJRlQgMTgKICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX09VVFBVVF9WVFhfRk1UXzFfX1RFWF83X0NPTVBfQ05UX1NISUZUIDIxCi0vKiBFTkQgKi8KKy8qIEVORDogV2lsZCBndWVzc2VzICovCiAKICNkZWZpbmUgUjMwMF9TRV9WVEVfQ05UTCAgICAgICAgICAgICAgICAgIDB4MjBiMAogIwlkZWZpbmUgICAgIFIzMDBfVlBPUlRfWF9TQ0FMRV9FTkEgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQpAQCAtMTI4LDQzICsxMzksNTQgQEAKICMJZGVmaW5lICAgICBSMzAwX1ZUWF9TVF9ERU5PUk1BTElaRUQgICAgICAgICAgICAgIDB4MDAwMDEwMDAKIAogLyogQkVHSU46IFZlcnRleCBkYXRhIGFzc2VtYmx5IC0gbG90cyBvZiB1bmNlcnRhaW50aWVzICovCi0vKiBnYXAgKi8KLS8qIFdoZXJlIGRvIHdlIGdldCBvdXIgdmVydGV4IGRhdGE/Ci0vLwotLy8gVmVydGV4IGRhdGEgZWl0aGVyIGNvbWVzIGVpdGhlciBmcm9tIGltbWVkaWF0ZSBtb2RlIHJlZ2lzdGVycyBvciBmcm9tCi0vLyB2ZXJ0ZXggYXJyYXlzLgotLy8gVGhlcmUgYXBwZWFycyB0byBiZSBubyBtaXhlZCBtb2RlICh0aG91Z2ggd2UgY2FuIGZvcmNlIHRoZSBwaXRjaCBvZgotLy8gdmVydGV4IGFycmF5cyB0byAwLCBlZmZlY3RpdmVseSByZXVzaW5nIHRoZSBzYW1lIGVsZW1lbnQgb3ZlciBhbmQgb3ZlcgotLy8gYWdhaW4pLgotLy8KLS8vIEltbWVkaWF0ZSBtb2RlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIElOUFVUX0NOVEwgcmVnaXN0ZXJzLiBJIGFtIG5vdCBzdXJlCi0vLyBpZiB0aGVzZSByZWdpc3RlcnMgaW5mbHVlbmNlIHZlcnRleCBhcnJheSBwcm9jZXNzaW5nLgotLy8KLS8vIFZlcnRleCBhcnJheXMgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSAzRF9MT0FEX1ZCUE5UUiBwYWNrZXQzLgotLy8KLS8vIEluIGJvdGggY2FzZXMsIHZlcnRleCBhdHRyaWJ1dGVzIGFyZSB0aGVuIHBhc3NlZCB0aHJvdWdoIElOUFVUX1JPVVRFLgogCi0vLyBCZWdpbm5pbmcgd2l0aCBJTlBVVF9ST1VURV8wXzAgaXMgYSBsaXN0IG9mIFdPUkRzIHRoYXQgcm91dGUgdmVydGV4IGRhdGEKLS8vIGludG8gdGhlIHZlcnRleCBwcm9jZXNzb3IncyBpbnB1dCByZWdpc3RlcnMuCi0vLyBUaGUgZmlyc3Qgd29yZCByb3V0ZXMgdGhlIGZpcnN0IGlucHV0LCB0aGUgc2Vjb25kIHdvcmQgdGhlIHNlY29uZCwgZXRjLgotLy8gVGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgaXMgcm91dGVkIGludG8gdGhlIHJlZ2lzdGVyIHdpdGggdGhlIGdpdmVuIGluZGV4LgotLy8gVGhlIGxpc3QgaXMgZW5kZWQgYnkgYSB3b3JkIHdpdGggSU5QVVRfUk9VVEVfRU5EIHNldC4KLS8vCi0vLyBBbHdheXMgc2V0IENPTVBPTkVOVFNfNCBpbiBpbW1lZGlhdGUgbW9kZS4gKi8KKy8qIGdhcCAqLworCisjZGVmaW5lIFIzMDBfVkFQX0NOVExfU1RBVFVTICAgICAgICAgICAgICAweDIxNDAKKyMJZGVmaW5lIFIzMDBfVkNfTk9fU1dBUCAgICAgICAgICAgICAgICAgICgwIDw8IDApCisjCWRlZmluZSBSMzAwX1ZDXzE2QklUX1NXQVAgICAgICAgICAgICAgICAoMSA8PCAwKQorIwlkZWZpbmUgUjMwMF9WQ18zMkJJVF9TV0FQICAgICAgICAgICAgICAgKDIgPDwgMCkKKyMJZGVmaW5lIFIzMDBfVkFQX1RDTF9CWVBBU1MJCSgxIDw8IDgpCisKKy8qIGdhcCAqLworCisvKiBXaGVyZSBkbyB3ZSBnZXQgb3VyIHZlcnRleCBkYXRhPworICoKKyAqIFZlcnRleCBkYXRhIGVpdGhlciBjb21lcyBlaXRoZXIgZnJvbSBpbW1lZGlhdGUgbW9kZSByZWdpc3RlcnMgb3IgZnJvbQorICogdmVydGV4IGFycmF5cy4KKyAqIFRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gbWl4ZWQgbW9kZSAodGhvdWdoIHdlIGNhbiBmb3JjZSB0aGUgcGl0Y2ggb2YKKyAqIHZlcnRleCBhcnJheXMgdG8gMCwgZWZmZWN0aXZlbHkgcmV1c2luZyB0aGUgc2FtZSBlbGVtZW50IG92ZXIgYW5kIG92ZXIKKyAqIGFnYWluKS4KKyAqCisgKiBJbW1lZGlhdGUgbW9kZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBJTlBVVF9DTlRMIHJlZ2lzdGVycy4gSSBhbSBub3Qgc3VyZQorICogaWYgdGhlc2UgcmVnaXN0ZXJzIGluZmx1ZW5jZSB2ZXJ0ZXggYXJyYXkgcHJvY2Vzc2luZy4KKyAqCisgKiBWZXJ0ZXggYXJyYXlzIGFyZSBjb250cm9sbGVkIHZpYSB0aGUgM0RfTE9BRF9WQlBOVFIgcGFja2V0My4KKyAqCisgKiBJbiBib3RoIGNhc2VzLCB2ZXJ0ZXggYXR0cmlidXRlcyBhcmUgdGhlbiBwYXNzZWQgdGhyb3VnaCBJTlBVVF9ST1VURS4KKyAqCisgKiBCZWdpbm5pbmcgd2l0aCBJTlBVVF9ST1VURV8wXzAgaXMgYSBsaXN0IG9mIFdPUkRzIHRoYXQgcm91dGUgdmVydGV4IGRhdGEKKyAqIGludG8gdGhlIHZlcnRleCBwcm9jZXNzb3IncyBpbnB1dCByZWdpc3RlcnMuCisgKiBUaGUgZmlyc3Qgd29yZCByb3V0ZXMgdGhlIGZpcnN0IGlucHV0LCB0aGUgc2Vjb25kIHdvcmQgdGhlIHNlY29uZCwgZXRjLgorICogVGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgaXMgcm91dGVkIGludG8gdGhlIHJlZ2lzdGVyIHdpdGggdGhlIGdpdmVuIGluZGV4LgorICogVGhlIGxpc3QgaXMgZW5kZWQgYnkgYSB3b3JkIHdpdGggSU5QVVRfUk9VVEVfRU5EIHNldC4KKyAqCisgKiBBbHdheXMgc2V0IENPTVBPTkVOVFNfNCBpbiBpbW1lZGlhdGUgbW9kZS4KKyAqLwogCiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMCAgICAgICAgICAgIDB4MjE1MAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzEgICAgICgwIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfMiAgICAgKDEgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU18zICAgICAoMiA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9DT01QT05FTlRTXzQgICAgICgzIDw8IDApCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX0NPTVBPTkVOVFNfUkdCQSAgKDQgPDwgMCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfQ09NUE9ORU5UU19SR0JBICAoNCA8PCAwKSAvKiBHVUVTUyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfSURYX1NISUZUICAgIDgKLSMgICAgICAgZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFX0lEWF9NQVNLICAgICAoMzEgPDwgOCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFX0lEWF9NQVNLICAgICAoMzEgPDwgOCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFX0VORCAgICAgICAgICAoMSA8PCAxMykKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfSU1NRURJQVRFX01PREUgICAoMCA8PCAxNCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRkxPQVQgICAgICAgICAgICAoMSA8PCAxNCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfVU5TSUdORURfQllURSAgICAoMiA8PCAxNCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRkxPQVRfQ09MT1IgICAgICAoMyA8PCAxNCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfSU1NRURJQVRFX01PREUgICAoMCA8PCAxNCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRkxPQVQgICAgICAgICAgICAoMSA8PCAxNCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfVU5TSUdORURfQllURSAgICAoMiA8PCAxNCkgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfRkxPQVRfQ09MT1IgICAgICAoMyA8PCAxNCkgLyogR1VFU1MgKi8KICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMF8xICAgICAgICAgICAgMHgyMTU0CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfMiAgICAgICAgICAgIDB4MjE1OAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzMgICAgICAgICAgICAweDIxNUMKQEAgLTE3NCwxMCArMTk2LDEyIEBACiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzBfNyAgICAgICAgICAgIDB4MjE2QwogCiAvKiBnYXAgKi8KKwogLyogTm90ZXM6Ci0vLyAgLSBhbHdheXMgc2V0IHVwIHRvIHByb2R1Y2UgYXQgbGVhc3QgdHdvIGF0dHJpYnV0ZXM6Ci0vLyAgICBpZiB2ZXJ0ZXggcHJvZ3JhbSB1c2VzIG9ubHkgcG9zaXRpb24sIGZnbHJ4IHdpbGwgc2V0IG5vcm1hbCwgdG9vCi0vLyAgLSBJTlBVVF9DTlRMXzBfQ09MT1IgYW5kIElOUFVUX0NOVExfQ09MT1IgYml0cyBhcmUgYWx3YXlzIGVxdWFsICovCisgKiAgLSBhbHdheXMgc2V0IHVwIHRvIHByb2R1Y2UgYXQgbGVhc3QgdHdvIGF0dHJpYnV0ZXM6CisgKiAgICBpZiB2ZXJ0ZXggcHJvZ3JhbSB1c2VzIG9ubHkgcG9zaXRpb24sIGZnbHJ4IHdpbGwgc2V0IG5vcm1hbCwgdG9vCisgKiAgLSBJTlBVVF9DTlRMXzBfQ09MT1IgYW5kIElOUFVUX0NOVExfQ09MT1IgYml0cyBhcmUgYWx3YXlzIGVxdWFsLgorICovCiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX0NOVExfMCAgICAgICAgICAgICAgIDB4MjE4MAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMXzBfQ09MT1IgICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfQ05UTF8xICAgICAgICAgICAgICAgMHgyMTg0CkBAIC0xODYsMjAgKzIxMCwyMiBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX0NPTE9SICAgICAgICAgICAgIDB4MDAwMDAwMDQKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzAgICAgICAgICAgICAgICAweDAwMDAwNDAwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEMxICAgICAgICAgICAgICAgMHgwMDAwMDgwMAotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMiAgICAgICAgICAgICAgIDB4MDAwMDEwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzMgICAgICAgICAgICAgICAweDAwMDAyMDAwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM0ICAgICAgICAgICAgICAgMHgwMDAwNDAwMAkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNSAgICAgICAgICAgICAgIDB4MDAwMDgwMDAJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzYgICAgICAgICAgICAgICAweDAwMDEwMDAwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM3ICAgICAgICAgICAgICAgMHgwMDAyMDAwMAkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDMiAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzMgICAgICAgICAgICAgICAweDAwMDAyMDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM0ICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9DTlRMX1RDNSAgICAgICAgICAgICAgIDB4MDAwMDgwMDAgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfQ05UTF9UQzYgICAgICAgICAgICAgICAweDAwMDEwMDAwIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX0NOVExfVEM3ICAgICAgICAgICAgICAgMHgwMDAyMDAwMCAvKiBHVUVTUyAqLwogCiAvKiBnYXAgKi8KKwogLyogV29yZHMgcGFyYWxsZWwgdG8gSU5QVVRfUk9VVEVfMDsgQWxsIHdvcmRzIHRoYXQgYXJlIGFjdGl2ZSBpbiBJTlBVVF9ST1VURV8wCi0vLyBhcmUgc2V0IHRvIGEgc3dpenpsaW5nIGJpdCBwYXR0ZXJuLCBvdGhlciB3b3JkcyBhcmUgMC4KLS8vCi0vLyBJbiBpbW1lZGlhdGUgbW9kZSwgdGhlIHBhdHRlcm4gaXMgYWx3YXlzIHNldCB0byB4eXp3LiBJbiB2ZXJ0ZXggYXJyYXkKLS8vIG1vZGUsIHRoZSBzd2l6emxpbmcgcGF0dGVybiBpcyBlLmcuIHVzZWQgdG8gc2V0IHp3IGNvbXBvbmVudHMgaW4gdGV4dHVyZQotLy8gY29vcmRpbmF0ZXMgd2l0aCBvbmx5IHR3ZW8gY29tcG9uZW50cy4gKi8KKyAqIGFyZSBzZXQgdG8gYSBzd2l6emxpbmcgYml0IHBhdHRlcm4sIG90aGVyIHdvcmRzIGFyZSAwLgorICoKKyAqIEluIGltbWVkaWF0ZSBtb2RlLCB0aGUgcGF0dGVybiBpcyBhbHdheXMgc2V0IHRvIHh5encuIEluIHZlcnRleCBhcnJheQorICogbW9kZSwgdGhlIHN3aXp6bGluZyBwYXR0ZXJuIGlzIGUuZy4gdXNlZCB0byBzZXQgencgY29tcG9uZW50cyBpbiB0ZXh0dXJlCisgKiBjb29yZGluYXRlcyB3aXRoIG9ubHkgdHdlbyBjb21wb25lbnRzLgorICovCiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMCAgICAgICAgICAgIDB4MjFFMAogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfWCAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9ZICAgIDEKQEAgLTIwOCwxMSArMjM0LDExIEBACiAjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1NFTEVDVF9aRVJPIDQKICMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfU0VMRUNUX09ORSAgNQogIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9TRUxFQ1RfTUFTSyA3Ci0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1hfU0hJRlQgICAgICAgICAgMAotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9ZX1NISUZUICAgICAgICAgIDMKLSMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWl9TSElGVCAgICAgICAgICA2Ci0jICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1dfU0hJRlQgICAgICAgICAgOQotIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9FTkFCTEUgICAgICAgICAgICgxNSA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfWF9TSElGVCAgICAgMAorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9ZX1NISUZUICAgICAzCisjICAgICAgIGRlZmluZSBSMzAwX0lOUFVUX1JPVVRFX1pfU0hJRlQgICAgIDYKKyMgICAgICAgZGVmaW5lIFIzMDBfSU5QVVRfUk9VVEVfV19TSElGVCAgICAgOQorIyAgICAgICBkZWZpbmUgUjMwMF9JTlBVVF9ST1VURV9FTkFCTEUgICAgICAoMTUgPDwgMTIpCiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfMSAgICAgICAgICAgIDB4MjFFNAogI2RlZmluZSBSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzIgICAgICAgICAgICAweDIxRTgKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV8zICAgICAgICAgICAgMHgyMUVDCkBAIC0yMjEsNzkgKzI0NywxMDcgQEAKICNkZWZpbmUgUjMwMF9WQVBfSU5QVVRfUk9VVEVfMV82ICAgICAgICAgICAgMHgyMUY4CiAjZGVmaW5lIFIzMDBfVkFQX0lOUFVUX1JPVVRFXzFfNyAgICAgICAgICAgIDB4MjFGQwogCi0vKiBFTkQgKi8KKy8qIEVORDogVmVydGV4IGRhdGEgYXNzZW1ibHkgKi8KIAogLyogZ2FwICovCi0vKiBCRUdJTjogVXBsb2FkIHZlcnRleCBwcm9ncmFtIGFuZCBkYXRhCi0vLyBUaGUgcHJvZ3JhbW1hYmxlIHZlcnRleCBzaGFkZXIgdW5pdCBoYXMgYSBtZW1vcnkgYmFuayBvZiB1bmtub3duIHNpemUKLS8vIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW4gMTYgYnl0ZSB1bml0cyBieSB3cml0aW5nIHRoZSBhZGRyZXNzIGludG8KLS8vIFVQTE9BRF9BRERSRVNTLCBmb2xsb3dlZCBieSBkYXRhIGluIFVQTE9BRF9EQVRBIChtdWx0aXBsZXMgb2YgNCBEV09SRHMpLgotLy8KLS8vIFBvaW50ZXJzIGludG8gdGhlIG1lbW9yeSBiYW5rIGFyZSBhbHdheXMgaW4gbXVsdGlwbGVzIG9mIDE2IGJ5dGVzLgotLy8KLS8vIFRoZSBtZW1vcnkgYmFuayBpcyBkaXZpZGVkIGludG8gYXJlYXMgd2l0aCBmaXhlZCBtZWFuaW5nLgotLy8KLS8vIFN0YXJ0aW5nIGF0IGFkZHJlc3MgVVBMT0FEX1BST0dSQU06IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9ucy4KLS8vIE5hdGl2ZSBsaW1pdHMgcmVwb3J0ZWQgYnkgZHJpdmVycyBmcm9tIEFUSSBzdWdnZXN0IHNpemUgMjU2IChpLmUuIDRLQiksCi0vLyB3aGVyZWFzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4ga25vd24gYWRkcmVzc2VzIHN1Z2dlc3RzIHNpemUgNTEyLgotLy8KLS8vIFN0YXJ0aW5nIGF0IGFkZHJlc3MgVVBMT0FEX1BBUkFNRVRFUlM6IFZlcnRleCBwcm9ncmFtIHBhcmFtZXRlcnMuCi0vLyBOYXRpdmUgcmVwb3J0ZWQgbGltaXRzIGFuZCB0aGUgVlBJIGxheW91dCBzdWdnZXN0IHNpemUgMjU2LCB3aGVyZWFzCi0vLyBkaWZmZXJlbmNlIGJldHdlZW4ga25vd24gYWRkcmVzc2VzIHN1Z2dlc3RzIHNpemUgNTEyLgotLy8KLS8vIEF0IGFkZHJlc3MgVVBMT0FEX1BPSU5UU0laRSBpcyBhIHZlY3RvciAoMCwgMCwgcHMsIDApLCB3aGVyZSBwcyBpcyB0aGUKLS8vIGZsb2F0aW5nIHBvaW50IHBvaW50c2l6ZS4gVGhlIGV4YWN0IHB1cnBvc2Ugb2YgdGhpcyBzdGF0ZSBpcyB1bmNlcnRhaW4sCi0vLyBhcyB0aGVyZSBpcyBhbHNvIHRoZSBSMzAwX1JFX1BPSU5UU0laRSByZWdpc3Rlci4KLS8vCi0vLyBNdWx0aXBsZSB2ZXJ0ZXggcHJvZ3JhbXMgYW5kIHBhcmFtZXRlciBzZXRzIGNhbiBiZSBsb2FkZWQgYXQgb25jZSwKLS8vIHdoaWNoIGNvdWxkIGV4cGxhaW4gdGhlIHNpemUgZGlzY3JlcGFuY3kuICovCisKKy8qIEJFR0lOOiBVcGxvYWQgdmVydGV4IHByb2dyYW0gYW5kIGRhdGEgKi8KKworLyoKKyAqIFRoZSBwcm9ncmFtbWFibGUgdmVydGV4IHNoYWRlciB1bml0IGhhcyBhIG1lbW9yeSBiYW5rIG9mIHVua25vd24gc2l6ZQorICogdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBpbiAxNiBieXRlIHVuaXRzIGJ5IHdyaXRpbmcgdGhlIGFkZHJlc3MgaW50bworICogVVBMT0FEX0FERFJFU1MsIGZvbGxvd2VkIGJ5IGRhdGEgaW4gVVBMT0FEX0RBVEEgKG11bHRpcGxlcyBvZiA0IERXT1JEcykuCisgKgorICogUG9pbnRlcnMgaW50byB0aGUgbWVtb3J5IGJhbmsgYXJlIGFsd2F5cyBpbiBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCisgKgorICogVGhlIG1lbW9yeSBiYW5rIGlzIGRpdmlkZWQgaW50byBhcmVhcyB3aXRoIGZpeGVkIG1lYW5pbmcuCisgKgorICogU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUFJPR1JBTTogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb25zLgorICogTmF0aXZlIGxpbWl0cyByZXBvcnRlZCBieSBkcml2ZXJzIGZyb20gQVRJIHN1Z2dlc3Qgc2l6ZSAyNTYgKGkuZS4gNEtCKSwKKyAqIHdoZXJlYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCisgKgorICogU3RhcnRpbmcgYXQgYWRkcmVzcyBVUExPQURfUEFSQU1FVEVSUzogVmVydGV4IHByb2dyYW0gcGFyYW1ldGVycy4KKyAqIE5hdGl2ZSByZXBvcnRlZCBsaW1pdHMgYW5kIHRoZSBWUEkgbGF5b3V0IHN1Z2dlc3Qgc2l6ZSAyNTYsIHdoZXJlYXMKKyAqIGRpZmZlcmVuY2UgYmV0d2VlbiBrbm93biBhZGRyZXNzZXMgc3VnZ2VzdHMgc2l6ZSA1MTIuCisgKgorICogQXQgYWRkcmVzcyBVUExPQURfUE9JTlRTSVpFIGlzIGEgdmVjdG9yICgwLCAwLCBwcywgMCksIHdoZXJlIHBzIGlzIHRoZQorICogZmxvYXRpbmcgcG9pbnQgcG9pbnRzaXplLiBUaGUgZXhhY3QgcHVycG9zZSBvZiB0aGlzIHN0YXRlIGlzIHVuY2VydGFpbiwKKyAqIGFzIHRoZXJlIGlzIGFsc28gdGhlIFIzMDBfUkVfUE9JTlRTSVpFIHJlZ2lzdGVyLgorICoKKyAqIE11bHRpcGxlIHZlcnRleCBwcm9ncmFtcyBhbmQgcGFyYW1ldGVyIHNldHMgY2FuIGJlIGxvYWRlZCBhdCBvbmNlLAorICogd2hpY2ggY291bGQgZXhwbGFpbiB0aGUgc2l6ZSBkaXNjcmVwYW5jeS4KKyAqLwogI2RlZmluZSBSMzAwX1ZBUF9QVlNfVVBMT0FEX0FERFJFU1MgICAgICAgICAweDIyMDAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX1VQTE9BRF9QUk9HUkFNICAgICAgICAgICAweDAwMDAwMDAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19VUExPQURfUEFSQU1FVEVSUyAgICAgICAgMHgwMDAwMDIwMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfVVBMT0FEX1BPSU5UU0laRSAgICAgICAgIDB4MDAwMDA0MDYKLS8qIGdhcCAqLwotI2RlZmluZSBSMzAwX1ZBUF9QVlNfVVBMT0FEX0RBVEEgICAgICAgICAgICAweDIyMDgKLS8qIEVORCAqLwogCiAvKiBnYXAgKi8KKworI2RlZmluZSBSMzAwX1ZBUF9QVlNfVVBMT0FEX0RBVEEgICAgICAgICAgICAweDIyMDgKKworLyogRU5EOiBVcGxvYWQgdmVydGV4IHByb2dyYW0gYW5kIGRhdGEgKi8KKworLyogZ2FwICovCisKIC8qIEkgZG8gbm90IGtub3cgdGhlIHB1cnBvc2Ugb2YgdGhpcyByZWdpc3Rlci4gSG93ZXZlciwgSSBkbyBrbm93IHRoYXQKLS8vIGl0IGlzIHNldCB0byAyMjFDX0NMRUFSIGZvciBjbGVhciBvcGVyYXRpb25zIGFuZCB0byAyMjFDX05PUk1BTAotLy8gZm9yIG5vcm1hbCByZW5kZXJpbmcuICovCisgKiBpdCBpcyBzZXQgdG8gMjIxQ19DTEVBUiBmb3IgY2xlYXIgb3BlcmF0aW9ucyBhbmQgdG8gMjIxQ19OT1JNQUwKKyAqIGZvciBub3JtYWwgcmVuZGVyaW5nLgorICovCiAjZGVmaW5lIFIzMDBfVkFQX1VOS05PV05fMjIxQyAgICAgICAgICAgICAgIDB4MjIxQwogIyAgICAgICBkZWZpbmUgUjMwMF8yMjFDX05PUk1BTCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKICMgICAgICAgZGVmaW5lIFIzMDBfMjIxQ19DTEVBUiAgICAgICAgICAgICAgICAgICAweDAwMDFDMDAwCiAKKy8qIFRoZXNlIHNlZW0gdG8gYmUgcGVyLXBpeGVsIGFuZCBwZXItdmVydGV4IFggYW5kIFkgY2xpcHBpbmcgcGxhbmVzLiBUaGUgZmlyc3QKKyAqIHBsYW5lIGlzIHBlci1waXhlbCBhbmQgdGhlIHNlY29uZCBwbGFuZSBpcyBwZXItdmVydGV4LgorICoKKyAqIFRoaXMgd2FzIGRldGVybWluZWQgYnkgZXhwZXJpbWVudGF0aW9uIGFsb25lIGJ1dCBJIGJlbGlldmUgaXQgaXMgY29ycmVjdC4KKyAqCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIGNhbGxlZCBYX1FVQUQwXzFfRkwgdG8gWF9RVUFEMF80X0ZMIGJ5IGdseHRlc3QuCisgKi8KKyNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9YXzAgICAgICAgICAgICAgICAgICAgMHgyMjIwCisjZGVmaW5lIFIzMDBfVkFQX0NMSVBfWF8xICAgICAgICAgICAgICAgICAgIDB4MjIyNAorI2RlZmluZSBSMzAwX1ZBUF9DTElQX1lfMCAgICAgICAgICAgICAgICAgICAweDIyMjgKKyNkZWZpbmUgUjMwMF9WQVBfQ0xJUF9ZXzEgICAgICAgICAgICAgICAgICAgMHgyMjMwCisKIC8qIGdhcCAqLworCiAvKiBTb21ldGltZXMsIEVORF9PRl9QS1QgYW5kIDB4MjI4ND0wIGFyZSB0aGUgb25seSBjb21tYW5kcyBzZW50IGJldHdlZW4KLS8vIHJlbmRlcmluZyBjb21tYW5kcyBhbmQgb3ZlcndyaXRpbmcgdmVydGV4IHByb2dyYW0gcGFyYW1ldGVycy4KLS8vIFRoZXJlZm9yZSwgSSBzdXNwZWN0IHdyaXRpbmcgemVybyB0byAweDIyODQgc3luY2hyb25pemVzIHRoZSBlbmdpbmUgYW5kCi0vLyBhdm9pZHMgYnVncyBjYXVzZWQgYnkgc3RpbGwgcnVubmluZyBzaGFkZXJzIHJlYWRpbmcgYmFkIGRhdGEgZnJvbSBtZW1vcnkuICovCi0jZGVmaW5lIFIzMDBfVkFQX1BWU19XQUlUSURMRSAgICAgICAgICAgICAgIDB4MjI4NAkvKiBHVUVTUyAqLworICogcmVuZGVyaW5nIGNvbW1hbmRzIGFuZCBvdmVyd3JpdGluZyB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzLgorICogVGhlcmVmb3JlLCBJIHN1c3BlY3Qgd3JpdGluZyB6ZXJvIHRvIDB4MjI4NCBzeW5jaHJvbml6ZXMgdGhlIGVuZ2luZSBhbmQKKyAqIGF2b2lkcyBidWdzIGNhdXNlZCBieSBzdGlsbCBydW5uaW5nIHNoYWRlcnMgcmVhZGluZyBiYWQgZGF0YSBmcm9tIG1lbW9yeS4KKyAqLworI2RlZmluZSBSMzAwX1ZBUF9QVlNfV0FJVElETEUgICAgICAgICAgICAgICAweDIyODQgLyogR1VFU1MgKi8KIAogLyogQWJzb2x1dGVseSBubyBjbHVlIHdoYXQgdGhpcyByZWdpc3RlciBpcyBhYm91dC4gKi8KICNkZWZpbmUgUjMwMF9WQVBfVU5LTk9XTl8yMjg4ICAgICAgICAgICAgICAgMHgyMjg4Ci0jICAgICAgIGRlZmluZSBSMzAwXzIyODhfUjMwMCAgICAgICAgICAgICAgICAgICAgMHgwMDc1MDAwMAkvKiAtLSBuaCAqLwotIyAgICAgICBkZWZpbmUgUjMwMF8yMjg4X1JWMzUwICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYJLyogLS0gVmxhZGltaXIgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfMjI4OF9SMzAwICAgICAgICAgICAgICAgICAgICAweDAwNzUwMDAwIC8qIC0tIG5oICovCisjICAgICAgIGRlZmluZSBSMzAwXzIyODhfUlYzNTAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRiAvKiAtLSBWbGFkaW1pciAqLwogCiAvKiBnYXAgKi8KKwogLyogQWRkcmVzc2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgdmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gYXJlYSBvZiB0aGUKLS8vIG1lbW9yeSBiYW5rLiBQUk9HUkFNX0VORCBwb2ludHMgdG8gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhlIGFjdGl2ZQotLy8gcHJvZ3JhbQotLy8KLS8vIFRoZSBtZWFuaW5nIG9mIHRoZSB0d28gVU5LTk9XTiBmaWVsZHMgaXMgb2J2aW91c2x5IG5vdCBrbm93bi4gSG93ZXZlciwKLS8vIGV4cGVyaW1lbnRzIHNvIGZhciBoYXZlIHNob3duIHRoYXQgYm90aCAqbXVzdCogcG9pbnQgdG8gYW4gaW5zdHJ1Y3Rpb24KLS8vIGluc2lkZSB0aGUgdmVydGV4IHByb2dyYW0sIG90aGVyd2lzZSB0aGUgR1BVIGxvY2tzIHVwLgotLy8gZmdscnggdXN1YWxseSBzZXRzIENOVExfM19VTktOT1dOIHRvIHRoZSBlbmQgb2YgdGhlIHByb2dyYW0gYW5kCi0vLyBDTlRMXzFfVU5LTk9XTiBwb2ludHMgdG8gaW5zdHJ1Y3Rpb24gd2hlcmUgbGFzdCB3cml0ZSB0byBwb3NpdGlvbiB0YWtlcyBwbGFjZS4KLS8vIE1vc3QgbGlrZWx5IHRoaXMgaXMgdXNlZCB0byBpZ25vcmUgcmVzdCBvZiB0aGUgcHJvZ3JhbSBpbiBjYXNlcyB3aGVyZSBncm91cCBvZiB2ZXJ0cyBhcmVudCB2aXNpYmxlLgotLy8gRm9yIHNvbWUgcmVhc29uIHRoaXMgInNlY3Rpb24iIGlzIHNvbWV0aW1lcyBhY2NlcHRlZCBvdGhlciBpbnN0cnVjdGlvbiB0aGF0IGhhdmUKLS8vIG5vIHJlbGF0aW9uc2hpcCB3aXRoIHBvc2l0aW9uIGNhbGN1bGF0aW9ucy4KLSovCisgKiBtZW1vcnkgYmFuay4gUFJPR1JBTV9FTkQgcG9pbnRzIHRvIHRoZSBsYXN0IGluc3RydWN0aW9uIG9mIHRoZSBhY3RpdmUKKyAqIHByb2dyYW0KKyAqCisgKiBUaGUgbWVhbmluZyBvZiB0aGUgdHdvIFVOS05PV04gZmllbGRzIGlzIG9idmlvdXNseSBub3Qga25vd24uIEhvd2V2ZXIsCisgKiBleHBlcmltZW50cyBzbyBmYXIgaGF2ZSBzaG93biB0aGF0IGJvdGggKm11c3QqIHBvaW50IHRvIGFuIGluc3RydWN0aW9uCisgKiBpbnNpZGUgdGhlIHZlcnRleCBwcm9ncmFtLCBvdGhlcndpc2UgdGhlIEdQVSBsb2NrcyB1cC4KKyAqCisgKiBmZ2xyeCB1c3VhbGx5IHNldHMgQ05UTF8zX1VOS05PV04gdG8gdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbSBhbmQKKyAqIFIzMDBfUFZTX0NOVExfMV9QT1NfRU5EX1NISUZUIHBvaW50cyB0byBpbnN0cnVjdGlvbiB3aGVyZSBsYXN0IHdyaXRlIHRvCisgKiBwb3NpdGlvbiB0YWtlcyBwbGFjZS4KKyAqCisgKiBNb3N0IGxpa2VseSB0aGlzIGlzIHVzZWQgdG8gaWdub3JlIHJlc3Qgb2YgdGhlIHByb2dyYW0gaW4gY2FzZXMKKyAqIHdoZXJlIGdyb3VwIG9mIHZlcnRzIGFyZW50IHZpc2libGUuIEZvciBzb21lIHJlYXNvbiB0aGlzICJzZWN0aW9uIgorICogaXMgc29tZXRpbWVzIGFjY2VwdGVkIG90aGVyIGluc3RydWN0aW9uIHRoYXQgaGF2ZSBubyByZWxhdGlvbnNoaXAgd2l0aAorICogcG9zaXRpb24gY2FsY3VsYXRpb25zLgorICovCiAjZGVmaW5lIFIzMDBfVkFQX1BWU19DTlRMXzEgICAgICAgICAgICAgICAgIDB4MjJEMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8xX1BST0dSQU1fU1RBUlRfU0hJRlQgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzFfUE9TX0VORF9TSElGVCAgICAgICAgIDEwCiAjICAgICAgIGRlZmluZSBSMzAwX1BWU19DTlRMXzFfUFJPR1JBTV9FTkRfU0hJRlQgICAgIDIwCi0vKiBBZGRyZXNzZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSB2ZXJ0ZXggcHJvZ3JhbSBwYXJhbWV0ZXJzIGFyZWEuICovCisvKiBBZGRyZXNzZXMgYXJlIHJlbGF0aXZlIHRoZSB0aGUgdmVydGV4IHByb2dyYW0gcGFyYW1ldGVycyBhcmVhLiAqLwogI2RlZmluZSBSMzAwX1ZBUF9QVlNfQ05UTF8yICAgICAgICAgICAgICAgICAweDIyRDQKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfMl9QQVJBTV9PRkZTRVRfU0hJRlQgMAogIyAgICAgICBkZWZpbmUgUjMwMF9QVlNfQ05UTF8yX1BBUkFNX0NPVU5UX1NISUZUICAxNgpAQCAtMzAyLDIzICszNTYsMjYgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfUFZTX0NOVExfM19QUk9HUkFNX1VOS05PV04yX1NISUZUIDAKIAogLyogVGhlIGVudGlyZSByYW5nZSBmcm9tIDB4MjMwMCB0byAweDJBQyBpbmNsdXNpdmUgc2VlbXMgdG8gYmUgdXNlZCBmb3IKLS8vIGltbWVkaWF0ZSB2ZXJ0aWNlcyAqLworICogaW1tZWRpYXRlIHZlcnRpY2VzCisgKi8KICNkZWZpbmUgUjMwMF9WQVBfVlRYX0NPTE9SX1IgICAgICAgICAgICAgICAgMHgyNDY0CiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9HICAgICAgICAgICAgICAgIDB4MjQ2OAogI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfQiAgICAgICAgICAgICAgICAweDI0NkMKLSNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1hfMSAgICAgICAgICAgICAgMHgyNDkwCS8qIHVzZWQgZm9yIGdsVmVydGV4MiooKSAqLworI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8xICAgICAgICAgICAgICAweDI0OTAgLyogdXNlZCBmb3IgZ2xWZXJ0ZXgyKigpICovCiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9ZXzEgICAgICAgICAgICAgIDB4MjQ5NAotI2RlZmluZSBSMzAwX1ZBUF9WVFhfQ09MT1JfUEtEICAgICAgICAgICAgICAweDI0OUMJLyogUkdCQSAqLwotI2RlZmluZSBSMzAwX1ZBUF9WVFhfUE9TXzBfWF8yICAgICAgICAgICAgICAweDI0QTAJLyogdXNlZCBmb3IgZ2xWZXJ0ZXgzKigpICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9DT0xPUl9QS0QgICAgICAgICAgICAgIDB4MjQ5QyAvKiBSR0JBICovCisjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9YXzIgICAgICAgICAgICAgIDB4MjRBMCAvKiB1c2VkIGZvciBnbFZlcnRleDMqKCkgKi8KICNkZWZpbmUgUjMwMF9WQVBfVlRYX1BPU18wX1lfMiAgICAgICAgICAgICAgMHgyNEE0CiAjZGVmaW5lIFIzMDBfVkFQX1ZUWF9QT1NfMF9aXzIgICAgICAgICAgICAgIDB4MjRBOAotI2RlZmluZSBSMzAwX1ZBUF9WVFhfRU5EX09GX1BLVCAgICAgICAgICAgICAweDI0QUMJLyogd3JpdGUgMCB0byBpbmRpY2F0ZSBlbmQgb2YgcGFja2V0PyAqLworLyogd3JpdGUgMCB0byBpbmRpY2F0ZSBlbmQgb2YgcGFja2V0PyAqLworI2RlZmluZSBSMzAwX1ZBUF9WVFhfRU5EX09GX1BLVCAgICAgICAgICAgICAweDI0QUMKIAogLyogZ2FwICovCiAKIC8qIFRoZXNlIGFyZSB2YWx1ZXMgZnJvbSByMzAwX3JlZy9yMzAwX3JlZy5oIC0gdGhleSBhcmUga25vd24gdG8gYmUgY29ycmVjdAotICAgYW5kIGFyZSBoZXJlIHNvIHdlIGNhbiB1c2Ugb25lIHJlZ2lzdGVyIGZpbGUgaW5zdGVhZCBvZiBzZXZlcmFsCi0gICAtIFZsYWRpbWlyICovCisgKiBhbmQgYXJlIGhlcmUgc28gd2UgY2FuIHVzZSBvbmUgcmVnaXN0ZXIgZmlsZSBpbnN0ZWFkIG9mIHNldmVyYWwKKyAqIC0gVmxhZGltaXIKKyAqLwogI2RlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8wCTB4NDAwMAogIwlkZWZpbmUgUjMwMF9HQl9WQVBfUkFTVEVSX1ZUWF9GTVRfMF9fUE9TX1BSRVNFTlQJKDE8PDApCiAjCWRlZmluZSBSMzAwX0dCX1ZBUF9SQVNURVJfVlRYX0ZNVF8wX19DT0xPUl8wX1BSRVNFTlQJKDE8PDEpCkBAIC0zNDEsMTQgKzM5OCwxNiBAQAogIwlkZWZpbmUgUjMwMF9HQl9WQVBfUkFTVEVSX1ZUWF9GTVRfMV9fVEVYXzdfQ09NUF9DTlRfU0hJRlQJMjEKIAogLyogVU5LMzAgc2VlbXMgdG8gZW5hYmxlcyBwb2ludCB0byBxdWFkIHRyYW5zZm9ybWF0aW9uIG9uIHRleHR1cmVzCi0gICAob3Igc29tZXRoaW5nIGNsb3NlbHkgcmVsYXRlZCB0byB0aGF0KS4KLSAgIFRoaXMgYml0IGlzIHJhdGhlciBmYXRhbCBhdCB0aGUgdGltZSBiZWluZyBkdWUgdG8gbGFja2luZ3MgYXQgcGl4ZWwgc2hhZGVyIHNpZGUgKi8KKyAqIChvciBzb21ldGhpbmcgY2xvc2VseSByZWxhdGVkIHRvIHRoYXQpLgorICogVGhpcyBiaXQgaXMgcmF0aGVyIGZhdGFsIGF0IHRoZSB0aW1lIGJlaW5nIGR1ZSB0byBsYWNraW5ncyBhdCBwaXhlbAorICogc2hhZGVyIHNpZGUKKyAqLwogI2RlZmluZSBSMzAwX0dCX0VOQUJMRQkweDQwMDgKICMJZGVmaW5lIFIzMDBfR0JfUE9JTlRfU1RVRkZfRU5BQkxFCSgxPDwwKQogIwlkZWZpbmUgUjMwMF9HQl9MSU5FX1NUVUZGX0VOQUJMRQkoMTw8MSkKICMJZGVmaW5lIFIzMDBfR0JfVFJJQU5HTEVfU1RVRkZfRU5BQkxFCSgxPDwyKQogIwlkZWZpbmUgUjMwMF9HQl9TVEVOQ0lMX0FVVE9fRU5BQkxFCSgxPDw0KQotIwlkZWZpbmUgUjMwMF9HQl9VTkszMAkJCSgxPDwzMCkKKyMJZGVmaW5lIFIzMDBfR0JfVU5LMzEJCQkoMTw8MzEpCiAJLyogZWFjaCBvZiB0aGUgZm9sbG93aW5nIGlzIDIgYml0cyB3aWRlICovCiAjZGVmaW5lIFIzMDBfR0JfVEVYX1JFUExJQ0FURQkwCiAjZGVmaW5lIFIzMDBfR0JfVEVYX1NUCQkxCkBAIC0zODMsMTEgKzQ0MiwxMyBAQAogIwlkZWZpbmUgUjMwMF9HQl9NU1BPUzFfX01TX1k1X1NISUZUCTIwCiAjCWRlZmluZSBSMzAwX0dCX01TUE9TMV9fTVNCRDEJCTI0CiAKKwogI2RlZmluZSBSMzAwX0dCX1RJTEVfQ09ORklHCTB4NDAxOAogIwlkZWZpbmUgUjMwMF9HQl9USUxFX0VOQUJMRQkoMTw8MCkKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1JWMzAwCTAKICMJZGVmaW5lIFIzMDBfR0JfVElMRV9QSVBFX0NPVU5UX1IzMDAJKDM8PDEpCiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfUElQRV9DT1VOVF9SNDIwCSg3PDwxKQorIwlkZWZpbmUgUjMwMF9HQl9USUxFX1BJUEVfQ09VTlRfUlY0MTAJKDM8PDEpCiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfU0laRV84CQkwCiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfU0laRV8xNgkJKDE8PDQpCiAjCWRlZmluZSBSMzAwX0dCX1RJTEVfU0laRV8zMgkJKDI8PDQpCkBAIC00NDIsMTcgKzUwMywxOCBAQAogIwlkZWZpbmUgUjMwMF9HQl9XX1NFTEVDVF8xCQkoMTw8NCkKIAogI2RlZmluZSBSMzAwX0dCX0FBX0NPTkZJRwkJMHg0MDIwCisjCWRlZmluZSBSMzAwX0FBX0RJU0FCTEUJCQkweDAwCiAjCWRlZmluZSBSMzAwX0FBX0VOQUJMRQkJCTB4MDEKICMJZGVmaW5lIFIzMDBfQUFfU1VCU0FNUExFU18yCQkwCiAjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfMwkJKDE8PDEpCiAjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfNAkJKDI8PDEpCiAjCWRlZmluZSBSMzAwX0FBX1NVQlNBTVBMRVNfNgkJKDM8PDEpCiAKLS8qIEVORCAqLwotCiAvKiBnYXAgKi8KKwogLyogWmVybyB0byBmbHVzaCBjYWNoZXMuICovCiAjZGVmaW5lIFIzMDBfVFhfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMAorI2RlZmluZSBSMzAwX1RYX0ZMVVNIICAgICAgICAgICAgICAgICAgICAgICAweDAKIAogLyogVGhlIHVwcGVyIGVuYWJsZSBiaXRzIGFyZSBndWVzc2VkLCBiYXNlZCBvbiBmZ2xyeCByZXBvcnRlZCBsaW1pdHMuICovCiAjZGVmaW5lIFIzMDBfVFhfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4NDEwNApAQCAtNDc0LDI0ICs1MzYsMjUgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfRU5BQkxFXzE1ICAgICAgICAgICAgICAgICAoMSA8PCAxNSkKIAogLyogVGhlIHBvaW50c2l6ZSBpcyBnaXZlbiBpbiBtdWx0aXBsZXMgb2YgNi4gVGhlIHBvaW50c2l6ZSBjYW4gYmUKLS8vIGVub3Jtb3VzOiBDbGVhcigpIHJlbmRlcnMgYSBzaW5nbGUgcG9pbnQgdGhhdCBmaWxscyB0aGUgZW50aXJlCi0vLyBmcmFtZWJ1ZmZlci4gKi8KKyAqIGVub3Jtb3VzOiBDbGVhcigpIHJlbmRlcnMgYSBzaW5nbGUgcG9pbnQgdGhhdCBmaWxscyB0aGUgZW50aXJlCisgKiBmcmFtZWJ1ZmZlci4KKyAqLwogI2RlZmluZSBSMzAwX1JFX1BPSU5UU0laRSAgICAgICAgICAgICAgICAgICAweDQyMUMKICMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1lfU0hJRlQgICAgICAgICAgICAwCi0jICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9ZX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAwKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWV9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMCkgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX1hfU0hJRlQgICAgICAgICAgICAxNgotIyAgICAgICBkZWZpbmUgUjMwMF9QT0lOVFNJWkVfWF9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMTYpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1BPSU5UU0laRV9YX01BU0sgICAgICAgICAgICAgKDB4RkZGRiA8PCAxNikgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUE9JTlRTSVpFX01BWCAgICAgICAgICAgICAoUjMwMF9QT0lOVFNJWkVfWV9NQVNLIC8gNikKIAogLyogVGhlIGxpbmUgd2lkdGggaXMgZ2l2ZW4gaW4gbXVsdGlwbGVzIG9mIDYuCi0gICBJbiBkZWZhdWx0IG1vZGUgbGluZXMgYXJlIGNsYXNzaWZpZWQgYXMgdmVydGljYWwgbGluZXMuCi0gICBITzogaG9yaXpvbnRhbAotICAgVkU6IHZlcnRpY2FsIG9yIGhvcml6b250YWwKLSAgIEhPICYgVkU6IG5vIGNsYXNzaWZpY2F0aW9uCi0qLworICogSW4gZGVmYXVsdCBtb2RlIGxpbmVzIGFyZSBjbGFzc2lmaWVkIGFzIHZlcnRpY2FsIGxpbmVzLgorICogSE86IGhvcml6b250YWwKKyAqIFZFOiB2ZXJ0aWNhbCBvciBob3Jpem9udGFsCisgKiBITyAmIFZFOiBubyBjbGFzc2lmaWNhdGlvbgorICovCiAjZGVmaW5lIFIzMDBfUkVfTElORV9DTlQgICAgICAgICAgICAgICAgICAgICAgMHg0MjM0CiAjICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX1NISUZUICAgICAgICAgICAgMAotIyAgICAgICBkZWZpbmUgUjMwMF9MSU5FU0laRV9NQVNLICAgICAgICAgICAgICgweEZGRkYgPDwgMCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfTElORVNJWkVfTUFTSyAgICAgICAgICAgICAoMHhGRkZGIDw8IDApIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX0xJTkVTSVpFX01BWCAgICAgICAgICAgICAoUjMwMF9MSU5FU0laRV9NQVNLIC8gNikKICMgICAgICAgZGVmaW5lIFIzMDBfTElORV9DTlRfSE8gICAgICAgICAgICAgICAoMSA8PCAxNikKICMgICAgICAgZGVmaW5lIFIzMDBfTElORV9DTlRfVkUgICAgICAgICAgICAgICAoMSA8PCAxNykKQEAgLTQ5OSw2ICs1NjIsOSBAQAogLyogU29tZSBzb3J0IG9mIHNjYWxlIG9yIGNsYW1wIHZhbHVlIGZvciB0ZXhjb29yZGxlc3MgdGV4dHVyZXMuICovCiAjZGVmaW5lIFIzMDBfUkVfVU5LNDIzOCAgICAgICAgICAgICAgICAgICAgICAgMHg0MjM4CiAKKy8qIFNvbWV0aGluZyBzaGFkZSByZWxhdGVkICovCisjZGVmaW5lIFIzMDBfUkVfU0hBREUgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Mjc0CisKICNkZWZpbmUgUjMwMF9SRV9TSEFERV9NT0RFTCAgICAgICAgICAgICAgICAgICAweDQyNzgKICMJZGVmaW5lIFIzMDBfUkVfU0hBREVfTU9ERUxfU01PT1RIICAgICAweDNhYWFhCiAjCWRlZmluZSBSMzAwX1JFX1NIQURFX01PREVMX0ZMQVQgICAgICAgMHgzOTU5NQpAQCAtNTEzLDI0ICs1NzksMzEgQEAKICMJZGVmaW5lIFIzMDBfUE1fQkFDS19MSU5FICAgICAgICAgICAgICAoMSA8PCA3KQogIwlkZWZpbmUgUjMwMF9QTV9CQUNLX0ZJTEwgICAgICAgICAgICAgICgxIDw8IDgpCiAKKy8qIEZvZyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFIzMDBfUkVfRk9HX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMHg0Mjk0CisjZGVmaW5lIFIzMDBfUkVfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHg0Mjk4CisKIC8qIE5vdCBzdXJlIHdoeSB0aGVyZSBhcmUgZHVwbGljYXRlIG9mIGZhY3RvciBhbmQgY29uc3RhbnQgdmFsdWVzLgotICAgTXkgYmVzdCBndWVzcyBzbyBmYXIgaXMgdGhhdCB0aGVyZSBhcmUgc2VwZXJhdGUgemJpYXNlcyBmb3IgdGVzdCBhbmQgd3JpdGUuCi0gICBPcmRlcmluZyBtaWdodCBiZSB3cm9uZy4KLSAgIFNvbWUgb2YgdGhlIHRlc3RzIGluZGljYXRlIHRoYXQgZmdsIGhhcyBhIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIHpiaWFzCi0gICB2aWEgcGl4ZWwgc2hhZGVycy4gKi8KKyAqIE15IGJlc3QgZ3Vlc3Mgc28gZmFyIGlzIHRoYXQgdGhlcmUgYXJlIHNlcGVyYXRlIHpiaWFzZXMgZm9yIHRlc3QgYW5kIHdyaXRlLgorICogT3JkZXJpbmcgbWlnaHQgYmUgd3JvbmcuCisgKiBTb21lIG9mIHRoZSB0ZXN0cyBpbmRpY2F0ZSB0aGF0IGZnbCBoYXMgYSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiB6YmlhcworICogdmlhIHBpeGVsIHNoYWRlcnMuCisgKi8KKyNkZWZpbmUgUjMwMF9SRV9aQklBU19DTlRMICAgICAgICAgICAgICAgICAgICAweDQyQTAgLyogR1VFU1MgKi8KICNkZWZpbmUgUjMwMF9SRV9aQklBU19UX0ZBQ1RPUiAgICAgICAgICAgICAgICAweDQyQTQKICNkZWZpbmUgUjMwMF9SRV9aQklBU19UX0NPTlNUQU5UICAgICAgICAgICAgICAweDQyQTgKICNkZWZpbmUgUjMwMF9SRV9aQklBU19XX0ZBQ1RPUiAgICAgICAgICAgICAgICAweDQyQUMKICNkZWZpbmUgUjMwMF9SRV9aQklBU19XX0NPTlNUQU5UICAgICAgICAgICAgICAweDQyQjAKIAogLyogVGhpcyByZWdpc3RlciBuZWVkcyB0byBiZSBzZXQgdG8gKDE8PDEpIGZvciBSVjM1MCB0byBjb3JyZWN0bHkKLSAgIHBlcmZvcm0gZGVwdGggdGVzdCAoc2VlIC0tdmItdHJpYW5nbGVzIGluIHIzMDBfZGVtbykKLSAgIERvbid0IGtub3cgYWJvdXQgb3RoZXIgY2hpcHMuIC0gVmxhZGltaXIKLSAgIFRoaXMgaXMgc2V0IHRvIDMgd2hlbiBHTF9QT0xZR09OX09GRlNFVF9GSUxMIGlzIG9uLgotICAgTXkgZ3Vlc3MgaXMgdGhhdCB0aGVyZSBhcmUgdHdvIGJpdHMgZm9yIGVhY2ggemJpYXMgcHJpbWl0aXZlIChGSUxMLCBMSU5FLCBQT0lOVCkuCi0gICBPbmUgdG8gZW5hYmxlIGRlcHRoIHRlc3QgYW5kIG9uZSBmb3IgZGVwdGggd3JpdGUuCi0gICBZZXQgdGhpcyBkb2VzbnQgZXhwbGFpbiB3aHkgZGVwdGggd3JpdGVzIHdvcmsgLi4uCi0gICAgKi8KKyAqIHBlcmZvcm0gZGVwdGggdGVzdCAoc2VlIC0tdmItdHJpYW5nbGVzIGluIHIzMDBfZGVtbykKKyAqIERvbid0IGtub3cgYWJvdXQgb3RoZXIgY2hpcHMuIC0gVmxhZGltaXIKKyAqIFRoaXMgaXMgc2V0IHRvIDMgd2hlbiBHTF9QT0xZR09OX09GRlNFVF9GSUxMIGlzIG9uLgorICogTXkgZ3Vlc3MgaXMgdGhhdCB0aGVyZSBhcmUgdHdvIGJpdHMgZm9yIGVhY2ggemJpYXMgcHJpbWl0aXZlCisgKiAoRklMTCwgTElORSwgUE9JTlQpLgorICogIE9uZSB0byBlbmFibGUgZGVwdGggdGVzdCBhbmQgb25lIGZvciBkZXB0aCB3cml0ZS4KKyAqIFlldCB0aGlzIGRvZXNudCBleHBsYWluIHdoeSBkZXB0aCB3cml0ZXMgd29yayAuLi4KKyAqLwogI2RlZmluZSBSMzAwX1JFX09DQ0xVU0lPTl9DTlRMCQkgICAgMHg0MkI0CiAjCWRlZmluZSBSMzAwX09DQ0xVU0lPTl9PTgkJKDE8PDEpCiAKQEAgLTU0MCwzMCArNjEzLDM4IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZST05UX0ZBQ0VfQ0NXICAgICAgICAgICAgICAgKDAgPDwgMikKICMgICAgICAgZGVmaW5lIFIzMDBfRlJPTlRfRkFDRV9DVyAgICAgICAgICAgICAgICAoMSA8PCAyKQogCi0vKiBCRUdJTjogUmFzdGVyaXphdGlvbiAvIEludGVycG9sYXRvcnMgLSBtYW55IGd1ZXNzZXMKLS8vIDBfVU5LTk9XTl8xOCBoYXMgYWx3YXlzIGJlZW4gc2V0IGV4Y2VwdCBmb3IgY2xlYXIgb3BlcmF0aW9ucy4KLS8vIFRDX0NOVCBpcyB0aGUgbnVtYmVyIG9mIGluY29taW5nIHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIChpLmUuIGl0IGRlcGVuZHMKLS8vIG9uIHRoZSB2ZXJ0ZXggcHJvZ3JhbSwgKm5vdCogdGhlIGZyYWdtZW50IHByb2dyYW0pICovCisKKy8qIEJFR0lOOiBSYXN0ZXJpemF0aW9uIC8gSW50ZXJwb2xhdG9ycyAtIG1hbnkgZ3Vlc3NlcyAqLworCisvKiAwX1VOS05PV05fMTggaGFzIGFsd2F5cyBiZWVuIHNldCBleGNlcHQgZm9yIGNsZWFyIG9wZXJhdGlvbnMuCisgKiBUQ19DTlQgaXMgdGhlIG51bWJlciBvZiBpbmNvbWluZyB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyAoaS5lLiBpdCBkZXBlbmRzCisgKiBvbiB0aGUgdmVydGV4IHByb2dyYW0sICpub3QqIHRoZSBmcmFnbWVudCBwcm9ncmFtKQorICovCiAjZGVmaW5lIFIzMDBfUlNfQ05UTF8wICAgICAgICAgICAgICAgICAgICAgIDB4NDMwMAogIyAgICAgICBkZWZpbmUgUjMwMF9SU19DTlRMX1RDX0NOVF9TSElGVCAgICAgICAgIDIKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfQ05UTF9UQ19DTlRfTUFTSyAgICAgICAgICAoNyA8PCAyKQotIwkJZGVmaW5lIFIzMDBfUlNfQ05UTF9DSV9DTlRfU0hJRlQgICAgICAgICA3CS8qIG51bWJlciBvZiBjb2xvciBpbnRlcnBvbGF0b3JzIHVzZWQgKi8KKwkvKiBudW1iZXIgb2YgY29sb3IgaW50ZXJwb2xhdG9ycyB1c2VkICovCisjCWRlZmluZSBSMzAwX1JTX0NOVExfQ0lfQ05UX1NISUZUICAgICAgICAgNwogIyAgICAgICBkZWZpbmUgUjMwMF9SU19DTlRMXzBfVU5LTk9XTl8xOCAgICAgICAgICgxIDw8IDE4KQotLyogR3Vlc3M6IFJTX0NOVExfMSBob2xkcyB0aGUgaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCBSU19ST1VURV9uIHJlZ2lzdGVyLiAqLworCS8qIEd1ZXNzOiBSU19DTlRMXzEgaG9sZHMgdGhlIGluZGV4IG9mIHRoZSBoaWdoZXN0IHVzZWQgUlNfUk9VVEVfbgorCSAgIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBSMzAwX1JTX0NOVExfMSAgICAgICAgICAgICAgICAgICAgICAweDQzMDQKIAogLyogZ2FwICovCisKIC8qIE9ubHkgdXNlZCBmb3IgdGV4dHVyZSBjb29yZGluYXRlcy4KLS8vIFVzZSB0aGUgc291cmNlIGZpZWxkIHRvIHJvdXRlIHRleHR1cmUgY29vcmRpbmF0ZSBpbnB1dCBmcm9tIHRoZSB2ZXJ0ZXggcHJvZ3JhbQotLy8gdG8gdGhlIGRlc2lyZWQgaW50ZXJwb2xhdG9yLiBOb3RlIHRoYXQgdGhlIHNvdXJjZSBmaWVsZCBpcyByZWxhdGl2ZSB0byB0aGUKLS8vIG91dHB1dHMgdGhlIHZlcnRleCBwcm9ncmFtICphY3R1YWxseSogd3JpdGVzLiBJZiBhIHZlcnRleCBwcm9ncmFtIG9ubHkgd3JpdGVzCi0vLyB0ZXhjb29yZFsxXSwgdGhpcyB3aWxsIGJlIHNvdXJjZSBpbmRleCAwLgotLy8gU2V0IElOVEVSUF9VU0VEIG9uIGFsbCBpbnRlcnBvbGF0b3JzIHRoYXQgcHJvZHVjZSBkYXRhIHVzZWQgYnkgdGhlCi0vLyBmcmFnbWVudCBwcm9ncmFtLiBJTlRFUlBfVVNFRCBsb29rcyBsaWtlIGEgc3dpenpsaW5nIG1hc2ssIGJ1dAotLy8gSSBoYXZlbid0IHNlZW4gaXQgdXNlZCB0aGF0IHdheS4KLS8vCi0vLyBOb3RlOiBUaGUgX1VOS05PV04gY29uc3RhbnRzIGFyZSBhbHdheXMgc2V0IGluIHRoZWlyIHJlc3BlY3RpdmUgcmVnaXN0ZXIuCi0vLyBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNlc3NhcnkuICovCisgKiBVc2UgdGhlIHNvdXJjZSBmaWVsZCB0byByb3V0ZSB0ZXh0dXJlIGNvb3JkaW5hdGUgaW5wdXQgZnJvbSB0aGUKKyAqIHZlcnRleCBwcm9ncmFtIHRvIHRoZSBkZXNpcmVkIGludGVycG9sYXRvci4gTm90ZSB0aGF0IHRoZSBzb3VyY2UKKyAqIGZpZWxkIGlzIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXRzIHRoZSB2ZXJ0ZXggcHJvZ3JhbSAqYWN0dWFsbHkqCisgKiB3cml0ZXMuIElmIGEgdmVydGV4IHByb2dyYW0gb25seSB3cml0ZXMgdGV4Y29vcmRbMV0sIHRoaXMgd2lsbAorICogYmUgc291cmNlIGluZGV4IDAuCisgKiBTZXQgSU5URVJQX1VTRUQgb24gYWxsIGludGVycG9sYXRvcnMgdGhhdCBwcm9kdWNlIGRhdGEgdXNlZCBieQorICogdGhlIGZyYWdtZW50IHByb2dyYW0uIElOVEVSUF9VU0VEIGxvb2tzIGxpa2UgYSBzd2l6emxpbmcgbWFzaywKKyAqIGJ1dCBJIGhhdmVuJ3Qgc2VlbiBpdCB1c2VkIHRoYXQgd2F5LgorICoKKyAqIE5vdGU6IFRoZSBfVU5LTk9XTiBjb25zdGFudHMgYXJlIGFsd2F5cyBzZXQgaW4gdGhlaXIgcmVzcGVjdGl2ZQorICogcmVnaXN0ZXIuIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lY2Vzc2FyeS4KKyAqLwogI2RlZmluZSBSMzAwX1JTX0lOVEVSUF8wICAgICAgICAgICAgICAgICAgICAweDQzMTAKICNkZWZpbmUgUjMwMF9SU19JTlRFUlBfMSAgICAgICAgICAgICAgICAgICAgMHg0MzE0CiAjICAgICAgIGRlZmluZSBSMzAwX1JTX0lOVEVSUF8xX1VOS05PV04gICAgICAgICAgMHg0MApAQCAtNTgwLDU0ICs2NjEsNjMgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfSU5URVJQX1VTRUQgICAgICAgICAgICAgICAweDAwRDEwMDAwCiAKIC8qIFRoZXNlIERXT1JEcyBjb250cm9sIGhvdyB2ZXJ0ZXggZGF0YSBpcyByb3V0ZWQgaW50byBmcmFnbWVudCBwcm9ncmFtCi0vLyByZWdpc3RlcnMsIGFmdGVyIGludGVycG9sYXRvcnMuICovCisgKiByZWdpc3RlcnMsIGFmdGVyIGludGVycG9sYXRvcnMuCisgKi8KICNkZWZpbmUgUjMwMF9SU19ST1VURV8wICAgICAgICAgICAgICAgICAgICAgMHg0MzMwCiAjZGVmaW5lIFIzMDBfUlNfUk9VVEVfMSAgICAgICAgICAgICAgICAgICAgIDB4NDMzNAogI2RlZmluZSBSMzAwX1JTX1JPVVRFXzIgICAgICAgICAgICAgICAgICAgICAweDQzMzgKLSNkZWZpbmUgUjMwMF9SU19ST1VURV8zICAgICAgICAgICAgICAgICAgICAgMHg0MzNDCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfNCAgICAgICAgICAgICAgICAgICAgIDB4NDM0MAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JTX1JPVVRFXzUgICAgICAgICAgICAgICAgICAgICAweDQzNDQJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SU19ST1VURV82ICAgICAgICAgICAgICAgICAgICAgMHg0MzQ4CS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUlNfUk9VVEVfNyAgICAgICAgICAgICAgICAgICAgIDB4NDM0QwkvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzMgICAgICAgICAgICAgICAgICAgICAweDQzM0MgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV80ICAgICAgICAgICAgICAgICAgICAgMHg0MzQwIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUlNfUk9VVEVfNSAgICAgICAgICAgICAgICAgICAgIDB4NDM0NCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JTX1JPVVRFXzYgICAgICAgICAgICAgICAgICAgICAweDQzNDggLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SU19ST1VURV83ICAgICAgICAgICAgICAgICAgICAgMHg0MzRDIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMCAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzEgICAgIDEKICMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF8yICAgICAyCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfMyAgICAgMwogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzQgICAgIDQKLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF81ICAgICA1CS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNiAgICAgNgkvKiBHVUVTUyAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzcgICAgIDcJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfRU5BQkxFICAgICAgICAgICAgICAoMSA8PCAzKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9TT1VSQ0VfSU5URVJQXzUgICAgIDUgLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUlNfUk9VVEVfU09VUkNFX0lOVEVSUF82ICAgICA2IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX1NPVVJDRV9JTlRFUlBfNyAgICAgNyAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9FTkFCTEUgICAgICAgICAgICAgICgxIDw8IDMpIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFX0RFU1RfU0hJRlQgICAgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9ERVNUX01BU0sgICAgICAgICAgICgzMSA8PCA2KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV9ERVNUX01BU0sgICAgICAgICAgICgzMSA8PCA2KSAvKiBHVUVTUyAqLwogCiAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBjb2xvcjogV2hlbiB0aGUgZnJhZ21lbnQgcHJvZ3JhbSB1c2VzIGNvbG9yLAotLy8gdGhlIFJPVVRFXzBfQ09MT1IgYml0IGlzIHNldCBhbmQgUk9VVEVfMF9DT0xPUl9ERVNUIGNvbnRhaW5zIHRoZQotLy8gY29sb3IgcmVnaXN0ZXIgaW5kZXguICovCisgKiB0aGUgUk9VVEVfMF9DT0xPUiBiaXQgaXMgc2V0IGFuZCBST1VURV8wX0NPTE9SX0RFU1QgY29udGFpbnMgdGhlCisgKiBjb2xvciByZWdpc3RlciBpbmRleC4KKyAqCisgKiBBcHBlcmVudGx5IHlvdSBtYXkgc2V0IHRoZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1IgYml0LCBidXQgbm90IHByb3ZpZGUgYW55CisgKiBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVCB2YWx1ZTsgdGhpcyBzZXR1cCBpcyB1c2VkIGZvciBjbGVhcmluZyB0aGUgc3RhdGUuCisgKiBTZWUgcjMwMF9pb2N0bC5jOnIzMDBFbWl0Q2xlYXJTdGF0ZS4gSSdtIG5vdCBzdXJlIGlmIHRoaXMgc2V0dXAgaXMgc3RyaWN0bHkKKyAqIGNvcnJlY3Qgb3Igbm90LiAtIE9saXZlci4KKyAqLwogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV8wX0NPTE9SICAgICAgICAgICAgICgxIDw8IDE0KQogIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV8wX0NPTE9SX0RFU1RfU0hJRlQgIDE3Ci0jICAgICAgIGRlZmluZSBSMzAwX1JTX1JPVVRFXzBfQ09MT1JfREVTVF9NQVNLICAgKDMxIDw8IDE3KQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SU19ST1VURV8wX0NPTE9SX0RFU1RfTUFTSyAgICgzMSA8PCAxNykgLyogR1VFU1MgKi8KIC8qIEFzIGFib3ZlLCBidXQgZm9yIHNlY29uZGFyeSBjb2xvciAqLwogIwkJZGVmaW5lIFIzMDBfUlNfUk9VVEVfMV9DT0xPUjEgICAgICAgICAgICAoMSA8PCAxNCkKICMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfQ09MT1IxX0RFU1RfU0hJRlQgMTcKICMJCWRlZmluZSBSMzAwX1JTX1JPVVRFXzFfQ09MT1IxX0RFU1RfTUFTSyAgKDMxIDw8IDE3KQogIwkJZGVmaW5lIFIzMDBfUlNfUk9VVEVfMV9VTktOT1dOMTEgICAgICAgICAoMSA8PCAxMSkKLS8qIEVORCAqLworLyogRU5EOiBSYXN0ZXJpemF0aW9uIC8gSW50ZXJwb2xhdG9ycyAtIG1hbnkgZ3Vlc3NlcyAqLwogCi0vKiBCRUdJTjogU2Npc3NvcnMgYW5kIGNsaXByZWN0cwotLy8gVGhlcmUgYXJlIGZvdXIgY2xpcHBpbmcgcmVjdGFuZ2xlcy4gVGhlaXIgY29ybmVyIGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUuCi0vLyBFdmVyeSBwaXhlbCBpcyBhc3NpZ25lZCBhIG51bWJlciBmcm9tIDAgYW5kIDE1IGJ5IHNldHRpbmcgYml0cyAwLTMgZGVwZW5kaW5nCi0vLyBvbiB3aGV0aGVyIHRoZSBwaXhlbCBpcyBpbnNpZGUgY2xpcHJlY3RzIDAtMywgcmVzcGVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwKLS8vIGlmIGEgcGl4ZWwgaXMgaW5zaWRlIGNsaXByZWN0cyAwIGFuZCAxLCBidXQgb3V0c2lkZSAyIGFuZCAzLCBpdCBpcyBhc3NpZ25lZAotLy8gdGhlIG51bWJlciAzIChiaW5hcnkgMDAxMSkuCi0vLyBJZmYgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCdzIG51bWJlciBpbiBSRV9DTElQUkVDVF9DTlRMIGlzIHNldCwKLS8vIHRoZSBwaXhlbCBpcyByYXN0ZXJpemVkLgotLy8KLS8vIEluIGFkZGl0aW9uIHRvIHRoaXMsIHRoZXJlIGlzIGEgc2Npc3NvcnMgcmVjdGFuZ2xlLiBPbmx5IHBpeGVscyBpbnNpZGUgdGhlCi0vLyBzY2lzc29ycyByZWN0YW5nbGUgYXJlIGRyYXduLiAoY29vcmRpbmF0ZXMgYXJlIGluY2x1c2l2ZSkKLS8vCi0vLyBGb3Igc29tZSByZWFzb24sIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGZyYW1lYnVmZmVyIGlzIGF0ICgxNDQwLCAxNDQwKQotLy8gZm9yIHRoZSBwdXJwb3NlIG9mIGNsaXBwaW5nIGFuZCBzY2lzc29ycy4gKi8KKy8qIEJFR0lOOiBTY2lzc29ycyBhbmQgY2xpcHJlY3RzICovCisKKy8qIFRoZXJlIGFyZSBmb3VyIGNsaXBwaW5nIHJlY3RhbmdsZXMuIFRoZWlyIGNvcm5lciBjb29yZGluYXRlcyBhcmUgaW5jbHVzaXZlLgorICogRXZlcnkgcGl4ZWwgaXMgYXNzaWduZWQgYSBudW1iZXIgZnJvbSAwIGFuZCAxNSBieSBzZXR0aW5nIGJpdHMgMC0zIGRlcGVuZGluZworICogb24gd2hldGhlciB0aGUgcGl4ZWwgaXMgaW5zaWRlIGNsaXByZWN0cyAwLTMsIHJlc3BlY3RpdmVseS4gRm9yIGV4YW1wbGUsCisgKiBpZiBhIHBpeGVsIGlzIGluc2lkZSBjbGlwcmVjdHMgMCBhbmQgMSwgYnV0IG91dHNpZGUgMiBhbmQgMywgaXQgaXMgYXNzaWduZWQKKyAqIHRoZSBudW1iZXIgMyAoYmluYXJ5IDAwMTEpLgorICogSWZmIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwncyBudW1iZXIgaW4gUkVfQ0xJUFJFQ1RfQ05UTCBpcyBzZXQsCisgKiB0aGUgcGl4ZWwgaXMgcmFzdGVyaXplZC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byB0aGlzLCB0aGVyZSBpcyBhIHNjaXNzb3JzIHJlY3RhbmdsZS4gT25seSBwaXhlbHMgaW5zaWRlIHRoZQorICogc2Npc3NvcnMgcmVjdGFuZ2xlIGFyZSBkcmF3bi4gKGNvb3JkaW5hdGVzIGFyZSBpbmNsdXNpdmUpCisgKgorICogRm9yIHNvbWUgcmVhc29uLCB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZWJ1ZmZlciBpcyBhdCAoMTQ0MCwgMTQ0MCkKKyAqIGZvciB0aGUgcHVycG9zZSBvZiBjbGlwcGluZyBhbmQgc2Npc3NvcnMuCisgKi8KICNkZWZpbmUgUjMwMF9SRV9DTElQUkVDVF9UTF8wICAgICAgICAgICAgICAgMHg0M0IwCiAjZGVmaW5lIFIzMDBfUkVfQ0xJUFJFQ1RfQlJfMCAgICAgICAgICAgICAgIDB4NDNCNAogI2RlZmluZSBSMzAwX1JFX0NMSVBSRUNUX1RMXzEgICAgICAgICAgICAgICAweDQzQjgKQEAgLTY2MSw2ICs3NTEsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9DTElQXzMyMTAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE1KQogCiAvKiBnYXAgKi8KKwogI2RlZmluZSBSMzAwX1JFX1NDSVNTT1JTX1RMICAgICAgICAgICAgICAgICAweDQzRTAKICNkZWZpbmUgUjMwMF9SRV9TQ0lTU09SU19CUiAgICAgICAgICAgICAgICAgMHg0M0U0CiAjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX09GRlNFVCAgICAgICAgICAgICAgMTQ0MApAQCAtNjY4LDEyICs3NTksMTUgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWF9NQVNLICAgICAgICAgICAgICAoMHgxRkZGIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1NDSVNTT1JTX1lfU0hJRlQgICAgICAgICAgICAgMTMKICMgICAgICAgZGVmaW5lIFIzMDBfU0NJU1NPUlNfWV9NQVNLICAgICAgICAgICAgICAoMHgxRkZGIDw8IDEzKQotLyogRU5EICovCisvKiBFTkQ6IFNjaXNzb3JzIGFuZCBjbGlwcmVjdHMgKi8KIAotLyogQkVHSU46IFRleHR1cmUgc3BlY2lmaWNhdGlvbgotLy8gVGhlIHRleHR1cmUgc3BlY2lmaWNhdGlvbiBkd29yZHMgYXJlIGdyb3VwZWQgYnkgbWVhbmluZyBhbmQgbm90IGJ5IHRleHR1cmUgdW5pdC4KLS8vIFRoaXMgbWVhbnMgdGhhdCBlLmcuIHRoZSBvZmZzZXQgZm9yIHRleHR1cmUgaW1hZ2UgdW5pdCBOIGlzIGZvdW5kIGluIHJlZ2lzdGVyCi0vLyBUWF9PRkZTRVRfMCArICg0Kk4pICovCisvKiBCRUdJTjogVGV4dHVyZSBzcGVjaWZpY2F0aW9uICovCisKKy8qCisgKiBUaGUgdGV4dHVyZSBzcGVjaWZpY2F0aW9uIGR3b3JkcyBhcmUgZ3JvdXBlZCBieSBtZWFuaW5nIGFuZCBub3QgYnkgdGV4dHVyZQorICogdW5pdC4gVGhpcyBtZWFucyB0aGF0IGUuZy4gdGhlIG9mZnNldCBmb3IgdGV4dHVyZSBpbWFnZSB1bml0IE4gaXMgZm91bmQgaW4KKyAqIHJlZ2lzdGVyIFRYX09GRlNFVF8wICsgKDQqTikKKyAqLwogI2RlZmluZSBSMzAwX1RYX0ZJTFRFUl8wICAgICAgICAgICAgICAgICAgICAweDQ0MDAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfUkVQRUFUICAgICAgICAgICAgICAgICAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1RYX01JUlJPUkVEICAgICAgICAgICAgICAgICAgMQpAQCAtNjk3LDEzICs3OTEsMTQgQEAKICMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9MSU5FQVJfTUlQX0xJTkVBUiAgICAgICAgICgxMCA8PCAgMTEpCiAKIC8qIE5PVEU6IE5FQVJFU1QgZG9lc250IHNlZW0gdG8gZXhpc3QuCi0gICBJbSBub3Qgc2V0aW5nIE1BR19GSUxURVJfTUFTSyBhbmQgKDMgPDwgMTEpIG9uIGZvciBhbGwKLSAgIGFuaXNvdHJvcHkgbW9kZXMgYmVjYXVzZSB0aGF0IHdvdWxkIHZvaWQgc2VsZWN0ZWQgbWFnIGZpbHRlciAqLwotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1QgICAgICAgICAgICAgKCgwIDw8IDEzKSAvKnxSMzAwX1RYX01BR19GSUxURVJfTUFTS3woMzw8MTEpKi8pCi0jCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTElORUFSICAgICAgICAgICAgICAoKDAgPDwgMTMpIC8qfFIzMDBfVFhfTUFHX0ZJTFRFUl9NQVNLfCgzPDwxMSkqLykKLSMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9ORUFSRVNUICgoMSA8PCAxMykgLyp8UjMwMF9UWF9NQUdfRklMVEVSX01BU0t8KDM8PDExKSovKQotIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX05FQVJFU1RfTUlQX0xJTkVBUiAgKCgyIDw8IDEzKSAvKnxSMzAwX1RYX01BR19GSUxURVJfTUFTS3woMzw8MTEpKi8pCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfTUFTSyAgICAgICAgICAgKCAoMTUgPDwgMTEpIHwgKDMgPDwgMTMpICkKKyAqIEltIG5vdCBzZXRpbmcgTUFHX0ZJTFRFUl9NQVNLIGFuZCAoMyA8PCAxMSkgb24gZm9yIGFsbAorICogYW5pc290cm9weSBtb2RlcyBiZWNhdXNlIHRoYXQgd291bGQgdm9pZCBzZWxlY3RlZCBtYWcgZmlsdGVyCisgKi8KKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUICAgICAgICAgICAgICgwIDw8IDEzKQorIwlkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX0FOSVNPX0xJTkVBUiAgICAgICAgICAgICAgKDAgPDwgMTMpCisjCWRlZmluZSBSMzAwX1RYX01JTl9GSUxURVJfQU5JU09fTkVBUkVTVF9NSVBfTkVBUkVTVCAoMSA8PCAxMykKKyMJZGVmaW5lIFIzMDBfVFhfTUlOX0ZJTFRFUl9BTklTT19ORUFSRVNUX01JUF9MSU5FQVIgICgyIDw8IDEzKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NSU5fRklMVEVSX01BU0sgICAoICgxNSA8PCAxMSkgfCAoMyA8PCAxMykgKQogIwlkZWZpbmUgUjMwMF9UWF9NQVhfQU5JU09fMV9UT18xICAoMCA8PCAyMSkKICMJZGVmaW5lIFIzMDBfVFhfTUFYX0FOSVNPXzJfVE9fMSAgKDIgPDwgMjEpCiAjCWRlZmluZSBSMzAwX1RYX01BWF9BTklTT180X1RPXzEgICg0IDw8IDIxKQpAQCAtNzM0LDEwICs4MjksMTAgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfVFhfSEVJR0hUTUFTS19TSElGVCAgICAgICAgICAxMQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9IRUlHSFRNQVNLX01BU0sgICAgICAgICAgICgyMDQ3IDw8IDExKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWF9VTksyMyAgICAgICAgICAgICAgICAgICAgICgxIDw8IDIzKQotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX1NISUZUICAgICAgICAgICAgICAgIDI2CS8qIGxhcmdlc3Qgb2Ygd2lkdGgsIGhlaWdodCAqLwotIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX01BU0sgICAgICAgICAgICAgICAgICgxNSA8PCAyNikKLSMgICAgICAgZGVmaW5lIFIzMDBfVFhfU0laRV9QUk9KRUNURUQgICAgICAgICAgICAgICAgICAgICAoMTw8MzApCi0jICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfVFhQSVRDSF9FTiAgICAgICAgICAgICAgICAgICAgICgxPDwzMSkKKyMgICAgICAgZGVmaW5lIFIzMDBfVFhfTUFYX01JUF9MRVZFTF9TSElGVCAgICAgICAyNgorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9NQVhfTUlQX0xFVkVMX01BU0sgICAgICAgICgweGYgPDwgMjYpCisjICAgICAgIGRlZmluZSBSMzAwX1RYX1NJWkVfUFJPSkVDVEVEICAgICAgICAgICAgKDE8PDMwKQorIyAgICAgICBkZWZpbmUgUjMwMF9UWF9TSVpFX1RYUElUQ0hfRU4gICAgICAgICAgICgxPDwzMSkKICNkZWZpbmUgUjMwMF9UWF9GT1JNQVRfMCAgICAgICAgICAgICAgICAgICAgMHg0NEMwCiAJLyogVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBmb3JtYXQgd29yZCBieSBXbGFkaW1pciB2YW4gZGVyIExhYW4gKi8KIAkvKiBUaGUgWCwgWSwgWiBhbmQgVyByZWZlciB0byB0aGUgbGF5b3V0IG9mIHRoZSBjb21wb25lbnRzLgpAQCAtNzYxLDExICs4NTYsMTEgQEAKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0RYVDEJICAgIAkgICAgMHhGCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQzCSAgICAJICAgIDB4MTAKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0RYVDUJICAgIAkgICAgMHgxMQotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRDNETUZUX0N4VjhVOAkgICAgMHgxMgkvKiBubyBzd2l6emxlICovCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BOFI4RzhCOAkgICAgCSAgICAweDEzCS8qIG5vIHN3aXp6bGUgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0I4RzhfQjhHOAkgICAgCSAgICAweDE0CS8qIG5vIHN3aXp6bGUgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0c4UjhfRzhCOAkgICAgCSAgICAweDE1CS8qIG5vIHN3aXp6bGUgKi8KLQkJCQkJCSAgLyogMHgxNiAtIHNvbWUgMTYgYml0IGdyZWVuIGZvcm1hdC4uID8/ICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EM0RNRlRfQ3hWOFU4CSAgICAweDEyICAgICAvKiBubyBzd2l6emxlICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BOFI4RzhCOAkgICAgCSAgICAweDEzICAgICAvKiBubyBzd2l6emxlICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9COEc4X0I4RzgJICAgIAkgICAgMHgxNCAgICAgLyogbm8gc3dpenpsZSAqLworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRzhSOF9HOEI4CSAgICAJICAgIDB4MTUgICAgIC8qIG5vIHN3aXp6bGUgKi8KKwkvKiAweDE2IC0gc29tZSAxNiBiaXQgZ3JlZW4gZm9ybWF0Li4gPz8gKi8KICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1VOSzI1CQkgICAoMSA8PCAyNSkgLyogbm8gc3dpenpsZSAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VCSUNfTUFQCQkgICAoMSA8PCAyNikKIApAQCAtNzkzLDIzICs4ODgsMjYgQEAKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1cJCTMKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1pFUk8JNAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfT05FCTUKLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVVF9aCTYJLyogMi4wKlosIGV2ZXJ5dGhpbmcgYWJvdmUgMS4wIGlzIHNldCB0byAwLjAgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NVVF9XCTcJLyogMi4wKlcsIGV2ZXJ5dGhpbmcgYWJvdmUgMS4wIGlzIHNldCB0byAwLjAgKi8KKwkvKiAyLjAqWiwgZXZlcnl0aGluZyBhYm92ZSAxLjAgaXMgc2V0IHRvIDAuMCAqLworIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VUX1oJNgorCS8qIDIuMCpXLCBldmVyeXRoaW5nIGFib3ZlIDEuMCBpcyBzZXQgdG8gMC4wICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DVVRfVwk3CiAKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0JfU0hJRlQJMTgKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0dfU0hJRlQJMTUKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1JfU0hJRlQJMTIKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0FfU0hJRlQJOQogCS8qIENvbnZlbmllbmNlIG1hY3JvIHRvIHRha2UgY2FyZSBvZiBsYXlvdXQgYW5kIHN3aXp6bGluZyAqLwotIwlkZWZpbmUgUjMwMF9FQVNZX1RYX0ZPUk1BVChCLCBHLCBSLCBBLCBGTVQpCShcCi0JICAoKFIzMDBfVFhfRk9STUFUXyMjQik8PFIzMDBfVFhfRk9STUFUX0JfU0hJRlQpIFwKLQl8ICgoUjMwMF9UWF9GT1JNQVRfIyNHKTw8UjMwMF9UWF9GT1JNQVRfR19TSElGVCkgXAotCXwgKChSMzAwX1RYX0ZPUk1BVF8jI1IpPDxSMzAwX1RYX0ZPUk1BVF9SX1NISUZUKSBcCi0JfCAoKFIzMDBfVFhfRk9STUFUXyMjQSk8PFIzMDBfVFhfRk9STUFUX0FfU0hJRlQpIFwKLQl8IChSMzAwX1RYX0ZPUk1BVF8jI0ZNVCkgXAotCSAgKQotCS8qIFRoZXNlIGNhbiBiZSBPUmVkIHdpdGggcmVzdWx0IG9mIFIzMDBfRUFTWV9UWF9GT1JNQVQoKSAqLwotCS8qIFdlIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhleSBkby4gVGFrZSB2YWx1ZXMgZnJvbSBhIGNvbnN0YW50IGNvbG9yID8gKi8KKyMJZGVmaW5lIFIzMDBfRUFTWV9UWF9GT1JNQVQoQiwgRywgUiwgQSwgRk1UKQkoCQlcCisJCSgoUjMwMF9UWF9GT1JNQVRfIyNCKTw8UjMwMF9UWF9GT1JNQVRfQl9TSElGVCkJCVwKKwkJfCAoKFIzMDBfVFhfRk9STUFUXyMjRyk8PFIzMDBfVFhfRk9STUFUX0dfU0hJRlQpCVwKKwkJfCAoKFIzMDBfVFhfRk9STUFUXyMjUik8PFIzMDBfVFhfRk9STUFUX1JfU0hJRlQpCVwKKwkJfCAoKFIzMDBfVFhfRk9STUFUXyMjQSk8PFIzMDBfVFhfRk9STUFUX0FfU0hJRlQpCVwKKwkJfCAoUjMwMF9UWF9GT1JNQVRfIyNGTVQpCQkJCVwKKwkJKQorCS8qIFRoZXNlIGNhbiBiZSBPUmVkIHdpdGggcmVzdWx0IG9mIFIzMDBfRUFTWV9UWF9GT1JNQVQoKQorCSAgIFdlIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhleSBkby4gVGFrZSB2YWx1ZXMgZnJvbSBhCisgICAgICAgICAgIGNvbnN0YW50IGNvbG9yID8gKi8KICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0NPTlNUX1gJCSgxPDw1KQogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ09OU1RfWQkJKDI8PDUpCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9DT05TVF9aCQkoNDw8NSkKQEAgLTgxOSw3ICs5MTcsNyBAQAogCiAjZGVmaW5lIFIzMDBfVFhfUElUQ0hfMAkJCSAgICAweDQ1MDAgLyogb2J2aW91cyBtaXNzaW5nIGluIGdhcCAqLwogI2RlZmluZSBSMzAwX1RYX09GRlNFVF8wICAgICAgICAgICAgICAgICAgICAweDQ1NDAKLS8qIEJFR0lOOiBHdWVzcyBmcm9tIFIyMDAgKi8KKwkvKiBCRUdJTjogR3Vlc3MgZnJvbSBSMjAwICovCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19FTkRJQU5fTk9fU1dBUCAgICAgICAgICAgKDAgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfVFhPX0VORElBTl9CWVRFX1NXQVAgICAgICAgICAoMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fRU5ESUFOX1dPUkRfU1dBUCAgICAgICAgICgyIDw8IDApCkBAIC04MjgsNTMgKzkyNiw2MSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fTUlDUk9fVElMRSAgICAgICAgICAgICAgICgxIDw8IDMpCiAjICAgICAgIGRlZmluZSBSMzAwX1RYT19PRkZTRVRfTUFTSyAgICAgICAgICAgICAgMHhmZmZmZmZlMAogIyAgICAgICBkZWZpbmUgUjMwMF9UWE9fT0ZGU0VUX1NISUZUICAgICAgICAgICAgIDUKLS8qIEVORCAqLwotI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfMCAgICAgICAgICAgICAgICAgICAgICAweDQ1ODAgLyogMzIgYml0IGNocm9tYSBrZXkgKi8KLSNkZWZpbmUgUjMwMF9UWF9CT1JERVJfQ09MT1JfMCAgICAgICAgICAgICAgMHg0NUMwIC8vZmYwMGZmMDAgPT0geyAwLCAxLjAsIDAsIDEuMCB9CisJLyogRU5EOiBHdWVzcyBmcm9tIFIyMDAgKi8KIAotLyogRU5EICovCisvKiAzMiBiaXQgY2hyb21hIGtleSAqLworI2RlZmluZSBSMzAwX1RYX0NIUk9NQV9LRVlfMCAgICAgICAgICAgICAgICAgICAgICAweDQ1ODAKKy8qIGZmMDBmZjAwID09IHsgMCwgMS4wLCAwLCAxLjAgfSAqLworI2RlZmluZSBSMzAwX1RYX0JPUkRFUl9DT0xPUl8wICAgICAgICAgICAgICAweDQ1QzAKIAotLyogQkVHSU46IEZyYWdtZW50IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0Ci0vLyBGcmFnbWVudCBwcm9ncmFtcyBhcmUgd3JpdHRlbiBkaXJlY3RseSBpbnRvIHJlZ2lzdGVyIHNwYWNlLgotLy8gVGhlcmUgYXJlIHNlcGFyYXRlIGluc3RydWN0aW9uIHN0cmVhbXMgZm9yIHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGFuZCBBTFUKLS8vIGluc3RydWN0aW9ucy4KLS8vIEluIG9yZGVyIHRvIHN5bmNocm9uaXplIHRoZXNlIHN0cmVhbXMsIHRoZSBwcm9ncmFtIGlzIGRpdmlkZWQgaW50byB1cAotLy8gdG8gNCBub2Rlcy4gRWFjaCBub2RlIGJlZ2lucyB3aXRoIGEgbnVtYmVyIG9mIFRFWCBvcGVyYXRpb25zLCBmb2xsb3dlZAotLy8gYnkgYSBudW1iZXIgb2YgQUxVIG9wZXJhdGlvbnMuCi0vLyBUaGUgZmlyc3Qgbm9kZSBjYW4gaGF2ZSB6ZXJvIFRFWCBvcHMsIGFsbCBzdWJzZXF1ZW50IG5vZGVzIG11c3QgaGF2ZSBhdCBsZWFzdAotLy8gb25lIFRFWCBvcHMuCi0vLyBBbGwgbm9kZXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBBTFUgb3AuCi0vLwotLy8gVGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vZGUgaXMgc3RvcmVkIGluIFBGU19DTlRMXzA6IEEgdmFsdWUgb2YgMCBtZWFucwotLy8gMSBub2RlLCBhIHZhbHVlIG9mIDMgbWVhbnMgNCBub2Rlcy4KLS8vIFRoZSB0b3RhbCBhbW91bnQgb2YgaW5zdHJ1Y3Rpb25zIGlzIGRlZmluZWQgaW4gUEZTX0NOVExfMi4gVGhlIG9mZnNldHMgYXJlCi0vLyBvZmZzZXRzIGludG8gdGhlIHJlc3BlY3RpdmUgaW5zdHJ1Y3Rpb24gc3RyZWFtcywgd2hpbGUgKl9FTkQgcG9pbnRzIHRvIHRoZQotLy8gbGFzdCBpbnN0cnVjdGlvbiByZWxhdGl2ZSB0byB0aGlzIG9mZnNldC4gKi8KKy8qIEVORDogVGV4dHVyZSBzcGVjaWZpY2F0aW9uICovCisKKy8qIEJFR0lOOiBGcmFnbWVudCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLworCisvKiBGcmFnbWVudCBwcm9ncmFtcyBhcmUgd3JpdHRlbiBkaXJlY3RseSBpbnRvIHJlZ2lzdGVyIHNwYWNlLgorICogVGhlcmUgYXJlIHNlcGFyYXRlIGluc3RydWN0aW9uIHN0cmVhbXMgZm9yIHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGFuZCBBTFUKKyAqIGluc3RydWN0aW9ucy4KKyAqIEluIG9yZGVyIHRvIHN5bmNocm9uaXplIHRoZXNlIHN0cmVhbXMsIHRoZSBwcm9ncmFtIGlzIGRpdmlkZWQgaW50byB1cAorICogdG8gNCBub2Rlcy4gRWFjaCBub2RlIGJlZ2lucyB3aXRoIGEgbnVtYmVyIG9mIFRFWCBvcGVyYXRpb25zLCBmb2xsb3dlZAorICogYnkgYSBudW1iZXIgb2YgQUxVIG9wZXJhdGlvbnMuCisgKiBUaGUgZmlyc3Qgbm9kZSBjYW4gaGF2ZSB6ZXJvIFRFWCBvcHMsIGFsbCBzdWJzZXF1ZW50IG5vZGVzIG11c3QgaGF2ZSBhdAorICogbGVhc3QKKyAqIG9uZSBURVggb3BzLgorICogQWxsIG5vZGVzIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgQUxVIG9wLgorICoKKyAqIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBub2RlIGlzIHN0b3JlZCBpbiBQRlNfQ05UTF8wOiBBIHZhbHVlIG9mIDAgbWVhbnMKKyAqIDEgbm9kZSwgYSB2YWx1ZSBvZiAzIG1lYW5zIDQgbm9kZXMuCisgKiBUaGUgdG90YWwgYW1vdW50IG9mIGluc3RydWN0aW9ucyBpcyBkZWZpbmVkIGluIFBGU19DTlRMXzIuIFRoZSBvZmZzZXRzIGFyZQorICogb2Zmc2V0cyBpbnRvIHRoZSByZXNwZWN0aXZlIGluc3RydWN0aW9uIHN0cmVhbXMsIHdoaWxlICpfRU5EIHBvaW50cyB0byB0aGUKKyAqIGxhc3QgaW5zdHJ1Y3Rpb24gcmVsYXRpdmUgdG8gdGhpcyBvZmZzZXQuCisgKi8KICNkZWZpbmUgUjMwMF9QRlNfQ05UTF8wICAgICAgICAgICAgICAgICAgICAgMHg0NjAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0xBU1RfTk9ERVNfU0hJRlQgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9MQVNUX05PREVTX01BU0sgICAgICgzIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0ZJUlNUX05PREVfSEFTX1RFWCAgKDEgPDwgMykKICNkZWZpbmUgUjMwMF9QRlNfQ05UTF8xICAgICAgICAgICAgICAgICAgICAgMHg0NjA0CiAvKiBUaGVyZSBpcyBhbiB1bnNoaWZ0ZWQgdmFsdWUgaGVyZSB3aGljaCBoYXMgc28gZmFyIGFsd2F5cyBiZWVuIGVxdWFsIHRvIHRoZQotLy8gaW5kZXggb2YgdGhlIGhpZ2hlc3QgdXNlZCB0ZW1wb3JhcnkgcmVnaXN0ZXIuICovCisgKiBpbmRleCBvZiB0aGUgaGlnaGVzdCB1c2VkIHRlbXBvcmFyeSByZWdpc3Rlci4KKyAqLwogI2RlZmluZSBSMzAwX1BGU19DTlRMXzIgICAgICAgICAgICAgICAgICAgICAweDQ2MDgKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfQUxVX09GRlNFVF9TSElGVCAgICAwCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9PRkZTRVRfTUFTSyAgICAgKDYzIDw8IDApCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX0FMVV9FTkRfU0hJRlQgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfRU5EX01BU0sgICAgICAgICg2MyA8PCAwKQorIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9BTFVfRU5EX01BU0sgICAgICAgICg2MyA8PCA2KQogIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfT0ZGU0VUX1NISUZUICAgIDEyCi0jICAgICAgIGRlZmluZSBSMzAwX1BGU19DTlRMX1RFWF9PRkZTRVRfTUFTSyAgICAgKDMxIDw8IDEyKQkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfT0ZGU0VUX01BU0sgICAgICgzMSA8PCAxMikgLyogR1VFU1MgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX0VORF9TSElGVCAgICAgICAxOAotIyAgICAgICBkZWZpbmUgUjMwMF9QRlNfQ05UTF9URVhfRU5EX01BU0sgICAgICAgICgzMSA8PCAxOCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfUEZTX0NOVExfVEVYX0VORF9NQVNLICAgICAgICAoMzEgPDwgMTgpIC8qIEdVRVNTICovCiAKIC8qIGdhcCAqLworCiAvKiBOb2RlcyBhcmUgc3RvcmVkIGJhY2t3YXJkcy4gVGhlIGxhc3QgYWN0aXZlIG5vZGUgaXMgYWx3YXlzIHN0b3JlZCBpbgotLy8gUEZTX05PREVfMy4KLS8vIEV4YW1wbGU6IEluIGEgMi1ub2RlIHByb2dyYW0sIE5PREVfMCBhbmQgTk9ERV8xIGFyZSBzZXQgdG8gMC4gVGhlCi0vLyBmaXJzdCBub2RlIGlzIHN0b3JlZCBpbiBOT0RFXzIsIHRoZSBzZWNvbmQgbm9kZSBpcyBzdG9yZWQgaW4gTk9ERV8zLgotLy8KLS8vIE9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBtYXN0ZXIgb2Zmc2V0IGZyb20gUEZTX0NOVExfMi4KLS8vIExBU1RfTk9ERSBpcyBzZXQgZm9yIHRoZSBsYXN0IG5vZGUsIGFuZCBvbmx5IGZvciB0aGUgbGFzdCBub2RlLiAqLworICogUEZTX05PREVfMy4KKyAqIEV4YW1wbGU6IEluIGEgMi1ub2RlIHByb2dyYW0sIE5PREVfMCBhbmQgTk9ERV8xIGFyZSBzZXQgdG8gMC4gVGhlCisgKiBmaXJzdCBub2RlIGlzIHN0b3JlZCBpbiBOT0RFXzIsIHRoZSBzZWNvbmQgbm9kZSBpcyBzdG9yZWQgaW4gTk9ERV8zLgorICoKKyAqIE9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBtYXN0ZXIgb2Zmc2V0IGZyb20gUEZTX0NOVExfMi4KKyAqLwogI2RlZmluZSBSMzAwX1BGU19OT0RFXzAgICAgICAgICAgICAgICAgICAgICAweDQ2MTAKICNkZWZpbmUgUjMwMF9QRlNfTk9ERV8xICAgICAgICAgICAgICAgICAgICAgMHg0NjE0CiAjZGVmaW5lIFIzMDBfUEZTX05PREVfMiAgICAgICAgICAgICAgICAgICAgIDB4NDYxOApAQCAtODg3LDkxICs5OTMsOTggQEAKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfVEVYX09GRlNFVF9NQVNLICAgICAoMzEgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX1BGU19OT0RFX1RFWF9FTkRfU0hJRlQgICAgICAgMTcKICMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfVEVYX0VORF9NQVNLICAgICAgICAoMzEgPDwgMTcpCi0vKiMgICAgICAgZGVmaW5lIFIzMDBfUEZTX05PREVfTEFTVF9OT0RFICAgICAgICAgICAoMSA8PCAyMikgKi8KICMJCWRlZmluZSBSMzAwX1BGU19OT0RFX09VVFBVVF9DT0xPUiAgICAgICAgKDEgPDwgMjIpCiAjCQlkZWZpbmUgUjMwMF9QRlNfTk9ERV9PVVRQVVRfREVQVEggICAgICAgICgxIDw8IDIzKQogCiAvKiBURVgKLS8vIEFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0ZXh0dXJlIGluc3RydWN0aW9ucyBjYW5ub3Qgd3JpdGUgaW50byBvdXRwdXQKLS8vIHJlZ2lzdGVycyBkaXJlY3RseS4gQSBzdWJzZXF1ZW50IEFMVSBpbnN0cnVjdGlvbiBpcyBhbHdheXMgbmVjZXNzYXJ5LAotLy8gZXZlbiBpZiBpdCdzIGp1c3QgTUFEIG8wLCByMCwgMSwgMCAqLworICogQXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRleHR1cmUgaW5zdHJ1Y3Rpb25zIGNhbm5vdCB3cml0ZSBpbnRvIG91dHB1dAorICogcmVnaXN0ZXJzIGRpcmVjdGx5LiBBIHN1YnNlcXVlbnQgQUxVIGluc3RydWN0aW9uIGlzIGFsd2F5cyBuZWNlc3NhcnksCisgKiBldmVuIGlmIGl0J3MganVzdCBNQUQgbzAsIHIwLCAxLCAwCisgKi8KICNkZWZpbmUgUjMwMF9QRlNfVEVYSV8wICAgICAgICAgICAgICAgICAgICAgMHg0NjIwCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX1NSQ19TSElGVCAgICAgICAgICAgICAgMAotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9TUkNfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCAwKQotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9TUkNfQ09OU1QgICAgICAgICAgICAgICgxIDw8IDUpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0RTVF9TSElGVCAgICAgICAgICAgICAgNgotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9EU1RfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCA2KQotIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9TSElGVCAgICAgICAgICAgIDExCi0jICAgICAgIGRlZmluZSBSMzAwX0ZQSVRYX0lNQUdFX01BU0sgICAgICAgICAgICAgKDE1IDw8IDExKQkvKiBHVUVTUyBiYXNlZCBvbiBsYXlvdXQgYW5kIG5hdGl2ZSBsaW1pdHMgKi8KKyMJZGVmaW5lIFIzMDBfRlBJVFhfU1JDX1NISUZUICAgICAgICAgICAgICAwCisjCWRlZmluZSBSMzAwX0ZQSVRYX1NSQ19NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDApCisJLyogR1VFU1MgKi8KKyMJZGVmaW5lIFIzMDBfRlBJVFhfU1JDX0NPTlNUICAgICAgICAgICAgICAoMSA8PCA1KQorIwlkZWZpbmUgUjMwMF9GUElUWF9EU1RfU0hJRlQgICAgICAgICAgICAgIDYKKyMJZGVmaW5lIFIzMDBfRlBJVFhfRFNUX01BU0sgICAgICAgICAgICAgICAoMzEgPDwgNikKKyMJZGVmaW5lIFIzMDBfRlBJVFhfSU1BR0VfU0hJRlQgICAgICAgICAgICAxMQorCS8qIEdVRVNTIGJhc2VkIG9uIGxheW91dCBhbmQgbmF0aXZlIGxpbWl0cyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9GUElUWF9JTUFHRV9NQVNLICAgICAgICAgICAgICgxNSA8PCAxMSkKIC8qIFVuc3VyZSBpZiB0aGVzZSBhcmUgb3Bjb2Rlcywgb3Igc29tZSBraW5kIG9mIGJpdGZpZWxkLCBidXQgdGhpcyBpcyBob3cKICAqIHRoZXkgd2VyZSBzZXQgd2hlbiBJIGNoZWNrZWQKICAqLwotIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BDT0RFX1NISUZUCQkJMTUKLSMJCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9URVgJCQkxCi0jCQkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfS0lMCQkJMgotIwkJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYUAkJCTMKLSMJCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9UWEIJCQk0CisjCWRlZmluZSBSMzAwX0ZQSVRYX09QQ09ERV9TSElGVAkJMTUKKyMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RFWAkxCisjCQlkZWZpbmUgUjMwMF9GUElUWF9PUF9LSUwJMgorIwkJZGVmaW5lIFIzMDBfRlBJVFhfT1BfVFhQCTMKKyMJCWRlZmluZSBSMzAwX0ZQSVRYX09QX1RYQgk0CisjCWRlZmluZSBSMzAwX0ZQSVRYX09QQ09ERV9NQVNLICAgICAgICAgICAoNyA8PCAxNSkKIAogLyogQUxVCi0vLyBUaGUgQUxVIGluc3RydWN0aW9ucyByZWdpc3RlciBibG9ja3MgYXJlIGVudW1lcmF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlcgotLy8gaW4gd2hpY2ggZmdscnguIEkgYXNzdW1lIHRoZXJlIGlzIHNwYWNlIGZvciA2NCBpbnN0cnVjdGlvbnMsIHNpbmNlCi0vLyBlYWNoIGJsb2NrIGhhcyBzcGFjZSBmb3IgYSBtYXhpbXVtIG9mIDY0IERXT1JEcywgYW5kIHRoaXMgbWF0Y2hlcyByZXBvcnRlZAotLy8gbmF0aXZlIGxpbWl0cy4KLS8vCi0vLyBUaGUgYmFzaWMgZnVuY3Rpb25hbCBibG9jayBzZWVtcyB0byBiZSBvbmUgTUFEIGZvciBlYWNoIGNvbG9yIGFuZCBhbHBoYSwKLS8vIGFuZCBhbiBhZGRlciB0aGF0IGFkZHMgYWxsIGNvbXBvbmVudHMgYWZ0ZXIgdGhlIE1VTC4KLS8vICAtIEFERCwgTVVMLCBNQUQgZXRjLjogdXNlIE1BRCB3aXRoIGFwcHJvcHJpYXRlIG5ldXRyYWwgb3BlcmFuZHMKLS8vICAtIERQNDogVXNlIE9VVENfRFA0LCBPVVRBX0RQNAotLy8gIC0gRFAzOiBVc2UgT1VUQ19EUDMsIE9VVEFfRFA0LCBhcHByb3ByaWF0ZSBhbHBoYSBvcGVyYW5kcwotLy8gIC0gRFBIOiBVc2UgT1VUQ19EUDQsIE9VVEFfRFA0LCBhcHByb3ByaWF0ZSBhbHBoYSBvcGVyYW5kcwotLy8gIC0gQ01QOiBJZiBBUkcyIDwgMCwgcmV0dXJuIEFSRzEsIGVsc2UgcmV0dXJuIEFSRzAKLS8vICAtIEZMUjogdXNlIEZSQytNQUQKLS8vICAtIFhQRDogdXNlIE1BRCtNQUQKLS8vICAtIFNHRSwgU0xUOiB1c2UgTUFEK0NNUAotLy8gIC0gUlNROiB1c2UgQUJTIG1vZGlmaWVyIGZvciBhcmd1bWVudAotLy8gIC0gVXNlIE9VVENfUkVQTF9BTFBIQSB0byB3cml0ZSByZXN1bHRzIG9mIGFuIGFscGhhLW9ubHkgb3BlcmF0aW9uIChlLmcuIFJDUCkKLS8vICAgIGludG8gY29sb3IgcmVnaXN0ZXIKLS8vICAtIGFwcGFyZW50bHksIHRoZXJlJ3Mgbm8gcXVpY2sgRFNUIG9wZXJhdGlvbgotLy8gIC0gZmdscnggc2V0IEZQSTJfVU5LTk9XTl8zMSBvbiBhICJNQUQgZnJhZ21lbnQuY29sb3IsIHRtcDAsIHRtcDEsIHRtcDIiCi0vLyAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BWCByMiwgcjEsIGMwIgotLy8gIC0gZmdscnggb25jZSBzZXQgRlBJMF9VTktOT1dOXzMxIG9uIGEgIkZSQyByMSwgcjEiCi0vLwotLy8gT3BlcmFuZCBzZWxlY3Rpb24KLS8vIEZpcnN0IHN0YWdlIHNlbGVjdHMgdGhyZWUgc291cmNlcyBmcm9tIHRoZSBhdmFpbGFibGUgcmVnaXN0ZXJzIGFuZAotLy8gY29uc3RhbnQgcGFyYW1ldGVycy4gVGhpcyBpcyBkZWZpbmVkIGluIElOU1RSMSAoY29sb3IpIGFuZCBJTlNUUjMgKGFscGhhKS4KLS8vIGZnbHJ4IHNvcnRzIHRoZSB0aHJlZSBzb3VyY2UgZmllbGRzOiBSZWdpc3RlcnMgYmVmb3JlIGNvbnN0YW50cywKLS8vIGxvd2VyIGluZGljZXMgYmVmb3JlIGhpZ2hlciBpbmRpY2VzOyBJIGRvIG5vdCBrbm93IHdoZXRoZXIgdGhpcyBpcyBuZWNlc3NhcnkuCi0vLyBmZ2xyeCBmaWxscyB1bnVzZWQgc291cmNlcyB3aXRoICJyZWFkIGNvbnN0YW50IDAiCi0vLyBBY2NvcmRpbmcgdG8gc3BlY3MsIHlvdSBjYW5ub3Qgc2VsZWN0IG1vcmUgdGhhbiB0d28gZGlmZmVyZW50IGNvbnN0YW50cy4KLS8vCi0vLyBTZWNvbmQgc3RhZ2Ugc2VsZWN0cyB0aGUgb3BlcmFuZHMgZnJvbSB0aGUgc291cmNlcy4gVGhpcyBpcyBkZWZpbmVkIGluCi0vLyBJTlNUUjAgKGNvbG9yKSBhbmQgSU5TVFIyIChhbHBoYSkuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIHNwZWNpYWwgY29uc3RhbnRzCi0vLyB6ZXJvIGFuZCBvbmUuCi0vLyBTd2l6emxpbmcgYW5kIG5lZ2F0aW9uIGhhcHBlbnMgaW4gdGhpcyBzdGFnZSwgYXMgd2VsbC4KLS8vCi0vLyBJbXBvcnRhbnQ6IENvbG9yIGFuZCBhbHBoYSBzZWVtIHRvIGJlIG1vc3RseSBzZXBhcmF0ZSwgaS5lLiB0aGVpciBzb3VyY2VzCi0vLyBzZWxlY3Rpb24gYXBwZWFycyB0byBiZSBmdWxseSBpbmRlcGVuZGVudCAodGhlIHJlZ2lzdGVyIHN0b3JhZ2UgaXMgcHJvYmFibHkKLS8vIHBoeXNpY2FsbHkgc3BsaXQgaW50byBhIGNvbG9yIGFuZCBhbiBhbHBoYSBzZWN0aW9uKS4KLS8vIEhvd2V2ZXIgKGJlY2F1c2Ugb2YgdGhlIGFwcGFyZW50IHBoeXNpY2FsIHNwbGl0KSwgdGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbgotLy8gV1JUIHN3aXp6bGluZy4gSWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudCB0byBsb2FkIGFuIFIgY29tcG9uZW50IGludG8gYW4KLS8vIEFscGhhIG9wZXJhbmQsIHRoaXMgUiBjb21wb25lbnQgaXMgdGFrZW4gZnJvbSBhICpjb2xvciogc291cmNlLCBub3QgZnJvbQotLy8gYW4gYWxwaGEgc291cmNlLiBUaGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBkb2Vzbid0IGV2ZW4gaGF2ZSB0byBhcHBlYXIgaW4KLS8vIHRoZSBhbHBoYSBzb3VyY2VzIGxpc3QuIChJIGhvcGUgdGhpcyBhbGxsIG1ha2VzIHNlbnNlIHRvIHlvdSkKLS8vCi0vLyBEZXN0aW5hdGlvbiBzZWxlY3Rpb24KLS8vIFRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbmRleCBpcyBpbiBGUEkxIChjb2xvcikgYW5kIEZQSTMgKGFscGhhKSB0b2dldGhlcgotLy8gd2l0aCBlbmFibGUgYml0cy4KLS8vIFRoZXJlIGFyZSBzZXBhcmF0ZSBlbmFibGUgYml0cyBmb3Igd3JpdGluZyBpbnRvIHRlbXBvcmFyeSByZWdpc3RlcnMKLS8vIChEU1RDX1JFR18qIC9EU1RBX1JFRykgYW5kIGFuZCBwcm9ncmFtIG91dHB1dCByZWdpc3RlcnMgKERTVENfT1VUUFVUXyogL0RTVEFfT1VUUFVUKS4KLS8vIFlvdSBjYW4gd3JpdGUgdG8gYm90aCBhdCBvbmNlLCBvciBub3Qgd3JpdGUgYXQgYWxsICh0aGUgc2FtZSBpbmRleAotLy8gbXVzdCBiZSB1c2VkIGZvciBib3RoKS4KLS8vCi0vLyBOb3RlOiBUaGVyZSBpcyBhIHNwZWNpYWwgZm9ybSBmb3IgTFJQCi0vLyAgLSBBcmd1bWVudCBvcmRlciBpcyB0aGUgc2FtZSBhcyBpbiBBUkJfZnJhZ21lbnRfcHJvZ3JhbS4KLS8vICAtIE9wZXJhdGlvbiBpcyBNQUQKLS8vICAtIEFSRzEgaXMgc2V0IHRvIEFSR0NfU1JDMUNfTFJQL0FSR0NfU1JDMUFfTFJQCi0vLyAgLSBTZXQgRlBJMC9GUEkyX1NQRUNJQUxfTFJQCi0vLyBBcmJpdHJhcnkgTFJQIChpbmNsdWRpbmcgc3VwcG9ydCBmb3Igc3dpenpsaW5nKSByZXF1aXJlcyB2YW5pbGxhIE1BRCtNQUQgKi8KKyAqIFRoZSBBTFUgaW5zdHJ1Y3Rpb25zIHJlZ2lzdGVyIGJsb2NrcyBhcmUgZW51bWVyYXRlZCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyCisgKiBpbiB3aGljaCBmZ2xyeC4gSSBhc3N1bWUgdGhlcmUgaXMgc3BhY2UgZm9yIDY0IGluc3RydWN0aW9ucywgc2luY2UKKyAqIGVhY2ggYmxvY2sgaGFzIHNwYWNlIGZvciBhIG1heGltdW0gb2YgNjQgRFdPUkRzLCBhbmQgdGhpcyBtYXRjaGVzIHJlcG9ydGVkCisgKiBuYXRpdmUgbGltaXRzLgorICoKKyAqIFRoZSBiYXNpYyBmdW5jdGlvbmFsIGJsb2NrIHNlZW1zIHRvIGJlIG9uZSBNQUQgZm9yIGVhY2ggY29sb3IgYW5kIGFscGhhLAorICogYW5kIGFuIGFkZGVyIHRoYXQgYWRkcyBhbGwgY29tcG9uZW50cyBhZnRlciB0aGUgTVVMLgorICogIC0gQURELCBNVUwsIE1BRCBldGMuOiB1c2UgTUFEIHdpdGggYXBwcm9wcmlhdGUgbmV1dHJhbCBvcGVyYW5kcworICogIC0gRFA0OiBVc2UgT1VUQ19EUDQsIE9VVEFfRFA0CisgKiAgLSBEUDM6IFVzZSBPVVRDX0RQMywgT1VUQV9EUDQsIGFwcHJvcHJpYXRlIGFscGhhIG9wZXJhbmRzCisgKiAgLSBEUEg6IFVzZSBPVVRDX0RQNCwgT1VUQV9EUDQsIGFwcHJvcHJpYXRlIGFscGhhIG9wZXJhbmRzCisgKiAgLSBDTVBIOiBJZiBBUkcyID4gMC41LCByZXR1cm4gQVJHMCwgZWxzZSByZXR1cm4gQVJHMQorICogIC0gQ01QOiBJZiBBUkcyIDwgMCwgcmV0dXJuIEFSRzEsIGVsc2UgcmV0dXJuIEFSRzAKKyAqICAtIEZMUjogdXNlIEZSQytNQUQKKyAqICAtIFhQRDogdXNlIE1BRCtNQUQKKyAqICAtIFNHRSwgU0xUOiB1c2UgTUFEK0NNUAorICogIC0gUlNROiB1c2UgQUJTIG1vZGlmaWVyIGZvciBhcmd1bWVudAorICogIC0gVXNlIE9VVENfUkVQTF9BTFBIQSB0byB3cml0ZSByZXN1bHRzIG9mIGFuIGFscGhhLW9ubHkgb3BlcmF0aW9uCisgKiAgICAoZS5nLiBSQ1ApIGludG8gY29sb3IgcmVnaXN0ZXIKKyAqICAtIGFwcGFyZW50bHksIHRoZXJlJ3Mgbm8gcXVpY2sgRFNUIG9wZXJhdGlvbgorICogIC0gZmdscnggc2V0IEZQSTJfVU5LTk9XTl8zMSBvbiBhICJNQUQgZnJhZ21lbnQuY29sb3IsIHRtcDAsIHRtcDEsIHRtcDIiCisgKiAgLSBmZ2xyeCBzZXQgRlBJMl9VTktOT1dOXzMxIG9uIGEgIk1BWCByMiwgcjEsIGMwIgorICogIC0gZmdscnggb25jZSBzZXQgRlBJMF9VTktOT1dOXzMxIG9uIGEgIkZSQyByMSwgcjEiCisgKgorICogT3BlcmFuZCBzZWxlY3Rpb24KKyAqIEZpcnN0IHN0YWdlIHNlbGVjdHMgdGhyZWUgc291cmNlcyBmcm9tIHRoZSBhdmFpbGFibGUgcmVnaXN0ZXJzIGFuZAorICogY29uc3RhbnQgcGFyYW1ldGVycy4gVGhpcyBpcyBkZWZpbmVkIGluIElOU1RSMSAoY29sb3IpIGFuZCBJTlNUUjMgKGFscGhhKS4KKyAqIGZnbHJ4IHNvcnRzIHRoZSB0aHJlZSBzb3VyY2UgZmllbGRzOiBSZWdpc3RlcnMgYmVmb3JlIGNvbnN0YW50cywKKyAqIGxvd2VyIGluZGljZXMgYmVmb3JlIGhpZ2hlciBpbmRpY2VzOyBJIGRvIG5vdCBrbm93IHdoZXRoZXIgdGhpcyBpcworICogbmVjZXNzYXJ5LgorICoKKyAqIGZnbHJ4IGZpbGxzIHVudXNlZCBzb3VyY2VzIHdpdGggInJlYWQgY29uc3RhbnQgMCIKKyAqIEFjY29yZGluZyB0byBzcGVjcywgeW91IGNhbm5vdCBzZWxlY3QgbW9yZSB0aGFuIHR3byBkaWZmZXJlbnQgY29uc3RhbnRzLgorICoKKyAqIFNlY29uZCBzdGFnZSBzZWxlY3RzIHRoZSBvcGVyYW5kcyBmcm9tIHRoZSBzb3VyY2VzLiBUaGlzIGlzIGRlZmluZWQgaW4KKyAqIElOU1RSMCAoY29sb3IpIGFuZCBJTlNUUjIgKGFscGhhKS4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgc3BlY2lhbCBjb25zdGFudHMKKyAqIHplcm8gYW5kIG9uZS4KKyAqIFN3aXp6bGluZyBhbmQgbmVnYXRpb24gaGFwcGVucyBpbiB0aGlzIHN0YWdlLCBhcyB3ZWxsLgorICoKKyAqIEltcG9ydGFudDogQ29sb3IgYW5kIGFscGhhIHNlZW0gdG8gYmUgbW9zdGx5IHNlcGFyYXRlLCBpLmUuIHRoZWlyIHNvdXJjZXMKKyAqIHNlbGVjdGlvbiBhcHBlYXJzIHRvIGJlIGZ1bGx5IGluZGVwZW5kZW50ICh0aGUgcmVnaXN0ZXIgc3RvcmFnZSBpcyBwcm9iYWJseQorICogcGh5c2ljYWxseSBzcGxpdCBpbnRvIGEgY29sb3IgYW5kIGFuIGFscGhhIHNlY3Rpb24pLgorICogSG93ZXZlciAoYmVjYXVzZSBvZiB0aGUgYXBwYXJlbnQgcGh5c2ljYWwgc3BsaXQpLCB0aGVyZSBpcyBzb21lIGludGVyYWN0aW9uCisgKiBXUlQgc3dpenpsaW5nLiBJZiwgZm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIGxvYWQgYW4gUiBjb21wb25lbnQgaW50byBhbgorICogQWxwaGEgb3BlcmFuZCwgdGhpcyBSIGNvbXBvbmVudCBpcyB0YWtlbiBmcm9tIGEgKmNvbG9yKiBzb3VyY2UsIG5vdCBmcm9tCisgKiBhbiBhbHBoYSBzb3VyY2UuIFRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIGRvZXNuJ3QgZXZlbiBoYXZlIHRvIGFwcGVhciBpbgorICogdGhlIGFscGhhIHNvdXJjZXMgbGlzdC4gKEkgaG9wZSB0aGlzIGFsbCBtYWtlcyBzZW5zZSB0byB5b3UpCisgKgorICogRGVzdGluYXRpb24gc2VsZWN0aW9uCisgKiBUaGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgaW5kZXggaXMgaW4gRlBJMSAoY29sb3IpIGFuZCBGUEkzIChhbHBoYSkKKyAqIHRvZ2V0aGVyIHdpdGggZW5hYmxlIGJpdHMuCisgKiBUaGVyZSBhcmUgc2VwYXJhdGUgZW5hYmxlIGJpdHMgZm9yIHdyaXRpbmcgaW50byB0ZW1wb3JhcnkgcmVnaXN0ZXJzCisgKiAoRFNUQ19SRUdfKiAvRFNUQV9SRUcpIGFuZCBhbmQgcHJvZ3JhbSBvdXRwdXQgcmVnaXN0ZXJzIChEU1RDX09VVFBVVF8qCisgKiAvRFNUQV9PVVRQVVQpLiBZb3UgY2FuIHdyaXRlIHRvIGJvdGggYXQgb25jZSwgb3Igbm90IHdyaXRlIGF0IGFsbCAodGhlCisgKiBzYW1lIGluZGV4IG11c3QgYmUgdXNlZCBmb3IgYm90aCkuCisgKgorICogTm90ZTogVGhlcmUgaXMgYSBzcGVjaWFsIGZvcm0gZm9yIExSUAorICogIC0gQXJndW1lbnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgaW4gQVJCX2ZyYWdtZW50X3Byb2dyYW0uCisgKiAgLSBPcGVyYXRpb24gaXMgTUFECisgKiAgLSBBUkcxIGlzIHNldCB0byBBUkdDX1NSQzFDX0xSUC9BUkdDX1NSQzFBX0xSUAorICogIC0gU2V0IEZQSTAvRlBJMl9TUEVDSUFMX0xSUAorICogQXJiaXRyYXJ5IExSUCAoaW5jbHVkaW5nIHN1cHBvcnQgZm9yIHN3aXp6bGluZykgcmVxdWlyZXMgdmFuaWxsYSBNQUQrTUFECisgKi8KICNkZWZpbmUgUjMwMF9QRlNfSU5TVFIxXzAgICAgICAgICAgICAgICAgICAgMHg0NkMwCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMENfU0hJRlQgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzBDX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQpAQCAtOTgyLDYgKzEwOTUsNyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzJDX1NISUZUICAgICAgICAgICAgIDEyCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTFfU1JDMkNfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQzJDX0NPTlNUICAgICAgICAgICAgICgxIDw8IDE3KQorIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX1NSQ19NQVNLICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmYKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMV9EU1RDX1NISUZUICAgICAgICAgICAgICAxOAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkxX0RTVENfTUFTSyAgICAgICAgICAgICAgICgzMSA8PCAxOCkKICMJCWRlZmluZSBSMzAwX0ZQSTFfRFNUQ19SRUdfTUFTS19TSElGVCAgICAgMjMKQEAgLTEwMDMsNiArMTExNyw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfU1JDMkFfU0hJRlQgICAgICAgICAgICAgMTIKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJM19TUkMyQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfU1JDMkFfQ09OU1QgICAgICAgICAgICAgKDEgPDwgMTcpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfU1JDX01BU0sgICAgICAgICAgICAgICAgMHgwMDAzZmZmZgogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX0RTVEFfU0hJRlQgICAgICAgICAgICAgIDE4CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTNfRFNUQV9NQVNLICAgICAgICAgICAgICAgKDMxIDw8IDE4KQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkzX0RTVEFfUkVHICAgICAgICAgICAgICAgICgxIDw8IDIzKQpAQCAtMTAyOCw3ICsxMTQzLDggQEAKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzFDX0xSUCAgICAgICAgICAxNQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfWkVSTyAgICAgICAgICAgICAgIDIwCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19PTkUgICAgICAgICAgICAgICAgMjEKLSMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX0hBTEYgICAgICAgICAgICAgICAyMgkvKiBHVUVTUyAqLworCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19IQUxGICAgICAgICAgICAgICAgMjIKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMF9BUkdDX1NSQzBDX1laWCAgICAgICAgICAyMwogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkwX0FSR0NfU1JDMUNfWVpYICAgICAgICAgIDI0CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfQVJHQ19TUkMyQ19ZWlggICAgICAgICAgMjUKQEAgLTEwNTcsNiArMTE3Myw3IEBACiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19EUDQgICAgICAgICAgICAgICAgKDIgPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19NSU4gICAgICAgICAgICAgICAgKDQgPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19NQVggICAgICAgICAgICAgICAgKDUgPDwgMjMpCisjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19DTVBIICAgICAgICAgICAgICAgKDcgPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19DTVAgICAgICAgICAgICAgICAgKDggPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19GUkMgICAgICAgICAgICAgICAgKDkgPDwgMjMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTBfT1VUQ19SRVBMX0FMUEhBICAgICAgICAgKDEwIDw8IDIzKQpAQCAtMTA3OSwyMCArMTE5NiwyMyBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfU1JDMUFfTFJQICAgICAgICAgIDE1CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHQV9aRVJPICAgICAgICAgICAgICAgMTYKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkdBX09ORSAgICAgICAgICAgICAgICAxNwotIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfSEFMRiAgICAgICAgICAgICAgIDE4CS8qIEdVRVNTICovCi0KKwkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSR0FfSEFMRiAgICAgICAgICAgICAgIDE4CiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMEFfU0hJRlQgICAgICAgICAgICAgMAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX01BU0sgICAgICAgICAgICAgICgzMSA8PCAwKQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX05FRyAgICAgICAgICAgICAgICgxIDw8IDUpCi0jCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX0FCUwkJCQkgKDEgPDwgNikJLyogR1VFU1MgKi8KKwkvKiBHVUVTUyAqLworIwlkZWZpbmUgUjMwMF9GUEkyX0FSRzBBX0FCUwkJICgxIDw8IDYpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfU0hJRlQgICAgICAgICAgICAgNwogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX01BU0sgICAgICAgICAgICAgICgzMSA8PCA3KQogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX0FSRzFBX05FRyAgICAgICAgICAgICAgICgxIDw8IDEyKQotIwkJZGVmaW5lIFIzMDBfRlBJMl9BUkcxQV9BQlMJCQkJICgxIDw8IDEzKQkvKiBHVUVTUyAqLworCS8qIEdVRVNTICovCisjCWRlZmluZSBSMzAwX0ZQSTJfQVJHMUFfQUJTCQkgKDEgPDwgMTMpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfU0hJRlQgICAgICAgICAgICAgMTQKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9NQVNLICAgICAgICAgICAgICAoMzEgPDwgMTQpCiAjICAgICAgIGRlZmluZSBSMzAwX0ZQSTJfQVJHMkFfTkVHICAgICAgICAgICAgICAgKDEgPDwgMTkpCi0jCQlkZWZpbmUgUjMwMF9GUEkyX0FSRzJBX0FCUwkJCQkgKDEgPDwgMjApCS8qIEdVRVNTICovCisJLyogR1VFU1MgKi8KKyMJZGVmaW5lIFIzMDBfRlBJMl9BUkcyQV9BQlMJCSAoMSA8PCAyMCkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9TUEVDSUFMX0xSUCAgICAgICAgICAgICAoMSA8PCAyMSkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX01BRCAgICAgICAgICAgICAgICAoMCA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX0RQNCAgICAgICAgICAgICAgICAoMSA8PCAyMykKQEAgLTExMDYsOSArMTIyNiwxOSBAQAogIyAgICAgICBkZWZpbmUgUjMwMF9GUEkyX09VVEFfUlNRICAgICAgICAgICAgICAgICgxMSA8PCAyMykKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9PVVRBX1NBVCAgICAgICAgICAgICAgICAoMSA8PCAzMCkKICMgICAgICAgZGVmaW5lIFIzMDBfRlBJMl9VTktOT1dOXzMxICAgICAgICAgICAgICAoMSA8PCAzMSkKLS8qIEVORCAqLworLyogRU5EOiBGcmFnbWVudCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLwogCi0vKiBnYXAgKi8KKy8qIEZvZyBzdGF0ZSBhbmQgY29sb3IgKi8KKyNkZWZpbmUgUjMwMF9SRV9GT0dfU1RBVEUgICAgICAgICAgICAgICAgICAgMHg0QkMwCisjICAgICAgIGRlZmluZSBSMzAwX0ZPR19FTkFCTEUgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyMJZGVmaW5lIFIzMDBfRk9HX01PREVfTElORUFSICAgICAgICAgICAgICAoMCA8PCAxKQorIwlkZWZpbmUgUjMwMF9GT0dfTU9ERV9FWFAgICAgICAgICAgICAgICAgICgxIDw8IDEpCisjCWRlZmluZSBSMzAwX0ZPR19NT0RFX0VYUDIgICAgICAgICAgICAgICAgKDIgPDwgMSkKKyMJZGVmaW5lIFIzMDBfRk9HX01PREVfTUFTSyAgICAgICAgICAgICAgICAoMyA8PCAxKQorI2RlZmluZSBSMzAwX0ZPR19DT0xPUl9SICAgICAgICAgICAgICAgICAgICAweDRCQzgKKyNkZWZpbmUgUjMwMF9GT0dfQ09MT1JfRyAgICAgICAgICAgICAgICAgICAgMHg0QkNDCisjZGVmaW5lIFIzMDBfRk9HX0NPTE9SX0IgICAgICAgICAgICAgICAgICAgIDB4NEJEMAorCiAjZGVmaW5lIFIzMDBfUFBfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgIDB4NEJENAogIyAgICAgICBkZWZpbmUgUjMwMF9SRUZfQUxQSEFfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwZmYKICMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9GQUlMICAgICAgICAgICAgICAoMCA8PCA4KQpAQCAtMTEyMyw2ICsxMjUzLDcgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfQUxQSEFfVEVTVF9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxMSkKIAogLyogZ2FwICovCisKIC8qIEZyYWdtZW50IHByb2dyYW0gcGFyYW1ldGVycyBpbiA3LjE2IGZsb2F0aW5nIHBvaW50ICovCiAjZGVmaW5lIFIzMDBfUEZTX1BBUkFNXzBfWCAgICAgICAgICAgICAgICAgIDB4NEMwMAogI2RlZmluZSBSMzAwX1BGU19QQVJBTV8wX1kgICAgICAgICAgICAgICAgICAweDRDMDQKQEAgLTExMzUsNDUgKzEyNjYsNDggQEAKICNkZWZpbmUgUjMwMF9QRlNfUEFSQU1fMzFfVyAgICAgICAgICAgICAgICAgMHg0REZDCiAKIC8qIE5vdGVzOgotLy8gLSBBRkFJSyBmZ2xyeCBhbHdheXMgc2V0cyBCTEVORF9VTktOT1dOIHdoZW4gYmxlbmRpbmcgaXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24KLS8vIC0gQUZBSUsgZmdscnggYWx3YXlzIHNldHMgQkxFTkRfTk9fU0VQQVJBVEUgd2hlbiBDQkxFTkQgYW5kIEFCTEVORCBhcmUgc2V0IHRvIHRoZSBzYW1lCi0vLyAgIGZ1bmN0aW9uIChib3RoIHJlZ2lzdGVycyBhcmUgYWx3YXlzIHNldCB1cCBjb21wbGV0ZWx5IGluIGFueSBjYXNlKQotLy8gLSBNb3N0IGJsZW5kIGZsYWdzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gUjIwMCBhbmQgbm90IHRlc3RlZCB5ZXQgKi8KKyAqIC0gQUZBSUsgZmdscnggYWx3YXlzIHNldHMgQkxFTkRfVU5LTk9XTiB3aGVuIGJsZW5kaW5nIGlzIHVzZWQgaW4KKyAqICAgdGhlIGFwcGxpY2F0aW9uCisgKiAtIEFGQUlLIGZnbHJ4IGFsd2F5cyBzZXRzIEJMRU5EX05PX1NFUEFSQVRFIHdoZW4gQ0JMRU5EIGFuZCBBQkxFTkQKKyAqICAgIGFyZSBzZXQgdG8gdGhlIHNhbWUKKyAqICAgZnVuY3Rpb24gKGJvdGggcmVnaXN0ZXJzIGFyZSBhbHdheXMgc2V0IHVwIGNvbXBsZXRlbHkgaW4gYW55IGNhc2UpCisgKiAtIE1vc3QgYmxlbmQgZmxhZ3MgYXJlIHNpbXBseSBjb3BpZWQgZnJvbSBSMjAwIGFuZCBub3QgdGVzdGVkIHlldAorICovCiAjZGVmaW5lIFIzMDBfUkIzRF9DQkxFTkQgICAgICAgICAgICAgICAgICAgIDB4NEUwNAogI2RlZmluZSBSMzAwX1JCM0RfQUJMRU5EICAgICAgICAgICAgICAgICAgICAweDRFMDgKLSAvKiB0aGUgZm9sbG93aW5nIG9ubHkgYXBwZWFyIGluIENCTEVORCAqLworLyogdGhlIGZvbGxvd2luZyBvbmx5IGFwcGVhciBpbiBDQkxFTkQgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKICMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgKDMgPDwgMSkKICMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfTk9fU0VQQVJBVEUgICAgICAgICAgICAgICAgKDEgPDwgMykKLSAvKiB0aGUgZm9sbG93aW5nIGFyZSBzaGFyZWQgYmV0d2VlbiBDQkxFTkQgYW5kIEFCTEVORCAqLworLyogdGhlIGZvbGxvd2luZyBhcmUgc2hhcmVkIGJldHdlZW4gQ0JMRU5EIGFuZCBBQkxFTkQgKi8KICMgICAgICAgZGVmaW5lIFIzMDBfRkNOX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgKDMgIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9BRERfQ0xBTVAgICAgICAgICAgICAgICAoMCAgPDwgMTIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX0FERF9OT0NMQU1QICAgICAgICAgICAgICgxICA8PCAxMikKICMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fU1VCX0NMQU1QICAgICAgICAgICAgICAgKDIgIDw8IDEyKQogIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9TVUJfTk9DTEFNUCAgICAgICAgICAgICAoMyAgPDwgMTIpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9aRVJPICAgICAgICAgICAgICAgICgzMiA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORSAgICAgICAgICAgICAgICAgKDMzIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfU1JDX0NPTE9SICAgICAgICAgICAoMzQgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0NPTE9SICgzNSA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX0RTVF9DT0xPUiAgICAgICAgICAgKDM2IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9DT0xPUiAoMzcgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9TUkNfQUxQSEEgICAgICAgICAgICgzOCA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQUxQSEEgKDM5IDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfR0xfRFNUX0FMUEhBICAgICAgICAgICAoNDAgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX1NSQ19CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0FMUEhBICg0MSA8PCAxNikKLSMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX0dMX1NSQ19BTFBIQV9TQVRVUkFURSAgKDQyIDw8IDE2KQotIyAgICAgICBkZWZpbmUgUjMwMF9TUkNfQkxFTkRfTUFTSyAgICAgICAgICAgICAgICAgICAoNjMgPDwgMTYpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9aRVJPICAgICAgICAgICAgICAgICgzMiA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORSAgICAgICAgICAgICAgICAgKDMzIDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfU1JDX0NPTE9SICAgICAgICAgICAoMzQgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfU1JDX0NPTE9SICgzNSA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX0RTVF9DT0xPUiAgICAgICAgICAgKDM2IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfT05FX01JTlVTX0RTVF9DT0xPUiAoMzcgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9TUkNfQUxQSEEgICAgICAgICAgICgzOCA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQUxQSEEgKDM5IDw8IDI0KQotIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfR0xfRFNUX0FMUEhBICAgICAgICAgICAoNDAgPDwgMjQpCi0jICAgICAgIGRlZmluZSBSMzAwX0RTVF9CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0FMUEhBICg0MSA8PCAyNCkKLSMgICAgICAgZGVmaW5lIFIzMDBfRFNUX0JMRU5EX01BU0sgICAgICAgICAgICAgICAgICAgKDYzIDw8IDI0KQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9NSU4gICAgICAgICAgICAgICAgICAgICAoNCAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0NPTUJfRkNOX01BWCAgICAgICAgICAgICAgICAgICAgICg1ICA8PCAxMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQ09NQl9GQ05fUlNVQl9DTEFNUCAgICAgICAgICAgICAgKDYgIDw8IDEyKQorIyAgICAgICBkZWZpbmUgUjMwMF9DT01CX0ZDTl9SU1VCX05PQ0xBTVAgICAgICAgICAgICAoNyAgPDwgMTIpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX1pFUk8gICAgICAgICAgICAgICAgICAgICgzMikKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FICAgICAgICAgICAgICAgICAgICAgKDMzKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAoMzQpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICgzNSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgKDM2KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAoMzcpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICgzOCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgKDM5KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAoNDApCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICg0MSkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgKDQyKQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9DT05TVF9DT0xPUiAgICAgICAgICAgICAoNDMpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX0dMX09ORV9NSU5VU19DT05TVF9DT0xPUiAgICg0NCkKKyMgICAgICAgZGVmaW5lIFIzMDBfQkxFTkRfR0xfQ09OU1RfQUxQSEEgICAgICAgICAgICAgKDQ1KQorIyAgICAgICBkZWZpbmUgUjMwMF9CTEVORF9HTF9PTkVfTUlOVVNfQ09OU1RfQUxQSEEgICAoNDYpCisjICAgICAgIGRlZmluZSBSMzAwX0JMRU5EX01BU0sgICAgICAgICAgICAgICAgICAgICAgICg2MykKKyMgICAgICAgZGVmaW5lIFIzMDBfU1JDX0JMRU5EX1NISUZUICAgICAgICAgICAgICAgICAgKDE2KQorIyAgICAgICBkZWZpbmUgUjMwMF9EU1RfQkxFTkRfU0hJRlQgICAgICAgICAgICAgICAgICAoMjQpCisjZGVmaW5lIFIzMDBfUkIzRF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgIDB4NEUxMAogI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JNQVNLICAgICAgICAgICAgICAgICAweDRFMEMKICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9CICAgICAgICAgICAgICAgICAoMTw8MCkKICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9HICAgICAgICAgICAgICAgICAoMTw8MSkKQEAgLTExODEsNDEgKzEzMTUsNDkgQEAKICMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JNQVNLMF9BICAgICAgICAgICAgICAgICAoMTw8MykKIAogLyogZ2FwICovCisKICNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMCAgICAgICAgICAgICAgMHg0RTI4Ci0jICAgICAgIGRlZmluZSBSMzAwX0NPTE9ST0ZGU0VUX01BU0sgICAgICAgICAgICAgMHhGRkZGRkZGMAkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQxICAgICAgICAgICAgICAweDRFMkMJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMiAgICAgICAgICAgICAgMHg0RTMwCS8qIEdVRVNTICovCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDMgICAgICAgICAgICAgIDB4NEUzNAkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUk9GRlNFVF9NQVNLICAgICAgICAgICAgIDB4RkZGRkZGRjAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9ST0ZGU0VUMSAgICAgICAgICAgICAgMHg0RTJDIC8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUk9GRlNFVDIgICAgICAgICAgICAgIDB4NEUzMCAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JPRkZTRVQzICAgICAgICAgICAgICAweDRFMzQgLyogR1VFU1MgKi8KKwogLyogZ2FwICovCisKIC8qIEJpdCAxNjogTGFyZ2VyIHRpbGVzCi0vLyBCaXQgMTc6IDR4MiB0aWxlcwotLy8gQml0IDE4OiBFeHRyZW1lbHkgd2VpcmQgdGlsZSBsaWtlLCBidXQgc29tZSBwaXhlbHMgZHVwbGljYXRlZD8gKi8KKyAqIEJpdCAxNzogNHgyIHRpbGVzCisgKiBCaXQgMTg6IEV4dHJlbWVseSB3ZWlyZCB0aWxlIGxpa2UsIGJ1dCBzb21lIHBpeGVscyBkdXBsaWNhdGVkPworICovCiAjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMCAgICAgICAgICAgICAgIDB4NEUzOAotIyAgICAgICBkZWZpbmUgUjMwMF9DT0xPUlBJVENIX01BU0sgICAgICAgICAgICAgIDB4MDAwMDFGRjgJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfVElMRV9FTkFCTEUgICAgICAgICAgICAoMSA8PCAxNikJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfTUlDUk9USUxFX0VOQUJMRSAgICAgICAoMSA8PCAxNykJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX05PX1NXQVAgICAgICAgICAoMCA8PCAxOCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX1dPUkRfU1dBUCAgICAgICAoMSA8PCAxOCkJLyogR1VFU1MgKi8KLSMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JfRU5ESUFOX0RXT1JEX1NXQVAgICAgICAoMiA8PCAxOCkJLyogR1VFU1MgKi8KKyMgICAgICAgZGVmaW5lIFIzMDBfQ09MT1JQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4IC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpIC8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpIC8qIEdVRVNTICovCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9SR0I1NjUgICAgICAgICAgKDIgPDwgMjIpCiAjICAgICAgIGRlZmluZSBSMzAwX0NPTE9SX0ZPUk1BVF9BUkdCODg4OCAgICAgICAgKDMgPDwgMjIpCi0jZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMSAgICAgICAgICAgICAgIDB4NEUzQwkvKiBHVUVTUyAqLwotI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDIgICAgICAgICAgICAgICAweDRFNDAJLyogR1VFU1MgKi8KLSNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gzICAgICAgICAgICAgICAgMHg0RTQ0CS8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfUkIzRF9DT0xPUlBJVENIMSAgICAgICAgICAgICAgIDB4NEUzQyAvKiBHVUVTUyAqLworI2RlZmluZSBSMzAwX1JCM0RfQ09MT1JQSVRDSDIgICAgICAgICAgICAgICAweDRFNDAgLyogR1VFU1MgKi8KKyNkZWZpbmUgUjMwMF9SQjNEX0NPTE9SUElUQ0gzICAgICAgICAgICAgICAgMHg0RTQ0IC8qIEdVRVNTICovCiAKIC8qIGdhcCAqLworCiAvKiBHdWVzcyBieSBWbGFkaW1pci4KLS8vIFNldCB0byAwQSBiZWZvcmUgM0Qgb3BlcmF0aW9ucywgc2V0IHRvIDAyIGFmdGVyd2FyZHMuICovCisgKiBTZXQgdG8gMEEgYmVmb3JlIDNEIG9wZXJhdGlvbnMsIHNldCB0byAwMiBhZnRlcndhcmRzLgorICovCiAjZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV9DVExTVEFUICAgICAgICAgIDB4NEU0QwotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX0RTVENBQ0hFXzAyICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9EU1RDQUNIRV8wQSAgICAgICAgICAgICAweDAwMDAwMDBBCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfVU5LTk9XTl8wMiAgICAgICAgICAgICAweDAwMDAwMDAyCisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfRFNUQ0FDSEVfVU5LTk9XTl8wQSAgICAgICAgICAgICAweDAwMDAwMDBBCiAKIC8qIGdhcCAqLwotLyogVGhlcmUgc2VlbXMgdG8gYmUgbm8gIndyaXRlIG9ubHkiIHNldHRpbmcsIHNvIHVzZSBaLXRlc3QgPSBBTFdBWVMgZm9yIHRoaXMuICovCi0vKiBCaXQgKDE8PDgpIGlzIHRoZSAidGVzdCIgYml0LiBzbyBwbGFpbiB3cml0ZSBpcyA2ICAtIHZkICovCisvKiBUaGVyZSBzZWVtcyB0byBiZSBubyAid3JpdGUgb25seSIgc2V0dGluZywgc28gdXNlIFotdGVzdCA9IEFMV0FZUworICogZm9yIHRoaXMuCisgKiBCaXQgKDE8PDgpIGlzIHRoZSAidGVzdCIgYml0LiBzbyBwbGFpbiB3cml0ZSBpcyA2ICAtIHZkCisgKi8KICNkZWZpbmUgUjMwMF9SQjNEX1pTVEVOQ0lMX0NOVExfMCAgICAgICAgICAgICAgICAgICAweDRGMDAKLSMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzEgICAgICAgICAgICAweDAwMDAwMDEwCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8yICAgICAgICAgICAgMHgwMDAwMDAxNAkvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfRElTQUJMRURfMSAgICAgICAgICAgIDB4MDAwMDAwMTAKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX0RJU0FCTEVEXzIgICAgICAgICAgICAweDAwMDAwMDE0CiAjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9URVNUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMgogIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVF9BTkRfV1JJVEUgICAgICAgIDB4MDAwMDAwMTYKICMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1dSSVRFX09OTFkgICAgICAgIAkgMHgwMDAwMDAwNgpAQCAtMTIyNiw3ICsxMzY4LDcgQEAKICMJZGVmaW5lIFIzMDBfUkIzRF9TVEVOQ0lMX0VOQUJMRQkJIDB4MDAwMDAwMDEKIAogI2RlZmluZSBSMzAwX1JCM0RfWlNURU5DSUxfQ05UTF8xICAgICAgICAgICAgICAgICAgIDB4NEYwNAotCQkvKiBmdW5jdGlvbnMgKi8KKwkvKiBmdW5jdGlvbnMgKi8KICMJZGVmaW5lIFIzMDBfWlNfTkVWRVIJCQkwCiAjCWRlZmluZSBSMzAwX1pTX0xFU1MJCQkxCiAjCWRlZmluZSBSMzAwX1pTX0xFUVVBTAkJCTIKQEAgLTEyMzYsNyArMTM3OCw3IEBACiAjCWRlZmluZSBSMzAwX1pTX05PVEVRVUFMCQkJNgogIwlkZWZpbmUgUjMwMF9aU19BTFdBWVMJCQk3CiAjICAgICAgIGRlZmluZSBSMzAwX1pTX01BU0sgICAgICAgICAgICAgICAgICAgICA3Ci0JCS8qIG9wZXJhdGlvbnMgKi8KKwkvKiBvcGVyYXRpb25zICovCiAjCWRlZmluZSBSMzAwX1pTX0tFRVAJCQkwCiAjCWRlZmluZSBSMzAwX1pTX1pFUk8JCQkxCiAjCWRlZmluZSBSMzAwX1pTX1JFUExBQ0UJCQkyCkBAIC0xMjQ1LDkgKzEzODcsOCBAQAogIwlkZWZpbmUgUjMwMF9aU19JTlZFUlQJCQk1CiAjCWRlZmluZSBSMzAwX1pTX0lOQ1JfV1JBUAkJNgogIwlkZWZpbmUgUjMwMF9aU19ERUNSX1dSQVAJCTcKLQotICAgICAgIC8qIGZyb250IGFuZCBiYWNrIHJlZmVyIHRvIG9wZXJhdGlvbnMgZG9uZSBmb3IgZnJvbnQKLSAgICAgICAgICBhbmQgYmFjayBmYWNlcywgaS5lLiBzZXBhcmF0ZSBzdGVuY2lsIGZ1bmN0aW9uIHN1cHBvcnQgKi8KKwkvKiBmcm9udCBhbmQgYmFjayByZWZlciB0byBvcGVyYXRpb25zIGRvbmUgZm9yIGZyb250CisJICAgYW5kIGJhY2sgZmFjZXMsIGkuZS4gc2VwYXJhdGUgc3RlbmNpbCBmdW5jdGlvbiBzdXBwb3J0ICovCiAjCWRlZmluZSBSMzAwX1JCM0RfWlMxX0RFUFRIX0ZVTkNfU0hJRlQJCTAKICMJZGVmaW5lIFIzMDBfUkIzRF9aUzFfRlJPTlRfRlVOQ19TSElGVAkJMwogIwlkZWZpbmUgUjMwMF9SQjNEX1pTMV9GUk9OVF9GQUlMX09QX1NISUZUCTYKQEAgLTEyNjksNDUgKzE0MTAsNjQgQEAKICNkZWZpbmUgUjMwMF9SQjNEX1pTVEVOQ0lMX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAweDRGMTAKICMJZGVmaW5lIFIzMDBfREVQVEhfRk9STUFUXzE2QklUX0lOVF9aICAgICAoMCA8PCAwKQogIwlkZWZpbmUgUjMwMF9ERVBUSF9GT1JNQVRfMjRCSVRfSU5UX1ogICAgICgyIDw8IDApCisJLyogMTYgYml0IGZvcm1hdCBvciBzb21lIGFkaXRpb25hbCBiaXQgPyAqLworIwlkZWZpbmUgUjMwMF9ERVBUSF9GT1JNQVRfVU5LMzIgICAgICAgICAgKDMyIDw8IDApCisKKyNkZWZpbmUgUjMwMF9SQjNEX0VBUkxZX1ogICAgICAgICAgICAgICAgICAgICAgICAgICAweDRGMTQKKyMJZGVmaW5lIFIzMDBfRUFSTFlfWl9ESVNBQkxFICAgICAgICAgICAgICAoMCA8PCAwKQorIwlkZWZpbmUgUjMwMF9FQVJMWV9aX0VOQUJMRSAgICAgICAgICAgICAgICgxIDw8IDApCiAKIC8qIGdhcCAqLworCisjZGVmaW5lIFIzMDBfUkIzRF9aQ0FDSEVfQ1RMU1RBVCAgICAgICAgICAgIDB4NEYxOCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pDQUNIRV9VTktOT1dOXzAxICAweDEKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aQ0FDSEVfVU5LTk9XTl8wMyAgMHgzCisKKy8qIGdhcCAqLworCiAjZGVmaW5lIFIzMDBfUkIzRF9ERVBUSE9GRlNFVCAgICAgICAgICAgICAgIDB4NEYyMAogI2RlZmluZSBSMzAwX1JCM0RfREVQVEhQSVRDSCAgICAgICAgICAgICAgICAweDRGMjQKLSMgICAgICAgZGVmaW5lIFIzMDBfREVQVEhQSVRDSF9NQVNLICAgICAgICAgICAgICAweDAwMDAxRkY4CS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX1RJTEVfRU5BQkxFICAgICAgICAgICAgKDEgPDwgMTYpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX01JQ1JPVElMRV9FTkFCTEUgICAgICAgKDEgPDwgMTcpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9OT19TV0FQICAgICAgICAgKDAgPDwgMTgpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9XT1JEX1NXQVAgICAgICAgKDEgPDwgMTgpCS8qIEdVRVNTICovCi0jICAgICAgIGRlZmluZSBSMzAwX0RFUFRIX0VORElBTl9EV09SRF9TV0FQICAgICAgKDIgPDwgMTgpCS8qIEdVRVNTICovCisjICAgICAgIGRlZmluZSBSMzAwX0RFUFRIUElUQ0hfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMUZGOCAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9USUxFX0VOQUJMRSAgICAgICAgICAgICgxIDw8IDE2KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9NSUNST1RJTEVfRU5BQkxFICAgICAgICgxIDw8IDE3KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fTk9fU1dBUCAgICAgICAgICgwIDw8IDE4KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fV09SRF9TV0FQICAgICAgICgxIDw8IDE4KSAvKiBHVUVTUyAqLworIyAgICAgICBkZWZpbmUgUjMwMF9ERVBUSF9FTkRJQU5fRFdPUkRfU1dBUCAgICAgICgyIDw8IDE4KSAvKiBHVUVTUyAqLwogCi0vKiBCRUdJTjogVmVydGV4IHByb2dyYW0gaW5zdHJ1Y3Rpb24gc2V0Ci0vLyBFdmVyeSBpbnN0cnVjdGlvbiBpcyBmb3VyIGR3b3JkcyBsb25nOgotLy8gIERXT1JEIDA6IG91dHB1dCBhbmQgb3Bjb2RlCi0vLyAgRFdPUkQgMTogZmlyc3QgYXJndW1lbnQKLS8vICBEV09SRCAyOiBzZWNvbmQgYXJndW1lbnQKLS8vICBEV09SRCAzOiB0aGlyZCBhcmd1bWVudAotLy8KLS8vIE5vdGVzOgotLy8gIC0gQUJTIHIsIGEgaXMgaW1wbGVtZW50ZWQgYXMgTUFYIHIsIGEsIC1hCi0vLyAgLSBNT1YgaXMgaW1wbGVtZW50ZWQgYXMgQUREIHRvIHplcm8KLS8vICAtIFhQRCBpcyBpbXBsZW1lbnRlZCBhcyBNVUwgKyBNQUQKLS8vICAtIEZMUiBpcyBpbXBsZW1lbnRlZCBhcyBGUkMgKyBBREQKLS8vICAtIGFwcGFyZW50bHksIGZnbHJ4IHRyaWVzIHRvIHNjaGVkdWxlIGluc3RydWN0aW9ucyBzbyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0Ci0vLyAgICBvbmUgaW5zdHJ1Y3Rpb24gYmV0d2VlbiB0aGUgd3JpdGUgdG8gYSB0ZW1wb3JhcnkgYW5kIHRoZSBmaXJzdCByZWFkCi0vLyAgICBmcm9tIHNhaWQgdGVtcG9yYXJ5OyBob3dldmVyLCB2aW9sYXRpb25zIG9mIHRoaXMgc2NoZWR1bGluZyBhcmUgYWxsb3dlZAotLy8gIC0gcmVnaXN0ZXIgaW5kaWNlcyBzZWVtIHRvIGJlIHVucmVsYXRlZCB3aXRoIE9wZW5HTCBhbGlhc2luZyB0byBjb252ZW50aW9uYWwgc3RhdGUKLS8vICAtIG9ubHkgb25lIGF0dHJpYnV0ZSBhbmQgb25lIHBhcmFtZXRlciBjYW4gYmUgbG9hZGVkIGF0IGEgdGltZTsgaG93ZXZlciwgdGhlCi0vLyAgICBzYW1lIGF0dHJpYnV0ZS9wYXJhbWV0ZXIgY2FuIGJlIHVzZWQgZm9yIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQKLS8vICAtIHRoZSBzZWNvbmQgc29mdHdhcmUgYXJndW1lbnQgZm9yIFBPVyBpcyB0aGUgdGhpcmQgaGFyZHdhcmUgYXJndW1lbnQgKG5vIGlkZWEgd2h5KQotLy8gIC0gTUFEIHdpdGggb25seSB0ZW1wb3JhcmllcyBhcyBpbnB1dCBzZWVtcyB0byB1c2UgVlBJX09VVF9TRUxFQ1RfTUFEXzIKLS8vCi0vLyBUaGVyZSBpcyBzb21lIG1hZ2ljIHN1cnJvdW5kaW5nIExJVDoKLS8vICBUaGUgc2luZ2xlIGFyZ3VtZW50IGlzIHJlcGxpY2F0ZWQgYWNyb3NzIGFsbCB0aHJlZSBpbnB1dHMsIGJ1dCBzd2l6emxlZDoKLS8vICAgRmlyc3QgYXJndW1lbnQ6IHh5enkKLS8vICAgU2Vjb25kIGFyZ3VtZW50OiB4eXp4Ci0vLyAgIFRoaXJkIGFyZ3VtZW50OiB4eXp3Ci0vLyAgV2hlbmV2ZXIgdGhlIHJlc3VsdCBpcyB1c2VkIGxhdGVyIGluIHRoZSBmcmFnbWVudCBwcm9ncmFtLCBmZ2xyeCBmb3JjZXMgeCBhbmQgdwotLy8gIHRvIGJlIDEuMCBpbiB0aGUgaW5wdXQgc2VsZWN0aW9uOyBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGlzIHN0cmljdGx5IG5lY2Vzc2FyeSAqLworLyogQkVHSU46IFZlcnRleCBwcm9ncmFtIGluc3RydWN0aW9uIHNldCAqLworCisvKiBFdmVyeSBpbnN0cnVjdGlvbiBpcyBmb3VyIGR3b3JkcyBsb25nOgorICogIERXT1JEIDA6IG91dHB1dCBhbmQgb3Bjb2RlCisgKiAgRFdPUkQgMTogZmlyc3QgYXJndW1lbnQKKyAqICBEV09SRCAyOiBzZWNvbmQgYXJndW1lbnQKKyAqICBEV09SRCAzOiB0aGlyZCBhcmd1bWVudAorICoKKyAqIE5vdGVzOgorICogIC0gQUJTIHIsIGEgaXMgaW1wbGVtZW50ZWQgYXMgTUFYIHIsIGEsIC1hCisgKiAgLSBNT1YgaXMgaW1wbGVtZW50ZWQgYXMgQUREIHRvIHplcm8KKyAqICAtIFhQRCBpcyBpbXBsZW1lbnRlZCBhcyBNVUwgKyBNQUQKKyAqICAtIEZMUiBpcyBpbXBsZW1lbnRlZCBhcyBGUkMgKyBBREQKKyAqICAtIGFwcGFyZW50bHksIGZnbHJ4IHRyaWVzIHRvIHNjaGVkdWxlIGluc3RydWN0aW9ucyBzbyB0aGF0IHRoZXJlIGlzIGF0CisgKiAgICBsZWFzdCBvbmUgaW5zdHJ1Y3Rpb24gYmV0d2VlbiB0aGUgd3JpdGUgdG8gYSB0ZW1wb3JhcnkgYW5kIHRoZSBmaXJzdAorICogICAgcmVhZCBmcm9tIHNhaWQgdGVtcG9yYXJ5OyBob3dldmVyLCB2aW9sYXRpb25zIG9mIHRoaXMgc2NoZWR1bGluZyBhcmUKKyAqICAgIGFsbG93ZWQKKyAqICAtIHJlZ2lzdGVyIGluZGljZXMgc2VlbSB0byBiZSB1bnJlbGF0ZWQgd2l0aCBPcGVuR0wgYWxpYXNpbmcgdG8KKyAqICAgIGNvbnZlbnRpb25hbCBzdGF0ZQorICogIC0gb25seSBvbmUgYXR0cmlidXRlIGFuZCBvbmUgcGFyYW1ldGVyIGNhbiBiZSBsb2FkZWQgYXQgYSB0aW1lOyBob3dldmVyLAorICogICAgdGhlIHNhbWUgYXR0cmlidXRlL3BhcmFtZXRlciBjYW4gYmUgdXNlZCBmb3IgbW9yZSB0aGFuIG9uZSBhcmd1bWVudAorICogIC0gdGhlIHNlY29uZCBzb2Z0d2FyZSBhcmd1bWVudCBmb3IgUE9XIGlzIHRoZSB0aGlyZCBoYXJkd2FyZSBhcmd1bWVudAorICogICAgKG5vIGlkZWEgd2h5KQorICogIC0gTUFEIHdpdGggb25seSB0ZW1wb3JhcmllcyBhcyBpbnB1dCBzZWVtcyB0byB1c2UgVlBJX09VVF9TRUxFQ1RfTUFEXzIKKyAqCisgKiBUaGVyZSBpcyBzb21lIG1hZ2ljIHN1cnJvdW5kaW5nIExJVDoKKyAqICAgVGhlIHNpbmdsZSBhcmd1bWVudCBpcyByZXBsaWNhdGVkIGFjcm9zcyBhbGwgdGhyZWUgaW5wdXRzLCBidXQgc3dpenpsZWQ6CisgKiAgICAgRmlyc3QgYXJndW1lbnQ6IHh5enkKKyAqICAgICBTZWNvbmQgYXJndW1lbnQ6IHh5engKKyAqICAgICBUaGlyZCBhcmd1bWVudDogeHl6dworICogICBXaGVuZXZlciB0aGUgcmVzdWx0IGlzIHVzZWQgbGF0ZXIgaW4gdGhlIGZyYWdtZW50IHByb2dyYW0sIGZnbHJ4IGZvcmNlcworICogICB4IGFuZCB3IHRvIGJlIDEuMCBpbiB0aGUgaW5wdXQgc2VsZWN0aW9uOyBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGlzCisgKiAgIHN0cmljdGx5IG5lY2Vzc2FyeQorICovCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9ET1QgICAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTVVMICAgICAgICAgICAgICAgICAgICAgKDIgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0FERCAgICAgICAgICAgICAgICAgICAgICgzIDw8IDApCkBAIC0xMzE4LDI2ICsxNDc4LDMzIEBACiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9NSU4gICAgICAgICAgICAgICAgICAgICAoOCA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfU0dFICAgICAgICAgICAgICAgICAgICAgKDkgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1NMVCAgICAgICAgICAgICAgICAgICAgICgxMCA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LMTIgICAgICAgICAgICAgICAgICAgKDEyIDw8IDApCS8qIFVzZWQgaW4gR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCB2ZWN0b3Ioc2NhbGFyLCB2ZWN0b3IpICovCisJLyogVXNlZCBpbiBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTl9BUkIsIHZlY3RvcihzY2FsYXIsIHZlY3RvcikgKi8KKyNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1VOSzEyICAgICAgICAgICAgICAgICAgICgxMiA8PCAwKQorI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfQVJMICAgICAgICAgICAgICAgICAgICAgKDEzIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9FWFAgICAgICAgICAgICAgICAgICAgICAoNjUgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0xPRyAgICAgICAgICAgICAgICAgICAgICg2NiA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LNjcgICAgICAgICAgICAgICAgICAgKDY3IDw8IDApCS8qIFVzZWQgaW4gZm9nIGNvbXB1dGF0aW9ucywgc2NhbGFyKHNjYWxhcikgKi8KKwkvKiBVc2VkIGluIGZvZyBjb21wdXRhdGlvbnMsIHNjYWxhcihzY2FsYXIpICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTks2NyAgICAgICAgICAgICAgICAgICAoNjcgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0xJVCAgICAgICAgICAgICAgICAgICAgICg2OCA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfUE9XICAgICAgICAgICAgICAgICAgICAgKDY5IDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9SQ1AgICAgICAgICAgICAgICAgICAgICAoNzAgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX1JTUSAgICAgICAgICAgICAgICAgICAgICg3MiA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LNzMgICAgICAgICAgICAgICAgICAgKDczIDw8IDApCS8qIFVzZWQgaW4gR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCBzY2FsYXIoc2NhbGFyKSAqLworCS8qIFVzZWQgaW4gR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT05fQVJCLCBzY2FsYXIoc2NhbGFyKSAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LNzMgICAgICAgICAgICAgICAgICAgKDczIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9FWDIgICAgICAgICAgICAgICAgICAgICAoNzUgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX09QX0xHMiAgICAgICAgICAgICAgICAgICAgICg3NiA8PCAwKQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfTUFEXzIgICAgICAgICAgICAgICAgICAgKDEyOCA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9PVVRfT1BfVU5LMTI5ICAgICAgICAgICAgICAgICAgKDEyOSA8PCAwKQkvKiBhbGwgdGVtcHMsIHZlY3RvcihzY2FsYXIsIHZlY3RvciwgdmVjdG9yKSAqLworCS8qIGFsbCB0ZW1wcywgdmVjdG9yKHNjYWxhciwgdmVjdG9yLCB2ZWN0b3IpICovCisjZGVmaW5lIFIzMDBfVlBJX09VVF9PUF9VTksxMjkgICAgICAgICAgICAgICAgICAoMTI5IDw8IDApCiAKICNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19URU1QT1JBUlkgICAgICAgICgwIDw8IDgpCisjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfQ0xBU1NfQUREUiAgICAgICAgICAgICAoMSA8PCA4KQogI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0NMQVNTX1JFU1VMVCAgICAgICAgICAgKDIgPDwgOCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX1JFR19DTEFTU19NQVNLICAgICAgICAgICAgICgzMSA8PCA4KQogCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9SRUdfSU5ERVhfU0hJRlQgICAgICAgICAgICAxMwotI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0lOREVYX01BU0sgICAgICAgICAgICAgKDMxIDw8IDEzKQkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisJLyogR1VFU1MgYmFzZWQgb24gZmdscnggbmF0aXZlIGxpbWl0cyAqLworI2RlZmluZSBSMzAwX1ZQSV9PVVRfUkVHX0lOREVYX01BU0sgICAgICAgICAgICAgKDMxIDw8IDEzKQogCiAjZGVmaW5lIFIzMDBfVlBJX09VVF9XUklURV9YICAgICAgICAgICAgICAgICAgICAoMSA8PCAyMCkKICNkZWZpbmUgUjMwMF9WUElfT1VUX1dSSVRFX1kgICAgICAgICAgICAgICAgICAgICgxIDw8IDIxKQpAQCAtMTM0OCwxNCArMTUxNSwxNiBAQAogI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfQVRUUklCVVRFICAgICAgICAgKDEgPDwgMCkKICNkZWZpbmUgUjMwMF9WUElfSU5fUkVHX0NMQVNTX1BBUkFNRVRFUiAgICAgICAgICgyIDw8IDApCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19OT05FICAgICAgICAgICAgICAoOSA8PCAwKQotI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfQ0xBU1NfTUFTSyAgICAgICAgICAgICAgKDMxIDw8IDApCS8qIEdVRVNTICovCisjZGVmaW5lIFIzMDBfVlBJX0lOX1JFR19DTEFTU19NQVNLICAgICAgICAgICAgICAoMzEgPDwgMCkKIAogI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfU0hJRlQgICAgICAgICAgICAgNQotI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAgKDI1NSA8PCA1KQkvKiBHVUVTUyBiYXNlZCBvbiBmZ2xyeCBuYXRpdmUgbGltaXRzICovCisJLyogR1VFU1MgYmFzZWQgb24gZmdscnggbmF0aXZlIGxpbWl0cyAqLworI2RlZmluZSBSMzAwX1ZQSV9JTl9SRUdfSU5ERVhfTUFTSyAgICAgICAgICAgICAgKDI1NSA8PCA1KQogCiAvKiBUaGUgUjMwMCBjYW4gc2VsZWN0IGNvbXBvbmVudHMgZnJvbSB0aGUgaW5wdXQgcmVnaXN0ZXIgYXJiaXRyYXJpbHkuCi0vLyBVc2UgdGhlIGZvbGxvd2luZyBjb25zdGFudHMsIHNoaWZ0ZWQgYnkgdGhlIGNvbXBvbmVudCBzaGlmdCB5b3UKLS8vIHdhbnQgdG8gc2VsZWN0ICovCisgKiBVc2UgdGhlIGZvbGxvd2luZyBjb25zdGFudHMsIHNoaWZ0ZWQgYnkgdGhlIGNvbXBvbmVudCBzaGlmdCB5b3UKKyAqIHdhbnQgdG8gc2VsZWN0CisgKi8KICNkZWZpbmUgUjMwMF9WUElfSU5fU0VMRUNUX1ggICAgMAogI2RlZmluZSBSMzAwX1ZQSV9JTl9TRUxFQ1RfWSAgICAxCiAjZGVmaW5lIFIzMDBfVlBJX0lOX1NFTEVDVF9aICAgIDIKQEAgLTEzNzMsMTEgKzE1NDIsMTEgQEAKICNkZWZpbmUgUjMwMF9WUElfSU5fTkVHX1kgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDI2KQogI2RlZmluZSBSMzAwX1ZQSV9JTl9ORUdfWiAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMjcpCiAjZGVmaW5lIFIzMDBfVlBJX0lOX05FR19XICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAyOCkKLS8qIEVORCAqLworLyogRU5EOiBWZXJ0ZXggcHJvZ3JhbSBpbnN0cnVjdGlvbiBzZXQgKi8KIAotLy9CRUdJTjogUGFja2V0IDMgY29tbWFuZHMKKy8qIEJFR0lOOiBQYWNrZXQgMyBjb21tYW5kcyAqLwogCi0vLyBBIHByaW1pdGl2ZSBlbWlzc2lvbiBkd29yZC4KKy8qIEEgcHJpbWl0aXZlIGVtaXNzaW9uIGR3b3JkLiAqLwogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgKDAgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUE9JTlQgICAgICAgICAgICAgICAgICAgICgxIDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX0xJTkUgICAgICAgICAgICAgICAgICAgICAoMiA8PCAwKQpAQCAtMTM4OSw3ICsxNTU4LDggQEAKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfUkVDVF9MSVNUICAgICAgICAgICAgICAgICg4IDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVCAgICAgICAgICAoOSA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVCAgICAgICAgICAgKDEwIDw8IDApCi0jZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1BPSU5UX1NQUklURVMgICAgICAgICAgICAoMTEgPDwgMCkJLy8gR1VFU1MgKGJhc2VkIG9uIHIyMDApCisJLyogR1VFU1MgKGJhc2VkIG9uIHIyMDApICovCisjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1BPSU5UX1NQUklURVMgICAgICAgICAgICAoMTEgPDwgMCkKICNkZWZpbmUgUjMwMF9QUklNX1RZUEVfTElORV9MT09QICAgICAgICAgICAgICAgICgxMiA8PCAwKQogI2RlZmluZSBSMzAwX1BSSU1fVFlQRV9RVUFEUyAgICAgICAgICAgICAgICAgICAgKDEzIDw8IDApCiAjZGVmaW5lIFIzMDBfUFJJTV9UWVBFX1FVQURfU1RSSVAgICAgICAgICAgICAgICAoMTQgPDwgMCkKQEAgLTEzOTksMzcgKzE1NjksNTggQEAKICNkZWZpbmUgUjMwMF9QUklNX1dBTEtfTElTVCAgICAgICAgICAgICAgICAgICAgICgyIDw8IDQpCiAjZGVmaW5lIFIzMDBfUFJJTV9XQUxLX1JJTkcgICAgICAgICAgICAgICAgICAgICAoMyA8PCA0KQogI2RlZmluZSBSMzAwX1BSSU1fV0FMS19NQVNLICAgICAgICAgICAgICAgICAgICAgKDMgPDwgNCkKLSNkZWZpbmUgUjMwMF9QUklNX0NPTE9SX09SREVSX0JHUkEgICAgICAgICAgICAgICgwIDw8IDYpCS8vIEdVRVNTIChiYXNlZCBvbiByMjAwKQotI2RlZmluZSBSMzAwX1BSSU1fQ09MT1JfT1JERVJfUkdCQSAgICAgICAgICAgICAgKDEgPDwgNikJLy8gR1VFU1MKKwkvKiBHVUVTUyAoYmFzZWQgb24gcjIwMCkgKi8KKyNkZWZpbmUgUjMwMF9QUklNX0NPTE9SX09SREVSX0JHUkEgICAgICAgICAgICAgICgwIDw8IDYpCisjZGVmaW5lIFIzMDBfUFJJTV9DT0xPUl9PUkRFUl9SR0JBICAgICAgICAgICAgICAoMSA8PCA2KQogI2RlZmluZSBSMzAwX1BSSU1fTlVNX1ZFUlRJQ0VTX1NISUZUICAgICAgICAgICAgMTYKKyNkZWZpbmUgUjMwMF9QUklNX05VTV9WRVJUSUNFU19NQVNLICAgICAgICAgICAgIDB4ZmZmZgogCi0vLyBEcmF3IGEgcHJpbWl0aXZlIGZyb20gdmVydGV4IGRhdGEgaW4gYXJyYXlzIGxvYWRlZCB2aWEgM0RfTE9BRF9WQlBOVFIuCi0vLyBUd28gcGFyYW1ldGVyIGR3b3JkczoKLS8vIDAuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgYXBwZWFycyB0byBiZSBhbHdheXMgMAotLy8gMS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBzdGFuZGFyZCBwcmltaXRpdmUgZW1pc3Npb24gZHdvcmQuCisvKiBEcmF3IGEgcHJpbWl0aXZlIGZyb20gdmVydGV4IGRhdGEgaW4gYXJyYXlzIGxvYWRlZCB2aWEgM0RfTE9BRF9WQlBOVFIuCisgKiBUd28gcGFyYW1ldGVyIGR3b3JkczoKKyAqIDAuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgYXBwZWFycyB0byBiZSBhbHdheXMgMAorICogMS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBzdGFuZGFyZCBwcmltaXRpdmUgZW1pc3Npb24gZHdvcmQuCisgKi8KICNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0RSQVdfVkJVRiAgICAgICAgICAgMHgwMDAwMjgwMAogCi0vLyBTcGVjaWZ5IHRoZSBmdWxsIHNldCBvZiB2ZXJ0ZXggYXJyYXlzIGFzIChhZGRyZXNzLCBzdHJpZGUpLgotLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgbnVtYmVyIG9mIHZlcnRleCBhcnJheXMgc3BlY2lmaWVkLgotLy8gVGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgaXMgYSB2YXJpYWJsZSBsZW5ndGggbGlzdCBvZiBibG9ja3MsIHdoZXJlCi0vLyBlYWNoIGJsb2NrIGlzIHRocmVlIGR3b3JkcyBsb25nIGFuZCBzcGVjaWZpZXMgdHdvIGFycmF5cy4KLS8vIFRoZSBmaXJzdCBkd29yZCBvZiBhIGJsb2NrIGlzIHNwbGl0IGludG8gdHdvIHdvcmRzLCB0aGUgbG93ZXIgc2lnbmlmaWNhbnQKLS8vIHdvcmQgcmVmZXJzIHRvIHRoZSBmaXJzdCBhcnJheSwgdGhlIG1vcmUgc2lnbmlmaWNhbnQgd29yZCB0byB0aGUgc2Vjb25kCi0vLyBhcnJheSBpbiB0aGUgYmxvY2suCi0vLyBUaGUgbG93IGJ5dGUgb2YgZWFjaCB3b3JkIGNvbnRhaW5zIHRoZSBzaXplIG9mIGFuIGFycmF5IGVudHJ5IGluIGR3b3JkcywKLS8vIHRoZSBoaWdoIGJ5dGUgY29udGFpbnMgdGhlIHN0cmlkZSBvZiB0aGUgYXJyYXkuCi0vLyBUaGUgc2Vjb25kIGR3b3JkIG9mIGEgYmxvY2sgY29udGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGFycmF5LAotLy8gdGhlIHRoaXJkIGR3b3JkIG9mIGEgYmxvY2sgY29udGFpbnMgdGhlIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBhcnJheS4KLS8vIE5vdGUgdGhhdCBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFycmF5cyBpcyBvZGQsIHRoZSB0aGlyZCBkd29yZCBvZgotLy8gdGhlIGxhc3QgYmxvY2sgaXMgb21pdHRlZC4KKy8qIFNwZWNpZnkgdGhlIGZ1bGwgc2V0IG9mIHZlcnRleCBhcnJheXMgYXMgKGFkZHJlc3MsIHN0cmlkZSkuCisgKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgdmVydGV4IGFycmF5cyBzcGVjaWZpZWQuCisgKiBUaGUgcmVzdCBvZiB0aGUgY29tbWFuZCBpcyBhIHZhcmlhYmxlIGxlbmd0aCBsaXN0IG9mIGJsb2Nrcywgd2hlcmUKKyAqIGVhY2ggYmxvY2sgaXMgdGhyZWUgZHdvcmRzIGxvbmcgYW5kIHNwZWNpZmllcyB0d28gYXJyYXlzLgorICogVGhlIGZpcnN0IGR3b3JkIG9mIGEgYmxvY2sgaXMgc3BsaXQgaW50byB0d28gd29yZHMsIHRoZSBsb3dlciBzaWduaWZpY2FudAorICogd29yZCByZWZlcnMgdG8gdGhlIGZpcnN0IGFycmF5LCB0aGUgbW9yZSBzaWduaWZpY2FudCB3b3JkIHRvIHRoZSBzZWNvbmQKKyAqIGFycmF5IGluIHRoZSBibG9jay4KKyAqIFRoZSBsb3cgYnl0ZSBvZiBlYWNoIHdvcmQgY29udGFpbnMgdGhlIHNpemUgb2YgYW4gYXJyYXkgZW50cnkgaW4gZHdvcmRzLAorICogdGhlIGhpZ2ggYnl0ZSBjb250YWlucyB0aGUgc3RyaWRlIG9mIHRoZSBhcnJheS4KKyAqIFRoZSBzZWNvbmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgYXJyYXksCisgKiB0aGUgdGhpcmQgZHdvcmQgb2YgYSBibG9jayBjb250YWlucyB0aGUgcG9pbnRlciB0byB0aGUgc2Vjb25kIGFycmF5LgorICogTm90ZSB0aGF0IGlmIHRoZSB0b3RhbCBudW1iZXIgb2YgYXJyYXlzIGlzIG9kZCwgdGhlIHRoaXJkIGR3b3JkIG9mCisgKiB0aGUgbGFzdCBibG9jayBpcyBvbWl0dGVkLgorICovCiAjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9MT0FEX1ZCUE5UUiAgICAgICAgIDB4MDAwMDJGMDAKIAogI2RlZmluZSBSMzAwX1BBQ0tFVDNfSU5EWF9CVUZGRVIgICAgICAgICAgICAweDAwMDAzMzAwCiAjICAgIGRlZmluZSBSMzAwX0VCX1VOSzFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMjQKICMgICAgZGVmaW5lIFIzMDBfRUJfVU5LMSAgICAgICAgICAgICAgICAgICAgKDB4ODA8PDI0KQogIyAgICBkZWZpbmUgUjMwMF9FQl9VTksyICAgICAgICAgICAgICAgICAgICAgICAgMHgwODEwCisjZGVmaW5lIFIzMDBfUEFDS0VUM18zRF9EUkFXX1ZCVUZfMiAgICAgICAgIDB4MDAwMDM0MDAKICNkZWZpbmUgUjMwMF9QQUNLRVQzXzNEX0RSQVdfSU5EWF8yICAgICAgICAgMHgwMDAwMzYwMAogCi0vL0VORAorLyogRU5EOiBQYWNrZXQgMyBjb21tYW5kcyAqLwogCi0jZW5kaWYJCQkJLyogX1IzMDBfUkVHX0ggKi8KKworLyogQ29sb3IgZm9ybWF0cyBmb3IgMmQgcGFja2V0cworICovCisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX0NJOAkyCisjZGVmaW5lIFIzMDBfQ1BfQ09MT1JfRk9STUFUX0FSR0IxNTU1CTMKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfUkdCNTY1CTQKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfQVJHQjg4ODgJNgorI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9SR0IzMzIJNworI2RlZmluZSBSMzAwX0NQX0NPTE9SX0ZPUk1BVF9SR0I4CTkKKyNkZWZpbmUgUjMwMF9DUF9DT0xPUl9GT1JNQVRfQVJHQjQ0NDQJMTUKKworLyoKKyAqIENQIHR5cGUtMyBwYWNrZXRzCisgKi8KKyNkZWZpbmUgUjMwMF9DUF9DTURfQklUQkxUX01VTFRJCTB4QzAwMDlCMDAKKworI2VuZGlmIC8qIF9SMzAwX1JFR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwppbmRleCA2ODMzODM4OS4uYWY1NzkwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCkBAIC0zNiw3ICszNiw3IEBACiAKICNkZWZpbmUgUkFERU9OX0ZJRk9fREVCVUcJMAogCi1zdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX2NwKGRybV9kZXZpY2VfdCAqIGRldik7CitzdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX2NwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKIAogLyogQ1AgbWljcm9jb2RlIChmcm9tIEFUSSkgKi8KIHN0YXRpYyBjb25zdCB1MzIgUjIwMF9jcF9taWNyb2NvZGVbXVsyXSA9IHsKQEAgLTgxNiw3ICs4MTYsNyBAQAogCXswMDAwMDAwMDAwLCAwMDAwMDAwMDAwfSwKIH07CiAKLXN0YXRpYyBpbnQgUkFERU9OX1JFQURfUExMKGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGFkZHIpCitzdGF0aWMgaW50IFJBREVPTl9SRUFEX1BMTChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGFkZHIpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTA2Niw3ICsxMDY2LDcgQEAKIAogLyogUmVzZXQgdGhlIGVuZ2luZS4gIFRoaXMgd2lsbCBzdG9wIHRoZSBDUCBpZiBpdCBpcyBydW5uaW5nLgogICovCi1zdGF0aWMgaW50IHJhZGVvbl9kb19lbmdpbmVfcmVzZXQoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByYWRlb25fZG9fZW5naW5lX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIGNsb2NrX2NudGxfaW5kZXgsIG1jbGtfY250bCwgcmJibV9zb2Z0X3Jlc2V0OwpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2luaXRfcmluZ19idWZmZXIoZHJtX2RldmljZV90ICogZGV2LAorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2luaXRfcmluZ19idWZmZXIoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7CiAJdTMyIHJpbmdfc3RhcnQsIGN1cl9yZWFkX3B0cjsKQEAgLTExNzQsNyArMTE3NCw3IEBACiAJfSBlbHNlCiAjZW5kaWYKIAl7Ci0JCWRybV9zZ19tZW1fdCAqZW50cnkgPSBkZXYtPnNnOworCQlzdHJ1Y3QgZHJtX3NnX21lbSAqZW50cnkgPSBkZXYtPnNnOwogCQl1bnNpZ25lZCBsb25nIHRtcF9vZnMsIHBhZ2Vfb2ZzOwogCiAJCXRtcF9vZnMgPSBkZXZfcHJpdi0+cmluZ19ycHRyLT5vZmZzZXQgLQpAQCAtMTM4NCw3ICsxMzg0LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfY3AoZHJtX2RldmljZV90ICogZGV2LCBkcm1fcmFkZW9uX2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X2NwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fcmFkZW9uX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTQyMCw2ICsxNDIwLDEwIEBACiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCisJLyogRW5hYmxlIHZibGFuayBvbiBDUlRDMSBmb3Igb2xkZXIgWCBzZXJ2ZXJzCisJICovCisJZGV2X3ByaXYtPnZibGFua19jcnRjID0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzE7CisKIAlzd2l0Y2goaW5pdC0+ZnVuYykgewogCWNhc2UgUkFERU9OX0lOSVRfUjIwMF9DUDoKIAkJZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID0gVUNPREVfUjIwMDsKQEAgLTE1MDEsMTMgKzE1MDUsMTMgQEAKIAkJCQkJIFJBREVPTl9ST1VORF9NT0RFX1RSVU5DIHwKIAkJCQkJIFJBREVPTl9ST1VORF9QUkVDXzhUSF9QSVgpOwogCi0JRFJNX0dFVFNBUkVBKCk7CiAKIAlkZXZfcHJpdi0+cmluZ19vZmZzZXQgPSBpbml0LT5yaW5nX29mZnNldDsKIAlkZXZfcHJpdi0+cmluZ19ycHRyX29mZnNldCA9IGluaXQtPnJpbmdfcnB0cl9vZmZzZXQ7CiAJZGV2X3ByaXYtPmJ1ZmZlcnNfb2Zmc2V0ID0gaW5pdC0+YnVmZmVyc19vZmZzZXQ7CiAJZGV2X3ByaXYtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0ID0gaW5pdC0+Z2FydF90ZXh0dXJlc19vZmZzZXQ7CiAKKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCXJhZGVvbl9kb19jbGVhbnVwX2NwKGRldik7CkBAIC0xNzMxLDcgKzE3MzUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX2NwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2NsZWFudXBfY3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlEUk1fREVCVUcoIlxuIik7CkBAIC0xNzg3LDcgKzE3OTEsNyBAQAogICoKICAqIENoYXJsIFAuIEJvdGhhIDxodHRwOi8vY3Bib3RoYS5uZXQ+CiAgKi8KLXN0YXRpYyBpbnQgcmFkZW9uX2RvX3Jlc3VtZV9jcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9kb19yZXN1bWVfY3Aoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMTkxNCw3ICsxOTE4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByYWRlb25fZG9fcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kb19yZWxlYXNlKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGksIHJldDsKQEAgLTIwNDIsMTIgKzIwNDYsMTIgQEAKICAqIHRoZXkgY2FuJ3QgZ2V0IHRoZSBsb2NrLgogICovCiAKLWRybV9idWZfdCAqcmFkZW9uX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdHJ1Y3QgZHJtX2J1ZiAqcmFkZW9uX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3JhZGVvbl9idWZfcHJpdl90ICpidWZfcHJpdjsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCWludCBpLCB0OwogCWludCBzdGFydDsKIApAQCAtMjA4MiwxMiArMjA4NiwxMiBAQAogfQogCiAjaWYgMAotZHJtX2J1Zl90ICpyYWRlb25fZnJlZWxpc3RfZ2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0cnVjdCBkcm1fYnVmICpyYWRlb25fZnJlZWxpc3RfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJaW50IGksIHQ7CiAJaW50IHN0YXJ0OwogCXUzMiBkb25lX2FnZSA9IERSTV9SRUFEMzIoZGV2X3ByaXYtPnJpbmdfcnB0ciwgUkFERU9OX1NDUkFUQ0hPRkYoMSkpOwpAQCAtMjExNiwxNSArMjEyMCwxNSBAQAogfQogI2VuZGlmCiAKLXZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlpbnQgaTsKIAogCWRldl9wcml2LT5sYXN0X2J1ZiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IGRtYS0+YnVmX2NvdW50OyBpKyspIHsKLQkJZHJtX2J1Zl90ICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CisJCXN0cnVjdCBkcm1fYnVmICpidWYgPSBkbWEtPmJ1Zmxpc3RbaV07CiAJCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwogCQlidWZfcHJpdi0+YWdlID0gMDsKIAl9CkBAIC0yMTY2LDExICsyMTcwLDExIEBACiAJcmV0dXJuIERSTV9FUlIoRUJVU1kpOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9nZXRfYnVmZmVycyhEUk1GSUxFIGZpbHAsIGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkgZHJtX2RtYV90ICogZCkKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJIHN0cnVjdCBkcm1fZG1hICogZCkKIHsKIAlpbnQgaTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2J1ZiAqYnVmOwogCiAJZm9yIChpID0gZC0+Z3JhbnRlZF9jb3VudDsgaSA8IGQtPnJlcXVlc3RfY291bnQ7IGkrKykgewogCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KGRldik7CkBAIC0yMTk0LDEwICsyMTk4LDEwIEBACiBpbnQgcmFkZW9uX2NwX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWludCByZXQgPSAwOwotCWRybV9kbWFfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilkYXRhOwotCWRybV9kbWFfdCBkOworCXN0cnVjdCBkcm1fZG1hIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisJc3RydWN0IGRybV9kbWEgZDsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oCmluZGV4IDY2YzRiNmYuLjVhOGUyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oCkBAIC00MTcsNyArNDE3LDcgQEAKIAogCS8qIFRoZSBjdXJyZW50IGNsaXByZWN0cywgb3IgYSBzdWJzZXQgdGhlcmVvZi4KIAkgKi8KLQlkcm1fY2xpcF9yZWN0X3QgYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107CiAJdW5zaWduZWQgaW50IG5ib3g7CiAKIAkvKiBDb3VudGVycyBmb3IgY2xpZW50LXNpZGUgdGhyb3R0bGluZyBvZiByZW5kZXJpbmcgY2xpZW50cy4KQEAgLTQyNiw3ICs0MjYsNyBAQAogCXVuc2lnbmVkIGludCBsYXN0X2Rpc3BhdGNoOwogCXVuc2lnbmVkIGludCBsYXN0X2NsZWFyOwogCi0JZHJtX3RleF9yZWdpb25fdCB0ZXhfbGlzdFtSQURFT05fTlJfVEVYX0hFQVBTXVtSQURFT05fTlJfVEVYX1JFR0lPTlMgKworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhfbGlzdFtSQURFT05fTlJfVEVYX0hFQVBTXVtSQURFT05fTlJfVEVYX1JFR0lPTlMgKwogCQkJCQkJICAgICAgIDFdOwogCXVuc2lnbmVkIGludCB0ZXhfYWdlW1JBREVPTl9OUl9URVhfSEVBUFNdOwogCWludCBjdHhfb3duZXI7CkBAIC02MDQsNyArNjA0LDcgQEAKIAlpbnQgYnVmc3o7CiAJY2hhciBfX3VzZXIgKmJ1ZjsKIAlpbnQgbmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmJveGVzOwogfSBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl90ZXhfaW1hZ2UgewpAQCAtNjU1LDYgKzY1NSw3IEBACiAjZGVmaW5lIFJBREVPTl9QQVJBTV9HQVJUX1RFWF9IQU5ETEUgICAgICAgMTAKICNkZWZpbmUgUkFERU9OX1BBUkFNX1NDUkFUQ0hfT0ZGU0VUICAgICAgICAxMQogI2RlZmluZSBSQURFT05fUEFSQU1fQ0FSRF9UWVBFICAgICAgICAgICAgIDEyCisjZGVmaW5lIFJBREVPTl9QQVJBTV9WQkxBTktfQ1JUQyAgICAgICAgICAgMTMgICAvKiBWQkxBTksgQ1JUQyAqLwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtIHsKIAlpbnQgcGFyYW07CkBAIC03MDgsNyArNzA5LDcgQEAKICNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1BDSUdBUlRfTE9DQVRJT04gMwkvKiBQQ0kgR2FydCBMb2NhdGlvbiAqLwogI2RlZmluZSBSQURFT05fU0VUUEFSQU1fTkVXX01FTU1BUCA0CQkvKiBVc2UgbmV3IG1lbW9yeSBtYXAgKi8KICNkZWZpbmUgUkFERU9OX1NFVFBBUkFNX1BDSUdBUlRfVEFCTEVfU0laRSA1ICAgIC8qIFBDSSBHQVJUIFRhYmxlIFNpemUgKi8KLQorI2RlZmluZSBSQURFT05fU0VUUEFSQU1fVkJMQU5LX0NSVEMgNiAgICAgICAgICAgLyogVkJMQU5LIENSVEMgKi8KIC8qIDEuMTQ6IENsaWVudHMgY2FuIGFsbG9jYXRlL2ZyZWUgYSBzdXJmYWNlCiAgKi8KIHR5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3VyZmFjZV9hbGxvYyB7CkBAIC03MjEsNCArNzIyLDcgQEAKIAl1bnNpZ25lZCBpbnQgYWRkcmVzczsKIH0gZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdDsKIAorI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSAJMQorI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMiAJMgorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKaW5kZXggMmViNjUyZS4uMzQ5YWMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmMKQEAgLTYwLDcgKzYwLDcgQEAKIAkuZHJpdmVyX2ZlYXR1cmVzID0KIAkgICAgRFJJVkVSX1VTRV9BR1AgfCBEUklWRVJfVVNFX01UUlIgfCBEUklWRVJfUENJX0RNQSB8IERSSVZFUl9TRyB8CiAJICAgIERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9IQVZFX0RNQSB8IERSSVZFUl9JUlFfU0hBUkVEIHwKLQkgICAgRFJJVkVSX0lSUV9WQkwsCisJICAgIERSSVZFUl9JUlFfVkJMIHwgRFJJVkVSX0lSUV9WQkwyLAogCS5kZXZfcHJpdl9zaXplID0gc2l6ZW9mKGRybV9yYWRlb25fYnVmX3ByaXZfdCksCiAJLmxvYWQgPSByYWRlb25fZHJpdmVyX2xvYWQsCiAJLmZpcnN0b3BlbiA9IHJhZGVvbl9kcml2ZXJfZmlyc3RvcGVuLApAQCAtNzAsNiArNzAsNyBAQAogCS5sYXN0Y2xvc2UgPSByYWRlb25fZHJpdmVyX2xhc3RjbG9zZSwKIAkudW5sb2FkID0gcmFkZW9uX2RyaXZlcl91bmxvYWQsCiAJLnZibGFua193YWl0ID0gcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkudmJsYW5rX3dhaXQyID0gcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdDIsCiAJLmRyaV9saWJyYXJ5X25hbWUgPSBkcmlfbGlicmFyeV9uYW1lLAogCS5pcnFfcHJlaW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwsCiAJLmlycV9wb3N0aW5zdGFsbCA9IHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAppbmRleCA1NGY0OWVmLi4zYjNkOTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaApAQCAtOTcsOSArOTcsMTAgQEAKICAqICAgICAgIG5ldyBwYWNrZXQgdHlwZSkKICAqIDEuMjYtIEFkZCBzdXBwb3J0IGZvciB2YXJpYWJsZSBzaXplIFBDSShFKSBnYXJ0IGFwZXJ0dXJlCiAgKiAxLjI3LSBBZGQgc3VwcG9ydCBmb3IgSUdQIEdBUlQKKyAqIDEuMjgtIEFkZCBzdXBwb3J0IGZvciBWQkwgb24gQ1JUQzIKICAqLwogI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKLSNkZWZpbmUgRFJJVkVSX01JTk9SCQkyNworI2RlZmluZSBEUklWRVJfTUlOT1IJCTI4CiAjZGVmaW5lIERSSVZFUl9QQVRDSExFVkVMCTAKIAogLyoKQEAgLTE1NCw3ICsxNTUsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2ZyZWVsaXN0IHsKIAl1bnNpZ25lZCBpbnQgYWdlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgKm5leHQ7CiAJc3RydWN0IGRybV9yYWRlb25fZnJlZWxpc3QgKnByZXY7CiB9IGRybV9yYWRlb25fZnJlZWxpc3RfdDsKQEAgLTI3NywxMyArMjc4LDE2IEBACiAJLyogU1cgaW50ZXJydXB0ICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgc3dpX3F1ZXVlOwogCWF0b21pY190IHN3aV9lbWl0dGVkOworCWludCB2YmxhbmtfY3J0YzsKKwl1aW50MzJfdCBpcnFfZW5hYmxlX3JlZzsKKwlpbnQgaXJxX2VuYWJsZWQ7CiAKIAlzdHJ1Y3QgcmFkZW9uX3N1cmZhY2Ugc3VyZmFjZXNbUkFERU9OX01BWF9TVVJGQUNFU107CiAJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgdmlydF9zdXJmYWNlc1syICogUkFERU9OX01BWF9TVVJGQUNFU107CiAKIAl1bnNpZ25lZCBsb25nIHBjaWdhcnRfb2Zmc2V0OwogCXVuc2lnbmVkIGludCBwY2lnYXJ0X29mZnNldF9zZXQ7Ci0JZHJtX2F0aV9wY2lnYXJ0X2luZm8gZ2FydF9pbmZvOworCXN0cnVjdCBkcm1fYXRpX3BjaWdhcnRfaW5mbyBnYXJ0X2luZm87CiAKIAl1MzIgc2NyYXRjaF9hZ2VzWzVdOwogCkBAIC0yOTksNyArMzAzLDcgQEAKIAlpbnQgYnVmc3o7CiAJY2hhciAqYnVmOwogCWludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0IF9fdXNlciAqYm94ZXM7CiB9IGRybV9yYWRlb25fa2NtZF9idWZmZXJfdDsKIAogZXh0ZXJuIGludCByYWRlb25fbm9fd2I7CkBAIC0zMzIsOCArMzM2LDggQEAKIGV4dGVybiBpbnQgcmFkZW9uX2Z1bGxzY3JlZW4oRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCByYWRlb25fY3BfYnVmZmVycyhEUk1fSU9DVExfQVJHUyk7CiAKLWV4dGVybiB2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGRybV9idWZfdCAqcmFkZW9uX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2ZyZWVsaXN0X3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBzdHJ1Y3QgZHJtX2J1ZiAqcmFkZW9uX2ZyZWVsaXN0X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiAKIGV4dGVybiBpbnQgcmFkZW9uX3dhaXRfcmluZyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LCBpbnQgbik7CiAKQEAgLTM1MywyOSArMzU3LDMzIEBACiBleHRlcm4gaW50IHJhZGVvbl9pcnFfZW1pdChEUk1fSU9DVExfQVJHUyk7CiBleHRlcm4gaW50IHJhZGVvbl9pcnFfd2FpdChEUk1fSU9DVExfQVJHUyk7CiAKLWV4dGVybiB2b2lkIHJhZGVvbl9kb19yZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LAorZXh0ZXJuIHZvaWQgcmFkZW9uX2RvX3JlbGVhc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdmJsYW5rX3dhaXQyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogZXh0ZXJuIGlycXJldHVybl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2lycV91bmluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOworZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX3ZibGFua19jcnRjX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgcmFkZW9uX3ZibGFua19jcnRjX3NldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQ2NF90IHZhbHVlKTsKIAogZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiBleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX2ZpcnN0b3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBEUk1GSUxFIGZpbHApOwotZXh0ZXJuIHZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscCk7Ci1leHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCByYWRlb25fZHJpdmVyX29wZW4oZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KTsKK2V4dGVybiB2b2lkIHJhZGVvbl9kcml2ZXJfcHJlY2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIERSTUZJTEUgZmlscCk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX3Bvc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICogZmlscCk7CitleHRlcm4gdm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHJhZGVvbl9kcml2ZXJfb3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2KTsKIGV4dGVybiBsb25nIHJhZGVvbl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCiAvKiByMzAwX2NtZGJ1Zi5jICovCiBleHRlcm4gdm9pZCByMzAwX2luaXRfcmVnX2ZsYWdzKHZvaWQpOwogCi1leHRlcm4gaW50IHIzMDBfZG9fY3BfY21kYnVmKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwLAotCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorZXh0ZXJuIGludCByMzAwX2RvX2NwX2NtZGJ1ZihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwLAorCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqIGNtZGJ1Zik7CiAKIC8qIEZsYWdzIGZvciBzdGF0cy5ib3hlcwpAQCAtNDk2LDEyICs1MDQsMTUgQEAKIAogI2RlZmluZSBSQURFT05fR0VOX0lOVF9DTlRMCQkweDAwNDAKICMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19NQVNLCQkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0NSVEMyX1ZCTEFOS19NQVNLCQkoMSA8PCA5KQogIwlkZWZpbmUgUkFERU9OX0dVSV9JRExFX0lOVF9FTkFCTEUJKDEgPDwgMTkpCiAjCWRlZmluZSBSQURFT05fU1dfSU5UX0VOQUJMRQkJKDEgPDwgMjUpCiAKICNkZWZpbmUgUkFERU9OX0dFTl9JTlRfU1RBVFVTCQkweDAwNDQKICMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUCQkoMSA8PCAwKQogIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVRfQUNLICAgCSgxIDw8IDApCisjCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQJCSgxIDw8IDkpCisjCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVRfQUNLICAgCSgxIDw8IDkpCiAjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX1RFU1RfQUNLICAgICAoMSA8PCAxOSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVAkJKDEgPDwgMjUpCiAjCWRlZmluZSBSQURFT05fU1dfSU5UX1RFU1RfQUNLICAgCSgxIDw8IDI1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwppbmRleCAzZmYwYmFhLi5hZDhhMGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwpAQCAtNjQsNyArNjQsNyBAQAogCiBpcnFyZXR1cm5fdCByYWRlb25fZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUykKIHsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IChkcm1fZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAoc3RydWN0IGRybV9kZXZpY2UgKikgYXJnOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9CiAJICAgIChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0OwpAQCAtNzMsMTggKzczLDM1IEBACiAJICogb3V0c2lkZSB0aGUgRFJNCiAJICovCiAJc3RhdCA9IHJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCAoUkFERU9OX1NXX0lOVF9URVNUX0FDSyB8Ci0JCQkJCQkgIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSk7CisJCQkJCQkgIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUIHwKKwkJCQkJCSAgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKSk7CiAJaWYgKCFzdGF0KQogCQlyZXR1cm4gSVJRX05PTkU7CiAKKwlzdGF0ICY9IGRldl9wcml2LT5pcnFfZW5hYmxlX3JlZzsKKwogCS8qIFNXIGludGVycnVwdCAqLwogCWlmIChzdGF0ICYgUkFERU9OX1NXX0lOVF9URVNUKSB7CiAJCURSTV9XQUtFVVAoJmRldl9wcml2LT5zd2lfcXVldWUpOwogCX0KIAogCS8qIFZCTEFOSyBpbnRlcnJ1cHQgKi8KLQlpZiAoc3RhdCAmIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSB7Ci0JCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKwlpZiAoc3RhdCAmIChSQURFT05fQ1JUQ19WQkxBTktfU1RBVHxSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpKSB7CisJCWludCB2YmxhbmtfY3J0YyA9IGRldl9wcml2LT52YmxhbmtfY3J0YzsKKworCQlpZiAoKHZibGFua19jcnRjICYKKwkJICAgICAoRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEgfCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikpID09CisJCSAgICAoRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEgfCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikpIHsKKwkJCWlmIChzdGF0ICYgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpCisJCQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCQkJaWYgKHN0YXQgJiBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQpCisJCQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQyKTsKKwkJfSBlbHNlIGlmICgoKHN0YXQgJiBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkgJiYKKwkJCSAgICh2YmxhbmtfY3J0YyAmIERSTV9SQURFT05fVkJMQU5LX0NSVEMxKSkgfHwKKwkJCSAgICgoc3RhdCAmIFJBREVPTl9DUlRDMl9WQkxBTktfU1RBVCkgJiYKKwkJCSAgICAodmJsYW5rX2NydGMgJiBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikpKQorCQkJYXRvbWljX2luYygmZGV2LT52YmxfcmVjZWl2ZWQpOworCiAJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKIAkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoZGV2KTsKIAl9CkBAIC05Miw3ICsxMDksNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCByYWRlb25fZW1pdF9pcnEoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCByYWRlb25fZW1pdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgcmV0OwpAQCAtMTEwLDcgKzEyNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCByYWRlb25fd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgc3dpX25yKQorc3RhdGljIGludCByYWRlb25fd2FpdF9pcnEoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBzd2lfbnIpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xMjcsMTkgKzE0NCwzMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK2ludCByYWRlb25fZHJpdmVyX3ZibGFua19kb193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlLAorCQkJCSBpbnQgY3J0YykKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKIAlpbnQgcmV0ID0gMDsKLQorCWludCBhY2sgPSAwOworCWF0b21pY190ICpjb3VudGVyOwogCWlmICghZGV2X3ByaXYpIHsKIAkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdiwgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpOworCWlmIChjcnRjID09IERSTV9SQURFT05fVkJMQU5LX0NSVEMxKSB7CisJCWNvdW50ZXIgPSAmZGV2LT52YmxfcmVjZWl2ZWQ7CisJCWFjayB8PSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVDsKKwl9IGVsc2UgaWYgKGNydGMgPT0gRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpIHsKKwkJY291bnRlciA9ICZkZXYtPnZibF9yZWNlaXZlZDI7CisJCWFjayB8PSBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQ7CisJfSBlbHNlCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdiwgYWNrKTsKIAogCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKIApAQCAtMTQ4LDcgKzE3Niw3IEBACiAJICogdXNpbmcgdmVydGljYWwgYmxhbmtzLi4uCiAJICovCiAJRFJNX1dBSVRfT04ocmV0LCBkZXYtPnZibF9xdWV1ZSwgMyAqIERSTV9IWiwKLQkJICAgICgoKGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQpKQorCQkgICAgKCgoY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKGNvdW50ZXIpKQogCQkgICAgICAtICpzZXF1ZW5jZSkgPD0gKDEgPDwgMjMpKSk7CiAKIAkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOwpAQCAtMTU2LDYgKzE4NCwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCByYWRlb25fZHJpdmVyX3ZibGFua193YWl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCit7CisJcmV0dXJuIHJhZGVvbl9kcml2ZXJfdmJsYW5rX2RvX3dhaXQoZGV2LCBzZXF1ZW5jZSwgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEpOworfQorCitpbnQgcmFkZW9uX2RyaXZlcl92Ymxhbmtfd2FpdDIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwlyZXR1cm4gcmFkZW9uX2RyaXZlcl92YmxhbmtfZG9fd2FpdChkZXYsIHNlcXVlbmNlLCBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMik7Cit9CisKIC8qIE5lZWRzIHRoZSBsb2NrIGFzIGl0IHRvdWNoZXMgdGhlIHJpbmcuCiAgKi8KIGludCByYWRlb25faXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpCkBAIC0yMDQsOSArMjQyLDI0IEBACiAJcmV0dXJuIHJhZGVvbl93YWl0X2lycShkZXYsIGlycXdhaXQuaXJxX3NlcSk7CiB9CiAKK3N0YXRpYyB2b2lkIHJhZGVvbl9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlkZXZfcHJpdi0+aXJxX2VuYWJsZV9yZWcgPSBSQURFT05fU1dfSU5UX0VOQUJMRTsKKwlpZiAoZGV2X3ByaXYtPnZibGFua19jcnRjICYgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzEpCisJCWRldl9wcml2LT5pcnFfZW5hYmxlX3JlZyB8PSBSQURFT05fQ1JUQ19WQkxBTktfTUFTSzsKKworCWlmIChkZXZfcHJpdi0+dmJsYW5rX2NydGMgJiBEUk1fUkFERU9OX1ZCTEFOS19DUlRDMikKKwkJZGV2X3ByaXYtPmlycV9lbmFibGVfcmVnIHw9IFJBREVPTl9DUlRDMl9WQkxBTktfTUFTSzsKKworCVJBREVPTl9XUklURShSQURFT05fR0VOX0lOVF9DTlRMLCBkZXZfcHJpdi0+aXJxX2VuYWJsZV9yZWcpOworCWRldl9wcml2LT5pcnFfZW5hYmxlZCA9IDE7Cit9CisKIC8qIGRybV9kbWEuaCBob29rcwogKi8KLXZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0KIAkgICAgKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMTYsMTAgKzI2OSwxMSBAQAogCiAJLyogQ2xlYXIgYml0cyBpZiB0aGV5J3JlIGFscmVhZHkgaGlnaCAqLwogCXJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCAoUkFERU9OX1NXX0lOVF9URVNUX0FDSyB8Ci0JCQkJCSAgIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKSk7CisJCQkJCSAgIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUIHwKKwkJCQkJICAgUkFERU9OX0NSVEMyX1ZCTEFOS19TVEFUKSk7CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTIyNywxOCArMjgxLDQ4IEBACiAJYXRvbWljX3NldCgmZGV2X3ByaXYtPnN3aV9lbWl0dGVkLCAwKTsKIAlEUk1fSU5JVF9XQUlUUVVFVUUoJmRldl9wcml2LT5zd2lfcXVldWUpOwogCi0JLyogVHVybiBvbiBTVyBhbmQgVkJMIGludHMgKi8KLQlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfQ05UTCwKLQkJICAgICBSQURFT05fQ1JUQ19WQkxBTktfTUFTSyB8IFJBREVPTl9TV19JTlRfRU5BQkxFKTsKKwlyYWRlb25fZW5hYmxlX2ludGVycnVwdChkZXYpOwogfQogCi12b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3VuaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPQogCSAgICAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAlpZiAoIWRldl9wcml2KQogCQlyZXR1cm47CiAKKwlkZXZfcHJpdi0+aXJxX2VuYWJsZWQgPSAwOworCiAJLyogRGlzYWJsZSAqYWxsKiBpbnRlcnJ1cHRzICovCiAJUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX0NOVEwsIDApOwogfQorCisKK2ludCByYWRlb25fdmJsYW5rX2NydGNfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9yYWRlb25fcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIGZsYWc7CisJdTMyIHZhbHVlOworCisJZmxhZyA9IFJBREVPTl9SRUFEKFJBREVPTl9HRU5fSU5UX0NOVEwpOworCXZhbHVlID0gMDsKKworCWlmIChmbGFnICYgUkFERU9OX0NSVENfVkJMQU5LX01BU0spCisJCXZhbHVlIHw9IERSTV9SQURFT05fVkJMQU5LX0NSVEMxOworCisJaWYgKGZsYWcgJiBSQURFT05fQ1JUQzJfVkJMQU5LX01BU0spCisJCXZhbHVlIHw9IERSTV9SQURFT05fVkJMQU5LX0NSVEMyOworCXJldHVybiB2YWx1ZTsKK30KKworaW50IHJhZGVvbl92YmxhbmtfY3J0Y19zZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50NjRfdCB2YWx1ZSkKK3sKKwlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3JhZGVvbl9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlpZiAodmFsdWUgJiB+KERSTV9SQURFT05fVkJMQU5LX0NSVEMxIHwgRFJNX1JBREVPTl9WQkxBTktfQ1JUQzIpKSB7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggaW52YWxpZCBjcnRjIDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpdmFsdWUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlkZXZfcHJpdi0+dmJsYW5rX2NydGMgPSAodW5zaWduZWQgaW50KXZhbHVlOworCXJhZGVvbl9lbmFibGVfaW50ZXJydXB0KGRldik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwppbmRleCA5OGM1ZjFkLi4zZGRmODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRybV9yYWRlb25fcHJpdmF0ZV90ICoKIAkJCQkJCSAgICBkZXZfcHJpdiwKLQkJCQkJCSAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJCQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCQkJCSAgICB1MzIgKm9mZnNldCkKIHsKIAl1NjQgb2ZmID0gKm9mZnNldDsKQEAgLTkwLDcgKzkwLDcgQEAKIAogc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCiAJCQkJCQkgICAgIGRldl9wcml2LAotCQkJCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJCQkJICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKiBmaWxwX3ByaXYsCiAJCQkJCQkgICAgIGludCBpZCwgdTMyICpkYXRhKQogewogCXN3aXRjaCAoaWQpIHsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKIAkJCQkJCSAgICAgZGV2X3ByaXYsCi0JCQkJCQkgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKKwkJCQkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXYsCiAJCQkJCQkgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqCiAJCQkJCQkgICAgIGNtZGJ1ZiwKIAkJCQkJCSAgICAgdW5zaWduZWQgaW50ICpjbWRzeikKQEAgLTQyMSw3ICs0MjEsNyBAQAogICovCiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgcmFkZW9uX2VtaXRfY2xpcF9yZWN0KGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJCSAgICAgZHJtX2NsaXBfcmVjdF90ICogYm94KQorCQkJCQkgICAgIHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogYm94KQogewogCVJJTkdfTE9DQUxTOwogCkBAIC00MzksNyArNDM5LDcgQEAKIC8qIEVtaXQgMS4xIHN0YXRlCiAgKi8KIHN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCSAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJICAgICBkcm1fcmFkZW9uX2NvbnRleHRfcmVnc190ICogY3R4LAogCQkJICAgICBkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190ICogdGV4LAogCQkJICAgICB1bnNpZ25lZCBpbnQgZGlydHkpCkBAIC02MDgsNyArNjA4LDcgQEAKIC8qIEVtaXQgMS4yIHN0YXRlCiAgKi8KIHN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUyKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkgICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJICAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJICAgICAgZHJtX3JhZGVvbl9zdGF0ZV90ICogc3RhdGUpCiB7CiAJUklOR19MT0NBTFM7CkBAIC04NDQsNyArODQ0LDcgQEAKICAqIENQIGNvbW1hbmQgZGlzcGF0Y2ggZnVuY3Rpb25zCiAgKi8KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCQkgICAgIGRybV9yYWRlb25fY2xlYXJfdCAqIGNsZWFyLAogCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgKiBkZXB0aF9ib3hlcykKIHsKQEAgLTg1Miw3ICs4NTIsNyBAQAogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9yYWRlb25fZGVwdGhfY2xlYXJfdCAqZGVwdGhfY2xlYXIgPSAmZGV2X3ByaXYtPmRlcHRoX2NsZWFyOwogCWludCBuYm94ID0gc2FyZWFfcHJpdi0+bmJveDsKLQlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCXVuc2lnbmVkIGludCBmbGFncyA9IGNsZWFyLT5mbGFnczsKIAl1MzIgcmIzZF9jbnRsID0gMCwgcmIzZF9zdGVuY2lscmVmbWFzayA9IDA7CiAJaW50IGk7CkBAIC0xMzM1LDEyICsxMzM1LDEyIEBACiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwotCWRybV9jbGlwX3JlY3RfdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOworCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJaW50IGk7CiAJUklOR19MT0NBTFM7CiAJRFJNX0RFQlVHKCJcbiIpOwpAQCAtMTQxMiwxMCArMTQxMiwxMCBAQAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9zYXJlYV90ICpzYXJlYSA9IChkcm1fc2FyZWFfdCAqKSBkZXZfcHJpdi0+c2FyZWEtPmhhbmRsZTsKKwlzdHJ1Y3QgZHJtX3NhcmVhICpzYXJlYSA9IChzdHJ1Y3QgZHJtX3NhcmVhICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlOwogCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPT0gMSkKIAkgICAgPyBkZXZfcHJpdi0+ZnJvbnRfb2Zmc2V0IDogZGV2X3ByaXYtPmJhY2tfb2Zmc2V0OwogCVJJTkdfTE9DQUxTOwpAQCAtMTQ5MSw4ICsxNDkxLDggQEAKIAl1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OwogfSBkcm1fcmFkZW9uX3RjbF9wcmltX3Q7CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LAotCQkJCSAgICAgIGRybV9idWZfdCAqIGJ1ZiwKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJICAgICAgc3RydWN0IGRybV9idWYgKiBidWYsCiAJCQkJICAgICAgZHJtX3JhZGVvbl90Y2xfcHJpbV90ICogcHJpbSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTUzNyw3ICsxNTM3LDcgQEAKIAl9IHdoaWxlIChpIDwgbmJveCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTE1NTQsOCArMTU1NCw4IEBACiAJYnVmLT51c2VkID0gMDsKIH0KIAotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KGRybV9kZXZpY2VfdCAqIGRldiwKLQkJCQkJZHJtX2J1Zl90ICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3Qoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkJCXN0cnVjdCBkcm1fYnVmICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTE1ODgsOCArMTU4OCw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkcm1fZGV2aWNlX3QgKiBkZXYsCi0JCQkJICAgICAgIGRybV9idWZfdCAqIGVsdF9idWYsCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKKwkJCQkgICAgICAgc3RydWN0IGRybV9idWYgKiBlbHRfYnVmLAogCQkJCSAgICAgICBkcm1fcmFkZW9uX3RjbF9wcmltX3QgKiBwcmltKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNjQ3LDEzICsxNjQ3LDEzIEBACiAjZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9TSVpFIFJBREVPTl9CVUZGRVJfU0laRQogCiBzdGF0aWMgaW50IHJhZGVvbl9jcF9kaXNwYXRjaF90ZXh0dXJlKERSTUZJTEUgZmlscCwKLQkJCQkgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJICAgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkJICAgICAgZHJtX3JhZGVvbl90ZXh0dXJlX3QgKiB0ZXgsCiAJCQkJICAgICAgZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCAqIGltYWdlKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJdTMyIGZvcm1hdDsKIAl1MzIgKmJ1ZmZlcjsKIAljb25zdCB1OCBfX3VzZXIgKmRhdGE7CkBAIC0xODgxLDcgKzE4ODEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3RpcHBsZShkcm1fZGV2aWNlX3QgKiBkZXYsIHUzMiAqIHN0aXBwbGUpCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3RpcHBsZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgdTMyICogc3RpcHBsZSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwpAQCAtMjEzNCw3ICsyMTM0LDcgQEAKIAogLyogTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3Qgc2V0IGFsbCB0aGUgdGltZToKICAqLwotc3RhdGljIGludCByYWRlb25fZG9faW5pdF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0yMjA2LDEwICsyMjA2LDEwIEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdjsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3JhZGVvbl92ZXJ0ZXhfdCB2ZXJ0ZXg7CiAJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CiAKQEAgLTIyODksMTAgKzIyODksMTAgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OwogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcmFkZW9uX2luZGljZXNfdCBlbHRzOwogCWRybV9yYWRlb25fdGNsX3ByaW1fdCBwcmltOwogCWludCBjb3VudDsKQEAgLTI0MzgsOCArMjQzOCw4IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcmFkZW9uX2luZGlyZWN0X3QgaW5kaXJlY3Q7CiAJUklOR19MT0NBTFM7CiAKQEAgLTI1MDcsMTAgKzI1MDcsMTAgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OwogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwotCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlkcm1fcmFkZW9uX3ZlcnRleDJfdCB2ZXJ0ZXg7CiAJaW50IGk7CiAJdW5zaWduZWQgY2hhciBsYXN0c3RhdGU7CkBAIC0yNjAzLDcgKzI2MDMsNyBAQAogfQogCiBzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldHMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJICAgICAgIHN0cnVjdCBkcm1fZmlsZSAqIGZpbHBfcHJpdiwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCiAJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCiB7CkBAIC0yNzI4LDggKzI3MjgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDMoZHJtX2RldmljZV90ICogZGV2LAotCQkJICAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDMoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCisJCQkgICAgICAgc3RydWN0IGRybV9maWxlICogZmlscF9wcml2LAogCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yNzU0LDE2ICsyNzU0LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdChkcm1fZGV2aWNlX3QgKmRldiwKLQkJCQkJZHJtX2ZpbGVfdCAqZmlscF9wcml2LAorc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2LAogCQkJCQlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZiwKIAkJCQkJaW50IG9yaWdfbmJveCkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9jbGlwX3JlY3RfdCBib3g7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgYm94OwogCXVuc2lnbmVkIGludCBjbWRzejsKIAlpbnQgcmV0OwotCWRybV9jbGlwX3JlY3RfdCBfX3VzZXIgKmJveGVzID0gY21kYnVmLT5ib3hlczsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmJveGVzID0gY21kYnVmLT5ib3hlczsKIAlpbnQgaSA9IDA7CiAJUklOR19MT0NBTFM7CiAKQEAgLTI4MTYsNyArMjgxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBmbGFncykKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfd2FpdChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGZsYWdzKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CkBAIC0yODQ5LDkgKzI4NDksOSBAQAogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXY7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpidWYgPSBOVUxMOworCXN0cnVjdCBkcm1fZmlsZSAqZmlscF9wcml2OworCXN0cnVjdCBkcm1fZGV2aWNlX2RtYSAqZG1hID0gZGV2LT5kbWE7CisJc3RydWN0IGRybV9idWYgKmJ1ZiA9IE5VTEw7CiAJaW50IGlkeDsKIAlkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgY21kYnVmOwogCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlcjsKQEAgLTMwODUsNiArMzA4NSw5IEBACiAJCWVsc2UKIAkJCXZhbHVlID0gUkFERU9OX0NBUkRfUENJOwogCQlicmVhazsKKwljYXNlIFJBREVPTl9QQVJBTV9WQkxBTktfQ1JUQzoKKwkJdmFsdWUgPSByYWRlb25fdmJsYW5rX2NydGNfZ2V0KGRldik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9ERUJVRygiSW52YWxpZCBwYXJhbWV0ZXIgJWRcbiIsIHBhcmFtLnBhcmFtKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKQEAgLTMxMDIsNyArMzEwNSw3IEBACiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdjsKIAlkcm1fcmFkZW9uX3NldHBhcmFtX3Qgc3A7CiAJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKIApAQCAtMzE0MSw2ICszMTQ0LDkgQEAKIAkJaWYgKGRldl9wcml2LT5nYXJ0X2luZm8udGFibGVfc2l6ZSA8IFJBREVPTl9QQ0lHQVJUX1RBQkxFX1NJWkUpCiAJCQlkZXZfcHJpdi0+Z2FydF9pbmZvLnRhYmxlX3NpemUgPSBSQURFT05fUENJR0FSVF9UQUJMRV9TSVpFOwogCQlicmVhazsKKwljYXNlIFJBREVPTl9TRVRQQVJBTV9WQkxBTktfQ1JUQzoKKwkJcmV0dXJuIHJhZGVvbl92YmxhbmtfY3J0Y19zZXQoZGV2LCBzcC52YWx1ZSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCURSTV9ERUJVRygiSW52YWxpZCBwYXJhbWV0ZXIgJWRcbiIsIHNwLnBhcmFtKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKQEAgLTMxNTYsNyArMzE2Miw3IEBACiAgKgogICogRFJNIGluZnJhc3RydWN0dXJlIHRha2VzIGNhcmUgb2YgcmVjbGFpbWluZyBkbWEgYnVmZmVycy4KICAqLwotdm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQordm9pZCByYWRlb25fZHJpdmVyX3ByZWNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIERSTUZJTEUgZmlscCkKIHsKIAlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgewogCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMzE2Nyw3ICszMTczLDcgQEAKIAl9CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQordm9pZCByYWRlb25fZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWlmIChkZXYtPmRldl9wcml2YXRlKSB7CiAJCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0zMTgwLDcgKzMxODYsNyBAQAogCXJhZGVvbl9kb19yZWxlYXNlKGRldik7CiB9CiAKLWludCByYWRlb25fZHJpdmVyX29wZW4oZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQoraW50IHJhZGVvbl9kcml2ZXJfb3BlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbHBfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CkBAIC0zMjAyLDcgKzMyMDgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHJhZGVvbl9kcml2ZXJfcG9zdGNsb3NlKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9maWxlICpmaWxwX3ByaXYpCiB7CiAJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdiA9CiAJICAgIGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9iY2kuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCmluZGV4IGI5NGZhYjUuLjE4YzcyMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2JjaS5jCkBAIC0zMiw3ICszMiw3IEBACiAjZGVmaW5lIFNBVkFHRV9FVkVOVF9VU0VDX1RJTUVPVVQJNTAwMDAwMAkvKiA1cyAqLwogI2RlZmluZSBTQVZBR0VfRlJFRUxJU1RfREVCVUcJCTAKIAotc3RhdGljIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koZHJtX2RldmljZV90ICpkZXYpOworc3RhdGljIGludCBzYXZhZ2VfZG9fY2xlYW51cF9iY2koc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIHN0YXRpYyBpbnQKIHNhdmFnZV9iY2lfd2FpdF9maWZvX3NoYWRvdyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1bnNpZ25lZCBpbnQgbikKQEAgLTIwMywxMSArMjAzLDExIEBACiAvKgogICogRnJlZWxpc3QgbWFuYWdlbWVudAogICovCi1zdGF0aWMgaW50IHNhdmFnZV9mcmVlbGlzdF9pbml0KGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgc2F2YWdlX2ZyZWVsaXN0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fYnVmX3QgKmJ1ZjsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiAJZHJtX3NhdmFnZV9idWZfcHJpdl90ICplbnRyeTsKIAlpbnQgaTsKIAlEUk1fREVCVUcoImNvdW50PSVkXG4iLCBkbWEtPmJ1Zl9jb3VudCk7CkBAIC0yMzYsNyArMjM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGRybV9idWZfdCAqc2F2YWdlX2ZyZWVsaXN0X2dldChkcm1fZGV2aWNlX3QgKiBkZXYpCitzdGF0aWMgc3RydWN0IGRybV9idWYgKnNhdmFnZV9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fc2F2YWdlX2J1Zl9wcml2X3QgKnRhaWwgPSBkZXZfcHJpdi0+dGFpbC5wcmV2OwpAQCAtMjY5LDcgKzI2OSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgc2F2YWdlX2ZyZWVsaXN0X3B1dChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKK3ZvaWQgc2F2YWdlX2ZyZWVsaXN0X3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9idWYgKiBidWYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fc2F2YWdlX2J1Zl9wcml2X3QgKmVudHJ5ID0gYnVmLT5kZXZfcHJpdmF0ZSwgKnByZXYsICpuZXh0OwpAQCAtNTM1LDcgKzUzNSw3IEBACiAJZGV2X3ByaXYtPmZpcnN0X2RtYV9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfZG1hX3BhZ2UgPSAwOwogfQogCi1pbnQgc2F2YWdlX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCitpbnQgc2F2YWdlX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAKQEAgLTU1OCw3ICs1NTgsNyBAQAogICogaW4gZHJtX2FkZG1hcC4gVGhlcmVmb3JlIHdlIGFkZCB0aGVtIG1hbnVhbGx5IGJlZm9yZSB0aGUgbWFwcyBhcmUKICAqIGluaXRpYWxpemVkLCBhbmQgdGVhciB0aGVtIGRvd24gb24gbGFzdCBjbG9zZS4KICAqLwotaW50IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuKGRybV9kZXZpY2VfdCAqZGV2KQoraW50IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3NhdmFnZV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1bnNpZ25lZCBsb25nIG1taW9fYmFzZSwgZmJfYmFzZSwgZmJfc2l6ZSwgYXBlcnR1cmVfYmFzZTsKQEAgLTY1NSw3ICs2NTUsNyBAQAogLyoKICAqIERlbGV0ZSBNVFJScyBhbmQgZnJlZSBkZXZpY2UtcHJpdmF0ZSBkYXRhLgogICovCi12b2lkIHNhdmFnZV9kcml2ZXJfbGFzdGNsb3NlKGRybV9kZXZpY2VfdCAqZGV2KQordm9pZCBzYXZhZ2VfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CkBAIC02NjcsNyArNjY3LDcgQEAKIAkJCQkgZGV2X3ByaXYtPm10cnJbaV0uc2l6ZSwgRFJNX01UUlJfV0MpOwogfQogCi1pbnQgc2F2YWdlX2RyaXZlcl91bmxvYWQoZHJtX2RldmljZV90ICpkZXYpCitpbnQgc2F2YWdlX2RyaXZlcl91bmxvYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlkcm1fc2F2YWdlX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC02NzYsNyArNjc2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYXZhZ2VfZG9faW5pdF9iY2koZHJtX2RldmljZV90ICogZGV2LCBkcm1fc2F2YWdlX2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IHNhdmFnZV9kb19pbml0X2JjaShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3NhdmFnZV9pbml0X3QgKiBpbml0KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTcxMSw3ICs3MTEsNyBAQAogCWRldl9wcml2LT50ZXh0dXJlX29mZnNldCA9IGluaXQtPnRleHR1cmVfb2Zmc2V0OwogCWRldl9wcml2LT50ZXh0dXJlX3NpemUgPSBpbml0LT50ZXh0dXJlX3NpemU7CiAKLQlEUk1fR0VUU0FSRUEoKTsKKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCXNhdmFnZV9kb19jbGVhbnVwX2JjaShkZXYpOwpAQCAtODk4LDcgKzg5OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2F2YWdlX2RvX2NsZWFudXBfYmNpKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgc2F2YWdlX2RvX2NsZWFudXBfYmNpKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKQEAgLTEwMDcsOSArMTAwNyw5IEBACiAgKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQKICAqLwogCi1zdGF0aWMgaW50IHNhdmFnZV9iY2lfZ2V0X2J1ZmZlcnMoRFJNRklMRSBmaWxwLCBkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2RtYV90ICpkKQorc3RhdGljIGludCBzYXZhZ2VfYmNpX2dldF9idWZmZXJzKERSTUZJTEUgZmlscCwgc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9kbWEgKmQpCiB7Ci0JZHJtX2J1Zl90ICpidWY7CisJc3RydWN0IGRybV9idWYgKmJ1ZjsKIAlpbnQgaTsKIAogCWZvciAoaSA9IGQtPmdyYW50ZWRfY291bnQ7IGkgPCBkLT5yZXF1ZXN0X2NvdW50OyBpKyspIHsKQEAgLTEwMzQsMTMgKzEwMzQsMTMgQEAKIGludCBzYXZhZ2VfYmNpX2J1ZmZlcnMoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKLQlkcm1fZG1hX3QgZDsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOworCXN0cnVjdCBkcm1fZG1hIGQ7CiAJaW50IHJldCA9IDA7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkLCAoZHJtX2RtYV90IF9fdXNlciAqKSBkYXRhLCBzaXplb2YoZCkpOworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChkLCAoc3RydWN0IGRybV9kbWEgX191c2VyICopIGRhdGEsIHNpemVvZihkKSk7CiAKIAkvKiBQbGVhc2UgZG9uJ3Qgc2VuZCB1cyBidWZmZXJzLgogCSAqLwpAQCAtMTA2NCwxNCArMTA2NCwxNCBAQAogCQlyZXQgPSBzYXZhZ2VfYmNpX2dldF9idWZmZXJzKGZpbHAsIGRldiwgJmQpOwogCX0KIAotCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV9kbWFfdCBfX3VzZXIgKikgZGF0YSwgZCwgc2l6ZW9mKGQpKTsKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChzdHJ1Y3QgZHJtX2RtYSBfX3VzZXIgKikgZGF0YSwgZCwgc2l6ZW9mKGQpKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKQordm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIERSTUZJTEUgZmlscCkKIHsKLQlkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2RldmljZV9kbWEgKmRtYSA9IGRldi0+ZG1hOwogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IGk7CiAKQEAgLTEwODUsNyArMTA4NSw3IEBACiAJLyppODMwX2ZsdXNoX3F1ZXVlKGRldik7ICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZG1hLT5idWZfY291bnQ7IGkrKykgewotCQlkcm1fYnVmX3QgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKKwkJc3RydWN0IGRybV9idWYgKmJ1ZiA9IGRtYS0+YnVmbGlzdFtpXTsKIAkJZHJtX3NhdmFnZV9idWZfcHJpdl90ICpidWZfcHJpdiA9IGJ1Zi0+ZGV2X3ByaXZhdGU7CiAKIAkJaWYgKGJ1Zi0+ZmlscCA9PSBmaWxwICYmIGJ1Zl9wcml2ICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2RybS5oCmluZGV4IGUxMTQ4ZTguLjhhNTc2ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX2RybS5oCkBAIC00Nyw3ICs0Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCBfZHJtX3NhdmFnZV9zYXJlYSB7CiAJLyogTFJVIGxpc3RzIGZvciB0ZXh0dXJlIG1lbW9yeSBpbiBhZ3Agc3BhY2UgYW5kIG9uIHRoZSBjYXJkLgogCSAqLwotCWRybV90ZXhfcmVnaW9uX3QgdGV4TGlzdFtTQVZBR0VfTlJfVEVYX0hFQVBTXVtTQVZBR0VfTlJfVEVYX1JFR0lPTlMgKworCXN0cnVjdCBkcm1fdGV4X3JlZ2lvbiB0ZXhMaXN0W1NBVkFHRV9OUl9URVhfSEVBUFNdW1NBVkFHRV9OUl9URVhfUkVHSU9OUyArCiAJCQkJCQkgICAgICAxXTsKIAl1bnNpZ25lZCBpbnQgdGV4QWdlW1NBVkFHRV9OUl9URVhfSEVBUFNdOwogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAl1bnNpZ25lZCBpbnQgdmJfc2l6ZTsJLyogc2l6ZSBvZiBjbGllbnQgdmVydGV4IGJ1ZmZlciBpbiBieXRlcyAqLwogCXVuc2lnbmVkIGludCB2Yl9zdHJpZGU7CS8qIHN0cmlkZSBvZiB2ZXJ0aWNlcyBpbiAzMmJpdCB3b3JkcyAqLwogCS8qIGJveGVzIGluIGNsaWVudCdzIGFkZHJlc3Mgc3BhY2UgKi8KLQlkcm1fY2xpcF9yZWN0X3QgX191c2VyICpib3hfYWRkcjsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBfX3VzZXIgKmJveF9hZGRyOwogCXVuc2lnbmVkIGludCBuYm94OwkvKiBudW1iZXIgb2YgY2xpcHBpbmcgYm94ZXMgKi8KIH0gZHJtX3NhdmFnZV9jbWRidWZfdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2VfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaAppbmRleCA4ZjA0YjNkLi41ZmQ1NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9kcnYuaApAQCAtNTgsNyArNTgsNyBAQAogCXN0cnVjdCBkcm1fc2F2YWdlX2J1Zl9wcml2ICpuZXh0OwogCXN0cnVjdCBkcm1fc2F2YWdlX2J1Zl9wcml2ICpwcmV2OwogCWRybV9zYXZhZ2VfYWdlX3QgYWdlOwotCWRybV9idWZfdCAqYnVmOworCXN0cnVjdCBkcm1fYnVmICpidWY7CiB9IGRybV9zYXZhZ2VfYnVmX3ByaXZfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgZHJtX3NhdmFnZV9kbWFfcGFnZSB7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAkvKiBFcnIsIHRoZXJlIGlzIGEgbWFjcm8gd2FpdF9ldmVudCBpbiBpbmNsdWRlL2xpbnV4L3dhaXQuaC4KIAkgKiBBdm9pZCB1bndhbnRlZCBtYWNybyBleHBhbnNpb24uICovCiAJdm9pZCAoKmVtaXRfY2xpcF9yZWN0KSAoc3RydWN0IGRybV9zYXZhZ2VfcHJpdmF0ZSAqIGRldl9wcml2LAotCQkJCWNvbnN0IGRybV9jbGlwX3JlY3RfdCAqIHBib3gpOworCQkJCWNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogcGJveCk7CiAJdm9pZCAoKmRtYV9mbHVzaCkgKHN0cnVjdCBkcm1fc2F2YWdlX3ByaXZhdGUgKiBkZXZfcHJpdik7CiB9IGRybV9zYXZhZ2VfcHJpdmF0ZV90OwogCkBAIC0yMDMsMjIgKzIwMywyMiBAQAogLyogQkNJIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHVpbnQxNl90IHNhdmFnZV9iY2lfZW1pdF9ldmVudChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7Ci1leHRlcm4gdm9pZCBzYXZhZ2VfZnJlZWxpc3RfcHV0KGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2J1Zl90ICogYnVmKTsKK2V4dGVybiB2b2lkIHNhdmFnZV9mcmVlbGlzdF9wdXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBkcm1fYnVmICogYnVmKTsKIGV4dGVybiB2b2lkIHNhdmFnZV9kbWFfcmVzZXQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CiBleHRlcm4gdm9pZCBzYXZhZ2VfZG1hX3dhaXQoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgdW5zaWduZWQgaW50IHBhZ2UpOwogZXh0ZXJuIHVpbnQzMl90ICpzYXZhZ2VfZG1hX2FsbG9jKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkJICB1bnNpZ25lZCBpbnQgbik7Ci1leHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KTsKLWV4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9maXJzdG9wZW4oZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIHZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIGludCBzYXZhZ2VfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldik7Ci1leHRlcm4gdm9pZCBzYXZhZ2VfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKTsKK2V4dGVybiBpbnQgc2F2YWdlX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCk7CitleHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfZmlyc3RvcGVuKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgc2F2YWdlX2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHNhdmFnZV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgc2F2YWdlX3JlY2xhaW1fYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgRFJNRklMRSBmaWxwKTsKIAogLyogc3RhdGUgZnVuY3Rpb25zICovCiBleHRlcm4gdm9pZCBzYXZhZ2VfZW1pdF9jbGlwX3JlY3RfczNkKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CisJCQkJICAgICAgY29uc3Qgc3RydWN0IGRybV9jbGlwX3JlY3QgKiBwYm94KTsKIGV4dGVybiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJCSAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCk7CisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqIHBib3gpOwogCiAjZGVmaW5lIFNBVkFHRV9GQl9TSVpFX1MzCTB4MDEwMDAwMDAJLyogIDE2TUIgKi8KICNkZWZpbmUgU0FWQUdFX0ZCX1NJWkVfUzQJMHgwMjAwMDAwMAkvKiAgMzJNQiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKaW5kZXggMWNhMWU5Yy4uNzc0OTc4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAic2F2YWdlX2Rydi5oIgogCiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zM2QoZHJtX3NhdmFnZV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgICAgICBjb25zdCBkcm1fY2xpcF9yZWN0X3QgKiBwYm94KQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogcGJveCkKIHsKIAl1aW50MzJfdCBzY3N0YXJ0ID0gZGV2X3ByaXYtPnN0YXRlLnMzZC5uZXdfc2NzdGFydDsKIAl1aW50MzJfdCBzY2VuZCA9IGRldl9wcml2LT5zdGF0ZS5zM2QubmV3X3NjZW5kOwpAQCAtNTMsNyArNTMsNyBAQAogfQogCiB2b2lkIHNhdmFnZV9lbWl0X2NsaXBfcmVjdF9zNChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAotCQkJICAgICAgY29uc3QgZHJtX2NsaXBfcmVjdF90ICogcGJveCkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICogcGJveCkKIHsKIAl1aW50MzJfdCBkcmF3Y3RybDAgPSBkZXZfcHJpdi0+c3RhdGUuczQubmV3X2RyYXdjdHJsMDsKIAl1aW50MzJfdCBkcmF3Y3RybDEgPSBkZXZfcHJpdi0+c3RhdGUuczQubmV3X2RyYXdjdHJsMTsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9kbWFfcHJpbShkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgICBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqIGNtZF9oZWFkZXIsCi0JCQkJICAgIGNvbnN0IGRybV9idWZfdCAqIGRtYWJ1ZikKKwkJCQkgICAgY29uc3Qgc3RydWN0IGRybV9idWYgKiBkbWFidWYpCiB7CiAJdW5zaWduZWQgY2hhciByZW9yZGVyID0gMDsKIAl1bnNpZ25lZCBpbnQgcHJpbSA9IGNtZF9oZWFkZXItPnByaW0ucHJpbTsKQEAgLTUzNiw3ICs1MzYsNyBAQAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfZG1hX2lkeChkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCSAgIGNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICogY21kX2hlYWRlciwKIAkJCQkgICBjb25zdCB1aW50MTZfdCAqaWR4LAotCQkJCSAgIGNvbnN0IGRybV9idWZfdCAqIGRtYWJ1ZikKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZHJtX2J1ZiAqIGRtYWJ1ZikKIHsKIAl1bnNpZ25lZCBjaGFyIHJlb3JkZXIgPSAwOwogCXVuc2lnbmVkIGludCBwcmltID0gY21kX2hlYWRlci0+aWR4LnByaW07CkBAIC03OTIsNyArNzkyLDcgQEAKIAkJCQkgY29uc3QgZHJtX3NhdmFnZV9jbWRfaGVhZGVyX3QgKiBjbWRfaGVhZGVyLAogCQkJCSBjb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqZGF0YSwKIAkJCQkgdW5zaWduZWQgaW50IG5ib3gsCi0JCQkJIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqYm94ZXMpCisJCQkJIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3hlcykKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbWRfaGVhZGVyLT5jbGVhcjAuZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNsZWFyX2NtZDsKQEAgLTg2MSw3ICs4NjEsNyBAQAogfQogCiBzdGF0aWMgaW50IHNhdmFnZV9kaXNwYXRjaF9zd2FwKGRybV9zYXZhZ2VfcHJpdmF0ZV90ICogZGV2X3ByaXYsCi0JCQkJdW5zaWduZWQgaW50IG5ib3gsIGNvbnN0IGRybV9jbGlwX3JlY3RfdCAqYm94ZXMpCisJCQkJdW5zaWduZWQgaW50IG5ib3gsIGNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3hlcykKIHsKIAl1bnNpZ25lZCBpbnQgc3dhcF9jbWQ7CiAJdW5zaWduZWQgaW50IGk7CkBAIC04OTIsMTEgKzg5MiwxMSBAQAogc3RhdGljIGludCBzYXZhZ2VfZGlzcGF0Y2hfZHJhdyhkcm1fc2F2YWdlX3ByaXZhdGVfdCAqIGRldl9wcml2LAogCQkJCWNvbnN0IGRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpzdGFydCwKIAkJCQljb25zdCBkcm1fc2F2YWdlX2NtZF9oZWFkZXJfdCAqZW5kLAotCQkJCWNvbnN0IGRybV9idWZfdCAqIGRtYWJ1ZiwKKwkJCQljb25zdCBzdHJ1Y3QgZHJtX2J1ZiAqIGRtYWJ1ZiwKIAkJCQljb25zdCB1bnNpZ25lZCBpbnQgKnZ0eGJ1ZiwKIAkJCQl1bnNpZ25lZCBpbnQgdmJfc2l6ZSwgdW5zaWduZWQgaW50IHZiX3N0cmlkZSwKIAkJCQl1bnNpZ25lZCBpbnQgbmJveCwKLQkJCQljb25zdCBkcm1fY2xpcF9yZWN0X3QgKmJveGVzKQorCQkJCWNvbnN0IHN0cnVjdCBkcm1fY2xpcF9yZWN0ICpib3hlcykKIHsKIAl1bnNpZ25lZCBpbnQgaSwgajsKIAlpbnQgcmV0OwpAQCAtOTU3LDEzICs5NTcsMTMgQEAKIHsKIAlEUk1fREVWSUNFOwogCWRybV9zYXZhZ2VfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Ci0JZHJtX2J1Zl90ICpkbWFidWY7CisJc3RydWN0IGRybV9kZXZpY2VfZG1hICpkbWEgPSBkZXYtPmRtYTsKKwlzdHJ1Y3QgZHJtX2J1ZiAqZG1hYnVmOwogCWRybV9zYXZhZ2VfY21kYnVmX3QgY21kYnVmOwogCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICprY21kX2FkZHIgPSBOVUxMOwogCWRybV9zYXZhZ2VfY21kX2hlYWRlcl90ICpmaXJzdF9kcmF3X2NtZDsKIAl1bnNpZ25lZCBpbnQgKmt2Yl9hZGRyID0gTlVMTDsKLQlkcm1fY2xpcF9yZWN0X3QgKmtib3hfYWRkciA9IE5VTEw7CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmtib3hfYWRkciA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEwMTksNyArMTAxOSw3IEBACiAJCWNtZGJ1Zi52Yl9hZGRyID0ga3ZiX2FkZHI7CiAJfQogCWlmIChjbWRidWYubmJveCkgewotCQlrYm94X2FkZHIgPSBkcm1fYWxsb2MoY21kYnVmLm5ib3ggKiBzaXplb2YoZHJtX2NsaXBfcmVjdF90KSwKKwkJa2JveF9hZGRyID0gZHJtX2FsbG9jKGNtZGJ1Zi5uYm94ICogc2l6ZW9mKHN0cnVjdCBkcm1fY2xpcF9yZWN0KSwKIAkJCQkgICAgICAgRFJNX01FTV9EUklWRVIpOwogCQlpZiAoa2JveF9hZGRyID09IE5VTEwpIHsKIAkJCXJldCA9IERSTV9FUlIoRU5PTUVNKTsKQEAgLTEwMjcsNyArMTAyNyw3IEBACiAJCX0KIAogCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGtib3hfYWRkciwgY21kYnVmLmJveF9hZGRyLAotCQkJCSAgICAgICBjbWRidWYubmJveCAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpKSkgeworCQkJCSAgICAgICBjbWRidWYubmJveCAqIHNpemVvZihzdHJ1Y3QgZHJtX2NsaXBfcmVjdCkpKSB7CiAJCQlyZXQgPSBEUk1fRVJSKEVGQVVMVCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KQEAgLTExNTgsNyArMTE1OCw3IEBACiAJLyogSWYgd2UgZGlkbid0IG5lZWQgdG8gYWxsb2NhdGUgdGhlbSwgdGhlc2UnbGwgYmUgTlVMTCAqLwogCWRybV9mcmVlKGtjbWRfYWRkciwgY21kYnVmLnNpemUgKiA4LCBEUk1fTUVNX0RSSVZFUik7CiAJZHJtX2ZyZWUoa3ZiX2FkZHIsIGNtZGJ1Zi52Yl9zaXplLCBEUk1fTUVNX0RSSVZFUik7Ci0JZHJtX2ZyZWUoa2JveF9hZGRyLCBjbWRidWYubmJveCAqIHNpemVvZihkcm1fY2xpcF9yZWN0X3QpLAorCWRybV9mcmVlKGtib3hfYWRkciwgY21kYnVmLm5ib3ggKiBzaXplb2Yoc3RydWN0IGRybV9jbGlwX3JlY3QpLAogCQkgRFJNX01FTV9EUklWRVIpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMKaW5kZXggNjkwZTBhZi4uMTkxMmY1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlzaXNkcnZfUENJX0lEUwogfTsKIAotc3RhdGljIGludCBzaXNfZHJpdmVyX2xvYWQoZHJtX2RldmljZV90ICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKK3N0YXRpYyBpbnQgc2lzX2RyaXZlcl9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgY2hpcHNldCkKIHsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJaW50IHJldDsKQEAgLTU0LDcgKzU0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNpc19kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KQorc3RhdGljIGludCBzaXNfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKaW5kZXggNzBkNGVkZS4uNTYzMGRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfZHJ2LmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogI2luY2x1ZGUgImRybV9zbWFuLmgiCiAKKwogI2RlZmluZSBTSVNfQkFTRSAoZGV2X3ByaXYtPm1taW8pCiAjZGVmaW5lIFNJU19SRUFEKHJlZykgICAgICAgICBEUk1fUkVBRDMyKFNJU19CQVNFLCByZWcpOwogI2RlZmluZSBTSVNfV1JJVEUocmVnLCB2YWwpICAgRFJNX1dSSVRFMzIoU0lTX0JBU0UsIHJlZywgdmFsKTsKQEAgLTUzLDcgKzU0LDcgQEAKIHR5cGVkZWYgc3RydWN0IGRybV9zaXNfcHJpdmF0ZSB7CiAJZHJtX2xvY2FsX21hcF90ICptbWlvOwogCXVuc2lnbmVkIGludCBpZGxlX2ZhdWx0OwotCWRybV9zbWFuX3Qgc21hbjsKKwlzdHJ1Y3QgZHJtX3NtYW4gc21hbjsKIAl1bnNpZ25lZCBpbnQgY2hpcHNldDsKIAlpbnQgdnJhbV9pbml0aWFsaXplZDsKIAlpbnQgYWdwX2luaXRpYWxpemVkOwpAQCAtNjEsOSArNjIsOSBAQAogCXVuc2lnbmVkIGxvbmcgYWdwX29mZnNldDsKIH0gZHJtX3Npc19wcml2YXRlX3Q7CiAKLWV4dGVybiBpbnQgc2lzX2lkbGUoZHJtX2RldmljZV90ICpkZXYpOwotZXh0ZXJuIHZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKLWV4dGVybiB2b2lkIHNpc19sYXN0Y2xvc2UoZHJtX2RldmljZV90ICpkZXYpOworZXh0ZXJuIGludCBzaXNfaWRsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHNpc19yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiB2b2lkIHNpc19sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKIGV4dGVybiBkcm1faW9jdGxfZGVzY190IHNpc19pb2N0bHNbXTsKIGV4dGVybiBpbnQgc2lzX21heF9pb2N0bDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCmluZGV4IGQyNmY1ZGIuLjQ0MWJiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYwpAQCAtOTQsNyArOTQsNyBAQAogCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKICNpZiBkZWZpbmVkKENPTkZJR19GQl9TSVMpCiAJewotCQlkcm1fc21hbl9tbV90IHNtYW5fbW07CisJCXN0cnVjdCBkcm1fc21hbl9tbSBzbWFuX21tOwogCQlzbWFuX21tLnByaXZhdGUgPSAodm9pZCAqKTB4RkZGRkZGRkY7CiAJCXNtYW5fbW0uYWxsb2NhdGUgPSBzaXNfc21hbl9tbV9hbGxvY2F0ZTsKIAkJc21hbl9tbS5mcmVlID0gc2lzX3NtYW5fbW1fZnJlZTsKQEAgLTEyMywxNCArMTIzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2lzX2RybV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBwcml2LAorc3RhdGljIGludCBzaXNfZHJtX2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqIHByaXYsCiAJCQkgdW5zaWduZWQgbG9uZyBkYXRhLCBpbnQgcG9vbCkKIHsKIAlkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKGRybV9zaXNfbWVtX3QgX191c2VyICopIGRhdGE7CiAJZHJtX3Npc19tZW1fdCBtZW07CiAJaW50IHJldHZhbCA9IDA7Ci0JZHJtX21lbWJsb2NrX2l0ZW1fdCAqaXRlbTsKKwlzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gKml0ZW07CiAKIAlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtLCBhcmdwLCBzaXplb2YobWVtKSk7CiAKQEAgLTIyOSwxMiArMjI5LDEyIEBACiAJcmV0dXJuIHNpc19kcm1fYWxsb2MoZGV2LCBwcml2LCBkYXRhLCBBR1BfVFlQRSk7CiB9CiAKLXN0YXRpYyBkcm1fbG9jYWxfbWFwX3QgKnNpc19yZWdfaW5pdChkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyBkcm1fbG9jYWxfbWFwX3QgKnNpc19yZWdfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCWRybV9tYXBfbGlzdF90ICplbnRyeTsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICplbnRyeTsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1hcGxpc3QtPmhlYWQsIGhlYWQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCW1hcCA9IGVudHJ5LT5tYXA7CiAJCWlmICghbWFwKQogCQkJY29udGludWU7CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotaW50IHNpc19pZGxlKGRybV9kZXZpY2VfdCAqZGV2KQoraW50IHNpc19pZGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAl1aW50MzJfdCBpZGxlX3JlZzsKQEAgLTMxNCwxMCArMzE0LDEwIEBACiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiB9CiAKLXZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoZHJtX2RldmljZV90ICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3ZvaWQgc2lzX3JlY2xhaW1fYnVmZmVyc19sb2NrZWQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZHJtX2ZpbGUgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJaWYgKGRybV9zbWFuX293bmVyX2NsZWFuKCZkZXZfcHJpdi0+c21hbiwgKHVuc2lnbmVkIGxvbmcpcHJpdikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKaW5kZXggMTNhOWM1Yy4uN2ZmMmI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXJldHVybiAodWludDMyX3QgKikgKGRldl9wcml2LT5kbWFfcHRyICsgZGV2X3ByaXYtPmRtYV9sb3cpOwogfQogCi1pbnQgdmlhX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCB2aWFfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKIAkJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0KQEAgLTE2OSw3ICsxNjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpYV9pbml0aWFsaXplKGRybV9kZXZpY2VfdCAqIGRldiwKK3N0YXRpYyBpbnQgdmlhX2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCiAJCQkgIGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsCiAJCQkgIGRybV92aWFfZG1hX2luaXRfdCAqIGluaXQpCiB7CkBAIC0yNjIsNyArMjYyLDcgQEAKIAlyZXR1cm4gcmV0Y29kZTsKIH0KIAotc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKK3N0YXRpYyBpbnQgdmlhX2Rpc3BhdGNoX2NtZGJ1ZmZlcihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CiAJdWludDMyX3QgKnZiOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KQoraW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCkBAIC0zNTYsNyArMzU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfcGNpX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCitzdGF0aWMgaW50IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LAogCQkJCSAgICAgIGRybV92aWFfY21kYnVmZmVyX3QgKiBjbWQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYwppbmRleCAyODgxYTA2Li5mZGI4NjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCkBAIC0yMDcsNyArMjA3LDcgQEAKICAqLwogCiBzdGF0aWMgdm9pZAotdmlhX2ZpcmVfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgaW50IGVuZ2luZSkKK3ZpYV9maXJlX2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgaW50IGVuZ2luZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCkBAIC0yODksNyArMjg5LDcgQEAKIH0KIAkJCQogc3RhdGljIHZvaWQKLXZpYV9hYm9ydF9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lKQordmlhX2Fib3J0X2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGVuZ2luZSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCkBAIC0yOTcsNyArMjk3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXZpYV9kbWFibGl0X2VuZ2luZV9vZmYoZHJtX2RldmljZV90ICpkZXYsIGludCBlbmdpbmUpCit2aWFfZG1hYmxpdF9lbmdpbmVfb2ZmKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKIApAQCAtMzE0LDcgKzMxNCw3IEBACiAgKi8KIAkJCiB2b2lkCi12aWFfZG1hYmxpdF9oYW5kbGVyKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpCit2aWFfZG1hYmxpdF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCWRybV92aWFfYmxpdHFfdCAqYmxpdHEgPSBkZXZfcHJpdi0+YmxpdF9xdWV1ZXMgKyBlbmdpbmU7CkBAIC00MzMsNyArNDMzLDcgQEAKICAqLwogCiBzdGF0aWMgaW50Ci12aWFfZG1hYmxpdF9zeW5jKGRybV9kZXZpY2VfdCAqZGV2LCB1aW50MzJfdCBoYW5kbGUsIGludCBlbmdpbmUpIAordmlhX2RtYWJsaXRfc3luYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBoYW5kbGUsIGludCBlbmdpbmUpIAogewogCiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogdmlhX2RtYWJsaXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCWRybV92aWFfYmxpdHFfdCAqYmxpdHEgPSAoZHJtX3ZpYV9ibGl0cV90ICopIGRhdGE7Ci0JZHJtX2RldmljZV90ICpkZXYgPSBibGl0cS0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibGl0cS0+ZGV2OwogCWludCBlbmdpbmUgPSAoaW50KQogCQkoYmxpdHEgLSAoKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZSktPmJsaXRfcXVldWVzKTsKIAkJCkBAIC01MDIsNyArNTAyLDcgQEAKIHZpYV9kbWFibGl0X3dvcmtxdWV1ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJZHJtX3ZpYV9ibGl0cV90ICpibGl0cSA9IGNvbnRhaW5lcl9vZih3b3JrLCBkcm1fdmlhX2JsaXRxX3QsIHdxKTsKLQlkcm1fZGV2aWNlX3QgKmRldiA9IGJsaXRxLT5kZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGJsaXRxLT5kZXY7CiAJdW5zaWduZWQgbG9uZyBpcnFzYXZlOwogCWRybV92aWFfc2dfaW5mb190ICpjdXJfc2c7CiAJaW50IGN1cl9yZWxlYXNlZDsKQEAgLTU0NSw3ICs1NDUsNyBAQAogCiAKIHZvaWQKLXZpYV9pbml0X2RtYWJsaXQoZHJtX2RldmljZV90ICpkZXYpCit2aWFfaW5pdF9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IGksajsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwpAQCAtNTgyLDcgKzU4Miw3IEBACiAJCQogCiBzdGF0aWMgaW50Ci12aWFfYnVpbGRfc2dfaW5mbyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIpCit2aWFfYnVpbGRfc2dfaW5mbyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX3NnX2luZm9fdCAqdnNnLCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikKIHsKIAlpbnQgZHJhdyA9IHhmZXItPnRvX2ZiOwogCWludCByZXQgPSAwOwpAQCAtNzMwLDcgKzczMCw3IEBACiAKIAogc3RhdGljIGludCAKLXZpYV9kbWFibGl0KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikJIAordmlhX2RtYWJsaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIpCSAKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCWRybV92aWFfc2dfaW5mb190ICp2c2c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmgKaW5kZXggZjQwMzZjZC4uNmY2YTUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaApAQCAtNTksNyArNTksNyBAQAogfSBkcm1fdmlhX3NnX2luZm9fdDsKIAogdHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfYmxpdHEgewotCWRybV9kZXZpY2VfdCAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7CiAJdWludDMyX3QgY3VyX2JsaXRfaGFuZGxlOwogCXVpbnQzMl90IGRvbmVfYmxpdF9oYW5kbGU7CiAJdW5zaWduZWQgc2VydmljZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCmluZGV4IGU0ZWU5N2QuLjhmNTNjNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIFZJQV9OUl9YVk1DX0xPQ0tTICAgICAgICAgICAgICAgNQogI2RlZmluZSBWSUFfTUFYX0NBQ0hFTElORV9TSVpFICAgICAgICAgIDY0CiAjZGVmaW5lIFhWTUNMT0NLUFRSKHNhUHJpdixsb2NrTm8pCQkJCQlcCi0JKCh2b2xhdGlsZSBkcm1faHdfbG9ja190ICopKCgoKCh1bnNpZ25lZCBsb25nKSAoc2FQcml2KS0+WHZNQ0xvY2tBcmVhKSArIFwKKwkoKHZvbGF0aWxlIHN0cnVjdCBkcm1faHdfbG9jayAqKSgoKCgodW5zaWduZWQgbG9uZykgKHNhUHJpdiktPlh2TUNMb2NrQXJlYSkgKyBcCiAJCQkJICAgICAgKFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgLSAxKSkgJglcCiAJCQkJICAgICB+KFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgLSAxKSkgKwlcCiAJCQkJICAgIFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUqKGxvY2tObykpKQpAQCAtMTgyLDcgKzE4Miw3IEBACiB0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9zYXJlYSB7CiAJdW5zaWduZWQgaW50IGRpcnR5OwogCXVuc2lnbmVkIGludCBuYm94OwotCWRybV9jbGlwX3JlY3RfdCBib3hlc1tWSUFfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCBib3hlc1tWSUFfTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKIAlkcm1fdmlhX3RleF9yZWdpb25fdCB0ZXhMaXN0W1ZJQV9OUl9URVhfUkVHSU9OUyArIDFdOwogCWludCB0ZXhBZ2U7CQkvKiBsYXN0IHRpbWUgdGV4dHVyZSB3YXMgdXBsb2FkZWQgKi8KIAlpbnQgY3R4T3duZXI7CQkvKiBsYXN0IGNvbnRleHQgdG8gdXBsb2FkIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCmluZGV4IGI0NmNhOGUuLjU3NjcxMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5oCkBAIC04Nyw3ICs4Nyw3IEBACiAJdWludDMyX3QgaXJxX3BlbmRpbmdfbWFzazsKIAlpbnQgKmlycV9tYXA7CiAJdW5zaWduZWQgaW50IGlkbGVfZmF1bHQ7Ci0JZHJtX3NtYW5fdCBzbWFuOworCXN0cnVjdCBkcm1fc21hbiBzbWFuOwogCWludCB2cmFtX2luaXRpYWxpemVkOwogCWludCBhZ3BfaW5pdGlhbGl6ZWQ7CiAJdW5zaWduZWQgbG9uZyB2cmFtX29mZnNldDsKQEAgLTEyMywzMSArMTIzLDMxIEBACiBleHRlcm4gaW50IHZpYV9kbWFfYmxpdF9zeW5jKCBEUk1fSU9DVExfQVJHUyApOwogZXh0ZXJuIGludCB2aWFfZG1hX2JsaXQoIERSTV9JT0NUTF9BUkdTICk7CiAKLWV4dGVybiBpbnQgdmlhX2RyaXZlcl9sb2FkKGRybV9kZXZpY2VfdCAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOwotZXh0ZXJuIGludCB2aWFfZHJpdmVyX3VubG9hZChkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAotZXh0ZXJuIGludCB2aWFfaW5pdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOwotZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjb250ZXh0KTsKK2V4dGVybiBpbnQgdmlhX2luaXRfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGNvbnRleHQpOwogCi1leHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIGludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CitleHRlcm4gaW50IHZpYV9kb19jbGVhbnVwX21hcChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpOwogCiBleHRlcm4gaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwotZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwotZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KTsKLWV4dGVybiB2b2lkIHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogCi1leHRlcm4gaW50IHZpYV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIGludCB2aWFfZG1hX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwogZXh0ZXJuIHZvaWQgdmlhX2luaXRfY29tbWFuZF92ZXJpZmllcih2b2lkKTsKLWV4dGVybiBpbnQgdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50KGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gdm9pZCB2aWFfaW5pdF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKIGV4dGVybiB2b2lkIHZpYV9jbGVhbnVwX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOwogZXh0ZXJuIHZvaWQgdmlhX3JlbGVhc2VfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwgaW50IGNvbnRleHQpOwogCi1leHRlcm4gdm9pZCB2aWFfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKmRldiwgc3RydWN0IGZpbGUgKmZpbHApOwotZXh0ZXJuIHZvaWQgdmlhX2xhc3RjbG9zZShkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCB2aWFfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gdm9pZCB2aWFfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCi1leHRlcm4gdm9pZCB2aWFfZG1hYmxpdF9oYW5kbGVyKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgZW5naW5lLCBpbnQgZnJvbV9pcnEpOwotZXh0ZXJuIHZvaWQgdmlhX2luaXRfZG1hYmxpdChkcm1fZGV2aWNlX3QgKmRldik7CitleHRlcm4gdm9pZCB2aWFfZG1hYmxpdF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSk7CitleHRlcm4gdm9pZCB2aWFfaW5pdF9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKaW5kZXggMWFjNTk0MS4uOGRjOTliNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogaXJxcmV0dXJuX3QgdmlhX2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCiB7Ci0JZHJtX2RldmljZV90ICpkZXYgPSAoZHJtX2RldmljZV90ICopIGFyZzsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1fZGV2aWNlICopIGFyZzsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdHVzOwogCWludCBoYW5kbGVkID0gMDsKQEAgLTE2Myw3ICsxNjMsNyBAQAogCX0KIH0KIAotaW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoZHJtX2RldmljZV90ICogZGV2LCB1bnNpZ25lZCBpbnQgKnNlcXVlbmNlKQoraW50IHZpYV9kcml2ZXJfdmJsYW5rX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CkBAIC0xOTEsNyArMTkxLDcgQEAKIH0KIAogc3RhdGljIGludAotdmlhX2RyaXZlcl9pcnFfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIHVuc2lnbmVkIGludCBpcnEsIGludCBmb3JjZV9zZXF1ZW5jZSwKK3ZpYV9kcml2ZXJfaXJxX3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGludCBpcnEsIGludCBmb3JjZV9zZXF1ZW5jZSwKIAkJICAgIHVuc2lnbmVkIGludCAqc2VxdWVuY2UpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yNDQsNyArMjQ0LDcgQEAKICAqIGRybV9kbWEuaCBob29rcwogICovCiAKLXZvaWQgdmlhX2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHZpYV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCX0KIH0KIAotdm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpCit2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0dXM7CkBAIC0zMTIsNyArMzEyLDcgQEAKIAl9CiB9CiAKLXZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCmluZGV4IDRlM2ZjMDcuLjdmYjlkMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCkBAIC0yNSwxMyArMjUsMTMgQEAKICNpbmNsdWRlICJ2aWFfZHJtLmgiCiAjaW5jbHVkZSAidmlhX2Rydi5oIgogCi1zdGF0aWMgaW50IHZpYV9kb19pbml0X21hcChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV92aWFfaW5pdF90ICogaW5pdCkKK3N0YXRpYyBpbnQgdmlhX2RvX2luaXRfbWFwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBkcm1fdmlhX2luaXRfdCAqIGluaXQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlEUk1fR0VUU0FSRUEoKTsKKwlkZXZfcHJpdi0+c2FyZWEgPSBkcm1fZ2V0c2FyZWEoZGV2KTsKIAlpZiAoIWRldl9wcml2LT5zYXJlYSkgewogCQlEUk1fRVJST1IoImNvdWxkIG5vdCBmaW5kIHNhcmVhIVxuIik7CiAJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwpAQCAtNjgsNyArNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdmlhX2RvX2NsZWFudXBfbWFwKGRybV9kZXZpY2VfdCAqIGRldikKK2ludCB2aWFfZG9fY2xlYW51cF9tYXAoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7CiAJdmlhX2RtYV9jbGVhbnVwKGRldik7CiAKQEAgLTk1LDcgKzk1LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotaW50IHZpYV9kcml2ZXJfbG9hZChkcm1fZGV2aWNlX3QgKmRldiwgdW5zaWduZWQgbG9uZyBjaGlwc2V0KQoraW50IHZpYV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGNoaXBzZXQpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OwogCWludCByZXQgPSAwOwpAQCAtMTE1LDcgKzExNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHZpYV9kcml2ZXJfdW5sb2FkKGRybV9kZXZpY2VfdCAqZGV2KQoraW50IHZpYV9kcml2ZXJfdW5sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKaW5kZXggMmZjZjA1Ny4uODVkNTZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCWRybV92aWFfbWVtX3QgbWVtOwogCWludCByZXR2YWwgPSAwOwotCWRybV9tZW1ibG9ja19pdGVtX3QgKml0ZW07CisJc3RydWN0IGRybV9tZW1ibG9ja19pdGVtICppdGVtOwogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgdG1wU2l6ZTsKIApAQCAtMTg4LDEwICsxODgsMTAgQEAKIH0KIAogCi12b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKGRybV9kZXZpY2VfdCAqIGRldiwgc3RydWN0IGZpbGUgKmZpbHApCit2b2lkIHZpYV9yZWNsYWltX2J1ZmZlcnNfbG9ja2VkKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRybV9maWxlICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCWlmIChkcm1fc21hbl9vd25lcl9jbGVhbigmZGV2X3ByaXYtPnNtYW4sICh1bnNpZ25lZCBsb25nKXByaXYpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYwppbmRleCAyZTdlMDgwLi44MzJkNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKQEAgLTI1MiwxMCArMjUyLDkgQEAKIHN0YXRpYyBfX2lubGluZV9fIGRybV9sb2NhbF9tYXBfdCAqdmlhX2RybV9sb29rdXBfYWdwX21hcChkcm1fdmlhX3N0YXRlX3QgKnNlcSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJCQkgICAgZHJtX2RldmljZV90ICogZGV2KQorCQkJCQkJICAgIHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0JZHJtX21hcF9saXN0X3QgKnJfbGlzdDsKKwlzdHJ1Y3QgZHJtX21hcF9saXN0ICpyX2xpc3Q7CiAJZHJtX2xvY2FsX21hcF90ICptYXAgPSBzZXEtPm1hcF9jYWNoZTsKIAogCWlmIChtYXAgJiYgbWFwLT5vZmZzZXQgPD0gb2Zmc2V0CkBAIC0yNjMsOCArMjYyLDcgQEAKIAkJcmV0dXJuIG1hcDsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKLQkJcl9saXN0ID0gKGRybV9tYXBfbGlzdF90ICopIGxpc3Q7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyX2xpc3QsICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJbWFwID0gcl9saXN0LT5tYXA7CiAJCWlmICghbWFwKQogCQkJY29udGludWU7CkBAIC05NjQsNyArOTYyLDcgQEAKIAogaW50CiB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCSAgZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWdwKQorCQkJICBzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGFncCkKIHsKIAogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMTAzOSw3ICsxMDM3LDcgQEAKIH0KIAogaW50Ci12aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oZHJtX2RldmljZV90ICogZGV2LCBjb25zdCB1aW50MzJfdCAqIGJ1ZiwKK3ZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgY29uc3QgdWludDMyX3QgKiBidWYsCiAJCQkgdW5zaWduZWQgaW50IHNpemUpCiB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oCmluZGV4IGI3N2Y1OWQuLjI4YjUwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaApAQCAtNDcsNyArNDcsNyBAQAogCWRybV92aWFfc2VxdWVuY2VfdCB1bmZpbmlzaGVkOwogCWludCBhZ3BfdGV4dHVyZTsKIAlpbnQgbXVsdGl0ZXg7Ci0JZHJtX2RldmljZV90ICpkZXY7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldjsKIAlkcm1fbG9jYWxfbWFwX3QgKm1hcF9jYWNoZTsKIAl1aW50MzJfdCB2ZXJ0ZXhfY291bnQ7CiAJaW50IGFncDsKQEAgLTU1LDggKzU1LDggQEAKIH0gZHJtX3ZpYV9zdGF0ZV90OwogCiBleHRlcm4gaW50IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLAotCQkJCSAgICAgZHJtX2RldmljZV90ICogZGV2LCBpbnQgYWdwKTsKLWV4dGVybiBpbnQgdmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqZGV2LCBjb25zdCB1aW50MzJfdCAqYnVmLAorCQkJCSAgICAgc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBhZ3ApOworZXh0ZXJuIGludCB2aWFfcGFyc2VfY29tbWFuZF9zdHJlYW0oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgY29uc3QgdWludDMyX3QgKmJ1ZiwKIAkJCQkgICAgdW5zaWduZWQgaW50IHNpemUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwppbmRleCBkMWJmYmFhLi43NGNkNTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXNwLmMKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC0xMTIxLDggKzExMjEsNiBAQAogCS8qCiAJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCiAJICovCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKIAlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQogCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfUEU7CkBAIC0xOTIwLDExICsxOTE4LDYgQEAKIAlzdHJ1Y3QgZXNwX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgZXNwX3N0cnVjdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICggICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkJcmV0dXJuOwotCiAJY2hhbmdlX3NwZWVkKGluZm8pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9nZW5lcmljX3NlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKaW5kZXggOGVhMDI3NS4uOGZhY2YzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9jaGFyL2dlbmVyaWNfc2VyaWFsLmMKQEAgLTQzLDE2ICs0Myw2IEBACiAKICNkZWZpbmUgZnVuY19lbnRlcigpIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZW50ZXIgJXNcbiIsIF9fRlVOQ1RJT05fXykKICNkZWZpbmUgZnVuY19leGl0KCkgIGdzX2RwcmludGsgKEdTX0RFQlVHX0ZMT1csICJnczogZXhpdCAgJXNcbiIsIF9fRlVOQ1RJT05fXykKLSNkZWZpbmUgTkVXX1dSSVRFX0xPQ0tJTkcgMQotI2lmIE5FV19XUklURV9MT0NLSU5HCi0jZGVmaW5lIERFQ0wgICAgICAvKiBOb3RoaW5nICovCi0jZGVmaW5lIExPQ0tJVCAgICBtdXRleF9sb2NrKCYgcG9ydC0+cG9ydF93cml0ZV9tdXRleCk7Ci0jZGVmaW5lIFJFTEVBU0VJVCBtdXRleF91bmxvY2soJnBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwotI2Vsc2UKLSNkZWZpbmUgREVDTCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZGVmaW5lIExPQ0tJVCAgICBzYXZlX2ZsYWdzIChmbGFncyk7Y2xpICgpCi0jZGVmaW5lIFJFTEVBU0VJVCByZXN0b3JlX2ZsYWdzIChmbGFncykKLSNlbmRpZgogCiAjZGVmaW5lIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAkxCiAKQEAgLTYyLDcgKzUyLDYgQEAKIHZvaWQgZ3NfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHVuc2lnbmVkIGNoYXIgY2gpCiB7CiAJc3RydWN0IGdzX3BvcnQgKnBvcnQ7Ci0JREVDTAogCiAJZnVuY19lbnRlciAoKTsgCiAKQEAgLTc1LDExICs2NCwxMSBAQAogCWlmICghIChwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgcmV0dXJuOwogCiAJLyogVGFrZSBhIGxvY2sgb24gdGhlIHNlcmlhbCB0cmFubWl0IGJ1ZmZlciEgKi8KLQlMT0NLSVQ7CisJbXV0ZXhfbG9jaygmIHBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwogCiAJaWYgKHBvcnQtPnhtaXRfY250ID49IFNFUklBTF9YTUlUX1NJWkUgLSAxKSB7CiAJCS8qIFNvcnJ5LCBidWZmZXIgaXMgZnVsbCwgZHJvcCBjaGFyYWN0ZXIuIFVwZGF0ZSBzdGF0aXN0aWNzPz8/PyAtLSBSRVcgKi8KLQkJUkVMRUFTRUlUOworCQltdXRleF91bmxvY2soJnBvcnQtPnBvcnRfd3JpdGVfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCkBAIC04NywxMyArNzYsMTEgQEAKIAlwb3J0LT54bWl0X2hlYWQgJj0gU0VSSUFMX1hNSVRfU0laRSAtIDE7CiAJcG9ydC0+eG1pdF9jbnQrKzsgIC8qIENoYXJhY3RlcnMgaW4gYnVmZmVyICovCiAKLQlSRUxFQVNFSVQ7CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0X3dyaXRlX211dGV4KTsKIAlmdW5jX2V4aXQgKCk7CiB9CiAKIAotI2lmZGVmIE5FV19XUklURV9MT0NLSU5HCi0KIC8qCiA+IFByb2JsZW1zIHRvIHRha2UgaW50byBhY2NvdW50IGFyZToKID4gICAgICAgLTEtIEludGVycnVwdHMgdGhhdCBlbXB0eSBwYXJ0IG9mIHRoZSBidWZmZXIuCkBAIC0xNjYsOTAgKzE1Myw2IEBACiAJZnVuY19leGl0ICgpOwogCXJldHVybiB0b3RhbDsKIH0KLSNlbHNlCi0vKgotPiBQcm9ibGVtcyB0byB0YWtlIGludG8gYWNjb3VudCBhcmU6Ci0+ICAgICAgIC0xLSBJbnRlcnJ1cHRzIHRoYXQgZW1wdHkgcGFydCBvZiB0aGUgYnVmZmVyLgotPiAgICAgICAtMi0gcGFnZSBmYXVsdHMgb24gdGhlIGFjY2VzcyB0byB1c2Vyc3BhY2UuIAotPiAgICAgICAtMy0gT3RoZXIgcHJvY2Vzc2VzIHRoYXQgYXJlIGFsc28gdHJ5aW5nIHRvIGRvIGEgIndyaXRlIi4gCi0qLwotCi1pbnQgZ3Nfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCXN0cnVjdCBnc19wb3J0ICpwb3J0OwotCWludCBjLCB0b3RhbCA9IDA7Ci0JaW50IHQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZ1bmNfZW50ZXIgKCk7Ci0KLQkvKiBUaGUgc3RhbmRhcmQgc2VyaWFsIGRyaXZlciByZXR1cm5zIDAgaW4gdGhpcyBjYXNlLiAKLQkgICBUaGF0IHNvdW5kcyB0byBtZSBhcyAiTm8gZXJyb3IsIEkganVzdCBkaWRuJ3QgZ2V0IHRvIHdyaXRpbmcgYW55Ci0JICAgYnl0ZXMuIEZlZWwgZnJlZSB0byB0cnkgYWdhaW4uIiAKLQkgICBUaGUgIm9mZmljaWFsIiB3YXkgdG8gd3JpdGUgbiBieXRlcyBmcm9tIGJ1ZiBpczoKLQotCQkgZm9yIChud3JpdHRlbiA9IDA7bndyaXR0ZW4gPCBuO253cml0dGVuICs9IHJ2KSB7Ci0JCQkgcnYgPSB3cml0ZSAoZmQsIGJ1Zitud3JpdHRlbiwgbi1ud3JpdHRlbik7Ci0JCQkgaWYgKHJ2IDwgMCkgYnJlYWs7IC8vIEVycm9yOiBiYWlsIG91dC4gLy8KLQkJIH0gCi0KLQkgICB3aGljaCB3aWxsIGxvb3AgZW5kbGVzc2x5IGluIHRoaXMgY2FzZS4gVGhlIG1hbnVhbCBwYWdlIGZvciB3cml0ZQotCSAgIGFncmVlcyB3aXRoIG1lLiBJbiBwcmFjdGlzZSBhbG1vc3QgZXZlcnlib2R5IHdyaXRlcyAKLQkgICAid3JpdGUgKGZkLCBidWYsbik7IiBidXQgc29tZSBwZW9wbGUgbWlnaHQgaGF2ZSBoYWQgdG8gZGVhbCB3aXRoIAotCSAgIGluY29tcGxldGUgd3JpdGVzIGluIHRoZSBwYXN0IGFuZCBjb3JyZWN0bHkgaW1wbGVtZW50ZWQgaXQgYnkgbm93Li4uIAotCSAqLwotCi0JaWYgKCF0dHkpIHJldHVybiAtRUlPOwotCi0JcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCFwb3J0IHx8ICFwb3J0LT54bWl0X2J1ZikKLQkJcmV0dXJuIC1FSU87Ci0KLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQl3aGlsZSAoMSkgewotCQljbGkoKTsKLQkJYyA9IGNvdW50OwotCi0JCS8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlICJPV04iIHRoZSAiaGVhZCIuIE5vb25lIGVsc2UgY2FuIAotCQkgICBjaGFuZ2UgdGhlICJoZWFkIjogd2Ugb3duIHRoZSBwb3J0X3dyaXRlX211dGV4LiAqLwotCQkvKiBEb24ndCBvdmVycnVuIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCQl0ID0gU0VSSUFMX1hNSVRfU0laRSAtIHBvcnQtPnhtaXRfaGVhZDsKLQkJaWYgKHQgPCBjKSBjID0gdDsKLQotCQkvKiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgeG1pdF9jbnQgY2FuIG9ubHkgZGVjcmVhc2UuIFRoaXMgCi0JCSAgIHdvdWxkIGluY3JlYXNlICJ0Iiwgc28gd2UgbWlnaHQgY29weSB0b28gbGl0dGxlIGNoYXJzLiAqLwotCQkvKiBEb24ndCBjb3B5IHBhc3QgdGhlICJoZWFkIiBvZiB0aGUgYnVmZmVyICovCi0JCXQgPSBTRVJJQUxfWE1JVF9TSVpFIC0gMSAtIHBvcnQtPnhtaXRfY250OwotCQlpZiAodCA8IGMpIGMgPSB0OwotCi0JCS8qIENhbid0IGNvcHkgbW9yZT8gYnJlYWsgb3V0ISAqLwotCQlpZiAoYyA8PSAwKSB7Ci0JCQlsb2NhbF9yZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbWNweShwb3J0LT54bWl0X2J1ZiArIHBvcnQtPnhtaXRfaGVhZCwgYnVmLCBjKTsKLQkJcG9ydC0+eG1pdF9oZWFkID0gKChwb3J0LT54bWl0X2hlYWQgKyBjKSAmCi0JCSAgICAgICAgICAgICAgICAgICAoU0VSSUFMX1hNSVRfU0laRS0xKSk7Ci0JCXBvcnQtPnhtaXRfY250ICs9IGM7Ci0JCWxvY2FsX3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOwotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJdG90YWwgKz0gYzsKLQl9Ci0KLQlpZiAocG9ydC0+eG1pdF9jbnQgJiYgCi0JICAgICF0dHktPnN0b3BwZWQgJiYgCi0JICAgICF0dHktPmh3X3N0b3BwZWQgJiYKLQkgICAgIShwb3J0LT5mbGFncyAmIEdTX1RYX0lOVEVOKSkgewotCQlwb3J0LT5mbGFncyB8PSBHU19UWF9JTlRFTjsKLQkJcG9ydC0+cmQtPmVuYWJsZV90eF9pbnRlcnJ1cHRzIChwb3J0KTsKLQl9Ci0JZnVuY19leGl0ICgpOwotCXJldHVybiB0b3RhbDsKLX0KLQotI2VuZGlmCiAKIAogCkBAIC03MzcsMjMgKzY0MCw2IEBACiAJCWdzX2RwcmludGsgKEdTX0RFQlVHX1RFUk1JT1MsICJ0ZXJtaW9zIHN0cnVjdHVyZSAoJXApOlxuIiwgdGlvc3ApOwogCX0KIAotCS8qIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaXMgb25seSBhbGxvd2VkIGZvciBkdW1iIGNhcmRzICovCi0JLyogU21hcnQgY2FyZHMgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgaWZsYWdzIGFuZCBvZmxhZ3MgdG9vOiB0aGF0IAotCSAgIG1pZ2h0IGNoYW5nZSBoYXJkd2FyZSBjb29raW5nIG1vZGUuLi4uICovCi0JaWYgKG9sZF90ZXJtaW9zKSB7Ci0JCWlmKCAgICh0aW9zcC0+Y19pZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19pZmxhZykKLQkJICAgJiYgKHRpb3NwLT5jX29mbGFnID09IG9sZF90ZXJtaW9zLT5jX29mbGFnKQotCQkgICAmJiAodGlvc3AtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JCSAgICYmICh0aW9zcC0+Y19sZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19sZmxhZykKLQkJICAgJiYgKHRpb3NwLT5jX2xpbmUgID09IG9sZF90ZXJtaW9zLT5jX2xpbmUpCi0JCSAgICYmIChtZW1jbXAodGlvc3AtPmNfY2MsIG9sZF90ZXJtaW9zLT5jX2NjLCBOQ0MpID09IDApKSB7Ci0JCQlnc19kcHJpbnRrKEdTX0RFQlVHX1RFUk1JT1MsICJnc19zZXRfdGVybWlvczogb3B0aW1pemVkIGF3YXlcbiIpOwotCQkJcmV0dXJuIC8qIDAgKi87Ci0JCX0KLQl9IGVsc2UgCi0JCWdzX2RwcmludGsoR1NfREVCVUdfVEVSTUlPUywgImdzX3NldF90ZXJtaW9zOiBubyBvbGRfdGVybWlvczogIgotCQkgICAgICAgICAgICJubyBvcHRpbWl6YXRpb25cbiIpOwotCiAJaWYob2xkX3Rlcm1pb3MgJiYgKGdzX2RlYnVnICYgR1NfREVCVUdfVEVSTUlPUykpIHsKIAkJaWYodGlvc3AtPmNfaWZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfaWZsYWcpICBwcmludGsoImNfaWZsYWcgY2hhbmdlZFxuIik7CiAJCWlmKHRpb3NwLT5jX29mbGFnICE9IG9sZF90ZXJtaW9zLT5jX29mbGFnKSAgcHJpbnRrKCJjX29mbGFnIGNoYW5nZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jIGIvZHJpdmVycy9jaGFyL2dlbnJ0Yy5jCmluZGV4IDllMWZjMDIuLjY5ZjBhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9nZW5ydGMuYworKysgYi9kcml2ZXJzL2NoYXIvZ2VucnRjLmMKQEAgLTE3Myw3ICsxNzMsNiBAQAogc3RhdGljIHNzaXplX3QgZ2VuX3J0Y19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJdW5zaWduZWQgbG9uZyBkYXRhOwogCXNzaXplX3QgcmV0dmFsOwogCkBAIC0xODMsMTggKzE4MiwxMCBAQAogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyAmJiAhZ2VuX3J0Y19pcnFfZGF0YSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlhZGRfd2FpdF9xdWV1ZSgmZ2VuX3J0Y193YWl0LCAmd2FpdCk7Ci0JcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCi0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJZGF0YSA9IHhjaGcoJmdlbl9ydGNfaXJxX2RhdGEsIDApOwotCQlpZiAoZGF0YSkKLQkJCWJyZWFrOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlnb3RvIG91dDsKLQkJc2NoZWR1bGUoKTsKLQl9CisJcmV0dmFsID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGdlbl9ydGNfd2FpdCwKKwkJCShkYXRhID0geGNoZygmZ2VuX3J0Y19pcnFfZGF0YSwgMCkpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAogCS8qIGZpcnN0IHRlc3QgYWxsb3dzIG9wdGltaXplciB0byBudWtlIHRoaXMgY2FzZSBmb3IgMzItYml0IG1hY2hpbmVzICovCiAJaWYgKHNpemVvZiAoaW50KSAhPSBzaXplb2YgKGxvbmcpICYmIGNvdW50ID09IHNpemVvZiAodW5zaWduZWQgaW50KSkgewpAQCAtMjA2LDEwICsxOTcsNyBAQAogCQlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilidWYpID86CiAJCQlzaXplb2YodW5zaWduZWQgbG9uZyk7CiAJfQotIG91dDoKLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmdlbl9ydGNfd2FpdCwgJndhaXQpOwotCitvdXQ6CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCAzMjJiYzVmLi44M2MxMTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtNjc0LDExICs2NzQsMTIgQEAKICAqIGNhbGxpbmcgaHZjX3BvbGwoKSB3aG8gZGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29uc29sZSBhZGFwdGVyIHN1cHBvcnQKICAqIGludGVycnVwdHMuCiAgKi8KLWludCBraHZjZCh2b2lkICp1bnVzZWQpCitzdGF0aWMgaW50IGtodmNkKHZvaWQgKnVudXNlZCkKIHsKIAlpbnQgcG9sbF9tYXNrOwogCXN0cnVjdCBodmNfc3RydWN0ICpocDsKIAorCXNldF9mcmVlemFibGUoKTsKIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJZG8gewogCQlwb2xsX21hc2sgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vaW50ZWwtcm5nLmMKaW5kZXggNGFlOTgxMS4uNzUzZjQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pbnRlbC1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2ludGVsLXJuZy5jCkBAIC0yOTYsMTIgKzI5NiwxMCBAQAogCSAgICAgKEJJT1NfQ05UTF9MT0NLX0VOQUJMRV9NQVNLfEJJT1NfQ05UTF9XUklURV9FTkFCTEVfTUFTSykpCiAJICAgID09IEJJT1NfQ05UTF9MT0NLX0VOQUJMRV9NQVNLKSB7CiAJCXN0YXRpYyBfX2luaXRkYXRhIC8qY29uc3QqLyBjaGFyIHdhcm5pbmdbXSA9Ci0JCQlLRVJOX1dBUk5JTkcgUEZYICJGaXJtd2FyZSBzcGFjZSBpcyBsb2NrZWQgcmVhZC1vbmx5LiAiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJJZiB5b3UgY2FuJ3Qgb3JcbiBkb24ndCB3YW50IHRvICIKLQkJCUtFUk5fV0FSTklORyBQRlggImRpc2FibGUgdGhpcyBpbiBmaXJtd2FyZSBzZXR1cCwgYW5kICIKLQkJCUtFUk5fV0FSTklORyBQRlggImlmXG4geW91IGFyZSBjZXJ0YWluIHRoYXQgeW91ciAiCi0JCQlLRVJOX1dBUk5JTkcgUEZYICJzeXN0ZW0gaGFzIGEgZnVuY3Rpb25hbFxuIFJORywgdHJ5IgotCQkJS0VSTl9XQVJOSU5HIFBGWCAidXNpbmcgdGhlICdub19md2hfZGV0ZWN0JyBvcHRpb24uXG4iOworCQkJS0VSTl9XQVJOSU5HIFBGWCAiRmlybXdhcmUgc3BhY2UgaXMgbG9ja2VkIHJlYWQtb25seS4gSWYgeW91IGNhbid0IG9yXG4iCisJCQlLRVJOX1dBUk5JTkcgUEZYICJkb24ndCB3YW50IHRvIGRpc2FibGUgdGhpcyBpbiBmaXJtd2FyZSBzZXR1cCwgYW5kIGlmXG4iCisJCQlLRVJOX1dBUk5JTkcgUEZYICJ5b3UgYXJlIGNlcnRhaW4gdGhhdCB5b3VyIHN5c3RlbSBoYXMgYSBmdW5jdGlvbmFsXG4iCisJCQlLRVJOX1dBUk5JTkcgUEZYICJSTkcsIHRyeSB1c2luZyB0aGUgJ25vX2Z3aF9kZXRlY3QnIG9wdGlvbi5cbiI7CiAKIAkJaWYgKG5vX2Z3aF9kZXRlY3QpCiAJCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJlbGxpcy5jIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKaW5kZXggZGQ3NjFhMS4uNjFlZjAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmVsbGlzLmMKQEAgLTQzLDggKzQzLDYgQEAKIHN0YXRpYyB2b2lkIGlpV3JpdGVNYXNrSUkoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CiBzdGF0aWMgdm9pZCBpaVdyaXRlTWFza0lJRVgoaTJlQm9yZFN0clB0ciwgdW5zaWduZWQgY2hhcik7CiAKLXN0YXRpYyB2b2lkIGlpMkRlbGF5VGltZXIodW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGlpMkRlbGF5V2FrZXVwKHVuc2lnbmVkIGxvbmcgaWQpOwogc3RhdGljIHZvaWQgaWkyTm9wKHZvaWQpOwogCiAvLyoqKioqKioqKioqKioqKgpAQCAtNTUsOCArNTMsNiBAQAogCiBzdGF0aWMgaW50IGlpRGVsYXllZDsJLy8gU2V0IHdoZW4gdGhlIGlpUmVzZXREZWxheSBmdW5jdGlvbiBpcwogCQkJCQkJCS8vIGNhbGxlZC4gQ2xlYXJlZCB3aGVuIEFOWSBib2FyZCBpcyByZXNldC4KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCAqIHBEZWxheVRpbWVyOyAgIC8vIFVzZWQgYnkgaWlEZWxheVRpbWVyCi1zdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgcERlbGF5V2FpdDsgICAgLy8gVXNlZCBieSBpaURlbGF5VGltZXIKIHN0YXRpYyByd2xvY2tfdCBEbF9zcGlubG9jazsKIAogLy8qKioqKioqKgpAQCAtODYsOSArODIsNiBAQAogc3RhdGljIHZvaWQKIGlpRWxsaXNJbml0KHZvaWQpCiB7Ci0JcERlbGF5VGltZXIgPSBrbWFsbG9jICggc2l6ZW9mIChzdHJ1Y3QgdGltZXJfbGlzdCksIEdGUF9LRVJORUwgKTsKLQlpbml0X3RpbWVyKHBEZWxheVRpbWVyKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwRGVsYXlXYWl0KTsKIAlMT0NLX0lOSVQoJkRsX3NwaW5sb2NrKTsKIH0KIApAQCAtMTA2LDcgKzk5LDYgQEAKIHN0YXRpYyB2b2lkCiBpaUVsbGlzQ2xlYW51cCh2b2lkKQogewotCWtmcmVlKHBEZWxheVRpbWVyKTsKIH0KIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU2MCwxOSArNTUyLDYgQEAKIAlDT01QTEVURShwQiwgSTJFRV9HT09EKTsKIH0KIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBEZWxheSBSb3V0aW5lcwotLy8KLS8vIGlpRGVsYXlJTwotLy8gaWlOb3AKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1zdGF0aWMgdm9pZAotaWkyRGVsYXlXYWtldXAodW5zaWduZWQgbG9uZyBpZCkKLXsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCAmcERlbGF5V2FpdCApOwotfQotCiAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gRnVuY3Rpb246ICAgaWkyRGVsYXlUaW1lcihtc2Vjb25kcykKIC8vIFBhcmFtZXRlcnM6IG1zZWNvbmRzIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheQpAQCAtNTk0LDI4ICs1NzMsNyBAQAogc3RhdGljIHZvaWQKIGlpMkRlbGF5VGltZXIodW5zaWduZWQgaW50IG1zZWNvbmRzKQogewotCXdhaXRfcXVldWVfdCB3YWl0OwotCi0JaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwotCi0JaW5pdF90aW1lciAoIHBEZWxheVRpbWVyICk7Ci0KLQlhZGRfd2FpdF9xdWV1ZSgmcERlbGF5V2FpdCwgJndhaXQpOwotCi0Jc2V0X2N1cnJlbnRfc3RhdGUoIFRBU0tfSU5URVJSVVBUSUJMRSApOwotCi0JcERlbGF5VGltZXItPmV4cGlyZXMgID0gamlmZmllcyArICggbXNlY29uZHMgKyA5ICkgLyAxMDsKLQlwRGVsYXlUaW1lci0+ZnVuY3Rpb24gPSBpaTJEZWxheVdha2V1cDsKLQlwRGVsYXlUaW1lci0+ZGF0YSAgICAgPSAwOwotCi0JYWRkX3RpbWVyICggcERlbGF5VGltZXIgKTsKLQotCXNjaGVkdWxlKCk7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZSggVEFTS19SVU5OSU5HICk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnBEZWxheVdhaXQsICZ3YWl0KTsKLQotCWRlbF90aW1lciAoIHBEZWxheVRpbWVyICk7CisJbXNsZWVwX2ludGVycnVwdGlibGUobXNlY29uZHMpOwogfQogCiAjaWYgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9pcG1pL0tjb25maWcKaW5kZXggYjg5NGY2Ny4uMGJhYThmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgSVBNSSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJJUE1JIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBJUE1JX0hBTkRMRVIKK21lbnVjb25maWcgSVBNSV9IQU5ETEVSCiAgICAgICAgdHJpc3RhdGUgJ0lQTUkgdG9wLWxldmVsIG1lc3NhZ2UgaGFuZGxlcicKKyAgICAgICBkZXBlbmRzIG9uIEhBU19JT01FTQogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgY2VudHJhbCBJUE1JIG1lc3NhZ2UgaGFuZGxlciwgcmVxdWlyZWQgZm9yIElQTUkKIAkgdG8gd29yay4KQEAgLTE4LDkgKzE2LDEwIEBACiAKIAkgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgSVBNSV9IQU5ETEVSCisKIGNvbmZpZyBJUE1JX1BBTklDX0VWRU5UCiAgICAgICAgYm9vbCAnR2VuZXJhdGUgYSBwYW5pYyBldmVudCB0byBhbGwgQk1DcyBvbiBhIHBhbmljJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgV2hlbiBhIHBhbmljIG9jY3VycywgdGhpcyB3aWxsIGNhdXNlIHRoZSBJUE1JIG1lc3NhZ2UgaGFuZGxlciB0bwogCSBnZW5lcmF0ZSBhbiBJUE1JIGV2ZW50IGRlc2NyaWJpbmcgdGhlIHBhbmljIHRvIGVhY2ggaW50ZXJmYWNlCkBAIC00MCwxNCArMzksMTIgQEAKIAogY29uZmlnIElQTUlfREVWSUNFX0lOVEVSRkFDRQogICAgICAgIHRyaXN0YXRlICdEZXZpY2UgaW50ZXJmYWNlIGZvciBJUE1JJwotICAgICAgIGRlcGVuZHMgb24gSVBNSV9IQU5ETEVSCiAgICAgICAgaGVscAogICAgICAgICAgVGhpcyBwcm92aWRlcyBhbiBJT0NUTCBpbnRlcmZhY2UgdG8gdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyIHNvCiAJIHVzZXJsYW5kIHByb2Nlc3NlcyBtYXkgdXNlIElQTUkuICBJdCBzdXBwb3J0cyBwb2xsKCkgYW5kIHNlbGVjdCgpLgogCiBjb25maWcgSVBNSV9TSQogICAgICAgIHRyaXN0YXRlICdJUE1JIFN5c3RlbSBJbnRlcmZhY2UgaGFuZGxlcicKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFByb3ZpZGVzIGEgZHJpdmVyIGZvciBTeXN0ZW0gSW50ZXJmYWNlcyAoS0NTLCBTTUlDLCBCVCkuCiAJIEN1cnJlbnRseSwgb25seSBLQ1MgYW5kIFNNSUMgYXJlIHN1cHBvcnRlZC4gIElmCkBAIC01NSwxNSArNTIsMTMgQEAKIAogY29uZmlnIElQTUlfV0FUQ0hET0cKICAgICAgICB0cmlzdGF0ZSAnSVBNSSBXYXRjaGRvZyBUaW1lcicKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgSVBNSSB3YXRjaGRvZyB0aW1lci4KIAogY29uZmlnIElQTUlfUE9XRVJPRkYKICAgICAgICB0cmlzdGF0ZSAnSVBNSSBQb3dlcm9mZicKLSAgICAgICBkZXBlbmRzIG9uIElQTUlfSEFORExFUgogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgZW5hYmxlcyBhIGZ1bmN0aW9uIHRvIHBvd2VyIG9mZiB0aGUgc3lzdGVtIHdpdGggSVBNSSBpZgogCSB0aGUgSVBNSSBtYW5hZ2VtZW50IGNvbnRyb2xsZXIgaXMgY2FwYWJsZSBvZiB0aGlzLgogCi1lbmRtZW51CitlbmRpZiAjIElQTUlfSEFORExFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCmluZGV4IGUwMjg5M2IuLmI4NjE4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKQEAgLTY3OSw3ICs2NzksNyBAQAogewogCWludCBydjsKIAotCXByaW50ayAoIkNvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIC0iCisJcHJpbnRrIChLRVJOX0lORk8gIkNvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIC0iCiAJCSIgSVBNSSBQb3dlcmRvd24gdmlhIHN5c19yZWJvb3QuXG4iKTsKIAogCWlmIChwb3dlcm9mZl9wb3dlcmN5Y2xlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwppbmRleCA3OGUxYjk2Li40ZWRmZGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtMjg1Nyw3ICsyODU3LDcgQEAKIAogCW11dGV4X3VubG9jaygmc21pX2luZm9zX2xvY2spOwogCi0JcHJpbnRrKCIgSVBNSSAlcyBpbnRlcmZhY2UgaW5pdGlhbGl6ZWRcbiIsc2lfdG9fc3RyW25ld19zbWktPnNpX3R5cGVdKTsKKwlwcmludGsoS0VSTl9JTkZPICJJUE1JICVzIGludGVyZmFjZSBpbml0aWFsaXplZFxuIixzaV90b19zdHJbbmV3X3NtaS0+c2lfdHlwZV0pOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc2ljb20uYyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwppbmRleCA3NjFmNzc3Li43N2E3YTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCkBAIC0xNzEsOSArMTcxLDYgQEAKIHN0YXRpYyBpbnQgcHJldl9jYXJkID0gMzsJLyoJc3RhcnQgc2VydmljaW5nIGlzaV9jYXJkWzBdCSovCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmlzaWNvbV9ub3JtYWw7CiAKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oaXNpX3RpbWVyZG9uZSk7Ci1zdGF0aWMgY2hhciByZV9zY2hlZHVsZSA9IDE7Ci0KIHN0YXRpYyB2b2lkIGlzaWNvbV90eCh1bnNpZ25lZCBsb25nIF9kYXRhKTsKIHN0YXRpYyB2b2lkIGlzaWNvbV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIApAQCAtMTg3LDcgKzE4NCw3IEBACiAKIHN0cnVjdAlpc2lfYm9hcmQgewogCXVuc2lnbmVkIGxvbmcJCWJhc2U7Ci0JdW5zaWduZWQgY2hhcgkJaXJxOworCWludAkJCWlycTsKIAl1bnNpZ25lZCBjaGFyCQlwb3J0X2NvdW50OwogCXVuc2lnbmVkIHNob3J0CQlzdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQJCXBvcnRfc3RhdHVzOyAvKiBlYWNoIGJpdCBmb3IgZWFjaCBwb3J0ICovCkBAIC0yMjcsNyArMjI0LDcgQEAKICAqCWl0IHdhbnRzIHRvIHRhbGsuCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgV2FpdFRpbGxDYXJkSXNGcmVlKHUxNiBiYXNlKQorc3RhdGljIGlubGluZSBpbnQgV2FpdFRpbGxDYXJkSXNGcmVlKHVuc2lnbmVkIGxvbmcgYmFzZSkKIHsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCXVuc2lnbmVkIGludCBhID0gaW5fYXRvbWljKCk7IC8qIGRvIHdlIHJ1biB1bmRlciBzcGlubG9jaz8gKi8KQEAgLTI0MywxNyArMjQwLDE4IEBACiAKIHN0YXRpYyBpbnQgbG9ja19jYXJkKHN0cnVjdCBpc2lfYm9hcmQgKmNhcmQpCiB7Ci0JY2hhcgkJcmV0cmllczsKIAl1bnNpZ25lZCBsb25nIGJhc2UgPSBjYXJkLT5iYXNlOworCXVuc2lnbmVkIGludCByZXRyaWVzLCBhOwogCi0JZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwMDsgcmV0cmllcysrKSB7CisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwOyByZXRyaWVzKyspIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwotCQlpZiAoaW53KGJhc2UgKyAweGUpICYgMHgxKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgY2FyZC0+ZmxhZ3MpOwotCQkJdWRlbGF5KDEwMDApOyAgIC8qIDFtcyAqLworCQlmb3IgKGEgPSAwOyBhIDwgMTA7IGErKykgeworCQkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkKKwkJCQlyZXR1cm4gMTsKKwkJCXVkZWxheSgxMCk7CiAJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7CisJCW1zbGVlcCgxMCk7CiAJfQogCXByaW50ayhLRVJOX1dBUk5JTkcgIklTSUNPTTogRmFpbGVkIHRvIGxvY2sgQ2FyZCAoMHglbHgpXG4iLAogCQljYXJkLT5iYXNlKTsKQEAgLTI2MSwyMyArMjU5LDYgQEAKIAlyZXR1cm4gMDsJLyogRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGNhcmQhICovCiB9CiAKLXN0YXRpYyBpbnQgbG9ja19jYXJkX2F0X2ludGVycnVwdChzdHJ1Y3QgaXNpX2JvYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGNoYXIJCXJldHJpZXM7Ci0JdW5zaWduZWQgbG9uZyBiYXNlID0gY2FyZC0+YmFzZTsKLQotCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAyMDA7IHJldHJpZXMrKykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBjYXJkLT5mbGFncyk7Ci0KLQkJaWYgKGludyhiYXNlICsgMHhlKSAmIDB4MSkKLQkJCXJldHVybiAxOwotCQllbHNlCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKLQl9Ci0JLyogRmFpbGluZyBpbiBpbnRlcnJ1cHQgaXMgYW4gYWNjZXB0YWJsZSBldmVudCAqLwotCXJldHVybiAwOwkvKiBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgY2FyZCEgKi8KLX0KLQogc3RhdGljIHZvaWQgdW5sb2NrX2NhcmQoc3RydWN0IGlzaV9ib2FyZCAqY2FyZCkKIHsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGNhcmQtPmZsYWdzKTsKQEAgLTQxNSw3ICszOTYsOSBAQAogCiBzdGF0aWMgdm9pZCBpc2ljb21fdHgodW5zaWduZWQgbG9uZyBfZGF0YSkKIHsKLQlzaG9ydCBjb3VudCA9IChCT0FSRF9DT1VOVC0xKSwgY2FyZCwgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBiYXNlOworCXVuc2lnbmVkIGludCByZXRyaWVzOworCXNob3J0IGNvdW50ID0gKEJPQVJEX0NPVU5ULTEpLCBjYXJkOwogCXNob3J0IHR4Y291bnQsIHdyZCwgcmVzaWR1ZSwgd29yZF9jb3VudCwgY250OwogCXN0cnVjdCBpc2lfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtNDM1LDMyICs0MTgsMzQgQEAKIAljb3VudCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRfY291bnQ7CiAJcG9ydCA9IGlzaV9jYXJkW2NhcmRdLnBvcnRzOwogCWJhc2UgPSBpc2lfY2FyZFtjYXJkXS5iYXNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzaV9jYXJkW2NhcmRdLmNhcmRfbG9jaywgZmxhZ3MpOworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDA7IHJldHJpZXMrKykgeworCQlpZiAoaW53KGJhc2UgKyAweGUpICYgMHgxKQorCQkJYnJlYWs7CisJCXVkZWxheSgyKTsKKwl9CisJaWYgKHJldHJpZXMgPj0gMTAwKQorCQlnb3RvIHVubG9jazsKKwogCWZvciAoO2NvdW50ID4gMDtjb3VudC0tLCBwb3J0KyspIHsKLQkJaWYgKCFsb2NrX2NhcmRfYXRfaW50ZXJydXB0KCZpc2lfY2FyZFtjYXJkXSkpCi0JCQljb250aW51ZTsKIAkJLyogcG9ydCBub3QgYWN0aXZlIG9yIHR4IGRpc2FibGVkIHRvIGZvcmNlIGZsb3cgY29udHJvbCAqLwogCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB8fAogCQkJCSEocG9ydC0+c3RhdHVzICYgSVNJX1RYT0spKQotCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKIAkJCWNvbnRpbnVlOwogCiAJCXR0eSA9IHBvcnQtPnR0eTsKIAotCi0JCWlmICh0dHkgPT0gTlVMTCkgewotCQkJdW5sb2NrX2NhcmQoJmlzaV9jYXJkW2NhcmRdKTsKKwkJaWYgKHR0eSA9PSBOVUxMKQogCQkJY29udGludWU7Ci0JCX0KIAogCQl0eGNvdW50ID0gbWluX3Qoc2hvcnQsIFRYX1NJWkUsIHBvcnQtPnhtaXRfY250KTsKLQkJaWYgKHR4Y291bnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkKSB7Ci0JCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCQlpZiAodHhjb3VudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQpCiAJCQljb250aW51ZTsKLQkJfQotCQlpZiAoIShpbncoYmFzZSArIDB4MDIpICYgKDEgPDwgcG9ydC0+Y2hhbm5lbCkpKSB7Ci0JCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOworCisJCWlmICghKGludyhiYXNlICsgMHgwMikgJiAoMSA8PCBwb3J0LT5jaGFubmVsKSkpCiAJCQljb250aW51ZTsKLQkJfQorCiAJCXByX2RiZygidHhpbmcgJWQgYnl0ZXMsIHBvcnQlZC5cbiIsIHR4Y291bnQsCiAJCQlwb3J0LT5jaGFubmVsICsgMSk7CiAJCW91dHcoKHBvcnQtPmNoYW5uZWwgPDwgaXNpX2NhcmRbY2FyZF0uc2hpZnRfY291bnQpIHwgdHhjb3VudCwKQEAgLTUwOCwxNiArNDkzLDEyIEBACiAJCQlwb3J0LT5zdGF0dXMgJj0gfklTSV9UWE9LOwogCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gV0FLRVVQX0NIQVJTKQogCQkJdHR5X3dha2V1cCh0dHkpOwotCQl1bmxvY2tfY2FyZCgmaXNpX2NhcmRbY2FyZF0pOwogCX0KIAordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzaV9jYXJkW2NhcmRdLmNhcmRfbG9jaywgZmxhZ3MpOwogCS8qCXNjaGVkdWxlIGFub3RoZXIgdHggZm9yIGhvcGVmdWxseSBpbiBhYm91dCAxMG1zCSovCiBzY2hlZF9hZ2FpbjoKLQlpZiAoIXJlX3NjaGVkdWxlKSB7Ci0JCWNvbXBsZXRlKCZpc2lfdGltZXJkb25lKTsKLSAJCXJldHVybjsKLQl9Ci0KIAltb2RfdGltZXIoJnR4LCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMCkpOwogfQogCkBAIC0xNzQ5LDE3ICsxNzMwLDEzIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpc2ljb21fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQl1bnNpZ25lZCBpbnQgaW9hZGRyLCBzaWduYXR1cmUsIGluZGV4OworCXVuc2lnbmVkIGludCBzaWduYXR1cmUsIGluZGV4OwogCWludCByZXR2YWwgPSAtRVBFUk07Ci0JdTggcGNpaXJxOwogCXN0cnVjdCBpc2lfYm9hcmQgKmJvYXJkID0gTlVMTDsKIAogCWlmIChjYXJkX2NvdW50ID49IEJPQVJEX0NPVU5UKQogCQlnb3RvIGVycjsKIAotCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKLQkvKiBpLmUgYXQgb2Zmc2V0IDB4MWMgaW4gdGhlIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHNwYWNlLiAqLwotCXBjaWlycSA9IHBkZXYtPmlycTsKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSVNJIFBDSSBDYXJkKERldmljZSBJRCAweCV4KVxuIiwgZW50LT5kZXZpY2UpOwogCiAJLyogYWxsb3QgdGhlIGZpcnN0IGVtcHR5IHNsb3QgaW4gdGhlIGFycmF5ICovCkBAIC0xNzcwLDggKzE3NDcsOCBAQAogCQl9CiAKIAlib2FyZC0+aW5kZXggPSBpbmRleDsKLQlib2FyZC0+YmFzZSA9IGlvYWRkcjsKLQlib2FyZC0+aXJxID0gcGNpaXJxOworCWJvYXJkLT5iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOworCWJvYXJkLT5pcnEgPSBwZGV2LT5pcnE7CiAJY2FyZF9jb3VudCsrOwogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGJvYXJkKTsKQEAgLTE5MDEsOSArMTg3OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpc2ljb21fZXhpdCh2b2lkKQogewotCXJlX3NjaGVkdWxlID0gMDsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaXNpX3RpbWVyZG9uZSwgSFopOworCWRlbF90aW1lcl9zeW5jKCZ0eCk7CiAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlzaWNvbV9kcml2ZXIpOwogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwppbmRleCA3YjI3OWQxLi4zYzY2ZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCkBAIC0xNzUzLDkgKzE3NTMsNiBAQAogCQlyZXR1cm47CiAKIAl0aW9zcCA9IHR0eS0+dGVybWlvczsKLQlpZiAoKHRpb3NwLT5jX2NmbGFnID09IG9sZC0+Y19jZmxhZykgJiYKLQkgICAgKHRpb3NwLT5jX2lmbGFnID09IG9sZC0+Y19pZmxhZykpCi0JCXJldHVybjsKIAogCXN0bGlfbWthc3lwb3J0KHBvcnRwLCAmYXBvcnQsIHRpb3NwKTsKIAlzdGxpX2NtZHdhaXQoYnJkcCwgcG9ydHAsIEFfU0VUUE9SVCwgJmFwb3J0LCBzaXplb2YoYXN5cG9ydF90KSwgMCk7CkBAIC0yMTY2LDE0ICsyMTYzLDEwIEBACiAJY2RraGRyX3QgX19pb21lbSAqaGRycDsKIAljZGtjdHJsX3QgX19pb21lbSAqY3A7CiAJdW5zaWduZWQgY2hhciBfX2lvbWVtICpiaXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkX2xvY2ssIGZsYWdzKTsKIAogCWlmICh0ZXN0X2JpdChTVF9DTURJTkcsICZwb3J0cC0+c3RhdGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU1RBTExJT046IGNvbW1hbmQgYWxyZWFkeSBidXN5LCBjbWQ9JXghXG4iLAogCQkJCShpbnQpIGNtZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZF9sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxOTQsNyArMjE4Nyw2IEBACiAJd3JpdGViKHJlYWRiKGJpdHMpIHwgcG9ydHAtPnBvcnRiaXQsIGJpdHMpOwogCXNldF9iaXQoU1RfQ01ESU5HLCAmcG9ydHAtPnN0YXRlKTsKIAlFQlJERElTQUJMRShicmRwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicmRfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBzdGxpX3NlbmRjbWQoc3RydWN0IHN0bGlicmQgKmJyZHAsIHN0cnVjdCBzdGxpcG9ydCAqcG9ydHAsIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICphcmcsIGludCBzaXplLCBpbnQgY29weWJhY2spCkBAIC0zMjE4LDEzICszMjEwLDEzIEBACiAJCWdvdG8gZXJyOwogCX0KIAorCWJyZHAtPmlvc2l6ZSA9IEVDUF9JT1NJWkU7CisKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZHAtPmlvYmFzZSwgYnJkcC0+aW9zaXplLCAiaXN0YWxsaW9uIikpIHsKIAkJcmV0dmFsID0gLUVJTzsKIAkJZ290byBlcnI7CiAJfQogCi0JYnJkcC0+aW9zaXplID0gRUNQX0lPU0laRTsKLQogLyoKICAqCUJhc2VkIG9uIHRoZSBzcGVjaWZpYyBib2FyZCB0eXBlIHNldHVwIHRoZSBjb21tb24gdmFycyB0byBhY2Nlc3MKICAqCWFuZCBlbmFibGUgc2hhcmVkIG1lbW9yeS4gU2V0IGFsbCBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBub3cKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggOTA5NjViNC4uMmNlMGFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqIDIxLTA4LTAyOiBDb252ZXJ0ZWQgdG8gaW5wdXQgQVBJLCBtYWpvciBjbGVhbnVwLiAoVm9qdGVjaCBQYXZsaWspCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGVtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtMzA4LDEwICszMDksOSBAQAogICogTWFueSBvdGhlciByb3V0aW5lcyBkbyBwdXRfcXVldWUsIGJ1dCBJIHRoaW5rIGVpdGhlcgogICogdGhleSBwcm9kdWNlIEFTQ0lJLCBvciB0aGV5IHByb2R1Y2Ugc29tZSB1c2VyLWFzc2lnbmVkCiAgKiBzdHJpbmcsIGFuZCBpbiBib3RoIGNhc2VzIHdlIG1pZ2h0IGFzc3VtZSB0aGF0IGl0IGlzCi0gKiBpbiB1dGYtOCBhbHJlYWR5LiBVVEYtOCBpcyBkZWZpbmVkIGZvciB3b3JkcyBvZiB1cCB0byAzMSBiaXRzLAotICogYnV0IHdlIG5lZWQgb25seSAxNiBiaXRzIGhlcmUKKyAqIGluIHV0Zi04IGFscmVhZHkuCiAgKi8KLXN0YXRpYyB2b2lkIHRvX3V0Zjgoc3RydWN0IHZjX2RhdGEgKnZjLCB1c2hvcnQgYykKK3N0YXRpYyB2b2lkIHRvX3V0Zjgoc3RydWN0IHZjX2RhdGEgKnZjLCB1aW50IGMpCiB7CiAJaWYgKGMgPCAweDgwKQogCQkvKiAgMCoqKioqKiogKi8KQEAgLTMyMCwxMSArMzIwLDIxIEBACiAJCS8qIDExMCoqKioqIDEwKioqKioqICovCiAJCXB1dF9xdWV1ZSh2YywgMHhjMCB8IChjID4+IDYpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKGMgJiAweDNmKSk7Ci0JfSBlbHNlIHsKKyAgICAJfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkgeworCSAgICAgICAJaWYgKGMgPj0gMHhEODAwICYmIGMgPCAweEUwMDApCisJCQlyZXR1cm47CisJCWlmIChjID09IDB4RkZGRikKKwkJCXJldHVybjsKIAkJLyogMTExMCoqKiogMTAqKioqKiogMTAqKioqKiogKi8KIAkJcHV0X3F1ZXVlKHZjLCAweGUwIHwgKGMgPj4gMTIpKTsKIAkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDYpICYgMHgzZikpOwogCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoYyAmIDB4M2YpKTsKKyAgICAJfSBlbHNlIGlmIChjIDwgMHgxMTAwMDApIHsKKwkJLyogMTExMTAqKiogMTAqKioqKiogMTAqKioqKiogMTAqKioqKiogKi8KKwkJcHV0X3F1ZXVlKHZjLCAweGYwIHwgKGMgPj4gMTgpKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDEyKSAmIDB4M2YpKTsKKwkJcHV0X3F1ZXVlKHZjLCAweDgwIHwgKChjID4+IDYpICYgMHgzZikpOworCQlwdXRfcXVldWUodmMsIDB4ODAgfCAoYyAmIDB4M2YpKTsKIAl9CiB9CiAKQEAgLTM5Myw3ICs0MDMsNyBAQAogCQlyZXR1cm4gZDsKIAogCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERSkKLQkJdG9fdXRmOCh2YywgZCk7CisJCXRvX3V0ZjgodmMsIGNvbnZfOGJpdF90b191bmkoZCkpOwogCWVsc2UgaWYgKGQgPCAweDEwMCkKIAkJcHV0X3F1ZXVlKHZjLCBkKTsKIApAQCAtNDA3LDcgKzQxNyw3IEBACiB7CiAJaWYgKGRpYWNyKSB7CiAJCWlmIChrYmQtPmtiZG1vZGUgPT0gVkNfVU5JQ09ERSkKLQkJCXRvX3V0ZjgodmMsIGRpYWNyKTsKKwkJCXRvX3V0ZjgodmMsIGNvbnZfOGJpdF90b191bmkoZGlhY3IpKTsKIAkJZWxzZSBpZiAoZGlhY3IgPCAweDEwMCkKIAkJCXB1dF9xdWV1ZSh2YywgZGlhY3IpOwogCQlkaWFjciA9IDA7CkBAIC02MTcsNyArNjI3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCi0JCXRvX3V0ZjgodmMsIHZhbHVlKTsKKwkJdG9fdXRmOCh2YywgY29udl84Yml0X3RvX3VuaSh2YWx1ZSkpOwogCWVsc2UgaWYgKHZhbHVlIDwgMHgxMDApCiAJCXB1dF9xdWV1ZSh2YywgdmFsdWUpOwogfQpAQCAtNzc1LDcgKzc4NSw3IEBACiAJLyoga2x1ZGdlICovCiAJaWYgKHVwX2ZsYWcgJiYgc2hpZnRfc3RhdGUgIT0gb2xkX3N0YXRlICYmIG5wYWRjaCAhPSAtMSkgewogCQlpZiAoa2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREUpCi0JCQl0b191dGY4KHZjLCBucGFkY2ggJiAweGZmZmYpOworCQkJdG9fdXRmOCh2YywgbnBhZGNoKTsKIAkJZWxzZQogCQkJcHV0X3F1ZXVlKHZjLCBucGFkY2ggJiAweGZmKTsKIAkJbnBhZGNoID0gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWlzYy5jIGIvZHJpdmVycy9jaGFyL21pc2MuYwppbmRleCA0ZTZmYjk2Li43MWM4Y2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWlzYy5jCisrKyBiL2RyaXZlcnMvY2hhci9taXNjLmMKQEAgLTY3LDI1ICs2NywxMyBAQAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgdm9pZCAqbWlzY19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBtaXNjZGV2aWNlICpwOwotCWxvZmZfdCBvZmYgPSAwOwotCiAJbXV0ZXhfbG9jaygmbWlzY19tdHgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJm1pc2NfbGlzdCwgbGlzdCkgewotCQlpZiAoKnBvcyA9PSBvZmYrKykgCi0JCQlyZXR1cm4gcDsKLQl9Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZtaXNjX2xpc3QsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqbWlzY19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbiA9ICgoc3RydWN0IG1pc2NkZXZpY2UgKil2KS0+bGlzdC5uZXh0OwotCi0JKysqcG9zOwotCi0JcmV0dXJuIChuICE9ICZtaXNjX2xpc3QpID8gbGlzdF9lbnRyeShuLCBzdHJ1Y3QgbWlzY2RldmljZSwgbGlzdCkKLQkJIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmbWlzY19saXN0LCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBtaXNjX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQpAQCAtOTUsNyArODMsNyBAQAogCiBzdGF0aWMgaW50IG1pc2Nfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0JY29uc3Qgc3RydWN0IG1pc2NkZXZpY2UgKnAgPSB2OworCWNvbnN0IHN0cnVjdCBtaXNjZGV2aWNlICpwID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgbWlzY2RldmljZSwgbGlzdCk7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIiUzaSAlc1xuIiwgcC0+bWlub3IsIHAtPm5hbWUgPyBwLT5uYW1lIDogIiIpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21veGEuYyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKaW5kZXggZTBkMzVjMi4uZWQ3NmYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC0xNDA1LDcgKzE0MDUsNiBAQAogc3RhdGljIHN0cnVjdCBtb25fc3RyIG1veGFMb2c7CiBzdGF0aWMgaW50IG1veGFGdW5jVG91dCA9IEhaIC8gMjsKIAotc3RhdGljIHZvaWQgbW94YWRlbGF5KGludCk7CiBzdGF0aWMgdm9pZCBtb3hhZnVuYyh2b2lkIF9faW9tZW0gKiwgaW50LCB1c2hvcnQpOwogc3RhdGljIHZvaWQgd2FpdF9maW5pc2godm9pZCBfX2lvbWVtICopOwogc3RhdGljIHZvaWQgbG93X3dhdGVyX2NoZWNrKHZvaWQgX19pb21lbSAqKTsKQEAgLTI0MDQsMTAgKzI0MDMsMTAgQEAKIAlvZnNBZGRyID0gbW94YV9wb3J0c1twb3J0XS50YWJsZUFkZHI7CiAJaWYgKG1zMTAwKSB7CiAJCW1veGFmdW5jKG9mc0FkZHIsIEZDX1NlbmRCcmVhaywgTWFnaWNfY29kZSk7Ci0JCW1veGFkZWxheShtczEwMCAqIChIWiAvIDEwKSk7CisJCW1zbGVlcChtczEwMCAqIDEwKTsKIAl9IGVsc2UgewogCQltb3hhZnVuYyhvZnNBZGRyLCBGQ19TZW5kQnJlYWssIE1hZ2ljX2NvZGUpOwotCQltb3hhZGVsYXkoSFogLyA0KTsJLyogMjUwIG1zICovCisJCW1zbGVlcCgyNTApOwogCX0KIAltb3hhZnVuYyhvZnNBZGRyLCBGQ19TdG9wQnJlYWssIE1hZ2ljX2NvZGUpOwogfQpAQCAtMjQ3NiwxOCArMjQ3NSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCVN0YXRpYyBsb2NhbCBmdW5jdGlvbnM6IAkJCQkJICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogbW94YWRlbGF5IC0gZGVsYXlzIGEgc3BlY2lmaWVkIG51bWJlciB0aWNrcwotICovCi1zdGF0aWMgdm9pZCBtb3hhZGVsYXkoaW50IHRpY2spCi17Ci0JdW5zaWduZWQgbG9uZyBzdCwgZXQ7Ci0KLQlzdCA9IGppZmZpZXM7Ci0JZXQgPSBzdCArIHRpY2s7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGV0KSk7Ci19Ci0KIHN0YXRpYyB2b2lkIG1veGFmdW5jKHZvaWQgX19pb21lbSAqb2ZzQWRkciwgaW50IGNtZCwgdXNob3J0IGFyZykKIHsKIApAQCAtMjUzNSw3ICsyNTIyLDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJYmFzZUFkZHIgPSBtb3hhX2JvYXJkc1tjYXJkbm9dLmJhc2VtZW07CiAJd3JpdGViKEhXX3Jlc2V0LCBiYXNlQWRkciArIENvbnRyb2xfcmVnKTsJLyogcmVzZXQgKi8KLQltb3hhZGVsYXkoMSk7CQkvKiBkZWxheSAxMCBtcyAqLworCW1zbGVlcCgxMCk7CiAJZm9yIChpID0gMDsgaSA8IDQwOTY7IGkrKykKIAkJd3JpdGViKDAsIGJhc2VBZGRyICsgaSk7CS8qIGNsZWFyIGZpeCBwYWdlICovCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQpAQCAtMjcxMyw3ICsyNzAwLDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSA9PSBrZXljb2RlKQogCQkJCQlicmVhazsKLQkJCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCQkJbXNsZWVwKDEwKTsKIAkJCX0KIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSAhPSBrZXljb2RlKSB7CiAJCQkJcmV0dXJuICgtMSk7CkBAIC0yNzI1LDcgKzI3MTIsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMyMThfa2V5KSA9PSBrZXljb2RlKQogCQkJCWJyZWFrOwotCQkJbW94YWRlbGF5KDEpOwkvKiBkZWxheSAxMCBtcyAqLworCQkJbXNsZWVwKDEwKTsKIAkJfQogCQlyZXRyeSsrOwogCX0gd2hpbGUgKChyZWFkYihiYXNlQWRkciArIEMyMThjaGtzdW1fb2spICE9IDEpICYmIChyZXRyeSA8IDMpKTsKQEAgLTI3MzYsNyArMjcyMyw3IEBACiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsJLyogZGVsYXkgMTAgbXMgKi8KKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpIHsKIAkJcmV0dXJuICgtMSk7CkBAIC0yNzQ2LDcgKzI3MzMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CS8qIGRlbGF5IDEwIG1zICovCisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKSB7CiAJCXJldHVybiAoLTEpOwpAQCAtMjc4OCw3ICsyNzc1LDcgQEAKIAkJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAJCQkJaWYgKHJlYWR3KGJhc2VBZGRyICsgQzMyMF9rZXkpID09IEMzMjBfS2V5Q29kZSkKIAkJCQkJYnJlYWs7Ci0JCQkJbW94YWRlbGF5KDEpOworCQkJCW1zbGVlcCgxMCk7CiAJCQl9CiAJCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBDMzIwX2tleSkgIT0gQzMyMF9LZXlDb2RlKQogCQkJCXJldHVybiAoLTEpOwpAQCAtMjc5OSw3ICsyNzg2LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKIAkJCWlmIChyZWFkdyhiYXNlQWRkciArIEMzMjBfa2V5KSA9PSBDMzIwX0tleUNvZGUpCiAJCQkJYnJlYWs7Ci0JCQltb3hhZGVsYXkoMSk7CisJCQltc2xlZXAoMTApOwogCQl9CiAJCXJldHJ5Kys7CiAJfSB3aGlsZSAoKHJlYWRiKGJhc2VBZGRyICsgQzMyMGNoa3N1bV9vaykgIT0gMSkgJiYgKHJldHJ5IDwgMykpOwpAQCAtMjgwOSw3ICsyNzk2LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKIAkJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pID09IE1hZ2ljX2NvZGUpCiAJCQlicmVhazsKLQkJbW94YWRlbGF5KDEpOworCQltc2xlZXAoMTApOwogCX0KIAlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgIT0gTWFnaWNfY29kZSkKIAkJcmV0dXJuICgtMTAwKTsKQEAgLTI4MjgsNyArMjgxNSw3IEBACiAJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7CiAJCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSA9PSBNYWdpY19jb2RlKQogCQkJYnJlYWs7Ci0JCW1veGFkZWxheSgxKTsKKwkJbXNsZWVwKDEwKTsKIAl9CiAJaWYgKHJlYWR3KGJhc2VBZGRyICsgTWFnaWNfbm8pICE9IE1hZ2ljX2NvZGUpCiAJCXJldHVybiAoLTEwMik7CkBAIC0yODQyLDcgKzI4MjksNyBAQAogCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykgewogCQlpZiAocmVhZHcoYmFzZUFkZHIgKyBNYWdpY19ubykgPT0gTWFnaWNfY29kZSkKIAkJCWJyZWFrOwotCQltb3hhZGVsYXkoMSk7CisJCW1zbGVlcCgxMCk7CiAJfQogCWlmIChyZWFkdyhiYXNlQWRkciArIE1hZ2ljX25vKSAhPSBNYWdpY19jb2RlKQogCQlyZXR1cm4gKC0xMDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21zcGVjLmMgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwppbmRleCA3YWMzMDYxLi5jNzE2ZWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXNwZWMuYworKysgYi9kcml2ZXJzL2NoYXIvbXNwZWMuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJdmRhdGEtPnJlZmNudCA9IEFUT01JQ19JTklUKDEpOwogCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gdmRhdGE7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0xPQ0tFRCB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQKTsKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQKTsKIAlpZiAodmRhdGEtPnR5cGUgPT0gTVNQRUNfRkVUQ0hPUCB8fCB2ZGF0YS0+dHlwZSA9PSBNU1BFQ19VTkNBQ0hFRCkKIAkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKIAl2bWEtPnZtX29wcyA9ICZtc3BlY192bV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuYyBiL2RyaXZlcnMvY2hhci9teHNlci5jCmluZGV4IDU5NTNhNDUuLjJhZWUzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlci5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC05MCw4ICs5MCw2IEBACiAjZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMAogI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMCTB4MUUKIAotI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDS3xcCi0JCQkJCSAgSVhPTnxJWE9GRikpCiAKICNkZWZpbmUgSVJRX1QoaW5mbykgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NIQVJFX0lSUSkgPyBJUlFGX1NIQVJFRCA6IElSUUZfRElTQUJMRUQpCiAKQEAgLTE3MjksMTYgKzE3MjcsMTIgQEAKIAlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpIHx8Ci0JCQkoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAhPSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7CisJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKIAotCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgb2xkX3Rlcm1pb3MpOwotCi0JCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgotCQkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLQkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCQlteHNlcl9zdGFydCh0dHkpOwotCQl9CisJaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCisJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CisJCW14c2VyX3N0YXJ0KHR0eSk7CiAJfQogCiAvKiBIYW5kbGUgc3cgc3RvcHBlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyX25ldy5jIGIvZHJpdmVycy9jaGFyL214c2VyX25ldy5jCmluZGV4IDZjZGU0NDguLjZhNTYzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYworKysgYi9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmMKQEAgLTcyLDggKzcyLDYgQEAKICNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwCiAjZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwJMHgxRQogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLfFwKLQkJCQkJICBJWE9OfElYT0ZGKSkKIAogI2RlZmluZSBDMTY4X0FTSUNfSUQgICAgMQogI2RlZmluZSBDMTA0X0FTSUNfSUQgICAgMgpAQCAtMTU2MCw3ICsxNTU4LDcgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAljYXNlIE1PWEFfQVNQUF9NT05fRVhUOiB7Ci0JCWludCBzdGF0dXMsIHAsIHNoaWZ0Yml0OworCQlpbnQgcCwgc2hpZnRiaXQ7CiAJCXVuc2lnbmVkIGxvbmcgb3Btb2RlOwogCQl1bnNpZ25lZCBjZmxhZywgaWZsYWc7CiAKQEAgLTE5OTAsMTggKzE5ODgsMTQgQEAKIAlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fAotCQkJKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykgIT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKLQkJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7Ci0JCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQkJbXhzZXJfc3RhcnQodHR5KTsKLQkJfQorCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlteHNlcl9zdGFydCh0dHkpOwogCX0KIAogCS8qIEhhbmRsZSBzdyBzdG9wcGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9oZGxjLmMgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKaW5kZXggMzM3YTg3Zi4uZTgzMzJmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25faGRsYy5jCisrKyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpAQCAtNDAwLDcgKzQwMCwxMiBAQAogCQkvKiBTZW5kIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEgdG8gZGV2aWNlICovCiAJCXR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CiAJCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHRidWYtPmJ1ZiwgdGJ1Zi0+Y291bnQpOwotCQkgICAgCisKKwkJLyogcm9sbGJhY2sgd2FzIHBvc3NpYmxlIGFuZCBoYXMgYmVlbiBkb25lICovCisJCWlmIChhY3R1YWwgPT0gLUVSRVNUQVJUU1lTKSB7CisJCQluX2hkbGMtPnRidWYgPSB0YnVmOworCQkJYnJlYWs7CisJCX0KIAkJLyogaWYgdHJhbnNtaXQgZXJyb3IsIHRocm93IGZyYW1lIGF3YXkgYnkgKi8KIAkJLyogcHJldGVuZGluZyBpdCB3YXMgYWNjZXB0ZWQgYnkgZHJpdmVyICovCiAJCWlmIChhY3R1YWwgPCAwKQpAQCAtNzgwLDEzICs3ODUsMTQgQEAKIAkJcG9sbF93YWl0KGZpbHAsICZ0dHktPndyaXRlX3dhaXQsIHdhaXQpOwogCiAJCS8qIHNldCBiaXRzIGZvciBvcGVyYXRpb25zIHRoYXQgd29uJ3QgYmxvY2sgKi8KLQkJaWYobl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkKQorCQlpZiAobl9oZGxjLT5yeF9idWZfbGlzdC5oZWFkKQogCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwkvKiByZWFkYWJsZSAqLwogCQlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKQogCQkJbWFzayB8PSBQT0xMSFVQOwotCQlpZih0dHlfaHVuZ191cF9wKGZpbHApKQorCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkKIAkJCW1hc2sgfD0gUE9MTEhVUDsKLQkJaWYobl9oZGxjLT50eF9mcmVlX2J1Zl9saXN0LmhlYWQpCisJCWlmICghdHR5X2lzX3dyaXRlbG9ja2VkKHR0eSkgJiYKKwkJCQluX2hkbGMtPnR4X2ZyZWVfYnVmX2xpc3QuaGVhZCkKIAkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CS8qIHdyaXRhYmxlICovCiAJfQogCXJldHVybiBtYXNrOwpAQCAtODYxLDcgKzg2Nyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPnNwaW5sb2NrLGZsYWdzKTsKIAkKIAlidWYtPmxpbms9TlVMTDsKLQlpZihsaXN0LT50YWlsKQorCWlmIChsaXN0LT50YWlsKQogCQlsaXN0LT50YWlsLT5saW5rID0gYnVmOwogCWVsc2UKIAkJbGlzdC0+aGVhZCA9IGJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCmluZGV4IDE0NTU3YTQuLjZiOTE4YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKKysrIGIvZHJpdmVycy9jaGFyL25fcjM5NjQuYwpAQCAtMTA3MSw4ICsxMDcxLDYgQEAKIAlzdHJ1Y3QgcjM5NjRfY2xpZW50X2luZm8gKnBDbGllbnQ7CiAJc3RydWN0IHIzOTY0X21lc3NhZ2UgKnBNc2c7CiAJc3RydWN0IHIzOTY0X2NsaWVudF9tZXNzYWdlIHRoZU1zZzsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQogCWludCBjb3VudDsKIAogCVRSQUNFX0woInJlYWQoKSIpOwpAQCAtMTA4NiwxNiArMTA4NCw4IEBACiAJCQkJcmV0dXJuIC1FQUdBSU47CiAJCQl9CiAJCQkvKiBibG9jayB1bnRpbCB0aGVyZSBpcyBhIG1lc3NhZ2U6ICovCi0JCQlhZGRfd2FpdF9xdWV1ZSgmcEluZm8tPnJlYWRfd2FpdCwgJndhaXQpOwotcmVwZWF0OgotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJcE1zZyA9IHJlbW92ZV9tc2cocEluZm8sIHBDbGllbnQpOwotCQkJaWYgKCFwTXNnICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXNjaGVkdWxlKCk7Ci0JCQkJZ290byByZXBlYXQ7Ci0JCQl9Ci0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcEluZm8tPnJlYWRfd2FpdCwgJndhaXQpOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHBJbmZvLT5yZWFkX3dhaXQsCisJCQkJCShwTXNnID0gcmVtb3ZlX21zZyhwSW5mbywgcENsaWVudCkpKTsKIAkJfQogCiAJCS8qIElmIHdlIHN0aWxsIGhhdmVuJ3QgZ290IGEgbWVzc2FnZSwgd2UgbXVzdCBoYXZlIGJlZW4gc2lnbmFsbGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl90dHkuYyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCmluZGV4IDE1NGY0MjIuLjAzODA1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC00NSw2ICs0NSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNzgsNiArODAsMTMgQEAKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOwogfQogCitzdGF0aWMgaW5saW5lIGludCB0dHlfcHV0X3VzZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciB4LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpwdHIpCit7CisJdHR5X2F1ZGl0X2FkZF9kYXRhKHR0eSwgJngsIDEpOworCXJldHVybiBwdXRfdXNlcih4LCBwdHIpOworfQorCiAvKioKICAqCW5fdHR5X3NldF9fcm9vbQktCXJlY2VpdmUgc3BhY2UKICAqCUB0dHk6IHRlcm1pbmFsCkBAIC0xMTUzLDYgKzExNjIsNyBAQAogCWlmIChuKSB7CiAJCXJldHZhbCA9IGNvcHlfdG9fdXNlcigqYiwgJnR0eS0+cmVhZF9idWZbdHR5LT5yZWFkX3RhaWxdLCBuKTsKIAkJbiAtPSByZXR2YWw7CisJCXR0eV9hdWRpdF9hZGRfZGF0YSh0dHksICZ0dHktPnJlYWRfYnVmW3R0eS0+cmVhZF90YWlsXSwgbik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOwogCQl0dHktPnJlYWRfdGFpbCA9ICh0dHktPnJlYWRfdGFpbCArIG4pICYgKE5fVFRZX0JVRl9TSVpFLTEpOwogCQl0dHktPnJlYWRfY250IC09IG47CkBAIC0xMjc5LDcgKzEyODksNyBAQAogCQkJCWJyZWFrOwogCQkJY3MgPSB0dHktPmxpbmstPmN0cmxfc3RhdHVzOwogCQkJdHR5LT5saW5rLT5jdHJsX3N0YXR1cyA9IDA7Ci0JCQlpZiAocHV0X3VzZXIoY3MsIGIrKykpIHsKKwkJCWlmICh0dHlfcHV0X3VzZXIodHR5LCBjcywgYisrKSkgewogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYi0tOwogCQkJCWJyZWFrOwpAQCAtMTMyMSw3ICsxMzMxLDcgQEAKIAogCQkvKiBEZWFsIHdpdGggcGFja2V0IG1vZGUuICovCiAJCWlmICh0dHktPnBhY2tldCAmJiBiID09IGJ1ZikgewotCQkJaWYgKHB1dF91c2VyKFRJT0NQS1RfREFUQSwgYisrKSkgeworCQkJaWYgKHR0eV9wdXRfdXNlcih0dHksIFRJT0NQS1RfREFUQSwgYisrKSkgewogCQkJCXJldHZhbCA9IC1FRkFVTFQ7CiAJCQkJYi0tOwogCQkJCWJyZWFrOwpAQCAtMTM1MiwxNSArMTM2MiwxNyBAQAogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+cmVhZF9sb2NrLCBmbGFncyk7CiAKIAkJCQlpZiAoIWVvbCB8fCAoYyAhPSBfX0RJU0FCTEVEX0NIQVIpKSB7Ci0JCQkJCWlmIChwdXRfdXNlcihjLCBiKyspKSB7CisJCQkJCWlmICh0dHlfcHV0X3VzZXIodHR5LCBjLCBiKyspKSB7CiAJCQkJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJCQkJYi0tOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQkJbnItLTsKIAkJCQl9Ci0JCQkJaWYgKGVvbCkKKwkJCQlpZiAoZW9sKSB7CisJCQkJCXR0eV9hdWRpdF9wdXNoKHR0eSk7CiAJCQkJCWJyZWFrOworCQkJCX0KIAkJCX0KIAkJCWlmIChyZXR2YWwpCiAJCQkJYnJlYWs7CkBAIC0xNTM4LDcgKzE1NTAsOCBAQAogCQllbHNlCiAJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IDE7CiAJfQotCWlmICh0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgPCBXQUtFVVBfQ0hBUlMgJiYKKwlpZiAoIXR0eV9pc193cml0ZWxvY2tlZCh0dHkpICYmCisJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgPCBXQUtFVVBfQ0hBUlMgJiYKIAkJCXR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKHR0eSkgPiAwKQogCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCXJldHVybiBtYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL252cmFtLmMgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwppbmRleCAyMDRkZWFhLi45OGRlYzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbnZyYW0uYworKysgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpAQCAtNDIsMTkgKzQyLDEyIEBACiAKICNkZWZpbmUgUEMJCTEKICNkZWZpbmUgQVRBUkkJCTIKLSNkZWZpbmUgQ09CQUxUCQkzCiAKIC8qIHNlbGVjdCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gKi8KICNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkKICMgIGRlZmluZSBNQUNIIEFUQVJJCiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hcm1fXykgIC8qIGFuZCBvdGhlcnM/PyAqLwotI2RlZmluZSBNQUNIIFBDCi0jICBpZiBkZWZpbmVkKENPTkZJR19DT0JBTFQpCi0jICAgIGluY2x1ZGUgPGxpbnV4L2NvYmFsdC1udnJhbS5oPgotIyAgICBkZWZpbmUgTUFDSCBDT0JBTFQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BQ0ggUEMKLSMgIGVuZGlmCisjICBkZWZpbmUgTUFDSCBQQwogI2Vsc2UKICMgIGVycm9yIENhbm5vdCBidWlsZCBudnJhbSBkcml2ZXIgZm9yIHRoaXMgbWFjaGluZSBjb25maWd1cmF0aW9uLgogI2VuZGlmCkBAIC03NiwxOCArNjksNiBAQAogCiAjZW5kaWYKIAotI2lmIE1BQ0ggPT0gQ09CQUxUCi0KLSNkZWZpbmUgQ0hFQ0tfRFJJVkVSX0lOSVQoKSAgICAgMQotCi0jZGVmaW5lIE5WUkFNX0JZVEVTCQkoMTI4LU5WUkFNX0ZJUlNUX0JZVEUpCi0KLSNkZWZpbmUgbWFjaF9jaGVja19jaGVja3N1bQljb2JhbHRfY2hlY2tfY2hlY2tzdW0KLSNkZWZpbmUgbWFjaF9zZXRfY2hlY2tzdW0JY29iYWx0X3NldF9jaGVja3N1bQotI2RlZmluZSBtYWNoX3Byb2NfaW5mb3MJCWNvYmFsdF9wcm9jX2luZm9zCi0KLSNlbmRpZgotCiAjaWYgTUFDSCA9PSBBVEFSSQogCiAvKiBTcGVjaWFsIHBhcmFtZXRlcnMgZm9yIFJUQyBpbiBBdGFyaSBtYWNoaW5lcyAqLwpAQCAtNjA0LDE3NyArNTg1LDYgQEAKIAogI2VuZGlmIC8qIE1BQ0ggPT0gUEMgKi8KIAotI2lmIE1BQ0ggPT0gQ09CQUxUCi0KLS8qIHRoZSBjb2JhbHQgQ01PUyBoYXMgYSB3aWRlciByYW5nZSBvZiBpdHMgY2hlY2tzdW0gKi8KLXN0YXRpYyBpbnQgY29iYWx0X2NoZWNrX2NoZWNrc3VtKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBleHBlY3Q7Ci0KLQlmb3IgKGkgPSBDT0JUX0NNT1NfQ0tTX1NUQVJUOyBpIDw9IENPQlRfQ01PU19DS1NfRU5EOyArK2kpIHsKLQkJaWYgKChpID09IENPQlRfQ01PU19DSEVDS1NVTSkgfHwgKGkgPT0gKENPQlRfQ01PU19DSEVDS1NVTSsxKSkpCi0JCQljb250aW51ZTsKLQotCQlzdW0gKz0gX19udnJhbV9yZWFkX2J5dGUoaSk7Ci0JfQotCWV4cGVjdCA9IF9fbnZyYW1fcmVhZF9ieXRlKENPQlRfQ01PU19DSEVDS1NVTSkgPDwgOCB8Ci0JICAgIF9fbnZyYW1fcmVhZF9ieXRlKENPQlRfQ01PU19DSEVDS1NVTSsxKTsKLQlyZXR1cm4gKChzdW0gJiAweGZmZmYpID09IGV4cGVjdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvYmFsdF9zZXRfY2hlY2tzdW0odm9pZCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBzaG9ydCBzdW0gPSAwOwotCi0JZm9yIChpID0gQ09CVF9DTU9TX0NLU19TVEFSVDsgaSA8PSBDT0JUX0NNT1NfQ0tTX0VORDsgKytpKSB7Ci0JCWlmICgoaSA9PSBDT0JUX0NNT1NfQ0hFQ0tTVU0pIHx8IChpID09IChDT0JUX0NNT1NfQ0hFQ0tTVU0rMSkpKQotCQkJY29udGludWU7Ci0KLQkJc3VtICs9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOwotCX0KLQotCV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0gPj4gOCwgQ09CVF9DTU9TX0NIRUNLU1VNKTsKLQlfX252cmFtX3dyaXRlX2J5dGUoc3VtICYgMHhmZiwgQ09CVF9DTU9TX0NIRUNLU1VNKzEpOwotfQotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQotc3RhdGljIGludCBjb2JhbHRfcHJvY19pbmZvcyh1bnNpZ25lZCBjaGFyICpudnJhbSwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbiwKLQlvZmZfdCAqYmVnaW4sIG9mZl90IG9mZnNldCwgaW50IHNpemUpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IGNoZWNrc3VtOwotCXVuc2lnbmVkIGludCBmbGFnczsKLQljaGFyIHNlcm51bVsxNF07Ci0JY2hhciAqa2V5ID0gImNOb0ViVGFXbE90UiEiOwotCXVuc2lnbmVkIGNoYXIgYnRvX2NzdW07Ci0KLQlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7Ci0JY2hlY2tzdW0gPSBfX252cmFtX2NoZWNrX2NoZWNrc3VtKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7Ci0KLQlQUklOVF9QUk9DKCJDaGVja3N1bSBzdGF0dXM6ICVzdmFsaWRcbiIsIGNoZWNrc3VtID8gIiIgOiAibm90ICIpOwotCi0JZmxhZ3MgPSBudnJhbVtDT0JUX0NNT1NfRkxBR19CWVRFXzBdIDw8IDggCi0JICAgIHwgbnZyYW1bQ09CVF9DTU9TX0ZMQUdfQllURV8xXTsKLQotCVBSSU5UX1BST0MoIkNvbnNvbGU6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19DT05TT0xFX0ZMQUcgPyAgIm9uIjogIm9mZiIpOwotCi0JUFJJTlRfUFJPQygiRmlybXdhcmUgRGVidWcgTWVzc2FnZXM6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19ERUJVR19GTEFHID8gIm9uIjogIm9mZiIpOwotCi0JUFJJTlRfUFJPQygiQXV0byBQcm9tcHQ6ICVzXG4iLAotCQlmbGFncyAmIENPQlRfQ01PU19BVVRPX1BST01QVF9GTEFHID8gIm9uIjogIm9mZiIpOwotCi0JUFJJTlRfUFJPQygiU2h1dGRvd24gU3RhdHVzOiAlc1xuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfQ0xFQU5fQk9PVF9GTEFHID8gImNsZWFuIjogImRpcnR5Iik7Ci0KLQlQUklOVF9QUk9DKCJIYXJkd2FyZSBQcm9iZTogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0hXX05PUFJPQkVfRkxBRyA/ICJwYXJ0aWFsIjogImZ1bGwiKTsKLQotCVBSSU5UX1BST0MoIlN5c3RlbSBGYXVsdDogJXNkZXRlY3RlZFxuIiwKLQkJZmxhZ3MgJiBDT0JUX0NNT1NfU1lTRkFVTFRfRkxBRyA/ICIiOiAibm90ICIpOwotCi0JUFJJTlRfUFJPQygiUGFuaWMgb24gT09QUzogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX09PUFNQQU5JQ19GTEFHID8gInllcyI6ICJubyIpOwotCi0JUFJJTlRfUFJPQygiRGVsYXllZCBDYWNoZSBJbml0aWFsaXphdGlvbjogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX0RFTEFZX0NBQ0hFX0ZMQUcgPyAieWVzIjogIm5vIik7Ci0KLQlQUklOVF9QUk9DKCJTaG93IExvZ28gYXQgQm9vdDogJXNcbiIsCi0JCWZsYWdzICYgQ09CVF9DTU9TX05PTE9HT19GTEFHID8gIm5vIjogInllcyIpOwotCi0JUFJJTlRfUFJPQygiQm9vdCBNZXRob2Q6ICIpOwotCXN3aXRjaCAobnZyYW1bQ09CVF9DTU9TX0JPT1RfTUVUSE9EXSkgewotCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX0RJU0s6Ci0JCVBSSU5UX1BST0MoImRpc2tcbiIpOwotCQlicmVhazsKLQotCWNhc2UgQ09CVF9DTU9TX0JPT1RfTUVUSE9EX1JPTToKLQkJUFJJTlRfUFJPQygicm9tXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENPQlRfQ01PU19CT09UX01FVEhPRF9ORVQ6Ci0JCVBSSU5UX1BST0MoIm5ldFxuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJUFJJTlRfUFJPQygidW5rbm93blxuIik7Ci0JCWJyZWFrOwotCX0KLQotCVBSSU5UX1BST0MoIlByaW1hcnkgQm9vdCBEZXZpY2U6ICVkOiVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYwX01BSl0sCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjBfTUlOXSApOwotCVBSSU5UX1BST0MoIlNlY29uZGFyeSBCb290IERldmljZTogJWQ6JWRcbiIsCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjFfTUFKXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RfREVWMV9NSU5dICk7Ci0JUFJJTlRfUFJPQygiVGVydGlhcnkgQm9vdCBEZXZpY2U6ICVkOiVkXG4iLAotCQludnJhbVtDT0JUX0NNT1NfQk9PVF9ERVYyX01BSl0sCi0JCW52cmFtW0NPQlRfQ01PU19CT09UX0RFVjJfTUlOXSApOwotCi0JUFJJTlRfUFJPQygiVXB0aW1lOiAlZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8wXSA8PCAyNCB8Ci0JCW52cmFtW0NPQlRfQ01PU19VUFRJTUVfMV0gPDwgMTYgfAotCQludnJhbVtDT0JUX0NNT1NfVVBUSU1FXzJdIDw8IDggIHwKLQkJbnZyYW1bQ09CVF9DTU9TX1VQVElNRV8zXSk7Ci0KLQlQUklOVF9QUk9DKCJCb290IENvdW50OiAlZFxuIiwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8wXSA8PCAyNCB8Ci0JCW52cmFtW0NPQlRfQ01PU19CT09UQ09VTlRfMV0gPDwgMTYgfAotCQludnJhbVtDT0JUX0NNT1NfQk9PVENPVU5UXzJdIDw8IDggIHwKLQkJbnZyYW1bQ09CVF9DTU9TX0JPT1RDT1VOVF8zXSk7Ci0KLQkvKiAxMyBieXRlcyBvZiBzZXJpYWwgbnVtICovCi0JZm9yIChpPTAgOyBpPDEzIDsgaSsrKSB7Ci0JCXNlcm51bVtpXSA9IG52cmFtW0NPQlRfQ01PU19TWVNfU0VSTlVNXzAgKyBpXTsKLQl9Ci0Jc2VybnVtWzEzXSA9ICdcMCc7Ci0KLQljaGVja3N1bSA9IDA7Ci0JZm9yIChpPTAgOyBpPDEzIDsgaSsrKSB7Ci0JCWNoZWNrc3VtICs9IHNlcm51bVtpXSBeIGtleVtpXTsKLQl9Ci0JY2hlY2tzdW0gPSAoKGNoZWNrc3VtICYgMHg3ZikgXiAoMHhkNikpICYgMHhmZjsKLQotCVBSSU5UX1BST0MoIlNlcmlhbCBOdW1iZXI6ICVzIiwgc2VybnVtKTsKLQlpZiAoY2hlY2tzdW0gIT0gbnZyYW1bQ09CVF9DTU9TX1NZU19TRVJOVU1fQ1NVTV0pIHsKLQkJUFJJTlRfUFJPQygiIChpbnZhbGlkIGNoZWNrc3VtKSIpOwotCX0KLQlQUklOVF9QUk9DKCJcbiIpOwotCi0JUFJJTlRfUFJPQygiUm9tIFJldmlzb246ICVkLiVkLiVkXG4iLCBudnJhbVtDT0JUX0NNT1NfUk9NX1JFVl9NQUpdLAotCQludnJhbVtDT0JUX0NNT1NfUk9NX1JFVl9NSU5dLCBudnJhbVtDT0JUX0NNT1NfUk9NX1JFVl9SRVZdKTsKLQotCVBSSU5UX1BST0MoIkJUTyBTZXJ2ZXI6ICVkLiVkLiVkLiVkIiwgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8wXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8xXSwgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8yXSwKLQkJbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8zXSk7Ci0JYnRvX2NzdW0gPSBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzBdICsgbnZyYW1bQ09CVF9DTU9TX0JUT19JUF8xXQotCQkrIG52cmFtW0NPQlRfQ01PU19CVE9fSVBfMl0gKyBudnJhbVtDT0JUX0NNT1NfQlRPX0lQXzNdOwotCWlmIChidG9fY3N1bSAhPSBudnJhbVtDT0JUX0NNT1NfQlRPX0lQX0NTVU1dKSB7Ci0JCVBSSU5UX1BST0MoIiAoaW52YWxpZCBjaGVja3N1bSkiKTsKLQl9Ci0JUFJJTlRfUFJPQygiXG4iKTsKLQotCWlmIChmbGFncyAmIENPQlRfQ01PU19WRVJTSU9OX0ZMQUcKLQkgJiYgbnZyYW1bQ09CVF9DTU9TX1ZFUlNJT05dID49IENPQlRfQ01PU19WRVJfQlRPQ09ERSkgewotCQlQUklOVF9QUk9DKCJCVE8gQ29kZTogMHgleFxuIiwKLQkJCW52cmFtW0NPQlRfQ01PU19CVE9fQ09ERV8wXSA8PCAyNCB8Ci0JCQludnJhbVtDT0JUX0NNT1NfQlRPX0NPREVfMV0gPDwgMTYgfAotCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzJdIDw8IDggfAotCQkJbnZyYW1bQ09CVF9DTU9TX0JUT19DT0RFXzNdKTsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwotCi0jZW5kaWYgLyogTUFDSCA9PSBDT0JBTFQgKi8KLQogI2lmIE1BQ0ggPT0gQVRBUkkKIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggMzQ5NGUzZi4uYjM3ZTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC0yMTMsMTQgKzIxMyw2IEBACiAJCXJlbGVhc2VfcmVnaW9uKFJDX1RPX0lTQShyY19pb3BvcnRbaV0pICsgYnAtPmJhc2UsIDEpOwogfQogCQotLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBlbmFibGVkIGludGVycnVwdHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByY19sb25nX2RlbGF5KHVuc2lnbmVkIGxvbmcgZGVsYXkpCi17Ci0JdW5zaWduZWQgbG9uZyBpOwotCQotCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLGppZmZpZXMpOyApIDsKLX0KLQogLyogUmVzZXQgYW5kIHNldHVwIENEMTgwIGNoaXAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCByY19pbml0X0NEMTgwKHN0cnVjdCByaXNjb21fYm9hcmQgY29uc3QgKiBicCkKIHsKQEAgLTIzMSw3ICsyMjMsNyBAQAogCXJjX3dhaXRfQ0NSKGJwKTsJCQkgICAvKiBXYWl0IGZvciBDQ1IgcmVhZHkgICAgICAgICovCiAJcmNfb3V0KGJwLCBDRDE4MF9DQ1IsIENDUl9IQVJEUkVTRVQpOyAgICAgIC8qIFJlc2V0IENEMTgwIGNoaXAgICAgICAgICAgKi8KIAlzdGkoKTsKLQlyY19sb25nX2RlbGF5KEhaLzIwKTsgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLworCW1zbGVlcCg1MCk7CQkJCSAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KIAljbGkoKTsKIAlyY19vdXQoYnAsIENEMTgwX0dJVlIsIFJDX0lEKTsgICAgICAgICAgICAgLyogU2V0IElEIGZvciB0aGlzIGNoaXAgICAgICAqLwogCXJjX291dChicCwgQ0QxODBfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCkBAIC0yODAsNyArMjcyLDcgQEAKIAkJcmNfd2FpdF9DQ1IoYnApOwogCQlyY19vdXQoYnAsIENEMTgwX0NDUiwgQ0NSX1RYRU4pOyAgICAgICAgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAqLwogCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgSUVSX1RYUkRZKTsgICAgICAgLyogRW5hYmxlIHR4IGVtcHR5IGludHIgICAqLwotCQlyY19sb25nX2RlbGF5KEhaLzIwKTsJICAgICAgIAkJCisJCW1zbGVlcCg1MCk7CiAJCWlycXMgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwogCQl2YWwxID0gcmNfaW4oYnAsIFJDX0JTUik7CQkvKiBHZXQgQm9hcmQgU3RhdHVzIHJlZyAgICovCiAJCXZhbDIgPSByY19pbihicCwgUkNfQUNLX1RJTlQpOyAgICAgICAgICAvKiBBQ0sgaW50ZXJydXB0ICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKaW5kZXggYTNmZDdlNy4uMDI3MDA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JvY2tldC5jCisrKyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwpAQCAtMTcwMiw3ICsxNzAyLDggQEAKIAlpZiAoY291bnQgPD0gMCB8fCByb2NrZXRfcGFyYW5vaWFfY2hlY2soaW5mbywgInJwX3dyaXRlIikpCiAJCXJldHVybiAwOwogCi0JbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbmZvLT53cml0ZV9tdHgpOworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmluZm8tPndyaXRlX210eCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKICNpZmRlZiBST0NLRVRfREVCVUdfV1JJVEUKIAlwcmludGsoS0VSTl9JTkZPICJycF93cml0ZSAlZCBjaGFycy4uLiIsIGNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ydGMuYyBiL2RyaXZlcnMvY2hhci9ydGMuYwppbmRleCAyMDM4MGEyLi4yMmNmN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3J0Yy5jCkBAIC0xMTU5LDcgKzExNTksOCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CiAKLQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwgZnJlcSk7CisJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicnRjOiBsb3N0IHNvbWUgaW50ZXJydXB0cyBhdCAlbGRIei5cbiIsIGZyZXEpOwogCiAJLyogTm93IHdlIGhhdmUgbmV3IGRhdGEgKi8KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJ0Y193YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYyBiL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYwppbmRleCBhNjlmMDk0Li5kNjNmNWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaW5jbHVkZSA8bGludXgva2JkX2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgpAQCAtMzQsNiArMzUsNyBAQAogLyogVmFyaWFibGVzIGZvciBzZWxlY3Rpb24gY29udHJvbC4gKi8KIC8qIFVzZSBhIGR5bmFtaWMgYnVmZmVyLCBpbnN0ZWFkIG9mIHN0YXRpYyAoRGVjIDE5OTQpICovCiBzdHJ1Y3QgdmNfZGF0YSAqc2VsX2NvbnM7CQkvKiBtdXN0IG5vdCBiZSBkZWFsbG9jYXRlZCAqLworc3RhdGljIGludCB1c2VfdW5pY29kZTsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgc2VsX3N0YXJ0ID0gLTE7IAkvKiBjbGVhcmVkIGJ5IGNsZWFyX3NlbGVjdGlvbiAqLwogc3RhdGljIGludCBzZWxfZW5kOwogc3RhdGljIGludCBzZWxfYnVmZmVyX2x0aDsKQEAgLTU0LDEwICs1NiwxMSBAQAogCWNvbXBsZW1lbnRfcG9zKHNlbF9jb25zLCB3aGVyZSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyCitzdGF0aWMgdTE2CiBzZWxfcG9zKGludCBuKQogewotCXJldHVybiBpbnZlcnNlX3RyYW5zbGF0ZShzZWxfY29ucywgc2NyZWVuX2dseXBoKHNlbF9jb25zLCBuKSk7CisJcmV0dXJuIGludmVyc2VfdHJhbnNsYXRlKHNlbF9jb25zLCBzY3JlZW5fZ2x5cGgoc2VsX2NvbnMsIG4pLAorCQkJCXVzZV91bmljb2RlKTsKIH0KIAogLyogcmVtb3ZlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBoaWdobGlnaHQsIGlmIGFueSwKQEAgLTg2LDggKzg5LDggQEAKICAgMHhGRjdGRkZGRiAgLyogbGF0aW4tMSBhY2NlbnRlZCBsZXR0ZXJzLCBub3QgZGl2aXNpb24gc2lnbiAqLwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgaW53b3JkKGNvbnN0IHVuc2lnbmVkIGNoYXIgYykgewotCXJldHVybiAoIGlud29yZEx1dFtjPj41XSA+PiAoYyAmIDB4MUYpICkgJiAxOworc3RhdGljIGlubGluZSBpbnQgaW53b3JkKGNvbnN0IHUxNiBjKSB7CisJcmV0dXJuIGMgPiAweGZmIHx8ICgoIGlud29yZEx1dFtjPj41XSA+PiAoYyAmIDB4MUYpICkgJiAxKTsKIH0KIAogLyogc2V0IGlud29yZEx1dCBjb250ZW50cy4gSW52b2tlZCBieSBpb2N0bCgpLiAqLwpAQCAtMTA4LDEzICsxMTEsMzYgQEAKIAlyZXR1cm4gKHYgPiB1KSA/IHUgOiB2OwogfQogCisvKiBzdG9yZXMgdGhlIGNoYXIgaW4gVVRGOCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgKDEtMykgKi8KK3N0YXRpYyBpbnQgc3RvcmVfdXRmOCh1MTYgYywgY2hhciAqcCkKK3sKKwlpZiAoYyA8IDB4ODApIHsKKwkJLyogIDAqKioqKioqICovCisJCXBbMF0gPSBjOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKGMgPCAweDgwMCkgeworCQkvKiAxMTAqKioqKiAxMCoqKioqKiAqLworCQlwWzBdID0gMHhjMCB8IChjID4+IDYpOworCQlwWzFdID0gMHg4MCB8IChjICYgMHgzZik7CisJCXJldHVybiAyOworICAgIAl9IGVsc2UgeworCQkvKiAxMTEwKioqKiAxMCoqKioqKiAxMCoqKioqKiAqLworCQlwWzBdID0gMHhlMCB8IChjID4+IDEyKTsKKwkJcFsxXSA9IDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKTsKKwkJcFsyXSA9IDB4ODAgfCAoYyAmIDB4M2YpOworCQlyZXR1cm4gMzsKKyAgICAJfQorfQorCiAvKiBzZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBJbnZva2VkIGJ5IGlvY3RsKCkgb3IgYnkga2VybmVsIGNvZGUuICovCiBpbnQgc2V0X3NlbGVjdGlvbihjb25zdCBzdHJ1Y3QgdGlvY2xfc2VsZWN0aW9uIF9fdXNlciAqc2VsLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB2Y19kYXRhICp2YyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKIAlpbnQgc2VsX21vZGUsIG5ld19zZWxfc3RhcnQsIG5ld19zZWxfZW5kLCBzcGM7CiAJY2hhciAqYnAsICpvYnA7Ci0JaW50IGksIHBzLCBwZTsKKwlpbnQgaSwgcHMsIHBlLCBtdWx0aXBsaWVyOworCXUxNiBjOworCXN0cnVjdCBrYmRfc3RydWN0ICprYmQgPSBrYmRfdGFibGUgKyBmZ19jb25zb2xlOwogCiAJcG9rZV9ibGFua2VkX2NvbnNvbGUoKTsKIApAQCAtMTU4LDYgKzE4NCw3IEBACiAJCWNsZWFyX3NlbGVjdGlvbigpOwogCQlzZWxfY29ucyA9IHZjX2NvbnNbZmdfY29uc29sZV0uZDsKIAl9CisJdXNlX3VuaWNvZGUgPSBrYmQgJiYga2JkLT5rYmRtb2RlID09IFZDX1VOSUNPREU7CiAKIAlzd2l0Y2ggKHNlbF9tb2RlKQogCXsKQEAgLTI0MCw3ICsyNjcsOCBAQAogCXNlbF9lbmQgPSBuZXdfc2VsX2VuZDsKIAogCS8qIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBiZWZvcmUgZnJlZWluZyB0aGUgb2xkIG9uZSAuLi4gKi8KLQlicCA9IGttYWxsb2MoKHNlbF9lbmQtc2VsX3N0YXJ0KS8yKzEsIEdGUF9LRVJORUwpOworCW11bHRpcGxpZXIgPSB1c2VfdW5pY29kZSA/IDMgOiAxOyAgLyogY2hhcnMgY2FuIHRha2UgdXAgdG8gMyBieXRlcyAqLworCWJwID0ga21hbGxvYygoc2VsX2VuZC1zZWxfc3RhcnQpLzIqbXVsdGlwbGllcisxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlbGVjdGlvbjoga21hbGxvYygpIGZhaWxlZFxuIik7CiAJCWNsZWFyX3NlbGVjdGlvbigpOwpAQCAtMjUxLDggKzI3OSwxMiBAQAogCiAJb2JwID0gYnA7CiAJZm9yIChpID0gc2VsX3N0YXJ0OyBpIDw9IHNlbF9lbmQ7IGkgKz0gMikgewotCQkqYnAgPSBzZWxfcG9zKGkpOwotCQlpZiAoIWlzc3BhY2UoKmJwKyspKQorCQljID0gc2VsX3BvcyhpKTsKKwkJaWYgKHVzZV91bmljb2RlKQorCQkJYnAgKz0gc3RvcmVfdXRmOChjLCBicCk7CisJCWVsc2UKKwkJCSpicCsrID0gYzsKKwkJaWYgKCFpc3NwYWNlKGMpKQogCQkJb2JwID0gYnA7CiAJCWlmICghICgoaSArIDIpICUgdmMtPnZjX3NpemVfcm93KSkgewogCQkJLyogc3RyaXAgdHJhaWxpbmcgYmxhbmtzIGZyb20gbGluZSBhbmQgYWRkIG5ld2xpbmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc29ueXBpLmMgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKaW5kZXggM2VmNTkzYS4uNzMwMzdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9zb255cGkuYwpAQCAtODg1LDUzICs4ODUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyogRXh0ZXJuYWwgY2FtZXJhIGNvbW1hbmQgKGV4cG9ydGVkIHRvIHRoZSBtb3Rpb24gZXllIHY0bCBkcml2ZXIpICovCi1pbnQgc29ueXBpX2NhbWVyYV9jb21tYW5kKGludCBjb21tYW5kLCB1OCB2YWx1ZSkKLXsKLQlpZiAoIWNhbWVyYSkKLQkJcmV0dXJuIC1FSU87Ci0KLQltdXRleF9sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwotCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkE6Ci0JCWlmICh2YWx1ZSkKLQkJCXNvbnlwaV9jYW1lcmFfb24oKTsKLQkJZWxzZQotCQkJc29ueXBpX2NhbWVyYV9vZmYoKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFCUklHSFRORVNTOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQlJJR0hUTkVTUywgdmFsdWUpOwotCQlicmVhazsKLQljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTlRSQVNUOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQ09OVFJBU1QsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFIVUU6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9IVUUsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFDT0xPUjoKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTE9SLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBU0hBUlBORVNTOgotCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfU0hBUlBORVNTLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBUElDVFVSRToKLQkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1BJQ1RVUkUsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFBR0M6Ci0JCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9BR0MsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHNvbnlwaV9jYW1lcmFfY29tbWFuZCBpbnZhbGlkOiAlZFxuIiwKLQkJICAgICAgIGNvbW1hbmQpOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzb255cGlfZGV2aWNlLmxvY2spOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKHNvbnlwaV9jYW1lcmFfY29tbWFuZCk7Ci0KIHN0YXRpYyBpbnQgc29ueXBpX21pc2NfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKIHsKIAlpbnQgcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCmluZGV4IGJhZjcyMzQuLjQ1NTg1NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYworKysgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKQEAgLTM0NSwxOCArMzQ1LDYgQEAKIH0KIAogCi0vKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGVuYWJsZWQgaW50ZXJydXB0cyAqLwotLyogVWdseS4gVmVyeSB1Z2x5LiBEb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgZWxzZSB0aGFuIGluaXRpYWxpemF0aW9uCi0gICBjb2RlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc3hfbG9uZ19kZWxheSh1bnNpZ25lZCBsb25nIGRlbGF5KQotewotCXVuc2lnbmVkIGxvbmcgaTsKLQotCWZvciAoaSA9IGppZmZpZXMgKyBkZWxheTsgdGltZV9hZnRlcihpLCBqaWZmaWVzKTsgKSA7Ci19Ci0KLQotCiAvKiBTZXQgdGhlIElSUSB1c2luZyB0aGUgUlRTIGxpbmVzIHRoYXQgcnVuIHRvIHRoZSBQQUwgb24gdGhlIGJvYXJkLi4uLiAqLwogc3RhdGljIGludCBzeF9zZXRfaXJxICggc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqYnApCiB7CkBAIC0zOTcsNyArMzg1LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfQ0NSLCBDQ1JfSEFSRFJFU0VUKTsgICAgICAvKiBSZXNldCBDRDE4NnggY2hpcCAgICAgICAgICAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0Jc3hfbG9uZ19kZWxheShIWi8yMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IDAuMDUgc2VjICAgICAgICAgICAgKi8KKwltc2xlZXAoNTApOwkJCQkJLyogRGVsYXkgMC4wNSBzZWMgICAgICAgICAgICAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCXN4X291dF9vZmYoYnAsIENEMTg2eF9HSVZSLCBTWF9JRCk7ICAgICAgICAgICAgIC8qIFNldCBJRCBmb3IgdGhpcyBjaGlwICAgICAgKi8KIAlzeF9vdXRfb2ZmKGJwLCBDRDE4NnhfR0lDUiwgMCk7ICAgICAgICAgICAgICAgICAvKiBDbGVhciBhbGwgYml0cyAgICAgICAgICAgICovCkBAIC01MzMsNyArNTIxLDcgQEAKIAkJc3hfd2FpdF9DQ1IoYnApOwogCQlzeF9vdXQoYnAsIENEMTg2eF9DQ1IsIENDUl9UWEVOKTsgICAgICAgIC8qIEVuYWJsZSB0cmFuc21pdHRlciAgICAgKi8KIAkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBJRVJfVFhSRFkpOyAgICAgICAvKiBFbmFibGUgdHggZW1wdHkgaW50ciAgICovCi0JCXN4X2xvbmdfZGVsYXkoSFovMjApOworCQltc2xlZXAoNTApOwogCQlpcnFzID0gcHJvYmVfaXJxX29mZihpcnFzKTsKIAogCQlkcHJpbnRrIChTWF9ERUJVR19JTklULCAiU1JTUiA9ICUwMngsICIsIHN4X2luKGJwLCBDRDE4NnhfU1JTUikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwppbmRleCA4YzczY2NiLi45M2QwYmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpAQCAtMTc4OCw3ICsxNzg4LDYgQEAKIAlpZiAodHR5ID09IE5VTEwpCiAJCXJldHVybjsKIAotCWxvY2tfa2VybmVsKCk7CiAJaWYgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSkKIAkJdHR5X3dha2V1cCh0dHkpOwogCkBAIC0xODAyLDcgKzE4MDEsNiBAQAogCQkJaWYgKHBvcnRwLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKQogCQkJCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAtIEFLUE0gKi8KIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzU3LDkgKzIzNTUsNiBAQAogCWlmICgocGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQogCQlnb3RvIGVycjsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwbGVhc2UsIHJlcG9ydCB0aGlzIHRvIExLTUw6ICV4LyV4LyV4XG4iLAotCQkJcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsIHBkZXYtPmNsYXNzKTsKLQogCXJldHZhbCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwppbmRleCBmMDJhMDc5Li5mNTNlNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYwpAQCAtMTYwLDggKzE2MCw2IEBACiAKICNkZWZpbmUgSU9fUElOX1NIVVRET1dOX0xJTUlUIDEwMAogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogc3RydWN0CV9pbnB1dF9zaWduYWxfZXZlbnRzIHsKIAlpbnQJcmlfdXA7CQogCWludAlyaV9kb3duOwpAQCAtMzA2NCwxMiArMzA2Miw2IEBACiAJCXByaW50aygiJXMoJWQpOm1nc2xfc2V0X3Rlcm1pb3MgJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLAogCQkJdHR5LT5kcml2ZXItPm5hbWUgKTsKIAkKLQkvKiBqdXN0IHJldHVybiBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpCi0JICAgICYmIChSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpIAotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCSAgcmV0dXJuOwotCiAJbWdzbF9jaGFuZ2VfcGFyYW1zKGluZm8pOwogCiAJLyogSGFuZGxlIHRyYW5zaXRpb24gdG8gQjAgc3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCmluZGV4IDAyYjQ5YmMuLjQyOGI1MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCkBAIC0xNDQsOCArMTQ0LDYgQEAKIC8qCiAgKiB0dHkgc3VwcG9ydCBhbmQgY2FsbGJhY2tzCiAgKi8KLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CiAKIHN0YXRpYyBpbnQgIG9wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKQEAgLTgyMywxMiArODIxLDYgQEAKIAogCURCR0lORk8oKCIlcyBzZXRfdGVybWlvc1xuIiwgdHR5LT5kcml2ZXItPm5hbWUpKTsKIAotCS8qIGp1c3QgcmV0dXJuIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQgKi8KLQlpZiAoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkgICAgJiYgKFJFTEVWQU5UX0lGTEFHKHR0eS0+dGVybWlvcy0+Y19pZmxhZykKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkJcmV0dXJuOwotCiAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKIAogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKaW5kZXggZWY5M2QwNS4uYTY1NDA3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCkBAIC0xMzUsOCArMTM1LDYgQEAKIAogI2RlZmluZSBJT19QSU5fU0hVVERPV05fTElNSVQgMTAwCiAKLSNkZWZpbmUgUkVMRVZBTlRfSUZMQUcoaWZsYWcpIChpZmxhZyAmIChJR05CUkt8QlJLSU5UfElHTlBBUnxQQVJNUkt8SU5QQ0spKQotCiBzdHJ1Y3QJX2lucHV0X3NpZ25hbF9ldmVudHMgewogCWludAlyaV91cDsKIAlpbnQJcmlfZG93bjsKQEAgLTkyNywxMiArOTI1LDYgQEAKIAkJcHJpbnRrKCIlcyglZCk6JXMgc2V0X3Rlcm1pb3MoKVxuIiwgX19GSUxFX18sX19MSU5FX18sCiAJCQl0dHktPmRyaXZlci0+bmFtZSApOwogCi0JLyoganVzdCByZXR1cm4gaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLwotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKQotCQk9PSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKQotCSAgcmV0dXJuOwotCiAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKIAogCS8qIEhhbmRsZSB0cmFuc2l0aW9uIHRvIEIwIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCmluZGV4IGRjNGUxZmYuLjhmM2Y3NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKQEAgLTIsMTEgKzIsOSBAQAogIyBUUE0gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiVFBNIGRldmljZXMiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFRDR19UUE0KK21lbnVjb25maWcgVENHX1RQTQogCXRyaXN0YXRlICJUUE0gSGFyZHdhcmUgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBpbiB5b3VyIHN5c3RlbSwgd2hpY2gKQEAgLTIxLDkgKzE5LDExIEBACiAJICBOb3RlOiBGb3IgbW9yZSBUUE0gZHJpdmVycyBlbmFibGUgQ09ORklHX1BOUCwgQ09ORklHX0FDUEkKIAkgIGFuZCBDT05GSUdfUE5QQUNQSS4KIAoraWYgVENHX1RQTQorCiBjb25maWcgVENHX1RJUwogCXRyaXN0YXRlICJUUE0gSW50ZXJmYWNlIFNwZWNpZmljYXRpb24gMS4yIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFRDR19UUE0gJiYgUE5QQUNQSQorCWRlcGVuZHMgb24gUE5QQUNQSQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgdGhhdCBpcyBjb21wbGlhbnQgd2l0aCB0aGUKIAkgIFRDRyBUSVMgMS4yIFRQTSBzcGVjaWZpY2F0aW9uIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZQpAQCAtMzIsNyArMzIsNyBAQAogCiBjb25maWcgVENHX05TQwogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFRQTSBJbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBUQ0dfVFBNICYmIFBOUEFDUEkKKwlkZXBlbmRzIG9uIFBOUEFDUEkKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGZyb20gTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAKIAkgIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZSBmcm9tIHdpdGhpbiBMaW51eC4gIFRvIApAQCAtNDEsNyArNDEsNiBAQAogCiBjb25maWcgVENHX0FUTUVMCiAJdHJpc3RhdGUgIkF0bWVsIFRQTSBJbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBUQ0dfVFBNCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBUUE0gc2VjdXJpdHkgY2hpcCBmcm9tIEF0bWVsIHNheSBZZXMgYW5kIGl0IAogCSAgd2lsbCBiZSBhY2Nlc3NpYmxlIGZyb20gd2l0aGluIExpbnV4LiAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciAKQEAgLTQ5LDcgKzQ4LDcgQEAKIAogY29uZmlnIFRDR19JTkZJTkVPTgogCXRyaXN0YXRlICJJbmZpbmVvbiBUZWNobm9sb2dpZXMgVFBNIEludGVyZmFjZSIKLQlkZXBlbmRzIG9uIFRDR19UUE0gJiYgUE5QQUNQSQorCWRlcGVuZHMgb24gUE5QQUNQSQogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgZnJvbSBJbmZpbmVvbiBUZWNobm9sb2dpZXMKIAkgIChlaXRoZXIgU0xEIDk2MzAgVFQgMS4xIG9yIFNMQiA5NjM1IFRUIDEuMikgc2F5IFllcyBhbmQgaXQKQEAgLTU5LDUgKzU4LDQgQEAKIAkgIEZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIgYW5kIHRoZSBzdXBwb3J0ZWQgaGFyZHdhcmUKIAkgIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LnByb3NlYy5ydWIuZGUvdHBtCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBUQ0dfVFBNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMgYi9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMjAxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENyZWF0aW5nIGF1ZGl0IGV2ZW50cyBmcm9tIFRUWSBpbnB1dC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgY29weXJpZ2h0ZWQKKyAqIG1hdGVyaWFsIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFueW9uZSB3aXNoaW5nIHRvIHVzZSwgbW9kaWZ5LCBjb3B5LCBvcgorICogcmVkaXN0cmlidXRlIGl0IHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2Ugdi4yLgorICoKKyAqIEF1dGhvcnM6IE1pbG9zbGF2IFRybWFjIDxtaXRyQHJlZGhhdC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorCitzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiB7CisJYXRvbWljX3QgY291bnQ7CisJc3RydWN0IG11dGV4IG11dGV4OwkvKiBQcm90ZWN0cyBhbGwgZGF0YSBiZWxvdyAqLworCWludCBtYWpvciwgbWlub3I7CS8qIFRoZSBUVFkgd2hpY2ggdGhlIGRhdGEgaXMgZnJvbSAqLworCXVuc2lnbmVkIGljYW5vbjoxOworCXNpemVfdCB2YWxpZDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBBbGxvY2F0ZWQgc2l6ZSBOX1RUWV9CVUZfU0laRSAqLworfTsKKworc3RhdGljIHN0cnVjdCB0dHlfYXVkaXRfYnVmICp0dHlfYXVkaXRfYnVmX2FsbG9jKGludCBtYWpvciwgaW50IG1pbm9yLAorCQkJCQkJIGludCBpY2Fub24pCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mICgqYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCWdvdG8gZXJyOworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCWJ1Zi0+ZGF0YSA9IGttYWxsb2MoTl9UVFlfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWVsc2UKKwkJYnVmLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYtPmRhdGEpCisJCWdvdG8gZXJyX2J1ZjsKKwlhdG9taWNfc2V0KCZidWYtPmNvdW50LCAxKTsKKwltdXRleF9pbml0KCZidWYtPm11dGV4KTsKKwlidWYtPm1ham9yID0gbWFqb3I7CisJYnVmLT5taW5vciA9IG1pbm9yOworCWJ1Zi0+aWNhbm9uID0gaWNhbm9uOworCWJ1Zi0+dmFsaWQgPSAwOworCXJldHVybiBidWY7CisKK2Vycl9idWY6CisJa2ZyZWUoYnVmKTsKK2VycjoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9mcmVlKHN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYpCit7CisJV0FSTl9PTihidWYtPnZhbGlkICE9IDApOworCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCisJCWtmcmVlKGJ1Zi0+ZGF0YSk7CisJZWxzZQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmLT5kYXRhKTsKKwlrZnJlZShidWYpOworfQorCitzdGF0aWMgdm9pZCB0dHlfYXVkaXRfYnVmX3B1dChzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZidWYtPmNvdW50KSkKKwkJdHR5X2F1ZGl0X2J1Zl9mcmVlKGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2J1Zl9wdXNoCS0JUHVzaCBidWZmZXJlZCBkYXRhIG91dAorICoKKyAqCUdlbmVyYXRlIGFuIGF1ZGl0IG1lc3NhZ2UgZnJvbSB0aGUgY29udGVudHMgb2YgQGJ1Ziwgd2hpY2ggaXMgb3duZWQgYnkKKyAqCUB0c2sgd2l0aCBAbG9naW51aWQuICBAYnVmLT5tdXRleCBtdXN0IGJlIGxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9wdXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1aWRfdCBsb2dpbnVpZCwKKwkJCSAgICAgICBzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCXN0cnVjdCBhdWRpdF9idWZmZXIgKmFiOworCisJaWYgKGJ1Zi0+dmFsaWQgPT0gMCkKKwkJcmV0dXJuOworCWlmIChhdWRpdF9lbmFibGVkID09IDApCisJCXJldHVybjsKKwlhYiA9IGF1ZGl0X2xvZ19zdGFydChOVUxMLCBHRlBfS0VSTkVMLCBBVURJVF9UVFkpOworCWlmIChhYikgeworCQljaGFyIG5hbWVbc2l6ZW9mKHRzay0+Y29tbSldOworCisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJ0dHkgcGlkPSV1IHVpZD0ldSBhdWlkPSV1IG1ham9yPSVkICIKKwkJCQkgIm1pbm9yPSVkIGNvbW09IiwgdHNrLT5waWQsIHRzay0+dWlkLAorCQkJCSBsb2dpbnVpZCwgYnVmLT5tYWpvciwgYnVmLT5taW5vcik7CisJCWdldF90YXNrX2NvbW0obmFtZSwgdHNrKTsKKwkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgbmFtZSk7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgZGF0YT0iKTsKKwkJYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGFiLCBidWYtPnZhbGlkLCBidWYtPmRhdGEpOworCQlhdWRpdF9sb2dfZW5kKGFiKTsKKwl9CisJYnVmLT52YWxpZCA9IDA7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQJLQlQdXNoIGJ1ZmZlcmVkIGRhdGEgb3V0CisgKgorICoJR2VuZXJhdGUgYW4gYXVkaXQgbWVzc2FnZSBmcm9tIHRoZSBjb250ZW50cyBvZiBAYnVmLCB3aGljaCBpcyBvd25lZCBieQorICoJdGhlIGN1cnJlbnQgdGFzay4gIEBidWYtPm11dGV4IG11c3QgYmUgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCB0dHlfYXVkaXRfYnVmX3B1c2hfY3VycmVudChzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmKQoreworCXR0eV9hdWRpdF9idWZfcHVzaChjdXJyZW50LCBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudC0+YXVkaXRfY29udGV4dCksCisJCQkgICBidWYpOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9leGl0CS0JSGFuZGxlIGEgdGFzayBleGl0CisgKgorICoJTWFrZSBzdXJlIGFsbCBidWZmZXJlZCBkYXRhIGlzIHdyaXR0ZW4gb3V0IGFuZCBkZWFsbG9jYXRlIHRoZSBidWZmZXIuCisgKglPbmx5IG5lZWRzIHRvIGJlIGNhbGxlZCBpZiBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWYgIT0gJU5VTEwuCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgdHR5X2F1ZGl0X2J1ZiAqYnVmOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJYnVmID0gY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmOworCWN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYnVmLT5tdXRleCk7CisJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoYnVmKTsKKwltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCisJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfZm9yawktCUNvcHkgVFRZIGF1ZGl0IHN0YXRlIGZvciBhIG5ldyB0YXNrCisgKgorICoJU2V0IHVwIFRUWSBhdWRpdCBzdGF0ZSBpbiBAc2lnIGZyb20gY3VycmVudC4gIEBzaWcgbmVlZHMgbm8gbG9ja2luZy4KKyAqLwordm9pZCB0dHlfYXVkaXRfZm9yayhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoreworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNpZy0+YXVkaXRfdHR5ID0gY3VycmVudC0+c2lnbmFsLT5hdWRpdF90dHk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWctPnR0eV9hdWRpdF9idWYgPSBOVUxMOworfQorCisvKioKKyAqCXR0eV9hdWRpdF9wdXNoX3Rhc2sJLQlGbHVzaCB0YXNrJ3MgcGVuZGluZyBhdWRpdCBkYXRhCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X3B1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJYnVmID0gdHNrLT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJaWYgKGJ1ZikKKwkJYXRvbWljX2luYygmYnVmLT5jb3VudCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZidWYtPm11dGV4KTsKKwl0dHlfYXVkaXRfYnVmX3B1c2godHNrLCBsb2dpbnVpZCwgYnVmKTsKKwltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCisJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfYnVmX2dldAktCUdldCBhbiBhdWRpdCBidWZmZXIuCisgKgorICoJR2V0IGFuIGF1ZGl0IGJ1ZmZlciBmb3IgQHR0eSwgYWxsb2NhdGUgaXQgaWYgbmVjZXNzYXJ5LiAgUmV0dXJuICVOVUxMCisgKglpZiBUVFkgYXVkaXRpbmcgaXMgZGlzYWJsZWQgb3Igb3V0IG9mIG1lbW9yeS4gIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV3CisgKglyZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHN0cnVjdCB0dHlfYXVkaXRfYnVmICp0dHlfYXVkaXRfYnVmX2dldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYsICpidWYyOworCisJYnVmID0gTlVMTDsKKwlidWYyID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAobGlrZWx5KCFjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSkpCisJCWdvdG8gb3V0OworCWJ1ZiA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwlpZiAoYnVmKSB7CisJCWF0b21pY19pbmMoJmJ1Zi0+Y291bnQpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWJ1ZjIgPSB0dHlfYXVkaXRfYnVmX2FsbG9jKHR0eS0+ZHJpdmVyLT5tYWpvciwKKwkJCQkgICB0dHktPmRyaXZlci0+bWlub3Jfc3RhcnQgKyB0dHktPmluZGV4LAorCQkJCSAgIHR0eS0+aWNhbm9uKTsKKwlpZiAoYnVmMiA9PSBOVUxMKSB7CisJCWF1ZGl0X2xvZ19sb3N0KCJvdXQgb2YgbWVtb3J5IGluIFRUWSBhdWRpdGluZyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoIWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5KQorCQlnb3RvIG91dDsKKwlidWYgPSBjdXJyZW50LT5zaWduYWwtPnR0eV9hdWRpdF9idWY7CisJaWYgKCFidWYpIHsKKwkJY3VycmVudC0+c2lnbmFsLT50dHlfYXVkaXRfYnVmID0gYnVmMjsKKwkJYnVmID0gYnVmMjsKKwkJYnVmMiA9IE5VTEw7CisJfQorCWF0b21pY19pbmMoJmJ1Zi0+Y291bnQpOworCS8qIEZhbGwgdGhyb3VnaCAqLworIG91dDoKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChidWYyKQorCQl0dHlfYXVkaXRfYnVmX2ZyZWUoYnVmMik7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKgl0dHlfYXVkaXRfYWRkX2RhdGEJLQlBZGQgZGF0YSBmb3IgVFRZIGF1ZGl0aW5nLgorICoKKyAqCUF1ZGl0IEBkYXRhIG9mIEBzaXplIGZyb20gQHR0eSwgaWYgbmVjZXNzYXJ5LgorICovCit2b2lkIHR0eV9hdWRpdF9hZGRfZGF0YShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKwlpbnQgbWFqb3IsIG1pbm9yOworCisJaWYgKHVubGlrZWx5KHNpemUgPT0gMCkpCisJCXJldHVybjsKKworCWJ1ZiA9IHR0eV9hdWRpdF9idWZfZ2V0KHR0eSk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmJ1Zi0+bXV0ZXgpOworCW1ham9yID0gdHR5LT5kcml2ZXItPm1ham9yOworCW1pbm9yID0gdHR5LT5kcml2ZXItPm1pbm9yX3N0YXJ0ICsgdHR5LT5pbmRleDsKKwlpZiAoYnVmLT5tYWpvciAhPSBtYWpvciB8fCBidWYtPm1pbm9yICE9IG1pbm9yCisJICAgIHx8IGJ1Zi0+aWNhbm9uICE9IHR0eS0+aWNhbm9uKSB7CisJCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KGJ1Zik7CisJCWJ1Zi0+bWFqb3IgPSBtYWpvcjsKKwkJYnVmLT5taW5vciA9IG1pbm9yOworCQlidWYtPmljYW5vbiA9IHR0eS0+aWNhbm9uOworCX0KKwlkbyB7CisJCXNpemVfdCBydW47CisKKwkJcnVuID0gTl9UVFlfQlVGX1NJWkUgLSBidWYtPnZhbGlkOworCQlpZiAocnVuID4gc2l6ZSkKKwkJCXJ1biA9IHNpemU7CisJCW1lbWNweShidWYtPmRhdGEgKyBidWYtPnZhbGlkLCBkYXRhLCBydW4pOworCQlidWYtPnZhbGlkICs9IHJ1bjsKKwkJZGF0YSArPSBydW47CisJCXNpemUgLT0gcnVuOworCQlpZiAoYnVmLT52YWxpZCA9PSBOX1RUWV9CVUZfU0laRSkKKwkJCXR0eV9hdWRpdF9idWZfcHVzaF9jdXJyZW50KGJ1Zik7CisJfSB3aGlsZSAoc2l6ZSAhPSAwKTsKKwltdXRleF91bmxvY2soJmJ1Zi0+bXV0ZXgpOworCXR0eV9hdWRpdF9idWZfcHV0KGJ1Zik7Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X3B1c2gJLQlQdXNoIGJ1ZmZlcmVkIGRhdGEgb3V0CisgKgorICoJTWFrZSBzdXJlIG5vIGF1ZGl0IGRhdGEgaXMgcGVuZGluZyBmb3IgQHR0eSBvbiB0aGUgY3VycmVudCBwcm9jZXNzLgorICovCit2b2lkIHR0eV9hdWRpdF9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKmJ1ZjsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChsaWtlbHkoIWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5KSkgeworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlyZXR1cm47CisJfQorCWJ1ZiA9IGN1cnJlbnQtPnNpZ25hbC0+dHR5X2F1ZGl0X2J1ZjsKKwlpZiAoYnVmKQorCQlhdG9taWNfaW5jKCZidWYtPmNvdW50KTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKGJ1ZikgeworCQlpbnQgbWFqb3IsIG1pbm9yOworCisJCW1ham9yID0gdHR5LT5kcml2ZXItPm1ham9yOworCQltaW5vciA9IHR0eS0+ZHJpdmVyLT5taW5vcl9zdGFydCArIHR0eS0+aW5kZXg7CisJCW11dGV4X2xvY2soJmJ1Zi0+bXV0ZXgpOworCQlpZiAoYnVmLT5tYWpvciA9PSBtYWpvciAmJiBidWYtPm1pbm9yID09IG1pbm9yKQorCQkJdHR5X2F1ZGl0X2J1Zl9wdXNoX2N1cnJlbnQoYnVmKTsKKwkJbXV0ZXhfdW5sb2NrKCZidWYtPm11dGV4KTsKKwkJdHR5X2F1ZGl0X2J1Zl9wdXQoYnVmKTsKKwl9Cit9CisKKy8qKgorICoJdHR5X2F1ZGl0X29wZW5pbmcJLQlBIFRUWSBpcyBiZWluZyBvcGVuZWQuCisgKgorICoJQXMgYSBzcGVjaWFsIGhhY2ssIHRhc2tzIHRoYXQgY2xvc2UgYWxsIHRoZWlyIFRUWXMgYW5kIG9wZW4gbmV3IG9uZXMKKyAqCWFyZSBhc3N1bWVkIHRvIGJlIHN5c3RlbSBkYWVtb25zIChlLmcuIGdldHR5KSBhbmQgYXVkaXRpbmcgaXMKKyAqCWF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgZm9yIHRoZW0uCisgKi8KK3ZvaWQgdHR5X2F1ZGl0X29wZW5pbmcodm9pZCkKK3sKKwlpbnQgZGlzYWJsZTsKKworCWRpc2FibGUgPSAxOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChjdXJyZW50LT5zaWduYWwtPmF1ZGl0X3R0eSA9PSAwKQorCQlkaXNhYmxlID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghZGlzYWJsZSkKKwkJcmV0dXJuOworCisJdGFza19sb2NrKGN1cnJlbnQpOworCWlmIChjdXJyZW50LT5maWxlcykgeworCQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OworCQl1bnNpZ25lZCBpOworCisJCS8qCisJCSAqIFdlIGRvbid0IHRha2UgYSByZWYgdG8gdGhlIGZpbGUsIHNvIHdlIG11c3QgaG9sZCAtPmZpbGVfbG9jaworCQkgKiBpbnN0ZWFkLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKwkJZmR0ID0gZmlsZXNfZmR0YWJsZShjdXJyZW50LT5maWxlcyk7CisJCWZvciAoaSA9IDA7IGkgPCBmZHQtPm1heF9mZHM7IGkrKykgeworCQkJc3RydWN0IGZpbGUgKmZpbHA7CisKKwkJCWZpbHAgPSBmY2hlY2tfZmlsZXMoY3VycmVudC0+ZmlsZXMsIGkpOworCQkJaWYgKGZpbHAgJiYgaXNfdHR5KGZpbHApKSB7CisJCQkJZGlzYWJsZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJmN1cnJlbnQtPmZpbGVzLT5maWxlX2xvY2spOworCX0KKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwlpZiAoIWRpc2FibGUpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNpZ25hbC0+YXVkaXRfdHR5ID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pby5jIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCmluZGV4IGE5NmYyNmEuLmRlMzdlYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW8uYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKQEAgLTE1MDMsNiArMTUwMywxNSBAQAogCiBFWFBPUlRfU1lNQk9MKHR0eV9odW5nX3VwX3ApOwogCisvKioKKyAqIGlzX3R0eQktCWNoZWNrZXIgd2hldGhlciBmaWxlIGlzIGEgVFRZCisgKi8KK2ludCBpc190dHkoc3RydWN0IGZpbGUgKmZpbHApCit7CisJcmV0dXJuIGZpbHAtPmZfb3AtPnJlYWQgPT0gdHR5X3JlYWQKKwkJfHwgZmlscC0+Zl9vcC0+cmVhZCA9PSBodW5nX3VwX3R0eV9yZWFkOworfQorCiBzdGF0aWMgdm9pZCBzZXNzaW9uX2NsZWFyX3R0eShzdHJ1Y3QgcGlkICpzZXNzaW9uKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKQEAgLTE3MjYsNiArMTczNSwyMyBAQAogCXJldHVybiBpOwogfQogCit2b2lkIHR0eV93cml0ZV91bmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT53cml0ZV93YWl0KTsKK30KKworaW50IHR0eV93cml0ZV9sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBuZGVsYXkpCit7CisJaWYgKCFtdXRleF90cnlsb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkgeworCQlpZiAobmRlbGF5KQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBTcGxpdCB3cml0ZXMgdXAgaW4gc2FuZSBibG9ja3NpemVzIHRvIGF2b2lkCiAgKiBkZW5pYWwtb2Ytc2VydmljZSB0eXBlIGF0dGFja3MKQEAgLTE3MzcsMTMgKzE3NjMsMTIgQEAKIAljb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCXNpemVfdCBjb3VudCkKIHsKLQlzc2l6ZV90IHJldCA9IDAsIHdyaXR0ZW4gPSAwOworCXNzaXplX3QgcmV0LCB3cml0dGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgY2h1bms7CiAJCi0JLyogRklYTUU6IE9fTkRFTEFZIC4uLiAqLwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKSB7Ci0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JfQorCXJldCA9IHR0eV93cml0ZV9sb2NrKHR0eSwgZmlsZS0+Zl9mbGFncyAmIE9fTkRFTEFZKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qCiAJICogV2UgY2h1bmsgdXAgd3JpdGVzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzCkBAIC0xNzc2LDggKzE4MDEsOCBAQAogCiAJCWJ1ZiA9IGttYWxsb2MoY2h1bmssIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZikgewotCQkJbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCWtmcmVlKHR0eS0+d3JpdGVfYnVmKTsKIAkJdHR5LT53cml0ZV9jbnQgPSBjaHVuazsKQEAgLTE4MTIsNyArMTgzNyw4IEBACiAJCWlub2RlLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKIAkJcmV0ID0gd3JpdHRlbjsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKK291dDoKKwl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjAxNiwxMSArMjA0Miw5IEBACiAJfQogCiAJaWYgKCEqbHRwX2xvYykgewotCQlsdHAgPSAoc3RydWN0IGt0ZXJtaW9zICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksCi0JCQkJCQkgR0ZQX0tFUk5FTCk7CisJCWx0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQlpZiAoIWx0cCkKIAkJCWdvdG8gZnJlZV9tZW1fb3V0OwotCQltZW1zZXQobHRwLCAwLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAJfQogCiAJaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZKSB7CkBAIC0yMDQ5LDExICsyMDczLDkgQEAKIAkJfQogCiAJCWlmICghKm9fbHRwX2xvYykgewotCQkJb19sdHAgPSAoc3RydWN0IGt0ZXJtaW9zICopCi0JCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSwgR0ZQX0tFUk5FTCk7CisJCQlvX2x0cCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdGVybWlvcyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFvX2x0cCkKIAkJCQlnb3RvIGZyZWVfbWVtX291dDsKLQkJCW1lbXNldChvX2x0cCwgMCwgc2l6ZW9mKHN0cnVjdCBrdGVybWlvcykpOwogCQl9CiAKIAkJLyoKQEAgLTI2NjAsNiArMjY4Miw3IEBACiAJCV9fcHJvY19zZXRfdHR5KGN1cnJlbnQsIHR0eSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CisJdHR5X2F1ZGl0X29wZW5pbmcoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjcyMiw4ICsyNzQ1LDEwIEBACiAKIAljaGVja190dHlfY291bnQodHR5LCAidHR5X29wZW4iKTsKIAlyZXR2YWwgPSBwdG1fZHJpdmVyLT5vcGVuKHR0eSwgZmlscCk7Ci0JaWYgKCFyZXR2YWwpCisJaWYgKCFyZXR2YWwpIHsKKwkJdHR5X2F1ZGl0X29wZW5pbmcoKTsKIAkJcmV0dXJuIDA7CisJfQogb3V0MToKIAlyZWxlYXNlX2RldihmaWxwKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMzE2MywxNCArMzE4OCwxMyBAQAogCiBzdGF0aWMgaW50IHNlbmRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGR1cmF0aW9uKQogewotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spKQorCWlmICh0dHlfd3JpdGVfbG9jayh0dHksIDApIDwgMCkKIAkJcmV0dXJuIC1FSU5UUjsKIAl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgLTEpOwotCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwlpZiAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQltc2xlZXBfaW50ZXJydXB0aWJsZShkdXJhdGlvbik7Ci0JfQogCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAwKTsKLQltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOworCXR0eV93cml0ZV91bmxvY2sodHR5KTsKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCXJldHVybiAtRUlOVFI7CiAJcmV0dXJuIDA7CkBAIC0zNzM5LDkgKzM3NjMsOCBAQAogewogCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CiAKLQlkcml2ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlciksIEdGUF9LRVJORUwpOworCWRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRyaXZlcikgewotCQltZW1zZXQoZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKIAkJZHJpdmVyLT5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7CiAJCWRyaXZlci0+bnVtID0gbGluZXM7CiAJCS8qIGxhdGVyIHdlJ2xsIG1vdmUgYWxsb2NhdGlvbiBvZiB0YWJsZXMgaGVyZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IGZkNDcxY2IuLjM0MjNlOWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCkBAIC01Miw4ICs1Miw2IEBACiAKIHZvaWQgdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgbG9uZyB0aW1lb3V0KQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCiAjaWZkZWYgVFRZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAogCWNoYXIgYnVmWzY0XTsKIAkKQEAgLTYxLDI2ICs1OSwxMyBAQAogI2VuZGlmCiAJaWYgKCF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKQogCQlyZXR1cm47Ci0JYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwogCWlmICghdGltZW91dCkKIAkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCWRvIHsKLSNpZmRlZiBUVFlfREVCVUdfV0FJVF9VTlRJTF9TRU5UCi0JCXByaW50ayhLRVJOX0RFQlVHICJ3YWl0aW5nICVzLi4uKCVkKVxuIiwgdHR5X25hbWUodHR5LCBidWYpLAotCQkgICAgICAgdHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlnb3RvIHN0b3Bfd2FpdGluZzsKLQkJaWYgKCF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkpCi0JCQlicmVhazsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JfSB3aGlsZSAodGltZW91dCk7CisJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHR0eS0+d3JpdGVfd2FpdCwKKwkJCSF0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSksIHRpbWVvdXQpKQorCQlyZXR1cm47CiAJaWYgKHR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQpCiAJCXR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQodHR5LCB0aW1lb3V0KTsKLXN0b3Bfd2FpdGluZzoKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKIH0KIAogRVhQT1JUX1NZTUJPTCh0dHlfd2FpdF91bnRpbF9zZW50KTsKQEAgLTI3NiwxMyArMjYxLDEyIEBACiAJCQkJdGVybWlvcy0+Y19jZmxhZyB8PSAoYmF1ZF9iaXRzW2ldIDw8IElCU0hJRlQpOwogCQkJaWZvdW5kID0gaTsKIAkJfQotCX0KLQl3aGlsZSgrK2kgPCBuX2JhdWRfdGFibGUpOworCX0gd2hpbGUgKCsraSA8IG5fYmF1ZF90YWJsZSk7CiAJaWYgKG9mb3VuZCA9PSAtMSkKIAkJdGVybWlvcy0+Y19jZmxhZyB8PSBCT1RIRVI7CiAJLyogU2V0IGV4YWN0IGlucHV0IGJpdHMgb25seSBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkaWZmZXIgb3IgdGhlCiAJICAgdXNlciBhbHJlYWR5IGRpZCAqLwotCWlmIChpZm91bmQgPT0gLTEgJiYgKGliYXVkICE9IG9iYXVkICB8fCBpYmlucHV0KSkKKwlpZiAoaWZvdW5kID09IC0xICYmIChpYmF1ZCAhPSBvYmF1ZCB8fCBpYmlucHV0KSkKIAkJdGVybWlvcy0+Y19jZmxhZyB8PSAoQk9USEVSIDw8IElCU0hJRlQpOwogfQogCkBAIC01NzUsNyArNTU5LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltdXRleF9sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwotCXRlcm1pb3MgPSAgKnR0eS0+dGVybWlvczsKKwl0ZXJtaW9zID0gKnR0eS0+dGVybWlvczsKIAl0ZXJtaW9zLmNfY2NbVkVSQVNFXSA9IHRtcC5zZ19lcmFzZTsKIAl0ZXJtaW9zLmNfY2NbVktJTExdID0gdG1wLnNnX2tpbGw7CiAJc2V0X3NnZmxhZ3MoJnRlcm1pb3MsIHRtcC5zZ19mbGFncyk7CkBAIC02NjcsNyArNjUxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpCisJaWYgKHR0eV93cml0ZV9sb2NrKHR0eSwgMCkgPCAwKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKHdhc19zdG9wcGVkKQpAQCAtNjc1LDcgKzY1OSw3IEBACiAJdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgJmNoLCAxKTsKIAlpZiAod2FzX3N0b3BwZWQpCiAJCXN0b3BfdHR5KHR0eSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKTsKKwl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMgYi9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCmluZGV4IDEzZmFmOGQuLmRiNTcyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92aW90YXBlLmMKKysrIGIvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYwpAQCAtODczLDEyICs4NzMsMTIgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aW90YXBfZm9wcyA9IHsKLQlvd25lcjogVEhJU19NT0RVTEUsCi0JcmVhZDogdmlvdGFwX3JlYWQsCi0Jd3JpdGU6IHZpb3RhcF93cml0ZSwKLQlpb2N0bDogdmlvdGFwX2lvY3RsLAotCW9wZW46IHZpb3RhcF9vcGVuLAotCXJlbGVhc2U6IHZpb3RhcF9yZWxlYXNlLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkID0JCXZpb3RhcF9yZWFkLAorCS53cml0ZSA9CXZpb3RhcF93cml0ZSwKKwkuaW9jdGwgPQl2aW90YXBfaW9jdGwsCisJLm9wZW4gPQkJdmlvdGFwX29wZW4sCisJLnJlbGVhc2UgPQl2aW90YXBfcmVsZWFzZSwKIH07CiAKIC8qIEhhbmRsZSBpbnRlcnJ1cHQgZXZlbnRzIGZvciB0YXBlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdnQuYyBiL2RyaXZlcnMvY2hhci92dC5jCmluZGV4IDY2NTBhZTEuLmVkYjcwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92dC5jCisrKyBiL2RyaXZlcnMvY2hhci92dC5jCkBAIC03MjksMTAgKzcyOSw5IEBACiAJICAgIC8qIGFsdGhvdWdoIHRoZSBudW1iZXJzIGFib3ZlIGFyZSBub3QgdmFsaWQgc2luY2UgbG9uZyBhZ28sIHRoZQogCSAgICAgICBwb2ludCBpcyBzdGlsbCB1cC10by1kYXRlIGFuZCB0aGUgY29tbWVudCBzdGlsbCBoYXMgaXRzIHZhbHVlCiAJICAgICAgIGV2ZW4gaWYgb25seSBhcyBhIGhpc3RvcmljYWwgYXJ0aWZhY3QuICAtLW1qLCBKdWx5IDE5OTggKi8KLQkgICAgdmMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmNfZGF0YSksIEdGUF9LRVJORUwpOworCSAgICB2YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJICAgIGlmICghdmMpCiAJCXJldHVybiAtRU5PTUVNOwotCSAgICBtZW1zZXQodmMsIDAsIHNpemVvZigqdmMpKTsKIAkgICAgdmNfY29uc1tjdXJyY29uc10uZCA9IHZjOwogCSAgICBJTklUX1dPUksoJnZjX2NvbnNbY3VycmNvbnNdLlNBS193b3JrLCB2Y19TQUspOwogCSAgICB2aXN1YWxfaW5pdCh2YywgY3VycmNvbnMsIDEpOwpAQCAtMTk5MSw4ICsxOTkwLDcgQEAKIAkJeyAweEZFMTAsIDB4RkUxOSB9LCB7IDB4RkUzMCwgMHhGRTZGIH0sIHsgMHhGRjAwLCAweEZGNjAgfSwKIAkJeyAweEZGRTAsIDB4RkZFNiB9LCB7IDB4MjAwMDAsIDB4MkZGRkQgfSwgeyAweDMwMDAwLCAweDNGRkZEIH0KIAl9OwotCXJldHVybiBiaXNlYXJjaCh1Y3MsIGRvdWJsZV93aWR0aCwKLQkJc2l6ZW9mKGRvdWJsZV93aWR0aCkgLyBzaXplb2YoKmRvdWJsZV93aWR0aCkgLSAxKTsKKwlyZXR1cm4gYmlzZWFyY2godWNzLCBkb3VibGVfd2lkdGgsIEFSUkFZX1NJWkUoZG91YmxlX3dpZHRoKSAtIDEpOwogfQogCiAvKiBhY3F1aXJlcyBjb25zb2xlX3NlbSAqLwpAQCAtMjk4OSw4ICsyOTg3LDI0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCB1bmJpbmRfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwKLQkJCSAgICAgaW50IGRlZmx0KQorLyoqCisgKiB1bmJpbmRfY29uX2RyaXZlciAtIHVuYmluZCBhIGNvbnNvbGUgZHJpdmVyCisgKiBAY3N3OiBwb2ludGVyIHRvIGNvbnNvbGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKKyAqIEBmaXJzdDogZmlyc3QgaW4gcmFuZ2Ugb2YgY29uc29sZXMgdGhhdCBAY3N3IHNob3VsZCBiZSB1bmJvdW5kIGZyb20KKyAqIEBsYXN0OiBsYXN0IGluIHJhbmdlIG9mIGNvbnNvbGVzIHRoYXQgQGNzdyBzaG91bGQgYmUgdW5ib3VuZCBmcm9tCisgKiBAZGVmbHQ6IHNob3VsZCBuZXh0IGJvdW5kIGNvbnNvbGUgZHJpdmVyIGJlIGRlZmF1bHQgYWZ0ZXIgQGNzdyBpcyB1bmJvdW5kPworICoKKyAqIFRvIHVuYmluZCBhIGRyaXZlciBmcm9tIGFsbCBwb3NzaWJsZSBjb25zb2xlcywgcGFzcyAwIGFzIEBmaXJzdCBhbmQKKyAqICVNQVhfTlJfQ09OU09MRVMgYXMgQGxhc3QuCisgKgorICogQGRlZmx0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbnNvbGUgdGhhdCBlbmRzIHVwIHJlcGxhY2luZyBAY3N3IHNob3VsZCBiZQorICogdGhlIGRlZmF1bHQgY29uc29sZS4KKyAqCisgKiBSRVRVUk5TOgorICogLUVOT0RFViBpZiBAY3N3IGlzbid0IGEgcmVnaXN0ZXJlZCBjb25zb2xlIGRyaXZlciBvciBjYW4ndCBiZSB1bnJlZ2lzdGVyZWQKKyAqIG9yIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHVuYmluZF9jb25fZHJpdmVyKGNvbnN0IHN0cnVjdCBjb25zdyAqY3N3LCBpbnQgZmlyc3QsIGludCBsYXN0LCBpbnQgZGVmbHQpCiB7CiAJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBjc3ctPm93bmVyOwogCWNvbnN0IHN0cnVjdCBjb25zdyAqZGVmY3N3ID0gTlVMTDsKQEAgLTMwNzUsNiArMzA4OSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIAogfQorRVhQT1JUX1NZTUJPTCh1bmJpbmRfY29uX2RyaXZlcik7CiAKIHN0YXRpYyBpbnQgdnRfYmluZChzdHJ1Y3QgY29uX2RyaXZlciAqY29uKQogewpAQCAtMzQ5MSw5ICszNTA2LDYgQEAKIAkJfQogCQlyZXR1cm47CiAJfQotCWlmIChibGFua19zdGF0ZSAhPSBibGFua19ub3JtYWxfd2FpdCkKLQkJcmV0dXJuOwotCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOwogCiAJLyogZW50ZXJpbmcgZ3JhcGhpY3MgbW9kZT8gKi8KIAlpZiAoZW50ZXJpbmdfZ2Z4KSB7CkBAIC0zNTAxLDEwICszNTEzLDE1IEBACiAJCXNhdmVfc2NyZWVuKHZjKTsKIAkJdmMtPnZjX3N3LT5jb25fYmxhbmsodmMsIC0xLCAxKTsKIAkJY29uc29sZV9ibGFua2VkID0gZmdfY29uc29sZSArIDE7CisJCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOwogCQlzZXRfb3JpZ2luKHZjKTsKIAkJcmV0dXJuOwogCX0KIAorCWlmIChibGFua19zdGF0ZSAhPSBibGFua19ub3JtYWxfd2FpdCkKKwkJcmV0dXJuOworCWJsYW5rX3N0YXRlID0gYmxhbmtfb2ZmOworCiAJLyogZG9uJ3QgYmxhbmsgZ3JhcGhpY3MgKi8KIAlpZiAodmMtPnZjX21vZGUgIT0gS0RfVEVYVCkgewogCQljb25zb2xlX2JsYW5rZWQgPSBmZ19jb25zb2xlICsgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL0tjb25maWcgYi9kcml2ZXJzL2Nvbm5lY3Rvci9LY29uZmlnCmluZGV4IGUwYmRjMGQuLjEwMGJmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY29ubmVjdG9yL0tjb25maWcKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvS2NvbmZpZwpAQCAtMSw2ICsxLDUgQEAKLW1lbnUgIkNvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIiCiAKLWNvbmZpZyBDT05ORUNUT1IKK21lbnVjb25maWcgQ09OTkVDVE9SCiAJdHJpc3RhdGUgIkNvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIiCiAJZGVwZW5kcyBvbiBORVQKIAktLS1oZWxwLS0tCkBAIC0xMCw2ICs5LDggQEAKIAkgIENvbm5lY3RvciBzdXBwb3J0IGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGNuLmtvLgogCitpZiBDT05ORUNUT1IKKwogY29uZmlnIFBST0NfRVZFTlRTCiAJYm9vbGVhbiAiUmVwb3J0IHByb2Nlc3MgZXZlbnRzIHRvIHVzZXJzcGFjZSIKIAlkZXBlbmRzIG9uIENPTk5FQ1RPUj15CkBAIC0xOCw0ICsxOSw0IEBACiAJICBQcm92aWRlIGEgY29ubmVjdG9yIHRoYXQgcmVwb3J0cyBwcm9jZXNzIGV2ZW50cyB0byB1c2Vyc3BhY2UuIFNlbmQKIAkgIGV2ZW50cyBzdWNoIGFzIGZvcmssIGV4ZWMsIGlkIGNoYW5nZSAodWlkLCBnaWQsIHN1aWQsIGV0YyksIGFuZCBleGl0LgogCi1lbmRtZW51CitlbmRpZiAjIENPTk5FQ1RPUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKaW5kZXggYmI5MGNiZC4uODRlYmZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZworKysgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCkBAIC0xLDQgKzEsOSBAQAotbWVudSAiSGFyZHdhcmUgY3J5cHRvIGRldmljZXMiCisKK21lbnVjb25maWcgQ1JZUFRPX0hXCisJYm9vbCAiSGFyZHdhcmUgY3J5cHRvIGRldmljZXMiCisJZGVmYXVsdCB5CisKK2lmIENSWVBUT19IVwogCiBjb25maWcgQ1JZUFRPX0RFVl9QQURMT0NLCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFZJQSBQYWRMb2NrIEFDRSIKQEAgLTc4LDQgKzgzLDQgQEAKIAkgIHRoYXQgY29udGFpbnMgYWxsIHBhcnRzIG9mIHRoZSBjcnlwdG8gZGV2aWNlIGRyaXZlciAoYXAgYnVzLAogCSAgcmVxdWVzdCByb3V0ZXIgYW5kIGFsbCB0aGUgY2FyZCBkcml2ZXJzKS4KIAotZW5kbWVudQorZW5kaWYgIyBDUllQVE9fSFcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IGIzMTc1NmQuLjhmNjcwZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKIAogbWVudSAiRE1BIEVuZ2luZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIVMzOTAKKwlkZXBlbmRzIG9uIEhBU19ETUEKIAogY29uZmlnIERNQV9FTkdJTkUKIAlib29sICJTdXBwb3J0IGZvciBETUEgZW5naW5lcyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9LY29uZmlnIGIvZHJpdmVycy9lZGFjL0tjb25maWcKaW5kZXggODA3YzQwMi4uZGViZjFkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL0tjb25maWcKKysrIGIvZHJpdmVycy9lZGFjL0tjb25maWcKQEAgLTYsMTEgKzYsOSBAQAogIyAkSWQ6IEtjb25maWcsdiAxLjQuMi43IDIwMDUvMDcvMDggMjI6MDU6MzggZHNwX2xsbmwgRXhwICQKICMKIAotbWVudSAnRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpJworbWVudWNvbmZpZyBFREFDCisJdHJpc3RhdGUgIkVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgRURBQwotCXRyaXN0YXRlICJFREFDIGNvcmUgc3lzdGVtIGVycm9yIHJlcG9ydGluZyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIFg4NiAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBFREFDIGlzIGRlc2lnbmVkIHRvIHJlcG9ydCBlcnJvcnMgaW4gdGhlIGNvcmUgc3lzdGVtLgpAQCAtMzAsMTMgKzI4LDEyIEBACiAJICBUaGVyZSBpcyBhbHNvIGEgbWFpbGluZyBsaXN0IGZvciB0aGUgRURBQyBwcm9qZWN0LCB3aGljaCBjYW4KIAkgIGJlIGZvdW5kIHZpYSB0aGUgc291cmNlZm9yZ2UgcGFnZS4KIAoraWYgRURBQwogCiBjb21tZW50ICJSZXBvcnRpbmcgc3Vic3lzdGVtcyIKLQlkZXBlbmRzIG9uIEVEQUMKIAogY29uZmlnIEVEQUNfREVCVUcKIAlib29sICJEZWJ1Z2dpbmciCi0JZGVwZW5kcyBvbiBFREFDCiAJaGVscAogCSAgVGhpcyB0dXJucyBvbiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpcmUgRURBQwogCSAgc3ViLXN5c3RlbS4gWW91IGNhbiBpbnNlcnQgbW9kdWxlIHdpdGggImRlYnVnX2xldmVsPXgiLCBjdXJyZW50CkBAIC00NSw3ICs0Miw2IEBACiAKIGNvbmZpZyBFREFDX01NX0VEQUMKIAl0cmlzdGF0ZSAiTWFpbiBNZW1vcnkgRURBQyAoRXJyb3IgRGV0ZWN0aW9uIEFuZCBDb3JyZWN0aW9uKSByZXBvcnRpbmciCi0JZGVwZW5kcyBvbiBFREFDCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU29tZSBzeXN0ZW1zIGFyZSBhYmxlIHRvIGRldGVjdCBhbmQgY29ycmVjdCBlcnJvcnMgaW4gbWFpbgpAQCAtMTAwLDE1ICs5NiwxMyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIkVycm9yIGRldGVjdGluZyBtZXRob2QiCi0JZGVwZW5kcyBvbiBFREFDCiAJZGVmYXVsdCBFREFDX1BPTEwKIAogY29uZmlnIEVEQUNfUE9MTAogCWJvb2wgIlBvbGwgZm9yIGVycm9ycyIKLQlkZXBlbmRzIG9uIEVEQUMKIAloZWxwCiAJICBQb2xsIHRoZSBjaGlwc2V0IHBlcmlvZGljYWxseSB0byBkZXRlY3QgZXJyb3JzLgogCiBlbmRjaG9pY2UKIAotZW5kbWVudQorZW5kaWYgIyBFREFDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwppbmRleCA3YjYyMjMwLi44MDQ4NzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKQEAgLTE5MDYsNiArMTkwNiw3IEBACiAKIHN0YXRpYyBpbnQgZWRhY19rZXJuZWxfdGhyZWFkKHZvaWQgKmFyZykKIHsKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJZG9fZWRhY19jaGVjaygpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZGQuYwppbmRleCAxNTIzMjI3Li4wZmI3MzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VkZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWRkLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCXN0cnVjdCBlZGRfaW5mbyAqaW5mbyA9IGVkZF9kZXZfZ2V0X2luZm8oZWRldik7CiAKIAlpZiAoZWRkX2Rldl9pc190eXBlKGVkZXYsICJQQ0kiKSkgewotCQlyZXR1cm4gcGNpX2ZpbmRfc2xvdChpbmZvLT5wYXJhbXMuaW50ZXJmYWNlX3BhdGgucGNpLmJ1cywKKwkJcmV0dXJuIHBjaV9nZXRfYnVzX2FuZF9zbG90KGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuYnVzLAogCQkJCSAgICAgUENJX0RFVkZOKGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuc2xvdCwKIAkJCQkJICAgICAgIGluZm8tPnBhcmFtcy5pbnRlcmZhY2VfcGF0aC5wY2kuCiAJCQkJCSAgICAgICBmdW5jdGlvbikpOwpAQCAtNjgyLDkgKzY4MiwxMiBAQAogewogCiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBlZGRfZ2V0X3BjaV9kZXYoZWRldik7CisJaW50IHJldDsKIAlpZiAoIXBjaV9kZXYpCiAJCXJldHVybiAxOwotCXJldHVybiBzeXNmc19jcmVhdGVfbGluaygmZWRldi0+a29iaiwmcGNpX2Rldi0+ZGV2LmtvYmosInBjaV9kZXYiKTsKKwlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmZWRldi0+a29iaiwmcGNpX2Rldi0+ZGV2LmtvYmosInBjaV9kZXYiKTsKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jIGIvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMKaW5kZXggMmI0Yjc2ZS4uNThlOWY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxhc20vdmdhLmg+CiAjaW5jbHVkZSAicGNkcC5oIgogCkBAIC0yNyw3ICsyOCw3IEBACiAJY2hhciBwYXJpdHk7CiAKIAltbWlvID0gKHVhcnQtPmFkZHIuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSk7Ci0JcCArPSBzcHJpbnRmKHAsICJjb25zb2xlPXVhcnQsJXMsMHglbHgiLAorCXAgKz0gc3ByaW50ZihwLCAidWFydDgyNTAsJXMsMHglbHgiLAogCQltbWlvID8gIm1taW8iIDogImlvIiwgdWFydC0+YWRkci5hZGRyZXNzKTsKIAlpZiAodWFydC0+YmF1ZCkgewogCQlwICs9IHNwcmludGYocCwgIiwlbHUiLCB1YXJ0LT5iYXVkKTsKQEAgLTQxLDcgKzQyLDggQEAKIAkJfQogCX0KIAotCXJldHVybiBlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KG9wdGlvbnMpOworCWFkZF9wcmVmZXJyZWRfY29uc29sZSgidWFydCIsIDgyNTAsICZvcHRpb25zWzldKTsKKwlyZXR1cm4gc2V0dXBfZWFybHlfc2VyaWFsODI1MF9jb25zb2xlKG9wdGlvbnMpOwogI2Vsc2UKIAlyZXR1cm4gLUVOT0RFVjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTcwLmMgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwppbmRleCA3ZWFhZTM4Li4yNzVkMzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzAuYwpAQCAtOTYsNiArOTYsMTAgQEAKIAlzdHJ1Y3QgbG03MCAqcF9sbTcwOwogCWludCBzdGF0dXM7CiAKKwkvKiBzaWduYWxpbmcgaXMgU1BJX01PREVfMCBvbiBhIDMtd2lyZSBsaW5rIChzaGFyZWQgU0kvU08pICovCisJaWYgKChzcGktPm1vZGUgJiAoU1BJX0NQT0x8U1BJX0NQSEEpKSB8fCAhKHNwaS0+bW9kZSAmIFNQSV8zV0lSRSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJcF9sbTcwID0ga3phbGxvYyhzaXplb2YgKnBfbG03MCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX2xtNzApCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKaW5kZXggMDMxODhkMi4uMTdjZWNmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCkBAIC02MzAsNyArNjMwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBtY21zcHR3aV9kcml2ZXIgPSB7CiAJLnByb2JlICA9IHBtY21zcHR3aV9wcm9iZSwKIAkucmVtb3ZlCT0gX19kZXZleGl0X3AocG1jbXNwdHdpX3JlbW92ZSksCi0JLmRyaXZlciB7CisJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSBEUlZfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcgYi9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCmluZGV4IDM5NDRlODguLjJlMWMyNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMTUzLDQgKzE1MywxNCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgdHNsMjU1MC4KIAorY29uZmlnIE1FTkVMQVVTCisJYm9vbCAiVFdMOTIzMzAvTWVuZWxhdXMgUE0gY2hpcCIKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEFSQ0hfT01BUDI0WFgKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzCisJICBUV0w5MjMzMC9NZW5lbGF1cyBQb3dlciBNYW5hZ2VtZW50IGNoaXAuIFRoaXMgaW5jbHVkZSB2b2x0YWdlCisJICByZWd1bGF0b3JzLCBEdWFsIHNsb3QgbWVtb3J5IGNhcmQgdHJhbmNlaXZlcnMsIHJlYWwtdGltZSBjbG9jaworCSAgYW5kIG90aGVyIGZlYXR1cmVzIHRoYXQgYXJlIG9mdGVuIHVzZWQgaW4gcG9ydGFibGUgZGV2aWNlcyBsaWtlCisJICBjZWxsIHBob25lcyBhbmQgUERBcy4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQppbmRleCBkOGNiZWIzLi5jYTkyNGUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU5MSkJKz0gcGNmODU5MS5vCiBvYmotJChDT05GSUdfSVNQMTMwMV9PTUFQKQkrPSBpc3AxMzAxX29tYXAubwogb2JqLSQoQ09ORklHX1RQUzY1MDEwKQkJKz0gdHBzNjUwMTAubworb2JqLSQoQ09ORklHX01FTkVMQVVTKQkJKz0gbWVuZWxhdXMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVFNMMjU1MCkJKz0gdHNsMjU1MC5vCiAKIGlmZXEgKCQoQ09ORklHX0kyQ19ERUJVR19DSElQKSx5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWVuZWxhdXMuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL21lbmVsYXVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhN2UyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL21lbmVsYXVzLmMKQEAgLTAsMCArMSwxMjgxIEBACisjZGVmaW5lIERFQlVHCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKgorICogU29tZSBwYXJ0cyBiYXNlZCB0cHM2NTAxMC5jOgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzIGFuZAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBTb21lIHBhcnRzIGJhc2VkIG9uIHRsdjMyMGFpYzI0LmM6CisgKiBDb3B5cmlnaHQgKEMpIGJ5IEthaSBTdmFobiA8a2FpLnN2YWhuQG5va2lhLmNvbT4KKyAqCisgKiBDaGFuZ2VzIGZvciBpbnRlcnJ1cHQgaGFuZGxpbmcgYW5kIGNsZWFuLXVwIGJ5CisgKiBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPiBhbmQgSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICogQ2xlYW51cCBhbmQgZ2VuZXJhbGl6ZWQgc3VwcG9ydCBmb3Igdm9sdGFnZSBzZXR0aW5nIGJ5CisgKiBKdWhhIFlyam9sYQorICogQWRkZWQgc3VwcG9ydCBmb3IgY29udHJvbGxpbmcgVkNPUkUgYW5kIHJlZ3VsYXRvciBzbGVlcCBzdGF0ZXMsCisgKiBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbmVsYXVzLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUJCQkibWVuZWxhdXMiCisKKyNkZWZpbmUgcHJfZXJyKGZtdCwgYXJnLi4uKQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogIiwgIyMgYXJnKTsKKworI2RlZmluZSBNRU5FTEFVU19JMkNfQUREUkVTUwkJMHg3MgorCisjZGVmaW5lIE1FTkVMQVVTX1JFVgkJCTB4MDEKKyNkZWZpbmUgTUVORUxBVVNfVkNPUkVfQ1RSTDEJCTB4MDIKKyNkZWZpbmUgTUVORUxBVVNfVkNPUkVfQ1RSTDIJCTB4MDMKKyNkZWZpbmUgTUVORUxBVVNfVkNPUkVfQ1RSTDMJCTB4MDQKKyNkZWZpbmUgTUVORUxBVVNfVkNPUkVfQ1RSTDQJCTB4MDUKKyNkZWZpbmUgTUVORUxBVVNfVkNPUkVfQ1RSTDUJCTB4MDYKKyNkZWZpbmUgTUVORUxBVVNfRENEQ19DVFJMMQkJMHgwNworI2RlZmluZSBNRU5FTEFVU19EQ0RDX0NUUkwyCQkweDA4CisjZGVmaW5lIE1FTkVMQVVTX0RDRENfQ1RSTDMJCTB4MDkKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkwxCQkweDBBCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMMgkJMHgwQgorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDMJCTB4MEMKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkw0CQkweDBECisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMNQkJMHgwRQorI2RlZmluZSBNRU5FTEFVU19MRE9fQ1RSTDYJCTB4MEYKKyNkZWZpbmUgTUVORUxBVVNfTERPX0NUUkw3CQkweDEwCisjZGVmaW5lIE1FTkVMQVVTX0xET19DVFJMOAkJMHgxMQorI2RlZmluZSBNRU5FTEFVU19TTEVFUF9DVFJMMQkJMHgxMgorI2RlZmluZSBNRU5FTEFVU19TTEVFUF9DVFJMMgkJMHgxMworI2RlZmluZSBNRU5FTEFVU19ERVZJQ0VfT0ZGCQkweDE0CisjZGVmaW5lIE1FTkVMQVVTX09TQ19DVFJMCQkweDE1CisjZGVmaW5lIE1FTkVMQVVTX0RFVEVDVF9DVFJMCQkweDE2CisjZGVmaW5lIE1FTkVMQVVTX0lOVF9NQVNLMQkJMHgxNworI2RlZmluZSBNRU5FTEFVU19JTlRfTUFTSzIJCTB4MTgKKyNkZWZpbmUgTUVORUxBVVNfSU5UX1NUQVRVUzEJCTB4MTkKKyNkZWZpbmUgTUVORUxBVVNfSU5UX1NUQVRVUzIJCTB4MUEKKyNkZWZpbmUgTUVORUxBVVNfSU5UX0FDSzEJCTB4MUIKKyNkZWZpbmUgTUVORUxBVVNfSU5UX0FDSzIJCTB4MUMKKyNkZWZpbmUgTUVORUxBVVNfR1BJT19DVFJMCQkweDFECisjZGVmaW5lIE1FTkVMQVVTX0dQSU9fSU4JCTB4MUUKKyNkZWZpbmUgTUVORUxBVVNfR1BJT19PVVQJCTB4MUYKKyNkZWZpbmUgTUVORUxBVVNfQkJTTVMJCQkweDIwCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19DVFJMCQkweDIxCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19VUERBVEUJCTB4MjIKKyNkZWZpbmUgTUVORUxBVVNfUlRDX1NFQwkJMHgyMworI2RlZmluZSBNRU5FTEFVU19SVENfTUlOCQkweDI0CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19IUgkJCTB4MjUKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0RBWQkJMHgyNgorI2RlZmluZSBNRU5FTEFVU19SVENfTU9OCQkweDI3CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19ZUgkJCTB4MjgKKyNkZWZpbmUgTUVORUxBVVNfUlRDX1dLREFZCQkweDI5CisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9TRUMJCTB4MkEKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX01JTgkJMHgyQgorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfSFIJCTB4MkMKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0FMX0RBWQkJMHgyRAorI2RlZmluZSBNRU5FTEFVU19SVENfQUxfTU9OCQkweDJFCisjZGVmaW5lIE1FTkVMQVVTX1JUQ19BTF9ZUgkJMHgyRgorI2RlZmluZSBNRU5FTEFVU19SVENfQ09NUF9NU0IJCTB4MzAKKyNkZWZpbmUgTUVORUxBVVNfUlRDX0NPTVBfTFNCCQkweDMxCisjZGVmaW5lIE1FTkVMQVVTX1MxX1BVTExfRU4JCTB4MzIKKyNkZWZpbmUgTUVORUxBVVNfUzFfUFVMTF9ESVIJCTB4MzMKKyNkZWZpbmUgTUVORUxBVVNfUzJfUFVMTF9FTgkJMHgzNAorI2RlZmluZSBNRU5FTEFVU19TMl9QVUxMX0RJUgkJMHgzNQorI2RlZmluZSBNRU5FTEFVU19NQ1RfQ1RSTDEJCTB4MzYKKyNkZWZpbmUgTUVORUxBVVNfTUNUX0NUUkwyCQkweDM3CisjZGVmaW5lIE1FTkVMQVVTX01DVF9DVFJMMwkJMHgzOAorI2RlZmluZSBNRU5FTEFVU19NQ1RfUElOX1NUCQkweDM5CisjZGVmaW5lIE1FTkVMQVVTX0RFQk9VTkNFMQkJMHgzQQorCisjZGVmaW5lIElIX01FTkVMQVVTX0lSUVMJCTEyCisjZGVmaW5lIE1FTkVMQVVTX01NQ19TMUNEX0lSUQkJMAkvKiBNTUMgc2xvdCAxIGNhcmQgY2hhbmdlICovCisjZGVmaW5lIE1FTkVMQVVTX01NQ19TMkNEX0lSUQkJMQkvKiBNTUMgc2xvdCAyIGNhcmQgY2hhbmdlICovCisjZGVmaW5lIE1FTkVMQVVTX01NQ19TMUQxX0lSUQkJMgkvKiBNTUMgREFUMSBsb3cgaW4gc2xvdCAxICovCisjZGVmaW5lIE1FTkVMQVVTX01NQ19TMkQxX0lSUQkJMwkvKiBNTUMgREFUMSBsb3cgaW4gc2xvdCAyICovCisjZGVmaW5lIE1FTkVMQVVTX0xPV0JBVF9JUlEJCTQJLyogTG93IGJhdHRlcnkgKi8KKyNkZWZpbmUgTUVORUxBVVNfSE9URElFX0lSUQkJNQkvKiBIb3QgZGllIGRldGVjdCAqLworI2RlZmluZSBNRU5FTEFVU19VVkxPX0lSUQkJNgkvKiBVVkxPIGRldGVjdCAqLworI2RlZmluZSBNRU5FTEFVU19UU0hVVF9JUlEJCTcJLyogVGhlcm1hbCBzaHV0ZG93biAqLworI2RlZmluZSBNRU5FTEFVU19SVENUTVJfSVJRCQk4CS8qIFJUQyB0aW1lciAqLworI2RlZmluZSBNRU5FTEFVU19SVENBTE1fSVJRCQk5CS8qIFJUQyBhbGFybSAqLworI2RlZmluZSBNRU5FTEFVU19SVENFUlJfSVJRCQkxMAkvKiBSVEMgZXJyb3IgKi8KKyNkZWZpbmUgTUVORUxBVVNfUFNIQlROX0lSUQkJMTEJLyogUHVzaCBidXR0b24gKi8KKyNkZWZpbmUgTUVORUxBVVNfUkVTRVJWRUQxMl9JUlEJCTEyCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE1FTkVMQVVTX1JFU0VSVkVEMTNfSVJRCQkxMwkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNRU5FTEFVU19SRVNFUlZFRDE0X0lSUQkJMTQJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUVORUxBVVNfUkVTRVJWRUQxNV9JUlEJCTE1CS8qIFJlc2VydmVkICovCisKK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpfbWVuZWxhdXMpOworCitzdHJ1Y3QgbWVuZWxhdXNfY2hpcCB7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisjaWZkZWYgQ09ORklHX1JUQ19EUlZfVFdMOTIzMzAKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXU4CQkJcnRjX2NvbnRyb2w7CisJdW5zaWduZWQJCXVpZToxOworI2VuZGlmCisJdW5zaWduZWQJCXZjb3JlX2h3X21vZGU6MTsKKwl1OAkJCW1hc2sxLCBtYXNrMjsKKwl2b2lkCQkJKCpoYW5kbGVyc1sxNl0pKHN0cnVjdCBtZW5lbGF1c19jaGlwICopOworCXZvaWQJCQkoKm1tY19jYWxsYmFjaykodm9pZCAqZGF0YSwgdTggbWFzayk7CisJdm9pZAkJCSptbWNfY2FsbGJhY2tfZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqdGhlX21lbmVsYXVzOworCitzdGF0aWMgaW50IG1lbmVsYXVzX3dyaXRlX3JlZyhpbnQgcmVnLCB1OCB2YWx1ZSkKK3sKKwlpbnQgdmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSh0aGVfbWVuZWxhdXMtPmNsaWVudCwgcmVnLCB2YWx1ZSk7CisKKwlpZiAodmFsIDwgMCkgeworCQlwcl9lcnIoIndyaXRlIGVycm9yIik7CisJCXJldHVybiB2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfcmVhZF9yZWcoaW50IHJlZykKK3sKKwlpbnQgdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHRoZV9tZW5lbGF1cy0+Y2xpZW50LCByZWcpOworCisJaWYgKHZhbCA8IDApCisJCXByX2VycigicmVhZCBlcnJvciIpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19lbmFibGVfaXJxKGludCBpcnEpCit7CisJaWYgKGlycSA+IDcpIHsKKwkJaXJxIC09IDg7CisJCXRoZV9tZW5lbGF1cy0+bWFzazIgJj0gfigxIDw8IGlycSk7CisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0syLAorCQkJCXRoZV9tZW5lbGF1cy0+bWFzazIpOworCX0gZWxzZSB7CisJCXRoZV9tZW5lbGF1cy0+bWFzazEgJj0gfigxIDw8IGlycSk7CisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0sxLAorCQkJCXRoZV9tZW5lbGF1cy0+bWFzazEpOworCX0KK30KKworc3RhdGljIGludCBtZW5lbGF1c19kaXNhYmxlX2lycShpbnQgaXJxKQoreworCWlmIChpcnEgPiA3KSB7CisJCWlycSAtPSA4OworCQl0aGVfbWVuZWxhdXMtPm1hc2syIHw9ICgxIDw8IGlycSk7CisJCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX01BU0syLAorCQkJCXRoZV9tZW5lbGF1cy0+bWFzazIpOworCX0gZWxzZSB7CisJCXRoZV9tZW5lbGF1cy0+bWFzazEgfD0gKDEgPDwgaXJxKTsKKwkJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfTUFTSzEsCisJCQkJdGhlX21lbmVsYXVzLT5tYXNrMSk7CisJfQorfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX2Fja19pcnEoaW50IGlycSkKK3sKKwlpZiAoaXJxID4gNykKKwkJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfQUNLMiwgMSA8PCAoaXJxIC0gOCkpOworCWVsc2UKKwkJcmV0dXJuIG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfQUNLMSwgMSA8PCBpcnEpOworfQorCisvKiBBZGRzIGEgaGFuZGxlciBmb3IgYW4gaW50ZXJydXB0LiBEb2VzIG5vdCBydW4gaW4gaW50ZXJydXB0IGNvbnRleHQgKi8KK3N0YXRpYyBpbnQgbWVuZWxhdXNfYWRkX2lycV93b3JrKGludCBpcnEsCisJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgbWVuZWxhdXNfY2hpcCAqKSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJdGhlX21lbmVsYXVzLT5oYW5kbGVyc1tpcnFdID0gaGFuZGxlcjsKKwlyZXQgPSBtZW5lbGF1c19lbmFibGVfaXJxKGlycSk7CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogUmVtb3ZlcyBoYW5kbGVyIGZvciBhbiBpbnRlcnJ1cHQgKi8KK3N0YXRpYyBpbnQgbWVuZWxhdXNfcmVtb3ZlX2lycV93b3JrKGludCBpcnEpCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX2Rpc2FibGVfaXJxKGlycSk7CisJdGhlX21lbmVsYXVzLT5oYW5kbGVyc1tpcnFdID0gTlVMTDsKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0cyBzY2hlZHVsZWQgd2hlbiBhIGNhcmQgZGV0ZWN0IGludGVycnVwdCBoYXBwZW5zLiBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcworICogdGhpcyBsaW5lIGlzIHdpcmVkIHRvIGNhcmQgY292ZXIgc3dpdGNoIHJhdGhlciB0aGFuIHRoZSBjYXJkIGRldGVjdCBzd2l0Y2gKKyAqIGluIGVhY2ggc2xvdC4gSW4gdGhpcyBjYXNlIHRoZSBjYXJkcyBhcmUgbm90IHNlZW4gYnkgbWVuZWxhdXMuCisgKiBGSVhNRTogQWRkIGhhbmRsaW5nIGZvciBEMSB0b28KKyAqLworc3RhdGljIHZvaWQgbWVuZWxhdXNfbW1jX2NkX3dvcmsoc3RydWN0IG1lbmVsYXVzX2NoaXAgKm1lbmVsYXVzX2h3KQoreworCWludCByZWc7CisJdW5zaWduZWQgY2hhciBjYXJkX21hc2sgPSAwOworCisJcmVnID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX1BJTl9TVCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybjsKKworCWlmICghKHJlZyAmIDB4MSkpCisJCWNhcmRfbWFzayB8PSAoMSA8PCAwKTsKKworCWlmICghKHJlZyAmIDB4MikpCisJCWNhcmRfbWFzayB8PSAoMSA8PCAxKTsKKworCWlmIChtZW5lbGF1c19ody0+bW1jX2NhbGxiYWNrKQorCQltZW5lbGF1c19ody0+bW1jX2NhbGxiYWNrKG1lbmVsYXVzX2h3LT5tbWNfY2FsbGJhY2tfZGF0YSwKKwkJCQkJICBjYXJkX21hc2spOworfQorCisvKgorICogVG9nZ2xlcyB0aGUgTU1DIHNsb3RzIGJldHdlZW4gb3Blbi1kcmFpbiBhbmQgcHVzaC1wdWxsIG1vZGUuCisgKi8KK2ludCBtZW5lbGF1c19zZXRfbW1jX29wZW5kcmFpbihpbnQgc2xvdCwgaW50IGVuYWJsZSkKK3sKKwlpbnQgcmV0LCB2YWw7CisKKwlpZiAoc2xvdCAhPSAxICYmIHNsb3QgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDEpOworCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdmFsID0gcmV0OworCWlmIChzbG90ID09IDEpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCXZhbCB8PSAxIDw8IDI7CisJCWVsc2UKKwkJCXZhbCAmPSB+KDEgPDwgMik7CisJfSBlbHNlIHsKKwkJaWYgKGVuYWJsZSkKKwkJCXZhbCB8PSAxIDw8IDM7CisJCWVsc2UKKwkJCXZhbCAmPSB+KDEgPDwgMyk7CisJfQorCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDEsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X21tY19vcGVuZHJhaW4pOworCitpbnQgbWVuZWxhdXNfc2V0X3Nsb3Rfc2VsKGludCBlbmFibGUpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfR1BJT19DVFJMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0IHw9IDB4MDI7CisJaWYgKGVuYWJsZSkKKwkJcmV0IHw9IDEgPDwgNTsKKwllbHNlCisJCXJldCAmPSB+KDEgPDwgNSk7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0dQSU9fQ1RSTCwgcmV0KTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X3Nsb3Rfc2VsKTsKKworaW50IG1lbmVsYXVzX3NldF9tbWNfc2xvdChpbnQgc2xvdCwgaW50IGVuYWJsZSwgaW50IHBvd2VyLCBpbnQgY2RfZW4pCit7CisJaW50IHJldCwgdmFsOworCisJaWYgKHNsb3QgIT0gMSAmJiBzbG90ICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwb3dlciA+PSAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisKKwlyZXQgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwl2YWwgPSByZXQ7CisJaWYgKHNsb3QgPT0gMSkgeworCQlpZiAoY2RfZW4pCisJCQl2YWwgfD0gKDEgPDwgNCkgfCAoMSA8PCA2KTsKKwkJZWxzZQorCQkJdmFsICY9IH4oKDEgPDwgNCkgfCAoMSA8PCA2KSk7CisJfSBlbHNlIHsKKwkJaWYgKGNkX2VuKQorCQkJdmFsIHw9ICgxIDw8IDUpIHwgKDEgPDwgNyk7CisJCWVsc2UKKwkJCXZhbCAmPSB+KCgxIDw8IDUpIHwgKDEgPDwgNykpOworCX0KKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfTUNUX0NUUkwyLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9DVFJMMyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXZhbCA9IHJldDsKKwlpZiAoc2xvdCA9PSAxKSB7CisJCWlmIChlbmFibGUpCisJCQl2YWwgfD0gMSA8PCAwOworCQllbHNlCisJCQl2YWwgJj0gfigxIDw8IDApOworCX0gZWxzZSB7CisJCWludCBiOworCisJCWlmIChlbmFibGUpCisJCQlyZXQgfD0gMSA8PCAxOworCQllbHNlCisJCQlyZXQgJj0gfigxIDw8IDEpOworCQliID0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfTUNUX0NUUkwyKTsKKwkJYiAmPSB+MHgwMzsKKwkJYiB8PSBwb3dlcjsKKwkJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMiwgYik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCS8qIERpc2FibGUgYXV0b25vbW91cyBzaHV0ZG93biAqLworCXZhbCAmPSB+KDB4MDMgPDwgMik7CisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX01DVF9DVFJMMywgdmFsKTsKK291dDoKKwltdXRleF91bmxvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X21tY19zbG90KTsKKworaW50IG1lbmVsYXVzX3JlZ2lzdGVyX21tY19jYWxsYmFjayh2b2lkICgqY2FsbGJhY2spKHZvaWQgKmRhdGEsIHU4IGNhcmRfbWFzayksCisJCQkJICAgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXRoZV9tZW5lbGF1cy0+bW1jX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCXRoZV9tZW5lbGF1cy0+bW1jX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJcmV0ID0gbWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMUNEX0lSUSwKKwkJCQkgICAgbWVuZWxhdXNfbW1jX2NkX3dvcmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldCA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19NTUNfUzJDRF9JUlEsCisJCQkJICAgIG1lbmVsYXVzX21tY19jZF93b3JrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBtZW5lbGF1c19hZGRfaXJxX3dvcmsoTUVORUxBVVNfTU1DX1MxRDFfSVJRLAorCQkJCSAgICBtZW5lbGF1c19tbWNfY2Rfd29yayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbWVuZWxhdXNfYWRkX2lycV93b3JrKE1FTkVMQVVTX01NQ19TMkQxX0lSUSwKKwkJCQkgICAgbWVuZWxhdXNfbW1jX2NkX3dvcmspOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfcmVnaXN0ZXJfbW1jX2NhbGxiYWNrKTsKKwordm9pZCBtZW5lbGF1c191bnJlZ2lzdGVyX21tY19jYWxsYmFjayh2b2lkKQoreworCW1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19NTUNfUzFDRF9JUlEpOworCW1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19NTUNfUzJDRF9JUlEpOworCW1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19NTUNfUzFEMV9JUlEpOworCW1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19NTUNfUzJEMV9JUlEpOworCisJdGhlX21lbmVsYXVzLT5tbWNfY2FsbGJhY2sgPSBOVUxMOworCXRoZV9tZW5lbGF1cy0+bW1jX2NhbGxiYWNrX2RhdGEgPSAwOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c191bnJlZ2lzdGVyX21tY19jYWxsYmFjayk7CisKK3N0cnVjdCBtZW5lbGF1c192dGcgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggdnRnX3JlZzsKKwl1OCB2dGdfc2hpZnQ7CisJdTggdnRnX2JpdHM7CisJdTggbW9kZV9yZWc7Cit9OworCitzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHsKKwl1MTYgdnRnOworCXUxNiB2YWw7Cit9OworCitzdGF0aWMgaW50IG1lbmVsYXVzX3NldF92b2x0YWdlKGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgKnZ0ZywgaW50IG1WLAorCQkJCWludCB2dGdfdmFsLCBpbnQgbW9kZSkKK3sKKwlpbnQgdmFsLCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB0aGVfbWVuZWxhdXMtPmNsaWVudDsKKworCW11dGV4X2xvY2soJnRoZV9tZW5lbGF1cy0+bG9jayk7CisJaWYgKHZ0ZyA9PSAwKQorCQlnb3RvIHNldF92b2x0YWdlOworCisJcmV0ID0gbWVuZWxhdXNfcmVhZF9yZWcodnRnLT52dGdfcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmFsID0gcmV0ICYgfigoKDEgPDwgdnRnLT52dGdfYml0cykgLSAxKSA8PCB2dGctPnZ0Z19zaGlmdCk7CisJdmFsIHw9IHZ0Z192YWwgPDwgdnRnLT52dGdfc2hpZnQ7CisKKwlkZXZfZGJnKCZjLT5kZXYsICJTZXR0aW5nIHZvbHRhZ2UgJyVzJyIKKwkJCSAidG8gJWQgbVYgKHJlZyAweCUwMngsIHZhbCAweCUwMngpXG4iLAorCQkJdnRnLT5uYW1lLCBtViwgdnRnLT52dGdfcmVnLCB2YWwpOworCisJcmV0ID0gbWVuZWxhdXNfd3JpdGVfcmVnKHZ0Zy0+dnRnX3JlZywgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CitzZXRfdm9sdGFnZToKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcodnRnLT5tb2RlX3JlZywgbW9kZSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCWlmIChyZXQgPT0gMCkgeworCQkvKiBXYWl0IGZvciB2b2x0YWdlIHRvIHN0YWJpbGl6ZSAqLworCQltc2xlZXAoMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShpbnQgdnRnLCBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlICp0YmwsCisJCQkJICBpbnQgbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIHRibCsrKQorCQlpZiAodGJsLT52dGcgPT0gdnRnKQorCQkJcmV0dXJuIHRibC0+dmFsOworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogVmNvcmUgY2FuIGJlIHByb2dyYW1tZWQgaW4gdHdvIHdheXM6CisgKiBTVy1jb250cm9sbGVkOiBSZXF1aXJlZCB2b2x0YWdlIGlzIHByb2dyYW1tZWQgaW50byBWQ09SRV9DVFJMMQorICogSFctY29udHJvbGxlZDogUmVxdWlyZWQgcmFuZ2UgKHJvb2YtZmxvb3IpIGlzIHByb2dyYW1tZWQgaW50byBWQ09SRV9DVFJMMworICogYW5kIFZDT1JFX0NUUkw0CisgKgorICogQ2FsbCBjb3JyZWN0ICdzZXQnIGZ1bmN0aW9uIGFjY29yZGluZ2x5CisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGdfdmFsdWUgdmNvcmVfdmFsdWVzW10gPSB7CisJeyAxMDAwLCAwIH0sCisJeyAxMDI1LCAxIH0sCisJeyAxMDUwLCAyIH0sCisJeyAxMDc1LCAzIH0sCisJeyAxMTAwLCA0IH0sCisJeyAxMTI1LCA1IH0sCisJeyAxMTUwLCA2IH0sCisJeyAxMTc1LCA3IH0sCisJeyAxMjAwLCA4IH0sCisJeyAxMjI1LCA5IH0sCisJeyAxMjUwLCAxMCB9LAorCXsgMTI3NSwgMTEgfSwKKwl7IDEzMDAsIDEyIH0sCisJeyAxMzI1LCAxMyB9LAorCXsgMTM1MCwgMTQgfSwKKwl7IDEzNzUsIDE1IH0sCisJeyAxNDAwLCAxNiB9LAorCXsgMTQyNSwgMTcgfSwKKwl7IDE0NTAsIDE4IH0sCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3Zjb3JlX3N3KHVuc2lnbmVkIGludCBtVikKK3sKKwlpbnQgdmFsLCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB0aGVfbWVuZWxhdXMtPmNsaWVudDsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZjb3JlX3ZhbHVlcywKKwkJCQkgICAgIEFSUkFZX1NJWkUodmNvcmVfdmFsdWVzKSk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2RiZygmYy0+ZGV2LCAiU2V0dGluZyBWQ09SRSB0byAlZCBtViAodmFsIDB4JTAyeClcbiIsIG1WLCB2YWwpOworCisJLyogU2V0IFNXIG1vZGUgYW5kIHRoZSB2b2x0YWdlIGluIG9uZSBnby4gKi8KKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMSwgdmFsKTsKKwlpZiAocmV0ID09IDApCisJCXRoZV9tZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSA9IDA7CisJbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCW1zbGVlcCgxKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBtZW5lbGF1c19zZXRfdmNvcmVfaHcodW5zaWduZWQgaW50IHJvb2ZfbVYsIHVuc2lnbmVkIGludCBmbG9vcl9tVikKK3sKKwlpbnQgZnZhbCwgcnZhbCwgdmFsLCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSB0aGVfbWVuZWxhdXMtPmNsaWVudDsKKworCXJ2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKHJvb2ZfbVYsIHZjb3JlX3ZhbHVlcywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHZjb3JlX3ZhbHVlcykpOworCWlmIChydmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZnZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUoZmxvb3JfbVYsIHZjb3JlX3ZhbHVlcywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHZjb3JlX3ZhbHVlcykpOworCWlmIChmdmFsIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKCZjLT5kZXYsICJTZXR0aW5nIFZDT1JFIEZMT09SIHRvICVkIG1WIGFuZCBST09GIHRvICVkIG1WXG4iLAorCSAgICAgICBmbG9vcl9tViwgcm9vZl9tVik7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMywgZnZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMNCwgcnZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWlmICghdGhlX21lbmVsYXVzLT52Y29yZV9od19tb2RlKSB7CisJCXZhbCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkwxKTsKKwkJLyogSFcgbW9kZSwgdHVybiBPRkYgYnl0ZSBjb21wYXJhdG9yICovCisJCXZhbCB8PSAoKDEgPDwgNykgfCAoMSA8PCA1KSk7CisJCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMSwgdmFsKTsKKwkJdGhlX21lbmVsYXVzLT52Y29yZV9od19tb2RlID0gMTsKKwl9CisJbXNsZWVwKDEpOworb3V0OgorCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2bWVtX3Z0ZyA9IHsKKwkubmFtZSA9ICJWTUVNIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMMSwKKwkudnRnX3NoaWZ0ID0gMCwKKwkudnRnX2JpdHMgPSAyLAorCS5tb2RlX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMMywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZtZW1fdmFsdWVzW10gPSB7CisJeyAxNTAwLCAwIH0sCisJeyAxODAwLCAxIH0sCisJeyAxOTAwLCAyIH0sCisJeyAyNTAwLCAzIH0sCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3ZtZW0odW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWw7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2bWVtX3Z0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2bWVtX3ZhbHVlcywgQVJSQVlfU0laRSh2bWVtX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZtZW1fdnRnLCBtViwgdmFsLCAweDAyKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X3ZtZW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2aW9fdnRnID0geworCS5uYW1lID0gIlZJTyIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDIsCisJLnZ0Z19iaXRzID0gMiwKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2aW9fdmFsdWVzW10gPSB7CisJeyAxNTAwLCAwIH0sCisJeyAxODAwLCAxIH0sCisJeyAyNTAwLCAyIH0sCisJeyAyODAwLCAzIH0sCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3Zpbyh1bnNpZ25lZCBpbnQgbVYpCit7CisJaW50IHZhbDsKKworCWlmIChtViA9PSAwKQorCQlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZpb192dGcsIDAsIDAsIDApOworCisJdmFsID0gbWVuZWxhdXNfZ2V0X3Z0Z192YWx1ZShtViwgdmlvX3ZhbHVlcywgQVJSQVlfU0laRSh2aW9fdmFsdWVzKSk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdmlvX3Z0ZywgbVYsIHZhbCwgMHgwMik7Cit9CitFWFBPUlRfU1lNQk9MKG1lbmVsYXVzX3NldF92aW8pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2ZGNkY192YWx1ZXNbXSA9IHsKKwl7IDE1MDAsIDAgfSwKKwl7IDE4MDAsIDEgfSwKKwl7IDIwMDAsIDIgfSwKKwl7IDIyMDAsIDMgfSwKKwl7IDI0MDAsIDQgfSwKKwl7IDI4MDAsIDUgfSwKKwl7IDMwMDAsIDYgfSwKKwl7IDMzMDAsIDcgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnIHZkY2RjMl92dGcgPSB7CisJLm5hbWUgPSAiVkRDREMyIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0RDRENfQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDAsCisJLnZ0Z19iaXRzID0gMywKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19EQ0RDX0NUUkwyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdmRjZGMzX3Z0ZyA9IHsKKwkubmFtZSA9ICJWRENEQzMiLAorCS52dGdfcmVnID0gTUVORUxBVVNfRENEQ19DVFJMMSwKKwkudnRnX3NoaWZ0ID0gMywKKwkudnRnX2JpdHMgPSAzLAorCS5tb2RlX3JlZyA9IE1FTkVMQVVTX0RDRENfQ1RSTDMsCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3ZkY2RjKGludCBkY2RjLCB1bnNpZ25lZCBpbnQgbVYpCit7CisJY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyAqdnRnOworCWludCB2YWw7CisKKwlpZiAoZGNkYyAhPSAyICYmIGRjZGMgIT0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRjZGMgPT0gMikKKwkJdnRnID0gJnZkY2RjMl92dGc7CisJZWxzZQorCQl2dGcgPSAmdmRjZGMzX3Z0ZzsKKworCWlmIChtViA9PSAwKQorCQlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UodnRnLCAwLCAwLCAwKTsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZkY2RjX3ZhbHVlcywKKwkJCQkgICAgIEFSUkFZX1NJWkUodmRjZGNfdmFsdWVzKSk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSh2dGcsIG1WLCB2YWwsIDB4MDMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0Z192YWx1ZSB2bW1jX3ZhbHVlc1tdID0geworCXsgMTg1MCwgMCB9LAorCXsgMjgwMCwgMSB9LAorCXsgMzAwMCwgMiB9LAorCXsgMzEwMCwgMyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZW5lbGF1c192dGcgdm1tY192dGcgPSB7CisJLm5hbWUgPSAiVk1NQyIsCisJLnZ0Z19yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDEsCisJLnZ0Z19zaGlmdCA9IDYsCisJLnZ0Z19iaXRzID0gMiwKKwkubW9kZV9yZWcgPSBNRU5FTEFVU19MRE9fQ1RSTDcsCit9OworCitpbnQgbWVuZWxhdXNfc2V0X3ZtbWModW5zaWduZWQgaW50IG1WKQoreworCWludCB2YWw7CisKKwlpZiAobVYgPT0gMCkKKwkJcmV0dXJuIG1lbmVsYXVzX3NldF92b2x0YWdlKCZ2bW1jX3Z0ZywgMCwgMCwgMCk7CisKKwl2YWwgPSBtZW5lbGF1c19nZXRfdnRnX3ZhbHVlKG1WLCB2bW1jX3ZhbHVlcywgQVJSQVlfU0laRSh2bW1jX3ZhbHVlcykpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZtbWNfdnRnLCBtViwgdmFsLCAweDAyKTsKK30KK0VYUE9SVF9TWU1CT0wobWVuZWxhdXNfc2V0X3ZtbWMpOworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWVuZWxhdXNfdnRnX3ZhbHVlIHZhdXhfdmFsdWVzW10gPSB7CisJeyAxNTAwLCAwIH0sCisJeyAxODAwLCAxIH0sCisJeyAyNTAwLCAyIH0sCisJeyAyODAwLCAzIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbmVsYXVzX3Z0ZyB2YXV4X3Z0ZyA9IHsKKwkubmFtZSA9ICJWQVVYIiwKKwkudnRnX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMMSwKKwkudnRnX3NoaWZ0ID0gNCwKKwkudnRnX2JpdHMgPSAyLAorCS5tb2RlX3JlZyA9IE1FTkVMQVVTX0xET19DVFJMNiwKK307CisKK2ludCBtZW5lbGF1c19zZXRfdmF1eCh1bnNpZ25lZCBpbnQgbVYpCit7CisJaW50IHZhbDsKKworCWlmIChtViA9PSAwKQorCQlyZXR1cm4gbWVuZWxhdXNfc2V0X3ZvbHRhZ2UoJnZhdXhfdnRnLCAwLCAwLCAwKTsKKworCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZhdXhfdmFsdWVzLCBBUlJBWV9TSVpFKHZhdXhfdmFsdWVzKSk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtZW5lbGF1c19zZXRfdm9sdGFnZSgmdmF1eF92dGcsIG1WLCB2YWwsIDB4MDIpOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19zZXRfdmF1eCk7CisKK2ludCBtZW5lbGF1c19nZXRfc2xvdF9waW5fc3RhdGVzKHZvaWQpCit7CisJcmV0dXJuIG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX01DVF9QSU5fU1QpOworfQorRVhQT1JUX1NZTUJPTChtZW5lbGF1c19nZXRfc2xvdF9waW5fc3RhdGVzKTsKKworaW50IG1lbmVsYXVzX3NldF9yZWd1bGF0b3Jfc2xlZXAoaW50IGVuYWJsZSwgdTMyIHZhbCkKK3sKKwlpbnQgdCwgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gdGhlX21lbmVsYXVzLT5jbGllbnQ7CisKKwltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOworCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19TTEVFUF9DVFJMMiwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlkZXZfZGJnKCZjLT5kZXYsICJyZWd1bGF0b3Igc2xlZXAgY29uZmlndXJhdGlvbjogJTAyeFxuIiwgdmFsKTsKKworCXJldCA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX0dQSU9fQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXQgPSAoKDEgPDwgNikgfCAweDA0KTsKKwlpZiAoZW5hYmxlKQorCQlyZXQgfD0gdDsKKwllbHNlCisJCXJldCAmPSB+dDsKKwlyZXQgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfR1BJT19DVFJMLCByZXQpOworb3V0OgorCW11dGV4X3VubG9jaygmdGhlX21lbmVsYXVzLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogSGFuZGxlcyBNZW5lbGF1cyBpbnRlcnJ1cHRzLiBEb2VzIG5vdCBydW4gaW4gaW50ZXJydXB0IGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpfbWVuZWxhdXMpCit7CisJc3RydWN0IG1lbmVsYXVzX2NoaXAgKm1lbmVsYXVzID0KKwkJCWNvbnRhaW5lcl9vZihfbWVuZWxhdXMsIHN0cnVjdCBtZW5lbGF1c19jaGlwLCB3b3JrKTsKKwl2b2lkICgqaGFuZGxlcikoc3RydWN0IG1lbmVsYXVzX2NoaXAgKm1lbmVsYXVzKTsKKworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGlzcjsKKworCQlpc3IgPSAobWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfSU5UX1NUQVRVUzIpCisJCQkJJiB+bWVuZWxhdXMtPm1hc2syKSA8PCA4OworCQlpc3IgfD0gbWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfSU5UX1NUQVRVUzEpCisJCQkJJiB+bWVuZWxhdXMtPm1hc2sxOworCQlpZiAoIWlzcikKKwkJCWJyZWFrOworCisJCXdoaWxlIChpc3IpIHsKKwkJCWludCBpcnEgPSBmbHMoaXNyKSAtIDE7CisJCQlpc3IgJj0gfigxIDw8IGlycSk7CisKKwkJCW11dGV4X2xvY2soJm1lbmVsYXVzLT5sb2NrKTsKKwkJCW1lbmVsYXVzX2Rpc2FibGVfaXJxKGlycSk7CisJCQltZW5lbGF1c19hY2tfaXJxKGlycSk7CisJCQloYW5kbGVyID0gbWVuZWxhdXMtPmhhbmRsZXJzW2lycV07CisJCQlpZiAoaGFuZGxlcikKKwkJCQloYW5kbGVyKG1lbmVsYXVzKTsKKwkJCW1lbmVsYXVzX2VuYWJsZV9pcnEoaXJxKTsKKwkJCW11dGV4X3VubG9jaygmbWVuZWxhdXMtPmxvY2spOworCQl9CisJfQorCWVuYWJsZV9pcnEobWVuZWxhdXMtPmNsaWVudC0+aXJxKTsKK30KKworLyoKKyAqIFdlIGNhbm5vdCB1c2UgSTJDIGluIGludGVycnVwdCBjb250ZXh0LCBzbyB3ZSBqdXN0IHNjaGVkdWxlIHdvcmsuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtZW5lbGF1c19pcnEoaW50IGlycSwgdm9pZCAqX21lbmVsYXVzKQoreworCXN0cnVjdCBtZW5lbGF1c19jaGlwICptZW5lbGF1cyA9IF9tZW5lbGF1czsKKworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCSh2b2lkKXNjaGVkdWxlX3dvcmsoJm1lbmVsYXVzLT53b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBUaGUgUlRDIG5lZWRzIHRvIGJlIHNldCBvbmNlLCB0aGVuIGl0IHJ1bnMgb24gYmFja3VwIGJhdHRlcnkgcG93ZXIuCisgKiBJdCBzdXBwb3J0cyBhbGFybXMsIGluY2x1ZGluZyBzeXN0ZW0gd2FrZSBhbGFybXMgKGZyb20gc29tZSBtb2Rlcyk7CisgKiBhbmQgMS9zZWNvbmQgSVJRcyBpZiByZXF1ZXN0ZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9UV0w5MjMzMAorCisjZGVmaW5lIFJUQ19DVFJMX1JUQ19FTgkJKDEgPDwgMCkKKyNkZWZpbmUgUlRDX0NUUkxfQUxfRU4JCSgxIDw8IDEpCisjZGVmaW5lIFJUQ19DVFJMX01PREUxMgkJKDEgPDwgMikKKyNkZWZpbmUgUlRDX0NUUkxfRVZFUllfTUFTSwkoMyA8PCAzKQorI2RlZmluZSBSVENfQ1RSTF9FVkVSWV9TRUMJKDAgPDwgMykKKyNkZWZpbmUgUlRDX0NUUkxfRVZFUllfTUlOCSgxIDw8IDMpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX0hSCSgyIDw8IDMpCisjZGVmaW5lIFJUQ19DVFJMX0VWRVJZX0RBWQkoMyA8PCAzKQorCisjZGVmaW5lIFJUQ19VUERBVEVfRVZFUlkJMHgwOAorCisjZGVmaW5lIFJUQ19IUl9QTQkJKDEgPDwgNykKKworc3RhdGljIHZvaWQgbWVuZWxhdXNfdG9fdGltZShjaGFyICpyZWdzLCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJdC0+dG1fc2VjID0gQkNEMkJJTihyZWdzWzBdKTsKKwl0LT50bV9taW4gPSBCQ0QyQklOKHJlZ3NbMV0pOworCWlmICh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfTU9ERTEyKSB7CisJCXQtPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3NbMl0gJiAweDFmKSAtIDE7CisJCWlmIChyZWdzWzJdICYgUlRDX0hSX1BNKQorCQkJdC0+dG1faG91ciArPSAxMjsKKwl9IGVsc2UKKwkJdC0+dG1faG91ciA9IEJDRDJCSU4ocmVnc1syXSAmIDB4M2YpOworCXQtPnRtX21kYXkgPSBCQ0QyQklOKHJlZ3NbM10pOworCXQtPnRtX21vbiA9IEJDRDJCSU4ocmVnc1s0XSkgLSAxOworCXQtPnRtX3llYXIgPSBCQ0QyQklOKHJlZ3NbNV0pICsgMTAwOworfQorCitzdGF0aWMgaW50IHRpbWVfdG9fbWVuZWxhdXMoc3RydWN0IHJ0Y190aW1lICp0LCBpbnQgcmVnbnVtKQoreworCWludAlob3VyLCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcocmVnbnVtKyssIEJJTjJCQ0QodC0+dG1fc2VjKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhyZWdudW0rKywgQklOMkJDRCh0LT50bV9taW4pKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJaWYgKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9NT0RFMTIpIHsKKwkJaG91ciA9IHQtPnRtX2hvdXIgKyAxOworCQlpZiAoaG91ciA+IDEyKQorCQkJaG91ciA9IFJUQ19IUl9QTSB8IEJJTjJCQ0QoaG91ciAtIDEyKTsKKwkJZWxzZQorCQkJaG91ciA9IEJJTjJCQ0QoaG91cik7CisJfSBlbHNlCisJCWhvdXIgPSBCSU4yQkNEKHQtPnRtX2hvdXIpOworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhyZWdudW0rKywgaG91cik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhyZWdudW0rKywgQklOMkJDRCh0LT50bV9tZGF5KSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhyZWdudW0rKywgQklOMkJDRCh0LT50bV9tb24gKyAxKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCXN0YXR1cyA9IG1lbmVsYXVzX3dyaXRlX3JlZyhyZWdudW0rKywgQklOMkJDRCh0LT50bV95ZWFyIC0gMTAwKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworZmFpbDoKKwlkZXZfZXJyKCZ0aGVfbWVuZWxhdXMtPmNsaWVudC0+ZGV2LCAicnRjIHdyaXRlIHJlZyAlMDJ4LCBlcnIgJWRcbiIsCisJCQktLXJlZ251bSwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKK3sKKwlzdHJ1Y3QgaTJjX21zZwltc2dbMl07CisJY2hhcgkJcmVnc1s3XTsKKwlpbnQJCXN0YXR1czsKKworCS8qIGJsb2NrIHJlYWQgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgKi8KKwlyZWdzWzBdID0gTUVORUxBVVNfUlRDX1NFQzsKKworCW1zZ1swXS5hZGRyID0gTUVORUxBVVNfSTJDX0FERFJFU1M7CisJbXNnWzBdLmZsYWdzID0gMDsKKwltc2dbMF0ubGVuID0gMTsKKwltc2dbMF0uYnVmID0gcmVnczsKKworCW1zZ1sxXS5hZGRyID0gTUVORUxBVVNfSTJDX0FERFJFU1M7CisJbXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7CisJbXNnWzFdLmxlbiA9IHNpemVvZihyZWdzKTsKKwltc2dbMV0uYnVmID0gcmVnczsKKworCXN0YXR1cyA9IGkyY190cmFuc2Zlcih0aGVfbWVuZWxhdXMtPmNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKKwlpZiAoc3RhdHVzICE9IDIpIHsKKwkJZGV2X2VycihkZXYsICIlcyBlcnJvciAlZFxuIiwgInJlYWQiLCBzdGF0dXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW5lbGF1c190b190aW1lKHJlZ3MsIHQpOworCXQtPnRtX3dkYXkgPSBCQ0QyQklOKHJlZ3NbNl0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVuZWxhdXNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCit7CisJaW50CQlzdGF0dXM7CisKKwkvKiB3cml0ZSBkYXRlIGFuZCB0aW1lIHJlZ2lzdGVycyAqLworCXN0YXR1cyA9IHRpbWVfdG9fbWVuZWxhdXModCwgTUVORUxBVVNfUlRDX1NFQyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19XS0RBWSwgQklOMkJDRCh0LT50bV93ZGF5KSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2VycigmdGhlX21lbmVsYXVzLT5jbGllbnQtPmRldiwgInJ0YyB3cml0ZSByZWcgJTAyeCIsCisJCQkJImVyciAlZFxuIiwgTUVORUxBVVNfUlRDX1dLREFZLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIG5vdyBjb21taXQgdGhlIHdyaXRlICovCisJc3RhdHVzID0gbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX1JUQ19VUERBVEUsIFJUQ19VUERBVEVfRVZFUlkpOworCWlmIChzdGF0dXMgPCAwKQorCQlkZXZfZXJyKCZ0aGVfbWVuZWxhdXMtPmNsaWVudC0+ZGV2LCAicnRjIGNvbW1pdCB0aW1lLCBlcnIgJWRcbiIsCisJCQkJc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbmVsYXVzX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdykKK3sKKwlzdHJ1Y3QgaTJjX21zZwltc2dbMl07CisJY2hhcgkJcmVnc1s2XTsKKwlpbnQJCXN0YXR1czsKKworCS8qIGJsb2NrIHJlYWQgYWxhcm0gcmVnaXN0ZXJzICovCisJcmVnc1swXSA9IE1FTkVMQVVTX1JUQ19BTF9TRUM7CisKKwltc2dbMF0uYWRkciA9IE1FTkVMQVVTX0kyQ19BRERSRVNTOworCW1zZ1swXS5mbGFncyA9IDA7CisJbXNnWzBdLmxlbiA9IDE7CisJbXNnWzBdLmJ1ZiA9IHJlZ3M7CisKKwltc2dbMV0uYWRkciA9IE1FTkVMQVVTX0kyQ19BRERSRVNTOworCW1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCW1zZ1sxXS5sZW4gPSBzaXplb2YocmVncyk7CisJbXNnWzFdLmJ1ZiA9IHJlZ3M7CisKKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIodGhlX21lbmVsYXVzLT5jbGllbnQtPmFkYXB0ZXIsIG1zZywgMik7CisJaWYgKHN0YXR1cyAhPSAyKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJhbGFybSByZWFkIiwgc3RhdHVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVuZWxhdXNfdG9fdGltZShyZWdzLCAmdy0+dGltZSk7CisKKwl3LT5lbmFibGVkID0gISEodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0FMX0VOKTsKKworCS8qIE5PVEUgd2UgKmNvdWxkKiBjaGVjayBpZiBhY3R1YWxseSBwZW5kaW5nLi4uICovCisJdy0+cGVuZGluZyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqdykKK3sKKwlpbnQJCXN0YXR1czsKKworCWlmICh0aGVfbWVuZWxhdXMtPmNsaWVudC0+aXJxIDw9IDAgJiYgdy0+ZW5hYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBjbGVhciBwcmV2aW91cyBhbGFybSBlbmFibGUgKi8KKwlpZiAodGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0FMX0VOKSB7CisJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJj0gflJUQ19DVFJMX0FMX0VOOworCQlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX0NUUkwsCisJCQkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiB3cml0ZSBhbGFybSByZWdpc3RlcnMgKi8KKwlzdGF0dXMgPSB0aW1lX3RvX21lbmVsYXVzKCZ3LT50aW1lLCBNRU5FTEFVU19SVENfQUxfU0VDKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIGVuYWJsZSBhbGFybSBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAody0+ZW5hYmxlZCkgeworCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sIHw9IFJUQ19DVFJMX0FMX0VOOworCQlzdGF0dXMgPSBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX0NUUkwsCisJCQkJdGhlX21lbmVsYXVzLT5ydGNfY29udHJvbCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIENPTkZJR19SVENfSU5URl9ERVYKKworc3RhdGljIHZvaWQgbWVuZWxhdXNfcnRjX3VwZGF0ZV93b3JrKHN0cnVjdCBtZW5lbGF1c19jaGlwICptKQoreworCS8qIHJlcG9ydCAxL3NlYyB1cGRhdGUgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJ0Y191cGRhdGVfaXJxKG0tPnJ0YywgMSwgUlRDX0lSUUYgfCBSVENfVUYpOworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworc3RhdGljIGludCBtZW5lbGF1c19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50CXN0YXR1czsKKworCWlmICh0aGVfbWVuZWxhdXMtPmNsaWVudC0+aXJxIDw9IDApCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCS8qIGFsYXJtIElSUSAqLworCWNhc2UgUlRDX0FJRV9PTjoKKwkJaWYgKHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTikKKwkJCXJldHVybiAwOworCQl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sIHw9IFJUQ19DVFJMX0FMX0VOOworCQlicmVhazsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlpZiAoISh0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfQUxfRU4pKQorCQkJcmV0dXJuIDA7CisJCXRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wgJj0gflJUQ19DVFJMX0FMX0VOOworCQlicmVhazsKKwkvKiAxL3NlY29uZCAidXBkYXRlIiBJUlEgKi8KKwljYXNlIFJUQ19VSUVfT046CisJCWlmICh0aGVfbWVuZWxhdXMtPnVpZSkKKwkJCXJldHVybiAwOworCQlzdGF0dXMgPSBtZW5lbGF1c19yZW1vdmVfaXJxX3dvcmsoTUVORUxBVVNfUlRDVE1SX0lSUSk7CisJCXN0YXR1cyA9IG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19SVENUTVJfSVJRLAorCQkJCW1lbmVsYXVzX3J0Y191cGRhdGVfd29yayk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXRoZV9tZW5lbGF1cy0+dWllID0gMTsKKwkJcmV0dXJuIHN0YXR1czsKKwljYXNlIFJUQ19VSUVfT0ZGOgorCQlpZiAoIXRoZV9tZW5lbGF1cy0+dWllKQorCQkJcmV0dXJuIDA7CisJCXN0YXR1cyA9IG1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19SVENUTVJfSVJRKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJdGhlX21lbmVsYXVzLT51aWUgPSAwOworCQlyZXR1cm4gc3RhdHVzOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiBtZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX0NUUkwsIHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wpOworfQorCisjZWxzZQorI2RlZmluZSBtZW5lbGF1c19pb2N0bAlOVUxMCisjZW5kaWYKKworLyogUkVWSVNJVCBubyBjb21wZW5zYXRpb24gcmVnaXN0ZXIgc3VwcG9ydCAuLi4gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG1lbmVsYXVzX3J0Y19vcHMgPSB7CisJLmlvY3RsCQkJPSBtZW5lbGF1c19pb2N0bCwKKwkucmVhZF90aW1lCQk9IG1lbmVsYXVzX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJCT0gbWVuZWxhdXNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0JCT0gbWVuZWxhdXNfcmVhZF9hbGFybSwKKwkuc2V0X2FsYXJtCQk9IG1lbmVsYXVzX3NldF9hbGFybSwKK307CisKK3N0YXRpYyB2b2lkIG1lbmVsYXVzX3J0Y19hbGFybV93b3JrKHN0cnVjdCBtZW5lbGF1c19jaGlwICptKQoreworCS8qIHJlcG9ydCBhbGFybSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcnRjX3VwZGF0ZV9pcnEobS0+cnRjLCAxLCBSVENfSVJRRiB8IFJUQ19BRik7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyogdGhlbiBkaXNhYmxlIGl0OyBhbGFybXMgYXJlIG9uZXNob3QgKi8KKwl0aGVfbWVuZWxhdXMtPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9BTF9FTjsKKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfUlRDX0NUUkwsIHRoZV9tZW5lbGF1cy0+cnRjX2NvbnRyb2wpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVuZWxhdXNfcnRjX2luaXQoc3RydWN0IG1lbmVsYXVzX2NoaXAgKm0pCit7CisJaW50CWFsYXJtID0gKG0tPmNsaWVudC0+aXJxID4gMCk7CisKKwkvKiBhc3N1bWUgMzJLREVURU4gcGluIGlzIHB1bGxlZCBoaWdoICovCisJaWYgKCEobWVuZWxhdXNfcmVhZF9yZWcoTUVORUxBVVNfT1NDX0NUUkwpICYgMHg4MCkpIHsKKwkJZGV2X2RiZygmbS0+Y2xpZW50LT5kZXYsICJubyAzMmsgb3NjaWxsYXRvclxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBzdXBwb3J0IFJUQyBhbGFybTsgaXQgY2FuIGlzc3VlIHdha2V1cHMgKi8KKwlpZiAoYWxhcm0pIHsKKwkJaWYgKG1lbmVsYXVzX2FkZF9pcnFfd29yayhNRU5FTEFVU19SVENBTE1fSVJRLAorCQkJCW1lbmVsYXVzX3J0Y19hbGFybV93b3JrKSA8IDApIHsKKwkJCWRldl9lcnIoJm0tPmNsaWVudC0+ZGV2LCAiY2FuJ3QgaGFuZGxlIFJUQyBhbGFybVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZtLT5jbGllbnQtPmRldiwgMSk7CisJfQorCisJLyogYmUgc3VyZSBSVEMgaXMgZW5hYmxlZDsgYWxsb3cgMS9zZWMgaXJxczsgbGVhdmUgMTJociBtb2RlIGFsb25lICovCisJbS0+cnRjX2NvbnRyb2wgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19SVENfQ1RSTCk7CisJaWYgKCEobS0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9SVENfRU4pCisJCQl8fCAobS0+cnRjX2NvbnRyb2wgJiBSVENfQ1RSTF9BTF9FTikKKwkJCXx8IChtLT5ydGNfY29udHJvbCAmIFJUQ19DVFJMX0VWRVJZX01BU0spKSB7CisJCWlmICghKG0tPnJ0Y19jb250cm9sICYgUlRDX0NUUkxfUlRDX0VOKSkgeworCQkJZGV2X3dhcm4oJm0tPmNsaWVudC0+ZGV2LCAicnRjIGNsb2NrIG5lZWRzIHNldHRpbmdcbiIpOworCQkJbS0+cnRjX2NvbnRyb2wgfD0gUlRDX0NUUkxfUlRDX0VOOworCQl9CisJCW0tPnJ0Y19jb250cm9sICY9IH5SVENfQ1RSTF9FVkVSWV9NQVNLOworCQltLT5ydGNfY29udHJvbCAmPSB+UlRDX0NUUkxfQUxfRU47CisJCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19SVENfQ1RSTCwgbS0+cnRjX2NvbnRyb2wpOworCX0KKworCW0tPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoRFJJVkVSX05BTUUsCisJCQkmbS0+Y2xpZW50LT5kZXYsCisJCQkmbWVuZWxhdXNfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIobS0+cnRjKSkgeworCQlpZiAoYWxhcm0pIHsKKwkJCW1lbmVsYXVzX3JlbW92ZV9pcnFfd29yayhNRU5FTEFVU19SVENBTE1fSVJRKTsKKwkJCWRldmljZV9pbml0X3dha2V1cCgmbS0+Y2xpZW50LT5kZXYsIDApOworCQl9CisJCWRldl9lcnIoJm0tPmNsaWVudC0+ZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgUlRDOiAlZFxuIiwKKwkJCQkoaW50KSBQVFJfRVJSKG0tPnJ0YykpOworCQl0aGVfbWVuZWxhdXMtPnJ0YyA9IE5VTEw7CisJfQorfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVuZWxhdXNfcnRjX2luaXQoc3RydWN0IG1lbmVsYXVzX2NoaXAgKm0pCit7CisJLyogbm90aGluZyAqLworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtZW5lbGF1c19pMmNfZHJpdmVyOworCitzdGF0aWMgaW50IG1lbmVsYXVzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1lbmVsYXVzX2NoaXAJKm1lbmVsYXVzOworCWludAkJCXJldiA9IDAsIHZhbDsKKwlpbnQJCQllcnIgPSAwOworCXN0cnVjdCBtZW5lbGF1c19wbGF0Zm9ybV9kYXRhICptZW5lbGF1c19wZGF0YSA9CisJCQkJCWNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAodGhlX21lbmVsYXVzKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAib25seSBvbmUgJXMgZm9yIG5vd1xuIiwKKwkJCQlEUklWRVJfTkFNRSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1lbmVsYXVzID0ga3phbGxvYyhzaXplb2YgKm1lbmVsYXVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1lbmVsYXVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIG1lbmVsYXVzKTsKKworCXRoZV9tZW5lbGF1cyA9IG1lbmVsYXVzOworCW1lbmVsYXVzLT5jbGllbnQgPSBjbGllbnQ7CisKKwkvKiBJZiBhIHRydWUgcHJvYmUgY2hlY2sgdGhlIGRldmljZSAqLworCXJldiA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX1JFVik7CisJaWYgKHJldiA8IDApIHsKKwkJcHJfZXJyKCJkZXZpY2Ugbm90IGZvdW5kIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDE7CisJfQorCisJLyogQWNrIGFuZCBkaXNhYmxlIGFsbCBNZW5lbGF1cyBpbnRlcnJ1cHRzICovCisJbWVuZWxhdXNfd3JpdGVfcmVnKE1FTkVMQVVTX0lOVF9BQ0sxLCAweGZmKTsKKwltZW5lbGF1c193cml0ZV9yZWcoTUVORUxBVVNfSU5UX0FDSzIsIDB4ZmYpOworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfTUFTSzEsIDB4ZmYpOworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19JTlRfTUFTSzIsIDB4ZmYpOworCW1lbmVsYXVzLT5tYXNrMSA9IDB4ZmY7CisJbWVuZWxhdXMtPm1hc2syID0gMHhmZjsKKworCS8qIFNldCBvdXRwdXQgYnVmZmVyIHN0cmVuZ3RocyAqLworCW1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19NQ1RfQ1RSTDEsIDB4NzMpOworCisJaWYgKGNsaWVudC0+aXJxID4gMCkgeworCQllcnIgPSByZXF1ZXN0X2lycShjbGllbnQtPmlycSwgbWVuZWxhdXNfaXJxLCBJUlFGX0RJU0FCTEVELAorCQkJCSAgRFJJVkVSX05BTUUsIG1lbmVsYXVzKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICAiY2FuJ3QgZ2V0IElSUSAlZCwgZXJyICVkIiwKKwkJCQkJY2xpZW50LT5pcnEsIGVycik7CisJCQlnb3RvIGZhaWwxOworCQl9CisJfQorCisJbXV0ZXhfaW5pdCgmbWVuZWxhdXMtPmxvY2spOworCUlOSVRfV09SSygmbWVuZWxhdXMtPndvcmssIG1lbmVsYXVzX3dvcmspOworCisJcHJfaW5mbygiTWVuZWxhdXMgcmV2ICVkLiVkXG4iLCByZXYgPj4gNCwgcmV2ICYgMHgwZik7CisKKwl2YWwgPSBtZW5lbGF1c19yZWFkX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMSk7CisJaWYgKHZhbCA8IDApCisJCWdvdG8gZmFpbDI7CisJaWYgKHZhbCAmICgxIDw8IDcpKQorCQltZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSA9IDE7CisJZWxzZQorCQltZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSA9IDA7CisKKwlpZiAobWVuZWxhdXNfcGRhdGEgIT0gTlVMTCAmJiBtZW5lbGF1c19wZGF0YS0+bGF0ZV9pbml0ICE9IE5VTEwpIHsKKwkJZXJyID0gbWVuZWxhdXNfcGRhdGEtPmxhdGVfaW5pdCgmY2xpZW50LT5kZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZmFpbDI7CisJfQorCisJbWVuZWxhdXNfcnRjX2luaXQobWVuZWxhdXMpOworCisJcmV0dXJuIDA7CitmYWlsMjoKKwlmcmVlX2lycShjbGllbnQtPmlycSwgbWVuZWxhdXMpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CitmYWlsMToKKwlrZnJlZShtZW5lbGF1cyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2V4aXQgbWVuZWxhdXNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1lbmVsYXVzX2NoaXAJKm1lbmVsYXVzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlmcmVlX2lycShjbGllbnQtPmlycSwgbWVuZWxhdXMpOworCWtmcmVlKG1lbmVsYXVzKTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKKwl0aGVfbWVuZWxhdXMgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWVuZWxhdXNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwl9LAorCS5wcm9iZQkJPSBtZW5lbGF1c19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKG1lbmVsYXVzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtZW5lbGF1c19pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCXJlcyA9IGkyY19hZGRfZHJpdmVyKCZtZW5lbGF1c19pMmNfZHJpdmVyKTsKKwlpZiAocmVzIDwgMCkgeworCQlwcl9lcnIoImRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lbmVsYXVzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWVuZWxhdXNfaTJjX2RyaXZlcik7CisKKwkvKiBGSVhNRTogU2h1dGRvd24gbWVuZWxhdXMgcGFydHMgdGhhdCBjYW4gYmUgc2h1dCBkb3duICovCit9CisKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzLCBJbmMuIChhbmQgb3RoZXJzKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgaW50ZXJmYWNlIGZvciBNZW5lbGF1cy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQobWVuZWxhdXNfaW5pdCk7Cittb2R1bGVfZXhpdChtZW5lbGF1c19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCBmNDI5YmU4Li5hMjFmNTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0xMjU4LDE5ICsxMjU4LDI1IEBACiAJc2V0X2JpdChQQ19ETUFfUkVDT01NRU5ERUQsICZwYy0+ZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogaWRlZmxvcHB5X2Jsb2NrcGNfY21kKGlkZWZsb3BweV9mbG9wcHlfdCAqZmxvcHB5LCBpZGVmbG9wcHlfcGNfdCAqcGMsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQkvKgotCSAqIGp1c3Qgc3VwcG9ydCBlamVjdCBmb3Igbm93LCBpdCB3b3VsZCBub3QgYmUgaGFyZCB0byBtYWtlIHRoZQotCSAqIFJFUV9CTE9DS19QQyBzdXBwb3J0IGZ1bGx5LWZlYXR1cmVkCi0JICovCi0JaWYgKHJxLT5jbWRbMF0gIT0gSURFRkxPUFBZX1NUQVJUX1NUT1BfQ01EKQotCQlyZXR1cm4gMTsKLQogCWlkZWZsb3BweV9pbml0X3BjKHBjKTsKKwlwYy0+Y2FsbGJhY2sgPSAmaWRlZmxvcHB5X3J3X2NhbGxiYWNrOwogCW1lbWNweShwYy0+YywgcnEtPmNtZCwgc2l6ZW9mKHBjLT5jKSk7Ci0JcmV0dXJuIDA7CisJcGMtPnJxID0gcnE7CisJcGMtPmJfY291bnQgPSBycS0+ZGF0YV9sZW47CisJaWYgKHJxLT5kYXRhX2xlbiAmJiBycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCisJCXNldF9iaXQoUENfV1JJVElORywgJnBjLT5mbGFncyk7CisJcGMtPmJ1ZmZlciA9IHJxLT5kYXRhOworCWlmIChycS0+YmlvKQorCQlzZXRfYml0KFBDX0RNQV9SRUNPTU1FTkRFRCwgJnBjLT5mbGFncyk7CisJCQorCS8qCisJICogcG9zc2libHkgcHJvYmxlbWF0aWMsIGRvZXNuJ3QgbG9vayBsaWtlIGlkZS1mbG9wcHkgY29ycmVjdGx5CisJICogaGFuZGxlZCBzY2F0dGVyZWQgcmVxdWVzdHMgaWYgZG1hIGZhaWxzLi4uCisJICovCisJcGMtPnJlcXVlc3RfdHJhbnNmZXIgPSBwYy0+YnVmZmVyX3NpemUgPSBycS0+ZGF0YV9sZW47CiB9CiAKIC8qCkBAIC0xMzE3LDEwICsxMzIzLDcgQEAKIAkJcGMgPSAoaWRlZmxvcHB5X3BjX3QgKikgcnEtPmJ1ZmZlcjsKIAl9IGVsc2UgaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewogCQlwYyA9IGlkZWZsb3BweV9uZXh0X3BjX3N0b3JhZ2UoZHJpdmUpOwotCQlpZiAoaWRlZmxvcHB5X2Jsb2NrcGNfY21kKGZsb3BweSwgcGMsIHJxKSkgewotCQkJaWRlZmxvcHB5X2RvX2VuZF9yZXF1ZXN0KGRyaXZlLCAwLCAwKTsKLQkJCXJldHVybiBpZGVfc3RvcHBlZDsKLQkJfQorCQlpZGVmbG9wcHlfYmxvY2twY19jbWQoZmxvcHB5LCBwYywgcnEpOwogCX0gZWxzZSB7CiAJCWJsa19kdW1wX3JxX2ZsYWdzKHJxLAogCQkJImlkZS1mbG9wcHk6IHVuc3VwcG9ydGVkIGNvbW1hbmQgaW4gcXVldWUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wcm9iZS5jIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKaW5kZXggY2M1ODAxMy4uNWE0YzVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMKQEAgLTEwNzMsMTQgKzEwNzMsMTQgQEAKIAkJaHdncm91cC0+aHdpZi0+bmV4dCA9IGh3aWY7CiAJCXNwaW5fdW5sb2NrX2lycSgmaWRlX2xvY2spOwogCX0gZWxzZSB7Ci0JCWh3Z3JvdXAgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKGlkZV9od2dyb3VwX3QpLCBHRlBfS0VSTkVMLAorCQlod2dyb3VwID0ga21hbGxvY19ub2RlKHNpemVvZihpZGVfaHdncm91cF90KSwKKwkJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCiAJCQkJCWh3aWZfdG9fbm9kZShod2lmLT5kcml2ZXNbMF0uaHdpZikpOwogCQlpZiAoIWh3Z3JvdXApCiAJICAgICAgIAkJZ290byBvdXRfdXA7CiAKIAkJaHdpZi0+aHdncm91cCA9IGh3Z3JvdXA7CiAKLQkJbWVtc2V0KGh3Z3JvdXAsIDAsIHNpemVvZihpZGVfaHdncm91cF90KSk7CiAJCWh3Z3JvdXAtPmh3aWYgICAgID0gaHdpZi0+bmV4dCA9IGh3aWY7CiAJCWh3Z3JvdXAtPnJxICAgICAgID0gTlVMTDsKIAkJaHdncm91cC0+aGFuZGxlciAgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLmMgYi9kcml2ZXJzL2lkZS9pZGUuYwppbmRleCBjOTQ4YTVjLi44Y2Q3Njk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUuYwpAQCAtMTA0OSw5ICsxMDQ5LDEzIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZGVfZHJpdmVyX3QgKmRydjsKIAl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgZXJyID0gMCwgKCpzZXRmdW5jKShpZGVfZHJpdmVfdCAqLCBpbnQpOworCWludCBlcnIsICgqc2V0ZnVuYykoaWRlX2RyaXZlX3QgKiwgaW50KTsKIAl1OCAqdmFsOwogCisJZXJyID0gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmRldi0+YmRfZGlzay0+cXVldWUsIGJkZXYtPmJkX2Rpc2ssIGNtZCwgcCk7CisJaWYgKGVyciAhPSAtRU5PVFRZKQorCQlyZXR1cm4gZXJyOworCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEhESU9fR0VUXzMyQklUOgkgICAgdmFsID0gJmRyaXZlLT5pb18zMmJpdDsJIGdvdG8gcmVhZF92YWw7CiAJY2FzZSBIRElPX0dFVF9LRUVQU0VUVElOR1M6IHZhbCA9ICZkcml2ZS0+a2VlcF9zZXR0aW5nczsgZ290byByZWFkX3ZhbDsKQEAgLTExNzEsMTAgKzExNzUsNiBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQljYXNlIENEUk9NRUpFQ1Q6Ci0JCWNhc2UgQ0RST01DTE9TRVRSQVk6Ci0JCQlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZmlsZSwgYmRldi0+YmRfZGlzaywgY21kLCBwKTsKLQogCQljYXNlIEhESU9fR0VUX0JVU1NUQVRFOgogCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQkJCXJldHVybiAtRUFDQ0VTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmMgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYwppbmRleCAwZmM4YzZlLi5lZTQ1MjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgpAQCAtMTEyOCw4ICsxMTI5LDYgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHRtcDsKIAlpbnQgbWF5X3NjaGVkdWxlOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCiAJCUlOSVRfTElTVF9IRUFEKCZ0bXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCA1MWExMjA2Li4yZmZkNTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtMTY5OSw2ICsxNjk5LDcgQEAKIAl1bnNpZ25lZCBpbnQgZywgZ2VuZXJhdGlvbiA9IDA7CiAJaW50IGksIHJlc2V0X2N5Y2xlcyA9IDA7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJLyogU2V0dXAgb3VyIGRldmljZS1tb2RlbCBlbnRyaWVzICovCiAJbm9kZW1ncl9jcmVhdGVfaG9zdF9kZXZfZmlsZXMoaG9zdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwppbmRleCBiZDY4NmEyLi4yMDg5NmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCkBAIC00NDUsNiArNDQ1LDcgQEAKIAogc3RhdGljIGludCBnYW1lcG9ydF90aHJlYWQodm9pZCAqbm90aGluZykKIHsKKwlzZXRfZnJlZXphYmxlKCk7CiAJZG8gewogCQlnYW1lcG9ydF9oYW5kbGVfZXZlbnQoKTsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGdhbWVwb3J0X3dhaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKaW5kZXggYThmM2JjMS4uMzcyY2E0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwpAQCAtMzg0LDYgKzM4NCw3IEBACiAKIHN0YXRpYyBpbnQgc2VyaW9fdGhyZWFkKHZvaWQgKm5vdGhpbmcpCiB7CisJc2V0X2ZyZWV6YWJsZSgpOwogCWRvIHsKIAkJc2VyaW9faGFuZGxlX2V2ZW50KCk7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXJpb193YWl0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91Y2IxNDAwX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYwppbmRleCBmMGNiY2RiLi4zNmY5NDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYwpAQCAtMjkyLDYgKzI5Miw3IEBACiAKIAlzY2hlZF9zZXRzY2hlZHVsZXIodHNrLCBTQ0hFRF9GSUZPLCAmcGFyYW0pOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXVuc2lnbmVkIGludCB4LCB5LCBwOwogCQlsb25nIHRpbWVvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9LY29uZmlnCmluZGV4IDNlMDg4YzQuLmNmOTA2YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXNkbi9LY29uZmlnCkBAIC0yLDEyICsyLDEwIEBACiAjIElTRE4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiSVNETiBzdWJzeXN0ZW0iCi0JZGVwZW5kcyBvbiAhUzM5MAotCi1jb25maWcgSVNETgorbWVudWNvbmZpZyBJU0ROCiAJdHJpc3RhdGUgIklTRE4gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5FVAorCWRlcGVuZHMgb24gIVMzOTAKIAktLS1oZWxwLS0tCiAJICBJU0ROICgiSW50ZWdyYXRlZCBTZXJ2aWNlcyBEaWdpdGFsIE5ldHdvcmtzIiwgY2FsbGVkIFJOSVMgaW4gRnJhbmNlKQogCSAgaXMgYSBzcGVjaWFsIHR5cGUgb2YgZnVsbHkgZGlnaXRhbCB0ZWxlcGhvbmUgc2VydmljZTsgaXQncyBtb3N0bHkKQEAgLTIxLDkgKzE5LDkgQEAKIAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHlvdXIga2VybmVsIHRvIHN1cHBvcnQgSVNETi4KIAoraWYgSVNETgogCiBtZW51ICJPbGQgSVNETjRMaW51eCIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROCiAKIGNvbmZpZyBJU0ROX0k0TAogCXRyaXN0YXRlICJPbGQgSVNETjRMaW51eCAoZGVwcmVjYXRlZCkiCkBAIC01MCwyMCArNDgsMjEgQEAKIGVuZG1lbnUKIAogY29tbWVudCAiQ0FQSSBzdWJzeXN0ZW0iCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETgogCiBjb25maWcgSVNETl9DQVBJCiAJdHJpc3RhdGUgIkNBUEkyLjAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE4KIAloZWxwCiAJICBUaGlzIHByb3ZpZGVzIHRoZSBDQVBJIChDb21tb24gSVNETiBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZwogCSAgSW50ZXJmYWNlLCBhIHN0YW5kYXJkIG1ha2luZyBpdCBlYXN5IGZvciBwcm9ncmFtcyB0byBhY2Nlc3MgSVNETgogCSAgaGFyZHdhcmUsIHNlZSA8aHR0cDovL3d3dy5jYXBpLm9yZy8+LiAgVGhpcyBpcyBuZWVkZWQgZm9yIEFWTSdzIHNldAogCSAgb2YgYWN0aXZlIElTRE4gY29udHJvbGxlcnMgbGlrZSBCMSwgVDEsIE0xLgogCitpZiBJU0ROX0NBUEkKKwogc291cmNlICJkcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9oYXJkd2FyZS9LY29uZmlnIgogCi1lbmRtZW51CitlbmRpZiAjIElTRE5fQ0FQSQogCitlbmRpZiAjIElTRE4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vY2FwaS9LY29uZmlnCmluZGV4IGM5MmY5ZDcuLmUxYWZkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9jYXBpL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKICMKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9WRVJCT1NFX1JFQVNPTgogCWJvb2wgIlZlcmJvc2UgcmVhc29uIGNvZGUgcmVwb3J0aW5nIgotCWRlcGVuZHMgb24gSVNETl9DQVBJCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBDQVBJIGRyaXZlcnMgd2lsbCBnaXZlIHZlcmJvc2UgcmVhc29ucyBmb3IKQEAgLTEyLDcgKzExLDYgQEAKIAogY29uZmlnIENBUElfVFJBQ0UKIAlib29sICJDQVBJIHRyYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIGtlcm5lbGNhcGkgZHJpdmVyIGNhbiBtYWtlIHZlcmJvc2UgdHJhY2VzCkBAIC0yMyw3ICsyMSw3IEBACiAKIGNvbmZpZyBJU0ROX0NBUElfTUlERExFV0FSRQogCWJvb2wgIkNBUEkyLjAgTWlkZGxld2FyZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gSVNETl9DQVBJICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gd2lsbCBlbmhhbmNlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIC9kZXYvY2FwaTIwCiAJICBpbnRlcmZhY2UuICBJdCB3aWxsIHByb3ZpZGUgYSBtZWFucyBvZiBtb3ZpbmcgYSBkYXRhIGNvbm5lY3Rpb24sCkBAIC0zMyw3ICszMSw2IEBACiAKIGNvbmZpZyBJU0ROX0NBUElfQ0FQSTIwCiAJdHJpc3RhdGUgIkNBUEkyLjAgL2Rldi9jYXBpIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0NBUEkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiB3aWxsIHByb3ZpZGUgdGhlIENBUEkgMi4wIGludGVyZmFjZSB0byB1c2Vyc3BhY2UKIAkgIGFwcGxpY2F0aW9ucyB2aWEgL2Rldi9jYXBpMjAuIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZQpAQCAtNTYsNyArNTMsNyBAQAogCiBjb25maWcgSVNETl9DQVBJX0NBUElEUlYKIAl0cmlzdGF0ZSAiQ0FQSTIuMCBjYXBpZHJ2IGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9DQVBJICYmIElTRE5fSTRMCisJZGVwZW5kcyBvbiBJU0ROX0k0TAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHRoZSBnbHVlIGNvZGUgdG8gaG9vayB1cCBDQVBJIGRyaXZlbiBjYXJkcyB0bwogCSAgdGhlIGxlZ2FjeSBpc2RuNGxpbnV4IGxpbmsgbGF5ZXIuICBJZiB5b3UgaGF2ZSBhIGNhcmQgd2hpY2ggaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGkuYwppbmRleCA4MTY2MWI4Li5mNDQ5ZGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaS5jCkBAIC01NDksNyArNTQ5LDcgQEAKIAkJY2FwaW1zZ19zZXR1OCAoc2tiLT5kYXRhLCA1LCBDQVBJX1JFUSk7CiAJCWNhcGltc2dfc2V0dTE2KHNrYi0+ZGF0YSwgNiwgbXAtPm1zZ2lkKyspOwogCQljYXBpbXNnX3NldHUzMihza2ItPmRhdGEsIDgsIG1wLT5uY2NpKTsJLyogTkNDSSAqLwotCQljYXBpbXNnX3NldHUzMihza2ItPmRhdGEsIDEyLCAodTMyKSBza2ItPmRhdGEpOyAvKiBEYXRhMzIgKi8KKwkJY2FwaW1zZ19zZXR1MzIoc2tiLT5kYXRhLCAxMiwgKHUzMikobG9uZylza2ItPmRhdGEpOy8qIERhdGEzMiAqLwogCQljYXBpbXNnX3NldHUxNihza2ItPmRhdGEsIDE2LCBsZW4pOwkvKiBEYXRhIGxlbmd0aCAqLwogCQljYXBpbXNnX3NldHUxNihza2ItPmRhdGEsIDE4LCBkYXRhaGFuZGxlKTsKIAkJY2FwaW1zZ19zZXR1MTYoc2tiLT5kYXRhLCAyMCwgMCk7CS8qIEZsYWdzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGkuYwppbmRleCAzZWQzNGY3Li45ZjczYmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpLmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCWlmICgoIWFwKSB8fCAoYXAtPnJlbGVhc2VfaW5fcHJvZ3Jlc3MpKQogCQlyZXR1cm47CiAKLQlkb3duKCZhcC0+cmVjdl9zZW0pOworCW11dGV4X2xvY2soJmFwLT5yZWN2X210eCk7CiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYXAtPnJlY3ZfcXVldWUpKSkgewogCQlpZiAoQ0FQSU1TR19DTUQoc2tiLT5kYXRhKSA9PSBDQVBJX0RBVEFfQjNfSU5EKQogCQkJYXAtPm5yZWN2ZGF0YXBrdCsrOwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAKIAkJYXAtPnJlY3ZfbWVzc2FnZShhcCwgc2tiKTsKIAl9Ci0JdXAoJmFwLT5yZWN2X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZhcC0+cmVjdl9tdHgpOwogfQogCiB2b2lkIGNhcGlfY3RyX2hhbmRsZV9tZXNzYWdlKHN0cnVjdCBjYXBpX2N0ciAqIGNhcmQsIHUxNiBhcHBsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJYXAtPm5zZW50Y3RscGt0ID0gMDsKIAlhcC0+bnNlbnRkYXRhcGt0ID0gMDsKIAlhcC0+Y2FsbGJhY2sgPSBOVUxMOwotCWluaXRfTVVURVgoJmFwLT5yZWN2X3NlbSk7CisJbXV0ZXhfaW5pdCgmYXAtPnJlY3ZfbXR4KTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZhcC0+cmVjdl9xdWV1ZSk7CiAJSU5JVF9XT1JLKCZhcC0+cmVjdl93b3JrLCByZWN2X2hhbmRsZXIpOwogCWFwLT5yZWxlYXNlX2luX3Byb2dyZXNzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYyBiL2RyaXZlcnMvaXNkbi9jYXBpL2tjYXBpX3Byb2MuYwppbmRleCAzMWY0ZmQ4Li44NDVhNzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9rY2FwaV9wcm9jLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkva2NhcGlfcHJvYy5jCkBAIC0yNDMsMzYgKzI0MywxNSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCi1zdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgY2FwaV9kcml2ZXIgKmNhcGlfZHJpdmVyX2dldF9pZHgobG9mZl90IHBvcykKLXsKLQlzdHJ1Y3QgY2FwaV9kcml2ZXIgKmRydiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKLQlsb2ZmX3QgaTsKLQotCWkgPSAwOwotCWxpc3RfZm9yX2VhY2gobCwgJmNhcGlfZHJpdmVycykgewotCQlkcnYgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBjYXBpX2RyaXZlciwgbGlzdCk7Ci0JCWlmIChpKysgPT0gcG9zKQotCQkJcmV0dXJuIGRydjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyB2b2lkICpjYXBpX2RyaXZlcl9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGNhcGlfZHJpdmVyICpkcnY7CiAJcmVhZF9sb2NrKCZjYXBpX2RyaXZlcnNfbGlzdF9sb2NrKTsKLQlkcnYgPSBjYXBpX2RyaXZlcl9nZXRfaWR4KCpwb3MpOwotCXJldHVybiBkcnY7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZjYXBpX2RyaXZlcnMsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqY2FwaV9kcml2ZXJfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGNhcGlfZHJpdmVyICpkcnYgPSAoc3RydWN0IGNhcGlfZHJpdmVyICopdjsKLQkrKypwb3M7Ci0JaWYgKGRydi0+bGlzdC5uZXh0ID09ICZjYXBpX2RyaXZlcnMpIHJldHVybiBOVUxMOwotCXJldHVybiBsaXN0X2VudHJ5KGRydi0+bGlzdC5uZXh0LCBzdHJ1Y3QgY2FwaV9kcml2ZXIsIGxpc3QpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZjYXBpX2RyaXZlcnMsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNhcGlfZHJpdmVyX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCkBAIC0yODIsNyArMjYxLDggQEAKIAogc3RhdGljIGludCBjYXBpX2RyaXZlcl9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCXN0cnVjdCBjYXBpX2RyaXZlciAqZHJ2ID0gKHN0cnVjdCBjYXBpX2RyaXZlciAqKXY7CisJc3RydWN0IGNhcGlfZHJpdmVyICpkcnYgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBjYXBpX2RyaXZlciwgbGlzdCk7CisKIAlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzICVzXG4iLCBkcnYtPm5hbWUsIGRydi0+cmV2aXNpb24pOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvS2NvbmZpZwppbmRleCAxMzlmMTk3Li4zMGQwMjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvS2NvbmZpZwpAQCAtMiw3ICsyLDYgQEAKICMgSVNETiBoYXJkd2FyZSBkcml2ZXJzCiAjCiBjb21tZW50ICJDQVBJIGhhcmR3YXJlIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETiAmJiBJU0ROX0NBUEkKIAogc291cmNlICJkcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vS2NvbmZpZwppbmRleCAyOWEzMmE4Li41ZGJjYmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL0tjb25maWcKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9LY29uZmlnCkBAIC0yLDIzICsyLDIyIEBACiAjIElTRE4gQVZNIGRyaXZlcnMKICMKIAotbWVudSAiQWN0aXZlIEFWTSBjYXJkcyIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJU0ROICYmIElTRE5fQ0FQSSE9bgotCi1jb25maWcgQ0FQSV9BVk0KLQlib29sICJTdXBwb3J0IEFWTSBjYXJkcyIKK21lbnVjb25maWcgQ0FQSV9BVk0KKwlib29sICJBY3RpdmUgQVZNIGNhcmRzIgogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBVk0gYWN0aXZlIElTRE4gY2FyZHMuCiAKK2lmIENBUElfQVZNCisKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9CMUlTQQogCXRyaXN0YXRlICJBVk0gQjEgSVNBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkgJiYgSVNBCisJZGVwZW5kcyBvbiBJU0EKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIElTQSB2ZXJzaW9uIG9mIHRoZSBBVk0gQjEgY2FyZC4KIAogY29uZmlnIElTRE5fRFJWX0FWTUIxX0IxUENJCiAJdHJpc3RhdGUgIkFWTSBCMSBQQ0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgUENJIHZlcnNpb24gb2YgdGhlIEFWTSBCMSBjYXJkLgogCkBAIC0zMCwxNCArMjksMTMgQEAKIAogY29uZmlnIElTRE5fRFJWX0FWTUIxX1QxSVNBCiAJdHJpc3RhdGUgIkFWTSBUMS9UMS1CIElTQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJICYmIElTQQorCWRlcGVuZHMgb24gSVNBCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBBVk0gVDEgVDFCIGNhcmQuCiAJICBOb3RlOiBUaGlzIGlzIGEgUFJJIGNhcmQgYW5kIGhhbmRsZSAzMCBCLWNoYW5uZWxzLgogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfQjFQQ01DSUEKIAl0cmlzdGF0ZSAiQVZNIEIxL00xL00yIFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0FQSV9BVk0gJiYgSVNETl9DQVBJCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBQQ01DSUEgdmVyc2lvbiBvZiB0aGUgQVZNIEIxIGNhcmQuCiAKQEAgLTUwLDE3ICs0OCwxNiBAQAogCiBjb25maWcgSVNETl9EUlZfQVZNQjFfVDFQQ0kKIAl0cmlzdGF0ZSAiQVZNIFQxL1QxLUIgUENJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBDQVBJX0FWTSAmJiBJU0ROX0NBUEkgJiYgUENJCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEFWTSBUMSBUMUIgY2FyZC4KIAkgIE5vdGU6IFRoaXMgaXMgYSBQUkkgY2FyZCBhbmQgaGFuZGxlIDMwIEItY2hhbm5lbHMuCiAKIGNvbmZpZyBJU0ROX0RSVl9BVk1CMV9DNAogCXRyaXN0YXRlICJBVk0gQzQvQzIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENBUElfQVZNICYmIElTRE5fQ0FQSSAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQVZNIEM0L0MyIFBDSSBjYXJkcy4KIAkgIFRoZXNlIGNhcmRzIGhhbmRsZSA0LzIgQlJJIElTRE4gbGluZXMgKDgvNCBjaGFubmVscykuCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBDQVBJX0FWTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL0tjb25maWcgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vS2NvbmZpZwppbmRleCAwMWQ0YWZkLi42MDgyYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vS2NvbmZpZwpAQCAtMiw1MiArMiw1MCBAQAogIyBJU0ROIERJVkFTIEVpY29uIGRyaXZlcgogIwogCi1tZW51ICJBY3RpdmUgRWljb24gRElWQSBTZXJ2ZXIgY2FyZHMiCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETiAmJiBJU0ROX0NBUEkhPW4KLQotY29uZmlnIENBUElfRUlDT04KLQlib29sICJTdXBwb3J0IEVpY29uIGNhcmRzIgorbWVudWNvbmZpZyBDQVBJX0VJQ09OCisJYm9vbCAiQWN0aXZlIEVpY29uIERJVkEgU2VydmVyIGNhcmRzIgogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBFaWNvbiBOZXR3b3JrcyBhY3RpdmUgSVNETiBjYXJkcy4KIAoraWYgQ0FQSV9FSUNPTgorCiBjb25maWcgSVNETl9ESVZBUwogCXRyaXN0YXRlICJTdXBwb3J0IEVpY29uIERJVkEgU2VydmVyIGNhcmRzIgotCWRlcGVuZHMgb24gQ0FQSV9FSUNPTiAmJiBQUk9DX0ZTICYmIFBDSQorCWRlcGVuZHMgb24gUFJPQ19GUyAmJiBQQ0kKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEVpY29uIE5ldHdvcmtzIERJVkEgU2VydmVyIFBDSSBJU0ROIGNhcmQuCiAJICBJbiBvcmRlciB0byB1c2UgdGhpcyBjYXJkLCBhZGRpdGlvbmFsIGZpcm13YXJlIGlzIG5lY2Vzc2FyeSwgd2hpY2gKIAkgIGhhcyB0byBiZSBkb3dubG9hZGVkIGludG8gdGhlIGNhcmQgdXNpbmcgdGhlIGRpdmFjdHJsIHV0aWxpdHkuCiAKK2lmIElTRE5fRElWQVMKKwogY29uZmlnIElTRE5fRElWQVNfQlJJUENJCiAJYm9vbCAiRElWQSBTZXJ2ZXIgQlJJL1BDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9ESVZBUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBESVZBIFNlcnZlciBCUkktUENJLgogCiBjb25maWcgSVNETl9ESVZBU19QUklQQ0kKIAlib29sICJESVZBIFNlcnZlciBQUkkvUENJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERJVkEgU2VydmVyIFBSSS1QQ0kuCiAKIGNvbmZpZyBJU0ROX0RJVkFTX0RJVkFDQVBJCiAJdHJpc3RhdGUgIkRJVkEgQ0FQSTIuMCBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTRE5fRElWQVMgJiYgSVNETl9DQVBJCiAJaGVscAogCSAgWW91IG5lZWQgdGhpcyB0byBwcm92aWRlIHRoZSBDQVBJIGludGVyZmFjZQogCSAgZm9yIERJVkEgU2VydmVyIGNhcmRzLgogCiBjb25maWcgSVNETl9ESVZBU19VU0VSSURJCiAJdHJpc3RhdGUgIkRJVkEgVXNlci1JREkgaW50ZXJmYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0ROX0RJVkFTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHVzZXItbW9kZSBJREkgaW50ZXJmYWNlLgogCiBjb25maWcgSVNETl9ESVZBU19NQUlOVAogCXRyaXN0YXRlICJESVZBIE1haW50IGRyaXZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNETl9ESVZBUyAmJiBtCisJZGVwZW5kcyBvbiBtCiAJaGVscAogCSAgRW5hYmxlIERpdmFzIE1haW50ZW5hbmNlIGRyaXZlci4KIAotZW5kbWVudQorZW5kaWYgIyBJU0ROX0RJVkFTCiAKK2VuZGlmICMgQ0FQSV9FSUNPTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lkaWZ1bmMuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9pZGlmdW5jLmMKaW5kZXggNGNiYzY4Yy4uZGI4N2Q1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2VpY29uL2lkaWZ1bmMuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vaWRpZnVuYy5jCkBAIC0xMDYsNiArMTA2LDcgQEAKIAl9IGVsc2UgewogCQlEQkdfRVJSKCgiY291bGQgbm90IGNyZWF0ZSB1c2VyIG1vZGUgaWRpIGNhcmQgJWQiLAogCQkJIGFkYXB0ZXJfbnIpKTsKKwkJZGl2YV9vc19mcmVlKDAsIGNhcmQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jCmluZGV4IDhkNTNhN2YuLmE0MzE2MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKQEAgLTM2MSwxMSArMzYxLDExIEBACiAKIGludCBucmNhcmRzOwogCi1leHRlcm4gY2hhciAqbDFfcmV2aXNpb247Ci1leHRlcm4gY2hhciAqbDJfcmV2aXNpb247Ci1leHRlcm4gY2hhciAqbDNfcmV2aXNpb247Ci1leHRlcm4gY2hhciAqbGxpX3JldmlzaW9uOwotZXh0ZXJuIGNoYXIgKnRlaV9yZXZpc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICpsMV9yZXZpc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICpsMl9yZXZpc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICpsM19yZXZpc2lvbjsKK2V4dGVybiBjb25zdCBjaGFyICpsbGlfcmV2aXNpb247CitleHRlcm4gY29uc3QgY2hhciAqdGVpX3JldmlzaW9uOwogCiBjaGFyICpIaVNheF9nZXRyZXYoY29uc3QgY2hhciAqcmV2aXNpb24pCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMKaW5kZXggMDMwZDE2Mi4uYWQwNmYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYwpAQCAtNDUxLDYgKzQ1MSw5IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuKDApOwogCQljYXNlIENBUkRfUkVMRUFTRToKKwkJCWlmIChjcy0+aHcuc2VkbC5idXMgPT0gU0VETF9CVVNfUENJKQorCQkJCS8qIGRpc2FibGUgYWxsIElSUSAqLworCQkJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgNSwgMCk7CiAJCQlpZiAoY3MtPmh3LnNlZGwuY2hpcCA9PSBTRURMX0NISVBfSVNBQ19JU0FSKSB7CiAJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CiAJCQkJd3JpdGVyZWcoY3MtPmh3LnNlZGwuYWRyLCBjcy0+aHcuc2VkbC5oc2N4LApAQCAtNDY4LDYgKzQ3MSw5IEBACiAJCQlyZXR1cm4oMCk7CiAJCWNhc2UgQ0FSRF9JTklUOgogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY3MtPmh3LnNlZGwuYnVzID09IFNFRExfQlVTX1BDSSkKKwkJCQkvKiBlbmFibGUgYWxsIElSUSAqLworCQkJCWJ5dGVvdXQoY3MtPmh3LnNlZGwuY2ZnX3JlZysgNSwgMHgwMik7CiAJCQlyZXNldF9zZWRsYmF1ZXIoY3MpOwogCQkJaWYgKGNzLT5ody5zZWRsLmNoaXAgPT0gU0VETF9DSElQX0lTQUNfSVNBUikgewogCQkJCWNsZWFyX3BlbmRpbmdfaXNhY19pbnRzKGNzKTsKQEAgLTY2Nyw3ICs2NzMsNyBAQAogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcsIDB4ZmYpOwogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcsIDB4MDApOwogCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcrIDIsIDB4ZGQpOwotCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcrIDUsIDB4MDIpOworCQlieXRlb3V0KGNzLT5ody5zZWRsLmNmZ19yZWcrIDUsIDApOyAvKiBkaXNhYmxlIGFsbCBJUlEgKi8KIAkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnICszLCBjcy0+aHcuc2VkbC5yZXNldF9vbik7CiAJCW1kZWxheSgyKTsKIAkJYnl0ZW91dChjcy0+aHcuc2VkbC5jZmdfcmVnICszLCBjcy0+aHcuc2VkbC5yZXNldF9vZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnIGIvZHJpdmVycy9pc2RuL2k0bC9LY29uZmlnCmluZGV4IDNlZjU2N2IuLmU5MWMxODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvS2NvbmZpZworKysgYi9kcml2ZXJzL2lzZG4vaTRsL0tjb25maWcKQEAgLTg2LDcgKzg2LDYgQEAKIAogCiBtZW51ICJJU0ROIGZlYXR1cmUgc3VibW9kdWxlcyIKLQlkZXBlbmRzIG9uIElTRE4KIAogY29uZmlnIElTRE5fRFJWX0xPT1AKIAl0cmlzdGF0ZSAiaXNkbmxvb3Agc3VwcG9ydCIKQEAgLTEwMCw3ICs5OSw3IEBACiAKIGNvbmZpZyBJU0ROX0RJVkVSU0lPTgogCXRyaXN0YXRlICJTdXBwb3J0IGlzZG4gZGl2ZXJzaW9uIHNlcnZpY2VzIgotCWRlcGVuZHMgb24gSVNETiAmJiBJU0ROX0k0TAorCWRlcGVuZHMgb24gSVNETl9JNEwKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHVzZSBzb21lIHN1cHBsZW1lbnRhcnkgZGl2ZXJzaW9uCiAJICBzZXJ2aWNlcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBIaVNheCBkcml2ZXIgb24gYW4gRVVSTy9EU1MxCkBAIC0xMjAsMTMgKzExOSwxMyBAQAogZW5kbWVudQogCiBjb21tZW50ICJJU0RONExpbnV4IGhhcmR3YXJlIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETiAmJiBJU0ROX0k0TAorCWRlcGVuZHMgb24gSVNETl9JNEwKIAogc291cmNlICJkcml2ZXJzL2lzZG4vaGlzYXgvS2NvbmZpZyIKIAogCiBtZW51ICJBY3RpdmUgY2FyZHMiCi0JZGVwZW5kcyBvbiBORVQgJiYgSVNETiAmJiBJU0ROX0k0TCE9bgorCWRlcGVuZHMgb24gSVNETl9JNEwhPW4KIAogc291cmNlICJkcml2ZXJzL2lzZG4vaWNuL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKaW5kZXggYWRmZWEzYy4uYmM3N2M1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiLmMKQEAgLTI0OCwyMSArMjQ4LDE1IEBACiBzdGF0aWMgaW50CiBhZGJfcHJvYmVfdGFzayh2b2lkICp4KQogewotCXNpZ3NldF90IGJsb2NrZWQ7Ci0KIAlzdHJjcHkoY3VycmVudC0+Y29tbSwgImthZGJwcm9iZSIpOwogCi0Jc2lnZmlsbHNldCgmYmxvY2tlZCk7Ci0Jc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYmxvY2tlZCwgTlVMTCk7Ci0JZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKLQogCXByaW50ayhLRVJOX0lORk8gImFkYjogc3RhcnRpbmcgcHJvYmUgdGFzay4uLlxuIik7CiAJZG9fYWRiX3Jlc2V0X2J1cygpOwogCXByaW50ayhLRVJOX0lORk8gImFkYjogZmluaXNoZWQgcHJvYmUgdGFzay4uLlxuIik7Ci0JCisKIAlhZGJfcHJvYmVfdGFza19waWQgPSAwOwogCXVwKCZhZGJfcHJvYmVfbXV0ZXgpOwotCQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCBiZDU1ZTZhLi5mMjU2ODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC0zMzUsNiArMzM1LDcgQEAKIHsKIAlzdHJ1Y3QgdGhlcm1vc3RhdCogdGggPSBhcmc7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQl0cnlfdG9fZnJlZXplKCk7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fY29yZS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fY29yZS5jCmluZGV4IDRmY2IyNDUuLmUxOGQyNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX2NvcmUuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9jb3JlLmMKQEAgLTkyLDYgKzkyLDcgQEAKIAogCURCRygid2Y6IHRocmVhZCBzdGFydGVkXG4iKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIG5leHQpKSB7CiAJCQl3Zl9ub3RpZnkoV0ZfRVZFTlRfVElDSywgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL0tjb25maWcgYi9kcml2ZXJzL21kL0tjb25maWcKaW5kZXggNjRiZjNhOC4uNTMxZDRkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMiwxOSArMiwxNyBAQAogIyBCbG9jayBkZXZpY2UgZHJpdmVyIGNvbmZpZ3VyYXRpb24KICMKIAotaWYgQkxPQ0sKLQotbWVudSAiTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkiCi0KLWNvbmZpZyBNRAorbWVudWNvbmZpZyBNRAogCWJvb2wgIk11bHRpcGxlIGRldmljZXMgZHJpdmVyIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkiCisJZGVwZW5kcyBvbiBCTE9DSwogCWhlbHAKIAkgIFN1cHBvcnQgbXVsdGlwbGUgcGh5c2ljYWwgc3BpbmRsZXMgdGhyb3VnaCBhIHNpbmdsZSBsb2dpY2FsIGRldmljZS4KIAkgIFJlcXVpcmVkIGZvciBSQUlEIGFuZCBsb2dpY2FsIHZvbHVtZSBtYW5hZ2VtZW50LgogCitpZiBNRAorCiBjb25maWcgQkxLX0RFVl9NRAogCXRyaXN0YXRlICJSQUlEIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNRAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIGxldHMgeW91IGNvbWJpbmUgc2V2ZXJhbCBoYXJkIGRpc2sgcGFydGl0aW9ucyBpbnRvIG9uZQogCSAgbG9naWNhbCBibG9jayBkZXZpY2UuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2ltcGx5IGFwcGVuZCBvbmUKQEAgLTE5MSw3ICsxODksNiBAQAogCiBjb25maWcgQkxLX0RFVl9ETQogCXRyaXN0YXRlICJEZXZpY2UgbWFwcGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNRAogCS0tLWhlbHAtLS0KIAkgIERldmljZS1tYXBwZXIgaXMgYSBsb3cgbGV2ZWwgdm9sdW1lIG1hbmFnZXIuICBJdCB3b3JrcyBieSBhbGxvd2luZwogCSAgcGVvcGxlIHRvIHNwZWNpZnkgbWFwcGluZ3MgZm9yIHJhbmdlcyBvZiBsb2dpY2FsIHNlY3RvcnMuICBWYXJpb3VzCkBAIC0yNzksNiArMjc2LDQgQEAKIAogCUlmIHVuc3VyZSwgc2F5IE4uCiAKLWVuZG1lbnUKLQotZW5kaWYKK2VuZGlmICMgTUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYml0bWFwLmMgYi9kcml2ZXJzL21kL2JpdG1hcC5jCmluZGV4IDk2MjBkNDUuLjkyN2NiMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYml0bWFwLmMKKysrIGIvZHJpdmVycy9tZC9iaXRtYXAuYwpAQCAtMjY4LDYgKzI2OCwzMSBAQAogCQkJaWYgKHBhZ2UtPmluZGV4ID09IGJpdG1hcC0+ZmlsZV9wYWdlcy0xKQogCQkJCXNpemUgPSByb3VuZHVwKGJpdG1hcC0+bGFzdF9wYWdlX3NpemUsCiAJCQkJCSAgICAgICBiZGV2X2hhcmRzZWN0X3NpemUocmRldi0+YmRldikpOworCQkJLyogSnVzdCBtYWtlIHN1cmUgd2UgYXJlbid0IGNvcnJ1cHRpbmcgZGF0YSBvcgorCQkJICogbWV0YWRhdGEKKwkJCSAqLworCQkJaWYgKGJpdG1hcC0+b2Zmc2V0IDwgMCkgeworCQkJCS8qIERBVEEgIEJJVE1BUCBNRVRBREFUQSAgKi8KKwkJCQlpZiAoYml0bWFwLT5vZmZzZXQKKwkJCQkgICAgKyBwYWdlLT5pbmRleCAqIChQQUdFX1NJWkUvNTEyKQorCQkJCSAgICArIHNpemUvNTEyID4gMCkKKwkJCQkJLyogYml0bWFwIHJ1bnMgaW4gdG8gbWV0YWRhdGEgKi8KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKHJkZXYtPmRhdGFfb2Zmc2V0ICsgbWRkZXYtPnNpemUqMgorCQkJCSAgICA+IHJkZXYtPnNiX29mZnNldCoyICsgYml0bWFwLT5vZmZzZXQpCisJCQkJCS8qIGRhdGEgcnVucyBpbiB0byBiaXRtYXAgKi8KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgaWYgKHJkZXYtPnNiX29mZnNldCoyIDwgcmRldi0+ZGF0YV9vZmZzZXQpIHsKKwkJCQkvKiBNRVRBREFUQSBCSVRNQVAgREFUQSAqLworCQkJCWlmIChyZGV2LT5zYl9vZmZzZXQqMgorCQkJCSAgICArIGJpdG1hcC0+b2Zmc2V0CisJCQkJICAgICsgcGFnZS0+aW5kZXgqKFBBR0VfU0laRS81MTIpICsgc2l6ZS81MTIKKwkJCQkgICAgPiByZGV2LT5kYXRhX29mZnNldCkKKwkJCQkJLyogYml0bWFwIHJ1bnMgaW4gdG8gZGF0YSAqLworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogREFUQSBNRVRBREFUQSBCSVRNQVAgLSBubyBwcm9ibGVtcyAqLworCQkJfQogCQkJbWRfc3VwZXJfd3JpdGUobWRkZXYsIHJkZXYsCiAJCQkJICAgICAgIChyZGV2LT5zYl9vZmZzZXQ8PDEpICsgYml0bWFwLT5vZmZzZXQKIAkJCQkgICAgICAgKyBwYWdlLT5pbmRleCAqIChQQUdFX1NJWkUvNTEyKSwKQEAgLTI4MCwzMiArMzA1LDM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJpdG1hcF9maWxlX2tpY2soc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKIC8qCiAgKiB3cml0ZSBvdXQgYSBwYWdlIHRvIGEgZmlsZQogICovCi1zdGF0aWMgaW50IHdyaXRlX3BhZ2Uoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHdhaXQpCitzdGF0aWMgdm9pZCB3cml0ZV9wYWdlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB3YWl0KQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlpZiAoYml0bWFwLT5maWxlID09IE5VTEwpCi0JCXJldHVybiB3cml0ZV9zYl9wYWdlKGJpdG1hcCwgcGFnZSwgd2FpdCk7CisJaWYgKGJpdG1hcC0+ZmlsZSA9PSBOVUxMKSB7CisJCXN3aXRjaCAod3JpdGVfc2JfcGFnZShiaXRtYXAsIHBhZ2UsIHdhaXQpKSB7CisJCWNhc2UgLUVJTlZBTDoKKwkJCWJpdG1hcC0+ZmxhZ3MgfD0gQklUTUFQX1dSSVRFX0VSUk9SOworCQl9CisJfSBlbHNlIHsKIAotCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAotCXdoaWxlIChiaCAmJiBiaC0+Yl9ibG9ja25yKSB7Ci0JCWF0b21pY19pbmMoJmJpdG1hcC0+cGVuZGluZ193cml0ZXMpOwotCQlzZXRfYnVmZmVyX2xvY2tlZChiaCk7Ci0JCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKLQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7Ci0JCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl3aGlsZSAoYmggJiYgYmgtPmJfYmxvY2tucikgeworCQkJYXRvbWljX2luYygmYml0bWFwLT5wZW5kaW5nX3dyaXRlcyk7CisJCQlzZXRfYnVmZmVyX2xvY2tlZChiaCk7CisJCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9CisKKwkJaWYgKHdhaXQpIHsKKwkJCXdhaXRfZXZlbnQoYml0bWFwLT53cml0ZV93YWl0LAorCQkJCSAgIGF0b21pY19yZWFkKCZiaXRtYXAtPnBlbmRpbmdfd3JpdGVzKT09MCk7CisJCX0KIAl9Ci0KLQlpZiAod2FpdCkgewotCQl3YWl0X2V2ZW50KGJpdG1hcC0+d3JpdGVfd2FpdCwKLQkJCSAgIGF0b21pY19yZWFkKCZiaXRtYXAtPnBlbmRpbmdfd3JpdGVzKT09MCk7Ci0JCXJldHVybiAoYml0bWFwLT5mbGFncyAmIEJJVE1BUF9XUklURV9FUlJPUikgPyAtRUlPIDogMDsKLQl9Ci0JcmV0dXJuIDA7CisJaWYgKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfV1JJVEVfRVJST1IpCisJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2JpdG1hcF93cml0ZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCkBAIC00MjUsMTcgKzQ1NiwxNyBAQAogICovCiAKIC8qIHVwZGF0ZSB0aGUgZXZlbnQgY291bnRlciBhbmQgc3luYyB0aGUgc3VwZXJibG9jayB0byBkaXNrICovCi1pbnQgYml0bWFwX3VwZGF0ZV9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApCit2b2lkIGJpdG1hcF91cGRhdGVfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCWJpdG1hcF9zdXBlcl90ICpzYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFiaXRtYXAgfHwgIWJpdG1hcC0+bWRkZXYpIC8qIG5vIGJpdG1hcCBmb3IgdGhpcyBhcnJheSAqLwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCXNwaW5fbG9ja19pcnFzYXZlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlpZiAoIWJpdG1hcC0+c2JfcGFnZSkgeyAvKiBubyBzdXBlcmJsb2NrICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAlzYiA9IChiaXRtYXBfc3VwZXJfdCAqKWttYXBfYXRvbWljKGJpdG1hcC0+c2JfcGFnZSwgS01fVVNFUjApOwpAQCAtNDQzLDcgKzQ3NCw3IEBACiAJaWYgKCFiaXRtYXAtPm1kZGV2LT5kZWdyYWRlZCkKIAkJc2ItPmV2ZW50c19jbGVhcmVkID0gY3B1X3RvX2xlNjQoYml0bWFwLT5tZGRldi0+ZXZlbnRzKTsKIAlrdW5tYXBfYXRvbWljKHNiLCBLTV9VU0VSMCk7Ci0JcmV0dXJuIHdyaXRlX3BhZ2UoYml0bWFwLCBiaXRtYXAtPnNiX3BhZ2UsIDEpOworCXdyaXRlX3BhZ2UoYml0bWFwLCBiaXRtYXAtPnNiX3BhZ2UsIDEpOwogfQogCiAvKiBwcmludCBvdXQgdGhlIGJpdG1hcCBmaWxlIHN1cGVyYmxvY2sgKi8KQEAgLTU3MiwyMCArNjAzLDIyIEBACiAJTUFTS19VTlNFVAogfTsKIAotLyogcmVjb3JkIHRoZSBzdGF0ZSBvZiB0aGUgYml0bWFwIGluIHRoZSBzdXBlcmJsb2NrICovCi1zdGF0aWMgdm9pZCBiaXRtYXBfbWFza19zdGF0ZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIGVudW0gYml0bWFwX3N0YXRlIGJpdHMsCi0JCQkJZW51bSBiaXRtYXBfbWFza19vcCBvcCkKKy8qIHJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIGJpdG1hcCBpbiB0aGUgc3VwZXJibG9jay4gIFJldHVybiB0aGUgb2xkIHZhbHVlICovCitzdGF0aWMgaW50IGJpdG1hcF9tYXNrX3N0YXRlKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCwgZW51bSBiaXRtYXBfc3RhdGUgYml0cywKKwkJCSAgICAgZW51bSBiaXRtYXBfbWFza19vcCBvcCkKIHsKIAliaXRtYXBfc3VwZXJfdCAqc2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2xkOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCWlmICghYml0bWFwLT5zYl9wYWdlKSB7IC8qIGNhbid0IHNldCB0aGUgc3RhdGUgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCXNiID0gKGJpdG1hcF9zdXBlcl90ICopa21hcF9hdG9taWMoYml0bWFwLT5zYl9wYWdlLCBLTV9VU0VSMCk7CisJb2xkID0gbGUzMl90b19jcHUoc2ItPnN0YXRlKSAmIGJpdHM7CiAJc3dpdGNoIChvcCkgewogCQljYXNlIE1BU0tfU0VUOiBzYi0+c3RhdGUgfD0gY3B1X3RvX2xlMzIoYml0cyk7CiAJCQkJYnJlYWs7CkBAIC01OTQsNiArNjI3LDcgQEAKIAkJZGVmYXVsdDogQlVHKCk7CiAJfQogCWt1bm1hcF9hdG9taWMoc2IsIEtNX1VTRVIwKTsKKwlyZXR1cm4gb2xkOwogfQogCiAvKgpAQCAtNjg3LDE4ICs3MjEsMjMgQEAKIHsKIAljaGFyICpwYXRoLCAqcHRyID0gTlVMTDsKIAotCWJpdG1hcF9tYXNrX3N0YXRlKGJpdG1hcCwgQklUTUFQX1NUQUxFLCBNQVNLX1NFVCk7Ci0JYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOworCWlmIChiaXRtYXBfbWFza19zdGF0ZShiaXRtYXAsIEJJVE1BUF9TVEFMRSwgTUFTS19TRVQpID09IDApIHsKKwkJYml0bWFwX3VwZGF0ZV9zYihiaXRtYXApOwogCi0JaWYgKGJpdG1hcC0+ZmlsZSkgewotCQlwYXRoID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCQlpZiAocGF0aCkKLQkJCXB0ciA9IGZpbGVfcGF0aChiaXRtYXAtPmZpbGUsIHBhdGgsIFBBR0VfU0laRSk7CisJCWlmIChiaXRtYXAtPmZpbGUpIHsKKwkJCXBhdGggPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocGF0aCkKKwkJCQlwdHIgPSBmaWxlX3BhdGgoYml0bWFwLT5maWxlLCBwYXRoLCBQQUdFX1NJWkUpOwogCi0JCXByaW50ayhLRVJOX0FMRVJUICIlczoga2lja2luZyBmYWlsZWQgYml0bWFwIGZpbGUgJXMgZnJvbSBhcnJheSFcbiIsCi0JCSAgICAgICBibW5hbWUoYml0bWFwKSwgcHRyID8gcHRyIDogIiIpOworCQkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJCSAgICAgICIlczoga2lja2luZyBmYWlsZWQgYml0bWFwIGZpbGUgJXMgZnJvbSBhcnJheSFcbiIsCisJCQkgICAgICBibW5hbWUoYml0bWFwKSwgcHRyID8gcHRyIDogIiIpOwogCi0JCWtmcmVlKHBhdGgpOworCQkJa2ZyZWUocGF0aCk7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJCSAgICAgICAiJXM6IGRpc2FibGluZyBpbnRlcm5hbCBiaXRtYXAgZHVlIHRvIGVycm9yc1xuIiwKKwkJCSAgICAgICBibW5hbWUoYml0bWFwKSk7CiAJfQogCiAJYml0bWFwX2ZpbGVfcHV0KGJpdG1hcCk7CkBAIC03NjksMTYgKzgwOCwxNSBAQAogLyogdGhpcyBnZXRzIGNhbGxlZCB3aGVuIHRoZSBtZCBkZXZpY2UgaXMgcmVhZHkgdG8gdW5wbHVnIGl0cyB1bmRlcmx5aW5nCiAgKiAoc2xhdmUpIGRldmljZSBxdWV1ZXMgLS0gYmVmb3JlIHdlIGxldCBhbnkgd3JpdGVzIGdvIGRvd24sIHdlIG5lZWQgdG8KICAqIHN5bmMgdGhlIGRpcnR5IHBhZ2VzIG9mIHRoZSBiaXRtYXAgZmlsZSB0byBkaXNrICovCi1pbnQgYml0bWFwX3VucGx1ZyhzdHJ1Y3QgYml0bWFwICpiaXRtYXApCit2b2lkIGJpdG1hcF91bnBsdWcoc3RydWN0IGJpdG1hcCAqYml0bWFwKQogewogCXVuc2lnbmVkIGxvbmcgaSwgZmxhZ3M7CiAJaW50IGRpcnR5LCBuZWVkX3dyaXRlOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCB3YWl0ID0gMDsKLQlpbnQgZXJyOwogCiAJaWYgKCFiaXRtYXApCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAkvKiBsb29rIGF0IGVhY2ggcGFnZSB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBzZXQgYml0cyB0aGF0IG5lZWQgdG8gYmUKIAkgKiBmbHVzaGVkIG91dCB0byBkaXNrICovCkBAIC03ODYsNyArODI0LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCQlpZiAoIWJpdG1hcC0+ZmlsZW1hcCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gMDsKKwkJCXJldHVybjsKIAkJfQogCQlwYWdlID0gYml0bWFwLT5maWxlbWFwW2ldOwogCQlkaXJ0eSA9IHRlc3RfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfRElSVFkpOwpAQCAtNzk4LDcgKzgzNiw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwogCiAJCWlmIChkaXJ0eSB8IG5lZWRfd3JpdGUpCi0JCQllcnIgPSB3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMCk7CisJCQl3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMCk7CiAJfQogCWlmICh3YWl0KSB7IC8qIGlmIGFueSB3cml0ZXMgd2VyZSBwZXJmb3JtZWQsIHdlIG5lZWQgdG8gd2FpdCBvbiB0aGVtICovCiAJCWlmIChiaXRtYXAtPmZpbGUpCkBAIC04MDksNyArODQ3LDYgQEAKIAl9CiAJaWYgKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfV1JJVEVfRVJST1IpCiAJCWJpdG1hcF9maWxlX2tpY2soYml0bWFwKTsKLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYml0bWFwX3NldF9tZW1vcnlfYml0cyhzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50IG5lZWRlZCk7CkBAIC04NTgsMjEgKzg5NSwyMSBAQAogCQkJYm1uYW1lKGJpdG1hcCksCiAJCQkodW5zaWduZWQgbG9uZykgaV9zaXplX3JlYWQoZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KSwKIAkJCWJ5dGVzICsgc2l6ZW9mKGJpdG1hcF9zdXBlcl90KSk7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSAtRU5PTUVNOwogCiAJYml0bWFwLT5maWxlbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBudW1fcGFnZXMsIEdGUF9LRVJORUwpOwogCWlmICghYml0bWFwLT5maWxlbWFwKQotCQlnb3RvIG91dDsKKwkJZ290byBlcnI7CiAKIAkvKiBXZSBuZWVkIDQgYml0cyBwZXIgcGFnZSwgcm91bmRlZCB1cCB0byBhIG11bHRpcGxlIG9mIHNpemVvZih1bnNpZ25lZCBsb25nKSAqLwogCWJpdG1hcC0+ZmlsZW1hcF9hdHRyID0ga3phbGxvYygKIAkJcm91bmR1cCggRElWX1JPVU5EX1VQKG51bV9wYWdlcyo0LCA4KSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwKIAkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFiaXRtYXAtPmZpbGVtYXBfYXR0cikKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyOwogCiAJb2xkaW5kZXggPSB+MEw7CiAKQEAgLTkwNSw3ICs5NDIsNyBAQAogCQkJfQogCQkJaWYgKElTX0VSUihwYWdlKSkgeyAvKiByZWFkIGVycm9yICovCiAJCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIGVycjsKIAkJCX0KIAogCQkJb2xkaW5kZXggPSBpbmRleDsKQEAgLTkyMCwxMSArOTU3LDEzIEBACiAJCQkJbWVtc2V0KHBhZGRyICsgb2Zmc2V0LCAweGZmLAogCQkJCSAgICAgICBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCQkJCWt1bm1hcF9hdG9taWMocGFkZHIsIEtNX1VTRVIwKTsKLQkJCQlyZXQgPSB3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMSk7Ci0JCQkJaWYgKHJldCkgeworCQkJCXdyaXRlX3BhZ2UoYml0bWFwLCBwYWdlLCAxKTsKKworCQkJCXJldCA9IC1FSU87CisJCQkJaWYgKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfV1JJVEVfRVJST1IpIHsKIAkJCQkJLyogcmVsZWFzZSwgcGFnZSBub3QgaW4gZmlsZW1hcCB5ZXQgKi8KIAkJCQkJcHV0X3BhZ2UocGFnZSk7Ci0JCQkJCWdvdG8gb3V0OworCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl9CiAKQEAgLTk1NiwxMSArOTk1LDE1IEBACiAJCW1kX3dha2V1cF90aHJlYWQoYml0bWFwLT5tZGRldi0+dGhyZWFkKTsKIAl9CiAKLW91dDoKIAlwcmludGsoS0VSTl9JTkZPICIlczogYml0bWFwIGluaXRpYWxpemVkIGZyb20gZGlzazogIgotCQkicmVhZCAlbHUvJWx1IHBhZ2VzLCBzZXQgJWx1IGJpdHMsIHN0YXR1czogJWRcbiIsCi0JCWJtbmFtZShiaXRtYXApLCBiaXRtYXAtPmZpbGVfcGFnZXMsIG51bV9wYWdlcywgYml0X2NudCwgcmV0KTsKKwkJInJlYWQgJWx1LyVsdSBwYWdlcywgc2V0ICVsdSBiaXRzXG4iLAorCQlibW5hbWUoYml0bWFwKSwgYml0bWFwLT5maWxlX3BhZ2VzLCBudW1fcGFnZXMsIGJpdF9jbnQpOwogCisJcmV0dXJuIDA7CisKKyBlcnI6CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJpdG1hcCBpbml0aWFsaXNhdGlvbiBmYWlsZWQ6ICVkXG4iLAorCSAgICAgICBibW5hbWUoYml0bWFwKSwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05OTcsMTkgKzEwNDAsMTggQEAKICAqCQkJb3V0IHRvIGRpc2sKICAqLwogCi1pbnQgYml0bWFwX2RhZW1vbl93b3JrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKK3ZvaWQgYml0bWFwX2RhZW1vbl93b3JrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCkKIHsKIAl1bnNpZ25lZCBsb25nIGo7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEwsICpsYXN0cGFnZSA9IE5VTEw7Ci0JaW50IGVyciA9IDA7CiAJaW50IGJsb2NrczsKIAl2b2lkICpwYWRkcjsKIAogCWlmIChiaXRtYXAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAlpZiAodGltZV9iZWZvcmUoamlmZmllcywgYml0bWFwLT5kYWVtb25fbGFzdHJ1biArIGJpdG1hcC0+ZGFlbW9uX3NsZWVwKkhaKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAliaXRtYXAtPmRhZW1vbl9sYXN0cnVuID0gamlmZmllczsKIAogCWZvciAoaiA9IDA7IGogPCBiaXRtYXAtPmNodW5rczsgaisrKSB7CkBAIC0xMDMyLDE0ICsxMDc0LDggQEAKIAkJCQkJY2xlYXJfcGFnZV9hdHRyKGJpdG1hcCwgcGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQkJCWlmIChuZWVkX3dyaXRlKSB7Ci0JCQkJCXN3aXRjaCAod3JpdGVfcGFnZShiaXRtYXAsIHBhZ2UsIDApKSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYml0bWFwX2ZpbGVfa2ljayhiaXRtYXApOwotCQkJCQl9Ci0JCQkJfQorCQkJCWlmIChuZWVkX3dyaXRlKQorCQkJCQl3cml0ZV9wYWdlKGJpdG1hcCwgcGFnZSwgMCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTEwNDgsMTMgKzEwODQsMTEgQEAKIAkJCQlpZiAodGVzdF9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKSkgewogCQkJCQljbGVhcl9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7Ci0JCQkJCWVyciA9IHdyaXRlX3BhZ2UoYml0bWFwLCBsYXN0cGFnZSwgMCk7CisJCQkJCXdyaXRlX3BhZ2UoYml0bWFwLCBsYXN0cGFnZSwgMCk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpOwogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJCQl9Ci0JCQkJaWYgKGVycikKLQkJCQkJYml0bWFwX2ZpbGVfa2ljayhiaXRtYXApOwogCQkJfSBlbHNlCiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYml0bWFwLT5sb2NrLCBmbGFncyk7CiAJCQlsYXN0cGFnZSA9IHBhZ2U7CkBAIC0xMDk3LDE0ICsxMTMxLDEzIEBACiAJCWlmICh0ZXN0X3BhZ2VfYXR0cihiaXRtYXAsIGxhc3RwYWdlLCBCSVRNQVBfUEFHRV9ORUVEV1JJVEUpKSB7CiAJCQljbGVhcl9wYWdlX2F0dHIoYml0bWFwLCBsYXN0cGFnZSwgQklUTUFQX1BBR0VfTkVFRFdSSVRFKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJpdG1hcC0+bG9jaywgZmxhZ3MpOwotCQkJZXJyID0gd3JpdGVfcGFnZShiaXRtYXAsIGxhc3RwYWdlLCAwKTsKKwkJCXdyaXRlX3BhZ2UoYml0bWFwLCBsYXN0cGFnZSwgMCk7CiAJCX0gZWxzZSB7CiAJCQlzZXRfcGFnZV9hdHRyKGJpdG1hcCwgbGFzdHBhZ2UsIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaXRtYXAtPmxvY2ssIGZsYWdzKTsKIAkJfQogCX0KIAotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBiaXRtYXBfY291bnRlcl90ICpiaXRtYXBfZ2V0X2NvdW50ZXIoc3RydWN0IGJpdG1hcCAqYml0bWFwLApAQCAtMTUxNyw3ICsxNTUwLDkgQEAKIAogCW1kZGV2LT50aHJlYWQtPnRpbWVvdXQgPSBiaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOwogCi0JcmV0dXJuIGJpdG1hcF91cGRhdGVfc2IoYml0bWFwKTsKKwliaXRtYXBfdXBkYXRlX3NiKGJpdG1hcCk7CisKKwlyZXR1cm4gKGJpdG1hcC0+ZmxhZ3MgJiBCSVRNQVBfV1JJVEVfRVJST1IpID8gLUVJTyA6IDA7CiAKICBlcnJvcjoKIAliaXRtYXBfZnJlZShiaXRtYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IGY0ZjdkMzUuLjg0NjYxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTE2MSw5ICsxNjEsNyBAQAogewogCWttZW1fY2FjaGVfZGVzdHJveShfdGlvX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koX2lvX2NhY2hlKTsKLQotCWlmICh1bnJlZ2lzdGVyX2Jsa2RldihfbWFqb3IsIF9uYW1lKSA8IDApCi0JCURNRVJSKCJ1bnJlZ2lzdGVyX2Jsa2RldiBmYWlsZWQiKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihfbWFqb3IsIF9uYW1lKTsKIAogCV9tYWpvciA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCAzM2JlYWE3Li42NWRkYzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0xNjQwLDcgKzE2NDAsNiBAQAogCiBzdGF0aWMgdm9pZCBtZF91cGRhdGVfc2IobWRkZXZfdCAqIG1kZGV2LCBpbnQgZm9yY2VfY2hhbmdlKQogewotCWludCBlcnI7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCW1ka19yZGV2X3QgKnJkZXY7CiAJaW50IHN5bmNfcmVxOwpAQCAtMTcyNyw3ICsxNzI2LDcgQEAKIAkJIm1kOiB1cGRhdGluZyAlcyBSQUlEIHN1cGVyYmxvY2sgb24gZGV2aWNlIChpbiBzeW5jICVkKVxuIiwKIAkJbWRuYW1lKG1kZGV2KSxtZGRldi0+aW5fc3luYyk7CiAKLQllcnIgPSBiaXRtYXBfdXBkYXRlX3NiKG1kZGV2LT5iaXRtYXApOworCWJpdG1hcF91cGRhdGVfc2IobWRkZXYtPmJpdG1hcCk7CiAJSVRFUkFURV9SREVWKG1kZGV2LHJkZXYsdG1wKSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJZHByaW50ayhLRVJOX0lORk8gIm1kOiAiKTsKQEAgLTIwNzMsOSArMjA3MiwxMSBAQAogCQllcnIgPSBzdXBlcl90eXBlc1tzdXBlcl9mb3JtYXRdLgogCQkJbG9hZF9zdXBlcihyZGV2LCBOVUxMLCBzdXBlcl9taW5vcik7CiAJCWlmIChlcnIgPT0gLUVJTlZBTCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkibWQ6ICVzIGhhcyBpbnZhbGlkIHNiLCBub3QgaW1wb3J0aW5nIVxuIiwKLQkJCQliZGV2bmFtZShyZGV2LT5iZGV2LGIpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkibWQ6ICVzIGRvZXMgbm90IGhhdmUgYSB2YWxpZCB2JWQuJWQgIgorCQkJICAgICAgICJzdXBlcmJsb2NrLCBub3QgaW1wb3J0aW5nIVxuIiwKKwkJCQliZGV2bmFtZShyZGV2LT5iZGV2LGIpLAorCQkJICAgICAgIHN1cGVyX2Zvcm1hdCwgc3VwZXJfbWlub3IpOwogCQkJZ290byBhYm9ydF9mcmVlOwogCQl9CiAJCWlmIChlcnIgPCAwKSB7CkBAIC0zMTc0LDEzICszMTc1LDMzIEBACiAJICogRHJvcCBhbGwgY29udGFpbmVyIGRldmljZSBidWZmZXJzLCBmcm9tIG5vdyBvbgogCSAqIHRoZSBvbmx5IHZhbGlkIGV4dGVybmFsIGludGVyZmFjZSBpcyB0aHJvdWdoIHRoZSBtZAogCSAqIGRldmljZS4KLQkgKiBBbHNvIGZpbmQgbGFyZ2VzdCBoYXJkc2VjdG9yIHNpemUKIAkgKi8KIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKIAkJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCQlzeW5jX2Jsb2NrZGV2KHJkZXYtPmJkZXYpOwogCQlpbnZhbGlkYXRlX2JkZXYocmRldi0+YmRldik7CisKKwkJLyogcGVyZm9ybSBzb21lIGNvbnNpc3RlbmN5IHRlc3RzIG9uIHRoZSBkZXZpY2UuCisJCSAqIFdlIGRvbid0IHdhbnQgdGhlIGRhdGEgdG8gb3ZlcmxhcCB0aGUgbWV0YWRhdGEsCisJCSAqIEludGVybmFsIEJpdG1hcCBpc3N1ZXMgaGFzIGhhbmRsZWQgZWxzZXdoZXJlLgorCQkgKi8KKwkJaWYgKHJkZXYtPmRhdGFfb2Zmc2V0IDwgcmRldi0+c2Jfb2Zmc2V0KSB7CisJCQlpZiAobWRkZXYtPnNpemUgJiYKKwkJCSAgICByZGV2LT5kYXRhX29mZnNldCArIG1kZGV2LT5zaXplKjIKKwkJCSAgICA+IHJkZXYtPnNiX29mZnNldCoyKSB7CisJCQkJcHJpbnRrKCJtZDogJXM6IGRhdGEgb3ZlcmxhcHMgbWV0YWRhdGFcbiIsCisJCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHJkZXYtPnNiX29mZnNldCoyICsgcmRldi0+c2Jfc2l6ZS81MTIKKwkJCSAgICA+IHJkZXYtPmRhdGFfb2Zmc2V0KSB7CisJCQkJcHJpbnRrKCJtZDogJXM6IG1ldGFkYXRhIG92ZXJsYXBzIGRhdGFcbiIsCisJCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CiAJfQogCiAJbWRfcHJvYmUobWRkZXYtPnVuaXQsIE5VTEwsIE5VTEwpOwpAQCAtNDY0Miw3ICs0NjYzLDYgQEAKIAkgKiBtYW55IGRpcnR5IFJBSUQ1IGJsb2Nrcy4KIAkgKi8KIAotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCkBAIC01MDkwLDcgKzUxMTAsNyBAQAogCW1ka19yZGV2X3QgKiByZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKIAlpbnQgaWRsZTsKLQl1bnNpZ25lZCBsb25nIGN1cnJfZXZlbnRzOworCWxvbmcgY3Vycl9ldmVudHM7CiAKIAlpZGxlID0gMTsKIAlJVEVSQVRFX1JERVYobWRkZXYscmRldix0bXApIHsKQEAgLTUwOTgsMjAgKzUxMTgsMjkgQEAKIAkJY3Vycl9ldmVudHMgPSBkaXNrX3N0YXRfcmVhZChkaXNrLCBzZWN0b3JzWzBdKSArIAogCQkJCWRpc2tfc3RhdF9yZWFkKGRpc2ssIHNlY3RvcnNbMV0pIC0gCiAJCQkJYXRvbWljX3JlYWQoJmRpc2stPnN5bmNfaW8pOwotCQkvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJfZXZlbnRzIGFuZCBsYXN0X2V2ZW50cwotCQkgKiB3aWxsIGJlIGFmZmVjdGVkIGJ5IGFueSBuZXcgbm9uLXN5bmMgSU8gKG1ha2luZwotCQkgKiBjdXJyX2V2ZW50cyBiaWdnZXIpIGFuZCBhbnkgZGlmZmVyZW5jZSBpbiB0aGUgYW1vdW50IG9mCi0JCSAqIGluLWZsaWdodCBzeW5jaW8gKG1ha2luZyBjdXJyZW50X2V2ZW50cyBiaWdnZXIgb3Igc21hbGxlcikKLQkJICogVGhlIGFtb3VudCBpbi1mbGlnaHQgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8KLQkJICogMzIqNjRLIGluIHJhaWQxLzEwIGFuZCAyNTYqUEFHRV9TSVpFIGluIHJhaWQ1LzYKLQkJICogd2hpY2ggaXMgYXQgbW9zdCA0MDk2IHNlY3RvcnMuCi0JCSAqIFRoZXNlIG51bWJlcnMgYXJlIGZhaXJseSBmcmFnaWxlIGFuZCBzaG91bGQgYmUgbWFkZQotCQkgKiBtb3JlIHJvYnVzdCwgcHJvYmFibHkgYnkgZW5mb3JjaW5nIHRoZQotCQkgKiAnd2luZG93IHNpemUnIHRoYXQgbWRfZG9fc3luYyBzb3J0LW9mIHVzZXMuCisJCS8qIHN5bmMgSU8gd2lsbCBjYXVzZSBzeW5jX2lvIHRvIGluY3JlYXNlIGJlZm9yZSB0aGUgZGlza19zdGF0cworCQkgKiBhcyBzeW5jX2lvIGlzIGNvdW50ZWQgd2hlbiBhIHJlcXVlc3Qgc3RhcnRzLCBhbmQKKwkJICogZGlza19zdGF0cyBpcyBjb3VudGVkIHdoZW4gaXQgY29tcGxldGVzLgorCQkgKiBTbyByZXN5bmMgYWN0aXZpdHkgd2lsbCBjYXVzZSBjdXJyX2V2ZW50cyB0byBiZSBzbWFsbGVyIHRoYW4KKwkJICogd2hlbiB0aGVyZSB3YXMgbm8gc3VjaCBhY3Rpdml0eS4KKwkJICogbm9uLXN5bmMgSU8gd2lsbCBjYXVzZSBkaXNrX3N0YXQgdG8gaW5jcmVhc2Ugd2l0aG91dAorCQkgKiBpbmNyZWFzaW5nIHN5bmNfaW8gc28gY3Vycl9ldmVudHMgd2lsbCAoZXZlbnR1YWxseSkKKwkJICogYmUgbGFyZ2VyIHRoYW4gaXQgd2FzIGJlZm9yZS4gIE9uY2UgaXQgYmVjb21lcworCQkgKiBzdWJzdGFudGlhbGx5IGxhcmdlciwgdGhlIHRlc3QgYmVsb3cgd2lsbCBjYXVzZQorCQkgKiB0aGUgYXJyYXkgdG8gYXBwZWFyIG5vbi1pZGxlLCBhbmQgcmVzeW5jIHdpbGwgc2xvdworCQkgKiBkb3duLgorCQkgKiBJZiB0aGVyZSBpcyBhIGxvdCBvZiBvdXRzdGFuZGluZyByZXN5bmMgYWN0aXZpdHkgd2hlbgorCQkgKiB3ZSBzZXQgbGFzdF9ldmVudCB0byBjdXJyX2V2ZW50cywgdGhlbiBhbGwgdGhhdCBhY3Rpdml0eQorCQkgKiBjb21wbGV0aW5nIG1pZ2h0IGNhdXNlIHRoZSBhcnJheSB0byBhcHBlYXIgbm9uLWlkbGUKKwkJICogYW5kIHJlc3luYyB3aWxsIGJlIHNsb3dlZCBkb3duIGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0CisJCSAqIG5vdCBoYXZlIGJlZW4gbm9uLXJlc3luYyBhY3Rpdml0eS4gIFRoaXMgd2lsbCBvbmx5CisJCSAqIGhhcHBlbiBvbmNlIHRob3VnaC4gICdsYXN0X2V2ZW50cycgd2lsbCBzb29uIHJlZmxlY3QKKwkJICogdGhlIHN0YXRlIHdoZXJlIHRoZXJlIGlzIGxpdHRsZSBvciBubyBvdXRzdGFuZGluZworCQkgKiByZXN5bmMgcmVxdWVzdHMsIGFuZCBmdXJ0aGVyIHJlc3luYyBhY3Rpdml0eSB3aWxsCisJCSAqIGFsd2F5cyBtYWtlIGN1cnJfZXZlbnRzIGxlc3MgdGhhbiBsYXN0X2V2ZW50cy4KIAkJICoKLQkJICogTm90ZTogdGhlIGZvbGxvd2luZyBpcyBhbiB1bnNpZ25lZCBjb21wYXJpc29uLgogCQkgKi8KLQkJaWYgKChsb25nKWN1cnJfZXZlbnRzIC0gKGxvbmcpcmRldi0+bGFzdF9ldmVudHMgPiA0MDk2KSB7CisJCWlmIChjdXJyX2V2ZW50cyAtIHJkZXYtPmxhc3RfZXZlbnRzID4gNDA5NikgewogCQkJcmRldi0+bGFzdF9ldmVudHMgPSBjdXJyX2V2ZW50czsKIAkJCWlkbGUgPSAwOwogCQl9CkBAIC01NzcyLDcgKzU4MDEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXZfY250OyBpKyspIHsKIAkJZGV2X3QgZGV2ID0gZGV0ZWN0ZWRfZGV2aWNlc1tpXTsKIAotCQlyZGV2ID0gbWRfaW1wb3J0X2RldmljZShkZXYsMCwgMCk7CisJCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwwLCA5MCk7CiAJCWlmIChJU19FUlIocmRldikpCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMS5jIGIvZHJpdmVycy9tZC9yYWlkMS5jCmluZGV4IDQ2Njc3ZDcuLjAwYzc4YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEuYworKysgYi9kcml2ZXJzL21kL3JhaWQxLmMKQEAgLTE1MjYsOCArMTUyNiw3IEBACiAJCQlibGtfcmVtb3ZlX3BsdWcobWRkZXYtPnF1ZXVlKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJCQkvKiBmbHVzaCBhbnkgcGVuZGluZyBiaXRtYXAgd3JpdGVzIHRvIGRpc2sgYmVmb3JlIHByb2NlZWRpbmcgdy8gSS9PICovCi0JCQlpZiAoYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKSAhPSAwKQotCQkJCXByaW50aygiJXM6IGJpdG1hcCBmaWxlIHdyaXRlIGZhaWxlZCFcbiIsIG1kbmFtZShtZGRldikpOworCQkJYml0bWFwX3VucGx1ZyhtZGRldi0+Yml0bWFwKTsKIAogCQkJd2hpbGUgKGJpbykgeyAvKiBzdWJtaXQgcGVuZGluZyB3cml0ZXMgKi8KIAkJCQlzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLT5iaV9uZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggOWViNjZjMS4uYTk1YWRhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC0xNTEwLDggKzE1MTAsNyBAQAogCQkJYmxrX3JlbW92ZV9wbHVnKG1kZGV2LT5xdWV1ZSk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCQkJLyogZmx1c2ggYW55IHBlbmRpbmcgYml0bWFwIHdyaXRlcyB0byBkaXNrIGJlZm9yZSBwcm9jZWVkaW5nIHcvIEkvTyAqLwotCQkJaWYgKGJpdG1hcF91bnBsdWcobWRkZXYtPmJpdG1hcCkgIT0gMCkKLQkJCQlwcmludGsoIiVzOiBiaXRtYXAgZmlsZSB3cml0ZSBmYWlsZWQhXG4iLCBtZG5hbWUobWRkZXYpKTsKKwkJCWJpdG1hcF91bnBsdWcobWRkZXYtPmJpdG1hcCk7CiAKIAkJCXdoaWxlIChiaW8pIHsgLyogc3VibWl0IHBlbmRpbmcgd3JpdGVzICovCiAJCQkJc3RydWN0IGJpbyAqbmV4dCA9IGJpby0+YmlfbmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggZjRlNGNhMi4uYjZjN2Y2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTUyMyw2ICs1MjMsNyBAQAogCiAJZHZiX2Zyb250ZW5kX2luaXQoZmUpOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgxKSB7CiAJCXVwKCZmZXByaXYtPnNlbSk7CSAgICAvKiBpcyBsb2NrZWQgd2hlbiB3ZSBlbnRlciB0aGUgdGhyZWFkLi4uICovCiByZXN0YXJ0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCmluZGV4IDI1OWVhMDguLjFjYzJkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKQEAgLTkwNiw2ICs5MDYsNyBAQAogCXUzMiBtb2RlID0gMDsKIAogCWRwcmludGsoImN4ODg6IHR2YXVkaW8gdGhyZWFkIHN0YXJ0ZWRcbiIpOworCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwppbmRleCBlMTgyMWViLi5kNWVlMjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpAQCAtNDY4LDYgKzQ2OSw3IEBACiAKIAogCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNDAwIGRhZW1vbiBzdGFydGVkXG4iKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQl2NGxfZGJnKDIsIG1zcF9kZWJ1ZywgY2xpZW50LCAibXNwMzQwMCB0aHJlYWQ6IHNsZWVwXG4iKTsKIAkJbXNwX3NsZWVwKHN0YXRlLCAtMSk7CkBAIC02NDYsNyArNjQ4LDcgQEAKIAlpbnQgdmFsLCBpLCBzdGQsIGNvdW50OwogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MTAgZGFlbW9uIHN0YXJ0ZWRcbiIpOwotCisJc2V0X2ZyZWV6YWJsZSgpOwogCWZvciAoOzspIHsKIAkJdjRsX2RiZygyLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0MTAgdGhyZWFkOiBzbGVlcFxuIik7CiAJCW1zcF9zbGVlcChzdGF0ZSwtMSk7CkBAIC05NDAsNyArOTQyLDcgQEAKIAlpbnQgdmFsLCBpOwogCiAJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgIm1zcDM0eHhnIGRhZW1vbiBzdGFydGVkXG4iKTsKLQorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXY0bF9kYmcoMiwgbXNwX2RlYnVnLCBjbGllbnQsICJtc3AzNHh4ZyB0aHJlYWQ6IHNsZWVwXG4iKTsKIAkJbXNwX3NsZWVwKHN0YXRlLCAtMSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCmluZGV4IGM5YmY5ZGIuLjlkYTMzOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZhdWRpby5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIAlzdHJ1Y3QgQ0hJUERFU0MgICpkZXNjID0gY2hpcGxpc3QgKyBjaGlwLT50eXBlOwogCiAJdjRsX2RiZygxLCBkZWJ1ZywgJmNoaXAtPmMsICIlczogdGhyZWFkIHN0YXJ0ZWRcbiIsIGNoaXAtPmMubmFtZSk7Ci0KKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKaW5kZXggZmNjNTQ2Ny4uZTYxNzkyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIAlpbnQgZXJyOwogCiAJZHByaW50aygiZHZiIHRocmVhZCBzdGFydGVkXG4iKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAJdmlkZW9idWZfcmVhZF9zdGFydCgmZHZiLT5kdmJxKTsKIAogCWZvciAoOzspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKaW5kZXggZjdlMWQxOS4uM2VmNGQwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMKQEAgLTU3Myw2ICs1NzMsNyBAQAogCWRwcmludGsoMSwidGhyZWFkIHN0YXJ0ZWRcbiIpOwogCiAJbW9kX3RpbWVyKCZkbWFfcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJZm9yICg7OykgewogCQl2aXZpX3NsZWVwKGRtYV9xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZwppbmRleCBmNGFjMjFlLi41YWZhMGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCkBAIC0xLDkgKzEsNiBAQAogCi1tZW51ICJJMk8gZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKLQotY29uZmlnIEkyTwotCXRyaXN0YXRlICJJMk8gc3VwcG9ydCIKK21lbnVjb25maWcgSTJPCisJdHJpc3RhdGUgIkkyTyBkZXZpY2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQogCS0tLWhlbHAtLS0KIAkgIFRoZSBJbnRlbGxpZ2VudCBJbnB1dC9PdXRwdXQgKEkyTykgYXJjaGl0ZWN0dXJlIGFsbG93cyBoYXJkd2FyZQpAQCAtMjUsOSArMjIsMTAgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgSTJPCisKIGNvbmZpZyBJMk9fTENUX05PVElGWV9PTl9DSEFOR0VTCiAJYm9vbCAiRW5hYmxlIExDVCBub3RpZmljYXRpb24iCi0JZGVwZW5kcyBvbiBJMk8KIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBPbmx5IHNheSBOIGhlcmUgaWYgeW91IGhhdmUgYSBJMk8gY29udHJvbGxlciBmcm9tIFNVTi4gVGhlIFNVTgpAQCAtMzksNyArMzcsNiBAQAogCiBjb25maWcgSTJPX0VYVF9BREFQVEVDCiAJYm9vbCAiRW5hYmxlIEFkYXB0ZWMgZXh0ZW5zaW9ucyIKLQlkZXBlbmRzIG9uIEkyTwogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGZvciBzdXBwb3J0IG9mIHJhaWR1dGlscyBmb3IgQWRhcHRlYyBJMk8gY29udHJvbGxlcnMuIFlvdSBhbHNvCkBAIC01Nyw3ICs1NCw3IEBACiAKIGNvbmZpZyBJMk9fQ09ORklHCiAJdHJpc3RhdGUgIkkyTyBDb25maWd1cmF0aW9uIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJMk8KKwlkZXBlbmRzIG9uIFZJUlRfVE9fQlVTCiAJLS0taGVscC0tLQogCSAgU2F5IFkgZm9yIHN1cHBvcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgSTJPIGFkYXB0ZXJzLgogCSAgSWYgeW91IGhhdmUgYSBSQUlEIGNvbnRyb2xsZXIgZnJvbSBBZGFwdGVjIGFuZCB5b3Ugd2FudCB0byB1c2UgdGhlCkBAIC03OCw3ICs3NSw2IEBACiAKIGNvbmZpZyBJMk9fQlVTCiAJdHJpc3RhdGUgIkkyTyBCdXMgQWRhcHRlciBPU00iCi0JZGVwZW5kcyBvbiBJMk8KIAktLS1oZWxwLS0tCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBJMk8gQnVzIEFkYXB0ZXIgT1NNLiBUaGUgQnVzIEFkYXB0ZXIgT1NNCiAJICBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJ1c3NlcyBvbiB0aGUgSTJPIGNvbnRyb2xsZXIuIFRoZSBtYWluIHB1cnBvc2UKQEAgLTg5LDcgKzg1LDcgQEAKIAogY29uZmlnIEkyT19CTE9DSwogCXRyaXN0YXRlICJJMk8gQmxvY2sgT1NNIgotCWRlcGVuZHMgb24gSTJPICYmIEJMT0NLCisJZGVwZW5kcyBvbiBCTE9DSwogCS0tLWhlbHAtLS0KIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEkyTyBCbG9jayBPU00uIFRoZSBCbG9jayBPU00gcHJlc2VudHMgZGlzawogCSAgYW5kIG90aGVyIHN0cnVjdHVyZWQgYmxvY2sgZGV2aWNlcyB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gSWYgeW91CkBAIC0xMDIsNyArOTgsNyBAQAogCiBjb25maWcgSTJPX1NDU0kKIAl0cmlzdGF0ZSAiSTJPIFNDU0kgT1NNIgotCWRlcGVuZHMgb24gSTJPICYmIFNDU0kKKwlkZXBlbmRzIG9uIFNDU0kKIAktLS1oZWxwLS0tCiAJICBBbGxvd3MgZGlyZWN0IFNDU0kgYWNjZXNzIHRvIFNDU0kgZGV2aWNlcyBvbiBhIFNDU0kgb3IgRmlicmVDaGFubmVsCiAJICBJMk8gY29udHJvbGxlci4gWW91IGNhbiB1c2UgYm90aCB0aGUgU0NTSSBhbmQgQmxvY2sgT1NNIHRvZ2V0aGVyIGlmCkBAIC0xMTQsNyArMTEwLDYgQEAKIAogY29uZmlnIEkyT19QUk9DCiAJdHJpc3RhdGUgIkkyTyAvcHJvYyBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJPCiAJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIHRvICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgeW91IHdpbGwgYmUKIAkgIGFibGUgdG8gcmVhZCBJMk8gcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB2aXJ0dWFsIGRpcmVjdG9yeQpAQCAtMTIzLDUgKzExOCw0IEBACiAJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTJvX3Byb2MuCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBJMk8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYwppbmRleCA4YWJlNDVlLi5jZTYyZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCkBAIC0yNCw3ICsyNCw3IEBACiAJaWYgKGNtZCA9PSBJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSKQogCQlyZXR1cm47CQkvLyBObyBzdGF0dXMgaW4gdGhpcyByZXBseQogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzJXM6ICIsIHNldmVyaXR5LCBzdHIpOworCXByaW50aygiJXMlczogIiwgc2V2ZXJpdHksIHN0cik7CiAKIAlpZiAoY21kIDwgMHgxRikJCS8vIFV0aWxpdHkgY21kCiAJCWkyb19yZXBvcnRfdXRpbF9jbWQoY21kKTsKQEAgLTMyLDcgKzMyLDcgQEAKIAllbHNlIGlmIChjbWQgPj0gMHhBMCAmJiBjbWQgPD0gMHhFRikJLy8gRXhlY3V0aXZlIGNtZAogCQlpMm9fcmVwb3J0X2V4ZWNfY21kKGNtZCk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiQ21kID0gJTAjMngsICIsIGNtZCk7CS8vIE90aGVyIGNtZHMKKwkJcHJpbnRrKCJDbWQgPSAlMCMyeCwgIiwgY21kKTsJLy8gT3RoZXIgY21kcwogCiAJaWYgKG1zZ1swXSAmIE1TR19GQUlMKSB7CiAJCWkyb19yZXBvcnRfZmFpbF9zdGF0dXMocmVxX3N0YXR1cywgbXNnKTsKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlpZiAoY21kIDwgMHgxRiB8fCAoY21kID49IDB4QTAgJiYgY21kIDw9IDB4RUYpKQogCQlpMm9fcmVwb3J0X2NvbW1vbl9kc2MoZGV0YWlsZWRfc3RhdHVzKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKKwkJcHJpbnRrKCIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKIAkJICAgICAgIGRldGFpbGVkX3N0YXR1cyk7CiB9CiAKQEAgLTg5LDEwICs4OSwxMCBAQAogCX07CiAKIAlpZiAocmVxX3N0YXR1cyA9PSBJMk9fRlNDX1RSQU5TUE9SVF9VTktOT1dOX0ZBSUxVUkUpCi0JCXByaW50ayhLRVJOX0RFQlVHICJUUkFOU1BPUlRfVU5LTk9XTl9GQUlMVVJFICglMCMyeCkuXG4iLAorCQlwcmludGsoIlRSQU5TUE9SVF9VTktOT1dOX0ZBSUxVUkUgKCUwIzJ4KS5cbiIsCiAJCSAgICAgICByZXFfc3RhdHVzKTsKIAllbHNlCi0JCXByaW50ayhLRVJOX0RFQlVHICJUUkFOU1BPUlRfJXMuXG4iLAorCQlwcmludGsoIlRSQU5TUE9SVF8lcy5cbiIsCiAJCSAgICAgICBGQUlMX1NUQVRVU1tyZXFfc3RhdHVzICYgMHgwRl0pOwogCiAJLyogRHVtcCBzb21lIGRldGFpbHMgKi8KQEAgLTEwNCw3ICsxMDQsNyBAQAogCXByaW50ayhLRVJOX0VSUiAiICBGYWlsaW5nSG9zdFVuaXQgPSAweCUwNFgsICBGYWlsaW5nSU9QID0gMHglMDNYXG4iLAogCSAgICAgICBtc2dbNV0gPj4gMTYsIG1zZ1s1XSAmIDB4RkZGKTsKIAotCXByaW50ayhLRVJOX0VSUiAiICBTZXZlcml0eTogIDB4JTAyWCAiLCAobXNnWzRdID4+IDE2KSAmIDB4RkYpOworCXByaW50ayhLRVJOX0VSUiAiICBTZXZlcml0eTogIDB4JTAyWFxuIiwgKG1zZ1s0XSA+PiAxNikgJiAweEZGKTsKIAlpZiAobXNnWzRdICYgKDEgPDwgMTYpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiKEZvcm1hdEVycm9yKSwgIgogCQkgICAgICAgInRoaXMgbXNnIGNhbiBuZXZlciBiZSBkZWxpdmVyZWQvcHJvY2Vzc2VkLlxuIik7CkBAIC0xNDIsOSArMTQyLDkgQEAKIAl9OwogCiAJaWYgKHJlcV9zdGF0dXMgPj0gQVJSQVlfU0laRShSRVBMWV9TVEFUVVMpKQotCQlwcmludGsoS0VSTl9ERUJVRyAiUmVxdWVzdFN0YXR1cyA9ICUwIzJ4IiwgcmVxX3N0YXR1cyk7CisJCXByaW50aygiUmVxdWVzdFN0YXR1cyA9ICUwIzJ4IiwgcmVxX3N0YXR1cyk7CiAJZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCBSRVBMWV9TVEFUVVNbcmVxX3N0YXR1c10pOworCQlwcmludGsoIiVzIiwgUkVQTFlfU1RBVFVTW3JlcV9zdGF0dXNdKTsKIH0KIAogLyoKQEAgLTE4NywxMCArMTg3LDEwIEBACiAJfTsKIAogCWlmIChkZXRhaWxlZF9zdGF0dXMgPiBJMk9fRFNDX0RFVklDRV9OT1RfQVZBSUxBQkxFKQotCQlwcmludGsoS0VSTl9ERUJVRyAiIC8gRGV0YWlsZWRTdGF0dXMgPSAlMCM0eC5cbiIsCisJCXByaW50aygiIC8gRGV0YWlsZWRTdGF0dXMgPSAlMCM0eC5cbiIsCiAJCSAgICAgICBkZXRhaWxlZF9zdGF0dXMpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAvICVzLlxuIiwgQ09NTU9OX0RTQ1tkZXRhaWxlZF9zdGF0dXNdKTsKKwkJcHJpbnRrKCIgLyAlcy5cbiIsIENPTU1PTl9EU0NbZGV0YWlsZWRfc3RhdHVzXSk7CiB9CiAKIC8qCkBAIC0yMDAsNDkgKzIwMCw0OSBAQAogewogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJMk9fQ01EX1VUSUxfTk9QOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9OT1AsICIpOworCQlwcmludGsoIlVUSUxfTk9QLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfQUJPUlQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0FCT1JULCAiKTsKKwkJcHJpbnRrKCJVVElMX0FCT1JULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfQ0xBSU06Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0NMQUlNLCAiKTsKKwkJcHJpbnRrKCJVVElMX0NMQUlNLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ0xBSU1fUkVMRUFTRSwgIik7CisJCXByaW50aygiVVRJTF9DTEFJTV9SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfQ09ORklHX0RJQUxPRzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ09ORklHX0RJQUxPRywgIik7CisJCXByaW50aygiVVRJTF9DT05GSUdfRElBTE9HLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfREVWSUNFX1JFU0VSVkU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0RFVklDRV9SRVNFUlZFLCAiKTsKKwkJcHJpbnRrKCJVVElMX0RFVklDRV9SRVNFUlZFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfREVWSUNFX1JFTEVBU0U6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0RFVklDRV9SRUxFQVNFLCAiKTsKKwkJcHJpbnRrKCJVVElMX0RFVklDRV9SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfRVZUX0FDSzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfRVZFTlRfQUNLTk9XTEVER0UsICIpOworCQlwcmludGsoIlVUSUxfRVZFTlRfQUNLTk9XTEVER0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVI6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0VWRU5UX1JFR0lTVEVSLCAiKTsKKwkJcHJpbnRrKCJVVElMX0VWRU5UX1JFR0lTVEVSLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfTE9DSzoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfTE9DSywgIik7CisJCXByaW50aygiVVRJTF9MT0NLLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfTE9DS19SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9MT0NLX1JFTEVBU0UsICIpOworCQlwcmludGsoIlVUSUxfTE9DS19SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfUEFSQU1TX0dFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfUEFSQU1TX0dFVCwgIik7CisJCXByaW50aygiVVRJTF9QQVJBTVNfR0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfUEFSQU1TX1NFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfUEFSQU1TX1NFVCwgIik7CisJCXByaW50aygiVVRJTF9QQVJBTVNfU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1VUSUxfUkVQTFlfRkFVTFRfTk9USUZZOgotCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9SRVBMWV9GQVVMVF9OT1RJRlksICIpOworCQlwcmludGsoIlVUSUxfUkVQTFlfRkFVTFRfTk9USUZZLCAiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOworCQlwcmludGsoIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOwogCX0KIH0KIApAQCAtMjUzLDEwNiArMjUzLDEwNiBAQAogewogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfQVNTSUdOOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19BREFQVEVSX0FTU0lHTiwgIik7CisJCXByaW50aygiRVhFQ19BREFQVEVSX0FTU0lHTiwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX1JFQUQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0FEQVBURVJfUkVBRCwgIik7CisJCXByaW50aygiRVhFQ19BREFQVEVSX1JFQUQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQURBUFRFUl9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19BREFQVEVSX1JFTEVBU0UsICIpOworCQlwcmludGsoIkVYRUNfQURBUFRFUl9SRUxFQVNFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0JJT1NfSU5GT19TRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0JJT1NfSU5GT19TRVQsICIpOworCQlwcmludGsoIkVYRUNfQklPU19JTkZPX1NFVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9CT09UX0RFVklDRV9TRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0JPT1RfREVWSUNFX1NFVCwgIik7CisJCXByaW50aygiRVhFQ19CT09UX0RFVklDRV9TRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQ09ORklHX1ZBTElEQVRFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19DT05GSUdfVkFMSURBVEUsICIpOworCQlwcmludGsoIkVYRUNfQ09ORklHX1ZBTElEQVRFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0NPTk5fU0VUVVA6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0NPTk5fU0VUVVAsICIpOworCQlwcmludGsoIkVYRUNfQ09OTl9TRVRVUCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fREVTVFJPWToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX0RFU1RST1ksICIpOworCQlwcmludGsoIkVYRUNfRERNX0RFU1RST1ksICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfRERNX0VOQUJMRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX0VOQUJMRSwgIik7CisJCXByaW50aygiRVhFQ19ERE1fRU5BQkxFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RETV9RVUlFU0NFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fUVVJRVNDRSwgIik7CisJCXByaW50aygiRVhFQ19ERE1fUVVJRVNDRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERE1fUkVTRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9SRVNFVCwgIik7CisJCXByaW50aygiRVhFQ19ERE1fUkVTRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfRERNX1NVU1BFTkQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9TVVNQRU5ELCAiKTsKKwkJcHJpbnRrKCJFWEVDX0RETV9TVVNQRU5ELCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0RFVklDRV9BU1NJR046Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RFVklDRV9BU1NJR04sICIpOworCQlwcmludGsoIkVYRUNfREVWSUNFX0FTU0lHTiwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9ERVZJQ0VfUkVMRUFTRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfREVWSUNFX1JFTEVBU0UsICIpOworCQlwcmludGsoIkVYRUNfREVWSUNFX1JFTEVBU0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfSFJUX0dFVDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSFJUX0dFVCwgIik7CisJCXByaW50aygiRVhFQ19IUlRfR0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0FEQVBURVJfQ0xFQVI6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0lPUF9DTEVBUiwgIik7CisJCXByaW50aygiRVhFQ19JT1BfQ0xFQVIsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfQURBUFRFUl9DT05ORUNUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19JT1BfQ09OTkVDVCwgIik7CisJCXByaW50aygiRVhFQ19JT1BfQ09OTkVDVCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9BREFQVEVSX1JFU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19JT1BfUkVTRVQsICIpOworCQlwcmludGsoIkVYRUNfSU9QX1JFU0VULCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX0xDVF9OT1RJRlk6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0xDVF9OT1RJRlksICIpOworCQlwcmludGsoIkVYRUNfTENUX05PVElGWSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9PVVRCT1VORF9JTklUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19PVVRCT1VORF9JTklULCAiKTsKKwkJcHJpbnRrKCJFWEVDX09VVEJPVU5EX0lOSVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfUEFUSF9FTkFCTEU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1BBVEhfRU5BQkxFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1BBVEhfRU5BQkxFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1BBVEhfUVVJRVNDRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfUEFUSF9RVUlFU0NFLCAiKTsKKwkJcHJpbnRrKCJFWEVDX1BBVEhfUVVJRVNDRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9QQVRIX1JFU0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX1JFU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX1BBVEhfUkVTRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1RBVElDX01GX0NSRUFURToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1RBVElDX01GX0NSRUFURSwgIik7CisJCXByaW50aygiRVhFQ19TVEFUSUNfTUZfQ1JFQVRFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NUQVRJQ19NRl9SRUxFQVNFOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUSUNfTUZfUkVMRUFTRSwgIik7CisJCXByaW50aygiRVhFQ19TVEFUSUNfTUZfUkVMRUFTRSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TVEFUVVNfR0VUOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUVVNfR0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NUQVRVU19HRVQsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1dfRE9XTkxPQUQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NXX0RPV05MT0FELCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NXX0RPV05MT0FELCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NXX1VQTE9BRDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1dfVVBMT0FELCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NXX1VQTE9BRCwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TV19SRU1PVkU6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NXX1JFTU9WRSwgIik7CisJCXByaW50aygiRVhFQ19TV19SRU1PVkUsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1lTX0VOQUJMRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX0VOQUJMRSwgIik7CisJCXByaW50aygiRVhFQ19TWVNfRU5BQkxFLCAiKTsKIAkJYnJlYWs7CiAJY2FzZSBJMk9fQ01EX1NZU19NT0RJRlk6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19NT0RJRlksICIpOworCQlwcmludGsoIkVYRUNfU1lTX01PRElGWSwgIik7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NNRF9TWVNfUVVJRVNDRToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfU1lTX1FVSUVTQ0UsICIpOworCQlwcmludGsoIkVYRUNfU1lTX1FVSUVTQ0UsICIpOwogCQlicmVhazsKIAljYXNlIEkyT19DTURfU1lTX1RBQl9TRVQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19UQUJfU0VULCAiKTsKKwkJcHJpbnRrKCJFWEVDX1NZU19UQUJfU0VULCAiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkNtZCA9ICUjMDJ4LCAiLCBjbWQpOworCQlwcmludGsoIkNtZCA9ICUjMDJ4LCAiLCBjbWQpOwogCX0KIH0KIApAQCAtMzYxLDI4ICszNjEsMjggQEAKIAlwcmludGsoS0VSTl9JTkZPICIlczogU3RhdGUgPSAiLCBjLT5uYW1lKTsKIAlzd2l0Y2ggKCgoaTJvX3N0YXR1c19ibG9jayAqKSBjLT5zdGF0dXNfYmxvY2sudmlydCktPmlvcF9zdGF0ZSkgewogCWNhc2UgMHgwMToKLQkJcHJpbnRrKEtFUk5fREVCVUcgIklOSVRcbiIpOworCQlwcmludGsoIklOSVRcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDI6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJSRVNFVFxuIik7CisJCXByaW50aygiUkVTRVRcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MDQ6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJIT0xEXG4iKTsKKwkJcHJpbnRrKCJIT0xEXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA1OgotCQlwcmludGsoS0VSTl9ERUJVRyAiUkVBRFlcbiIpOworCQlwcmludGsoIlJFQURZXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDA4OgotCQlwcmludGsoS0VSTl9ERUJVRyAiT1BFUkFUSU9OQUxcbiIpOworCQlwcmludGsoIk9QRVJBVElPTkFMXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSAweDEwOgotCQlwcmludGsoS0VSTl9ERUJVRyAiRkFJTEVEXG4iKTsKKwkJcHJpbnRrKCJGQUlMRURcbiIpOwogCQlicmVhazsKIAljYXNlIDB4MTE6Ci0JCXByaW50ayhLRVJOX0RFQlVHICJGQVVMVEVEXG4iKTsKKwkJcHJpbnRrKCJGQVVMVEVEXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiV4ICh1bmtub3duICEhKVxuIiwKKwkJcHJpbnRrKCIleCAodW5rbm93biAhISlcbiIsCiAJCSAgICAgICAoKGkyb19zdGF0dXNfYmxvY2sgKikgYy0+c3RhdHVzX2Jsb2NrLnZpcnQpLT5pb3Bfc3RhdGUpOwogCX0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwppbmRleCA2MTFhZGMzLi40ODlkN2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKQEAgLTYyLDcgKzYyLDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JZG93bigmZGV2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCiAJcmMgPSBpMm9fZGV2aWNlX2lzc3VlX2NsYWltKGRldiwgSTJPX0NNRF9VVElMX0NMQUlNLCBJMk9fQ0xBSU1fUFJJTUFSWSk7CiAJaWYgKCFyYykKQEAgLTcyLDcgKzcyLDcgQEAKIAkJcHJfZGVidWcoImkybzogY2xhaW0gb2YgZGV2aWNlICVkIGZhaWxlZCAlZFxuIiwKIAkJCSBkZXYtPmxjdF9kYXRhLnRpZCwgcmMpOwogCi0JdXAoJmRldi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtOTYsNyArOTYsNyBAQAogCWludCB0cmllczsKIAlpbnQgcmMgPSAwOwogCi0JZG93bigmZGV2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogCiAJLyoKIAkgKiAgICAgIElmIHRoZSBjb250cm9sbGVyIHRha2VzIGEgbm9uYmxvY2tpbmcgYXBwcm9hY2ggdG8KQEAgLTExOCw3ICsxMTgsNyBAQAogCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSByZWxlYXNlIG9mIGRldmljZSAlZCBmYWlsZWQgJWRcbiIsCiAJCQkgZGV2LT5sY3RfZGF0YS50aWQsIHJjKTsKIAotCXVwKCZkZXYtPmxvY2spOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTE5OCw3ICsxOTgsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpc3QpOwotCWluaXRfTVVURVgoJmRldi0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKIAogCWRldi0+ZGV2aWNlLmJ1cyA9ICZpMm9fYnVzX3R5cGU7CiAJZGV2LT5kZXZpY2UucmVsZWFzZSA9ICZpMm9fZGV2aWNlX3JlbGVhc2U7CkBAIC0zMjYsNyArMzI2LDcgQEAKIAl1MTYgdGFibGVfc2l6ZTsKIAl1MzIgYnVmOwogCi0JZG93bigmYy0+bGN0X2xvY2spOworCW11dGV4X2xvY2soJmMtPmxjdF9sb2NrKTsKIAogCWtmcmVlKGMtPmxjdCk7CiAKQEAgLTMzNSw3ICszMzUsNyBAQAogCiAJbGN0ID0gYy0+bGN0ID0ga21hbGxvYyh0YWJsZV9zaXplICogNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsY3QpIHsKLQkJdXAoJmMtPmxjdF9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5sY3RfbG9jayk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDA4LDcgKzQwOCw3IEBACiAJCQlpMm9fZGV2aWNlX3JlbW92ZShkZXYpOwogCX0KIAotCXVwKCZjLT5sY3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZjLT5sY3RfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwppbmRleCA1Mjc4YWFkLi44YzgzZWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC0xMzEsOCArMTMxLDEwIEBACiAJaW50IHJjID0gMDsKIAogCXdhaXQgPSBpMm9fZXhlY193YWl0X2FsbG9jKCk7Ci0JaWYgKCF3YWl0KQorCWlmICghd2FpdCkgeworCQlpMm9fbXNnX25vcChjLCBtc2cpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpZiAodGNudHh0ID09IDB4ZmZmZmZmZmYpCiAJCXRjbnR4dCA9IDB4ODAwMDAwMDA7CkBAIC0zMzcsNiArMzM5LDggQEAKIAlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wcm9kdWN0X2lkKTsKIAlpZiAocmMpIGdvdG8gZXJyX3ZpZDsKIAorCWkyb19kZXYtPmlvcC0+ZXhlYyA9IGkyb19kZXY7CisKIAlyZXR1cm4gMDsKIAogZXJyX3ZpZDoKQEAgLTUzNyw3ICs1NDEsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKIAotCWRvd24oJmMtPmxjdF9sb2NrKTsKKwltdXRleF9sb2NrKCZjLT5sY3RfbG9jayk7CiAKIAlkZXYgPSAmYy0+cGRldi0+ZGV2OwogCkBAIC01NjEsNyArNTY1LDcgQEAKIAogCWkyb19tc2dfcG9zdChjLCBtc2cpOwogCi0JdXAoJmMtPmxjdF9sb2NrKTsKKwltdXRleF91bmxvY2soJmMtPmxjdF9sb2NrKTsKIAogCXJldHVybiAwOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCmluZGV4IGIxN2M0YjIuLjY0YTUyYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CiAKIAltc2cgPSBpMm9fbXNnX2dldF93YWl0KGRldi0+aW9wLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7Ci0JaWYgKElTX0VSUihtc2cpID09IEkyT19RVUVVRV9FTVBUWSkKKwlpZiAoSVNfRVJSKG1zZykpCiAJCXJldHVybiBQVFJfRVJSKG1zZyk7CiAKIAltc2ctPnUuaGVhZFswXSA9IGNwdV90b19sZTMyKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCmluZGV4IDhiYTI3NWEuLjg0ZTA0NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jCkBAIC01NTQsOCArNTU0LDYgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQltc2cgPSBpMm9fbXNnX2dldF93YWl0KGMsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKLQogCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CiAKIAlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgewpAQCAtNTczLDI0ICs1NzEsMzAgQEAKIAogCXNpemUgPDw9IDI7CQkvLyBDb252ZXJ0IHRvIGJ5dGVzCiAKKwltc2cgPSBpMm9fbXNnX2dldF93YWl0KGMsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAoSVNfRVJSKG1zZykpCisJCXJldHVybiBQVFJfRVJSKG1zZyk7CisKKwlyY29kZSA9IC1FRkFVTFQ7CiAJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCiAJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CiAJCW9zbV93YXJuKCJ1bmFibGUgdG8gY29weSB1c2VyIG1lc3NhZ2VcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAJfQogCWkyb19kdW1wX21lc3NhZ2UobXNnKTsKIAogCWlmIChnZXRfdXNlcihyZXBseV9zaXplLCAmdXNlcl9yZXBseVswXSkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJZ290byBvdXQ7CiAKIAlyZXBseV9zaXplID4+PSAxNjsKIAlyZXBseV9zaXplIDw8PSAyOwogCisJcmNvZGUgPSAtRU5PTUVNOwogCXJlcGx5ID0ga3phbGxvYyhyZXBseV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlcGx5KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcmVwbHkgYnVmZmVyXG4iLAogCQkgICAgICAgYy0+bmFtZSk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKIAl9CiAKIAlzZ19vZmZzZXQgPSAobXNnLT51LmhlYWRbMF0gPj4gNCkgJiAweDBmOwpAQCAtNjYxLDEzICs2NjUsMTQgQEAKIAl9CiAKIAlyY29kZSA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG1zZywgNjApOworCW1zZyA9IE5VTEw7CiAJaWYgKHJjb2RlKSB7CiAJCXJlcGx5WzRdID0gKCh1MzIpIHJjb2RlKSA8PCAyNDsKIAkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJfQogCiAJaWYgKHNnX29mZnNldCkgewotCQl1MzIgbXNnW0kyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRV07CisJCXUzMiBybXNnW0kyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRV07CiAJCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KIAkJdTMyIGo7CiAJCS8vIFRPRE8gNjRiaXQgZml4CkBAIC02NzUsNyArNjgwLDcgQEAKIAkJaW50IHNnX3NpemU7CiAKIAkJLy8gcmUtYWNxdWlyZSB0aGUgb3JpZ2luYWwgbWVzc2FnZSB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSBzZyBjb3B5IG9wZXJhdGlvbgotCQltZW1zZXQoJm1zZywgMCwgSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFICogNCk7CisJCW1lbXNldCgmcm1zZywgMCwgSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFICogNCk7CiAJCS8vIGdldCB1c2VyIG1zZyBzaXplIGluIHUzMnMKIAkJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKQEAgLTY4NCw3ICs2ODksNyBAQAogCQlzaXplID0gc2l6ZSA+PiAxNjsKIAkJc2l6ZSAqPSA0OwogCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcihybXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKIAkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQl9CkBAIC02OTIsNyArNjk3LDcgQEAKIAkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKIAogCQkvLyBUT0RPIDY0Yml0IGZpeAotCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikobXNnICsgc2dfb2Zmc2V0KTsKKwkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKHJtc2cgKyBzZ19vZmZzZXQpOwogCQlmb3IgKGogPSAwOyBqIDwgc2dfY291bnQ7IGorKykgewogCQkJLyogQ29weSBvdXQgdGhlIFNHIGxpc3QgdG8gdXNlcidzIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KIAkJCWlmICghCkBAIC03MTQsNyArNzE5LDcgQEAKIAkJfQogCX0KIAotICAgICAgc2dfbGlzdF9jbGVhbnVwOgorc2dfbGlzdF9jbGVhbnVwOgogCS8qIENvcHkgYmFjayB0aGUgcmVwbHkgdG8gdXNlciBzcGFjZSAqLwogCWlmIChyZXBseV9zaXplKSB7CiAJCS8vIHdlIHdyb3RlIG91ciBvd24gdmFsdWVzIGZvciBjb250ZXh0IC0gbm93IHJlc3RvcmUgdGhlIHVzZXIgc3VwcGxpZWQgb25lcwpAQCAtNzIzLDcgKzcyOCw2IEBACiAJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBtZXNzYWdlIGNvbnRleHQgRlJPTSB1c2VyXG4iLAogCQkJICAgICAgIGMtPm5hbWUpOwogCQkJcmNvZGUgPSAtRUZBVUxUOwotCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCX0KIAkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX3JlcGx5LCByZXBseSwgcmVwbHlfc2l6ZSkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTczMSwxMiArNzM1LDE0IEBACiAJCQlyY29kZSA9IC1FRkFVTFQ7CiAJCX0KIAl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgc2dfaW5kZXg7IGkrKykKIAkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZzZ19saXN0W2ldKTsKIAotICAgICAgY2xlYW51cDoKK2NsZWFudXA6CiAJa2ZyZWUocmVwbHkpOworb3V0OgorCWlmIChtc2cpCisJCWkyb19tc2dfbm9wKGMsIG1zZyk7CiAJcmV0dXJuIHJjb2RlOwogfQogCkBAIC03OTMsOCArNzk5LDYgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQltc2cgPSBpMm9fbXNnX2dldF93YWl0KGMsIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKLQogCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CiAKIAlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkKQEAgLTgxMCwxMiArODE0LDE3IEBACiAKIAlzaXplIDw8PSAyOwkJLy8gQ29udmVydCB0byBieXRlcwogCisJbXNnID0gaTJvX21zZ19nZXRfd2FpdChjLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKElTX0VSUihtc2cpKQorCQlyZXR1cm4gUFRSX0VSUihtc2cpOworCisJcmNvZGUgPSAtRUZBVUxUOwogCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwogCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCWdvdG8gb3V0OwogCiAJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlnb3RvIG91dDsKIAogCXJlcGx5X3NpemUgPj49IDE2OwogCXJlcGx5X3NpemUgPDw9IDI7CkBAIC04MjQsNyArODMzLDggQEAKIAlpZiAoIXJlcGx5KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcmVwbHkgYnVmZmVyXG4iLAogCQkgICAgICAgYy0+bmFtZSk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyY29kZSA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCXNnX29mZnNldCA9IChtc2ctPnUuaGVhZFswXSA+PiA0KSAmIDB4MGY7CkBAIC04OTEsMTMgKzkwMSwxNCBAQAogCX0KIAogCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbXNnLCA2MCk7CisJbXNnID0gTlVMTDsKIAlpZiAocmNvZGUpIHsKIAkJcmVwbHlbNF0gPSAoKHUzMikgcmNvZGUpIDw8IDI0OwogCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAl9CiAKIAlpZiAoc2dfb2Zmc2V0KSB7Ci0JCXUzMiBtc2dbMTI4XTsKKwkJdTMyIHJtc2dbMTI4XTsKIAkJLyogQ29weSBiYWNrIHRoZSBTY2F0dGVyIEdhdGhlciBidWZmZXJzIGJhY2sgdG8gdXNlciBzcGFjZSAqLwogCQl1MzIgajsKIAkJLy8gVE9ETyA2NGJpdCBmaXgKQEAgLTkwNSw3ICs5MTYsNyBAQAogCQlpbnQgc2dfc2l6ZTsKIAogCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCi0JCW1lbXNldCgmbXNnLCAwLCBJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkUgKiA0KTsKKwkJbWVtc2V0KCZybXNnLCAwLCBJMk9fT1VUQk9VTkRfTVNHX0ZSQU1FX1NJWkUgKiA0KTsKIAkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycwogCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgewogCQkJcmNvZGUgPSAtRUZBVUxUOwpAQCAtOTE0LDcgKzkyNSw3IEBACiAJCXNpemUgPSBzaXplID4+IDE2OwogCQlzaXplICo9IDQ7CiAJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJtc2csIHVzZXJfbXNnLCBzaXplKSkgewogCQkJcmNvZGUgPSAtRUZBVUxUOwogCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCX0KQEAgLTkyMiw3ICs5MzMsNyBAQAogCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOwogCiAJCS8vIFRPRE8gNjRiaXQgZml4Ci0JCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShtc2cgKyBzZ19vZmZzZXQpOworCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikocm1zZyArIHNnX29mZnNldCk7CiAJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CiAJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwogCQkJaWYgKCEKQEAgLTk0NCw3ICs5NTUsNyBAQAogCQl9CiAJfQogCi0gICAgICBzZ19saXN0X2NsZWFudXA6CitzZ19saXN0X2NsZWFudXA6CiAJLyogQ29weSBiYWNrIHRoZSByZXBseSB0byB1c2VyIHNwYWNlICovCiAJaWYgKHJlcGx5X3NpemUpIHsKIAkJLy8gd2Ugd3JvdGUgb3VyIG93biB2YWx1ZXMgZm9yIGNvbnRleHQgLSBub3cgcmVzdG9yZSB0aGUgdXNlciBzdXBwbGllZCBvbmVzCkBAIC05NjQsOCArOTc1LDExIEBACiAJZm9yIChpID0gMDsgaSA8IHNnX2luZGV4OyBpKyspCiAJCWtmcmVlKHNnX2xpc3RbaV0pOwogCi0gICAgICBjbGVhbnVwOgorY2xlYW51cDoKIAlrZnJlZShyZXBseSk7CitvdXQ6CisJaWYgKG1zZykKKwkJaTJvX21zZ19ub3AoYywgbXNnKTsKIAlyZXR1cm4gcmNvZGU7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCmluZGV4IDMzMDVjMTIuLmExZWMxNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwpAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZjLT5kZXZpY2VzKTsKIAlzcGluX2xvY2tfaW5pdCgmYy0+bG9jayk7Ci0JaW5pdF9NVVRFWCgmYy0+bGN0X2xvY2spOworCW11dGV4X2luaXQoJmMtPmxjdF9sb2NrKTsKIAogCWRldmljZV9pbml0aWFsaXplKCZjLT5kZXZpY2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMgYi9kcml2ZXJzL21mZC91Y2IxeDAwLXRzLmMKaW5kZXggMzhlODE1YS4uZmRiYWE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdWNiMXgwMC10cy5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtdHMuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgdHNrKTsKIAlpbnQgdmFsaWQgPSAwOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCWFkZF93YWl0X3F1ZXVlKCZ0cy0+aXJxX3dhaXQsICZ3YWl0KTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQl1bnNpZ25lZCBpbnQgeCwgeSwgcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggYmQ2MDFlZi4uMWQ1MTZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTIsMTEgKzIsMTUgQEAKICMgTWlzYyBzdHJhbmdlIGRldmljZXMKICMKIAotbWVudSAiTWlzYyBkZXZpY2VzIgorbWVudWNvbmZpZyBNSVNDX0RFVklDRVMKKwlib29sICJNaXNjIGRldmljZXMiCisJZGVmYXVsdCB5CisKK2lmIE1JU0NfREVWSUNFUwogCiBjb25maWcgSUJNX0FTTQogCXRyaXN0YXRlICJEZXZpY2UgZHJpdmVyIGZvciBJQk0gUlNBIHNlcnZpY2UgcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gWDg2ICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgSU5QVVQgJiYgRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBkZXZpY2UgZHJpdmVyIHN1cHBvcnQgZm9yIGluLWJhbmQgYWNjZXNzIHRvIHRoZQogCSAgSUJNIFJTQSAoQ29uZG9yKSBzZXJ2aWNlIHByb2Nlc3NvciBpbiBlU2VydmVyIHhTZXJpZXMgc3lzdGVtcy4KQEAgLTE5Miw0ICsxOTYsNCBAQAogCiAJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgWSBoZXJlLgogCi1lbmRtZW51CitlbmRpZiAjIE1JU0NfREVWSUNFUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9jb21tYW5kLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2NvbW1hbmQuYwppbmRleCAwN2EwODVjLi5iNWRmMzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2NvbW1hbmQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2NvbW1hbmQuYwpAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKQEAgLTcyLDcgKzcyLDcgQEAKIHN0YXRpYyB2b2lkIGZyZWVfY29tbWFuZChzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKIAlzdHJ1Y3QgY29tbWFuZCAqY21kID0gdG9fY29tbWFuZChrb2JqKTsKLSAKKwogCWxpc3RfZGVsKCZjbWQtPnF1ZXVlX25vZGUpOwogCWF0b21pY19kZWMoJmNvbW1hbmRfY291bnQpOwogCWRiZygiY29tbWFuZCBjb3VudDogJWRcbiIsIGF0b21pY19yZWFkKCZjb21tYW5kX2NvdW50KSk7CkBAIC0xMTMsMTQgKzExMywxNCBAQAogCQlleGVjX25leHRfY29tbWFuZChzcCk7CiAJfQogfQotCQorCiAvKioKICAqIGV4ZWNfY29tbWFuZAogICogc2VuZCBhIGNvbW1hbmQgdG8gYSBzZXJ2aWNlIHByb2Nlc3NvcgogICogQ29tbWFuZHMgYXJlIGV4ZWN1dGVkIHNlcXVlbnRpYWxseS4gT25lIGNvbW1hbmQgKHNwLT5jdXJyZW50X2NvbW1hbmQpCiAgKiBpcyBzZW50IHRvIHRoZSBzZXJ2aWNlIHByb2Nlc3Nvci4gT25jZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0cyBhCiAgKiBtZXNzYWdlIG9mIHR5cGUgY29tbWFuZF9yZXNwb25zZSwgdGhlIG1lc3NhZ2UgaXMgY29waWVkIGludG8KLSAqIHRoZSBjdXJyZW50IGNvbW1hbmRzIGJ1ZmZlciwgCisgKiB0aGUgY3VycmVudCBjb21tYW5kcyBidWZmZXIsCiAgKi8KIHZvaWQgaWJtYXNtX2V4ZWNfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgY29tbWFuZCAqY21kKQogewpAQCAtMTYwLDcgKzE2MCw3IEBACiAJfQogfQogCi0vKiogCisvKioKICAqIFNsZWVwIHVudGlsIGEgY29tbWFuZCBoYXMgZmFpbGVkIG9yIGEgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQKICAqIGFuZCB0aGUgY29tbWFuZCBzdGF0dXMgYmVlbiB1cGRhdGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KICAqIChzZWUgcmVjZWl2ZV9yZXNwb25zZSkuCkBAIC0xODIsOCArMTgyLDggQEAKIHsKIAlzdHJ1Y3QgY29tbWFuZCAqY21kID0gc3AtPmN1cnJlbnRfY29tbWFuZDsKIAotCWlmICghc3AtPmN1cnJlbnRfY29tbWFuZCkgCi0JCXJldHVybjsgCisJaWYgKCFzcC0+Y3VycmVudF9jb21tYW5kKQorCQlyZXR1cm47CiAKIAltZW1jcHlfZnJvbWlvKGNtZC0+YnVmZmVyLCByZXNwb25zZSwgbWluKHNpemUsIGNtZC0+YnVmZmVyX3NpemUpKTsKIAljbWQtPnN0YXR1cyA9IElCTUFTTV9DTURfQ09NUExFVEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmMKaW5kZXggMTNjNTJmOC4uM2RkMmRmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuYwpAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKQEAgLTQ0LDExICs0NCwxMSBAQAogCQlzaXplID0gbWVzc2FnZV9zaXplOwogCiAJc3dpdGNoIChoZWFkZXItPnR5cGUpIHsKLQljYXNlIHNwX2V2ZW50OiAKKwljYXNlIHNwX2V2ZW50OgogCQlpYm1hc21fcmVjZWl2ZV9ldmVudChzcCwgbWVzc2FnZSwgc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2Ugc3BfY29tbWFuZF9yZXNwb25zZToKLQkJaWJtYXNtX3JlY2VpdmVfY29tbWFuZF9yZXNwb25zZShzcCwgbWVzc2FnZSwgc2l6ZSk7IAorCQlpYm1hc21fcmVjZWl2ZV9jb21tYW5kX3Jlc3BvbnNlKHNwLCBtZXNzYWdlLCBzaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBzcF9oZWFydGJlYXQ6CiAJCWlibWFzbV9yZWNlaXZlX2hlYXJ0YmVhdChzcCwgbWVzc2FnZSwgc2l6ZSk7CkBAIC05NSw3ICs5NSw3IEBACiAJc3RyY2F0KHZwZF9kYXRhLCBJQk1BU01fRFJJVkVSX1ZQRCk7CiAJdnBkX2RhdGFbMTBdID0gMDsKIAl2cGRfZGF0YVsxNV0gPSAwOwotCQorCiAJaWJtYXNtX2V4ZWNfY29tbWFuZChzcCwgY29tbWFuZCk7CiAJaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKGNvbW1hbmQsIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwpOwogCkBAIC0xMTgsNyArMTE4LDcgQEAKICAqIER1cmluZyBkcml2ZXIgaW5pdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIG9zIHN0YXRlICJ1cCIuCiAgKiBUaGlzIGNhdXNlcyB0aGUgc2VydmljZSBwcm9jZXNzb3IgdG8gc3RhcnQgc2VuZGluZyBoZWFydGJlYXRzIHRoZQogICogZHJpdmVyLgotICogRHVyaW5nIGRyaXZlciBleGl0IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvcyBzdGF0ZSAiZG93biIsIAorICogRHVyaW5nIGRyaXZlciBleGl0IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBvcyBzdGF0ZSAiZG93biIsCiAgKiBjYXVzaW5nIHRoZSBzZXJ2aWNlIHByb2Nlc3NvciB0byBzdG9wIHRoZSBoZWFydGJlYXRzLgogICovCiBpbnQgaWJtYXNtX3NlbmRfb3Nfc3RhdGUoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgaW50IG9zX3N0YXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5oIGIvZHJpdmVycy9taXNjL2libWFzbS9kb3RfY29tbWFuZC5oCmluZGV4IDJkMjFjMjcuLjZjYmJhMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vZG90X2NvbW1hbmQuaAorKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2RvdF9jb21tYW5kLmgKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2V2ZW50LmMKaW5kZXggZmUxZTgxOS4uZmRhNmE0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9ldmVudC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vZXZlbnQuYwpAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKQEAgLTUxLDcgKzUxLDcgQEAKICAqIGV2ZW50IHJlYWRlcnMuCiAgKiBUaGVyZSBpcyBubyByZWFkZXIgbWFya2VyIGluIHRoZSBidWZmZXIsIHRoZXJlZm9yZSByZWFkZXJzIGFyZQogICogcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdXAgd2l0aCB0aGUgd3JpdGVyLCBvciB0aGV5IHdpbGwgbG9vc2UgZXZlbnRzLgotICovIAorICovCiB2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBkYXRhX3NpemUpCiB7CiAJc3RydWN0IGV2ZW50X2J1ZmZlciAqYnVmZmVyID0gc3AtPmV2ZW50X2J1ZmZlcjsKQEAgLTc3LDEzICs3NywxMyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBldmVudF9hdmFpbGFibGUoc3RydWN0IGV2ZW50X2J1ZmZlciAqYiwgc3RydWN0IGV2ZW50X3JlYWRlciAqcikKIHsKLQlyZXR1cm4gCShyLT5uZXh0X3NlcmlhbF9udW1iZXIgPCBiLT5uZXh0X3NlcmlhbF9udW1iZXIpOworCXJldHVybiAoci0+bmV4dF9zZXJpYWxfbnVtYmVyIDwgYi0+bmV4dF9zZXJpYWxfbnVtYmVyKTsKIH0KIAogLyoqCiAgKiBnZXRfbmV4dF9ldmVudAogICogQ2FsbGVkIGJ5IGV2ZW50IHJlYWRlcnMgKGluaXRpYXRlZCBmcm9tIHVzZXIgc3BhY2UgdGhyb3VnaCB0aGUgZmlsZQotICogc3lzdGVtKS4gCisgKiBzeXN0ZW0pLgogICogU2xlZXBzIHVudGlsIGEgbmV3IGV2ZW50IGlzIGF2YWlsYWJsZS4KICAqLwogaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2hlYXJ0YmVhdC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9oZWFydGJlYXQuYwppbmRleCA3ZmQ3YTQzLi4zMDM2ZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2hlYXJ0YmVhdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaGVhcnRiZWF0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2kyby5oIGIvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaAppbmRleCA5NThjOTU3Li5iZjJjNzM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9pMm8uaAorKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2kyby5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCiAgKi8KIApAQCAtMjYsOSArMjYsOSBAQAogCXU4CXZlcnNpb247CiAJdTgJbWVzc2FnZV9mbGFnczsKIAl1MTYJbWVzc2FnZV9zaXplOwotCXU4CXRhcmdldDsgICAgICAgICAgIAorCXU4CXRhcmdldDsKIAl1OAlpbml0aWF0b3JfYW5kX3RhcmdldDsKLQl1OAlpbml0aWF0b3I7ICAgICAgICAKKwl1OAlpbml0aWF0b3I7CiAJdTgJZnVuY3Rpb247CiAJdTMyCWluaXRpYXRvcl9jb250ZXh0OwogfTsKQEAgLTY0LDEyICs2NCwxMiBAQAogCXNpemUgPSBzaXplb2Yoc3RydWN0IGkyb19oZWFkZXIpICsgZGF0YV9zaXplOwogCiAJaTJvX3NpemUgPSBzaXplIC8gc2l6ZW9mKHUzMik7Ci0JCisKIAlpZiAoc2l6ZSAlIHNpemVvZih1MzIpKQogCSAgICAgICBpMm9fc2l6ZSsrOwogCiAJcmV0dXJuIGkyb19zaXplOwotfQkKK30KIAogc3RhdGljIGlubGluZSB1MzIgaW5jb21pbmdfZGF0YV9zaXplKHN0cnVjdCBpMm9fbWVzc2FnZSAqaTJvX21lc3NhZ2UpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc20uaAppbmRleCA0OGQ1YWJlLi5kZTg2MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbS5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC01OCw4ICs1OCw4IEBACiAJcmV0dXJuIGJ1ZjsKIH0KIAotI2RlZmluZSBJQk1BU01fQ01EX1BFTkRJTkcJMAkKLSNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQorI2RlZmluZSBJQk1BU01fQ01EX1BFTkRJTkcJMAorI2RlZmluZSBJQk1BU01fQ01EX0NPTVBMRVRFCTEKICNkZWZpbmUgSUJNQVNNX0NNRF9GQUlMRUQJMgogCiAjZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwJNDUKQEAgLTE2Myw1NSArMTYzLDU1IEBACiB9OwogCiAvKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KLWV4dGVybiBzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7Ci1leHRlcm4gdm9pZCBpYm1hc21fZXhlY19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBjb21tYW5kICpjbWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CitzdHJ1Y3QgY29tbWFuZCAqaWJtYXNtX25ld19jb21tYW5kKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHNpemVfdCBidWZmZXJfc2l6ZSk7Cit2b2lkIGlibWFzbV9leGVjX2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGNvbW1hbmQgKmNtZCk7Cit2b2lkIGlibWFzbV93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgY29tbWFuZCAqY21kLCBpbnQgdGltZW91dCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2NvbW1hbmRfcmVzcG9uc2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqcmVzcG9uc2UsICBzaXplX3Qgc2l6ZSk7CiAKIC8qIGV2ZW50IHByb2Nlc3NpbmcgKi8KLWV4dGVybiBpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl91bnJlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7Ci1leHRlcm4gaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CitpbnQgaWJtYXNtX2V2ZW50X2J1ZmZlcl9pbml0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwordm9pZCBpYm1hc21fZXZlbnRfYnVmZmVyX2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX2V2ZW50KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsICB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKTsKK3ZvaWQgaWJtYXNtX2V2ZW50X3JlYWRlcl9yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwordm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3VucmVnaXN0ZXIoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK2ludCBpYm1hc21fZ2V0X25leHRfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKK3ZvaWQgaWJtYXNtX2NhbmNlbF9uZXh0X2V2ZW50KHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CiAKIC8qIGhlYXJ0YmVhdCAtIGZyb20gU1AgdG8gT1MgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKLWV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwotZXh0ZXJuIGludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gdm9pZCBpYm1hc21faGVhcnRiZWF0X2V4aXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKTsKK3ZvaWQgaWJtYXNtX3JlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwordm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKK2ludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsICB2b2lkICptZXNzYWdlLCBzaXplX3Qgc2l6ZSk7CiAKIC8qIHJldmVyc2UgaGVhcnRiZWF0IC0gZnJvbSBPUyB0byBTUCAqLwotZXh0ZXJuIHZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwotZXh0ZXJuIGludCBpYm1hc21fc3RhcnRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwordm9pZCBpYm1hc21faW5pdF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CitpbnQgaWJtYXNtX3N0YXJ0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKK3ZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwogCiAvKiBkb3QgY29tbWFuZHMgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7Ci1leHRlcm4gaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Ci1leHRlcm4gaW50IGlibWFzbV9zZW5kX29zX3N0YXRlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIGludCBvc19zdGF0ZSk7Cit2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7CitpbnQgaWJtYXNtX3NlbmRfZHJpdmVyX3ZwZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2ludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwogCiAvKiBsb3cgbGV2ZWwgbWVzc2FnZSBwcm9jZXNzaW5nICovCi1leHRlcm4gaW50IGlibWFzbV9zZW5kX2kyb19tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKK2ludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK2lycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKIAogLyogcmVtb3RlIGNvbnNvbGUgKi8KLWV4dGVybiB2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIGludCBpYm1hc21faW5pdF9yZW1vdGVfaW5wdXRfZGV2KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CitpbnQgaWJtYXNtX2luaXRfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX2lucHV0X2RldihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKIAogLyogZmlsZSBzeXN0ZW0gKi8KLWV4dGVybiBpbnQgaWJtYXNtZnNfcmVnaXN0ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaWJtYXNtZnNfYWRkX3NwKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOworaW50IGlibWFzbWZzX3JlZ2lzdGVyKHZvaWQpOwordm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwordm9pZCBpYm1hc21mc19hZGRfc3Aoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAKIC8qIHVhcnQgKi8KICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKLWV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwotZXh0ZXJuIHZvaWQgaWJtYXNtX3VucmVnaXN0ZXJfdWFydChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKK3ZvaWQgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7Cit2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiAjZWxzZQogI2RlZmluZSBpYm1hc21fcmVnaXN0ZXJfdWFydChzcCkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCmluZGV4IGM0MzZkM2QuLmViN2IwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKQEAgLTE3LDEyICsxNywxMiBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKIC8qCi0gKiBQYXJ0cyBvZiB0aGlzIGNvZGUgYXJlIGJhc2VkIG9uIGFuIGFydGljbGUgYnkgSm9uYXRoYW4gQ29yYmV0IAorICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiBhbiBhcnRpY2xlIGJ5IEpvbmF0aGFuIENvcmJldAogICogdGhhdCBhcHBlYXJlZCBpbiBMaW51eCBXZWVrbHkgTmV3cy4KICAqLwogCkBAIC01NSwyMiArNTUsMjIgQEAKICAqIEZvciBlYWNoIHNlcnZpY2UgcHJvY2Vzc29yIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGNyZWF0ZWQ6CiAgKgogICogY29tbWFuZDogZXhlY3V0ZSBkb3QgY29tbWFuZHMKLSAqIAl3cml0ZTogZXhlY3V0ZSBhIGRvdCBjb21tYW5kIG9uIHRoZSBzZXJ2aWNlIHByb2Nlc3NvcgotICogCXJlYWQ6IHJldHVybiB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXNseSBleGVjdXRlZCBkb3QgY29tbWFuZAorICoJd3JpdGU6IGV4ZWN1dGUgYSBkb3QgY29tbWFuZCBvbiB0aGUgc2VydmljZSBwcm9jZXNzb3IKKyAqCXJlYWQ6IHJldHVybiB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXNseSBleGVjdXRlZCBkb3QgY29tbWFuZAogICoKICAqIGV2ZW50czogbGlzdGVuIGZvciBzZXJ2aWNlIHByb2Nlc3NvciBldmVudHMKLSAqIAlyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgYW4gZXZlbnQgb2NjdXJzCisgKglyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgYW4gZXZlbnQgb2NjdXJzCiAgKiAgICAgIHdyaXRlOiB3YWtldXAgc2xlZXBpbmcgZXZlbnQgbGlzdGVuZXIKICAqCiAgKiByZXZlcnNlX2hlYXJ0YmVhdDogc2VuZCBhIGhlYXJ0YmVhdCB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IKLSAqIAlyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgdGhlIHJldmVyc2UgaGVhcnRiZWF0IGZhaWxzCisgKglyZWFkOiBzbGVlcCAoaW50ZXJydXB0aWJsZSkgdW50aWwgdGhlIHJldmVyc2UgaGVhcnRiZWF0IGZhaWxzCiAgKiAgICAgIHdyaXRlOiB3YWtldXAgc2xlZXBpbmcgaGVhcnRiZWF0IGxpc3RlbmVyCiAgKgogICogcmVtb3RlX3ZpZGVvL3dpZHRoCiAgKiByZW1vdGVfdmlkZW8vaGVpZ2h0CiAgKiByZW1vdGVfdmlkZW8vd2lkdGg6IGNvbnRyb2wgcmVtb3RlIGRpc3BsYXkgc2V0dGluZ3MKLSAqIAl3cml0ZTogc2V0IHZhbHVlCi0gKiAJcmVhZDogcmVhZCB2YWx1ZQorICoJd3JpdGU6IHNldCB2YWx1ZQorICoJcmVhZDogcmVhZCB2YWx1ZQogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICppYm1hc21mc19jcmVhdGVfZmlsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwKLQkJICAgICAgIAljb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3QgY2hhciAqbmFtZSwKIAkJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsCiAJCQl2b2lkICpkYXRhLAogCQkJaW50IG1vZGUpCkBAIC0yNjEsNyArMjYxLDcgQEAKIAlzdHJ1Y3QgaWJtYXNtZnNfY29tbWFuZF9kYXRhICpjb21tYW5kX2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoY29tbWFuZF9kYXRhLT5jb21tYW5kKQotCQljb21tYW5kX3B1dChjb21tYW5kX2RhdGEtPmNvbW1hbmQpOwkKKwkJY29tbWFuZF9wdXQoY29tbWFuZF9kYXRhLT5jb21tYW5kKTsKIAogCWtmcmVlKGNvbW1hbmRfZGF0YSk7CiAJcmV0dXJuIDA7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIHN0YXRpYyBpbnQgZXZlbnRfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBpYm1hc21mc19ldmVudF9kYXRhICpldmVudF9kYXRhOwotCXN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3A7IAorCXN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3A7CiAKIAlpZiAoIWlub2RlLT5pX3ByaXZhdGUpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJCWtmcmVlKGJ1ZmYpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9Ci0JCisKIAl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmYsIE5VTEwsIDEwKTsKIAl3cml0ZWwodmFsdWUsIGFkZHJlc3MpOwogCWtmcmVlKGJ1ZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5jCmluZGV4IGEzYzU4OWIuLjRiMjM5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmggYi9kcml2ZXJzL21pc2MvaWJtYXNtL2xvd2xldmVsLmgKaW5kZXggZTVlZDU5Yy4uNzY2NzY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9sb3dsZXZlbC5oCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vbG93bGV2ZWwuaApAQCAtMTcsNyArMTcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKQEAgLTQ4LDkgKzQ4LDkgQEAKICNkZWZpbmUgSU5UUl9DT05UUk9MX1JFR0lTVEVSICAweDEzQTQKIAogI2RlZmluZSBTQ09VVF9DT01fQV9CQVNFICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIFNDT1VUX0NPTV9CX0JBU0UgICAgICAgICAweDAxMDAgICAKLSNkZWZpbmUgU0NPVVRfQ09NX0NfQkFTRSAgICAgICAgIDB4MDIwMCAgIAotI2RlZmluZSBTQ09VVF9DT01fRF9CQVNFICAgICAgICAgMHgwMzAwICAgCisjZGVmaW5lIFNDT1VUX0NPTV9CX0JBU0UgICAgICAgICAweDAxMDAKKyNkZWZpbmUgU0NPVVRfQ09NX0NfQkFTRSAgICAgICAgIDB4MDIwMAorI2RlZmluZSBTQ09VVF9DT01fRF9CQVNFICAgICAgICAgMHgwMzAwCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNwX2ludGVycnVwdF9wZW5kaW5nKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQogewpAQCAtODYsMTIgKzg2LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfdWFydF9pbnRlcnJ1cHRzKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQogewotCWlibWFzbV9lbmFibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsgCisJaWJtYXNtX2VuYWJsZV9pbnRlcnJ1cHRzKGJhc2VfYWRkcmVzcywgVUFSVF9JTlRSX01BU0spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV91YXJ0X2ludGVycnVwdHModm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpCiB7Ci0JaWJtYXNtX2Rpc2FibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsgCisJaWJtYXNtX2Rpc2FibGVfaW50ZXJydXB0cyhiYXNlX2FkZHJlc3MsIFVBUlRfSU5UUl9NQVNLKTsKIH0KIAogI2RlZmluZSB2YWxpZF9tZmEobWZhKQkoIChtZmEpICE9IE5PX01GQVNfQVZBSUxBQkxFICkKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21mYV9vdXRib3VuZCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdTMyIG1mYSkKIHsKLSAgIAl3cml0ZWwobWZhLCBiYXNlX2FkZHJlc3MgKyBPVVRCT1VORF9RVUVVRV9QT1JUKTsKKwl3cml0ZWwobWZhLCBiYXNlX2FkZHJlc3MgKyBPVVRCT1VORF9RVUVVRV9QT1JUKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgZ2V0X21mYV9pbmJvdW5kKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzKQpAQCAtMTI2LDcgKzEyNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbWZhX2luYm91bmQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsIHUzMiBtZmEpCiB7Ci0gICAJd3JpdGVsKG1mYSwgYmFzZV9hZGRyZXNzICsgSU5CT1VORF9RVUVVRV9QT1JUKTsKKwl3cml0ZWwobWZhLCBiYXNlX2FkZHJlc3MgKyBJTkJPVU5EX1FVRVVFX1BPUlQpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpMm9fbWVzc2FnZSAqZ2V0X2kyb19tZXNzYWdlKHZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzLCB1MzIgbWZhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vbW9kdWxlLmMKaW5kZXggMmYzYmRkZi4uZmIwM2E4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2libWFzbS9tb2R1bGUuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL21vZHVsZS5jCkBAIC0xOCw5ICsxOCw5IEBACiAgKgogICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQKICAqCi0gKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCisgKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBjb2RlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXRlIFJleW5vbGRzIAorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gY29kZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGV0ZSBSZXlub2xkcwogICogYW5kIG90aGVycy4KICAqCiAgKi8KQEAgLTMwLDEzICszMCwxMyBAQAogICoKICAqIDEpIFdoZW4gbG9hZGVkIGl0IHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgc2VydmljZSBwcm9jZXNzb3IsCiAgKiBpbmRpY2F0aW5nIHRoYXQgYW4gT1MgaXMgKiBydW5uaW5nLiBUaGlzIGNhdXNlcyB0aGUgc2VydmljZSBwcm9jZXNzb3IKLSAqIHRvIHNlbmQgcGVyaW9kaWMgaGVhcnRiZWF0cyB0byB0aGUgT1MuIAorICogdG8gc2VuZCBwZXJpb2RpYyBoZWFydGJlYXRzIHRvIHRoZSBPUy4KICAqCiAgKiAyKSBBbnN3ZXJzIHRoZSBwZXJpb2RpYyBoZWFydGJlYXRzIHNlbnQgYnkgdGhlIHNlcnZpY2UgcHJvY2Vzc29yLgogICogRmFpbHVyZSB0byBkbyBzbyB3b3VsZCByZXN1bHQgaW4gc3lzdGVtIHJlYm9vdC4KICAqCiAgKiAzKSBBY3RzIGFzIGEgcGFzcyB0aHJvdWdoIGZvciBkb3QgY29tbWFuZHMgc2VudCBmcm9tIHVzZXIgYXBwbGljYXRpb25zLgotICogVGhlIGludGVyZmFjZSBmb3IgdGhpcyBpcyB0aGUgaWJtYXNtZnMgZmlsZSBzeXN0ZW0uIAorICogVGhlIGludGVyZmFjZSBmb3IgdGhpcyBpcyB0aGUgaWJtYXNtZnMgZmlsZSBzeXN0ZW0uCiAgKgogICogNCkgQWxsb3dzIHVzZXIgYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyIGZvciBldmVudCBub3RpZmljYXRpb24uIEV2ZW50cwogICogYXJlIHNlbnQgdG8gdGhlIGRyaXZlciB0aHJvdWdoIGludGVycnVwdHMuIFRoZXkgY2FuIGJlIHJlYWQgZnJvbSB1c2VyCkBAIC0xMDUsNyArMTA1LDcgQEAKIAl9CiAKIAlzcC0+aXJxID0gcGRldi0+aXJxOwotCXNwLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgCisJc3AtPmJhc2VfYWRkcmVzcyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAogCQkJCQlwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKIAlpZiAoc3AtPmJhc2VfYWRkcmVzcyA9PSAwKSB7CiAJCWRldl9lcnIoc3AtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIHBjaSBtZW1vcnlcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jIGIvZHJpdmVycy9taXNjL2libWFzbS9yX2hlYXJ0YmVhdC5jCmluZGV4IGY4ZmRiMmQuLmJlYzllMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcl9oZWFydGJlYXQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3JfaGVhcnRiZWF0LmMKQEAgLTE2LDcgKzE2LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogICoKLSAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPiAKKyAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogICoKICAqLwogCkBAIC0zNiwxMCArMzYsMTAgQEAKIAl1bnNpZ25lZCBjaGFyCQkJY29tbWFuZFszXTsKIH0gcmhiX2RvdF9jbWQgPSB7CiAJLmhlYWRlciA9IHsKLQkJLnR5cGUgPSAJc3BfcmVhZCwKKwkJLnR5cGUgPQkJc3BfcmVhZCwKIAkJLmNvbW1hbmRfc2l6ZSA9IDMsCiAJCS5kYXRhX3NpemUgPQkwLAotCQkuc3RhdHVzID0gCTAKKwkJLnN0YXR1cyA9CTAKIAl9LAogCS5jb21tYW5kID0geyA0LCAzLCA2IH0KIH07CkBAIC03Niw5ICs3Niw5IEBACiAJCWlmIChjbWQtPnN0YXR1cyAhPSBJQk1BU01fQ01EX0NPTVBMRVRFKQogCQkJdGltZXNfZmFpbGVkKys7CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmhiLT53YWl0LCAKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocmhiLT53YWl0LAogCQkJcmhiLT5zdG9wcGVkLAotCQkJUkVWRVJTRV9IRUFSVEJFQVRfVElNRU9VVCAqIEhaKTsgCQorCQkJUkVWRVJTRV9IRUFSVEJFQVRfVElNRU9VVCAqIEhaKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwgcmhiLT5zdG9wcGVkKSB7CiAJCQlyZXN1bHQgPSAtRUlOVFI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jIGIvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuYwppbmRleCBhNDBmZGE2Li4wNTUwY2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmMKQEAgLTI4LDExICsyOCwxMCBAQAogI2luY2x1ZGUgImlibWFzbS5oIgogI2luY2x1ZGUgInJlbW90ZS5oIgogCi1zdGF0aWMgaW50IHhtYXggPSAxNjAwOwotc3RhdGljIGludCB5bWF4ID0gMTIwMDsKKyNkZWZpbmUgTU9VU0VfWF9NQVgJMTYwMAorI2RlZmluZSBNT1VTRV9ZX01BWAkxMjAwCiAKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHhsYXRlX2hpZ2hbWExBVEVfU0laRV0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeGxhdGVfaGlnaFtYTEFURV9TSVpFXSA9IHsKIAlbS0VZX1NZTV9FTlRFUiAmIDB4ZmZdID0gS0VZX0VOVEVSLAogCVtLRVlfU1lNX0tQU0xBU0ggJiAweGZmXSA9IEtFWV9LUFNMQVNILAogCVtLRVlfU1lNX0tQU1RBUiAmIDB4ZmZdID0gS0VZX0tQQVNURVJJU0ssCkBAIC04MSw3ICs4MCw4IEBACiAJW0tFWV9TWU1fTlVNX0xPQ0sgJiAweGZmXSA9IEtFWV9OVU1MT0NLLAogCVtLRVlfU1lNX1NDUl9MT0NLICYgMHhmZl0gPSBLRVlfU0NST0xMTE9DSywKIH07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgeGxhdGVbWExBVEVfU0laRV0gPSB7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB4bGF0ZVtYTEFURV9TSVpFXSA9IHsKIAlbTk9fS0VZQ09ERV0gPSBLRVlfUkVTRVJWRUQsCiAJW0tFWV9TWU1fU1BBQ0VdID0gS0VZX1NQQUNFLAogCVtLRVlfU1lNX1RJTERFXSA9IEtFWV9HUkFWRSwgICAgICAgIFtLRVlfU1lNX0JLVElDXSA9IEtFWV9HUkFWRSwKQEAgLTEzMywxOSArMTMzLDE2IEBACiAJW0tFWV9TWU1fWl0gPSBLRVlfWiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fel0gPSBLRVlfWiwKIH07CiAKLXN0YXRpYyBjaGFyIHJlbW90ZV9tb3VzZV9uYW1lW10gPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBtb3VzZSI7Ci1zdGF0aWMgY2hhciByZW1vdGVfa2V5YmRfbmFtZVtdID0gImlibWFzbSBSU0EgSSByZW1vdGUga2V5Ym9hcmQiOwotCiBzdGF0aWMgdm9pZCBwcmludF9pbnB1dChzdHJ1Y3QgcmVtb3RlX2lucHV0ICppbnB1dCkKIHsKIAlpZiAoaW5wdXQtPnR5cGUgPT0gSU5QVVRfVFlQRV9NT1VTRSkgewogCQl1bnNpZ25lZCBjaGFyIGJ1dHRvbnMgPSBpbnB1dC0+bW91c2VfYnV0dG9uczsKIAkJZGJnKCJyZW1vdGUgbW91c2UgbW92ZW1lbnQ6ICh4LHkpPSglZCwlZCklcyVzJXMlc1xuIiwKIAkJCWlucHV0LT5kYXRhLm1vdXNlLngsIGlucHV0LT5kYXRhLm1vdXNlLnksCi0JCQkoYnV0dG9ucyk/IiAtLSBidXR0b25zOiI6IiIsCi0JCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTEVGVCk/ImxlZnQgIjoiIiwKLQkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9NSURETEUpPyJtaWRkbGUgIjoiIiwKLQkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9SSUdIVCk/InJpZ2h0IjoiIgorCQkJKGJ1dHRvbnMpID8gIiAtLSBidXR0b25zOiIgOiAiIiwKKwkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9MRUZUKSA/ICJsZWZ0ICIgOiAiIiwKKwkJCShidXR0b25zICYgUkVNT1RFX0JVVFRPTl9NSURETEUpID8gIm1pZGRsZSAiIDogIiIsCisJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fUklHSFQpID8gInJpZ2h0IiA6ICIiCiAJCSAgICAgICk7CiAJfSBlbHNlIHsKIAkJZGJnKCJyZW1vdGUga2V5cHJlc3MgKGNvZGUsIGZsYWcsIGRvd24pOiIKQEAgLTE4MCw3ICsxNzcsNyBAQAogCQlrZXkgPSB4bGF0ZV9oaWdoW2NvZGUgJiAweGZmXTsKIAllbHNlCiAJCWtleSA9IHhsYXRlW2NvZGVdOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXksIChpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfZG93bikgPyAxIDogMCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleSwgaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2Rvd24pOwogCWlucHV0X3N5bmMoZGV2KTsKIH0KIApAQCAtMjI4LDIwICsyMjUsMjIgQEAKIAltb3VzZV9kZXYtPmlkLnZlbmRvciA9IHBkZXYtPnZlbmRvcjsKIAltb3VzZV9kZXYtPmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7CiAJbW91c2VfZGV2LT5pZC52ZXJzaW9uID0gMTsKKwltb3VzZV9kZXYtPmRldi5wYXJlbnQgPSBzcC0+ZGV2OwogCW1vdXNlX2Rldi0+ZXZiaXRbMF0gID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKIAltb3VzZV9kZXYtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8CiAJCUJJVChCVE5fUklHSFQpIHwgQklUKEJUTl9NSURETEUpOwogCXNldF9iaXQoQlROX1RPVUNILCBtb3VzZV9kZXYtPmtleWJpdCk7Ci0JbW91c2VfZGV2LT5uYW1lID0gcmVtb3RlX21vdXNlX25hbWU7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWCwgMCwgeG1heCwgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMobW91c2VfZGV2LCBBQlNfWSwgMCwgeW1heCwgMCwgMCk7CisJbW91c2VfZGV2LT5uYW1lID0gImlibWFzbSBSU0EgSSByZW1vdGUgbW91c2UiOworCWlucHV0X3NldF9hYnNfcGFyYW1zKG1vdXNlX2RldiwgQUJTX1gsIDAsIE1PVVNFX1hfTUFYLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19ZLCAwLCBNT1VTRV9ZX01BWCwgMCwgMCk7CiAKLQltb3VzZV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWtleWJkX2Rldi0+aWQuYnVzdHlwZSA9IEJVU19QQ0k7CiAJa2V5YmRfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7CiAJa2V5YmRfZGV2LT5pZC5wcm9kdWN0ID0gcGRldi0+ZGV2aWNlOwotCW1vdXNlX2Rldi0+aWQudmVyc2lvbiA9IDI7CisJa2V5YmRfZGV2LT5pZC52ZXJzaW9uID0gMjsKKwlrZXliZF9kZXYtPmRldi5wYXJlbnQgPSBzcC0+ZGV2OwogCWtleWJkX2Rldi0+ZXZiaXRbMF0gID0gQklUKEVWX0tFWSk7Ci0Ja2V5YmRfZGV2LT5uYW1lID0gcmVtb3RlX2tleWJkX25hbWU7CisJa2V5YmRfZGV2LT5uYW1lID0gImlibWFzbSBSU0EgSSByZW1vdGUga2V5Ym9hcmQiOwogCiAJZm9yIChpID0gMDsgaSA8IFhMQVRFX1NJWkU7IGkrKykgewogCQlpZiAoeGxhdGVfaGlnaFtpXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmggYi9kcml2ZXJzL21pc2MvaWJtYXNtL3JlbW90ZS5oCmluZGV4IGI3MDc2YTguLjcyYWNmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vcmVtb3RlLmgKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9yZW1vdGUuaApAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICogT3JpZ25hbGx5IHdyaXR0ZW4gYnkgUGV0ZSBSZXlub2xkcwogICovCkBAIC03Myw3ICs3Myw3IEBACiAKIAogCi1zdHJ1Y3QgcmVtb3RlX2lucHV0IHsgCitzdHJ1Y3QgcmVtb3RlX2lucHV0IHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBtb3VzZV9pbnB1dAltb3VzZTsKIAkJc3RydWN0IGtleWJvYXJkX2lucHV0CWtleWJvYXJkOwpAQCAtODUsNyArODUsNyBAQAogCXVuc2lnbmVkIGNoYXIJcGFkMzsKIH07CiAKLSNkZWZpbmUgbW91c2VfYWRkcihzcCkgCQkoc3AtPmJhc2VfYWRkcmVzcyArIENPTkRPUl9NT1VTRV9EQVRBKQorI2RlZmluZSBtb3VzZV9hZGRyKHNwKQkJKHNwLT5iYXNlX2FkZHJlc3MgKyBDT05ET1JfTU9VU0VfREFUQSkKICNkZWZpbmUgZGlzcGxheV93aWR0aChzcCkJKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX0lOUFVUX0RJU1BMQVlfUkVTWCkKICNkZWZpbmUgZGlzcGxheV9oZWlnaHQoc3ApCShtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9JTlBVVF9ESVNQTEFZX1JFU1kpCiAjZGVmaW5lIGRpc3BsYXlfZGVwdGgoc3ApCShtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9JTlBVVF9ESVNQTEFZX0JJVFMpCkBAIC05Myw3ICs5Myw3IEBACiAjZGVmaW5lIHZuY19zdGF0dXMoc3ApCQkobW91c2VfYWRkcihzcCkgKyBDT05ET1JfT1VUUFVUX1ZOQ19TVEFUVVMpCiAjZGVmaW5lIGlzcl9jb250cm9sKHNwKQkJKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9DT05UUk9MKQogCi0jZGVmaW5lIG1vdXNlX2ludGVycnVwdF9wZW5kaW5nKHNwKSAJcmVhZGwobW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX1NUQVRVUykKKyNkZWZpbmUgbW91c2VfaW50ZXJydXB0X3BlbmRpbmcoc3ApCXJlYWRsKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9TVEFUVVMpCiAjZGVmaW5lIGNsZWFyX21vdXNlX2ludGVycnVwdChzcCkJd3JpdGVsKDAsIG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9TVEFUVVMpCiAjZGVmaW5lIGVuYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKQl3cml0ZWwoMSwgbW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX0NPTlRST0wpCiAjZGVmaW5lIGRpc2FibGVfbW91c2VfaW50ZXJydXB0cyhzcCkJd3JpdGVsKDAsIG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX0lTUl9DT05UUk9MKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS91YXJ0LmMgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYwppbmRleCA5NzgzY2FmLi45M2JhYTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL3VhcnQuYwpAQCAtMTgsNyArMTgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAgKgotICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+IAorICogQXV0aG9yOiBNYXggQXNi9mNrIDxhbWF4QHVzLmlibS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMKaW5kZXggOGVlMDMyMS4uOTYyM2VhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMKKysrIGIvZHJpdmVycy9taXNjL3NvbnktbGFwdG9wLmMKQEAgLTE5MTcsNyArMTkxNyw4IEBACiAgKi8KIHN0YXRpYyBpbnQgc29ueV9waWNfZGlzYWJsZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKLQlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLCAiX0RJUyIsIDAsIE5VTEwpKSkKKwlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KGRldmljZS0+aGFuZGxlLAorCQkJIl9ESVMiLCBOVUxMLCBOVUxMKSkpCiAJCXJldHVybiAtRU5YSU87CiAKIAlkcHJpbnRrKCJEZXZpY2UgZGlzYWJsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCmluZGV4IDRmYjIwODkuLmI1M2RhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYworKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKQEAgLTExLDYgKzExLDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgpAQCAtNDQsMTEgKzQ1LDcgQEAKIAlzdHJ1Y3QgbW1jX3F1ZXVlICptcSA9IGQ7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBtcS0+cXVldWU7CiAKLQkvKgotCSAqIFNldCBpb3RocmVhZCB0byBlbnN1cmUgdGhhdCB3ZSBhcmVuJ3QgcHV0IHRvIHNsZWVwIGJ5Ci0JICogdGhlIHByb2Nlc3MgZnJlZXppbmcuICBXZSBoYW5kbGUgc3VzcGVuc2lvbiBvdXJzZWx2ZXMuCi0JICovCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0N8UEZfTk9GUkVFWkU7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CiAKIAlkb3duKCZtcS0+dGhyZWFkX3NlbSk7CiAJZG8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKaW5kZXggNTFiYzdlMi4uZWY4OTc4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYworKysgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC04MCw3ICs4MSw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnJxID0gdHItPmJsa2NvcmVfcHJpdi0+cnE7CiAKIAkvKiB3ZSBtaWdodCBnZXQgaW52b2x2ZWQgd2hlbiBtZW1vcnkgZ2V0cyBsb3csIHNvIHVzZSBQRl9NRU1BTExPQyAqLwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DIHwgUEZfTk9GUkVFWkU7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CiAKIAlzcGluX2xvY2tfaXJxKHJxLT5xdWV1ZV9sb2NrKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3dsLmMgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwppbmRleCA5ZWNhZjc3Li5hYjIxNzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvd2wuYworKysgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwpAQCAtMTM0Niw2ICsxMzQ2LDcgQEAKIAl1YmlfbXNnKCJiYWNrZ3JvdW5kIHRocmVhZCBcIiVzXCIgc3RhcnRlZCwgUElEICVkIiwKIAkJdWJpLT5iZ3RfbmFtZSwgY3VycmVudC0+cGlkKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzljcC5jIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKaW5kZXggODA3ZTY5OS4uZTk3MGU2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOWNwLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogCVRPRE86CiAJKiBUZXN0IFR4IGNoZWNrc3VtbWluZyB0aG9yb3VnaGx5Ci0JKiBJbXBsZW1lbnQgZGV2LT50eF90aW1lb3V0CiAKIAlMb3cgcHJpb3JpdHkgVE9ETzoKIAkqIENvbXBsZXRlIHJlc2V0IG9uIFBjaUVycgpAQCAtMTIxOCw2ICsxMjE3LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGNwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVvdXQsIHN0YXR1cyAlMnggJTR4ICU0eCAlNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgY3ByOChDbWQpLCBjcHIxNihDcENtZCksCisJICAgICAgIGNwcjE2KEludHJTdGF0dXMpLCBjcHIxNihJbnRyTWFzaykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwljcF9zdG9wX2h3KGNwKTsKKwljcF9jbGVhbl9yaW5ncyhjcCk7CisJcmMgPSBjcF9pbml0X3JpbmdzKGNwKTsKKwljcF9zdGFydF9odyhjcCk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuOworfQorCiAjaWZkZWYgQlJPS0VOCiBzdGF0aWMgaW50IGNwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CkBAIC0xOTIwLDEwICsxOTQzLDggQEAKIAlkZXYtPmNoYW5nZV9tdHUgPSBjcF9jaGFuZ2VfbXR1OwogI2VuZGlmCiAJZGV2LT5ldGh0b29sX29wcyA9ICZjcF9ldGh0b29sX29wczsKLSNpZiAwCiAJZGV2LT50eF90aW1lb3V0ID0gY3BfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKLSNlbmRpZgogCiAjaWYgQ1BfVkxBTl9UQUdfVVNFRAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggZDE3ZDY0ZS4uNDNkMDMxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0yMDUsNyArMjA1LDcgQEAKIGNvbmZpZyBNQUNCCiAJdHJpc3RhdGUgIkF0bWVsIE1BQ0Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFWUjMyIHx8IEFSQ0hfQVQ5MVNBTTkyNjAgfHwgQVJDSF9BVDkxU0FNOTI2MwotCXNlbGVjdCBNSUkKKwlzZWxlY3QgUEhZTElCCiAJaGVscAogCSAgVGhlIEF0bWVsIE1BQ0IgZXRoZXJuZXQgaW50ZXJmYWNlIGlzIGZvdW5kIG9uIG1hbnkgQVQzMiBhbmQgQVQ5MQogCSAgcGFydHMuIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIE1BQ0IgY2hpcC4KQEAgLTQwNSwyMiArNDA1LDYgQEAKIAkgIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldDogUmllYmxDYXJkICh3aXRoIG9yIHdpdGhvdXQgYmF0dGVyeSksIG9yCiAJICBQQU1DYXJkIFZNRSAoYWxzbyB0aGUgdmVyc2lvbiBieSBSaG90cm9uLCB3aXRoIGRpZmZlcmVudCBhZGRyZXNzZXMpLgogCi1jb25maWcgQVRBUklfQklPTkVUCi0JdHJpc3RhdGUgIkJpb05ldC0xMDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIEFUQVJJX0FDU0kgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBCaW9EYXRhJ3MgQmlvTmV0LTEwMCBFdGhlcm5ldCBhZGFwdGVyCi0JICBmb3IgdGhlIEFDU0kgcG9ydC4gVGhlIGRyaXZlciB3b3JrcyAoaGFzIHRvIHdvcmsuLi4pIHdpdGggYSBwb2xsZWQKLQkgIEkvTyBzY2hlbWUsIHNvIGl0J3MgcmF0aGVyIHNsb3cgOi0oCi0KLWNvbmZpZyBBVEFSSV9QQU1TTkVUCi0JdHJpc3RhdGUgIlBBTXNOZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFUQVJJICYmIEFUQVJJX0FDU0kgJiYgQlJPS0VOCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgUEFNc05ldCBFdGhlcm5ldCBhZGFwdGVyIGZvciB0aGUKLQkgIEFDU0kgcG9ydCAoIkFDU0kgbm9kZSIpLiBUaGUgZHJpdmVyIHdvcmtzIChoYXMgdG8gd29yay4uLikgd2l0aCBhCi0JICBwb2xsZWQgSS9PIHNjaGVtZSwgc28gaXQncyByYXRoZXIgc2xvdyA6LSgKLQogY29uZmlnIFNVTjNMQU5DRQogCXRyaXN0YXRlICJTdW4zL1N1bjN4IG9uLWJvYXJkIExBTkNFIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTVU4zIHx8IFNVTjNYCkBAIC02MDQsNiArNTg4LDEyIEBACiAJICBTdXBwb3J0IGZvciB0aGUgU3VuIENhc3NpbmkgY2hpcCwgYWthIFN1biBHaWdhU3dpZnQgRXRoZXJuZXQuIFNlZSBhbHNvCiAJICA8aHR0cDovL3d3dy5zdW4uY29tL3Byb2R1Y3RzLW4tc29sdXRpb25zL2hhcmR3YXJlL2RvY3MvcGRmLzgxNy00MzQxLTEwLnBkZj4KIAorY29uZmlnIFNVTlZORVQKKwl0cmlzdGF0ZSAiU3VuIFZpcnR1YWwgTmV0d29yayBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1VOX0xET01TCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdmlydHVhbCBuZXR3b3JrIGRldmljZXMgdW5kZXIgU3VuIExvZ2ljYWwgRG9tYWlucy4KKwogY29uZmlnIE5FVF9WRU5ET1JfM0NPTQogCWJvb2wgIjNDT00gY2FyZHMiCiAJZGVwZW5kcyBvbiBJU0EgfHwgRUlTQSB8fCBNQ0EgfHwgUENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCmluZGV4IGMyNmI4NjcuLmViNDE2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCkBAIC0zNCw2ICszNCw3IEBACiBvYmotJChDT05GSUdfTVlSSV9TQlVTKSArPSBteXJpX3NidXMubwogb2JqLSQoQ09ORklHX1NVTkdFTSkgKz0gc3VuZ2VtLm8gc3VuZ2VtX3BoeS5vCiBvYmotJChDT05GSUdfQ0FTU0lOSSkgKz0gY2Fzc2luaS5vCitvYmotJChDT05GSUdfU1VOVk5FVCkgKz0gc3Vudm5ldC5vCiAKIG9iai0kKENPTkZJR19NQUNFKSArPSBtYWNlLm8KIG9iai0kKENPTkZJR19CTUFDKSArPSBibWFjLm8KQEAgLTE4MCw4ICsxODEsNiBAQAogb2JqLSQoQ09ORklHX1NHSV9JT0MzX0VUSCkgKz0gaW9jMy1ldGgubwogb2JqLSQoQ09ORklHX0RFQ0xBTkNFKSArPSBkZWNsYW5jZS5vCiBvYmotJChDT05GSUdfQVRBUklMQU5DRSkgKz0gYXRhcmlsYW5jZS5vCi1vYmotJChDT05GSUdfQVRBUklfQklPTkVUKSArPSBhdGFyaV9iaW9uZXQubwotb2JqLSQoQ09ORklHX0FUQVJJX1BBTVNORVQpICs9IGF0YXJpX3BhbXNuZXQubwogb2JqLSQoQ09ORklHX0EyMDY1KSArPSBhMjA2NS5vCiBvYmotJChDT05GSUdfSFlEUkEpICs9IGh5ZHJhLm8KIG9iai0kKENPTkZJR19BUklBRE5FKSArPSBhcmlhZG5lLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L1NwYWNlLmMgYi9kcml2ZXJzL25ldC9TcGFjZS5jCmluZGV4IDFjM2UyOTMuLjNiNzljNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L1NwYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvU3BhY2UuYwpAQCAtNzUsOCArNzUsNiBAQAogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzdW4zbGFuY2VfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzdW4zXzgyNTg2X3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYXBuZV9wcm9iZShpbnQgdW5pdCk7Ci1leHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmJpb25ldF9wcm9iZShpbnQgdW5pdCk7Ci1leHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnBhbXNuZXRfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpjczg5eDBfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpocGxhbmNlX3Byb2JlKGludCB1bml0KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYmFnZXRsYW5jZV9wcm9iZShpbnQgdW5pdCk7CkBAIC0yNjQsMTIgKzI2Miw2IEBACiAjaWZkZWYgQ09ORklHX0FQTkUJCS8qIEExMjAwIFBDTUNJQSBORTIwMDAgKi8KIAl7YXBuZV9wcm9iZSwgMH0sCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQVRBUklfQklPTkVUCS8qIEF0YXJpIEJpb25ldCBFdGhlcm5ldCBib2FyZCAqLwotCXtiaW9uZXRfcHJvYmUsIDB9LAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FUQVJJX1BBTVNORVQJLyogQXRhcmkgUEFNc05ldCBFdGhlcm5ldCBib2FyZCAqLwotCXtwYW1zbmV0X3Byb2JlLCAwfSwKLSNlbmRpZgogI2lmZGVmIENPTkZJR19NVk1FMTQ3X05FVAkvKiBNVk1FMTQ3IGludGVybmFsIEV0aGVybmV0ICovCiAJe212bWUxNDdsYW5jZV9wcm9iZSwgMH0sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKaW5kZXggNWJmMmQzMy4uZjljYzJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKQEAgLTQzLDYgKzQzLDcgQEAKIGNvbmZpZyBFUDkzWFhfRVRICiAJdHJpc3RhdGUgIkVQOTN4eCBFdGhlcm5ldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfRVA5M1hYCisJc2VsZWN0IE1JSQogCWhlbHAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBldGhlcm5ldCBoYXJkd2FyZSBpbmNsdWRlZCBpbiBFUDkzeHggQ1BVcy4KIAkgIFNheSBZIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIEVQOTN4eCBiYXNlZCBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlfYmlvbmV0LmMgYi9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4N2JkMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vKiBiaW9uZXQuYyAgICAgQmlvTmV0LTEwMCBkZXZpY2UgZHJpdmVyIGZvciBsaW51eDY4ay4KLSAqCi0gKiBWZXJzaW9uOglAKCMpYmlvbmV0LmMJMS4wCTAyLzA2Lzk2Ci0gKgotICogQXV0aG9yOglIYXJ0bXV0IExhdWUgPGxhdWVAaWZrLW1wLnVuaS1raWVsLmRlPgotICogYW5kCQlUb3JzdGVuIE5hcmplcyA8bmFyamVzQGlmay1tcC51bmkta2llbC5kZT4KLSAqCi0gKiBMaXR0bGUgYWRhcHRpb25zIGZvciBpbnRlZ3JhdGlvbiBpbnRvIHBsNyBieSBSb21hbiBIb2RlawotICoKLSAqIFNvbWUgY2hhbmdlcyBpbiBiaW9uZXRfcG9sbF9yeCBieSBLYXJsLUhlaW56IExvaG5lcgotICoKLQlXaGF0IGlzIGl0ID8KLQktLS0tLS0tLS0tLS0KLQlUaGlzIGRyaXZlciBjb250cm9scyB0aGUgQklPTkVULTEwMCBMQU4tQWRhcHRlciB3aGljaCBjb25uZWN0cwotCWFuIEFUQVJJIFNUL1RUIHZpYSB0aGUgQUNTSS1wb3J0IHRvIGFuIEV0aGVybmV0LWJhc2VkIG5ldHdvcmsuCi0KLQlUaGlzIHZlcnNpb24gY2FuIGJlIGNvbXBpbGVkIGFzIGEgbG9hZGFibGUgbW9kdWxlIChTZWUgdGhlCi0JY29tcGlsZSBjb21tYW5kIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlKS4KLQlBdCBsb2FkIHRpbWUsIHlvdSBjYW4gb3B0aW9uYWxseSBzZXQgdGhlIGRlYnVnZ2luZyBsZXZlbCBhbmQgdGhlCi0JZmFzdGVzdCByZXNwb25zZSB0aW1lIG9uIHRoZSBjb21tYW5kIGxpbmUgb2YgJ2luc21vZCcuCi0KLQknYmlvbmV0X2RlYnVnJwotCQljb250cm9scyB0aGUgYW1vdW50IG9mIGRpYWdub3N0aWMgbWVzc2FnZXM6Ci0JICAwICA6IG5vIG1lc3NhZ2VzCi0JICA+MCA6IHNlZSBjb2RlIGZvciBtZWFuaW5nIG9mIHByaW50ZWQgbWVzc2FnZXMKLQotCSdiaW9uZXRfbWluX3BvbGxfdGltZScgKGFsd2F5cyA+PTEpCi0JCWdpdmVzIHRoZSB0aW1lIChpbiBqaWZmaWVzKSBiZXR3ZWVuIHBvbGxzLiBMb3cgdmFsdWVzCi0JCWluY3JlYXNlIHRoZSBzeXN0ZW0gbG9hZCAoYmV3YXJlISkKLQotCVdoZW4gbG9hZGVkLCBhIG5ldCBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAnYmlvMCcgYmVjb21lcyBhdmFpbGFibGUsCi0Jd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgdXN1YWwgJ2lmY29uZmlnJyBjb21tYW5kLgotCi0JSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwgbGlrZSBvdGhlcgotCShuZXQpIGRyaXZlcnMuIEZvciB0aGlzIHB1cnBvc2UsIHNvbWUgc291cmNlIGZpbGVzIChlLmcuIGNvbmZpZy1maWxlcwotCW1ha2VmaWxlcywgU3BhY2UuYykgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LiAoWW91IG1heSByZWZlciB0bwotCW90aGVyIGRyaXZlcnMgaG93IHRvIGRvIGl0LikgSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIHdpbGwgYmUgZGV0ZWN0ZWQKLQlhdCBib290IHRpbWUgYW5kIChwcm9iYWJseSkgYXBwZWFyIGFzICdldGgwJy4KLQotCVRoaXMgY29kZSBpcyBiYXNlZCBvbiBzZXZlcmFsIHNvdXJjZXM6Ci0JLSBUaGUgZHJpdmVyIGNvZGUgZm9yIGEgcGFyYWxsZWwgcG9ydCBldGhlcm5ldCBhZGFwdGVyIGJ5Ci0JICBEb25hbGQgQmVja2VyIChzZWUgZmlsZSAnYXRwLmMnIGZyb20gdGhlIFBDIGxpbnV4IGRpc3RyaWJ1dGlvbikKLQktIFRoZSBBQ1NJIGNvZGUgYnkgUm9tYW4gSG9kZWsgZm9yIHRoZSBBVEFSSS1BQ1NJIGhhcmRkaXNrIHN1cHBvcnQKLQkgIGFuZCBETUEgaGFuZGxpbmcuCi0JLSBWZXJ5IGxpbWl0ZWQgaW5mb3JtYXRpb24gYWJvdXQgbW92aW5nIHBhY2tldHMgaW4gYW5kIG91dCBvZiB0aGUKLQkgIEJJT05FVC1hZGFwdGVyIGZyb20gdGhlIFRDUCBwYWNrYWdlIGZvciBUT1MgYnkgQmlvRGF0YSBHbWJILgotCi0JVGhlb3J5IG9mIE9wZXJhdGlvbgotCS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlCZWNhdXNlIHRoZSBBVEFSSSBETUEgcG9ydCBpcyB1c3VhbGx5IHNoYXJlZCBiZXR3ZWVuIHNldmVyYWwKLQlkZXZpY2VzIChlZy4gaGFyZGRpc2ssIGZsb3BweSkgd2UgY2Fubm90IGJsb2NrIHRoZSBBQ1NJIGJ1cwotCXdoaWxlIHdhaXRpbmcgZm9yIGludGVycnVwdHMuIFRoZXJlZm9yZSB3ZSB1c2UgYSBwb2xsaW5nIG1lY2hhbmlzbQotCXRvIGZldGNoIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlci4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2Ugc2VuZAotCXBhY2tldHMgd2l0aG91dCBjaGVja2luZyB0aGF0IHRoZSBwcmV2aW91cyBwYWNrZXQgaGFzIGJlZW4gc2VudCB0bwotCXRoZSBMQU4uIFdlIHJlbHkgb24gdGhlIGhpZ2hlciBsZXZlbHMgb2YgdGhlIG5ldHdvcmtpbmcgY29kZSB0byBkZXRlY3QKLQltaXNzaW5nIHBhY2tldHMgYW5kIHJlc2VuZCB0aGVtLgotCi0JQmVmb3JlIHdlIGFjY2VzcyB0aGUgQVRBUkkgRE1BIGNvbnRyb2xsZXIsIHdlIGNoZWNrIGlmIGFub3RoZXIKLQlwcm9jZXNzIGlzIHVzaW5nIHRoZSBETUEuIElmIG5vdCwgd2UgbG9jayB0aGUgRE1BLCBwZXJmb3JtIG9uZSBvcgotCW1vcmUgcGFja2V0IHRyYW5zZmVycyBhbmQgdW5sb2NrIHRoZSBETUEgYmVmb3JlIHJldHVybmluZy4KLQlXZSBkbyBub3QgdXNlICdzdGRtYV9sb2NrJyB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBpdCBpcyB1bmNsZWFyCi0JaWYgdGhlIG5ldHdvcmtpbmcgY29kZSBjYW4gYmUgc2V0IHRvIHNsZWVwLCB3aGljaCB3aWxsIGhhcHBlbiBpZgotCWFub3RoZXIgKHBvc3NpYmx5IHNsb3cpIGRldmljZSBpcyB1c2luZyB0aGUgRE1BIGNvbnRyb2xsZXIuCi0KLQlUaGUgcG9sbGluZyBpcyBkb25lIHZpYSB0aW1lciBpbnRlcnJ1cHRzIHdoaWNoIHBlcmlvZGljYWxseQotCSdzaW11bGF0ZScgYW4gaW50ZXJydXB0IGZyb20gdGhlIEV0aGVybmV0IGFkYXB0ZXIuIFRoZSB0aW1lIChpbiBqaWZmaWVzKQotCWJldHdlZW4gcG9sbHMgdmFyaWVzIGRlcGVuZGluZyBvbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbmV0IGFjdGl2aXR5LgotCVRoZSBhbGxvd2VkIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSB2YXJpYWJsZSAnYmlvbmV0X21pbl9wb2xsX3RpbWUnCi0JZm9yIHRoZSBsb3dlciAoZmFzdGVzdCkgbGltaXQgYW5kIHRoZSBjb25zdGFudCAnTUFYX1BPTExfVElNRScKLQlmb3IgdGhlIGhpZ2hlciAoc2xvd2VzdCkgbGltaXQuCi0KLQlXaGVuZXZlciBhIHBhY2tldCBhcnJpdmVzLCB3ZSBzd2l0Y2ggdG8gZmFzdGVzdCByZXNwb25zZSBieSBzZXR0aW5nCi0JdGhlIHBvbGxpbmcgdGltZSB0byBpdHMgbG93ZXN0IGxpbWl0LiBJZiB0aGUgZm9sbG93aW5nIHBvbGwgZmFpbHMsCi0JYmVjYXVzZSBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZCwgd2UgaW5jcmVhc2UgdGhlIHRpbWUgZm9yIHRoZSBuZXh0Ci0JcG9sbC4gV2hlbiB0aGUgbmV0IGFjdGl2aXR5IGlzIGxvdywgdGhlIHBvbGxpbmcgdGltZSBlZmZlY3RpdmVseQotCXN0YXlzIGF0IGl0cyBtYXhpbXVtIHZhbHVlLCByZXN1bHRpbmcgaW4gdGhlIGxvd2VzdCBsb2FkIGZvciB0aGUKLQltYWNoaW5lLgotICovCi0KLSNkZWZpbmUgTUFYX1BPTExfVElNRQkxMAotCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gPQotCSJiaW9uZXQuYzp2MS4wIDA2LWZlYi05NiAoYykgSGFydG11dCBMYXVlLlxuIjsKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpX3N0ZG1hLmg+Ci0KLQotLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnCi0gKi8KLSNpZm5kZWYgTkVUX0RFQlVHCi0jZGVmaW5lIE5FVF9ERUJVRyAwCi0jZW5kaWYKLS8qCi0gKiBHbG9iYWwgdmFyaWFibGUgJ2Jpb25ldF9kZWJ1ZycuIENhbiBiZSBzZXQgYXQgbG9hZCB0aW1lIGJ5ICdpbnNtb2QnCi0gKi8KLXVuc2lnbmVkIGludCBiaW9uZXRfZGVidWcgPSBORVRfREVCVUc7Ci1tb2R1bGVfcGFyYW0oYmlvbmV0X2RlYnVnLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhiaW9uZXRfZGVidWcsICJiaW9uZXQgZGVidWcgbGV2ZWwgKDAtMikiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBiaW9uZXRfbWluX3BvbGxfdGltZSA9IDI7Ci0KLQotLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCi0gKi8KLXN0cnVjdCBuZXRfbG9jYWwgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCWxvbmcgb3Blbl90aW1lOwkJCS8qIGZvciBkZWJ1Z2dpbmcgKi8KLQlpbnQgIHBvbGxfdGltZTsJCQkvKiBwb2xsaW5nIHRpbWUgdmFyaWVzIHdpdGggbmV0IGxvYWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmljX3BrdF9zIHsJCS8qIHBhY2tldCBmb3JtYXQgKi8KLQl1bnNpZ25lZCBjaGFyCXN0YXR1czsKLQl1bnNpZ25lZCBjaGFyCWR1bW15OwotCXVuc2lnbmVkIGNoYXIJbF9sbywgbF9oaTsKLQl1bnNpZ25lZCBjaGFyCWJ1ZmZlclszMDAwXTsKLX0gKm5pY19wYWNrZXQ7Ci11bnNpZ25lZCBjaGFyICpwaHlzX25pY19wYWNrZXQ7Ci0KLS8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAqLwotc3RhdGljIGludCBiaW9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYmlvbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYmlvbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgaW50IGJpb25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGJpb25ldF90aWNrKHVuc2lnbmVkIGxvbmcpOwotCi1zdGF0aWMgREVGSU5FX1RJTUVSKGJpb25ldF90aW1lciwgYmlvbmV0X3RpY2ssIDAsIDApOwotCi0jZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjY2VzcyB0aGUgZXRoZXJuZXQgYm9hcmQgY29ubmVjdGVkIHRvIHRoZQotICogQUNTSSBwb3J0IHZpYSB0aGUgc3RfZG1hIGNoaXAuCi0gKi8KLSNkZWZpbmUgTk9ERV9BRFIgMHg2MAotCi0jZGVmaW5lIENfUkVBRCA4Ci0jZGVmaW5lIENfV1JJVEUgMHgwYQotI2RlZmluZSBDX0dFVEVBIDB4MGYKLSNkZWZpbmUgQ19TRVRDUiAweDBlCi0KLXN0YXRpYyBpbnQKLXNlbmRjbWQodW5zaWduZWQgaW50IGEwLCB1bnNpZ25lZCBpbnQgbW9kLCB1bnNpZ25lZCBpbnQgY21kKSB7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKG1vZCB8ICgoYTApID8gMiA6IDApIHwgMHg4OCk7Ci0JZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IGNtZDsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKG1vZCB8IDB4OGEpOwotCi0JaWYoICFhY3NpX3dhaXRfZm9yX0lSUShIWi8yKSApCS8qIHdhaXQgZm9yIGNtZCBhY2sgKi8KLQkJcmV0dXJuIC0xOwkJLyogdGltZW91dCAqLwotCi0JYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0JcmV0dXJuIChjICYgMHhmZik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNldF9zdGF0dXMoaW50IGNyKSB7Ci0Jc2VuZGNtZCgwLDB4MTAwLE5PREVfQURSIHwgQ19TRVRDUik7ICAgIC8qIENNRDogU0VUIENSICovCi0Jc2VuZGNtZCgxLDB4MTAwLGNyKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDgwOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfc3RhdHVzKHVuc2lnbmVkIGNoYXIgKmFkcikgewotCWludCBpLGM7Ci0KLQlESVNBQkxFX0lSUSgpOwotCWMgPSBzZW5kY21kKDAsMHgwMCxOT0RFX0FEUiB8IENfR0VURUEpOyAgLyogQ01EOiBHRVQgRVRIIEFEUiovCi0JaWYoIGMgPCAwICkgZ290byBnc2VuZDsKLQotCS8qIG5vdyByZWFkIHN0YXR1cyBieXRlcyAqLwotCi0JZm9yIChpPTA7IGk8NjsgaSsrKSB7Ci0JCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSAwOwkvKiByZXF1ZXN0IG5leHQgYnl0ZSAqLwotCi0gICAgCQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKEhaLzIpICkgewkvKiB3YWl0IGZvciBjbWQgYWNrICovCi0JCQljID0gLTE7Ci0JCQlnb3RvIGdzZW5kOwkJLyogdGltZW91dCAqLwotCQl9Ci0JCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCQkqYWRyKysgPSAodW5zaWduZWQgY2hhciljOwotCX0KLQljID0gMTsKLWdzZW5kOgotICAJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODA7Ci0JcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotYmlvbmV0X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkgewotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfZnJhbWUodW5zaWduZWQgbG9uZyBwYWRkciwgaW50IG9kZCkgewotCWludCBjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlESVNBQkxFX0lSUSgpOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJCT0gMHg5YTsKLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCQk9IDB4MTlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJCT0gMHg5YTsKLQlkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50CT0gMHgwNDsJCS8qIHNlY3RvciBjb3VudCAod2FzIDUpICovCi0JZG1hX3dkLmRtYV9sbwkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9tZAkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9oaQkJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JYyA9IHNlbmRjbWQoMCwweDAwLE5PREVfQURSIHwgQ19SRUFEKTsJLyogQ01EOiBSRUFEICovCi0JaWYoIGMgPCAxMjggKSBnb3RvIHJlbmQ7Ci0KLQkvKiBub3cgcmVhZCBibG9jayAqLwotCi0JYyA9IHNlbmRjbWQoMSwweDAwLG9kZCk7CS8qIG9kZCBmbGFnIGZvciBhZGRyZXNzIHNoaWZ0ICovCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MGE7Ci0KLQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKDEwMCkgKSB7CS8qIHdhaXQgZm9yIERNQSB0byBjb21wbGV0ZSAqLwotCQljID0gLTE7Ci0JCWdvdG8gcmVuZDsKLQl9Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4OGE7Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MThhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDhhOwotCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4ODg7Ci0JYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7Ci0JYyA9IDE7Ci0KLXJlbmQ6Ci0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4ODA7Ci0JdWRlbGF5KDQwKTsKLQlhY3NpX3dhaXRfZm9yX25vSVJRKDIwKTsKLQlyZXR1cm4gYzsKLX0KLQotCi1zdGF0aWMgaW50Ci1oYXJkd2FyZV9zZW5kX3BhY2tldCh1bnNpZ25lZCBsb25nIHBhZGRyLCBpbnQgY250KSB7Ci0JdW5zaWduZWQgaW50IGM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURJU0FCTEVfSVJRKCk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDlhOwotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE5YTsKLQlkbWFfd2QuZG1hX2xvCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOwotCXBhZGRyID4+PSA4OwotCWRtYV93ZC5kbWFfbWQJCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7Ci0JcGFkZHIgPj49IDg7Ci0JZG1hX3dkLmRtYV9oaQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKLQotCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQJPSAweDQ7CQkvKiBzZWN0b3IgY291bnQgKi8KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQljID0gc2VuZGNtZCgwLDB4MTAwLE5PREVfQURSIHwgQ19XUklURSk7CS8qIENNRDogV1JJVEUgKi8KLQljID0gc2VuZGNtZCgxLDB4MTAwLGNudCYweGZmKTsKLQljID0gc2VuZGNtZCgxLDB4MTAwLGNudD4+OCk7Ci0KLQkvKiBub3cgd3JpdGUgYmxvY2sgKi8KLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDEwYTsJLyogRE1BIGVuYWJsZSAqLwotCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoMTAwKSApCQkvKiB3YWl0IGZvciBETUEgdG8gY29tcGxldGUgKi8KLQkJZ290byBlbmQ7Ci0KLQlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOWE7CS8qIERNQSBkaXNhYmxlICEgKi8KLQljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKLQotZW5kOgotCWMgPSBzZW5kY21kKDEsMHgxMDAsMCk7Ci0JYyA9IHNlbmRjbWQoMSwweDEwMCwwKTsKLQotCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE4MDsKLQl1ZGVsYXkoNDApOwotCWFjc2lfd2FpdF9mb3Jfbm9JUlEoMjApOwotCXJldHVybiggYyAmIDB4MDIpOwotfQotCi0KLS8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCi0gKi8KLXN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGJpb25ldF9wcm9iZShpbnQgdW5pdCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCXVuc2lnbmVkIGNoYXIgc3RhdGlvbl9hZGRyWzZdOwotCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7Ci0Jc3RhdGljIGludCBub19tb3JlX2ZvdW5kOwkvKiBhdm9pZCAiUHJvYmluZyBmb3IuLi4iIHByaW50ZWQgNCB0aW1lcyAqLwotCWludCBpOwotCWludCBlcnI7Ci0KLQlpZiAoIU1BQ0hfSVNfQVRBUkkgfHwgbm9fbW9yZV9mb3VuZCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0KLQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOwotCWlmICghZGV2KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlpZiAodW5pdCA+PSAwKSB7Ci0JCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKLQkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKLQl9Ci0JU0VUX01PRFVMRV9PV05FUihkZXYpOwotCi0JcHJpbnRrKCJQcm9iaW5nIGZvciBCaW9OZXQgMTAwIEFkYXB0ZXIuLi5cbiIpOwotCi0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0JaSA9IGdldF9zdGF0dXMoc3RhdGlvbl9hZGRyKTsJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIFBST00uICAqLwotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQkvKiBDaGVjayB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mIHRoZSBTLkEuIGZvciB0aGUgbWFudWZhY3RvcidzIGNvZGUuCi0JICovCi0KLQlpZiggaSA8IDAKLQl8fCAgc3RhdGlvbl9hZGRyWzBdICE9ICdCJwotCXx8ICBzdGF0aW9uX2FkZHJbMV0gIT0gJ0knCi0JfHwgIHN0YXRpb25fYWRkclsyXSAhPSAnTycgKSB7Ci0JCW5vX21vcmVfZm91bmQgPSAxOwotCQlwcmludGsoICJObyBCaW9OZXQgMTAwIGZvdW5kLlxuIiApOwotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0KLQlpZiAoYmlvbmV0X2RlYnVnID4gMCAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsodmVyc2lvbik7Ci0KLQlwcmludGsoIiVzOiAlcyBmb3VuZCwgZXRoLWFkZHI6ICUwMngtJTAyeC0lMDJ4OiUwMngtJTAyeC0lMDJ4LlxuIiwKLQkJZGV2LT5uYW1lLCAiQmlvTmV0IDEwMCIsCi0JCXN0YXRpb25fYWRkclswXSwgc3RhdGlvbl9hZGRyWzFdLCBzdGF0aW9uX2FkZHJbMl0sCi0JCXN0YXRpb25fYWRkclszXSwgc3RhdGlvbl9hZGRyWzRdLCBzdGF0aW9uX2FkZHJbNV0pOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KLQotCW5pY19wYWNrZXQgPSAoc3RydWN0IG5pY19wa3RfcyAqKWFjc2lfYnVmZmVyOwotCXBoeXNfbmljX3BhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopcGh5c19hY3NpX2J1ZmZlcjsKLQlpZiAoYmlvbmV0X2RlYnVnID4gMCkgewotCQlwcmludGsoIm5pY19wYWNrZXQgYXQgMHglcCwgcGh5cyBhdCAweCVwXG4iLAotCQkJbmljX3BhY2tldCwgcGh5c19uaWNfcGFja2V0ICk7Ci0JfQotCi0JZGV2LT5vcGVuCQk9IGJpb25ldF9vcGVuOwotCWRldi0+c3RvcAkJPSBiaW9uZXRfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBiaW9uZXRfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKLQotCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMKLQkgKiB2YWx1ZXMuIFRoaXMgc2hvdWxkIGJlIGluIGEgY29tbW9uIGZpbGUgaW5zdGVhZCBvZiBwZXItZHJpdmVyLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLSNpZiAwCi0JCWRldi0+YnJvYWRjYXN0W2ldID0gMHhmZjsKLSNlbmRpZgotCQlkZXYtPmRldl9hZGRyW2ldICA9IHN0YXRpb25fYWRkcltpXTsKLQl9Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKCFlcnIpCi0JCXJldHVybiBkZXY7Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKLSAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KLQotICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgotICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKLSAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCi0gKi8KLXN0YXRpYyBpbnQKLWJpb25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoYmlvbmV0X2RlYnVnID4gMCkKLQkJcHJpbnRrKCJiaW9uZXRfb3BlblxuIik7Ci0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0KLQkvKiBSZXNldCB0aGUgaGFyZHdhcmUgaGVyZS4KLQkgKi8KLQlzZXRfc3RhdHVzKDQpOwotCWxwLT5vcGVuX3RpbWUgPSAwOwkvKmppZmZpZXMqLwotCWxwLT5wb2xsX3RpbWUgPSBNQVhfUE9MTF9USU1FOwotCi0JZGV2LT50YnVzeSA9IDA7Ci0JZGV2LT5pbnRlcnJ1cHQgPSAwOwotCWRldi0+c3RhcnQgPSAxOwotCi0Jc3RkbWFfcmVsZWFzZSgpOwotCWJpb25ldF90aW1lci5kYXRhID0gKGxvbmcpZGV2OwotCWJpb25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7Ci0JYWRkX3RpbWVyKCZiaW9uZXRfdGltZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1iaW9uZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAgVGhpcyBjb3VsZCBiZXR0ZXIgYmUKLQkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgZGV2LT50YnVzeSksIGJ1dCBzZXRfYml0KCkgd29ya3MgYXMgd2VsbC4KLQkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQl9Ci0JZWxzZSB7Ci0JCWludCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKLQkJdW5zaWduZWQgbG9uZyBidWYgPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKTsKLQkJaW50IHN0YXQ7Ci0KLQkJc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJaWYoICFTVFJBTV9BRERSKGJ1ZitsZW5ndGgtMSkgKSB7Ci0JCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgbmljX3BhY2tldC0+YnVmZmVyLAotCQkJCQkJICBsZW5ndGgpOwotCQkJYnVmID0gKHVuc2lnbmVkIGxvbmcpJigoc3RydWN0IG5pY19wa3RfcyAqKXBoeXNfbmljX3BhY2tldCktPmJ1ZmZlcjsKLQkJfQotCi0JCWlmIChiaW9uZXRfZGVidWcgPjEpIHsKLQkJCXVfY2hhciAqZGF0YSA9IG5pY19wYWNrZXQtPmJ1ZmZlciwgKnA7Ci0JCQlpbnQgaTsKLQotCQkJcHJpbnRrKCAiJXM6IFRYIHBrdCB0eXBlIDB4JTR4IGZyb20gIiwgZGV2LT5uYW1lLAotCQkJCSAgKCh1X3Nob3J0ICopZGF0YSlbNl0pOwotCi0JCQlmb3IoIHAgPSAmZGF0YVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQotCQkJCXByaW50aygiJTAyeCVzIiwgKnArKyxpICE9IDUgPyAiOiIgOiAiIiApOwotCQkJcHJpbnRrKCIgdG8gIik7Ci0KLQkJCWZvciggcCA9IGRhdGEsIGkgPSAwOyBpIDwgNjsgaSsrICkKLQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgIlxuIiApOwotCi0JCQlwcmludGsoICIlczogIiwgZGV2LT5uYW1lICk7Ci0JCQlwcmludGsoIiBkYXRhICUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMngiCi0JCQkgICAgICAgIiAlMDJ4JTAyeCUwMnglMDJ4IGxlbiAlZFxuIiwKLQkJCQkgIGRhdGFbMTJdLCBkYXRhWzEzXSwgZGF0YVsxNF0sIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLCBkYXRhWzE5XSwKLQkJCQkgIGRhdGFbMjBdLCBkYXRhWzIxXSwgZGF0YVsyMl0sIGRhdGFbMjNdLCBkYXRhWzI0XSwgZGF0YVsyNV0sIGRhdGFbMjZdLCBkYXRhWzI3XSwKLQkJCQkgIGRhdGFbMjhdLCBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCi0JCQkJICBsZW5ndGggKTsKLQkJfQotCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoYnVmLCBsZW5ndGgsIDEpOwotCi0JCXN0YXQgPSBoYXJkd2FyZV9zZW5kX3BhY2tldChidWYsIGxlbmd0aCk7Ci0JCUVOQUJMRV9JUlEoKTsKLQkJc3RkbWFfcmVsZWFzZSgpOwotCi0JCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCQlkZXYtPnRidXN5CSA9IDA7Ci0JCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCWxwLT5zdGF0cy50eF9ieXRlcys9bGVuZ3RoOwotCX0KLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1iaW9uZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBib2d1c2NvdW50ID0gMTA7Ci0JaW50IHBrdF9sZW4sIHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qICsrcm9tYW46IFRha2UgY2FyZSBhdCBsb2NraW5nIHRoZSBTVC1ETUEuLi4gVGhpcyBtdXN0IGJlIGRvbmUgd2l0aCBpbnRzCi0JICogb2ZmLCBzaW5jZSBvdGhlcndpc2UgYW4gaW50IGNvdWxkIHNsaXAgaW4gYmV0d2VlbiB0aGUgcXVlc3Rpb24gYW5kIHRoZQotCSAqIGxvY2tpbmcgaXRzZWxmLCBhbmQgdGhlbiB3ZSdkIGdvIHRvIHNsZWVwLi4uIEFuZCBsb2NraW5nIGl0c2VsZiBpcwotCSAqIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBmbG9wcHlfY2hhbmdlIHRpbWVyIGZyb20gd29ya2luZyB3aXRoIFNULURNQQotCSAqIHJlZ2lzdGVycy4gKi8KLQlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0Jc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlpZiggbHAtPnBvbGxfdGltZSA8IE1BWF9QT0xMX1RJTUUgKSBscC0+cG9sbF90aW1lKys7Ci0KLQl3aGlsZShib2d1c2NvdW50LS0pIHsKLQkJc3RhdHVzID0gZ2V0X2ZyYW1lKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgMCk7Ci0KLQkJaWYoIHN0YXR1cyA9PSAwICkgYnJlYWs7Ci0KLQkJLyogR29vZCBwYWNrZXQuLi4gKi8KLQotCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpcGh5c19uaWNfcGFja2V0LCAxNTIwLCAwKTsKLQotCQlwa3RfbGVuID0gKG5pY19wYWNrZXQtPmxfaGkgPDwgOCkgfCBuaWNfcGFja2V0LT5sX2xvOwotCi0JCWxwLT5wb2xsX3RpbWUgPSBiaW9uZXRfbWluX3BvbGxfdGltZTsgICAgLyogZmFzdCBwb2xsICovCi0JCWlmKCBwa3RfbGVuID49IDYwICYmIHBrdF9sZW4gPD0gMTUyMCApIHsKLQkJCQkJLyoJXl5eXiB3YXIgMTUxNCAgS0hMICovCi0JCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4KLQkJCSAqLwotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoIHBrdF9sZW4gKyAyICk7Ci0JCQlpZiAoc2tiID09IE5VTEwpIHsKLQkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKLQkJCQkJZGV2LT5uYW1lKTsKLQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CQkvKiAxNiBCeXRlIGFsaWduICAqLwotCQkJc2tiX3B1dCggc2tiLCBwa3RfbGVuICk7CS8qIG1ha2Ugcm9vbSAqLwotCi0JCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLgotCQkJICovCi0JCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKLQkJCQkJCXBrdF9sZW4pOwotCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOwotCQkJbmV0aWZfcngoc2tiKTsKLQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCQlscC0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1wa3RfbGVuOwotCi0JLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCi0JICAgaGFzIGRvbmUgYSBtYXJrX2JoKElORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KLQkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4KLQkgKi8KLQotIAkJCWlmIChiaW9uZXRfZGVidWcgPjEpIHsKLSAJCQkJdV9jaGFyICpkYXRhID0gbmljX3BhY2tldC0+YnVmZmVyLCAqcDsKLSAJCQkJaW50IGk7Ci0KLSAJCQkJcHJpbnRrKCAiJXM6IFJYIHBrdCB0eXBlIDB4JTR4IGZyb20gIiwgZGV2LT5uYW1lLAotIAkJCQkJICAoKHVfc2hvcnQgKilkYXRhKVs2XSk7Ci0KLQotIAkJCQlmb3IoIHAgPSAmZGF0YVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQotIAkJCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICk7Ci0gCQkJCXByaW50aygiIHRvICIpOwotIAkJCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCi0gCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgIlxuIiApOwotCi0gCQkJCXByaW50ayggIiVzOiAiLCBkZXYtPm5hbWUgKTsKLSAJCQkJcHJpbnRrKCIgZGF0YSAlMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4IgotIAkJCQkgICAgICAgIiAlMDJ4JTAyeCUwMnglMDJ4IGxlbiAlZFxuIiwKLSAJCQkJCSAgZGF0YVsxMl0sIGRhdGFbMTNdLCBkYXRhWzE0XSwgZGF0YVsxNV0sIGRhdGFbMTZdLCBkYXRhWzE3XSwgZGF0YVsxOF0sIGRhdGFbMTldLAotIAkJCQkJICBkYXRhWzIwXSwgZGF0YVsyMV0sIGRhdGFbMjJdLCBkYXRhWzIzXSwgZGF0YVsyNF0sIGRhdGFbMjVdLCBkYXRhWzI2XSwgZGF0YVsyN10sCi0gCQkJCQkgIGRhdGFbMjhdLCBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCi0gCQkJCQkJICBwa3RfbGVuICk7Ci0gCQkJfQotIAkJfQotIAkJZWxzZSB7Ci0gCQkJcHJpbnRrKCIgUGFja2V0IGhhcyB3cm9uZyBsZW5ndGg6ICUwNGQgYnl0ZXNcbiIsIHBrdF9sZW4pOwotIAkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKLSAJCX0KLSAJfQotCXN0ZG1hX3JlbGVhc2UoKTsKLQlFTkFCTEVfSVJRKCk7Ci0JcmV0dXJuOwotfQotCi0vKiBiaW9uZXRfdGljazogY2FsbGVkIGJ5IGJpb25ldF90aW1lci4gUmVhZHMgcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLAotICogcGFzc2VzIHRoZW0gdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kIHJlc3RhcnRzIHRoZSB0aW1lci4KLSAqLwotc3RhdGljIHZvaWQKLWJpb25ldF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkgewotCXN0cnVjdCBuZXRfZGV2aWNlCSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiggYmlvbmV0X2RlYnVnID4gMCAmJiAobHAtPm9wZW5fdGltZSsrICYgNykgPT0gOCApCi0JCXByaW50aygiYmlvbmV0X3RpY2s6ICVsZFxuIiwgbHAtPm9wZW5fdGltZSk7Ci0KLQlpZiggIXN0ZG1hX2lzbG9ja2VkKCkgKSBiaW9uZXRfcG9sbF9yeChkZXYpOwotCi0JYmlvbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKLQlhZGRfdGltZXIoJmJpb25ldF90aW1lcik7Ci19Ci0KLS8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gYmlvbmV0X29wZW4oKS4KLSAqLwotc3RhdGljIGludAotYmlvbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoYmlvbmV0X2RlYnVnID4gMCkKLQkJcHJpbnRrKCJiaW9uZXRfY2xvc2UsIG9wZW5fdGltZT0lbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCWRlbF90aW1lcigmYmlvbmV0X3RpbWVyKTsKLQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKLQotCXNldF9zdGF0dXMoMCk7Ci0JbHAtPm9wZW5fdGltZSA9IDA7Ci0KLQlkZXYtPnRidXN5ID0gMTsKLQlkZXYtPnN0YXJ0ID0gMDsKLQotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCi0gICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmbHAtPnN0YXRzOwotfQotCi0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpiaW9fZGV2OwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQliaW9fZGV2ID0gYmlvbmV0X3Byb2JlKC0xKTsKLQlpZiAoSVNfRVJSKGJpb19kZXYpKQotCQlyZXR1cm4gUFRSX0VSUihiaW9fZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXVucmVnaXN0ZXJfbmV0ZGV2KGJpb19kZXYpOwotCWZyZWVfbmV0ZGV2KGJpb19kZXYpOwotfQotCi0jZW5kaWYgLyogTU9EVUxFICovCi0KLS8qIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvaW5jbHVkZQotCS1iIG02OGstbGludXhhb3V0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yCi0JLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLURNT0RVTEUgLUkuLi8uLi9uZXQvaW5ldCAtYyBiaW9uZXQuYyIKLSAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKLSAqICBrZXB0LW5ldy12ZXJzaW9uczogNQotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMgYi9kcml2ZXJzL25ldC9hdGFyaV9wYW1zbmV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MzU2MzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCisrKyAvZGV2L251bGwKQEAgLTEsODc4ICswLDAgQEAKLS8qIGF0YXJpX3BhbXNuZXQuYyAgICAgUEFNc05ldCBkZXZpY2UgZHJpdmVyIGZvciBsaW51eDY4ay4KLSAqCi0gKiBWZXJzaW9uOglAKCMpUEFNc05ldC5jCTAuMt8JMDMvMzEvOTYKLSAqCi0gKiBBdXRob3I6ICBUb3JzdGVuIExhbmcgPFRvcnN0ZW4uTGFuZ0BhcC5waHlzaWsudW5pLWdpZXNzZW4uZGU+Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgPFRvcnN0ZW4uTGFuZ0BqdW5nLmRlPgotICoKLSAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIG15IGRyaXZlciBQQU1TRE1BLmMgZm9yIE1pTlQtTmV0IGFuZAotICogb24gdGhlIGRyaXZlciBiaW9uZXQuYyB3cml0dGVuIGJ5Ci0gKiAgICAgICAgICBIYXJ0bXV0IExhdWUgPGxhdWVAaWZrLW1wLnVuaS1raWVsLmRlPgotICogYW5kICAgICAgVG9yc3RlbiBOYXJqZXMgPG5hcmplc0BpZmstbXAudW5pLWtpZWwuZGU+Ci0gKgotICogTGl0dGxlIGFkYXB0aW9ucyBmb3IgaW50ZWdyYXRpb24gaW50byBwbDcgYnkgUm9tYW4gSG9kZWsKLSAqCi0JV2hhdCBpcyBpdCA/Ci0JLS0tLS0tLS0tLS0tCi0JVGhpcyBkcml2ZXIgY29udHJvbHMgdGhlIFBBTXNOZXQgTEFOLUFkYXB0ZXIgd2hpY2ggY29ubmVjdHMKLQlhbiBBVEFSSSBTVC9UVCB2aWEgdGhlIEFDU0ktcG9ydCB0byBhbiBFdGhlcm5ldC1iYXNlZCBuZXR3b3JrLgotCi0JVGhpcyB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSAoU2VlIHRoZQotCWNvbXBpbGUgY29tbWFuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSkuCi0JQXQgbG9hZCB0aW1lLCB5b3UgY2FuIG9wdGlvbmFsbHkgc2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwgYW5kIHRoZQotCWZhc3Rlc3QgcmVzcG9uc2UgdGltZSBvbiB0aGUgY29tbWFuZCBsaW5lIG9mICdpbnNtb2QnLgotCi0JJ3BhbXNuZXRfZGVidWcnCi0JCWNvbnRyb2xzIHRoZSBhbW91bnQgb2YgZGlhZ25vc3RpYyBtZXNzYWdlczoKLQkgIDAgIDogbm8gbWVzc2FnZXMKLQkgID4wIDogc2VlIGNvZGUgZm9yIG1lYW5pbmcgb2YgcHJpbnRlZCBtZXNzYWdlcwotCi0JJ3BhbXNuZXRfbWluX3BvbGxfdGltZScgKGFsd2F5cyA+PTEpCi0JCWdpdmVzIHRoZSB0aW1lIChpbiBqaWZmaWVzKSBiZXR3ZWVuIHBvbGxzLiBMb3cgdmFsdWVzCi0JCWluY3JlYXNlIHRoZSBzeXN0ZW0gbG9hZCAoYmV3YXJlISkKLQotCVdoZW4gbG9hZGVkLCBhIG5ldCBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAnZXRoPycgYmVjb21lcyBhdmFpbGFibGUsCi0Jd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgd2l0aCB0aGUgdXN1YWwgJ2lmY29uZmlnJyBjb21tYW5kLgotCi0JSXQgaXMgcG9zc2libGUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwgbGlrZSBvdGhlcgotCShuZXQpIGRyaXZlcnMuIEZvciB0aGlzIHB1cnBvc2UsIHNvbWUgc291cmNlIGZpbGVzIChlLmcuIGNvbmZpZy1maWxlcwotCW1ha2VmaWxlcywgU3BhY2UuYykgbXVzdCBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LiAoWW91IG1heSByZWZlciB0bwotCW90aGVyIGRyaXZlcnMgaG93IHRvIGRvIGl0LikgSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIHdpbGwgYmUgZGV0ZWN0ZWQKLQlhdCBib290IHRpbWUgYW5kIChwcm9iYWJseSkgYXBwZWFyIGFzICdldGgwJy4KLQotCVRoZW9yeSBvZiBPcGVyYXRpb24KLQktLS0tLS0tLS0tLS0tLS0tLS0tCi0JQmVjYXVzZSB0aGUgQVRBUkkgRE1BIHBvcnQgaXMgdXN1YWxseSBzaGFyZWQgYmV0d2VlbiBzZXZlcmFsCi0JZGV2aWNlcyAoZWcuIGhhcmRkaXNrLCBmbG9wcHkpIHdlIGNhbm5vdCBibG9jayB0aGUgQUNTSSBidXMKLQl3aGlsZSB3YWl0aW5nIGZvciBpbnRlcnJ1cHRzLiBUaGVyZWZvcmUgd2UgdXNlIGEgcG9sbGluZyBtZWNoYW5pc20KLQl0byBmZXRjaCBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHNlbmQKLQlwYWNrZXRzIHdpdGhvdXQgY2hlY2tpbmcgdGhhdCB0aGUgcHJldmlvdXMgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8KLQl0aGUgTEFOLiBXZSByZWx5IG9uIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBuZXR3b3JraW5nIGNvZGUgdG8gZGV0ZWN0Ci0JbWlzc2luZyBwYWNrZXRzIGFuZCByZXNlbmQgdGhlbS4KLQotCUJlZm9yZSB3ZSBhY2Nlc3MgdGhlIEFUQVJJIERNQSBjb250cm9sbGVyLCB3ZSBjaGVjayBpZiBhbm90aGVyCi0JcHJvY2VzcyBpcyB1c2luZyB0aGUgRE1BLiBJZiBub3QsIHdlIGxvY2sgdGhlIERNQSwgcGVyZm9ybSBvbmUgb3IKLQltb3JlIHBhY2tldCB0cmFuc2ZlcnMgYW5kIHVubG9jayB0aGUgRE1BIGJlZm9yZSByZXR1cm5pbmcuCi0JV2UgZG8gbm90IHVzZSAnc3RkbWFfbG9jaycgdW5jb25kaXRpb25hbGx5IGJlY2F1c2UgaXQgaXMgdW5jbGVhcgotCWlmIHRoZSBuZXR3b3JraW5nIGNvZGUgY2FuIGJlIHNldCB0byBzbGVlcCwgd2hpY2ggd2lsbCBoYXBwZW4gaWYKLQlhbm90aGVyIChwb3NzaWJseSBzbG93KSBkZXZpY2UgaXMgdXNpbmcgdGhlIERNQSBjb250cm9sbGVyLgotCi0JVGhlIHBvbGxpbmcgaXMgZG9uZSB2aWEgdGltZXIgaW50ZXJydXB0cyB3aGljaCBwZXJpb2RpY2FsbHkKLQknc2ltdWxhdGUnIGFuIGludGVycnVwdCBmcm9tIHRoZSBFdGhlcm5ldCBhZGFwdGVyLiBUaGUgdGltZSAoaW4gamlmZmllcykKLQliZXR3ZWVuIHBvbGxzIHZhcmllcyBkZXBlbmRpbmcgb24gYW4gZXN0aW1hdGUgb2YgdGhlIG5ldCBhY3Rpdml0eS4KLQlUaGUgYWxsb3dlZCByYW5nZSBpcyBnaXZlbiBieSB0aGUgdmFyaWFibGUgJ2Jpb25ldF9taW5fcG9sbF90aW1lJwotCWZvciB0aGUgbG93ZXIgKGZhc3Rlc3QpIGxpbWl0IGFuZCB0aGUgY29uc3RhbnQgJ01BWF9QT0xMX1RJTUUnCi0JZm9yIHRoZSBoaWdoZXIgKHNsb3dlc3QpIGxpbWl0LgotCi0JV2hlbmV2ZXIgYSBwYWNrZXQgYXJyaXZlcywgd2Ugc3dpdGNoIHRvIGZhc3Rlc3QgcmVzcG9uc2UgYnkgc2V0dGluZwotCXRoZSBwb2xsaW5nIHRpbWUgdG8gaXRzIGxvd2VzdCBsaW1pdC4gSWYgdGhlIGZvbGxvd2luZyBwb2xsIGZhaWxzLAotCWJlY2F1c2Ugbm8gcGFja2V0cyBoYXZlIGFycml2ZWQsIHdlIGluY3JlYXNlIHRoZSB0aW1lIGZvciB0aGUgbmV4dAotCXBvbGwuIFdoZW4gdGhlIG5ldCBhY3Rpdml0eSBpcyBsb3csIHRoZSBwb2xsaW5nIHRpbWUgZWZmZWN0aXZlbHkKLQlzdGF5cyBhdCBpdHMgbWF4aW11bSB2YWx1ZSwgcmVzdWx0aW5nIGluIHRoZSBsb3dlc3QgbG9hZCBmb3IgdGhlCi0JbWFjaGluZS4KLSAqLwotCi0jZGVmaW5lIE1BWF9QT0xMX1RJTUUJMTAKLQotc3RhdGljIGNoYXIgKnZlcnNpb24gPQotCSJwYW1zbmV0LmM6djAuMmJldGEgMzAtbWFyLTk2IChjKSBUb3JzdGVuIExhbmcuXG4iOwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaWh3Lmg+Ci0jaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9zdGRtYS5oPgotI2luY2x1ZGUgPGFzbS9hdGFyaV9hY3NpLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI3VuZGVmIFJFQUQKLSN1bmRlZiBXUklURQotCi0vKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcKLSAqLwotI2lmbmRlZiBORVRfREVCVUcKLSNkZWZpbmUgTkVUX0RFQlVHIDAKLSNlbmRpZgotLyoKLSAqIEdsb2JhbCB2YXJpYWJsZSAncGFtc25ldF9kZWJ1ZycuIENhbiBiZSBzZXQgYXQgbG9hZCB0aW1lIGJ5ICdpbnNtb2QnCi0gKi8KLXVuc2lnbmVkIGludCBwYW1zbmV0X2RlYnVnID0gTkVUX0RFQlVHOwotbW9kdWxlX3BhcmFtKHBhbXNuZXRfZGVidWcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBhbXNuZXRfZGVidWcsICJwYW1zbmV0IGRlYnVnIGVuYWJsZSAoMC0xKSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHBhbXNuZXRfbWluX3BvbGxfdGltZSA9IDI7Ci0KLQotLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCi0gKi8KLXN0cnVjdCBuZXRfbG9jYWwgewotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCWxvbmcgb3Blbl90aW1lOwkJCS8qIGZvciBkZWJ1Z2dpbmcgKi8KLQlpbnQgIHBvbGxfdGltZTsJCQkvKiBwb2xsaW5nIHRpbWUgdmFyaWVzIHdpdGggbmV0IGxvYWQgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmljX3BrdF9zIHsJCS8qIHBhY2tldCBmb3JtYXQgKi8KLQl1bnNpZ25lZCBjaGFyCWJ1ZmZlclsyMDQ4XTsKLX0gKm5pY19wYWNrZXQgPSAwOwotdW5zaWduZWQgY2hhciAqcGh5c19uaWNfcGFja2V0OwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSEFERFJbNl07IC8qIDYtYnl0ZSBoYXJkd2FyZSBhZGRyZXNzIG9mIGxhbmNlICovCi0KLS8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAqLwotc3RhdGljIHZvaWQJc3RhcnQgKGludCB0YXJnZXQpOwotc3RhdGljIGludAlzdG9wIChpbnQgdGFyZ2V0KTsKLXN0YXRpYyBpbnQJdGVzdHBrdCAoaW50IHRhcmdldCk7Ci1zdGF0aWMgaW50CXNlbmRwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50CXJlY2VpdmVwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1zdGF0aWMgaW50CWlucXVpcnkgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7Ci1zdGF0aWMgSEFERFIJKnJlYWRfaHdfYWRkcihpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOwotc3RhdGljIHZvaWQJc2V0dXBfZG1hICh2b2lkICphZGRyZXNzLCB1bnNpZ25lZCByd19mbGFnLCBpbnQgbnVtX2Jsb2Nrcyk7Ci1zdGF0aWMgaW50CXNlbmRfZmlyc3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgYnl0ZSk7Ci1zdGF0aWMgaW50CXNlbmRfMV81IChpbnQgbHVuLCB1bnNpZ25lZCBjaGFyICpjb21tYW5kLCBpbnQgZG1hKTsKLXN0YXRpYyBpbnQJZ2V0X3N0YXR1cyAodm9pZCk7Ci1zdGF0aWMgaW50CWNhbGNfcmVjZWl2ZWQgKHZvaWQgKnN0YXJ0X2FkZHJlc3MpOwotCi1zdGF0aWMgaW50IHBhbXNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgcGFtc25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHBhbXNuZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyBpbnQgcGFtc25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHBhbXNuZXRfdGljayh1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIGlycXJldHVybl90IHBhbXNuZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKTsKLQotc3RhdGljIERFRklORV9USU1FUihwYW1zbmV0X3RpbWVyLCBwYW1zbmV0X3RpY2ssIDAsIDApOwotCi0jZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQotCi10eXBlZGVmIHN0cnVjdAotewotCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQxWzB4MzhdOwotCUhBRERSICBod2FkZHI7Ci0JdW5zaWduZWQgY2hhciByZXNlcnZlZDJbMHgxYzJdOwotfSBETUFIV0FERFI7Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBvZiBjb21tYW5kcyB1bmRlcnN0b29kIGJ5IHRoZSBQQU1zIERNQSBhZGFwdG9yLgotICoKLSAqIEluIGdlbmVyYWwgdGhlIERNQSBhZGFwdG9yIHVzZXMgTFVOIDAsIDUsIDYgYW5kIDcgb24gb25lIElEIGNoYW5nZWFibGUKLSAqIGJ5IHRoZSBQQU0ncyBOZXQgc29mdHdhcmUuCi0gKgotICogTFVOIDAgd29ya3MgYXMgYSBoYXJkZGlzay4gWW91IGNhbiBib290IHRoZSBQQU0ncyBOZXQgZHJpdmVyIHRoZXJlLgotICogTFVOIDUgd29ya3MgYXMgYSBoYXJkZGlzayBhbmQgbGV0cyB5b3UgYWNjZXNzIHRoZSBSQU0gYW5kIHNvbWUgSS9PIEhXCi0gKiAgICAgICBhcmVhLiBJbiBzZWN0b3IgMCwgYnl0ZXMgMHgzOC0weDNkIHlvdSBmaW5kIHRoZSBldGhlcm5ldCBIVyBhZGRyZXNzCi0gKiAgICAgICBvZiB0aGUgYWRhcHRvci4KLSAqIExVTiA2IHdvcmtzIGFzIGEgaGFyZGRpc2sgYW5kIGxldHMgeW91IGFjY2VzcyB0aGUgZmlybXdhcmUgUk9NLgotICogTFVOIDcgbGV0cyB5b3Ugc2VuZCBhbmQgcmVjZWl2ZSBwYWNrZXRzLgotICoKLSAqIFNvbWUgY29tbWFuZHMgbGlrZSB0aGUgSU5RVUlSWSBjb21tYW5kIHdvcmsgaWRlbnRpY2FsIG9uIGFsbCB1c2VkIExVTnMuCi0gKgotICogVU5LTk9XTjEgc2VlbXMgdG8gcmVhZCBzb21lIGRhdGEuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogVU5LTk9XTjIgc2VlbXMgdG8gcmVhZCBzb21lIGRhdGEgKGNvbW1hbmQgYnl0ZSAxIG11c3QgYmUgIT0wKS4gVGhlCi0gKiAgICAgICAgICBmb2xsb3dpbmcgYnl0ZXMgc2VlbSB0byBiZSBzb21ldGhpbmcgbGlrZSBhbiBhbGxvY2F0aW9uIGxlbmd0aC4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBSRUFEUEtUICByZWFkcyBhIHBhY2tldCByZWNlaXZlZCBieSB0aGUgRE1BIGFkYXB0b3IuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogV1JJVEVQS1Qgc2VuZHMgYSBwYWNrZXQgdHJhbnNmZXJyZWQgYnkgdGhlIGZvbGxvd2luZyBETUEgcGhhc2UuIFRoZSBsZW5ndGgKLSAqICAgICAgICAgIG9mIHRoZSBwYWNrZXQgaXMgdHJhbnNmZXJyZWQgaW4gY29tbWFuZCBieXRlcyAzIGFuZCA0LgotICogICAgICAgICAgVGhlIGFkYXB0b3IgYXV0b21hdGljYWxseSByZXBsYWNlcyB0aGUgc3JjIGh3IGFkZHJlc3MgaW4gYW4gZXRoZXJuZXQKLSAqICAgICAgICAgIHBhY2tldCBieSBpdHMgb3duIGh3IGFkZHJlc3MuCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyA2IGJ5dGVzLgotICogSU5RVUlSWSAgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIHRoZSBJTlFVSVJZIGNvbW1hbmQgc3VwcG9ydGVkIGJ5IGhhcmRkaXNrcwotICogICAgICAgICAgYW5kIG90aGVyIFNDU0kgZGV2aWNlcy4gSXQgbGV0cyB5b3UgZGV0ZWN0IHdoaWNoIGRldmljZSB5b3UgZm91bmQKLSAqICAgICAgICAgIGF0IGEgZ2l2ZW4gYWRkcmVzcy4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCi0gKiBTVEFSVCAgICBpbml0aWFsaXplcyB0aGUgRE1BIGFkYXB0b3IuIEFmdGVyIHRoaXMgY29tbWFuZCBpdCBpcyBhYmxlIHRvIHNlbmQKLSAqICAgICAgICAgIGFuZCByZWNlaXZlIHBhY2tldHMuIFRoZXJlIGlzIG5vIHN0YXR1cyBieXRlIHJldHVybmVkIQotICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgMSBieXRlLgotICogTlVNUEtUUyAgZ2l2ZXMgYmFjayB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgd2FpdGluZyBpbiB0aGUgcXVldWUgaW4KLSAqICAgICAgICAgIHRoZSBzdGF0dXMgYnl0ZS4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDEgYnl0ZS4KLSAqIFVOS05PV04zCi0gKiBVTktOT1dONCBGdW5jdGlvbiBvZiB0aGVzZSB0aHJlZSBjb21tYW5kcyBpcyB1bmtub3duLgotICogVU5LTk9XTjUgVGhlIGNvbW1hbmQgbGVuZ3RoIG9mIHRoZXNlIHRocmVlIGNvbW1hbmRzIGlzIDEgYnl0ZS4KLSAqIERFU0VMRUNUIGltbWVkaWF0ZWx5IGRlc2VsZWN0cyB0aGUgRE1BIGFkYXB0b3IuIE1heSBpbXBvcnRhbnQgd2l0aCBpbnRlcnJ1cHQKLSAqICAgICAgICAgIGRyaXZlbiBvcGVyYXRpb24uCi0gKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyAxIGJ5dGUuCi0gKiBTVE9QICAgICByZXNldHMgdGhlIERNQSBhZGFwdG9yLiBBZnRlciB0aGlzIGNvbW1hbmQgcGFja2V0cyBjYW4gbm8gbG9uZ2VyCi0gKiAgICAgICAgICBiZSByZWNlaXZlZCBvciB0cmFuc2ZlcnJlZC4KLSAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZS4KLSAqLwotCi1lbnVtIHtVTktOT1dOMT0zLCBSRUFEUEtUPTgsIFVOS05PV04yLCBXUklURVBLVD0xMCwgSU5RVUlSWT0xOCwgU1RBUlQsCi0gICAgICBOVU1QS1RTPTIyLCBVTktOT1dOMywgVU5LTk9XTjQsIFVOS05PV041LCBERVNFTEVDVCwgU1RPUH07Ci0KLSNkZWZpbmUgUkVBRFNFQ1RPUiAgUkVBRFBLVAotI2RlZmluZSBXUklURVNFQ1RPUiBXUklURVBLVAotCi11X2NoYXIgKmlucXVpcmU4PSJNViAgICAgIFBBTSdzIE5FVC9HSyI7Ci0KLSNkZWZpbmUgRE1BTE9XICAgZG1hX3dkLmRtYV9sbwotI2RlZmluZSBETUFNSUQgICBkbWFfd2QuZG1hX21kCi0jZGVmaW5lIERNQUhJR0ggIGRtYV93ZC5kbWFfaGkKLSNkZWZpbmUgREFDQ0VTUyAgZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudAotCi0jZGVmaW5lIE1GUF9HUElQIG1mcC5wYXJfZHRfcmVnCi0KLS8qIFNvbWUgdXNlZnVsIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIElOVCAgICAgICghKE1GUF9HUElQICYgMHgyMCkpCi0jZGVmaW5lIERFTEFZICh7TUZQX0dQSVA7IE1GUF9HUElQOyBNRlBfR1BJUDt9KQotI2RlZmluZSBXUklURU1PREUodmFsdWUpCQkJCQlcCi0JKHsJdV9zaG9ydCBkdW1teSA9IHZhbHVlOwkJCQlcCi0JCV9fYXNtX18gdm9sYXRpbGUoIm1vdmV3ICUwLCAweEZGRkY4NjA2IiA6IDogImQiKGR1bW15KSk7CVwKLQkJREVMQVk7CQkJCQkJXAotCX0pCi0jZGVmaW5lIFdSSVRFQk9USCh2YWx1ZTEsIHZhbHVlMikJCQkJXAotCSh7CXVfbG9uZyBkdW1teSA9ICh1X2xvbmcpKHZhbHVlMSk8PDE2IHwgKHVfc2hvcnQpKHZhbHVlMik7CVwKLQkJX19hc21fXyB2b2xhdGlsZSgibW92ZWwgJTAsIDB4RkZGRjg2MDQiIDogOiAiZCIoZHVtbXkpKTsJXAotCQlERUxBWTsJCQkJCQlcCi0JfSkKLQotLyogRGVmaW5pdGlvbnMgZm9yIERNT0RFICovCi0KLSNkZWZpbmUgUkVBRCAgICAgICAgMHgwMDAKLSNkZWZpbmUgV1JJVEUgICAgICAgMHgxMDAKLQotI2RlZmluZSBETUFfRkRDICAgICAweDA4MAotI2RlZmluZSBETUFfQUNTSSAgICAweDAwMAotCi0jZGVmaW5lIERNQV9ESVNBQkxFIDB4MDQwCi0KLSNkZWZpbmUgU0VDX0NPVU5UICAgMHgwMTAKLSNkZWZpbmUgRE1BX1dJTkRPVyAgMHgwMDAKLQotI2RlZmluZSBSRUdfQUNTSSAgICAweDAwOAotI2RlZmluZSBSRUdfRkRDICAgICAweDAwMAotCi0jZGVmaW5lIEExICAgICAgICAgIDB4MDAyCi0KLS8qIFRpbWVvdXQgY29uc3RhbnRzICovCi0KLSNkZWZpbmUgVElNRU9VVENNRCBIWi8yICAgLyogY2EuIDUwMG1zICovCi0jZGVmaW5lIFRJTUVPVVRETUEgSFogICAgIC8qIGNhLiAxcyAqLwotI2RlZmluZSBDT01NQU5EX0RFTEFZIDUwMCAvKiBjYS4gMC41bXMgKi8KLQotdW5zaWduZWQgcnc7Ci1pbnQgbGFuY2VfdGFyZ2V0ID0gLTE7Ci1pbnQgaWZfdXAgPSAwOwotCi0vKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjY2VzcyB0aGUgZXRoZXJuZXQgYm9hcmQgY29ubmVjdGVkIHRvIHRoZQotICogQUNTSSBwb3J0IHZpYSB0aGUgc3RfZG1hIGNoaXAuCi0gKi8KLQotLyogVGhlIGZvbGxvd2luZyBsb3dsZXZlbCByb3V0aW5lcyB3b3JrIG9uIHBoeXNpY2FsIGFkZHJlc3NlcyBvbmx5IGFuZCBhc3N1bWUKLSAqIHRoYXQgZXZlbnR1YWxseSBuZWVkZWQgYnVmZmVycyBhcmUKLSAqIC0gY29tcGxldGVseSBsb2NhdGVkIGluIFNUIFJBTQotICogLSBhcmUgY29udGlnb3VzIGluIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlCi0gKi8KLQotLyogU2V0dXAgdGhlIERNQSBjb3VudGVyICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9kbWEgKHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIHJ3X2ZsYWcsIGludCBudW1fYmxvY2tzKQotewotCVdSSVRFTU9ERSgodW5zaWduZWQpIHJ3X2ZsYWcgICAgICAgICAgfCBETUFfRkRDIHwgU0VDX0NPVU5UIHwgUkVHX0FDU0kgfAotCQkgIEExKTsKLQlXUklURU1PREUoKHVuc2lnbmVkKShyd19mbGFnIF4gV1JJVEUpIHwgRE1BX0ZEQyB8IFNFQ19DT1VOVCB8IFJFR19BQ1NJIHwKLQkJICBBMSk7Ci0JV1JJVEVNT0RFKCh1bnNpZ25lZCkgcndfZmxhZyAgICAgICAgICB8IERNQV9GREMgfCBTRUNfQ09VTlQgfCBSRUdfQUNTSSB8Ci0JCSAgQTEpOwotCURNQUxPVyAgPSAodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyAmIDB4RkYpOwotCURNQU1JRCAgPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MgPj4gIDgpICYgMHhGRik7Ci0JRE1BSElHSCA9ICh1bnNpZ25lZCBjaGFyKSgoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyA+PiAxNikgJiAweEZGKTsKLQlXUklURUJPVEgoKHVuc2lnbmVkKW51bV9ibG9ja3MgJiAweEZGLAotCQkgIHJ3X2ZsYWcgfCBETUFfRkRDIHwgRE1BX1dJTkRPVyB8IFJFR19BQ1NJIHwgQTEpOwotCXJ3ID0gcndfZmxhZzsKLX0KLQotLyogU2VuZCB0aGUgZmlyc3QgYnl0ZSBvZiBhbiBjb21tYW5kIGJsb2NrICovCi0KLXN0YXRpYyBpbnQKLXNlbmRfZmlyc3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKLXsKLQlydyA9IFJFQUQ7Ci0JYWNzaV9kZWxheV9lbmQoQ09NTUFORF9ERUxBWSk7Ci0JLyoKLQkgKiB3YWtlIHVwIEFDU0kKLQkgKi8KLQlXUklURU1PREUoRE1BX0ZEQyB8IERNQV9XSU5ET1cgfCBSRUdfQUNTSSk7Ci0JLyoKLQkgKiB3cml0ZSBjb21tYW5kIGJ5dGUKLQkgKi8KLQlXUklURUJPVEgoKHRhcmdldCA8PCA1KSB8IChieXRlICYgMHgxRiksIERNQV9GREMgfAotCSAgICAgICAgICBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7Ci0JcmV0dXJuICghYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVENNRCkpOwotfQotCi0vKiBTZW5kIHRoZSByZXN0IG9mIGFuIGNvbW1hbmQgYmxvY2sgKi8KLQotc3RhdGljIGludAotc2VuZF8xXzUgKGludCBsdW4sIHVuc2lnbmVkIGNoYXIgKmNvbW1hbmQsIGludCBkbWEpCi17Ci0JaW50IGksIGo7Ci0KLQlmb3IgKGk9MDsgaTw1OyBpKyspIHsKLQkJV1JJVEVCT1RIKCghaSA/ICgoKGx1biAmIDB4NykgPDwgNSkgfCAoY29tbWFuZFtpXSAmIDB4MUYpKQotCQkJICAgICAgOiBjb21tYW5kW2ldKSwKLQkJCSAgcncgfCBSRUdfQUNTSSB8IERNQV9XSU5ET1cgfAotCQkJICAgKChpIDwgNCkgPyBETUFfRkRDCi0JCQkJICAgIDogKGRtYSA/IERNQV9BQ1NJCi0JCQkJCSAgIDogRE1BX0ZEQykpIHwgQTEpOwotCQlpZiAoaSA8IDQgJiYgKGogPSAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVENNRCkpKQotCQkJcmV0dXJuIChqKTsKLQl9Ci0JcmV0dXJuICgwKTsKLX0KLQotLyogUmVhZCBhIHN0YXR1cyBieXRlICovCi0KLXN0YXRpYyBpbnQKLWdldF9zdGF0dXMgKHZvaWQpCi17Ci0JV1JJVEVNT0RFKERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7Ci0JYWNzaV9kZWxheV9zdGFydCgpOwotCXJldHVybiAoKGludCkoREFDQ0VTUyAmIDB4RkYpKTsKLX0KLQotLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgKi8KLQotc3RhdGljIGludAotY2FsY19yZWNlaXZlZCAodm9pZCAqc3RhcnRfYWRkcmVzcykKLXsKLQlyZXR1cm4gKGludCkoCi0JCSgoKHVuc2lnbmVkIGxvbmcpRE1BSElHSCA8PCAxNikgfCAoKHVuc2lnbmVkKURNQU1JRCA8PCA4KSB8IERNQUxPVykKLQkgICAgICAtICh1bnNpZ25lZCBsb25nKXN0YXJ0X2FkZHJlc3MpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIG1pZGxldmVsIHJvdXRpbmVzIHN0aWxsIHdvcmsgb24gcGh5c2ljYWwgYWRkcmVzc2VzIC4uLiAqLwotCi0vKiBzdGFydCgpIHN0YXJ0cyB0aGUgUEFNJ3MgRE1BIGFkYXB0b3IgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0IChpbnQgdGFyZ2V0KQotewotCXNlbmRfZmlyc3QodGFyZ2V0LCBTVEFSVCk7Ci19Ci0KLS8qIHN0b3AoKSBzdG9wcyB0aGUgUEFNJ3MgRE1BIGFkYXB0b3IgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyAqLwotCi1zdGF0aWMgaW50Ci1zdG9wIChpbnQgdGFyZ2V0KQotewotCWludCByZXQgPSAtMTsKLQl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07Ci0KLQlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFNUT1ApKQotCQlnb3RvIGJhZDsKLQljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPQotCWNtZF9idWZmZXJbM10gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQlpZiAoc2VuZF8xXzUoNywgY21kX2J1ZmZlciwgMCkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gMDsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLS8qIHRlc3Rwa3QoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB3YWl0aW5nIGluIHRoZSBxdWV1ZSAqLwotCi1zdGF0aWMgaW50Ci10ZXN0cGt0KGludCB0YXJnZXQpCi17Ci0JaW50IHJldCA9IC0xOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBOVU1QS1RTKSkKLQkJZ290byBiYWQ7Ci0JcmV0ID0gZ2V0X3N0YXR1cygpOwotYmFkOgotCXJldHVybiAocmV0KTsKLX0KLQotLyogaW5xdWlyeSgpIHJldHVybnMgMCB3aGVuIFBBTSdzIERNQSBmb3VuZCwgLTEgd2hlbiB0aW1lb3V0LCAtMiBvdGhlcndpc2UgKi8KLS8qIFBsZWFzZSBub3RlOiBUaGUgYnVmZmVyIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seSBidXQgbXVzdCBiZSBkZWZpbmVkISAgICovCi0KLXN0YXRpYyBpbnQKLWlucXVpcnkgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgY2hhciAqdmJ1ZmZlciA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylidWZmZXIpOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgSU5RVUlSWSkpCi0JCWdvdG8gYmFkOwotCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDEpOwotCXZidWZmZXJbOF0gPSB2YnVmZmVyWzI3XSA9IDA7IC8qIEF2b2lkIGNvbmZ1c2lvbiB3aXRoIHByZXZpb3VzIHJlYWQgZGF0YSAqLwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWNtZF9idWZmZXJbM10gPSA0ODsKLQlpZiAoc2VuZF8xXzUoNSwgY21kX2J1ZmZlciwgMSkgfHwKLQkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8Ci0JICAgIGdldF9zdGF0dXMoKSB8fAotCSAgICAoY2FsY19yZWNlaXZlZChidWZmZXIpIDwgMzIpKQotCQlnb3RvIGJhZDsKLQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoKHVuc2lnbmVkIGxvbmcpKGJ1ZmZlcis4KSwgMjAsIDApOwotCWlmIChtZW1jbXAoaW5xdWlyZTgsIHZidWZmZXIrOCwgMjApKQotCQlnb3RvIGJhZDsKLQlyZXQgPSAwOwotYmFkOgotCWlmICghIU5FVF9ERUJVRykgewotCQl2YnVmZmVyWzgrMjBdPTA7Ci0JCXByaW50aygiaW5xdWlyeSBvZiB0YXJnZXQgJWQ6ICVzXG4iLCB0YXJnZXQsIHZidWZmZXIrOCk7Ci0JfQotCXJldHVybiAocmV0KTsKLX0KLQotLyoKLSAqIHJlYWRfaHdfYWRkcigpIHJlYWRzIHRoZSBzZWN0b3IgY29udGFpbmluZyB0aGUgaHdhZGRyIGFuZCByZXR1cm5zCi0gKiBhIHBvaW50ZXIgdG8gaXQgKHZpcnR1YWwgYWRkcmVzcyEpIG9yIDAgaW4gY2FzZSBvZiBhbiBlcnJvcgotICovCi0KLXN0YXRpYyBIQUREUgotKnJlYWRfaHdfYWRkcihpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0JSEFERFIgKnJldCA9IDA7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOwotCi0JaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBSRUFEU0VDVE9SKSkKLQkJZ290byBiYWQ7Ci0Jc2V0dXBfZG1hKGJ1ZmZlciwgUkVBRCwgMSk7Ci0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0gY21kX2J1ZmZlcls0XSA9IDA7Ci0JY21kX2J1ZmZlclszXSA9IDE7Ci0JaWYgKHNlbmRfMV81KDUsIGNtZF9idWZmZXIsIDEpIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykmKCgoRE1BSFdBRERSICopYnVmZmVyKS0+aHdhZGRyKSk7Ci0JZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgNTEyLCAwKTsKLWJhZDoKLQlyZXR1cm4gKHJldCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotcGFtc25ldF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiByZWNlaXZlcGt0KCkgbG9hZHMgYSBwYWNrZXQgdG8gYSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXRzIGxlbmd0aCAqLwotCi1zdGF0aWMgaW50Ci1yZWNlaXZlcGt0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpCi17Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgUkVBRFBLVCkpCi0JCWdvdG8gYmFkOwotCXNldHVwX2RtYShidWZmZXIsIFJFQUQsIDMpOwotCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlclsyXSA9IGNtZF9idWZmZXJbNF0gPSAwOwotCWNtZF9idWZmZXJbM10gPSAzOwotCWlmIChzZW5kXzFfNSg3LCBjbWRfYnVmZmVyLCAxKSB8fAotCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKLQkgICAgZ2V0X3N0YXR1cygpKQotCQlnb3RvIGJhZDsKLQlyZXQgPSBjYWxjX3JlY2VpdmVkKGJ1ZmZlcik7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBzZW5kcGt0KCkgc2VuZHMgYSBwYWNrZXQgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIHdoZW4gdGhlIHBhY2tldCB3YXMgc2VudAotICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSAqLwotCi1zdGF0aWMgaW50Ci1zZW5kcGt0IChpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCi17Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlcls1XTsKLQotCWlmIChzZW5kX2ZpcnN0KHRhcmdldCwgV1JJVEVQS1QpKQotCQlnb3RvIGJhZDsKLQlzZXR1cF9kbWEoYnVmZmVyLCBXUklURSwgMyk7Ci0JY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzRdID0gMDsKLQljbWRfYnVmZmVyWzJdID0gbGVuZ3RoID4+IDg7Ci0JY21kX2J1ZmZlclszXSA9IGxlbmd0aCAmIDB4RkY7Ci0JaWYgKHNlbmRfMV81KDcsIGNtZF9idWZmZXIsIDEpIHx8Ci0JICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAotCSAgICBnZXRfc3RhdHVzKCkpCi0JCWdvdG8gYmFkOwotCXJldCA9IDA7Ci1iYWQ6Ci0JcmV0dXJuIChyZXQpOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIGhpZ2hlciBsZXZlbCByb3V0aW5lcyB3b3JrIG9uIHZpcnR1YWwgYWRkcmVzc2VzIGFuZCBjb252ZXJ0IHRoZW0gdG8KLSAqIHBoeXNpY2FsIGFkZHJlc3NlcyB3aGVuIHBhc3NlZCB0byB0aGUgbG93bGV2ZWwgcm91dGluZXMuIEl0J3MgdXAgdG8gdGhlIGhpZ2hlciBsZXZlbAotICogcm91dGluZXMgdG8gY29weSBkYXRhIGZyb20gQWx0ZXJuYXRlIFJBTSB0byBTVCBSQU0gaWYgbmVjY2VzYXJ5IQotICovCi0KLS8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmIG9uZSBleGlzdHMuCi0gKi8KLQotc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgcGFtc25ldF9wcm9iZSAoaW50IHVuaXQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgaTsKLQlIQUREUiAqaHdhZGRyOwotCWludCBlcnI7Ci0KLQl1bnNpZ25lZCBjaGFyIHN0YXRpb25fYWRkcls2XTsKLQlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwotCS8qIGF2b2lkICJQcm9iaW5nIGZvci4uLiIgcHJpbnRlZCA0IHRpbWVzIC0gdGhlIGRyaXZlciBpcyBzdXBwb3J0aW5nIG9ubHkgb25lIGFkYXB0ZXIgbm93ISAqLwotCXN0YXRpYyBpbnQgbm9fbW9yZV9mb3VuZDsKLQotCWlmIChub19tb3JlX2ZvdW5kKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQlub19tb3JlX2ZvdW5kID0gMTsKLQotCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmICh1bml0ID49IDApIHsKLQkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOwotCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOwotCX0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0KLQlwcmludGsoIlByb2JpbmcgZm9yIFBBTSdzIE5ldC9HSyBBZGFwdGVyLi4uXG4iKTsKLQotCS8qIEFsbG9jYXRlIHRoZSBETUEgYnVmZmVyIGhlcmUgc2luY2Ugd2UgbmVlZCBpdCBmb3IgcHJvYmluZyEgKi8KLQotCW5pY19wYWNrZXQgPSAoc3RydWN0IG5pY19wa3RfcyAqKWFjc2lfYnVmZmVyOwotCXBoeXNfbmljX3BhY2tldCA9ICh1bnNpZ25lZCBjaGFyICopcGh5c19hY3NpX2J1ZmZlcjsKLQlpZiAocGFtc25ldF9kZWJ1ZyA+IDApIHsKLQkJcHJpbnRrKCJuaWNfcGFja2V0IGF0IDB4JXAsIHBoeXMgYXQgMHglcFxuIiwKLQkJCSAgIG5pY19wYWNrZXQsIHBoeXNfbmljX3BhY2tldCApOwotCX0KLQotCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQlESVNBQkxFX0lSUSgpOwotCi0JZm9yIChpPTA7IGk8ODsgaSsrKSB7Ci0JCS8qIERvIHR3byBpbnF1aXJpZXMgdG8gY292ZXIgY2FzZXMgd2l0aCBzdHJhbmdlIGVxdWlwbWVudCBvbiBwcmV2aW91cyBJRCAqLwotCQkvKiBibG9ja2luZyB0aGUgQUNTSSBidXMgKGxpa2UgdGhlIFNMTUM4MDQgbGFzZXIgcHJpbnRlciBjb250cm9sbGVyLi4uICAgKi8KLQkJaW5xdWlyeShpLCBwaHlzX25pY19wYWNrZXQpOwotCQlpZiAoIWlucXVpcnkoaSwgcGh5c19uaWNfcGFja2V0KSkgewotCQkJbGFuY2VfdGFyZ2V0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCEhTkVUX0RFQlVHKQotCQlwcmludGsoIklEOiAlZFxuIixpKTsKLQotCWlmIChsYW5jZV90YXJnZXQgPj0gMCkgewotCQlpZiAoIShod2FkZHIgPSByZWFkX2h3X2FkZHIobGFuY2VfdGFyZ2V0LCBwaHlzX25pY19wYWNrZXQpKSkKLQkJCWxhbmNlX3RhcmdldCA9IC0xOwotCQllbHNlCi0JCQltZW1jcHkgKHN0YXRpb25fYWRkciwgaHdhZGRyLCBFVEhfQUxFTik7Ci0JfQotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQotCWlmIChsYW5jZV90YXJnZXQgPCAwKSB7Ci0JCXByaW50aygiTm8gUEFNJ3MgTmV0L0dLIGZvdW5kLlxuIik7Ci0JCWZyZWVfbmV0ZGV2KGRldik7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQotCWlmIChwYW1zbmV0X2RlYnVnID4gMCAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsodmVyc2lvbik7Ci0KLQlwcmludGsoIiVzOiAlcyBmb3VuZCBvbiB0YXJnZXQgJTAxZCwgZXRoLWFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKLQkJZGV2LT5uYW1lLCAiUEFNJ3MgTmV0L0dLIiwgbGFuY2VfdGFyZ2V0LAotCQlzdGF0aW9uX2FkZHJbMF0sIHN0YXRpb25fYWRkclsxXSwgc3RhdGlvbl9hZGRyWzJdLAotCQlzdGF0aW9uX2FkZHJbM10sIHN0YXRpb25fYWRkcls0XSwgc3RhdGlvbl9hZGRyWzVdKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCi0JZGV2LT5vcGVuCQk9IHBhbXNuZXRfb3BlbjsKLQlkZXYtPnN0b3AJCT0gcGFtc25ldF9jbG9zZTsKLQlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHBhbXNuZXRfc2VuZF9wYWNrZXQ7Ci0JZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKLQotCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMKLQkgKiB2YWx1ZXMuIFRoaXMgc2hvdWxkIGJlIGluIGEgY29tbW9uIGZpbGUgaW5zdGVhZCBvZiBwZXItZHJpdmVyLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLSNpZiAwCi0JCWRldi0+YnJvYWRjYXN0W2ldID0gMHhmZjsKLSNlbmRpZgotCQlkZXYtPmRldl9hZGRyW2ldICA9IHN0YXRpb25fYWRkcltpXTsKLQl9Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKCFlcnIpCi0JCXJldHVybiBkZXY7Ci0KLQlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLS8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQotICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgotCi0gICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCi0gICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAotICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KLSAqLwotc3RhdGljIGludAotcGFtc25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKHBhbXNuZXRfZGVidWcgPiAwKQotCQlwcmludGsoInBhbXNuZXRfb3BlblxuIik7Ci0Jc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0KLQkvKiBSZXNldCB0aGUgaGFyZHdhcmUgaGVyZS4KLQkgKi8KLQlpZiAoIWlmX3VwKQotCQlzdGFydChsYW5jZV90YXJnZXQpOwotCWlmX3VwID0gMTsKLQlscC0+b3Blbl90aW1lID0gMDsJLypqaWZmaWVzKi8KLQlscC0+cG9sbF90aW1lID0gTUFYX1BPTExfVElNRTsKLQotCWRldi0+dGJ1c3kgPSAwOwotCWRldi0+aW50ZXJydXB0ID0gMDsKLQlkZXYtPnN0YXJ0ID0gMTsKLQotCUVOQUJMRV9JUlEoKTsKLQlzdGRtYV9yZWxlYXNlKCk7Ci0JcGFtc25ldF90aW1lci5kYXRhID0gKGxvbmcpZGV2OwotCXBhbXNuZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOwotCWFkZF90aW1lcigmcGFtc25ldF90aW1lcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhbXNuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gIFRoaXMgY291bGQgYmV0dGVyIGJlCi0JICogZG9uZSB3aXRoIGF0b21pY19zd2FwKDEsIGRldi0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlscC0+c3RhdHMudHhfZXJyb3JzKys7Ci0JfQotCWVsc2UgewotCQlpbnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47Ci0JCXVuc2lnbmVkIGxvbmcgYnVmID0gdmlydF90b19waHlzKHNrYi0+ZGF0YSk7Ci0JCWludCBzdGF0OwotCi0JCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKLQkJRElTQUJMRV9JUlEoKTsKLQotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWlmKCAhU1RSQU1fQUREUihidWYrbGVuZ3RoLTEpICkgewotCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIG5pY19wYWNrZXQtPmJ1ZmZlciwKLQkJCQkJCSAgbGVuZ3RoKTsKLQkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldDsKLQkJfQotCi0JCWRtYV9jYWNoZV9tYWludGVuYW5jZShidWYsIGxlbmd0aCwgMSk7Ci0KLQkJc3RhdCA9IHNlbmRwa3QobGFuY2VfdGFyZ2V0LCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgbGVuZ3RoKTsKLQkJRU5BQkxFX0lSUSgpOwotCQlzdGRtYV9yZWxlYXNlKCk7Ci0KLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0JCWRldi0+dGJ1c3kJID0gMDsKLQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJbHAtPnN0YXRzLnR4X2J5dGVzKz1sZW5ndGg7Ci0JfQotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KLSAqLwotc3RhdGljIHZvaWQKLXBhbXNuZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgYm9ndXNjb3VudDsKLQlpbnQgcGt0X2xlbjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogKytyb21hbjogVGFrZSBjYXJlIGF0IGxvY2tpbmcgdGhlIFNULURNQS4uLiBUaGlzIG11c3QgYmUgZG9uZSB3aXRoIGludHMKLQkgKiBvZmYsIHNpbmNlIG90aGVyd2lzZSBhbiBpbnQgY291bGQgc2xpcCBpbiBiZXR3ZWVuIHRoZSBxdWVzdGlvbiBhbmQgdGhlCi0JICogbG9ja2luZyBpdHNlbGYsIGFuZCB0aGVuIHdlJ2QgZ28gdG8gc2xlZXAuLi4gQW5kIGxvY2tpbmcgaXRzZWxmIGlzCi0JICogbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIGZsb3BweV9jaGFuZ2UgdGltZXIgZnJvbSB3b3JraW5nIHdpdGggU1QtRE1BCi0JICogcmVnaXN0ZXJzLiAqLwotCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7Ci0JRElTQUJMRV9JUlEoKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlib2d1c2NvdW50ID0gdGVzdHBrdChsYW5jZV90YXJnZXQpOwotCWlmKCBscC0+cG9sbF90aW1lIDwgTUFYX1BPTExfVElNRSApIGxwLT5wb2xsX3RpbWUrKzsKLQotCXdoaWxlKGJvZ3VzY291bnQtLSkgewotCQlwa3RfbGVuID0gcmVjZWl2ZXBrdChsYW5jZV90YXJnZXQsIHBoeXNfbmljX3BhY2tldCk7Ci0KLQkJaWYoIHBrdF9sZW4gPCA2MCApIGJyZWFrOwotCi0JCS8qIEdvb2QgcGFja2V0Li4uICovCi0KLQkJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgcGt0X2xlbiwgMCk7Ci0KLQkJbHAtPnBvbGxfdGltZSA9IHBhbXNuZXRfbWluX3BvbGxfdGltZTsgICAgLyogZmFzdCBwb2xsICovCi0JCWlmKCBwa3RfbGVuID49IDYwICYmIHBrdF9sZW4gPD0gMjA0OCApIHsKLQkJCWlmIChwa3RfbGVuID4gMTUxNCkKLQkJCQlwa3RfbGVuID0gMTUxNDsKLQotCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuCi0JCQkgKi8KLQkJCXNrYiA9IGFsbG9jX3NrYihwa3RfbGVuLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChza2IgPT0gTlVMTCkgewotCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAotCQkJCQlkZXYtPm5hbWUpOwotCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlza2ItPmxlbiA9IHBrdF9sZW47Ci0JCQlza2ItPmRldiA9IGRldjsKLQotCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KLQkJCSAqLwotCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCBuaWNfcGFja2V0LT5idWZmZXIsCi0JCQkJCQlwa3RfbGVuKTsKLQkJCW5ldGlmX3J4KHNrYik7Ci0JCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKLQkJfQotCX0KLQotCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQotCSAgIGhhcyBkb25lIGEgbWFya19iaChJTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCi0JICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuCi0JICovCi0KLQlFTkFCTEVfSVJRKCk7Ci0Jc3RkbWFfcmVsZWFzZSgpOwotCXJldHVybjsKLX0KLQotLyogcGFtc25ldF90aWNrOiBjYWxsZWQgYnkgcGFtc25ldF90aW1lci4gUmVhZHMgcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLAotICogcGFzc2VzIHRoZW0gdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kIHJlc3RhcnRzIHRoZSB0aW1lci4KLSAqLwotc3RhdGljIHZvaWQKLXBhbXNuZXRfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UJICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwotCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmKCBwYW1zbmV0X2RlYnVnID4gMCAmJiAobHAtPm9wZW5fdGltZSsrICYgNykgPT0gOCApCi0JCXByaW50aygicGFtc25ldF90aWNrOiAlbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCi0JcGFtc25ldF9wb2xsX3J4KGRldik7Ci0KLQlwYW1zbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKLQlhZGRfdGltZXIoJnBhbXNuZXRfdGltZXIpOwotfQotCi0vKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIHBhbXNuZXRfb3BlbigpLgotICovCi1zdGF0aWMgaW50Ci1wYW1zbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKHBhbXNuZXRfZGVidWcgPiAwKQotCQlwcmludGsoInBhbXNuZXRfY2xvc2UsIG9wZW5fdGltZT0lbGRcbiIsIGxwLT5vcGVuX3RpbWUpOwotCWRlbF90aW1lcigmcGFtc25ldF90aW1lcik7Ci0Jc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOwotCURJU0FCTEVfSVJRKCk7Ci0KLQlpZiAoaWZfdXApCi0JCXN0b3AobGFuY2VfdGFyZ2V0KTsKLQlpZl91cCA9IDA7Ci0KLQlscC0+b3Blbl90aW1lID0gMDsKLQotCWRldi0+dGJ1c3kgPSAxOwotCWRldi0+c3RhcnQgPSAwOwotCi0JRU5BQkxFX0lSUSgpOwotCXN0ZG1hX3JlbGVhc2UoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCi0gICBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXJldHVybiAmbHAtPnN0YXRzOwotfQotCi0KLSNpZmRlZiBNT0RVTEUKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwYW1fZGV2OwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlwYW1fZGV2ID0gcGFtc25ldF9wcm9iZSgtMSk7Ci0JaWYgKElTX0VSUihwYW1fZGV2KSkKLQkJcmV0dXJuIFBUUl9FUlIocGFtX2Rldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX25ldGRldihwYW1fZGV2KTsKLQlmcmVlX25ldGRldihwYW1fZGV2KTsKLX0KLQotI2VuZGlmIC8qIE1PRFVMRSAqLwotCi0vKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L2luY2x1ZGUKLQktYiBtNjhrLWxpbnV4YW91dCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMgotCS1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1ETU9EVUxFIC1JLi4vLi4vbmV0L2luZXQgLWMgYXRhcmlfcGFtc25ldC5jIgotICogIHZlcnNpb24tY29udHJvbDogdAotICogIGtlcHQtbmV3LXZlcnNpb25zOiA1Ci0gKiAgdGFiLXdpZHRoOiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxLmgKaW5kZXggZGY0YzFhMC4uZmY0NzY1ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oCisrKyBiL2RyaXZlcnMvbmV0L2F0bDEvYXRsMS5oCkBAIC00Myw2ICs0Myw3IEBACiBzdHJ1Y3QgYXRsMV9hZGFwdGVyOwogCiAjZGVmaW5lIEFUTDFfTUFYX0lOVFIJCTMKKyNkZWZpbmUgQVRMMV9NQVhfVFhfQlVGX0xFTgkweDMwMDAJLyogMTIyODggYnl0ZXMgKi8KIAogI2RlZmluZSBBVEwxX0RFRkFVTFRfVFBECTI1NgogI2RlZmluZSBBVEwxX01BWF9UUEQJCTEwMjQKQEAgLTU3LDI5ICs1OCw0NSBAQAogI2RlZmluZSBBVEwxX1JSRF9ERVNDKFIsIGkpCUFUTDFfR0VUX0RFU0MoUiwgaSwgc3RydWN0IHJ4X3JldHVybl9kZXNjKQogCiAvKgorICogVGhpcyBkZXRhY2hlZCBjb21tZW50IGlzIHByZXNlcnZlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBvbmx5LgorICogSXQgd2FzIG9yaWdpbmFsbHkgYXR0YWNoZWQgdG8gc29tZSBjb2RlIHRoYXQgZ290IGRlbGV0ZWQsIGJ1dCBzZWVtcworICogaW1wb3J0YW50IGVub3VnaCB0byBrZWVwIGFyb3VuZC4uLgorICoKKyAqIDxiZWdpbiBkZXRhY2hlZCBjb21tZW50PgogICogU29tZSB3b3JrYXJvdW5kcyByZXF1aXJlIG1pbGxpc2Vjb25kIGRlbGF5cyBhbmQgYXJlIHJ1biBkdXJpbmcgaW50ZXJydXB0CiAgKiBjb250ZXh0LiAgTW9zdCBub3RhYmx5LCB3aGVuIGVzdGFibGlzaGluZyBsaW5rLCB0aGUgcGh5IG1heSBuZWVkIHR3ZWFraW5nCiAgKiBidXQgY2Fubm90IHByb2Nlc3MgcGh5IHJlZ2lzdGVyIHJlYWRzL3dyaXRlcyBmYXN0ZXIgdGhhbiBtaWxsaXNlY29uZAogICogaW50ZXJ2YWxzLi4uYW5kIHdlIGVzdGFibGlzaCBsaW5rIGR1ZSB0byBhICJsaW5rIHN0YXR1cyBjaGFuZ2UiIGludGVycnVwdC4KKyAqIDxlbmQgZGV0YWNoZWQgY29tbWVudD4KICAqLwogCiAvKgotICogd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKLSAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlcgorICogYXRsMV9yaW5nX2hlYWRlciByZXByZXNlbnRzIGEgc2luZ2xlLCBjb250aWd1b3VzIGJsb2NrIG9mIERNQSBzcGFjZQorICogbWFwcGVkIGZvciB0aGUgdGhyZWUgZGVzY3JpcHRvciByaW5ncyAodHBkLCByZmQsIHJyZCkgYW5kIHRoZSB0d28KKyAqIG1lc3NhZ2UgYmxvY2tzIChjbWIsIHNtYikgZGVzY3JpYmVkIGJlbG93CisgKi8KK3N0cnVjdCBhdGwxX3JpbmdfaGVhZGVyIHsKKwl2b2lkICpkZXNjOwkJLyogdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZGRyZXNzKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogbGVuZ3RoIGluIGJ5dGVzICovCit9OworCisvKgorICogYXRsMV9idWZmZXIgaXMgd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlcgorICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgc2tiCiAgKi8KIHN0cnVjdCBhdGwxX2J1ZmZlciB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1MTYgbGVuZ3RoOwotCXUxNiBhbGxvY2VkOworCXN0cnVjdCBza19idWZmICpza2I7CS8qIHNvY2tldCBidWZmZXIgKi8KKwl1MTYgbGVuZ3RoOwkJLyogcnggYnVmZmVyIGxlbmd0aCAqLworCXUxNiBhbGxvY2VkOwkJLyogMSBpZiBza2IgYWxsb2NhdGVkICovCiAJZG1hX2FkZHJfdCBkbWE7CiB9OwogCi0jZGVmaW5lIE1BWF9UWF9CVUZfTEVOCQkweDMwMDAJLyogMTJLQiAqLwotCisvKiB0cmFuc21pdCBwYWNrZXQgZGVzY3JpcHRvciAodHBkKSByaW5nICovCiBzdHJ1Y3QgYXRsMV90cGRfcmluZyB7Ci0Jdm9pZCAqZGVzYzsJCS8qIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgcmluZyBtZW1vcnkgKi8KLQlkbWFfYWRkcl90IGRtYTsJCS8qIHBoeXNpY2FsIGFkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCi0JdTE2IHNpemU7CQkvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCisJdm9pZCAqZGVzYzsJCS8qIGRlc2NyaXB0b3IgcmluZyB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IGRtYTsJCS8qIGRlc2NyaXB0b3IgcmluZyBwaHlzaWNhbCBhZGRyZXNzICovCisJdTE2IHNpemU7CQkvKiBkZXNjcmlwdG9yIHJpbmcgbGVuZ3RoIGluIGJ5dGVzICovCiAJdTE2IGNvdW50OwkJLyogbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nICovCiAJdTE2IGh3X2lkeDsJCS8qIGhhcmR3YXJlIGluZGV4ICovCiAJYXRvbWljX3QgbmV4dF90b19jbGVhbjsKQEAgLTg3LDM2ICsxMDQsMzQgQEAKIAlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogfTsKIAorLyogcmVjZWl2ZSBmcmVlIGRlc2NyaXB0b3IgKHJmZCkgcmluZyAqLwogc3RydWN0IGF0bDFfcmZkX3JpbmcgewotCXZvaWQgKmRlc2M7Ci0JZG1hX2FkZHJfdCBkbWE7Ci0JdTE2IHNpemU7Ci0JdTE2IGNvdW50OworCXZvaWQgKmRlc2M7CQkvKiBkZXNjcmlwdG9yIHJpbmcgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBkZXNjcmlwdG9yIHJpbmcgcGh5c2ljYWwgYWRkcmVzcyAqLworCXUxNiBzaXplOwkJLyogZGVzY3JpcHRvciByaW5nIGxlbmd0aCBpbiBieXRlcyAqLworCXUxNiBjb3VudDsJCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLwogCWF0b21pY190IG5leHRfdG9fdXNlOwogCXUxNiBuZXh0X3RvX2NsZWFuOwogCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CiB9OwogCisvKiByZWNlaXZlIHJldHVybiBkZXNjcmlwdG9yIChycmQpIHJpbmcgKi8KIHN0cnVjdCBhdGwxX3JyZF9yaW5nIHsKLQl2b2lkICpkZXNjOwotCWRtYV9hZGRyX3QgZG1hOwotCXVuc2lnbmVkIGludCBzaXplOwotCXUxNiBjb3VudDsKKwl2b2lkICpkZXNjOwkJLyogZGVzY3JpcHRvciByaW5nIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZG1hOwkJLyogZGVzY3JpcHRvciByaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogZGVzY3JpcHRvciByaW5nIGxlbmd0aCBpbiBieXRlcyAqLworCXUxNiBjb3VudDsJCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLwogCXUxNiBuZXh0X3RvX3VzZTsKIAlhdG9taWNfdCBuZXh0X3RvX2NsZWFuOwogfTsKIAotc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgewotCXZvaWQgKmRlc2M7CQkvKiBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHJpbmcgbWVtb3J5ICovCi0JZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzaWNhbCBhZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcmluZyAqLwotCXVuc2lnbmVkIGludCBzaXplOwkvKiBsZW5ndGggb2YgZGVzY3JpcHRvciByaW5nIGluIGJ5dGVzICovCi19OwotCisvKiBjb2FsZXNjaW5nIG1lc3NhZ2UgYmxvY2sgKGNtYikgKi8KIHN0cnVjdCBhdGwxX2NtYiB7CiAJc3RydWN0IGNvYWxzX21zZ19ibG9jayAqY21iOwogCWRtYV9hZGRyX3QgZG1hOwogfTsKIAorLyogc3RhdGlzdGljcyBtZXNzYWdlIGJsb2NrIChzbWIpICovCiBzdHJ1Y3QgYXRsMV9zbWIgewogCXN0cnVjdCBzdGF0c19tc2dfYmxvY2sgKnNtYjsKIAlkbWFfYWRkcl90IGRtYTsKQEAgLTE0MSwyNCArMTU2LDI2IEBACiAJdTY0IHR4X2Fib3J0ZWRfZXJyb3JzOwogCXU2NCB0eF93aW5kb3dfZXJyb3JzOwogCXU2NCB0eF9jYXJyaWVyX2Vycm9yczsKLQotCXU2NCB0eF9wYXVzZTsJCS8qIG51bSBQYXVzZSBwYWNrZXQgdHJhbnNtaXR0ZWQuICovCi0JdTY0IGV4Y2Vjb2w7CQkvKiBudW0gdHggcGFja2V0cyBhYm9ydGVkIGR1ZSB0byBleGNlc3NpdmUgY29sbGlzaW9ucy4gKi8KLQl1NjQgZGVmZmVyOwkJLyogbnVtIGRlZmVycmVkIHR4IHBhY2tldHMgKi8KLQl1NjQgc2NjOwkJLyogbnVtIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSB3LyBzaW5nbGUgcHJpb3IgY29sbGlzaW9uLiAqLwotCXU2NCBtY2M7CQkvKiBudW0gcGFja2V0cyBzdWJzZXF1ZW50bHkgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5IHcvIG11bHRpcGxlIHByaW9yIGNvbGxpc2lvbnMuICovCisJdTY0IHR4X3BhdXNlOwkJLyogbnVtIHBhdXNlIHBhY2tldHMgdHJhbnNtaXR0ZWQuICovCisJdTY0IGV4Y2Vjb2w7CQkvKiBudW0gdHggcGFja2V0cyB3LyBleGNlc3NpdmUgY29sbGlzaW9ucy4gKi8KKwl1NjQgZGVmZmVyOwkJLyogbnVtIHR4IHBhY2tldHMgZGVmZXJyZWQgKi8KKwl1NjQgc2NjOwkJLyogbnVtIHBhY2tldHMgc3Vic2VxdWVudGx5IHRyYW5zbWl0dGVkCisJCQkJICogc3VjY2Vzc2Z1bGx5IHcvIHNpbmdsZSBwcmlvciBjb2xsaXNpb24uICovCisJdTY0IG1jYzsJCS8qIG51bSBwYWNrZXRzIHN1YnNlcXVlbnRseSB0cmFuc21pdHRlZAorCQkJCSAqIHN1Y2Nlc3NmdWxseSB3LyBtdWx0aXBsZSBwcmlvciBjb2xsaXNpb25zLiAqLwogCXU2NCBsYXRlY29sOwkJLyogbnVtIHR4IHBhY2tldHMgIHcvIGxhdGUgY29sbGlzaW9ucy4gKi8KLQl1NjQgdHhfdW5kZXJ1bjsJCS8qIG51bSB0eCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIHRyYW5zbWl0IEZJRk8gdW5kZXJydW4sIG9yIFRSRCBGSUZPIHVuZGVycnVuICovCi0JdTY0IHR4X3RydW5jOwkJLyogbnVtIHR4IHBhY2tldHMgdHJ1bmNhdGVkIGR1ZSB0byBzaXplIGV4Y2VlZGluZyBNVFUsIHJlZ2FyZGxlc3Mgd2hldGhlciB0cnVuY2F0ZWQgYnkgU2VsZW5lIG9yIG5vdC4gKFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IHJlZmxlY3QgdGhlIG1lYW5pbmcgaW4gdGhpcyBjYXNlLikgKi8KKwl1NjQgdHhfdW5kZXJ1bjsJCS8qIG51bSB0eCBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIHRyYW5zbWl0CisJCQkJICogRklGTyB1bmRlcnJ1biwgb3IgVFJEIEZJRk8gdW5kZXJydW4gKi8KKwl1NjQgdHhfdHJ1bmM7CQkvKiBudW0gdHggcGFja2V0cyB0cnVuY2F0ZWQgZHVlIHRvIHNpemUKKwkJCQkgKiBleGNlZWRpbmcgTVRVLCByZWdhcmRsZXNzIHdoZXRoZXIgdHJ1bmNhdGVkCisJCQkJICogYnkgdGhlIGNoaXAgb3Igbm90LiAoVGhlIG5hbWUgZG9lc24ndCByZWFsbHkKKwkJCQkgKiByZWZsZWN0IHRoZSBtZWFuaW5nIGluIHRoaXMgY2FzZS4pICovCiAJdTY0IHJ4X3BhdXNlOwkJLyogbnVtIFBhdXNlIHBhY2tldHMgcmVjZWl2ZWQuICovCiAJdTY0IHJ4X3JyZF9vdjsKIAl1NjQgcnhfdHJ1bmM7CiB9OwogCi0vKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCi0jZGVmaW5lIEFUTDFfUkVHU19MRU4JOAotCi0vKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKi8KKy8qIGhhcmR3YXJlIHN0cnVjdHVyZSAqLwogc3RydWN0IGF0bDFfaHcgewogCXU4IF9faW9tZW0gKmh3X2FkZHI7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYmFjazsKQEAgLTE2NywyNCArMTg0LDM1IEBACiAJZW51bSBhdGwxX2RtYV9yZXFfYmxvY2sgZG1hcl9ibG9jazsKIAllbnVtIGF0bDFfZG1hX3JlcV9ibG9jayBkbWF3X2Jsb2NrOwogCXU4IHByZWFtYmxlX2xlbjsKLQl1OCBtYXhfcmV0cnk7CQkvKiBSZXRyYW5zbWlzc2lvbiBtYXhpbXVtLCBhZnRlciB3aGljaCB0aGUgcGFja2V0IHdpbGwgYmUgZGlzY2FyZGVkICovCi0JdTggamFtX2lwZzsJCS8qIElQRyB0byBzdGFydCBKQU0gZm9yIGNvbGxpc2lvbiBiYXNlZCBmbG93IGNvbnRyb2wgaW4gaGFsZi1kdXBsZXggbW9kZS4gSW4gdW5pdHMgb2YgOC1iaXQgdGltZSAqLwotCXU4IGlwZ3Q7CQkvKiBEZXNpcmVkIGJhY2sgdG8gYmFjayBpbnRlci1wYWNrZXQgZ2FwLiBUaGUgZGVmYXVsdCBpcyA5Ni1iaXQgdGltZSAqLwotCXU4IG1pbl9pZmc7CQkvKiBNaW5pbXVtIG51bWJlciBvZiBJRkcgdG8gZW5mb3JjZSBpbiBiZXR3ZWVuIFJYIGZyYW1lcy4gRnJhbWUgZ2FwIGJlbG93IHN1Y2ggSUZQIGlzIGRyb3BwZWQgKi8KKwl1OCBtYXhfcmV0cnk7CQkvKiBSZXRyYW5zbWlzc2lvbiBtYXhpbXVtLCBhZnRlciB3aGljaCB0aGUKKwkJCQkgKiBwYWNrZXQgd2lsbCBiZSBkaXNjYXJkZWQgKi8KKwl1OCBqYW1faXBnOwkJLyogSVBHIHRvIHN0YXJ0IEpBTSBmb3IgY29sbGlzaW9uIGJhc2VkIGZsb3cKKwkJCQkgKiBjb250cm9sIGluIGhhbGYtZHVwbGV4IG1vZGUuIEluIHVuaXRzIG9mCisJCQkJICogOC1iaXQgdGltZSAqLworCXU4IGlwZ3Q7CQkvKiBEZXNpcmVkIGJhY2sgdG8gYmFjayBpbnRlci1wYWNrZXQgZ2FwLgorCQkJCSAqIFRoZSBkZWZhdWx0IGlzIDk2LWJpdCB0aW1lICovCisJdTggbWluX2lmZzsJCS8qIE1pbmltdW0gbnVtYmVyIG9mIElGRyB0byBlbmZvcmNlIGluIGJldHdlZW4KKwkJCQkgKiByZWNlaXZlIGZyYW1lcy4gRnJhbWUgZ2FwIGJlbG93IHN1Y2ggSUZQCisJCQkJICogaXMgZHJvcHBlZCAqLwogCXU4IGlwZ3IxOwkJLyogNjRiaXQgQ2Fycmllci1TZW5zZSB3aW5kb3cgKi8KIAl1OCBpcGdyMjsJCS8qIDk2LWJpdCBJUEcgd2luZG93ICovCi0JdTggdHBkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFRQRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFRQRCBpcyAxNiBieXRlcyBsb25nICovCi0JdTggcmZkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFJGRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkIGJ1cnN0LiBFYWNoIFJGRCBpcyAxMiBieXRlcyBsb25nICovCisJdTggdHBkX2J1cnN0OwkJLyogTnVtYmVyIG9mIFRQRCB0byBwcmVmZXRjaCBpbiBjYWNoZS1hbGlnbmVkCisJCQkJICogYnVyc3QuIEVhY2ggVFBEIGlzIDE2IGJ5dGVzIGxvbmcgKi8KKwl1OCByZmRfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgUkZEIHRvIHByZWZldGNoIGluIGNhY2hlLWFsaWduZWQKKwkJCQkgKiBidXJzdC4gRWFjaCBSRkQgaXMgMTIgYnl0ZXMgbG9uZyAqLwogCXU4IHJmZF9mZXRjaF9nYXA7Ci0JdTggcnJkX2J1cnN0OwkJLyogVGhyZXNob2xkIG51bWJlciBvZiBSUkRzIHRoYXQgY2FuIGJlIHJldGlyZWQgaW4gYSBidXJzdC4gRWFjaCBSUkQgaXMgMTYgYnl0ZXMgbG9uZyAqLworCXU4IHJyZF9idXJzdDsJCS8qIFRocmVzaG9sZCBudW1iZXIgb2YgUlJEcyB0aGF0IGNhbiBiZSByZXRpcmVkCisJCQkJICogaW4gYSBidXJzdC4gRWFjaCBSUkQgaXMgMTYgYnl0ZXMgbG9uZyAqLwogCXU4IHRwZF9mZXRjaF90aDsKIAl1OCB0cGRfZmV0Y2hfZ2FwOwogCXUxNiB0eF9qdW1ib190YXNrX3RoOwotCXUxNiB0eGZfYnVyc3Q7CQkvKiBOdW1iZXIgb2YgZGF0YSBieXRlcyB0byByZWFkIGluIGEgY2FjaGUtYWxpZ25lZCBidXJzdC4gRWFjaCBTUkFNIGVudHJ5IGlzCi0JCQkJICAgOCBieXRlcyBsb25nICovCi0JdTE2IHJ4X2p1bWJvX3RoOwkvKiBKdW1ibyBwYWNrZXQgc2l6ZSBmb3Igbm9uLVZMQU4gcGFja2V0LiBWTEFOIHBhY2tldHMgc2hvdWxkIGFkZCA0IGJ5dGVzICovCisJdTE2IHR4Zl9idXJzdDsJCS8qIE51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIHJlYWQgaW4gYSBjYWNoZS0KKwkJCQkgKiBhbGlnbmVkIGJ1cnN0LiBFYWNoIFNSQU0gZW50cnkgaXMgOCBieXRlcyAqLworCXUxNiByeF9qdW1ib190aDsJLyogSnVtYm8gcGFja2V0IHNpemUgZm9yIG5vbi1WTEFOIHBhY2tldC4gVkxBTgorCQkJCSAqIHBhY2tldHMgc2hvdWxkIGFkZCA0IGJ5dGVzICovCiAJdTE2IHJ4X2p1bWJvX2xrYWg7Ci0JdTE2IHJyZF9yZXRfdGltZXI7CS8qIFJSRCByZXRpcmVtZW50IHRpbWVyLiBEZWNyZW1lbnQgYnkgMSBhZnRlciBldmVyeSA1MTJucyBwYXNzZXMuICovCisJdTE2IHJyZF9yZXRfdGltZXI7CS8qIFJSRCByZXRpcmVtZW50IHRpbWVyLiBEZWNyZW1lbnQgYnkgMSBhZnRlcgorCQkJCSAqIGV2ZXJ5IDUxMm5zIHBhc3Nlcy4gKi8KIAl1MTYgbGNvbDsJCS8qIENvbGxpc2lvbiBXaW5kb3cgKi8KIAogCXUxNiBjbWJfdHBkOwpAQCAtMTk0LDQ4ICsyMjIsMzUgQEAKIAl1MzIgc21iX3RpbWVyOwogCXUxNiBtZWRpYV90eXBlOwogCXUxNiBhdXRvbmVnX2FkdmVydGlzZWQ7Ci0JdTE2IHBjaV9jbWRfd29yZDsKIAogCXUxNiBtaWlfYXV0b25lZ19hZHZfcmVnOwogCXUxNiBtaWlfMTAwMHRfY3RybF9yZWc7CiAKLQl1MzIgbWVtX3Jhbmc7Ci0JdTMyIHR4Y3c7CiAJdTMyIG1heF9mcmFtZV9zaXplOwogCXUzMiBtaW5fZnJhbWVfc2l6ZTsKLQl1MzIgbWNfZmlsdGVyX3R5cGU7Ci0JdTMyIG51bV9tY19hZGRyczsKLQl1MzIgY29sbGlzaW9uX2RlbHRhOwotCXUzMiB0eF9wYWNrZXRfZGVsdGE7Ci0JdTE2IHBoeV9zcGRfZGVmYXVsdDsKIAogCXUxNiBkZXZfcmV2OwogCiAJLyogc3BpIGZsYXNoICovCiAJdTggZmxhc2hfdmVuZG9yOwogCi0JdTggZG1hX2ZhaXJuZXNzOwogCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKIAl1OCBwZXJtX21hY19hZGRyW0VUSF9BTEVOXTsKIAotCS8qIGJvb2wgcGh5X3ByZWFtYmxlX3N1cDsgKi8KIAlib29sIHBoeV9jb25maWd1cmVkOwogfTsKIAogc3RydWN0IGF0bDFfYWRhcHRlciB7Ci0JLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CiAJc3RydWN0IGF0bDFfc2Z0X3N0YXRzIHNvZnRfc3RhdHM7Ci0KIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnA7CiAJdTMyIHJ4X2J1ZmZlcl9sZW47CiAJdTMyIHdvbDsKIAl1MTYgbGlua19zcGVlZDsKIAl1MTYgbGlua19kdXBsZXg7CiAJc3BpbmxvY2tfdCBsb2NrOwotCWF0b21pY190IGlycV9zZW07CiAJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19jaGdfdGFzazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcGNpZV9kbWFfdG9fcnN0X3Rhc2s7CkBAIC0yNDMsOSArMjU4LDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfY29uZmlnX3RpbWVyOwogCWJvb2wgcGh5X3RpbWVyX3BlbmRpbmc7CiAKLQlib29sIG1hY19kaXNhYmxlZDsKLQotCS8qIEFsbCBkZXNjcmlwdG9yIHJpbmdzJyBtZW1vcnkgKi8KKwkvKiBhbGwgZGVzY3JpcHRvciByaW5ncycgbWVtb3J5ICovCiAJc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgcmluZ19oZWFkZXI7CiAKIAkvKiBUWCAqLwpAQCAtMjU4LDI1ICsyNzEsMTYgQEAKIAl1NjQgaHdfY3N1bV9lcnI7CiAJdTY0IGh3X2NzdW1fZ29vZDsKIAotCXUzMiBnb3JjbDsKLQl1NjQgZ29yY2xfb2xkOwotCi0JLyogSW50ZXJydXB0IE1vZGVyYXRvciB0aW1lciAoIDJ1cyByZXNvbHV0aW9uKSAqLwotCXUxNiBpbXQ7Ci0JLyogSW50ZXJydXB0IENsZWFyIHRpbWVyICgydXMgcmVzb2x1dGlvbikgKi8KLQl1MTYgaWN0OwotCi0JLyogTUlJIGludGVyZmFjZSBpbmZvICovCi0Jc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl1MTYgaW10OwkvKiBpbnRlcnJ1cHQgbW9kZXJhdG9yIHRpbWVyICgydXMgcmVzb2x1dGlvbiAqLworCXUxNiBpY3Q7CS8qIGludGVycnVwdCBjbGVhciB0aW1lciAoMnVzIHJlc29sdXRpb24gKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOwkJLyogTUlJIGludGVyZmFjZSBpbmZvICovCiAKIAkvKiBzdHJ1Y3RzIGRlZmluZWQgaW4gYXRsMV9ody5oICovCi0JdTMyIGJkX251bWJlcjsJCS8qIGJvYXJkIG51bWJlciAqLworCXUzMiBiZF9udW1iZXI7CQkJLyogYm9hcmQgbnVtYmVyICovCiAJYm9vbCBwY2lfdXNpbmdfNjQ7CiAJc3RydWN0IGF0bDFfaHcgaHc7CiAJc3RydWN0IGF0bDFfc21iIHNtYjsKIAlzdHJ1Y3QgYXRsMV9jbWIgY21iOwotCi0JdTMyIHBjaV9zdGF0ZVsxNl07CiB9OwogCiAjZW5kaWYJLyogX0FUTDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMgYi9kcml2ZXJzL25ldC9hdGwxL2F0bDFfbWFpbi5jCmluZGV4IDUwMTkxOWUuLmZkMWUxNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2F0bDEvYXRsMV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYXRsMS9hdGwxX21haW4uYwpAQCAtMzgsNyArMzgsNyBAQAogICogVE9ETzoKICAqIEZpeCBUU087IHR4IHBlcmZvcm1hbmNlIGlzIGhvcnJpYmxlIHdpdGggVFNPIGVuYWJsZWQuCiAgKiBXYWtlIG9uIExBTi4KLSAqIEFkZCBtb3JlIGV0aHRvb2wgZnVuY3Rpb25zLCBpbmNsdWRpbmcgc2V0IHJpbmcgcGFyYW1ldGVycy4KKyAqIEFkZCBtb3JlIGV0aHRvb2wgZnVuY3Rpb25zLgogICogRml4IGFic3RydXNlIGlycSBlbmFibGUvZGlzYWJsZSBjb25kaXRpb24gZGVzY3JpYmVkIGhlcmU6CiAgKglodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWxpbnV4LW5ldGRldiZtPTExNjM5ODUwODUwMDU1MyZ3PTIKICAqCkBAIC03NSw2ICs3NSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgpAQCAtMTU4LDEzICsxNTksNzAgQEAKIAlody0+Y21iX3R4X3RpbWVyID0gMTsJLyogYWJvdXQgMnVzICovCiAJaHctPnNtYl90aW1lciA9IDEwMDAwMDsJLyogYWJvdXQgMjAwbXMgKi8KIAotCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDApOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWJfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdTE2IHJlc3VsdDsKKworCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSAmIDB4MWYsICZyZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwKKwlpbnQgdmFsKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYXRsMV93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSwgdmFsKTsKK30KKworLyoKKyAqIGF0bDFfbWlpX2lvY3RsIC0KKyAqIEBuZXRkZXY6CisgKiBAaWZyZXE6CisgKiBAY21kOgorICovCitzdGF0aWMgaW50IGF0bDFfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gZ2VuZXJpY19taWlfaW9jdGwoJmFkYXB0ZXItPm1paSwgaWZfbWlpKGlmciksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGF0bDFfaW9jdGwgLQorICogQG5ldGRldjoKKyAqIEBpZnJlcToKKyAqIEBjbWQ6CisgKi8KK3N0YXRpYyBpbnQgYXRsMV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJY2FzZSBTSU9DR01JSVJFRzoKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlyZXR1cm4gYXRsMV9taWlfaW9jdGwobmV0ZGV2LCBpZnIsIGNtZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKwogLyoKICAqIGF0bDFfc2V0dXBfbWVtX3Jlc291cmNlcyAtIGFsbG9jYXRlIFR4IC8gUlggZGVzY3JpcHRvciByZXNvdXJjZXMKICAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQpAQCAtMTg4LDE5ICsyNDYsMjIgQEAKIAkJZ290byBlcnJfbm9tZW07CiAJfQogCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9Ci0JICAgIChzdHJ1Y3QgYXRsMV9idWZmZXIgKikodHBkX3JpbmctPmJ1ZmZlcl9pbmZvICsgdHBkX3JpbmctPmNvdW50KTsKKwkJKHN0cnVjdCBhdGwxX2J1ZmZlciAqKSh0cGRfcmluZy0+YnVmZmVyX2luZm8gKyB0cGRfcmluZy0+Y291bnQpOwogCi0JLyogcmVhbCByaW5nIERNQSBidWZmZXIgKi8KLQlyaW5nX2hlYWRlci0+c2l6ZSA9IHNpemUgPSBzaXplb2Yoc3RydWN0IHR4X3BhY2tldF9kZXNjKSAqCi0JCQkJCXRwZF9yaW5nLT5jb3VudAotCSAgICArIHNpemVvZihzdHJ1Y3QgcnhfZnJlZV9kZXNjKSAqIHJmZF9yaW5nLT5jb3VudAotCSAgICArIHNpemVvZihzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MpICogcnJkX3JpbmctPmNvdW50Ci0JICAgICsgc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spCi0JICAgICsgc2l6ZW9mKHN0cnVjdCBzdGF0c19tc2dfYmxvY2spCi0JICAgICsgNDA7CQkvKiAiNDA6IGZvciA4IGJ5dGVzIGFsaWduIiBodWg/IC0tIENIUyAqLworCS8qIHJlYWwgcmluZyBETUEgYnVmZmVyCisJICogZWFjaCByaW5nL2Jsb2NrIG1heSBuZWVkIHVwIHRvIDggYnl0ZXMgZm9yIGFsaWdubWVudCwgaGVuY2UgdGhlCisJICogYWRkaXRpb25hbCA0MCBieXRlcyB0YWNrZWQgb250byB0aGUgZW5kLgorCSAqLworCXJpbmdfaGVhZGVyLT5zaXplID0gc2l6ZSA9CisJCXNpemVvZihzdHJ1Y3QgdHhfcGFja2V0X2Rlc2MpICogdHBkX3JpbmctPmNvdW50CisJCSsgc2l6ZW9mKHN0cnVjdCByeF9mcmVlX2Rlc2MpICogcmZkX3JpbmctPmNvdW50CisJCSsgc2l6ZW9mKHN0cnVjdCByeF9yZXR1cm5fZGVzYykgKiBycmRfcmluZy0+Y291bnQKKwkJKyBzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jaykKKwkJKyBzaXplb2Yoc3RydWN0IHN0YXRzX21zZ19ibG9jaykKKwkJKyA0MDsKIAogCXJpbmdfaGVhZGVyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcmluZ19oZWFkZXItPnNpemUsCi0JCQkJCQkmcmluZ19oZWFkZXItPmRtYSk7CisJCSZyaW5nX2hlYWRlci0+ZG1hKTsKIAlpZiAodW5saWtlbHkoIXJpbmdfaGVhZGVyLT5kZXNjKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfYWxsb2NfY29uc2lzdGVudCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9ub21lbTsKQEAgLTIxNCw4ICsyNzUsNiBAQAogCXRwZF9yaW5nLT5kbWEgKz0gb2Zmc2V0OwogCXRwZF9yaW5nLT5kZXNjID0gKHU4ICopIHJpbmdfaGVhZGVyLT5kZXNjICsgb2Zmc2V0OwogCXRwZF9yaW5nLT5zaXplID0gc2l6ZW9mKHN0cnVjdCB0eF9wYWNrZXRfZGVzYykgKiB0cGRfcmluZy0+Y291bnQ7Ci0JYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKLQlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CiAKIAkvKiBpbml0IFJGRCByaW5nICovCiAJcmZkX3JpbmctPmRtYSA9IHRwZF9yaW5nLT5kbWEgKyB0cGRfcmluZy0+c2l6ZTsKQEAgLTIyMyw5ICsyODIsNyBAQAogCXJmZF9yaW5nLT5kbWEgKz0gb2Zmc2V0OwogCXJmZF9yaW5nLT5kZXNjID0gKHU4ICopIHRwZF9yaW5nLT5kZXNjICsgKHRwZF9yaW5nLT5zaXplICsgb2Zmc2V0KTsKIAlyZmRfcmluZy0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhfZnJlZV9kZXNjKSAqIHJmZF9yaW5nLT5jb3VudDsKLQlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7Ci0JLyogcmZkX3JpbmctPm5leHRfdG9fdXNlID0gcmZkX3JpbmctPmNvdW50IC0gMTsgKi8KLQlhdG9taWNfc2V0KCZyZmRfcmluZy0+bmV4dF90b191c2UsIDApOworCiAKIAkvKiBpbml0IFJSRCByaW5nICovCiAJcnJkX3JpbmctPmRtYSA9IHJmZF9yaW5nLT5kbWEgKyByZmRfcmluZy0+c2l6ZTsKQEAgLTIzMywyMyArMjkwLDIyIEBACiAJcnJkX3JpbmctPmRtYSArPSBvZmZzZXQ7CiAJcnJkX3JpbmctPmRlc2MgPSAodTggKikgcmZkX3JpbmctPmRlc2MgKyAocmZkX3JpbmctPnNpemUgKyBvZmZzZXQpOwogCXJyZF9yaW5nLT5zaXplID0gc2l6ZW9mKHN0cnVjdCByeF9yZXR1cm5fZGVzYykgKiBycmRfcmluZy0+Y291bnQ7Ci0JcnJkX3JpbmctPm5leHRfdG9fdXNlID0gMDsKLQlhdG9taWNfc2V0KCZycmRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisKIAogCS8qIGluaXQgQ01CICovCiAJYWRhcHRlci0+Y21iLmRtYSA9IHJyZF9yaW5nLT5kbWEgKyBycmRfcmluZy0+c2l6ZTsKIAlvZmZzZXQgPSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4NykgPyAoOCAtIChhZGFwdGVyLT5jbWIuZG1hICYgMHg3KSkgOiAwOwogCWFkYXB0ZXItPmNtYi5kbWEgKz0gb2Zmc2V0OwotCWFkYXB0ZXItPmNtYi5jbWIgPQotCSAgICAoc3RydWN0IGNvYWxzX21zZ19ibG9jayAqKSAoKHU4ICopIHJyZF9yaW5nLT5kZXNjICsKLQkJCQkgICAocnJkX3JpbmctPnNpemUgKyBvZmZzZXQpKTsKKwlhZGFwdGVyLT5jbWIuY21iID0gKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2sgKikKKwkJKCh1OCAqKSBycmRfcmluZy0+ZGVzYyArIChycmRfcmluZy0+c2l6ZSArIG9mZnNldCkpOwogCiAJLyogaW5pdCBTTUIgKi8KIAlhZGFwdGVyLT5zbWIuZG1hID0gYWRhcHRlci0+Y21iLmRtYSArIHNpemVvZihzdHJ1Y3QgY29hbHNfbXNnX2Jsb2NrKTsKIAlvZmZzZXQgPSAoYWRhcHRlci0+c21iLmRtYSAmIDB4NykgPyAoOCAtIChhZGFwdGVyLT5zbWIuZG1hICYgMHg3KSkgOiAwOwogCWFkYXB0ZXItPnNtYi5kbWEgKz0gb2Zmc2V0OwogCWFkYXB0ZXItPnNtYi5zbWIgPSAoc3RydWN0IHN0YXRzX21zZ19ibG9jayAqKQotCSAgICAoKHU4ICopIGFkYXB0ZXItPmNtYi5jbWIgKyAoc2l6ZW9mKHN0cnVjdCBjb2Fsc19tc2dfYmxvY2spICsgb2Zmc2V0KSk7CisJCSgodTggKikgYWRhcHRlci0+Y21iLmNtYiArCisJCShzaXplb2Yoc3RydWN0IGNvYWxzX21zZ19ibG9jaykgKyBvZmZzZXQpKTsKIAogCXJldHVybiBBVEwxX1NVQ0NFU1M7CiAKQEAgLTI1OCwxNCArMzE0LDY4MiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCit2b2lkIGF0bDFfaW5pdF9yaW5nX3B0cnMoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKworCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworCisJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCWF0b21pY19zZXQoJnJmZF9yaW5nLT5uZXh0X3RvX3VzZSwgMCk7CisKKwlycmRfcmluZy0+bmV4dF90b191c2UgPSAwOworCWF0b21pY19zZXQoJnJyZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKK30KKworLyoKKyAqIGF0bDFfY2xlYW5fcnhfcmluZyAtIEZyZWUgUkZEIEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCBhdGwxX2NsZWFuX3J4X3Jpbmcoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisJc3RydWN0IGF0bDFfcnJkX3JpbmcgKnJyZF9yaW5nID0gJmFkYXB0ZXItPnJyZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCisJZm9yIChpID0gMDsgaSA8IHJmZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnJmZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCQl9CisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiByZmRfcmluZy0+Y291bnQ7CisJbWVtc2V0KHJmZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisJbWVtc2V0KHJmZF9yaW5nLT5kZXNjLCAwLCByZmRfcmluZy0+c2l6ZSk7CisKKwlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisJYXRvbWljX3NldCgmcmZkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKworCXJyZF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJYXRvbWljX3NldCgmcnJkX3JpbmctPm5leHRfdG9fY2xlYW4sIDApOworfQorCisvKgorICogYXRsMV9jbGVhbl90eF9yaW5nIC0gRnJlZSBUeCBCdWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV9jbGVhbl90eF9yaW5nKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOworCXN0cnVjdCBhdGwxX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBUeCByaW5nIHNrX2J1ZmZzICovCisJZm9yIChpID0gMDsgaSA8IHRwZF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJaWYgKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJCXBjaV91bm1hcF9wYWdlKHBkZXYsIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgeworCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmIChidWZmZXJfaW5mby0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShidWZmZXJfaW5mby0+c2tiKTsKKwkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXRsMV9idWZmZXIpICogdHBkX3JpbmctPmNvdW50OworCW1lbXNldCh0cGRfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCW1lbXNldCh0cGRfcmluZy0+ZGVzYywgMCwgdHBkX3JpbmctPnNpemUpOworCisJYXRvbWljX3NldCgmdHBkX3JpbmctPm5leHRfdG9fdXNlLCAwKTsKKwlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7Cit9CisKKy8qCisgKiBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMgLSBGcmVlIFR4IC8gUlggZGVzY3JpcHRvciBSZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcworICovCit2b2lkIGF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7CisJc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOworCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKKwlzdHJ1Y3QgYXRsMV9yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRhcHRlci0+cmluZ19oZWFkZXI7CisKKwlhdGwxX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisJYXRsMV9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCisJa2ZyZWUodHBkX3JpbmctPmJ1ZmZlcl9pbmZvKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJpbmdfaGVhZGVyLT5zaXplLCByaW5nX2hlYWRlci0+ZGVzYywKKwkJcmluZ19oZWFkZXItPmRtYSk7CisKKwl0cGRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOworCXRwZF9yaW5nLT5kZXNjID0gTlVMTDsKKwl0cGRfcmluZy0+ZG1hID0gMDsKKworCXJmZF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CisJcmZkX3JpbmctPmRlc2MgPSBOVUxMOworCXJmZF9yaW5nLT5kbWEgPSAwOworCisJcnJkX3JpbmctPmRlc2MgPSBOVUxMOworCXJyZF9yaW5nLT5kbWEgPSAwOworfQorCitzdGF0aWMgdm9pZCBhdGwxX3NldHVwX21hY19jdHJsKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHZhbHVlOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCS8qIENvbmZpZyBNQUMgQ1RSTCBSZWdpc3RlciAqLworCXZhbHVlID0gTUFDX0NUUkxfVFhfRU4gfCBNQUNfQ1RSTF9SWF9FTjsKKwkvKiBkdXBsZXggKi8KKwlpZiAoRlVMTF9EVVBMRVggPT0gYWRhcHRlci0+bGlua19kdXBsZXgpCisJCXZhbHVlIHw9IE1BQ19DVFJMX0RVUExYOworCS8qIHNwZWVkICovCisJdmFsdWUgfD0gKCh1MzIpICgoU1BFRURfMTAwMCA9PSBhZGFwdGVyLT5saW5rX3NwZWVkKSA/CisJCQkgTUFDX0NUUkxfU1BFRURfMTAwMCA6IE1BQ19DVFJMX1NQRUVEXzEwXzEwMCkgPDwKKwkJICBNQUNfQ1RSTF9TUEVFRF9TSElGVCk7CisJLyogZmxvdyBjb250cm9sICovCisJdmFsdWUgfD0gKE1BQ19DVFJMX1RYX0ZMT1cgfCBNQUNfQ1RSTF9SWF9GTE9XKTsKKwkvKiBQQUQgJiBDUkMgKi8KKwl2YWx1ZSB8PSAoTUFDX0NUUkxfQUREX0NSQyB8IE1BQ19DVFJMX1BBRCk7CisJLyogcHJlYW1ibGUgbGVuZ3RoICovCisJdmFsdWUgfD0gKCgodTMyKSBhZGFwdGVyLT5ody5wcmVhbWJsZV9sZW4KKwkJICAgJiBNQUNfQ1RSTF9QUk1MRU5fTUFTSykgPDwgTUFDX0NUUkxfUFJNTEVOX1NISUZUKTsKKwkvKiB2bGFuICovCisJaWYgKGFkYXB0ZXItPnZsZ3JwKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwkvKiByeCBjaGVja3N1bQorCSAgIGlmIChhZGFwdGVyLT5yeF9jc3VtKQorCSAgIHZhbHVlIHw9IE1BQ19DVFJMX1JYX0NIS1NVTV9FTjsKKwkgKi8KKwkvKiBmaWx0ZXIgbW9kZSAqLworCXZhbHVlIHw9IE1BQ19DVFJMX0JDX0VOOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXZhbHVlIHw9IE1BQ19DVFJMX1BST01JU19FTjsKKwllbHNlIGlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQl2YWx1ZSB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJLyogdmFsdWUgfD0gTUFDX0NUUkxfTE9PUEJBQ0s7ICovCisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7Cit9CisKKy8qCisgKiBhdGwxX3NldF9tYWMgLSBDaGFuZ2UgdGhlIEV0aGVybmV0IEFkZHJlc3Mgb2YgdGhlIE5JQworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHA6IHBvaW50ZXIgdG8gYW4gYWRkcmVzcyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGF0bDFfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisJbWVtY3B5KGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCWF0bDFfc2V0X21hY19hZGRyKCZhZGFwdGVyLT5odyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYXRsMV9jaGVja19saW5rKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJdTMyIHJldF92YWw7CisJdTE2IHNwZWVkLCBkdXBsZXgsIHBoeV9kYXRhOworCWludCByZWNvbmZpZyA9IDA7CisKKwkvKiBNSUlfQk1TUiBtdXN0IHJlYWQgdHdpY2UgKi8KKwlhdGwxX3JlYWRfcGh5X3JlZyhodywgTUlJX0JNU1IsICZwaHlfZGF0YSk7CisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCWlmICghKHBoeV9kYXRhICYgQk1TUl9MU1RBVFVTKSkgewkvKiBsaW5rIGRvd24gKi8KKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBvbGQgbGluayBzdGF0ZTogVXAgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJsaW5rIGlzIGRvd25cbiIpOworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCisJLyogTGluayBVcCAqLworCXJldF92YWwgPSBhdGwxX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwljYXNlIE1FRElBX1RZUEVfMTAwME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMDAgfHwgZHVwbGV4ICE9IEZVTExfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIE1FRElBX1RZUEVfMTAwTV9GVUxMOgorCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gSEFMRl9EVVBMRVgpCisJCQlyZWNvbmZpZyA9IDE7CisJCWJyZWFrOworCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKKwkJCXJlY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNRURJQV9UWVBFXzEwTV9IQUxGOgorCQlpZiAoc3BlZWQgIT0gU1BFRURfMTAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQorCQkJcmVjb25maWcgPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBsaW5rIHJlc3VsdCBpcyBvdXIgc2V0dGluZyAqLworCWlmICghcmVjb25maWcpIHsKKwkJaWYgKGFkYXB0ZXItPmxpbmtfc3BlZWQgIT0gc3BlZWQKKwkJICAgIHx8IGFkYXB0ZXItPmxpbmtfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IHNwZWVkOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSBkdXBsZXg7CisJCQlhdGwxX3NldHVwX21hY19jdHJsKGFkYXB0ZXIpOworCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiJXMgbGluayBpcyB1cCAlZCBNYnBzICVzXG4iLAorCQkJCW5ldGRldi0+bmFtZSwgYWRhcHRlci0+bGlua19zcGVlZCwKKwkJCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCA/CisJCQkJImZ1bGwgZHVwbGV4IiA6ICJoYWxmIGR1cGxleCIpOworCQl9CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIExpbmsgZG93biAtPiBVcCAqLworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQl9CisJCXJldHVybiBBVEwxX1NVQ0NFU1M7CisJfQorCisJLyogY2hhbmdlIG9yaWduYWwgbGluayBzdGF0dXMgKi8KKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJfQorCisJaWYgKGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfQVVUT19TRU5TT1IgJiYKKwkgICAgaHctPm1lZGlhX3R5cGUgIT0gTUVESUFfVFlQRV8xMDAwTV9GVUxMKSB7CisJCXN3aXRjaCAoaHctPm1lZGlhX3R5cGUpIHsKKwkJY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKKwkJCXBoeV9kYXRhID0gTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwMCB8CisJCQkgICAgICAgICAgIE1JSV9DUl9SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIE1FRElBX1RZUEVfMTAwTV9IQUxGOgorCQkJcGh5X2RhdGEgPSBNSUlfQ1JfU1BFRURfMTAwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTUVESUFfVFlQRV8xME1fRlVMTDoKKwkJCXBoeV9kYXRhID0KKwkJCSAgICBNSUlfQ1JfRlVMTF9EVVBMRVggfCBNSUlfQ1JfU1BFRURfMTAgfCBNSUlfQ1JfUkVTRVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogTUVESUFfVFlQRV8xME1fSEFMRjogKi8KKwkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOworCQkJYnJlYWs7CisJCX0KKwkJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQk1DUiwgcGh5X2RhdGEpOworCQlyZXR1cm4gQVRMMV9TVUNDRVNTOworCX0KKworCS8qIGF1dG8tbmVnLCBpbnNlcnQgdGltZXIgdG8gcmUtY29uZmlnIHBoeSAqLworCWlmICghYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcpIHsKKwkJYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcgPSB0cnVlOworCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9jb25maWdfdGltZXIsIGppZmZpZXMgKyAzICogSFopOworCX0KKworCXJldHVybiBBVEwxX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXUxNiBwaHlfZGF0YSA9IDA7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPmxvY2spOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJYXRsMV9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKKwlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5sb2NrKTsKKworCS8qIG5vdGlmeSB1cHBlciBsYXllciBsaW5rIGRvd24gQVNBUCAqLworCWlmICghKHBoeV9kYXRhICYgQk1TUl9MU1RBVFVTKSkgewkvKiBMaW5rIERvd24gKi8KKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBvbGQgbGluayBzdGF0ZTogVXAgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlcyBsaW5rIGlzIGRvd25cbiIsCisJCQkJbmV0ZGV2LT5uYW1lKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOworCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJfQorCX0KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5saW5rX2NoZ190YXNrKTsKK30KKworLyoKKyAqIGF0bDFfc2V0X211bHRpIC0gTXVsdGljYXN0IGFuZCBQcm9taXNjdW91cyBtb2RlIHNldAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoZSBzZXRfbXVsdGkgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtdWx0aWNhc3QgYWRkcmVzcworICogbGlzdCBvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgZmxhZ3MgYXJlIHVwZGF0ZWQuICBUaGlzIHJvdXRpbmUgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgZm9yIHByb3BlciBtdWx0aWNhc3QsCisgKiBwcm9taXNjdW91cyBtb2RlLCBhbmQgYWxsLW11bHRpIGJlaGF2aW9yLgorICovCitzdGF0aWMgdm9pZCBhdGwxX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKKwl1MzIgcmN0bDsKKwl1MzIgaGFzaF92YWx1ZTsKKworCS8qIENoZWNrIGZvciBQcm9taXNjdW91cyBhbmQgQWxsIE11bHRpY2FzdCBtb2RlcyAqLworCXJjdGwgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJcmN0bCB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47CisJZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlyY3RsIHw9IE1BQ19DVFJMX01DX0FMTF9FTjsKKwkJcmN0bCAmPSB+TUFDX0NUUkxfUFJPTUlTX0VOOworCX0gZWxzZQorCQlyY3RsICY9IH4oTUFDX0NUUkxfUFJPTUlTX0VOIHwgTUFDX0NUUkxfTUNfQUxMX0VOKTsKKworCWlvd3JpdGUzMihyY3RsLCBody0+aHdfYWRkciArIFJFR19NQUNfQ1RSTCk7CisKKwkvKiBjbGVhciB0aGUgb2xkIHNldHRpbmdzIGZyb20gdGhlIG11bHRpY2FzdCBoYXNoIHRhYmxlICovCisJaW93cml0ZTMyKDAsIGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpOworCWlvd3JpdGUzMigwLCAoaHctPmh3X2FkZHIgKyBSRUdfUlhfSEFTSF9UQUJMRSkgKyAoMSA8PCAyKSk7CisKKwkvKiBjb21wdXRlIG1jIGFkZHJlc3NlcycgaGFzaCB2YWx1ZSAsYW5kIHB1dCBpdCBpbnRvIGhhc2ggdGFibGUgKi8KKwlmb3IgKG1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsgbWNfcHRyOyBtY19wdHIgPSBtY19wdHItPm5leHQpIHsKKwkJaGFzaF92YWx1ZSA9IGF0bDFfaGFzaF9tY19hZGRyKGh3LCBtY19wdHItPmRtaV9hZGRyKTsKKwkJYXRsMV9oYXNoX3NldChodywgaGFzaF92YWx1ZSk7CisJfQorfQorCisvKgorICogYXRsMV9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfbXR1OiBuZXcgdmFsdWUgZm9yIG1heGltdW0gZnJhbWUgc2l6ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYXRsMV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBvbGRfbXR1ID0gbmV0ZGV2LT5tdHU7CisJaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CisKKwlpZiAoKG1heF9mcmFtZSA8IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgfHwKKwkgICAgKG1heF9mcmFtZSA+IE1BWF9KVU1CT19GUkFNRV9TSVpFKSkgeworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiaW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPmh3Lm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOworCWFkYXB0ZXItPmh3LnR4X2p1bWJvX3Rhc2tfdGggPSAobWF4X2ZyYW1lICsgNykgPj4gMzsKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gKG1heF9mcmFtZSArIDcpICYgfjc7CisJYWRhcHRlci0+aHcucnhfanVtYm9fdGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuIC8gODsKKworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlpZiAoKG9sZF9tdHUgIT0gbmV3X210dSkgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWF0bDFfZG93bihhZGFwdGVyKTsKKwkJYXRsMV91cChhZGFwdGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2Zsb3dfY3RybF9vbGQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgaGksIGxvLCB2YWx1ZTsKKworCS8qIFJGRCBGbG93IENvbnRyb2wgKi8KKwl2YWx1ZSA9IGFkYXB0ZXItPnJmZF9yaW5nLmNvdW50OworCWhpID0gdmFsdWUgLyAxNjsKKwlpZiAoaGkgPCAyKQorCQloaSA9IDI7CisJbG8gPSB2YWx1ZSAqIDcgLyA4OworCisJdmFsdWUgPSAoKGhpICYgUlhRX1JYRl9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0hJX1NISUZUKSB8CisJCSgobG8gJiBSWFFfUlhGX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfTE9fU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSCk7CisKKwkvKiBSUkQgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBhZGFwdGVyLT5ycmRfcmluZy5jb3VudDsKKwlsbyA9IHZhbHVlIC8gMTY7CisJaGkgPSB2YWx1ZSAqIDcgLyA4OworCWlmIChsbyA8IDIpCisJCWxvID0gMjsKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlJEX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkJKChsbyAmIFJYUV9SUkRfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNIKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Zsb3dfY3RybF9uZXcoc3RydWN0IGF0bDFfaHcgKmh3KQoreworCXUzMiBoaSwgbG8sIHZhbHVlOworCisJLyogUlhGIEZsb3cgQ29udHJvbCAqLworCXZhbHVlID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfU1JBTV9SWEZfTEVOKTsKKwlsbyA9IHZhbHVlIC8gMTY7CisJaWYgKGxvIDwgMTkyKQorCQlsbyA9IDE5MjsKKwloaSA9IHZhbHVlICogNyAvIDg7CisJaWYgKGhpIDwgbG8pCisJCWhpID0gbG8gKyAxNjsKKwl2YWx1ZSA9ICgoaGkgJiBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKKwkJKChsbyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfUlhGX1BBVVNFX1RIUkVTSCk7CisKKwkvKiBSUkQgRmxvdyBDb250cm9sICovCisJdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUkFNX1JSRF9MRU4pOworCWxvID0gdmFsdWUgLyA4OworCWhpID0gdmFsdWUgKiA3IC8gODsKKwlpZiAobG8gPCAyKQorCQlsbyA9IDI7CisJaWYgKGhpIDwgbG8pCisJCWhpID0gbG8gKyAzOworCXZhbHVlID0gKChoaSAmIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9ISV9TSElGVCkgfAorCQkoKGxvICYgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9SUkRfUEFVU0VfVEhSRVNIKTsKK30KKworLyoKKyAqIGF0bDFfY29uZmlndXJlIC0gQ29uZmlndXJlIFRyYW5zbWl0JlJlY2VpdmUgVW5pdCBhZnRlciBSZXNldAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSBUeCAvUnggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCisgKi8KK3N0YXRpYyB1MzIgYXRsMV9jb25maWd1cmUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTMyIHZhbHVlOworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCWlvd3JpdGUzMigweGZmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisKKwkvKiBzZXQgTUFDIEFkZHJlc3MgKi8KKwl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzJdKSA8PCAyNCkgfAorCQkoKCh1MzIpIGh3LT5tYWNfYWRkclszXSkgPDwgMTYpIHwKKwkJKCgodTMyKSBody0+bWFjX2FkZHJbNF0pIDw8IDgpIHwKKwkJKCgodTMyKSBody0+bWFjX2FkZHJbNV0pKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19TVEFfQUREUik7CisJdmFsdWUgPSAoKCh1MzIpIGh3LT5tYWNfYWRkclswXSkgPDwgOCkgfCAoKCh1MzIpIGh3LT5tYWNfYWRkclsxXSkpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyAoUkVHX01BQ19TVEFfQUREUiArIDQpKTsKKworCS8qIHR4IC8gcnggcmluZyAqLworCisJLyogSEkgYmFzZSBhZGRyZXNzICovCisJaW93cml0ZTMyKCh1MzIpICgoYWRhcHRlci0+dHBkX3JpbmcuZG1hICYgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSA+PiAzMiksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfQkFTRV9BRERSX0hJKTsKKwkvKiBMTyBiYXNlIGFkZHJlc3MgKi8KKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnJmZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCisJCWh3LT5od19hZGRyICsgUkVHX0RFU0NfUkZEX0FERFJfTE8pOworCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+cnJkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKKwkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SUkRfQUREUl9MTyk7CisJaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT50cGRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1RQRF9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPmNtYi5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX0NNQl9BRERSX0xPKTsKKwlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnNtYi5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAorCQlody0+aHdfYWRkciArIFJFR19ERVNDX1NNQl9BRERSX0xPKTsKKworCS8qIGVsZW1lbnQgY291bnQgKi8KKwl2YWx1ZSA9IGFkYXB0ZXItPnJyZF9yaW5nLmNvdW50OworCXZhbHVlIDw8PSAxNjsKKwl2YWx1ZSArPSBhZGFwdGVyLT5yZmRfcmluZy5jb3VudDsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0RFU0NfUkZEX1JSRF9SSU5HX1NJWkUpOworCWlvd3JpdGUzMihhZGFwdGVyLT50cGRfcmluZy5jb3VudCwgaHctPmh3X2FkZHIgKworCQlSRUdfREVTQ19UUERfUklOR19TSVpFKTsKKworCS8qIExvYWQgUHRyICovCisJaW93cml0ZTMyKDEsIGh3LT5od19hZGRyICsgUkVHX0xPQURfUFRSKTsKKworCS8qIGNvbmZpZyBNYWlsYm94ICovCisJdmFsdWUgPSAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSkKKwkJICAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwgTUJfVFBEX1BST0RfSU5EWF9TSElGVCkgfAorCQkoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKQorCQkmIE1CX1JSRF9DT05TX0lORFhfTUFTSykgPDwgTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorCQkoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSkKKwkJJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8IE1CX1JGRF9QUk9EX0lORFhfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7CisKKwkvKiBjb25maWcgSVBHL0lGRyAqLworCXZhbHVlID0gKCgodTMyKSBody0+aXBndCAmIE1BQ19JUEdfSUZHX0lQR1RfTUFTSykKKwkJIDw8IE1BQ19JUEdfSUZHX0lQR1RfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+bWluX2lmZyAmIE1BQ19JUEdfSUZHX01JRkdfTUFTSykKKwkJPDwgTUFDX0lQR19JRkdfTUlGR19TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5pcGdyMSAmIE1BQ19JUEdfSUZHX0lQR1IxX01BU0spCisJCTw8IE1BQ19JUEdfSUZHX0lQR1IxX1NISUZUKSB8CisJCSgoKHUzMikgaHctPmlwZ3IyICYgTUFDX0lQR19JRkdfSVBHUjJfTUFTSykKKwkJPDwgTUFDX0lQR19JRkdfSVBHUjJfU0hJRlQpOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0lQR19JRkcpOworCisJLyogY29uZmlnICBIYWxmLUR1cGxleCBDb250cm9sICovCisJdmFsdWUgPSAoKHUzMikgaHctPmxjb2wgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0xDT0xfTUFTSykgfAorCQkoKCh1MzIpIGh3LT5tYXhfcmV0cnkgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0spCisJCTw8IE1BQ19IQUxGX0RVUExYX0NUUkxfUkVUUllfU0hJRlQpIHwKKwkJTUFDX0hBTEZfRFVQTFhfQ1RSTF9FWENfREVGX0VOIHwKKwkJKDB4YSA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX0FCRUJUX1NISUZUKSB8CisJCSgoKHUzMikgaHctPmphbV9pcGcgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19NQVNLKQorCQk8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX0pBTUlQR19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19NQUNfSEFMRl9EVVBMWF9DVFJMKTsKKworCS8qIHNldCBJbnRlcnJ1cHQgTW9kZXJhdG9yIFRpbWVyICovCisJaW93cml0ZTE2KGFkYXB0ZXItPmltdCwgaHctPmh3X2FkZHIgKyBSRUdfSVJRX01PRFVfVElNRVJfSU5JVCk7CisJaW93cml0ZTMyKE1BU1RFUl9DVFJMX0lUSU1FUl9FTiwgaHctPmh3X2FkZHIgKyBSRUdfTUFTVEVSX0NUUkwpOworCisJLyogc2V0IEludGVycnVwdCBDbGVhciBUaW1lciAqLworCWlvd3JpdGUxNihhZGFwdGVyLT5pY3QsIGh3LT5od19hZGRyICsgUkVHX0NNQkRJU0RNQV9USU1FUik7CisKKwkvKiBzZXQgTVRVLCA0IDogVkxBTiAqLworCWlvd3JpdGUzMihody0+bWF4X2ZyYW1lX3NpemUgKyA0LCBody0+aHdfYWRkciArIFJFR19NVFUpOworCisJLyoganVtYm8gc2l6ZSAmIHJyZCByZXRpcmVtZW50IHRpbWVyICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT5yeF9qdW1ib190aCAmIFJYUV9KTUJPU1pfVEhfTUFTSykKKwkJIDw8IFJYUV9KTUJPU1pfVEhfU0hJRlQpIHwKKwkJKCgodTMyKSBody0+cnhfanVtYm9fbGthaCAmIFJYUV9KTUJPX0xLQUhfTUFTSykKKwkJPDwgUlhRX0pNQk9fTEtBSF9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5ycmRfcmV0X3RpbWVyICYgUlhRX1JSRF9USU1FUl9NQVNLKQorCQk8PCBSWFFfUlJEX1RJTUVSX1NISUZUKTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9KTUJPU1pfUlJEVElNKTsKKworCS8qIEZsb3cgQ29udHJvbCAqLworCXN3aXRjaCAoaHctPmRldl9yZXYpIHsKKwljYXNlIDB4ODAwMToKKwljYXNlIDB4OTAwMToKKwljYXNlIDB4OTAwMjoKKwljYXNlIDB4OTAwMzoKKwkJc2V0X2Zsb3dfY3RybF9vbGQoYWRhcHRlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNldF9mbG93X2N0cmxfbmV3KGh3KTsKKwkJYnJlYWs7CisJfQorCisJLyogY29uZmlnIFRYUSAqLworCXZhbHVlID0gKCgodTMyKSBody0+dHBkX2J1cnN0ICYgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9NQVNLKQorCQkgPDwgVFhRX0NUUkxfVFBEX0JVUlNUX05VTV9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT50eGZfYnVyc3QgJiBUWFFfQ1RSTF9UWEZfQlVSU1RfTlVNX01BU0spCisJCTw8IFRYUV9DVFJMX1RYRl9CVVJTVF9OVU1fU0hJRlQpIHwKKwkJKCgodTMyKSBody0+dHBkX2ZldGNoX3RoICYgVFhRX0NUUkxfVFBEX0ZFVENIX1RIX01BU0spCisJCTw8IFRYUV9DVFJMX1RQRF9GRVRDSF9USF9TSElGVCkgfCBUWFFfQ1RSTF9FTkhfTU9ERSB8CisJCVRYUV9DVFJMX0VOOworCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhRX0NUUkwpOworCisJLyogbWluIHRwZCBmZXRjaCBnYXAgJiB0eCBqdW1ibyBwYWNrZXQgc2l6ZSB0aHJlc2hvbGQgZm9yIHRhc2tvZmZsb2FkICovCisJdmFsdWUgPSAoKCh1MzIpIGh3LT50eF9qdW1ib190YXNrX3RoICYgVFhfSlVNQk9fVEFTS19USF9NQVNLKQorCQk8PCBUWF9KVU1CT19UQVNLX1RIX1NISUZUKSB8CisJCSgoKHUzMikgaHctPnRwZF9mZXRjaF9nYXAgJiBUWF9UUERfTUlOX0lQR19NQVNLKQorCQk8PCBUWF9UUERfTUlOX0lQR19TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19UWF9KVU1CT19UQVNLX1RIX1RQRF9JUEcpOworCisJLyogY29uZmlnIFJYUSAqLworCXZhbHVlID0gKCgodTMyKSBody0+cmZkX2J1cnN0ICYgUlhRX0NUUkxfUkZEX0JVUlNUX05VTV9NQVNLKQorCQk8PCBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX1NISUZUKSB8CisJCSgoKHUzMikgaHctPnJyZF9idXJzdCAmIFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfTUFTSykKKwkJPDwgUlhRX0NUUkxfUlJEX0JVUlNUX1RIUkVTSF9TSElGVCkgfAorCQkoKCh1MzIpIGh3LT5yZmRfZmV0Y2hfZ2FwICYgUlhRX0NUUkxfUkZEX1BSRUZfTUlOX0lQR19NQVNLKQorCQk8PCBSWFFfQ1RSTF9SRkRfUFJFRl9NSU5fSVBHX1NISUZUKSB8IFJYUV9DVFJMX0NVVF9USFJVX0VOIHwKKwkJUlhRX0NUUkxfRU47CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfQ1RSTCk7CisKKwkvKiBjb25maWcgRE1BIEVuZ2luZSAqLworCXZhbHVlID0gKCgoKHUzMikgaHctPmRtYXJfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwKKwkJKCgoKHUzMikgaHctPmRtYXdfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKKwkJPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwgRE1BX0NUUkxfRE1BUl9FTiB8CisJCURNQV9DVFJMX0RNQVdfRU47CisJdmFsdWUgfD0gKHUzMikgaHctPmRtYV9vcmQ7CisJaWYgKGF0bDFfcmNiXzEyOCA9PSBody0+cmNiX3ZhbHVlKQorCQl2YWx1ZSB8PSBETUFfQ1RSTF9SQ0JfVkFMVUU7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19ETUFfQ1RSTCk7CisKKwkvKiBjb25maWcgQ01CIC8gU01CICovCisJdmFsdWUgPSBody0+Y21iX3JyZCB8ICgodTMyKSBody0+Y21iX3RwZCA8PCAxNik7CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVEgpOworCXZhbHVlID0gaHctPmNtYl9yeF90aW1lciB8ICgodTMyKSBody0+Y21iX3R4X3RpbWVyIDw8IDE2KTsKKwlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX0NNQl9XUklURV9USU1FUik7CisJaW93cml0ZTMyKGh3LT5zbWJfdGltZXIsIGh3LT5od19hZGRyICsgUkVHX1NNQl9USU1FUik7CisKKwkvKiAtLS0gZW5hYmxlIENNQiAvIFNNQiAqLworCXZhbHVlID0gQ1NNQl9DVFJMX0NNQl9FTiB8IENTTUJfQ1RSTF9TTUJfRU47CisJaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DU01CX0NUUkwpOworCisJdmFsdWUgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7CisJaWYgKHVubGlrZWx5KCh2YWx1ZSAmIElTUl9QSFlfTElOS0RPV04pICE9IDApKQorCQl2YWx1ZSA9IDE7CS8qIGNvbmZpZyBmYWlsZWQgKi8KKwllbHNlCisJCXZhbHVlID0gMDsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisJaW93cml0ZTMyKDB4M2ZmZmZmZmYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIGF0bDFfcGNpZV9wYXRjaCAtIFBhdGNoIGZvciBQQ0lFIG1vZHVsZQorICovCitzdGF0aWMgdm9pZCBhdGwxX3BjaWVfcGF0Y2goc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgdmFsdWU7CisKKwkvKiBtdWNoIHZlbmRvciBtYWdpYyBoZXJlICovCisJdmFsdWUgPSAweDY1MDA7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgMHgxMkZDKTsKKwkvKiBwY2llIGZsb3cgY29udHJvbCBtb2RlIGNoYW5nZSAqLworCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTAwOCk7CisJdmFsdWUgfD0gMHg4MDAwOworCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTAwOCk7Cit9CisKKy8qCisgKiBXaGVuIEFDUEkgcmVzdW1lIG9uIHNvbWUgVklBIE1vdGhlckJvYXJkLCB0aGUgSW50ZXJydXB0IERpc2FibGUgYml0LzB4NDAwCisgKiBvbiBQQ0kgQ29tbWFuZCByZWdpc3RlciBpcyBkaXNhYmxlLgorICogVGhlIGZ1bmN0aW9uIGVuYWJsZSB0aGlzIGJpdC4KKyAqIEJyYWNrZXR0LCAyMDA2LzAzLzE1CisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfdmlhX3dvcmthcm91bmQoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJdmFsdWUgPSBpb3JlYWQxNihhZGFwdGVyLT5ody5od19hZGRyICsgUENJX0NPTU1BTkQpOworCWlmICh2YWx1ZSAmIFBDSV9DT01NQU5EX0lOVFhfRElTQUJMRSkKKwkJdmFsdWUgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKKwlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBQQ0lfQ09NTUFORCk7Cit9CisKIC8qCiAgKiBhdGwxX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncwogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKi8KIHN0YXRpYyB2b2lkIGF0bDFfaXJxX2VuYWJsZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmIChsaWtlbHkoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmFkYXB0ZXItPmlycV9zZW0pKSkKLQkJaW93cml0ZTMyKElNUl9OT1JNQUxfTUFTSywgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCWlvd3JpdGUzMihJTVJfTk9STUFMX01BU0ssIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lNUik7Cit9CisKKy8qCisgKiBhdGwxX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0bDFfaXJxX2Rpc2FibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCWlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKKwlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKIH0KIAogc3RhdGljIHZvaWQgYXRsMV9jbGVhcl9waHlfaW50KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0yODgsMjUgKzEwMTIsMTkgQEAKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2J5dGVzICs9IHNtYi0+cnhfYnl0ZV9jbnQ7CiAJYWRhcHRlci0+c29mdF9zdGF0cy50eF9ieXRlcyArPSBzbWItPnR4X2J5dGVfY250OwogCWFkYXB0ZXItPnNvZnRfc3RhdHMubXVsdGljYXN0ICs9IHNtYi0+cnhfbWNhc3Q7Ci0JYWRhcHRlci0+c29mdF9zdGF0cy5jb2xsaXNpb25zICs9IChzbWItPnR4XzFfY29sICsKLQkJCQkJICAgc21iLT50eF8yX2NvbCAqIDIgKwotCQkJCQkgICBzbWItPnR4X2xhdGVfY29sICsKLQkJCQkJICAgc21iLT50eF9hYm9ydF9jb2wgKgotCQkJCQkgICBhZGFwdGVyLT5ody5tYXhfcmV0cnkpOworCWFkYXB0ZXItPnNvZnRfc3RhdHMuY29sbGlzaW9ucyArPSAoc21iLT50eF8xX2NvbCArIHNtYi0+dHhfMl9jb2wgKiAyICsKKwkJc21iLT50eF9sYXRlX2NvbCArIHNtYi0+dHhfYWJvcnRfY29sICogYWRhcHRlci0+aHcubWF4X3JldHJ5KTsKIAogCS8qIFJ4IEVycm9ycyAqLwotCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZXJyb3JzICs9IChzbWItPnJ4X2ZyYWcgKwotCQkJCQkgIHNtYi0+cnhfZmNzX2VyciArCi0JCQkJCSAgc21iLT5yeF9sZW5fZXJyICsKLQkJCQkJICBzbWItPnJ4X3N6X292ICsKLQkJCQkJICBzbWItPnJ4X3J4Zl9vdiArCi0JCQkJCSAgc21iLT5yeF9ycmRfb3YgKyBzbWItPnJ4X2FsaWduX2Vycik7CisJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9lcnJvcnMgKz0gKHNtYi0+cnhfZnJhZyArIHNtYi0+cnhfZmNzX2VyciArCisJCXNtYi0+cnhfbGVuX2VyciArIHNtYi0+cnhfc3pfb3YgKyBzbWItPnJ4X3J4Zl9vdiArCisJCXNtYi0+cnhfcnJkX292ICsgc21iLT5yeF9hbGlnbl9lcnIpOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZmlmb19lcnJvcnMgKz0gc21iLT5yeF9yeGZfb3Y7CiAJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IHNtYi0+cnhfbGVuX2VycjsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2NyY19lcnJvcnMgKz0gc21iLT5yeF9mY3NfZXJyOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IHNtYi0+cnhfYWxpZ25fZXJyOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc21iLT5yeF9ycmRfb3YgKwotCQkJCQkJIHNtYi0+cnhfcnhmX292KTsKKwkJc21iLT5yeF9yeGZfb3YpOwogCiAJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9wYXVzZSArPSBzbWItPnJ4X3BhdXNlOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfcnJkX292ICs9IHNtYi0+cnhfcnJkX292OwpAQCAtMzE0LDggKzEwMzIsNyBAQAogCiAJLyogVHggRXJyb3JzICovCiAJYWRhcHRlci0+c29mdF9zdGF0cy50eF9lcnJvcnMgKz0gKHNtYi0+dHhfbGF0ZV9jb2wgKwotCQkJCQkgIHNtYi0+dHhfYWJvcnRfY29sICsKLQkJCQkJICBzbWItPnR4X3VuZGVycnVuICsgc21iLT50eF90cnVuYyk7CisJCXNtYi0+dHhfYWJvcnRfY29sICsgc21iLT50eF91bmRlcnJ1biArIHNtYi0+dHhfdHJ1bmMpOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfZmlmb19lcnJvcnMgKz0gc21iLT50eF91bmRlcnJ1bjsKIAlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHNtYi0+dHhfYWJvcnRfY29sOwogCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9ycyArPSBzbWItPnR4X2xhdGVfY29sOwpAQCAtMzM3LDM2ICsxMDU0LDEwMSBAQAogCWFkYXB0ZXItPm5ldF9zdGF0cy5jb2xsaXNpb25zID0gYWRhcHRlci0+c29mdF9zdGF0cy5jb2xsaXNpb25zOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9Ci0JICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9jcmNfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9mcmFtZV9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gYWRhcHRlci0+c29mdF9zdGF0cy5yeF9maWZvX2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9Ci0JICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMucnhfbWlzc2VkX2Vycm9yczsKKwkJYWRhcHRlci0+c29mdF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnMgPSBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzOwogCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9Ci0JICAgIGFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CiAJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnM7CisJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfd2luZG93X2Vycm9yczsKIAlhZGFwdGVyLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPQotCSAgICBhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworfQorCisvKgorICogYXRsMV9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF0bDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGF0bDFfdXBkYXRlX21haWxib3goc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0cGRfbmV4dF90b191c2U7CisJdTMyIHJmZF9uZXh0X3RvX3VzZTsKKwl1MzIgcnJkX25leHRfdG9fY2xlYW47CisJdTMyIHZhbHVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKKworCXRwZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT50cGRfcmluZy5uZXh0X3RvX3VzZSk7CisJcmZkX25leHRfdG9fdXNlID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJmZF9yaW5nLm5leHRfdG9fdXNlKTsKKwlycmRfbmV4dF90b19jbGVhbiA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5ycmRfcmluZy5uZXh0X3RvX2NsZWFuKTsKKworCXZhbHVlID0gKChyZmRfbmV4dF90b191c2UgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8CisJCU1CX1JGRF9QUk9EX0lORFhfU0hJRlQpIHwKKwkJKChycmRfbmV4dF90b19jbGVhbiAmIE1CX1JSRF9DT05TX0lORFhfTUFTSykgPDwKKwkJTUJfUlJEX0NPTlNfSU5EWF9TSElGVCkgfAorCQkoKHRwZF9uZXh0X3RvX3VzZSAmIE1CX1RQRF9QUk9EX0lORFhfTUFTSykgPDwKKwkJTUJfVFBEX1BST0RfSU5EWF9TSElGVCk7CisJaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BSUxCT1gpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWJfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhdGwxX2NsZWFuX2FsbG9jX2ZsYWcoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwKKwlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCwgdTE2IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXRsMV9yZmRfcmluZyAqcmZkX3JpbmcgPSAmYWRhcHRlci0+cmZkX3Jpbmc7CisKKwl3aGlsZSAocmZkX3JpbmctPm5leHRfdG9fY2xlYW4gIT0gKHJyZC0+YnVmX2luZHggKyBvZmZzZXQpKSB7CisJCXJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfcmluZy0+bmV4dF90b19jbGVhbl0uYWxsb2NlZCA9IDA7CisJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09IHJmZF9yaW5nLT5jb3VudCkgeworCQkJcmZkX3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhdGwxX3VwZGF0ZV9yZmRfaW5kZXgoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwKKwlzdHJ1Y3QgcnhfcmV0dXJuX2Rlc2MgKnJyZCkKK3sKKwl1MTYgbnVtX2J1ZjsKKworCW51bV9idWYgPSAocnJkLT54c3oueHN1bV9zei5wa3Rfc2l6ZSArIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLSAxKSAvCisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJaWYgKHJyZC0+bnVtX2J1ZiA9PSBudW1fYnVmKQorCQkvKiBjbGVhbiBhbGxvYyBmbGFnIGZvciBiYWQgcnJkICovCisJCWF0bDFfY2xlYW5fYWxsb2NfZmxhZyhhZGFwdGVyLCBycmQsIG51bV9idWYpOwogfQogCiBzdGF0aWMgdm9pZCBhdGwxX3J4X2NoZWNrc3VtKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCXN0cnVjdCByeF9yZXR1cm5fZGVzYyAqcnJkLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCXN0cnVjdCByeF9yZXR1cm5fZGVzYyAqcnJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAogCWlmICh1bmxpa2VseShycmQtPnBrdF9mbGcgJiBQQUNLRVRfRkxBR19FUlIpKSB7CiAJCWlmIChycmQtPmVycl9mbGcgJiAoRVJSX0ZMQUdfQ1JDIHwgRVJSX0ZMQUdfVFJVTkMgfAogCQkJCQlFUlJfRkxBR19DT0RFIHwgRVJSX0ZMQUdfT1YpKSB7CiAJCQlhZGFwdGVyLT5od19jc3VtX2VycisrOwotCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LCAicnggY2hlY2tzdW0gZXJyb3JcbiIpOworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAorCQkJCSJyeCBjaGVja3N1bSBlcnJvclxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0zODUsNyArMTE2Nyw3IEBACiAJfQogCiAJLyogSVB2NCwgYnV0IGhhcmR3YXJlIHRoaW5rcyBpdHMgY2hlY2tzdW0gaXMgd3JvbmcgKi8KLQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAogCQkiaHcgY3N1bSB3cm9uZywgcGt0X2ZsYWc6JXgsIGVycl9mbGFnOiV4XG4iLAogCQlycmQtPnBrdF9mbGcsIHJyZC0+ZXJyX2ZsZyk7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKQEAgLTUwMCwzNCArMTI4MiwxNyBAQAogCQkJLyogcnJkIHNlZW1zIHRvIGJlIGJhZCAqLwogCQkJaWYgKHVubGlrZWx5KGktLSA+IDApKSB7CiAJCQkJLyogcnJkIG1heSBub3QgYmUgRE1BZWQgY29tcGxldGVseSAqLwotCQkJCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJCSJpbmNvbXBsZXRlIFJSRCBETUEgdHJhbnNmZXJcbiIpOwogCQkJCXVkZWxheSgxKTsKIAkJCQlnb3RvIGNoa19ycmQ7CiAJCQl9CiAJCQkvKiBiYWQgcnJkICovCi0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJiYWQgUlJEXG4iKTsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiYmFkIFJSRFxuIik7CiAJCQkvKiBzZWUgaWYgdXBkYXRlIFJGRCBpbmRleCAqLwotCQkJaWYgKHJyZC0+bnVtX2J1ZiA+IDEpIHsKLQkJCQl1MTYgbnVtX2J1ZjsKLQkJCQludW1fYnVmID0KLQkJCQkgICAgKHJyZC0+eHN6LnhzdW1fc3oucGt0X3NpemUgKwotCQkJCSAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiAtCi0JCQkJICAgICAxKSAvIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47Ci0JCQkJaWYgKHJyZC0+bnVtX2J1ZiA9PSBudW1fYnVmKSB7Ci0JCQkJCS8qIGNsZWFuIGFsbG9jIGZsYWcgZm9yIGJhZCBycmQgKi8KLQkJCQkJd2hpbGUgKHJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuICE9Ci0JCQkJCSAgICAgICAocnJkLT5idWZfaW5keCArIG51bV9idWYpKSB7Ci0JCQkJCQlyZmRfcmluZy0+YnVmZmVyX2luZm9bcmZkX3JpbmctPgotCQkJCQkJCQkgICAgICBuZXh0X3RvX2NsZWFuXS5hbGxvY2VkID0gMDsKLQkJCQkJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09Ci0JCQkJCQkgICAgcmZkX3JpbmctPmNvdW50KSB7Ci0JCQkJCQkJcmZkX3JpbmctPgotCQkJCQkJCSAgICBuZXh0X3RvX2NsZWFuID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KKwkJCWlmIChycmQtPm51bV9idWYgPiAxKQorCQkJCWF0bDFfdXBkYXRlX3JmZF9pbmRleChhZGFwdGVyLCBycmQpOwogCiAJCQkvKiB1cGRhdGUgcnJkICovCiAJCQlycmQtPnhzei52YWxpZCA9IDA7CkBAIC01NDEsMTIgKzEzMDYsNyBAQAogCQl9CiBycmRfb2s6CiAJCS8qIGNsZWFuIGFsbG9jIGZsYWcgZm9yIGJhZCBycmQgKi8KLQkJd2hpbGUgKHJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuICE9IHJyZC0+YnVmX2luZHgpIHsKLQkJCXJmZF9yaW5nLT5idWZmZXJfaW5mb1tyZmRfcmluZy0+bmV4dF90b19jbGVhbl0uYWxsb2NlZCA9Ci0JCQkgICAgMDsKLQkJCWlmICgrK3JmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID09IHJmZF9yaW5nLT5jb3VudCkKLQkJCQlyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7Ci0JCX0KKwkJYXRsMV9jbGVhbl9hbGxvY19mbGFnKGFkYXB0ZXIsIHJyZCwgMCk7CiAKIAkJYnVmZmVyX2luZm8gPSAmcmZkX3JpbmctPmJ1ZmZlcl9pbmZvW3JyZC0+YnVmX2luZHhdOwogCQlpZiAoKytyZmRfcmluZy0+bmV4dF90b19jbGVhbiA9PSByZmRfcmluZy0+Y291bnQpCkBAIC02NjIsNTgwICsxNDIyLDEzIEBACiAJCW5ldGlmX3dha2VfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgYXRsMV9jaGVja19mb3JfbGluayhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JdTE2IHBoeV9kYXRhID0gMDsKLQotCXNwaW5fbG9jaygmYWRhcHRlci0+bG9jayk7Ci0JYWRhcHRlci0+cGh5X3RpbWVyX3BlbmRpbmcgPSBmYWxzZTsKLQlhdGwxX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOwotCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTUlJX0JNU1IsICZwaHlfZGF0YSk7Ci0Jc3Bpbl91bmxvY2soJmFkYXB0ZXItPmxvY2spOwotCi0JLyogbm90aWZ5IHVwcGVyIGxheWVyIGxpbmsgZG93biBBU0FQICovCi0JaWYgKCEocGh5X2RhdGEgJiBCTVNSX0xTVEFUVVMpKSB7CS8qIExpbmsgRG93biAqLwotCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CS8qIG9sZCBsaW5rIHN0YXRlOiBVcCAqLwotCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzIGxpbmsgaXMgZG93blxuIiwKLQkJCQluZXRkZXYtPm5hbWUpOwotCQkJYWRhcHRlci0+bGlua19zcGVlZCA9IFNQRUVEXzA7Ci0JCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCQl9Ci0JfQotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPmxpbmtfY2hnX3Rhc2spOwotfQotCi0vKgotICogYXRsMV9pbnRyIC0gSW50ZXJydXB0IEhhbmRsZXIKLSAqIEBpcnE6IGludGVycnVwdCBudW1iZXIKLSAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHB0X3JlZ3M6IENQVSByZWdpc3RlcnMgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhdGwxX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQkvKnN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSktPnByaXY7Ki8KLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGF0YSk7Ci0JdTMyIHN0YXR1czsKLQl1OCB1cGRhdGVfcng7Ci0JaW50IG1heF9pbnRzID0gMTA7Ci0KLQlzdGF0dXMgPSBhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHM7Ci0JaWYgKCFzdGF0dXMpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXVwZGF0ZV9yeCA9IDA7Ci0KLQlkbyB7Ci0JCS8qIGNsZWFyIENNQiBpbnRlcnJ1cHQgc3RhdHVzIGF0IG9uY2UgKi8KLQkJYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzID0gMDsKLQotCQlpZiAoc3RhdHVzICYgSVNSX0dQSFkpCS8qIGNsZWFyIHBoeSBzdGF0dXMgKi8KLQkJCWF0bDFfY2xlYXJfcGh5X2ludChhZGFwdGVyKTsKLQotCQkvKiBjbGVhciBJU1Igc3RhdHVzLCBhbmQgRW5hYmxlIENNQiBETUEvRGlzYWJsZSBJbnRlcnJ1cHQgKi8KLQkJaW93cml0ZTMyKHN0YXR1cyB8IElTUl9ESVNfSU5ULCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0KLQkJLyogY2hlY2sgaWYgU01CIGludHIgKi8KLQkJaWYgKHN0YXR1cyAmIElTUl9TTUIpCi0JCQlhdGwxX2luY19zbWIoYWRhcHRlcik7Ci0KLQkJLyogY2hlY2sgaWYgUENJRSBQSFkgTGluayBkb3duICovCi0JCWlmIChzdGF0dXMgJiBJU1JfUEhZX0xJTktET1dOKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJwY2llIHBoeSBsaW5rIGRvd24gJXhcbiIsCi0JCQkJc3RhdHVzKTsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsJLyogcmVzZXQgTUFDICovCi0JCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQkJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5wY2llX2RtYV90b19yc3RfdGFzayk7Ci0JCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQkJfQotCQl9Ci0KLQkJLyogY2hlY2sgaWYgRE1BIHJlYWQvd3JpdGUgZXJyb3IgPyAqLwotCQlpZiAoc3RhdHVzICYgKElTUl9ETUFSX1RPX1JTVCB8IElTUl9ETUFXX1RPX1JTVCkpIHsKLQkJCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkicGNpZSBETUEgci93IGVycm9yIChzdGF0dXMgPSAweCV4KVxuIiwKLQkJCQlzdGF0dXMpOwotCQkJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCi0JCS8qIGxpbmsgZXZlbnQgKi8KLQkJaWYgKHN0YXR1cyAmIElTUl9HUEhZKSB7Ci0JCQlhZGFwdGVyLT5zb2Z0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7Ci0JCQlhdGwxX2NoZWNrX2Zvcl9saW5rKGFkYXB0ZXIpOwotCQl9Ci0KLQkJLyogdHJhbnNtaXQgZXZlbnQgKi8KLQkJaWYgKHN0YXR1cyAmIElTUl9DTUJfVFgpCi0JCQlhdGwxX2ludHJfdHgoYWRhcHRlcik7Ci0KLQkJLyogcnggZXhjZXB0aW9uICovCi0JCWlmICh1bmxpa2VseShzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAotCQkJSVNSX1JSRF9PViB8IElTUl9IT1NUX1JGRF9VTlJVTiB8Ci0JCQlJU1JfSE9TVF9SUkRfT1YgfCBJU1JfQ01CX1JYKSkpIHsKLQkJCWlmIChzdGF0dXMgJiAoSVNSX1JYRl9PViB8IElTUl9SRkRfVU5SVU4gfAotCQkJCUlTUl9SUkRfT1YgfCBJU1JfSE9TVF9SRkRfVU5SVU4gfAotCQkJCUlTUl9IT1NUX1JSRF9PVikpCi0JCQkJZGV2X2RiZygmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCQkicnggZXhjZXB0aW9uLCBJU1IgPSAweCV4XG4iLCBzdGF0dXMpOwotCQkJYXRsMV9pbnRyX3J4KGFkYXB0ZXIpOwotCQl9Ci0KLQkJaWYgKC0tbWF4X2ludHMgPCAwKQotCQkJYnJlYWs7Ci0KLQl9IHdoaWxlICgoc3RhdHVzID0gYWRhcHRlci0+Y21iLmNtYi0+aW50X3N0YXRzKSk7Ci0KLQkvKiByZS1lbmFibGUgSW50ZXJydXB0ICovCi0JaW93cml0ZTMyKElTUl9ESVNfU01CIHwgSVNSX0RJU19ETUEsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiBhdGwxX3NldF9tdWx0aSAtIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgc2V0X211bHRpIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgbXVsdGljYXN0IGFkZHJlc3MKLSAqIGxpc3Qgb3IgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGZsYWdzIGFyZSB1cGRhdGVkLiAgVGhpcyByb3V0aW5lIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcgdGhlIGhhcmR3YXJlIGZvciBwcm9wZXIgbXVsdGljYXN0LAotICogcHJvbWlzY3VvdXMgbW9kZSwgYW5kIGFsbC1tdWx0aSBiZWhhdmlvci4KLSAqLwotc3RhdGljIHZvaWQgYXRsMV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7Ci0JdTMyIHJjdGw7Ci0JdTMyIGhhc2hfdmFsdWU7Ci0KLQkvKiBDaGVjayBmb3IgUHJvbWlzY3VvdXMgYW5kIEFsbCBNdWx0aWNhc3QgbW9kZXMgKi8KLQlyY3RsID0gaW9yZWFkMzIoaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCi0JCXJjdGwgfD0gTUFDX0NUUkxfUFJPTUlTX0VOOwotCWVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKLQkJcmN0bCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47Ci0JCXJjdGwgJj0gfk1BQ19DVFJMX1BST01JU19FTjsKLQl9IGVsc2UKLQkJcmN0bCAmPSB+KE1BQ19DVFJMX1BST01JU19FTiB8IE1BQ19DVFJMX01DX0FMTF9FTik7Ci0KLQlpb3dyaXRlMzIocmN0bCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCi0JLyogY2xlYXIgdGhlIG9sZCBzZXR0aW5ncyBmcm9tIHRoZSBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLwotCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19SWF9IQVNIX1RBQkxFKTsKLQlpb3dyaXRlMzIoMCwgKGh3LT5od19hZGRyICsgUkVHX1JYX0hBU0hfVEFCTEUpICsgKDEgPDwgMikpOwotCi0JLyogY29tcHV0ZSBtYyBhZGRyZXNzZXMnIGhhc2ggdmFsdWUgLGFuZCBwdXQgaXQgaW50byBoYXNoIHRhYmxlICovCi0JZm9yIChtY19wdHIgPSBuZXRkZXYtPm1jX2xpc3Q7IG1jX3B0cjsgbWNfcHRyID0gbWNfcHRyLT5uZXh0KSB7Ci0JCWhhc2hfdmFsdWUgPSBhdGwxX2hhc2hfbWNfYWRkcihodywgbWNfcHRyLT5kbWlfYWRkcik7Ci0JCWF0bDFfaGFzaF9zZXQoaHcsIGhhc2hfdmFsdWUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYXRsMV9zZXR1cF9tYWNfY3RybChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgYXRsMV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQkvKiBDb25maWcgTUFDIENUUkwgUmVnaXN0ZXIgKi8KLQl2YWx1ZSA9IE1BQ19DVFJMX1RYX0VOIHwgTUFDX0NUUkxfUlhfRU47Ci0JLyogZHVwbGV4ICovCi0JaWYgKEZVTExfRFVQTEVYID09IGFkYXB0ZXItPmxpbmtfZHVwbGV4KQotCQl2YWx1ZSB8PSBNQUNfQ1RSTF9EVVBMWDsKLQkvKiBzcGVlZCAqLwotCXZhbHVlIHw9ICgodTMyKSAoKFNQRUVEXzEwMDAgPT0gYWRhcHRlci0+bGlua19zcGVlZCkgPwotCQkJIE1BQ19DVFJMX1NQRUVEXzEwMDAgOiBNQUNfQ1RSTF9TUEVFRF8xMF8xMDApIDw8Ci0JCSAgTUFDX0NUUkxfU1BFRURfU0hJRlQpOwotCS8qIGZsb3cgY29udHJvbCAqLwotCXZhbHVlIHw9IChNQUNfQ1RSTF9UWF9GTE9XIHwgTUFDX0NUUkxfUlhfRkxPVyk7Ci0JLyogUEFEICYgQ1JDICovCi0JdmFsdWUgfD0gKE1BQ19DVFJMX0FERF9DUkMgfCBNQUNfQ1RSTF9QQUQpOwotCS8qIHByZWFtYmxlIGxlbmd0aCAqLwotCXZhbHVlIHw9ICgoKHUzMikgYWRhcHRlci0+aHcucHJlYW1ibGVfbGVuCi0JCSAgICYgTUFDX0NUUkxfUFJNTEVOX01BU0spIDw8IE1BQ19DVFJMX1BSTUxFTl9TSElGVCk7Ci0JLyogdmxhbiAqLwotCWlmIChhZGFwdGVyLT52bGdycCkKLQkJdmFsdWUgfD0gTUFDX0NUUkxfUk1WX1ZMQU47Ci0JLyogcnggY2hlY2tzdW0KLQkgICBpZiAoYWRhcHRlci0+cnhfY3N1bSkKLQkgICB2YWx1ZSB8PSBNQUNfQ1RSTF9SWF9DSEtTVU1fRU47Ci0JICovCi0JLyogZmlsdGVyIG1vZGUgKi8KLQl2YWx1ZSB8PSBNQUNfQ1RSTF9CQ19FTjsKLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQl2YWx1ZSB8PSBNQUNfQ1RSTF9QUk9NSVNfRU47Ci0JZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKLQkJdmFsdWUgfD0gTUFDX0NUUkxfTUNfQUxMX0VOOwotCS8qIHZhbHVlIHw9IE1BQ19DVFJMX0xPT1BCQUNLOyAqLwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotfQotCi1zdGF0aWMgdTMyIGF0bDFfY2hlY2tfbGluayhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCXUzMiByZXRfdmFsOwotCXUxNiBzcGVlZCwgZHVwbGV4LCBwaHlfZGF0YTsKLQlpbnQgcmVjb25maWcgPSAwOwotCi0JLyogTUlJX0JNU1IgbXVzdCByZWFkIHR3aWNlICovCi0JYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAmcGh5X2RhdGEpOwotCWF0bDFfcmVhZF9waHlfcmVnKGh3LCBNSUlfQk1TUiwgJnBoeV9kYXRhKTsKLQlpZiAoIShwaHlfZGF0YSAmIEJNU1JfTFNUQVRVUykpIHsJLyogbGluayBkb3duICovCi0JCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsJLyogb2xkIGxpbmsgc3RhdGU6IFVwICovCi0JCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAibGluayBpcyBkb3duXG4iKTsKLQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBTUEVFRF8wOwotCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJfQotCQlyZXR1cm4gQVRMMV9TVUNDRVNTOwotCX0KLQotCS8qIExpbmsgVXAgKi8KLQlyZXRfdmFsID0gYXRsMV9nZXRfc3BlZWRfYW5kX2R1cGxleChodywgJnNwZWVkLCAmZHVwbGV4KTsKLQlpZiAocmV0X3ZhbCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KLQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7Ci0JY2FzZSBNRURJQV9UWVBFXzEwMDBNX0ZVTEw6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAwIHx8IGR1cGxleCAhPSBGVUxMX0RVUExFWCkKLQkJCXJlY29uZmlnID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBNRURJQV9UWVBFXzEwME1fRlVMTDoKLQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCi0JCQlyZWNvbmZpZyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgTUVESUFfVFlQRV8xMDBNX0hBTEY6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAgfHwgZHVwbGV4ICE9IEhBTEZfRFVQTEVYKQotCQkJcmVjb25maWcgPSAxOwotCQlicmVhazsKLQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6Ci0JCWlmIChzcGVlZCAhPSBTUEVFRF8xMCB8fCBkdXBsZXggIT0gRlVMTF9EVVBMRVgpCi0JCQlyZWNvbmZpZyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgTUVESUFfVFlQRV8xME1fSEFMRjoKLQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwIHx8IGR1cGxleCAhPSBIQUxGX0RVUExFWCkKLQkJCXJlY29uZmlnID0gMTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogbGluayByZXN1bHQgaXMgb3VyIHNldHRpbmcgKi8KLQlpZiAoIXJlY29uZmlnKSB7Ci0JCWlmIChhZGFwdGVyLT5saW5rX3NwZWVkICE9IHNwZWVkCi0JCSAgICB8fCBhZGFwdGVyLT5saW5rX2R1cGxleCAhPSBkdXBsZXgpIHsKLQkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSBzcGVlZDsKLQkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gZHVwbGV4OwotCQkJYXRsMV9zZXR1cF9tYWNfY3RybChhZGFwdGVyKTsKLQkJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJIiVzIGxpbmsgaXMgdXAgJWQgTWJwcyAlc1xuIiwKLQkJCQluZXRkZXYtPm5hbWUsIGFkYXB0ZXItPmxpbmtfc3BlZWQsCi0JCQkJYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVggPwotCQkJCSJmdWxsIGR1cGxleCIgOiAiaGFsZiBkdXBsZXgiKTsKLQkJfQotCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewkvKiBMaW5rIGRvd24gLT4gVXAgKi8KLQkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKLQkJfQotCQlyZXR1cm4gQVRMMV9TVUNDRVNTOwotCX0KLQotCS8qIGNoYW5nZSBvcmlnbmFsIGxpbmsgc3RhdHVzICovCi0JaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewotCQlhZGFwdGVyLT5saW5rX3NwZWVkID0gU1BFRURfMDsKLQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCX0KLQotCWlmIChody0+bWVkaWFfdHlwZSAhPSBNRURJQV9UWVBFX0FVVE9fU0VOU09SICYmCi0JICAgIGh3LT5tZWRpYV90eXBlICE9IE1FRElBX1RZUEVfMTAwME1fRlVMTCkgewotCQlzd2l0Y2ggKGh3LT5tZWRpYV90eXBlKSB7Ci0JCWNhc2UgTUVESUFfVFlQRV8xMDBNX0ZVTEw6Ci0JCQlwaHlfZGF0YSA9IE1JSV9DUl9GVUxMX0RVUExFWCB8IE1JSV9DUl9TUEVFRF8xMDAgfAotCQkJICAgICAgICAgICBNSUlfQ1JfUkVTRVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBNRURJQV9UWVBFXzEwME1fSEFMRjoKLQkJCXBoeV9kYXRhID0gTUlJX0NSX1NQRUVEXzEwMCB8IE1JSV9DUl9SRVNFVDsKLQkJCWJyZWFrOwotCQljYXNlIE1FRElBX1RZUEVfMTBNX0ZVTEw6Ci0JCQlwaHlfZGF0YSA9Ci0JCQkgICAgTUlJX0NSX0ZVTExfRFVQTEVYIHwgTUlJX0NSX1NQRUVEXzEwIHwgTUlJX0NSX1JFU0VUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CS8qIE1FRElBX1RZUEVfMTBNX0hBTEY6ICovCi0JCQlwaHlfZGF0YSA9IE1JSV9DUl9TUEVFRF8xMCB8IE1JSV9DUl9SRVNFVDsKLQkJCWJyZWFrOwotCQl9Ci0JCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIHBoeV9kYXRhKTsKLQkJcmV0dXJuIEFUTDFfU1VDQ0VTUzsKLQl9Ci0KLQkvKiBhdXRvLW5lZywgaW5zZXJ0IHRpbWVyIHRvIHJlLWNvbmZpZyBwaHkgKi8KLQlpZiAoIWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nKSB7Ci0JCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gdHJ1ZTsKLQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfY29uZmlnX3RpbWVyLCBqaWZmaWVzICsgMyAqIEhaKTsKLQl9Ci0KLQlyZXR1cm4gQVRMMV9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZmxvd19jdHJsX29sZChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBoaSwgbG8sIHZhbHVlOwotCi0JLyogUkZEIEZsb3cgQ29udHJvbCAqLwotCXZhbHVlID0gYWRhcHRlci0+cmZkX3JpbmcuY291bnQ7Ci0JaGkgPSB2YWx1ZSAvIDE2OwotCWlmIChoaSA8IDIpCi0JCWhpID0gMjsKLQlsbyA9IHZhbHVlICogNyAvIDg7Ci0KLQl2YWx1ZSA9ICgoaGkgJiBSWFFfUlhGX1BBVVNFX1RIX0hJX01BU0spIDw8IFJYUV9SWEZfUEFVU0VfVEhfSElfU0hJRlQpIHwKLQkgICAgKChsbyAmIFJYUV9SWEZfUEFVU0VfVEhfTE9fTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9MT19TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIKTsKLQotCS8qIFJSRCBGbG93IENvbnRyb2wgKi8KLQl2YWx1ZSA9IGFkYXB0ZXItPnJyZF9yaW5nLmNvdW50OwotCWxvID0gdmFsdWUgLyAxNjsKLQloaSA9IHZhbHVlICogNyAvIDg7Ci0JaWYgKGxvIDwgMikKLQkJbG8gPSAyOwotCXZhbHVlID0gKChoaSAmIFJYUV9SUkRfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JSRF9QQVVTRV9USF9ISV9TSElGVCkgfAotCSAgICAoKGxvICYgUlhRX1JSRF9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0xPX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZmxvd19jdHJsX25ldyhzdHJ1Y3QgYXRsMV9odyAqaHcpCi17Ci0JdTMyIGhpLCBsbywgdmFsdWU7Ci0KLQkvKiBSWEYgRmxvdyBDb250cm9sICovCi0JdmFsdWUgPSBpb3JlYWQzMihody0+aHdfYWRkciArIFJFR19TUkFNX1JYRl9MRU4pOwotCWxvID0gdmFsdWUgLyAxNjsKLQlpZiAobG8gPCAxOTIpCi0JCWxvID0gMTkyOwotCWhpID0gdmFsdWUgKiA3IC8gODsKLQlpZiAoaGkgPCBsbykKLQkJaGkgPSBsbyArIDE2OwotCXZhbHVlID0gKChoaSAmIFJYUV9SWEZfUEFVU0VfVEhfSElfTUFTSykgPDwgUlhRX1JYRl9QQVVTRV9USF9ISV9TSElGVCkgfAotCSAgICAoKGxvICYgUlhRX1JYRl9QQVVTRV9USF9MT19NQVNLKSA8PCBSWFFfUlhGX1BBVVNFX1RIX0xPX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9SWEZfUEFVU0VfVEhSRVNIKTsKLQotCS8qIFJSRCBGbG93IENvbnRyb2wgKi8KLQl2YWx1ZSA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX1NSQU1fUlJEX0xFTik7Ci0JbG8gPSB2YWx1ZSAvIDg7Ci0JaGkgPSB2YWx1ZSAqIDcgLyA4OwotCWlmIChsbyA8IDIpCi0JCWxvID0gMjsKLQlpZiAoaGkgPCBsbykKLQkJaGkgPSBsbyArIDM7Ci0JdmFsdWUgPSAoKGhpICYgUlhRX1JSRF9QQVVTRV9USF9ISV9NQVNLKSA8PCBSWFFfUlJEX1BBVVNFX1RIX0hJX1NISUZUKSB8Ci0JICAgICgobG8gJiBSWFFfUlJEX1BBVVNFX1RIX0xPX01BU0spIDw8IFJYUV9SUkRfUEFVU0VfVEhfTE9fU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfUlhRX1JSRF9QQVVTRV9USFJFU0gpOwotfQotCi0vKgotICogYXRsMV9jb25maWd1cmUgLSBDb25maWd1cmUgVHJhbnNtaXQmUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0Ci0gKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBDb25maWd1cmUgdGhlIFR4IC9SeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KLSAqLwotc3RhdGljIHUzMiBhdGwxX2NvbmZpZ3VyZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgdmFsdWU7Ci0KLQkvKiBjbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQotCS8qIHNldCBNQUMgQWRkcmVzcyAqLwotCXZhbHVlID0gKCgodTMyKSBody0+bWFjX2FkZHJbMl0pIDw8IDI0KSB8Ci0JCSgoKHUzMikgaHctPm1hY19hZGRyWzNdKSA8PCAxNikgfAotCQkoKCh1MzIpIGh3LT5tYWNfYWRkcls0XSkgPDwgOCkgfAotCQkoKCh1MzIpIGh3LT5tYWNfYWRkcls1XSkpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX1NUQV9BRERSKTsKLQl2YWx1ZSA9ICgoKHUzMikgaHctPm1hY19hZGRyWzBdKSA8PCA4KSB8ICgoKHUzMikgaHctPm1hY19hZGRyWzFdKSk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIChSRUdfTUFDX1NUQV9BRERSICsgNCkpOwotCi0JLyogdHggLyByeCByaW5nICovCi0KLQkvKiBISSBiYXNlIGFkZHJlc3MgKi8KLQlpb3dyaXRlMzIoKHUzMikgKChhZGFwdGVyLT50cGRfcmluZy5kbWEgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpID4+IDMyKSwKLQkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19CQVNFX0FERFJfSEkpOwotCS8qIExPIGJhc2UgYWRkcmVzcyAqLwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+cmZkX3JpbmcuZG1hICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSwKLQkJaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SRkRfQUREUl9MTyk7Ci0JaW93cml0ZTMyKCh1MzIpIChhZGFwdGVyLT5ycmRfcmluZy5kbWEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpLAotCQlody0+aHdfYWRkciArIFJFR19ERVNDX1JSRF9BRERSX0xPKTsKLQlpb3dyaXRlMzIoKHUzMikgKGFkYXB0ZXItPnRwZF9yaW5nLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfVFBEX0FERFJfTE8pOwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+Y21iLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfQ01CX0FERFJfTE8pOwotCWlvd3JpdGUzMigodTMyKSAoYWRhcHRlci0+c21iLmRtYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCksCi0JCWh3LT5od19hZGRyICsgUkVHX0RFU0NfU01CX0FERFJfTE8pOwotCi0JLyogZWxlbWVudCBjb3VudCAqLwotCXZhbHVlID0gYWRhcHRlci0+cnJkX3JpbmcuY291bnQ7Ci0JdmFsdWUgPDw9IDE2OwotCXZhbHVlICs9IGFkYXB0ZXItPnJmZF9yaW5nLmNvdW50OwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfREVTQ19SRkRfUlJEX1JJTkdfU0laRSk7Ci0JaW93cml0ZTMyKGFkYXB0ZXItPnRwZF9yaW5nLmNvdW50LCBody0+aHdfYWRkciArIFJFR19ERVNDX1RQRF9SSU5HX1NJWkUpOwotCi0JLyogTG9hZCBQdHIgKi8KLQlpb3dyaXRlMzIoMSwgaHctPmh3X2FkZHIgKyBSRUdfTE9BRF9QVFIpOwotCi0JLyogY29uZmlnIE1haWxib3ggKi8KLQl2YWx1ZSA9ICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnRwZF9yaW5nLm5leHRfdG9fdXNlKQotCQkgICYgTUJfVFBEX1BST0RfSU5EWF9NQVNLKSA8PCBNQl9UUERfUFJPRF9JTkRYX1NISUZUKSB8Ci0JICAgICgoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJyZF9yaW5nLm5leHRfdG9fY2xlYW4pCi0JICAgICAgJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8IE1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKLQkgICAgKChhdG9taWNfcmVhZCgmYWRhcHRlci0+cmZkX3JpbmcubmV4dF90b191c2UpCi0JICAgICAgJiBNQl9SRkRfUFJPRF9JTkRYX01BU0spIDw8IE1CX1JGRF9QUk9EX0lORFhfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFJTEJPWCk7Ci0KLQkvKiBjb25maWcgSVBHL0lGRyAqLwotCXZhbHVlID0gKCgodTMyKSBody0+aXBndCAmIE1BQ19JUEdfSUZHX0lQR1RfTUFTSykKLQkJIDw8IE1BQ19JUEdfSUZHX0lQR1RfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+bWluX2lmZyAmIE1BQ19JUEdfSUZHX01JRkdfTUFTSykKLQkgICAgIDw8IE1BQ19JUEdfSUZHX01JRkdfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+aXBncjEgJiBNQUNfSVBHX0lGR19JUEdSMV9NQVNLKQotCSAgICAgPDwgTUFDX0lQR19JRkdfSVBHUjFfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+aXBncjIgJiBNQUNfSVBHX0lGR19JUEdSMl9NQVNLKQotCSAgICAgPDwgTUFDX0lQR19JRkdfSVBHUjJfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0lQR19JRkcpOwotCi0JLyogY29uZmlnICBIYWxmLUR1cGxleCBDb250cm9sICovCi0JdmFsdWUgPSAoKHUzMikgaHctPmxjb2wgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX0xDT0xfTUFTSykgfAotCSAgICAoKCh1MzIpIGh3LT5tYXhfcmV0cnkgJiBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX01BU0spCi0JICAgICA8PCBNQUNfSEFMRl9EVVBMWF9DVFJMX1JFVFJZX1NISUZUKSB8Ci0JICAgIE1BQ19IQUxGX0RVUExYX0NUUkxfRVhDX0RFRl9FTiB8Ci0JICAgICgweGEgPDwgTUFDX0hBTEZfRFVQTFhfQ1RSTF9BQkVCVF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5qYW1faXBnICYgTUFDX0hBTEZfRFVQTFhfQ1RSTF9KQU1JUEdfTUFTSykKLQkgICAgIDw8IE1BQ19IQUxGX0RVUExYX0NUUkxfSkFNSVBHX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX01BQ19IQUxGX0RVUExYX0NUUkwpOwotCi0JLyogc2V0IEludGVycnVwdCBNb2RlcmF0b3IgVGltZXIgKi8KLQlpb3dyaXRlMTYoYWRhcHRlci0+aW10LCBody0+aHdfYWRkciArIFJFR19JUlFfTU9EVV9USU1FUl9JTklUKTsKLQlpb3dyaXRlMzIoTUFTVEVSX0NUUkxfSVRJTUVSX0VOLCBody0+aHdfYWRkciArIFJFR19NQVNURVJfQ1RSTCk7Ci0KLQkvKiBzZXQgSW50ZXJydXB0IENsZWFyIFRpbWVyICovCi0JaW93cml0ZTE2KGFkYXB0ZXItPmljdCwgaHctPmh3X2FkZHIgKyBSRUdfQ01CRElTRE1BX1RJTUVSKTsKLQotCS8qIHNldCBNVFUsIDQgOiBWTEFOICovCi0JaW93cml0ZTMyKGh3LT5tYXhfZnJhbWVfc2l6ZSArIDQsIGh3LT5od19hZGRyICsgUkVHX01UVSk7Ci0KLQkvKiBqdW1ibyBzaXplICYgcnJkIHJldGlyZW1lbnQgdGltZXIgKi8KLQl2YWx1ZSA9ICgoKHUzMikgaHctPnJ4X2p1bWJvX3RoICYgUlhRX0pNQk9TWl9USF9NQVNLKQotCQkgPDwgUlhRX0pNQk9TWl9USF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5yeF9qdW1ib19sa2FoICYgUlhRX0pNQk9fTEtBSF9NQVNLKQotCSAgICAgPDwgUlhRX0pNQk9fTEtBSF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT5ycmRfcmV0X3RpbWVyICYgUlhRX1JSRF9USU1FUl9NQVNLKQotCSAgICAgPDwgUlhRX1JSRF9USU1FUl9TSElGVCk7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19SWFFfSk1CT1NaX1JSRFRJTSk7Ci0KLQkvKiBGbG93IENvbnRyb2wgKi8KLQlzd2l0Y2ggKGh3LT5kZXZfcmV2KSB7Ci0JY2FzZSAweDgwMDE6Ci0JY2FzZSAweDkwMDE6Ci0JY2FzZSAweDkwMDI6Ci0JY2FzZSAweDkwMDM6Ci0JCXNldF9mbG93X2N0cmxfb2xkKGFkYXB0ZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzZXRfZmxvd19jdHJsX25ldyhodyk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIGNvbmZpZyBUWFEgKi8KLQl2YWx1ZSA9ICgoKHUzMikgaHctPnRwZF9idXJzdCAmIFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fTUFTSykKLQkJIDw8IFRYUV9DVFJMX1RQRF9CVVJTVF9OVU1fU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+dHhmX2J1cnN0ICYgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9NQVNLKQotCSAgICAgPDwgVFhRX0NUUkxfVFhGX0JVUlNUX05VTV9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT50cGRfZmV0Y2hfdGggJiBUWFFfQ1RSTF9UUERfRkVUQ0hfVEhfTUFTSykKLQkgICAgIDw8IFRYUV9DVFJMX1RQRF9GRVRDSF9USF9TSElGVCkgfCBUWFFfQ1RSTF9FTkhfTU9ERSB8IFRYUV9DVFJMX0VOOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfVFhRX0NUUkwpOwotCi0JLyogbWluIHRwZCBmZXRjaCBnYXAgJiB0eCBqdW1ibyBwYWNrZXQgc2l6ZSB0aHJlc2hvbGQgZm9yIHRhc2tvZmZsb2FkICovCi0JdmFsdWUgPSAoKCh1MzIpIGh3LT50eF9qdW1ib190YXNrX3RoICYgVFhfSlVNQk9fVEFTS19USF9NQVNLKQotCQkgPDwgVFhfSlVNQk9fVEFTS19USF9TSElGVCkgfAotCSAgICAoKCh1MzIpIGh3LT50cGRfZmV0Y2hfZ2FwICYgVFhfVFBEX01JTl9JUEdfTUFTSykKLQkgICAgIDw8IFRYX1RQRF9NSU5fSVBHX1NISUZUKTsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1RYX0pVTUJPX1RBU0tfVEhfVFBEX0lQRyk7Ci0KLQkvKiBjb25maWcgUlhRICovCi0JdmFsdWUgPSAoKCh1MzIpIGh3LT5yZmRfYnVyc3QgJiBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX01BU0spCi0JCSA8PCBSWFFfQ1RSTF9SRkRfQlVSU1RfTlVNX1NISUZUKSB8Ci0JICAgICgoKHUzMikgaHctPnJyZF9idXJzdCAmIFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfTUFTSykKLQkgICAgIDw8IFJYUV9DVFJMX1JSRF9CVVJTVF9USFJFU0hfU0hJRlQpIHwKLQkgICAgKCgodTMyKSBody0+cmZkX2ZldGNoX2dhcCAmIFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfTUFTSykKLQkgICAgIDw8IFJYUV9DVFJMX1JGRF9QUkVGX01JTl9JUEdfU0hJRlQpIHwKLQkgICAgUlhRX0NUUkxfQ1VUX1RIUlVfRU4gfCBSWFFfQ1RSTF9FTjsKLQlpb3dyaXRlMzIodmFsdWUsIGh3LT5od19hZGRyICsgUkVHX1JYUV9DVFJMKTsKLQotCS8qIGNvbmZpZyBETUEgRW5naW5lICovCi0JdmFsdWUgPSAoKCgodTMyKSBody0+ZG1hcl9ibG9jaykgJiBETUFfQ1RSTF9ETUFSX0JVUlNUX0xFTl9NQVNLKQotCQkgPDwgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fU0hJRlQpIHwKLQkgICAgKCgoKHUzMikgaHctPmRtYXdfYmxvY2spICYgRE1BX0NUUkxfRE1BUl9CVVJTVF9MRU5fTUFTSykKLQkgICAgIDw8IERNQV9DVFJMX0RNQVJfQlVSU1RfTEVOX1NISUZUKSB8Ci0JICAgIERNQV9DVFJMX0RNQVJfRU4gfCBETUFfQ1RSTF9ETUFXX0VOOwotCXZhbHVlIHw9ICh1MzIpIGh3LT5kbWFfb3JkOwotCWlmIChhdGwxX3JjYl8xMjggPT0gaHctPnJjYl92YWx1ZSkKLQkJdmFsdWUgfD0gRE1BX0NUUkxfUkNCX1ZBTFVFOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfRE1BX0NUUkwpOwotCi0JLyogY29uZmlnIENNQiAvIFNNQiAqLwotCXZhbHVlID0gaHctPmNtYl9ycmQgfCAoKHUzMikgaHctPmNtYl90cGQgPDwgMTYpOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ01CX1dSSVRFX1RIKTsKLQl2YWx1ZSA9IGh3LT5jbWJfcnhfdGltZXIgfCAoKHUzMikgaHctPmNtYl90eF90aW1lciA8PCAxNik7Ci0JaW93cml0ZTMyKHZhbHVlLCBody0+aHdfYWRkciArIFJFR19DTUJfV1JJVEVfVElNRVIpOwotCWlvd3JpdGUzMihody0+c21iX3RpbWVyLCBody0+aHdfYWRkciArIFJFR19TTUJfVElNRVIpOwotCi0JLyogLS0tIGVuYWJsZSBDTUIgLyBTTUIgKi8KLQl2YWx1ZSA9IENTTUJfQ1RSTF9DTUJfRU4gfCBDU01CX0NUUkxfU01CX0VOOwotCWlvd3JpdGUzMih2YWx1ZSwgaHctPmh3X2FkZHIgKyBSRUdfQ1NNQl9DVFJMKTsKLQotCXZhbHVlID0gaW9yZWFkMzIoYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOwotCWlmICh1bmxpa2VseSgodmFsdWUgJiBJU1JfUEhZX0xJTktET1dOKSAhPSAwKSkKLQkJdmFsdWUgPSAxOwkvKiBjb25maWcgZmFpbGVkICovCi0JZWxzZQotCQl2YWx1ZSA9IDA7Ci0KLQkvKiBjbGVhciBhbGwgaW50ZXJydXB0IHN0YXR1cyAqLwotCWlvd3JpdGUzMigweDNmZmZmZmZmLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX0lTUik7Ci0JaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLS8qCi0gKiBhdGwxX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQwotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFfaXJxX2Rpc2FibGUoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKLQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOwotCWlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgYXRsMV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBjdHJsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQkvKiBhdGwxX2lycV9kaXNhYmxlKGFkYXB0ZXIpOyAqLwotCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOwotCi0JaWYgKGdycCkgewotCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCi0JCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJY3RybCB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKLQkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCX0gZWxzZSB7Ci0JCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCi0JCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJY3RybCAmPSB+TUFDX0NUUkxfUk1WX1ZMQU47Ci0JCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQl9Ci0KLQkvKiBhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7ICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBhdGwxX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCWF0bDFfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKLX0KLQogc3RhdGljIHUxNiB0cGRfYXZhaWwoc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nKQogewogCXUxNiBuZXh0X3RvX2NsZWFuID0gYXRvbWljX3JlYWQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuKTsKIAl1MTYgbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmdHBkX3JpbmctPm5leHRfdG9fdXNlKTsKLQlyZXR1cm4gKChuZXh0X3RvX2NsZWFuID4KLQkJIG5leHRfdG9fdXNlKSA/IG5leHRfdG9fY2xlYW4gLSBuZXh0X3RvX3VzZSAtCi0JCTEgOiB0cGRfcmluZy0+Y291bnQgKyBuZXh0X3RvX2NsZWFuIC0gbmV4dF90b191c2UgLSAxKTsKKwlyZXR1cm4gKChuZXh0X3RvX2NsZWFuID4gbmV4dF90b191c2UpID8KKwkJbmV4dF90b19jbGVhbiAtIG5leHRfdG9fdXNlIC0gMSA6CisJCXRwZF9yaW5nLT5jb3VudCArIG5leHRfdG9fY2xlYW4gLSBuZXh0X3RvX3VzZSAtIDEpOwogfQogCiBzdGF0aWMgaW50IGF0bDFfdHNvKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0xMjU4LDkgKzE0NTEsNyBAQAogCQkJaXBoLT50b3RfbGVuID0gMDsKIAkJCWlwaC0+Y2hlY2sgPSAwOwogCQkJdGNwX2hkcihza2IpLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLAotCQkJCQkJCQkgaXBoLT5kYWRkciwgMCwKLQkJCQkJCQkJIElQUFJPVE9fVENQLAotCQkJCQkJCQkgMCk7CisJCQkJaXBoLT5kYWRkciwgMCwgSVBQUk9UT19UQ1AsIDApOwogCQkJaXBvZnN0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCQlpZiAoaXBvZnN0ICE9IEVORVRfSEVBREVSX1NJWkUpIC8qIDgwMi4zIGZyYW1lICovCiAJCQkJdHNvLT50c29wbCB8PSAxIDw8IFRTT19QQVJBTV9FVEhUWVBFX1NISUZUOwpAQCAtMTI2OCw3ICsxNDU5LDggQEAKIAkJCXRzby0+dHNvcGwgfD0gKGlwaC0+aWhsICYKIAkJCQlDU1VNX1BBUkFNX0lQSExfTUFTSykgPDwgQ1NVTV9QQVJBTV9JUEhMX1NISUZUOwogCQkJdHNvLT50c29wbCB8PSAodGNwX2hkcmxlbihza2IpICYKLQkJCQlUU09fUEFSQU1fVENQSERSTEVOX01BU0spIDw8IFRTT19QQVJBTV9UQ1BIRFJMRU5fU0hJRlQ7CisJCQkJVFNPX1BBUkFNX1RDUEhEUkxFTl9NQVNLKSA8PAorCQkJCVRTT19QQVJBTV9UQ1BIRFJMRU5fU0hJRlQ7CiAJCQl0c28tPnRzb3BsIHw9IChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICYKIAkJCQlUU09fUEFSQU1fTVNTX01BU0spIDw8IFRTT19QQVJBTV9NU1NfU0hJRlQ7CiAJCQl0c28tPnRzb3BsIHw9IDEgPDwgVFNPX1BBUkFNX0lQQ0tTVU1fU0hJRlQ7CkBAIC0xMjgxLDcgKzE0NzMsNyBAQAogfQogCiBzdGF0aWMgaW50IGF0bDFfdHhfY3N1bShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGNzdW1fcGFyYW0gKmNzdW0pCisJc3RydWN0IGNzdW1fcGFyYW0gKmNzdW0pCiB7CiAJdTggY3NzLCBjc287CiAKQEAgLTEyODksNyArMTQ4MSw3IEBACiAJCWNzbyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CiAJCWNzcyA9IGNzbyArIHNrYi0+Y3N1bV9vZmZzZXQ7CiAJCWlmICh1bmxpa2VseShjc28gJiAweDEpKSB7Ci0JCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJInBheWxvYWQgb2Zmc2V0IG5vdCBhbiBldmVuIG51bWJlclxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTEzMDQsOCArMTQ5Niw4IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGF0bDFfdHhfbWFwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB0Y3Bfc2VnKQorc3RhdGljIHZvaWQgYXRsMV90eF9tYXAoc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwlib29sIHRjcF9zZWcpCiB7CiAJLyogV2UgZW50ZXIgdGhpcyBmdW5jdGlvbiBob2xkaW5nIGEgc3BpbmxvY2suICovCiAJc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOwpAQCAtMTM0MiwyNiArMTUzNCwyNSBAQAogCiAJCWlmIChmaXJzdF9idWZfbGVuID4gcHJvdG9faGRyX2xlbikgewogCQkJbGVuMTIgPSBmaXJzdF9idWZfbGVuIC0gcHJvdG9faGRyX2xlbjsKLQkJCW0gPSAobGVuMTIgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCQltID0gKGxlbjEyICsgQVRMMV9NQVhfVFhfQlVGX0xFTiAtIDEpIC8KKwkJCQlBVEwxX01BWF9UWF9CVUZfTEVOOwogCQkJZm9yIChpID0gMDsgaSA8IG07IGkrKykgewogCQkJCWJ1ZmZlcl9pbmZvID0KIAkJCQkgICAgJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOwogCQkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOwogCQkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPQotCQkJCSAgICAoTUFYX1RYX0JVRl9MRU4gPj0KLQkJCQkgICAgIGxlbjEyKSA/IE1BWF9UWF9CVUZfTEVOIDogbGVuMTI7CisJCQkJICAgIChBVEwxX01BWF9UWF9CVUZfTEVOID49CisJCQkJICAgICBsZW4xMikgPyBBVEwxX01BWF9UWF9CVUZfTEVOIDogbGVuMTI7CiAJCQkJbGVuMTIgLT0gYnVmZmVyX2luZm8tPmxlbmd0aDsKIAkJCQlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSArCi0JCQkJCQkgKHByb3RvX2hkcl9sZW4gKwotCQkJCQkJICBpICogTUFYX1RYX0JVRl9MRU4pKTsKKwkJCQkJKHByb3RvX2hkcl9sZW4gKworCQkJCQlpICogQVRMMV9NQVhfVFhfQlVGX0xFTikpOwogCQkJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKShza2ItPmRhdGEgKwotCQkJCQkJCShwcm90b19oZHJfbGVuICsKLQkJCQkJCQlpICogTUFYX1RYX0JVRl9MRU4pKSAmCi0JCQkJCQkJflBBR0VfTUFTSzsKLQkJCQlidWZmZXJfaW5mby0+ZG1hID0KLQkJCQkgICAgcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsIG9mZnNldCwKLQkJCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLAotCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkocHJvdG9faGRyX2xlbiArCisJCQkJCWkgKiBBVEwxX01BWF9UWF9CVUZfTEVOKSkgJiB+UEFHRV9NQVNLOworCQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQkJcGFnZSwgb2Zmc2V0LCBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKIAkJCQlpZiAoKyt0cGRfbmV4dF90b191c2UgPT0gdHBkX3JpbmctPmNvdW50KQogCQkJCQl0cGRfbmV4dF90b191c2UgPSAwOwogCQkJfQpAQCAtMTM3Miw4ICsxNTYzLDcgQEAKIAkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOwogCQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiB+UEFHRV9NQVNLOwogCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsIHBhZ2UsCi0JCQkJCQlvZmZzZXQsIGZpcnN0X2J1Zl9sZW4sCi0JCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCW9mZnNldCwgZmlyc3RfYnVmX2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJCWlmICgrK3RwZF9uZXh0X3RvX3VzZSA9PSB0cGRfcmluZy0+Y291bnQpCiAJCQl0cGRfbmV4dF90b191c2UgPSAwOwogCX0KQEAgLTEzODUsMTkgKzE1NzUsMTkgQEAKIAkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdOwogCQlsZW5mID0gZnJhZy0+c2l6ZTsKIAotCQltID0gKGxlbmYgKyBNQVhfVFhfQlVGX0xFTiAtIDEpIC8gTUFYX1RYX0JVRl9MRU47CisJCW0gPSAobGVuZiArIEFUTDFfTUFYX1RYX0JVRl9MRU4gLSAxKSAvIEFUTDFfTUFYX1RYX0JVRl9MRU47CiAJCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKIAkJCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1t0cGRfbmV4dF90b191c2VdOwogCQkJaWYgKHVubGlrZWx5KGJ1ZmZlcl9pbmZvLT5za2IpKQogCQkJCUJVRygpOwogCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7Ci0JCQlidWZmZXJfaW5mby0+bGVuZ3RoID0KLQkJCSAgICAobGVuZiA+IE1BWF9UWF9CVUZfTEVOKSA/IE1BWF9UWF9CVUZfTEVOIDogbGVuZjsKKwkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSAobGVuZiA+IEFUTDFfTUFYX1RYX0JVRl9MRU4pID8KKwkJCQlBVEwxX01BWF9UWF9CVUZfTEVOIDogbGVuZjsKIAkJCWxlbmYgLT0gYnVmZmVyX2luZm8tPmxlbmd0aDsKLQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPQotCQkJICAgIHBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LCBmcmFnLT5wYWdlLAotCQkJCQkgZnJhZy0+cGFnZV9vZmZzZXQgKyBpICogTUFYX1RYX0JVRl9MRU4sCi0JCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBwY2lfbWFwX3BhZ2UoYWRhcHRlci0+cGRldiwKKwkJCQlmcmFnLT5wYWdlLAorCQkJCWZyYWctPnBhZ2Vfb2Zmc2V0ICsgKGkgKiBBVEwxX01BWF9UWF9CVUZfTEVOKSwKKwkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCQkJaWYgKCsrdHBkX25leHRfdG9fdXNlID09IHRwZF9yaW5nLT5jb3VudCkKIAkJCQl0cGRfbmV4dF90b191c2UgPSAwOwpAQCAtMTQwOSw3ICsxNTk5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYXRsMV90eF9xdWV1ZShzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyLCBpbnQgY291bnQsCi0JCQkgICAgICAgdW5pb24gdHBkX2Rlc2NyICpkZXNjcikKKyAgICAgICB1bmlvbiB0cGRfZGVzY3IgKmRlc2NyKQogewogCS8qIFdlIGVudGVyIHRoaXMgZnVuY3Rpb24gaG9sZGluZyBhIHNwaW5sb2NrLiAqLwogCXN0cnVjdCBhdGwxX3RwZF9yaW5nICp0cGRfcmluZyA9ICZhZGFwdGVyLT50cGRfcmluZzsKQEAgLTE0NTMsMzEgKzE2NDMsNiBAQAogCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX3VzZSwgKGludCl0cGRfbmV4dF90b191c2UpOwogfQogCi1zdGF0aWMgdm9pZCBhdGwxX3VwZGF0ZV9tYWlsYm94KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdHBkX25leHRfdG9fdXNlOwotCXUzMiByZmRfbmV4dF90b191c2U7Ci0JdTMyIHJyZF9uZXh0X3RvX2NsZWFuOwotCXUzMiB2YWx1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5tYl9sb2NrLCBmbGFncyk7Ci0KLQl0cGRfbmV4dF90b191c2UgPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHBkX3JpbmcubmV4dF90b191c2UpOwotCXJmZF9uZXh0X3RvX3VzZSA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5yZmRfcmluZy5uZXh0X3RvX3VzZSk7Ci0JcnJkX25leHRfdG9fY2xlYW4gPSBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnJkX3JpbmcubmV4dF90b19jbGVhbik7Ci0KLQl2YWx1ZSA9ICgocmZkX25leHRfdG9fdXNlICYgTUJfUkZEX1BST0RfSU5EWF9NQVNLKSA8PAotCQlNQl9SRkRfUFJPRF9JTkRYX1NISUZUKSB8Ci0JCSgocnJkX25leHRfdG9fY2xlYW4gJiBNQl9SUkRfQ09OU19JTkRYX01BU0spIDw8Ci0JCU1CX1JSRF9DT05TX0lORFhfU0hJRlQpIHwKLQkJKCh0cGRfbmV4dF90b191c2UgJiBNQl9UUERfUFJPRF9JTkRYX01BU0spIDw8Ci0JCU1CX1RQRF9QUk9EX0lORFhfU0hJRlQpOwotCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19NQUlMQk9YKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1iX2xvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGludCBhdGwxX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTE1MTMsOCArMTY3OCw4IEBACiAJZm9yIChmID0gMDsgZiA8IG5yX2ZyYWdzOyBmKyspIHsKIAkJZnJhZ19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXS5zaXplOwogCQlpZiAoZnJhZ19zaXplKQotCQkJY291bnQgKz0KLQkJCSAgICAoZnJhZ19zaXplICsgTUFYX1RYX0JVRl9MRU4gLSAxKSAvIE1BWF9UWF9CVUZfTEVOOworCQkJY291bnQgKz0gKGZyYWdfc2l6ZSArIEFUTDFfTUFYX1RYX0JVRl9MRU4gLSAxKSAvCisJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTjsKIAl9CiAKIAkvKiBtc3Mgd2lsbCBiZSBub256ZXJvIGlmIHdlJ3JlIGRvaW5nIHNlZ21lbnQgb2ZmbG9hZCAoVFNPL0dTTykgKi8KQEAgLTE1MzAsNyArMTY5NSw4IEBACiAJCQkvKiBuZWVkIGFkZGl0aW9uYWwgVFBEID8gKi8KIAkJCWlmIChwcm90b19oZHJfbGVuICE9IGxlbikKIAkJCQljb3VudCArPSAobGVuIC0gcHJvdG9faGRyX2xlbiArCi0JCQkJCU1BWF9UWF9CVUZfTEVOIC0gMSkgLyBNQVhfVFhfQlVGX0xFTjsKKwkJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTiAtIDEpIC8KKwkJCQkJQVRMMV9NQVhfVFhfQlVGX0xFTjsKIAkJfQogCX0KIApAQCAtMTUzOCw3ICsxNzA0LDcgQEAKIAlpZiAoIXNwaW5fdHJ5bG9jaygmYWRhcHRlci0+bG9jaykpIHsKIAkJLyogQ2FuJ3QgZ2V0IGxvY2sgLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8KIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlkZXZfZGJnKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBsb2NrZWRcbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBsb2NrZWRcbiIpOwogCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsKIAl9CiAKQEAgLTE1NDYsNyArMTcxMiw3IEBACiAJCS8qIG5vdCBlbm91Z2ggZGVzY3JpcHRvcnMgKi8KIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci0JCWRldl9kYmcoJmFkYXB0ZXItPnBkZXYtPmRldiwgInR4IGJ1c3lcbiIpOworCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsICJ0eCBidXN5XG4iKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIApAQCAtMTU4OCwxMzEgKzE3NTQsMjA4IEBACiB9CiAKIC8qCi0gKiBhdGwxX2dldF9zdGF0cyAtIEdldCBTeXN0ZW0gTmV0d29yayBTdGF0aXN0aWNzCi0gKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgotICogVGhlIHN0YXRpc3RpY3MgYXJlIGFjdHVhbGx5IHVwZGF0ZWQgZnJvbSB0aGUgdGltZXIgY2FsbGJhY2suCisgKiBhdGwxX2ludHIgLSBJbnRlcnJ1cHQgSGFuZGxlcgorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRhdGE6IHBvaW50ZXIgdG8gYSBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcHRfcmVnczogQ1BVIHJlZ2lzdGVycyBzdHJ1Y3R1cmUKICAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdGwxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGlycXJldHVybl90IGF0bDFfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkYXRhKTsKKwl1MzIgc3RhdHVzOworCXU4IHVwZGF0ZV9yeDsKKwlpbnQgbWF4X2ludHMgPSAxMDsKKworCXN0YXR1cyA9IGFkYXB0ZXItPmNtYi5jbWItPmludF9zdGF0czsKKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJdXBkYXRlX3J4ID0gMDsKKworCWRvIHsKKwkJLyogY2xlYXIgQ01CIGludGVycnVwdCBzdGF0dXMgYXQgb25jZSAqLworCQlhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHMgPSAwOworCisJCWlmIChzdGF0dXMgJiBJU1JfR1BIWSkJLyogY2xlYXIgcGh5IHN0YXR1cyAqLworCQkJYXRsMV9jbGVhcl9waHlfaW50KGFkYXB0ZXIpOworCisJCS8qIGNsZWFyIElTUiBzdGF0dXMsIGFuZCBFbmFibGUgQ01CIERNQS9EaXNhYmxlIEludGVycnVwdCAqLworCQlpb3dyaXRlMzIoc3RhdHVzIHwgSVNSX0RJU19JTlQsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSVNSKTsKKworCQkvKiBjaGVjayBpZiBTTUIgaW50ciAqLworCQlpZiAoc3RhdHVzICYgSVNSX1NNQikKKwkJCWF0bDFfaW5jX3NtYihhZGFwdGVyKTsKKworCQkvKiBjaGVjayBpZiBQQ0lFIFBIWSBMaW5rIGRvd24gKi8KKwkJaWYgKHN0YXR1cyAmIElTUl9QSFlfTElOS0RPV04pIHsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkicGNpZSBwaHkgbGluayBkb3duICV4XG4iLCBzdGF0dXMpOworCQkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewkvKiByZXNldCBNQUMgKi8KKwkJCQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCQkJCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnBjaWVfZG1hX3RvX3JzdF90YXNrKTsKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCX0KKworCQkvKiBjaGVjayBpZiBETUEgcmVhZC93cml0ZSBlcnJvciA/ICovCisJCWlmIChzdGF0dXMgJiAoSVNSX0RNQVJfVE9fUlNUIHwgSVNSX0RNQVdfVE9fUlNUKSkgeworCQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJwY2llIERNQSByL3cgZXJyb3IgKHN0YXR1cyA9IDB4JXgpXG4iLAorCQkJCXN0YXR1cyk7CisJCQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JTVIpOworCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cGNpZV9kbWFfdG9fcnN0X3Rhc2spOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJLyogbGluayBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX0dQSFkpIHsKKwkJCWFkYXB0ZXItPnNvZnRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWF0bDFfY2hlY2tfZm9yX2xpbmsoYWRhcHRlcik7CisJCX0KKworCQkvKiB0cmFuc21pdCBldmVudCAqLworCQlpZiAoc3RhdHVzICYgSVNSX0NNQl9UWCkKKwkJCWF0bDFfaW50cl90eChhZGFwdGVyKTsKKworCQkvKiByeCBleGNlcHRpb24gKi8KKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChJU1JfUlhGX09WIHwgSVNSX1JGRF9VTlJVTiB8CisJCQlJU1JfUlJEX09WIHwgSVNSX0hPU1RfUkZEX1VOUlVOIHwKKwkJCUlTUl9IT1NUX1JSRF9PViB8IElTUl9DTUJfUlgpKSkgeworCQkJaWYgKHN0YXR1cyAmIChJU1JfUlhGX09WIHwgSVNSX1JGRF9VTlJVTiB8CisJCQkJSVNSX1JSRF9PViB8IElTUl9IT1NUX1JGRF9VTlJVTiB8CisJCQkJSVNSX0hPU1RfUlJEX09WKSkKKwkJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCSJyeCBleGNlcHRpb24sIElTUiA9IDB4JXhcbiIsIHN0YXR1cyk7CisJCQlhdGwxX2ludHJfcngoYWRhcHRlcik7CisJCX0KKworCQlpZiAoLS1tYXhfaW50cyA8IDApCisJCQlicmVhazsKKworCX0gd2hpbGUgKChzdGF0dXMgPSBhZGFwdGVyLT5jbWIuY21iLT5pbnRfc3RhdHMpKTsKKworCS8qIHJlLWVuYWJsZSBJbnRlcnJ1cHQgKi8KKwlpb3dyaXRlMzIoSVNSX0RJU19TTUIgfCBJU1JfRElTX0RNQSwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19JU1IpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIGF0bDFfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICovCitzdGF0aWMgdm9pZCBhdGwxX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKilkYXRhOworCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKKy8qCisgKiBhdGwxX3BoeV9jb25maWcgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICovCitzdGF0aWMgdm9pZCBhdGwxX3BoeV9jb25maWcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7CisJc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQURWRVJUSVNFLCBody0+bWlpX2F1dG9uZWdfYWR2X3JlZyk7CisJYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQVQwMDFfQ1IsIGh3LT5taWlfMTAwMHRfY3RybF9yZWcpOworCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogYXRsMV90eF90aW1lb3V0IC0gUmVzcG9uZCB0byBhIFR4IEhhbmcKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgYXRsMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7CisJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOwogfQogCiAvKgotICogYXRsMV9jbGVhbl9yeF9yaW5nIC0gRnJlZSBSRkQgQnVmZmVycwotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBPcnBoYW5lZCB2ZW5kb3IgY29tbWVudCBsZWZ0IGludGFjdCBoZXJlOgorICogPHZlbmRvciBjb21tZW50PgorICogSWYgVFBEIEJ1ZmZlciBzaXplIGVxdWFsIHRvIDAsIFBDSUUgRE1BUl9UT19JTlQKKyAqIHdpbGwgYXNzZXJ0LiBXZSBkbyBzb2Z0IHJlc2V0IDwweDE0MDA9MT4gYWNjb3JkaW5nCisgKiB3aXRoIHRoZSBTUEVDLiBCVVQsIGl0IHNlZW1lcyB0aGF0IFBDSUUgb3IgRE1BCisgKiBzdGF0ZS1tYWNoaW5lIHdpbGwgbm90IGJlIHJlc2V0LiBETUFSX1RPX0lOVCB3aWxsCisgKiBhc3NlcnQgYWdhaW4gYW5kIGFnYWluLgorICogPC92ZW5kb3IgY29tbWVudD4KICAqLwotc3RhdGljIHZvaWQgYXRsMV9jbGVhbl9yeF9yaW5nKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGF0bDFfcmZkX3JpbmcgKnJmZF9yaW5nID0gJmFkYXB0ZXItPnJmZF9yaW5nOwotCXN0cnVjdCBhdGwxX3JyZF9yaW5nICpycmRfcmluZyA9ICZhZGFwdGVyLT5ycmRfcmluZzsKLQlzdHJ1Y3QgYXRsMV9idWZmZXIgKmJ1ZmZlcl9pbmZvOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCB0eF90aW1lb3V0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAKLQkvKiBGcmVlIGFsbCB0aGUgUnggcmluZyBza19idWZmcyAqLwotCWZvciAoaSA9IDA7IGkgPCByZmRfcmluZy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJfaW5mbyA9ICZyZmRfcmluZy0+YnVmZmVyX2luZm9baV07Ci0JCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwZGV2LAotCQkJCQlidWZmZXJfaW5mby0+ZG1hLAotCQkJCQlidWZmZXJfaW5mby0+bGVuZ3RoLAotCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7Ci0JCX0KLQkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKLQkJCWRldl9rZnJlZV9za2IoYnVmZmVyX2luZm8tPnNrYik7Ci0JCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKLQkJfQotCX0KLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bDFfYnVmZmVyKSAqIHJmZF9yaW5nLT5jb3VudDsKLQltZW1zZXQocmZkX3JpbmctPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKLQotCS8qIFplcm8gb3V0IHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KLQltZW1zZXQocmZkX3JpbmctPmRlc2MsIDAsIHJmZF9yaW5nLT5zaXplKTsKLQotCXJmZF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKLQlhdG9taWNfc2V0KCZyZmRfcmluZy0+bmV4dF90b191c2UsIDApOwotCi0JcnJkX3JpbmctPm5leHRfdG9fdXNlID0gMDsKLQlhdG9taWNfc2V0KCZycmRfcmluZy0+bmV4dF90b19jbGVhbiwgMCk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWF0bDFfZG93bihhZGFwdGVyKTsKKwlhdGwxX3VwKGFkYXB0ZXIpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIH0KIAogLyoKLSAqIGF0bDFfY2xlYW5fdHhfcmluZyAtIEZyZWUgVHggQnVmZmVycwotICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBhdGwxX2xpbmtfY2hnX3Rhc2sgLSBkZWFsIHdpdGggbGluayBjaGFuZ2UgZXZlbnQgT3V0IG9mIGludGVycnVwdCBjb250ZXh0CiAgKi8KLXN0YXRpYyB2b2lkIGF0bDFfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYXRsMV9saW5rX2NoZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXRsMV90cGRfcmluZyAqdHBkX3JpbmcgPSAmYWRhcHRlci0+dHBkX3Jpbmc7Ci0Jc3RydWN0IGF0bDFfYnVmZmVyICpidWZmZXJfaW5mbzsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQorICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGwxX2FkYXB0ZXIsIGxpbmtfY2hnX3Rhc2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBGcmVlIGFsbCB0aGUgVHggcmluZyBza19idWZmcyAqLwotCWZvciAoaSA9IDA7IGkgPCB0cGRfcmluZy0+Y291bnQ7IGkrKykgewotCQlidWZmZXJfaW5mbyA9ICZ0cGRfcmluZy0+YnVmZmVyX2luZm9baV07Ci0JCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBidWZmZXJfaW5mby0+ZG1hLAotCQkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOwotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHRwZF9yaW5nLT5jb3VudDsgaSsrKSB7Ci0JCWJ1ZmZlcl9pbmZvID0gJnRwZF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKLQkJaWYgKGJ1ZmZlcl9pbmZvLT5za2IpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOwotCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdGwxX2J1ZmZlcikgKiB0cGRfcmluZy0+Y291bnQ7Ci0JbWVtc2V0KHRwZF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7Ci0KLQkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCi0JbWVtc2V0KHRwZF9yaW5nLT5kZXNjLCAwLCB0cGRfcmluZy0+c2l6ZSk7Ci0KLQlhdG9taWNfc2V0KCZ0cGRfcmluZy0+bmV4dF90b191c2UsIDApOwotCWF0b21pY19zZXQoJnRwZF9yaW5nLT5uZXh0X3RvX2NsZWFuLCAwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCWF0bDFfY2hlY2tfbGluayhhZGFwdGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiB9CiAKLS8qCi0gKiBhdGwxX2ZyZWVfcmluZ19yZXNvdXJjZXMgLSBGcmVlIFR4IC8gUlggZGVzY3JpcHRvciBSZXNvdXJjZXMKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICoKLSAqIEZyZWUgYWxsIHRyYW5zbWl0IHNvZnR3YXJlIHJlc291cmNlcwotICovCi12b2lkIGF0bDFfZnJlZV9yaW5nX3Jlc291cmNlcyhzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYXRsMV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7Ci0Jc3RydWN0IGF0bDFfdHBkX3JpbmcgKnRwZF9yaW5nID0gJmFkYXB0ZXItPnRwZF9yaW5nOwotCXN0cnVjdCBhdGwxX3JmZF9yaW5nICpyZmRfcmluZyA9ICZhZGFwdGVyLT5yZmRfcmluZzsKLQlzdHJ1Y3QgYXRsMV9ycmRfcmluZyAqcnJkX3JpbmcgPSAmYWRhcHRlci0+cnJkX3Jpbmc7Ci0Jc3RydWN0IGF0bDFfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkYXB0ZXItPnJpbmdfaGVhZGVyOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGN0cmw7CiAKLQlhdGwxX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7Ci0JYXRsMV9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJLyogYXRsMV9pcnFfZGlzYWJsZShhZGFwdGVyKTsgKi8KKwlhZGFwdGVyLT52bGdycCA9IGdycDsKIAotCWtmcmVlKHRwZF9yaW5nLT5idWZmZXJfaW5mbyk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwgcmluZ19oZWFkZXItPmRlc2MsCi0JCQkgICAgcmluZ19oZWFkZXItPmRtYSk7CisJaWYgKGdycCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCB8PSBNQUNfQ1RSTF9STVZfVkxBTjsKKwkJaW93cml0ZTMyKGN0cmwsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBpb3JlYWQzMihhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCAmPSB+TUFDX0NUUkxfUk1WX1ZMQU47CisJCWlvd3JpdGUzMihjdHJsLCBhZGFwdGVyLT5ody5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwl9CiAKLQl0cGRfcmluZy0+YnVmZmVyX2luZm8gPSBOVUxMOwotCXRwZF9yaW5nLT5kZXNjID0gTlVMTDsKLQl0cGRfcmluZy0+ZG1hID0gMDsKKwkvKiBhdGwxX2lycV9lbmFibGUoYWRhcHRlcik7ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQogCi0JcmZkX3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKLQlyZmRfcmluZy0+ZGVzYyA9IE5VTEw7Ci0JcmZkX3JpbmctPmRtYSA9IDA7CitzdGF0aWMgdm9pZCBhdGwxX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQoreworCWF0bDFfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKK30KIAotCXJyZF9yaW5nLT5kZXNjID0gTlVMTDsKLQlycmRfcmluZy0+ZG1hID0gMDsKK2ludCBhdGwxX3Jlc2V0KHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldDsKKworCXJldCA9IGF0bDFfcmVzZXRfaHcoJmFkYXB0ZXItPmh3KTsKKwlpZiAocmV0ICE9IEFUTDFfU1VDQ0VTUykKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYXRsMV9pbml0X2h3KCZhZGFwdGVyLT5odyk7CiB9CiAKIHMzMiBhdGwxX3VwKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xNzIzLDYgKzE5NjYsNyBAQAogCiAJLyogaGFyZHdhcmUgaGFzIGJlZW4gcmVzZXQsIHdlIG5lZWQgdG8gcmVsb2FkIHNvbWUgdGhpbmdzICovCiAJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKKwlhdGwxX2luaXRfcmluZ19wdHJzKGFkYXB0ZXIpOwogCWF0bDFfcmVzdG9yZV92bGFuKGFkYXB0ZXIpOwogCWVyciA9IGF0bDFfYWxsb2NfcnhfYnVmZmVycyhhZGFwdGVyKTsKIAlpZiAodW5saWtlbHkoIWVycikpCQkvKiBubyBSWCBCVUZGRVIgYWxsb2NhdGVkICovCkBAIC0xNzUwLDExICsxOTk0LDYgQEAKIAlhdGwxX2NoZWNrX2xpbmsoYWRhcHRlcik7CiAJcmV0dXJuIDA7CiAKLQkvKiBGSVhNRTogdW5yZWFjaGFibGUgY29kZSEgLS0gQ0hTICovCi0JLyogZnJlZSBpcnEgZGlzYWJsZSBhbnkgaW50ZXJydXB0ICovCi0JaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfSU1SKTsKLQlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7Ci0KIGVycl91cDoKIAlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CiAJLyogZnJlZSByeF9idWZmZXJzICovCkBAIC0xNzg2LDE3MiArMjAyNSw2IEBACiB9CiAKIC8qCi0gKiBhdGwxX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdAotICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQG5ld19tdHU6IG5ldyB2YWx1ZSBmb3IgbWF4aW11bSBmcmFtZSBzaXplCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKLSAqLwotc3RhdGljIGludCBhdGwxX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JaW50IG9sZF9tdHUgPSBuZXRkZXYtPm10dTsKLQlpbnQgbWF4X2ZyYW1lID0gbmV3X210dSArIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKLQotCWlmICgobWF4X2ZyYW1lIDwgTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB8fAotCSAgICAobWF4X2ZyYW1lID4gTUFYX0pVTUJPX0ZSQU1FX1NJWkUpKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJpbnZhbGlkIE1UVSBzZXR0aW5nXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYWRhcHRlci0+aHcubWF4X2ZyYW1lX3NpemUgPSBtYXhfZnJhbWU7Ci0JYWRhcHRlci0+aHcudHhfanVtYm9fdGFza190aCA9IChtYXhfZnJhbWUgKyA3KSA+PiAzOwotCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSAobWF4X2ZyYW1lICsgNykgJiB+NzsKLQlhZGFwdGVyLT5ody5yeF9qdW1ib190aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gLyA4OwotCi0JbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OwotCWlmICgob2xkX210dSAhPSBuZXdfbXR1KSAmJiBuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJYXRsMV9kb3duKGFkYXB0ZXIpOwotCQlhdGwxX3VwKGFkYXB0ZXIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogYXRsMV9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKLSAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKLSAqLwotc3RhdGljIGludCBhdGwxX3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKLQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwotCi0JbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOwotCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7Ci0KLQlhdGwxX3NldF9tYWNfYWRkcigmYWRhcHRlci0+aHcpOwotCXJldHVybiAwOwotfQotCi0vKgotICogYXRsMV93YXRjaGRvZyAtIFRpbWVyIENhbGwtYmFjawotICogQGRhdGE6IHBvaW50ZXIgdG8gbmV0ZGV2IGNhc3QgaW50byBhbiB1bnNpZ25lZCBsb25nCi0gKi8KLXN0YXRpYyB2b2lkIGF0bDFfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7Ci0KLQkvKiBSZXNldCB0aGUgdGltZXIgKi8KLQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMiAqIEhaKTsKLX0KLQotc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JdTE2IHJlc3VsdDsKLQotCWF0bDFfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgcmVnX251bSAmIDB4MWYsICZyZXN1bHQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCWF0bDFfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIHJlZ19udW0sIHZhbCk7Ci19Ci0KLS8qCi0gKiBhdGwxX21paV9pb2N0bCAtCi0gKiBAbmV0ZGV2OgotICogQGlmcmVxOgotICogQGNtZDoKLSAqLwotc3RhdGljIGludCBhdGwxX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXR2YWw7Ci0KLQlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCXJldHZhbCA9IGdlbmVyaWNfbWlpX2lvY3RsKCZhZGFwdGVyLT5taWksIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBhdGwxX2lvY3RsIC0KLSAqIEBuZXRkZXY6Ci0gKiBAaWZyZXE6Ci0gKiBAY21kOgotICovCi1zdGF0aWMgaW50IGF0bDFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNJT0NHTUlJUEhZOgotCWNhc2UgU0lPQ0dNSUlSRUc6Ci0JY2FzZSBTSU9DU01JSVJFRzoKLQkJcmV0dXJuIGF0bDFfbWlpX2lvY3RsKG5ldGRldiwgaWZyLCBjbWQpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci19Ci0KLS8qCi0gKiBhdGwxX3R4X3RpbWVvdXQgLSBSZXNwb25kIHRvIGEgVHggSGFuZwotICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICovCi1zdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLwotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7Ci19Ci0KLS8qCi0gKiBhdGwxX3BoeV9jb25maWcgLSBUaW1lciBDYWxsLWJhY2sKLSAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZwotICovCi1zdGF0aWMgdm9pZCBhdGwxX3BoeV9jb25maWcodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGF0bDFfYWRhcHRlciAqKWRhdGE7Ci0Jc3RydWN0IGF0bDFfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCWFkYXB0ZXItPnBoeV90aW1lcl9wZW5kaW5nID0gZmFsc2U7Ci0JYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQURWRVJUSVNFLCBody0+bWlpX2F1dG9uZWdfYWR2X3JlZyk7Ci0JYXRsMV93cml0ZV9waHlfcmVnKGh3LCBNSUlfQVQwMDFfQ1IsIGh3LT5taWlfMTAwMHRfY3RybF9yZWcpOwotCWF0bDFfd3JpdGVfcGh5X3JlZyhodywgTUlJX0JNQ1IsIE1JSV9DUl9SRVNFVCB8IE1JSV9DUl9BVVRPX05FR19FTik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotfQotCi1pbnQgYXRsMV9yZXNldChzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBhdGwxX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7Ci0JaWYgKHJldCAhPSBBVEwxX1NVQ0NFU1MpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGF0bDFfaW5pdF9odygmYWRhcHRlci0+aHcpOwotfQotCi0vKgogICogYXRsMV9vcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICoKQEAgLTIwMDMsNiArMjA3NiwxMDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhdGwxX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1MzIgY3RybCA9IDA7CisJdTMyIHd1ZmMgPSBhZGFwdGVyLT53b2w7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJYXRsMV9kb3duKGFkYXB0ZXIpOworCisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7CisJYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7CisJaWYgKGN0cmwgJiBCTVNSX0xTVEFUVVMpCisJCXd1ZmMgJj0gfkFUTDFfV1VGQ19MTktDOworCisJLyogcmVkdWNlIHNwZWVkIHRvIDEwLzEwME0gKi8KKwlpZiAod3VmYykgeworCQlhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoaHcpOworCQkvKiBpZiByZXN1bWUsIGxldCBkcml2ZXIgdG8gcmUtIHNldHVwIGxpbmsgKi8KKwkJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7CisJCWF0bDFfc2V0X21hY19hZGRyKGh3KTsKKwkJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKKworCQljdHJsID0gMDsKKwkJLyogdHVybiBvbiBtYWdpYyBwYWNrZXQgd29sICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX01BRykKKwkJCWN0cmwgPSBXT0xfTUFHSUNfRU4gfCBXT0xfTUFHSUNfUE1FX0VOOworCisJCS8qIHR1cm4gb24gTGluayBjaGFuZ2UgV09MICovCisJCWlmICh3dWZjICYgQVRMMV9XVUZDX0xOS0MpCisJCQljdHJsIHw9IChXT0xfTElOS19DSEdfRU4gfCBXT0xfTElOS19DSEdfUE1FX0VOKTsKKwkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKKworCQkvKiB0dXJuIG9uIGFsbC1tdWx0aSBtb2RlIGlmIHdha2Ugb24gbXVsdGljYXN0IGlzIGVuYWJsZWQgKi8KKwkJY3RybCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKKwkJY3RybCAmPSB+TUFDX0NUUkxfREJHOworCQljdHJsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47CisJCWlmICh3dWZjICYgQVRMMV9XVUZDX01DKQorCQkJY3RybCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47CisJCWVsc2UKKwkJCWN0cmwgJj0gfk1BQ19DVFJMX01DX0FMTF9FTjsKKworCQkvKiB0dXJuIG9uIGJyb2FkY2FzdCBtb2RlIGlmIHdha2Ugb24tQkMgaXMgZW5hYmxlZCAqLworCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19CQykKKwkJCWN0cmwgfD0gTUFDX0NUUkxfQkNfRU47CisJCWVsc2UKKwkJCWN0cmwgJj0gfk1BQ19DVFJMX0JDX0VOOworCisJCS8qIGVuYWJsZSBSWCAqLworCQljdHJsIHw9IE1BQ19DVFJMX1JYX0VOOworCQlpb3dyaXRlMzIoY3RybCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOworCX0gZWxzZSB7CisJCWlvd3JpdGUzMigwLCBody0+aHdfYWRkciArIFJFR19XT0xfQ1RSTCk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CisJfQorCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRsMV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYXRsMV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1MzIgcmV0X3ZhbDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlyZXRfdmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2hvdCwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOworCisJaW93cml0ZTMyKDAsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOworCWF0bDFfcmVzZXQoYWRhcHRlcik7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlhdGwxX3VwKGFkYXB0ZXIpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKworCWF0bDFfdmlhX3dvcmthcm91bmQoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGF0bDFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGF0bDFfcmVzdW1lIE5VTEwKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIGF0bDFfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CkBAIC0yMDEzLDY5ICsyMTg1LDYgQEAKICNlbmRpZgogCiAvKgotICogSWYgVFBEIEJ1ZmZlciBzaXplIGVxdWFsIHRvIDAsIFBDSUUgRE1BUl9UT19JTlQKLSAqIHdpbGwgYXNzZXJ0LiBXZSBkbyBzb2Z0IHJlc2V0IDwweDE0MDA9MT4gYWNjb3JkaW5nCi0gKiB3aXRoIHRoZSBTUEVDLiBCVVQsIGl0IHNlZW1lcyB0aGF0IFBDSUUgb3IgRE1BCi0gKiBzdGF0ZS1tYWNoaW5lIHdpbGwgbm90IGJlIHJlc2V0LiBETUFSX1RPX0lOVCB3aWxsCi0gKiBhc3NlcnQgYWdhaW4gYW5kIGFnYWluLgotICovCi1zdGF0aWMgdm9pZCBhdGwxX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlciA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRsMV9hZGFwdGVyLCB0eF90aW1lb3V0X3Rhc2spOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0KLQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7Ci0JYXRsMV9kb3duKGFkYXB0ZXIpOwotCWF0bDFfdXAoYWRhcHRlcik7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwotfQotCi0vKgotICogYXRsMV9saW5rX2NoZ190YXNrIC0gZGVhbCB3aXRoIGxpbmsgY2hhbmdlIGV2ZW50IE91dCBvZiBpbnRlcnJ1cHQgY29udGV4dAotICovCi1zdGF0aWMgdm9pZCBhdGwxX2xpbmtfY2hnX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPQotICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhdGwxX2FkYXB0ZXIsIGxpbmtfY2hnX3Rhc2spOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOwotCWF0bDFfY2hlY2tfbGluayhhZGFwdGVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBhdGwxX3BjaWVfcGF0Y2ggLSBQYXRjaCBmb3IgUENJRSBtb2R1bGUKLSAqLwotc3RhdGljIHZvaWQgYXRsMV9wY2llX3BhdGNoKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTMyIHZhbHVlOwotCXZhbHVlID0gMHg2NTAwOwotCWlvd3JpdGUzMih2YWx1ZSwgYWRhcHRlci0+aHcuaHdfYWRkciArIDB4MTJGQyk7Ci0JLyogcGNpZSBmbG93IGNvbnRyb2wgbW9kZSBjaGFuZ2UgKi8KLQl2YWx1ZSA9IGlvcmVhZDMyKGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEwMDgpOwotCXZhbHVlIHw9IDB4ODAwMDsKLQlpb3dyaXRlMzIodmFsdWUsIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyAweDEwMDgpOwotfQotCi0vKgotICogV2hlbiBBQ1BJIHJlc3VtZSBvbiBzb21lIFZJQSBNb3RoZXJCb2FyZCwgdGhlIEludGVycnVwdCBEaXNhYmxlIGJpdC8weDQwMAotICogb24gUENJIENvbW1hbmQgcmVnaXN0ZXIgaXMgZGlzYWJsZS4KLSAqIFRoZSBmdW5jdGlvbiBlbmFibGUgdGhpcyBiaXQuCi0gKiBCcmFja2V0dCwgMjAwNi8wMy8xNQotICovCi1zdGF0aWMgdm9pZCBhdGwxX3ZpYV93b3JrYXJvdW5kKHN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCXZhbHVlID0gaW9yZWFkMTYoYWRhcHRlci0+aHcuaHdfYWRkciArIFBDSV9DT01NQU5EKTsKLQlpZiAodmFsdWUgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpCi0JCXZhbHVlICY9IH5QQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEU7Ci0JaW93cml0ZTMyKHZhbHVlLCBhZGFwdGVyLT5ody5od19hZGRyICsgUENJX0NPTU1BTkQpOwotfQotCi0vKgogICogYXRsMV9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCiAgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKICAqIEBlbnQ6IGVudHJ5IGluIGF0bDFfcGNpX3RibApAQCAtMjA4Nyw3ICsyMTk2LDcgQEAKICAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhdGwxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IGF0bDFfYWRhcHRlciAqYWRhcHRlcjsKQEAgLTIxNDEsNyArMjI1MCw3IEBACiAJfQogCS8qIGdldCBkZXZpY2UgcmV2aXNpb24gbnVtYmVyICovCiAJYWRhcHRlci0+aHcuZGV2X3JldiA9IGlvcmVhZDE2KGFkYXB0ZXItPmh3Lmh3X2FkZHIgKwotCQkJCQkoUkVHX01BU1RFUl9DVFJMICsgMikpOworCQkoUkVHX01BU1RFUl9DVFJMICsgMikpOwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJ2ZXJzaW9uICVzXG4iLCBEUklWRVJfVkVSU0lPTik7CiAKIAkvKiBzZXQgZGVmYXVsdCByaW5nIHJlc291cmNlIGNvdW50cyAqLwpAQCAtMjI5NCw3ICsyNDAzLDggQEAKIAkgKiBhZGRyZXNzLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIHBlcm1hbmVudCBvbmUuCiAJICovCiAJaWYgKG1lbWNtcChhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRhcHRlci0+aHcucGVybV9tYWNfYWRkciwgRVRIX0FMRU4pKSB7Ci0JCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRhcHRlci0+aHcucGVybV9tYWNfYWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkoYWRhcHRlci0+aHcubWFjX2FkZHIsIGFkYXB0ZXItPmh3LnBlcm1fbWFjX2FkZHIsCisJCQlFVEhfQUxFTik7CiAJCWF0bDFfc2V0X21hY19hZGRyKCZhZGFwdGVyLT5odyk7CiAJfQogCkBAIC0yMzA2LDExMiArMjQxNiwxMSBAQAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBhdGwxX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBhdGwxX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgY3RybCA9IDA7Ci0JdTMyIHd1ZmMgPSBhZGFwdGVyLT53b2w7Ci0KLQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7Ci0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKLQkJYXRsMV9kb3duKGFkYXB0ZXIpOwotCi0JYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7Ci0JYXRsMV9yZWFkX3BoeV9yZWcoaHcsIE1JSV9CTVNSLCAodTE2ICopICYgY3RybCk7Ci0JaWYgKGN0cmwgJiBCTVNSX0xTVEFUVVMpCi0JCXd1ZmMgJj0gfkFUTDFfV1VGQ19MTktDOwotCi0JLyogcmVkdWNlIHNwZWVkIHRvIDEwLzEwME0gKi8KLQlpZiAod3VmYykgewotCQlhdGwxX3BoeV9lbnRlcl9wb3dlcl9zYXZpbmcoaHcpOwotCQkvKiBpZiByZXN1bWUsIGxldCBkcml2ZXIgdG8gcmUtIHNldHVwIGxpbmsgKi8KLQkJaHctPnBoeV9jb25maWd1cmVkID0gZmFsc2U7Ci0JCWF0bDFfc2V0X21hY19hZGRyKGh3KTsKLQkJYXRsMV9zZXRfbXVsdGkobmV0ZGV2KTsKLQotCQljdHJsID0gMDsKLQkJLyogdHVybiBvbiBtYWdpYyBwYWNrZXQgd29sICovCi0JCWlmICh3dWZjICYgQVRMMV9XVUZDX01BRykKLQkJCWN0cmwgPSBXT0xfTUFHSUNfRU4gfCBXT0xfTUFHSUNfUE1FX0VOOwotCi0JCS8qIHR1cm4gb24gTGluayBjaGFuZ2UgV09MICovCi0JCWlmICh3dWZjICYgQVRMMV9XVUZDX0xOS0MpCi0JCQljdHJsIHw9IChXT0xfTElOS19DSEdfRU4gfCBXT0xfTElOS19DSEdfUE1FX0VOKTsKLQkJaW93cml0ZTMyKGN0cmwsIGh3LT5od19hZGRyICsgUkVHX1dPTF9DVFJMKTsKLQotCQkvKiB0dXJuIG9uIGFsbC1tdWx0aSBtb2RlIGlmIHdha2Ugb24gbXVsdGljYXN0IGlzIGVuYWJsZWQgKi8KLQkJY3RybCA9IGlvcmVhZDMyKGh3LT5od19hZGRyICsgUkVHX01BQ19DVFJMKTsKLQkJY3RybCAmPSB+TUFDX0NUUkxfREJHOwotCQljdHJsICY9IH5NQUNfQ1RSTF9QUk9NSVNfRU47Ci0JCWlmICh3dWZjICYgQVRMMV9XVUZDX01DKQotCQkJY3RybCB8PSBNQUNfQ1RSTF9NQ19BTExfRU47Ci0JCWVsc2UKLQkJCWN0cmwgJj0gfk1BQ19DVFJMX01DX0FMTF9FTjsKLQotCQkvKiB0dXJuIG9uIGJyb2FkY2FzdCBtb2RlIGlmIHdha2Ugb24tQkMgaXMgZW5hYmxlZCAqLwotCQlpZiAod3VmYyAmIEFUTDFfV1VGQ19CQykKLQkJCWN0cmwgfD0gTUFDX0NUUkxfQkNfRU47Ci0JCWVsc2UKLQkJCWN0cmwgJj0gfk1BQ19DVFJMX0JDX0VOOwotCi0JCS8qIGVuYWJsZSBSWCAqLwotCQljdHJsIHw9IE1BQ19DVFJMX1JYX0VOOwotCQlpb3dyaXRlMzIoY3RybCwgaHctPmh3X2FkZHIgKyBSRUdfTUFDX0NUUkwpOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAxKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDEpOwkvKiA0ID09IEQzIGNvbGQgKi8KLQl9IGVsc2UgewotCQlpb3dyaXRlMzIoMCwgaHctPmh3X2FkZHIgKyBSRUdfV09MX0NUUkwpOwotCQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKLQkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIDApOwkvKiA0ID09IEQzIGNvbGQgKi8KLQl9Ci0KLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdGwxX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhdGwxX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXUzMiByZXRfdmFsOwotCi0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQotCXJldF92YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7Ci0KLQlpb3dyaXRlMzIoMCwgYWRhcHRlci0+aHcuaHdfYWRkciArIFJFR19XT0xfQ1RSTCk7Ci0JYXRsMV9yZXNldChhZGFwdGVyKTsKLQotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCWF0bDFfdXAoYWRhcHRlcik7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwotCi0JYXRsMV92aWFfd29ya2Fyb3VuZChhZGFwdGVyKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYXRsMV9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgYXRsMV9yZXN1bWUgTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdGwxX2RyaXZlciA9IHsKIAkubmFtZSA9IGF0bDFfZHJpdmVyX25hbWUsCiAJLmlkX3RhYmxlID0gYXRsMV9wY2lfdGJsLAogCS5wcm9iZSA9IGF0bDFfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGF0bDFfcmVtb3ZlKSwKLQkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KLQkvKiBwcm9iYWJseSBicm9rZW4gcmlnaHQgbm93IC0tIENIUyAqLwogCS5zdXNwZW5kID0gYXRsMV9zdXNwZW5kLAogCS5yZXN1bWUgPSBhdGwxX3Jlc3VtZQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYS5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKaW5kZXggZjAzZjA3MC4uNjYyOGZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhLmgKQEAgLTM5LDEzICszOSwxMyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJlaGVhIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiRUhFQV8wMDY3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiRUhFQV8wMDcwIgogCi0vKiBFSEVBIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKy8qIGVIRUEgY2FwYWJpbGl0eSBmbGFncyAqLwogI2RlZmluZSBETFBBUl9QT1JUX0FERF9SRU0gMQotI2RlZmluZSBETFBBUl9NRU1fQUREIDIKLSNkZWZpbmUgRExQQVJfTUVNX1JFTSA0Ci0jZGVmaW5lIEVIRUFfQ0FQQUJJTElUSUVTIChETFBBUl9QT1JUX0FERF9SRU0pCisjZGVmaW5lIERMUEFSX01FTV9BREQgICAgICAyCisjZGVmaW5lIERMUEFSX01FTV9SRU0gICAgICA0CisjZGVmaW5lIEVIRUFfQ0FQQUJJTElUSUVTICAoRExQQVJfUE9SVF9BRERfUkVNKQogCiAjZGVmaW5lIEVIRUFfTVNHX0RFRkFVTFQgKE5FVElGX01TR19MSU5LIHwgTkVUSUZfTVNHX1RJTUVSIFwKIAl8IE5FVElGX01TR19SWF9FUlIgfCBORVRJRl9NU0dfVFhfRVJSKQpAQCAtMTEzLDYgKzExMyw4IEBACiAvKiBNZW1vcnkgUmVnaW9ucyAqLwogI2RlZmluZSBFSEVBX01SX0FDQ19DVFJMICAgICAgIDB4MDA4MDAwMDAKIAorI2RlZmluZSBFSEVBX0JVU01BUF9TVEFSVCAgICAgIDB4ODAwMDAwMDAwMDAwMDAwMFVMTAorCiAjZGVmaW5lIEVIRUFfV0FUQ0hfRE9HX1RJTUVPVVQgMTAqSFoKIAogLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KQEAgLTE4Niw2ICsxODgsMTIgQEAKIAkJCQkgICBzZXQgdG8gMCBpZiB1bnVzZWQgKi8KIH07CiAKK3N0cnVjdCBlaGVhX2J1c21hcCB7CisJdW5zaWduZWQgaW50IGVudHJpZXM7CQkvKiB0b3RhbCBudW1iZXIgb2YgZW50cmllcyAqLworCXVuc2lnbmVkIGludCB2YWxpZF9zZWN0aW9uczsJLyogbnVtYmVyIG9mIHZhbGlkIHNlY3Rpb25zICovCisJdTY0ICp2YWRkcjsKK307CisKIHN0cnVjdCBlaGVhX3FwOwogc3RydWN0IGVoZWFfY3E7CiBzdHJ1Y3QgZWhlYV9lcTsKQEAgLTM4Miw2ICszOTAsOCBAQAogCXN0cnVjdCBlaGVhX21yIG1yOwogCXUzMiBwZDsgICAgICAgICAgICAgICAgICAgIC8qIHByb3RlY3Rpb24gZG9tYWluICovCiAJdTY0IG1heF9tY19tYWM7ICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBtdWx0aWNhc3QgbWFjIGFkZHJlc3NlcyAqLworCWludCBhY3RpdmVfcG9ydHM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAogCkBAIC00MzEsNiArNDQxLDkgQEAKIAlpbnQgbWF4X2VudHJpZXNfcnEzOwogfTsKIAorZW51bSBlaGVhX2ZsYWdfYml0cyB7CisJX19FSEVBX1NUT1BfWEZFUgorfTsKIAogdm9pZCBlaGVhX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIGludCBlaGVhX3NlbnNlX3BvcnRfYXR0cihzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfbWFpbi5jCmluZGV4IDM4MzE0NGQuLjFkMTU3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX21haW4uYwpAQCAtNzksNiArNzksMTEgQEAKIE1PRFVMRV9QQVJNX0RFU0ModXNlX21jcywgIiAwOk5BUEksIDE6TXVsdGlwbGUgcmVjZWl2ZSBxdWV1ZXMsIERlZmF1bHQgPSAxICIpOwogCiBzdGF0aWMgaW50IHBvcnRfbmFtZV9jbnQgPSAwOworc3RhdGljIExJU1RfSEVBRChhZGFwdGVyX2xpc3QpOwordTY0IGVoZWFfZHJpdmVyX2ZsYWdzID0gMDsKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplaGVhX2RyaXZlcl93cTsKK3N0cnVjdCB3b3JrX3N0cnVjdCBlaGVhX3JlcmVnX21yX3Rhc2s7CisKIAogc3RhdGljIGludCBfX2RldmluaXQgZWhlYV9wcm9iZV9hZGFwdGVyKHN0cnVjdCBpYm1lYnVzX2RldiAqZGV2LAogCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCk7CkBAIC0yMzgsMTMgKzI0MywxNyBAQAogCQlyd3FlLT53cl9pZCA9IEVIRUFfQk1BU0tfU0VUKEVIRUFfV1JfSURfVFlQRSwgd3FlX3R5cGUpCiAJCQkgICAgfCBFSEVBX0JNQVNLX1NFVChFSEVBX1dSX0lEX0lOREVYLCBpbmRleCk7CiAJCXJ3cWUtPnNnX2xpc3RbMF0ubF9rZXkgPSBwci0+cmVjdl9tci5sa2V5OwotCQlyd3FlLT5zZ19saXN0WzBdLnZhZGRyID0gKHU2NClza2ItPmRhdGE7CisJCXJ3cWUtPnNnX2xpc3RbMF0udmFkZHIgPSBlaGVhX21hcF92YWRkcihza2ItPmRhdGEpOwogCQlyd3FlLT5zZ19saXN0WzBdLmxlbiA9IHBhY2tldF9zaXplOwogCQlyd3FlLT5kYXRhX3NlZ21lbnRzID0gMTsKIAogCQlpbmRleCsrOwogCQlpbmRleCAmPSBtYXhfaW5kZXhfbWFzazsKKworCQlpZiAodW5saWtlbHkodGVzdF9iaXQoX19FSEVBX1NUT1BfWEZFUiwgJmVoZWFfZHJpdmVyX2ZsYWdzKSkpCisJCQlnb3RvIG91dDsKIAl9CisKIAlxX3NrYmEtPmluZGV4ID0gaW5kZXg7CiAKIAkvKiBSaW5nIGRvb3JiZWxsICovCkBAIC0yNTMsNyArMjYyLDcgQEAKIAkJZWhlYV91cGRhdGVfcnEyYShwci0+cXAsIGkpOwogCWVsc2UKIAkJZWhlYV91cGRhdGVfcnEzYShwci0+cXAsIGkpOwotCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMyMSw3ICsxMzMwLDcgQEAKIAkJCXNnMWVudHJ5LT5sZW4gPSBza2JfZGF0YV9zaXplIC0gaGVhZGVyc2l6ZTsKIAogCQkJdG1wX2FkZHIgPSAodTY0KShza2ItPmRhdGEgKyBoZWFkZXJzaXplKTsKLQkJCXNnMWVudHJ5LT52YWRkciA9IHRtcF9hZGRyOworCQkJc2cxZW50cnktPnZhZGRyID0gZWhlYV9tYXBfdmFkZHIodG1wX2FkZHIpOwogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJfQogCX0gZWxzZQpAQCAtMTM1Miw3ICsxMzYxLDcgQEAKIAkJCXNnMWVudHJ5LT5sX2tleSA9IGxrZXk7CiAJCQlzZzFlbnRyeS0+bGVuID0gc2tiX2RhdGFfc2l6ZSAtIFNXUUUyX01BWF9JTU07CiAJCQl0bXBfYWRkciA9ICh1NjQpKHNrYi0+ZGF0YSArIFNXUUUyX01BWF9JTU0pOwotCQkJc2cxZW50cnktPnZhZGRyID0gdG1wX2FkZHI7CisJCQlzZzFlbnRyeS0+dmFkZHIgPSBlaGVhX21hcF92YWRkcih0bXBfYWRkcik7CiAJCQlzd3FlLT5kZXNjcmlwdG9ycysrOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEzOTEsNyArMTQwMCw3IEBACiAJCQlzZzFlbnRyeS0+bGVuID0gZnJhZy0+c2l6ZTsKIAkJCXRtcF9hZGRyID0gICh1NjQpKHBhZ2VfYWRkcmVzcyhmcmFnLT5wYWdlKQogCQkJCQkgICsgZnJhZy0+cGFnZV9vZmZzZXQpOwotCQkJc2cxZW50cnktPnZhZGRyID0gdG1wX2FkZHI7CisJCQlzZzFlbnRyeS0+dmFkZHIgPSBlaGVhX21hcF92YWRkcih0bXBfYWRkcik7CiAJCQlzd3FlLT5kZXNjcmlwdG9ycysrOwogCQkJc2cxZW50cnlfY29udGFpbnNfZnJhZ19kYXRhID0gMTsKIAkJfQpAQCAtMTQwNiw3ICsxNDE1LDcgQEAKIAogCQkJdG1wX2FkZHIgPSAodTY0KShwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkKIAkJCQkJICsgZnJhZy0+cGFnZV9vZmZzZXQpOwotCQkJc2dlbnRyeS0+dmFkZHIgPSB0bXBfYWRkcjsKKwkJCXNnZW50cnktPnZhZGRyID0gZWhlYV9tYXBfdmFkZHIodG1wX2FkZHIpOwogCQkJc3dxZS0+ZGVzY3JpcHRvcnMrKzsKIAkJfQogCX0KQEAgLTE4NzgsNiArMTg4Nyw5IEBACiAJCWVoZWFfZHVtcChzd3FlLCA1MTIsICJzd3FlIik7CiAJfQogCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KF9fRUhFQV9TVE9QX1hGRVIsICZlaGVhX2RyaXZlcl9mbGFncykpKQorCQlnb3RvIG91dDsKKwogCWVoZWFfcG9zdF9zd3FlKHByLT5xcCwgc3dxZSk7CiAJcHItPnR4X3BhY2tldHMrKzsKIApAQCAtMTg5Miw3ICsxOTA0LDcgQEAKIAl9CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAJc3Bpbl91bmxvY2soJnByLT54bWl0X2xvY2spOwotCitvdXQ6CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtMjIyMCw2ICsyMjMyLDkgQEAKIG91dF9jbGVhbl9wcjoKIAllaGVhX2NsZWFuX2FsbF9wb3J0cmVzKHBvcnQpOwogb3V0OgorCWlmIChyZXQpCisJCWVoZWFfaW5mbygiRmFpbGVkIHN0YXJ0aW5nICVzLiByZXQ9JWkiLCBkZXYtPm5hbWUsIHJldCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMjU5LDggKzIyNzQsMTMgQEAKIAkJCW1zbGVlcCgxKTsKIAogCWVoZWFfYnJvYWRjYXN0X3JlZ19oZWxwZXIocG9ydCwgSF9ERVJFR19CQ01DKTsKLQlyZXQgPSBlaGVhX2NsZWFuX2FsbF9wb3J0cmVzKHBvcnQpOwogCXBvcnQtPnN0YXRlID0gRUhFQV9QT1JUX0RPV047CisKKwlyZXQgPSBlaGVhX2NsZWFuX2FsbF9wb3J0cmVzKHBvcnQpOworCWlmIChyZXQpCisJCWVoZWFfaW5mbygiRmFpbGVkIGZyZWVpbmcgcmVzb3VyY2VzIGZvciAlcy4gcmV0PSVpIiwKKwkJCSAgZGV2LT5uYW1lLCByZXQpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjI5MiwxNSArMjMxMiwxMSBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKIAotCXJldCA9IGVoZWFfZG93bihkZXYpOwotCWlmIChyZXQpCi0JCWVoZWFfZXJyb3IoImVoZWFfZG93biBmYWlsZWQuIG5vdCBhbGwgcmVzb3VyY2VzIGFyZSBmcmVlZCIpOworCWVoZWFfZG93bihkZXYpOwogCiAJcmV0ID0gZWhlYV91cChkZXYpOwotCWlmIChyZXQpIHsKLQkJZWhlYV9lcnJvcigiUmVzZXQgZGV2aWNlICVzIGZhaWxlZDogcmV0PSVkIiwgZGV2LT5uYW1lLCByZXQpOworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAogCWlmIChuZXRpZl9tc2dfdGltZXIocG9ydCkpCiAJCWVoZWFfaW5mbygiRGV2aWNlICVzIHJlc2V0dGVkIHN1Y2Nlc3NmdWxseSIsIGRldi0+bmFtZSk7CkBAIC0yMzEyLDYgKzIzMjgsODggQEAKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkIGVoZWFfcmVyZWdfbXJzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwllaGVhX2luZm8oIkxQQVIgbWVtb3J5IGVubGFyZ2VkIC0gcmUtaW5pdGlhbGl6aW5nIGRyaXZlciIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwdGVyLCAmYWRhcHRlcl9saXN0LCBsaXN0KQorCQlpZiAoYWRhcHRlci0+YWN0aXZlX3BvcnRzKSB7CisJCQkvKiBTaHV0ZG93biBhbGwgcG9ydHMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKSB7CisJCQkJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisKKwkJCQlpZiAocG9ydCkgeworCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+bmV0ZGV2OworCisJCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCQllaGVhX2luZm8oInN0b3BwaW5nICVzIiwKKwkJCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJCQlkb3duKCZwb3J0LT5wb3J0X2xvY2spOworCQkJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJCQkJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CisJCQkJCQllaGVhX2Rvd24oZGV2KTsKKwkJCQkJCXVwKCZwb3J0LT5wb3J0X2xvY2spOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvKiBVbnJlZ2lzdGVyIG9sZCBtZW1vcnkgcmVnaW9uICovCisJCQlyZXQgPSBlaGVhX3JlbV9tcigmYWRhcHRlci0+bXIpOworCQkJaWYgKHJldCkgeworCQkJCWVoZWFfZXJyb3IoInVucmVnaXN0ZXIgTVIgZmFpbGVkIC0gZHJpdmVyIgorCQkJCQkgICAiIGlub3BlcmFibGUhIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCWVoZWFfZGVzdHJveV9idXNtYXAoKTsKKworCXJldCA9IGVoZWFfY3JlYXRlX2J1c21hcCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2xlYXJfYml0KF9fRUhFQV9TVE9QX1hGRVIsICZlaGVhX2RyaXZlcl9mbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXB0ZXIsICZhZGFwdGVyX2xpc3QsIGxpc3QpCisJCWlmIChhZGFwdGVyLT5hY3RpdmVfcG9ydHMpIHsKKwkJCS8qIFJlZ2lzdGVyIG5ldyBtZW1vcnkgcmVnaW9uICovCisJCQlyZXQgPSBlaGVhX3JlZ19rZXJuZWxfbXIoYWRhcHRlciwgJmFkYXB0ZXItPm1yKTsKKwkJCWlmIChyZXQpIHsKKwkJCQllaGVhX2Vycm9yKCJyZWdpc3RlciBNUiBmYWlsZWQgLSBkcml2ZXIiCisJCQkJCSAgICIgaW5vcGVyYWJsZSEiKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyogUmVzdGFydCBhbGwgcG9ydHMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBFSEVBX01BWF9QT1JUUzsgaSsrKSB7CisJCQkJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IGFkYXB0ZXItPnBvcnRbaV07CisKKwkJCQlpZiAocG9ydCkgeworCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+bmV0ZGV2OworCisJCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCQllaGVhX2luZm8oInJlc3RhcnRpbmcgJXMiLAorCQkJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQkJCWRvd24oJnBvcnQtPnBvcnRfbG9jayk7CisKKwkJCQkJCXJldCA9IGVoZWFfdXAoZGV2KTsKKwkJCQkJCWlmICghcmV0KSB7CisJCQkJCQkJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKwkJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCQl9CisKKwkJCQkJCXVwKCZwb3J0LT5wb3J0X2xvY2spOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CitvdXQ6CisJcmV0dXJuOworfQorCiBzdGF0aWMgdm9pZCBlaGVhX3R4X3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yNTczLDYgKzI2NzEsOCBAQAogCWVoZWFfaW5mbygiJXM6IEp1bWJvIGZyYW1lcyBhcmUgJXNhYmxlZCIsIGRldi0+bmFtZSwKIAkJICBqdW1ibyA9PSAxID8gImVuIiA6ICJkaXMiKTsKIAorCWFkYXB0ZXItPmFjdGl2ZV9wb3J0cysrOworCiAJcmV0dXJuIHBvcnQ7CiAKIG91dF91bnJlZ19wb3J0OgpAQCAtMjU5Niw2ICsyNjk2LDcgQEAKIAllaGVhX3VucmVnaXN0ZXJfcG9ydChwb3J0KTsKIAlrZnJlZShwb3J0LT5tY19saXN0KTsKIAlmcmVlX25ldGRldihwb3J0LT5uZXRkZXYpOworCXBvcnQtPmFkYXB0ZXItPmFjdGl2ZV9wb3J0cy0tOwogfQogCiBzdGF0aWMgaW50IGVoZWFfc2V0dXBfcG9ydHMoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlcikKQEAgLTI3ODgsNiArMjg4OSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWxpc3RfYWRkKCZhZGFwdGVyLT5saXN0LCAmYWRhcHRlcl9saXN0KTsKKwogCWFkYXB0ZXItPmVidXNfZGV2ID0gZGV2OwogCiAJYWRhcHRlcl9oYW5kbGUgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5vZmRldi5ub2RlLCAiaWJtLGhlYS1oYW5kbGUiLApAQCAtMjg5MSw3ICsyOTk0LDEwIEBACiAKIAllaGVhX2Rlc3Ryb3lfZXEoYWRhcHRlci0+bmVxKTsKIAllaGVhX3JlbW92ZV9hZGFwdGVyX21yKGFkYXB0ZXIpOworCWxpc3RfZGVsKCZhZGFwdGVyLT5saXN0KTsKKwogCWtmcmVlKGFkYXB0ZXIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5MzksOSArMzA0NSwxOCBAQAogCXByaW50ayhLRVJOX0lORk8gIklCTSBlSEVBIGV0aGVybmV0IGRldmljZSBkcml2ZXIgKFJlbGVhc2UgJXMpXG4iLAogCSAgICAgICBEUlZfVkVSU0lPTik7CiAKKwllaGVhX2RyaXZlcl93cSA9IGNyZWF0ZV93b3JrcXVldWUoImVoZWFfZHJpdmVyX3dxIik7CisKKwlJTklUX1dPUksoJmVoZWFfcmVyZWdfbXJfdGFzaywgZWhlYV9yZXJlZ19tcnMpOworCiAJcmV0ID0gY2hlY2tfbW9kdWxlX3Bhcm0oKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKKworCXJldCA9IGVoZWFfY3JlYXRlX2J1c21hcCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCiAJcmV0ID0gaWJtZWJ1c19yZWdpc3Rlcl9kcml2ZXIoJmVoZWFfZHJpdmVyKTsKIAlpZiAocmV0KSB7CiAJCWVoZWFfZXJyb3IoImZhaWxlZCByZWdpc3RlcmluZyBlSEVBIGRldmljZSBkcml2ZXIgb24gZWJ1cyIpOwpAQCAtMjk2NSw2ICszMDgwLDcgQEAKIHsKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmVoZWFfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2NhcGFiaWxpdGllcyk7CiAJaWJtZWJ1c191bnJlZ2lzdGVyX2RyaXZlcigmZWhlYV9kcml2ZXIpOworCWVoZWFfZGVzdHJveV9idXNtYXAoKTsKIH0KIAogbW9kdWxlX2luaXQoZWhlYV9tb2R1bGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oIGIvZHJpdmVycy9uZXQvZWhlYS9laGVhX3BoeXAuaAppbmRleCBkMTdhNDVhLi44OWI2MzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcGh5cC5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9waHlwLmgKQEAgLTYwLDYgKzYwLDkgQEAKIAl9CiB9CiAKKy8qIE51bWJlciBvZiBwYWdlcyB3aGljaCBjYW4gYmUgcmVnaXN0ZXJlZCBhdCBvbmNlIGJ5IEhfUkVHSVNURVJfSEVBX1JQQUdFUyAqLworI2RlZmluZSBFSEVBX01BWF9SUEFHRSA1MTIKKwogLyogTm90aWZpY2F0aW9uIEV2ZW50IFF1ZXVlIChORVEpIEVudHJ5IGJpdCBtYXNrcyAqLwogI2RlZmluZSBORVFFX0VWRU5UX0NPREUJCUVIRUFfQk1BU0tfSUJNKDIsIDcpCiAjZGVmaW5lIE5FUUVfUE9SVE5VTSAgCQlFSEVBX0JNQVNLX0lCTSgzMiwgNDcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMgYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmMKaW5kZXggMjllYWE0Ni4uYTM2ZmE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5jCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuYwpAQCAtMzEsNiArMzEsMTMgQEAKICNpbmNsdWRlICJlaGVhX3BoeXAuaCIKICNpbmNsdWRlICJlaGVhX3Ftci5oIgogCisKK3N0cnVjdCBlaGVhX2J1c21hcCBlaGVhX2JtYXAgPSB7IDAsIDAsIE5VTEwgfTsKK2V4dGVybiB1NjQgZWhlYV9kcml2ZXJfZmxhZ3M7CitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmVoZWFfZHJpdmVyX3dxOworZXh0ZXJuIHN0cnVjdCB3b3JrX3N0cnVjdCBlaGVhX3JlcmVnX21yX3Rhc2s7CisKKwogc3RhdGljIHZvaWQgKmh3X3FwYWdlaXRfZ2V0X2luYyhzdHJ1Y3QgaHdfcXVldWUgKnF1ZXVlKQogewogCXZvaWQgKnJldHZhbHVlID0gaHdfcWVpdF9nZXQocXVldWUpOwpAQCAtNTQ3LDE4ICs1NTQsODQgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGVoZWFfY3JlYXRlX2J1c21hcCggdm9pZCApCit7CisJdTY0IHZhZGRyID0gRUhFQV9CVVNNQVBfU1RBUlQ7CisJdW5zaWduZWQgbG9uZyBhYnNfbWF4X3BmbiA9IDA7CisJdW5zaWduZWQgbG9uZyBzZWNfbWF4X3BmbjsKKwlpbnQgaTsKKworCS8qCisJICogU2VjdGlvbnMgYXJlIG5vdCBpbiBhc2NlbmRpbmcgb3JkZXIgLT4gTG9vcCBvdmVyIGFsbCBzZWN0aW9ucyBhbmQKKwkgKiBmaW5kIHRoZSBoaWdoZXN0IFBGTiB0byBjb21wdXRlIHRoZSByZXF1aXJlZCBtYXAgc2l6ZS4KKwkqLworCWVoZWFfYm1hcC52YWxpZF9zZWN0aW9ucyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTUVNX1NFQ1RJT05TOyBpKyspCisJCWlmICh2YWxpZF9zZWN0aW9uX25yKGkpKSB7CisJCQlzZWNfbWF4X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKGkpOworCQkJaWYgKHNlY19tYXhfcGZuID4gYWJzX21heF9wZm4pCisJCQkJYWJzX21heF9wZm4gPSBzZWNfbWF4X3BmbjsKKwkJCWVoZWFfYm1hcC52YWxpZF9zZWN0aW9ucysrOworCQl9CisKKwllaGVhX2JtYXAuZW50cmllcyA9IGFic19tYXhfcGZuIC8gRUhFQV9QQUdFU19QRVJfU0VDVElPTiArIDE7CisJZWhlYV9ibWFwLnZhZGRyID0gdm1hbGxvYyhlaGVhX2JtYXAuZW50cmllcyAqIHNpemVvZigqZWhlYV9ibWFwLnZhZGRyKSk7CisKKwlpZiAoIWVoZWFfYm1hcC52YWRkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwIDsgaSA8IGVoZWFfYm1hcC5lbnRyaWVzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSBzZWN0aW9uX25yX3RvX3BmbihpKTsKKworCQlpZiAocGZuX3ZhbGlkKHBmbikpIHsKKwkJCWVoZWFfYm1hcC52YWRkcltpXSA9IHZhZGRyOworCQkJdmFkZHIgKz0gRUhFQV9TRUNUU0laRTsKKwkJfSBlbHNlCisJCQllaGVhX2JtYXAudmFkZHJbaV0gPSAwOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGVoZWFfZGVzdHJveV9idXNtYXAoIHZvaWQgKQoreworCXZmcmVlKGVoZWFfYm1hcC52YWRkcik7Cit9CisKK3U2NCBlaGVhX21hcF92YWRkcih2b2lkICpjYWRkcikKK3sKKwl1NjQgbWFwcGVkX2FkZHI7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IF9fcGEoY2FkZHIpID4+IFNFQ1RJT05fU0laRV9CSVRTOworCisJaWYgKGxpa2VseShpbmRleCA8IGVoZWFfYm1hcC5lbnRyaWVzKSkgeworCQltYXBwZWRfYWRkciA9IGVoZWFfYm1hcC52YWRkcltpbmRleF07CisJCWlmIChsaWtlbHkobWFwcGVkX2FkZHIpKQorCQkJbWFwcGVkX2FkZHIgfD0gKCgodW5zaWduZWQgbG9uZyljYWRkcikKKwkJCQkJJiAoRUhFQV9TRUNUU0laRSAtIDEpKTsKKwkJZWxzZQorCQkJbWFwcGVkX2FkZHIgPSAtMTsKKwl9IGVsc2UKKwkJbWFwcGVkX2FkZHIgPSAtMTsKKworCWlmICh1bmxpa2VseShtYXBwZWRfYWRkciA9PSAtMSkpCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChfX0VIRUFfU1RPUF9YRkVSLCAmZWhlYV9kcml2ZXJfZmxhZ3MpKQorCQkJcXVldWVfd29yayhlaGVhX2RyaXZlcl93cSwgJmVoZWFfcmVyZWdfbXJfdGFzayk7CisKKwlyZXR1cm4gbWFwcGVkX2FkZHI7Cit9CisKIGludCBlaGVhX3JlZ19rZXJuZWxfbXIoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGVoZWFfbXIgKm1yKQogewotCWludCBpLCBrLCByZXQ7Ci0JdTY0IGhyZXQsIHB0X2Ficywgc3RhcnQsIGVuZCwgbnJfcGFnZXM7Ci0JdTMyIGFjY19jdHJsID0gRUhFQV9NUl9BQ0NfQ1RSTDsKKwlpbnQgcmV0OwogCXU2NCAqcHQ7CisJdm9pZCAqcGc7CisJdTY0IGhyZXQsIHB0X2FicywgaSwgaiwgbSwgbXJfbGVuOworCXUzMiBhY2NfY3RybCA9IEVIRUFfTVJfQUNDX0NUUkw7CiAKLQlzdGFydCA9IEtFUk5FTEJBU0U7Ci0JZW5kID0gKHU2NCloaWdoX21lbW9yeTsKLQlucl9wYWdlcyA9IChlbmQgLSBzdGFydCkgLyBFSEVBX1BBR0VTSVpFOworCW1yX2xlbiA9IGVoZWFfYm1hcC52YWxpZF9zZWN0aW9ucyAqIEVIRUFfU0VDVFNJWkU7CiAKLQlwdCA9ICBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJcHQgPSAga3phbGxvYyhFSEVBX01BWF9SUEFHRSAqIHNpemVvZih1NjQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXB0KSB7CiAJCWVoZWFfZXJyb3IoIm5vIG1lbSIpOwogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNTY2LDcgKzYzOSw4IEBACiAJfQogCXB0X2FicyA9IHZpcnRfdG9fYWJzKHB0KTsKIAotCWhyZXQgPSBlaGVhX2hfYWxsb2NfcmVzb3VyY2VfbXIoYWRhcHRlci0+aGFuZGxlLCBzdGFydCwgZW5kIC0gc3RhcnQsCisJaHJldCA9IGVoZWFfaF9hbGxvY19yZXNvdXJjZV9tcihhZGFwdGVyLT5oYW5kbGUsCisJCQkJCUVIRUFfQlVTTUFQX1NUQVJULCBtcl9sZW4sCiAJCQkJCWFjY19jdHJsLCBhZGFwdGVyLT5wZCwKIAkJCQkJJm1yLT5oYW5kbGUsICZtci0+bGtleSk7CiAJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7CkBAIC01NzUsNDkgKzY0OSw0MyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQltci0+dmFkZHIgPSBLRVJORUxCQVNFOwotCWsgPSAwOworCWZvciAoaSA9IDAgOyBpIDwgZWhlYV9ibWFwLmVudHJpZXM7IGkrKykKKwkJaWYgKGVoZWFfYm1hcC52YWRkcltpXSkgeworCQkJdm9pZCAqc2VjdGJhc2UgPSBfX3ZhKGkgPDwgU0VDVElPTl9TSVpFX0JJVFMpOworCQkJdW5zaWduZWQgbG9uZyBrID0gMDsKIAotCXdoaWxlIChucl9wYWdlcyA+IDApIHsKLQkJaWYgKG5yX3BhZ2VzID4gMSkgewotCQkJdTY0IG51bV9wYWdlcyA9IG1pbihucl9wYWdlcywgKHU2NCk1MTIpOwotCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQotCQkJCXB0W2ldID0gdmlydF90b19hYnMoKHZvaWQqKSgoKHU2NClzdGFydCkgKwotCQkJCQkJCSAgICAoKGsrKykgKgotCQkJCQkJCSAgICAgRUhFQV9QQUdFU0laRSkpKTsKKwkJCWZvciAoaiA9IDA7IGogPCAoUEFHRVNfUEVSX1NFQ1RJT04gLyBFSEVBX01BWF9SUEFHRSk7CisJCQkgICAgICBqKyspIHsKIAotCQkJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9ycGFnZV9tcihhZGFwdGVyLT5oYW5kbGUsCi0JCQkJCQkJbXItPmhhbmRsZSwgMCwKLQkJCQkJCQkwLCAodTY0KXB0X2FicywKLQkJCQkJCQludW1fcGFnZXMpOwotCQkJbnJfcGFnZXMgLT0gbnVtX3BhZ2VzOwotCQl9IGVsc2UgewotCQkJdTY0IGFic19hZHIgPSB2aXJ0X3RvX2Ficygodm9pZCopKCgodTY0KXN0YXJ0KSArCi0JCQkJCQkJICAoayAqIEVIRUFfUEFHRVNJWkUpKSk7CisJCQkJZm9yIChtID0gMDsgbSA8IEVIRUFfTUFYX1JQQUdFOyBtKyspIHsKKwkJCQkJcGcgPSBzZWN0YmFzZSArICgoaysrKSAqIEVIRUFfUEFHRVNJWkUpOworCQkJCQlwdFttXSA9IHZpcnRfdG9fYWJzKHBnKTsKKwkJCQl9CiAKLQkJCWhyZXQgPSBlaGVhX2hfcmVnaXN0ZXJfcnBhZ2VfbXIoYWRhcHRlci0+aGFuZGxlLAotCQkJCQkJCW1yLT5oYW5kbGUsIDAsCi0JCQkJCQkJMCwgYWJzX2FkciwxKTsKLQkJCW5yX3BhZ2VzLS07CisJCQkJaHJldCA9IGVoZWFfaF9yZWdpc3Rlcl9ycGFnZV9tcihhZGFwdGVyLT5oYW5kbGUsCisJCQkJCQkJCW1yLT5oYW5kbGUsCisJCQkJCQkJCTAsIDAsIHB0X2FicywKKwkJCQkJCQkJRUhFQV9NQVhfUlBBR0UpOworCQkJCWlmICgoaHJldCAhPSBIX1NVQ0NFU1MpCisJCQkJICAgICYmIChocmV0ICE9IEhfUEFHRV9SRUdJU1RFUkVEKSkgeworCQkJCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsCisJCQkJCQkJICAgICBtci0+aGFuZGxlLAorCQkJCQkJCSAgICAgRk9SQ0VfRlJFRSk7CisJCQkJCWVoZWFfZXJyb3IoInJlZ2lzdGVyX3JwYWdlX21yIGZhaWxlZCIpOworCQkJCQlyZXQgPSAtRUlPOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CiAJCX0KIAotCQlpZiAoKGhyZXQgIT0gSF9TVUNDRVNTKSAmJiAoaHJldCAhPSBIX1BBR0VfUkVHSVNURVJFRCkpIHsKLQkJCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwKLQkJCQkJICAgICBtci0+aGFuZGxlLCBGT1JDRV9GUkVFKTsKLQkJCWVoZWFfZXJyb3IoInJlZ2lzdGVyX3JwYWdlX21yIGZhaWxlZCIpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJaWYgKGhyZXQgIT0gSF9TVUNDRVNTKSB7Ci0JCWVoZWFfaF9mcmVlX3Jlc291cmNlKGFkYXB0ZXItPmhhbmRsZSwgbXItPmhhbmRsZSwKLQkJCQkgICAgIEZPUkNFX0ZSRUUpOwotCQllaGVhX2Vycm9yKCJyZWdpc3Rlcl9ycGFnZSBmYWlsZWQgZm9yIGxhc3QgcGFnZSIpOworCQllaGVhX2hfZnJlZV9yZXNvdXJjZShhZGFwdGVyLT5oYW5kbGUsIG1yLT5oYW5kbGUsIEZPUkNFX0ZSRUUpOworCQllaGVhX2Vycm9yKCJyZWdpc3RlcmluZyBtciBmYWlsZWQiKTsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCisJbXItPnZhZGRyID0gRUhFQV9CVVNNQVBfU1RBUlQ7CiAJbXItPmFkYXB0ZXIgPSBhZGFwdGVyOwogCXJldCA9IDA7CiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmggYi9kcml2ZXJzL25ldC9laGVhL2VoZWFfcW1yLmgKaW5kZXggYzBlYjNlMC4uYjcxZjg0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWhlYS9laGVhX3Ftci5oCisrKyBiL2RyaXZlcnMvbmV0L2VoZWEvZWhlYV9xbXIuaApAQCAtMzYsOCArMzYsMTQgQEAKICAqIHBhZ2Ugc2l6ZSBvZiBlaGVhIGhhcmR3YXJlIHF1ZXVlcwogICovCiAKLSNkZWZpbmUgRUhFQV9QQUdFU0hJRlQgIDEyCi0jZGVmaW5lIEVIRUFfUEFHRVNJWkUgICA0MDk2VUwKKyNkZWZpbmUgRUhFQV9QQUdFU0hJRlQgICAgICAgICAxMgorI2RlZmluZSBFSEVBX1BBR0VTSVpFICAgICAgICAgICgxVUwgPDwgRUhFQV9QQUdFU0hJRlQpCisjZGVmaW5lIEVIRUFfU0VDVFNJWkUgICAgICAgICAgKDFVTCA8PCAyNCkKKyNkZWZpbmUgRUhFQV9QQUdFU19QRVJfU0VDVElPTiAoRUhFQV9TRUNUU0laRSA+PiBQQUdFX1NISUZUKQorCisjaWYgKDFVTCA8PCBTRUNUSU9OX1NJWkVfQklUUykgPCBFSEVBX1NFQ1RTSVpFCisjZXJyb3IgZUhFQSBtb2R1bGUgY2FuJ3Qgd29yayBpZiBrZXJuZWwgc2VjdGlvbnNpemUgPCBlaGVhIHNlY3Rpb25zaXplCisjZW5kaWYKIAogLyogU29tZSBhYmJyZXZpYXRpb25zIHVzZWQgaGVyZToKICAqCkBAIC0zNzIsNCArMzc4LDggQEAKIAogdm9pZCBlaGVhX2Vycm9yX2RhdGEoc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciwgdTY0IHJlc19oYW5kbGUpOwogCitpbnQgZWhlYV9jcmVhdGVfYnVzbWFwKCB2b2lkICk7Cit2b2lkIGVoZWFfZGVzdHJveV9idXNtYXAoIHZvaWQgKTsKK3U2NCBlaGVhX21hcF92YWRkcih2b2lkICpjYWRkcik7CisKICNlbmRpZgkvKiBfX0VIRUFfUU1SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwppbmRleCA2NzA0NmU4Li4xMzY4MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtNTUwLDYgKzU1MCw4IEBACiAvKiBQSFkgZGVmaW5lcyAqLwogI2RlZmluZSBQSFlfT1VJX01BUlZFTEwJMHg1MDQzCiAjZGVmaW5lIFBIWV9PVUlfQ0lDQURBCTB4MDNmMQorI2RlZmluZSBQSFlfT1VJX1ZJVEVTU0UJMHgwMWMxCisjZGVmaW5lIFBIWV9PVUlfUkVBTFRFSwkweDAxYzEKICNkZWZpbmUgUEhZSUQxX09VSV9NQVNLCTB4MDNmZgogI2RlZmluZSBQSFlJRDFfT1VJX1NIRlQJNgogI2RlZmluZSBQSFlJRDJfT1VJX01BU0sJMHhmYzAwCkBAIC01NTcsMTIgKzU1OSwzNiBAQAogI2RlZmluZSBQSFlJRDJfTU9ERUxfTUFTSwkJMHgwM2YwCiAjZGVmaW5lIFBIWV9NT0RFTF9NQVJWRUxMX0UzMDE2CQkweDIyMAogI2RlZmluZSBQSFlfTUFSVkVMTF9FMzAxNl9JTklUTUFTSwkweDAzMDAKLSNkZWZpbmUgUEhZX0lOSVQxCTB4MGYwMDAKLSNkZWZpbmUgUEhZX0lOSVQyCTB4MGUwMAotI2RlZmluZSBQSFlfSU5JVDMJMHgwMTAwMAotI2RlZmluZSBQSFlfSU5JVDQJMHgwMjAwCi0jZGVmaW5lIFBIWV9JTklUNQkweDAwMDQKLSNkZWZpbmUgUEhZX0lOSVQ2CTB4MDIwMDAKKyNkZWZpbmUgUEhZX0NJQ0FEQV9JTklUMQkweDBmMDAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDIJMHgwZTAwCisjZGVmaW5lIFBIWV9DSUNBREFfSU5JVDMJMHgwMTAwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQ0CTB4MDIwMAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQ1CTB4MDAwNAorI2RlZmluZSBQSFlfQ0lDQURBX0lOSVQ2CTB4MDIwMDAKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUcxCTB4MWYKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyCTB4MTAKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUczCTB4MTEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0CTB4MTIKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVF9NU0sxCTB4YworI2RlZmluZSBQSFlfVklURVNTRV9JTklUX01TSzIJMHgwMTgwCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQxCTB4NTJiNQorI2RlZmluZSBQSFlfVklURVNTRV9JTklUMgkweGFmOGEKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDMJMHg4CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ0CTB4OGY4YQorI2RlZmluZSBQSFlfVklURVNTRV9JTklUNQkweGFmODYKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDYJMHg4Zjg2CisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQ3CTB4YWY4MgorI2RlZmluZSBQSFlfVklURVNTRV9JTklUOAkweDAxMDAKKyNkZWZpbmUgUEhZX1ZJVEVTU0VfSU5JVDkJMHg4ZjgyCisjZGVmaW5lIFBIWV9WSVRFU1NFX0lOSVQxMAkweDAKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUcxCTB4MWYKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUcyCTB4MTkKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVF9SRUczCTB4MTMKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDEJMHgwMDAwCisjZGVmaW5lIFBIWV9SRUFMVEVLX0lOSVQyCTB4OGUwMAorI2RlZmluZSBQSFlfUkVBTFRFS19JTklUMwkweDAwMDEKKyNkZWZpbmUgUEhZX1JFQUxURUtfSU5JVDQJMHhhZDE3CisKICNkZWZpbmUgUEhZX0dJR0FCSVQJMHgwMTAwCiAKICNkZWZpbmUgUEhZX1RJTUVPVVQJMHgxCkBAIC0xMDk2LDYgKzExMjIsMjggQEAKIAkJCXJldHVybiBQSFlfRVJST1I7CiAJCX0KIAl9CisJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfUkVBTFRFSykgeworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIFBIWV9SRUFMVEVLX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMywgUEhZX1JFQUxURUtfSU5JVDQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQogCiAJLyogc2V0IGFkdmVydGlzZSByZWdpc3RlciAqLwogCXJlZyA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBNSUlfUkVBRCk7CkBAIC0xMTQxLDE0ICsxMTg5LDE0IEBACiAJLyogcGh5IHZlbmRvciBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCiAJaWYgKChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgJiYgKHBoeWludGVyZmFjZSAmIFBIWV9SR01JSSkgKSB7CiAJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIE1JSV9SRUFEKTsKLQkJcGh5X3Jlc2VydmVkICY9IH4oUEhZX0lOSVQxIHwgUEhZX0lOSVQyKTsKLQkJcGh5X3Jlc2VydmVkIHw9IChQSFlfSU5JVDMgfCBQSFlfSU5JVDQpOworCQlwaHlfcmVzZXJ2ZWQgJj0gfihQSFlfQ0lDQURBX0lOSVQxIHwgUEhZX0NJQ0FEQV9JTklUMik7CisJCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0NJQ0FEQV9JTklUMyB8IFBIWV9DSUNBREFfSU5JVDQpOwogCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9SRVNWMSwgcGh5X3Jlc2VydmVkKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CiAJCQlyZXR1cm4gUEhZX0VSUk9SOwogCQl9CiAJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgTUlJX1JFQUQpOwotCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ1OworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0NJQ0FEQV9JTklUNTsKIAkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgcGh5X3Jlc2VydmVkKSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CiAJCQlyZXR1cm4gUEhZX0VSUk9SOwpAQCAtMTE1NiwxMiArMTIwNCwxMDYgQEAKIAl9CiAJaWYgKG5wLT5waHlfb3VpID09IFBIWV9PVUlfQ0lDQURBKSB7CiAJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfU1JFVklTSU9OLCBNSUlfUkVBRCk7Ci0JCXBoeV9yZXNlcnZlZCB8PSBQSFlfSU5JVDY7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfQ0lDQURBX0lOSVQ2OwogCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9TUkVWSVNJT04sIHBoeV9yZXNlcnZlZCkpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOwogCQkJcmV0dXJuIFBIWV9FUlJPUjsKIAkJfQogCX0KKwlpZiAobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9WSVRFU1NFKSB7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcxLCBQSFlfVklURVNTRV9JTklUMSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDIpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgTUlJX1JFQUQpOworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHNCwgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzE7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUMzsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzMsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMiwgUEhZX1ZJVEVTU0VfSU5JVDQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ1KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCXBoeV9yZXNlcnZlZCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkICY9IH5QSFlfVklURVNTRV9JTklUX01TSzE7CisJCXBoeV9yZXNlcnZlZCB8PSBQSFlfVklURVNTRV9JTklUMzsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzQsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBNSUlfUkVBRCk7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUczLCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfVklURVNTRV9JTklUX1JFRzIsIFBIWV9WSVRFU1NFX0lOSVQ2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUNykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBNSUlfUkVBRCk7CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUc0LCBwaHlfcmVzZXJ2ZWQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJcGh5X3Jlc2VydmVkID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgTUlJX1JFQUQpOworCQlwaHlfcmVzZXJ2ZWQgJj0gflBIWV9WSVRFU1NFX0lOSVRfTVNLMjsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9WSVRFU1NFX0lOSVQ4OworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1ZJVEVTU0VfSU5JVF9SRUcyLCBQSFlfVklURVNTRV9JTklUOSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9WSVRFU1NFX0lOSVRfUkVHMSwgUEhZX1ZJVEVTU0VfSU5JVDEwKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX1JFQUxURUspIHsKKwkJLyogcmVzZXQgY291bGQgaGF2ZSBjbGVhcmVkIHRoZXNlIG91dCwgc2V0IHRoZW0gYmFjayAqLworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMSwgUEhZX1JFQUxURUtfSU5JVDEpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzIsIFBIWV9SRUFMVEVLX0lOSVQyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgUEhZX1JFQUxURUtfSU5JVF9SRUcxLCBQSFlfUkVBTFRFS19JTklUMykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIFBIWV9SRUFMVEVLX0lOSVRfUkVHMywgUEhZX1JFQUxURUtfSU5JVDQpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBQSFlfUkVBTFRFS19JTklUX1JFRzEsIFBIWV9SRUFMVEVLX0lOSVQxKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCiAJLyogc29tZSBwaHlzIGNsZWFyIG91dCBwYXVzZSBhZHZlcnRpc21lbnQgb24gcmVzZXQsIHNldCBpdCBiYWNrICovCiAJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIHJlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX21paS5jCmluZGV4IDVkZDM0YTEuLmFjMzU5NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfbWlpLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9taWkuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL29jcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNiLmMgYi9kcml2ZXJzL25ldC9tYWNiLmMKaW5kZXggMGUwNGY3YS4uYTRiYjAyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjYi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY2IuYwpAQCAtMTcsMTMgKzE3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlpLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CiAKICNpbmNsdWRlICJtYWNiLmgiCiAKQEAgLTg1LDE3MiArODQsMjAyIEBACiAJCW1lbWNweShicC0+ZGV2LT5kZXZfYWRkciwgYWRkciwgc2l6ZW9mKGFkZHIpKTsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9lbmFibGVfbWRpbyhzdHJ1Y3QgbWFjYiAqYnApCitzdGF0aWMgaW50IG1hY2JfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0pCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcmVnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNSKTsKLQlyZWcgfD0gTUFDQl9CSVQoTVBFKTsKLQltYWNiX3dyaXRlbChicCwgTkNSLCByZWcpOwotCW1hY2Jfd3JpdGVsKGJwLCBJRVIsIE1BQ0JfQklUKE1GRCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hY2JfZGlzYWJsZV9tZGlvKHN0cnVjdCBtYWNiICpicCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiByZWc7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKLQlyZWcgPSBtYWNiX3JlYWRsKGJwLCBOQ1IpOwotCXJlZyAmPSB+TUFDQl9CSVQoTVBFKTsKLQltYWNiX3dyaXRlbChicCwgTkNSLCByZWcpOwotCW1hY2Jfd3JpdGVsKGJwLCBJRFIsIE1BQ0JfQklUKE1GRCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWFjYl9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQotewotCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1hY2IgKmJwID0gYnVzLT5wcml2OwogCWludCB2YWx1ZTsKIAotCW11dGV4X2xvY2soJmJwLT5tZGlvX211dGV4KTsKLQotCW1hY2JfZW5hYmxlX21kaW8oYnApOwogCW1hY2Jfd3JpdGVsKGJwLCBNQU4sIChNQUNCX0JGKFNPRiwgTUFDQl9NQU5fU09GKQogCQkJICAgICAgfCBNQUNCX0JGKFJXLCBNQUNCX01BTl9SRUFEKQotCQkJICAgICAgfCBNQUNCX0JGKFBIWUEsIHBoeV9pZCkKLQkJCSAgICAgIHwgTUFDQl9CRihSRUdBLCBsb2NhdGlvbikKKwkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBtaWlfaWQpCisJCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgcmVnbnVtKQogCQkJICAgICAgfCBNQUNCX0JGKENPREUsIE1BQ0JfTUFOX0NPREUpKSk7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZicC0+bWRpb19jb21wbGV0ZSk7CisJLyogd2FpdCBmb3IgZW5kIG9mIHRyYW5zZmVyICovCisJd2hpbGUgKCFNQUNCX0JGRVhUKElETEUsIG1hY2JfcmVhZGwoYnAsIE5TUikpKQorCQljcHVfcmVsYXgoKTsKIAogCXZhbHVlID0gTUFDQl9CRkVYVChEQVRBLCBtYWNiX3JlYWRsKGJwLCBNQU4pKTsKLQltYWNiX2Rpc2FibGVfbWRpbyhicCk7Ci0JbXV0ZXhfdW5sb2NrKCZicC0+bWRpb19tdXRleCk7CiAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLAotCQkJICAgIGludCBsb2NhdGlvbiwgaW50IHZhbCkKK3N0YXRpYyBpbnQgbWFjYl9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0sCisJCQkgICB1MTYgdmFsdWUpCiB7Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJtZGlvX3dyaXRlICUwMng6JTAyeCA8LSAlMDR4XG4iLAotCQlwaHlfaWQsIGxvY2F0aW9uLCB2YWwpOwotCi0JbXV0ZXhfbG9jaygmYnAtPm1kaW9fbXV0ZXgpOwotCW1hY2JfZW5hYmxlX21kaW8oYnApOworCXN0cnVjdCBtYWNiICpicCA9IGJ1cy0+cHJpdjsKIAogCW1hY2Jfd3JpdGVsKGJwLCBNQU4sIChNQUNCX0JGKFNPRiwgTUFDQl9NQU5fU09GKQogCQkJICAgICAgfCBNQUNCX0JGKFJXLCBNQUNCX01BTl9XUklURSkKLQkJCSAgICAgIHwgTUFDQl9CRihQSFlBLCBwaHlfaWQpCi0JCQkgICAgICB8IE1BQ0JfQkYoUkVHQSwgbG9jYXRpb24pCisJCQkgICAgICB8IE1BQ0JfQkYoUEhZQSwgbWlpX2lkKQorCQkJICAgICAgfCBNQUNCX0JGKFJFR0EsIHJlZ251bSkKIAkJCSAgICAgIHwgTUFDQl9CRihDT0RFLCBNQUNCX01BTl9DT0RFKQotCQkJICAgICAgfCBNQUNCX0JGKERBVEEsIHZhbCkpKTsKKwkJCSAgICAgIHwgTUFDQl9CRihEQVRBLCB2YWx1ZSkpKTsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmJwLT5tZGlvX2NvbXBsZXRlKTsKKwkvKiB3YWl0IGZvciBlbmQgb2YgdHJhbnNmZXIgKi8KKwl3aGlsZSAoIU1BQ0JfQkZFWFQoSURMRSwgbWFjYl9yZWFkbChicCwgTlNSKSkpCisJCWNwdV9yZWxheCgpOwogCi0JbWFjYl9kaXNhYmxlX21kaW8oYnApOwotCW11dGV4X3VubG9jaygmYnAtPm1kaW9fbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IG1hY2JfcGh5X3Byb2JlKHN0cnVjdCBtYWNiICpicCkKLXsKLQlpbnQgcGh5X2FkZHJlc3M7Ci0JdTE2IHBoeWlkMSwgcGh5aWQyOwotCi0JZm9yIChwaHlfYWRkcmVzcyA9IDA7IHBoeV9hZGRyZXNzIDwgMzI7IHBoeV9hZGRyZXNzKyspIHsKLQkJcGh5aWQxID0gbWFjYl9tZGlvX3JlYWQoYnAtPmRldiwgcGh5X2FkZHJlc3MsIE1JSV9QSFlTSUQxKTsKLQkJcGh5aWQyID0gbWFjYl9tZGlvX3JlYWQoYnAtPmRldiwgcGh5X2FkZHJlc3MsIE1JSV9QSFlTSUQyKTsKLQotCQlpZiAocGh5aWQxICE9IDB4ZmZmZiAmJiBwaHlpZDEgIT0gMHgwMDAwCi0JCSAgICAmJiBwaHlpZDIgIT0gMHhmZmZmICYmIHBoeWlkMiAhPSAweDAwMDApCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocGh5X2FkZHJlc3MgPT0gMzIpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2X2luZm8oJmJwLT5wZGV2LT5kZXYsCi0JCSAiZGV0ZWN0ZWQgUEhZIGF0IGFkZHJlc3MgJWQgKElEICUwNHg6JTA0eClcbiIsCi0JCSBwaHlfYWRkcmVzcywgcGh5aWQxLCBwaHlpZDIpOwotCi0JYnAtPm1paS5waHlfaWQgPSBwaHlfYWRkcmVzczsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9zZXRfbWVkaWEoc3RydWN0IG1hY2IgKmJwLCBpbnQgbWVkaWEpCitzdGF0aWMgaW50IG1hY2JfbWRpb19yZXNldChzdHJ1Y3QgbWlpX2J1cyAqYnVzKQogewotCXUzMiByZWc7Ci0KLQlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7Ci0JcmVnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOwotCXJlZyAmPSB+KE1BQ0JfQklUKFNQRCkgfCBNQUNCX0JJVChGRCkpOwotCWlmIChtZWRpYSAmIChBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMKSkKLQkJcmVnIHw9IE1BQ0JfQklUKFNQRCk7Ci0JaWYgKG1lZGlhICYgQURWRVJUSVNFX0ZVTEwpCi0JCXJlZyB8PSBNQUNCX0JJVChGRCk7Ci0JbWFjYl93cml0ZWwoYnAsIE5DRkdSLCByZWcpOwotCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX2NoZWNrX21lZGlhKHN0cnVjdCBtYWNiICpicCwgaW50IG9rX3RvX3ByaW50LCBpbnQgaW5pdF9tZWRpYSkKK3N0YXRpYyB2b2lkIG1hY2JfaGFuZGxlX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1paV9pZl9pbmZvICptaWkgPSAmYnAtPm1paTsKLQl1bnNpZ25lZCBpbnQgb2xkX2NhcnJpZXIsIG5ld19jYXJyaWVyOwotCWludCBhZHZlcnRpc2UsIGxwYSwgbWVkaWEsIGR1cGxleDsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBicC0+cGh5X2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogaWYgZm9yY2VkIG1lZGlhLCBnbyBubyBmdXJ0aGVyICovCi0JaWYgKG1paS0+Zm9yY2VfbWVkaWEpCi0JCXJldHVybjsKKwlpbnQgc3RhdHVzX2NoYW5nZSA9IDA7CiAKLQkvKiBjaGVjayBjdXJyZW50IGFuZCBvbGQgbGluayBzdGF0dXMgKi8KLQlvbGRfY2FycmllciA9IG5ldGlmX2NhcnJpZXJfb2sobWlpLT5kZXYpID8gMSA6IDA7Ci0JbmV3X2NhcnJpZXIgPSAodW5zaWduZWQgaW50KSBtaWlfbGlua19vayhtaWkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCi0JLyogaWYgY2FycmllciBzdGF0ZSBkaWQgbm90IGNoYW5nZSwgYXNzdW1lIG5vdGhpbmcgZWxzZSBkaWQgKi8KLQlpZiAoIWluaXRfbWVkaWEgJiYgb2xkX2NhcnJpZXIgPT0gbmV3X2NhcnJpZXIpCi0JCXJldHVybjsKKwlpZiAocGh5ZGV2LT5saW5rKSB7CisJCWlmICgoYnAtPnNwZWVkICE9IHBoeWRldi0+c3BlZWQpIHx8CisJCSAgICAoYnAtPmR1cGxleCAhPSBwaHlkZXYtPmR1cGxleCkpIHsKKwkJCXUzMiByZWc7CiAKLQkvKiBubyBjYXJyaWVyLCBub3RoaW5nIG11Y2ggdG8gZG8gKi8KLQlpZiAoIW5ld19jYXJyaWVyKSB7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKG1paS0+ZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgbWlpLT5kZXYtPm5hbWUpOwotCQlyZXR1cm47CisJCQlyZWcgPSBtYWNiX3JlYWRsKGJwLCBOQ0ZHUik7CisJCQlyZWcgJj0gfihNQUNCX0JJVChTUEQpIHwgTUFDQl9CSVQoRkQpKTsKKworCQkJaWYgKHBoeWRldi0+ZHVwbGV4KQorCQkJCXJlZyB8PSBNQUNCX0JJVChGRCk7CisJCQlpZiAocGh5ZGV2LT5zcGVlZCkKKwkJCQlyZWcgfD0gTUFDQl9CSVQoU1BEKTsKKworCQkJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCByZWcpOworCisJCQlicC0+c3BlZWQgPSBwaHlkZXYtPnNwZWVkOworCQkJYnAtPmR1cGxleCA9IHBoeWRldi0+ZHVwbGV4OworCQkJc3RhdHVzX2NoYW5nZSA9IDE7CisJCX0KIAl9CiAKLQkvKgotCSAqIHdlIGhhdmUgY2Fycmllciwgc2VlIHdobydzIG9uIHRoZSBvdGhlciBlbmQKLQkgKi8KLQluZXRpZl9jYXJyaWVyX29uKG1paS0+ZGV2KTsKKwlpZiAocGh5ZGV2LT5saW5rICE9IGJwLT5saW5rKSB7CisJCWlmIChwaHlkZXYtPmxpbmspCisJCQluZXRpZl9zY2hlZHVsZShkZXYpOworCQllbHNlIHsKKwkJCWJwLT5zcGVlZCA9IDA7CisJCQlicC0+ZHVwbGV4ID0gLTE7CisJCX0KKwkJYnAtPmxpbmsgPSBwaHlkZXYtPmxpbms7CiAKLQkvKiBnZXQgTUlJIGFkdmVydGlzZSBhbmQgTFBBIHZhbHVlcyAqLwotCWlmICghaW5pdF9tZWRpYSAmJiBtaWktPmFkdmVydGlzaW5nKSB7Ci0JCWFkdmVydGlzZSA9IG1paS0+YWR2ZXJ0aXNpbmc7CisJCXN0YXR1c19jaGFuZ2UgPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhdHVzX2NoYW5nZSkgeworCQlpZiAocGh5ZGV2LT5saW5rKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAgKCVkLyVzKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHBoeWRldi0+c3BlZWQsCisJCQkgICAgICAgRFVQTEVYX0ZVTEwgPT0gcGh5ZGV2LT5kdXBsZXggPyAiRnVsbCI6IkhhbGYiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKKwl9Cit9CisKKy8qIGJhc2VkIG9uIGF1MTAwMF9ldGguIGMqLworc3RhdGljIGludCBtYWNiX21paV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IE5VTEw7CisJc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcGh5X2FkZHI7CisKKwkvKiBmaW5kIHRoZSBmaXJzdCBwaHkgKi8KKwlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCBQSFlfTUFYX0FERFI7IHBoeV9hZGRyKyspIHsKKwkJaWYgKGJwLT5taWlfYnVzLnBoeV9tYXBbcGh5X2FkZHJdKSB7CisJCQlwaHlkZXYgPSBicC0+bWlpX2J1cy5waHlfbWFwW3BoeV9hZGRyXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFwaHlkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IG5vIFBIWSBmb3VuZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBkYXRhID0gYnAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCS8qIFRPRE8gOiBhZGQgcGluX2lycSAqLworCisJLyogYXR0YWNoIHRoZSBtYWMgdG8gdGhlIHBoeSAqLworCWlmIChwZGF0YSAmJiBwZGF0YS0+aXNfcm1paSkgeworCQlwaHlkZXYgPSBwaHlfY29ubmVjdChkZXYsIHBoeWRldi0+ZGV2LmJ1c19pZCwKKwkJCSZtYWNiX2hhbmRsZV9saW5rX2NoYW5nZSwgMCwgUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpOwogCX0gZWxzZSB7Ci0JCWFkdmVydGlzZSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7Ci0JCW1paS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisJCXBoeWRldiA9IHBoeV9jb25uZWN0KGRldiwgcGh5ZGV2LT5kZXYuYnVzX2lkLAorCQkJJm1hY2JfaGFuZGxlX2xpbmtfY2hhbmdlLCAwLCBQSFlfSU5URVJGQUNFX01PREVfTUlJKTsKIAl9Ci0JbHBhID0gbWlpLT5tZGlvX3JlYWQobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfTFBBKTsKIAotCS8qIGZpZ3VyZSBvdXQgbWVkaWEgYW5kIGR1cGxleCBmcm9tIGFkdmVydGlzZSBhbmQgTFBBIHZhbHVlcyAqLwotCW1lZGlhID0gbWlpX253YXlfcmVzdWx0KGxwYSAmIGFkdmVydGlzZSk7Ci0JZHVwbGV4ID0gKG1lZGlhICYgQURWRVJUSVNFX0ZVTEwpID8gMSA6IDA7CisJaWYgKElTX0VSUihwaHlkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhdHRhY2ggdG8gUEhZXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihwaHlkZXYpOworCX0KIAotCWlmIChva190b19wcmludCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVzTWJwcywgJXMtZHVwbGV4LCBscGEgMHglMDRYXG4iLAotCQkgICAgICAgbWlpLT5kZXYtPm5hbWUsCi0JCSAgICAgICBtZWRpYSAmIChBRFZFUlRJU0VfMTAwRlVMTCB8IEFEVkVSVElTRV8xMDBIQUxGKSA/ICIxMDAiIDogIjEwIiwKLQkJICAgICAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgbHBhKTsKKwkvKiBtYXNrIHdpdGggTUFDIHN1cHBvcnRlZCBmZWF0dXJlcyAqLworCXBoeWRldi0+c3VwcG9ydGVkICY9IFBIWV9CQVNJQ19GRUFUVVJFUzsKIAotCW1paS0+ZnVsbF9kdXBsZXggPSBkdXBsZXg7CisJcGh5ZGV2LT5hZHZlcnRpc2luZyA9IHBoeWRldi0+c3VwcG9ydGVkOwogCi0JLyogTGV0IHRoZSBNQUMga25vdyBhYm91dCB0aGUgbmV3IGxpbmsgc3RhdGUgKi8KLQltYWNiX3NldF9tZWRpYShicCwgbWVkaWEpOworCWJwLT5saW5rID0gMDsKKwlicC0+c3BlZWQgPSAwOworCWJwLT5kdXBsZXggPSAtMTsKKwlicC0+cGh5X2RldiA9IHBoeWRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hY2JfbWlpX2luaXQoc3RydWN0IG1hY2IgKmJwKQoreworCXN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IGVyciA9IC1FTlhJTywgaTsKKworCS8qIEVuYWJsZSBtYW5hZ21lbnQgcG9ydCAqLworCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIE1BQ0JfQklUKE1QRSkpOworCisJYnAtPm1paV9idXMubmFtZSA9ICJNQUNCX21paV9idXMiLAorCWJwLT5taWlfYnVzLnJlYWQgPSAmbWFjYl9tZGlvX3JlYWQsCisJYnAtPm1paV9idXMud3JpdGUgPSAmbWFjYl9tZGlvX3dyaXRlLAorCWJwLT5taWlfYnVzLnJlc2V0ID0gJm1hY2JfbWRpb19yZXNldCwKKwlicC0+bWlpX2J1cy5pZCA9IGJwLT5wZGV2LT5pZCwKKwlicC0+bWlpX2J1cy5wcml2ID0gYnAsCisJYnAtPm1paV9idXMuZGV2ID0gJmJwLT5kZXYtPmRldjsKKwlwZGF0YSA9IGJwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSkKKwkJYnAtPm1paV9idXMucGh5X21hc2sgPSBwZGF0YS0+cGh5X21hc2s7CisKKwlicC0+bWlpX2J1cy5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicC0+bWlpX2J1cy5pcnEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBQSFlfTUFYX0FERFI7IGkrKykKKwkJYnAtPm1paV9idXMuaXJxW2ldID0gUEhZX1BPTEw7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShicC0+ZGV2LCAmYnAtPm1paV9idXMpOworCisJaWYgKG1kaW9idXNfcmVnaXN0ZXIoJmJwLT5taWlfYnVzKSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfbWRpb19pcnE7CisKKwlpZiAobWFjYl9taWlfcHJvYmUoYnAtPmRldikgIT0gMCkgeworCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9idXM7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5yZWdpc3Rlcl9idXM6CisJbWRpb2J1c191bnJlZ2lzdGVyKCZicC0+bWlpX2J1cyk7CitlcnJfb3V0X2ZyZWVfbWRpb19pcnE6CisJa2ZyZWUoYnAtPm1paV9idXMuaXJxKTsKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgbWFjYl91cGRhdGVfc3RhdHMoc3RydWN0IG1hY2IgKmJwKQpAQCAtMjY1LDE2ICsyOTQsNiBAQAogCQkqcCArPSBfX3Jhd19yZWFkbChyZWcpOwogfQogCi1zdGF0aWMgdm9pZCBtYWNiX3BlcmlvZGljX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBtYWNiICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWFjYiwgcGVyaW9kaWNfdGFzay53b3JrKTsKLQotCW1hY2JfdXBkYXRlX3N0YXRzKGJwKTsKLQltYWNiX2NoZWNrX21lZGlhKGJwLCAxLCAwKTsKLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnAtPnBlcmlvZGljX3Rhc2ssIEhaKTsKLX0KLQogc3RhdGljIHZvaWQgbWFjYl90eChzdHJ1Y3QgbWFjYiAqYnApCiB7CiAJdW5zaWduZWQgaW50IHRhaWw7CkBAIC01MTksOSArNTM4LDYgQEAKIAlzcGluX2xvY2soJmJwLT5sb2NrKTsKIAogCXdoaWxlIChzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyAmIE1BQ0JfQklUKE1GRCkpCi0JCQljb21wbGV0ZSgmYnAtPm1kaW9fY29tcGxldGUpOwotCiAJCS8qIGNsb3NlIHBvc3NpYmxlIHJhY2Ugd2l0aCBkZXZfY2xvc2UgKi8KIAkJaWYgKHVubGlrZWx5KCFuZXRpZl9ydW5uaW5nKGRldikpKSB7CiAJCQltYWNiX3dyaXRlbChicCwgSURSLCB+MFVMKTsKQEAgLTUzNSw3ICs1NTEsOCBAQAogCQkJCSAqIHVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBidWZmZXJzCiAJCQkJICovCiAJCQkJbWFjYl93cml0ZWwoYnAsIElEUiwgTUFDQl9SWF9JTlRfRkxBR1MpOwotCQkJCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJzY2hlZHVsaW5nIFJYIHNvZnRpcnFcbiIpOworCQkJCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsCisJCQkJCSJzY2hlZHVsaW5nIFJYIHNvZnRpcnFcbiIpOwogCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKIAkJCX0KIAkJfQpAQCAtNzY1LDcgKzc4Miw3IEBACiAJbWFjYl93cml0ZWwoYnAsIFRCUVAsIGJwLT50eF9yaW5nX2RtYSk7CiAKIAkvKiBFbmFibGUgVFggYW5kIFJYICovCi0JbWFjYl93cml0ZWwoYnAsIE5DUiwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpKTsKKwltYWNiX3dyaXRlbChicCwgTkNSLCBNQUNCX0JJVChSRSkgfCBNQUNCX0JJVChURSkgfCBNQUNCX0JJVChNUEUpKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAJbWFjYl93cml0ZWwoYnAsIElFUiwgKE1BQ0JfQklUKFJDT01QKQpAQCAtNzc2LDE4ICs3OTMsMTI2IEBACiAJCQkgICAgICB8IE1BQ0JfQklUKFRDT01QKQogCQkJICAgICAgfCBNQUNCX0JJVChJU1JfUk9WUikKIAkJCSAgICAgIHwgTUFDQl9CSVQoSFJFU1ApKSk7CisKIH0KIAotc3RhdGljIHZvaWQgbWFjYl9pbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorLyoKKyAqIFRoZSBoYXNoIGFkZHJlc3MgcmVnaXN0ZXIgaXMgNjQgYml0cyBsb25nIGFuZCB0YWtlcyB1cCB0d28KKyAqIGxvY2F0aW9ucyBpbiB0aGUgbWVtb3J5IG1hcC4gIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBzdG9yZWQKKyAqIGluIEVNQUNfSFNMIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIGluIEVNQUNfSFNILgorICoKKyAqIFRoZSB1bmljYXN0IGhhc2ggZW5hYmxlIGFuZCB0aGUgbXVsdGljYXN0IGhhc2ggZW5hYmxlIGJpdHMgaW4gdGhlCisgKiBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZW5hYmxlIHRoZSByZWNlcHRpb24gb2YgaGFzaCBtYXRjaGVkCisgKiBmcmFtZXMuIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHJlZHVjZWQgdG8gYSA2IGJpdCBpbmRleCBpbnRvCisgKiB0aGUgNjQgYml0IGhhc2ggcmVnaXN0ZXIgdXNpbmcgdGhlIGZvbGxvd2luZyBoYXNoIGZ1bmN0aW9uLiAgVGhlCisgKiBoYXNoIGZ1bmN0aW9uIGlzIGFuIGV4Y2x1c2l2ZSBvciBvZiBldmVyeSBzaXh0aCBiaXQgb2YgdGhlCisgKiBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoKKyAqIGhpWzVdID0gZGFbNV0gXiBkYVsxMV0gXiBkYVsxN10gXiBkYVsyM10gXiBkYVsyOV0gXiBkYVszNV0gXiBkYVs0MV0gXiBkYVs0N10KKyAqIGhpWzRdID0gZGFbNF0gXiBkYVsxMF0gXiBkYVsxNl0gXiBkYVsyMl0gXiBkYVsyOF0gXiBkYVszNF0gXiBkYVs0MF0gXiBkYVs0Nl0KKyAqIGhpWzNdID0gZGFbM10gXiBkYVswOV0gXiBkYVsxNV0gXiBkYVsyMV0gXiBkYVsyN10gXiBkYVszM10gXiBkYVszOV0gXiBkYVs0NV0KKyAqIGhpWzJdID0gZGFbMl0gXiBkYVswOF0gXiBkYVsxNF0gXiBkYVsyMF0gXiBkYVsyNl0gXiBkYVszMl0gXiBkYVszOF0gXiBkYVs0NF0KKyAqIGhpWzFdID0gZGFbMV0gXiBkYVswN10gXiBkYVsxM10gXiBkYVsxOV0gXiBkYVsyNV0gXiBkYVszMV0gXiBkYVszN10gXiBkYVs0M10KKyAqIGhpWzBdID0gZGFbMF0gXiBkYVswNl0gXiBkYVsxMl0gXiBkYVsxOF0gXiBkYVsyNF0gXiBkYVszMF0gXiBkYVszNl0gXiBkYVs0Ml0KKyAqCisgKiBkYVswXSByZXByZXNlbnRzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGZpcnN0IGJ5dGUKKyAqIHJlY2VpdmVkLCB0aGF0IGlzLCB0aGUgbXVsdGljYXN0L3VuaWNhc3QgaW5kaWNhdG9yLCBhbmQgZGFbNDddCisgKiByZXByZXNlbnRzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbGFzdCBieXRlIHJlY2VpdmVkLiAgSWYKKyAqIHRoZSBoYXNoIGluZGV4LCBoaVtuXSwgcG9pbnRzIHRvIGEgYml0IHRoYXQgaXMgc2V0IGluIHRoZSBoYXNoCisgKiByZWdpc3RlciB0aGVuIHRoZSBmcmFtZSB3aWxsIGJlIG1hdGNoZWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlCisgKiBmcmFtZSBpcyBtdWx0aWNhc3Qgb3IgdW5pY2FzdC4gIEEgbXVsdGljYXN0IG1hdGNoIHdpbGwgYmUgc2lnbmFsbGVkCisgKiBpZiB0aGUgbXVsdGljYXN0IGhhc2ggZW5hYmxlIGJpdCBpcyBzZXQsIGRhWzBdIGlzIDEgYW5kIHRoZSBoYXNoCisgKiBpbmRleCBwb2ludHMgdG8gYSBiaXQgc2V0IGluIHRoZSBoYXNoIHJlZ2lzdGVyLiAgQSB1bmljYXN0IG1hdGNoCisgKiB3aWxsIGJlIHNpZ25hbGxlZCBpZiB0aGUgdW5pY2FzdCBoYXNoIGVuYWJsZSBiaXQgaXMgc2V0LCBkYVswXSBpcyAwCisgKiBhbmQgdGhlIGhhc2ggaW5kZXggcG9pbnRzIHRvIGEgYml0IHNldCBpbiB0aGUgaGFzaCByZWdpc3Rlci4gIFRvCisgKiByZWNlaXZlIGFsbCBtdWx0aWNhc3QgZnJhbWVzLCB0aGUgaGFzaCByZWdpc3RlciBzaG91bGQgYmUgc2V0IHdpdGgKKyAqIGFsbCBvbmVzIGFuZCB0aGUgbXVsdGljYXN0IGhhc2ggZW5hYmxlIGJpdCBzaG91bGQgYmUgc2V0IGluIHRoZQorICogbmV0d29yayBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGhhc2hfYml0X3ZhbHVlKGludCBiaXRuciwgX191OCAqYWRkcikKIHsKKwlpZiAoYWRkcltiaXRuciAvIDhdICYgKDEgPDwgKGJpdG5yICUgOCkpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgaGFzaCBpbmRleCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IGhhc2hfZ2V0X2luZGV4KF9fdTggKmFkZHIpCit7CisJaW50IGksIGosIGJpdHZhbDsKKwlpbnQgaGFzaF9pbmRleCA9IDA7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCWZvciAoaSA9IDAsIGJpdHZhbCA9IDA7IGkgPCA4OyBpKyspCisJCQliaXR2YWwgXj0gaGFzaF9iaXRfdmFsdWUoaSo2ICsgaiwgYWRkcik7CisKKwkJaGFzaF9pbmRleCB8PSAoYml0dmFsIDw8IGopOworCX0KKworCXJldHVybiBoYXNoX2luZGV4OworfQorCisvKgorICogQWRkIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gdGhlIGludGVybmFsIG11bHRpY2FzdC1oYXNoIHRhYmxlLgorICovCitzdGF0aWMgdm9pZCBtYWNiX3NldGhhc2h0YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqY3VycjsKKwl1bnNpZ25lZCBsb25nIG1jX2ZpbHRlclsyXTsKKwl1bnNpZ25lZCBpbnQgaSwgYml0bnI7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCS8qIFNldCBzb21lIHJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncyAqLwotCW1hY2JfbWRpb193cml0ZShkZXYsIGJwLT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAotCQkJQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfQUxMKTsKLQltYWNiX21kaW9fd3JpdGUoZGV2LCBicC0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsCi0JCQkoQk1DUl9TUEVFRDEwMCB8IEJNQ1JfQU5FTkFCTEUKLQkJCSB8IEJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9GVUxMRFBMWCkpOworCW1jX2ZpbHRlclswXSA9IG1jX2ZpbHRlclsxXSA9IDA7CisKKwljdXJyID0gZGV2LT5tY19saXN0OworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyssIGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJCWlmICghY3VycikgYnJlYWs7CS8qIHVuZXhwZWN0ZWQgZW5kIG9mIGxpc3QgKi8KKworCQliaXRuciA9IGhhc2hfZ2V0X2luZGV4KGN1cnItPmRtaV9hZGRyKTsKKwkJbWNfZmlsdGVyW2JpdG5yID4+IDVdIHw9IDEgPDwgKGJpdG5yICYgMzEpOworCX0KKworCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIG1jX2ZpbHRlclswXSk7CisJbWFjYl93cml0ZWwoYnAsIEhSVCwgbWNfZmlsdGVyWzFdKTsKK30KKworLyoKKyAqIEVuYWJsZS9EaXNhYmxlIHByb21pc2N1b3VzIGFuZCBtdWx0aWNhc3QgbW9kZXMuCisgKi8KK3N0YXRpYyB2b2lkIG1hY2Jfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGNmZzsKKwlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJY2ZnID0gbWFjYl9yZWFkbChicCwgTkNGR1IpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJY2ZnIHw9IE1BQ0JfQklUKENBRik7CisJZWxzZSBpZiAoZGV2LT5mbGFncyAmICh+SUZGX1BST01JU0MpKQorCQkgLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCWNmZyAmPSB+TUFDQl9CSVQoQ0FGKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCS8qIEVuYWJsZSBhbGwgbXVsdGljYXN0IG1vZGUgKi8KKwkJbWFjYl93cml0ZWwoYnAsIEhSQiwgLTEpOworCQltYWNiX3dyaXRlbChicCwgSFJULCAtMSk7CisJCWNmZyB8PSBNQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IDApIHsKKwkJLyogRW5hYmxlIHNwZWNpZmljIG11bHRpY2FzdHMgKi8KKwkJbWFjYl9zZXRoYXNodGFibGUoZGV2KTsKKwkJY2ZnIHw9IE1BQ0JfQklUKE5DRkdSX01USSk7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgKH5JRkZfQUxMTVVMVEkpKSB7CisJCS8qIERpc2FibGUgYWxsIG11bHRpY2FzdCBtb2RlICovCisJCW1hY2Jfd3JpdGVsKGJwLCBIUkIsIDApOworCQltYWNiX3dyaXRlbChicCwgSFJULCAwKTsKKwkJY2ZnICY9IH5NQUNCX0JJVChOQ0ZHUl9NVEkpOworCX0KKworCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgY2ZnKTsKIH0KIAogc3RhdGljIGludCBtYWNiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTc5Nyw2ICs5MjIsMTAgQEAKIAogCWRldl9kYmcoJmJwLT5wZGV2LT5kZXYsICJvcGVuXG4iKTsKIAorCS8qIGlmIHRoZSBwaHkgaXMgbm90IHlldCByZWdpc3RlciwgcmV0cnkgbGF0ZXIqLworCWlmICghYnAtPnBoeV9kZXYpCisJCXJldHVybiAtRUFHQUlOOworCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQogCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiAKQEAgLTgxMCwxMyArOTM5LDEyIEBACiAKIAltYWNiX2luaXRfcmluZ3MoYnApOwogCW1hY2JfaW5pdF9odyhicCk7Ci0JbWFjYl9pbml0X3BoeShkZXYpOwogCi0JbWFjYl9jaGVja19tZWRpYShicCwgMSwgMSk7CisJLyogc2NoZWR1bGUgYSBsaW5rIHN0YXRlIGNoZWNrICovCisJcGh5X3N0YXJ0KGJwLT5waHlfZGV2KTsKKwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5wZXJpb2RpY190YXNrLCBIWik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODI1LDEwICs5NTMsMTEgQEAKIAlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCZicC0+cGVyaW9kaWNfdGFzayk7Ci0KIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKKwlpZiAoYnAtPnBoeV9kZXYpCisJCXBoeV9zdG9wKGJwLT5waHlfZGV2KTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOwogCW1hY2JfcmVzZXRfaHcoYnApOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CkBAIC04NDUsNiArOTc0LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXQgPSAmYnAtPnN0YXRzOwogCXN0cnVjdCBtYWNiX3N0YXRzICpod3N0YXQgPSAmYnAtPmh3X3N0YXRzOwogCisJLyogcmVhZCBzdGF0cyBmcm9tIGhhcmR3YXJlICovCisJbWFjYl91cGRhdGVfc3RhdHMoYnApOworCiAJLyogQ29udmVydCBIVyBzdGF0cyBpbnRvIG5ldGRldmljZSBzdGF0cyAqLwogCW5zdGF0LT5yeF9lcnJvcnMgPSAoaHdzdGF0LT5yeF9mY3NfZXJyb3JzICsKIAkJCSAgICBod3N0YXQtPnJ4X2FsaWduX2Vycm9ycyArCkBAIC04ODIsMTggKzEwMTQsMjcgQEAKIHN0YXRpYyBpbnQgbWFjYl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CiAKLQlyZXR1cm4gbWlpX2V0aHRvb2xfZ3NldCgmYnAtPm1paSwgY21kKTsKKwlpZiAoIXBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CiAKLQlyZXR1cm4gbWlpX2V0aHRvb2xfc3NldCgmYnAtPm1paSwgY21kKTsKKwlpZiAoIXBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2JfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIG1hY2JfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC05MDIsMTA0ICsxMDQzLDM0IEBACiAJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBicC0+cGRldi0+ZGV2LmJ1c19pZCk7CiB9CiAKLXN0YXRpYyBpbnQgbWFjYl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmYnAtPm1paSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbWFjYl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IG1hY2JfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MJCT0gbWFjYl9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IG1hY2JfZ2V0X2RydmluZm8sCi0JLm53YXlfcmVzZXQJCT0gbWFjYl9ud2F5X3Jlc2V0LAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAogfTsKIAogc3RhdGljIGludCBtYWNiX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeV9kZXY7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gZ2VuZXJpY19taWlfaW9jdGwoJmJwLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJaWYgKCFwaHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwocGh5ZGV2LCBpZl9taWkocnEpLCBjbWQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBtYWNiX21paV9zaG93KGNvbnN0IHN0cnVjdCBkZXZpY2UgKl9kZXYsIGNoYXIgKmJ1ZiwKLQkJCXVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihfZGV2KTsKLQlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKLQotCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJaW50IHZhbHVlOwotCQl2YWx1ZSA9IG1hY2JfbWRpb19yZWFkKGRldiwgYnAtPm1paS5waHlfaWQsIGFkZHIpOwotCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIjB4JTA0eFxuIiwgKHVpbnQxNl90KXZhbHVlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIE1JSV9FTlRSWShuYW1lLCBhZGRyKQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqX2RldiwJCQlcCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAotCQkJICAgY2hhciAqYnVmKQkJCQlcCi17CQkJCQkJCQlcCi0JcmV0dXJuIG1hY2JfbWlpX3Nob3coX2RldiwgYnVmLCBhZGRyKTsJCQlcCi19CQkJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCi0KLU1JSV9FTlRSWShibWNyLCBNSUlfQk1DUik7Ci1NSUlfRU5UUlkoYm1zciwgTUlJX0JNU1IpOwotTUlJX0VOVFJZKHBoeXNpZDEsIE1JSV9QSFlTSUQxKTsKLU1JSV9FTlRSWShwaHlzaWQyLCBNSUlfUEhZU0lEMik7Ci1NSUlfRU5UUlkoYWR2ZXJ0aXNlLCBNSUlfQURWRVJUSVNFKTsKLU1JSV9FTlRSWShscGEsIE1JSV9MUEEpOwotTUlJX0VOVFJZKGV4cGFuc2lvbiwgTUlJX0VYUEFOU0lPTik7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYWNiX21paV9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9ibWNyLmF0dHIsCi0JJmRldl9hdHRyX2Jtc3IuYXR0ciwKLQkmZGV2X2F0dHJfcGh5c2lkMS5hdHRyLAotCSZkZXZfYXR0cl9waHlzaWQyLmF0dHIsCi0JJmRldl9hdHRyX2FkdmVydGlzZS5hdHRyLAotCSZkZXZfYXR0cl9scGEuYXR0ciwKLQkmZGV2X2F0dHJfZXhwYW5zaW9uLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1hY2JfbWlpX2dyb3VwID0gewotCS5uYW1lCT0gIm1paSIsCi0JLmF0dHJzCT0gbWFjYl9taWlfYXR0cnMsCi19OwotCi1zdGF0aWMgdm9pZCBtYWNiX3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJm5ldC0+ZGV2OwotCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZfZGV2LT5rb2JqLCAmbWFjYl9taWlfZ3JvdXApOwotfQotCi1zdGF0aWMgaW50IG1hY2JfcmVnaXN0ZXJfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJm5ldC0+ZGV2OwotCWludCByZXQ7Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJl9kZXYtPmtvYmosICZtYWNiX21paV9ncm91cCk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIiVzOiBzeXNmcyBtaWkgYXR0cmlidXRlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgbmV0LT5uYW1lLCByZXQpOwotCXJldHVybiByZXQ7Ci19CiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtYWNiX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWFjYiAqYnA7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAl1bnNpZ25lZCBsb25nIHBjbGtfaHo7CiAJdTMyIGNvbmZpZzsKIAlpbnQgZXJyID0gLUVOWElPOwpAQCAtMTA3Myw2ICsxMTQ0LDcgQEAKIAlkZXYtPnN0b3AgPSBtYWNiX2Nsb3NlOwogCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbWFjYl9zdGFydF94bWl0OwogCWRldi0+Z2V0X3N0YXRzID0gbWFjYl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBtYWNiX3NldF9yeF9tb2RlOwogCWRldi0+ZG9faW9jdGwgPSBtYWNiX2lvY3RsOwogCWRldi0+cG9sbCA9IG1hY2JfcG9sbDsKIAlkZXYtPndlaWdodCA9IDY0OwpAQCAtMTA4MCwxMCArMTE1Miw2IEBACiAKIAlkZXYtPmJhc2VfYWRkciA9IHJlZ3MtPnN0YXJ0OwogCi0JSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5wZXJpb2RpY190YXNrLCBtYWNiX3BlcmlvZGljX3Rhc2spOwotCW11dGV4X2luaXQoJmJwLT5tZGlvX211dGV4KTsKLQlpbml0X2NvbXBsZXRpb24oJmJwLT5tZGlvX2NvbXBsZXRlKTsKLQogCS8qIFNldCBNSUkgbWFuYWdlbWVudCBjbG9jayBkaXZpZGVyICovCiAJcGNsa19oeiA9IGNsa19nZXRfcmF0ZShicC0+cGNsayk7CiAJaWYgKHBjbGtfaHogPD0gMjAwMDAwMDApCkBAIC0xMDk2LDIwICsxMTY0LDkgQEAKIAkJY29uZmlnID0gTUFDQl9CRihDTEssIE1BQ0JfQ0xLX0RJVjY0KTsKIAltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNvbmZpZyk7CiAKLQlicC0+bWlpLmRldiA9IGRldjsKLQlicC0+bWlpLm1kaW9fcmVhZCA9IG1hY2JfbWRpb19yZWFkOwotCWJwLT5taWkubWRpb193cml0ZSA9IG1hY2JfbWRpb193cml0ZTsKLQlicC0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKLQlicC0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7Ci0KIAltYWNiX2dldF9od2FkZHIoYnApOwotCWVyciA9IG1hY2JfcGh5X3Byb2JlKGJwKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBkZXRlY3QgUEhZLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9vdXRfZnJlZV9pcnE7Ci0JfQotCiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwogCWlmIChwZGF0YSAmJiBwZGF0YS0+aXNfcm1paSkKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTEpCiAJCW1hY2Jfd3JpdGVsKGJwLCBVU1JJTywgKE1BQ0JfQklUKFJNSUkpIHwgTUFDQl9CSVQoQ0xLRU4pKSApOwpAQCAtMTEzMSw5ICsxMTg4LDExIEBACiAJCWdvdG8gZXJyX291dF9mcmVlX2lycTsKIAl9CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWlmIChtYWNiX21paV9pbml0KGJwKSAhPSAwKSB7CisJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjsKKwl9CiAKLQltYWNiX3JlZ2lzdGVyX3N5c2ZzKGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdG1lbCBNQUNCIGF0IDB4JTA4bHggaXJxICVkICIKIAkgICAgICAgIiglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCkBAIC0xMTQxLDggKzEyMDAsMTUgQEAKIAkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKIAkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CiAKKwlwaHlkZXYgPSBicC0+cGh5X2RldjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogYXR0YWNoZWQgUEhZIGRyaXZlciBbJXNdICIKKwkJIihtaWlfYnVzOnBoeV9hZGRyPSVzLCBpcnE9JWQpXG4iLAorCQlkZXYtPm5hbWUsIHBoeWRldi0+ZHJ2LT5uYW1lLCBwaHlkZXYtPmRldi5idXNfaWQsIHBoeWRldi0+aXJxKTsKKwogCXJldHVybiAwOwogCitlcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiBlcnJfb3V0X2ZyZWVfaXJxOgogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX291dF9pb3VubWFwOgpAQCAtMTE1Myw3ICsxMjE5LDkgQEAKIAljbGtfcHV0KGJwLT5oY2xrKTsKICNlbmRpZgogCWNsa19kaXNhYmxlKGJwLT5wY2xrKTsKKyNpZm5kZWYgQ09ORklHX0FSQ0hfQVQ5MQogZXJyX291dF9wdXRfcGNsazoKKyNlbmRpZgogCWNsa19wdXQoYnAtPnBjbGspOwogZXJyX291dF9mcmVlX2RldjoKIAlmcmVlX25ldGRldihkZXYpOwpAQCAtMTE3MSw3ICsxMjM5LDggQEAKIAogCWlmIChkZXYpIHsKIAkJYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCQltYWNiX3VucmVnaXN0ZXJfc3lzZnMoZGV2KTsKKwkJbWRpb2J1c191bnJlZ2lzdGVyKCZicC0+bWlpX2J1cyk7CisJCWtmcmVlKGJwLT5taWlfYnVzLmlycSk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQlpb3VubWFwKGJwLT5yZWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2IuaCBiL2RyaXZlcnMvbmV0L21hY2IuaAppbmRleCBiM2JiMjE4Li40ZTMyODNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNiLmgKKysrIGIvZHJpdmVycy9uZXQvbWFjYi5oCkBAIC0zODMsMTEgKzM4MywxMSBAQAogCiAJdW5zaWduZWQgaW50CQlyeF9wZW5kaW5nLCB0eF9wZW5kaW5nOwogCi0Jc3RydWN0IGRlbGF5ZWRfd29yawlwZXJpb2RpY190YXNrOwotCi0Jc3RydWN0IG11dGV4CQltZGlvX211dGV4OwotCXN0cnVjdCBjb21wbGV0aW9uCW1kaW9fY29tcGxldGU7Ci0Jc3RydWN0IG1paV9pZl9pbmZvCW1paTsKKwlzdHJ1Y3QgbWlpX2J1cwkJbWlpX2J1czsKKwlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5X2RldjsKKwl1bnNpZ25lZCBpbnQgCQlsaW5rOworCXVuc2lnbmVkIGludCAJCXNwZWVkOworCXVuc2lnbmVkIGludCAJCWR1cGxleDsKIH07CiAKICNlbmRpZiAvKiBfTUFDQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBlMTczMmMxLi5kZWNhNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTEwNjAsNyArMTA2MCw2IEBACiAJc3RydWN0IG15cmkxMGdlX3R4X2J1ZiAqdHggPSAmbWdwLT50eDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBpZHgsIGxlbjsKLQlpbnQgbGltaXQgPSAwOwogCiAJd2hpbGUgKHR4LT5wa3RfZG9uZSAhPSBtY3BfaW5kZXgpIHsKIAkJaWR4ID0gdHgtPmRvbmUgJiB0eC0+bWFzazsKQEAgLTEwOTEsMTEgKzEwOTAsNiBAQAogCQkJCQkJCSAgICAgIGJ1cyksIGxlbiwKIAkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQl9Ci0KLQkJLyogbGltaXQgcG90ZW50aWFsIGZvciBsaXZlbG9jayBieSBvbmx5IGhhbmRsaW5nCi0JCSAqIDIgZnVsbCB0eCByaW5ncyBwZXIgY2FsbCAqLwotCQlpZiAodW5saWtlbHkoKytsaW1pdCA+IDIgKiB0eC0+bWFzaykpCi0JCQlicmVhazsKIAl9CiAJLyogc3RhcnQgdGhlIHF1ZXVlIGlmIHdlJ3ZlIHN0b3BwZWQgaXQgKi8KIAlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChtZ3AtPmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uYyBiL2RyaXZlcnMvbmV0L3MyaW8uYwppbmRleCA1OGJiZmRkLi5hZmVmNmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmMKKysrIGIvZHJpdmVycy9uZXQvczJpby5jCkBAIC03OTYsMTIgKzc5NiwxNCBAQAogCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBwYWdlX251bSA9IDA7CiAKIAlpZiAoIW5pYykKIAkJcmV0dXJuOwogCisJZGV2ID0gbmljLT5kZXY7CisKIAltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwogCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3Vudm5ldC5jIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjY3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW52bmV0LmMKQEAgLTAsMCArMSwxMTY0IEBACisvKiBzdW52bmV0LmM6IFN1biBMRE9NIFZpcnR1YWwgTmV0d29yayBEcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdmlvLmg+CisjaW5jbHVkZSA8YXNtL2xkYy5oPgorCisjaW5jbHVkZSAic3Vudm5ldC5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInN1bnZuZXQiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDI1LCAyMDA3IgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1biBMRE9NIHZpcnR1YWwgbmV0d29yayBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKKy8qIE9yZGVyZWQgZnJvbSBsYXJnZXN0IG1ham9yIHRvIGxvd2VzdCAqLworc3RhdGljIHN0cnVjdCB2aW9fdmVyc2lvbiB2bmV0X3ZlcnNpb25zW10gPSB7CisJeyAubWFqb3IgPSAxLCAubWlub3IgPSAwIH0sCit9OworCitzdGF0aWMgaW5saW5lIHUzMiB2bmV0X3R4X2RyaW5nX2F2YWlsKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCXJldHVybiB2aW9fZHJpbmdfYXZhaWwoZHIsIFZORVRfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIGludCB2bmV0X2hhbmRsZV91bmtub3duKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlvX21zZ190YWcgKnBrdCA9IGFyZzsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlY2VpdmVkIHVua25vd24gbXNnIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkgICAgICAgcGt0LT50eXBlLCBwa3QtPnN0eXBlLCBwa3QtPnN0eXBlX2VudiwgcGt0LT5zaWQpOworCXByaW50ayhLRVJOX0VSUiBQRlggIlJlc2V0dGluZyBjb25uZWN0aW9uLlxuIik7CisKKwlsZGNfZGlzY29ubmVjdChwb3J0LT52aW8ubHApOworCisJcmV0dXJuIC1FQ09OTlJFU0VUOworfQorCitzdGF0aWMgaW50IHZuZXRfc2VuZF9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8pCit7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydCA9IHRvX3ZuZXRfcG9ydCh2aW8pOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT52cC0+ZGV2OworCXN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyBwa3Q7CisJaW50IGk7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC50YWcudHlwZSA9IFZJT19UWVBFX0NUUkw7CisJcGt0LnRhZy5zdHlwZSA9IFZJT19TVUJUWVBFX0lORk87CisJcGt0LnRhZy5zdHlwZV9lbnYgPSBWSU9fQVRUUl9JTkZPOworCXBrdC50YWcuc2lkID0gdmlvX3NlbmRfc2lkKHZpbyk7CisJcGt0LnhmZXJfbW9kZSA9IFZJT19EUklOR19NT0RFOworCXBrdC5hZGRyX3R5cGUgPSBWTkVUX0FERFJfRVRIRVJNQUM7CisJcGt0LmFja19mcmVxID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwa3QuYWRkciB8PSAodTY0KWRldi0+ZGV2X2FkZHJbaV0gPDwgKCg1IC0gaSkgKiA4KTsKKwlwa3QubXR1ID0gRVRIX0ZSQU1FX0xFTjsKKworCXZpb2RiZyhIUywgIlNFTkQgTkVUIEFUVFIgeG1vZGVbMHgleF0gYXR5cGVbMHgleF0gYWRkclslbGx4XSAiCisJICAgICAgICJhY2tmcmVxWyV1XSBtdHVbJWxsdV1cbiIsCisJICAgICAgIHBrdC54ZmVyX21vZGUsIHBrdC5hZGRyX3R5cGUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC5hZGRyLAorCSAgICAgICBwa3QuYWNrX2ZyZXEsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdC5tdHUpOworCisJcmV0dXJuIHZpb19sZGNfc2VuZCh2aW8sICZwa3QsIHNpemVvZihwa3QpKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfYXR0cl9pbmZvKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sCisJCQkgICAgc3RydWN0IHZpb19uZXRfYXR0cl9pbmZvICpwa3QpCit7CisJdmlvZGJnKEhTLCAiR09UIE5FVCBBVFRSIElORk8geG1vZGVbMHgleF0gYXR5cGVbMHgleF0gYWRkclslbGx4XSAiCisJICAgICAgICJhY2tmcmVxWyV1XSBtdHVbJWxsdV1cbiIsCisJICAgICAgIHBrdC0+eGZlcl9tb2RlLCBwa3QtPmFkZHJfdHlwZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0LT5hZGRyLAorCSAgICAgICBwa3QtPmFja19mcmVxLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3QtPm10dSk7CisKKwlwa3QtPnRhZy5zaWQgPSB2aW9fc2VuZF9zaWQodmlvKTsKKworCWlmIChwa3QtPnhmZXJfbW9kZSAhPSBWSU9fRFJJTkdfTU9ERSB8fAorCSAgICBwa3QtPmFkZHJfdHlwZSAhPSBWTkVUX0FERFJfRVRIRVJNQUMgfHwKKwkgICAgcGt0LT5tdHUgIT0gRVRIX0ZSQU1FX0xFTikgeworCQl2aW9kYmcoSFMsICJTRU5EIE5FVCBBVFRSIE5BQ0tcbiIpOworCisJCXBrdC0+dGFnLnN0eXBlID0gVklPX1NVQlRZUEVfTkFDSzsKKworCQkodm9pZCkgdmlvX2xkY19zZW5kKHZpbywgcGt0LCBzaXplb2YoKnBrdCkpOworCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKwl9IGVsc2UgeworCQl2aW9kYmcoSFMsICJTRU5EIE5FVCBBVFRSIEFDS1xuIik7CisKKwkJcGt0LT50YWcuc3R5cGUgPSBWSU9fU1VCVFlQRV9BQ0s7CisKKwkJcmV0dXJuIHZpb19sZGNfc2VuZCh2aW8sIHBrdCwgc2l6ZW9mKCpwa3QpKTsKKwl9CisKK30KKworc3RhdGljIGludCBoYW5kbGVfYXR0cl9hY2soc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSAgIHN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBORVQgQVRUUiBBQ0tcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX2F0dHJfbmFjayhzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fbmV0X2F0dHJfaW5mbyAqcGt0KQoreworCXZpb2RiZyhIUywgIkdPVCBORVQgQVRUUiBOQUNLXG4iKTsKKworCXJldHVybiAtRUNPTk5SRVNFVDsKK30KKworc3RhdGljIGludCB2bmV0X2hhbmRsZV9hdHRyKHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8gKnBrdCA9IGFyZzsKKworCXN3aXRjaCAocGt0LT50YWcuc3R5cGUpIHsKKwljYXNlIFZJT19TVUJUWVBFX0lORk86CisJCXJldHVybiBoYW5kbGVfYXR0cl9pbmZvKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfQUNLOgorCQlyZXR1cm4gaGFuZGxlX2F0dHJfYWNrKHZpbywgcGt0KTsKKworCWNhc2UgVklPX1NVQlRZUEVfTkFDSzoKKwkJcmV0dXJuIGhhbmRsZV9hdHRyX25hY2sodmlvLCBwa3QpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FQ09OTlJFU0VUOworCX0KK30KKworc3RhdGljIHZvaWQgdm5ldF9oYW5kc2hha2VfY29tcGxldGUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcjsKKworCWRyID0gJnZpby0+ZHJpbmdzW1ZJT19EUklWRVJfUlhfUklOR107CisJZHItPnNuZF9ueHQgPSBkci0+cmN2X254dCA9IDE7CisKKwlkciA9ICZ2aW8tPmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCWRyLT5zbmRfbnh0ID0gZHItPnJjdl9ueHQgPSAxOworfQorCisvKiBUaGUgaHlwZXJ2aXNvciBpbnRlcmZhY2UgdGhhdCBpbXBsZW1lbnRzIGNvcHlpbmcgdG8vZnJvbSBpbXBvcnRlZAorICogbWVtb3J5IGZyb20gYW5vdGhlciBkb21haW4gcmVxdWlyZXMgdGhhdCBjb3BpZXMgYXJlIGRvbmUgdG8gOC1ieXRlCisgKiBhbGlnbmVkIGJ1ZmZlcnMsIGFuZCB0aGF0IHRoZSBsZW5ndGhzIG9mIHN1Y2ggY29waWVzIGFyZSBhbHNvIDgtYnl0ZQorICogbXVsdGlwbGVzLgorICoKKyAqIFNvIHdlIGFsaWduIHNrYi0+ZGF0YSB0byBhbiA4LWJ5dGUgbXVsdGlwbGUgYW5kIHBhZC1vdXQgdGhlIGRhdGEKKyAqIGFyZWEgc28gd2UgY2FuIHJvdW5kIHRoZSBjb3B5IGxlbmd0aCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZgorICogOCBmb3IgdGhlIGNvcHkuCisgKgorICogVGhlIHRyYW5zbWl0dGVyIHB1dHMgdGhlIGFjdHVhbCBzdGFydCBvZiB0aGUgcGFja2V0IDYgYnl0ZXMgaW50bworICogdGhlIGJ1ZmZlciBpdCBzZW5kcyBvdmVyLCBzbyB0aGF0IHRoZSBJUCBoZWFkZXJzIGFmdGVyIHRoZSBldGhlcm5ldAorICogaGVhZGVyIGFyZSBhbGlnbmVkIHByb3Blcmx5LiAgVGhlc2UgNiBieXRlcyBhcmUgbm90IGluIHRoZSBkZXNjcmlwdG9yCisgKiBsZW5ndGgsIHRoZXkgYXJlIHNpbXBseSBpbXBsaWVkLiAgVGhpcyBvZmZzZXQgaXMgcmVwcmVzZW50ZWQgdXNpbmcKKyAqIHRoZSBWTkVUX1BBQ0tFVF9TS0lQIG1hY3JvLgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmFsbG9jX2FuZF9hbGlnbl9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIGxlbitWTkVUX1BBQ0tFVF9TS0lQKzgrOCk7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBvZmY7CisKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiBOVUxMOworCisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGE7CisJb2ZmID0gKChhZGRyICsgN1VMKSAmIH43VUwpIC0gYWRkcjsKKwlpZiAob2ZmKQorCQlza2JfcmVzZXJ2ZShza2IsIG9mZik7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IHZuZXRfcnhfb25lKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBsZW4sCisJCSAgICAgICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0LT52cC0+ZGV2OworCXVuc2lnbmVkIGludCBjb3B5X2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKHVubGlrZWx5KGxlbiA8IEVUSF9aTEVOIHx8IGxlbiA+IEVUSF9GUkFNRV9MRU4pKSB7CisJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlnb3RvIG91dF9kcm9wcGVkOworCX0KKworCXNrYiA9IGFsbG9jX2FuZF9hbGlnbl9za2IoZGV2LCBsZW4pOworCWVyciA9IC1FTk9NRU07CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCWRldi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQlnb3RvIG91dF9kcm9wcGVkOworCX0KKworCWNvcHlfbGVuID0gKGxlbiArIFZORVRfUEFDS0VUX1NLSVAgKyA3VSkgJiB+N1U7CisJc2tiX3B1dChza2IsIGNvcHlfbGVuKTsKKwllcnIgPSBsZGNfY29weShwb3J0LT52aW8ubHAsIExEQ19DT1BZX0lOLAorCQkgICAgICAgc2tiLT5kYXRhLCBjb3B5X2xlbiwgMCwKKwkJICAgICAgIGNvb2tpZXMsIG5jb29raWVzKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJZGV2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZ290byBvdXRfZnJlZV9za2I7CisJfQorCisJc2tiX3B1bGwoc2tiLCBWTkVUX1BBQ0tFVF9TS0lQKTsKKwlza2JfdHJpbShza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCWRldi0+c3RhdHMucnhfcGFja2V0cysrOworCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZV9za2I6CisJa2ZyZWVfc2tiKHNrYik7CisKK291dF9kcm9wcGVkOgorCWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9zZW5kX2FjayhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCSB1MzIgc3RhcnQsIHUzMiBlbmQsIHU4IHZpb19kcmluZ19zdGF0ZSkKK3sKKwlzdHJ1Y3QgdmlvX2RyaW5nX2RhdGEgaGRyID0geworCQkudGFnID0geworCQkJLnR5cGUJCT0gVklPX1RZUEVfREFUQSwKKwkJCS5zdHlwZQkJPSBWSU9fU1VCVFlQRV9BQ0ssCisJCQkuc3R5cGVfZW52CT0gVklPX0RSSU5HX0RBVEEsCisJCQkuc2lkCQk9IHZpb19zZW5kX3NpZCgmcG9ydC0+dmlvKSwKKwkJfSwKKwkJLmRyaW5nX2lkZW50CQk9IGRyLT5pZGVudCwKKwkJLnN0YXJ0X2lkeAkJPSBzdGFydCwKKwkJLmVuZF9pZHgJCT0gZW5kLAorCQkuc3RhdGUJCQk9IHZpb19kcmluZ19zdGF0ZSwKKwl9OworCWludCBlcnIsIGRlbGF5OworCisJaGRyLnNlcSA9IGRyLT5zbmRfbnh0OworCWRlbGF5ID0gMTsKKwlkbyB7CisJCWVyciA9IHZpb19sZGNfc2VuZCgmcG9ydC0+dmlvLCAmaGRyLCBzaXplb2YoaGRyKSk7CisJCWlmIChlcnIgPiAwKSB7CisJCQlkci0+c25kX254dCsrOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KGRlbGF5KTsKKwkJaWYgKChkZWxheSA8PD0gMSkgPiAxMjgpCisJCQlkZWxheSA9IDEyODsKKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdTMyIG5leHRfaWR4KHUzMiBpZHgsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCWlmICgrK2lkeCA9PSBkci0+bnVtX2VudHJpZXMpCisJCWlkeCA9IDA7CisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHUzMiBwcmV2X2lkeCh1MzIgaWR4LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkcikKK3sKKwlpZiAoaWR4ID09IDApCisJCWlkeCA9IGRyLT5udW1fZW50cmllcyAtIDE7CisJZWxzZQorCQlpZHgtLTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX25ldF9kZXNjICpnZXRfcnhfZGVzYyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LAorCQkJCQlzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCQkJdTMyIGluZGV4KQoreworCXN0cnVjdCB2aW9fbmV0X2Rlc2MgKmRlc2MgPSBwb3J0LT52aW8uZGVzY19idWY7CisJaW50IGVycjsKKworCWVyciA9IGxkY19nZXRfZHJpbmdfZW50cnkocG9ydC0+dmlvLmxwLCBkZXNjLCBkci0+ZW50cnlfc2l6ZSwKKwkJCQkgIChpbmRleCAqIGRyLT5lbnRyeV9zaXplKSwKKwkJCQkgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJcmV0dXJuIGRlc2M7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3J4X2Rlc2Moc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwKKwkJICAgICAgIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAorCQkgICAgICAgc3RydWN0IHZpb19uZXRfZGVzYyAqZGVzYywKKwkJICAgICAgIHUzMiBpbmRleCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbGRjX3B1dF9kcmluZ19lbnRyeShwb3J0LT52aW8ubHAsIGRlc2MsIGRyLT5lbnRyeV9zaXplLAorCQkJCSAgKGluZGV4ICogZHItPmVudHJ5X3NpemUpLAorCQkJCSAgZHItPmNvb2tpZXMsIGRyLT5uY29va2llcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bmV0X3dhbGtfcnhfb25lKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsCisJCQkgICAgc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkgICAgdTMyIGluZGV4LCBpbnQgKm5lZWRzX2FjaykKK3sKKwlzdHJ1Y3QgdmlvX25ldF9kZXNjICpkZXNjID0gZ2V0X3J4X2Rlc2MocG9ydCwgZHIsIGluZGV4KTsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwlpbnQgZXJyOworCisJaWYgKElTX0VSUihkZXNjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGVzYyk7CisKKwl2aW9kYmcoREFUQSwgInZpb193YWxrX3J4X29uZSBkZXNjWyUwMng6JTAyeDolMDh4OiUwOHg6JWx4OiVseF1cbiIsCisJICAgICAgIGRlc2MtPmhkci5zdGF0ZSwgZGVzYy0+aGRyLmFjaywKKwkgICAgICAgZGVzYy0+c2l6ZSwgZGVzYy0+bmNvb2tpZXMsCisJICAgICAgIGRlc2MtPmNvb2tpZXNbMF0uY29va2llX2FkZHIsCisJICAgICAgIGRlc2MtPmNvb2tpZXNbMF0uY29va2llX3NpemUpOworCisJaWYgKGRlc2MtPmhkci5zdGF0ZSAhPSBWSU9fREVTQ19SRUFEWSkKKwkJcmV0dXJuIDE7CisJZXJyID0gdm5ldF9yeF9vbmUocG9ydCwgZGVzYy0+c2l6ZSwgZGVzYy0+Y29va2llcywgZGVzYy0+bmNvb2tpZXMpOworCWlmIChlcnIgPT0gLUVDT05OUkVTRVQpCisJCXJldHVybiBlcnI7CisJZGVzYy0+aGRyLnN0YXRlID0gVklPX0RFU0NfRE9ORTsKKwllcnIgPSBwdXRfcnhfZGVzYyhwb3J0LCBkciwgZGVzYywgaW5kZXgpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCSpuZWVkc19hY2sgPSBkZXNjLT5oZHIuYWNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfd2Fsa19yeChzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCXUzMiBzdGFydCwgdTMyIGVuZCkKK3sKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKwlpbnQgYWNrX3N0YXJ0ID0gLTEsIGFja19lbmQgPSAtMTsKKworCWVuZCA9IChlbmQgPT0gKHUzMikgLTEpID8gcHJldl9pZHgoc3RhcnQsIGRyKSA6IG5leHRfaWR4KGVuZCwgZHIpOworCisJdmlvZGJnKERBVEEsICJ2bmV0X3dhbGtfcnggc3RhcnRbJTA4eF0gZW5kWyUwOHhdXG4iLCBzdGFydCwgZW5kKTsKKworCXdoaWxlIChzdGFydCAhPSBlbmQpIHsKKwkJaW50IGFjayA9IDAsIGVyciA9IHZuZXRfd2Fsa19yeF9vbmUocG9ydCwgZHIsIHN0YXJ0LCAmYWNrKTsKKwkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChlcnIgIT0gMCkKKwkJCWJyZWFrOworCQlpZiAoYWNrX3N0YXJ0ID09IC0xKQorCQkJYWNrX3N0YXJ0ID0gc3RhcnQ7CisJCWFja19lbmQgPSBzdGFydDsKKwkJc3RhcnQgPSBuZXh0X2lkeChzdGFydCwgZHIpOworCQlpZiAoYWNrICYmIHN0YXJ0ICE9IGVuZCkgeworCQkJZXJyID0gdm5ldF9zZW5kX2Fjayhwb3J0LCBkciwgYWNrX3N0YXJ0LCBhY2tfZW5kLAorCQkJCQkgICAgVklPX0RSSU5HX0FDVElWRSk7CisJCQlpZiAoZXJyID09IC1FQ09OTlJFU0VUKQorCQkJCXJldHVybiBlcnI7CisJCQlhY2tfc3RhcnQgPSAtMTsKKwkJfQorCX0KKwlpZiAodW5saWtlbHkoYWNrX3N0YXJ0ID09IC0xKSkKKwkJYWNrX3N0YXJ0ID0gYWNrX2VuZCA9IHByZXZfaWR4KHN0YXJ0LCBkcik7CisJcmV0dXJuIHZuZXRfc2VuZF9hY2socG9ydCwgZHIsIGFja19zdGFydCwgYWNrX2VuZCwgVklPX0RSSU5HX1NUT1BQRUQpOworfQorCitzdGF0aWMgaW50IHZuZXRfcngoc3RydWN0IHZuZXRfcG9ydCAqcG9ydCwgdm9pZCAqbXNnYnVmKQoreworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSAqcGt0ID0gbXNnYnVmOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9SWF9SSU5HXTsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvID0gJnBvcnQtPnZpbzsKKworCXZpb2RiZyhEQVRBLCAidm5ldF9yeCBzdHlwZV9lbnZbJTA0eF0gc2VxWyUwMTZseF0gcmN2X254dFslMDE2bHhdXG4iLAorCSAgICAgICBwa3QtPnRhZy5zdHlwZV9lbnYsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CisKKwlpZiAodW5saWtlbHkocGt0LT50YWcuc3R5cGVfZW52ICE9IFZJT19EUklOR19EQVRBKSkKKwkJcmV0dXJuIDA7CisJaWYgKHVubGlrZWx5KHBrdC0+c2VxICE9IGRyLT5yY3Zfbnh0KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJSWCBvdXQgb2Ygc2VxdWVuY2Ugc2VxWzB4JWx4XSAiCisJCSAgICAgICAicmN2X254dFsweCVseF1cbiIsIHBrdC0+c2VxLCBkci0+cmN2X254dCk7CisJCXJldHVybiAwOworCX0KKworCWRyLT5yY3Zfbnh0Kys7CisKKwkvKiBYWFggVmFsaWRhdGUgcGt0LT5zdGFydF9pZHggYW5kIHBrdC0+ZW5kX2lkeCBYWFggKi8KKworCXJldHVybiB2bmV0X3dhbGtfcngocG9ydCwgZHIsIHBrdC0+c3RhcnRfaWR4LCBwa3QtPmVuZF9pZHgpOworfQorCitzdGF0aWMgaW50IGlkeF9pc19wZW5kaW5nKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLCB1MzIgZW5kKQoreworCXUzMiBpZHggPSBkci0+Y29uczsKKwlpbnQgZm91bmQgPSAwOworCisJd2hpbGUgKGlkeCAhPSBkci0+cHJvZCkgeworCQlpZiAoaWR4ID09IGVuZCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBkcik7CisJfQorCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCB2bmV0X2FjayhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0LCB2b2lkICptc2didWYpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSAqcGt0ID0gbXNnYnVmOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZuZXQgKnZwOworCXUzMiBlbmQ7CisKKwlpZiAodW5saWtlbHkocGt0LT50YWcuc3R5cGVfZW52ICE9IFZJT19EUklOR19EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwllbmQgPSBwa3QtPmVuZF9pZHg7CisJaWYgKHVubGlrZWx5KCFpZHhfaXNfcGVuZGluZyhkciwgZW5kKSkpCisJCXJldHVybiAwOworCisJZHItPmNvbnMgPSBuZXh0X2lkeChlbmQsIGRyKTsKKworCXZwID0gcG9ydC0+dnA7CisJZGV2ID0gdnAtPmRldjsKKwlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCSAgICAgdm5ldF90eF9kcmluZ19hdmFpbChkcikgPj0gVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9uYWNrKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQsIHZvaWQgKm1zZ2J1ZikKK3sKKwkvKiBYWFgganVzdCByZXNldCBvciBzaW1pbGFyIFhYWCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXliZV90eF93YWtldXAoc3RydWN0IHZuZXQgKnZwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2cC0+ZGV2OworCisJbmV0aWZfdHhfbG9jayhkZXYpOworCWlmIChsaWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkgeworCQlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0OworCQlpbnQgd2FrZSA9IDE7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmdnAtPnBvcnRfbGlzdCwgbGlzdCkgeworCQkJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHI7CisKKwkJCWRyID0gJnBvcnQtPnZpby5kcmluZ3NbVklPX0RSSVZFUl9UWF9SSU5HXTsKKwkJCWlmICh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA8CisJCQkgICAgVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKSkgeworCQkJCXdha2UgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICh3YWtlKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwluZXRpZl90eF91bmxvY2soZGV2KTsKK30KKworc3RhdGljIHZvaWQgdm5ldF9ldmVudCh2b2lkICphcmcsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gYXJnOworCXN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8gPSAmcG9ydC0+dmlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHR4X3dha2V1cCwgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZpby0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGV2ZW50ID09IExEQ19FVkVOVF9SRVNFVCB8fAorCQkgICAgIGV2ZW50ID09IExEQ19FVkVOVF9VUCkpIHsKKwkJdmlvX2xpbmtfc3RhdGVfY2hhbmdlKHZpbywgZXZlbnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aW8tPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKHVubGlrZWx5KGV2ZW50ICE9IExEQ19FVkVOVF9EQVRBX1JFQURZKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiVW5leHBlY3RlZCBMREMgZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlvLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwl0eF93YWtldXAgPSBlcnIgPSAwOworCXdoaWxlICgxKSB7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB2aW9fbXNnX3RhZyB0YWc7CisJCQl1NjQgcmF3WzhdOworCQl9IG1zZ2J1ZjsKKworCQllcnIgPSBsZGNfcmVhZCh2aW8tPmxwLCAmbXNnYnVmLCBzaXplb2YobXNnYnVmKSk7CisJCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCQl2aW9fY29ubl9yZXNldCh2aW8pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVyciA9PSAwKQorCQkJYnJlYWs7CisJCXZpb2RiZyhEQVRBLCAiVEFHIFslMDJ4OiUwMng6JTA0eDolMDh4XVxuIiwKKwkJICAgICAgIG1zZ2J1Zi50YWcudHlwZSwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc3R5cGUsCisJCSAgICAgICBtc2didWYudGFnLnN0eXBlX2VudiwKKwkJICAgICAgIG1zZ2J1Zi50YWcuc2lkKTsKKwkJZXJyID0gdmlvX3ZhbGlkYXRlX3NpZCh2aW8sICZtc2didWYudGFnKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKworCQlpZiAobGlrZWx5KG1zZ2J1Zi50YWcudHlwZSA9PSBWSU9fVFlQRV9EQVRBKSkgeworCQkJaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfSU5GTykgeworCQkJCWVyciA9IHZuZXRfcngocG9ydCwgJm1zZ2J1Zik7CisJCQl9IGVsc2UgaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfQUNLKSB7CisJCQkJZXJyID0gdm5ldF9hY2socG9ydCwgJm1zZ2J1Zik7CisJCQkJaWYgKGVyciA+IDApCisJCQkJCXR4X3dha2V1cCB8PSBlcnI7CisJCQl9IGVsc2UgaWYgKG1zZ2J1Zi50YWcuc3R5cGUgPT0gVklPX1NVQlRZUEVfTkFDSykgeworCQkJCWVyciA9IHZuZXRfbmFjayhwb3J0LCAmbXNnYnVmKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtc2didWYudGFnLnR5cGUgPT0gVklPX1RZUEVfQ1RSTCkgeworCQkJZXJyID0gdmlvX2NvbnRyb2xfcGt0X2VuZ2luZSh2aW8sICZtc2didWYpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IHZuZXRfaGFuZGxlX3Vua25vd24ocG9ydCwgJm1zZ2J1Zik7CisJCX0KKwkJaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmdmlvLT5sb2NrKTsKKwlpZiAodW5saWtlbHkodHhfd2FrZXVwICYmIGVyciAhPSAtRUNPTk5SRVNFVCkpCisJCW1heWJlX3R4X3dha2V1cChwb3J0LT52cCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fdm5ldF90eF90cmlnZ2VyKHN0cnVjdCB2bmV0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCXN0cnVjdCB2aW9fZHJpbmdfZGF0YSBoZHIgPSB7CisJCS50YWcgPSB7CisJCQkudHlwZQkJPSBWSU9fVFlQRV9EQVRBLAorCQkJLnN0eXBlCQk9IFZJT19TVUJUWVBFX0lORk8sCisJCQkuc3R5cGVfZW52CT0gVklPX0RSSU5HX0RBVEEsCisJCQkuc2lkCQk9IHZpb19zZW5kX3NpZCgmcG9ydC0+dmlvKSwKKwkJfSwKKwkJLmRyaW5nX2lkZW50CQk9IGRyLT5pZGVudCwKKwkJLnN0YXJ0X2lkeAkJPSBkci0+cHJvZCwKKwkJLmVuZF9pZHgJCT0gKHUzMikgLTEsCisJfTsKKwlpbnQgZXJyLCBkZWxheTsKKworCWhkci5zZXEgPSBkci0+c25kX254dDsKKwlkZWxheSA9IDE7CisJZG8geworCQllcnIgPSB2aW9fbGRjX3NlbmQoJnBvcnQtPnZpbywgJmhkciwgc2l6ZW9mKGhkcikpOworCQlpZiAoZXJyID4gMCkgeworCQkJZHItPnNuZF9ueHQrKzsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheShkZWxheSk7CisJCWlmICgoZGVsYXkgPDw9IDEpID4gMTI4KQorCQkJZGVsYXkgPSAxMjg7CisJfSB3aGlsZSAoZXJyID09IC1FQUdBSU4pOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHZuZXRfcG9ydCAqX190eF9wb3J0X2ZpbmQoc3RydWN0IHZuZXQgKnZwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGludCBoYXNoID0gdm5ldF9oYXNoZm4oc2tiLT5kYXRhKTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaHAgPSAmdnAtPnBvcnRfaGFzaFtoYXNoXTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0OworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgbiwgaHAsIGhhc2gpIHsKKwkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIocG9ydC0+cmFkZHIsIHNrYi0+ZGF0YSkpCisJCQlyZXR1cm4gcG9ydDsKKwl9CisJcG9ydCA9IE5VTEw7CisJaWYgKCFsaXN0X2VtcHR5KCZ2cC0+cG9ydF9saXN0KSkKKwkJcG9ydCA9IGxpc3RfZW50cnkodnAtPnBvcnRfbGlzdC5uZXh0LCBzdHJ1Y3Qgdm5ldF9wb3J0LCBsaXN0KTsKKworCXJldHVybiBwb3J0OworfQorCitzdHJ1Y3Qgdm5ldF9wb3J0ICp0eF9wb3J0X2ZpbmQoc3RydWN0IHZuZXQgKnZwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB2bmV0X3BvcnQgKnJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gX190eF9wb3J0X2ZpbmQodnAsIHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZuZXQgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gdHhfcG9ydF9maW5kKHZwLCBza2IpOworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCXN0cnVjdCB2aW9fbmV0X2Rlc2MgKmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXZvaWQgKnR4X2J1ZjsKKwlpbnQgaSwgZXJyOworCisJaWYgKHVubGlrZWx5KCFwb3J0KSkKKwkJZ290byBvdXRfZHJvcHBlZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCWlmICh1bmxpa2VseSh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA8IDIpKSB7CisJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiAiCisJCQkgICAgICAgInF1ZXVlIGF3YWtlIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dmlvLmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWQgPSB2aW9fZHJpbmdfY3VyKGRyKTsKKworCXR4X2J1ZiA9IHBvcnQtPnR4X2J1ZnNbZHItPnByb2RdLmJ1ZjsKKwlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwgdHhfYnVmICsgVk5FVF9QQUNLRVRfU0tJUCwgc2tiLT5sZW4pOworCisJbGVuID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCWxlbiA9IEVUSF9aTEVOOworCQltZW1zZXQodHhfYnVmK1ZORVRfUEFDS0VUX1NLSVArc2tiLT5sZW4sIDAsIGxlbiAtIHNrYi0+bGVuKTsKKwl9CisKKwlkLT5oZHIuYWNrID0gVklPX0FDS19FTkFCTEU7CisJZC0+c2l6ZSA9IGxlbjsKKwlkLT5uY29va2llcyA9IHBvcnQtPnR4X2J1ZnNbZHItPnByb2RdLm5jb29raWVzOworCWZvciAoaSA9IDA7IGkgPCBkLT5uY29va2llczsgaSsrKQorCQlkLT5jb29raWVzW2ldID0gcG9ydC0+dHhfYnVmc1tkci0+cHJvZF0uY29va2llc1tpXTsKKworCS8qIFRoaXMgaGFzIHRvIGJlIGEgbm9uLVNNUCB3cml0ZSBiYXJyaWVyIGJlY2F1c2Ugd2UgYXJlIHdyaXRpbmcKKwkgKiB0byBtZW1vcnkgd2hpY2ggaXMgc2hhcmVkIHdpdGggdGhlIHBlZXIgTERPTS4KKwkgKi8KKwl3bWIoKTsKKworCWQtPmhkci5zdGF0ZSA9IFZJT19ERVNDX1JFQURZOworCisJZXJyID0gX192bmV0X3R4X3RyaWdnZXIocG9ydCk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogVFggdHJpZ2dlciBlcnJvciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJZC0+aGRyLnN0YXRlID0gVklPX0RFU0NfRlJFRTsKKwkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlnb3RvIG91dF9kcm9wcGVkX3VubG9jazsKKwl9CisKKwlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJZHItPnByb2QgPSAoZHItPnByb2QgKyAxKSAmIChWTkVUX1RYX1JJTkdfU0laRSAtIDEpOworCWlmICh1bmxpa2VseSh2bmV0X3R4X2RyaW5nX2F2YWlsKGRyKSA8IDIpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJaWYgKHZuZXRfdHhfZHJpbmdfYXZhaWwoZHIpID4gVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT52aW8ubG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworb3V0X2Ryb3BwZWRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnZpby5sb2NrLCBmbGFncyk7CisKK291dF9kcm9wcGVkOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCitzdGF0aWMgdm9pZCB2bmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBYWFggSW1wbGVtZW50IG1lIFhYWCAqLworfQorCitzdGF0aWMgaW50IHZuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBYWFggSW1wbGVtZW50IG11bHRpY2FzdCBzdXBwb3J0IFhYWCAqLworfQorCitzdGF0aWMgaW50IHZuZXRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAobmV3X210dSAhPSBFVEhfREFUQV9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZuZXRfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworfQorCitzdGF0aWMgdTMyIHZuZXRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZuZXQgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gdnAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHZuZXRfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgdm5ldCAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdm5ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gdm5ldF9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IHZuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdm5ldF9zZXRfbXNnbGV2ZWwsCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9wZXJtX2FkZHIJCT0gZXRodG9vbF9vcF9nZXRfcGVybV9hZGRyLAorfTsKKworc3RhdGljIHZvaWQgdm5ldF9wb3J0X2ZyZWVfdHhfYnVmcyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCWludCBpOworCisJZHIgPSAmcG9ydC0+dmlvLmRyaW5nc1tWSU9fRFJJVkVSX1RYX1JJTkddOworCWlmIChkci0+YmFzZSkgeworCQlsZGNfZnJlZV9leHBfZHJpbmcocG9ydC0+dmlvLmxwLCBkci0+YmFzZSwKKwkJCQkgICAoZHItPmVudHJ5X3NpemUgKiBkci0+bnVtX2VudHJpZXMpLAorCQkJCSAgIGRyLT5jb29raWVzLCBkci0+bmNvb2tpZXMpOworCQlkci0+YmFzZSA9IE5VTEw7CisJCWRyLT5lbnRyeV9zaXplID0gMDsKKwkJZHItPm51bV9lbnRyaWVzID0gMDsKKwkJZHItPnBlbmRpbmcgPSAwOworCQlkci0+bmNvb2tpZXMgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBWTkVUX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXZvaWQgKmJ1ZiA9IHBvcnQtPnR4X2J1ZnNbaV0uYnVmOworCisJCWlmICghYnVmKQorCQkJY29udGludWU7CisKKwkJbGRjX3VubWFwKHBvcnQtPnZpby5scCwKKwkJCSAgcG9ydC0+dHhfYnVmc1tpXS5jb29raWVzLAorCQkJICBwb3J0LT50eF9idWZzW2ldLm5jb29raWVzKTsKKworCQlrZnJlZShidWYpOworCQlwb3J0LT50eF9idWZzW2ldLmJ1ZiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bmV0X3BvcnRfYWxsb2NfdHhfYnVmcyhzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWludCBpLCBlcnIsIG5jb29raWVzOworCXZvaWQgKmRyaW5nOworCisJZm9yIChpID0gMDsgaSA8IFZORVRfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJdm9pZCAqYnVmID0ga3phbGxvYyhFVEhfRlJBTUVfTEVOICsgOCwgR0ZQX0tFUk5FTCk7CisJCWludCBtYXBfbGVuID0gKEVUSF9GUkFNRV9MRU4gKyA3KSAmIH43OworCisJCWVyciA9IC1FTk9NRU07CisJCWlmICghYnVmKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRYIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmICgodW5zaWduZWQgbG9uZylidWYgJiAoOFVMIC0gMSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVFggYnVmZmVyIG1pc2FsaWduZWRcbiIpOworCQkJa2ZyZWUoYnVmKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWVyciA9IGxkY19tYXBfc2luZ2xlKHBvcnQtPnZpby5scCwgYnVmLCBtYXBfbGVuLAorCQkJCSAgICAgcG9ydC0+dHhfYnVmc1tpXS5jb29raWVzLCAyLAorCQkJCSAgICAgKExEQ19NQVBfU0hBRE9XIHwKKwkJCQkgICAgICBMRENfTUFQX0RJUkVDVCB8CisJCQkJICAgICAgTERDX01BUF9SVykpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoYnVmKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlwb3J0LT50eF9idWZzW2ldLmJ1ZiA9IGJ1ZjsKKwkJcG9ydC0+dHhfYnVmc1tpXS5uY29va2llcyA9IGVycjsKKwl9CisKKwlkciA9ICZwb3J0LT52aW8uZHJpbmdzW1ZJT19EUklWRVJfVFhfUklOR107CisKKwlsZW4gPSAoVk5FVF9UWF9SSU5HX1NJWkUgKgorCSAgICAgICAoc2l6ZW9mKHN0cnVjdCB2aW9fbmV0X2Rlc2MpICsKKwkJKHNpemVvZihzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSkgKiAyKSkpOworCisJbmNvb2tpZXMgPSBWSU9fTUFYX1JJTkdfQ09PS0lFUzsKKwlkcmluZyA9IGxkY19hbGxvY19leHBfZHJpbmcocG9ydC0+dmlvLmxwLCBsZW4sCisJCQkJICAgIGRyLT5jb29raWVzLCAmbmNvb2tpZXMsCisJCQkJICAgIChMRENfTUFQX1NIQURPVyB8CisJCQkJICAgICBMRENfTUFQX0RJUkVDVCB8CisJCQkJICAgICBMRENfTUFQX1JXKSk7CisJaWYgKElTX0VSUihkcmluZykpIHsKKwkJZXJyID0gUFRSX0VSUihkcmluZyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkci0+YmFzZSA9IGRyaW5nOworCWRyLT5lbnRyeV9zaXplID0gKHNpemVvZihzdHJ1Y3QgdmlvX25ldF9kZXNjKSArCisJCQkgIChzaXplb2Yoc3RydWN0IGxkY190cmFuc19jb29raWUpICogMikpOworCWRyLT5udW1fZW50cmllcyA9IFZORVRfVFhfUklOR19TSVpFOworCWRyLT5wcm9kID0gZHItPmNvbnMgPSAwOworCWRyLT5wZW5kaW5nID0gVk5FVF9UWF9SSU5HX1NJWkU7CisJZHItPm5jb29raWVzID0gbmNvb2tpZXM7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwl2bmV0X3BvcnRfZnJlZV90eF9idWZzKHBvcnQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgdm5ldF9sZGNfY2ZnID0geworCS5ldmVudAkJPSB2bmV0X2V2ZW50LAorCS5tdHUJCT0gNjQsCisJLm1vZGUJCT0gTERDX01PREVfVU5SRUxJQUJMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMgdm5ldF92aW9fb3BzID0geworCS5zZW5kX2F0dHIJCT0gdm5ldF9zZW5kX2F0dHIsCisJLmhhbmRsZV9hdHRyCQk9IHZuZXRfaGFuZGxlX2F0dHIsCisJLmhhbmRzaGFrZV9jb21wbGV0ZQk9IHZuZXRfaGFuZHNoYWtlX2NvbXBsZXRlLAorfTsKKworY29uc3QgY2hhciAqcmVtb3RlX21hY2FkZHJfcHJvcCA9ICJyZW1vdGUtbWFjLWFkZHJlc3MiOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2bmV0X3BvcnRfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJc3RydWN0IHZuZXRfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB2bmV0ICp2cDsKKwljb25zdCB1NjQgKnJtYWM7CisJaW50IGxlbiwgaSwgZXJyLCBzd2l0Y2hfcG9ydDsKKworCXZwID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPmRldi5wYXJlbnQpOworCWlmICghdnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgcG9ydCBwYXJlbnQgdm5ldC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlocCA9IG1kZXNjX2dyYWIoKTsKKworCXJtYWMgPSBtZGVzY19nZXRfcHJvcGVydHkoaHAsIHZkZXYtPm1wLCByZW1vdGVfbWFjYWRkcl9wcm9wLCAmbGVuKTsKKwllcnIgPSAtRU5PREVWOworCWlmICghcm1hYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJQb3J0IGxhY2tzICVzIHByb3BlcnR5LlxuIiwKKwkJICAgICAgIHJlbW90ZV9tYWNhZGRyX3Byb3ApOworCQlnb3RvIGVycl9vdXRfcHV0X21kZXNjOworCX0KKworCXBvcnQgPSBremFsbG9jKHNpemVvZigqcG9ydCksIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFwb3J0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSB2bmV0X3BvcnQuXG4iKTsKKwkJZ290byBlcnJfb3V0X3B1dF9tZGVzYzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJcG9ydC0+cmFkZHJbaV0gPSAoKnJtYWMgPj4gKDUgLSBpKSAqIDgpICYgMHhmZjsKKworCXBvcnQtPnZwID0gdnA7CisKKwllcnIgPSB2aW9fZHJpdmVyX2luaXQoJnBvcnQtPnZpbywgdmRldiwgVkRFVl9ORVRXT1JLLAorCQkJICAgICAgdm5ldF92ZXJzaW9ucywgQVJSQVlfU0laRSh2bmV0X3ZlcnNpb25zKSwKKwkJCSAgICAgICZ2bmV0X3Zpb19vcHMsIHZwLT5kZXYtPm5hbWUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3BvcnQ7CisKKwllcnIgPSB2aW9fbGRjX2FsbG9jKCZwb3J0LT52aW8sICZ2bmV0X2xkY19jZmcsIHBvcnQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX3BvcnQ7CisKKwllcnIgPSB2bmV0X3BvcnRfYWxsb2NfdHhfYnVmcyhwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfZnJlZV9sZGM7CisKKwlJTklUX0hMSVNUX05PREUoJnBvcnQtPmhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZwb3J0LT5saXN0KTsKKworCXN3aXRjaF9wb3J0ID0gMDsKKwlpZiAobWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgInN3aXRjaC1wb3J0IiwgTlVMTCkgIT0gTlVMTCkKKwkJc3dpdGNoX3BvcnQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJaWYgKHN3aXRjaF9wb3J0KQorCQlsaXN0X2FkZCgmcG9ydC0+bGlzdCwgJnZwLT5wb3J0X2xpc3QpOworCWVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmcG9ydC0+bGlzdCwgJnZwLT5wb3J0X2xpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZwb3J0LT5oYXNoLCAmdnAtPnBvcnRfaGFzaFt2bmV0X2hhc2hmbihwb3J0LT5yYWRkcildKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHBvcnQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBPUlQgKCByZW1vdGUtbWFjICIsIHZwLT5kZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIHBvcnQtPnJhZGRyW2ldLCBpID09IDUgPyAnICcgOiAnOicpOworCWlmIChzd2l0Y2hfcG9ydCkKKwkJcHJpbnRrKCJzd2l0Y2gtcG9ydCAiKTsKKwlwcmludGsoIilcbiIpOworCisJdmlvX3BvcnRfdXAoJnBvcnQtPnZpbyk7CisKKwltZGVzY19yZWxlYXNlKGhwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2ZyZWVfbGRjOgorCXZpb19sZGNfZnJlZSgmcG9ydC0+dmlvKTsKKworZXJyX291dF9mcmVlX3BvcnQ6CisJa2ZyZWUocG9ydCk7CisKK2Vycl9vdXRfcHV0X21kZXNjOgorCW1kZXNjX3JlbGVhc2UoaHApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdm5ldF9wb3J0X3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqdmRldikKK3sKKwlzdHJ1Y3Qgdm5ldF9wb3J0ICpwb3J0ID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHBvcnQpIHsKKwkJc3RydWN0IHZuZXQgKnZwID0gcG9ydC0+dnA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnZpby50aW1lcik7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJCWxpc3RfZGVsKCZwb3J0LT5saXN0KTsKKwkJaGxpc3RfZGVsKCZwb3J0LT5oYXNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCQl2bmV0X3BvcnRfZnJlZV90eF9idWZzKHBvcnQpOworCQl2aW9fbGRjX2ZyZWUoJnBvcnQtPnZpbyk7CisKKwkJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIE5VTEwpOworCisJCWtmcmVlKHBvcnQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZuZXRfcG9ydF9tYXRjaFtdID0geworCXsKKwkJLnR5cGUgPSAidm5ldC1wb3J0IiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2bmV0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZuZXRfcG9ydF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdm5ldF9wb3J0X21hdGNoLAorCS5wcm9iZQkJPSB2bmV0X3BvcnRfcHJvYmUsCisJLnJlbW92ZQkJPSB2bmV0X3BvcnRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2bmV0X3BvcnQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9Cit9OworCitjb25zdCBjaGFyICpsb2NhbF9tYWNfcHJvcCA9ICJsb2NhbC1tYWMtYWRkcmVzcyI7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZuZXRfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsCisJCQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBpbnQgdm5ldF92ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgdm5ldCAqdnA7CisJY29uc3QgdTY0ICptYWM7CisJaW50IGVyciwgaSwgbGVuOworCisJaWYgKHZuZXRfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWhwID0gbWRlc2NfZ3JhYigpOworCisJbWFjID0gbWRlc2NfZ2V0X3Byb3BlcnR5KGhwLCB2ZGV2LT5tcCwgbG9jYWxfbWFjX3Byb3AsICZsZW4pOworCWlmICghbWFjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInZuZXQgbGFja3MgJXMgcHJvcGVydHkuXG4iLAorCQkgICAgICAgbG9jYWxfbWFjX3Byb3ApOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCp2cCkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkV0aGVyZGV2IGFsbG9jIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gKCptYWMgPj4gKDUgLSBpKSAqIDgpICYgMHhmZjsKKworCW1lbWNweShkZXYtPnBlcm1fYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisKKwlTRVRfTkVUREVWX0RFVihkZXYsICZ2ZGV2LT5kZXYpOworCisJdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJnZwLT5sb2NrKTsKKwl2cC0+ZGV2ID0gZGV2OworCXZwLT52ZGV2ID0gdmRldjsKKworCUlOSVRfTElTVF9IRUFEKCZ2cC0+cG9ydF9saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgVk5FVF9QT1JUX0hBU0hfU0laRTsgaSsrKQorCQlJTklUX0hMSVNUX0hFQUQoJnZwLT5wb3J0X2hhc2hbaV0pOworCisJZGV2LT5vcGVuID0gdm5ldF9vcGVuOworCWRldi0+c3RvcCA9IHZuZXRfY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB2bmV0X3NldF9yeF9tb2RlOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gdm5ldF9zZXRfbWFjX2FkZHI7CisJZGV2LT50eF90aW1lb3V0ID0gdm5ldF90eF90aW1lb3V0OworCWRldi0+ZXRodG9vbF9vcHMgPSAmdm5ldF9ldGh0b29sX29wczsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVk5FVF9UWF9USU1FT1VUOworCWRldi0+Y2hhbmdlX210dSA9IHZuZXRfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZuZXRfc3RhcnRfeG1pdDsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN1biBMRE9NIHZuZXQgIiwgZGV2LT5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIHZwKTsKKworCW1kZXNjX3JlbGVhc2UoaHApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKworZXJyX291dDoKKwltZGVzY19yZWxlYXNlKGhwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZuZXRfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCisJc3RydWN0IHZuZXQgKnZwID0gZGV2X2dldF9kcnZkYXRhKCZ2ZGV2LT5kZXYpOworCisJaWYgKHZwKSB7CisJCS8qIFhYWCB1bnJlZ2lzdGVyIHBvcnQsIG9yIGF0IGxlYXN0IGNoZWNrIFhYWCAqLworCQl1bnJlZ2lzdGVyX25ldGRldmljZSh2cC0+ZGV2KTsKKwkJZGV2X3NldF9kcnZkYXRhKCZ2ZGV2LT5kZXYsIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZuZXRfbWF0Y2hbXSA9IHsKKwl7CisJCS50eXBlID0gIm5ldHdvcmsiLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZuZXRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHZpb19kcml2ZXIgdm5ldF9kcml2ZXIgPSB7CisJLmlkX3RhYmxlCT0gdm5ldF9tYXRjaCwKKwkucHJvYmUJCT0gdm5ldF9wcm9iZSwKKwkucmVtb3ZlCQk9IHZuZXRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJ2bmV0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgdm5ldF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfZHJpdmVyKTsKKworCWlmICghZXJyKSB7CisJCWVyciA9IHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZuZXRfcG9ydF9kcml2ZXIpOworCQlpZiAoZXJyKQorCQkJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X2RyaXZlcik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZuZXRfZXhpdCh2b2lkKQoreworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdm5ldF9wb3J0X2RyaXZlcik7CisJdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bmV0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHZuZXRfaW5pdCk7Cittb2R1bGVfZXhpdCh2bmV0X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3Vudm5ldC5oIGIvZHJpdmVycy9uZXQvc3Vudm5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODg3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW52bmV0LmgKQEAgLTAsMCArMSw3MCBAQAorI2lmbmRlZiBfU1VOVk5FVF9ICisjZGVmaW5lIF9TVU5WTkVUX0gKKworI2RlZmluZSBERVNDX05DT09LSUVTKGVudHJ5X3NpemUpCVwKKwkoKGVudHJ5X3NpemUpIC0gc2l6ZW9mKHN0cnVjdCB2aW9fbmV0X2Rlc2MpKQorCisvKiBsZW5ndGggb2YgdGltZSBiZWZvcmUgd2UgZGVjaWRlIHRoZSBoYXJkd2FyZSBpcyBib3JrZWQsCisgKiBhbmQgZGV2LT50eF90aW1lb3V0KCkgc2hvdWxkIGJlIGNhbGxlZCB0byBmaXggdGhlIHByb2JsZW0KKyAqLworI2RlZmluZSBWTkVUX1RYX1RJTUVPVVQJCQkoNSAqIEhaKQorCisjZGVmaW5lIFZORVRfVFhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVk5FVF9UWF9XQUtFVVBfVEhSRVNIKGRyKQkoKGRyKS0+cGVuZGluZyAvIDQpCisKKy8qIFZORVQgcGFja2V0cyBhcmUgc2VudCBpbiBidWZmZXJzIHdpdGggdGhlIGZpcnN0IDYgYnl0ZXMgc2tpcHBlZAorICogc28gdGhhdCBhZnRlciB0aGUgZXRoZXJuZXQgaGVhZGVyIHRoZSBJUHY0L0lQdjYgaGVhZGVycyBhcmUgYWxpZ25lZAorICogcHJvcGVybHkuCisgKi8KKyNkZWZpbmUgVk5FVF9QQUNLRVRfU0tJUAkJNgorCitzdHJ1Y3Qgdm5ldF90eF9lbnRyeSB7CisJdm9pZAkJCSpidWY7CisJdW5zaWduZWQgaW50CQluY29va2llczsKKwlzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZQljb29raWVzWzJdOworfTsKKworc3RydWN0IHZuZXQ7CitzdHJ1Y3Qgdm5ldF9wb3J0IHsKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZQl2aW87CisKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQloYXNoOworCXU4CQkJcmFkZHJbRVRIX0FMRU5dOworCisJc3RydWN0IHZuZXQJCSp2cDsKKworCXN0cnVjdCB2bmV0X3R4X2VudHJ5CXR4X2J1ZnNbVk5FVF9UWF9SSU5HX1NJWkVdOworCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm5ldF9wb3J0ICp0b192bmV0X3BvcnQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHZpbywgc3RydWN0IHZuZXRfcG9ydCwgdmlvKTsKK30KKworI2RlZmluZSBWTkVUX1BPUlRfSEFTSF9TSVpFCTE2CisjZGVmaW5lIFZORVRfUE9SVF9IQVNIX01BU0sJKFZORVRfUE9SVF9IQVNIX1NJWkUgLSAxKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2bmV0X2hhc2hmbih1OCAqbWFjKQoreworCXVuc2lnbmVkIGludCB2YWwgPSBtYWNbNF0gXiBtYWNbNV07CisKKwlyZXR1cm4gdmFsICYgKFZORVRfUE9SVF9IQVNIX01BU0spOworfQorCitzdHJ1Y3Qgdm5ldCB7CisJLyogUHJvdGVjdHMgcG9ydF9saXN0IGFuZCBwb3J0X2hhc2guICAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCisJdTMyCQkJbXNnX2VuYWJsZTsKKwlzdHJ1Y3QgdmlvX2RldgkJKnZkZXY7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBvcnRfbGlzdDsKKworCXN0cnVjdCBobGlzdF9oZWFkCXBvcnRfaGFzaFtWTkVUX1BPUlRfSEFTSF9TSVpFXTsKK307CisKKyNlbmRpZiAvKiBfU1VOVk5FVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jIGIvZHJpdmVycy9uZXQvdXNiL2NkY19zdWJzZXQuYwppbmRleCBiYzYyYjAxLi45NDM5ODhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX3N1YnNldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfc3Vic2V0LmMKQEAgLTMwNSw2ICszMDUsOSBAQAogCVVTQl9ERVZJQ0UgKDB4ODA4NiwgMHgwN2QzKSwJLy8gImJsb2IiIGJvb3Rsb2FkZXIKIAkuZHJpdmVyX2luZm8gPQkodW5zaWduZWQgbG9uZykgJmJsb2JfaW5mbywKIH0sIHsKKwlVU0JfREVWSUNFICgweDEyODYsIDB4ODAwMSksICAgIC8vICJibG9iIiBib290bG9hZGVyCisJLmRyaXZlcl9pbmZvID0gICh1bnNpZ25lZCBsb25nKSAmYmxvYl9pbmZvLAorfSwgewogCS8vIExpbnV4IEV0aGVybmV0L1JORElTIGdhZGdldCBvbiBweGEyMTAvMjV4LzI2eCwgc2Vjb25kIGNvbmZpZwogCS8vIGUuZy4gR3Vtc3RpeCwgY3VycmVudCBPcGVuWmF1cnVzLCAuLi4KIAlVU0JfREVWSUNFX1ZFUiAoMHgwNTI1LCAweGE0YTIsIDB4MDIwMywgMHgwMjAzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKaW5kZXggNGZjODY4MS4uYTNkZjA5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTYxLDcgKzYxLDcgQEAKICMKIGNvbmZpZyBMQU5NRURJQQogCXRyaXN0YXRlICJMYW5NZWRpYSBDb3JwLiBTU0kvVi4zNSwgVDEvRTEsIEhTU0ksIFQzIGJvYXJkcyIKLQlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gUENJICYmIFZJUlRfVE9fQlVTCiAJLS0taGVscC0tLQogCSAgRHJpdmVyIGZvciB0aGUgZm9sbG93aW5nIExhbiBNZWRpYSBmYW1pbHkgb2Ygc2VyaWFsIGJvYXJkczoKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IDJkM2ExODAuLmVlMWNjMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTUyLDYgKzUyLDggQEAKIAogI2luY2x1ZGUgImFpcm8uaCIKIAorI2RlZmluZSBEUlZfTkFNRSAiYWlybyIKKwogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYXJkX2lkc1tdID0gewogCXsgMHgxNGI5LCAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LApAQCAtNzEsNyArNzMsNyBAQAogc3RhdGljIGludCBhaXJvX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWlyb19kcml2ZXIgPSB7Ci0JLm5hbWUgICAgID0gImFpcm8iLAorCS5uYW1lICAgICA9IERSVl9OQU1FLAogCS5pZF90YWJsZSA9IGNhcmRfaWRzLAogCS5wcm9iZSAgICA9IGFpcm9fcGNpX3Byb2JlLAogCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGFpcm9fcGNpX3JlbW92ZSksCkBAIC0xMDkyLDcgKzEwOTQsNyBAQAogc3RhdGljIHZvaWQgT1VUNDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIsIHUxNiB2YWx1ZSApOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IElONDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIgKTsKIHN0YXRpYyB1MTYgc2V0dXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTggKm1hYywgaW50IGxvY2spOwotc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApOworc3RhdGljIGludCBlbmFibGVfTUFDKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jayk7CiBzdGF0aWMgdm9pZCBkaXNhYmxlX01BQyhzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxvY2spOwogc3RhdGljIHZvaWQgZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGFpcm9faW5mbyopOwogc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKQEAgLTEyNTAsNyArMTI1Miw3IEBACiBzdGF0aWMgaW50IGZsYXNocmVzdGFydChzdHJ1Y3QgYWlyb19pbmZvICphaSxzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogI2RlZmluZSBhaXJvX3ByaW50KHR5cGUsIG5hbWUsIGZtdCwgYXJncy4uLikgXAotCXsgcHJpbnRrKHR5cGUgImFpcm8oJXMpOiAiIGZtdCAiXG4iLCBuYW1lLCAjI2FyZ3MpOyB9CisJcHJpbnRrKHR5cGUgRFJWX05BTUUgIiglcyk6ICIgZm10ICJcbiIsIG5hbWUsICMjYXJncykKIAogI2RlZmluZSBhaXJvX3ByaW50X2luZm8obmFtZSwgZm10LCBhcmdzLi4uKSBcCiAJYWlyb19wcmludChLRVJOX0lORk8sIG5hbWUsIGZtdCwgIyNhcmdzKQpAQCAtMTkyNiwyOCArMTkyOCw1NCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBhaXJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgewotCXN0cnVjdCBhaXJvX2luZm8gKmluZm8gPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CitzdGF0aWMgdm9pZCB0cnlfYXV0b193ZXAoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJaWYgKGF1dG9fd2VwICYmICEoYWktPmZsYWdzICYgRkxBR19SQURJT19ET1dOKSkgeworCQlhaS0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOworCX0KK30KIAotCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmaW5mby0+ZmxhZ3MpKQorc3RhdGljIGludCBhaXJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCByYyA9IDA7CisKKwlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpCiAJCXJldHVybiAtRUlPOwogCiAJLyogTWFrZSBzdXJlIHRoZSBjYXJkIGlzIGNvbmZpZ3VyZWQuCiAJICogV2lyZWxlc3MgRXh0ZW5zaW9ucyBtYXkgcG9zdHBvbmUgY29uZmlnIGNoYW5nZXMgdW50aWwgdGhlIGNhcmQKIAkgKiBpcyBvcGVuICh0byBwaXBlbGluZSBjaGFuZ2VzIGFuZCBzcGVlZC11cCBjYXJkIHNldHVwKS4gSWYKIAkgKiB0aG9zZSBjaGFuZ2VzIGFyZSBub3QgeWV0IGNvbW1pdGVkLCBkbyBpdCBub3cgLSBKZWFuIElJICovCi0JaWYgKHRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmluZm8tPmZsYWdzKSkgewotCQlkaXNhYmxlX01BQyhpbmZvLCAxKTsKLQkJd3JpdGVDb25maWdSaWQoaW5mbywgMSk7CisJaWYgKHRlc3RfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkgeworCQlkaXNhYmxlX01BQyhhaSwgMSk7CisJCXdyaXRlQ29uZmlnUmlkKGFpLCAxKTsKIAl9CiAKLQlpZiAoaW5mby0+d2lmaWRldiAhPSBkZXYpIHsKKwlpZiAoYWktPndpZmlkZXYgIT0gZGV2KSB7CisJCWNsZWFyX2JpdChKT0JfRElFLCAmYWktPmpvYnMpOworCQlhaS0+YWlyb190aHJlYWRfdGFzayA9IGt0aHJlYWRfcnVuKGFpcm9fdGhyZWFkLCBkZXYsIGRldi0+bmFtZSk7CisJCWlmIChJU19FUlIoYWktPmFpcm9fdGhyZWFkX3Rhc2spKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUihhaS0+YWlyb190aHJlYWRfdGFzayk7CisKKwkJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgYWlyb19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJZGV2LT5uYW1lLCBkZXYpOworCQlpZiAocmMpIHsKKwkJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwKKwkJCQkicmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWQiLAorCQkJCWRldi0+aXJxLCByYyk7CisJCQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7CisJCQlrdGhyZWFkX3N0b3AoYWktPmFpcm9fdGhyZWFkX3Rhc2spOworCQkJcmV0dXJuIHJjOworCQl9CisKIAkJLyogUG93ZXIgb24gdGhlIE1BQyBjb250cm9sbGVyICh3aGljaCBtYXkgaGF2ZSBiZWVuIGRpc2FibGVkKSAqLwotCQljbGVhcl9iaXQoRkxBR19SQURJT19ET1dOLCAmaW5mby0+ZmxhZ3MpOwotCQllbmFibGVfaW50ZXJydXB0cyhpbmZvKTsKKwkJY2xlYXJfYml0KEZMQUdfUkFESU9fRE9XTiwgJmFpLT5mbGFncyk7CisJCWVuYWJsZV9pbnRlcnJ1cHRzKGFpKTsKKworCQl0cnlfYXV0b193ZXAoYWkpOwogCX0KLQllbmFibGVfTUFDKGluZm8sICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTIzMzgsMTQgKzIzNjYsMTMgQEAKIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCVJlc3AgcnNwOwogCiAJcmVhZENvbmZpZ1JpZChhaSwgMSk7CiAJbWVtY3B5IChhaS0+Y29uZmlnLm1hY0FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwogCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJd3JpdGVDb25maWdSaWQgKGFpLCAxKTsKLQllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGFpLCAxKTsKIAltZW1jcHkgKGFpLT5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKIAlpZiAoYWktPndpZmlkZXYpCiAJCW1lbWNweSAoYWktPndpZmlkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKQEAgLTIzOTIsNiArMjQxOSwxMSBAQAogCQlkaXNhYmxlX01BQyhhaSwgMSk7CiAjZW5kaWYKIAkJZGlzYWJsZV9pbnRlcnJ1cHRzKCBhaSApOworCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCXNldF9iaXQoSk9CX0RJRSwgJmFpLT5qb2JzKTsKKwkJa3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDAzLDcgKzI0MzUsNiBAQAogCXNldF9iaXQoRkxBR19SQURJT19ET1dOLCAmYWktPmZsYWdzKTsKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJZGlzYWJsZV9pbnRlcnJ1cHRzKGFpKTsKLQlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOwogCXRha2Vkb3duX3Byb2NfZW50cnkoIGRldiwgYWkgKTsKIAlpZiAodGVzdF9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKSkgewogCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CkBAIC0yNDE0LDkgKzI0NDUsNiBAQAogCQl9CiAJCWNsZWFyX2JpdChGTEFHX1JFR0lTVEVSRUQsICZhaS0+ZmxhZ3MpOwogCX0KLQlzZXRfYml0KEpPQl9ESUUsICZhaS0+am9icyk7Ci0Ja3RocmVhZF9zdG9wKGFpLT5haXJvX3RocmVhZF90YXNrKTsKLQogCS8qCiAJICogQ2xlYW4gb3V0IHR4IHF1ZXVlCiAJICovCkBAIC0yNTU0LDggKzI1ODIsNyBAQAogICogMikgTWFwIFBDSSBtZW1vcnkgZm9yIGlzc3VlaW5nIGNvbW1hbmRzLgogICogMykgQWxsb2NhdGUgbWVtb3J5IChzaGFyZWQpIHRvIHNlbmQgYW5kIHJlY2VpdmUgZXRoZXJuZXQgZnJhbWVzLgogICovCi1zdGF0aWMgaW50IG1waV9tYXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgc3RydWN0IHBjaV9kZXYgKnBjaSwKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IG1waV9tYXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKIAl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCwgbWVtX2xlbiwgYXV4X3N0YXJ0LCBhdXhfbGVuOwogCWludCByYyA9IC0xOwpAQCAtMjU2OSwzNSArMjU5NiwzNSBAQAogCWF1eF9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOwogCWF1eF9sZW4gPSBBVVhNRU1TSVpFOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuLCBuYW1lKSkgewotCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzIiwKLQkJICAgICAgIChpbnQpbWVtX3N0YXJ0LCAoaW50KW1lbV9sZW4sIG5hbWUpOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgbWVtX2xlbiwgRFJWX05BTUUpKSB7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0iLAorCQkJKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbik7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4sIG5hbWUpKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuLCBEUlZfTkFNRSkpIHsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBnZXQgcmVnaW9uICV4WyV4XSIsCisJCQkoaW50KWF1eF9zdGFydCwgKGludClhdXhfbGVuKTsKIAkJZ290byBmcmVlX3JlZ2lvbjE7CiAJfQogCiAJYWktPnBjaW1lbSA9IGlvcmVtYXAobWVtX3N0YXJ0LCBtZW1fbGVuKTsKIAlpZiAoIWFpLT5wY2ltZW0pIHsKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIkNvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIGZvciAlcyIsCi0JCSAgICAgICAoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuLCBuYW1lKTsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSIsCisJCQkoaW50KW1lbV9zdGFydCwgKGludCltZW1fbGVuKTsKIAkJZ290byBmcmVlX3JlZ2lvbjI7CiAJfQogCWFpLT5wY2lhdXggPSBpb3JlbWFwKGF1eF9zdGFydCwgYXV4X2xlbik7CiAJaWYgKCFhaS0+cGNpYXV4KSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBtYXAgcmVnaW9uICV4WyV4XSBmb3IgJXMiLAotCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0iLAorCQkJKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbik7CiAJCWdvdG8gZnJlZV9tZW1tYXA7CiAJfQogCiAJLyogUmVzZXJ2ZSBQS1RTSVpFIGZvciBlYWNoIGZpZCBhbmQgMksgZm9yIHRoZSBSaWRzICovCiAJYWktPnNoYXJlZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sICZhaS0+c2hhcmVkX2RtYSk7CiAJaWYgKCFhaS0+c2hhcmVkKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJDb3VsZG4ndCBhbGxvY19jb25zaXN0ZW50ICVkIiwKLQkJICAgICAgIFBDSV9TSEFSRURfTEVOKTsKKwkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBhbGxvY19jb25zaXN0ZW50ICVkIiwKKwkJCVBDSV9TSEFSRURfTEVOKTsKIAkJZ290byBmcmVlX2F1eG1hcDsKIAl9CiAKQEAgLTI3NDIsNyArMjc2OSw3IEBACiAJICAgIGt6YWxsb2MoQUlST19NQVhfTkVUV09SS19DT1VOVCAqIHNpemVvZihCU1NMaXN0RWxlbWVudCksCiAJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWFpLT5uZXR3b3JrcykgewotCQlhaXJvX3ByaW50X3dhcm4oYWktPmRldi0+bmFtZSwgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zIik7CisJCWFpcm9fcHJpbnRfd2FybigiIiwgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBiZWFjb25zIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMjc3MCw3ICsyNzk3LDYgQEAKIHsKIAlpbnQgc3RhdHVzOwogCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKLQljb25zdCBjaGFyICpuYW1lID0gYWktPmRldi0+bmFtZTsKIAogCXN0YXR1cyA9IHJlYWRDYXBhYmlsaXR5UmlkKGFpLCAmY2FwX3JpZCwgMSk7CiAJaWYgKHN0YXR1cyAhPSBTVUNDRVNTKSByZXR1cm4gMDsKQEAgLTI3NzgsMTIgKzI4MDQsMTIgQEAKIAkvKiBPbmx5IGZpcm13YXJlIHZlcnNpb25zIDUuMzAuMTcgb3IgYmV0dGVyIGNhbiBkbyBXUEEgKi8KIAlpZiAoKGNhcF9yaWQuc29mdFZlciA+IDB4NTMwKQogCSAgfHwgKChjYXBfcmlkLnNvZnRWZXIgPT0gMHg1MzApICYmIChjYXBfcmlkLnNvZnRTdWJWZXIgPj0gMTcpKSkgewotCQlhaXJvX3ByaW50X2luZm8obmFtZSwgIldQQSBpcyBzdXBwb3J0ZWQuIik7CisJCWFpcm9fcHJpbnRfaW5mbygiIiwgIldQQSBpcyBzdXBwb3J0ZWQuIik7CiAJCXJldHVybiAxOwogCX0KIAogCS8qIE5vIFdQQSBzdXBwb3J0ICovCi0JYWlyb19wcmludF9pbmZvKG5hbWUsICJXUEEgdW5zdXBwb3J0ZWQgKG9ubHkgZmlybXdhcmUgdmVyc2lvbnMgNS4zMC4xNyIKKwlhaXJvX3ByaW50X2luZm8oIiIsICJXUEEgdW5zdXBwb3J0ZWQgKG9ubHkgZmlybXdhcmUgdmVyc2lvbnMgNS4zMC4xNyIKIAkJIiBhbmQgZ3JlYXRlciBzdXBwb3J0IFdQQS4gIERldGVjdGVkICVzKSIsIGNhcF9yaWQucHJvZFZlcik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzk3LDIzICsyODIzLDE5IEBACiAJaW50IGksIHJjOwogCiAJLyogQ3JlYXRlIHRoZSBuZXR3b3JrIGRldmljZSBvYmplY3QuICovCi0gICAgICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYWkpKTsKLSAgICAgICAgaWYgKCFkZXYpIHsKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCphaSksICIiLCBldGhlcl9zZXR1cCk7CisJaWYgKCFkZXYpIHsKIAkJYWlyb19wcmludF9lcnIoIiIsICJDb3VsZG4ndCBhbGxvY19ldGhlcmRldiIpOwogCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKCIiLCAiQ291bGRuJ3QgZ2V0IG5hbWUhIik7Ci0JCWdvdG8gZXJyX291dF9mcmVlOwogCX0KIAogCWFpID0gZGV2LT5wcml2OwogCWFpLT53aWZpZGV2ID0gTlVMTDsKLQlhaS0+ZmxhZ3MgPSAwOworCWFpLT5mbGFncyA9IDEgPDwgRkxBR19SQURJT19ET1dOOwogCWFpLT5qb2JzID0gMDsKIAlhaS0+ZGV2ID0gZGV2OwogCWlmIChwY2kgJiYgKHBjaS0+ZGV2aWNlID09IDB4NTAwMCB8fCBwY2ktPmRldmljZSA9PSAweGE1MDQpKSB7Ci0JCWFpcm9fcHJpbnRfZGJnKGRldi0+bmFtZSwgIkZvdW5kIGFuIE1QSTM1MCBjYXJkIik7CisJCWFpcm9fcHJpbnRfZGJnKCIiLCAiRm91bmQgYW4gTVBJMzUwIGNhcmQiKTsKIAkJc2V0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncyk7CiAJfQogCXNwaW5fbG9ja19pbml0KCZhaS0+YXV4X2xvY2spOwpAQCAtMjgyMSwxNCArMjg0MywxMSBAQAogCWFpLT5jb25maWcubGVuID0gMDsKIAlhaS0+cGNpID0gcGNpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZhaS0+dGhyX3dhaXQpOwotCWFpLT5haXJvX3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oYWlyb190aHJlYWQsIGRldiwgZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKGFpLT5haXJvX3RocmVhZF90YXNrKSkKLQkJZ290byBlcnJfb3V0X2ZyZWU7CiAJYWktPnRmbSA9IE5VTEw7CiAJYWRkX2Fpcm9fZGV2KGFpKTsKIAogCWlmIChhaXJvX25ldHdvcmtzX2FsbG9jYXRlIChhaSkpCi0JCWdvdG8gZXJyX291dF90aHI7CisJCWdvdG8gZXJyX291dF9mcmVlOwogCWFpcm9fbmV0d29ya3NfaW5pdGlhbGl6ZSAoYWkpOwogCiAJLyogVGhlIEFpcm8tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KQEAgLTI4NTEsMjcgKzI4NzAsMjIgQEAKIAlkZXYtPmJhc2VfYWRkciA9IHBvcnQ7CiAKIAlTRVRfTkVUREVWX0RFVihkZXYsIGRtZGV2KTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CiAKIAlyZXNldF9jYXJkIChkZXYsIDEpOwogCW1zbGVlcCg0MDApOwogCi0JcmMgPSByZXF1ZXN0X2lycSggZGV2LT5pcnEsIGFpcm9faW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYgKTsKLQlpZiAocmMpIHsKLQkJYWlyb19wcmludF9lcnIoZGV2LT5uYW1lLCAicmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWQiLAotCQkJCWlycSwgcmMpOwotCQlnb3RvIGVycl9vdXRfbmV0czsKLQl9CiAJaWYgKCFpc19wY21jaWEpIHsKLQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0LCBkZXYtPm5hbWUgKSkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCA2NCwgRFJWX05BTUUpKSB7CiAJCQlyYyA9IC1FQlVTWTsKIAkJCWFpcm9fcHJpbnRfZXJyKGRldi0+bmFtZSwgIkNvdWxkbid0IHJlcXVlc3QgcmVnaW9uIik7Ci0JCQlnb3RvIGVycl9vdXRfaXJxOworCQkJZ290byBlcnJfb3V0X25ldHM7CiAJCX0KIAl9CiAKIAlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKLQkJaWYgKG1waV9tYXBfY2FyZChhaSwgcGNpLCBkZXYtPm5hbWUpKSB7Ci0JCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJDb3VsZCBub3QgbWFwIG1lbW9yeSIpOworCQlpZiAobXBpX21hcF9jYXJkKGFpLCBwY2kpKSB7CisJCQlhaXJvX3ByaW50X2VycigiIiwgIkNvdWxkIG5vdCBtYXAgbWVtb3J5Iik7CiAJCQlnb3RvIGVycl9vdXRfcmVzOwogCQl9CiAJfQpAQCAtMjg5OSw2ICsyOTEzLDcgQEAKIAkJYWktPmJzc0xpc3RSaWRMZW4gPSBzaXplb2YoQlNTTGlzdFJpZCkgLSBzaXplb2YoQlNTTGlzdFJpZEV4dHJhKTsKIAl9CiAKKwlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsKIAlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChyYykgewogCQlhaXJvX3ByaW50X2VycihkZXYtPm5hbWUsICJDb3VsZG4ndCByZWdpc3Rlcl9uZXRkZXYiKTsKQEAgLTI5MjEsOCArMjkzNiw2IEBACiAJaWYgKHNldHVwX3Byb2NfZW50cnkoZGV2LCBkZXYtPnByaXYpIDwgMCkKIAkJZ290byBlcnJfb3V0X3dpZmk7CiAKLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwotCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAlyZXR1cm4gZGV2OwogCiBlcnJfb3V0X3dpZmk6CkBAIC0yOTQwLDE0ICsyOTUzLDkgQEAKIGVycl9vdXRfcmVzOgogCWlmICghaXNfcGNtY2lhKQogCSAgICAgICAgcmVsZWFzZV9yZWdpb24oIGRldi0+YmFzZV9hZGRyLCA2NCApOwotZXJyX291dF9pcnE6Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBlcnJfb3V0X25ldHM6CiAJYWlyb19uZXR3b3Jrc19mcmVlKGFpKTsKLWVycl9vdXRfdGhyOgogCWRlbF9haXJvX2RldihhaSk7Ci0Jc2V0X2JpdChKT0JfRElFLCAmYWktPmpvYnMpOwotCWt0aHJlYWRfc3RvcChhaS0+YWlyb190aHJlYWRfdGFzayk7CiBlcnJfb3V0X2ZyZWU6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gTlVMTDsKQEAgLTMwNzgsNyArMzA4Niw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJaW50IGxvY2tlZDsKLQkKKworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSgxKSB7CiAJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLwogCQl0cnlfdG9fZnJlZXplKCk7CkBAIC0zNTI5LDkgKzM1MzgsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgZW5hYmxlX01BQyggc3RydWN0IGFpcm9faW5mbyAqYWksIFJlc3AgKnJzcCwgaW50IGxvY2sgKSB7CitzdGF0aWMgaW50IGVuYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKQorewogCWludCByYzsKLSAgICAgICAgQ21kIGNtZDsKKwlDbWQgY21kOworCVJlc3AgcnNwOwogCiAJLyogRkxBR19SQURJT19PRkYgOiBSYWRpbyBkaXNhYmxlZCB2aWEgL3Byb2Mgb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucwogCSAqIEZMQUdfUkFESU9fRE9XTiA6IFJhZGlvIGRpc2FibGVkIHZpYSAiaWZjb25maWcgZXRoWCBkb3duIgpAQCAtMzU0Nyw3ICszNTU4LDcgQEAKIAlpZiAoIXRlc3RfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncykpIHsKIAkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAkJY21kLmNtZCA9IE1BQ19FTkFCTEU7Ci0JCXJjID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCByc3ApOworCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CiAJCWlmIChyYyA9PSBTVUNDRVNTKQogCQkJc2V0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpOwogCX0gZWxzZQpAQCAtMzU1Nyw4ICszNTY4LDEyIEBACiAJICAgIHVwKCZhaS0+c2VtKTsKIAogCWlmIChyYykKLQkJYWlyb19wcmludF9lcnIoYWktPmRldi0+bmFtZSwgIiVzOiBDYW5ub3QgZW5hYmxlIE1BQywgZXJyPSVkIiwKLQkJCV9fRlVOQ1RJT05fXywgcmMpOworCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQ2Fubm90IGVuYWJsZSBNQUMiKTsKKwllbHNlIGlmICgocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgeworCQlhaXJvX3ByaW50X2VycihhaS0+ZGV2LT5uYW1lLCAiQmFkIE1BQyBlbmFibGUgcmVhc29uPSV4LCAiCisJCQkicmlkPSV4LCBvZmZzZXQ9JWQiLCByc3AucnNwMCwgcnNwLnJzcDEsIHJzcC5yc3AyKTsKKwkJcmMgPSBFUlJPUjsKKwl9CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zOTAyLDEyICszOTE3LDkgQEAKIAkJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKIAl9CiAKLQlzdGF0dXMgPSBlbmFibGVfTUFDKGFpLCAmcnNwLCBsb2NrKTsKLQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTIHx8IChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSB7Ci0JCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsICJCYWQgTUFDIGVuYWJsZSByZWFzb24gPSAleCwgcmlkID0gJXgsIgotCQkJIiBvZmZzZXQgPSAlZCIsIHJzcC5yc3AwLCByc3AucnNwMSwgcnNwLnJzcDIgKTsKKwlzdGF0dXMgPSBlbmFibGVfTUFDKGFpLCBsb2NrKTsKKwlpZiAoc3RhdHVzICE9IFNVQ0NFU1MpCiAJCXJldHVybiBFUlJPUjsKLQl9CiAKIAkvKiBHcmFiIHRoZSBpbml0aWFsIHdlcCBrZXksIHdlIGdvdHRhIHNhdmUgaXQgZm9yIGF1dG9fd2VwICovCiAJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCBsb2NrKTsKQEAgLTM5MTksMTAgKzM5MzEsNyBAQAogCQlyYyA9IHJlYWRXZXBLZXlSaWQoYWksICZ3a3IsIDAsIGxvY2spOwogCX0gd2hpbGUobGFzdGluZGV4ICE9IHdrci5raW5kZXgpOwogCi0JaWYgKGF1dG9fd2VwKSB7Ci0JCWFpLT5leHBpcmVzID0gUlVOX0FUKDMqSFopOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFpLT50aHJfd2FpdCk7Ci0JfQorCXRyeV9hdXRvX3dlcChhaSk7CiAKIAlyZXR1cm4gU1VDQ0VTUzsKIH0KQEAgLTQwMDQsNyArNDAxMyw3IEBACiAJCX0KIAkJaWYgKCAhKG1heF90cmllcy0tKSApIHsKIAkJCWFpcm9fcHJpbnRfZXJyKGFpLT5kZXYtPm5hbWUsCi0JCQkJImFpcm86IEJBUCBzZXR1cCBlcnJvciB0b28gbWFueSByZXRyaWVzXG4iKTsKKwkJCQkiQkFQIHNldHVwIGVycm9yIHRvbyBtYW55IHJldHJpZXNcbiIpOwogCQkJcmV0dXJuIEVSUk9SOwogCQl9CiAJCS8vIC0tIFBDNDUwMCBtaXNzZWQgaXQsIHRyeSBhZ2FpbgpAQCAtNTE1Miw3ICs1MTYxLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJU3NpZFJpZCBTU0lEX3JpZDsKLQlSZXNwIHJzcDsKIAlpbnQgaTsKIAlpbnQgb2Zmc2V0ID0gMDsKIApAQCAtNTE3Nyw3ICs1MTg1LDcgQEAKIAkJU1NJRF9yaWQubGVuID0gc2l6ZW9mKFNTSURfcmlkKTsKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJd3JpdGVTc2lkUmlkKGFpLCAmU1NJRF9yaWQsIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIHU4IGhleFZhbChjaGFyIGMpIHsKQEAgLTUxOTMsNyArNTIwMSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOwogCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OwogCUFQTGlzdFJpZCBBUExpc3RfcmlkOwotCVJlc3AgcnNwOwogCWludCBpOwogCiAJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CkBAIC01MjE4LDE4ICs1MjI1LDE3IEBACiAJfQogCWRpc2FibGVfTUFDKGFpLCAxKTsKIAl3cml0ZUFQTGlzdFJpZChhaSwgJkFQTGlzdF9yaWQsIDEpOwotCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworCWVuYWJsZV9NQUMoYWksIDEpOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIFBDNDUwMF93cml0ZXJpZCB3aXRoIGEgTUFDIGRpc2FibGUgKi8KIHN0YXRpYyBpbnQgZG9fd3JpdGVyaWQoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCBjb25zdCB2b2lkICpyaWRfZGF0YSwKIAkJCWludCBsZW4sIGludCBkdW1teSApIHsKIAlpbnQgcmM7Ci0JUmVzcCByc3A7CiAKIAlkaXNhYmxlX01BQyhhaSwgMSk7CiAJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIHJpZCwgcmlkX2RhdGEsIGxlbiwgMSk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJZW5hYmxlX01BQyhhaSwgMSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC01MjYwLDcgKzUyNjYsNiBAQAogCQkgICAgICAgY29uc3QgY2hhciAqa2V5LCB1MTYga2V5bGVuLCBpbnQgcGVybSwgaW50IGxvY2sgKSB7CiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWFjYWRkcltFVEhfQUxFTl0gPSB7IDB4MDEsIDAsIDAsIDAsIDAsIDAgfTsKIAlXZXBLZXlSaWQgd2tyOwotCVJlc3AgcnNwOwogCiAJbWVtc2V0KCZ3a3IsIDAsIHNpemVvZih3a3IpKTsKIAlpZiAoa2V5bGVuID09IDApIHsKQEAgLTUyODAsNyArNTI4NSw3IEBACiAKIAlpZiAocGVybSkgZGlzYWJsZV9NQUMoYWksIGxvY2spOwogCXdyaXRlV2VwS2V5UmlkKGFpLCAmd2tyLCBwZXJtLCBsb2NrKTsKLQlpZiAocGVybSkgZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7CisJaWYgKHBlcm0pIGVuYWJsZV9NQUMoYWksIGxvY2spOwogCXJldHVybiAwOwogfQogCkBAIC01NTQ4LDcgKzU1NTMsNiBAQAogICAgY2hhbmdlZC4gKi8KIHN0YXRpYyB2b2lkIHRpbWVyX2Z1bmMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CiAJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAKIC8qIFdlIGRvbid0IGhhdmUgYSBsaW5rIHNvIHRyeSBjaGFuZ2luZyB0aGUgYXV0aHR5cGUgKi8KIAlyZWFkQ29uZmlnUmlkKGFwcml2LCAwKTsKQEAgLTU1NzUsNyArNTU3OSw3IEBACiAJfQogCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYXByaXYtPmZsYWdzKTsKIAl3cml0ZUNvbmZpZ1JpZChhcHJpdiwgMCk7Ci0JZW5hYmxlX01BQyhhcHJpdiwgJnJzcCwgMCk7CisJZW5hYmxlX01BQyhhcHJpdiwgMCk7CiAJdXAoJmFwcml2LT5zZW0pOwogCiAvKiBTY2hlZHVsZSBjaGVjayB0byBzZWUgaWYgdGhlIGNoYW5nZSB3b3JrZWQgKi8KQEAgLTU1OTcsOCArNTYwMSwxMCBAQAogCQkJZGV2ID0gX2luaXRfYWlyb19jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDAsIHBkZXYsICZwZGV2LT5kZXYpOwogCWVsc2UKIAkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzJdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKLQlpZiAoIWRldikKKwlpZiAoIWRldikgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJCXJldHVybiAtRU5PREVWOworCX0KIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCXJldHVybiAwOwpAQCAtNTYxMCw2ICs1NjE2LDggQEAKIAogCWFpcm9fcHJpbnRfaW5mbyhkZXYtPm5hbWUsICJVbnJlZ2lzdGVyaW5nLi4uIik7CiAJc3RvcF9haXJvX2NhcmQoZGV2LCAxKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGFpcm9fcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKQEAgLTU2NDYsNyArNTY1NCw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAlwY2lfcG93ZXJfdCBwcmV2X3N0YXRlID0gcGRldi0+Y3VycmVudF9zdGF0ZTsKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKQEAgLTU2NzksNyArNTY4Niw3IEBACiAJCWFpLT5BUExpc3QgPSBOVUxMOwogCX0KIAl3cml0ZUNvbmZpZ1JpZChhaSwgMCk7Ci0JZW5hYmxlX01BQyhhaSwgJnJzcCwgMCk7CisJZW5hYmxlX01BQyhhaSwgMCk7CiAJYWktPnBvd2VyID0gUE1TR19PTjsKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwpAQCAtNTkwMyw3ICs1OTEwLDYgQEAKIAkJCSAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAJU3NpZFJpZCBTU0lEX3JpZDsJCS8qIFNTSURzICovCiAKIAkvKiBSZWxvYWQgdGhlIGxpc3Qgb2YgY3VycmVudCBTU0lEICovCkBAIC01OTM1LDcgKzU5NDEsNyBAQAogCS8qIFdyaXRlIGl0IHRvIHRoZSBjYXJkICovCiAJZGlzYWJsZV9NQUMobG9jYWwsIDEpOwogCXdyaXRlU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkLCAxKTsKLQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAxKTsKKwllbmFibGVfTUFDKGxvY2FsLCAxKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjAwMCw3ICs2MDA2LDcgQEAKIAkJbWVtY3B5KEFQTGlzdF9yaWQuYXBbMF0sIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAkJZGlzYWJsZV9NQUMobG9jYWwsIDEpOwogCQl3cml0ZUFQTGlzdFJpZChsb2NhbCwgJkFQTGlzdF9yaWQsIDEpOwotCQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAxKTsKKwkJZW5hYmxlX01BQyhsb2NhbCwgMSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzQ1NCw3ICs3NDYwLDYgQEAKIAkJCSAgICAgIGNoYXIgKmV4dHJhKQkJCS8qIE5VTEwgKi8KIHsKIAlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKLQlSZXNwIHJzcDsKIAogCWlmICghdGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKSkKIAkJcmV0dXJuIDA7CkBAIC03NDc5LDcgKzc0ODQsNyBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmxvY2FsLT5zZW0pKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCXdyaXRlQ29uZmlnUmlkKGxvY2FsLCAwKTsKLQllbmFibGVfTUFDKGxvY2FsLCAmcnNwLCAwKTsKKwllbmFibGVfTUFDKGxvY2FsLCAwKTsKIAlpZiAodGVzdF9iaXQgKEZMQUdfUkVTRVQsICZsb2NhbC0+ZmxhZ3MpKQogCQlhaXJvX3NldF9wcm9taXNjKGxvY2FsKTsKIAllbHNlCkBAIC03NzQ2LDcgKzc3NTEsNiBAQAogCXVuc2lnbmVkIGNoYXIgKmlvYnVmOwogCWludCBsZW47CiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7Ci0JUmVzcCByc3A7CiAKIAlpZiAodGVzdF9iaXQoRkxBR19GTEFTSElORywgJmFpLT5mbGFncykpCiAJCXJldHVybiAtRUlPOwpAQCAtNzc1OCw3ICs3NzYyLDcgQEAKIAkJaWYgKHRlc3RfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkgewogCQkJZGlzYWJsZV9NQUMgKGFpLCAxKTsKIAkJCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7Ci0JCQllbmFibGVfTUFDIChhaSwgJnJzcCwgMSk7CisJCQllbmFibGVfTUFDKGFpLCAxKTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFJUk9HU0xJU1Q6ICAgIHJpZGNvZGUgPSBSSURfU1NJRDsgICAgICAgICBicmVhazsKQEAgLTc4MTUsNyArNzgxOSw2IEBACiAJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CiAJaW50ICByaWRjb2RlOwogICAgICAgICBpbnQgIGVuYWJsZWQ7Ci0JUmVzcCAgICAgIHJzcDsKIAlzdGF0aWMgaW50ICgqIHdyaXRlcikoc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmlkLCBjb25zdCB2b2lkICosIGludCwgaW50KTsKIAl1bnNpZ25lZCBjaGFyICppb2J1ZjsKIApAQCAtNzg0OSw3ICs3ODUyLDcgQEAKIAkJICogc2FtZSB3aXRoIE1BQyBvZmYKIAkJICovCiAJY2FzZSBBSVJPUE1BQ09OOgotCQlpZiAoZW5hYmxlX01BQyhhaSwgJnJzcCwgMSkgIT0gMCkKKwkJaWYgKGVuYWJsZV9NQUMoYWksIDEpICE9IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIxMDAuYwppbmRleCBkNTFkYWY4Li4wNzJlZGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjEwMC5jCkBAIC0xNzY4LDcgKzE3NjgsOCBAQAogCiAJCWlmIChwcml2LT5zdG9wX3JmX2tpbGwpIHsKIAkJCXByaXYtPnN0b3BfcmZfa2lsbCA9IDA7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmZfa2lsbCwgSFopOworCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsCisJCQkJCSAgIHJvdW5kX2ppZmZpZXMoSFopKTsKIAkJfQogCiAJCWRlZmVycmVkID0gMTsKQEAgLTIwOTgsNyArMjA5OSw3IEBACiAJLyogTWFrZSBzdXJlIHRoZSBSRiBLaWxsIGNoZWNrIHRpbWVyIGlzIHJ1bm5pbmcgKi8KIAlwcml2LT5zdG9wX3JmX2tpbGwgPSAwOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLCBIWik7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIHJvdW5kX2ppZmZpZXMoSFopKTsKIH0KIAogc3RhdGljIHZvaWQgaXNyX3NjYW5fY29tcGxldGUoc3RydWN0IGlwdzIxMDBfcHJpdiAqcHJpdiwgdTMyIHN0YXR1cykKQEAgLTQyMzMsNyArNDIzNCw4IEBACiAJCQkvKiBNYWtlIHN1cmUgdGhlIFJGX0tJTEwgY2hlY2sgdGltZXIgaXMgcnVubmluZyAqLwogCQkJcHJpdi0+c3RvcF9yZl9raWxsID0gMDsKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnJmX2tpbGwpOwotCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAJCX0gZWxzZQogCQkJc2NoZWR1bGVfcmVzZXQocHJpdik7CiAJfQpAQCAtNTk2OSw3ICs1OTcxLDggQEAKIAlpZiAocmZfa2lsbF9hY3RpdmUocHJpdikpIHsKIAkJSVBXX0RFQlVHX1JGX0tJTEwoIlJGIEtpbGwgYWN0aXZlLCByZXNjaGVkdWxpbmcgR1BJTyBjaGVja1xuIik7CiAJCWlmICghcHJpdi0+c3RvcF9yZl9raWxsKQotCQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJmX2tpbGwsIEhaKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAorCQkJCQkgICByb3VuZF9qaWZmaWVzKEhaKSk7CiAJCWdvdG8gZXhpdF91bmxvY2s7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKaW5kZXggN2NiMjA1Mi4uYWEzMmE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwpAQCAtMTc1MSw3ICsxNzUxLDcgQEAKIAkJCS8qIE1ha2Ugc3VyZSB0aGUgUkZfS0lMTCBjaGVjayB0aW1lciBpcyBydW5uaW5nICovCiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5yZl9raWxsKTsKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZl9raWxsLAotCQkJCQkgICAyICogSFopOworCQkJCQkgICByb3VuZF9qaWZmaWVzKDIgKiBIWikpOwogCQl9IGVsc2UKIAkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dXApOwogCX0KQEAgLTQ2OTAsNyArNDY5MCw4IEBACiAJCQllbHNlIGlmIChwcml2LT5jb25maWcgJiBDRkdfQkFDS0dST1VORF9TQ0FOCiAJCQkJICYmIHByaXYtPnN0YXR1cyAmIFNUQVRVU19BU1NPQ0lBVEVEKQogCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsCi0JCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLCBIWik7CisJCQkJCQkgICAmcHJpdi0+cmVxdWVzdF9zY2FuLAorCQkJCQkJICAgcm91bmRfamlmZmllcyhIWikpOwogCiAJCQkvKiBTZW5kIGFuIGVtcHR5IGV2ZW50IHRvIHVzZXIgc3BhY2UuCiAJCQkgKiBXZSBkb24ndCBzZW5kIHRoZSByZWNlaXZlZCBkYXRhIG9uIHRoZSBldmVudCBiZWNhdXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCmluZGV4IDEzZjY1MjguLjRhOGY1ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJaWYgKCplbmFibGUpCiAJCQlwZW5hYmxlUlNOLT5lbmFibGUgPSBjcHVfdG9fbGUxNihjbWRfZW5hYmxlX3Jzbik7CiAJCWVsc2UKLQkJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9lbmFibGVfcnNuKTsKKwkJCXBlbmFibGVSU04tPmVuYWJsZSA9IGNwdV90b19sZTE2KGNtZF9kaXNhYmxlX3Jzbik7CiAJfQogCiAJbGJzX2RlYl9sZWF2ZShMQlNfREVCX0NNRCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKaW5kZXggNGE1OTMwNi4uOWYzNjYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpAQCAtNjEzLDYgKzYxMyw3IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJZm9yICg7OykgewogCQlsYnNfZGViX3RocmVhZCggIm1haW4tdGhyZWFkIDExMTogaW50Y291bnRlcj0lZCAiCiAJCSAgICAgICAiY3VycmVudHR4c2tiPSVwIGRubGRfc2VudD0lZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCmluZGV4IDg4ZDlkMmQuLjc2OWM4NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpAQCAtNDM5LDcgKzQzOSw2IEBACiAJcmV0ID0gMDsKIAogZG9uZToKLQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOwkvKiBFVEhfUF84MDIxMV9SQVcgKi8KIAlsYnNfZGViX2xlYXZlX2FyZ3MoTEJTX0RFQl9SWCwgInJldCAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3ZlcnNpb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYwppbmRleCBmNDJiNzk2Li4yZmNjM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCkBAIC0xNzE5LDkgKzE3MTksNiBAQAogCQkJcGtleS0+dHlwZSA9IEtFWV9UWVBFX0lEX1RLSVA7CiAJCX0gZWxzZSBpZiAoYWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgewogCQkJcGtleS0+dHlwZSA9IEtFWV9UWVBFX0lEX0FFUzsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKIAkJfQogCiAJCS8qIElmIFdQQSBpc24ndCBlbmFibGVkIHlldCwgZG8gdGhhdCBub3cgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCmluZGV4IDI4M2JlNGEuLjU4NWY1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwpAQCAtMTg1Myw3ICsxODUzLDYgQEAKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOwogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOwogCiAJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCkBAIC0xODYxLDExICsxODYwLDkgQEAKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjbC0+bWFjX2xpc3QsIF9saXN0KSB7CiAJCWlmIChtZW1jbXAoZW50cnktPmFkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKSA9PSAwKSB7Ci0JCQlsaXN0X2RlbChwdHIpOworCQkJbGlzdF9kZWwoJmVudHJ5LT5fbGlzdCk7CiAJCQlhY2wtPnNpemUtLTsKIAkJCWtmcmVlKGVudHJ5KTsKIAkJCXVwKCZhY2wtPnNlbSk7CkBAIC0xODgzLDcgKzE4ODAsNiBAQAogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CiAJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyOwogCXN0cnVjdCBzb2NrYWRkciAqZHN0ID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAogCWR3cnEtPmxlbmd0aCA9IDA7CkBAIC0xODkxLDkgKzE4ODcsNyBAQAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAotCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewotCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmYWNsLT5tYWNfbGlzdCwgX2xpc3QpIHsKIAkJbWVtY3B5KGRzdC0+c2FfZGF0YSwgZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKIAkJZHN0LT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJCWR3cnEtPmxlbmd0aCsrOwpAQCAtMTk2MCw3ICsxOTU0LDYgQEAKIHN0YXRpYyBpbnQKIHByaXNtNTRfbWFjX2FjY2VwdChzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsLCBjaGFyICptYWMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcHRyOwogCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OwogCWludCByZXMgPSAwOwogCkBAIC0xOTcyLDggKzE5NjUsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZhY2wtPm1hY19saXN0LCBfbGlzdCkgewogCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBtYWMsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCQlyZXMgPSAxOwogCQkJYnJlYWs7CkBAIC0yMjE2LDExICsyMjA4LDkgQEAKIHZvaWQKIHByaXNtNTRfd3BhX2Jzc19pZV9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCXN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSAqYnNzLCAqbjsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShwdHIsIG4sICZwcml2LT5ic3Nfd3BhX2xpc3QpIHsKLQkJc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llICpic3M7Ci0JCWJzcyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShic3MsIG4sICZwcml2LT5ic3Nfd3BhX2xpc3QsIGxpc3QpIHsKIAkJa2ZyZWUoYnNzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGw4MTg3X3J0bDgyMjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jCmluZGV4IGUyNWEwOWYuLmVmYzQxMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bDgxODdfcnRsODIyNS5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJbXNsZWVwKDIpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MjI1X3dyaXRlXzgwNTEoc3RydWN0IGllZWU4MDIxMV9odyAqZGV2LCB1OCBhZGRyLCB1MTYgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0bDgyMjVfd3JpdGVfODA1MShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpkZXYsIHU4IGFkZHIsIF9fbGUxNiBkYXRhKQogewogCXN0cnVjdCBydGw4MTg3X3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CiAJdTE2IHJlZzgwLCByZWc4MiwgcmVnODQ7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAlzdHJ1Y3QgcnRsODE4N19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCiAJaWYgKHByaXYtPmFzaWNfcmV2KQotCQlydGw4MjI1X3dyaXRlXzgwNTEoZGV2LCBhZGRyLCBkYXRhKTsKKwkJcnRsODIyNV93cml0ZV84MDUxKGRldiwgYWRkciwgY3B1X3RvX2xlMTYoZGF0YSkpOwogCWVsc2UKIAkJcnRsODIyNV93cml0ZV9iaXRiYW5nKGRldiwgYWRkciwgZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKaW5kZXggNWI2MjRiZi4uYzM5ZjE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYwpAQCAtNDksOCArNDksOSBAQAogCVpEX01FTUNMRUFSKGNoaXAsIHNpemVvZigqY2hpcCkpOwogfQogCi1zdGF0aWMgaW50IHNjbnByaW50X21hY19vdWkoY29uc3QgdTggKmFkZHIsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IHNjbnByaW50X21hY19vdWkoc3RydWN0IHpkX2NoaXAgKmNoaXAsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7CisJdTggKmFkZHIgPSB6ZF91c2JfdG9fbmV0ZGV2KCZjaGlwLT51c2IpLT5kZXZfYWRkcjsKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiUwMngtJTAyeC0lMDJ4IiwKIAkJICAgICAgICAgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSk7CiB9CkBAIC02MSwxMCArNjIsMTAgQEAKIAlpbnQgaSA9IDA7CiAKIAlpID0gc2NucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgInpkMTIxMSVzIGNoaXAgIiwKLQkJICAgICAgY2hpcC0+aXNfemQxMjExYiA/ICJiIiA6ICIiKTsKKwkJICAgICAgemRfY2hpcF9pc196ZDEyMTFiKGNoaXApID8gImIiIDogIiIpOwogCWkgKz0gemRfdXNiX3NjbnByaW50X2lkKCZjaGlwLT51c2IsIGJ1ZmZlcitpLCBzaXplLWkpOwogCWkgKz0gc2NucHJpbnRmKGJ1ZmZlcitpLCBzaXplLWksICIgIik7Ci0JaSArPSBzY25wcmludF9tYWNfb3VpKGNoaXAtPmUycF9tYWMsIGJ1ZmZlcitpLCBzaXplLWkpOworCWkgKz0gc2NucHJpbnRfbWFjX291aShjaGlwLCBidWZmZXIraSwgc2l6ZS1pKTsKIAlpICs9IHNjbnByaW50ZihidWZmZXIraSwgc2l6ZS1pLCAiICIpOwogCWkgKz0gemRfcmZfc2NucHJpbnRfaWQoJmNoaXAtPnJmLCBidWZmZXIraSwgc2l6ZS1pKTsKIAlpICs9IHNjbnByaW50ZihidWZmZXIraSwgc2l6ZS1pLCAiIHBhJTF4ICVjJWMlYyVjJWMiLCBjaGlwLT5wYV90eXBlLApAQCAtMzY2LDY0ICszNjcsOSBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IF9yZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIsCi0JICAgICAgICAgICAgICAgICAgY29uc3QgemRfYWRkcl90ICphZGRyKQotewotCWludCByOwotCXUzMiBwYXJ0c1syXTsKLQotCXIgPSB6ZF9pb3JlYWQzMnZfbG9ja2VkKGNoaXAsIHBhcnRzLCAoY29uc3QgemRfYWRkcl90ICopYWRkciwgMik7Ci0JaWYgKHIpIHsKLQkJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLAotCQkJImVycm9yOiBjb3VsZG4ndCByZWFkIGUycCBtYWNzLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQltYWNfYWRkclswXSA9IHBhcnRzWzBdOwotCW1hY19hZGRyWzFdID0gcGFydHNbMF0gPj4gIDg7Ci0JbWFjX2FkZHJbMl0gPSBwYXJ0c1swXSA+PiAxNjsKLQltYWNfYWRkclszXSA9IHBhcnRzWzBdID4+IDI0OwotCW1hY19hZGRyWzRdID0gcGFydHNbMV07Ci0JbWFjX2FkZHJbNV0gPSBwYXJ0c1sxXSA+PiAgODsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlYWRfZTJwX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwKQotewotCXN0YXRpYyBjb25zdCB6ZF9hZGRyX3QgYWRkclsyXSA9IHsgRTJQX01BQ19BRERSX1AxLCBFMlBfTUFDX0FERFJfUDIgfTsKLQotCVpEX0FTU0VSVChtdXRleF9pc19sb2NrZWQoJmNoaXAtPm11dGV4KSk7Ci0JcmV0dXJuIF9yZWFkX21hY19hZGRyKGNoaXAsIGNoaXAtPmUycF9tYWMsIChjb25zdCB6ZF9hZGRyX3QgKilhZGRyKTsKLX0KLQogLyogTUFDIGFkZHJlc3M6IGlmIGN1c3RvbSBtYWMgYWRkcmVzc2VzIGFyZSB0byB0byBiZSB1c2VkIENSX01BQ19BRERSX1AxIGFuZAogICogICAgICAgICAgICAgIENSX01BQ19BRERSX1AyIG11c3QgYmUgb3ZlcndyaXR0ZW4KICAqLwotdm9pZCB6ZF9nZXRfZTJwX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpCi17Ci0JbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCW1lbWNweShtYWNfYWRkciwgY2hpcC0+ZTJwX21hYywgRVRIX0FMRU4pOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IHJlYWRfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4ICptYWNfYWRkcikKLXsKLQlzdGF0aWMgY29uc3QgemRfYWRkcl90IGFkZHJbMl0gPSB7IENSX01BQ19BRERSX1AxLCBDUl9NQUNfQUREUl9QMiB9OwotCXJldHVybiBfcmVhZF9tYWNfYWRkcihjaGlwLCBtYWNfYWRkciwgKGNvbnN0IHpkX2FkZHJfdCAqKWFkZHIpOwotfQotCi1pbnQgemRfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKQotewotCWludCByOwotCi0JZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKLQltdXRleF9sb2NrKCZjaGlwLT5tdXRleCk7Ci0JciA9IHJlYWRfbWFjX2FkZHIoY2hpcCwgbWFjX2FkZHIpOwotCW11dGV4X3VubG9jaygmY2hpcC0+bXV0ZXgpOwotCXJldHVybiByOwotfQotCiBpbnQgemRfd3JpdGVfbWFjX2FkZHIoc3RydWN0IHpkX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKIAlpbnQgcjsKQEAgLTQ0NCwxMiArMzkwLDYgQEAKIAogCW11dGV4X2xvY2soJmNoaXAtPm11dGV4KTsKIAlyID0gemRfaW93cml0ZTMyYV9sb2NrZWQoY2hpcCwgcmVxcywgQVJSQVlfU0laRShyZXFzKSk7Ci0jaWZkZWYgREVCVUcKLQl7Ci0JCXU4IHRtcFtFVEhfQUxFTl07Ci0JCXJlYWRfbWFjX2FkZHIoY2hpcCwgdG1wKTsKLQl9Ci0jZW5kaWYgLyogREVCVUcgKi8KIAltdXRleF91bmxvY2soJmNoaXAtPm11dGV4KTsKIAlyZXR1cm4gcjsKIH0KQEAgLTgwOSw3ICs3NDksNyBAQAogCiBzdGF0aWMgaW50IGh3X3Jlc2V0X3BoeShzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKLQlyZXR1cm4gY2hpcC0+aXNfemQxMjExYiA/IHpkMTIxMWJfaHdfcmVzZXRfcGh5KGNoaXApIDoKKwlyZXR1cm4gemRfY2hpcF9pc196ZDEyMTFiKGNoaXApID8gemQxMjExYl9od19yZXNldF9waHkoY2hpcCkgOgogCQkgICAgICAgICAgICAgICAgICB6ZDEyMTFfaHdfcmVzZXRfcGh5KGNoaXApOwogfQogCkBAIC04NzQsNyArODE0LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlyZXR1cm4gY2hpcC0+aXNfemQxMjExYiA/CisJcmV0dXJuIHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSA/CiAJCXpkMTIxMWJfaHdfaW5pdF9obWFjKGNoaXApIDogemQxMjExX2h3X2luaXRfaG1hYyhjaGlwKTsKIH0KIApAQCAtMTEzNiw4ICsxMDc2LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFJlYWQgbWFjIGFkZHJlc3MgdXNpbmcgcHJlLWZpcm13YXJlIGludGVyZmFjZSAqLworaW50IHpkX2NoaXBfcmVhZF9tYWNfYWRkcl9mdyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKmFkZHIpCit7CisJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKKwlyZXR1cm4gemRfdXNiX3JlYWRfZncoJmNoaXAtPnVzYiwgRTJQX01BQ19BRERSX1AxLCBhZGRyLAorCQlFVEhfQUxFTik7Cit9CiAKLWludCB6ZF9jaGlwX2luaXRfaHcoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHU4IGRldmljZV90eXBlKQoraW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKIAlpbnQgcjsKIAl1OCByZl90eXBlOwpAQCAtMTE0NSw3ICsxMDkyLDYgQEAKIAlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJcbiIpOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+bXV0ZXgpOwotCWNoaXAtPmlzX3pkMTIxMWIgPSAoZGV2aWNlX3R5cGUgPT0gREVWSUNFX1pEMTIxMUIpICE9IDA7CiAKICNpZmRlZiBERUJVRwogCXIgPSB0ZXN0X2luaXQoY2hpcCk7CkBAIC0xMjAxLDEwICsxMTQ3LDYgQEAKIAkJZ290byBvdXQ7CiAjZW5kaWYgLyogREVCVUcgKi8KIAotCXIgPSByZWFkX2UycF9tYWNfYWRkcihjaGlwKTsKLQlpZiAocikKLQkJZ290byBvdXQ7Ci0KIAlyID0gcmVhZF9jYWxfaW50X3RhYmxlcyhjaGlwKTsKIAlpZiAocikKIAkJZ290byBvdXQ7CkBAIC0xMjU5LDcgKzEyMDEsNyBAQAogCXIgPSB1cGRhdGVfcHdyX2ludChjaGlwLCBjaGFubmVsKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7Ci0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpIHsKKwlpZiAoemRfY2hpcF9pc196ZDEyMTFiKGNoaXApKSB7CiAJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNbXSA9IHsKIAkJCXsgQ1I2OSwgMHgyOCB9LAogCQkJe30sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKaW5kZXggNzlkMDI4OC4uZjQ2OTg1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaApAQCAtNzA0LDcgKzcwNCw2IEBACiAJc3RydWN0IG11dGV4IG11dGV4OwogCS8qIEJhc2UgYWRkcmVzcyBvZiBGV19SRUdfIHJlZ2lzdGVycyAqLwogCXpkX2FkZHJfdCBmd19yZWdzX2Jhc2U7Ci0JdTggZTJwX21hY1tFVEhfQUxFTl07CiAJLyogRWVwU2V0UG9pbnQgaW4gdGhlIHZlbmRvciBkcml2ZXIgKi8KIAl1OCBwd3JfY2FsX3ZhbHVlc1tFMlBfQ0hBTk5FTF9DT1VOVF07CiAJLyogaW50ZWdyYXRpb24gdmFsdWVzIGluIHRoZSB2ZW5kb3IgZHJpdmVyICovCkBAIC03MTUsNyArNzE0LDcgQEAKIAl1bnNpZ25lZCBpbnQgcGFfdHlwZTo0LAogCQlwYXRjaF9jY2tfZ2FpbjoxLCBwYXRjaF9jcjE1NzoxLCBwYXRjaF82bV9iYW5kX2VkZ2U6MSwKIAkJbmV3X3BoeV9sYXlvdXQ6MSwgYWwyMjMwc19iaXQ6MSwKLQkJaXNfemQxMjExYjoxLCBzdXBwb3J0c190eF9sZWQ6MTsKKwkJc3VwcG9ydHNfdHhfbGVkOjE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB6ZF9jaGlwICp6ZF91c2JfdG9fY2hpcChzdHJ1Y3QgemRfdXNiICp1c2IpCkBAIC03MzQsOSArNzMzLDE1IEBACiAJICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiB2b2lkIHpkX2NoaXBfY2xlYXIoc3RydWN0IHpkX2NoaXAgKmNoaXApOwotaW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggZGV2aWNlX3R5cGUpOworaW50IHpkX2NoaXBfcmVhZF9tYWNfYWRkcl9mdyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKmFkZHIpOworaW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiBpbnQgemRfY2hpcF9yZXNldChzdHJ1Y3QgemRfY2hpcCAqY2hpcCk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IHpkX2NoaXBfaXNfemQxMjExYihzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY2hpcC0+dXNiLmlzX3pkMTIxMWI7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHpkX2lvcmVhZDE2dl9sb2NrZWQoc3RydWN0IHpkX2NoaXAgKmNoaXAsIHUxNiAqdmFsdWVzLAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpkX2FkZHJfdCAqYWRkcmVzc2VzLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKQEAgLTgyNSw4ICs4MzAsNiBAQAogfQogdTggIHpkX2NoaXBfZ2V0X2NoYW5uZWwoc3RydWN0IHpkX2NoaXAgKmNoaXApOwogaW50IHpkX3JlYWRfcmVnZG9tYWluKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqcmVnZG9tYWluKTsKLXZvaWQgemRfZ2V0X2UycF9tYWNfYWRkcihzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggKm1hY19hZGRyKTsKLWludCB6ZF9yZWFkX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1OCAqbWFjX2FkZHIpOwogaW50IHpkX3dyaXRlX21hY19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjb25zdCB1OCAqbWFjX2FkZHIpOwogaW50IHpkX2NoaXBfc3dpdGNoX3JhZGlvX29uKHN0cnVjdCB6ZF9jaGlwICpjaGlwKTsKIGludCB6ZF9jaGlwX3N3aXRjaF9yYWRpb19vZmYoc3RydWN0IHpkX2NoaXAgKmNoaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwppbmRleCA2NzUzZDI0Li5mNmM0ODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9tYWMuYwpAQCAtODYsMzggKzg2LDQ2IEBACiAJcmV0dXJuIHI7CiB9CiAKLWludCB6ZF9tYWNfaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMsIHU4IGRldmljZV90eXBlKQoraW50IHpkX21hY19wcmVpbml0X2h3KHN0cnVjdCB6ZF9tYWMgKm1hYykKK3sKKwlpbnQgcjsKKwl1OCBhZGRyW0VUSF9BTEVOXTsKKworCXIgPSB6ZF9jaGlwX3JlYWRfbWFjX2FkZHJfZncoJm1hYy0+Y2hpcCwgYWRkcik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJbWVtY3B5KG1hYy0+bmV0ZGV2LT5kZXZfYWRkciwgYWRkciwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCitpbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKQogewogCWludCByOwogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gJm1hYy0+Y2hpcDsKLQl1OCBhZGRyW0VUSF9BTEVOXTsKIAl1OCBkZWZhdWx0X3JlZ2RvbWFpbjsKIAogCXIgPSB6ZF9jaGlwX2VuYWJsZV9pbnQoY2hpcCk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwotCXIgPSB6ZF9jaGlwX2luaXRfaHcoY2hpcCwgZGV2aWNlX3R5cGUpOworCXIgPSB6ZF9jaGlwX2luaXRfaHcoY2hpcCk7CiAJaWYgKHIpCiAJCWdvdG8gZGlzYWJsZV9pbnQ7CiAKLQl6ZF9nZXRfZTJwX21hY19hZGRyKGNoaXAsIGFkZHIpOwotCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBhZGRyKTsKLQlpZiAocikKLQkJZ290byBkaXNhYmxlX2ludDsKIAlaRF9BU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7Ci0Jc3Bpbl9sb2NrX2lycSgmbWFjLT5sb2NrKTsKLQltZW1jcHkobWFjLT5uZXRkZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZtYWMtPmxvY2spOwogCiAJciA9IHpkX3JlYWRfcmVnZG9tYWluKGNoaXAsICZkZWZhdWx0X3JlZ2RvbWFpbik7CiAJaWYgKHIpCiAJCWdvdG8gZGlzYWJsZV9pbnQ7CiAJaWYgKCF6ZF9yZWdkb21haW5fc3VwcG9ydGVkKGRlZmF1bHRfcmVnZG9tYWluKSkgewotCQlkZXZfZGJnX2YoemRfbWFjX2RldihtYWMpLAotCQkJICAiUmVndWxhdG9yeSBEb21haW4gJSMwNHggaXMgbm90IHN1cHBvcnRlZC5cbiIsCi0JCSAgICAgICAgICBkZWZhdWx0X3JlZ2RvbWFpbik7Ci0JCXIgPSAtRUlOVkFMOwotCQlnb3RvIGRpc2FibGVfaW50OworCQkvKiBUaGUgdmVuZG9yIGRyaXZlciBvdmVycmlkZXMgdGhlIHJlZ3VsYXRvcnkgZG9tYWluIGFuZAorCQkgKiBhbGxvd2VkIGNoYW5uZWwgcmVnaXN0ZXJzIGFuZCB1bmNvbmRpdGlvbmFsbHkgcmVzdHJpY3RzCisJCSAqIGF2YWlsYWJsZSBjaGFubmVscyB0byAxLTExIGV2ZXJ5d2hlcmUuIE1hdGNoIHRoZWlyCisJCSAqIHF1ZXN0aW9uYWJsZSBiZWhhdmlvdXIgb25seSBmb3IgcmVnZG9tYWlucyB3aGljaCB3ZSBkb24ndAorCQkgKiByZWNvZ25pc2UuICovCisJCWRldl93YXJuKHpkX21hY19kZXYobWFjKSwgICJVbnJlY29nbmlzZWQgcmVndWxhdG9yeSBkb21haW46ICIKKwkJCSIlIzA0eC4gRGVmYXVsdGluZyB0byBGQ0MuXG4iLCBkZWZhdWx0X3JlZ2RvbWFpbik7CisJCWRlZmF1bHRfcmVnZG9tYWluID0gWkRfUkVHRE9NQUlOX0ZDQzsKIAl9CiAJc3Bpbl9sb2NrX2lycSgmbWFjLT5sb2NrKTsKIAltYWMtPnJlZ2RvbWFpbiA9IG1hYy0+ZGVmYXVsdF9yZWdkb21haW4gPSBkZWZhdWx0X3JlZ2RvbWFpbjsKQEAgLTE2NCwxNCArMTcyLDI1IEBACiB7CiAJc3RydWN0IHpkX21hYyAqbWFjID0gemRfbmV0ZGV2X21hYyhuZXRkZXYpOwogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gJm1hYy0+Y2hpcDsKKwlzdHJ1Y3QgemRfdXNiICp1c2IgPSAmY2hpcC0+dXNiOwogCWludCByOwogCisJaWYgKCF1c2ItPmluaXRpYWxpemVkKSB7CisJCXIgPSB6ZF91c2JfaW5pdF9odyh1c2IpOworCQlpZiAocikKKwkJCWdvdG8gb3V0OworCX0KKwogCXRhc2tsZXRfZW5hYmxlKCZtYWMtPnJ4X3Rhc2tsZXQpOwogCiAJciA9IHpkX2NoaXBfZW5hYmxlX2ludChjaGlwKTsKIAlpZiAociA8IDApCiAJCWdvdG8gb3V0OwogCisJciA9IHpkX3dyaXRlX21hY19hZGRyKGNoaXAsIG5ldGRldi0+ZGV2X2FkZHIpOworCWlmIChyKQorCQlnb3RvIGRpc2FibGVfaW50OworCiAJciA9IHpkX2NoaXBfc2V0X2Jhc2ljX3JhdGVzKGNoaXAsIENSX1JBVEVTXzgwMjExQiB8IENSX1JBVEVTXzgwMjExRyk7CiAJaWYgKHIgPCAwKQogCQlnb3RvIGRpc2FibGVfaW50OwpAQCAtMjUxLDkgKzI3MCwxMSBAQAogCWRldl9kYmdfZih6ZF9tYWNfZGV2KG1hYyksCiAJCSAgIlNldHRpbmcgTUFDIHRvICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGFkZHItPnNhX2RhdGEpKTsKIAotCXIgPSB6ZF93cml0ZV9tYWNfYWRkcihjaGlwLCBhZGRyLT5zYV9kYXRhKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKKwkJciA9IHpkX3dyaXRlX21hY19hZGRyKGNoaXAsIGFkZHItPnNhX2RhdGEpOworCQlpZiAocikKKwkJCXJldHVybiByOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwpAQCAtODU1LDcgKzg3Niw3IEBACiAJLyogWkQxMjExQjogQ29tcHV0aW5nIHRoZSBsZW5ndGggZGlmZmVyZW5jZSB0aGlzIHdheSwgZ2l2ZXMgdXMKIAkgKiBmbGV4aWJpbGl0eSB0byBjb21wdXRlIHRoZSBwYWNrZXQgbGVuZ3RoLgogCSAqLwotCWNzLT5wYWNrZXRfbGVuZ3RoID0gY3B1X3RvX2xlMTYobWFjLT5jaGlwLmlzX3pkMTIxMWIgPworCWNzLT5wYWNrZXRfbGVuZ3RoID0gY3B1X3RvX2xlMTYoemRfY2hpcF9pc196ZDEyMTFiKCZtYWMtPmNoaXApID8KIAkJCXBhY2tldF9sZW5ndGggLSBmcmFnX2xlbiA6IHBhY2tldF9sZW5ndGgpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX21hYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKaW5kZXggZmFmNGM3OC4uOWY5MzQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfbWFjLmgKQEAgLTE4OSw3ICsxODksOCBAQAogCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiB2b2lkIHpkX21hY19jbGVhcihzdHJ1Y3QgemRfbWFjICptYWMpOwogCi1pbnQgemRfbWFjX2luaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjLCB1OCBkZXZpY2VfdHlwZSk7CitpbnQgemRfbWFjX3ByZWluaXRfaHcoc3RydWN0IHpkX21hYyAqbWFjKTsKK2ludCB6ZF9tYWNfaW5pdF9odyhzdHJ1Y3QgemRfbWFjICptYWMpOwogCiBpbnQgemRfbWFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgemRfbWFjX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuYwppbmRleCA3NDA3NDA5Li5hYmU1ZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAlbQUwyMjEwX1JGXQk9ICJBTDIyMTBfUkYiLAogCVtNQVhJTV9ORVdfUkZdCT0gIk1BWElNX05FV19SRiIsCiAJW1VXMjQ1M19SRl0JPSAiVVcyNDUzX1JGIiwKLQlbVU5LTk9XTl9BX1JGXQk9ICJVTktOT1dOX0FfUkYiLAorCVtBTDIyMzBTX1JGXQk9ICJBTDIyMzBTX1JGIiwKIAlbUkFMSU5LX1JGXQk9ICJSQUxJTktfUkYiLAogCVtJTlRFUlNJTF9SRl0JPSAiSU5URVJTSUxfUkYiLAogCVtSRjI5NTlfUkZdCT0gIlJGMjk1OV9SRiIsCkBAIC03Nyw2ICs3Nyw3IEBACiAJCXIgPSB6ZF9yZl9pbml0X3JmMjk1OShyZik7CiAJCWJyZWFrOwogCWNhc2UgQUwyMjMwX1JGOgorCWNhc2UgQUwyMjMwU19SRjoKIAkJciA9IHpkX3JmX2luaXRfYWwyMjMwKHJmKTsKIAkJYnJlYWs7CiAJY2FzZSBBTDcyMzBCX1JGOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKaW5kZXggYzZkZmQ4Mi4uMzA1MDJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCkBAIC0yNiw3ICsyNiw3IEBACiAjZGVmaW5lIEFMMjIxMF9SRgkJCTB4NwogI2RlZmluZSBNQVhJTV9ORVdfUkYJCQkweDgKICNkZWZpbmUgVVcyNDUzX1JGCQkJMHg5Ci0jZGVmaW5lIFVOS05PV05fQV9SRgkJCTB4YQorI2RlZmluZSBBTDIyMzBTX1JGCQkJMHhhCiAjZGVmaW5lIFJBTElOS19SRgkJCTB4YgogI2RlZmluZSBJTlRFUlNJTF9SRgkJCTB4YwogI2RlZmluZSBSRjI5NTlfUkYJCQkweGQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsMjIzMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKaW5kZXggZTdhNGVjZi4uMDA2Nzc0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWwyMjMwLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICJ6ZF91c2IuaCIKICNpbmNsdWRlICJ6ZF9jaGlwLmgiCiAKKyNkZWZpbmUgSVNfQUwyMjMwUyhjaGlwKSAoKGNoaXApLT5hbDIyMzBzX2JpdCB8fCAoY2hpcCktPnJmLnR5cGUgPT0gQUwyMjMwU19SRikKKwogc3RhdGljIGNvbnN0IHUzMiB6ZDEyMTFfYWwyMjMwX3RhYmxlW11bM10gPSB7CiAJUkZfQ0hBTk5FTCggMSkgPSB7IDB4MDNmNzkwLCAweDAzMzMzMSwgMHgwMDAwMGQsIH0sCiAJUkZfQ0hBTk5FTCggMikgPSB7IDB4MDNmNzkwLCAweDBiMzMzMSwgMHgwMDAwMGQsIH0sCkBAIC0xNzYsNyArMTc4LDcgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlpZiAoY2hpcC0+YWwyMjMwc19iaXQpIHsKKwlpZiAoSVNfQUwyMjMwUyhjaGlwKSkgewogCQlyID0gemRfaW93cml0ZTE2YV9sb2NrZWQoY2hpcCwgaW9yZXFzX2luaXRfYWwyMjMwcywKIAkJCUFSUkFZX1NJWkUoaW9yZXFzX2luaXRfYWwyMjMwcykpOwogCQlpZiAocikKQEAgLTE4OCw3ICsxOTAsNyBAQAogCQlyZXR1cm4gcjsKIAogCS8qIGltcHJvdmUgYmFuZCBlZGdlIGZvciBBTDIyMzBTICovCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KQorCWlmIChJU19BTDIyMzBTKGNoaXApKQogCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgwMDA4MjQsIFJGX1JWX0JJVFMpOwogCWVsc2UKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MDAwNWE0LCBSRl9SVl9CSVRTKTsKQEAgLTMxNCw3ICszMTYsNyBAQAogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChjaGlwLT5hbDIyMzBzX2JpdCkgeworCWlmIChJU19BTDIyMzBTKGNoaXApKSB7CiAJCXIgPSB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXNfaW5pdF9hbDIyMzBzLAogCQkJQVJSQVlfU0laRShpb3JlcXNfaW5pdF9hbDIyMzBzKSk7CiAJCWlmIChyKQpAQCAtMzI4LDcgKzMzMCw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmFsMjIzMHNfYml0KQorCWlmIChJU19BTDIyMzBTKGNoaXApKQogCQlyID0gemRfcmZ3cml0ZV9sb2NrZWQoY2hpcCwgMHgyNDEwMDAsIFJGX1JWX0JJVFMpOwogCWVsc2UKIAkJciA9IHpkX3Jmd3JpdGVfbG9ja2VkKGNoaXAsIDB4MjVhMDAwLCBSRl9SVl9CSVRTKTsKQEAgLTQyMiw3ICs0MjQsNyBAQAogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKIAlyZi0+c3dpdGNoX3JhZGlvX29mZiA9IGFsMjIzMF9zd2l0Y2hfcmFkaW9fb2ZmOwotCWlmIChjaGlwLT5pc196ZDEyMTFiKSB7CisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkgewogCQlyZi0+aW5pdF9odyA9IHpkMTIxMWJfYWwyMjMwX2luaXRfaHc7CiAJCXJmLT5zZXRfY2hhbm5lbCA9IHpkMTIxMWJfYWwyMjMwX3NldF9jaGFubmVsOwogCQlyZi0+c3dpdGNoX3JhZGlvX29uID0gemQxMjExYl9hbDIyMzBfc3dpdGNoX3JhZGlvX29uOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfYWw3MjMwYi5jCmluZGV4IGY0ZThiNmEuLjczZDBiYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX2FsNzIzMGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl9hbDcyMzBiLmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogewogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJcmYtPmluaXRfaHcgPSB6ZDEyMTFiX2FsNzIzMGJfaW5pdF9odzsKIAkJcmYtPnN3aXRjaF9yYWRpb19vbiA9IHpkMTIxMWJfYWw3MjMwYl9zd2l0Y2hfcmFkaW9fb247CiAJCXJmLT5zZXRfY2hhbm5lbCA9IHpkMTIxMWJfYWw3MjMwYl9zZXRfY2hhbm5lbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmX3JmMjk1OS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMKaW5kZXggMmQ3MzZiZC4uY2M3MGQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfcmYyOTU5LmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogewogCXN0cnVjdCB6ZF9jaGlwICpjaGlwID0gemRfcmZfdG9fY2hpcChyZik7CiAKLQlpZiAoY2hpcC0+aXNfemQxMjExYikgeworCWlmICh6ZF9jaGlwX2lzX3pkMTIxMWIoY2hpcCkpIHsKIAkJZGV2X2Vycih6ZF9jaGlwX2RldihjaGlwKSwKIAkJICAgICAgICJSRjI5NTkgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIFpEMTIxMUIiCiAJCSAgICAgICAiIGRldmljZXNcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmZfdXcyNDUzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYwppbmRleCA0MTRlNDBkLi44NTdkY2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZl91dzI0NTMuYwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JaWYgKGNoaXAtPmlzX3pkMTIxMWIpCisJaWYgKHpkX2NoaXBfaXNfemQxMjExYihjaGlwKSkKIAkJaW9yZXFzWzFdLnZhbHVlID0gMHg3ZjsKIAogCXJldHVybiB6ZF9pb3dyaXRlMTZhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCmluZGV4IGNhMjQyOTkuLjI4ZDQxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC03MSw2ICs3MSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDEyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MTMpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDAwNTMsIDB4NTMwMSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCisJeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMGRhKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKIAkvKiAiRHJpdmVybGVzcyIgZGV2aWNlcyB0aGF0IG5lZWQgZWplY3RpbmcgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYWNlLCAweDIwMTEpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfSU5TVEFMTEVSIH0sCiAJeyBVU0JfREVWSUNFKDB4MGFjZSwgMHgyMGZmKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX0lOU1RBTExFUiB9LApAQCAtMTk1LDI2ICsxOTYsMjcgQEAKIAlyZXR1cm4gbGUxNl90b19jcHUocFtvZmZzZXRdKTsKIH0KIAotc3RhdGljIGNoYXIgKmdldF9md19uYW1lKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHU4IGRldmljZV90eXBlLAorc3RhdGljIGNoYXIgKmdldF9md19uYW1lKHN0cnVjdCB6ZF91c2IgKnVzYiwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKIAkgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwb3N0Zml4KQogewogCXNjbnByaW50ZihidWZmZXIsIHNpemUsICIlcyVzIiwKLQkJZGV2aWNlX3R5cGUgPT0gREVWSUNFX1pEMTIxMUIgPworCQl1c2ItPmlzX3pkMTIxMWIgPwogCQkJRldfWkQxMjExQl9QUkVGSVggOiBGV19aRDEyMTFfUFJFRklYLAogCQlwb3N0Zml4KTsKIAlyZXR1cm4gYnVmZmVyOwogfQogCi1zdGF0aWMgaW50IGhhbmRsZV92ZXJzaW9uX21pc21hdGNoKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCBkZXZpY2VfdHlwZSwKK3N0YXRpYyBpbnQgaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2goc3RydWN0IHpkX3VzYiAqdXNiLAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWJfZncpCiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICp1cl9mdyA9IE5VTEw7CiAJaW50IG9mZnNldDsKIAlpbnQgciA9IDA7CiAJY2hhciBmd19uYW1lWzEyOF07CiAKIAlyID0gcmVxdWVzdF9md19maWxlKCZ1cl9mdywKLQkJZ2V0X2Z3X25hbWUoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCBkZXZpY2VfdHlwZSwgInVyIiksCisJCWdldF9md19uYW1lKHVzYiwgZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCAidXIiKSwKIAkJJnVkZXYtPmRldik7CiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CkBAIC0yMzcsMTEgKzIzOSwxMiBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IHVwbG9hZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggZGV2aWNlX3R5cGUpCitzdGF0aWMgaW50IHVwbG9hZF9maXJtd2FyZShzdHJ1Y3QgemRfdXNiICp1c2IpCiB7CiAJaW50IHI7CiAJdTE2IGZ3X2JjZERldmljZTsKIAl1MTYgYmNkRGV2aWNlOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gemRfdXNiX3RvX3VzYmRldih1c2IpOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWJfZncgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdXBoX2Z3ID0gTlVMTDsKIAljaGFyIGZ3X25hbWVbMTI4XTsKQEAgLTI0OSw3ICsyNTIsNyBAQAogCWJjZERldmljZSA9IGdldF9iY2REZXZpY2UodWRldik7CiAKIAlyID0gcmVxdWVzdF9md19maWxlKCZ1Yl9mdywKLQkJZ2V0X2Z3X25hbWUoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCBkZXZpY2VfdHlwZSwgICJ1YiIpLAorCQlnZXRfZndfbmFtZSh1c2IsIGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInViIiksCiAJCSZ1ZGV2LT5kZXYpOwogCWlmIChyKQogCQlnb3RvIGVycm9yOwpAQCAtMjY0LDcgKzI2Nyw3IEBACiAJCQlkZXZfd2FybigmdWRldi0+ZGV2LCAiZGV2aWNlIGhhcyBvbGQgYm9vdGNvZGUsIHBsZWFzZSAiCiAJCQkJInJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmVcbiIpOwogCi0JCXIgPSBoYW5kbGVfdmVyc2lvbl9taXNtYXRjaCh1ZGV2LCBkZXZpY2VfdHlwZSwgdWJfZncpOworCQlyID0gaGFuZGxlX3ZlcnNpb25fbWlzbWF0Y2godXNiLCB1Yl9mdyk7CiAJCWlmIChyKQogCQkJZ290byBlcnJvcjsKIAl9IGVsc2UgewpAQCAtMjc1LDcgKzI3OCw3IEBACiAKIAogCXIgPSByZXF1ZXN0X2Z3X2ZpbGUoJnVwaF9mdywKLQkJZ2V0X2Z3X25hbWUoZndfbmFtZSwgc2l6ZW9mKGZ3X25hbWUpLCBkZXZpY2VfdHlwZSwgInVwaHIiKSwKKwkJZ2V0X2Z3X25hbWUodXNiLCBmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJ1cGhyIiksCiAJCSZ1ZGV2LT5kZXYpOwogCWlmIChyKQogCQlnb3RvIGVycm9yOwpAQCAtMjk0LDYgKzI5NywzMCBAQAogCXJldHVybiByOwogfQogCisvKiBSZWFkIGRhdGEgZnJvbSBkZXZpY2UgYWRkcmVzcyBzcGFjZSB1c2luZyAiZmlybXdhcmUgaW50ZXJmYWNlIiB3aGljaCBkb2VzCisgKiBub3QgcmVxdWlyZSBmaXJtd2FyZSB0byBiZSBsb2FkZWQuICovCitpbnQgemRfdXNiX3JlYWRfZncoc3RydWN0IHpkX3VzYiAqdXNiLCB6ZF9hZGRyX3QgYWRkciwgdTggKmRhdGEsIHUxNiBsZW4pCit7CisJaW50IHI7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CisKKwlyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJVVNCX1JFUV9GSVJNV0FSRV9SRUFEX0RBVEEsIFVTQl9ESVJfSU4gfCAweDQwLCBhZGRyLCAwLAorCQlkYXRhLCBsZW4sIDUwMDApOworCWlmIChyIDwgMCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkicmVhZCBvdmVyIGZpcm13YXJlIGludGVyZmFjZSBmYWlsZWQ6ICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfSBlbHNlIGlmIChyICE9IGxlbikgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkiaW5jb21wbGV0ZSByZWFkIG92ZXIgZmlybXdhcmUgaW50ZXJmYWNlOiAlZC8lZFxuIiwKKwkJCXIsIGxlbik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCiAjZGVmaW5lIHVyYl9kZXYodXJiKSAoJih1cmIpLT5kZXYtPmRldikKIAogc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9yZWdzX2ludChzdHJ1Y3QgdXJiICp1cmIpCkBAIC05MjAsOSArOTQ3LDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB6ZF91c2JfaW5pdF9odyhzdHJ1Y3QgemRfdXNiICp1c2IpCit7CisJaW50IHI7CisJc3RydWN0IHpkX21hYyAqbWFjID0gemRfdXNiX3RvX21hYyh1c2IpOworCisJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwgIlxuIik7CisKKwlyID0gdXBsb2FkX2Zpcm13YXJlKHVzYik7CisJaWYgKHIpIHsKKwkJZGV2X2Vycih6ZF91c2JfZGV2KHVzYiksCisJCSAgICAgICAiY291bGRuJ3QgbG9hZCBmaXJtd2FyZS4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKHpkX3VzYl90b191c2JkZXYodXNiKSk7CisJaWYgKHIpIHsKKwkJZGV2X2RiZ19mKHpkX3VzYl9kZXYodXNiKSwKKwkJCSJjb3VsZG4ndCByZXNldCBjb25maWd1cmF0aW9uLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisKKwlyID0gemRfbWFjX2luaXRfaHcobWFjKTsKKwlpZiAocikgeworCQlkZXZfZGJnX2YoemRfdXNiX2Rldih1c2IpLAorCQkgICAgICAgICAiY291bGRuJ3QgaW5pdGlhbGl6ZSBtYWMuIEVycm9yIG51bWJlciAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0KKworCXVzYi0+aW5pdGlhbGl6ZWQgPSAxOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHByb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IHI7CisJc3RydWN0IHpkX3VzYiAqdXNiOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKIApAQCAtOTUwLDI2ICsxMDEwLDEwIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JciA9IHVwbG9hZF9maXJtd2FyZSh1ZGV2LCBpZC0+ZHJpdmVyX2luZm8pOwotCWlmIChyKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwKLQkJICAgICAgICJjb3VsZG4ndCBsb2FkIGZpcm13YXJlLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCQlnb3RvIGVycm9yOwotCX0KKwl1c2IgPSAmemRfbmV0ZGV2X21hYyhuZXRkZXYpLT5jaGlwLnVzYjsKKwl1c2ItPmlzX3pkMTIxMWIgPSAoaWQtPmRyaXZlcl9pbmZvID09IERFVklDRV9aRDEyMTFCKSAhPSAwOwogCi0JciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKHVkZXYpOwotCWlmIChyKSB7Ci0JCWRldl9kYmdfZigmaW50Zi0+ZGV2LAotCQkJImNvdWxkbid0IHJlc2V0IGNvbmZpZ3VyYXRpb24uIEVycm9yIG51bWJlciAlZFxuIiwgcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JLyogQXQgdGhpcyBwb2ludCB0aGUgaW50ZXJydXB0IGVuZHBvaW50IGlzIG5vdCBnZW5lcmFsbHkgZW5hYmxlZC4gV2UKLQkgKiBzYXZlIHRoZSBVU0IgYmFuZHdpZHRoIHVudGlsIHRoZSBuZXR3b3JrIGRldmljZSBpcyBvcGVuZWQuIEJ1dAotCSAqIG5vdGlmeSB0aGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgTUFDIHdpbGwgcmVxdWlyZSB0aGUKLQkgKiBpbnRlcnJ1cHRzIHRvIGJlIHRlbXBvcmFyeSBlbmFibGVkLgotCSAqLwotCXIgPSB6ZF9tYWNfaW5pdF9odyh6ZF9uZXRkZXZfbWFjKG5ldGRldiksIGlkLT5kcml2ZXJfaW5mbyk7CisJciA9IHpkX21hY19wcmVpbml0X2h3KHpkX25ldGRldl9tYWMobmV0ZGV2KSk7CiAJaWYgKHIpIHsKIAkJZGV2X2RiZ19mKCZpbnRmLT5kZXYsCiAJCSAgICAgICAgICJjb3VsZG4ndCBpbml0aWFsaXplIG1hYy4gRXJyb3IgbnVtYmVyICVkXG4iLCByKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKaW5kZXggNTA2ZWE2YS4uOTYxYTdhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmgKQEAgLTE4OCw2ICsxODgsNyBAQAogCXN0cnVjdCB6ZF91c2Jfcnggcng7CiAJc3RydWN0IHpkX3VzYl90eCB0eDsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwl1OCBpc196ZDEyMTFiOjEsIGluaXRpYWxpemVkOjE7CiB9OwogCiAjZGVmaW5lIHpkX3VzYl9kZXYodXNiKSAoJnVzYi0+aW50Zi0+ZGV2KQpAQCAtMjM2LDYgKzIzNyw4IEBACiAKIGludCB6ZF91c2JfcmZ3cml0ZShzdHJ1Y3QgemRfdXNiICp1c2IsIHUzMiB2YWx1ZSwgdTggYml0cyk7CiAKK2ludCB6ZF91c2JfcmVhZF9mdyhzdHJ1Y3QgemRfdXNiICp1c2IsIHpkX2FkZHJfdCBhZGRyLCB1OCAqZGF0YSwgdTE2IGxlbik7CisKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqemRfd29ya3F1ZXVlOwogCiAjZW5kaWYgLyogX1pEX1VTQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCmluZGV4IGY0NmM2OWUuLjA5YzkzZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC01LDExICs1LDkgQEAKICMgUGFycG9ydCBjb25maWd1cmF0aW9uLgogIwogCi1tZW51ICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQotY29uZmlnIFBBUlBPUlQKK21lbnVjb25maWcgUEFSUE9SVAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugd2FudCB0byB1c2UgZGV2aWNlcyBjb25uZWN0ZWQgdG8geW91ciBtYWNoaW5lJ3MgcGFyYWxsZWwgcG9ydAogCSAgKHRoZSBjb25uZWN0b3IgYXQgdGhlIGNvbXB1dGVyIHdpdGggMjUgaG9sZXMpLCBlLmcuIHByaW50ZXIsIFpJUApAQCAtMzMsOSArMzEsMTEgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAoraWYgUEFSUE9SVAorCiBjb25maWcgUEFSUE9SVF9QQwogCXRyaXN0YXRlICJQQy1zdHlsZSBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uIFBBUlBPUlQgJiYgKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgorCWRlcGVuZHMgb24gKCFTUEFSQzY0IHx8IFBDSSkgJiYgIVNQQVJDMzIgJiYgIU0zMlIgJiYgIUZSVgogCS0tLWhlbHAtLS0KIAkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBDLXN0eWxlIHBhcmFsbGVsIHBvcnQuIEFsbAogCSAgSUJNIFBDIGNvbXBhdGlibGUgY29tcHV0ZXJzIGFuZCBzb21lIEFscGhhcyBoYXZlIFBDLXN0eWxlCkBAIC04NSw3ICs4NSw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0lQMzIKIAl0cmlzdGF0ZSAiU0dJIElQMzIgYnVpbHRpbiBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gU0dJX0lQMzIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNHSV9JUDMyICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgdGhlIHBhcmFsbGVsIHBvcnQgb24KQEAgLTk0LDcgKzk0LDcgQEAKIAogY29uZmlnIFBBUlBPUlRfQU1JR0EKIAl0cmlzdGF0ZSAiQW1pZ2EgYnVpbHRpbiBwb3J0IgotCWRlcGVuZHMgb24gQU1JR0EgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQU1JR0EKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogY29uZmlnIFBBUlBPUlRfTUZDMwogCXRyaXN0YXRlICJNdWx0aWZhY2UgSUlJIHBhcmFsbGVsIHBvcnQiCi0JZGVwZW5kcyBvbiBaT1JSTyAmJiBQQVJQT1JUCisJZGVwZW5kcyBvbiBaT1JSTwogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgcGFyYWxsZWwgcG9ydCBzdXBwb3J0IGZvciB0aGUgTUZDMyBjYXJkLgpAQCAtMTEyLDcgKzExMiw3IEBACiAKIGNvbmZpZyBQQVJQT1JUX0FUQVJJCiAJdHJpc3RhdGUgIkF0YXJpIGhhcmR3YXJlIgotCWRlcGVuZHMgb24gQVRBUkkgJiYgUEFSUE9SVAorCWRlcGVuZHMgb24gQVRBUkkKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xMjIsMTIgKzEyMiwxMSBAQAogY29uZmlnIFBBUlBPUlRfR1NDCiAJdHJpc3RhdGUKIAlkZWZhdWx0IEdTQwotCWRlcGVuZHMgb24gUEFSUE9SVAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCiBjb25maWcgUEFSUE9SVF9TVU5CUFAKIAl0cmlzdGF0ZSAiU3BhcmMgaGFyZHdhcmUgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBTQlVTICYmIFBBUlBPUlQgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBTQlVTICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBQQVJQT1JUX05PVF9QQwogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBiaWRpcmVjdGlvbmFsIHBhcmFsbGVsIHBvcnQKQEAgLTEzNiw3ICsxMzUsNiBAQAogCiBjb25maWcgUEFSUE9SVF9BWDg4Nzk2CiAJdHJpc3RhdGUgIkFYODg3OTYgUGFyYWxsZWwgUG9ydCIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAlzZWxlY3QgUEFSUE9SVF9OT1RfUEMKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBuZWVkIHN1cHBvcnQgZm9yIHRoZSBwYXJhbGxlbCBwb3J0IGhhcmR3YXJlIG9uCkBAIC0xNDgsNyArMTQ2LDYgQEAKIAogY29uZmlnIFBBUlBPUlRfMTI4NAogCWJvb2wgIklFRUUgMTI4NCB0cmFuc2ZlciBtb2RlcyIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIHByaW50ZXIgdGhhdCBzdXBwb3J0cyBzdGF0dXMgcmVhZGJhY2sgb3IgZGV2aWNlIElELCBvcgogCSAgd2FudCB0byB1c2UgYSBkZXZpY2UgdGhhdCB1c2VzIGVuaGFuY2VkIHBhcmFsbGVsIHBvcnQgdHJhbnNmZXIgbW9kZXMKQEAgLTE1OSw1ICsxNTYsNCBAQAogY29uZmlnIFBBUlBPUlRfTk9UX1BDCiAJYm9vbAogCi1lbmRtZW51Ci0KK2VuZGlmICMgUEFSUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKaW5kZXggN2JmYmFkNS4uNWQ1OGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCkBAIC0yNDI0LDcgKzI0MjQsNiBAQAogCXUzMiBpdGU4ODcyc2V0OwogCXUzMiBpdGU4ODcyX2xwdCwgaXRlODg3Ml9scHRoaTsKIAl1OCBpdGU4ODcyX2lycSwgdHlwZTsKLQljaGFyICpmYWtlX25hbWUgPSAicGFycG9ydCBwcm9iZSI7CiAJaW50IGlycTsKIAlpbnQgaTsKIApAQCAtMjQzMiwxMSArMjQzMSwxMSBAQAogCQogCS8vIG1ha2Ugc3VyZSB3aGljaCBvbmUgY2hpcAogCWZvcihpID0gMDsgaSA8IDU7IGkrKykgewotCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMHg4LCBmYWtlX25hbWUpOworCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMzIsICJpdDg4N3giKTsKIAkJaWYgKGJhc2VfcmVzKSB7CiAJCQlpbnQgdGVzdDsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NjAsCi0JCQkJCQkweGU3MDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKKwkJCQkJCTB4ZTUwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAocGRldiwgMHg3OCwKIAkJCQkJCTB4MDAwMDAwMDAgfCBpbnRhX2FkZHJbaV0pOwogCQkJdGVzdCA9IGluYiAoaW50YV9hZGRyW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcnBhZGxwYXJfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKaW5kZXggYmIzYzEwMS4uZGViNmI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9ycGFkbHBhcl9jb3JlLmMKQEAgLTE1OSw4ICsxNTksOCBAQAogCS8qIENsYWltIG5ldyBidXMgcmVzb3VyY2VzICovCiAJcGNpYmlvc19jbGFpbV9vbmVfYnVzKGRldi0+YnVzKTsKIAotCS8qIGlvcmVtYXAoKSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCi0JcmVtYXBfYnVzX3JhbmdlKGRldi0+c3Vib3JkaW5hdGUpOworCS8qIE1hcCBJTyBzcGFjZSBmb3IgY2hpbGQgYnVzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBzdWNjZWVkICovCisJcGNpYmlvc19tYXBfaW9fc3BhY2UoZGV2LT5zdWJvcmRpbmF0ZSk7CiAKIAkvKiBBZGQgbmV3IGRldmljZXMgdG8gZ2xvYmFsIGxpc3RzLiAgUmVnaXN0ZXIgaW4gcHJvYywgc3lzZnMuICovCiAJcGNpX2J1c19hZGRfZGV2aWNlcyhwaGItPmJ1cyk7CkBAIC0zOTAsNyArMzkwLDcgQEAKIAl9IGVsc2UKIAkJcGNpYmlvc19yZW1vdmVfcGNpX2RldmljZXMoYnVzKTsKIAotCWlmICh1bm1hcF9idXNfcmFuZ2UoYnVzKSkgeworCWlmIChwY2liaW9zX3VubWFwX2lvX3NwYWNlKGJ1cykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHVubWFwIGJ1cyByYW5nZVxuIiwKIAkJCV9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRVJBTkdFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwppbmRleCAxMGRiZGVjLi4xYjdiMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYworKysgYi9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIHN0YXRpYyBpbnQgc3lzZnNfaW5pdGlhbGl6ZWQ7CS8qID0gMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggYTdiY2U3NS4uMzRiOGRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0yMiw2ICsyMiwxOCBAQAogCiBMSVNUX0hFQUQocGNpX2RldmljZXMpOwogCisvKgorICogU29tZSBkZXZpY2UgZHJpdmVycyBuZWVkIGtub3cgaWYgcGNpIGlzIGluaXRpYXRlZC4KKyAqIEJhc2ljYWxseSwgd2UgdGhpbmsgcGNpIGlzIG5vdCBpbml0aWF0ZWQgd2hlbiB0aGVyZQorICogaXMgbm8gZGV2aWNlIGluIGxpc3Qgb2YgcGNpX2RldmljZXMuCisgKi8KK2ludCBub19wY2lfZGV2aWNlcyh2b2lkKQoreworCXJldHVybiBsaXN0X2VtcHR5KCZwY2lfZGV2aWNlcyk7Cit9CisKK0VYUE9SVF9TWU1CT0wobm9fcGNpX2RldmljZXMpOworCiAjaWZkZWYgSEFWRV9QQ0lfTEVHQUNZCiAvKioKICAqIHBjaV9jcmVhdGVfbGVnYWN5X2ZpbGVzIC0gY3JlYXRlIGxlZ2FjeSBJL08gcG9ydCBhbmQgbWVtb3J5IGZpbGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9jLmMgYi9kcml2ZXJzL3BjaS9wcm9jLmMKaW5kZXggY2ZhMGRmZS4uOTBhZGM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYy5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2MuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgInBjaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2VhcmNoLmMgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwppbmRleCA5ZjcwOTBmLi5jNmU3OWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZWFyY2guYworKysgYi9kcml2ZXJzL3BjaS9zZWFyY2guYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogY2FuIGNhdXNlIHNvbWUgbWFjaGluZXMgdG8gY3Jhc2guICBTbyBoZXJlIHdlIGRldGVjdCBhbmQgZmxhZyB0aGF0CiAJICogc2l0dWF0aW9uIGFuZCBiYWlsIG91dCBlYXJseS4KIAkgKi8KLQlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmcGNpX2RldmljZXMpKSkKKwlpZiAodW5saWtlbHkobm9fcGNpX2RldmljZXMoKSkpCiAJCXJldHVybiBOVUxMOwogCWRvd25fcmVhZCgmcGNpX2J1c19zZW0pOwogCW4gPSBmcm9tID8gZnJvbS0+Z2xvYmFsX2xpc3QubmV4dCA6IHBjaV9kZXZpY2VzLm5leHQ7CkBAIC0yNzcsNyArMjc3LDcgQEAKIAkgKiBjYW4gY2F1c2Ugc29tZSBtYWNoaW5lcyB0byBjcmFzaC4gIFNvIGhlcmUgd2UgZGV0ZWN0IGFuZCBmbGFnIHRoYXQKIAkgKiBzaXR1YXRpb24gYW5kIGJhaWwgb3V0IGVhcmx5LgogCSAqLwotCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZwY2lfZGV2aWNlcykpKQorCWlmICh1bmxpa2VseShub19wY2lfZGV2aWNlcygpKSkKIAkJcmV0dXJuIE5VTEw7CiAJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5nbG9iYWxfbGlzdC5uZXh0IDogcGNpX2RldmljZXMubmV4dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcgYi9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCmluZGV4IDM1Zjg4NjQuLmMwYzc3ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKKysrIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwpAQCAtMTgwLDE0ICsxODAsMTUgQEAKIAkgIFBDTUNJQSBjYXJkcyBhcmUgcGx1Z2dlZCBpbnRvLiBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgUENNQ0lBX004WFgKLSAgICAgICAgdHJpc3RhdGUgIk1QQzh4eCBQQ01DSUEgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBQQ01DSUEgJiYgUFBDICYmIDh4eCAKLSAgICAgICAgc2VsZWN0IFBDQ0FSRF9JT0RZTgotICAgICAgICBoZWxwCi0gICAgICAgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBQb3dlclBDIDh4eCBzZXJpZXMgUENNQ0lBCi0gICAgICAgIGNvbnRyb2xsZXIuCisJdHJpc3RhdGUgIk1QQzh4eCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDTUNJQSAmJiBQUEMgJiYgOHh4CisJc2VsZWN0IFBDQ0FSRF9JT0RZTgorCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFBvd2VyUEMgOHh4IHNlcmllcyBQQ01DSUEKKwkgIGNvbnRyb2xsZXIuCiAKLSAgICAgICAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgY2FsbGVkIG04eHhfcGNtY2lhLgorCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgY2FsbGVkIG04eHhfcGNtY2lhLgogCiBjb25maWcgSEQ2NDQ2NV9QQ01DSUEKIAl0cmlzdGF0ZSAiSEQ2NDQ2NSBob3N0IGJyaWRnZSBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY3MuYyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKaW5kZXggNTBjYWQzYS4uN2M5M2ExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCkBAIC02NTEsNiArNjUxLDcgQEAKIAlhZGRfd2FpdF9xdWV1ZSgmc2t0LT50aHJlYWRfd2FpdCwgJndhaXQpOwogCWNvbXBsZXRlKCZza3QtPnRocmVhZF9kb25lKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXVuc2lnbmVkIGludCBldmVudHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jIGIvZHJpdmVycy9wY21jaWEvbTh4eF9wY21jaWEuYwppbmRleCA5NzIxZWQ3Li4zYzQ1MTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9tOHh4X3BjbWNpYS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL204eHhfcGNtY2lhLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIEZ1cnRoZXIgZml4ZXMsIHYyLjYga2VybmVsIHBvcnQKICAqICAgICA8bWFyY2Vsby50b3NhdHRpQGN5Y2xhZGVzLmNvbT4KICAqIAotICogU29tZSBmaXhlcywgYWRkaXRpb25zIChDKSAyMDA1IE1vbnRhdmlzdGEgU29mdHdhcmUsIEluYy4gCisgKiBTb21lIGZpeGVzLCBhZGRpdGlvbnMgKEMpIDIwMDUtMjAwNyBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKiAgICAgPHZib3JkdWdAcnUubXZpc3RhLmNvbT4KICAqCiAgKiAiVGhlIEV4Q0Egc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgc29ja2V0IGNvbnRyb2xsZXJzIHNob3VsZCBwcm92aWRlCkBAIC00MCwxMCArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC01MSwxMSArNDcsMTggQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21wYzh4eC5oPgogI2luY2x1ZGUgPGFzbS84eHhfaW1tYXAuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2ZzX3BkLmg+CisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogCiAjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KQEAgLTExMCw3ICsxMTMsNyBAQAogI2RlZmluZSBDT05GSUdfUENNQ0lBX1NMT1RfQgogI2VuZGlmCiAKLSNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0IpICovCisjZW5kaWYJCQkJLyogIWRlZmluZWQoQ09ORklHX1BDTUNJQV9TTE9UX0EpICYmICFkZWZpbmVkKENPTkZJR19QQ01DSUFfU0xPVF9CKSAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQSkgJiYgZGVmaW5lZChDT05GSUdfUENNQ0lBX1NMT1RfQikKIApAQCAtMTQzLDMwICsxNDYsMjAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZGVmaW5lIFBDTUNJQV9NRU1fV0lOX0JBU0UgMHhlMDAwMDAwMCAvKiBiYXNlIGFkZHJlc3MgZm9yIG1lbW9yeSB3aW5kb3cgMCAgICovCi0jZGVmaW5lIFBDTUNJQV9NRU1fV0lOX1NJWkUgMHgwNDAwMDAwMCAvKiBlYWNoIG1lbW9yeSB3aW5kb3cgaXMgNjQgTUJ5dGUgICAgICovCi0jZGVmaW5lIFBDTUNJQV9JT19XSU5fQkFTRSAgX0lPX0JBU0UgICAvKiBiYXNlIGFkZHJlc3MgZm9yIGlvIHdpbmRvdyAwICAgICAgICovCi0KLSNkZWZpbmUgUENNQ0lBX1NDSExWTCBQQ01DSUFfSU5URVJSVVBUIC8qIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0IExldmVsICAgICAgKi8KLQorI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9CQVNFIDB4ZTAwMDAwMDAJLyogYmFzZSBhZGRyZXNzIGZvciBtZW1vcnkgd2luZG93IDAgICAqLworI2RlZmluZSBQQ01DSUFfTUVNX1dJTl9TSVpFIDB4MDQwMDAwMDAJLyogZWFjaCBtZW1vcnkgd2luZG93IGlzIDY0IE1CeXRlICAgICAqLworI2RlZmluZSBQQ01DSUFfSU9fV0lOX0JBU0UgIF9JT19CQVNFCS8qIGJhc2UgYWRkcmVzcyBmb3IgaW8gd2luZG93IDAgICAgICAgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLyogMi40LnggYW5kIG5ld2VyIGhhcyB0aGlzIGFsd2F5cyBpbiBIWiAqLwotI2RlZmluZSBNOFhYX0JVU0ZSRVEgKCgoKGJkX3QgKikmKF9fcmVzKSktPmJpX2J1c2ZyZXEpKQotCi1zdGF0aWMgaW50IHBjbWNpYV9zY2hsdmwgPSBQQ01DSUFfU0NITFZMOworc3RhdGljIGludCBwY21jaWFfc2NobHZsOwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGV2ZW50c19sb2NrKTsKIAotCiAjZGVmaW5lIFBDTUNJQV9TT0NLRVRfS0VZXzVWIDEKICNkZWZpbmUgUENNQ0lBX1NPQ0tFVF9LRVlfTFYgMgogCiAvKiBsb29rIHVwIHRhYmxlIGZvciBwZ2NyeCByZWdpc3RlcnMgKi8KLXN0YXRpYyB1MzIgKm04eHhfcGdjcnhbMl0gPSB7Ci0JJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BnY3JhLAotCSYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZ2NyYgotfTsKK3N0YXRpYyB1MzIgKm04eHhfcGdjcnhbMl07CiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGFkZHJlc3MgZWFjaCB3aW5kb3cgaW4gdGhlIFBDTUNJQSBjb250cm9sbGVyLgpAQCAtMTc2LDggKzE2OSw4IEBACiAgKi8KIAogc3RydWN0IHBjbWNpYV93aW4gewotCXUzMglicjsKLQl1MzIJb3I7CisJdTMyIGJyOworCXUzMiBvcjsKIH07CiAKIC8qCkBAIC0yMjEsMjIgKzIxNCwyNyBAQAogCiAvKiB3ZSBrZWVwIG9uZSBsb29rdXAgdGFibGUgcGVyIHNvY2tldCB0byBjaGVjayBmbGFncyAqLwogCi0jZGVmaW5lIFBDTUNJQV9FVkVOVFNfTUFYIDUgIC8qIDQgbWF4IGF0IGEgdGltZSArIHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFBDTUNJQV9FVkVOVFNfTUFYIDUJLyogNCBtYXggYXQgYSB0aW1lICsgdGVybWluYXRpb24gKi8KIAogc3RydWN0IGV2ZW50X3RhYmxlIHsKIAl1MzIgcmVnYml0OwogCXUzMiBldmVudGJpdDsKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAibTh4eC1wY21jaWEiOworCiBzdHJ1Y3Qgc29ja2V0X2luZm8gewotCXZvaWQJKCpoYW5kbGVyKSh2b2lkICppbmZvLCB1MzIgZXZlbnRzKTsKLQl2b2lkCSppbmZvOworCXZvaWQgKCpoYW5kbGVyKSAodm9pZCAqaW5mbywgdTMyIGV2ZW50cyk7CisJdm9pZCAqaW5mbzsKIAogCXUzMiBzbG90OworCXBjbWNvbmY4eHhfdCAqcGNtY2lhOworCXUzMiBidXNfZnJlcTsKKwlpbnQgaHdpcnE7CiAKIAlzb2NrZXRfc3RhdGVfdCBzdGF0ZTsKIAlzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgbWVtX3dpbltQQ01DSUFfTUVNX1dJTl9OT107Ci0Jc3RydWN0IHBjY2FyZF9pb19tYXAgIGlvX3dpbltQQ01DSUFfSU9fV0lOX05PXTsKKwlzdHJ1Y3QgcGNjYXJkX2lvX21hcCBpb193aW5bUENNQ0lBX0lPX1dJTl9OT107CiAJc3RydWN0IGV2ZW50X3RhYmxlIGV2ZW50c1tQQ01DSUFfRVZFTlRTX01BWF07CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgc29ja2V0OwogfTsKQEAgLTI1MCw4ICsyNDgsNyBAQAogCiAjZGVmaW5lIE04WFhfU0laRVNfTk8gMzIKIAotc3RhdGljIGNvbnN0IHUzMiBtOHh4X3NpemVfdG9fZ3JheVtNOFhYX1NJWkVTX05PXSA9Ci17CitzdGF0aWMgY29uc3QgdTMyIG04eHhfc2l6ZV90b19ncmF5W004WFhfU0laRVNfTk9dID0gewogCTB4MDAwMDAwMDEsIDB4MDAwMDAwMDIsIDB4MDAwMDAwMDgsIDB4MDAwMDAwMDQsCiAJMHgwMDAwMDA4MCwgMHgwMDAwMDA0MCwgMHgwMDAwMDAxMCwgMHgwMDAwMDAyMCwKIAkweDAwMDA4MDAwLCAweDAwMDA0MDAwLCAweDAwMDAxMDAwLCAweDAwMDAyMDAwLApAQCAtMjY3LDcgKzI2NCw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtOHh4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpOwogCi0jZGVmaW5lIFBDTUNJQV9CTVRfTElNSVQgKDE1KjQpICAvKiBCdXMgTW9uaXRvciBUaW1lb3V0IHZhbHVlICovCisjZGVmaW5lIFBDTUNJQV9CTVRfTElNSVQgKDE1KjQpCS8qIEJ1cyBNb25pdG9yIFRpbWVvdXQgdmFsdWUgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogYm9hcmQgc3BlY2lmaWMgc3R1ZmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjkxLDggKzI4OCw5IEBACiB7CiAJdTMyIHJlZyA9IDA7CiAKLQlzd2l0Y2godmNjKSB7Ci0JY2FzZSAwOiBicmVhazsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CiAJY2FzZSAzMzoKIAkJcmVnIHw9IEJDU1IxX1BDVkNUTDQ7CiAJCWJyZWFrOwpAQCAtMzAzLDExICszMDEsMTIgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0Jc3dpdGNoKHZwcCkgewotCWNhc2UgMDogYnJlYWs7CisJc3dpdGNoICh2cHApIHsKKwljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgMzM6CiAJY2FzZSA1MDoKLQkJaWYodmNjID09IHZwcCkKKwkJaWYgKHZjYyA9PSB2cHApCiAJCQlyZWcgfD0gQkNTUjFfUENWQ1RMNjsKIAkJZWxzZQogCQkJcmV0dXJuIDE7CkBAIC0zMTgsMjUgKzMxNywyOSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZighKCh2Y2MgPT0gNTApIHx8ICh2Y2MgPT0gMCkpKQorCWlmICghKCh2Y2MgPT0gNTApIHx8ICh2Y2MgPT0gMCkpKQogCQlyZXR1cm4gMTsKIAogCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KIAotCW91dF9iZTMyKCgodTMyICopUlBYX0NTUl9BRERSKSwgaW5fYmUzMigoKHUzMiAqKVJQWF9DU1JfQUREUikpICYgfihCQ1NSMV9QQ1ZDVEw0IHwgQkNTUjFfUENWQ1RMNSB8IEJDU1IxX1BDVkNUTDYgfCBCQ1NSMV9QQ1ZDVEw3KSk7CisJb3V0X2JlMzIoKCh1MzIgKikgUlBYX0NTUl9BRERSKSwKKwkJIGluX2JlMzIoKCh1MzIgKikgUlBYX0NTUl9BRERSKSkgJiB+KEJDU1IxX1BDVkNUTDQgfAorCQkJCQkJICAgICBCQ1NSMV9QQ1ZDVEw1IHwKKwkJCQkJCSAgICAgQkNTUjFfUENWQ1RMNiB8CisJCQkJCQkgICAgIEJDU1IxX1BDVkNUTDcpKTsKIAogCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwogCi0Jb3V0X2JlMzIoKCh1MzIgKilSUFhfQ1NSX0FERFIpLCBpbl9iZTMyKCgodTMyICopUlBYX0NTUl9BRERSKSkgfCByZWcpOworCW91dF9iZTMyKCgodTMyICopIFJQWF9DU1JfQUREUiksIGluX2JlMzIoKCh1MzIgKikgUlBYX0NTUl9BRERSKSkgfCByZWcpOwogCiAJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgc29ja2V0X2dldChfc2xvdF8pIFBDTUNJQV9TT0NLRVRfS0VZXzVWCi0jZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pICAvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KLSNkZWZpbmUgaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pIC8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KKyNkZWZpbmUgaGFyZHdhcmVfZW5hYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKQkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiAKLSNlbmRpZiAvKiBDT05GSUdfUlBYQ0xBU1NJQyAqLworI2VuZGlmCQkJCS8qIENPTkZJR19SUFhDTEFTU0lDICovCiAKIC8qIEZBRFMgQm9hcmRzIGZyb20gTW90b3JvbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTM0OCw0MyArMzUxLDQ1IEBACiB7CiAJdTMyIHJlZyA9IDA7CiAKLQlzd2l0Y2godmNjKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDoKLQkJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzA7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXJlZyB8PSBCQ1NSMV9QQ0NWQ0MxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKLQlzd2l0Y2godnBwKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCQljYXNlIDMzOgotCQljYXNlIDUwOgotCQkJaWYodmNjID09IHZwcCkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQljYXNlIDEyMDoKLQkJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKLQkJCQlyZWcgfD0gQkNTUjFfUENDVlBQMDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJZGVmYXVsdDoKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOworCQllbHNlCiAJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjA6CisJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKKwkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBmaXJzdCwgdHVybiBvZmYgYWxsIHBvd2VyICovCi0Jb3V0X2JlMzIoKHUzMiAqKUJDU1IxLCBpbl9iZTMyKCh1MzIgKilCQ1NSMSkgJiB+KEJDU1IxX1BDQ1ZDQ19NQVNLIHwgQkNTUjFfUENDVlBQX01BU0spKTsKKwlvdXRfYmUzMigodTMyICopIEJDU1IxLAorCQkgaW5fYmUzMigodTMyICopIEJDU1IxKSAmIH4oQkNTUjFfUENDVkNDX01BU0sgfAorCQkJCQkgICAgQkNTUjFfUENDVlBQX01BU0spKTsKIAogCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwotCW91dF9iZTMyKCh1MzIgKilCQ1NSMSwgaW5fYmUzMigodTMyICopQkNTUjEpIHwgcmVnKTsKKwlvdXRfYmUzMigodTMyICopIEJDU1IxLCBpbl9iZTMyKCh1MzIgKikgQkNTUjEpIHwgcmVnKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzkzLDEyICszOTgsMTIgQEAKIAogc3RhdGljIHZvaWQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQogewotCW91dF9iZTMyKCh1MzIgKilCQ1NSMSwgaW5fYmUzMigodTMyICopQkNTUjEpICYgfkJDU1IxX1BDQ0VOKTsKKwlvdXRfYmUzMigodTMyICopIEJDU1IxLCBpbl9iZTMyKCh1MzIgKikgQkNTUjEpICYgfkJDU1IxX1BDQ0VOKTsKIH0KIAogc3RhdGljIHZvaWQgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKIHsKLQlvdXRfYmUzMigodTMyICopQkNTUjEsIGluX2JlMzIoKHUzMiAqKUJDU1IxKSB8ICBCQ1NSMV9QQ0NFTik7CisJb3V0X2JlMzIoKHUzMiAqKSBCQ1NSMSwgaW5fYmUzMigodTMyICopIEJDU1IxKSB8IEJDU1IxX1BDQ0VOKTsKIH0KIAogI2VuZGlmCkBAIC00MDgsNzggKzQxMywyMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX01QQzg4NUFEUykKIAogI2RlZmluZSBQQ01DSUFfQk9BUkRfTVNHICJNUEM4ODVBRFMiCi0KLXN0YXRpYyBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCi17Ci0JdTMyIHJlZyA9IDA7Ci0JdW5zaWduZWQgKmJjc3JfaW87Ci0KLQliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQotCXN3aXRjaCh2Y2MpIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCQlyZWcgfD0gQkNTUjFfUENDVkNDMDsKLQkJCWJyZWFrOwotCQljYXNlIDUwOgotCQkJcmVnIHw9IEJDU1IxX1BDQ1ZDQzE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gb3V0X3VubWFwOwotCX0KLQotCXN3aXRjaCh2cHApIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCWNhc2UgNTA6Ci0JCQlpZih2Y2MgPT0gdnBwKQotCQkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAxOwotCQkJZWxzZQotCQkJCWdvdG8gb3V0X3VubWFwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTIwOgotCQkJaWYgKCh2Y2MgPT0gMzMpIHx8ICh2Y2MgPT0gNTApKQotCQkJCXJlZyB8PSBCQ1NSMV9QQ0NWUFAwOwotCQkJZWxzZQotCQkJCWdvdG8gb3V0X3VubWFwOwotCQlkZWZhdWx0OgotCQkJZ290byBvdXRfdW5tYXA7Ci0JfQotCi0JLyogZmlyc3QsIHR1cm4gb2ZmIGFsbCBwb3dlciAqLwotCW91dF9iZTMyKGJjc3JfaW8sIGluX2JlMzIoYmNzcl9pbykgJiB+KEJDU1IxX1BDQ1ZDQ19NQVNLIHwgQkNTUjFfUENDVlBQX01BU0spKTsKLQotCS8qIGVuYWJsZSBuZXcgcG93ZXJzZXR0aW5ncyAqLwotCW91dF9iZTMyKGJjc3JfaW8sIGluX2JlMzIoYmNzcl9pbykgfCByZWcpOwotCi0JaW91bm1hcChiY3NyX2lvKTsKLQlyZXR1cm4gMDsKLQotb3V0X3VubWFwOgotCWlvdW5tYXAoYmNzcl9pbyk7Ci0JcmV0dXJuIDE7Ci19Ci0KICNkZWZpbmUgc29ja2V0X2dldChfc2xvdF8pIFBDTUNJQV9TT0NLRVRfS0VZXzVWCiAKLXN0YXRpYyB2b2lkIGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXJkd2FyZV9lbmFibGUoaW50IHNsb3QpCiB7Ci0JdW5zaWduZWQgKmJjc3JfaW87Ci0KLQliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pICYgfkJDU1IxX1BDQ0VOKTsKLQlpb3VubWFwKGJjc3JfaW8pOworCW04eHhfcGNtY2lhX29wcy5od19jdHJsKHNsb3QsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KQorc3RhdGljIGlubGluZSB2b2lkIGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCiB7Ci0JdW5zaWduZWQgKmJjc3JfaW87CisJbTh4eF9wY21jaWFfb3BzLmh3X2N0cmwoc2xvdCwgMCk7Cit9CiAKLQliY3NyX2lvID0gaW9yZW1hcChCQ1NSMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlvdXRfYmUzMihiY3NyX2lvLCBpbl9iZTMyKGJjc3JfaW8pIHwgIEJDU1IxX1BDQ0VOKTsKLQlpb3VubWFwKGJjc3JfaW8pOworc3RhdGljIGlubGluZSBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCit7CisJcmV0dXJuIG04eHhfcGNtY2lhX29wcy52b2x0YWdlX3NldChzbG90LCB2Y2MsIHZwcCk7CiB9CiAKICNlbmRpZgpAQCAtNDk1LDUyICs0NDMsNTMgQEAKIHsKIAl1OCByZWcgPSAwOwogCi0Jc3dpdGNoKHZjYykgewotCQljYXNlIDA6Ci0JCQlicmVhazsKLQkJY2FzZSAzMzoKLQkJCXJlZyB8PSBDU1IyX1ZDQ18zMzsKLQkJCWJyZWFrOwotCQljYXNlIDUwOgotCQkJcmVnIHw9IENTUjJfVkNDXzUwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJcmVnIHw9IENTUjJfVkNDXzMzOworCQlicmVhazsKKwljYXNlIDUwOgorCQlyZWcgfD0gQ1NSMl9WQ0NfNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAotCXN3aXRjaCh2cHApIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCWNhc2UgNTA6Ci0JCQlpZih2Y2MgPT0gdnBwKQotCQkJCXJlZyB8PSBDU1IyX1ZQUF9WQ0M7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDE7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjA6Ci0JCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCi0JCQkJcmVnIHw9IENTUjJfVlBQXzEyOwotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQlkZWZhdWx0OgorCXN3aXRjaCAodnBwKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDMzOgorCWNhc2UgNTA6CisJCWlmICh2Y2MgPT0gdnBwKQorCQkJcmVnIHw9IENTUjJfVlBQX1ZDQzsKKwkJZWxzZQogCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gQ1NSMl9WUFBfMTI7CisJCWVsc2UKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAogCS8qIGZpcnN0LCB0dXJuIG9mZiBhbGwgcG93ZXIgKi8KLQlvdXRfOCgodTggKilNQlhfQ1NSMl9BRERSLCBpbl84KCh1OCAqKU1CWF9DU1IyX0FERFIpICYgfihDU1IyX1ZDQ19NQVNLIHwgQ1NSMl9WUFBfTUFTSykpOworCW91dF84KCh1OCAqKSBNQlhfQ1NSMl9BRERSLAorCSAgICAgIGluXzgoKHU4ICopIE1CWF9DU1IyX0FERFIpICYgfihDU1IyX1ZDQ19NQVNLIHwgQ1NSMl9WUFBfTUFTSykpOwogCiAJLyogZW5hYmxlIG5ldyBwb3dlcnNldHRpbmdzICovCi0Jb3V0XzgoKHU4ICopTUJYX0NTUjJfQUREUiwgaW5fOCgodTggKilNQlhfQ1NSMl9BRERSKSB8IHJlZyk7CisJb3V0XzgoKHU4ICopIE1CWF9DU1IyX0FERFIsIGluXzgoKHU4ICopIE1CWF9DU1IyX0FERFIpIHwgcmVnKTsKIAogCXJldHVybiAwOwogfQogCiAjZGVmaW5lIHNvY2tldF9nZXQoX3Nsb3RfKSBQQ01DSUFfU09DS0VUX0tFWV81VgotI2RlZmluZSBoYXJkd2FyZV9lbmFibGUoX3Nsb3RfKSAgLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCi0jZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKSAvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pCS8qIE5vIGhhcmR3YXJlIHRvIGVuYWJsZSAqLworI2RlZmluZSBoYXJkd2FyZV9kaXNhYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZGlzYWJsZSAqLwogCi0jZW5kaWYgLyogQ09ORklHX01CWCAqLworI2VuZGlmCQkJCS8qIENPTkZJR19NQlggKi8KIAogI2lmIGRlZmluZWQoQ09ORklHX1BSeEspCiAjaW5jbHVkZSA8YXNtL2NwbGQuaD4KQEAgLTU1NCw0MyArNTAzLDQ2IEBACiAJdTggcmVncmVhZDsKIAljcGxkX3JlZ3MgKmNjcGxkID0gZ2V0X2NwbGQoKTsKIAotCXN3aXRjaCh2Y2MpIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCQlyZWcgfD0gUENNQ0lBX1ZDQ18zMzsKLQkJCWJyZWFrOwotCQljYXNlIDUwOgotCQkJcmVnIHw9IFBDTUNJQV9WQ0NfNTA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAxOworCXN3aXRjaCAodmNjKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDMzOgorCQlyZWcgfD0gUENNQ0lBX1ZDQ18zMzsKKwkJYnJlYWs7CisJY2FzZSA1MDoKKwkJcmVnIHw9IFBDTUNJQV9WQ0NfNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAxOwogCX0KIAotCXN3aXRjaCh2cHApIHsKLQkJY2FzZSAwOgotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6Ci0JCWNhc2UgNTA6Ci0JCQlpZih2Y2MgPT0gdnBwKQotCQkJCXJlZyB8PSBQQ01DSUFfVlBQX1ZDQzsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQljYXNlIDEyMDoKLQkJCWlmICgodmNjID09IDMzKSB8fCAodmNjID09IDUwKSkKLQkJCQlyZWcgfD0gUENNQ0lBX1ZQUF8xMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJZGVmYXVsdDoKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwljYXNlIDUwOgorCQlpZiAodmNjID09IHZwcCkKKwkJCXJlZyB8PSBQQ01DSUFfVlBQX1ZDQzsKKwkJZWxzZQogCQkJcmV0dXJuIDE7CisJCWJyZWFrOworCWNhc2UgMTIwOgorCQlpZiAoKHZjYyA9PSAzMykgfHwgKHZjYyA9PSA1MCkpCisJCQlyZWcgfD0gUENNQ0lBX1ZQUF8xMjsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CiAJfQogCiAJcmVnID0gcmVnID4+IChzbG90IDw8IDIpOwogCXJlZ3JlYWQgPSBpbl84KCZjY3BsZC0+ZnBnYV9wY19jdGwpOwotCWlmIChyZWcgIT0gKHJlZ3JlYWQgJiAoKFBDTUNJQV9WQ0NfTUFTSyB8IFBDTUNJQV9WUFBfTUFTSykgPj4gKHNsb3QgPDwgMikpKSkgeworCWlmIChyZWcgIT0KKwkgICAgKHJlZ3JlYWQgJiAoKFBDTUNJQV9WQ0NfTUFTSyB8IFBDTUNJQV9WUFBfTUFTSykgPj4gKHNsb3QgPDwgMikpKSkgewogCQkvKiBlbmFibGUgbmV3IHBvd2Vyc2V0dGluZ3MgKi8KLQkJcmVncmVhZCA9IHJlZ3JlYWQgJiB+KChQQ01DSUFfVkNDX01BU0sgfCBQQ01DSUFfVlBQX01BU0spID4+IChzbG90IDw8IDIpKTsKKwkJcmVncmVhZCA9CisJCSAgICByZWdyZWFkICYgfigoUENNQ0lBX1ZDQ19NQVNLIHwgUENNQ0lBX1ZQUF9NQVNLKSA+PgorCQkJCShzbG90IDw8IDIpKTsKIAkJb3V0XzgoJmNjcGxkLT5mcGdhX3BjX2N0bCwgcmVnIHwgcmVncmVhZCk7CiAJCW1zbGVlcCgxMDApOwogCX0KQEAgLTU5OSw1MiArNTUxLDEwIEBACiB9CiAKICNkZWZpbmUgc29ja2V0X2dldChfc2xvdF8pIFBDTUNJQV9TT0NLRVRfS0VZX0xWCi0jZGVmaW5lIGhhcmR3YXJlX2VuYWJsZShfc2xvdF8pICAvKiBObyBoYXJkd2FyZSB0byBlbmFibGUgKi8KLSNkZWZpbmUgaGFyZHdhcmVfZGlzYWJsZShfc2xvdF8pIC8qIE5vIGhhcmR3YXJlIHRvIGRpc2FibGUgKi8KKyNkZWZpbmUgaGFyZHdhcmVfZW5hYmxlKF9zbG90XykJLyogTm8gaGFyZHdhcmUgdG8gZW5hYmxlICovCisjZGVmaW5lIGhhcmR3YXJlX2Rpc2FibGUoX3Nsb3RfKQkvKiBObyBoYXJkd2FyZSB0byBkaXNhYmxlICovCiAKLSNlbmRpZiAvKiBDT05GSUdfUFJ4SyAqLwotCi1zdGF0aWMgdm9pZCBtOHh4X3NodXRkb3duKHZvaWQpCi17Ci0JdTMyIG0sIGk7Ci0Jc3RydWN0IHBjbWNpYV93aW4gKnc7Ci0KLQlmb3IoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKXsKLQkJdyA9ICh2b2lkICopICYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwOwotCi0JCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLCBNOFhYX1BDTUNJQV9NQVNLKGkpKTsKLQkJb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwgaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKSAmIH5NOFhYX1BDTUNJQV9NQVNLKGkpKTsKLQotCQkvKiB0dXJuIG9mZiBpbnRlcnJ1cHQgYW5kIGRpc2FibGUgQ3hPRSAqLwotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGkpLCBNOFhYX1BHQ1JYX0NYT0UpOwotCi0JCS8qIHR1cm4gb2ZmIG1lbW9yeSB3aW5kb3dzICovCi0JCWZvcihtID0gMDsgbSA8IFBDTUNJQV9NRU1fV0lOX05POyBtKyspIHsKLQkJCW91dF9iZTMyKCZ3LT5vciwgMCk7IC8qIHNldCB0byBub3QgdmFsaWQgKi8KLQkJCXcrKzsKLQkJfQotCi0JCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KLQkJdm9sdGFnZV9zZXQoaSwgMCwgMCk7Ci0KLQkJLyogZGlzYWJsZSBleHRlcm5hbCBoYXJkd2FyZSAqLwotCQloYXJkd2FyZV9kaXNhYmxlKGkpOwotCX0KLQotCWZyZWVfaXJxKHBjbWNpYV9zY2hsdmwsIE5VTEwpOwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgbTh4eF9kcml2ZXIgPSB7Ci0gICAgICAgIC5uYW1lID0gIm04eHgtcGNtY2lhIiwKLSAgICAgICAgLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKLSAgICAgICAgLnN1c3BlbmQgPSBwY21jaWFfc29ja2V0X2Rldl9zdXNwZW5kLAotICAgICAgICAucmVzdW1lID0gcGNtY2lhX3NvY2tldF9kZXZfcmVzdW1lLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbTh4eF9kZXZpY2UgPSB7Ci0gICAgICAgIC5uYW1lID0gIm04eHgtcGNtY2lhIiwKLSAgICAgICAgLmlkID0gMCwKLX07CisjZW5kaWYJCQkJLyogQ09ORklHX1BSeEsgKi8KIAogc3RhdGljIHUzMiBwZW5kaW5nX2V2ZW50c1tQQ01DSUFfU09DS0VUU19OT107CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBlbmRpbmdfZXZlbnRfbG9jayk7CkBAIC02NTQsMjQgKzU2NCwyNSBAQAogCXN0cnVjdCBzb2NrZXRfaW5mbyAqczsKIAlzdHJ1Y3QgZXZlbnRfdGFibGUgKmU7CiAJdW5zaWduZWQgaW50IGksIGV2ZW50cywgcHNjciwgcGlwciwgcGVyOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gc29ja2V0WzBdLnBjbWNpYTsKIAogCWRwcmludGsoIkludGVycnVwdCFcbiIpOwogCS8qIGdldCBpbnRlcnJ1cHQgc291cmNlcyAqLwogCi0JcHNjciA9IGluX2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IpOwotCXBpcHIgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19waXByKTsKLQlwZXIgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wZXIpOworCXBzY3IgPSBpbl9iZTMyKCZwY21jaWEtPnBjbWNfcHNjcik7CisJcGlwciA9IGluX2JlMzIoJnBjbWNpYS0+cGNtY19waXByKTsKKwlwZXIgPSBpbl9iZTMyKCZwY21jaWEtPnBjbWNfcGVyKTsKIAotCWZvcihpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgewogCQlzID0gJnNvY2tldFtpXTsKIAkJZSA9ICZzLT5ldmVudHNbMF07CiAJCWV2ZW50cyA9IDA7CiAKLQkJd2hpbGUoZS0+cmVnYml0KSB7Ci0JCQlpZihwc2NyICYgZS0+cmVnYml0KQorCQl3aGlsZSAoZS0+cmVnYml0KSB7CisJCQlpZiAocHNjciAmIGUtPnJlZ2JpdCkKIAkJCQlldmVudHMgfD0gZS0+ZXZlbnRiaXQ7CiAKLQkJCQllKys7CisJCQllKys7CiAJCX0KIAogCQkvKgpAQCAtNjc5LDEzICs1OTAsMTEgQEAKIAkJICogbm90IHRvbyBuaWNlIGRvbmUsCiAJCSAqIHdlIGRlcGVuZCBvbiB0aGF0IENEMiBpcyB0aGUgYml0IHRvIHRoZSBsZWZ0IG9mIENEMS4uLgogCQkgKi8KLQkJaWYoZXZlbnRzICYgU1NfREVURUNUKQotCQkJaWYoKChwaXByICYgTThYWF9QQ01DSUFfQ0QyKGkpKSA+PiAxKSBeCi0JCQkJKHBpcHIgJiBNOFhYX1BDTUNJQV9DRDEoaSkpKQotCQkJeworCQlpZiAoZXZlbnRzICYgU1NfREVURUNUKQorCQkJaWYgKCgocGlwciAmIE04WFhfUENNQ0lBX0NEMihpKSkgPj4gMSkgXgorCQkJICAgIChwaXByICYgTThYWF9QQ01DSUFfQ0QxKGkpKSkgewogCQkJCWV2ZW50cyAmPSB+U1NfREVURUNUOwogCQkJfQotCiAjaWZkZWYgUENNQ0lBX0dMSVRDSFlfQ0QKIAkJLyoKIAkJICogSSd2ZSBleHBlcmllbmNlZCBDRCBwcm9ibGVtcyB3aXRoIG15IEFEUyBib2FyZC4KQEAgLTY5MywyNCArNjAyLDIzIEBACiAJCSAqIHJlYWwgY2hhbmdlIG9mIENhcmQgZGV0ZWN0aW9uLgogCQkgKi8KIAotCQlpZigoZXZlbnRzICYgU1NfREVURUNUKSAmJgotCQkgICAoKHBpcHIgJgotCQkgICAgIChNOFhYX1BDTUNJQV9DRDIoaSkgfCBNOFhYX1BDTUNJQV9DRDEoaSkpKSA9PSAwKSAmJgotCQkgICAocy0+c3RhdGUuVmNjIHwgcy0+c3RhdGUuVnBwKSkgeworCQlpZiAoKGV2ZW50cyAmIFNTX0RFVEVDVCkgJiYKKwkJICAgICgocGlwciAmCisJCSAgICAgIChNOFhYX1BDTUNJQV9DRDIoaSkgfCBNOFhYX1BDTUNJQV9DRDEoaSkpKSA9PSAwKSAmJgorCQkgICAgKHMtPnN0YXRlLlZjYyB8IHMtPnN0YXRlLlZwcCkpIHsKIAkJCWV2ZW50cyAmPSB+U1NfREVURUNUOwogCQkJLypwcmludGsoICJDRCBnbGl0Y2ggd29ya2Fyb3VuZCAtIENEID0gMHglMDh4IVxuIiwKLQkJCQkocGlwciAmIChNOFhYX1BDTUNJQV9DRDIoaSkKLQkJCQkJIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkpOyovCisJCQkgICAocGlwciAmIChNOFhYX1BDTUNJQV9DRDIoaSkKKwkJCSAgIHwgTThYWF9QQ01DSUFfQ0QxKGkpKSkpOyAqLwogCQl9CiAjZW5kaWYKIAogCQkvKiBjYWxsIHRoZSBoYW5kbGVyICovCiAKIAkJZHByaW50aygic2xvdCAldTogZXZlbnRzID0gMHglMDJ4LCBwc2NyID0gMHglMDh4LCAiCi0JCQkicGlwciA9IDB4JTA4eFxuIiwKLQkJCWksIGV2ZW50cywgcHNjciwgcGlwcik7CisJCQkicGlwciA9IDB4JTA4eFxuIiwgaSwgZXZlbnRzLCBwc2NyLCBwaXByKTsKIAotCQlpZihldmVudHMpIHsKKwkJaWYgKGV2ZW50cykgewogCQkJc3Bpbl9sb2NrKCZwZW5kaW5nX2V2ZW50X2xvY2spOwogCQkJcGVuZGluZ19ldmVudHNbaV0gfD0gZXZlbnRzOwogCQkJc3Bpbl91bmxvY2soJnBlbmRpbmdfZXZlbnRfbG9jayk7CkBAIC03MjQsNyArNjMyLDcgQEAKIAkJCXBlciAmPSB+TThYWF9QQ01DSUFfUkRZX0woMCk7CiAJCQlwZXIgJj0gfk04WFhfUENNQ0lBX1JEWV9MKDEpOwogCi0JCQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyLCBwZXIpOworCQkJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wZXIsIHBlcik7CiAKIAkJCWlmIChldmVudHMpCiAJCQkJcGNtY2lhX3BhcnNlX2V2ZW50cygmc29ja2V0W2ldLnNvY2tldCwgZXZlbnRzKTsKQEAgLTczMiw3ICs2NDAsNyBAQAogCX0KIAogCS8qIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc291cmNlcyAqLwotCW91dF9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wc2NyLCBwc2NyKTsKKwlvdXRfYmUzMigmcGNtY2lhLT5wY21jX3BzY3IsIHBzY3IpOwogCiAJZHByaW50aygiSW50ZXJydXB0IGRvbmUuXG4iKTsKIApAQCAtNzQzLDIxICs2NTEsMjEgQEAKIHsKIAl1MzIgazsKIAotCWZvcihrID0gMDsgayA8IE04WFhfU0laRVNfTk87IGsrKykKLQkJaWYobTh4eF9zaXplX3RvX2dyYXlba10gPT0gc2l6ZSkKKwlmb3IgKGsgPSAwOyBrIDwgTThYWF9TSVpFU19OTzsgaysrKQorCQlpZiAobTh4eF9zaXplX3RvX2dyYXlba10gPT0gc2l6ZSkKIAkJCWJyZWFrOwogCi0JaWYoKGsgPT0gTThYWF9TSVpFU19OTykgfHwgKG04eHhfc2l6ZV90b19ncmF5W2tdID09IC0xKSkKKwlpZiAoKGsgPT0gTThYWF9TSVpFU19OTykgfHwgKG04eHhfc2l6ZV90b19ncmF5W2tdID09IC0xKSkKIAkJayA9IC0xOwogCiAJcmV0dXJuIGs7CiB9CiAKLXN0YXRpYyB1MzIgbTh4eF9nZXRfc3BlZWQodTMyIG5zLCB1MzIgaXNfaW8pCitzdGF0aWMgdTMyIG04eHhfZ2V0X3NwZWVkKHUzMiBucywgdTMyIGlzX2lvLCB1MzIgYnVzX2ZyZXEpCiB7CiAJdTMyIHJlZywgY2xvY2tzLCBwc3N0LCBwc2wsIHBzaHQ7CiAKLQlpZighbnMpIHsKKwlpZiAoIW5zKSB7CiAKIAkJLyoKIAkJICogV2UgZ2V0IGNhbGxlZCB3aXRoIElPIG1hcHMgc2V0dXAgdG8gMG5zCkBAIC03NjUsMTAgKzY3MywxMCBAQAogCQkgKiBUaGV5IHNob3VsZCBiZSAyNTVucy4KIAkJICovCiAKLQkJaWYoaXNfaW8pCisJCWlmIChpc19pbykKIAkJCW5zID0gMjU1OwogCQllbHNlCi0JCQlucyA9IDEwMDsgIC8qIGZhc3QgbWVtb3J5IGlmIDAgKi8KKwkJCW5zID0gMTAwOwkvKiBmYXN0IG1lbW9yeSBpZiAwICovCiAJfQogCiAJLyoKQEAgLTc3OSwyMyArNjg3LDIzIEBACiAKIC8qIGhvdyB3ZSB3YW50IHRvIGFkanVzdCB0aGUgdGltaW5nIC0gaW4gcGVyY2VudCAqLwogCi0jZGVmaW5lIEFESiAxODAgLyogODAgJSBsb25nZXIgYWNjZXNzdGltZSAtIHRvIGJlIHN1cmUgKi8KKyNkZWZpbmUgQURKIDE4MAkJCS8qIDgwICUgbG9uZ2VyIGFjY2Vzc3RpbWUgLSB0byBiZSBzdXJlICovCiAKLQljbG9ja3MgPSAoKE04WFhfQlVTRlJFUSAvIDEwMDApICogbnMpIC8gMTAwMDsKLQljbG9ja3MgPSAoY2xvY2tzICogQURKKSAvICgxMDAqMTAwMCk7Ci0JaWYoY2xvY2tzID49IFBDTUNJQV9CTVRfTElNSVQpIHsKLQkJcHJpbnRrKCAiTWF4IGFjY2VzcyB0aW1lIGxpbWl0IHJlYWNoZWRcbiIpOwotCQljbG9ja3MgPSBQQ01DSUFfQk1UX0xJTUlULTE7CisJY2xvY2tzID0gKChidXNfZnJlcSAvIDEwMDApICogbnMpIC8gMTAwMDsKKwljbG9ja3MgPSAoY2xvY2tzICogQURKKSAvICgxMDAgKiAxMDAwKTsKKwlpZiAoY2xvY2tzID49IFBDTUNJQV9CTVRfTElNSVQpIHsKKwkJcHJpbnRrKCJNYXggYWNjZXNzIHRpbWUgbGltaXQgcmVhY2hlZFxuIik7CisJCWNsb2NrcyA9IFBDTUNJQV9CTVRfTElNSVQgLSAxOwogCX0KIAotCXBzc3QgPSBjbG9ja3MgLyA3OyAgICAgICAgICAvKiBzZXR1cCB0aW1lICovCi0JcHNodCA9IGNsb2NrcyAvIDc7ICAgICAgICAgIC8qIGhvbGQgdGltZSAqLwotCXBzbCAgPSAoY2xvY2tzICogNSkgLyA3OyAgICAvKiBzdHJvYmUgbGVuZ3RoICovCisJcHNzdCA9IGNsb2NrcyAvIDc7CS8qIHNldHVwIHRpbWUgKi8KKwlwc2h0ID0gY2xvY2tzIC8gNzsJLyogaG9sZCB0aW1lICovCisJcHNsID0gKGNsb2NrcyAqIDUpIC8gNzsJLyogc3Ryb2JlIGxlbmd0aCAqLwogCiAJcHNzdCArPSBjbG9ja3MgLSAocHNzdCArIHBzaHQgKyBwc2wpOwogCi0JcmVnID0gIHBzc3QgPDwgMTI7Ci0JcmVnIHw9IHBzbCAgPDwgNzsKKwlyZWcgPSBwc3N0IDw8IDEyOworCXJlZyB8PSBwc2wgPDwgNzsKIAlyZWcgfD0gcHNodCA8PCAxNjsKIAogCXJldHVybiByZWc7CkBAIC04MDYsMTEgKzcxNCwxMiBAQAogCWludCBsc29jayA9IGNvbnRhaW5lcl9vZihzb2NrLCBzdHJ1Y3Qgc29ja2V0X2luZm8sIHNvY2tldCktPnNsb3Q7CiAJc3RydWN0IHNvY2tldF9pbmZvICpzID0gJnNvY2tldFtsc29ja107CiAJdW5zaWduZWQgaW50IHBpcHIsIHJlZzsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHMtPnBjbWNpYTsKIAotCXBpcHIgPSBpbl9iZTMyKCYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19waXByKTsKKwlwaXByID0gaW5fYmUzMigmcGNtY2lhLT5wY21jX3BpcHIpOwogCi0JKnZhbHVlICA9ICgocGlwciAmIChNOFhYX1BDTUNJQV9DRDEobHNvY2spCi0JCQkgICAgfCBNOFhYX1BDTUNJQV9DRDIobHNvY2spKSkgPT0gMCkgPyBTU19ERVRFQ1QgOiAwOworCSp2YWx1ZSA9ICgocGlwciAmIChNOFhYX1BDTUNJQV9DRDEobHNvY2spCisJCQkgICB8IE04WFhfUENNQ0lBX0NEMihsc29jaykpKSA9PSAwKSA/IFNTX0RFVEVDVCA6IDA7CiAJKnZhbHVlIHw9IChwaXByICYgTThYWF9QQ01DSUFfV1AobHNvY2spKSA/IFNTX1dSUFJPVCA6IDA7CiAKIAlpZiAocy0+c3RhdGUuZmxhZ3MgJiBTU19JT0NBUkQpCkBAIC04OTQsMTYgKzgwMywxNiBAQAogCS8qIHJlYWQgb3V0IFZTMSBhbmQgVlMyICovCiAKIAlyZWcgPSAocGlwciAmIE04WFhfUENNQ0lBX1ZTX01BU0sobHNvY2spKQotCQk+PiBNOFhYX1BDTUNJQV9WU19TSElGVChsc29jayk7CisJICAgID4+IE04WFhfUENNQ0lBX1ZTX1NISUZUKGxzb2NrKTsKIAotCWlmKHNvY2tldF9nZXQobHNvY2spID09IFBDTUNJQV9TT0NLRVRfS0VZX0xWKSB7Ci0JCXN3aXRjaChyZWcpIHsKKwlpZiAoc29ja2V0X2dldChsc29jaykgPT0gUENNQ0lBX1NPQ0tFVF9LRVlfTFYpIHsKKwkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSAxOgogCQkJKnZhbHVlIHw9IFNTXzNWQ0FSRDsKLQkJCWJyZWFrOyAvKiBHTkQsIE5DIC0gMy4zViBvbmx5ICovCisJCQlicmVhazsJLyogR05ELCBOQyAtIDMuM1Ygb25seSAqLwogCQljYXNlIDI6CiAJCQkqdmFsdWUgfD0gU1NfWFZDQVJEOwotCQkJYnJlYWs7IC8qIE5DLiBHTkQgLSB4LnhWIG9ubHkgKi8KKwkJCWJyZWFrOwkvKiBOQy4gR05EIC0geC54ViBvbmx5ICovCiAJCX07CiAJfQogCkBAIC05MTEsMjcgKzgyMCwyOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG04eHhfc2V0X3NvY2tldChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywgc29ja2V0X3N0YXRlX3QgKnN0YXRlKQorc3RhdGljIGludCBtOHh4X3NldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2ssIHNvY2tldF9zdGF0ZV90ICogc3RhdGUpCiB7CiAJaW50IGxzb2NrID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCBzb2NrZXRfaW5mbywgc29ja2V0KS0+c2xvdDsKIAlzdHJ1Y3Qgc29ja2V0X2luZm8gKnMgPSAmc29ja2V0W2xzb2NrXTsKIAlzdHJ1Y3QgZXZlbnRfdGFibGUgKmU7CiAJdW5zaWduZWQgaW50IHJlZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gc29ja2V0WzBdLnBjbWNpYTsKIAotCWRwcmludGsoICJTZXRTb2NrZXQoJWQsIGZsYWdzICUjMy4zeCwgVmNjICVkLCBWcHAgJWQsICIKLQkgICAgICAiaW9faXJxICVkLCBjc2NfbWFzayAlIzIuMngpXG4iLCBsc29jaywgc3RhdGUtPmZsYWdzLAotCSAgICAgIHN0YXRlLT5WY2MsIHN0YXRlLT5WcHAsIHN0YXRlLT5pb19pcnEsIHN0YXRlLT5jc2NfbWFzayk7CisJZHByaW50aygiU2V0U29ja2V0KCVkLCBmbGFncyAlIzMuM3gsIFZjYyAlZCwgVnBwICVkLCAiCisJCSJpb19pcnEgJWQsIGNzY19tYXNrICUjMi4yeClcbiIsIGxzb2NrLCBzdGF0ZS0+ZmxhZ3MsCisJCXN0YXRlLT5WY2MsIHN0YXRlLT5WcHAsIHN0YXRlLT5pb19pcnEsIHN0YXRlLT5jc2NfbWFzayk7CiAKIAkvKiBGaXJzdCwgc2V0IHZvbHRhZ2UgLSBiYWlsIG91dCBpZiBpbnZhbGlkICovCi0JaWYodm9sdGFnZV9zZXQobHNvY2ssIHN0YXRlLT5WY2MsIHN0YXRlLT5WcHApKQorCWlmICh2b2x0YWdlX3NldChsc29jaywgc3RhdGUtPlZjYywgc3RhdGUtPlZwcCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogVGFrZSBjYXJlIG9mIHJlc2V0Li4uICovCi0JaWYoc3RhdGUtPmZsYWdzICYgU1NfUkVTRVQpCi0JCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8ICBNOFhYX1BHQ1JYX0NYUkVTRVQpOyAvKiBhY3RpdmUgaGlnaCAqLworCWlmIChzdGF0ZS0+ZmxhZ3MgJiBTU19SRVNFVCkKKwkJb3V0X2JlMzIoTThYWF9QR0NSWChsc29jayksIGluX2JlMzIoTThYWF9QR0NSWChsc29jaykpIHwgTThYWF9QR0NSWF9DWFJFU0VUKTsJLyogYWN0aXZlIGhpZ2ggKi8KIAllbHNlCi0JCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIH5NOFhYX1BHQ1JYX0NYUkVTRVQpOworCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCSBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIH5NOFhYX1BHQ1JYX0NYUkVTRVQpOwogCiAJLyogLi4uIGFuZCBvdXRwdXQgZW5hYmxlLiAqLwogCkBAIC05NDMsMTAgKzg1NCwxMSBAQAogCSAgIG5vIHB1bGx1cHMgYXJlIHByZXNlbnQgLT4gdGhlIGNhcmRzIGFjdCB3aWVyZC4KIAkgICBTbyByaWdodCBub3cgdGhlIGJ1ZmZlcnMgYXJlIGVuYWJsZWQgaWYgdGhlIHBvd2VyIGlzIG9uLiAqLwogCi0JaWYoc3RhdGUtPlZjYyB8fCBzdGF0ZS0+VnBwKQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiB+TThYWF9QR0NSWF9DWE9FKTsgLyogYWN0aXZlIGxvdyAqLworCWlmIChzdGF0ZS0+VmNjIHx8IHN0YXRlLT5WcHApCisJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIH5NOFhYX1BHQ1JYX0NYT0UpOwkvKiBhY3RpdmUgbG93ICovCiAJZWxzZQotCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfCBNOFhYX1BHQ1JYX0NYT0UpOworCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCSBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8IE04WFhfUEdDUlhfQ1hPRSk7CiAKIAkvKgogCSAqIFdlJ2QgYmV0dGVyIHR1cm4gb2ZmIGludGVycnVwdHMgYmVmb3JlCkBAIC05NjMsMTcgKzg3NSwxNyBAQAogCWUgPSAmcy0+ZXZlbnRzWzBdOwogCXJlZyA9IDA7CiAKLQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19ERVRFQ1QpIHsKKwlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfREVURUNUKSB7CiAJCWUtPmV2ZW50Yml0ID0gU1NfREVURUNUOwogCQlyZWcgfD0gZS0+cmVnYml0ID0gKE04WFhfUENNQ0lBX0NEMihsc29jaykKIAkJCQkgICAgfCBNOFhYX1BDTUNJQV9DRDEobHNvY2spKTsKIAkJZSsrOwogCX0KLQlpZihzdGF0ZS0+ZmxhZ3MgJiBTU19JT0NBUkQpIHsKKwlpZiAoc3RhdGUtPmZsYWdzICYgU1NfSU9DQVJEKSB7CiAJCS8qCiAJCSAqIEkvTyBjYXJkCiAJCSAqLwotCQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19TVFNDSEcpIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX1NUU0NIRykgewogCQkJZS0+ZXZlbnRiaXQgPSBTU19TVFNDSEc7CiAJCQlyZWcgfD0gZS0+cmVnYml0ID0gTThYWF9QQ01DSUFfQlZEMShsc29jayk7CiAJCQllKys7CkBAIC05ODEsOCArODkzLDEwIEBACiAJCS8qCiAJCSAqIElmIGlvX2lycSBpcyBub24temVybyB3ZSBzaG91bGQgZW5hYmxlIGlycS4KIAkJICovCi0JCWlmKHN0YXRlLT5pb19pcnEpIHsKLQkJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSB8IG1rX2ludF9pbnRfbWFzayhzdGF0ZS0+aW9faXJxKSA8PCAyNCk7CisJCWlmIChzdGF0ZS0+aW9faXJxKSB7CisJCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgfAorCQkJCSBta19pbnRfaW50X21hc2socy0+aHdpcnEpIDw8IDI0KTsKIAkJCS8qCiAJCQkgKiBTdHJhbmdlIHRoaW5nIGhlcmU6CiAJCQkgKiBUaGUgbWFudWFsIGRvZXMgbm90IHRlbGwgdXMgd2hpY2ggaW50ZXJydXB0CkBAIC05OTMsMzMgKzkwNywzMiBAQAogCQkJICogaGF2ZSB0byBiZSBjbGVhcmVkIGluIFBTQ1IgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLgogCQkJICovCiAJCQlyZWcgfD0gTThYWF9QQ01DSUFfUkRZX0wobHNvY2spOwotCQl9Ci0JCWVsc2UKLQkJCW91dF9iZTMyKE04WFhfUEdDUlgobHNvY2spLCBpbl9iZTMyKE04WFhfUEdDUlgobHNvY2spKSAmIDB4MDBmZmZmZmYpOwotCX0KLQllbHNlIHsKKwkJfSBlbHNlCisJCQlvdXRfYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSwKKwkJCQkgaW5fYmUzMihNOFhYX1BHQ1JYKGxzb2NrKSkgJiAweDAwZmZmZmZmKTsKKwl9IGVsc2UgewogCQkvKgogCQkgKiBNZW1vcnkgY2FyZAogCQkgKi8KLQkJaWYoc3RhdGUtPmNzY19tYXNrICYgU1NfQkFUREVBRCkgeworCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfQkFUREVBRCkgewogCQkJZS0+ZXZlbnRiaXQgPSBTU19CQVRERUFEOwogCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IE04WFhfUENNQ0lBX0JWRDEobHNvY2spOwogCQkJZSsrOwogCQl9Ci0JCWlmKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVFdBUk4pIHsKKwkJaWYgKHN0YXRlLT5jc2NfbWFzayAmIFNTX0JBVFdBUk4pIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfQkFUV0FSTjsKIAkJCXJlZyB8PSBlLT5yZWdiaXQgPSBNOFhYX1BDTUNJQV9CVkQyKGxzb2NrKTsKIAkJCWUrKzsKIAkJfQogCQkvKiBXaGF0IHNob3VsZCBJIHRyaWdnZXIgb24gLSBsb3cvaGlnaCxyYWlzZSxmYWxsPyAqLwotCQlpZihzdGF0ZS0+Y3NjX21hc2sgJiBTU19SRUFEWSkgeworCQlpZiAoc3RhdGUtPmNzY19tYXNrICYgU1NfUkVBRFkpIHsKIAkJCWUtPmV2ZW50Yml0ID0gU1NfUkVBRFk7Ci0JCQlyZWcgfD0gZS0+cmVnYml0ID0gMDsgLy8/PworCQkJcmVnIHw9IGUtPnJlZ2JpdCA9IDA7CS8vPz8KIAkJCWUrKzsKIAkJfQogCX0KIAotCWUtPnJlZ2JpdCA9IDA7ICAvKiB0ZXJtaW5hdGUgbGlzdCAqLworCWUtPnJlZ2JpdCA9IDA7CQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogCiAJLyoKIAkgKiBDbGVhciB0aGUgc3RhdHVzIGNoYW5nZWQgLgpAQCAtMTAyNyw3ICs5NDAsNyBAQAogCSAqIFdyaXRpbmcgb25lcyB3aWxsIGNsZWFyIHRoZSBiaXRzLgogCSAqLwogCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IsIHJlZyk7CisJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wc2NyLCByZWcpOwogCiAJLyoKIAkgKiBXcml0ZSB0aGUgbWFzay4KQEAgLTEwMzYsMTUgKzk0OSwxMCBAQAogCSAqIE9uZXMgd2lsbCBlbmFibGUgdGhlIGludGVycnVwdC4KIAkgKi8KIAotCS8qCi0JICByZWcgfD0gKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyCi0JICAmIE04WFhfUENNQ0lBX01BU0sobHNvY2spOwotCSovCi0KLQlyZWcgfD0gaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKSAmCi0JCShNOFhYX1BDTUNJQV9NQVNLKDApIHwgTThYWF9QQ01DSUFfTUFTSygxKSk7Ci0KLQlvdXRfYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyLCByZWcpOworCXJlZyB8PQorCSAgICBpbl9iZTMyKCZwY21jaWEtPgorCQkgICAgcGNtY19wZXIpICYgKE04WFhfUENNQ0lBX01BU0soMCkgfCBNOFhYX1BDTUNJQV9NQVNLKDEpKTsKKwlvdXRfYmUzMigmcGNtY2lhLT5wY21jX3BlciwgcmVnKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50c19sb2NrLCBmbGFncyk7CiAKQEAgLTEwNjIsNjYgKzk3MCw2OCBAQAogCXN0cnVjdCBzb2NrZXRfaW5mbyAqcyA9ICZzb2NrZXRbbHNvY2tdOwogCXN0cnVjdCBwY21jaWFfd2luICp3OwogCXVuc2lnbmVkIGludCByZWcsIHdpbm5yOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gcy0+cGNtY2lhOwogCiAjZGVmaW5lIE04WFhfU0laRSAoaW8tPnN0b3AgLSBpby0+c3RhcnQgKyAxKQogI2RlZmluZSBNOFhYX0JBU0UgKFBDTUNJQV9JT19XSU5fQkFTRSArIGlvLT5zdGFydCkKIAotCWRwcmludGsoICJTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICAgICAiJSM0LjR4LSUjNC40eClcbiIsIGxzb2NrLCBpby0+bWFwLCBpby0+ZmxhZ3MsCi0JICAgICAgaW8tPnNwZWVkLCBpby0+c3RhcnQsIGlvLT5zdG9wKTsKKwlkcHJpbnRrKCJTZXRJT01hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKKwkJIiUjNC40eC0lIzQuNHgpXG4iLCBsc29jaywgaW8tPm1hcCwgaW8tPmZsYWdzLAorCQlpby0+c3BlZWQsIGlvLT5zdGFydCwgaW8tPnN0b3ApOwogCiAJaWYgKChpby0+bWFwID49IFBDTUNJQV9JT19XSU5fTk8pIHx8IChpby0+c3RhcnQgPiAweGZmZmYpCiAJICAgIHx8IChpby0+c3RvcCA+IDB4ZmZmZikgfHwgKGlvLT5zdG9wIDwgaW8tPnN0YXJ0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZigocmVnID0gbTh4eF9nZXRfZ3JheWNvZGUoTThYWF9TSVpFKSkgPT0gLTEpCisJaWYgKChyZWcgPSBtOHh4X2dldF9ncmF5Y29kZShNOFhYX1NJWkUpKSA9PSAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZihpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CisJaWYgKGlvLT5mbGFncyAmIE1BUF9BQ1RJVkUpIHsKIAotCQlkcHJpbnRrKCAiaW8tPmZsYWdzICYgTUFQX0FDVElWRVxuIik7CisJCWRwcmludGsoImlvLT5mbGFncyAmIE1BUF9BQ1RJVkVcbiIpOwogCiAJCXdpbm5yID0gKFBDTUNJQV9NRU1fV0lOX05PICogUENNQ0lBX1NPQ0tFVFNfTk8pCi0JCQkrIChsc29jayAqIFBDTUNJQV9JT19XSU5fTk8pICsgaW8tPm1hcDsKKwkJICAgICsgKGxzb2NrICogUENNQ0lBX0lPX1dJTl9OTykgKyBpby0+bWFwOwogCiAJCS8qIHNldHVwIHJlZ2lzdGVycyAqLwogCi0JCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKKwkJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCQl3ICs9IHdpbm5yOwogCi0JCW91dF9iZTMyKCZ3LT5vciwgMCk7IC8qIHR1cm4gb2ZmIHdpbmRvdyBmaXJzdCAqLworCQlvdXRfYmUzMigmdy0+b3IsIDApOwkvKiB0dXJuIG9mZiB3aW5kb3cgZmlyc3QgKi8KIAkJb3V0X2JlMzIoJnctPmJyLCBNOFhYX0JBU0UpOwogCiAJCXJlZyA8PD0gMjc7Ci0gIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9JTyB8KGxzb2NrIDw8IDIpOworCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX0lPIHwgKGxzb2NrIDw8IDIpOwogCi0JCXJlZyB8PSBtOHh4X2dldF9zcGVlZChpby0+c3BlZWQsIDEpOworCQlyZWcgfD0gbTh4eF9nZXRfc3BlZWQoaW8tPnNwZWVkLCAxLCBzLT5idXNfZnJlcSk7CiAKLQkJaWYoaW8tPmZsYWdzICYgTUFQX1dSUFJPVCkKKwkJaWYgKGlvLT5mbGFncyAmIE1BUF9XUlBST1QpCiAJCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX1dSUFJPVDsKIAotCQlpZihpby0+ZmxhZ3MgJiAoTUFQXzE2QklUIHwgTUFQX0FVVE9TWikpCisJCS8qaWYoaW8tPmZsYWdzICYgKE1BUF8xNkJJVCB8IE1BUF9BVVRPU1opKSAqLworCQlpZiAoaW8tPmZsYWdzICYgTUFQXzE2QklUKQogCQkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl8xNkJJVDsKIAotCQlpZihpby0+ZmxhZ3MgJiBNQVBfQUNUSVZFKQorCQlpZiAoaW8tPmZsYWdzICYgTUFQX0FDVElWRSkKIAkJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfVkFMSUQ7CiAKIAkJb3V0X2JlMzIoJnctPm9yLCByZWcpOwogCiAJCWRwcmludGsoIlNvY2tldCAldTogTWFwcGVkIGlvIHdpbmRvdyAldSBhdCAlIzguOHgsICIKLQkJICAgICAgIk9SID0gJSM4Ljh4LlxuIiwgbHNvY2ssIGlvLT5tYXAsIHctPmJyLCB3LT5vcik7CisJCQkiT1IgPSAlIzguOHguXG4iLCBsc29jaywgaW8tPm1hcCwgdy0+YnIsIHctPm9yKTsKIAl9IGVsc2UgewogCQkvKiBzaHV0ZG93biBJTyB3aW5kb3cgKi8KIAkJd2lubnIgPSAoUENNQ0lBX01FTV9XSU5fTk8gKiBQQ01DSUFfU09DS0VUU19OTykKLQkJCSsgKGxzb2NrICogUENNQ0lBX0lPX1dJTl9OTykgKyBpby0+bWFwOworCQkgICAgKyAobHNvY2sgKiBQQ01DSUFfSU9fV0lOX05PKSArIGlvLT5tYXA7CiAKIAkJLyogc2V0dXAgcmVnaXN0ZXJzICovCiAKLQkJdyA9ICh2b2lkICopICYoKGltbWFwX3QgKilJTUFQX0FERFIpLT5pbV9wY21jaWEucGNtY19wYnIwOworCQl3ID0gKHZvaWQgKikmcGNtY2lhLT5wY21jX3BicjA7CiAJCXcgKz0gd2lubnI7CiAKLQkJb3V0X2JlMzIoJnctPm9yLCAwKTsgLyogdHVybiBvZmYgd2luZG93ICovCi0JCW91dF9iZTMyKCZ3LT5iciwgMCk7IC8qIHR1cm4gb2ZmIGJhc2UgYWRkcmVzcyAqLworCQlvdXRfYmUzMigmdy0+b3IsIDApOwkvKiB0dXJuIG9mZiB3aW5kb3cgKi8KKwkJb3V0X2JlMzIoJnctPmJyLCAwKTsJLyogdHVybiBvZmYgYmFzZSBhZGRyZXNzICovCiAKIAkJZHByaW50aygiU29ja2V0ICV1OiBVbm1hcHBlZCBpbyB3aW5kb3cgJXUgYXQgJSM4Ljh4LCAiCiAJCQkiT1IgPSAlIzguOHguXG4iLCBsc29jaywgaW8tPm1hcCwgdy0+YnIsIHctPm9yKTsKQEAgLTExMjksMzUgKzEwMzksMzUgQEAKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBhbmQgbW9kaWZ5IHRoZSBjb3B5ICovCiAJcy0+aW9fd2luW2lvLT5tYXBdID0gKmlvOwotCXMtPmlvX3dpbltpby0+bWFwXS5mbGFncyAmPSAoTUFQX1dSUFJPVAotCQkJCSAgICAgfCBNQVBfMTZCSVQKLQkJCQkgICAgIHwgTUFQX0FDVElWRSk7CisJcy0+aW9fd2luW2lvLT5tYXBdLmZsYWdzICY9IChNQVBfV1JQUk9UIHwgTUFQXzE2QklUIHwgTUFQX0FDVElWRSk7CiAJZHByaW50aygiU2V0SU9NYXAgZXhpdFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtOHh4X3NldF9tZW1fbWFwKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm1lbSkKK3N0YXRpYyBpbnQgbTh4eF9zZXRfbWVtX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29jaywKKwkJCSAgICBzdHJ1Y3QgcGNjYXJkX21lbV9tYXAgKm1lbSkKIHsKIAlpbnQgbHNvY2sgPSBjb250YWluZXJfb2Yoc29jaywgc3RydWN0IHNvY2tldF9pbmZvLCBzb2NrZXQpLT5zbG90OwogCXN0cnVjdCBzb2NrZXRfaW5mbyAqcyA9ICZzb2NrZXRbbHNvY2tdOwogCXN0cnVjdCBwY21jaWFfd2luICp3OwogCXN0cnVjdCBwY2NhcmRfbWVtX21hcCAqb2xkOwogCXVuc2lnbmVkIGludCByZWcsIHdpbm5yOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhID0gcy0+cGNtY2lhOwogCi0JZHByaW50ayggIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICAgICAiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAotCSAgICAgIG1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOworCWRwcmludGsoIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKKwkJIiUjNS41bHgsICUjNS41eClcbiIsIGxzb2NrLCBtZW0tPm1hcCwgbWVtLT5mbGFncywKKwkJbWVtLT5zcGVlZCwgbWVtLT5zdGF0aWNfc3RhcnQsIG1lbS0+Y2FyZF9zdGFydCk7CiAKIAlpZiAoKG1lbS0+bWFwID49IFBDTUNJQV9NRU1fV0lOX05PKQotLy8JICAgIHx8ICgobWVtLT5zKSA+PSBQQ01DSUFfTUVNX1dJTl9TSVpFKQorLy8gICAgICAgICAgfHwgKChtZW0tPnMpID49IFBDTUNJQV9NRU1fV0lOX1NJWkUpCiAJICAgIHx8IChtZW0tPmNhcmRfc3RhcnQgPj0gMHgwNDAwMDAwMCkKLQkgICAgfHwgKG1lbS0+c3RhdGljX3N0YXJ0ICYgMHhmZmYpICAgICAgICAgICAgICAgIC8qIDRLQnl0ZSByZXNvbHV0aW9uICovCi0JICAgIHx8IChtZW0tPmNhcmRfc3RhcnQgJiAweGZmZikpCisJICAgIHx8IChtZW0tPnN0YXRpY19zdGFydCAmIDB4ZmZmKQkvKiA0S0J5dGUgcmVzb2x1dGlvbiAqLworCSAgICB8fChtZW0tPmNhcmRfc3RhcnQgJiAweGZmZikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoKHJlZyA9IG04eHhfZ2V0X2dyYXljb2RlKFBDTUNJQV9NRU1fV0lOX1NJWkUpKSA9PSAtMSkgewotCQlwcmludGsoICJDYW5ub3Qgc2V0IHNpemUgdG8gMHglMDh4LlxuIiwgUENNQ0lBX01FTV9XSU5fU0laRSk7CisJaWYgKChyZWcgPSBtOHh4X2dldF9ncmF5Y29kZShQQ01DSUFfTUVNX1dJTl9TSVpFKSkgPT0gLTEpIHsKKwkJcHJpbnRrKCJDYW5ub3Qgc2V0IHNpemUgdG8gMHglMDh4LlxuIiwgUENNQ0lBX01FTV9XSU5fU0laRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZWcgPDw9IDI3OwpAQCAtMTE2Niw1MCArMTA3Niw0NyBAQAogCiAJLyogU2V0dXAgdGhlIHdpbmRvdyBpbiB0aGUgcGNtY2lhIGNvbnRyb2xsZXIgKi8KIAotCXcgPSAodm9pZCAqKSAmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGJyMDsKKwl3ID0gKHZvaWQgKikmcGNtY2lhLT5wY21jX3BicjA7CiAJdyArPSB3aW5ucjsKIAogCXJlZyB8PSBsc29jayA8PCAyOwogCi0JcmVnIHw9IG04eHhfZ2V0X3NwZWVkKG1lbS0+c3BlZWQsIDApOworCXJlZyB8PSBtOHh4X2dldF9zcGVlZChtZW0tPnNwZWVkLCAwLCBzLT5idXNfZnJlcSk7CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQX0FUVFJJQikKLQkJcmVnIHw9ICBNOFhYX1BDTUNJQV9QT1JfQVRUUk1FTTsKKwlpZiAobWVtLT5mbGFncyAmIE1BUF9BVFRSSUIpCisJCXJlZyB8PSBNOFhYX1BDTUNJQV9QT1JfQVRUUk1FTTsKIAotCWlmKG1lbS0+ZmxhZ3MgJiBNQVBfV1JQUk9UKQorCWlmIChtZW0tPmZsYWdzICYgTUFQX1dSUFJPVCkKIAkJcmVnIHw9IE04WFhfUENNQ0lBX1BPUl9XUlBST1Q7CiAKLQlpZihtZW0tPmZsYWdzICYgTUFQXzE2QklUKQorCWlmIChtZW0tPmZsYWdzICYgTUFQXzE2QklUKQogCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SXzE2QklUOwogCi0JaWYobWVtLT5mbGFncyAmIE1BUF9BQ1RJVkUpCisJaWYgKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKQogCQlyZWcgfD0gTThYWF9QQ01DSUFfUE9SX1ZBTElEOwogCiAJb3V0X2JlMzIoJnctPm9yLCByZWcpOwogCiAJZHByaW50aygiU29ja2V0ICV1OiBNYXBwZWQgbWVtb3J5IHdpbmRvdyAldSBhdCAlIzguOHgsICIKLQkgICAgICAiT1IgPSAlIzguOHguXG4iLCBsc29jaywgbWVtLT5tYXAsIHctPmJyLCB3LT5vcik7CisJCSJPUiA9ICUjOC44eC5cbiIsIGxzb2NrLCBtZW0tPm1hcCwgdy0+YnIsIHctPm9yKTsKIAotCWlmKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CisJaWYgKG1lbS0+ZmxhZ3MgJiBNQVBfQUNUSVZFKSB7CiAJCS8qIGdldCB0aGUgbmV3IGJhc2UgYWRkcmVzcyAqLwogCQltZW0tPnN0YXRpY19zdGFydCA9IFBDTUNJQV9NRU1fV0lOX0JBU0UgKwotCQkJKFBDTUNJQV9NRU1fV0lOX1NJWkUgKiB3aW5ucikKLQkJCSsgbWVtLT5jYXJkX3N0YXJ0OworCQkgICAgKFBDTUNJQV9NRU1fV0lOX1NJWkUgKiB3aW5ucikKKwkJICAgICsgbWVtLT5jYXJkX3N0YXJ0OwogCX0KIAogCWRwcmludGsoIlNldE1lbU1hcCglZCwgJWQsICUjMi4yeCwgJWQgbnMsICIKLQkgICAgICAiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAotCSAgICAgIG1lbS0+c3BlZWQsIG1lbS0+c3RhdGljX3N0YXJ0LCBtZW0tPmNhcmRfc3RhcnQpOworCQkiJSM1LjVseCwgJSM1LjV4KVxuIiwgbHNvY2ssIG1lbS0+bWFwLCBtZW0tPmZsYWdzLAorCQltZW0tPnNwZWVkLCBtZW0tPnN0YXRpY19zdGFydCwgbWVtLT5jYXJkX3N0YXJ0KTsKIAogCS8qIGNvcHkgdGhlIHN0cnVjdCBhbmQgbW9kaWZ5IHRoZSBjb3B5ICovCiAKIAlvbGQgPSAmcy0+bWVtX3dpblttZW0tPm1hcF07CiAKIAkqb2xkID0gKm1lbTsKLQlvbGQtPmZsYWdzICY9IChNQVBfQVRUUklCCi0JCSAgICAgICB8IE1BUF9XUlBST1QKLQkJICAgICAgIHwgTUFQXzE2QklUCi0JCSAgICAgICB8IE1BUF9BQ1RJVkUpOworCW9sZC0+ZmxhZ3MgJj0gKE1BUF9BVFRSSUIgfCBNQVBfV1JQUk9UIHwgTUFQXzE2QklUIHwgTUFQX0FDVElWRSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjAsNyArMTEyNyw3IEBACiAJcGNjYXJkX2lvX21hcCBpbyA9IHsgMCwgMCwgMCwgMCwgMSB9OwogCXBjY2FyZF9tZW1fbWFwIG1lbSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwogCi0JZHByaW50ayggInNvY2tfaW5pdCglZClcbiIsIHMpOworCWRwcmludGsoInNvY2tfaW5pdCglZClcbiIsIHMpOwogCiAJbTh4eF9zZXRfc29ja2V0KHNvY2ssICZkZWFkX3NvY2tldCk7CiAJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9JT19XSU5fTk87IGkrKykgewpAQCAtMTIzNiwxMTEgKzExNDMsMTk1IEBACiAKIH0KIAotc3RhdGljIGludCBtOHh4X3N1c3BlbmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2spCitzdGF0aWMgaW50IG04eHhfc29ja19zdXNwZW5kKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrKQogewogCXJldHVybiBtOHh4X3NldF9zb2NrZXQoc29jaywgJmRlYWRfc29ja2V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2NhcmRfb3BlcmF0aW9ucyBtOHh4X3NlcnZpY2VzID0gewotCS5pbml0CT0gbTh4eF9zb2NrX2luaXQsCi0JLnN1c3BlbmQgPSBtOHh4X3N1c3BlbmQsCisJLmluaXQgPSBtOHh4X3NvY2tfaW5pdCwKKwkuc3VzcGVuZCA9IG04eHhfc29ja19zdXNwZW5kLAogCS5nZXRfc3RhdHVzID0gbTh4eF9nZXRfc3RhdHVzLAogCS5zZXRfc29ja2V0ID0gbTh4eF9zZXRfc29ja2V0LAogCS5zZXRfaW9fbWFwID0gbTh4eF9zZXRfaW9fbWFwLAogCS5zZXRfbWVtX21hcCA9IG04eHhfc2V0X21lbV9tYXAsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtOHh4X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IG04eHhfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBwY21jaWFfd2luICp3OwotCXVuc2lnbmVkIGludCBpLG07CisJdW5zaWduZWQgaW50IGksIG0sIGh3aXJxOworCXBjbWNvbmY4eHhfdCAqcGNtY2lhOworCWludCBzdGF0dXM7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5ub2RlOwogCiAJcGNtY2lhX2luZm8oIiVzXG4iLCB2ZXJzaW9uKTsKIAotCWlmIChkcml2ZXJfcmVnaXN0ZXIoJm04eHhfZHJpdmVyKSkKLQkJcmV0dXJuIC0xOworCXBjbWNpYSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAocGNtY2lhID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcGNtY2lhX3NjaGx2bCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlod2lycSA9IGlycV9tYXBbcGNtY2lhX3NjaGx2bF0uaHdpcnE7CisJaWYgKHBjbWNpYV9zY2hsdmwgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW04eHhfcGdjcnhbMF0gPSAmcGNtY2lhLT5wY21jX3BnY3JhOworCW04eHhfcGdjcnhbMV0gPSAmcGNtY2lhLT5wY21jX3BnY3JiOwogCiAJcGNtY2lhX2luZm8oUENNQ0lBX0JPQVJEX01TRyAiIHVzaW5nICIgUENNQ0lBX1NMT1RfTVNHCi0JCSAgICAiIHdpdGggSVJRICV1LlxuIiwgcGNtY2lhX3NjaGx2bCk7CisJCSAgICAiIHdpdGggSVJRICV1ICAoJWQpLiBcbiIsIHBjbWNpYV9zY2hsdmwsIGh3aXJxKTsKIAogCS8qIENvbmZpZ3VyZSBTdGF0dXMgY2hhbmdlIGludGVycnVwdCAqLwogCi0JaWYocmVxdWVzdF9pcnEocGNtY2lhX3NjaGx2bCwgbTh4eF9pbnRlcnJ1cHQsIDAsCi0JCQkgICJtOHh4X3BjbWNpYSIsIE5VTEwpKSB7CisJaWYgKHJlcXVlc3RfaXJxKHBjbWNpYV9zY2hsdmwsIG04eHhfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKKwkJCWRyaXZlcl9uYW1lLCBzb2NrZXQpKSB7CiAJCXBjbWNpYV9lcnJvcigiQ2Fubm90IGFsbG9jYXRlIElSUSAldSBmb3IgU0NITFZMIVxuIiwKIAkJCSAgICAgcGNtY2lhX3NjaGx2bCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQl3ID0gKHZvaWQgKikgJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BicjA7CisJdyA9ICh2b2lkICopJnBjbWNpYS0+cGNtY19wYnIwOwogCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BzY3IsCi0JCU04WFhfUENNQ0lBX01BU0soMCl8IE04WFhfUENNQ0lBX01BU0soMSkpOworCW91dF9iZTMyKCZwY21jaWEtPnBjbWNfcHNjciwgTThYWF9QQ01DSUFfTUFTSygwKSB8IE04WFhfUENNQ0lBX01BU0soMSkpOworCWNscmJpdHMzMigmcGNtY2lhLT5wY21jX3BlciwgTThYWF9QQ01DSUFfTUFTSygwKSB8IE04WFhfUENNQ0lBX01BU0soMSkpOwogCi0Jb3V0X2JlMzIoJigoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX3BjbWNpYS5wY21jX3BlciwKLQkJaW5fYmUzMigmKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fcGNtY2lhLnBjbWNfcGVyKSAmCi0JCX4oTThYWF9QQ01DSUFfTUFTSygwKXwgTThYWF9QQ01DSUFfTUFTSygxKSkpOworCS8qIGNvbm5lY3QgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KIAotLyogY29ubmVjdCBpbnRlcnJ1cHQgYW5kIGRpc2FibGUgQ3hPRSAqLworCW91dF9iZTMyKE04WFhfUEdDUlgoMCksCisJCSBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKGh3aXJxKSA8PCAxNikpOworCW91dF9iZTMyKE04WFhfUEdDUlgoMSksCisJCSBNOFhYX1BHQ1JYX0NYT0UgfCAobWtfaW50X2ludF9tYXNrKGh3aXJxKSA8PCAxNikpOwogCi0Jb3V0X2JlMzIoTThYWF9QR0NSWCgwKSwgTThYWF9QR0NSWF9DWE9FIHwgKG1rX2ludF9pbnRfbWFzayhwY21jaWFfc2NobHZsKSA8PCAxNikpOwotCW91dF9iZTMyKE04WFhfUEdDUlgoMSksIE04WFhfUEdDUlhfQ1hPRSB8IChta19pbnRfaW50X21hc2socGNtY2lhX3NjaGx2bCkgPDwgMTYpKTsKKwkvKiBpbnRpYWxpemUgdGhlIGZpeGVkIG1lbW9yeSB3aW5kb3dzICovCiAKLS8qIGludGlhbGl6ZSB0aGUgZml4ZWQgbWVtb3J5IHdpbmRvd3MgKi8KLQotCWZvcihpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspewotCQlmb3IobSA9IDA7IG0gPCBQQ01DSUFfTUVNX1dJTl9OTzsgbSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwkJZm9yIChtID0gMDsgbSA8IFBDTUNJQV9NRU1fV0lOX05POyBtKyspIHsKIAkJCW91dF9iZTMyKCZ3LT5iciwgUENNQ0lBX01FTV9XSU5fQkFTRSArCi0JCQkJKFBDTUNJQV9NRU1fV0lOX1NJWkUKLQkJCQkgKiAobSArIGkgKiBQQ01DSUFfTUVNX1dJTl9OTykpKTsKKwkJCQkgKFBDTUNJQV9NRU1fV0lOX1NJWkUKKwkJCQkgICogKG0gKyBpICogUENNQ0lBX01FTV9XSU5fTk8pKSk7CiAKLQkJCW91dF9iZTMyKCZ3LT5vciwgMCk7ICAvKiBzZXQgdG8gbm90IHZhbGlkICovCisJCQlvdXRfYmUzMigmdy0+b3IsIDApOwkvKiBzZXQgdG8gbm90IHZhbGlkICovCiAKIAkJCXcrKzsKIAkJfQogCX0KIAotLyogdHVybiBvZmYgdm9sdGFnZSAqLworCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KIAl2b2x0YWdlX3NldCgwLCAwLCAwKTsKIAl2b2x0YWdlX3NldCgxLCAwLCAwKTsKIAotLyogRW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJLyogRW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCiAJaGFyZHdhcmVfZW5hYmxlKDApOwogCWhhcmR3YXJlX2VuYWJsZSgxKTsKIAotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbTh4eF9kZXZpY2UpOwotCi0JZm9yIChpID0gMCA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKIAkJc29ja2V0W2ldLnNsb3QgPSBpOwogCQlzb2NrZXRbaV0uc29ja2V0Lm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCXNvY2tldFtpXS5zb2NrZXQuZmVhdHVyZXMgPSBTU19DQVBfUENDQVJEIHwgU1NfQ0FQX01FTV9BTElHTiB8IFNTX0NBUF9TVEFUSUNfTUFQOworCQlzb2NrZXRbaV0uc29ja2V0LmZlYXR1cmVzID0KKwkJICAgIFNTX0NBUF9QQ0NBUkQgfCBTU19DQVBfTUVNX0FMSUdOIHwgU1NfQ0FQX1NUQVRJQ19NQVA7CiAJCXNvY2tldFtpXS5zb2NrZXQuaXJxX21hc2sgPSAweDAwMDsKIAkJc29ja2V0W2ldLnNvY2tldC5tYXBfc2l6ZSA9IDB4MTAwMDsKIAkJc29ja2V0W2ldLnNvY2tldC5pb19vZmZzZXQgPSAwOwotCQlzb2NrZXRbaV0uc29ja2V0LnBjaV9pcnEgPSBpICA/IDcgOiA5OworCQlzb2NrZXRbaV0uc29ja2V0LnBjaV9pcnEgPSBwY21jaWFfc2NobHZsOwogCQlzb2NrZXRbaV0uc29ja2V0Lm9wcyA9ICZtOHh4X3NlcnZpY2VzOwotCQlzb2NrZXRbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfaW9keW5fb3BzOworCQlzb2NrZXRbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfbm9uc3RhdGljX29wczsKIAkJc29ja2V0W2ldLnNvY2tldC5jYl9kZXYgPSBOVUxMOwotCQlzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmbTh4eF9kZXZpY2UuZGV2OworCQlzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmb2ZkZXYtPmRldjsKKwkJc29ja2V0W2ldLnBjbWNpYSA9IHBjbWNpYTsKKwkJc29ja2V0W2ldLmJ1c19mcmVxID0gcHBjX3Byb2NfZnJlcTsKKwkJc29ja2V0W2ldLmh3aXJxID0gaHdpcnE7CisKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykKLQkJcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0W2ldLnNvY2tldCk7CisJZm9yIChpID0gMDsgaSA8IFBDTUNJQV9TT0NLRVRTX05POyBpKyspIHsKKwkJc3RhdHVzID0gcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0W2ldLnNvY2tldCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcGNtY2lhX2Vycm9yKCJTb2NrZXQgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG04eHhfZXhpdCh2b2lkKQorc3RhdGljIGludCBtOHh4X3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKIHsKLQlpbnQgaTsKKwl1MzIgbSwgaTsKKwlzdHJ1Y3QgcGNtY2lhX3dpbiAqdzsKKwlwY21jb25mOHh4X3QgKnBjbWNpYSA9IHNvY2tldFswXS5wY21jaWE7CiAKKwlmb3IgKGkgPSAwOyBpIDwgUENNQ0lBX1NPQ0tFVFNfTk87IGkrKykgeworCQl3ID0gKHZvaWQgKikmcGNtY2lhLT5wY21jX3BicjA7CisKKwkJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wc2NyLCBNOFhYX1BDTUNJQV9NQVNLKGkpKTsKKwkJb3V0X2JlMzIoJnBjbWNpYS0+cGNtY19wZXIsCisJCQkgaW5fYmUzMigmcGNtY2lhLT5wY21jX3BlcikgJiB+TThYWF9QQ01DSUFfTUFTSyhpKSk7CisKKwkJLyogdHVybiBvZmYgaW50ZXJydXB0IGFuZCBkaXNhYmxlIEN4T0UgKi8KKwkJb3V0X2JlMzIoTThYWF9QR0NSWChpKSwgTThYWF9QR0NSWF9DWE9FKTsKKworCQkvKiB0dXJuIG9mZiBtZW1vcnkgd2luZG93cyAqLworCQlmb3IgKG0gPSAwOyBtIDwgUENNQ0lBX01FTV9XSU5fTk87IG0rKykgeworCQkJb3V0X2JlMzIoJnctPm9yLCAwKTsJLyogc2V0IHRvIG5vdCB2YWxpZCAqLworCQkJdysrOworCQl9CisKKwkJLyogdHVybiBvZmYgdm9sdGFnZSAqLworCQl2b2x0YWdlX3NldChpLCAwLCAwKTsKKworCQkvKiBkaXNhYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJCWhhcmR3YXJlX2Rpc2FibGUoaSk7CisJfQogCWZvciAoaSA9IDA7IGkgPCBQQ01DSUFfU09DS0VUU19OTzsgaSsrKQogCQlwY21jaWFfdW5yZWdpc3Rlcl9zb2NrZXQoJnNvY2tldFtpXS5zb2NrZXQpOwogCi0JbTh4eF9zaHV0ZG93bigpOworCWZyZWVfaXJxKHBjbWNpYV9zY2hsdmwsIE5VTEwpOwogCi0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJm04eHhfZGV2aWNlKTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmbTh4eF9kcml2ZXIpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG04eHhfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQoJnBkZXYtPmRldiwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IG04eHhfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZSgmcGRldi0+ZGV2KTsKK30KKyNlbHNlCisjZGVmaW5lIG04eHhfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG04eHhfcmVzdW1lIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtOHh4X3BjbWNpYV9tYXRjaFtdID0geworCXsKKwkgLnR5cGUgPSAicGNtY2lhIiwKKwkgLmNvbXBhdGlibGUgPSAiZnNsLHBxLXBjbWNpYSIsCisJIH0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtOHh4X3BjbWNpYV9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIG04eHhfcGNtY2lhX2RyaXZlciA9IHsKKwkubmFtZSA9IChjaGFyICopZHJpdmVyX25hbWUsCisJLm1hdGNoX3RhYmxlID0gbTh4eF9wY21jaWFfbWF0Y2gsCisJLnByb2JlID0gbTh4eF9wcm9iZSwKKwkucmVtb3ZlID0gbTh4eF9yZW1vdmUsCisJLnN1c3BlbmQgPSBtOHh4X3N1c3BlbmQsCisJLnJlc3VtZSA9IG04eHhfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbTh4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbTh4eF9wY21jaWFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG04eHhfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZtOHh4X3BjbWNpYV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChtOHh4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL0tjb25maWcKaW5kZXggMTk1OWNlZi4uODIxOTMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgUGx1ZyBhbmQgUGxheSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIlBsdWcgYW5kIFBsYXkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgUE5QCittZW51Y29uZmlnIFBOUAogCWJvb2wgIlBsdWcgYW5kIFBsYXkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCWRlcGVuZHMgb24gSVNBIHx8IEFDUEkKIAktLS1oZWxwLS0tCiAJICBQbHVnIGFuZCBQbGF5IChQblApIGlzIGEgc3RhbmRhcmQgZm9yIHBlcmlwaGVyYWxzIHdoaWNoIGFsbG93cyB0aG9zZQpAQCAtMjIsMTUgKzIwLDE1IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKK2lmIFBOUAorCiBjb25maWcgUE5QX0RFQlVHCiAJYm9vbCAiUG5QIERlYnVnIE1lc3NhZ2VzIgotCWRlcGVuZHMgb24gUE5QCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdGhlIFBsdWcgYW5kIFBsYXkgTGF5ZXIgdG8gcHJpbnQgZGVidWcgbWVzc2FnZXMuCiAJICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGRldmVsb3BpbmcgYSBQblAgZHJpdmVyIG9yIHRyb3VibGVzaG9vdGluZy4KIAogY29tbWVudCAiUHJvdG9jb2xzIgotCWRlcGVuZHMgb24gUE5QCiAKIHNvdXJjZSAiZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWciCiAKQEAgLTM4LDUgKzM2LDQgQEAKIAogc291cmNlICJkcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWciCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBQTlAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9LY29uZmlnIGIvZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWcKaW5kZXggNTc4NjUxZS4uZjFlZjM2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWcKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiBjb25maWcgSVNBUE5QCiAJYm9vbCAiSVNBIFBsdWcgYW5kIFBsYXkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBOUCAmJiBJU0EKKwlkZXBlbmRzIG9uIElTQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2Ugc3VwcG9ydCBmb3IgSVNBIFBsdWcgYW5kIFBsYXkgZGV2aWNlcy4KIAkgIFNvbWUgaW5mb3JtYXRpb24gaXMgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9pc2FwbnAudHh0Pi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9pc2FwbnAvY29yZS5jCmluZGV4IGEwYjE1ODcuLjkxNGQwMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwpAQCAtMzcwLDggKzM3MCw2IEBACiAjaWYgMAogCXByaW50ayhLRVJOX0RFQlVHICJ0YWcgPSAweCV4LCB0eXBlID0gMHgleCwgc2l6ZSA9ICVpXG4iLCB0YWcsICp0eXBlLCAqc2l6ZSk7CiAjZW5kaWYKLQlpZiAodHlwZSA9PSAwKQkJCQkvKiB3cm9uZyB0eXBlICovCi0JCXJldHVybiAtMTsKIAlpZiAoKnR5cGUgPT0gMHhmZiAmJiAqc2l6ZSA9PSAweGZmZmYpCS8qIHByb2JhYmx5IGludmFsaWQgZGF0YSAqLwogCQlyZXR1cm4gLTE7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBiaW9zL0tjb25maWcgYi9kcml2ZXJzL3BucC9wbnBiaW9zL0tjb25maWcKaW5kZXggZmFiODQ4Yy4uYjk4NmQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcG5wL3BucGJpb3MvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKIGNvbmZpZyBQTlBCSU9TCiAJYm9vbCAiUGx1ZyBhbmQgUGxheSBCSU9TIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBQTlAgJiYgSVNBICYmIFg4NiAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIElTQSAmJiBYODYgJiYgRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgTGludXggdXNlcyB0aGUgUE5QQklPUyBhcyBkZWZpbmVkIGluICJQbHVnIGFuZCBQbGF5IEJJT1MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggM2EyMDFiNy4uMDNiYWYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTE2MCw2ICsxNjAsNyBAQAogewogCXN0YXRpYyBzdHJ1Y3QgcG5wX2RvY2tpbmdfc3RhdGlvbl9pbmZvIG5vdzsKIAlpbnQgZG9ja2VkID0gLTEsIGQgPSAwOworCXNldF9mcmVlemFibGUoKTsKIAl3aGlsZSAoIXVubG9hZGluZykKIAl7CiAJCWludCBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9NYWtlZmlsZSBiL2RyaXZlcnMvcHMzL01ha2VmaWxlCmluZGV4IGUyNTFkMWMuLjc0NjAzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcHMzL01ha2VmaWxlCkBAIC0xLDMgKzEsNiBAQAogb2JqLSQoQ09ORklHX1BTM19WVUFSVCkgKz0gdnVhcnQubwotb2JqLSQoQ09ORklHX1BTM19QUzNBVikgKz0gcHMzYXYubyBwczNhdl9jbWQubworb2JqLSQoQ09ORklHX1BTM19QUzNBVikgKz0gcHMzYXZfbW9kLm8KK3BzM2F2X21vZC1vYmpzCQkrPSBwczNhdi5vIHBzM2F2X2NtZC5vCitvYmotJChDT05GSUdfUFBDX1BTMykgKz0gc3lzLW1hbmFnZXItY29yZS5vCiBvYmotJChDT05GSUdfUFMzX1NZU19NQU5BR0VSKSArPSBzeXMtbWFuYWdlci5vCitvYmotJChDT05GSUdfUFMzX1NUT1JBR0UpICs9IHBzM3N0b3JfbGliLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3BzM2F2LmMgYi9kcml2ZXJzL3BzMy9wczNhdi5jCmluZGV4IDEzOTNlNjQuLjg1ZTIxNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzM2F2LmMKKysrIGIvZHJpdmVycy9wczMvcHMzYXYuYwpAQCAtMSwzMiArMSwzMCBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgotICogQ29weXJpZ2h0IDIwMDYsIDIwMDcgU29ueSBDb3Jwb3JhdGlvbgorICogIFBTMyBBViBiYWNrZW5kIHN1cHBvcnQuCiAgKgotICogQVYgYmFja2VuZCBzdXBwb3J0IGZvciBQUzMKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCi0gKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogCiAjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2x2MWNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHMzYXYuaD4KICNpbmNsdWRlIDxhc20vcHMzLmg+CiAKQEAgLTM5LDEzICszNywxMiBAQAogbW9kdWxlX3BhcmFtKHRpbWVvdXQsIGludCwgMDY0NCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcHMzYXYgewotCWludCBhdmFpbGFibGU7CiAJc3RydWN0IG11dGV4IG11dGV4OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCWludCBvcGVuX2NvdW50OwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXY7CiAKIAlpbnQgcmVnaW9uOwogCXN0cnVjdCBwczNhdl9wa3RfYXZfZ2V0X2h3X2NvbmYgYXZfaHdfY29uZjsKQEAgLTU1LDExICs1MiwxMyBAQAogCXUzMiBhdWRpb19wb3J0OwogCWludCBwczNhdl9tb2RlOwogCWludCBwczNhdl9tb2RlX29sZDsKLX0gcHMzYXY7Ci0KLXN0YXRpYyBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlIHBzM2F2X2RldiA9IHsKLQkubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MKLX07CisJdW5pb24geworCQlzdHJ1Y3QgcHMzYXZfcmVwbHlfaGRyIHJlcGx5X2hkcjsKKwkJdTggcmF3W1BTM0FWX0JVRl9TSVpFXTsKKwl9IHJlY3ZfYnVmOworCXZvaWQgKCpmbGlwX2N0bCkoaW50IG9uLCB2b2lkICpkYXRhKTsKKwl2b2lkICpmbGlwX2RhdGE7Cit9ICpwczNhdjsKIAogLyogY29sb3Igc3BhY2UgKi8KICNkZWZpbmUgWVVWNDQ0IFBTM0FWX0NNRF9WSURFT19DU19ZVVY0NDRfOApAQCAtMTY5LDcgKzE2OCw3IEBACiAJaWYgKGhkci0+Y2lkICYgUFMzQVZfRVZFTlRfQ01EX01BU0spIHsKIAkJdGFibGUgPSBwczNhdl9zZWFyY2hfY21kX3RhYmxlKGhkci0+Y2lkLCBQUzNBVl9FVkVOVF9DTURfTUFTSyk7CiAJCWlmICh0YWJsZSkKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkicmVjdiBldmVudCBwYWNrZXQgY2lkOiUwOHggcG9ydDoweCV4IHNpemU6JWRcbiIsCiAJCQkJaGRyLT5jaWQsIHBzM2F2X2V2ZW50X2dldF9wb3J0X2lkKGhkci0+Y2lkKSwKIAkJCQloZHItPnNpemUpOwpAQCAtMTgyLDYgKzE4MSw0MSBAQAogCXJldHVybiAwOwogfQogCisKKyNkZWZpbmUgUE9MTElOR19JTlRFUlZBTCAgMjUJLyogaW4gbXNlYyAqLworCitzdGF0aWMgaW50IHBzM2F2X3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGVycm9yOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwllcnJvciA9IHBzM192dWFydF93cml0ZShkZXYsIGJ1Ziwgc2l6ZSk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiBlcnJvciA/IGVycm9yIDogc2l6ZTsKK30KKworc3RhdGljIGludCBwczNhdl92dWFydF9yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IHRpbWVvdXQpCit7CisJaW50IGVycm9yOworCWludCBsb29wY250ID0gMDsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwl0aW1lb3V0ID0gKHRpbWVvdXQgKyBQT0xMSU5HX0lOVEVSVkFMIC0gMSkgLyBQT0xMSU5HX0lOVEVSVkFMOworCXdoaWxlIChsb29wY250KysgPD0gdGltZW91dCkgeworCQllcnJvciA9IHBzM192dWFydF9yZWFkKGRldiwgYnVmLCBzaXplKTsKKwkJaWYgKCFlcnJvcikKKwkJCXJldHVybiBzaXplOworCQlpZiAoZXJyb3IgIT0gLUVBR0FJTikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcHMzX3Z1YXJ0X3JlYWQgZmFpbGVkICVkXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJbXNsZWVwKFBPTExJTkdfSU5URVJWQUwpOworCX0KKwlyZXR1cm4gLUVXT1VMREJMT0NLOworfQorCiBzdGF0aWMgaW50IHBzM2F2X3NlbmRfY21kX3BrdChjb25zdCBzdHJ1Y3QgcHMzYXZfc2VuZF9oZHIgKnNlbmRfYnVmLAogCQkJICAgICAgc3RydWN0IHBzM2F2X3JlcGx5X2hkciAqcmVjdl9idWYsIGludCB3cml0ZV9sZW4sCiAJCQkgICAgICBpbnQgcmVhZF9sZW4pCkBAIC0xOTAsMTMgKzIyNCwxMyBAQAogCXUzMiBjbWQ7CiAJaW50IGV2ZW50OwogCi0JaWYgKCFwczNhdi5hdmFpbGFibGUpCisJaWYgKCFwczNhdikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBzZW5kIHBrdCAqLwotCXJlcyA9IHBzM2F2X3Z1YXJ0X3dyaXRlKHBzM2F2LmRldiwgc2VuZF9idWYsIHdyaXRlX2xlbik7CisJcmVzID0gcHMzYXZfdnVhcnRfd3JpdGUocHMzYXYtPmRldiwgc2VuZF9idWYsIHdyaXRlX2xlbik7CiAJaWYgKHJlcyA8IDApIHsKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkiJXM6IHBzM2F2X3Z1YXJ0X3dyaXRlKCkgZmFpbGVkIChyZXN1bHQ9JWQpXG4iLAogCQkJX19mdW5jX18sIHJlcyk7CiAJCXJldHVybiByZXM7CkBAIC0yMDYsMjAgKzI0MCwyMCBAQAogCWNtZCA9IHNlbmRfYnVmLT5jaWQ7CiAJZG8gewogCQkvKiByZWFkIGhlYWRlciAqLwotCQlyZXMgPSBwczNhdl92dWFydF9yZWFkKHBzM2F2LmRldiwgcmVjdl9idWYsIFBTM0FWX0hEUl9TSVpFLAorCQlyZXMgPSBwczNhdl92dWFydF9yZWFkKHBzM2F2LT5kZXYsIHJlY3ZfYnVmLCBQUzNBVl9IRFJfU0laRSwKIAkJCQkgICAgICAgdGltZW91dCk7CiAJCWlmIChyZXMgIT0gUFMzQVZfSERSX1NJWkUpIHsKLQkJCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKIAkJCQkiJXM6IHBzM2F2X3Z1YXJ0X3JlYWQoKSBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCiAJCQkJX19mdW5jX18sIHJlcyk7CiAJCQlyZXR1cm4gcmVzOwogCQl9CiAKIAkJLyogcmVhZCBib2R5ICovCi0JCXJlcyA9IHBzM2F2X3Z1YXJ0X3JlYWQocHMzYXYuZGV2LCAmcmVjdl9idWYtPmNpZCwKKwkJcmVzID0gcHMzYXZfdnVhcnRfcmVhZChwczNhdi0+ZGV2LCAmcmVjdl9idWYtPmNpZCwKIAkJCQkgICAgICAgcmVjdl9idWYtPnNpemUsIHRpbWVvdXQpOwogCQlpZiAocmVzIDwgMCkgewotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSIlczogcHMzYXZfdnVhcnRfcmVhZCgpIGZhaWxlZCAocmVzdWx0PSVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgcmVzKTsKIAkJCXJldHVybiByZXM7CkBAIC0yMzAsNyArMjY0LDcgQEAKIAl9IHdoaWxlIChldmVudCk7CiAKIAlpZiAoKGNtZCB8IFBTM0FWX1JFUExZX0JJVCkgIT0gcmVjdl9idWYtPmNpZCkgewotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgIiVzOiByZXBseSBlcnIgKHJlc3VsdD0leClcbiIsCisJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsICIlczogcmVwbHkgZXJyIChyZXN1bHQ9JXgpXG4iLAogCQkJX19mdW5jX18sIHJlY3ZfYnVmLT5jaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNDUsNyArMjc5LDcgQEAKIAlpbnQgcmV0dXJuX2xlbjsKIAogCWlmIChyZWN2X2J1Zi0+dmVyc2lvbiAhPSBQUzNBVl9WRVJTSU9OKSB7Ci0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAicmVwbHlfcGFja2V0IGludmFsaWQgdmVyc2lvbjoleFxuIiwKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgInJlcGx5X3BhY2tldCBpbnZhbGlkIHZlcnNpb246JXhcbiIsCiAJCQlyZWN2X2J1Zi0+dmVyc2lvbik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTI2NywxNiArMzAxLDExIEBACiAJCSBzdHJ1Y3QgcHMzYXZfc2VuZF9oZHIgKmJ1ZikKIHsKIAlpbnQgcmVzID0gMDsKLQlzdGF0aWMgdW5pb24gewotCQlzdHJ1Y3QgcHMzYXZfcmVwbHlfaGRyIHJlcGx5X2hkcjsKLQkJdTggcmF3W1BTM0FWX0JVRl9TSVpFXTsKLQl9IHJlY3ZfYnVmOwotCiAJdTMyICp0YWJsZTsKIAotCUJVR19PTighcHMzYXYuYXZhaWxhYmxlKTsKKwlCVUdfT04oIXBzM2F2KTsKIAotCW11dGV4X2xvY2soJnBzM2F2Lm11dGV4KTsKKwltdXRleF9sb2NrKCZwczNhdi0+bXV0ZXgpOwogCiAJdGFibGUgPSBwczNhdl9zZWFyY2hfY21kX3RhYmxlKGNpZCwgUFMzQVZfQ0lEX01BU0spOwogCUJVR19PTighdGFibGUpOwpAQCAtMjg4LDcgKzMxNyw3IEBACiAJcHMzYXZfc2V0X2hkcihjaWQsIHNlbmRfbGVuLCBidWYpOwogCiAJLyogc2VuZCBwYWNrZXQgdmlhIHZ1YXJ0ICovCi0JcmVzID0gcHMzYXZfc2VuZF9jbWRfcGt0KGJ1ZiwgJnJlY3ZfYnVmLnJlcGx5X2hkciwgc2VuZF9sZW4sCisJcmVzID0gcHMzYXZfc2VuZF9jbWRfcGt0KGJ1ZiwgJnBzM2F2LT5yZWN2X2J1Zi5yZXBseV9oZHIsIHNlbmRfbGVuLAogCQkJCSB1c3JfYnVmX3NpemUpOwogCWlmIChyZXMgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtMjk4LDcgKzMyNyw3IEBACiAJfQogCiAJLyogcHJvY2VzcyByZXBseSBwYWNrZXQgKi8KLQlyZXMgPSBwczNhdl9wcm9jZXNzX3JlcGx5X3BhY2tldChidWYsICZyZWN2X2J1Zi5yZXBseV9oZHIsCisJcmVzID0gcHMzYXZfcHJvY2Vzc19yZXBseV9wYWNrZXQoYnVmLCAmcHMzYXYtPnJlY3ZfYnVmLnJlcGx5X2hkciwKIAkJCQkJIHVzcl9idWZfc2l6ZSk7CiAJaWYgKHJlcyA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogcHV0X3JldHVybl9zdGF0dXMoKSBmYWlsZWQgKHJlc3VsdD0lZClcbiIsCkBAIC0zMDYsMTEgKzMzNSwxMSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKKwltdXRleF91bmxvY2soJnBzM2F2LT5tdXRleCk7CiAJcmV0dXJuIDA7CiAKICAgICAgIGVycjoKLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKKwltdXRleF91bmxvY2soJnBzM2F2LT5tdXRleCk7CiAJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIGNpZDoleCByZXM6JWRcbiIsIF9fZnVuY19fLCBjaWQsIHJlcyk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTMxOSwxMSArMzQ4LDExIEBACiB7CiAJaW50IGksIG51bV9vZl9hdl9wb3J0LCByZXM7CiAKLQludW1fb2ZfYXZfcG9ydCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKwotCQkJIHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CisJbnVtX29mX2F2X3BvcnQgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCQkgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CiAJLyogdmlkZW8gbXV0ZSBvbiAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfYXZfcG9ydDsgaSsrKSB7Ci0JCXJlcyA9IHBzM2F2X2NtZF9hdl92aWRlb19tdXRlKDEsICZwczNhdi5hdl9wb3J0W2ldLCBtdXRlKTsKKwkJcmVzID0gcHMzYXZfY21kX2F2X3ZpZGVvX211dGUoMSwgJnBzM2F2LT5hdl9wb3J0W2ldLCBtdXRlKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzM1LDEzICszNjQsMTMgQEAKIHsKIAlpbnQgaSwgbnVtX29mX2hkbWlfcG9ydCwgbnVtX29mX2F2X3BvcnQsIHJlczsKIAotCW51bV9vZl9oZG1pX3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pOwotCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCi0JCQkgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKKwludW1fb2ZfaGRtaV9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWk7CisJbnVtX29mX2F2X3BvcnQgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCQkgcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CiAKIAkvKiB0diBtdXRlICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9vZl9oZG1pX3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXZfdHZfbXV0ZShwczNhdi5hdl9wb3J0W2ldLAorCQlyZXMgPSBwczNhdl9jbWRfYXZfdHZfbXV0ZShwczNhdi0+YXZfcG9ydFtpXSwKIAkJCQkJICAgUFMzQVZfQ01EX01VVEVfT04pOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiAtMTsKQEAgLTM1MCwxMSArMzc5LDExIEBACiAKIAkvKiB2aWRlbyBtdXRlIG9uICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9vZl9hdl9wb3J0OyBpKyspIHsKLQkJcmVzID0gcHMzYXZfY21kX2F2X3ZpZGVvX2Rpc2FibGVfc2lnKHBzM2F2LmF2X3BvcnRbaV0pOworCQlyZXMgPSBwczNhdl9jbWRfYXZfdmlkZW9fZGlzYWJsZV9zaWcocHMzYXYtPmF2X3BvcnRbaV0pOwogCQlpZiAocmVzIDwgMCkKIAkJCXJldHVybiAtMTsKIAkJaWYgKGkgPCBudW1fb2ZfaGRtaV9wb3J0KSB7Ci0JCQlyZXMgPSBwczNhdl9jbWRfYXZfdHZfbXV0ZShwczNhdi5hdl9wb3J0W2ldLAorCQkJcmVzID0gcHMzYXZfY21kX2F2X3R2X211dGUocHMzYXYtPmF2X3BvcnRbaV0sCiAJCQkJCQkgICBQUzNBVl9DTURfTVVURV9PRkYpOwogCQkJaWYgKHJlcyA8IDApCiAJCQkJcmV0dXJuIC0xOwpAQCAtMzY5LDE3ICszOTgsMTcgQEAKIHsKIAlpbnQgaSwgbnVtX29mX2F2X3BvcnQsIG51bV9vZl9vcHRfcG9ydCwgcmVzOwogCi0JbnVtX29mX2F2X3BvcnQgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJCSBwczNhdi5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOwotCW51bV9vZl9vcHRfcG9ydCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX3NwZGlmOworCW51bV9vZl9hdl9wb3J0ID0gcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKworCQkJIHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9hdm11bHRpOworCW51bV9vZl9vcHRfcG9ydCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9zcGRpZjsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfYXZfcG9ydDsgaSsrKSB7Ci0JCXJlcyA9IHBzM2F2X2NtZF9hdl9hdWRpb19tdXRlKDEsICZwczNhdi5hdl9wb3J0W2ldLCBtdXRlKTsKKwkJcmVzID0gcHMzYXZfY21kX2F2X2F1ZGlvX211dGUoMSwgJnBzM2F2LT5hdl9wb3J0W2ldLCBtdXRlKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBudW1fb2Zfb3B0X3BvcnQ7IGkrKykgewotCQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fbXV0ZSgxLCAmcHMzYXYub3B0X3BvcnRbaV0sIG11dGUpOworCQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fbXV0ZSgxLCAmcHMzYXYtPm9wdF9wb3J0W2ldLCBtdXRlKTsKIAkJaWYgKHJlcyA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzk0LDQwICs0MjMsNDAgQEAKIAlzdHJ1Y3QgcHMzYXZfcGt0X2F1ZGlvX21vZGUgYXVkaW9fbW9kZTsKIAl1MzIgbGVuID0gMDsKIAotCW51bV9vZl9hdWRpbyA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWkgKwotCQkgICAgICAgcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aSArCi0JCSAgICAgICBwczNhdi5hdl9od19jb25mLm51bV9vZl9zcGRpZjsKKwludW1fb2ZfYXVkaW8gPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaSArCisJCSAgICAgICBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aSArCisJCSAgICAgICBwczNhdi0+YXZfaHdfY29uZi5udW1fb2Zfc3BkaWY7CiAKIAlhdmJfcGFyYW0ubnVtX29mX3ZpZGVvX3BrdCA9IDA7CiAJYXZiX3BhcmFtLm51bV9vZl9hdWRpb19wa3QgPSBQUzNBVl9BVkJfTlVNX0FVRElPOwkvKiBhbHdheXMgMCAqLwogCWF2Yl9wYXJhbS5udW1fb2ZfYXZfdmlkZW9fcGt0ID0gMDsKLQlhdmJfcGFyYW0ubnVtX29mX2F2X2F1ZGlvX3BrdCA9IHBzM2F2LmF2X2h3X2NvbmYubnVtX29mX2hkbWk7CisJYXZiX3BhcmFtLm51bV9vZl9hdl9hdWRpb19wa3QgPSBwczNhdi0+YXZfaHdfY29uZi5udW1fb2ZfaGRtaTsKIAotCXZpZCA9IHZpZGVvX21vZGVfdGFibGVbcHMzYXYucHMzYXZfbW9kZV0udmlkOworCXZpZCA9IHZpZGVvX21vZGVfdGFibGVbcHMzYXYtPnBzM2F2X21vZGVdLnZpZDsKIAogCS8qIGF1ZGlvIG11dGUgKi8KIAlwczNhdl9zZXRfYXVkaW9fbXV0ZShQUzNBVl9DTURfTVVURV9PTik7CiAKIAkvKiBhdWRpbyBpbmFjdGl2ZSAqLwotCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19hY3RpdmUoMCwgcHMzYXYuYXVkaW9fcG9ydCk7CisJcmVzID0gcHMzYXZfY21kX2F1ZGlvX2FjdGl2ZSgwLCBwczNhdi0+YXVkaW9fcG9ydCk7CiAJaWYgKHJlcyA8IDApCi0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLAorCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJInBzM2F2X2NtZF9hdWRpb19hY3RpdmUgT0ZGIGZhaWxlZFxuIik7CiAKIAkvKiBhdWRpb19wa3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2F1ZGlvOyBpKyspIHsKLQkJcHMzYXZfY21kX3NldF9hdWRpb19tb2RlKCZhdWRpb19tb2RlLCBwczNhdi5hdl9wb3J0W2ldLCBjaCwgZnMsCi0JCQkJCSB3b3JkX2JpdHMsIGZvcm1hdCwgc291cmNlKTsKLQkJaWYgKGkgPCBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pKSB7CisJCXBzM2F2X2NtZF9zZXRfYXVkaW9fbW9kZSgmYXVkaW9fbW9kZSwgcHMzYXYtPmF2X3BvcnRbaV0sIGNoLAorCQkJCQkgZnMsIHdvcmRfYml0cywgZm9ybWF0LCBzb3VyY2UpOworCQlpZiAoaSA8IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pKSB7CiAJCQkvKiBoZG1pIG9ubHkgKi8KIAkJCWxlbiArPSBwczNhdl9jbWRfc2V0X2F2X2F1ZGlvX3BhcmFtKCZhdmJfcGFyYW0uYnVmW2xlbl0sCi0JCQkJCQkJICAgIHBzM2F2LmF2X3BvcnRbaV0sCisJCQkJCQkJICAgIHBzM2F2LT5hdl9wb3J0W2ldLAogCQkJCQkJCSAgICAmYXVkaW9fbW9kZSwgdmlkKTsKIAkJfQogCQkvKiBhdWRpb19tb2RlIHBrdCBzaG91bGQgYmUgc2VudCBzZXBhcmF0ZWx5ICovCiAJCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19tb2RlKCZhdWRpb19tb2RlKTsKIAkJaWYgKHJlcyA8IDApCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJInBzM2F2X2NtZF9hdWRpb19tb2RlIGZhaWxlZCwgcG9ydDoleFxuIiwgaSk7CiAJfQogCkBAIC00MzUsMTUgKzQ2NCwxNiBAQAogCWxlbiArPSBvZmZzZXRvZihzdHJ1Y3QgcHMzYXZfcGt0X2F2Yl9wYXJhbSwgYnVmKTsKIAlyZXMgPSBwczNhdl9jbWRfYXZiX3BhcmFtKCZhdmJfcGFyYW0sIGxlbik7CiAJaWYgKHJlcyA8IDApCi0JCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAicHMzYXZfY21kX2F2Yl9wYXJhbSBmYWlsZWRcbiIpOworCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLCAicHMzYXZfY21kX2F2Yl9wYXJhbSBmYWlsZWRcbiIpOwogCiAJLyogYXVkaW8gbXV0ZSAqLwogCXBzM2F2X3NldF9hdWRpb19tdXRlKFBTM0FWX0NNRF9NVVRFX09GRik7CiAKIAkvKiBhdWRpbyBhY3RpdmUgKi8KLQlyZXMgPSBwczNhdl9jbWRfYXVkaW9fYWN0aXZlKDEsIHBzM2F2LmF1ZGlvX3BvcnQpOworCXJlcyA9IHBzM2F2X2NtZF9hdWRpb19hY3RpdmUoMSwgcHMzYXYtPmF1ZGlvX3BvcnQpOwogCWlmIChyZXMgPCAwKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInBzM2F2X2NtZF9hdWRpb19hY3RpdmUgT04gZmFpbGVkXG4iKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwKKwkJCSJwczNhdl9jbWRfYXVkaW9fYWN0aXZlIE9OIGZhaWxlZFxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1Niw3ICs0ODYsNyBAQAogCXBzM2F2X3NldF9hdl92aWRlb19tdXRlKFBTM0FWX0NNRF9NVVRFX09OKTsKIAogCS8qIHdha2UgdXAgcHMzYXZkIHRvIGRvIHRoZSBhY3R1YWwgdmlkZW8gbW9kZSBzZXR0aW5nICovCi0JcXVldWVfd29yayhwczNhdi53cSwgJnBzM2F2LndvcmspOworCXF1ZXVlX3dvcmsocHMzYXYtPndxLCAmcHMzYXYtPndvcmspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NzMsOCArNTAzLDggQEAKIAogCWF2Yl9wYXJhbS5udW1fb2ZfdmlkZW9fcGt0ID0gUFMzQVZfQVZCX05VTV9WSURFTzsJLyogbnVtIG9mIGhlYWQgKi8KIAlhdmJfcGFyYW0ubnVtX29mX2F1ZGlvX3BrdCA9IDA7Ci0JYXZiX3BhcmFtLm51bV9vZl9hdl92aWRlb19wa3QgPSBwczNhdi5hdl9od19jb25mLm51bV9vZl9oZG1pICsKLQkJCQkJcHMzYXYuYXZfaHdfY29uZi5udW1fb2ZfYXZtdWx0aTsKKwlhdmJfcGFyYW0ubnVtX29mX2F2X3ZpZGVvX3BrdCA9IHBzM2F2LT5hdl9od19jb25mLm51bV9vZl9oZG1pICsKKwkJCQkJcHMzYXYtPmF2X2h3X2NvbmYubnVtX29mX2F2bXVsdGk7CiAJYXZiX3BhcmFtLm51bV9vZl9hdl9hdWRpb19wa3QgPSAwOwogCiAJLyogdmlkZW8gc2lnbmFsIG9mZiAqLwpAQCAtNDg0LDIxICs1MTQsMjEgQEAKIAlpZiAoaWQgJiBQUzNBVl9NT0RFX0hEQ1BfT0ZGKSB7CiAJCXJlcyA9IHBzM2F2X2NtZF9hdl9oZG1pX21vZGUoUFMzQVZfQ01EX0FWX0hETUlfSERDUF9PRkYpOwogCQlpZiAocmVzID09IFBTM0FWX1NUQVRVU19VTlNVUFBPUlRFRF9IRE1JX01PREUpCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgIk5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgIk5vdCBzdXBwb3J0ZWRcbiIpOwogCQllbHNlIGlmIChyZXMpCi0JCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwKKwkJCWRldl9kYmcoJnBzM2F2LT5kZXYtPmNvcmUsCiAJCQkJInBzM2F2X2NtZF9hdl9oZG1pX21vZGUgZmFpbGVkXG4iKTsKIAl9IGVsc2UgaWYgKG9sZF9pZCAmIFBTM0FWX01PREVfSERDUF9PRkYpIHsKIAkJcmVzID0gcHMzYXZfY21kX2F2X2hkbWlfbW9kZShQUzNBVl9DTURfQVZfSERNSV9NT0RFX05PUk1BTCk7CiAJCWlmIChyZXMgPCAwICYmIHJlcyAhPSBQUzNBVl9TVEFUVVNfVU5TVVBQT1JURURfSERNSV9NT0RFKQotCQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsCisJCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLAogCQkJCSJwczNhdl9jbWRfYXZfaGRtaV9tb2RlIGZhaWxlZFxuIik7CiAJfQogCiAJLyogdmlkZW9fcGt0ICovCiAJZm9yIChpID0gMDsgaSA8IGF2Yl9wYXJhbS5udW1fb2ZfdmlkZW9fcGt0OyBpKyspCiAJCWxlbiArPSBwczNhdl9jbWRfc2V0X3ZpZGVvX21vZGUoJmF2Yl9wYXJhbS5idWZbbGVuXSwKLQkJCQkJCXBzM2F2LmhlYWRbaV0sIHZpZGVvX21vZGUtPnZpZCwKKwkJCQkJCXBzM2F2LT5oZWFkW2ldLCB2aWRlb19tb2RlLT52aWQsCiAJCQkJCQl2aWRlb19tb2RlLT5mbXQsIGlkKTsKIAkvKiBhdl92aWRlb19wa3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYXZiX3BhcmFtLm51bV9vZl9hdl92aWRlb19wa3Q7IGkrKykgewpAQCAtNTA3LDEyICs1MzcsMTIgQEAKIAkJZWxzZQogCQkJYXZfdmlkZW9fY3MgPSB2aWRlb19tb2RlLT5jczsKICNpZm5kZWYgUFMzQVZfSERNSV9ZVVYKLQkJaWYgKHBzM2F2LmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzAgfHwKLQkJICAgIHBzM2F2LmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzEpCisJCWlmIChwczNhdi0+YXZfcG9ydFtpXSA9PSBQUzNBVl9DTURfQVZQT1JUX0hETUlfMCB8fAorCQkgICAgcHMzYXYtPmF2X3BvcnRbaV0gPT0gUFMzQVZfQ01EX0FWUE9SVF9IRE1JXzEpCiAJCQlhdl92aWRlb19jcyA9IFJHQjg7CS8qIHVzZSBSR0IgZm9yIEhETUkgKi8KICNlbmRpZgogCQlsZW4gKz0gcHMzYXZfY21kX3NldF9hdl92aWRlb19jcygmYXZiX3BhcmFtLmJ1ZltsZW5dLAotCQkJCQkJIHBzM2F2LmF2X3BvcnRbaV0sCisJCQkJCQkgcHMzYXYtPmF2X3BvcnRbaV0sCiAJCQkJCQkgdmlkZW9fbW9kZS0+dmlkLCBhdl92aWRlb19jcywKIAkJCQkJCSB2aWRlb19tb2RlLT5hc3BlY3QsIGlkKTsKIAl9CkBAIC01MjQsNyArNTU0LDcgQEAKIAkJICAgICAgICIlczogQ29tbWFuZCBmYWlsZWQuIFBsZWFzZSB0cnkgeW91ciByZXF1ZXN0IGFnYWluLiBcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CiAJZWxzZSBpZiAocmVzKQotCQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKKwkJZGV2X2RiZygmcHMzYXYtPmRldi0+Y29yZSwgInBzM2F2X2NtZF9hdmJfcGFyYW0gZmFpbGVkXG4iKTsKIAogCW1zbGVlcCgxNTAwKTsKIAkvKiBhdiB2aWRlbyBtdXRlICovCkBAIC01MzMsOCArNTYzLDggQEAKIAogc3RhdGljIHZvaWQgcHMzYXZkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlwczNhdl9zZXRfdmlkZW9tb2RlX2NvbnQocHMzYXYucHMzYXZfbW9kZSwgcHMzYXYucHMzYXZfbW9kZV9vbGQpOwotCWNvbXBsZXRlKCZwczNhdi5kb25lKTsKKwlwczNhdl9zZXRfdmlkZW9tb2RlX2NvbnQocHMzYXYtPnBzM2F2X21vZGUsIHBzM2F2LT5wczNhdl9tb2RlX29sZCk7CisJY29tcGxldGUoJnBzM2F2LT5kb25lKTsKIH0KIAogc3RhdGljIGludCBwczNhdl92aWQydGFibGVfaWQoaW50IHZpZCkKQEAgLTYwMSw3ICs2MzEsNyBAQAogCQlyZXR1cm4gdmlkOwogCX0KIAotCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCisJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCiAJCXZpZCA9IFBTM0FWX0RFRkFVTFRfSERNSV9WSURfUkVHXzYwOwogCWVsc2UKIAkJdmlkID0gUFMzQVZfREVGQVVMVF9IRE1JX1ZJRF9SRUdfNTA7CkBAIC02NDMsMTYgKzY3MywxNiBAQAogCQl2aWQgPSBQUzNBVl9ERUZBVUxUX0RWSV9WSUQ7CiAJfSBlbHNlIGlmICh2aWQgPT0gLTEpIHsKIAkJLyogbm8gSERNSSBpbnRlcmZhY2Ugb3IgSERNSSBpcyBvZmYgKi8KLQkJaWYgKHBzM2F2LnJlZ2lvbiAmIFBTM0FWX1JFR0lPTl82MCkKKwkJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApCiAJCQl2aWQgPSBQUzNBVl9ERUZBVUxUX0FWTVVMVElfVklEX1JFR182MDsKIAkJZWxzZQogCQkJdmlkID0gUFMzQVZfREVGQVVMVF9BVk1VTFRJX1ZJRF9SRUdfNTA7Ci0JCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fUkdCKQorCQlpZiAocHMzYXYtPnJlZ2lvbiAmIFBTM0FWX1JFR0lPTl9SR0IpCiAJCQlyZ2IgPSBQUzNBVl9NT0RFX1JHQjsKIAl9IGVsc2UgaWYgKGJvb3QpIHsKIAkJLyogSERNSTogdXNpbmcgREVGQVVMVCBIRE1JX1ZJRCB3aGlsZSBib290aW5nIHVwICovCiAJCWluZm8gPSAmbW9uaXRvcl9pbmZvLmluZm87Ci0JCWlmIChwczNhdi5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApIHsKKwkJaWYgKHBzM2F2LT5yZWdpb24gJiBQUzNBVl9SRUdJT05fNjApIHsKIAkJCWlmIChpbmZvLT5yZXNfNjAucmVzX2JpdHMgJiBQUzNBVl9SRVNCSVRfNzIweDQ4MFApCiAJCQkJdmlkID0gUFMzQVZfREVGQVVMVF9IRE1JX1ZJRF9SRUdfNjA7CiAJCQllbHNlIGlmIChpbmZvLT5yZXNfNTAucmVzX2JpdHMgJiBQUzNBVl9SRVNCSVRfNzIweDU3NlApCkBAIC03MTUsMTQgKzc0NSwxNCBAQAogCiAJc2l6ZSA9IEFSUkFZX1NJWkUodmlkZW9fbW9kZV90YWJsZSk7CiAJaWYgKChpZCAmIFBTM0FWX01PREVfTUFTSykgPiBzaXplIC0gMSB8fCBpZCA8IDApIHsKLQkJZGV2X2RiZygmcHMzYXZfZGV2LmNvcmUsICIlczogZXJyb3IgaWQgOiVkXG4iLCBfX2Z1bmNfXywgaWQpOworCQlkZXZfZGJnKCZwczNhdi0+ZGV2LT5jb3JlLCAiJXM6IGVycm9yIGlkIDolZFxuIiwgX19mdW5jX18sIGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogYXV0byBtb2RlICovCiAJb3B0aW9uID0gaWQgJiB+UFMzQVZfTU9ERV9NQVNLOwogCWlmICgoaWQgJiBQUzNBVl9NT0RFX01BU0spID09IDApIHsKLQkJaWQgPSBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYuYXZfaHdfY29uZiwgYm9vdCk7CisJCWlkID0gcHMzYXZfYXV0b192aWRlb21vZGUoJnBzM2F2LT5hdl9od19jb25mLCBib290KTsKIAkJaWYgKGlkIDwgMSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBpZCA6JWRcbiIsIF9fZnVuY19fLCBpZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTczMSwxMSArNzYxLDExIEBACiAJfQogCiAJLyogc2V0IHZpZGVvbW9kZSAqLwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBzM2F2LmRvbmUpOwotCXBzM2F2LnBzM2F2X21vZGVfb2xkID0gcHMzYXYucHMzYXZfbW9kZTsKLQlwczNhdi5wczNhdl9tb2RlID0gaWQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcHMzYXYtPmRvbmUpOworCXBzM2F2LT5wczNhdl9tb2RlX29sZCA9IHBzM2F2LT5wczNhdl9tb2RlOworCXBzM2F2LT5wczNhdl9tb2RlID0gaWQ7CiAJaWYgKHBzM2F2X3NldF92aWRlb21vZGUoKSkKLQkJcHMzYXYucHMzYXZfbW9kZSA9IHBzM2F2LnBzM2F2X21vZGVfb2xkOworCQlwczNhdi0+cHMzYXZfbW9kZSA9IHBzM2F2LT5wczNhdl9tb2RlX29sZDsKIAogCXJldHVybiAwOwogfQpAQCAtNzQ0LDcgKzc3NCw3IEBACiAKIGludCBwczNhdl9nZXRfYXV0b19tb2RlKGludCBib290KQogewotCXJldHVybiBwczNhdl9hdXRvX3ZpZGVvbW9kZSgmcHMzYXYuYXZfaHdfY29uZiwgYm9vdCk7CisJcmV0dXJuIHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi0+YXZfaHdfY29uZiwgYm9vdCk7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2dldF9hdXRvX21vZGUpOwpAQCAtNzcyLDcgKzgwMiw3IEBACiAKIGludCBwczNhdl9nZXRfbW9kZSh2b2lkKQogewotCXJldHVybiBwczNhdi5wczNhdl9tb2RlOworCXJldHVybiBwczNhdiA/IHBzM2F2LT5wczNhdl9tb2RlIDogMDsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfZ2V0X21vZGUpOwpAQCAtODQyLDgyICs4NzIsNjUgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfYXVkaW9fbXV0ZSk7CiAKLWludCBwczNhdl9kZXZfb3Blbih2b2lkKQordm9pZCBwczNhdl9yZWdpc3Rlcl9mbGlwX2N0bCh2b2lkICgqZmxpcF9jdGwpKGludCBvbiwgdm9pZCAqZGF0YSksCisJCQkgICAgIHZvaWQgKmZsaXBfZGF0YSkKIHsKLQlpbnQgc3RhdHVzID0gMDsKKwltdXRleF9sb2NrKCZwczNhdi0+bXV0ZXgpOworCXBzM2F2LT5mbGlwX2N0bCA9IGZsaXBfY3RsOworCXBzM2F2LT5mbGlwX2RhdGEgPSBmbGlwX2RhdGE7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwpOwogCi0JbXV0ZXhfbG9jaygmcHMzYXYubXV0ZXgpOwotCWlmICghcHMzYXYub3Blbl9jb3VudCsrKSB7Ci0JCXN0YXR1cyA9IGx2MV9ncHVfb3BlbigwKTsKLQkJaWYgKHN0YXR1cykgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbHYxX2dwdV9vcGVuIGZhaWxlZCAlZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJCXBzM2F2Lm9wZW5fY291bnQtLTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKLQotCXJldHVybiBzdGF0dXM7Cit2b2lkIHBzM2F2X2ZsaXBfY3RsKGludCBvbikKK3sKKwltdXRleF9sb2NrKCZwczNhdi0+bXV0ZXgpOworCWlmIChwczNhdi0+ZmxpcF9jdGwpCisJCXBzM2F2LT5mbGlwX2N0bChvbiwgcHMzYXYtPmZsaXBfZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZwczNhdi0+bXV0ZXgpOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNhdl9kZXZfb3Blbik7Ci0KLWludCBwczNhdl9kZXZfY2xvc2Uodm9pZCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCW11dGV4X2xvY2soJnBzM2F2Lm11dGV4KTsKLQlpZiAocHMzYXYub3Blbl9jb3VudCA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEdQVSBhbHJlYWR5IGNsb3NlZFxuIiwgX19mdW5jX18pOwotCQlzdGF0dXMgPSAtMTsKLQl9IGVsc2UgaWYgKCEtLXBzM2F2Lm9wZW5fY291bnQpIHsKLQkJc3RhdHVzID0gbHYxX2dwdV9jbG9zZSgpOwotCQlpZiAoc3RhdHVzKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGx2MV9ncHVfY2xvc2UgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotCX0KLQltdXRleF91bmxvY2soJnBzM2F2Lm11dGV4KTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHBzM2F2X2Rldl9jbG9zZSk7Ci0KLXN0YXRpYyBpbnQgcHMzYXZfcHJvYmUoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNhdl9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlczsKIAl1MzIgaWQ7CiAKLQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgImluaXQgLi4uXG4iKTsKLQlkZXZfZGJnKCZwczNhdl9kZXYuY29yZSwgIiAgdGltZW91dD0lZFxuIiwgdGltZW91dCk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAgdGltZW91dD0lZFxuIiwgdGltZW91dCk7CiAKLQltZW1zZXQoJnBzM2F2LCAwLCBzaXplb2YocHMzYXYpKTsKKwlpZiAocHMzYXYpIHsKKwkJZGV2X2VycigmZGV2LT5jb3JlLCAiT25seSBvbmUgcHMzYXYgZGV2aWNlIGlzIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQogCi0JbXV0ZXhfaW5pdCgmcHMzYXYubXV0ZXgpOwotCXBzM2F2LnBzM2F2X21vZGUgPSAwOwotCXBzM2F2LmRldiA9IGRldjsKLQotCUlOSVRfV09SSygmcHMzYXYud29yaywgcHMzYXZkKTsKLQlpbml0X2NvbXBsZXRpb24oJnBzM2F2LmRvbmUpOwotCWNvbXBsZXRlKCZwczNhdi5kb25lKTsKLQlwczNhdi53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwczNhdmQiKTsKLQlpZiAoIXBzM2F2LndxKQorCXBzM2F2ID0ga3phbGxvYyhzaXplb2YoKnBzM2F2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwczNhdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwczNhdi5hdmFpbGFibGUgPSAxOworCW11dGV4X2luaXQoJnBzM2F2LT5tdXRleCk7CisJcHMzYXYtPnBzM2F2X21vZGUgPSAwOworCXBzM2F2LT5kZXYgPSBkZXY7CisKKwlJTklUX1dPUksoJnBzM2F2LT53b3JrLCBwczNhdmQpOworCWluaXRfY29tcGxldGlvbigmcHMzYXYtPmRvbmUpOworCWNvbXBsZXRlKCZwczNhdi0+ZG9uZSk7CisJcHMzYXYtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInBzM2F2ZCIpOworCWlmICghcHMzYXYtPndxKQorCQlnb3RvIGZhaWw7CisKIAlzd2l0Y2ggKHBzM19vc19hcmVhX2dldF9hdl9tdWx0aV9vdXQoKSkgewogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9OVFNDOgotCQlwczNhdi5yZWdpb24gPSBQUzNBVl9SRUdJT05fNjA7CisJCXBzM2F2LT5yZWdpb24gPSBQUzNBVl9SRUdJT05fNjA7CiAJCWJyZWFrOwogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9QQUxfWUNCQ1I6CiAJY2FzZSBQUzNfUEFSQU1fQVZfTVVMVElfT1VUX1NFQ0FNOgotCQlwczNhdi5yZWdpb24gPSBQUzNBVl9SRUdJT05fNTA7CisJCXBzM2F2LT5yZWdpb24gPSBQUzNBVl9SRUdJT05fNTA7CiAJCWJyZWFrOwogCWNhc2UgUFMzX1BBUkFNX0FWX01VTFRJX09VVF9QQUxfUkdCOgotCQlwczNhdi5yZWdpb24gPSBQUzNBVl9SRUdJT05fNTAgfCBQUzNBVl9SRUdJT05fUkdCOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzUwIHwgUFMzQVZfUkVHSU9OX1JHQjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHMzYXYucmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOworCQlwczNhdi0+cmVnaW9uID0gUFMzQVZfUkVHSU9OXzYwOwogCQlicmVhazsKIAl9CiAKQEAgLTkyNywzOSArOTQwLDQ3IEBACiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBzM2F2X2NtZF9pbml0IGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCSAgICAgICByZXMpOwogCi0JcHMzYXZfZ2V0X2h3X2NvbmYoJnBzM2F2KTsKLQlpZCA9IHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi5hdl9od19jb25mLCAxKTsKLQltdXRleF9sb2NrKCZwczNhdi5tdXRleCk7Ci0JcHMzYXYucHMzYXZfbW9kZSA9IGlkOwotCW11dGV4X3VubG9jaygmcHMzYXYubXV0ZXgpOworCXBzM2F2X2dldF9od19jb25mKHBzM2F2KTsKKwlpZCA9IHBzM2F2X2F1dG9fdmlkZW9tb2RlKCZwczNhdi0+YXZfaHdfY29uZiwgMSk7CisJbXV0ZXhfbG9jaygmcHMzYXYtPm11dGV4KTsKKwlwczNhdi0+cHMzYXZfbW9kZSA9IGlkOworCW11dGV4X3VubG9jaygmcHMzYXYtPm11dGV4KTsKIAotCWRldl9kYmcoJnBzM2F2X2Rldi5jb3JlLCAiaW5pdC4uLmRvbmVcbiIpOworCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCXJldHVybiAwOworCitmYWlsOgorCWtmcmVlKHBzM2F2KTsKKwlwczNhdiA9IE5VTEw7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgcHMzYXZfcmVtb3ZlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzYXZfcmVtb3ZlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlpZiAocHMzYXYuYXZhaWxhYmxlKSB7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWlmIChwczNhdikgewogCQlwczNhdl9jbWRfZmluKCk7Ci0JCWlmIChwczNhdi53cSkKLQkJCWRlc3Ryb3lfd29ya3F1ZXVlKHBzM2F2LndxKTsKLQkJcHMzYXYuYXZhaWxhYmxlID0gMDsKKwkJaWYgKHBzM2F2LT53cSkKKwkJCWRlc3Ryb3lfd29ya3F1ZXVlKHBzM2F2LT53cSk7CisJCWtmcmVlKHBzM2F2KTsKKwkJcHMzYXYgPSBOVUxMOwogCX0KIAorCWRldl9kYmcoJmRldi0+Y29yZSwgIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHMzYXZfc2h1dGRvd24oc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcHMzYXZfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogeworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlwczNhdl9yZW1vdmUoZGV2KTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyIHBzM2F2X2RyaXZlciA9IHsKLQkubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MsCi0JLmNvcmUgPSB7Ci0JCS5uYW1lID0gInBzM19hdiIsCi0JfSwKKwkuY29yZS5tYXRjaF9pZCA9IFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUywKKwkuY29yZS5jb3JlLm5hbWUgPSAicHMzX2F2IiwKIAkucHJvYmUgPSBwczNhdl9wcm9iZSwKIAkucmVtb3ZlID0gcHMzYXZfcmVtb3ZlLAogCS5zaHV0ZG93biA9IHBzM2F2X3NodXRkb3duLApAQCAtOTcyLDYgKzk5Myw4IEBACiAJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1BTM19MVjEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKIAllcnJvciA9IHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3RlcigmcHMzYXZfZHJpdmVyKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCkBAIC05ODAsMjAgKzEwMDMsMjEgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCWVycm9yID0gcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKCZwczNhdl9kZXYpOwotCWlmIChlcnJvcikKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiJXM6IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlciBmYWlsZWQgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZXJyb3IpOwotCisJcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwczNhdl9tb2R1bGVfZXhpdCh2b2lkKQogewotCWRldmljZV91bnJlZ2lzdGVyKCZwczNhdl9kZXYuY29yZSk7CisJcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcigmcHMzYXZfZHJpdmVyKTsKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogfQogCiBzdWJzeXNfaW5pdGNhbGwocHMzYXZfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQocHMzYXZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBTMyBBViBTZXR0aW5ncyBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuIik7CitNT0RVTEVfQUxJQVMoUFMzX01PRFVMRV9BTElBU19BVl9TRVRUSU5HUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BzMy9wczNhdl9jbWQuYyBiL2RyaXZlcnMvcHMzL3BzM2F2X2NtZC5jCmluZGV4IDAxNDVlYTEuLmY3MmY1ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3BzM2F2X2NtZC5jCisrKyBiL2RyaXZlcnMvcHMzL3BzM2F2X2NtZC5jCkBAIC0xNDMsNiArMTQzLDE0IEBACiAJcmV0dXJuIFBTM0FWX0NNRF9BVl9WSURfNDgwUDsKIH0KIAorc3RhdGljIGludCBwczNhdl9oZG1pX3JhbmdlKHZvaWQpCit7CisJaWYgKHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24oMSwgOCwgMCkgPCAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOyAvKiBzdXBwb3J0ZWQgKi8KK30KKwogaW50IHBzM2F2X2NtZF9pbml0KHZvaWQpCiB7CiAJaW50IHJlczsKQEAgLTM1MCw2ICszNTgsMTAgQEAKIAkvKiBzaG91bGQgYmUgc2FtZSBhcyB2aWRlb19tb2RlLnZpZGVvX2NzX291dCAqLwogCWF2X3ZpZGVvX2NzLT5hdl9jc19pbiA9IHBzM2F2X2NzX3ZpZGVvMmF2KFBTM0FWX0NNRF9WSURFT19DU19SR0JfOCk7CiAJYXZfdmlkZW9fY3MtPmJpdGxlbl9vdXQgPSBwczNhdl9jc192aWRlbzJhdl9iaXRsZW4oY3Nfb3V0KTsKKwlpZiAoKGlkICYgUFMzQVZfTU9ERV9XSElURSkgJiYgcHMzYXZfaGRtaV9yYW5nZSgpKQorCQlhdl92aWRlb19jcy0+c3VwZXJfd2hpdGUgPSBQUzNBVl9DTURfQVZfU1VQRVJfV0hJVEVfT047CisJZWxzZSAvKiBkZWZhdWx0IG9mZiAqLworCQlhdl92aWRlb19jcy0+c3VwZXJfd2hpdGUgPSBQUzNBVl9DTURfQVZfU1VQRVJfV0hJVEVfT0ZGOwogCWF2X3ZpZGVvX2NzLT5hc3BlY3QgPSBhc3BlY3Q7CiAJaWYgKGlkICYgUFMzQVZfTU9ERV9ESVRIRVIpIHsKIAkJYXZfdmlkZW9fY3MtPmRpdGhlciA9IFBTM0FWX0NNRF9BVl9ESVRIRVJfT04KQEAgLTM5Miw2ICs0MDQsMTAgQEAKIAl2aWRlb19tb2RlLT5waXRjaCA9IHZpZGVvX21vZGUtPndpZHRoICogNDsJLyogbGluZV9sZW5ndGggKi8KIAl2aWRlb19tb2RlLT52aWRlb19vdXRfZm9ybWF0ID0gUFMzQVZfQ01EX1ZJREVPX09VVF9GT1JNQVRfUkdCXzEyQklUOwogCXZpZGVvX21vZGUtPnZpZGVvX2Zvcm1hdCA9IHBzM2F2X3ZpZGVvX2ZtdF90YWJsZVt2aWRlb19mbXRdLmZvcm1hdDsKKwlpZiAoKGlkICYgUFMzQVZfTU9ERV9DT0xPUikgJiYgcHMzYXZfaGRtaV9yYW5nZSgpKQorCQl2aWRlb19tb2RlLT52aWRlb19jbF9jbnYgPSBQUzNBVl9DTURfVklERU9fQ0xfQ05WX0RJU0FCTEVfTFVUOworCWVsc2UgLyogZGVmYXVsdCBlbmFibGUgKi8KKwkJdmlkZW9fbW9kZS0+dmlkZW9fY2xfY252ID0gUFMzQVZfQ01EX1ZJREVPX0NMX0NOVl9FTkFCTEVfTFVUOwogCXZpZGVvX21vZGUtPnZpZGVvX29yZGVyID0gcHMzYXZfdmlkZW9fZm10X3RhYmxlW3ZpZGVvX2ZtdF0ub3JkZXI7CiAKIAlwcl9kZWJ1ZygiJXM6IHZpZGVvX21vZGU6dmlkOiV4IHdpZHRoOiVkIGhlaWdodDolZCBwaXRjaDolZCBvdXRfZm9ybWF0OiVkIGZvcm1hdDoleCBvcmRlcjoleFxuIiwKQEAgLTg1Miw3ICs4NjgsNyBAQAogewogCWludCByZXM7CiAKLQlwczNmYl9mbGlwX2N0bCgwKTsJLyogZmxpcCBvZmYgKi8KKwlwczNhdl9mbGlwX2N0bCgwKTsJLyogZmxpcCBvZmYgKi8KIAogCS8qIGF2YiBwYWNrZXQgKi8KIAlyZXMgPSBwczNhdl9kb19wa3QoUFMzQVZfQ0lEX0FWQl9QQVJBTSwgc2VuZF9sZW4sIHNpemVvZigqYXZiKSwKQEAgLTg2Niw3ICs4ODIsNyBAQAogCQkJIHJlcyk7CiAKICAgICAgIG91dDoKLQlwczNmYl9mbGlwX2N0bCgxKTsJLyogZmxpcCBvbiAqLworCXBzM2F2X2ZsaXBfY3RsKDEpOwkvKiBmbGlwIG9uICovCiAJcmV0dXJuIHJlczsKIH0KIApAQCAtOTg3LDM0ICsxMDAzLDMgQEAKIAkJfCBQUzNBVl9DTURfQVZfTEFZT1VUXzE3NiBcCiAJCXwgUFMzQVZfQ01EX0FWX0xBWU9VVF8xOTIpCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqIHZ1YXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQT0xMSU5HX0lOVEVSVkFMICAyNQkvKiBpbiBtc2VjICovCi0KLWludCBwczNhdl92dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWludCBlcnJvciA9IHBzM192dWFydF93cml0ZShkZXYsIGJ1Ziwgc2l6ZSk7Ci0JcmV0dXJuIGVycm9yID8gZXJyb3IgOiBzaXplOwotfQotCi1pbnQgcHMzYXZfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKLQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0aW1lb3V0KQotewotCWludCBlcnJvcjsKLQlpbnQgbG9vcGNudCA9IDA7Ci0KLQl0aW1lb3V0ID0gKHRpbWVvdXQgKyBQT0xMSU5HX0lOVEVSVkFMIC0gMSkgLyBQT0xMSU5HX0lOVEVSVkFMOwotCXdoaWxlIChsb29wY250KysgPD0gdGltZW91dCkgewotCQllcnJvciA9IHBzM192dWFydF9yZWFkKGRldiwgYnVmLCBzaXplKTsKLQkJaWYgKCFlcnJvcikKLQkJCXJldHVybiBzaXplOwotCQlpZiAoZXJyb3IgIT0gLUVBR0FJTikgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcHMzX3Z1YXJ0X3JlYWQgZmFpbGVkICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBlcnJvcik7Ci0JCQlyZXR1cm4gZXJyb3I7Ci0JCX0KLQkJbXNsZWVwKFBPTExJTkdfSU5URVJWQUwpOwotCX0KLQlyZXR1cm4gLUVXT1VMREJMT0NLOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzc3Rvcl9saWIuYyBiL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ODI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcHMzL3BzM3N0b3JfbGliLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBQUzMgU3RvcmFnZSBMaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCisgKiBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vbHYxY2FsbC5oPgorI2luY2x1ZGUgPGFzbS9wczNzdG9yLmg+CisKKworc3RhdGljIGludCBwczNzdG9yX3Byb2JlX2FjY2VzcyhzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYpCit7CisJaW50IHJlcywgZXJyb3I7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBuOworCisJaWYgKGRldi0+c2JkLm1hdGNoX2lkID09IFBTM19NQVRDSF9JRF9TVE9SX1JPTSkgeworCQkvKiBzcGVjaWFsIGNhc2U6IENELVJPTSBpcyBhc3N1bWVkIGFsd2F5cyBhY2Nlc3NpYmxlICovCisJCWRldi0+YWNjZXNzaWJsZV9yZWdpb25zID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyb3IgPSAtRVBFUk07CisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3JlZ2lvbnM7IGkrKykgeworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBjaGVja2luZyBhY2Nlc3NpYmlsaXR5IG9mIHJlZ2lvbiAldVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgaSk7CisKKwkJZGV2LT5yZWdpb25faWR4ID0gaTsKKwkJcmVzID0gcHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMoZGV2LCBkZXYtPmJvdW5jZV9scGFyLCAwLCAxLAorCQkJCQkJIDApOworCQlpZiAocmVzKSB7CisJCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlYWQgZmFpbGVkLCAiCisJCQkJInJlZ2lvbiAldSBpcyBub3QgYWNjZXNzaWJsZVxuIiwgX19mdW5jX18sCisJCQkJX19MSU5FX18sIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlZ2lvbiAldSBpcyBhY2Nlc3NpYmxlXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBpKTsKKwkJc2V0X2JpdChpLCAmZGV2LT5hY2Nlc3NpYmxlX3JlZ2lvbnMpOworCisJCS8qIFdlIGNhbiBhY2Nlc3MgYXQgbGVhc3Qgb25lIHJlZ2lvbiAqLworCQllcnJvciA9IDA7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbiA9IGh3ZWlnaHRfbG9uZyhkZXYtPmFjY2Vzc2libGVfcmVnaW9ucyk7CisJaWYgKG4gPiAxKQorCQlkZXZfaW5mbygmZGV2LT5zYmQuY29yZSwKKwkJCSAiJXM6JXU6ICVsdSBhY2Nlc3NpYmxlIHJlZ2lvbnMgZm91bmQuIE9ubHkgdGhlIGZpcnN0ICIKKwkJCSAib25lIHdpbGwgYmUgdXNlZCIsCisJCQkgX19mdW5jX18sIF9fTElORV9fLCBuKTsKKwlkZXYtPnJlZ2lvbl9pZHggPSBfX2ZmcyhkZXYtPmFjY2Vzc2libGVfcmVnaW9ucyk7CisJZGV2X2luZm8oJmRldi0+c2JkLmNvcmUsCisJCSAiRmlyc3QgYWNjZXNzaWJsZSByZWdpb24gaGFzIGluZGV4ICV1IHN0YXJ0ICVsdSBzaXplICVsdVxuIiwKKwkJIGRldi0+cmVnaW9uX2lkeCwgZGV2LT5yZWdpb25zW2Rldi0+cmVnaW9uX2lkeF0uc3RhcnQsCisJCSBkZXYtPnJlZ2lvbnNbZGV2LT5yZWdpb25faWR4XS5zaXplKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICoJcHMzc3Rvcl9zZXR1cCAtIFNldHVwIGEgc3RvcmFnZSBkZXZpY2UgYmVmb3JlIHVzZQorICoJQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UKKyAqCUBoYW5kbGVyOiBQb2ludGVyIHRvIGFuIGludGVycnVwdCBoYW5kbGVyCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCBvciBhbiBlcnJvciBjb2RlCisgKi8KK2ludCBwczNzdG9yX3NldHVwKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldiwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCWludCBlcnJvciwgcmVzLCBhbGlnbm1lbnQ7CisJZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSBwYWdlX3NpemU7CisKKwllcnJvciA9IHBzM19vcGVuX2h2X2RldmljZSgmZGV2LT5zYmQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLAorCQkJIiVzOiV1OiBwczNfb3Blbl9odl9kZXZpY2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBlcnJvcik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnJvciA9IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfc2V0dXAoJmRldi0+c2JkLCBQUzNfQklORElOR19DUFVfQU5ZLAorCQkJCQkJJmRldi0+aXJxKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cCBmYWlsZWQgJWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIGVycm9yKTsKKwkJZ290byBmYWlsX2Nsb3NlX2RldmljZTsKKwl9CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBoYW5kbGVyLCBJUlFGX0RJU0FCTEVELAorCQkJICAgIGRldi0+c2JkLmNvcmUuZHJpdmVyLT5uYW1lLCBkZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXJyb3IpOworCQlnb3RvIGZhaWxfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3k7CisJfQorCisJYWxpZ25tZW50ID0gbWluKF9fZmZzKGRldi0+Ym91bmNlX3NpemUpLAorCQkJX19mZnMoKHVuc2lnbmVkIGxvbmcpZGV2LT5ib3VuY2VfYnVmKSk7CisJaWYgKGFsaWdubWVudCA8IDEyKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IGJvdW5jZSBidWZmZXIgbm90IGFsaWduZWQgKCVseCBhdCAweCVwKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5ib3VuY2Vfc2l6ZSwgZGV2LT5ib3VuY2VfYnVmKTsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisJfSBlbHNlIGlmIChhbGlnbm1lbnQgPCAxNikKKwkJcGFnZV9zaXplID0gUFMzX0RNQV80SzsKKwllbHNlCisJCXBhZ2Vfc2l6ZSA9IFBTM19ETUFfNjRLOworCWRldi0+c2JkLmRfcmVnaW9uID0gJmRldi0+ZG1hX3JlZ2lvbjsKKwlwczNfZG1hX3JlZ2lvbl9pbml0KCZkZXYtPnNiZCwgJmRldi0+ZG1hX3JlZ2lvbiwgcGFnZV9zaXplLAorCQkJICAgIFBTM19ETUFfT1RIRVIsIGRldi0+Ym91bmNlX2J1ZiwgZGV2LT5ib3VuY2Vfc2l6ZSk7CisJcmVzID0gcHMzX2RtYV9yZWdpb25fY3JlYXRlKCZkZXYtPmRtYV9yZWdpb24pOworCWlmIChyZXMpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBjYW5ub3QgY3JlYXRlIERNQSByZWdpb25cbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9mcmVlX2lycTsKKwl9CisKKwlkZXYtPmJvdW5jZV9scGFyID0gcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGRldi0+Ym91bmNlX2J1ZikpOworCWRldi0+Ym91bmNlX2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZkZXYtPnNiZC5jb3JlLCBkZXYtPmJvdW5jZV9idWYsCisJCQkJCSBkZXYtPmJvdW5jZV9zaXplLCBETUFfQklESVJFQ1RJT05BTCk7CisJaWYgKCFkZXYtPmJvdW5jZV9kbWEpIHsKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBtYXAgRE1BIHJlZ2lvbiBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9mcmVlX2RtYTsKKwl9CisKKwllcnJvciA9IHBzM3N0b3JfcHJvYmVfYWNjZXNzKGRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsICIlczoldTogTm8gYWNjZXNzaWJsZSByZWdpb25zIGZvdW5kXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJZ290byBmYWlsX3VubWFwX2RtYTsKKwl9CisJcmV0dXJuIDA7CisKK2ZhaWxfdW5tYXBfZG1hOgorCWRtYV91bm1hcF9zaW5nbGUoJmRldi0+c2JkLmNvcmUsIGRldi0+Ym91bmNlX2RtYSwgZGV2LT5ib3VuY2Vfc2l6ZSwKKwkJCSBETUFfQklESVJFQ1RJT05BTCk7CitmYWlsX2ZyZWVfZG1hOgorCXBzM19kbWFfcmVnaW9uX2ZyZWUoJmRldi0+ZG1hX3JlZ2lvbik7CitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZmFpbF9zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveToKKwlwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koJmRldi0+c2JkLCBkZXYtPmlycSk7CitmYWlsX2Nsb3NlX2RldmljZToKKwlwczNfY2xvc2VfaHZfZGV2aWNlKCZkZXYtPnNiZCk7CitmYWlsOgorCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM3N0b3Jfc2V0dXApOworCisKKy8qKgorICoJcHMzc3Rvcl90ZWFyZG93biAtIFRlYXIgZG93biBhIHN0b3JhZ2UgZGV2aWNlIGFmdGVyIHVzZQorICoJQGRldjogUG9pbnRlciB0byBhIHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UKKyAqLwordm9pZCBwczNzdG9yX3RlYXJkb3duKHN0cnVjdCBwczNfc3RvcmFnZV9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyb3I7CisKKwlkbWFfdW5tYXBfc2luZ2xlKCZkZXYtPnNiZC5jb3JlLCBkZXYtPmJvdW5jZV9kbWEsIGRldi0+Ym91bmNlX3NpemUsCisJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCXBzM19kbWFfcmVnaW9uX2ZyZWUoJmRldi0+ZG1hX3JlZ2lvbik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWVycm9yID0gcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KCZkZXYtPnNiZCwgZGV2LT5pcnEpOworCWlmIChlcnJvcikKKwkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwKKwkJCSIlczoldTogZGVzdHJveSBldmVudCByZWNlaXZlIHBvcnQgZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBlcnJvcik7CisKKwllcnJvciA9IHBzM19jbG9zZV9odl9kZXZpY2UoJmRldi0+c2JkKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IHBzM19jbG9zZV9odl9kZXZpY2UgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBlcnJvcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNzdG9yX3RlYXJkb3duKTsKKworCisvKioKKyAqCXBzM3N0b3JfcmVhZF93cml0ZV9zZWN0b3JzIC0gcmVhZC93cml0ZSBmcm9tL3RvIGEgc3RvcmFnZSBkZXZpY2UKKyAqCUBkZXY6IFBvaW50ZXIgdG8gYSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlCisgKglAbHBhcjogSFYgbG9naWNhbCBwYXJ0aXRpb24gYWRkcmVzcworICoJQHN0YXJ0X3NlY3RvcjogRmlyc3Qgc2VjdG9yIHRvIHJlYWQvd3JpdGUKKyAqCUBzZWN0b3JzOiBOdW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkL3dyaXRlCisgKglAd3JpdGU6IEZsYWcgaW5kaWNhdGluZyB3cml0ZSAobm9uLXplcm8pIG9yIHJlYWQgKHplcm8pCisgKgorICoJUmV0dXJucyAwIGZvciBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gc3VibWl0IHRoZSBjb21tYW5kLCBvcgorICoJYW4gTFYxIHN0YXR1cyB2YWx1ZSBpbiBjYXNlIG9mIG90aGVyIGVycm9ycworICovCit1NjQgcHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LCB1NjQgbHBhciwKKwkJCSAgICAgICB1NjQgc3RhcnRfc2VjdG9yLCB1NjQgc2VjdG9ycywgaW50IHdyaXRlKQoreworCXVuc2lnbmVkIGludCByZWdpb25faWQgPSBkZXYtPnJlZ2lvbnNbZGV2LT5yZWdpb25faWR4XS5pZDsKKwljb25zdCBjaGFyICpvcCA9IHdyaXRlID8gIndyaXRlIiA6ICJyZWFkIjsKKwlpbnQgcmVzOworCisJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyAlbHUgc2VjdG9ycyBzdGFydGluZyBhdCAlbHVcbiIsCisJCV9fZnVuY19fLCBfX0xJTkVfXywgb3AsIHNlY3RvcnMsIHN0YXJ0X3NlY3Rvcik7CisKKwlpbml0X2NvbXBsZXRpb24oJmRldi0+ZG9uZSk7CisJcmVzID0gd3JpdGUgPyBsdjFfc3RvcmFnZV93cml0ZShkZXYtPnNiZC5kZXZfaWQsIHJlZ2lvbl9pZCwKKwkJCQkJc3RhcnRfc2VjdG9yLCBzZWN0b3JzLCAwLCBscGFyLAorCQkJCQkmZGV2LT50YWcpCisJCSAgICA6IGx2MV9zdG9yYWdlX3JlYWQoZGV2LT5zYmQuZGV2X2lkLCByZWdpb25faWQsCisJCQkJICAgICAgIHN0YXJ0X3NlY3Rvciwgc2VjdG9ycywgMCwgbHBhciwKKwkJCQkgICAgICAgJmRldi0+dGFnKTsKKwlpZiAocmVzKSB7CisJCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKKwkJCV9fTElORV9fLCBvcCwgcmVzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRldi0+ZG9uZSk7CisJaWYgKGRldi0+bHYxX3N0YXR1cykgeworCQlkZXZfZGJnKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzIGZhaWxlZCAweCVseFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXywgb3AsIGRldi0+bHYxX3N0YXR1cyk7CisJCXJldHVybiBkZXYtPmx2MV9zdGF0dXM7CisJfQorCisJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyBjb21wbGV0ZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJb3ApOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwczNzdG9yX3JlYWRfd3JpdGVfc2VjdG9ycyk7CisKKworLyoqCisgKglwczNzdG9yX3NlbmRfY29tbWFuZCAtIHNlbmQgYSBkZXZpY2UgY29tbWFuZCB0byBhIHN0b3JhZ2UgZGV2aWNlCisgKglAZGV2OiBQb2ludGVyIHRvIGEgc3RydWN0IHBzM19zdG9yYWdlX2RldmljZQorICoJQGNtZDogQ29tbWFuZCBudW1iZXIKKyAqCUBhcmcxOiBGaXJzdCBjb21tYW5kIGFyZ3VtZW50CisgKglAYXJnMjogU2Vjb25kIGNvbW1hbmQgYXJndW1lbnQKKyAqCUBhcmczOiBUaGlyZCBjb21tYW5kIGFyZ3VtZW50CisgKglAYXJnNDogRm91cnRoIGNvbW1hbmQgYXJndW1lbnQKKyAqCisgKglSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC0xIGluIGNhc2Ugb2YgZmFpbHVyZSB0byBzdWJtaXQgdGhlIGNvbW1hbmQsIG9yCisgKglhbiBMVjEgc3RhdHVzIHZhbHVlIGluIGNhc2Ugb2Ygb3RoZXIgZXJyb3JzCisgKi8KK3U2NCBwczNzdG9yX3NlbmRfY29tbWFuZChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIHU2NCBjbWQsIHU2NCBhcmcxLAorCQkJIHU2NCBhcmcyLCB1NjQgYXJnMywgdTY0IGFyZzQpCit7CisJaW50IHJlczsKKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogc2VuZCBkZXZpY2UgY29tbWFuZCAweCVseFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fLCBjbWQpOworCisJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCisJcmVzID0gbHYxX3N0b3JhZ2Vfc2VuZF9kZXZpY2VfY29tbWFuZChkZXYtPnNiZC5kZXZfaWQsIGNtZCwgYXJnMSwKKwkJCQkJICAgICAgYXJnMiwgYXJnMywgYXJnNCwgJmRldi0+dGFnKTsKKwlpZiAocmVzKSB7CisJCWRldl9lcnIoJmRldi0+c2JkLmNvcmUsCisJCQkiJXM6JXU6IHNlbmRfZGV2aWNlX2NvbW1hbmQgMHglbHggZmFpbGVkICVkXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fLCBjbWQsIHJlcyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkZXYtPmRvbmUpOworCWlmIChkZXYtPmx2MV9zdGF0dXMpIHsKKwkJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBjb21tYW5kIDB4JWx4IGZhaWxlZCAweCVseFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgY21kLCBkZXYtPmx2MV9zdGF0dXMpOworCQlyZXR1cm4gZGV2LT5sdjFfc3RhdHVzOworCX0KKworCWRldl9kYmcoJmRldi0+c2JkLmNvcmUsICIlczoldTogY29tbWFuZCAweCVseCBjb21wbGV0ZWRcbiIsIF9fZnVuY19fLAorCQlfX0xJTkVfXywgY21kKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzc3Rvcl9zZW5kX2NvbW1hbmQpOworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFMzIFN0b3JhZ2UgQnVzIExpYnJhcnkiKTsKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29ycG9yYXRpb24iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYyBiL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY0OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXItY29yZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgUFMzIFN5c3RlbSBNYW5hZ2VyIGNvcmUuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBTb255IENvbXB1dGVyIEVudGVydGFpbm1lbnQgSW5jLgorICogIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3BzMy5oPgorCisvKioKKyAqIFN0YXRpY2x5IGxpbmtlZCByb3V0aW5lcyB0aGF0IGFsbG93IGxhdGUgYmluZGluZyBvZiBhIGxvYWRlZCBzeXMtbWFuYWdlcgorICogbW9kdWxlLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcyBwczNfc3lzX21hbmFnZXJfb3BzOworCisvKioKKyAqIHBzM19yZWdpc3Rlcl9zeXNfbWFuYWdlcl9vcHMgLSBCaW5kIHBzM19zeXNfbWFuYWdlcl9vcHMgdG8gYSBtb2R1bGUuCisgKiBAb3BzOiBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcy4KKyAqCisgKiBUbyBiZSBjYWxsZWQgZnJvbSBwczNfc3lzX21hbmFnZXJfcHJvYmUoKSBhbmQgcHMzX3N5c19tYW5hZ2VyX3JlbW92ZSgpIHRvCisgKiByZWdpc3RlciBjYWxsIGJhY2sgb3BzIGZvciBwb3dlciBjb250cm9sLiAgQ29waWVzIGRhdGEgdG8gdGhlIHN0YXRpYworICogdmFyaWFibGUgcHMzX3N5c19tYW5hZ2VyX29wcy4KKyAqLworCit2b2lkIHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMoY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9vcHMgKm9wcykKK3sKKwlCVUdfT04oIW9wcyk7CisJQlVHX09OKCFvcHMtPmRldik7CisJcHMzX3N5c19tYW5hZ2VyX29wcyA9IG9wcyA/ICpvcHMgOiBwczNfc3lzX21hbmFnZXJfb3BzOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3N5c19tYW5hZ2VyX3JlZ2lzdGVyX29wcyk7CisKK3ZvaWQgcHMzX3N5c19tYW5hZ2VyX3Bvd2VyX29mZih2b2lkKQoreworCWlmIChwczNfc3lzX21hbmFnZXJfb3BzLnBvd2VyX29mZikKKwkJcHMzX3N5c19tYW5hZ2VyX29wcy5wb3dlcl9vZmYocHMzX3N5c19tYW5hZ2VyX29wcy5kZXYpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIlN5c3RlbSBIYWx0ZWQsIE9LIHRvIHR1cm4gb2ZmIHBvd2VyXG4iKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKQorCQkodm9pZCkwOworfQorCit2b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpCit7CisJaWYgKHBzM19zeXNfbWFuYWdlcl9vcHMucmVzdGFydCkKKwkJcHMzX3N5c19tYW5hZ2VyX29wcy5yZXN0YXJ0KHBzM19zeXNfbWFuYWdlcl9vcHMuZGV2KTsKKworCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwl3aGlsZSAoMSkKKwkJKHZvaWQpMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLmMgYi9kcml2ZXJzL3BzMy9zeXMtbWFuYWdlci5jCmluZGV4IDNhYTJiMGQuLjg0NjFiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3N5cy1tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy9wczMvc3lzLW1hbmFnZXIuYwpAQCAtMzUsNyArMzUsNyBAQAogLyoqCiAgKiBwczNfc3lzX21hbmFnZXIgLSBQUzMgc3lzdGVtIG1hbmFnZXIgZHJpdmVyLgogICoKLSAqIFRoZSBzeXN0ZW0gbWFuYWdlciBwcm92aWRlcyBhbiBhc3luY3Jvbm91cyBzeXN0ZW0gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBUaGUgc3lzdGVtIG1hbmFnZXIgcHJvdmlkZXMgYW4gYXN5bmNocm9ub3VzIHN5c3RlbSBldmVudCBub3RpZmljYXRpb24KICAqIG1lY2hhbmlzbSBmb3IgcmVwb3J0aW5nIGV2ZW50cyBsaWtlIHRoZXJtYWwgYWxlcnQgYW5kIGJ1dHRvbiBwcmVzc2VzIHRvCiAgKiBndWVzdHMuICBJdCBhbHNvIHByb3ZpZGVzIHN1cHBvcnQgdG8gY29udHJvbCBzeXN0ZW0gc2h1dGRvd24gYW5kIHN0YXJ0dXAuCiAgKgpAQCAtNTIsNiArNTIsNyBAQAogICogQHNpemU6IEhlYWRlciBzaXplIGluIGJ5dGVzLCBjdXJlbnRseSAxNi4KICAqIEBwYXlsb2FkX3NpemU6IE1lc3NhZ2UgcGF5bG9hZCBzaXplIGluIGJ5dGVzLgogICogQHNlcnZpY2VfaWQ6IE1lc3NhZ2UgdHlwZSwgb25lIG9mIGVudW0gcHMzX3N5c19tYW5hZ2VyX3NlcnZpY2VfaWQuCisgKiBAcmVxdWVzdF90YWc6IFVuaXF1ZSBudW1iZXIgdG8gaWRlbnRpZnkgcmVwbHkuCiAgKi8KIAogc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgewpAQCAtNjEsMjkgKzYyLDQ5IEBACiAJdTE2IHJlc2VydmVkXzE7CiAJdTMyIHBheWxvYWRfc2l6ZTsKIAl1MTYgc2VydmljZV9pZDsKLQl1MTYgcmVzZXJ2ZWRfMlszXTsKKwl1MTYgcmVzZXJ2ZWRfMjsKKwl1MzIgcmVxdWVzdF90YWc7CiB9OwogCisjZGVmaW5lIGR1bXBfc21faGVhZGVyKF9oKSBfZHVtcF9zbV9oZWFkZXIoX2gsIF9fZnVuY19fLCBfX0xJTkVfXykKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3NtX2hlYWRlcigKKwljb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciAqaCwgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCit7CisJcHJfZGVidWcoIiVzOiVkOiB2ZXJzaW9uOiAgICAgICV4aFxuIiwgZnVuYywgbGluZSwgaC0+dmVyc2lvbik7CisJcHJfZGVidWcoIiVzOiVkOiBzaXplOiAgICAgICAgICV4aFxuIiwgZnVuYywgbGluZSwgaC0+c2l6ZSk7CisJcHJfZGVidWcoIiVzOiVkOiBwYXlsb2FkX3NpemU6ICV4aFxuIiwgZnVuYywgbGluZSwgaC0+cGF5bG9hZF9zaXplKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHNlcnZpY2VfaWQ6ICAgJXhoXG4iLCBmdW5jLCBsaW5lLCBoLT5zZXJ2aWNlX2lkKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6IHJlcXVlc3RfdGFnOiAgJXhoXG4iLCBmdW5jLCBsaW5lLCBoLT5yZXF1ZXN0X3RhZyk7Cit9CisKIC8qKgotICogQFBTM19TTV9SWF9NU0dfTEVOIC0gU3lzdGVtIG1hbmFnZXIgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguCisgKiBAUFMzX1NNX1JYX01TR19MRU5fTUlOIC0gU2hvcnRlc3QgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGguCisgKiBAUFMzX1NNX1JYX01TR19MRU5fTUFYIC0gTG9uZ2VzdCByZWNlaXZlZCBtZXNzYWdlIGxlbmd0aC4KICAqCi0gKiBDdXJyZW50bHkgYWxsIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHN5c3RlbSBtYW5hZ2VyIGFyZSB0aGUgc2FtZSBsZW5ndGgKLSAqICgxNiBieXRlcyBoZWFkZXIgKyAxNiBieXRlcyBwYXlsb2FkID0gMzIgYnl0ZXMpLiAgVGhpcyBrbm93bGVnZSBpcyB1c2VkIHRvCi0gKiBzaW1wbGlmeSB0aGUgbG9naWMuCisgKiBDdXJyZW50bHkgYWxsIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHN5c3RlbSBtYW5hZ2VyIGFyZSBlaXRoZXIKKyAqICgxNiBieXRlcyBoZWFkZXIgKyA4IGJ5dGVzIHBheWxvYWQgPSAyNCBieXRlcykgb3IgKDE2IGJ5dGVzIGhlYWRlcgorICogKyAxNiBieXRlcyBwYXlsb2FkID0gMzIgYnl0ZXMpLiAgVGhpcyBrbm93bGVnZSBpcyB1c2VkIHRvIHNpbXBsaWZ5CisgKiB0aGUgbG9naWMuCiAgKi8KIAogZW51bSB7Ci0JUFMzX1NNX1JYX01TR19MRU4gPSAzMiwKKwlQUzNfU01fUlhfTVNHX0xFTl9NSU4gPSAyNCwKKwlQUzNfU01fUlhfTVNHX0xFTl9NQVggPSAzMiwKIH07CiAKIC8qKgogICogZW51bSBwczNfc3lzX21hbmFnZXJfc2VydmljZV9pZCAtIE1lc3NhZ2UgaGVhZGVyIHNlcnZpY2VfaWQuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVDogICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfQ09NTUFORDogICAgICBndWVzdCA8LS0gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0U6ICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfU0VUX0FUVFI6ICAgICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfRVhURVJOX0VWRU5UOiBndWVzdCA8LS0gc3lzX21hbmFnZXIuCi0gKiBAUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1A6ICBndWVzdCAtLT4gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVRVUVTVDogICAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1RfRVJST1I6IGd1ZXN0IDwtLSBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9DT01NQU5EOiAgICAgICBndWVzdCA8LS0gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0U6ICAgICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICogQFBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSOiAgICAgIGd1ZXN0IC0tPiBzeXNfbWFuYWdlci4KKyAqIEBQUzNfU01fU0VSVklDRV9JRF9FWFRFUk5fRVZFTlQ6ICBndWVzdCA8LS0gc3lzX21hbmFnZXIuCisgKiBAUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1A6ICAgZ3Vlc3QgLS0+IHN5c19tYW5hZ2VyLgorICoKKyAqIFBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1RfRVJST1IgaXMgcmV0dXJuZWQgZm9yIGludmFsaWQgZGF0YSB2YWx1ZXMgaW4gYQorICogYSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUIG1lc3NhZ2UuICBJdCBhbHNvIHNlZW1zIHRvIGJlIHJldHVybmVkIHdoZW4KKyAqIGEgUkVRVUVTVCBtZXNzYWdlIGlzIHNlbnQgYXQgdGhlIHdyb25nIHRpbWUuCiAgKi8KIAogZW51bSBwczNfc3lzX21hbmFnZXJfc2VydmljZV9pZCB7CkBAIC05Myw2ICsxMTQsNyBAQAogCVBTM19TTV9TRVJWSUNFX0lEX0NPTU1BTkQgPSAzLAogCVBTM19TTV9TRVJWSUNFX0lEX0VYVEVSTl9FVkVOVCA9IDQsCiAJUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1AgPSA1LAorCVBTM19TTV9TRVJWSUNFX0lEX1JFUVVFU1RfRVJST1IgPSA2LAogCVBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSID0gOCwKIH07CiAKQEAgLTE4NSwxMSArMjA3LDIxIEBACiB9OwogCiAvKioKKyAqIHBzM19zbV9mb3JjZV9wb3dlcl9vZmYgLSBQb3dlcm9mZiBoZWxwZXIuCisgKgorICogQSBnbG9iYWwgdmFyaWFibGUgdXNlZCB0byBmb3JjZSBhIHBvd2Vyb2ZmIHdoZW4gdGhlIHBvd2VyIGJ1dHRvbiBoYXMKKyAqIGJlZW4gcHJlc3NlZCBpcnJlc3BlY3RpdmUgb2YgaG93IGluaXQgaGFuZGxlcyB0aGUgY3RybF9hbHRfZGVsIHNpZ25hbC4KKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBwczNfc21fZm9yY2VfcG93ZXJfb2ZmOworCisvKioKICAqIHBzM19zeXNfbWFuYWdlcl93cml0ZSAtIEhlbHBlciB0byB3cml0ZSBhIHR3byBwYXJ0IG1lc3NhZ2UgdG8gdGhlIHZ1YXJ0LgogICoKICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl93cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgKmhlYWRlciwgY29uc3Qgdm9pZCAqcGF5bG9hZCkKIHsKIAlpbnQgcmVzdWx0OwpAQCAtMjEzLDE1ICsyNDUsMTAgQEAKICAqCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfYXR0cihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJZW51bSBwczNfc3lzX21hbmFnZXJfYXR0ciBhdHRyKQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXIgPSB7Ci0JCS52ZXJzaW9uID0gMSwKLQkJLnNpemUgPSAxNiwKLQkJLnBheWxvYWRfc2l6ZSA9IDE2LAotCQkuc2VydmljZV9pZCA9IFBTM19TTV9TRVJWSUNFX0lEX1NFVF9BVFRSLAotCX07CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCB7CiAJCXU4IHZlcnNpb247CiAJCXU4IHJlc2VydmVkXzFbM107CkBAIC0yMzIsNiArMjU5LDEyIEBACiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGF0dHIpOwogCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwloZWFkZXIudmVyc2lvbiA9IDE7CisJaGVhZGVyLnNpemUgPSAxNjsKKwloZWFkZXIucGF5bG9hZF9zaXplID0gMTY7CisJaGVhZGVyLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9TRVRfQVRUUjsKKwogCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKIAlwYXlsb2FkLnZlcnNpb24gPSAxOwogCXBheWxvYWQuYXR0cmlidXRlID0gYXR0cjsKQEAgLTI0NSwxNiArMjc4LDExIEBACiAgKiBUZWxsIHRoZSBzeXN0ZW0gbWFuYWdlciB3aGF0IHRvIGRvIGFmdGVyIHRoaXMgbHBhciBpcyBkZXN0cm95ZWQuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9uZXh0X29wKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfbmV4dF9vcChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJZW51bSBwczNfc3lzX21hbmFnZXJfbmV4dF9vcCBvcCwKIAllbnVtIHBzM19zeXNfbWFuYWdlcl93YWtlX3NvdXJjZSB3YWtlX3NvdXJjZSkKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyID0gewotCQkudmVyc2lvbiA9IDEsCi0JCS5zaXplID0gMTYsCi0JCS5wYXlsb2FkX3NpemUgPSAxNiwKLQkJLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9TRVRfTkVYVF9PUCwKLQl9OworCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgewogCQl1OCB2ZXJzaW9uOwogCQl1OCB0eXBlOwpAQCAtMjY4LDYgKzI5NiwxMiBAQAogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICgleGgpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG9wKTsKIAorCW1lbXNldCgmaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisJaGVhZGVyLnZlcnNpb24gPSAxOworCWhlYWRlci5zaXplID0gMTY7CisJaGVhZGVyLnBheWxvYWRfc2l6ZSA9IDE2OworCWhlYWRlci5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfU0VUX05FWFRfT1A7CisKIAltZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihwYXlsb2FkKSk7CiAJcGF5bG9hZC52ZXJzaW9uID0gMzsKIAlwYXlsb2FkLnR5cGUgPSBvcDsKQEAgLTI4NiwzMiArMzIwLDM1IEBACiAgKiB0aGUgY29tbWFuZCBpcyB0aGVuIGNvbW11bmljYXRlZCBiYWNrIHRvIHRoZSBzeXN0ZW0gbWFuYWdlciB3aXRoIGEgcmVzcG9uc2UKICAqIG1lc3NhZ2UuCiAgKgotICogQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgcmVxdWVzdCBpdCB0aGUgJ3NodXRkb3duIHNlbGYnIHJlcXVlc3QuCisgKiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCByZXF1ZXN0IGlzIHRoZSAnc2h1dGRvd24gc2VsZicgcmVxdWVzdC4KICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX3JlcXVlc3Rfc2h1dGRvd24oc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfc2VuZF9yZXF1ZXN0X3NodXRkb3duKAorCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyID0gewotCQkudmVyc2lvbiA9IDEsCi0JCS5zaXplID0gMTYsCi0JCS5wYXlsb2FkX3NpemUgPSAxNiwKLQkJLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNULAotCX07CisJc3RydWN0IHBzM19zeXNfbWFuYWdlcl9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCB7CiAJCXU4IHZlcnNpb247CiAJCXU4IHR5cGU7CiAJCXU4IGdvc19pZDsKIAkJdTggcmVzZXJ2ZWRfMVsxM107Ci0JfSBzdGF0aWMgY29uc3QgcGF5bG9hZCA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkudHlwZSA9IDEsIC8qIHNodXRkb3duICovCi0JCS5nb3NfaWQgPSAwLCAvKiBzZWxmICovCi0JfTsKKwl9IHBheWxvYWQ7CiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHBheWxvYWQpICE9IDE2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwloZWFkZXIudmVyc2lvbiA9IDE7CisJaGVhZGVyLnNpemUgPSAxNjsKKwloZWFkZXIucGF5bG9hZF9zaXplID0gMTY7CisJaGVhZGVyLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUOworCisJbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOworCXBheWxvYWQudmVyc2lvbiA9IDE7CisJcGF5bG9hZC50eXBlID0gMTsgLyogc2h1dGRvd24gKi8KKwlwYXlsb2FkLmdvc19pZCA9IDA7IC8qIHNlbGYgKi8KKwogCXJldHVybiBwczNfc3lzX21hbmFnZXJfd3JpdGUoZGV2LCAmaGVhZGVyLCAmcGF5bG9hZCk7CiB9CiAKQEAgLTMyMywxNSArMzYwLDEwIEBACiAgKiBmYWlsdXJlIG9mIGEgY29tbWFuZCBzZW50IGJ5IHRoZSBzeXN0ZW0gbWFuYWdlci4KICAqLwogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9zZW5kX3Jlc3BvbnNlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXU2NCBzdGF0dXMpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlciA9IHsKLQkJLnZlcnNpb24gPSAxLAotCQkuc2l6ZSA9IDE2LAotCQkucGF5bG9hZF9zaXplID0gMTYsCi0JCS5zZXJ2aWNlX2lkID0gUFMzX1NNX1NFUlZJQ0VfSURfUkVTUE9OU0UsCi0JfTsKKwlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IHsKIAkJdTggdmVyc2lvbjsKIAkJdTggcmVzZXJ2ZWRfMVszXTsKQEAgLTM0NCw2ICszNzYsMTIgQEAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogKCVzKVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkoc3RhdHVzID8gIm5hayIgOiAiYWNrIikpOwogCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwloZWFkZXIudmVyc2lvbiA9IDE7CisJaGVhZGVyLnNpemUgPSAxNjsKKwloZWFkZXIucGF5bG9hZF9zaXplID0gMTY7CisJaGVhZGVyLnNlcnZpY2VfaWQgPSBQUzNfU01fU0VSVklDRV9JRF9SRVNQT05TRTsKKwogCW1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKIAlwYXlsb2FkLnZlcnNpb24gPSAxOwogCXBheWxvYWQuc3RhdHVzID0gc3RhdHVzOwpAQCAtMzU2LDcgKzM5NCw3IEBACiAgKgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9ldmVudChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfZXZlbnQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQ7CiAJc3RydWN0IHsKQEAgLTM3MCw3ICs0MDgsNyBAQAogCUJVSUxEX0JVR19PTihzaXplb2YoZXZlbnQpICE9IDE2KTsKIAogCXJlc3VsdCA9IHBzM192dWFydF9yZWFkKGRldiwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKLQlCVUdfT04ocmVzdWx0KTsKKwlCVUdfT04ocmVzdWx0ICYmICJuZWVkIHRvIHJldHJ5IGhlcmUiKTsKIAogCWlmIChldmVudC52ZXJzaW9uICE9IDEpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVuc3VwcG9ydGVkIGV2ZW50IHZlcnNpb24gKCV1KVxuIiwKQEAgLTM4MiwxMSArNDIwLDM0IEBACiAJY2FzZSBQUzNfU01fRVZFTlRfUE9XRVJfUFJFU1NFRDoKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFBPV0VSX1BSRVNTRURcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlwczNfc21fZm9yY2VfcG93ZXJfb2ZmID0gMTsKKwkJLyoKKwkJICogQSBtZW1vcnkgYmFycmllciBpcyB1c2UgaGVyZSB0byBzeW5jIG1lbW9yeSBzaW5jZQorCQkgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydCgpIGNvdWxkIGJlIGNhbGxlZCBvbgorCQkgKiBhbm90aGVyIGNwdS4KKwkJICovCisJCXdtYigpOworCQlraWxsX2NhZF9waWQoU0lHSU5ULCAxKTsgLyogY3RybF9hbHRfZGVsICovCiAJCWJyZWFrOwogCWNhc2UgUFMzX1NNX0VWRU5UX1BPV0VSX1JFTEVBU0VEOgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogUE9XRVJfUkVMRUFTRUQgKCV1IG1zKVxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXZlbnQudmFsdWUpOwotCQlraWxsX2NhZF9waWQoU0lHSU5ULCAxKTsKKwkJYnJlYWs7CisJY2FzZSBQUzNfU01fRVZFTlRfUkVTRVRfUFJFU1NFRDoKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IFJFU0VUX1BSRVNTRURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCQlwczNfc21fZm9yY2VfcG93ZXJfb2ZmID0gMDsKKwkJLyoKKwkJICogQSBtZW1vcnkgYmFycmllciBpcyB1c2UgaGVyZSB0byBzeW5jIG1lbW9yeSBzaW5jZQorCQkgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcmVzdGFydCgpIGNvdWxkIGJlIGNhbGxlZCBvbgorCQkgKiBhbm90aGVyIGNwdS4KKwkJICovCisJCXdtYigpOworCQlraWxsX2NhZF9waWQoU0lHSU5ULCAxKTsgLyogY3RybF9hbHRfZGVsICovCisJCWJyZWFrOworCWNhc2UgUFMzX1NNX0VWRU5UX1JFU0VUX1JFTEVBU0VEOgorCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogUkVTRVRfUkVMRUFTRUQgKCV1IG1zKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgZXZlbnQudmFsdWUpOwogCQlicmVhazsKIAljYXNlIFBTM19TTV9FVkVOVF9USEVSTUFMX0FMRVJUOgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogVEhFUk1BTF9BTEVSVCAoem9uZSAldSlcbiIsCkBAIC00MTEsNyArNDcyLDcgQEAKICAqIFRoZSBzeXN0ZW0gbWFuYWdlciBzZW5kcyB0aGlzIGluIHJlcGx5IHRvIGEgJ3JlcXVlc3QnIG1lc3NhZ2UgZnJvbSB0aGUgZ3Vlc3QuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX2NtZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfY21kKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCB7CkBAIC00MjUsNiArNDg2LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCXJlc3VsdCA9IHBzM192dWFydF9yZWFkKGRldiwgJmNtZCwgc2l6ZW9mKGNtZCkpOworCUJVR19PTihyZXN1bHQgJiYgIm5lZWQgdG8gcmV0cnkgaGVyZSIpOwogCiAJaWYocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwpAQCAtNDQ4LDkgKzUxMCwxMCBAQAogLyoqCiAgKiBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyAtIEZpcnN0IHN0YWdlIG1zZyBoYW5kbGVyLgogICoKKyAqIENhbiBiZSBjYWxsZWQgZGlyZWN0bHkgdG8gbWFudWFsbHkgcG9sbCB2dWFydCBhbmQgcHVtcCBtZXNzYWdlIGhhbmRsZXIuCiAgKi8KIAotc3RhdGljIGludCBwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBwczNfc3lzX21hbmFnZXJfaGVhZGVyIGhlYWRlcjsKQEAgLTQ2NCwxMiArNTI3LDE3IEBACiAJaWYgKGhlYWRlci52ZXJzaW9uICE9IDEpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHVuc3VwcG9ydGVkIGhlYWRlciB2ZXJzaW9uICgldSlcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGhlYWRlci52ZXJzaW9uKTsKKwkJZHVtcF9zbV9oZWFkZXIoJmhlYWRlcik7CiAJCWdvdG8gZmFpbF9oZWFkZXI7CiAJfQogCiAJQlVJTERfQlVHX09OKHNpemVvZihoZWFkZXIpICE9IDE2KTsKLQlCVUdfT04oaGVhZGVyLnNpemUgIT0gMTYpOwotCUJVR19PTihoZWFkZXIucGF5bG9hZF9zaXplICE9IDE2KTsKKworCWlmIChoZWFkZXIuc2l6ZSAhPSAxNiB8fCAoaGVhZGVyLnBheWxvYWRfc2l6ZSAhPSA4CisJCSYmIGhlYWRlci5wYXlsb2FkX3NpemUgIT0gMTYpKSB7CisJCWR1bXBfc21faGVhZGVyKCZoZWFkZXIpOworCQlCVUcoKTsKKwl9CiAKIAlzd2l0Y2ggKGhlYWRlci5zZXJ2aWNlX2lkKSB7CiAJY2FzZSBQUzNfU01fU0VSVklDRV9JRF9FWFRFUk5fRVZFTlQ6CkBAIC00NzgsNiArNTQ2LDExIEBACiAJY2FzZSBQUzNfU01fU0VSVklDRV9JRF9DT01NQU5EOgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogQ09NTUFORFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfY21kKGRldik7CisJY2FzZSBQUzNfU01fU0VSVklDRV9JRF9SRVFVRVNUX0VSUk9SOgorCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogUkVRVUVTVF9FUlJPUlxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCWR1bXBfc21faGVhZGVyKCZoZWFkZXIpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdW5rbm93biBzZXJ2aWNlX2lkICgldSlcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGhlYWRlci5zZXJ2aWNlX2lkKTsKQEAgLTQ5NCw2OSArNTY3LDE5IEBACiB9CiAKIC8qKgotICogcHMzX3N5c19tYW5hZ2VyX3dvcmsgLSBBc3luY3Jvbm91cyByZWFkIGhhbmRsZXIuCisgKiBwczNfc3lzX21hbmFnZXJfZmluYWxfcG93ZXJfb2ZmIC0gVGhlIGZpbmFsIHBsYXRmb3JtIG1hY2hpbmVfcG93ZXJfb2ZmIHJvdXRpbmUuCiAgKgotICogU2lnbmFsZWQgd2hlbiBhIGNvbXBsZXRlIG1lc3NhZ2UgYXJyaXZlcyBhdCB0aGUgdnVhcnQgcG9ydC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gcHMzX3Z1YXJ0X3dvcmtfdG9fcG9ydF9kZXZpY2Uod29yayk7Ci0KLQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOwotCXBzM192dWFydF9yZWFkX2FzeW5jKGRldiwgcHMzX3N5c19tYW5hZ2VyX3dvcmssIFBTM19TTV9SWF9NU0dfTEVOKTsKLX0KLQotc3RydWN0IHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXY7Ci19IHN0YXRpYyBkcnZfcHJpdjsKLQotLyoqCi0gKiBwczNfc3lzX21hbmFnZXJfcmVzdGFydCAtIFRoZSBmaW5hbCBwbGF0Zm9ybSBtYWNoaW5lX3Jlc3RhcnQgcm91dGluZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jcm9ub3VzIHZ1YXJ0IHJlYWRzCisgKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jaHJvbm91cyB2dWFydCByZWFkcwogICogdGhlbiBzcGlucyBjYWxsaW5nIHBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKCkgdG8gcmVjZWl2ZSBhbmQgYWNrbm93bGVkZ2UKICAqIHRoZSBzaHV0ZG93biBjb21tYW5kIHNlbnQgZnJvbSB0aGUgc3lzdGVtIG1hbmFnZXIuICBTb29uIGFmdGVyIHRoZQogICogYWNrbm93bGVkZ2VtZW50IGlzIHNlbnQgdGhlIGxwYXIgaXMgZGVzdHJveWVkIGJ5IHRoZSBIVi4gIFRoaXMgcm91dGluZQotICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcHMzX3Jlc3RhcnQoKS4KKyAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHBzM19wb3dlcl9vZmYoKSB0aHJvdWdoCisgKiBwczNfc3lzX21hbmFnZXJfb3BzLnBvd2VyX29mZi4KICAqLwogCi12b2lkIHBzM19zeXNfbWFuYWdlcl9yZXN0YXJ0KHZvaWQpCitzdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfZmluYWxfcG93ZXJfb2ZmKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYgPSBkcnZfcHJpdi5kZXY7Ci0KLQlCVUdfT04oIWRydl9wcml2LmRldik7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQotCXBzM192dWFydF9jYW5jZWxfYXN5bmMoZGV2KTsKLQotCXBzM19zeXNfbWFuYWdlcl9zZW5kX2F0dHIoZGV2LCAwKTsKLQlwczNfc3lzX21hbmFnZXJfc2VuZF9uZXh0X29wKGRldiwgUFMzX1NNX05FWFRfT1BfTFBBUl9SRUJPT1QsCi0JCVBTM19TTV9XQUtFX0RFRkFVTFQpOwotCXBzM19zeXNfbWFuYWdlcl9zZW5kX3JlcXVlc3Rfc2h1dGRvd24oZGV2KTsKLQotCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7Ci0KLQl3aGlsZSgxKQotCQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOwotfQotCi0vKioKLSAqIHBzM19zeXNfbWFuYWdlcl9wb3dlcl9vZmYgLSBUaGUgZmluYWwgcGxhdGZvcm0gbWFjaGluZV9wb3dlcl9vZmYgcm91dGluZS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucy4gIFRoZSByb3V0aW5lIGRpc2FibGVzIGFzeW5jcm9ub3VzIHZ1YXJ0IHJlYWRzCi0gKiB0aGVuIHNwaW5zIGNhbGxpbmcgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coKSB0byByZWNlaXZlIGFuZCBhY2tub3dsZWRnZQotICogdGhlIHNodXRkb3duIGNvbW1hbmQgc2VudCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlci4gIFNvb24gYWZ0ZXIgdGhlCi0gKiBhY2tub3dsZWRnZW1lbnQgaXMgc2VudCB0aGUgbHBhciBpcyBkZXN0cm95ZWQgYnkgdGhlIEhWLiAgVGhpcyByb3V0aW5lCi0gKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBwczNfcG93ZXJfb2ZmKCkuCi0gKi8KLQotdm9pZCBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmKHZvaWQpCi17Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gZHJ2X3ByaXYuZGV2OwotCi0JQlVHX09OKCFkcnZfcHJpdi5kZXYpOworCUJVR19PTighZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCkBAIC01NzIsMzEgKzU5NSw5NyBAQAogCQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOwogfQogCi1zdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9wcm9iZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCisvKioKKyAqIHBzM19zeXNfbWFuYWdlcl9maW5hbF9yZXN0YXJ0IC0gVGhlIGZpbmFsIHBsYXRmb3JtIG1hY2hpbmVfcmVzdGFydCByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBuZXZlciByZXR1cm5zLiAgVGhlIHJvdXRpbmUgZGlzYWJsZXMgYXN5bmNocm9ub3VzIHZ1YXJ0IHJlYWRzCisgKiB0aGVuIHNwaW5zIGNhbGxpbmcgcHMzX3N5c19tYW5hZ2VyX2hhbmRsZV9tc2coKSB0byByZWNlaXZlIGFuZCBhY2tub3dsZWRnZQorICogdGhlIHNodXRkb3duIGNvbW1hbmQgc2VudCBmcm9tIHRoZSBzeXN0ZW0gbWFuYWdlci4gIFNvb24gYWZ0ZXIgdGhlCisgKiBhY2tub3dsZWRnZW1lbnQgaXMgc2VudCB0aGUgbHBhciBpcyBkZXN0cm95ZWQgYnkgdGhlIEhWLiAgVGhpcyByb3V0aW5lCisgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBwczNfcmVzdGFydCgpIHRocm91Z2ggcHMzX3N5c19tYW5hZ2VyX29wcy5yZXN0YXJ0LgorICovCisKK3N0YXRpYyB2b2lkIHBzM19zeXNfbWFuYWdlcl9maW5hbF9yZXN0YXJ0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlpbnQgcmVzdWx0OworCUJVR19PTighZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JQlVHX09OKGRydl9wcml2LmRldik7Ci0JZHJ2X3ByaXYuZGV2ID0gZGV2OworCS8qIENoZWNrIGlmIHdlIGdvdCBoZXJlIHZpYSBhIHBvd2VyIGJ1dHRvbiBldmVudC4gKi8KKworCWlmIChwczNfc21fZm9yY2VfcG93ZXJfb2ZmKSB7CisJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBmb3JjaW5nIHBvd2Vyb2ZmXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Bvd2VyX29mZihkZXYpOworCX0KKworCXBzM192dWFydF9jYW5jZWxfYXN5bmMoZGV2KTsKKworCXBzM19zeXNfbWFuYWdlcl9zZW5kX2F0dHIoZGV2LCAwKTsKKwlwczNfc3lzX21hbmFnZXJfc2VuZF9uZXh0X29wKGRldiwgUFMzX1NNX05FWFRfT1BfTFBBUl9SRUJPT1QsCisJCVBTM19TTV9XQUtFX0RFRkFVTFQpOworCXBzM19zeXNfbWFuYWdlcl9zZW5kX3JlcXVlc3Rfc2h1dGRvd24oZGV2KTsKKworCXByaW50ayhLRVJOX0VNRVJHICJTeXN0ZW0gSGFsdGVkLCBPSyB0byB0dXJuIG9mZiBwb3dlclxuIik7CisKKwl3aGlsZSgxKQorCQlwczNfc3lzX21hbmFnZXJfaGFuZGxlX21zZyhkZXYpOworfQorCisvKioKKyAqIHBzM19zeXNfbWFuYWdlcl93b3JrIC0gQXN5bmNocm9ub3VzIHJlYWQgaGFuZGxlci4KKyAqCisgKiBTaWduYWxlZCB3aGVuIFBTM19TTV9SWF9NU0dfTEVOX01JTiBieXRlcyBhcnJpdmUgYXQgdGhlIHZ1YXJ0IHBvcnQuCisgKi8KKworc3RhdGljIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3dvcmsoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXBzM19zeXNfbWFuYWdlcl9oYW5kbGVfbXNnKGRldik7CisJcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoZGV2LCBQUzNfU01fUlhfTVNHX0xFTl9NSU4pOworfQorCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcyBvcHM7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCW9wcy5wb3dlcl9vZmYgPSBwczNfc3lzX21hbmFnZXJfZmluYWxfcG93ZXJfb2ZmOworCW9wcy5yZXN0YXJ0ID0gcHMzX3N5c19tYW5hZ2VyX2ZpbmFsX3Jlc3RhcnQ7CisJb3BzLmRldiA9IGRldjsKKworCS8qIHBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMgY29waWVzIG9wcy4gKi8KKworCXBzM19zeXNfbWFuYWdlcl9yZWdpc3Rlcl9vcHMoJm9wcyk7CiAKIAlyZXN1bHQgPSBwczNfc3lzX21hbmFnZXJfc2VuZF9hdHRyKGRldiwgUFMzX1NNX0FUVFJfQUxMKTsKIAlCVUdfT04ocmVzdWx0KTsKIAotCXJlc3VsdCA9IHBzM192dWFydF9yZWFkX2FzeW5jKGRldiwgcHMzX3N5c19tYW5hZ2VyX3dvcmssCi0JCVBTM19TTV9SWF9NU0dfTEVOKTsKKwlyZXN1bHQgPSBwczNfdnVhcnRfcmVhZF9hc3luYyhkZXYsIFBTM19TTV9SWF9NU0dfTEVOX01JTik7CiAJQlVHX09OKHJlc3VsdCk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgaW50IHBzM19zeXNfbWFuYWdlcl9yZW1vdmUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwczNfc3lzX21hbmFnZXJfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworfQorCiBzdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciBwczNfc3lzX21hbmFnZXIgPSB7Ci0JLm1hdGNoX2lkID0gUFMzX01BVENIX0lEX1NZU1RFTV9NQU5BR0VSLAotCS5jb3JlID0gewotCQkubmFtZSA9ICJwczNfc3lzX21hbmFnZXIiLAotCX0sCisJLmNvcmUubWF0Y2hfaWQgPSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVIsCisJLmNvcmUuY29yZS5uYW1lID0gInBzM19zeXNfbWFuYWdlciIsCiAJLnByb2JlID0gcHMzX3N5c19tYW5hZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSBwczNfc3lzX21hbmFnZXJfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHBzM19zeXNfbWFuYWdlcl9zaHV0ZG93biwKKwkud29yayA9IHBzM19zeXNfbWFuYWdlcl93b3JrLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHMzX3N5c19tYW5hZ2VyX2luaXQodm9pZCkKQEAgLTYwOCwzICs2OTcsNiBAQAogfQogCiBtb2R1bGVfaW5pdChwczNfc3lzX21hbmFnZXJfaW5pdCk7CisvKiBNb2R1bGUgcmVtb3ZlIG5vdCBzdXBwb3J0ZWQuICovCisKK01PRFVMRV9BTElBUyhQUzNfTU9EVUxFX0FMSUFTX1NZU1RFTV9NQU5BR0VSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmMgYi9kcml2ZXJzL3BzMy92dWFydC5jCmluZGV4IGVjMmQzNmEuLmJlYTI1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmMKKysrIGIvZHJpdmVycy9wczMvdnVhcnQuYwpAQCAtNzEsNiArNzEsMzQgQEAKIH07CiAKIC8qKgorICogc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgLSBwcml2YXRlIHZ1YXJ0IGRldmljZSBkYXRhLgorICovCisKK3N0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IHsKKwl1NjQgaW50ZXJydXB0X21hc2s7CisKKwlzdHJ1Y3QgeworCQlzcGlubG9ja190IGxvY2s7CisJCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKwl9IHR4X2xpc3Q7CisJc3RydWN0IHsKKwkJc3RydWN0IHBzM192dWFydF93b3JrIHdvcms7CisJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfaGVsZDsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7CisJfSByeF9saXN0OworCXN0cnVjdCBwczNfdnVhcnRfc3RhdHMgc3RhdHM7Cit9OworCitzdGF0aWMgc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnRvX3BvcnRfcHJpdigKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJQlVHX09OKCFkZXYpOworCUJVR19PTighZGV2LT5kcml2ZXJfcHJpdik7CisJcmV0dXJuIChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqKWRldi0+ZHJpdmVyX3ByaXY7Cit9CisKKy8qKgogICogc3RydWN0IHBvcnRzX2JtcCAtIGJpdG1hcCBpbmRpY2F0aW5nIHBvcnRzIG5lZWRpbmcgc2VydmljZS4KICAqCiAgKiBBIDI1NiBiaXQgcmVhZCBvbmx5IGJpdG1hcCBpbmRpY2F0aW5nIHBvcnRzIG5lZWRpbmcgc2VydmljZS4gIERvIG5vdCB3cml0ZQpAQCAtODMsMzEgKzExMSwxNCBAQAogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSk7CiAKICNkZWZpbmUgZHVtcF9wb3J0c19ibXAoX2IpIF9kdW1wX3BvcnRzX2JtcChfYiwgX19mdW5jX18sIF9fTElORV9fKQotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIF9kdW1wX3BvcnRzX2JtcCgKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wX3BvcnRzX2JtcCgKIAljb25zdCBzdHJ1Y3QgcG9ydHNfYm1wKiBibXAsIGNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogCXByX2RlYnVnKCIlczolZDogcG9ydHNfYm1wOiAlMDE2bHhoXG4iLCBmdW5jLCBsaW5lLCBibXAtPnN0YXR1cyk7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X21hdGNoX2lkX3RvX3BvcnQoZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQsCi0JdW5zaWduZWQgaW50ICpwb3J0X251bWJlcikKLXsKLQlzd2l0Y2gobWF0Y2hfaWQpIHsKLQljYXNlIFBTM19NQVRDSF9JRF9BVl9TRVRUSU5HUzoKLQkJKnBvcnRfbnVtYmVyID0gMDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBQUzNfTUFUQ0hfSURfU1lTVEVNX01BTkFHRVI6Ci0JCSpwb3J0X251bWJlciA9IDI7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCVdBUk5fT04oMSk7Ci0JCSpwb3J0X251bWJlciA9IFVJTlRfTUFYOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotfQotCiAjZGVmaW5lIGR1bXBfcG9ydF9wYXJhbXMoX2IpIF9kdW1wX3BvcnRfcGFyYW1zKF9iLCBfX2Z1bmNfXywgX19MSU5FX18pCi1zdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgX2R1bXBfcG9ydF9wYXJhbXModW5zaWduZWQgaW50IHBvcnRfbnVtYmVyLAorc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgX2R1bXBfcG9ydF9wYXJhbXModW5zaWduZWQgaW50IHBvcnRfbnVtYmVyLAogCWNvbnN0IGNoYXIqIGZ1bmMsIGludCBsaW5lKQogewogI2lmIGRlZmluZWQoREVCVUcpCkBAIC0xNDQsMTQgKzE1NSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgdHg7CiB9OwogCi1pbnQgcHMzX3Z1YXJ0X2dldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCitpbnQgcHMzX3Z1YXJ0X2dldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJc3RydWN0IHZ1YXJ0X3RyaWdnZXJzICp0cmlnKQogewogCWludCByZXN1bHQ7CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCi0JcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9UWF9UUklHR0VSLCAmdHJpZy0+dHgpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMTYwLDcgKzE3MSw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9SWF9CVUZfU0laRSwgJnNpemUpOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtMTY5LDcgKzE4MCw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfZ2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnBvcnRfbnVtYmVyLAogCQlQQVJBTV9SWF9UUklHR0VSLCAmdmFsKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTE4NiwxMyArMTk3LDEzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IHBzM192dWFydF9zZXRfdHJpZ2dlcnMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdHgsCitpbnQgcHMzX3Z1YXJ0X3NldF90cmlnZ2VycyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB0eCwKIAl1bnNpZ25lZCBpbnQgcngpCiB7CiAJaW50IHJlc3VsdDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAKLQlyZXN1bHQgPSBsdjFfc2V0X3ZpcnR1YWxfdWFydF9wYXJhbShkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX1RYX1RSSUdHRVIsIHR4KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTIwMSw3ICsyMTIsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfQlVGX1NJWkUsICZzaXplKTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTIxMCw3ICsyMjEsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cHJpdi0+cG9ydF9udW1iZXIsCisJcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfVFJJR0dFUiwgc2l6ZSAtIHJ4KTsKIAogCWlmIChyZXN1bHQpIHsKQEAgLTIyNSwxMCArMjM2LDEyIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X3J4X2J5dGVzX3dhaXRpbmcoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X3J4X2J5dGVzX3dhaXRpbmcoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXU2NCAqYnl0ZXNfd2FpdGluZykKIHsKLQlpbnQgcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wb3J0X251bWJlciwKIAkJUEFSQU1fUlhfQllURVMsIGJ5dGVzX3dhaXRpbmcpOwogCiAJaWYgKHJlc3VsdCkKQEAgLTI0MCwxNyArMjUzLDI0IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKKy8qKgorICogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayAtIEVuYWJsZS9kaXNhYmxlIHRoZSBwb3J0IGludGVycnVwdCBzb3VyY2VzLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCisgKiBAYm1wOiBMb2dpY2FsIE9SIG9mIGVudW0gdnVhcnRfaW50ZXJydXB0X21hc2sgdmFsdWVzLiBBIHplcm8gYml0IGRpc2FibGVzLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJdW5zaWduZWQgbG9uZyBtYXNrKQogewogCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG1hc2spOwogCi0JZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayA9IG1hc2s7CisJcHJpdi0+aW50ZXJydXB0X21hc2sgPSBtYXNrOwogCi0JcmVzdWx0ID0gbHYxX3NldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKLQkJUEFSQU1fSU5URVJSVVBUX01BU0ssIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2spOworCXJlc3VsdCA9IGx2MV9zZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCisJCVBBUkFNX0lOVEVSUlVQVF9NQVNLLCBwcml2LT5pbnRlcnJ1cHRfbWFzayk7CiAKIAlpZiAocmVzdWx0KQogCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogaW50ZXJydXB0X21hc2sgZmFpbGVkOiAlc1xuIiwKQEAgLTI1OSw3OSArMjc5LDk2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9zdGF0dXMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9zdGF0dXMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LAogCXVuc2lnbmVkIGxvbmcgKnN0YXR1cykKIHsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdTY0IHRtcDsKLQlpbnQgcmVzdWx0ID0gbHYxX2dldF92aXJ0dWFsX3VhcnRfcGFyYW0oZGV2LT5wcml2LT5wb3J0X251bWJlciwKKworCXJlc3VsdCA9IGx2MV9nZXRfdmlydHVhbF91YXJ0X3BhcmFtKGRldi0+cG9ydF9udW1iZXIsCiAJCVBBUkFNX0lOVEVSUlVQVF9TVEFUVVMsICZ0bXApOwogCiAJaWYgKHJlc3VsdCkKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGludGVycnVwdF9zdGF0dXMgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAotCSpzdGF0dXMgPSB0bXAgJiBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrOworCSpzdGF0dXMgPSB0bXAgJiBwcml2LT5pbnRlcnJ1cHRfbWFzazsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBtICVseGgsIHMgJWx4aCwgbSZzICVseGhcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaywgdG1wLCAqc3RhdHVzKTsKKwkJX19mdW5jX18sIF9fTElORV9fLCBwcml2LT5pbnRlcnJ1cHRfbWFzaywgdG1wLCAqc3RhdHVzKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF90eChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKSA/IDAKLQkJOiBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfVFgpID8gMAorCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQl8IElOVEVSUlVQVF9NQVNLX1RYKTsKIH0KIAotaW50IHBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK2ludCBwczNfdnVhcnRfZW5hYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIChkZXYtPnByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpID8gMAotCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19SWCkgPyAwCisJCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCXwgSU5URVJSVVBUX01BU0tfUlgpOwogfQogCi1pbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2VuYWJsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIChkZXYtPnByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfRElTQ09OTkVDVCkgPyAwCi0JCTogcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpID8gMAorCQk6IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBwcml2LT5pbnRlcnJ1cHRfbWFzawogCQl8IElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpOwogfQogCi1pbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3R4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK2ludCBwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX1RYKQotCQk/IHBzM192dWFydF9zZXRfaW50ZXJydXB0X21hc2soZGV2LCBkZXYtPnByaXYtPmludGVycnVwdF9tYXNrCisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKworCXJldHVybiAocHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19UWCkKKwkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgcHJpdi0+aW50ZXJydXB0X21hc2sKIAkJJiB+SU5URVJSVVBUX01BU0tfVFgpIDogMDsKIH0KIAotaW50IHBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF9yeChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sgJiBJTlRFUlJVUFRfTUFTS19SWCkKLQkJPyBwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzaworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisKKwlyZXR1cm4gKHByaXYtPmludGVycnVwdF9tYXNrICYgSU5URVJSVVBUX01BU0tfUlgpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCSYgfklOVEVSUlVQVF9NQVNLX1JYKSA6IDA7CiB9CiAKLWludCBwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCitpbnQgcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3Qoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXJldHVybiAoZGV2LT5wcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpCi0JCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIGRldi0+cHJpdi0+aW50ZXJydXB0X21hc2sKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOworCisJcmV0dXJuIChwcml2LT5pbnRlcnJ1cHRfbWFzayAmIElOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpCisJCT8gcHMzX3Z1YXJ0X3NldF9pbnRlcnJ1cHRfbWFzayhkZXYsIHByaXYtPmludGVycnVwdF9tYXNrCiAJCSYgfklOVEVSUlVQVF9NQVNLX0RJU0NPTk5FQ1QpIDogMDsKIH0KIAogLyoqCiAgKiBwczNfdnVhcnRfcmF3X3dyaXRlIC0gTG93IGxldmVsIHdyaXRlIGhlbHBlci4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgogICoKICAqIERvIG5vdCBjYWxsIHBzM192dWFydF9yYXdfd3JpdGUgZGlyZWN0bHksIHVzZSBwczNfdnVhcnRfd3JpdGUuCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Jhd193cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCiAJY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgKmJ5dGVzX3dyaXR0ZW4pCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCi0JcmVzdWx0ID0gbHYxX3dyaXRlX3ZpcnR1YWxfdWFydChkZXYtPnByaXYtPnBvcnRfbnVtYmVyLAorCXJlc3VsdCA9IGx2MV93cml0ZV92aXJ0dWFsX3VhcnQoZGV2LT5wb3J0X251bWJlciwKIAkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGJ1ZikpLCBieXRlcywgYnl0ZXNfd3JpdHRlbik7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0zNDAsMjggKzM3NywzMCBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCWRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfd3JpdHRlbiArPSAqYnl0ZXNfd3JpdHRlbjsKKwlwcml2LT5zdGF0cy5ieXRlc193cml0dGVuICs9ICpieXRlc193cml0dGVuOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdyb3RlICVseGgvJXhoPT4lbHhoXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSpieXRlc193cml0dGVuLCBieXRlcywgZGV2LT5wcml2LT5zdGF0cy5ieXRlc193cml0dGVuKTsKKwkJKmJ5dGVzX3dyaXR0ZW4sIGJ5dGVzLCBwcml2LT5zdGF0cy5ieXRlc193cml0dGVuKTsKIAogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qKgogICogcHMzX3Z1YXJ0X3Jhd19yZWFkIC0gTG93IGxldmVsIHJlYWQgaGVscGVyLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCiAgKgogICogRG8gbm90IGNhbGwgcHMzX3Z1YXJ0X3Jhd19yZWFkIGRpcmVjdGx5LCB1c2UgcHMzX3Z1YXJ0X3JlYWQuCiAgKi8KIAotc3RhdGljIGludCBwczNfdnVhcnRfcmF3X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkKiBidWYsCitzdGF0aWMgaW50IHBzM192dWFydF9yYXdfcmVhZChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMsIHVuc2lnbmVkIGxvbmcgKmJ5dGVzX3JlYWQpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV4aFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBieXRlcyk7CiAKLQlyZXN1bHQgPSBsdjFfcmVhZF92aXJ0dWFsX3VhcnQoZGV2LT5wcml2LT5wb3J0X251bWJlciwKKwlyZXN1bHQgPSBsdjFfcmVhZF92aXJ0dWFsX3VhcnQoZGV2LT5wb3J0X251bWJlciwKIAkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKGJ1ZikpLCBieXRlcywgYnl0ZXNfcmVhZCk7CiAKIAlpZiAocmVzdWx0KSB7CkBAIC0zNzAsMjUgKzQwOSwyNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCWRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfcmVhZCArPSAqYnl0ZXNfcmVhZDsKKwlwcml2LT5zdGF0cy5ieXRlc19yZWFkICs9ICpieXRlc19yZWFkOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHJlYWQgJWx4aC8leGg9PiVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJKmJ5dGVzX3JlYWQsIGJ5dGVzLCBkZXYtPnByaXYtPnN0YXRzLmJ5dGVzX3JlYWQpOworCQkqYnl0ZXNfcmVhZCwgYnl0ZXMsIHByaXYtPnN0YXRzLmJ5dGVzX3JlYWQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqCiAgKiBwczNfdnVhcnRfY2xlYXJfcnhfYnl0ZXMgLSBEaXNjYXJkIGJ5dGVzIHJlY2VpdmVkLgorICogQGRldjogVGhlIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgaW5zdGFuY2UuCiAgKiBAYnl0ZXM6IE1heCBieXRlIGNvdW50IHRvIGRpc2NhcmQsIHplcm8gPSBhbGwgcGVuZGluZy4KICAqCiAgKiBVc2VkIHRvIGNsZWFyIHBlbmRpbmcgcnggaW50ZXJydXB0IHNvdXJjZS4gIFdpbGwgbm90IGJsb2NrLgogICovCiAKLXZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK3ZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXU2NCBieXRlc193YWl0aW5nOwogCXZvaWQqIHRtcDsKIApAQCAtNDE4LDggKzQ1OSw5IEBACiAKIAkvKiBEb24ndCBpbmNsdWRlIHRoZXNlIGJ5dGVzIGluIHRoZSBzdGF0cy4gKi8KIAotCWRldi0+cHJpdi0+c3RhdHMuYnl0ZXNfcmVhZCAtPSBieXRlc193YWl0aW5nOworCXByaXYtPnN0YXRzLmJ5dGVzX3JlYWQgLT0gYnl0ZXNfd2FpdGluZzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9jbGVhcl9yeF9ieXRlcyk7CiAKIC8qKgogICogc3RydWN0IGxpc3RfYnVmZmVyIC0gQW4gZWxlbWVudCBmb3IgYSBwb3J0IGRldmljZSBmaWZvIGJ1ZmZlciBsaXN0LgpAQCAtNDM1LDYgKzQ3Nyw3IEBACiAKIC8qKgogICogcHMzX3Z1YXJ0X3dyaXRlIC0gdGhlIGVudHJ5IHBvaW50IGZvciB3cml0aW5nIGRhdGEgdG8gYSBwb3J0CisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KICAqCiAgKiBJZiB0aGUgcG9ydCBpcyBpZGxlIG9uIGVudHJ5IGFzIG11Y2ggb2YgdGhlIGluY29taW5nIGRhdGEgaXMgd3JpdHRlbiB0bwogICogdGhlIHBvcnQgYXMgdGhlIHBvcnQgd2lsbCBhY2NlcHQuICBPdGhlcndpc2UgYSBsaXN0IGJ1ZmZlciBpcyBjcmVhdGVkCkBAIC00NDIsMjUgKzQ4NSwyNiBAQAogICogdGhlbiBlbnF1ZXVlZCBmb3IgdHJhbnNtaXNpb24gdmlhIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQuCiAgKi8KIAotaW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQqIGJ1ZiwKK2ludCBwczNfdnVhcnRfd3JpdGUoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKQogewogCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfYnVmZmVyICpsYjsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAldSgleGgpIGJ5dGVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCWJ5dGVzLCBieXRlcyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQlpZiAobGlzdF9lbXB0eSgmZGV2LT5wcml2LT50eF9saXN0LmhlYWQpKSB7CisJaWYgKGxpc3RfZW1wdHkoJnByaXYtPnR4X2xpc3QuaGVhZCkpIHsKIAkJdW5zaWduZWQgbG9uZyBieXRlc193cml0dGVuOwogCiAJCXJlc3VsdCA9IHBzM192dWFydF9yYXdfd3JpdGUoZGV2LCBidWYsIGJ5dGVzLCAmYnl0ZXNfd3JpdHRlbik7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJlc3VsdCkgewogCQkJZGV2X2RiZygmZGV2LT5jb3JlLApAQCAtNDc4LDcgKzUyMiw3IEBACiAJCWJ5dGVzIC09IGJ5dGVzX3dyaXR0ZW47CiAJCWJ1ZiArPSBieXRlc193cml0dGVuOwogCX0gZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWxiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfYnVmZmVyKSArIGJ5dGVzLCBHRlBfS0VSTkVMKTsKIApAQCAtNDkxLDI5ICs1MzUsODYgQEAKIAlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7CiAJbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJmRldi0+cHJpdi0+dHhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbGItPmxpbmssICZwcml2LT50eF9saXN0LmhlYWQpOwogCXBzM192dWFydF9lbmFibGVfaW50ZXJydXB0X3R4KGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBxdWV1ZWQgYnVmXyVsdSwgJXhoIGJ5dGVzXG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF93cml0ZSk7CiAKIC8qKgotICogcHMzX3Z1YXJ0X3JlYWQgLSB0aGUgZW50cnkgcG9pbnQgZm9yIHJlYWRpbmcgZGF0YSBmcm9tIGEgcG9ydAorICogcHMzX3Z1YXJ0X3F1ZXVlX3J4X2J5dGVzIC0gUXVldWUgd2FpdGluZyBieXRlcyBpbnRvIHRoZSBidWZmZXIgbGlzdC4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICogQGJ5dGVzX3F1ZXVlZDogTnVtYmVyIG9mIGJ5dGVzIHF1ZXVlZCB0byB0aGUgYnVmZmVyIGxpc3QuCiAgKgotICogSWYgZW5vdWdoIGJ5dGVzIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QgYXJlIGhlbGQgaW4gdGhlIGJ1ZmZlciBsaXN0IHRob3NlCi0gKiBieXRlcyBhcmUgZGVxdWV1ZWQgYW5kIGNvcGllZCB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyLiAgRW1wdGllZCBsaXN0IGJ1ZmZlcnMKLSAqIGFyZSByZXRpZXJlZC4gIElmIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBzdGF0aWZpZWQgYnkgYnl0ZXMgaGVsZCBpbiB0aGUgbGlzdAotICogYnVmZmVycyAtRUFHQUlOIGlzIHJldHVybmVkLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBwcml2LT5yeF9saXN0LmxvY2sgaGVsZC4KICAqLwogCi1pbnQgcHMzX3Z1YXJ0X3JlYWQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB2b2lkKiBidWYsCitzdGF0aWMgaW50IHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJdTY0ICpieXRlc19xdWV1ZWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgZGJnX251bWJlcjsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CisJc3RydWN0IGxpc3RfYnVmZmVyICpsYjsKKwl1NjQgYnl0ZXM7CisKKwkqYnl0ZXNfcXVldWVkID0gMDsKKworCXJlc3VsdCA9IHBzM192dWFydF9nZXRfcnhfYnl0ZXNfd2FpdGluZyhkZXYsICZieXRlcyk7CisJQlVHX09OKHJlc3VsdCk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghYnl0ZXMpCisJCXJldHVybiAwOworCisJLyogQWRkIHNvbWUgZXh0cmEgc3BhY2UgZm9yIHJlY2VudGx5IGFycml2ZWQgZGF0YS4gKi8KKworCWJ5dGVzICs9IDEyODsKKworCWxiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfYnVmZmVyKSArIGJ5dGVzLCBHRlBfQVRPTUlDKTsKKworCWlmICghbGIpCisJCXJldHVybiAtRU5PTUVNOworCisJcHMzX3Z1YXJ0X3Jhd19yZWFkKGRldiwgbGItPmRhdGEsIGJ5dGVzLCAmYnl0ZXMpOworCisJbGItPmhlYWQgPSBsYi0+ZGF0YTsKKwlsYi0+dGFpbCA9IGxiLT5kYXRhICsgYnl0ZXM7CisJbGItPmRiZ19udW1iZXIgPSArK2RiZ19udW1iZXI7CisKKwlsaXN0X2FkZF90YWlsKCZsYi0+bGluaywgJnByaXYtPnJ4X2xpc3QuaGVhZCk7CisJcHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkICs9IGJ5dGVzOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGJ1Zl8lbHU6IHF1ZXVlZCAlbHhoIGJ5dGVzXG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIGxiLT5kYmdfbnVtYmVyLCBieXRlcyk7CisKKwkqYnl0ZXNfcXVldWVkID0gYnl0ZXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwczNfdnVhcnRfcmVhZCAtIFRoZSBlbnRyeSBwb2ludCBmb3IgcmVhZGluZyBkYXRhIGZyb20gYSBwb3J0LgorICoKKyAqIFF1ZXVlIGRhdGEgd2FpdGluZyBhdCB0aGUgcG9ydCwgYW5kIGlmIGVub3VnaCBieXRlcyB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0CisgKiBhcmUgaGVsZCBpbiB0aGUgYnVmZmVyIGxpc3QgdGhvc2UgYnl0ZXMgYXJlIGRlcXVldWVkIGFuZCBjb3BpZWQgdG8gdGhlCisgKiBjYWxsZXIncyBidWZmZXIuICBFbXB0aWVkIGxpc3QgYnVmZmVycyBhcmUgcmV0aWVyZWQuICBJZiB0aGUgcmVxdWVzdCBjYW5ub3QKKyAqIGJlIHN0YXRpZmllZCBieSBieXRlcyBoZWxkIGluIHRoZSBsaXN0IGJ1ZmZlcnMgLUVBR0FJTiBpcyByZXR1cm5lZC4KKyAqLworCitpbnQgcHMzX3Z1YXJ0X3JlYWQoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB2b2lkICpidWYsCiAJdW5zaWduZWQgaW50IGJ5dGVzKQogeworCWludCByZXN1bHQ7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGIsICpuOwogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVhZDsKQEAgLTUyMSwzMCArNjIyLDM3IEBACiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6ICV1KCV4aCkgYnl0ZXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJYnl0ZXMsIGJ5dGVzKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKIAotCWlmIChkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA8IGJ5dGVzKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7Ci0JCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzdGFydmVkIGZvciAlbHhoIGJ5dGVzXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLAotCQkJYnl0ZXMgLSBkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCk7Ci0JCXJldHVybiAtRUFHQUlOOworCS8qIFF1ZXVlIHJ4IGJ5dGVzIGhlcmUgZm9yIHBvbGxlZCByZWFkcy4gKi8KKworCXdoaWxlIChwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQgPCBieXRlcykgeworCQl1NjQgdG1wOworCisJCXJlc3VsdCA9IHBzM192dWFydF9xdWV1ZV9yeF9ieXRlcyhkZXYsICZ0bXApOworCQlpZiAocmVzdWx0IHx8ICF0bXApIHsKKwkJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzdGFydmVkIGZvciAlbHhoIGJ5dGVzXG4iLAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywKKwkJCQlieXRlcyAtIHByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxiLCBuLCAmZGV2LT5wcml2LT5yeF9saXN0LmhlYWQsIGxpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZwcml2LT5yeF9saXN0LmhlYWQsIGxpbmspIHsKIAkJYnl0ZXNfcmVhZCA9IG1pbigodW5zaWduZWQgaW50KShsYi0+dGFpbCAtIGxiLT5oZWFkKSwgYnl0ZXMpOwogCiAJCW1lbWNweShidWYsIGxiLT5oZWFkLCBieXRlc19yZWFkKTsKIAkJYnVmICs9IGJ5dGVzX3JlYWQ7CiAJCWJ5dGVzIC09IGJ5dGVzX3JlYWQ7Ci0JCWRldi0+cHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkIC09IGJ5dGVzX3JlYWQ7CisJCXByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCAtPSBieXRlc19yZWFkOwogCiAJCWlmIChieXRlc19yZWFkIDwgbGItPnRhaWwgLSBsYi0+aGVhZCkgewogCQkJbGItPmhlYWQgKz0gYnl0ZXNfcmVhZDsKIAkJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBidWZfJWx1OiBkZXF1ZXVlZCAlbHhoICIKIAkJCQkiYnl0ZXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsCiAJCQkJYnl0ZXNfcmVhZCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCkBAIC01NTYsMTYgKzY2NCwzMiBAQAogCQlrZnJlZShsYik7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9yZWFkKTsKIAotaW50IHBzM192dWFydF9yZWFkX2FzeW5jKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgd29ya19mdW5jX3QgZnVuYywKLQl1bnNpZ25lZCBpbnQgYnl0ZXMpCisvKioKKyAqIHBzM192dWFydF93b3JrIC0gQXN5bmNocm9ub3VzIHJlYWQgaGFuZGxlci4KKyAqLworCitzdGF0aWMgdm9pZCBwczNfdnVhcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2ID0KKwkJcHMzX3Z1YXJ0X3dvcmtfdG9fc3lzdGVtX2J1c19kZXYod29yayk7CisJc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqZHJ2ID0KKwkJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3Z1YXJ0X2RydihkZXYpOworCisJQlVHX09OKCFkcnYpOworCWRydi0+d29yayhkZXYpOworfQorCitpbnQgcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYnl0ZXMpCit7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYoZGV2LT5wcml2LT53b3JrLnRyaWdnZXIpIHsKKwlpZiAocHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIpIHsKIAkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdhcm5pbmcsIG11bHRpcGxlIGNhbGxzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC01NzMsMzAgKzY5NywzMiBAQAogCiAJQlVHX09OKCFieXRlcyk7CiAKLQlQUkVQQVJFX1dPUksoJmRldi0+cHJpdi0+d29yay53b3JrLCBmdW5jKTsKKwlQUkVQQVJFX1dPUksoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrLCBwczNfdnVhcnRfd29yayk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKLQlpZihkZXYtPnByaXYtPnJ4X2xpc3QuYnl0ZXNfaGVsZCA+PSBieXRlcykgeworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlpZiAocHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkID49IGJ5dGVzKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzY2hlZHVsZV93b3JrICV4aCBieXRlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXMpOwotCQlzY2hlZHVsZV93b3JrKCZkZXYtPnByaXYtPndvcmsud29yayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+d29yay5sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KIAotCWRldi0+cHJpdi0+d29yay50cmlnZ2VyID0gYnl0ZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKKwlwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciA9IGJ5dGVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHdhaXRpbmcgZm9yICV1KCV4aCkgYnl0ZXNcbiIsIF9fZnVuY19fLAogCQlfX0xJTkVfXywgYnl0ZXMsIGJ5dGVzKTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X3JlYWRfYXN5bmMpOwogCi12b2lkIHBzM192dWFydF9jYW5jZWxfYXN5bmMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQordm9pZCBwczNfdnVhcnRfY2FuY2VsX2FzeW5jKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKLQlkZXYtPnByaXYtPndvcmsudHJpZ2dlciA9IDA7CisJdG9fcG9ydF9wcml2KGRldiktPnJ4X2xpc3Qud29yay50cmlnZ2VyID0gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9jYW5jZWxfYXN5bmMpOwogCiAvKioKICAqIHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3R4IC0gdGhpcmQgc3RhZ2UgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIKQEAgLTYwNiwxOCArNzMyLDE5IEBACiAgKiBhZGp1c3RzIHRoZSBmaW5hbCBsaXN0IGJ1ZmZlciBzdGF0ZSBmb3IgYSBwYXJ0aWFsIHdyaXRlLgogICovCiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfdHgoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF90eChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2J1ZmZlciAqbGIsICpuOwogCXVuc2lnbmVkIGxvbmcgYnl0ZXNfdG90YWwgPSAwOwogCiAJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5wcml2LT50eF9saXN0LmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGIsIG4sICZkZXYtPnByaXYtPnR4X2xpc3QuaGVhZCwgbGluaykgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsYiwgbiwgJnByaXYtPnR4X2xpc3QuaGVhZCwgbGluaykgewogCiAJCXVuc2lnbmVkIGxvbmcgYnl0ZXNfd3JpdHRlbjsKIApAQCAtNjUxLDcgKzc3OCw3IEBACiAKIAlwczNfdnVhcnRfZGlzYWJsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKIHBvcnRfZnVsbDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xpc3QubG9jaywgZmxhZ3MpOwogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIHdyb3RlICVseGggYnl0ZXMgdG90YWxcbiIsCiAJCV9fZnVuY19fLCBfX0xJTkVfXywgYnl0ZXNfdG90YWwpOwogCXJldHVybiByZXN1bHQ7CkBAIC02NjUsNjAgKzc5MiwzNyBAQAogICogYnVmZmVyIGxpc3QuICBCdWZmZXIgbGlzdCBkYXRhIGlzIGRlcXVldWVkIHZpYSBwczNfdnVhcnRfcmVhZC4KICAqLwogCi1zdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X3J4KHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfcngoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGRiZ19udW1iZXI7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IHRvX3BvcnRfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfYnVmZmVyICpsYjsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzOworCXU2NCBieXRlczsKIAogCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JcmVzdWx0ID0gcHMzX3Z1YXJ0X2dldF9yeF9ieXRlc193YWl0aW5nKGRldiwgJmJ5dGVzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7CisJcmVzdWx0ID0gcHMzX3Z1YXJ0X3F1ZXVlX3J4X2J5dGVzKGRldiwgJmJ5dGVzKTsKIAotCWlmIChyZXN1bHQpCi0JCXJldHVybiAtRUlPOwotCi0JQlVHX09OKCFieXRlcyk7Ci0KLQkvKiBBZGQgc29tZSBleHRyYSBzcGFjZSBmb3IgcmVjZW50bHkgYXJyaXZlZCBkYXRhLiAqLwotCi0JYnl0ZXMgKz0gMTI4OwotCi0JbGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9idWZmZXIpICsgYnl0ZXMsIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFsYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwczNfdnVhcnRfcmF3X3JlYWQoZGV2LCBsYi0+ZGF0YSwgYnl0ZXMsICZieXRlcyk7Ci0KLQlsYi0+aGVhZCA9IGxiLT5kYXRhOwotCWxiLT50YWlsID0gbGItPmRhdGEgKyBieXRlczsKLQlsYi0+ZGJnX251bWJlciA9ICsrZGJnX251bWJlcjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnByaXYtPnJ4X2xpc3QubG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJmxiLT5saW5rLCAmZGV2LT5wcml2LT5yeF9saXN0LmhlYWQpOwotCWRldi0+cHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkICs9IGJ5dGVzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrLCBmbGFncyk7Ci0KLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogYnVmXyVsdTogcXVldWVkICVseGggYnl0ZXNcbiIsCi0JCV9fZnVuY19fLCBfX0xJTkVfXywgbGItPmRiZ19udW1iZXIsIGJ5dGVzKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnByaXYtPndvcmsubG9jaywgZmxhZ3MpOwotCWlmKGRldi0+cHJpdi0+d29yay50cmlnZ2VyCi0JCSYmIGRldi0+cHJpdi0+cnhfbGlzdC5ieXRlc19oZWxkID49IGRldi0+cHJpdi0+d29yay50cmlnZ2VyKSB7Ci0JCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBzY2hlZHVsZV93b3JrICVseGggYnl0ZXNcbiIsCi0JCQlfX2Z1bmNfXywgX19MSU5FX18sIGRldi0+cHJpdi0+d29yay50cmlnZ2VyKTsKLQkJZGV2LT5wcml2LT53b3JrLnRyaWdnZXIgPSAwOwotCQlzY2hlZHVsZV93b3JrKCZkZXYtPnByaXYtPndvcmsud29yayk7CisJaWYgKHJlc3VsdCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5wcml2LT53b3JrLmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKworCWlmIChwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciAmJiBwcml2LT5yeF9saXN0LmJ5dGVzX2hlbGQKKwkJPj0gcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IHNjaGVkdWxlX3dvcmsgJWx4aCBieXRlc1xuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIpOworCQlwcml2LT5yeF9saXN0LndvcmsudHJpZ2dlciA9IDA7CisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X2xpc3Qud29yay53b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yeF9saXN0LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoCi0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlCVUdfT04oIm5vIHN1cHBvcnQiKTsKQEAgLTczMyw5ICs4MzcsMTAgQEAKICAqIHN0YWdlIGhhbmRsZXIgYWZ0ZXIgb25lIGl0ZXJhdGlvbi4KICAqLwogCi1zdGF0aWMgaW50IHBzM192dWFydF9oYW5kbGVfcG9ydF9pbnRlcnJ1cHQoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNfdnVhcnRfaGFuZGxlX3BvcnRfaW50ZXJydXB0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlpbnQgcmVzdWx0OworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2ICpwcml2ID0gdG9fcG9ydF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CiAKIAlyZXN1bHQgPSBwczNfdnVhcnRfZ2V0X2ludGVycnVwdF9zdGF0dXMoZGV2LCAmc3RhdHVzKTsKQEAgLTc0NywyMSArODUyLDIxIEBACiAJCXN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfRElTQ09OTkVDVCkgewotCQlkZXYtPnByaXYtPnN0YXRzLmRpc2Nvbm5lY3RfaW50ZXJydXB0cysrOworCQlwcml2LT5zdGF0cy5kaXNjb25uZWN0X2ludGVycnVwdHMrKzsKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfZGlzY29ubmVjdChkZXYpOwogCQlpZiAocmVzdWx0KQogCQkJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X2Rpc2Nvbm5lY3QoZGV2KTsKIAl9CiAKIAlpZiAoc3RhdHVzICYgSU5URVJSVVBUX01BU0tfVFgpIHsKLQkJZGV2LT5wcml2LT5zdGF0cy50eF9pbnRlcnJ1cHRzKys7CisJCXByaXYtPnN0YXRzLnR4X2ludGVycnVwdHMrKzsKIAkJcmVzdWx0ID0gcHMzX3Z1YXJ0X2hhbmRsZV9pbnRlcnJ1cHRfdHgoZGV2KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXBzM192dWFydF9kaXNhYmxlX2ludGVycnVwdF90eChkZXYpOwogCX0KIAogCWlmIChzdGF0dXMgJiBJTlRFUlJVUFRfTUFTS19SWCkgewotCQlkZXYtPnByaXYtPnN0YXRzLnJ4X2ludGVycnVwdHMrKzsKKwkJcHJpdi0+c3RhdHMucnhfaW50ZXJydXB0cysrOwogCQlyZXN1bHQgPSBwczNfdnVhcnRfaGFuZGxlX2ludGVycnVwdF9yeChkZXYpOwogCQlpZiAocmVzdWx0KQogCQkJcHMzX3Z1YXJ0X2Rpc2FibGVfaW50ZXJydXB0X3J4KGRldik7CkBAIC03NzEsMTEgKzg3NiwxMSBAQAogfQogCiBzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgewotCWNvbnN0IHN0cnVjdCBwb3J0c19ibXAgYm1wOworCXN0cnVjdCBwb3J0c19ibXAgKmJtcDsKIAl1bnNpZ25lZCBpbnQgdmlycTsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHByb2JlX211dGV4OwogCWludCB1c2VfY291bnQ7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2aWNlc1tQT1JUX0NPVU5UXTsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXZpY2VzW1BPUlRfQ09VTlRdOwogfSBzdGF0aWMgdnVhcnRfYnVzX3ByaXY7CiAKIC8qKgpAQCAtNzg4LDE3ICs4OTMsMTYgQEAKIAogc3RhdGljIGlycXJldHVybl90IHBzM192dWFydF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfcHJpdmF0ZSkKIHsKLQlzdHJ1Y3QgdnVhcnRfYnVzX3ByaXYgKmJ1c19wcml2OworCXN0cnVjdCB2dWFydF9idXNfcHJpdiAqYnVzX3ByaXYgPSBfcHJpdmF0ZTsKIAotCUJVR19PTighX3ByaXZhdGUpOwotCWJ1c19wcml2ID0gKHN0cnVjdCB2dWFydF9idXNfcHJpdiAqKV9wcml2YXRlOworCUJVR19PTighYnVzX3ByaXYpOwogCiAJd2hpbGUgKDEpIHsKIAkJdW5zaWduZWQgaW50IHBvcnQ7CiAKLQkJZHVtcF9wb3J0c19ibXAoJmJ1c19wcml2LT5ibXApOworCQlkdW1wX3BvcnRzX2JtcChidXNfcHJpdi0+Ym1wKTsKIAotCQlwb3J0ID0gKEJJVFNfUEVSX0xPTkcgLSAxKSAtIF9faWxvZzIoYnVzX3ByaXYtPmJtcC5zdGF0dXMpOworCQlwb3J0ID0gKEJJVFNfUEVSX0xPTkcgLSAxKSAtIF9faWxvZzIoYnVzX3ByaXYtPmJtcC0+c3RhdHVzKTsKIAogCQlpZiAocG9ydCA9PSBCSVRTX1BFUl9MT05HKQogCQkJYnJlYWs7CkBAIC04MTIsMTAwICs5MTYsMTQ0IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2J1c19pbnRlcnJ1cHRfZ2V0KHZvaWQpCiB7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPSB0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rydik7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKF9kZXYpOwogCi0JcmVzdWx0ID0gZGV2LT5tYXRjaF9pZCA9PSBkcnYtPm1hdGNoX2lkOworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKLQlkZXZfaW5mbygmZGV2LT5jb3JlLCAiJXM6JWQ6IGRldj0ldSglcyksIGRydj0ldSglcyk6ICVzXG4iLCBfX2Z1bmNfXywKLQkJX19MSU5FX18sIGRldi0+bWF0Y2hfaWQsIGRldi0+Y29yZS5idXNfaWQsIGRydi0+bWF0Y2hfaWQsCi0JCWRydi0+Y29yZS5uYW1lLCAocmVzdWx0ID8gIm1hdGNoIiA6ICJtaXNzIikpOworCXZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCsrOwogCisJQlVHX09OKHZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCA+IDIpOworCisJaWYgKHZ1YXJ0X2J1c19wcml2LnVzZV9jb3VudCAhPSAxKSB7CisJCXJldHVybiAwOworCX0KKworCUJVR19PTih2dWFydF9idXNfcHJpdi5ibXApOworCisJdnVhcnRfYnVzX3ByaXYuYm1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBvcnRzX2JtcCksIEdGUF9LRVJORUwpOworCisJaWYgKCF2dWFydF9idXNfcHJpdi5ibXApIHsKKwkJcHJfZGVidWcoIiVzOiVkOiBremFsbG9jIGZhaWxlZC5cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9ibXBfbWFsbG9jOworCX0KKworCXJlc3VsdCA9IHBzM192dWFydF9pcnFfc2V0dXAoUFMzX0JJTkRJTkdfQ1BVX0FOWSwgdnVhcnRfYnVzX3ByaXYuYm1wLAorCQkmdnVhcnRfYnVzX3ByaXYudmlycSk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByX2RlYnVnKCIlczolZDogcHMzX3Z1YXJ0X2lycV9zZXR1cCBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJcmVzdWx0ID0gLUVQRVJNOworCQlnb3RvIGZhaWxfYWxsb2NfaXJxOworCX0KKworCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsIHBzM192dWFydF9pcnFfaGFuZGxlciwKKwkJSVJRRl9ESVNBQkxFRCwgInZ1YXJ0IiwgJnZ1YXJ0X2J1c19wcml2KTsKKworCWlmIChyZXN1bHQpIHsKKwkJcHJfZGVidWcoIiVzOiVkOiByZXF1ZXN0X2lycSBmYWlsZWQgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0KTsKKwkJZ290byBmYWlsX3JlcXVlc3RfaXJxOworCX0KKworCXByX2RlYnVnKCIgPC0gJXM6JWQ6IG9rXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiByZXN1bHQ7CisKK2ZhaWxfcmVxdWVzdF9pcnE6CisJcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHZ1YXJ0X2J1c19wcml2LnZpcnEpOworCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CitmYWlsX2FsbG9jX2lycToKKwlrZnJlZSh2dWFydF9idXNfcHJpdi5ibXApOworCXZ1YXJ0X2J1c19wcml2LmJtcCA9IE5VTEw7CitmYWlsX2JtcF9tYWxsb2M6CisJdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50LS07CisJcHJfZGVidWcoIiA8LSAlczolZDogZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcHMzX3Z1YXJ0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCitzdGF0aWMgaW50IHBzM192dWFydF9idXNfaW50ZXJydXB0X3B1dCh2b2lkKQoreworCXByX2RlYnVnKCIgLT4gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwl2dWFydF9idXNfcHJpdi51c2VfY291bnQtLTsKKworCUJVR19PTih2dWFydF9idXNfcHJpdi51c2VfY291bnQgPCAwKTsKKworCWlmICh2dWFydF9idXNfcHJpdi51c2VfY291bnQgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmcmVlX2lycSh2dWFydF9idXNfcHJpdi52aXJxLCAmdnVhcnRfYnVzX3ByaXYpOworCisJcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHZ1YXJ0X2J1c19wcml2LnZpcnEpOworCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CisKKwlrZnJlZSh2dWFydF9idXNfcHJpdi5ibXApOworCXZ1YXJ0X2J1c19wcml2LmJtcCA9IE5VTEw7CisKKwlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzM192dWFydF9wcm9iZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7Ci0Jc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2ID0gdG9fcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKF9kZXYpOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydiA9Ci0JCXRvX3BzM192dWFydF9wb3J0X2RyaXZlcihfZGV2LT5kcml2ZXIpOworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydjsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdiAqcHJpdiA9IE5VTEw7CiAKIAlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAorCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoZGV2KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCWRydi0+Y29yZS5jb3JlLm5hbWUpOworCiAJQlVHX09OKCFkcnYpOwogCisJaWYgKGRldi0+cG9ydF9udW1iZXIgPj0gUE9SVF9DT1VOVCkgeworCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZG93bigmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwogCi0JLyogU2V0dXAgdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1tdLiAqLworCXJlc3VsdCA9IHBzM192dWFydF9idXNfaW50ZXJydXB0X2dldCgpOwogCi0JcmVzdWx0ID0gcHMzX3Z1YXJ0X21hdGNoX2lkX3RvX3BvcnQoZGV2LT5tYXRjaF9pZCwKLQkJJnBvcnRfbnVtYmVyKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfc2V0dXBfaW50ZXJydXB0OwogCi0JaWYgKHJlc3VsdCkgewotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogdW5rbm93biBtYXRjaF9pZCAoJWQpXG4iLAotCQkJX19mdW5jX18sIF9fTElORV9fLCBkZXYtPm1hdGNoX2lkKTsKLQkJcmVzdWx0ID0gLUVJTlZBTDsKLQkJZ290byBmYWlsX21hdGNoOwotCX0KLQotCWlmICh2dWFydF9idXNfcHJpdi5kZXZpY2VzW3BvcnRfbnVtYmVyXSkgeworCWlmICh2dWFydF9idXNfcHJpdi5kZXZpY2VzW2Rldi0+cG9ydF9udW1iZXJdKSB7CiAJCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiBwb3J0IGJ1c3kgKCVkKVxuIiwgX19mdW5jX18sCi0JCQlfX0xJTkVfXywgcG9ydF9udW1iZXIpOworCQkJX19MSU5FX18sIGRldi0+cG9ydF9udW1iZXIpOwogCQlyZXN1bHQgPSAtRUJVU1k7Ci0JCWdvdG8gZmFpbF9tYXRjaDsKKwkJZ290byBmYWlsX2J1c3k7CiAJfQogCi0JdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1twb3J0X251bWJlcl0gPSBkZXY7CisJdnVhcnRfYnVzX3ByaXYuZGV2aWNlc1tkZXYtPnBvcnRfbnVtYmVyXSA9IGRldjsKIAotCS8qIFNldHVwIGRldi0+cHJpdi4gKi8KKwkvKiBTZXR1cCBkZXYtPmRyaXZlcl9wcml2LiAqLwogCi0JZGV2LT5wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlkZXYtPmRyaXZlcl9wcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYpLAorCQlHRlBfS0VSTkVMKTsKIAotCWlmICghZGV2LT5wcml2KSB7CisJaWYgKCFkZXYtPmRyaXZlcl9wcml2KSB7CiAJCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9hbGxvYzsKKwkJZ290byBmYWlsX2Rldl9tYWxsb2M7CiAJfQogCi0JZGV2LT5wcml2LT5wb3J0X251bWJlciA9IHBvcnRfbnVtYmVyOworCXByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnByaXYtPnR4X2xpc3QuaGVhZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+cHJpdi0+dHhfbGlzdC5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dHhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbGlzdC5sb2NrKTsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnByaXYtPnJ4X2xpc3QuaGVhZCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldi0+cHJpdi0+cnhfbGlzdC5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+cnhfbGlzdC5oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfbGlzdC5sb2NrKTsKIAotCUlOSVRfV09SSygmZGV2LT5wcml2LT53b3JrLndvcmssIE5VTEwpOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnByaXYtPndvcmsubG9jayk7Ci0JZGV2LT5wcml2LT53b3JrLnRyaWdnZXIgPSAwOwotCWRldi0+cHJpdi0+d29yay5kZXYgPSBkZXY7Ci0KLQlpZiAoKyt2dWFydF9idXNfcHJpdi51c2VfY291bnQgPT0gMSkgewotCi0JCXJlc3VsdCA9IHBzM192dWFydF9pcnFfc2V0dXAoUFMzX0JJTkRJTkdfQ1BVX0FOWSwKLQkJCSh2b2lkKikmdnVhcnRfYnVzX3ByaXYuYm1wLnN0YXR1cywgJnZ1YXJ0X2J1c19wcml2LnZpcnEpOwotCi0JCWlmIChyZXN1bHQpIHsKLQkJCWRldl9kYmcoJmRldi0+Y29yZSwKLQkJCQkiJXM6JWQ6IHBzM192dWFydF9pcnFfc2V0dXAgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotCQkJcmVzdWx0ID0gLUVQRVJNOwotCQkJZ290byBmYWlsX2FsbG9jX2lycTsKLQkJfQotCi0JCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsIHBzM192dWFydF9pcnFfaGFuZGxlciwKLQkJCUlSUUZfRElTQUJMRUQsICJ2dWFydCIsICZ2dWFydF9idXNfcHJpdik7Ci0KLQkJaWYgKHJlc3VsdCkgewotCQkJZGV2X2luZm8oJmRldi0+Y29yZSwgIiVzOiVkOiByZXF1ZXN0X2lycSBmYWlsZWQgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlc3VsdCk7Ci0JCQlnb3RvIGZhaWxfcmVxdWVzdF9pcnE7Ci0JCX0KLQl9CisJSU5JVF9XT1JLKCZwcml2LT5yeF9saXN0Lndvcmsud29yaywgTlVMTCk7CisJcHJpdi0+cnhfbGlzdC53b3JrLnRyaWdnZXIgPSAwOworCXByaXYtPnJ4X2xpc3Qud29yay5kZXYgPSBkZXY7CiAKIAkvKiBjbGVhciBzdGFsZSBwZW5kaW5nIGludGVycnVwdHMgKi8KIApAQCAtOTM2LDE1MiArMTA4NCwxNjAgQEAKIAogZmFpbF9wcm9iZToKIAlwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgMCk7Ci1mYWlsX3JlcXVlc3RfaXJxOgotCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKLQl2dWFydF9idXNfcHJpdi52aXJxID0gTk9fSVJROwotZmFpbF9hbGxvY19pcnE6Ci0JLS12dWFydF9idXNfcHJpdi51c2VfY291bnQ7Ci0Ja2ZyZWUoZGV2LT5wcml2KTsKLQlkZXYtPnByaXYgPSBOVUxMOwotZmFpbF9hbGxvYzoKLQl2dWFydF9idXNfcHJpdi5kZXZpY2VzW3BvcnRfbnVtYmVyXSA9IE5VTEw7Ci1mYWlsX21hdGNoOgorCWtmcmVlKGRldi0+ZHJpdmVyX3ByaXYpOworCWRldi0+ZHJpdmVyX3ByaXYgPSBOVUxMOworZmFpbF9kZXZfbWFsbG9jOgorCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0gPSBOVUxMOworZmFpbF9idXN5OgorCXBzM192dWFydF9idXNfaW50ZXJydXB0X3B1dCgpOworZmFpbF9zZXR1cF9pbnRlcnJ1cHQ6CiAJdXAoJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IHBzM192dWFydF9yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKKy8qKgorICogcHMzX3Z1YXJ0X2NsZWFudXAgLSBjb21tb24gY2xlYW51cCBoZWxwZXIuCisgKiBAZGV2OiBUaGUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBpbnN0YW5jZS4KKyAqCisgKiBDbGVhbnMgaW50ZXJydXB0cyBhbmQgSFYgcmVzb3VyY2VzLiAgTXVzdCBiZSBjYWxsZWQgd2l0aAorICogdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXggaGVsZC4gIFVzZWQgYnkgcHMzX3Z1YXJ0X3JlbW92ZSBhbmQKKyAqIHBzM192dWFydF9zaHV0ZG93bi4gIEFmdGVyIHRoaXMgY2FsbCwgcG9sbGVkIHJlYWRpbmcgd2lsbCBzdGlsbCB3b3JrLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X2NsZWFudXAoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQotCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBzM192dWFydF9jYW5jZWxfYXN5bmMoZGV2KTsKKwlwczNfdnVhcnRfc2V0X2ludGVycnVwdF9tYXNrKGRldiwgMCk7CisJcHMzX3Z1YXJ0X2J1c19pbnRlcnJ1cHRfcHV0KCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3JlbW92ZSAtIENvbXBsZXRlbHkgY2xlYW4gdGhlIGRldmljZSBpbnN0YW5jZS4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIENsZWFucyBhbGwgbWVtb3J5LCBpbnRlcnJ1cHRzIGFuZCBIViByZXNvdXJjZXMuICBBZnRlciB0aGlzIGNhbGwgdGhlCisgKiBkZXZpY2UgY2FuIG5vIGxvbmdlciBiZSB1c2VkLgorICovCisKK3N0YXRpYyBpbnQgcHMzX3Z1YXJ0X3JlbW92ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgKnByaXYgPSB0b19wb3J0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnY7CisKKwlCVUdfT04oIWRldik7CiAKIAlkb3duKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CiAKLQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJZGV2LT5jb3JlLmJ1c19pZCk7CisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIC0+ICVzOiVkOiBtYXRjaF9pZCAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlkZXYtPm1hdGNoX2lkKTsKIAotCUJVR19PTih2dWFydF9idXNfcHJpdi51c2VfY291bnQgPCAxKTsKLQotCWlmIChkcnYtPnJlbW92ZSkKLQkJZHJ2LT5yZW1vdmUoZGV2KTsKLQllbHNlCi0JCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlcyBubyByZW1vdmUgbWV0aG9kXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKLQotCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wcml2LT5wb3J0X251bWJlcl0gPSBOVUxMOwotCi0JaWYgKC0tdnVhcnRfYnVzX3ByaXYudXNlX2NvdW50ID09IDApIHsKLQkJQlVHKCk7Ci0JCWZyZWVfaXJxKHZ1YXJ0X2J1c19wcml2LnZpcnEsICZ2dWFydF9idXNfcHJpdik7Ci0JCXBzM192dWFydF9pcnFfZGVzdHJveSh2dWFydF9idXNfcHJpdi52aXJxKTsKLQkJdnVhcnRfYnVzX3ByaXYudmlycSA9IE5PX0lSUTsKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisJCXJldHVybiAwOwogCX0KIAotCWtmcmVlKGRldi0+cHJpdik7Ci0JZGV2LT5wcml2ID0gTlVMTDsKKwlkcnYgPSBwczNfc3lzdGVtX2J1c19kZXZfdG9fdnVhcnRfZHJ2KGRldik7CisKKwlCVUdfT04oIWRydik7CisKKwlpZiAoZHJ2LT5yZW1vdmUpIHsKKwkJZHJ2LT5yZW1vdmUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogbm8gcmVtb3ZlIG1ldGhvZFxuIiwgX19mdW5jX18sCisJCV9fTElORV9fKTsKKwkJQlVHKCk7CisJfQorCisJcHMzX3Z1YXJ0X2NsZWFudXAoZGV2KTsKKworCXZ1YXJ0X2J1c19wcml2LmRldmljZXNbZGV2LT5wb3J0X251bWJlcl0gPSBOVUxMOworCWtmcmVlKHByaXYpOworCXByaXYgPSBOVUxMOworCisJZGV2X2RiZygmZGV2LT5jb3JlLCAiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHMzX3Z1YXJ0X3NodXRkb3duIC0gQ2xlYW5zIGludGVycnVwdHMgYW5kIEhWIHJlc291cmNlcy4KKyAqIEBkZXY6IFRoZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlIGluc3RhbmNlLgorICoKKyAqIENsZWFucyBpbnRlcnJ1cHRzIGFuZCBIViByZXNvdXJjZXMuICBBZnRlciB0aGlzIGNhbGwgdGhlCisgKiBkZXZpY2UgY2FuIHN0aWxsIGJlIHVzZWQgaW4gcG9sbGluZyBtb2RlLiAgVGhpcyBiZWhhdmlvciByZXF1aXJlZAorICogYnkgc3lzLW1hbmFnZXIgdG8gYmUgYWJsZSB0byBjb21wbGV0ZSB0aGUgZGV2aWNlIHBvd2VyIG9wZXJhdGlvbgorICogc2VxdWVuY2UuCisgKi8KKworc3RhdGljIGludCBwczNfdnVhcnRfc2h1dGRvd24oc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKmRydjsKKworCUJVR19PTighZGV2KTsKKworCWRvd24oJnZ1YXJ0X2J1c19wcml2LnByb2JlX211dGV4KTsKKworCWRldl9kYmcoJmRldi0+Y29yZSwgIiAtPiAlczolZDogbWF0Y2hfaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJZGV2LT5tYXRjaF9pZCk7CisKKwlpZiAoIWRldi0+Y29yZS5kcml2ZXIpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIGRyaXZlciBib3VuZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCXVwKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCWRydiA9IHBzM19zeXN0ZW1fYnVzX2Rldl90b192dWFydF9kcnYoZGV2KTsKKworCUJVR19PTighZHJ2KTsKKworCWlmIChkcnYtPnNodXRkb3duKQorCQlkcnYtPnNodXRkb3duKGRldik7CisJZWxzZSBpZiAoZHJ2LT5yZW1vdmUpIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIHNodXRkb3duLCBjYWxsaW5nIHJlbW92ZVxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCWRydi0+cmVtb3ZlKGRldik7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmZGV2LT5jb3JlLCAiJXM6JWQ6IG5vIHNodXRkb3duIG1ldGhvZFxuIiwgX19mdW5jX18sCisJCQlfX0xJTkVfXyk7CisJCUJVRygpOworCX0KKworCXBzM192dWFydF9jbGVhbnVwKGRldik7CisKKwlkZXZfZGJnKCZkZXYtPmNvcmUsICIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAKIAl1cCgmdnVhcnRfYnVzX3ByaXYucHJvYmVfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwczNfdnVhcnRfc2h1dGRvd24oc3RydWN0IGRldmljZSAqX2RldikKK3N0YXRpYyBpbnQgX19pbml0IHBzM192dWFydF9idXNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYgPQotCQl0b19wczNfdnVhcnRfcG9ydF9kcml2ZXIoX2Rldi0+ZHJpdmVyKTsKLQotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQlkZXYtPmNvcmUuYnVzX2lkKTsKLQotCWlmIChkcnYtPnNodXRkb3duKQotCQlkcnYtPnNodXRkb3duKGRldik7Ci0JZWxzZQotCQlkZXZfZGJnKCZkZXYtPmNvcmUsICIlczolZDogJXMgbm8gc2h1dGRvd24gbWV0aG9kXG4iLCBfX2Z1bmNfXywKLQkJCV9fTElORV9fLCBkZXYtPmNvcmUuYnVzX2lkKTsKLX0KLQotLyoqCi0gKiBwczNfdnVhcnRfYnVzIC0gVGhlIHZ1YXJ0IGJ1cyBpbnN0YW5jZS4KLSAqCi0gKiBUaGUgdnVhcnQgaXMgbWFuYWdlZCBhcyBhIGJ1cyB0aGF0IHBvcnQgZGV2aWNlcyBjb25uZWN0IHRvLgotICovCi0KLXN0cnVjdCBidXNfdHlwZSBwczNfdnVhcnRfYnVzID0gewotICAgICAgICAubmFtZSA9ICJwczNfdnVhcnQiLAotCS5tYXRjaCA9IHBzM192dWFydF9tYXRjaCwKLQkucHJvYmUgPSBwczNfdnVhcnRfcHJvYmUsCi0JLnJlbW92ZSA9IHBzM192dWFydF9yZW1vdmUsCi0JLnNodXRkb3duID0gcHMzX3Z1YXJ0X3NodXRkb3duLAotfTsKLQotaW50IF9faW5pdCBwczNfdnVhcnRfYnVzX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCiAJcHJfZGVidWcoIiVzOiVkOlxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAogCWlmICghZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9QUzNfTFYxKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpbml0X01VVEVYKCZ2dWFydF9idXNfcHJpdi5wcm9iZV9tdXRleCk7Ci0JcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZwczNfdnVhcnRfYnVzKTsKLQlCVUdfT04ocmVzdWx0KTsKIAotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19leGl0IHBzM192dWFydF9idXNfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHBzM192dWFydF9idXNfZXhpdCh2b2lkKQogewogCXByX2RlYnVnKCIlczolZDpcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JYnVzX3VucmVnaXN0ZXIoJnBzM192dWFydF9idXMpOwogfQogCiBjb3JlX2luaXRjYWxsKHBzM192dWFydF9idXNfaW5pdCk7CiBtb2R1bGVfZXhpdChwczNfdnVhcnRfYnVzX2V4aXQpOwogCiAvKioKLSAqIHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlIC0gUmVtb3ZlIGEgdnVhcnQgcG9ydCBkZXZpY2UuCi0gKi8KLQotc3RhdGljIHZvaWQgcHMzX3Z1YXJ0X3BvcnRfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqX2RldikKLXsKLSNpZiBkZWZpbmVkKERFQlVHKQotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiA9IHRvX3BzM192dWFydF9wb3J0X2RldmljZShfZGV2KTsKLQotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JQlVHX09OKGRldi0+cHJpdiAmJiAiZm9yZ290IHRvIGZyZWUiKTsKLQltZW1zZXQoJmRldi0+Y29yZSwgMCwgc2l6ZW9mKGRldi0+Y29yZSkpOwotI2VuZGlmCi19Ci0KLS8qKgotICogcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyIC0gQWRkIGEgdnVhcnQgcG9ydCBkZXZpY2UuCi0gKi8KLQotaW50IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBkZXZfY291bnQgPSAxOwotCi0JQlVHX09OKGRldi0+cHJpdiAmJiAiZm9yZ290IHRvIGZyZWUiKTsKLQotCWRldi0+Y29yZS5wYXJlbnQgPSBOVUxMOwotCWRldi0+Y29yZS5idXMgPSAmcHMzX3Z1YXJ0X2J1czsKLQlkZXYtPmNvcmUucmVsZWFzZSA9IHBzM192dWFydF9wb3J0X3JlbGVhc2VfZGV2aWNlOwotCi0Jc25wcmludGYoZGV2LT5jb3JlLmJ1c19pZCwgc2l6ZW9mKGRldi0+Y29yZS5idXNfaWQpLCAidnVhcnRfJTAyeCIsCi0JCWRldl9jb3VudCsrKTsKLQotCWRldl9kYmcoJmRldi0+Y29yZSwgIiVzOiVkIHJlZ2lzdGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCi0JcmV0dXJuIGRldmljZV9yZWdpc3RlcigmZGV2LT5jb3JlKTsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwocHMzX3Z1YXJ0X3BvcnRfZGV2aWNlX3JlZ2lzdGVyKTsKLQotLyoqCiAgKiBwczNfdnVhcnRfcG9ydF9kcml2ZXJfcmVnaXN0ZXIgLSBBZGQgYSB2dWFydCBwb3J0IGRldmljZSBkcml2ZXIuCiAgKi8KIApAQCAtMTA4OSwxMiArMTI0NSwxOCBAQAogewogCWludCByZXN1bHQ7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6ICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLm5hbWUpOwotCWRydi0+Y29yZS5idXMgPSAmcHMzX3Z1YXJ0X2J1czsKLQlyZXN1bHQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZSk7CisJcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5jb3JlLm5hbWUpOworCisJQlVHX09OKCFkcnYtPmNvcmUubWF0Y2hfaWQpOworCUJVR19PTighZHJ2LT5jb3JlLmNvcmUubmFtZSk7CisKKwlkcnYtPmNvcmUucHJvYmUgPSBwczNfdnVhcnRfcHJvYmU7CisJZHJ2LT5jb3JlLnJlbW92ZSA9IHBzM192dWFydF9yZW1vdmU7CisJZHJ2LT5jb3JlLnNodXRkb3duID0gcHMzX3Z1YXJ0X3NodXRkb3duOworCisJcmVzdWx0ID0gcHMzX3N5c3RlbV9idXNfZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmNvcmUpOwogCXJldHVybiByZXN1bHQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3Rlcik7CiAKIC8qKgpAQCAtMTEwMyw4ICsxMjY1LDcgQEAKIAogdm9pZCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpCiB7Ci0JcHJfZGVidWcoIiVzOiVkOiAoJXMpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGRydi0+Y29yZS5uYW1lKTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlKTsKKwlwcl9kZWJ1ZygiJXM6JWQ6ICglcylcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgZHJ2LT5jb3JlLmNvcmUubmFtZSk7CisJcHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+Y29yZSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHBzM192dWFydF9wb3J0X2RyaXZlcl91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmggYi9kcml2ZXJzL3BzMy92dWFydC5oCmluZGV4IDFiZTk5MmQuLmViN2Y2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHMzL3Z1YXJ0LmgKKysrIGIvZHJpdmVycy9wczMvdnVhcnQuaApAQCAtMzQsMjkgKzM0LDcgQEAKIHN0cnVjdCBwczNfdnVhcnRfd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJdW5zaWduZWQgbG9uZyB0cmlnZ2VyOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlKiBkZXY7IC8qIHRvIGNvbnZlcnQgd29yayB0byBkZXZpY2UgKi8KLX07Ci0KLS8qKgotICogc3RydWN0IHBzM192dWFydF9wb3J0X3ByaXYgLSBwcml2YXRlIHZ1YXJ0IGRldmljZSBkYXRhLgotICovCi0KLXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2IHsKLQl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7Ci0JdTY0IGludGVycnVwdF9tYXNrOwotCi0Jc3RydWN0IHsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Ci0JfSB0eF9saXN0OwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGxvbmcgYnl0ZXNfaGVsZDsKLQkJc3BpbmxvY2tfdCBsb2NrOwotCQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWQ7Ci0JfSByeF9saXN0OwotCXN0cnVjdCBwczNfdnVhcnRfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IHBzM192dWFydF93b3JrIHdvcms7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2OyAvKiB0byBjb252ZXJ0IHdvcmsgdG8gZGV2aWNlICovCiB9OwogCiAvKioKQEAgLTY0LDMyICs0MiwzMCBAQAogICovCiAKIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgewotCWVudW0gcHMzX21hdGNoX2lkIG1hdGNoX2lkOwotCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGNvcmU7Ci0JaW50ICgqcHJvYmUpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7Ci0JaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICopOwotCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqKTsKLQlpbnQgKCp0eF9ldmVudCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQlpbnQgKCpyeF9ldmVudCkoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLQlpbnQgKCpkaXNjb25uZWN0X2V2ZW50KShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpOwotCS8qIGludCAoKnN1c3BlbmQpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsgKi8KLQkvKiBpbnQgKCpyZXN1bWUpKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKik7ICovCisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciBjb3JlOworCWludCAoKnByb2JlKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOworCWludCAoKnJlbW92ZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJdm9pZCAoKndvcmspKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJLyogaW50ICgqdHhfZXZlbnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7ICovCisJLyogaW50ICgqcnhfZXZlbnQpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7ICovCisJLyogaW50ICgqZGlzY29ubmVjdF9ldmVudCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsgKi8KKwkvKiBpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7ICovCisJLyogaW50ICgqcmVzdW1lKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICopOyAqLwogfTsKIAogaW50IHBzM192dWFydF9wb3J0X2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpOwogdm9pZCBwczNfdnVhcnRfcG9ydF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZHJpdmVyICpkcnYpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kcml2ZXIgKnRvX3BzM192dWFydF9wb3J0X2RyaXZlcigKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciAqCisJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3Z1YXJ0X2RydihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpfZGV2KQogewotCXJldHVybiBjb250YWluZXJfb2YoX2Rydiwgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciwgY29yZSk7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqc2JkID0KKwkJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3N5c3RlbV9idXNfZHJ2KF9kZXYpOworCUJVR19PTighc2JkKTsKKwlyZXR1cm4gY29udGFpbmVyX29mKHNiZCwgc3RydWN0IHBzM192dWFydF9wb3J0X2RyaXZlciwgY29yZSk7CiB9Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKnRvX3BzM192dWFydF9wb3J0X2RldmljZSgKLQlzdHJ1Y3QgZGV2aWNlICpfZGV2KQotewotCXJldHVybiBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSwgY29yZSk7Ci19Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKnBzM192dWFydF93b3JrX3RvX3BvcnRfZGV2aWNlKAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpwczNfdnVhcnRfd29ya190b19zeXN0ZW1fYnVzX2RldigKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl93b3JrKQogewogCXN0cnVjdCBwczNfdnVhcnRfd29yayAqdncgPSBjb250YWluZXJfb2YoX3dvcmssIHN0cnVjdCBwczNfdnVhcnRfd29yaywKQEAgLTk3LDE0ICs3MywxMyBAQAogCXJldHVybiB2dy0+ZGV2OwogfQogCi1pbnQgcHMzX3Z1YXJ0X3dyaXRlKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgY29uc3Qgdm9pZCogYnVmLAoraW50IHBzM192dWFydF93cml0ZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmJ1ZiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpOwotaW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwgdm9pZCogYnVmLAoraW50IHBzM192dWFydF9yZWFkKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwgdm9pZCAqYnVmLAogCXVuc2lnbmVkIGludCBieXRlcyk7Ci1pbnQgcHMzX3Z1YXJ0X3JlYWRfYXN5bmMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2LCB3b3JrX2Z1bmNfdCBmdW5jLAotCXVuc2lnbmVkIGludCBieXRlcyk7Ci12b2lkIHBzM192dWFydF9jYW5jZWxfYXN5bmMoc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSAqZGV2KTsKLXZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfdnVhcnRfcG9ydF9kZXZpY2UgKmRldiwKK2ludCBwczNfdnVhcnRfcmVhZF9hc3luYyhzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBieXRlcyk7Cit2b2lkIHBzM192dWFydF9jYW5jZWxfYXN5bmMoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKK3ZvaWQgcHMzX3Z1YXJ0X2NsZWFyX3J4X2J5dGVzKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKIAl1bnNpZ25lZCBpbnQgYnl0ZXMpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDRlNGMxMGEuLmNlYTQwMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMTAsNyArMTAsNiBAQAogCiBjb25maWcgUlRDX0NMQVNTCiAJdHJpc3RhdGUgIlJUQyBjbGFzcyIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAogCWRlZmF1bHQgbgogCXNlbGVjdCBSVENfTElCCiAJaGVscApAQCAtMTE5LDcgKzExOCw3IEBACiAJICB3aWxsIGJlIGNhbGxlZCBydGMtdGVzdC4KIAogY29tbWVudCAiSTJDIFJUQyBkcml2ZXJzIgotCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCiAKIGNvbmZpZyBSVENfRFJWX0RTMTMwNwogCXRyaXN0YXRlICJEYWxsYXMvTWF4aW0gRFMxMzA3LzM3LzM4LzM5LzQwLCBTVCBNNDFUMDAiCkBAIC0xNjAsMTEgKzE1OSwxMSBAQAogCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW1heDY5MDAuCiAKIGNvbmZpZyBSVENfRFJWX1JTNUMzNzIKLQl0cmlzdGF0ZSAiUmljb2ggUlM1QzM3MkEvQiIKKwl0cmlzdGF0ZSAiUmljb2ggUlM1QzM3MkEvQiwgUlY1QzM4NiwgUlY1QzM4N0EiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQotCSAgUmljb2ggUlM1QzM3MkEgYW5kIFJTNUMzNzJCIFJUQyBjaGlwcy4KKwkgIFJpY29oIFJTNUMzNzJBLCBSUzVDMzcyQiwgUlY1QzM4NiwgYW5kIFJWNUMzODdBIFJUQyBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtcnM1YzM3Mi4KQEAgLTIxMywxMiArMjEyLDQwIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wY2Y4NTgzLgogCitjb25maWcgUlRDX0RSVl9NNDFUODAKKwl0cmlzdGF0ZSAiU1QgTTQxVDgwIHNlcmllcyBSVEMiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgU1QgTTQxVDgwIFJUQyBjaGlwcyBzZXJpZXMuIEN1cnJlbnRseSBmb2xsb3dpbmcgY2hpcHMgYXJlCisJICBzdXBwb3J0ZWQ6IE00MVQ4MCwgTTQxVDgxLCBNNDFUODIsIE00MVQ4MywgTTQxU1Q4NCwgTTQxU1Q4NQorCSAgYW5kIE00MVNUODcuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLW00MXQ4MC4KKworY29uZmlnIFJUQ19EUlZfTTQxVDgwX1dEVAorCWJvb2wgIlNUIE00MVQ4MCBzZXJpZXMgUlRDIHdhdGNoZG9nIHRpbWVyIgorCWRlcGVuZHMgb24gUlRDX0RSVl9NNDFUODAKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICB3YXRjaGRvZyB0aW1lciBpbiBTVCBNNDFUODAgUlRDIGNoaXBzIHNlcmllcy4KKworY29uZmlnIFJUQ19EUlZfVFdMOTIzMzAKKwlib29sZWFuICJUSSBUV0w5MjMzMC9NZW5lbGF1cyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMgJiYgTUVORUxBVVMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJUQyBvbiB0aGUKKwkgIFRXTDkyMzMwICJNZW5lbGF1cyIgcG93ZXIgbWFuZ2VtZW50IGNoaXAsIHVzZWQgd2l0aCBPTUFQMgorCSAgcGxhdGZvcm1zLiAgVGhlIHN1cHBvcnQgaXMgaW50ZWdyYXRlZCB3aXRoIHRoZSByZXN0IG9mCisJICB0aGUgTWVuZWxhdXMgZHJpdmVyOyBpdCdzIG5vdCBzZXBhcmF0ZSBtb2R1bGUuCisKIGNvbW1lbnQgIlNQSSBSVEMgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNQSV9NQVNURVIKIAogY29uZmlnIFJUQ19EUlZfUlM1QzM0OAogCXRyaXN0YXRlICJSaWNvaCBSUzVDMzQ4QS9CIgotCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNQSQorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFNQSV9NQVNURVIKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlCiAJICBSaWNvaCBSUzVDMzQ4QSBhbmQgUlM1QzM0OEIgUlRDIGNoaXBzLgpAQCAtMjI4LDcgKzI1NSw3IEBACiAKIGNvbmZpZyBSVENfRFJWX01BWDY5MDIKIAl0cmlzdGF0ZSAiTWF4aW0gNjkwMiIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUEkKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTUElfTUFTVEVSCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCiAJICBNYXhpbSBNQVg2OTAyIFNQSSBSVEMgY2hpcC4KQEAgLTI0Niw3ICsyNzMsNyBAQAogY29uZmlnIFJUQ19EUlZfQ01PUwogCXRyaXN0YXRlICJQQy1zdHlsZSAnQ01PUyciCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgKFg4NiB8fCBBTFBIQSB8fCBBUk0yNiB8fCBBUk0gXAotCQl8fCBNMzJSIHx8IEFUQVJJIHx8IFBPV0VSUEMgfHwgTUlQUykKKwkJfHwgTTMyUiB8fCBBVEFSSSB8fCBQUEMgfHwgTUlQUykKIAloZWxwCiAJICBTYXkgInllcyIgaGVyZSB0byBnZXQgZGlyZWN0IHN1cHBvcnQgZm9yIHRoZSByZWFsIHRpbWUgY2xvY2sKIAkgIGZvdW5kIGluIGV2ZXJ5IFBDIG9yIEFDUEktYmFzZWQgc3lzdGVtLCBhbmQgc29tZSBvdGhlciBib2FyZHMuCkBAIC0yNjIsNiArMjg5LDEyIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1jbW9zLgogCitjb25maWcgUlRDX0RSVl9EUzEyMTYKKwl0cmlzdGF0ZSAiRGFsbGFzIERTMTIxNiIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTTklfUk0KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIERhbGxhcyBEUzEyMTYgUlRDIGNoaXBzLgorCiBjb25maWcgUlRDX0RSVl9EUzE1NTMKIAl0cmlzdGF0ZSAiRGFsbGFzIERTMTU1MyIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUwpAQCAtMjkyLDYgKzMyNSwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtbTQ4dDg2LgogCitjb25maWcgUlRDX0RSVl9NNDhUNTkKKwl0cmlzdGF0ZSAiU1QgTTQ4VDU5IgorCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgU1QgTTQ4VDU5IFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZSwgaWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkICJydGMtbTQ4dDU5Ii4KKwogY29uZmlnIFJUQ19EUlZfVjMwMjAKIAl0cmlzdGF0ZSAiRU0gTWljcm9lbGVjdHJvbmljIFYzMDIwIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTCkBAIC0zNzksNiArNDIyLDEzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtcGwwMzEuCiAKK2NvbmZpZyBSVENfRFJWX0FUMzJBUDcwMFgKKwl0cmlzdGF0ZSAiQVQzMkFQNzAwWCBzZXJpZXMgUlRDIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIFBMQVRGT1JNX0FUMzJBUAorCWhlbHAKKwkgIERyaXZlciBmb3IgdGhlIGludGVybmFsIFJUQyAoUmVhbHRpbWUgQ2xvY2spIG9uIEF0bWVsIEFWUjMyCisJICBBVDMyQVA3MDB4IGZhbWlseSBwcm9jZXNzb3JzLgorCiBjb25maWcgUlRDX0RSVl9BVDkxUk05MjAwCiAJdHJpc3RhdGUgIkFUOTFSTTkyMDAiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgQVJDSF9BVDkxUk05MjAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IGExYWZiYzIuLjMxMDlhZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9YMTIwNSkJKz0gcnRjLXgxMjA1Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0lTTDEyMDgpCSs9IHJ0Yy1pc2wxMjA4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX1RFU1QpCSs9IHJ0Yy10ZXN0Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0FUMzJBUDcwMFgpCSs9IHJ0Yy1hdDMyYXA3MDB4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTMwNykJKz0gcnRjLWRzMTMwNy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9EUzE2NzIpCSs9IHJ0Yy1kczE2NzIubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNzQyKQkrPSBydGMtZHMxNzQyLm8KQEAgLTI4LDYgKzI5LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX1JTNUMzNzIpCSs9IHJ0Yy1yczVjMzcyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1MzQykJKz0gcnRjLXMzYy5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzQ4KQkrPSBydGMtcnM1YzM0OC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9NNDFUODApCSs9IHJ0Yy1tNDF0ODAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDg2KQkrPSBydGMtbTQ4dDg2Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0RTMTU1MykJKz0gcnRjLWRzMTU1My5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzEzKQkrPSBydGMtcnM1YzMxMy5vCkBAIC00MSwzICs0Myw1IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxUk05MjAwKSs9IHJ0Yy1hdDkxcm05MjAwLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1NIKQkrPSBydGMtc2gubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQkZJTikJKz0gcnRjLWJmaW4ubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTTQ4VDU5KQkrPSBydGMtbTQ4dDU5Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTIxNikJKz0gcnRjLWRzMTIxNi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYXQzMmFwNzAweC5jIGIvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk5MjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWF0MzJhcDcwMHguYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIEFuIFJUQyBkcml2ZXIgZm9yIHRoZSBBVlIzMiBBVDMyQVA3MDB4IHByb2Nlc3NvciBzZXJpZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyoKKyAqIFRoaXMgaXMgYSBiYXJlLWJvbmVzIFJUQy4gSXQgcnVucyBkdXJpbmcgbW9zdCBzeXN0ZW0gc2xlZXAgc3RhdGVzLCBidXQgaGFzCisgKiBubyBiYXR0ZXJ5IGJhY2t1cCBhbmQgZ2V0cyByZXNldCBkdXJpbmcgc3lzdGVtIHJlc3RhcnQuICBJdCBtdXN0IGJlCisgKiBpbml0aWFsaXplZCBmcm9tIGFuIGV4dGVybmFsIGNsb2NrIChuZXR3b3JrLCBJMkMsIGV0YykgYmVmb3JlIGl0IGNhbiBiZSBvZgorICogbXVjaCB1c2UuCisgKgorICogVGhlIGFsYXJtIGZ1bmN0aW9uYWxpdHkgaXMgbGltaXRlZCBieSB0aGUgaGFyZHdhcmUsIG5vdCBzdXBwb3J0aW5nCisgKiBwZXJpb2RpYyBpbnRlcnJ1cHRzLgorICovCisKKyNkZWZpbmUgUlRDX0NUUkwJCTB4MDAKKyNkZWZpbmUgUlRDX0NUUkxfRU4JCSAgIDAKKyNkZWZpbmUgUlRDX0NUUkxfUENMUgkJICAgMQorI2RlZmluZSBSVENfQ1RSTF9UT1BFTgkJICAgMgorI2RlZmluZSBSVENfQ1RSTF9QU0VMCQkgICA4CisKKyNkZWZpbmUgUlRDX1ZBTAkJCTB4MDQKKworI2RlZmluZSBSVENfVE9QCQkJMHgwOAorCisjZGVmaW5lIFJUQ19JRVIJCQkweDEwCisjZGVmaW5lIFJUQ19JRVJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JRFIJCQkweDE0CisjZGVmaW5lIFJUQ19JRFJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JTVIJCQkweDE4CisjZGVmaW5lIFJUQ19JTVJfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JU1IJCQkweDFjCisjZGVmaW5lIFJUQ19JU1JfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19JQ1IJCQkweDIwCisjZGVmaW5lIFJUQ19JQ1JfVE9QSQkJICAgMAorCisjZGVmaW5lIFJUQ19CSVQobmFtZSkJCSgxIDw8IFJUQ18jI25hbWUpCisjZGVmaW5lIFJUQ19CRihuYW1lLCB2YWx1ZSkJKCh2YWx1ZSkgPDwgUlRDXyMjbmFtZSkKKworI2RlZmluZSBydGNfcmVhZGwoZGV2LCByZWcpCQkJCVwKKwlfX3Jhd19yZWFkbCgoZGV2KS0+cmVncyArIFJUQ18jI3JlZykKKyNkZWZpbmUgcnRjX3dyaXRlbChkZXYsIHJlZywgdmFsdWUpCQkJXAorCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAoZGV2KS0+cmVncyArIFJUQ18jI3JlZykKKworc3RydWN0IHJ0Y19hdDMyYXA3MDB4IHsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJdW5zaWduZWQgbG9uZwkJYWxhcm1fdGltZTsKKwl1bnNpZ25lZCBsb25nCQlpcnE7CisJLyogUHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgcmVnaXN0ZXIgYWNjZXNzLiAqLworCXNwaW5sb2NrX3QJCWxvY2s7Cit9OworCitzdGF0aWMgaW50IGF0MzJfcnRjX3JlYWR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgbm93OworCisJbm93ID0gcnRjX3JlYWRsKHJ0YywgVkFMKTsKKwlydGNfdGltZV90b190bShub3csIHRtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBub3c7CisJaW50IHJldDsKKworCXJldCA9IHJ0Y190bV90b190aW1lKHRtLCAmbm93KTsKKwlpZiAocmV0ID09IDApCisJCXJ0Y193cml0ZWwocnRjLCBWQUwsIG5vdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0MzJfcnRjX3JlYWRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfdGltZV90b190bShydGMtPmFsYXJtX3RpbWUsICZhbHJtLT50aW1lKTsKKwlhbHJtLT5wZW5kaW5nID0gcnRjX3JlYWRsKHJ0YywgSU1SKSAmIFJUQ19CSVQoSU1SX1RPUEkpID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdDMyX3J0Y19zZXRhbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBydGNfdW5peF90aW1lOworCXVuc2lnbmVkIGxvbmcgYWxhcm1fdW5peF90aW1lOworCWludCByZXQ7CisKKwlydGNfdW5peF90aW1lID0gcnRjX3JlYWRsKHJ0YywgVkFMKTsKKworCXJldCA9IHJ0Y190bV90b190aW1lKCZhbHJtLT50aW1lLCAmYWxhcm1fdW5peF90aW1lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFsYXJtX3VuaXhfdGltZSA8IHJ0Y191bml4X3RpbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKwlydGMtPmFsYXJtX3RpbWUgPSBhbGFybV91bml4X3RpbWU7CisJcnRjX3dyaXRlbChydGMsIFRPUCwgcnRjLT5hbGFybV90aW1lKTsKKwlpZiAoYWxybS0+cGVuZGluZykKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJfCBSVENfQklUKENUUkxfVE9QRU4pKTsKKwllbHNlCisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBydGNfcmVhZGwocnRjLCBDVFJMKQorCQkJCSYgflJUQ19CSVQoQ1RSTF9UT1BFTikpOworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXQzMl9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHJ0Y19hdDMyYXA3MDB4ICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PTjoKKwkJaWYgKHJ0Y19yZWFkbChydGMsIFZBTCkgPiBydGMtPmFsYXJtX3RpbWUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlydGNfd3JpdGVsKHJ0YywgQ1RSTCwgcnRjX3JlYWRsKHJ0YywgQ1RSTCkKKwkJCQl8IFJUQ19CSVQoQ1RSTF9UT1BFTikpOworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRVIsIFJUQ19CSVQoSUVSX1RPUEkpKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJJiB+UlRDX0JJVChDVFJMX1RPUEVOKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRFIsIFJUQ19CSVQoSURSX1RPUEkpKTsKKwkJcnRjX3dyaXRlbChydGMsIElDUiwgUlRDX0JJVChJQ1JfVE9QSSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdDMyX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gKHN0cnVjdCBydGNfYXQzMmFwNzAweCAqKWRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGlzciA9IHJ0Y19yZWFkbChydGMsIElTUik7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCWludCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKworCWlmIChpc3IgJiBSVENfQklUKElTUl9UT1BJKSkgeworCQlydGNfd3JpdGVsKHJ0YywgSUNSLCBSVENfQklUKElDUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBJRFIsIFJUQ19CSVQoSURSX1RPUEkpKTsKKwkJcnRjX3dyaXRlbChydGMsIENUUkwsIHJ0Y19yZWFkbChydGMsIENUUkwpCisJCQkJJiB+UlRDX0JJVChDVFJMX1RPUEVOKSk7CisJCXJ0Y193cml0ZWwocnRjLCBWQUwsIHJ0Yy0+YWxhcm1fdGltZSk7CisJCWV2ZW50cyA9IFJUQ19BRiB8IFJUQ19JUlFGOworCQlydGNfdXBkYXRlX2lycShydGMtPnJ0YywgMSwgZXZlbnRzKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJc3Bpbl91bmxvY2soJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgYXQzMl9ydGNfb3BzID0geworCS5pb2N0bAkJPSBhdDMyX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gYXQzMl9ydGNfcmVhZHRpbWUsCisJLnNldF90aW1lCT0gYXQzMl9ydGNfc2V0dGltZSwKKwkucmVhZF9hbGFybQk9IGF0MzJfcnRjX3JlYWRhbGFybSwKKwkuc2V0X2FsYXJtCT0gYXQzMl9ydGNfc2V0YWxhcm0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdDMyX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZQkqcmVnczsKKwlzdHJ1Y3QgcnRjX2F0MzJhcDcwMHggKnJ0YzsKKwlpbnQgaXJxID0gLTE7CisJaW50IHJldDsKKworCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydGNfYXQzMmFwNzAweCksIEdGUF9LRVJORUwpOworCWlmICghcnRjKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3MpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gbW1pbyByZXNvdXJjZSBkZWZpbmVkXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgaXJxXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGF0MzJfcnRjX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJydGMiLCBydGMpOworCWlmIChyZXQpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlcXVlc3QgaXJxICVkXG4iLCBpcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlydGMtPmlycSA9IGlycTsKKwlydGMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOworCWlmICghcnRjLT5yZWdzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBtYXAgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKwlzcGluX2xvY2tfaW5pdCgmcnRjLT5sb2NrKTsKKworCS8qCisJICogTWF5YmUgaW5pdCBSVEM6IGNvdW50IGZyb20gemVybyBhdCAxIEh6LCBkaXNhYmxlIHdyYXAgaXJxLgorCSAqCisJICogRG8gbm90IHJlc2V0IFZBTCByZWdpc3RlciwgYXMgaXQgY2FuIGhvbGQgYW4gb2xkIHRpbWUKKwkgKiBmcm9tIGxhc3QgSlRBRyByZXNldC4KKwkgKi8KKwlpZiAoIShydGNfcmVhZGwocnRjLCBDVFJMKSAmIFJUQ19CSVQoQ1RSTF9FTikpKSB7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBSVENfQklUKENUUkxfUENMUikpOworCQlydGNfd3JpdGVsKHJ0YywgSURSLCBSVENfQklUKElEUl9UT1BJKSk7CisJCXJ0Y193cml0ZWwocnRjLCBDVFJMLCBSVENfQkYoQ1RSTF9QU0VMLCAweGUpCisJCQkJfCBSVENfQklUKENUUkxfRU4pKTsKKwl9CisKKwlydGMtPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkmYXQzMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMtPnJ0YykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIHJ0YyBkZXZpY2VcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJ0Yy0+cnRjKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBydGMpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkF0bWVsIFJUQyBmb3IgQVQzMkFQNzAweCBhdCAlMDhseCBpcnEgJWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcnRjLT5yZWdzLCBydGMtPmlycSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2lvdW5tYXA6CisJaW91bm1hcChydGMtPnJlZ3MpOworb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycSwgcnRjKTsKK291dDoKKwlrZnJlZShydGMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGF0MzJfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfYXQzMmFwNzAweCAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmcmVlX2lycShydGMtPmlycSwgcnRjKTsKKwlpb3VubWFwKHJ0Yy0+cmVncyk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yy0+cnRjKTsKKwlrZnJlZShydGMpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BTElBUygiYXQzMmFwNzAweF9ydGMiKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQzMl9ydGNfZHJpdmVyID0geworCS5yZW1vdmUJCT0gX19leGl0X3AoYXQzMl9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXQzMmFwNzAweF9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQzMl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0MzJfcnRjX2RyaXZlciwgYXQzMl9ydGNfcHJvYmUpOworfQorbW9kdWxlX2luaXQoYXQzMl9ydGNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdDMyX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0MzJfcnRjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhdDMyX3J0Y19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSGFucy1DaHJpc3RpYW4gRWd0dmVkdCA8aGNlZ3R2ZWR0QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbCB0aW1lIGNsb2NrIGZvciBBVlIzMiBBVDMyQVA3MDB4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggZjRlNWYwMC4uMzA0NTM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtMzQxLDYgKzM0MSw4IEBACiAJY2FzZSBSVENfSVJRUF9SRUFEOgogCQlpZiAob3BzLT5pcnFfc2V0X2ZyZXEpCiAJCQllcnIgPSBwdXRfdXNlcihydGMtPmlycV9mcmVxLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKil1YXJnKTsKKwkJZWxzZQorCQkJZXJyID0gLUVOT1RUWTsKIAkJYnJlYWs7CiAKIAljYXNlIFJUQ19JUlFQX1NFVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEyMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VmYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTIxNi5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogRGFsbGFzIERTMTIxNiBSVEMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBCb2dlbmRvZXJmZXIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisKK3N0cnVjdCBkczEyMTZfcmVncyB7CisJdTggdHNlYzsKKwl1OCBzZWM7CisJdTggbWluOworCXU4IGhvdXI7CisJdTggd2RheTsKKwl1OCBtZGF5OworCXU4IG1vbnRoOworCXU4IHllYXI7Cit9OworCisjZGVmaW5lIERTMTIxNl9IT1VSXzEyMjQJKDEgPDwgNykKKyNkZWZpbmUgRFMxMjE2X0hPVVJfQU1QTQkoMSA8PCA1KQorCitzdHJ1Y3QgZHMxMjE2X3ByaXYgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJc2l6ZV90IHNpemU7CisJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKK307CisKK3N0YXRpYyBjb25zdCB1OCBtYWdpY1tdID0geworCTB4YzUsIDB4M2EsIDB4YTMsIDB4NWMsIDB4YzUsIDB4M2EsIDB4YTMsIDB4NWMKK307CisKKy8qCisgKiBSZWFkIHRoZSA2NCBiaXQgd2UnZCBsaWtlIHRvIGhhdmUgLSBJdCBhIHNlcmllcworICogb2YgNjQgYml0cyBzaG93aW5nIHVwIGluIHRoZSBMU0Igb2YgdGhlIGJhc2UgcmVnaXN0ZXIuCisgKgorICovCitzdGF0aWMgdm9pZCBkczEyMTZfcmVhZCh1OCBfX2lvbWVtICppb2FkZHIsIHU4ICpidWYpCit7CisJdW5zaWduZWQgY2hhciBjOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQljID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWMgfD0gKHJlYWRiKGlvYWRkcikgJiAweDEpIDw8IGo7CisJCWJ1ZltpXSA9IGM7CisJfQorfQorCitzdGF0aWMgdm9pZCBkczEyMTZfd3JpdGUodTggX19pb21lbSAqaW9hZGRyLCBjb25zdCB1OCAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYyA9IGJ1ZltpXTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJd3JpdGViKGMsIGlvYWRkcik7CisJCQljID0gYyA+PiAxOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHU4IF9faW9tZW0gKmlvYWRkcikKK3sKKwkvKiBSZXNldCBtYWdpYyBwb2ludGVyICovCisJcmVhZGIoaW9hZGRyKTsKKwkvKiBXcml0ZSA2NCBiaXQgbWFnaWMgdG8gRFMxMjE2ICovCisJZHMxMjE2X3dyaXRlKGlvYWRkciwgbWFnaWMpOworfQorCitzdGF0aWMgaW50IGRzMTIxNl9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRzMTIxNl9yZWdzIHJlZ3M7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCAodTggKikmcmVncyk7CisKKwl0bS0+dG1fc2VjID0gQkNEMkJJTihyZWdzLnNlYyk7CisJdG0tPnRtX21pbiA9IEJDRDJCSU4ocmVncy5taW4pOworCWlmIChyZWdzLmhvdXIgJiBEUzEyMTZfSE9VUl8xMjI0KSB7CisJCS8qIEFNL1BNIG1vZGUgKi8KKwkJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKHJlZ3MuaG91ciAmIDB4MWYpOworCQlpZiAocmVncy5ob3VyICYgRFMxMjE2X0hPVVJfQU1QTSkKKwkJCXRtLT50bV9ob3VyICs9IDEyOworCX0gZWxzZQorCQl0bS0+dG1faG91ciA9IEJDRDJCSU4ocmVncy5ob3VyICYgMHgzZik7CisJdG0tPnRtX3dkYXkgPSAocmVncy53ZGF5ICYgNykgLSAxOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTihyZWdzLm1kYXkgJiAweDNmKTsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTihyZWdzLm1vbnRoICYgMHgxZik7CisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKHJlZ3MueWVhcik7CisJaWYgKHRtLT50bV95ZWFyIDwgNzApCisJCXRtLT50bV95ZWFyICs9IDEwMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczEyMTZfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGRzMTIxNl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRzMTIxNl9yZWdzIHJlZ3M7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3JlYWQocHJpdi0+aW9hZGRyLCAodTggKikmcmVncyk7CisKKwlyZWdzLnRzZWMgPSAwOyAvKiBjbGVhciAwLjEgYW5kIDAuMDEgc2Vjb25kcyAqLworCXJlZ3Muc2VjID0gQklOMkJDRCh0bS0+dG1fc2VjKTsKKwlyZWdzLm1pbiA9IEJJTjJCQ0QodG0tPnRtX21pbik7CisJcmVncy5ob3VyICY9IERTMTIxNl9IT1VSXzEyMjQ7CisJaWYgKHJlZ3MuaG91ciAmJiB0bS0+dG1faG91ciA+IDEyKSB7CisJCXJlZ3MuaG91ciB8PSBEUzEyMTZfSE9VUl9BTVBNOworCQl0bS0+dG1faG91ciAtPSAxMjsKKwl9CisJcmVncy5ob3VyIHw9IEJJTjJCQ0QodG0tPnRtX2hvdXIpOworCXJlZ3Mud2RheSAmPSB+NzsKKwlyZWdzLndkYXkgfD0gdG0tPnRtX3dkYXk7CisJcmVncy5tZGF5ID0gQklOMkJDRCh0bS0+dG1fbWRheSk7CisJcmVncy5tb250aCA9IEJJTjJCQ0QodG0tPnRtX21vbik7CisJcmVncy55ZWFyID0gQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCk7CisKKwlkczEyMTZfc3dpdGNoX2RzX3RvX2Nsb2NrKHByaXYtPmlvYWRkcik7CisJZHMxMjE2X3dyaXRlKHByaXYtPmlvYWRkciwgKHU4ICopJnJlZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgZHMxMjE2X3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IGRzMTIxNl9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IGRzMTIxNl9ydGNfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkczEyMTZfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZHMxMjE2X3ByaXYgKnByaXY7CisJaW50IHJldCA9IDA7CisJdTggZHVtbXlbOF07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwcml2ID0ga3phbGxvYyhzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdi0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcHJpdi0+c2l6ZSwgcGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJcHJpdi0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCXByaXYtPmlvYWRkciA9IGlvcmVtYXAocHJpdi0+YmFzZWFkZHIsIHByaXYtPnNpemUpOworCWlmICghcHJpdi0+aW9hZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJkczEyMTYiLCAmcGRldi0+ZGV2LAorCQkJCSAgJmRzMTIxNl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBvdXQ7CisJfQorCXByaXYtPnJ0YyA9IHJ0YzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCS8qIGR1bW15IHJlYWQgdG8gZ2V0IGNsb2NrIGludG8gYSBrbm93biBzdGF0ZSAqLworCWRzMTIxNl9yZWFkKHByaXYtPmlvYWRkciwgZHVtbXkpOworCXJldHVybiAwOworCitvdXQ6CisJaWYgKHByaXYtPnJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaWYgKHByaXYtPmlvYWRkcikKKwkJaW91bm1hcChwcml2LT5pb2FkZHIpOworCWlmIChwcml2LT5iYXNlYWRkcikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHByaXYtPmJhc2VhZGRyLCBwcml2LT5zaXplKTsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEyMTZfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkczEyMTZfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnJ0Yyk7CisJaW91bm1hcChwcml2LT5pb2FkZHIpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwcml2LT5iYXNlYWRkciwgcHJpdi0+c2l6ZSk7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJydGMtZHMxMjE2IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gZHMxMjE2X3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTIxNl9ydGNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRzMTIxNl9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzMTIxNl9ydGNfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRzMTIxNl9ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkczEyMTZfcnRjX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBCb2dlbmRvZXJmZXIgPHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRTMTIxNiBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGRzMTIxNl9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChkczEyMTZfcnRjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCmluZGV4IDNmMGY3YjguLjUxNThhNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA3LmMKQEAgLTI0LDI5ICsyNCwyOSBAQAogICogc2V0dGluZyB0aGUgZGF0ZSBhbmQgdGltZSksIExpbnV4IGNhbiBpZ25vcmUgdGhlIG5vbi1jbG9jayBmZWF0dXJlcy4KICAqIFRoYXQncyBhIG5hdHVyYWwgam9iIGZvciBhIGZhY3Rvcnkgb3IgcmVwYWlyIGJlbmNoLgogICoKLSAqIElmIHRoZSBJMkMgImZvcmNlIiBtZWNoYW5pc20gaXMgdXNlZCwgd2UgYXNzdW1lIHRoZSBjaGlwIGlzIGEgZHMxMzM3LgotICogKE11Y2ggYmV0dGVyIHdvdWxkIGJlIGJvYXJkLXNwZWNpZmljIHRhYmxlcyBvZiBJMkMgZGV2aWNlcywgYWxvbmcgd2l0aAotICogdGhlIHBsYXRmb3JtX2RhdGEgZHJpdmVycyB3b3VsZCB1c2UgdG8gc29ydCBzdWNoIGlzc3VlcyBvdXQuKQorICogVGhpcyBpcyBjdXJyZW50bHkgYSBzaW1wbGUgbm8tYWxhcm1zIGRyaXZlci4gIElmIHlvdXIgYm9hcmQgaGFzIHRoZQorICogYWxhcm0gaXJxIHdpcmVkIHVwIG9uIGEgZHMxMzM3IG9yIGRzMTMzOSwgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGF0LAorICogdGhlbiBsb29rIGF0IHRoZSBydGMtcnM1YzM3MiBkcml2ZXIgZm9yIGNvZGUgdG8gc3RlYWwuLi4KICAqLwogZW51bSBkc190eXBlIHsKLQl1bmtub3duID0gMCwKLQlkc18xMzA3LAkJLyogb3IgZHMxMzM4LCAuLi4gKi8KLQlkc18xMzM3LAkJLyogb3IgZHMxMzM5LCAuLi4gKi8KLQlkc18xMzQwLAkJLyogb3Igc3QgbTQxdDAwLCAuLi4gKi8KKwlkc18xMzA3LAorCWRzXzEzMzcsCisJZHNfMTMzOCwKKwlkc18xMzM5LAorCWRzXzEzNDAsCisJbTQxdDAwLAogCS8vIHJzNWMzNzIgdG9vPyAgZGlmZmVyZW50IGFkZHJlc3MuLi4KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NjgsIEkyQ19DTElFTlRfRU5EIH07Ci0KLUkyQ19DTElFTlRfSU5TTU9EOwotCi0KIAogLyogUlRDIHJlZ2lzdGVycyBkb24ndCBkaWZmZXIgbXVjaCwgZXhjZXB0IGZvciB0aGUgY2VudHVyeSBmbGFnICovCiAjZGVmaW5lIERTMTMwN19SRUdfU0VDUwkJMHgwMAkvKiAwMC01OSAqLwogIwlkZWZpbmUgRFMxMzA3X0JJVF9DSAkJMHg4MAorIwlkZWZpbmUgRFMxMzQwX0JJVF9uRU9TQwkJMHg4MAogI2RlZmluZSBEUzEzMDdfUkVHX01JTgkJMHgwMQkvKiAwMC01OSAqLwogI2RlZmluZSBEUzEzMDdfUkVHX0hPVVIJCTB4MDIJLyogMDAtMjMsIG9yIDEtMTJ7YW0scG19ICovCisjCWRlZmluZSBEUzEzMDdfQklUXzEySFIJCTB4NDAJLyogaW4gUkVHX0hPVVIgKi8KKyMJZGVmaW5lIERTMTMwN19CSVRfUE0JCTB4MjAJLyogaW4gUkVHX0hPVVIgKi8KICMJZGVmaW5lIERTMTM0MF9CSVRfQ0VOVFVSWV9FTgkweDgwCS8qIGluIFJFR19IT1VSICovCiAjCWRlZmluZSBEUzEzNDBfQklUX0NFTlRVUlkJMHg0MAkvKiBpbiBSRUdfSE9VUiAqLwogI2RlZmluZSBEUzEzMDdfUkVHX1dEQVkJCTB4MDMJLyogMDEtMDcgKi8KQEAgLTU2LDExICs1NiwxMiBAQAogI2RlZmluZSBEUzEzMDdfUkVHX1lFQVIJCTB4MDYJLyogMDAtOTkgKi8KIAogLyogT3RoZXIgcmVnaXN0ZXJzIChjb250cm9sLCBzdGF0dXMsIGFsYXJtcywgdHJpY2tsZSBjaGFyZ2UsIE5WUkFNLCBldGMpCi0gKiBzdGFydCBhdCA3LCBhbmQgdGhleSBkaWZmZXIgYSBsb3QuIE9ubHkgY29udHJvbCBhbmQgc3RhdHVzIG1hdHRlciBmb3IgUlRDOwotICogYmUgY2FyZWZ1bCB1c2luZyB0aGVtLgorICogc3RhcnQgYXQgNywgYW5kIHRoZXkgZGlmZmVyIGEgTE9ULiBPbmx5IGNvbnRyb2wgYW5kIHN0YXR1cyBtYXR0ZXIgZm9yCisgKiBiYXNpYyBSVEMgZGF0ZSBhbmQgdGltZSBmdW5jdGlvbmFsaXR5OyBiZSBjYXJlZnVsIHVzaW5nIHRoZW0uCiAgKi8KLSNkZWZpbmUgRFMxMzA3X1JFR19DT05UUk9MCTB4MDcKKyNkZWZpbmUgRFMxMzA3X1JFR19DT05UUk9MCTB4MDcJCS8qIG9yIGRzMTMzOCAqLwogIwlkZWZpbmUgRFMxMzA3X0JJVF9PVVQJCTB4ODAKKyMJZGVmaW5lIERTMTMzOF9CSVRfT1NGCQkweDIwCiAjCWRlZmluZSBEUzEzMDdfQklUX1NRV0UJCTB4MTAKICMJZGVmaW5lIERTMTMwN19CSVRfUlMxCQkweDAyCiAjCWRlZmluZSBEUzEzMDdfQklUX1JTMAkJMHgwMQpAQCAtNzEsNiArNzIsMTMgQEAKICMJZGVmaW5lIERTMTMzN19CSVRfSU5UQ04JCTB4MDQKICMJZGVmaW5lIERTMTMzN19CSVRfQTJJRQkJMHgwMgogIwlkZWZpbmUgRFMxMzM3X0JJVF9BMUlFCQkweDAxCisjZGVmaW5lIERTMTM0MF9SRUdfQ09OVFJPTAkweDA3CisjCWRlZmluZSBEUzEzNDBfQklUX09VVAkJMHg4MAorIwlkZWZpbmUgRFMxMzQwX0JJVF9GVAkJMHg0MAorIwlkZWZpbmUgRFMxMzQwX0JJVF9DQUxJQl9TSUdOCTB4MjAKKyMJZGVmaW5lIERTMTM0MF9NX0NBTElCUkFUSU9OCTB4MWYKKyNkZWZpbmUgRFMxMzQwX1JFR19GTEFHCQkweDA5CisjCWRlZmluZSBEUzEzNDBfQklUX09TRgkJMHg4MAogI2RlZmluZSBEUzEzMzdfUkVHX1NUQVRVUwkweDBmCiAjCWRlZmluZSBEUzEzMzdfQklUX09TRgkJMHg4MAogIwlkZWZpbmUgRFMxMzM3X0JJVF9BMkkJCTB4MDIKQEAgLTg0LDIxICs5Miw2MyBAQAogCXU4CQkJcmVnc1s4XTsKIAllbnVtIGRzX3R5cGUJCXR5cGU7CiAJc3RydWN0IGkyY19tc2cJCW1zZ1syXTsKLQlzdHJ1Y3QgaTJjX2NsaWVudAljbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudAlkZXY7CiAJc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YzsKIH07CiAKK3N0cnVjdCBjaGlwX2Rlc2MgeworCWNoYXIJCQluYW1lWzldOworCXVuc2lnbmVkCQludnJhbTU2OjE7CisJdW5zaWduZWQJCWFsYXJtOjE7CisJZW51bSBkc190eXBlCQl0eXBlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MgY2hpcHNbXSA9IHsgeworCS5uYW1lCQk9ICJkczEzMDciLAorCS50eXBlCQk9IGRzXzEzMDcsCisJLm52cmFtNTYJPSAxLAorfSwgeworCS5uYW1lCQk9ICJkczEzMzciLAorCS50eXBlCQk9IGRzXzEzMzcsCisJLmFsYXJtCQk9IDEsCit9LCB7CisJLm5hbWUJCT0gImRzMTMzOCIsCisJLnR5cGUJCT0gZHNfMTMzOCwKKwkubnZyYW01Ngk9IDEsCit9LCB7CisJLm5hbWUJCT0gImRzMTMzOSIsCisJLnR5cGUJCT0gZHNfMTMzOSwKKwkuYWxhcm0JCT0gMSwKK30sIHsKKwkubmFtZQkJPSAiZHMxMzQwIiwKKwkudHlwZQkJPSBkc18xMzQwLAorfSwgeworCS5uYW1lCQk9ICJtNDF0MDAiLAorCS50eXBlCQk9IG00MXQwMCwKK30sIH07CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGNoaXBfZGVzYyAqZmluZF9jaGlwKGNvbnN0IGNoYXIgKnMpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoaXBzKTsgaSsrKQorCQlpZiAoc3RybmljbXAocywgY2hpcHNbaV0ubmFtZSwgc2l6ZW9mIGNoaXBzW2ldLm5hbWUpID09IDApCisJCQlyZXR1cm4gJmNoaXBzW2ldOworCXJldHVybiBOVUxMOworfQogCiBzdGF0aWMgaW50IGRzMTMwN19nZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKIHsKIAlzdHJ1Y3QgZHMxMzA3CSpkczEzMDcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQJCXRtcDsKIAotCS8qIHJlYWQgdGhlIFJUQyByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KKwkvKiByZWFkIHRoZSBSVEMgZGF0ZSBhbmQgdGltZSByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KIAlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOwogCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDc7CiAKLQl0bXAgPSBpMmNfdHJhbnNmZXIoZHMxMzA3LT5jbGllbnQuYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCXRtcCA9IGkyY190cmFuc2Zlcih0b19pMmNfYWRhcHRlcihkczEzMDctPmNsaWVudC0+ZGV2LnBhcmVudCksCisJCQlkczEzMDctPm1zZywgMik7CiAJaWYgKHRtcCAhPSAyKSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJyZWFkIiwgdG1wKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0xMjksNyArMTc5LDggQEAKIAkJdC0+dG1faG91ciwgdC0+dG1fbWRheSwKIAkJdC0+dG1fbW9uLCB0LT50bV95ZWFyLCB0LT50bV93ZGF5KTsKIAotCXJldHVybiAwOworCS8qIGluaXRpYWwgY2xvY2sgc2V0dGluZyBjYW4gYmUgdW5kZWZpbmVkICovCisJcmV0dXJuIHJ0Y192YWxpZF90bSh0KTsKIH0KIAogc3RhdGljIGludCBkczEzMDdfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnQpCkBAIC0xNTcsMTEgKzIwOCwxOCBAQAogCXRtcCA9IHQtPnRtX3llYXIgLSAxMDA7CiAJYnVmW0RTMTMwN19SRUdfWUVBUl0gPSBCSU4yQkNEKHRtcCk7CiAKLQlpZiAoZHMxMzA3LT50eXBlID09IGRzXzEzMzcpCisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzMzc6CisJY2FzZSBkc18xMzM5OgogCQlidWZbRFMxMzA3X1JFR19NT05USF0gfD0gRFMxMzM3X0JJVF9DRU5UVVJZOwotCWVsc2UgaWYgKGRzMTMwNy0+dHlwZSA9PSBkc18xMzQwKQorCQlicmVhazsKKwljYXNlIGRzXzEzNDA6CiAJCWJ1ZltEUzEzMDdfUkVHX0hPVVJdIHw9IERTMTM0MF9CSVRfQ0VOVFVSWV9FTgogCQkJCXwgRFMxMzQwX0JJVF9DRU5UVVJZOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlkczEzMDctPm1zZ1sxXS5mbGFncyA9IDA7CiAJZHMxMzA3LT5tc2dbMV0ubGVuID0gODsKQEAgLTE3MCw3ICsyMjgsOCBAQAogCQkid3JpdGUiLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCiAJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0pOwogCi0JcmVzdWx0ID0gaTJjX3RyYW5zZmVyKGRzMTMwNy0+Y2xpZW50LmFkYXB0ZXIsICZkczEzMDctPm1zZ1sxXSwgMSk7CisJcmVzdWx0ID0gaTJjX3RyYW5zZmVyKHRvX2kyY19hZGFwdGVyKGRzMTMwNy0+Y2xpZW50LT5kZXYucGFyZW50KSwKKwkJCSZkczEzMDctPm1zZ1sxXSwgMSk7CiAJaWYgKHJlc3VsdCAhPSAxKSB7CiAJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJ3cml0ZSIsIHRtcCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMTg1LDI1ICsyNDQsMjkgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTMwN19kcml2ZXI7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1kczEzMDdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQorc3RhdGljIGludCBfX2RldmluaXQgZHMxMzA3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGRzMTMwNwkJKmRzMTMwNzsKIAlpbnQJCQllcnIgPSAtRU5PREVWOwotCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJaW50CQkJdG1wOworCWNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MJKmNoaXA7CisJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKIAotCWlmICghKGRzMTMwNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMDcpLCBHRlBfS0VSTkVMKSkpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0OworCWNoaXAgPSBmaW5kX2NoaXAoY2xpZW50LT5uYW1lKTsKKwlpZiAoIWNoaXApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmtub3duIGNoaXAgdHlwZSAnJXMnXG4iLAorCQkJCWNsaWVudC0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNsaWVudCA9ICZkczEzMDctPmNsaWVudDsKLQljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JY2xpZW50LT5kcml2ZXIgPSAmZHMxMzA3X2RyaXZlcjsKLQljbGllbnQtPmZsYWdzID0gMDsKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsCisJCQlJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVJTzsKIAorCWlmICghKGRzMTMwNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMDcpLCBHRlBfS0VSTkVMKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJZHMxMzA3LT5jbGllbnQgPSBjbGllbnQ7CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZHMxMzA3KTsKIAogCWRzMTMwNy0+bXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CkBAIC0yMTYsMTQgKzI3OSwxNiBAQAogCWRzMTMwNy0+bXNnWzFdLmxlbiA9IHNpemVvZihkczEzMDctPnJlZ3MpOwogCWRzMTMwNy0+bXNnWzFdLmJ1ZiA9IGRzMTMwNy0+cmVnczsKIAotCS8qIEhBQ0s6ICJmb3JjZSIgaW1wbGllcyAibmVlZHMgZHMxMzM3LXN0eWxlLW9zY2lsbGF0b3Igc2V0dXAiICovCi0JaWYgKGtpbmQgPj0gMCkgewotCQlkczEzMDctPnR5cGUgPSBkc18xMzM3OworCWRzMTMwNy0+dHlwZSA9IGNoaXAtPnR5cGU7CiAKKwlzd2l0Y2ggKGRzMTMwNy0+dHlwZSkgeworCWNhc2UgZHNfMTMzNzoKKwljYXNlIGRzXzEzMzk6CiAJCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzdfUkVHX0NPTlRST0w7CiAJCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDI7CiAKLQkJdG1wID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCQkvKiBnZXQgcmVnaXN0ZXJzIHRoYXQgdGhlICJydGMiIHJlYWQgYmVsb3cgd29uJ3QgcmVhZC4uLiAqLworCQl0bXAgPSBpMmNfdHJhbnNmZXIoYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOwogCQlpZiAodG1wICE9IDIpIHsKIAkJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOwogCQkJZXJyID0gLUVJTzsKQEAgLTIzMywxOSArMjk4LDI2IEBACiAJCWRzMTMwNy0+cmVnX2FkZHIgPSAwOwogCQlkczEzMDctPm1zZ1sxXS5sZW4gPSBzaXplb2YoZHMxMzA3LT5yZWdzKTsKIAotCQkvKiBvc2NpbGxhdG9yIGlzIG9mZjsgbmVlZCB0byB0dXJuIGl0IG9uICovCi0JCWlmICgoZHMxMzA3LT5yZWdzWzBdICYgRFMxMzM3X0JJVF9uRU9TQykKLQkJCQl8fCAoZHMxMzA3LT5yZWdzWzFdICYgRFMxMzM3X0JJVF9PU0YpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm5vIGRzMTMzNyBvc2NpbGxhdG9yIGNvZGVcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7CisJCS8qIG9zY2lsbGF0b3Igb2ZmPyAgdHVybiBpdCBvbiwgc28gY2xvY2sgY2FuIHRpY2suICovCisJCWlmIChkczEzMDctPnJlZ3NbMF0gJiBEUzEzMzdfQklUX25FT1NDKQorCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfQ09OVFJPTCwKKwkJCQlkczEzMDctPnJlZ3NbMF0gJiB+RFMxMzM3X0JJVF9uRU9TQyk7CisKKwkJLyogb3NjaWxsYXRvciBmYXVsdD8gIGNsZWFyIGZsYWcsIGFuZCB3YXJuICovCisJCWlmIChkczEzMDctPnJlZ3NbMV0gJiBEUzEzMzdfQklUX09TRikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMzN19SRUdfU1RBVFVTLAorCQkJCWRzMTMwNy0+cmVnc1sxXSAmIH5EUzEzMzdfQklUX09TRik7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJTRVQgVElNRSFcbiIpOwogCQl9Ci0JfSBlbHNlCi0JCWRzMTMwNy0+dHlwZSA9IGRzXzEzMDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIAogcmVhZF9ydGM6CiAJLyogcmVhZCBSVEMgcmVnaXN0ZXJzICovCiAKLQl0bXAgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBkczEzMDctPm1zZywgMik7CisJdG1wID0gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKIAlpZiAodG1wICE9IDIpIHsKIAkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CiAJCWVyciA9IC1FSU87CkBAIC0yNTcsMTE5ICszMjksMTIxIEBACiAJICogc3RpbGwgYSBmZXcgdmFsdWVzIHRoYXQgYXJlIGNsZWFybHkgb3V0LW9mLXJhbmdlLgogCSAqLwogCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1NFQ1NdOwotCWlmICh0bXAgJiBEUzEzMDdfQklUX0NIKSB7Ci0JCWlmIChkczEzMDctPnR5cGUgJiYgZHMxMzA3LT50eXBlICE9IGRzXzEzMDcpIHsKLQkJCXByX2RlYnVnKCJub3QgYSBkczEzMDc/XG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9Ci0JCWRzMTMwNy0+dHlwZSA9IGRzXzEzMDc7Ci0KLQkJLyogdGhpcyBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIHNob3VsZCB3b3JrIGZvciBkczEzMDcsCi0JCSAqIGRzMTMzOCwgZHMxMzQwLCBzdCBtNDF0MDAsIGFuZCBtb3JlLgorCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSBkc18xMzQwOgorCQkvKiBGSVhNRSByZWFkIHJlZ2lzdGVyIHdpdGggRFMxMzQwX0JJVF9PU0YsIHVzZSB0aGF0IHRvCisJCSAqIHRyaWdnZXIgdGhlICJzZXQgdGltZSIgd2FybmluZyAoKmFmdGVyKiByZXN0YXJ0aW5nIHRoZQorCQkgKiBvc2NpbGxhdG9yISkgaW5zdGVhZCBvZiB0aGlzIHdlYWtlciBkczEzMDcvbTQxdDAwIHRlc3QuCiAJCSAqLwotCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJvc2NpbGxhdG9yIHN0YXJ0ZWQ7IFNFVCBUSU1FIVxuIik7Ci0JCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCAwLCAwKTsKLQkJZ290byByZWFkX3J0YzsKKwljYXNlIGRzXzEzMDc6CisJY2FzZSBtNDF0MDA6CisJCS8qIGNsb2NrIGhhbHRlZD8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfU0VDUywgMCk7CisJCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJTRVQgVElNRSFcbiIpOworCQkJZ290byByZWFkX3J0YzsKKwkJfQorCQlicmVhazsKKwljYXNlIGRzXzEzMzg6CisJCS8qIGNsb2NrIGhhbHRlZD8gIHR1cm4gaXQgb24sIHNvIGNsb2NrIGNhbiB0aWNrLiAqLworCQlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBEUzEzMDdfUkVHX1NFQ1MsIDApOworCisJCS8qIG9zY2lsbGF0b3IgZmF1bHQ/ICBjbGVhciBmbGFnLCBhbmQgd2FybiAqLworCQlpZiAoZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfQ09OVFJPTF0gJiBEUzEzMzhfQklUX09TRikgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIERTMTMwN19SRUdfQ09OVFJPTCwKKwkJCQkJZHMxMzA3LT5yZWdzW0RTMTMzN19SRUdfQ09OVFJPTF0KKwkJCQkJJiB+RFMxMzM4X0JJVF9PU0YpOworCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiU0VUIFRJTUUhXG4iKTsKKwkJCWdvdG8gcmVhZF9ydGM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc18xMzM3OgorCWNhc2UgZHNfMTMzOToKKwkJYnJlYWs7CiAJfQorCisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfU0VDU107CiAJdG1wID0gQkNEMkJJTih0bXAgJiAweDdmKTsKIAlpZiAodG1wID4gNjApCi0JCWdvdG8gZXhpdF9mcmVlOworCQlnb3RvIGV4aXRfYmFkOwogCXRtcCA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTUlOXSAmIDB4N2YpOwogCWlmICh0bXAgPiA2MCkKLQkJZ290byBleGl0X2ZyZWU7CisJCWdvdG8gZXhpdF9iYWQ7CiAKIAl0bXAgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01EQVldICYgMHgzZik7CiAJaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDMxKQotCQlnb3RvIGV4aXRfZnJlZTsKKwkJZ290byBleGl0X2JhZDsKIAogCXRtcCA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTU9OVEhdICYgMHgxZik7CiAJaWYgKHRtcCA9PSAwIHx8IHRtcCA+IDEyKQotCQlnb3RvIGV4aXRfZnJlZTsKKwkJZ290byBleGl0X2JhZDsKIAotCS8qIGZvcmNlIGludG8gaW4gMjQgaG91ciBtb2RlIChtb3N0IGNoaXBzKSBvcgotCSAqIGRpc2FibGUgY2VudHVyeSBiaXQgKGRzMTM0MCkKLQkgKi8KIAl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19IT1VSXTsKLQlpZiAodG1wICYgKDEgPDwgNikpIHsKLQkJaWYgKHRtcCAmICgxIDw8IDUpKQotCQkJdG1wID0gQkNEMkJJTih0bXAgJiAweDFmKSArIDEyOwotCQllbHNlCi0JCQl0bXAgPSBCQ0QyQklOKHRtcCk7CisJc3dpdGNoIChkczEzMDctPnR5cGUpIHsKKwljYXNlIGRzXzEzNDA6CisJY2FzZSBtNDF0MDA6CisJCS8qIE5PVEU6IGlnbm9yZXMgY2VudHVyeSBiaXRzOyBmaXggYmVmb3JlIGRlcGxveWluZworCQkgKiBzeXN0ZW1zIHRoYXQgd2lsbCBydW4gdGhyb3VnaCB5ZWFyIDIxMDAuCisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoISh0bXAgJiBEUzEzMDdfQklUXzEySFIpKQorCQkJYnJlYWs7CisKKwkJLyogQmUgc3VyZSB3ZSdyZSBpbiAyNCBob3VyIG1vZGUuICBNdWx0aS1tYXN0ZXIgc3lzdGVtcworCQkgKiB0YWtlIG5vdGUuLi4KKwkJICovCisJCXRtcCA9IEJDRDJCSU4odG1wICYgMHgxZik7CisJCWlmICh0bXAgPT0gMTIpCisJCQl0bXAgPSAwOworCQlpZiAoZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfSE9VUl0gJiBEUzEzMDdfQklUX1BNKQorCQkJdG1wICs9IDEyOwogCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKIAkJCQlEUzEzMDdfUkVHX0hPVVIsCiAJCQkJQklOMkJDRCh0bXApKTsKIAl9CiAKLQkvKiBGSVhNRSBjaGlwcyBsaWtlIDEzMzcgY2FuIGdlbmVyYXRlIGFsYXJtIGlycXMgdG9vOyB0aG9zZSBhcmUKLQkgKiB3b3J0aCBleHBvc2luZyB0aHJvdWdoIHRoZSBBUEkgKGVzcGVjaWFsbHkgd2hlbiB0aGUgaXJxIGlzCi0JICogd2FrZXVwLWNhcGFibGUpLgotCSAqLwotCi0Jc3dpdGNoIChkczEzMDctPnR5cGUpIHsKLQljYXNlIHVua25vd246Ci0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAidW5rbm93biIsIEkyQ19OQU1FX1NJWkUpOwotCQlicmVhazsKLQljYXNlIGRzXzEzMDc6Ci0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZHMxMzA3IiwgSTJDX05BTUVfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgZHNfMTMzNzoKLQkJc3RybGNweShjbGllbnQtPm5hbWUsICJkczEzMzciLCBJMkNfTkFNRV9TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSBkc18xMzQwOgotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImRzMTM0MCIsIEkyQ19OQU1FX1NJWkUpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKLQkJZ290byBleGl0X2ZyZWU7Ci0KIAlkczEzMDctPnJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoY2xpZW50LT5uYW1lLCAmY2xpZW50LT5kZXYsCiAJCQkJJmRzMTN4eF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CiAJaWYgKElTX0VSUihkczEzMDctPnJ0YykpIHsKIAkJZXJyID0gUFRSX0VSUihkczEzMDctPnJ0Yyk7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAogCQkJInVuYWJsZSB0byByZWdpc3RlciB0aGUgY2xhc3MgZGV2aWNlXG4iKTsKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2ZyZWU7CiAJfQogCiAJcmV0dXJuIDA7CiAKLWV4aXRfZGV0YWNoOgotCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CitleGl0X2JhZDoKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJImJvZ3VzIHJlZ2lzdGVyIiwKKwkJCWRzMTMwNy0+cmVnc1swXSwgZHMxMzA3LT5yZWdzWzFdLAorCQkJZHMxMzA3LT5yZWdzWzJdLCBkczEzMDctPnJlZ3NbM10sCisJCQlkczEzMDctPnJlZ3NbNF0sIGRzMTMwNy0+cmVnc1s1XSwKKwkJCWRzMTMwNy0+cmVnc1s2XSk7CisKIGV4aXRfZnJlZToKIAlrZnJlZShkczEzMDcpOwotZXhpdDoKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAotZHMxMzA3X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwN19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCi0JCXJldHVybiAwOwotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZHMxMzA3X2RldGVjdCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IGRzMTMwN19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50CQllcnI7CiAJc3RydWN0IGRzMTMwNwkqZHMxMzA3ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAlydGNfZGV2aWNlX3VucmVnaXN0ZXIoZHMxMzA3LT5ydGMpOwotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCXJldHVybiBlcnI7CiAJa2ZyZWUoZHMxMzA3KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTMwN19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAiZHMxMzA3IiwKKwkJLm5hbWUJPSAicnRjLWRzMTMwNyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyCT0gZHMxMzA3X2F0dGFjaF9hZGFwdGVyLAotCS5kZXRhY2hfY2xpZW50CT0gX19kZXZleGl0X3AoZHMxMzA3X2RldGFjaF9jbGllbnQpLAorCS5wcm9iZQkJPSBkczEzMDdfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczEzMDdfcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGRzMTMwN19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjNGE4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDF0ODAuYwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIEkyQyBjbGllbnQvZHJpdmVyIGZvciB0aGUgU1QgTTQxVDgwIGZhbWlseSBvZiBpMmMgcnRjIGNoaXBzLgorICoKKyAqIEF1dGhvcjogQWxleGFuZGVyIEJpZ2dhIDxhYkBteWNhYmxlLmRlPgorICoKKyAqIEJhc2VkIG9uIG00MXQwMC5jIGJ5IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgorICoKKyAqIDIwMDYgKGMpIG15Y2FibGUgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2lmZGVmIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQKKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjZW5kaWYKKworI2RlZmluZSBNNDFUODBfUkVHX1NTRUMJMAorI2RlZmluZSBNNDFUODBfUkVHX1NFQwkxCisjZGVmaW5lIE00MVQ4MF9SRUdfTUlOCTIKKyNkZWZpbmUgTTQxVDgwX1JFR19IT1VSCTMKKyNkZWZpbmUgTTQxVDgwX1JFR19XREFZCTQKKyNkZWZpbmUgTTQxVDgwX1JFR19EQVkJNQorI2RlZmluZSBNNDFUODBfUkVHX01PTgk2CisjZGVmaW5lIE00MVQ4MF9SRUdfWUVBUgk3CisjZGVmaW5lIE00MVQ4MF9SRUdfQUxBUk1fTU9OCTB4YQorI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX0RBWQkweGIKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9IT1VSCTB4YworI2RlZmluZSBNNDFUODBfUkVHX0FMQVJNX01JTgkweGQKKyNkZWZpbmUgTTQxVDgwX1JFR19BTEFSTV9TRUMJMHhlCisjZGVmaW5lIE00MVQ4MF9SRUdfRkxBR1MJMHhmCisjZGVmaW5lIE00MVQ4MF9SRUdfU1FXCTB4MTMKKworI2RlZmluZSBNNDFUODBfREFURVRJTUVfUkVHX1NJWkUJKE00MVQ4MF9SRUdfWUVBUiArIDEpCisjZGVmaW5lIE00MVQ4MF9BTEFSTV9SRUdfU0laRQlcCisJKE00MVQ4MF9SRUdfQUxBUk1fU0VDICsgMSAtIE00MVQ4MF9SRUdfQUxBUk1fTU9OKQorCisjZGVmaW5lIE00MVQ4MF9TRUNfU1QJCSgxIDw8IDcpCS8qIFNUOiBTdG9wIEJpdCAqLworI2RlZmluZSBNNDFUODBfQUxNT05fQUZFCSgxIDw8IDcpCS8qIEFGRTogQUYgRW5hYmxlIEJpdCAqLworI2RlZmluZSBNNDFUODBfQUxNT05fU1FXRQkoMSA8PCA2KQkvKiBTUVdFOiBTUVcgRW5hYmxlIEJpdCAqLworI2RlZmluZSBNNDFUODBfQUxIT1VSX0hUCSgxIDw8IDYpCS8qIEhUOiBIYWx0IFVwZGF0ZSBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0ZMQUdTX0FGCQkoMSA8PCA2KQkvKiBBRjogQWxhcm0gRmxhZyBCaXQgKi8KKyNkZWZpbmUgTTQxVDgwX0ZMQUdTX0JBVFRfTE9XCSgxIDw8IDQpCS8qIEJMOiBCYXR0ZXJ5IExvdyBCaXQgKi8KKworI2RlZmluZSBNNDFUODBfRkVBVFVSRV9IVAkoMSA8PCAwKQorI2RlZmluZSBNNDFUODBfRkVBVFVSRV9CTAkoMSA8PCAxKQorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjA1IgorCitzdHJ1Y3QgbTQxdDgwX2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCBmZWF0dXJlczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbTQxdDgwX2NoaXBfaW5mbyBtNDF0ODBfY2hpcF9pbmZvX3RibFtdID0geworCXsKKwkJLm5hbWUJCT0gIm00MXQ4MCIsCisJCS5mZWF0dXJlcwk9IDAsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDF0ODEiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXQ4MXMiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxdDgyIiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXQ4MyIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJtNDFzdDg0IiwKKwkJLmZlYXR1cmVzCT0gTTQxVDgwX0ZFQVRVUkVfSFQgfCBNNDFUODBfRkVBVFVSRV9CTCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm00MXN0ODUiLAorCQkuZmVhdHVyZXMJPSBNNDFUODBfRkVBVFVSRV9IVCB8IE00MVQ4MF9GRUFUVVJFX0JMLAorCX0sCisJeworCQkubmFtZQkJPSAibTQxc3Q4NyIsCisJCS5mZWF0dXJlcwk9IE00MVQ4MF9GRUFUVVJFX0hUIHwgTTQxVDgwX0ZFQVRVUkVfQkwsCisJfSwKK307CisKK3N0cnVjdCBtNDF0ODBfZGF0YSB7CisJY29uc3Qgc3RydWN0IG00MXQ4MF9jaGlwX2luZm8gKmNoaXA7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKK307CisKK3N0YXRpYyBpbnQgbTQxdDgwX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggYnVmW000MVQ4MF9EQVRFVElNRV9SRUdfU0laRV0sIGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfU0VDIH07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBkdF9hZGRyLAorCQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IE00MVQ4MF9EQVRFVElNRV9SRUdfU0laRSAtIE00MVQ4MF9SRUdfU0VDLAorCQkJLmJ1Zgk9IGJ1ZiArIE00MVQ4MF9SRUdfU0VDLAorCQl9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVhZCBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXRtLT50bV9zZWMgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX1NFQ10gJiAweDdmKTsKKwl0bS0+dG1fbWluID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19NSU5dICYgMHg3Zik7CisJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX0hPVVJdICYgMHgzZik7CisJdG0tPnRtX21kYXkgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX0RBWV0gJiAweDNmKTsKKwl0bS0+dG1fd2RheSA9IGJ1ZltNNDFUODBfUkVHX1dEQVldICYgMHgwNzsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTihidWZbTTQxVDgwX1JFR19NT05dICYgMHgxZikgLSAxOworCisJLyogYXNzdW1lIDIwWVkgbm90IDE5WVksIGFuZCBpZ25vcmUgdGhlIENlbnR1cnkgQml0ICovCisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKGJ1ZltNNDFUODBfUkVHX1lFQVJdKSArIDEwMDsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0cyB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdGltZSB0byB0aGUgcmVhbCB0aW1lIGNsb2NrLiAqLworc3RhdGljIGludCBtNDF0ODBfc2V0X2RhdGV0aW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdTggd2J1ZlsxICsgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFXTsKKwl1OCAqYnVmID0gJndidWZbMV07CisJdTggZHRfYWRkclsxXSA9IHsgTTQxVDgwX1JFR19TRUMgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzX2luW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFIC0gTTQxVDgwX1JFR19TRUMsCisJCQkuYnVmCT0gYnVmICsgTTQxVDgwX1JFR19TRUMsCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxICsgTTQxVDgwX0RBVEVUSU1FX1JFR19TSVpFLAorCQkJLmJ1Zgk9IHdidWYsCisJCSB9LAorCX07CisKKwkvKiBSZWFkIGN1cnJlbnQgcmVnIHZhbHVlcyBpbnRvIGJ1ZlsxLi43XSAqLworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzX2luLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJd2J1ZlswXSA9IDA7IC8qIG9mZnNldCBpbnRvIHJ0YydzIHJlZ3MgKi8KKwkvKiBNZXJnZSB0aW1lLWRhdGEgYW5kIHJlZ2lzdGVyIGZsYWdzIGludG8gYnVmWzAuLjddICovCisJYnVmW000MVQ4MF9SRUdfU1NFQ10gPSAwOworCWJ1ZltNNDFUODBfUkVHX1NFQ10gPQorCQlCSU4yQkNEKHRtLT50bV9zZWMpIHwgKGJ1ZltNNDFUODBfUkVHX1NFQ10gJiB+MHg3Zik7CisJYnVmW000MVQ4MF9SRUdfTUlOXSA9CisJCUJJTjJCQ0QodG0tPnRtX21pbikgfCAoYnVmW000MVQ4MF9SRUdfTUlOXSAmIH4weDdmKTsKKwlidWZbTTQxVDgwX1JFR19IT1VSXSA9CisJCUJJTjJCQ0QodG0tPnRtX2hvdXIpIHwgKGJ1ZltNNDFUODBfUkVHX0hPVVJdICYgfjB4M2YpIDsKKwlidWZbTTQxVDgwX1JFR19XREFZXSA9CisJCSh0bS0+dG1fd2RheSAmIDB4MDcpIHwgKGJ1ZltNNDFUODBfUkVHX1dEQVldICYgfjB4MDcpOworCWJ1ZltNNDFUODBfUkVHX0RBWV0gPQorCQlCSU4yQkNEKHRtLT50bV9tZGF5KSB8IChidWZbTTQxVDgwX1JFR19EQVldICYgfjB4M2YpOworCWJ1ZltNNDFUODBfUkVHX01PTl0gPQorCQlCSU4yQkNEKHRtLT50bV9tb24gKyAxKSB8IChidWZbTTQxVDgwX1JFR19NT05dICYgfjB4MWYpOworCS8qIGFzc3VtZSAyMFlZIG5vdCAxOVlZICovCisJYnVmW000MVQ4MF9SRUdfWUVBUl0gPSBCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAxKSAhPSAxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9QUk9DX01PRFVMRSkKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCByZWc7CisKKwlpZiAoY2xpZW50ZGF0YS0+Y2hpcC0+ZmVhdHVyZXMgJiBNNDFUODBfRkVBVFVSRV9CTCkgeworCQlyZWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0ZMQUdTKTsKKwkJc2VxX3ByaW50ZihzZXEsICJiYXR0ZXJ5XHRcdDogJXNcbiIsCisJCQkgICAocmVnICYgTTQxVDgwX0ZMQUdTX0JBVFRfTE9XKSA/ICJleGhhdXN0ZWQiIDogIm9rIik7CisJfQorCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgbTQxdDgwX3J0Y19wcm9jIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbTQxdDgwX2dldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworc3RhdGljIGludCBtNDF0ODBfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbTQxdDgwX3NldF9kYXRldGltZSh0b19pMmNfY2xpZW50KGRldiksIHRtKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX0RFVikgfHwgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfREVWX01PRFVMRSkKK3N0YXRpYyBpbnQKK200MXQ4MF9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCByYzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwljYXNlIFJUQ19BSUVfT046CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCisJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlyYyAmPSB+TTQxVDgwX0FMTU9OX0FGRTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09OOgorCQlyYyB8PSBNNDFUODBfQUxNT05fQUZFOworCQlicmVhazsKKwl9CisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwgcmMpIDwgMCkKKwkJZ290byBlcnI7CisJcmV0dXJuIDA7CitlcnI6CisJcmV0dXJuIC1FSU87Cit9CisjZWxzZQorI2RlZmluZQltNDF0ODBfcnRjX2lvY3RsIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IG00MXQ4MF9ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCB3YnVmWzEgKyBNNDFUODBfQUxBUk1fUkVHX1NJWkVdOworCXU4ICpidWYgPSAmd2J1ZlsxXTsKKwl1OCAqcmVnID0gYnVmIC0gTTQxVDgwX1JFR19BTEFSTV9NT047CisJdTggZHRfYWRkclsxXSA9IHsgTTQxVDgwX1JFR19BTEFSTV9NT04gfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzX2luW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IGR0X2FkZHIsCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gSTJDX01fUkQsCisJCQkubGVuCT0gTTQxVDgwX0FMQVJNX1JFR19TSVpFLAorCQkJLmJ1Zgk9IGJ1ZiwKKwkJfSwKKwl9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEgKyBNNDFUODBfQUxBUk1fUkVHX1NJWkUsCisJCQkuYnVmCT0gd2J1ZiwKKwkJIH0sCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzX2luLCAyKSA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJlZ1tNNDFUODBfUkVHX0FMQVJNX01PTl0gJj0gfigweDFmIHwgTTQxVDgwX0FMTU9OX0FGRSk7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSA9IDA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fSE9VUl0gJj0gfigweDNmIHwgMHg4MCk7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fTUlOXSA9IDA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSA9IDA7CisKKwl3YnVmWzBdID0gTTQxVDgwX1JFR19BTEFSTV9NT047IC8qIG9mZnNldCBpbnRvIHJ0YydzIHJlZ3MgKi8KKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9TRUNdIHw9IHQtPnRpbWUudG1fc2VjID49IDAgPworCQlCSU4yQkNEKHQtPnRpbWUudG1fc2VjKSA6IDB4ODA7CisJcmVnW000MVQ4MF9SRUdfQUxBUk1fTUlOXSB8PSB0LT50aW1lLnRtX21pbiA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX21pbikgOiAweDgwOworCXJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdIHw9IHQtPnRpbWUudG1faG91ciA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX2hvdXIpIDogMHg4MDsKKwlyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldIHw9IHQtPnRpbWUudG1fbWRheSA+PSAwID8KKwkJQklOMkJDRCh0LT50aW1lLnRtX21kYXkpIDogMHg4MDsKKwlpZiAodC0+dGltZS50bV9tb24gPj0gMCkKKwkJcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSB8PSBCSU4yQkNEKHQtPnRpbWUudG1fbW9uICsgMSk7CisJZWxzZQorCQlyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldIHw9IDB4NDA7CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMSkgIT0gMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHQtPmVuYWJsZWQpIHsKKwkJcmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSB8PSBNNDFUODBfQUxNT05fQUZFOworCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfQUxBUk1fTU9OLAorCQkJCQkgICAgICByZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dKSA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGUgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTQxdDgwX3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwl1OCBidWZbTTQxVDgwX0FMQVJNX1JFR19TSVpFICsgMV07IC8qIGFsbCBhbGFybSByZWdzIGFuZCBmbGFncyAqLworCXU4IGR0X2FkZHJbMV0gPSB7IE00MVQ4MF9SRUdfQUxBUk1fTU9OIH07CisJdTggKnJlZyA9IGJ1ZiAtIE00MVQ4MF9SRUdfQUxBUk1fTU9OOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSAwLAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gZHRfYWRkciwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MJPSBJMkNfTV9SRCwKKwkJCS5sZW4JPSBNNDFUODBfQUxBUk1fUkVHX1NJWkUgKyAxLAorCQkJLmJ1Zgk9IGJ1ZiwKKwkJfSwKKwl9OworCisJaWYgKGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdC0+dGltZS50bV9zZWMgPSAtMTsKKwl0LT50aW1lLnRtX21pbiA9IC0xOworCXQtPnRpbWUudG1faG91ciA9IC0xOworCXQtPnRpbWUudG1fbWRheSA9IC0xOworCXQtPnRpbWUudG1fbW9uID0gLTE7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX3NlYyA9IEJDRDJCSU4ocmVnW000MVQ4MF9SRUdfQUxBUk1fU0VDXSAmIDB4N2YpOworCWlmICghKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gJiAweDgwKSkKKwkJdC0+dGltZS50bV9taW4gPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX01JTl0gJiAweDdmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9IT1VSXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX2hvdXIgPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0hPVVJdICYgMHgzZik7CisJaWYgKCEocmVnW000MVQ4MF9SRUdfQUxBUk1fREFZXSAmIDB4ODApKQorCQl0LT50aW1lLnRtX21kYXkgPSBCQ0QyQklOKHJlZ1tNNDFUODBfUkVHX0FMQVJNX0RBWV0gJiAweDNmKTsKKwlpZiAoIShyZWdbTTQxVDgwX1JFR19BTEFSTV9EQVldICYgMHg0MCkpCisJCXQtPnRpbWUudG1fbW9uID0gQkNEMkJJTihyZWdbTTQxVDgwX1JFR19BTEFSTV9NT05dICYgMHgxZikgLSAxOworCXQtPnRpbWUudG1feWVhciA9IC0xOworCXQtPnRpbWUudG1fd2RheSA9IC0xOworCXQtPnRpbWUudG1feWRheSA9IC0xOworCXQtPnRpbWUudG1faXNkc3QgPSAtMTsKKwl0LT5lbmFibGVkID0gISEocmVnW000MVQ4MF9SRUdfQUxBUk1fTU9OXSAmIE00MVQ4MF9BTE1PTl9BRkUpOworCXQtPnBlbmRpbmcgPSAhIShyZWdbTTQxVDgwX1JFR19GTEFHU10gJiBNNDFUODBfRkxBR1NfQUYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgbTQxdDgwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZSA9IG00MXQ4MF9ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZSA9IG00MXQ4MF9ydGNfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBtNDF0ODBfcnRjX3JlYWRfYWxhcm0sCisJLnNldF9hbGFybSA9IG00MXQ4MF9ydGNfc2V0X2FsYXJtLAorCS5wcm9jID0gbTQxdDgwX3J0Y19wcm9jLAorCS5pb2N0bCA9IG00MXQ4MF9ydGNfaW9jdGwsCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0lOVEZfU1lTRlMpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTX01PRFVMRSkKK3N0YXRpYyBzc2l6ZV90IG00MXQ4MF9zeXNmc19zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IHZhbDsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfRkxBR1MpOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlI3hcbiIsIHZhbCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVJVR08sIG00MXQ4MF9zeXNmc19zaG93X2ZsYWdzLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgbTQxdDgwX3N5c2ZzX3Nob3dfc3F3ZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCWludCB2YWw7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX1NRVyk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiAtRUlPOworCXZhbCA9ICh2YWwgPj4gNCkgJiAweGY7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMToKKwkJdmFsID0gMzI3Njg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbCA9IDMyNzY4ID4+IHZhbDsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Cit9CitzdGF0aWMgc3NpemVfdCBtNDF0ODBfc3lzZnNfc2V0X3Nxd2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IGFsbW9uLCBzcXc7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAodmFsKSB7CisJCWlmICghaXNfcG93ZXJfb2ZfMih2YWwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCA9IGlsb2cyKHZhbCk7CisJCWlmICh2YWwgPT0gMTUpCisJCQl2YWwgPSAxOworCQllbHNlIGlmICh2YWwgPCAxNCkKKwkJCXZhbCA9IDE1IC0gdmFsOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogZGlzYWJsZSBTUVcsIHNldCBTUVcgZnJlcXVlbmN5ICYgcmUtZW5hYmxlICovCisJYWxtb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTik7CisJaWYgKGFsbW9uIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJc3F3ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TUVcpOworCWlmIChzcXcgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlzcXcgPSAoc3F3ICYgMHgwZikgfCAodmFsIDw8IDQpOworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19BTEFSTV9NT04sCisJCQkJICAgICAgYWxtb24gJiB+TTQxVDgwX0FMTU9OX1NRV0UpIDwgMCB8fAorCSAgICBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TUVcsIHNxdykgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAodmFsICYmIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX0FMQVJNX01PTiwKKwkJCQkJICAgICBhbG1vbiB8IE00MVQ4MF9BTE1PTl9TUVdFKSA8IDApCisJCXJldHVybiAtRUlPOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihzcXdmcmVxLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgbTQxdDgwX3N5c2ZzX3Nob3dfc3F3ZnJlcSwgbTQxdDgwX3N5c2ZzX3NldF9zcXdmcmVxKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHJzW10gPSB7CisJJmRldl9hdHRyX2ZsYWdzLmF0dHIsCisJJmRldl9hdHRyX3Nxd2ZyZXEuYXR0ciwKKwlOVUxMLAorfTsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYXR0cnMsCit9OworCitzdGF0aWMgaW50IG00MXQ4MF9zeXNmc19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmYXR0cl9ncm91cCk7Cit9CisjZWxzZQorc3RhdGljIGludCBtNDF0ODBfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV2F0Y2hkb2cgRHJpdmVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqc2F2ZV9jbGllbnQ7CisKKy8qIERlZmF1bHQgbWFyZ2luICovCisjZGVmaW5lIFdEX1RJTU8gNjAJCS8qIDEuLjMxIHNlY29uZHMgKi8KKworc3RhdGljIGludCB3ZHRfbWFyZ2luID0gV0RfVElNTzsKK21vZHVsZV9wYXJhbSh3ZHRfbWFyZ2luLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZHRfbWFyZ2luLCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0IDYwcykiKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X2lzX29wZW47CitzdGF0aWMgaW50IGJvb3RfZmxhZzsKKworLyoqCisgKgl3ZHRfcGluZzoKKyAqCisgKglSZWxvYWQgY291bnRlciBvbmUgd2l0aCB0aGUgd2F0Y2hkb2cgdGltZW91dC4gV2UgZG9uJ3QgYm90aGVyIHJlbG9hZGluZworICoJdGhlIGNhc2NhZGUgY291bnRlci4KKyAqLworc3RhdGljIHZvaWQgd2R0X3Bpbmcodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGkyY19kYXRhWzJdOworCXN0cnVjdCBpMmNfbXNnIG1zZ3MxWzFdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAyLAorCQkJLmJ1Zgk9IGkyY19kYXRhLAorCQl9LAorCX07CisJaTJjX2RhdGFbMF0gPSAweDA5OwkJLyogd2F0Y2hkb2cgcmVnaXN0ZXIgKi8KKworCWlmICh3ZHRfbWFyZ2luID4gMzEpCisJCWkyY19kYXRhWzFdID0gKHdkdF9tYXJnaW4gJiAweEZDKSB8IDB4ODM7IC8qIHJlc29sdXRpb24gPSA0cyAqLworCWVsc2UKKwkJLyoKKwkJICogV0RTID0gMSAoMHg4MCksIG11bGl0cGxpZXIgPSBXRF9USU1PLCByZXNvbHV0aW9uID0gMXMgKDB4MDIpCisJCSAqLworCQlpMmNfZGF0YVsxXSA9IHdkdF9tYXJnaW48PDIgfCAweDgyOworCisJaTJjX3RyYW5zZmVyKHNhdmVfY2xpZW50LT5hZGFwdGVyLCBtc2dzMSwgMSk7Cit9CisKKy8qKgorICoJd2R0X2Rpc2FibGU6CisgKgorICoJZGlzYWJsZXMgd2F0Y2hkb2cuCisgKi8KK3N0YXRpYyB2b2lkIHdkdF9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBpMmNfZGF0YVsyXSwgaTJjX2J1ZlsweDEwXTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzMFsyXSA9IHsKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IDAsCisJCQkubGVuCT0gMSwKKwkJCS5idWYJPSBpMmNfZGF0YSwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IDEsCisJCQkuYnVmCT0gaTJjX2J1ZiwKKwkJfSwKKwl9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3MxWzFdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAyLAorCQkJLmJ1Zgk9IGkyY19kYXRhLAorCQl9LAorCX07CisKKwlpMmNfZGF0YVswXSA9IDB4MDk7CisJaTJjX3RyYW5zZmVyKHNhdmVfY2xpZW50LT5hZGFwdGVyLCBtc2dzMCwgMik7CisKKwlpMmNfZGF0YVswXSA9IDB4MDk7CisJaTJjX2RhdGFbMV0gPSAweDAwOworCWkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNnczEsIDEpOworfQorCisvKioKKyAqCXdkdF93cml0ZToKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgd2F0Y2hkb2cKKyAqCUBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKKyAqCUBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqCUBwcG9zOiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiB0byB3cml0ZS4gTm8gc2Vla3MgYWxsb3dlZAorICoKKyAqCUEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICoJd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCitzdGF0aWMgc3NpemVfdCB3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJLyogIENhbid0IHNlZWsgKHB3cml0ZSkgb24gdGhpcyBkZXZpY2UKKwlpZiAocHBvcyAhPSAmZmlsZS0+Zl9wb3MpCisJcmV0dXJuIC1FU1BJUEU7CisJKi8KKwlpZiAoY291bnQpIHsKKwkJd2R0X3BpbmcoKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCB3ZHRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqCXdkdF9pb2N0bDoKKyAqCUBpbm9kZTogaW5vZGUgb2YgdGhlIGRldmljZQorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqCUBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqCUBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKglUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICoJYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4gV2Ugb25seSBhY3R1YWxseSB1c2VmdWxseSBzdXBwb3J0CisgKglxdWVyeWluZyBjYXBhYmlsaXRpZXMgYW5kIGN1cnJlbnQgc3RhdHVzLgorICovCitzdGF0aWMgaW50IHdkdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgbmV3X21hcmdpbiwgcnY7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCQkub3B0aW9ucyA9IFdESU9GX1BPV0VSVU5ERVIgfCBXRElPRl9LRUVQQUxJVkVQSU5HIHwKKwkJCVdESU9GX1NFVFRJTUVPVVQsCisJCS5maXJtd2FyZV92ZXJzaW9uID0gMSwKKwkJLmlkZW50aXR5ID0gIk00MVQ4MCBXVEQiCisJfTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBfX3VzZXIgKilhcmcsICZpZGVudCwKKwkJCQkgICAgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKGJvb3RfZmxhZywgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl3ZHRfcGluZygpOworCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfbWFyZ2luLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQXJiaXRyYXJ5LCBjYW4ndCBmaW5kIHRoZSBjYXJkJ3MgbGltaXRzICovCisJCWlmIChuZXdfbWFyZ2luIDwgMSB8fCBuZXdfbWFyZ2luID4gMTI0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdkdF9tYXJnaW4gPSBuZXdfbWFyZ2luOworCQl3ZHRfcGluZygpOworCQkvKiBGYWxsICovCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIod2R0X21hcmdpbiwgKGludCBfX3VzZXIgKilhcmcpOworCisJY2FzZSBXRElPQ19TRVRPUFRJT05TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ2LCAoaW50IF9fdXNlciAqKWFyZywgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHJ2ICYgV0RJT1NfRElTQUJMRUNBUkQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAicnRjLW00MXQ4MDogZGlzYWJsZSB3YXRjaGRvZ1xuIik7CisJCQl3ZHRfZGlzYWJsZSgpOworCQl9CisKKwkJaWYgKHJ2ICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJydGMtbTQxdDgwOiBlbmFibGUgd2F0Y2hkb2dcbiIpOworCQkJd2R0X3BpbmcoKTsKKwkJfQorCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoqCisgKgl3ZHRfb3BlbjoKKyAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChNSU5PUihpbm9kZS0+aV9yZGV2KSA9PSBXQVRDSERPR19NSU5PUikgeworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X2lzX29wZW4pKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJLyoKKwkJICoJQWN0aXZhdGUKKwkJICovCisJCXdkdF9pc19vcGVuID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKioKKyAqCXdkdF9jbG9zZToKKyAqCUBpbm9kZTogaW5vZGUgdG8gYm9hcmQKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBib2FyZAorICoKKyAqLworc3RhdGljIGludCB3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoTUlOT1IoaW5vZGUtPmlfcmRldikgPT0gV0FUQ0hET0dfTUlOT1IpCisJCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOworCXJldHVybiAwOworfQorCisvKioKKyAqCW5vdGlmeV9zeXM6CisgKglAdGhpczogb3VyIG5vdGlmaWVyIGJsb2NrCisgKglAY29kZTogdGhlIGV2ZW50IGJlaW5nIHJlcG9ydGVkCisgKglAdW51c2VkOiB1bnVzZWQKKyAqCisgKglPdXIgbm90aWZpZXIgaXMgY2FsbGVkIG9uIHN5c3RlbSBzaHV0ZG93bnMuIFdlIHdhbnQgdG8gdHVybiB0aGUgY2FyZAorICoJb2ZmIGF0IHJlYm9vdCBvdGhlcndpc2UgdGhlIG1hY2hpbmUgd2lsbCByZWJvb3QgYWdhaW4gZHVyaW5nIG1lbW9yeQorICoJdGVzdCBvciB3b3JzZSB5ZXQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgZnNjay4gVGhpcyB3b3VsZCBzdWNrLCBpbiBmYWN0CisgKgl0cnVzdCBtZSAtIGlmIGl0IGhhcHBlbnMgaXQgZG9lcyBzdWNrLgorICovCitzdGF0aWMgaW50IHdkdF9ub3RpZnlfc3lzKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLAorCQkJICB2b2lkICp1bnVzZWQpCit7CisJaWYgKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkKKwkJLyogRGlzYWJsZSBXYXRjaGRvZyAqLworCQl3ZHRfZGlzYWJsZSgpOworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJPSB3ZHRfcmVhZCwKKwkuaW9jdGwJPSB3ZHRfaW9jdGwsCisJLndyaXRlCT0gd2R0X3dyaXRlLAorCS5vcGVuCT0gd2R0X29wZW4sCisJLnJlbGVhc2UgPSB3ZHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB3ZHRfZGV2ID0geworCS5taW5vciA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lID0gIndhdGNoZG9nIiwKKwkuZm9wcyA9ICZ3ZHRfZm9wcywKK307CisKKy8qCisgKglUaGUgV0RUIGNhcmQgbmVlZHMgdG8gbGVhcm4gYWJvdXQgc29mdCBzaHV0ZG93bnMgaW4gb3JkZXIgdG8KKyAqCXR1cm4gdGhlIHRpbWVib21iIHJlZ2lzdGVycyBvZmYuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gd2R0X25vdGlmeV9zeXMsCit9OworI2VuZGlmIC8qIENPTkZJR19SVENfRFJWX000MVQ4MF9XRFQgKi8KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCURyaXZlciBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGludCBtNDF0ODBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgaSwgcmMgPSAwOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBOVUxMOworCXN0cnVjdCBydGNfdGltZSB0bTsKKwljb25zdCBzdHJ1Y3QgbTQxdDgwX2NoaXBfaW5mbyAqY2hpcDsKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBOVUxMOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQworCQkJCSAgICAgfCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJICJjaGlwIGZvdW5kLCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOworCisJY2hpcCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobTQxdDgwX2NoaXBfaW5mb190YmwpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAobTQxdDgwX2NoaXBfaW5mb190YmxbaV0ubmFtZSwgY2xpZW50LT5uYW1lKSkgeworCQkJY2hpcCA9ICZtNDF0ODBfY2hpcF9pbmZvX3RibFtpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghY2hpcCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGNsaWVudC0+bmFtZSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWNsaWVudGRhdGEgPSBremFsbG9jKHNpemVvZigqY2xpZW50ZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghY2xpZW50ZGF0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSAgJm00MXQ4MF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJjID0gUFRSX0VSUihydGMpOworCQlydGMgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJfQorCisJY2xpZW50ZGF0YS0+cnRjID0gcnRjOworCWNsaWVudGRhdGEtPmNoaXAgPSBjaGlwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNsaWVudGRhdGEpOworCisJLyogTWFrZSBzdXJlIEhUIChIYWx0IFVwZGF0ZSkgYml0IGlzIGNsZWFyZWQgKi8KKwlyYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE00MVQ4MF9SRUdfQUxBUk1fSE9VUik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBodF9lcnI7CisKKwlpZiAocmMgJiBNNDFUODBfQUxIT1VSX0hUKSB7CisJCWlmIChjaGlwLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX0hUKSB7CisJCQltNDF0ODBfZ2V0X2RhdGV0aW1lKGNsaWVudCwgJnRtKTsKKwkJCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkhUIGJpdCB3YXMgc2V0IVxuIik7CisJCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCQkJICJQb3dlciBEb3duIGF0ICIKKwkJCQkgIiUwNGktJTAyaS0lMDJpICUwMmk6JTAyaTolMDJpXG4iLAorCQkJCSB0bS50bV95ZWFyICsgMTkwMCwKKwkJCQkgdG0udG1fbW9uICsgMSwgdG0udG1fbWRheSwgdG0udG1faG91ciwKKwkJCQkgdG0udG1fbWluLCB0bS50bV9zZWMpOworCQl9CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJICAgICAgTTQxVDgwX1JFR19BTEFSTV9IT1VSLAorCQkJCQkgICAgICByYyAmIH5NNDFUODBfQUxIT1VSX0hUKSA8IDApCisJCQlnb3RvIGh0X2VycjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgU1QgKHN0b3ApIGJpdCBpcyBjbGVhcmVkICovCisJcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNNDFUODBfUkVHX1NFQyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBzdF9lcnI7CisKKwlpZiAocmMgJiBNNDFUODBfU0VDX1NUKSB7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTTQxVDgwX1JFR19TRUMsCisJCQkJCSAgICAgIHJjICYgfk00MVQ4MF9TRUNfU1QpIDwgMCkKKwkJCWdvdG8gc3RfZXJyOworCX0KKworCXJjID0gbTQxdDgwX3N5c2ZzX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJaWYgKHJjKQorCQlnb3RvIGV4aXQ7CisKKyNpZmRlZiBDT05GSUdfUlRDX0RSVl9NNDFUODBfV0RUCisJaWYgKGNoaXAtPmZlYXR1cmVzICYgTTQxVDgwX0ZFQVRVUkVfSFQpIHsKKwkJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfZGV2KTsKKwkJaWYgKHJjKQorCQkJZ290byBleGl0OworCQlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKKwkJaWYgKHJjKSB7CisJCQltaXNjX2RlcmVnaXN0ZXIoJndkdF9kZXYpOworCQkJZ290byBleGl0OworCQl9CisJCXNhdmVfY2xpZW50ID0gY2xpZW50OworCX0KKyNlbmRpZgorCXJldHVybiAwOworCitzdF9lcnI6CisJcmMgPSAtRUlPOworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2FuJ3QgY2xlYXIgU1QgYml0XG4iKTsKKwlnb3RvIGV4aXQ7CitodF9lcnI6CisJcmMgPSAtRUlPOworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2FuJ3QgY2xlYXIgSFQgYml0XG4iKTsKKwlnb3RvIGV4aXQ7CisKK2V4aXQ6CisJaWYgKHJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJa2ZyZWUoY2xpZW50ZGF0YSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG00MXQ4MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbTQxdDgwX2RhdGEgKmNsaWVudGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2xpZW50ZGF0YS0+cnRjOworCisjaWZkZWYgQ09ORklHX1JUQ19EUlZfTTQxVDgwX1dEVAorCWlmIChjbGllbnRkYXRhLT5jaGlwLT5mZWF0dXJlcyAmIE00MVQ4MF9GRUFUVVJFX0hUKSB7CisJCW1pc2NfZGVyZWdpc3Rlcigmd2R0X2Rldik7CisJCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOworCX0KKyNlbmRpZgorCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCWtmcmVlKGNsaWVudGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtNDF0ODBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm00MXQ4MCIsCisJfSwKKwkucHJvYmUgPSBtNDF0ODBfcHJvYmUsCisJLnJlbW92ZSA9IG00MXQ4MF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtNDF0ODBfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm00MXQ4MF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbTQxdDgwX3J0Y19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm00MXQ4MF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgQmlnZ2EgPGFiQG15Y2FibGUuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUIE1pY3JvZWxlY3Ryb25pY3MgTTQxVDgwIHNlcmllcyBSVEMgSTJDIENsaWVudCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQobTQxdDgwX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KG00MXQ4MF9ydGNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbTQ4dDU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiNzUyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tNDh0NTkuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIFNUIE00OFQ1OSBSVEMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFdpbmQgUml2ZXIgU3lzdGVtcywgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyayBaaGFuIDxyb25na2FpLnpoYW5Ad2luZHJpdmVyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMvbTQ4dDU5Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisKKyNpZm5kZWYgTk9fSVJRCisjZGVmaW5lIE5PX0lSUQkoLTEpCisjZW5kaWYKKworI2RlZmluZSBNNDhUNTlfUkVBRChyZWcpCXBkYXRhLT5yZWFkX2J5dGUoZGV2LCByZWcpCisjZGVmaW5lIE00OFQ1OV9XUklURSh2YWwsIHJlZykJcGRhdGEtPndyaXRlX2J5dGUoZGV2LCByZWcsIHZhbCkKKworI2RlZmluZSBNNDhUNTlfU0VUX0JJVFMobWFzaywgcmVnKQlcCisJTTQ4VDU5X1dSSVRFKChNNDhUNTlfUkVBRChyZWcpIHwgKG1hc2spKSwgKHJlZykpCisjZGVmaW5lIE00OFQ1OV9DTEVBUl9CSVRTKG1hc2ssIHJlZykJXAorCU00OFQ1OV9XUklURSgoTTQ4VDU5X1JFQUQocmVnKSAmIH4obWFzaykpLCAocmVnKSkKKworc3RydWN0IG00OHQ1OV9wcml2YXRlIHsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsgLyogaW9tZW0gc2l6ZSAqLworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzcGlubG9ja190IGxvY2s7IC8qIHNlcmlhbGl6ZSB0aGUgTlZSQU0gYW5kIFJUQyBhY2Nlc3MgKi8KK307CisKKy8qCisgKiBUaGlzIGlzIHRoZSBnZW5lcmljIGFjY2VzcyBtZXRob2Qgd2hlbiB0aGUgY2hpcCBpcyBtZW1vcnktbWFwcGVkCisgKi8KK3N0YXRpYyB2b2lkCittNDh0NTlfbWVtX3dyaXRlYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXdyaXRlYih2YWwsIG00OHQ1OS0+aW9hZGRyK29mcyk7Cit9CisKK3N0YXRpYyB1OAorbTQ4dDU5X21lbV9yZWFkYihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gcmVhZGIobTQ4dDU5LT5pb2FkZHIrb2ZzKTsKK30KKworLyoKKyAqIE5PVEU6IE00OFQ1OSBvbmx5IHVzZXMgQkNEIG1vZGUKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJLyogSXNzdWUgdGhlIFJFQUQgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisKKwl0bS0+dG1feWVhcgk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X1lFQVIpKTsKKwkvKiB0bV9tb24gaXMgMC0xMSAqLworCXRtLT50bV9tb24JPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9NT05USCkpIC0gMTsKKwl0bS0+dG1fbWRheQk9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01EQVkpKTsKKworCXZhbCA9IE00OFQ1OV9SRUFEKE00OFQ1OV9XREFZKTsKKwlpZiAoKHZhbCAmIE00OFQ1OV9XREFZX0NFQikgJiYgKHZhbCAmIE00OFQ1OV9XREFZX0NCKSkgeworCQlkZXZfZGJnKGRldiwgIkNlbnR1cnkgYml0IGlzIGVuYWJsZWRcbiIpOworCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCisJfQorCisJdG0tPnRtX3dkYXkJPSBCQ0QyQklOKHZhbCAmIDB4MDcpOworCXRtLT50bV9ob3VyCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfSE9VUikgJiAweDNGKTsKKwl0bS0+dG1fbWluCT0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfTUlOKSAmIDB4N0YpOworCXRtLT50bV9zZWMJPSBCQ0QyQklOKE00OFQ1OV9SRUFEKE00OFQ1OV9TRUMpICYgMHg3Rik7CisKKwkvKiBDbGVhciB0aGUgUkVBRCBiaXQgKi8KKwlNNDhUNTlfQ0xFQVJfQklUUyhNNDhUNTlfQ05UTF9SRUFELCBNNDhUNTlfQ05UTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKGRldiwgIlJUQyByZWFkIHRpbWUgJTA0ZC0lMDJkLSUwMmQgJTAyZC8lMDJkLyUwMmRcbiIsCisJCXRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtNDh0NTlfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHZhbCA9IDA7CisKKwlkZXZfZGJnKGRldiwgIlJUQyBzZXQgdGltZSAlMDRkLSUwMmQtJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCS8qIElzc3VlIHRoZSBXUklURSBjb21tYW5kICovCisJTTQ4VDU5X1NFVF9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisKKwlNNDhUNTlfV1JJVEUoKEJJTjJCQ0QodG0tPnRtX3NlYykgJiAweDdGKSwgTTQ4VDU5X1NFQyk7CisJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9taW4pICYgMHg3RiksIE00OFQ1OV9NSU4pOworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1faG91cikgJiAweDNGKSwgTTQ4VDU5X0hPVVIpOworCU00OFQ1OV9XUklURSgoQklOMkJDRCh0bS0+dG1fbWRheSkgJiAweDNGKSwgTTQ4VDU5X01EQVkpOworCS8qIHRtX21vbiBpcyAwLTExICovCisJTTQ4VDU5X1dSSVRFKChCSU4yQkNEKHRtLT50bV9tb24gKyAxKSAmIDB4MUYpLCBNNDhUNTlfTU9OVEgpOworCU00OFQ1OV9XUklURShCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKSwgTTQ4VDU5X1lFQVIpOworCisJaWYgKHRtLT50bV95ZWFyLzEwMCkKKwkJdmFsID0gKE00OFQ1OV9XREFZX0NFQiB8IE00OFQ1OV9XREFZX0NCKTsKKwl2YWwgfD0gKEJJTjJCQ0QodG0tPnRtX3dkYXkpICYgMHgwNyk7CisJTTQ4VDU5X1dSSVRFKHZhbCwgTTQ4VDU5X1dEQVkpOworCisJLyogQ2xlYXIgdGhlIFdSSVRFIGJpdCAqLworCU00OFQ1OV9DTEVBUl9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19yZWFkYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcnRjX3RpbWUgKnRtID0gJmFscm0tPnRpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwkvKiBJZiBubyBpcnEsIHdlIGRvbid0IHN1cHBvcnQgQUxBUk0gKi8KKwlpZiAobTQ4dDU5LT5pcnEgPT0gTk9fSVJRKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkvKiBJc3N1ZSB0aGUgUkVBRCBjb21tYW5kICovCisJTTQ4VDU5X1NFVF9CSVRTKE00OFQ1OV9DTlRMX1JFQUQsIE00OFQ1OV9DTlRMKTsKKworCXRtLT50bV95ZWFyID0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfWUVBUikpOworCS8qIHRtX21vbiBpcyAwLTExICovCisJdG0tPnRtX21vbiA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X01PTlRIKSkgLSAxOworCisJdmFsID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X1dEQVkpOworCWlmICgodmFsICYgTTQ4VDU5X1dEQVlfQ0VCKSAmJiAodmFsICYgTTQ4VDU5X1dEQVlfQ0IpKQorCQl0bS0+dG1feWVhciArPSAxMDA7CS8qIG9uZSBjZW50dXJ5ICovCisKKwl0bS0+dG1fbWRheSA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX0RBVEUpKTsKKwl0bS0+dG1faG91ciA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX0hPVVIpKTsKKwl0bS0+dG1fbWluID0gQkNEMkJJTihNNDhUNTlfUkVBRChNNDhUNTlfQUxBUk1fTUlOKSk7CisJdG0tPnRtX3NlYyA9IEJDRDJCSU4oTTQ4VDU5X1JFQUQoTTQ4VDU5X0FMQVJNX1NFQykpOworCisJLyogQ2xlYXIgdGhlIFJFQUQgYml0ICovCisJTTQ4VDU5X0NMRUFSX0JJVFMoTTQ4VDU5X0NOVExfUkVBRCwgTTQ4VDU5X0NOVEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkZXYsICJSVEMgcmVhZCBhbGFybSB0aW1lICUwNGQtJTAyZC0lMDJkICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24sIHRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgYWxhcm0gdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBtNDh0NTlfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCXU4IG1kYXksIGhvdXIsIG1pbiwgc2VjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJZiBubyBpcnEsIHdlIGRvbid0IHN1cHBvcnQgQUxBUk0gKi8KKwlpZiAobTQ4dDU5LT5pcnEgPT0gTk9fSVJRKQorCQlyZXR1cm4gLUVJTzsKKworCS8qCisJICogMHhmZiBtZWFucyAiYWx3YXlzIG1hdGNoIgorCSAqLworCW1kYXkgPSB0bS0+dG1fbWRheTsKKwltZGF5ID0gKG1kYXkgPj0gMSAmJiBtZGF5IDw9IDMxKSA/IEJJTjJCQ0QobWRheSkgOiAweGZmOworCWlmIChtZGF5ID09IDB4ZmYpCisJCW1kYXkgPSBNNDhUNTlfUkVBRChNNDhUNTlfTURBWSk7CisKKwlob3VyID0gdG0tPnRtX2hvdXI7CisJaG91ciA9IChob3VyIDwgMjQpID8gQklOMkJDRChob3VyKSA6IDB4MDA7CisKKwltaW4gPSB0bS0+dG1fbWluOworCW1pbiA9IChtaW4gPCA2MCkgPyBCSU4yQkNEKG1pbikgOiAweDAwOworCisJc2VjID0gdG0tPnRtX3NlYzsKKwlzZWMgPSAoc2VjIDwgNjApID8gQklOMkJDRChzZWMpIDogMHgwMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkvKiBJc3N1ZSB0aGUgV1JJVEUgY29tbWFuZCAqLworCU00OFQ1OV9TRVRfQklUUyhNNDhUNTlfQ05UTF9XUklURSwgTTQ4VDU5X0NOVEwpOworCisJTTQ4VDU5X1dSSVRFKG1kYXksIE00OFQ1OV9BTEFSTV9EQVRFKTsKKwlNNDhUNTlfV1JJVEUoaG91ciwgTTQ4VDU5X0FMQVJNX0hPVVIpOworCU00OFQ1OV9XUklURShtaW4sIE00OFQ1OV9BTEFSTV9NSU4pOworCU00OFQ1OV9XUklURShzZWMsIE00OFQ1OV9BTEFSTV9TRUMpOworCisJLyogQ2xlYXIgdGhlIFdSSVRFIGJpdCAqLworCU00OFQ1OV9DTEVBUl9CSVRTKE00OFQ1OV9DTlRMX1dSSVRFLCBNNDhUNTlfQ05UTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKGRldiwgIlJUQyBzZXQgYWxhcm0gdGltZSAlMDRkLSUwMmQtJTAyZCAlMDJkLyUwMmQvJTAyZFxuIiwKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGNvbW1hbmRzIGZyb20gdXNlci1zcGFjZQorICovCitzdGF0aWMgaW50IG00OHQ1OV9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlRDX0FJRV9PRkY6CS8qIGFsYXJtIGludGVycnVwdCBvZmYgKi8KKwkJTTQ4VDU5X1dSSVRFKDB4MDAsIE00OFQ1OV9JTlRSKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09OOgkvKiBhbGFybSBpbnRlcnJ1cHQgb24gKi8KKwkJTTQ4VDU5X1dSSVRFKE00OFQ1OV9JTlRSX0FGRSwgTTQ4VDU5X0lOVFIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbTQ4dDU5X3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJdmFsID0gTTQ4VDU5X1JFQUQoTTQ4VDU5X0ZMQUdTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKworCXNlcV9wcmludGYoc2VxLCAiYmF0dGVyeVx0XHQ6ICVzXG4iLAorCQkgKHZhbCAmIE00OFQ1OV9GTEFHU19CRikgPyAibG93IiA6ICJub3JtYWwiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElSUSBoYW5kbGVyIGZvciB0aGUgUlRDCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBtNDh0NTlfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gKHN0cnVjdCBkZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTggZXZlbnQ7CisKKwlzcGluX2xvY2soJm00OHQ1OS0+bG9jayk7CisJZXZlbnQgPSBNNDhUNTlfUkVBRChNNDhUNTlfRkxBR1MpOworCXNwaW5fdW5sb2NrKCZtNDh0NTktPmxvY2spOworCisJaWYgKGV2ZW50ICYgTTQ4VDU5X0ZMQUdTX0FGKSB7CisJCXJ0Y191cGRhdGVfaXJxKG00OHQ1OS0+cnRjLCAxLCAoUlRDX0FGIHwgUlRDX0lSUUYpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIG00OHQ1OV9ydGNfb3BzID0geworCS5pb2N0bAkJPSBtNDh0NTlfcnRjX2lvY3RsLAorCS5yZWFkX3RpbWUJPSBtNDh0NTlfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBtNDh0NTlfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gbTQ4dDU5X3J0Y19yZWFkYWxhcm0sCisJLnNldF9hbGFybQk9IG00OHQ1OV9ydGNfc2V0YWxhcm0sCisJLnByb2MJCT0gbTQ4dDU5X3J0Y19wcm9jLAorfTsKKworc3RhdGljIHNzaXplX3QgbTQ4dDU5X252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbTQ4dDU5X3BsYXRfZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbTQ4dDU5X3ByaXZhdGUgKm00OHQ1OSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXNzaXplX3QgY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZm9yICg7IHNpemUgPiAwICYmIHBvcyA8IE00OFQ1OV9OVlJBTV9TSVpFOyBjbnQrKywgc2l6ZS0tKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtNDh0NTktPmxvY2ssIGZsYWdzKTsKKwkJKmJ1ZisrID0gTTQ4VDU5X1JFQUQoY250KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIHNzaXplX3QgbTQ4dDU5X252cmFtX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzc2l6ZV90IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZvciAoOyBzaXplID4gMCAmJiBwb3MgPCBNNDhUNTlfTlZSQU1fU0laRTsgY250KyssIHNpemUtLSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbTQ4dDU5LT5sb2NrLCBmbGFncyk7CisJCU00OFQ1OV9XUklURSgqYnVmKyssIGNudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm00OHQ1OS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBtNDh0NTlfbnZyYW1fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAibnZyYW0iLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVUdPLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5yZWFkID0gbTQ4dDU5X252cmFtX3JlYWQsCisJLndyaXRlID0gbTQ4dDU5X252cmFtX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbTQ4dDU5X3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtNDh0NTlfcGxhdF9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBtNDh0NTlfcHJpdmF0ZSAqbTQ4dDU5ID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCS8qIFRoaXMgY2hpcCBjb3VsZCBiZSBtZW1vcnktbWFwcGVkIG9yIEkvTy1tYXBwZWQgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwkJaWYgKCFyZXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJLyogSWYgd2UgYXJlIEkvTy1tYXBwZWQsIHRoZSBwbGF0Zm9ybSBzaG91bGQgcHJvdmlkZQorCQkgKiB0aGUgb3BlcmF0aW9ucyBhY2Nlc3NpbmcgY2hpcCByZWdpc3RlcnMuCisJCSAqLworCQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+d3JpdGVfYnl0ZSB8fCAhcGRhdGEtPnJlYWRfYnl0ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCS8qIHdlIGFyZSBtZW1vcnktbWFwcGVkICovCisJCWlmICghcGRhdGEpIHsKKwkJCXBkYXRhID0ga3phbGxvYyhzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXBkYXRhKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJLyogRW5zdXJlIHdlIG9ubHkga21hbGxvYyBwbGF0Zm9ybSBkYXRhIG9uY2UgKi8KKwkJCXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CisJCX0KKworCQkvKiBUcnkgdG8gdXNlIHRoZSBnZW5lcmljIG1lbW9yeSByZWFkL3dyaXRlIG9wcyAqLworCQlpZiAoIXBkYXRhLT53cml0ZV9ieXRlKQorCQkJcGRhdGEtPndyaXRlX2J5dGUgPSBtNDh0NTlfbWVtX3dyaXRlYjsKKwkJaWYgKCFwZGF0YS0+cmVhZF9ieXRlKQorCQkJcGRhdGEtPnJlYWRfYnl0ZSA9IG00OHQ1OV9tZW1fcmVhZGI7CisJfQorCisJbTQ4dDU5ID0ga3phbGxvYyhzaXplb2YoKm00OHQ1OSksIEdGUF9LRVJORUwpOworCWlmICghbTQ4dDU5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW00OHQ1OS0+c2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisJbTQ4dDU5LT5pb2FkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIG00OHQ1OS0+c2l6ZSk7CisJaWYgKCFtNDh0NTktPmlvYWRkcikKKwkJZ290byBvdXQ7CisKKwkvKiBUcnkgdG8gZ2V0IGlycSBudW1iZXIuIFdlIGFsc28gY2FuIHdvcmsgaW4KKwkgKiB0aGUgbW9kZSB3aXRob3V0IElSUS4KKwkgKi8KKwltNDh0NTktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKG00OHQ1OS0+aXJxIDwgMCkKKwkJbTQ4dDU5LT5pcnEgPSBOT19JUlE7CisKKwlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKG00OHQ1OS0+aXJxLCBtNDh0NTlfcnRjX2ludGVycnVwdCwKKwkJCUlSUUZfU0hBUkVELCAicnRjLW00OHQ1OSIsICZwZGV2LT5kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJbTQ4dDU5LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJtNDh0NTkiLCAmcGRldi0+ZGV2LAorCQkJCSZtNDh0NTlfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIobTQ4dDU5LT5ydGMpKSB7CisJCXJldCA9IFBUUl9FUlIobTQ4dDU5LT5ydGMpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmbTQ4dDU5X252cmFtX2F0dHIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2luaXQoJm00OHQ1OS0+bG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbTQ4dDU5KTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmICghSVNfRVJSKG00OHQ1OS0+cnRjKSkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKG00OHQ1OS0+cnRjKTsKKwlpZiAobTQ4dDU5LT5pcnEgIT0gTk9fSVJRKQorCQlmcmVlX2lycShtNDh0NTktPmlycSwgJnBkZXYtPmRldik7CisJaWYgKG00OHQ1OS0+aW9hZGRyKQorCQlpb3VubWFwKG00OHQ1OS0+aW9hZGRyKTsKKwlpZiAobTQ4dDU5KQorCQlrZnJlZShtNDh0NTkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG00OHQ1OV9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG00OHQ1OV9wcml2YXRlICptNDh0NTkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZtNDh0NTlfbnZyYW1fYXR0cik7CisJaWYgKCFJU19FUlIobTQ4dDU5LT5ydGMpKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIobTQ4dDU5LT5ydGMpOworCWlmIChtNDh0NTktPmlvYWRkcikKKwkJaW91bm1hcChtNDh0NTktPmlvYWRkcik7CisJaWYgKG00OHQ1OS0+aXJxICE9IE5PX0lSUSkKKwkJZnJlZV9pcnEobTQ4dDU5LT5pcnEsICZwZGV2LT5kZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKG00OHQ1OSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG00OHQ1OV9ydGNfcGxhdGRydiA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicnRjLW00OHQ1OSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IG00OHQ1OV9ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtNDh0NTlfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtNDh0NTlfcnRjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtNDh0NTlfcnRjX3BsYXRkcnYpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbTQ4dDU5X3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm00OHQ1OV9ydGNfcGxhdGRydik7Cit9CisKK21vZHVsZV9pbml0KG00OHQ1OV9ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChtNDh0NTlfcnRjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJrIFpoYW4gPHJvbmdrYWkuemhhbkB3aW5kcml2ZXIuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNNDhUNTkgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzcyLmMKaW5kZXggMDliYmU1Ny4uNmI2N2I1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzNzIuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzM3Mi5jCkBAIC0xMywxMyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjQiCi0KLS8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAvKiAweDMyLCovIEkyQ19DTElFTlRfRU5EIH07Ci0KLS8qIEluc21vZCBwYXJhbWV0ZXJzICovCi1JMkNfQ0xJRU5UX0lOU01PRDsKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNSIKIAogCiAvKgpAQCAtODgsOSArODIsNiBAQAogCXVuc2lnbmVkCQloYXNfaXJxOjE7CiAJY2hhcgkJCWJ1ZlsxN107CiAJY2hhcgkJCSpyZWdzOwotCi0JLyogb24gY29udmVyc2lvbiB0byBhICJuZXcgc3R5bGUiIGkyYyBkcml2ZXIsIHRoaXMgdmFuaXNoZXMgKi8KLQlzdHJ1Y3QgaTJjX2NsaWVudAlkZXY7CiB9OwogCiBzdGF0aWMgaW50IHJzNWNfZ2V0X3JlZ3Moc3RydWN0IHJzNWMzNzIgKnJzNWMpCkBAIC00ODMsMjUgKzQ3NCwzNSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIHJzNWNfc3lzZnNfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3RyaW0pOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9vc2MpOworfQorCiAjZWxzZQogc3RhdGljIGludCByczVjX3N5c2ZzX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIHZvaWQgcnM1Y19zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKiBub3RoaW5nICovCit9CiAjZW5kaWYJLyogU1lTRlMgKi8KIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJzNWMzNzJfZHJpdmVyOwogCi1zdGF0aWMgaW50IHJzNWMzNzJfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCitzdGF0aWMgaW50IHJzNWMzNzJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCByczVjMzcyICpyczVjMzcyOwogCXN0cnVjdCBydGNfdGltZSB0bTsKIAotCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNTE0LDM1ICs1MTUsMjIgQEAKIAkvKiB3ZSByZWFkIHJlZ2lzdGVycyAweDBmIHRoZW4gMHgwMC0weDBmOyBza2lwIHRoZSBmaXJzdCBvbmUgKi8KIAlyczVjMzcyLT5yZWdzPSZyczVjMzcyLT5idWZbMV07CiAKLQkvKiBPbiBjb252ZXJzaW9uIHRvIGEgIm5ldyBzdHlsZSIgaTJjIGRyaXZlciwgd2UnbGwgYmUgaGFuZGVkCi0JICogdGhlIGkyY19jbGllbnQgKHdlIHdvbid0IGNyZWF0ZSBpdCkKLQkgKi8KLQljbGllbnQgPSAmcnM1YzM3Mi0+ZGV2OwogCXJzNWMzNzItPmNsaWVudCA9IGNsaWVudDsKLQotCS8qIEkyQyBjbGllbnQgKi8KLQljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCWNsaWVudC0+ZHJpdmVyID0gJnJzNWMzNzJfZHJpdmVyOwotCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0KLQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgcnM1YzM3Ml9kcml2ZXIuZHJpdmVyLm5hbWUsIEkyQ19OQU1FX1NJWkUpOwotCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcnM1YzM3Mik7CiAKLQkvKiBJbmZvcm0gdGhlIGkyYyBsYXllciAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCi0JCWdvdG8gZXhpdF9rZnJlZTsKLQogCWVyciA9IHJzNWNfZ2V0X3JlZ3MocnM1YzM3Mik7CiAJaWYgKGVyciA8IDApCi0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9rZnJlZTsKIAotCS8qIEZvciAibmV3IHN0eWxlIiBkcml2ZXJzLCBpcnEgaXMgaW4gaTJjX2NsaWVudCBhbmQgY2hpcCB0eXBlCi0JICogaW5mbyBjb21lcyBmcm9tIGkyY19jbGllbnQuZGV2LnBsYXRmb3JtX2RhdGEuICBNZWFud2hpbGU6Ci0JICoKLQkgKiBTVElDSyBCT0FSRC1TUEVDSUZJQyBTRVRVUCBDT0RFIFJJR0hUIEhFUkUKLQkgKi8KLQlpZiAocnM1YzM3Mi0+dHlwZSA9PSBydGNfdW5kZWYpIHsKKwlpZiAoc3RyY21wKGNsaWVudC0+bmFtZSwgInJzNWMzNzJhIikgPT0gMCkKKwkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19yczVjMzcyYTsKKwllbHNlIGlmIChzdHJjbXAoY2xpZW50LT5uYW1lLCAicnM1YzM3MmIiKSA9PSAwKQorCQlyczVjMzcyLT50eXBlID0gcnRjX3JzNWMzNzJiOworCWVsc2UgaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsICJydjVjMzg2IikgPT0gMCkKKwkJcnM1YzM3Mi0+dHlwZSA9IHJ0Y19ydjVjMzg2OworCWVsc2UgaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsICJydjVjMzg3YSIpID09IDApCisJCXJzNWMzNzItPnR5cGUgPSBydGNfcnY1YzM4N2E7CisJZWxzZSB7CiAJCXJzNWMzNzItPnR5cGUgPSBydGNfcnM1YzM3MmI7CiAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImFzc3VtaW5nIHJzNWMzNzJiXG4iKTsKIAl9CkBAIC01NjcsNyArNTU1LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmtub3duIFJUQyB0eXBlXG4iKTsKLQkJZ290byBleGl0X2RldGFjaDsKKwkJZ290byBleGl0X2tmcmVlOwogCX0KIAogCS8qIGlmIHRoZSBvc2NpbGxhdG9yIGxvc3QgcG93ZXIgYW5kIG5vIG90aGVyIHNvZnR3YXJlIChsaWtlCkBAIC02MDEsNyArNTg5LDcgQEAKIAogCQlpZiAoKGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMykpICE9IDMpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAic2V0dXAgZXJyb3JcbiIpOwotCQkJZ290byBleGl0X2RldGFjaDsKKwkJCWdvdG8gZXhpdF9rZnJlZTsKIAkJfQogCQlyczVjMzcyLT5yZWdzW1JTNUNfUkVHX0NUUkwxXSA9IGJ1ZlsxXTsKIAkJcnM1YzM3Mi0+cmVnc1tSUzVDX1JFR19DVFJMMl0gPSBidWZbMl07CkBAIC02MjEsMTQgKzYwOSwxNCBAQAogCQkJcnM1YzM3Mi0+dGltZTI0ID8gIjI0aHIiIDogImFtL3BtIgogCQkJKTsKIAotCS8qIEZJWE1FIHdoZW4gY2xpZW50LT5pcnEgZXhpc3RzLCB1c2UgaXQgdG8gcmVnaXN0ZXIgYWxhcm0gaXJxICovCisJLyogUkVWSVNJVCB1c2UgY2xpZW50LT5pcnEgdG8gcmVnaXN0ZXIgYWxhcm0gaXJxIC4uLiAqLwogCiAJcnM1YzM3Mi0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcihyczVjMzcyX2RyaXZlci5kcml2ZXIubmFtZSwKIAkJCQkmY2xpZW50LT5kZXYsICZyczVjMzcyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKIAogCWlmIChJU19FUlIocnM1YzM3Mi0+cnRjKSkgewogCQllcnIgPSBQVFJfRVJSKHJzNWMzNzItPnJ0Yyk7Ci0JCWdvdG8gZXhpdF9kZXRhY2g7CisJCWdvdG8gZXhpdF9rZnJlZTsKIAl9CiAKIAllcnIgPSByczVjX3N5c2ZzX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CkBAIC02NDAsOSArNjI4LDYgQEAKIGV4aXRfZGV2cmVnOgogCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihyczVjMzcyLT5ydGMpOwogCi1leGl0X2RldGFjaDoKLQlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwotCiBleGl0X2tmcmVlOgogCWtmcmVlKHJzNWMzNzIpOwogCkBAIC02NTAsMjQgKzYzNSwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcnM1YzM3Ml9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCByczVjMzcyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewotCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgcnM1YzM3Ml9wcm9iZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcnM1YzM3Ml9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgZXJyOwogCXN0cnVjdCByczVjMzcyICpyczVjMzcyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpZiAocnM1YzM3Mi0+cnRjKQotCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnM1YzM3Mi0+cnRjKTsKLQotCS8qIFJFVklTSVQgcHJvcGVybHkgZGVzdHJveSB0aGUgc3lzZnMgZmlsZXMgLi4uICovCi0KLQlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQotCQlyZXR1cm4gZXJyOwotCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJzNWMzNzItPnJ0Yyk7CisJcnM1Y19zeXNmc191bnJlZ2lzdGVyKCZjbGllbnQtPmRldik7CiAJa2ZyZWUocnM1YzM3Mik7CiAJcmV0dXJuIDA7CiB9CkBAIC02NzYsOCArNjQ5LDggQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAicnRjLXJzNWMzNzIiLAogCX0sCi0JLmF0dGFjaF9hZGFwdGVyCT0gJnJzNWMzNzJfYXR0YWNoLAotCS5kZXRhY2hfY2xpZW50CT0gJnJzNWMzNzJfZGV0YWNoLAorCS5wcm9iZQkJPSByczVjMzcyX3Byb2JlLAorCS5yZW1vdmUJCT0gcnM1YzM3Ml9yZW1vdmUsCiB9OwogCiBzdGF0aWMgX19pbml0IGludCByczVjMzcyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCmluZGV4IDEzNDA0NTEuLjM1NzY1ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwpAQCAtNzQ3LDE0ICs3NDcsOSBAQAogc3RhdGljIHZvaWQgX19leGl0CiBkY3NzYmxrX2V4aXQodm9pZCkKIHsKLQlpbnQgcmM7Ci0KIAlQUklOVF9ERUJVRygiRENTU0JMT0NLIEVYSVQuLi5cbiIpOwogCXMzOTBfcm9vdF9kZXZfdW5yZWdpc3RlcihkY3NzYmxrX3Jvb3RfZGV2KTsKLQlyYyA9IHVucmVnaXN0ZXJfYmxrZGV2KGRjc3NibGtfbWFqb3IsIERDU1NCTEtfTkFNRSk7Ci0JaWYgKHJjKSB7Ci0JCVBSSU5UX0VSUigidW5yZWdpc3Rlcl9ibGtkZXYoKSBmYWlsZWQhXG4iKTsKLQl9CisJdW5yZWdpc3Rlcl9ibGtkZXYoZGNzc2Jsa19tYWpvciwgRENTU0JMS19OQU1FKTsKIAlQUklOVF9ERUJVRygiLi4uZmluaXNoZWQhXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGguaAppbmRleCBiMzRlYjgyLi5lYzE4YmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGguaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGguaApAQCAtMjExLDYgKzIxMSwxMCBAQAogCS8qIGluaXRpYWwgdmFsdWVzIHdoZW4gbWVhc3VyaW5nIHN0YXJ0cyAqLwogCXVuc2lnbmVkIGxvbmcgaW5pdGlhbF9yeF9wYWNrZXRzOwogCXVuc2lnbmVkIGxvbmcgaW5pdGlhbF90eF9wYWNrZXRzOworCS8qIGluYm91bmQgc2NhdHRlciBnYXRoZXIgZGF0YSAqLworCXVuc2lnbmVkIGludCBzZ19za2JzX3J4OworCXVuc2lnbmVkIGludCBzZ19mcmFnc19yeDsKKwl1bnNpZ25lZCBpbnQgc2dfYWxsb2NfcGFnZV9yeDsKIH07CiAKIC8qIFJvdXRpbmcgc3R1ZmYgKi8KQEAgLTM0MSw2ICszNDUsOSBAQAogCiAjZGVmaW5lIFFFVEhfSVBfSEVBREVSX1NJWkUgNDAKIAorLyogbGFyZ2UgcmVjZWl2ZSBzY2F0dGVyIGdhdGhlciBjb3B5IGJyZWFrICovCisjZGVmaW5lIFFFVEhfUlhfU0dfQ0IgKFBBR0VfU0laRSA+PiAxKQorCiBzdHJ1Y3QgcWV0aF9oZHJfbGF5ZXIzIHsKIAlfX3U4ICBpZDsKIAlfX3U4ICBmbGFnczsKQEAgLTc3MSw2ICs3NzgsNyBAQAogCWludCBsYXllcjI7CiAJZW51bSBxZXRoX2xhcmdlX3NlbmRfdHlwZXMgbGFyZ2Vfc2VuZDsKIAlpbnQgcGVyZm9ybWFuY2Vfc3RhdHM7CisJaW50IHJ4X3NnX2NiOwogfTsKIAogLyoKQEAgLTgyOCw2ICs4MzYsNyBAQAogCWludCAoKm9yaWdfaGFyZF9oZWFkZXIpKHN0cnVjdCBza19idWZmICosc3RydWN0IG5ldF9kZXZpY2UgKiwKIAkJCQl1bnNpZ25lZCBzaG9ydCx2b2lkICosdm9pZCAqLHVuc2lnbmVkKTsKIAlzdHJ1Y3QgcWV0aF9vc25faW5mbyBvc25faW5mbzsKKwlhdG9taWNfdCBmb3JjZV9hbGxvY19za2I7CiB9OwogCiBzdHJ1Y3QgcWV0aF9jYXJkX2xpc3Rfc3RydWN0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCmluZGV4IDg2YjBjNDQuLjU3ZjY5NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYwpAQCAtMTA1NCw2ICsxMDU0LDcgQEAKIAllbHNlCiAJCWNhcmQtPm9wdGlvbnMubGF5ZXIyID0gMDsKIAljYXJkLT5vcHRpb25zLnBlcmZvcm1hbmNlX3N0YXRzID0gMDsKKwljYXJkLT5vcHRpb25zLnJ4X3NnX2NiID0gUUVUSF9SWF9TR19DQjsKIH0KIAogLyoqCkBAIC0xOTM0LDYgKzE5MzUsNyBAQAogCQkJYXRvbWljX2luYygmcmVwbHktPnJlY2VpdmVkKTsKIAkJCXdha2VfdXAoJnJlcGx5LT53YWl0X3EpOwogCQl9CisJCWNwdV9yZWxheCgpOwogCX07CiAJcmMgPSByZXBseS0+cmM7CiAJcWV0aF9wdXRfcmVwbHkocmVwbHkpOwpAQCAtMjI1OCw2ICsyMjYwLDg5IEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK3FldGhfY3JlYXRlX3NrYl9mcmFnKHN0cnVjdCBxZGlvX2J1ZmZlcl9lbGVtZW50ICplbGVtZW50LAorCQkgICAgIHN0cnVjdCBza19idWZmICoqcHNrYiwKKwkJICAgICBpbnQgb2Zmc2V0LCBpbnQgKnBmcmFnLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZWxlbWVudC0+YWRkcik7CisJaWYgKCpwZnJhZyA9PSAwKSB7CisJCS8qIHRoZSB1cHBlciBwcm90b2NvbCBsYXllcnMgYXNzdW1lIHRoYXQgdGhlcmUgaXMgZGF0YSBpbiB0aGUKKwkJICogc2tiIGl0c2VsZi4gQ29weSBhIHNtYWxsIGFtb3VudCAoNjQgYnl0ZXMpIHRvIG1ha2UgdGhlbQorCQkgKiBoYXBweS4gKi8KKwkJKnBza2IgPSBkZXZfYWxsb2Nfc2tiKDY0ICsgUUVUSF9GQUtFX0xMX0xFTl9FVEgpOworCQlpZiAoISgqcHNrYikpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc2tiX3Jlc2VydmUoKnBza2IsIFFFVEhfRkFLRV9MTF9MRU5fRVRIKTsKKwkJaWYgKGRhdGFfbGVuIDw9IDY0KSB7CisJCQltZW1jcHkoc2tiX3B1dCgqcHNrYiwgZGF0YV9sZW4pLCBlbGVtZW50LT5hZGRyICsgb2Zmc2V0LAorCQkJCWRhdGFfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCWdldF9wYWdlKHBhZ2UpOworCQkJbWVtY3B5KHNrYl9wdXQoKnBza2IsIDY0KSwgZWxlbWVudC0+YWRkciArIG9mZnNldCwgNjQpOworCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKCpwc2tiLCAqcGZyYWcsIHBhZ2UsIG9mZnNldCArIDY0LAorCQkJCWRhdGFfbGVuIC0gNjQpOworCQkJKCpwc2tiKS0+ZGF0YV9sZW4gKz0gZGF0YV9sZW4gLSA2NDsKKwkJCSgqcHNrYiktPmxlbgkgICs9IGRhdGFfbGVuIC0gNjQ7CisJCQkoKnBza2IpLT50cnVlc2l6ZSArPSBkYXRhX2xlbiAtIDY0OworCQl9CisJfSBlbHNlIHsKKwkJZ2V0X3BhZ2UocGFnZSk7CisJCXNrYl9maWxsX3BhZ2VfZGVzYygqcHNrYiwgKnBmcmFnLCBwYWdlLCBvZmZzZXQsIGRhdGFfbGVuKTsKKwkJKCpwc2tiKS0+ZGF0YV9sZW4gKz0gZGF0YV9sZW47CisJCSgqcHNrYiktPmxlbgkgICs9IGRhdGFfbGVuOworCQkoKnBza2IpLT50cnVlc2l6ZSArPSBkYXRhX2xlbjsKKwl9CisJKCpwZnJhZykrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqCitxZXRoX2ZpbmRfZnJlZV9idWZmZXJfcG9vbF9lbnRyeShzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBsaDsKKwlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqZW50cnk7CisJaW50IGksIGZyZWU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAobGlzdF9lbXB0eSgmY2FyZC0+cWRpby5pbl9idWZfcG9vbC5lbnRyeV9saXN0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHBsaCwgJmNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocGxoLCBzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSwgbGlzdCk7CisJCWZyZWUgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpOyArK2kpIHsKKwkJCWlmIChwYWdlX2NvdW50KHZpcnRfdG9fcGFnZShlbnRyeS0+ZWxlbWVudHNbaV0pKSA+IDEpIHsKKwkJCQlmcmVlID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZnJlZSkgeworCQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOworCQkJcmV0dXJuIGVudHJ5OworCQl9CisJfQorCisJLyogbm8gZnJlZSBidWZmZXIgaW4gcG9vbCBzbyB0YWtlIGZpcnN0IG9uZSBhbmQgc3dhcCBwYWdlcyAqLworCWVudHJ5ID0gbGlzdF9lbnRyeShjYXJkLT5xZGlvLmluX2J1Zl9wb29sLmVudHJ5X2xpc3QubmV4dCwKKwkJCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5LCBsaXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpOyArK2kpIHsKKwkJaWYgKHBhZ2VfY291bnQodmlydF90b19wYWdlKGVudHJ5LT5lbGVtZW50c1tpXSkpID4gMSkgeworCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQ3xHRlBfRE1BKTsKKwkJCWlmICghcGFnZSkgeworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZW50cnktPmVsZW1lbnRzW2ldKTsKKwkJCQllbnRyeS0+ZWxlbWVudHNbaV0gPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCQkJaWYgKGNhcmQtPm9wdGlvbnMucGVyZm9ybWFuY2Vfc3RhdHMpCisJCQkJCWNhcmQtPnBlcmZfc3RhdHMuc2dfYWxsb2NfcGFnZV9yeCsrOworCQkJfQorCQl9CisJfQorCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5saXN0KTsKKwlyZXR1cm4gZW50cnk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBxZXRoX2dldF9uZXh0X3NrYihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWRpb19idWZmZXIgKmJ1ZmZlciwKIAkJICBzdHJ1Y3QgcWRpb19idWZmZXJfZWxlbWVudCAqKl9fZWxlbWVudCwgaW50ICpfX29mZnNldCwKQEAgLTIyNjksNiArMjM1NCw4IEBACiAJaW50IHNrYl9sZW47CiAJdm9pZCAqZGF0YV9wdHI7CiAJaW50IGRhdGFfbGVuOworCWludCB1c2Vfcnhfc2cgPSAwOworCWludCBmcmFnID0gMDsKIAogCVFFVEhfREJGX1RFWFQodHJhY2UsNiwibmV4dHNrYiIpOwogCS8qIHFldGhfaGRyIG11c3Qgbm90IGNyb3NzIGVsZW1lbnQgYm91bmRhcmllcyAqLwpAQCAtMjI5MywyMyArMjM4MCw0MyBAQAogCiAJaWYgKCFza2JfbGVuKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoY2FyZC0+b3B0aW9ucy5mYWtlX2xsKXsKLQkJaWYoY2FyZC0+ZGV2LT50eXBlID09IEFSUEhSRF9JRUVFODAyX1RSKXsKLQkJCWlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuK1FFVEhfRkFLRV9MTF9MRU5fVFIsICpoZHIpKSkKLQkJCQlnb3RvIG5vX21lbTsKLQkJCXNrYl9yZXNlcnZlKHNrYixRRVRIX0ZBS0VfTExfTEVOX1RSKTsKKwlpZiAoKHNrYl9sZW4gPj0gY2FyZC0+b3B0aW9ucy5yeF9zZ19jYikgJiYKKwkgICAgKCEoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TTikpICYmCisJICAgICghYXRvbWljX3JlYWQoJmNhcmQtPmZvcmNlX2FsbG9jX3NrYikpKSB7CisJCXVzZV9yeF9zZyA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGNhcmQtPm9wdGlvbnMuZmFrZV9sbCkgeworCQkJaWYgKGNhcmQtPmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMl9UUikgeworCQkJCWlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuICsKKwkJCQkJCVFFVEhfRkFLRV9MTF9MRU5fVFIsICpoZHIpKSkKKwkJCQkJZ290byBub19tZW07CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBRRVRIX0ZBS0VfTExfTEVOX1RSKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCEoc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4gKworCQkJCQkJUUVUSF9GQUtFX0xMX0xFTl9FVEgsICpoZHIpKSkKKwkJCQkJZ290byBub19tZW07CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBRRVRIX0ZBS0VfTExfTEVOX0VUSCk7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlpZiAoIShza2IgPSBxZXRoX2dldF9za2Ioc2tiX2xlbitRRVRIX0ZBS0VfTExfTEVOX0VUSCwgKmhkcikpKQorCQkJc2tiID0gcWV0aF9nZXRfc2tiKHNrYl9sZW4sICpoZHIpOworCQkJaWYgKCFza2IpCiAJCQkJZ290byBub19tZW07Ci0JCQlza2JfcmVzZXJ2ZShza2IsUUVUSF9GQUtFX0xMX0xFTl9FVEgpOwogCQl9Ci0JfSBlbHNlIGlmICghKHNrYiA9IHFldGhfZ2V0X3NrYihza2JfbGVuLCAqaGRyKSkpCi0JCWdvdG8gbm9fbWVtOworCX0KKwogCWRhdGFfcHRyID0gZWxlbWVudC0+YWRkciArIG9mZnNldDsKIAl3aGlsZSAoc2tiX2xlbikgewogCQlkYXRhX2xlbiA9IG1pbihza2JfbGVuLCAoaW50KShlbGVtZW50LT5sZW5ndGggLSBvZmZzZXQpKTsKLQkJaWYgKGRhdGFfbGVuKQotCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBkYXRhX2xlbiksIGRhdGFfcHRyLCBkYXRhX2xlbik7CisJCWlmIChkYXRhX2xlbikgeworCQkJaWYgKHVzZV9yeF9zZykgeworCQkJCWlmIChxZXRoX2NyZWF0ZV9za2JfZnJhZyhlbGVtZW50LCAmc2tiLCBvZmZzZXQsCisJCQkJICAgICZmcmFnLCBkYXRhX2xlbikpCisJCQkJCWdvdG8gbm9fbWVtOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIGRhdGFfbGVuKSwgZGF0YV9wdHIsCisJCQkJCWRhdGFfbGVuKTsKKwkJCX0KKwkJfQogCQlza2JfbGVuIC09IGRhdGFfbGVuOwogCQlpZiAoc2tiX2xlbil7CiAJCQlpZiAocWV0aF9pc19sYXN0X3NiYWxlKGVsZW1lbnQpKXsKQEAgLTIzMzEsNiArMjQzOCwxMCBAQAogCX0KIAkqX19lbGVtZW50ID0gZWxlbWVudDsKIAkqX19vZmZzZXQgPSBvZmZzZXQ7CisJaWYgKHVzZV9yeF9zZyAmJiBjYXJkLT5vcHRpb25zLnBlcmZvcm1hbmNlX3N0YXRzKSB7CisJCWNhcmQtPnBlcmZfc3RhdHMuc2dfc2tic19yeCsrOworCQljYXJkLT5wZXJmX3N0YXRzLnNnX2ZyYWdzX3J4ICs9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJfQogCXJldHVybiBza2I7CiBub19tZW06CiAJaWYgKG5ldF9yYXRlbGltaXQoKSl7CkBAIC0yNjA4LDI4ICsyNzE5LDE1IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHFldGhfYnVmZmVyX3Bvb2xfZW50cnkgKgotcWV0aF9nZXRfYnVmZmVyX3Bvb2xfZW50cnkoc3RydWN0IHFldGhfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgcWV0aF9idWZmZXJfcG9vbF9lbnRyeSAqZW50cnk7Ci0KLQlRRVRIX0RCRl9URVhUKHRyYWNlLCA2LCAiZ3RiZnBsZW4iKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdCkpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KGNhcmQtPnFkaW8uaW5fYnVmX3Bvb2wuZW50cnlfbGlzdC5uZXh0LAotCQkJCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5LCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPmxpc3QpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogcWV0aF9pbml0X2lucHV0X2J1ZmZlcihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLCBzdHJ1Y3QgcWV0aF9xZGlvX2J1ZmZlciAqYnVmKQogewogCXN0cnVjdCBxZXRoX2J1ZmZlcl9wb29sX2VudHJ5ICpwb29sX2VudHJ5OwogCWludCBpOwotIAotCXBvb2xfZW50cnkgPSBxZXRoX2dldF9idWZmZXJfcG9vbF9lbnRyeShjYXJkKTsKKworCXBvb2xfZW50cnkgPSBxZXRoX2ZpbmRfZnJlZV9idWZmZXJfcG9vbF9lbnRyeShjYXJkKTsKKwlpZiAoIXBvb2xfZW50cnkpCisJCXJldHVybiAxOwogCS8qCiAJICogc2luY2UgdGhlIGJ1ZmZlciBpcyBhY2Nlc3NlZCBvbmx5IGZyb20gdGhlIGlucHV0X3Rhc2tsZXQKIAkgKiB0aGVyZSBzaG91bGRuJ3QgYmUgYSBuZWVkIHRvIHN5bmNocm9uaXplOyBhbHNvLCBzaW5jZSB3ZSB1c2UKQEAgLTI2NDgsNiArMjc0Niw3IEBACiAJCQlidWYtPmJ1ZmZlci0+ZWxlbWVudFtpXS5mbGFncyA9IDA7CiAJfQogCWJ1Zi0+c3RhdGUgPSBRRVRIX1FESU9fQlVGX0VNUFRZOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjY4Miw2ICsyNzgxLDcgQEAKIAlpbnQgY291bnQ7CiAJaW50IGk7CiAJaW50IHJjOworCWludCBuZXdjb3VudCA9IDA7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLDYsInF1ZWluYnVmIik7CiAJY291bnQgPSAoaW5kZXggPCBxdWV1ZS0+bmV4dF9idWZfdG9faW5pdCk/CkBAIC0yNjkyLDkgKzI3OTIsMjcgQEAKIAkvKiBvbmx5IHJlcXVldWUgYXQgYSBjZXJ0YWluIHRocmVzaG9sZCB0byBhdm9pZCBTSUdBcyAqLwogCWlmIChjb3VudCA+PSBRRVRIX0lOX0JVRl9SRVFVRVVFX1RIUkVTSE9MRChjYXJkKSl7CiAJCWZvciAoaSA9IHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0OwotCQkgICAgIGkgPCBxdWV1ZS0+bmV4dF9idWZfdG9faW5pdCArIGNvdW50OyArK2kpCi0JCQlxZXRoX2luaXRfaW5wdXRfYnVmZmVyKGNhcmQsCi0JCQkJJnF1ZXVlLT5idWZzW2kgJSBRRElPX01BWF9CVUZGRVJTX1BFUl9RXSk7CisJCSAgICAgaSA8IHF1ZXVlLT5uZXh0X2J1Zl90b19pbml0ICsgY291bnQ7ICsraSkgeworCQkJaWYgKHFldGhfaW5pdF9pbnB1dF9idWZmZXIoY2FyZCwKKwkJCQkmcXVldWUtPmJ1ZnNbaSAlIFFESU9fTUFYX0JVRkZFUlNfUEVSX1FdKSkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQluZXdjb3VudCsrOworCQkJfQorCQl9CisKKwkJaWYgKG5ld2NvdW50IDwgY291bnQpIHsKKwkJCS8qIHdlIGFyZSBpbiBtZW1vcnkgc2hvcnRhZ2Ugc28gd2Ugc3dpdGNoIGJhY2sgdG8KKwkJCSAgIHRyYWRpdGlvbmFsIHNrYiBhbGxvY2F0aW9uIGFuZCBkcm9wIHBhY2thZ2VzICovCisJCQlpZiAoYXRvbWljX2NtcHhjaGcoJmNhcmQtPmZvcmNlX2FsbG9jX3NrYiwgMCwgMSkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkicWV0aDogc3dpdGNoIHRvIGFsbG9jIHNrYlxuIik7CisJCQljb3VudCA9IG5ld2NvdW50OworCQl9IGVsc2UgeworCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZjYXJkLT5mb3JjZV9hbGxvY19za2IsIDEsIDApKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInFldGg6IHN3aXRjaCB0byBzZ1xuIik7CisJCX0KKwogCQkvKgogCQkgKiBhY2NvcmRpbmcgdG8gb2xkIGNvZGUgaXQgc2hvdWxkIGJlIGF2b2lkZWQgdG8gcmVxdWV1ZSBhbGwKIAkJICogMTI4IGJ1ZmZlcnMgaW4gb3JkZXIgdG8gYmVuZWZpdCBmcm9tIFBDSSBhdm9pZGFuY2UuCkBAIC02NDk0LDYgKzY2MTIsNyBAQAogCiAJUUVUSF9EQkZfVEVYVChzZXR1cCwgMiwgImhyZHNldHVwIik7CiAKKwlhdG9taWNfc2V0KCZjYXJkLT5mb3JjZV9hbGxvY19za2IsIDApOwogcmV0cnk6CiAJaWYgKHJldHJpZXMgPCAzKXsKIAkJUFJJTlRfV0FSTigiUmV0cnlpbmcgdG8gZG8gSURYIGFjdGl2YXRlcy5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9wcm9jLmMKaW5kZXggODlkNTZjOC4uZjFmZjE2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Byb2MuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfcHJvYy5jCkBAIC0yMTIsNiArMjEyLDEyIEBACiAJCSAgICAgICIgIFNrYiBmcmFnbWVudHMgc2VudCBpbiBTRyBtb2RlICAgICAgICAgIDogJXVcblxuIiwKIAkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5zZ19za2JzX3NlbnQsCiAJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfZnJhZ3Nfc2VudCk7CisJc2VxX3ByaW50ZihzLCAiICBTa2JzIHJlY2VpdmVkIGluIFNHIG1vZGUgICAgICAgICAgICAgICA6ICV1XG4iCisJCSAgICAgICIgIFNrYiBmcmFnbWVudHMgcmVjZWl2ZWQgaW4gU0cgbW9kZSAgICAgIDogJXVcbiIKKwkJICAgICAgIiAgUGFnZSBhbGxvY2F0aW9ucyBmb3IgcnggU0cgbW9kZSAgICAgICAgOiAldVxuXG4iLAorCQkgICAgICBjYXJkLT5wZXJmX3N0YXRzLnNnX3NrYnNfcngsCisJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfZnJhZ3NfcngsCisJCSAgICAgIGNhcmQtPnBlcmZfc3RhdHMuc2dfYWxsb2NfcGFnZV9yeCk7CiAJc2VxX3ByaW50ZihzLCAiICBsYXJnZV9zZW5kIHR4IChpbiBLYnl0ZXMpICAgICAgICAgICAgICA6ICV1XG4iCiAJCSAgICAgICIgIGxhcmdlX3NlbmQgY291bnQgICAgICAgICAgICAgICAgICAgICAgIDogJXVcblxuIiwKIAkJICAgICAgY2FyZC0+cGVyZl9zdGF0cy5sYXJnZV9zZW5kX2J5dGVzID4+IDEwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvY3B3YXRjaGRvZy5jCmluZGV4IDAyMmU4NjkuLjdiNTc3M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2Nwd2F0Y2hkb2cuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9jcHdhdGNoZG9nLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYwppbmRleCA1MTI4NTdhLi41MTU3YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCkBAIC02MTksOCArNjE5LDcgQEAKIAlqc2YwLmJ1c3kgPSAwOwogCiAJbWlzY19kZXJlZ2lzdGVyKCZqc2ZfZGV2KTsKLQlpZiAodW5yZWdpc3Rlcl9ibGtkZXYoSlNGRF9NQUpPUiwgImpzZmQiKSAhPSAwKQotCQlwcmludGsoImpzZmQ6IGNsZWFudXBfbW9kdWxlIGZhaWxlZFxuIik7CisJdW5yZWdpc3Rlcl9ibGtkZXYoSlNGRF9NQUpPUiwgImpzZmQiKTsKIAlibGtfY2xlYW51cF9xdWV1ZShqc2ZfcXVldWUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDlkMjExOWIuLjM3MjcyMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC01NDUsNyArNTQ1LDcgQEAKIAogY29uZmlnIFNDU0lfQlVTTE9HSUMKIAl0cmlzdGF0ZSAiQnVzTG9naWMgU0NTSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBKSAmJiBTQ1NJICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiAoUENJIHx8IElTQSB8fCBNQ0EpICYmIFNDU0kgJiYgSVNBX0RNQV9BUEkgJiYgVklSVF9UT19CVVMKIAktLS1oZWxwLS0tCiAJICBUaGlzIGlzIHN1cHBvcnQgZm9yIEJ1c0xvZ2ljIE11bHRpTWFzdGVyIGFuZCBGbGFzaFBvaW50IFNDU0kgSG9zdAogCSAgQWRhcHRlcnMuIENvbnN1bHQgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19zY3NpX2hvc3QuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCmluZGV4IGQ3MGRkZmQuLjljNTM0MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX3Njc2lfaG9zdC5jCkBAIC00MCw2ICs0MCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogLyogLS0tLS0tLS0tLSBTQ1NJIEhvc3QgZ2x1ZSAtLS0tLS0tLS0tICovCkBAIC04NjgsOCArODY5LDYgQEAKIHsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gX3Nhc19oYTsKIAotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwotCiAJd2hpbGUgKDEpIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc2NoZWR1bGUoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDlhZGI2NGEuLjhhNTI1YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTE1MTYsOCArMTUxNyw2IEBACiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBkYXRhOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAkvKgogCSAqIFdlIHVzZSBUQVNLX0lOVEVSUlVQVElCTEUgc28gdGhhdCB0aGUgdGhyZWFkIGlzIG5vdAogCSAqIGNvdW50ZWQgYWdhaW5zdCB0aGUgbG9hZCBhdmVyYWdlIGFzIGEgcnVubmluZyBwcm9jZXNzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA0NDhkMzE2Li40MjRkNTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtNjg0LDcgKzY4NCw3IEBACiAJCWNhc2UgU0NTSV9JT0NUTF9HRVRfQlVTX05VTUJFUjoKIAkJCXJldHVybiBzY3NpX2lvY3RsKHNkcCwgY21kLCBwKTsKIAkJZGVmYXVsdDoKLQkJCWVycm9yID0gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzaywgY21kLCBwKTsKKwkJCWVycm9yID0gc2NzaV9jbWRfaW9jdGwoZmlscCwgZGlzay0+cXVldWUsIGRpc2ssIGNtZCwgcCk7CiAJCQlpZiAoZXJyb3IgIT0gLUVOT1RUWSkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCA1NWJmZWNjLi5hNGY3Yjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMzU0OSw3ICszNTQ5LDggQEAKIAkJCSAgICAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJCQlpID0gLUVQRVJNOwogCQkJZWxzZQotCQkJCWkgPSBzY3NpX2NtZF9pb2N0bChmaWxlLCBTVHAtPmRpc2ssIGNtZF9pbiwgcCk7CisJCQkJaSA9IHNjc2lfY21kX2lvY3RsKGZpbGUsIFNUcC0+ZGlzay0+cXVldWUsCisJCQkJCQkgICBTVHAtPmRpc2ssIGNtZF9pbiwgcCk7CiAJCQlpZiAoaSAhPSAtRU5PVFRZKQogCQkJCXJldHVybiBpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwppbmRleCA2ODgxN2E3Li4yYWE2YmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKQEAgLTkzNCw4ICs5MzQsNiBAQAogCS8qCiAJICogU2V0IHVwIHBhcml0eSBjaGVjayBmbGFnCiAJICovCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKSAoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLKSkKLQogCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSAoQkRfU0NfRU1QVFkgfCBCRF9TQ19PVik7CiAJaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKIAkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBCRF9TQ19GUiB8IEJEX1NDX1BSOwpAQCAtMTUyNywxMSArMTUyNSw2IEBACiB7CiAJc2VyX2luZm9fdCAqaW5mbyA9IChzZXJfaW5mb190ICopdHR5LT5kcml2ZXJfZGF0YTsKIAotCWlmICggICAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCSAgICAmJiAoICAgUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAKLQkJPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkKLQkgIHJldHVybjsKLQogCWNoYW5nZV9zcGVlZChpbmZvKTsKIAogI2lmZGVmIG1vZGVtX2NvbnRyb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCBjODRkYWIwLi4wYjNlYzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCkBAIC0yNTE0LDEyICsyNTE0LDE4IEBACiAJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IHNlcmlhbDgyNTBfY29uc29sZV9lYXJseV9zZXR1cCh2b2lkKQoreworCXJldHVybiBzZXJpYWw4MjUwX2ZpbmRfcG9ydF9mb3JfZWFybHljb24oKTsKK30KKwogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzZXJpYWw4MjUwX3JlZzsKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJpYWw4MjUwX2NvbnNvbGUgPSB7CiAJLm5hbWUJCT0gInR0eVMiLAogCS53cml0ZQkJPSBzZXJpYWw4MjUwX2NvbnNvbGVfd3JpdGUsCiAJLmRldmljZQkJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAogCS5zZXR1cAkJPSBzZXJpYWw4MjUwX2NvbnNvbGVfc2V0dXAsCisJLmVhcmx5X3NldHVwCT0gc2VyaWFsODI1MF9jb25zb2xlX2Vhcmx5X3NldHVwLAogCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCiAJLmluZGV4CQk9IC0xLAogCS5kYXRhCQk9ICZzZXJpYWw4MjUwX3JlZywKQEAgLTI1MzMsNyArMjUzOSw3IEBACiB9CiBjb25zb2xlX2luaXRjYWxsKHNlcmlhbDgyNTBfY29uc29sZV9pbml0KTsKIAotc3RhdGljIGludCBfX2luaXQgZmluZF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnApCitpbnQgc2VyaWFsODI1MF9maW5kX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcCkKIHsKIAlpbnQgbGluZTsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwpAQCAtMjU0NiwyNiArMjU1Miw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLWludCBfX2luaXQgc2VyaWFsODI1MF9zdGFydF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGNoYXIgKm9wdGlvbnMpCi17Ci0JaW50IGxpbmU7Ci0KLQlsaW5lID0gZmluZF9wb3J0KHBvcnQpOwotCWlmIChsaW5lIDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eVMiLCBsaW5lLCBvcHRpb25zKTsKLQlwcmludGsoIkFkZGluZyBjb25zb2xlIG9uIHR0eVMlZCBhdCAlcyAweCVseCAob3B0aW9ucyAnJXMnKVxuIiwKLQkJbGluZSwgcG9ydC0+aW90eXBlID09IFVQSU9fTUVNID8gIk1NSU8iIDogIkkvTyBwb3J0IiwKLQkJcG9ydC0+aW90eXBlID09IFVQSU9fTUVNID8gKHVuc2lnbmVkIGxvbmcpIHBvcnQtPm1hcGJhc2UgOgotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHBvcnQtPmlvYmFzZSwgb3B0aW9ucyk7Ci0JaWYgKCEoc2VyaWFsODI1MF9jb25zb2xlLmZsYWdzICYgQ09OX0VOQUJMRUQpKSB7Ci0JCXNlcmlhbDgyNTBfY29uc29sZS5mbGFncyAmPSB+Q09OX1BSSU5UQlVGRkVSOwotCQlyZWdpc3Rlcl9jb25zb2xlKCZzZXJpYWw4MjUwX2NvbnNvbGUpOwotCX0KLQlyZXR1cm4gbGluZTsKLX0KLQogI2RlZmluZSBTRVJJQUw4MjUwX0NPTlNPTEUJJnNlcmlhbDgyNTBfY29uc29sZQogI2Vsc2UKICNkZWZpbmUgU0VSSUFMODI1MF9DT05TT0xFCU5VTEwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYwppbmRleCA3ZTUxMTE5Li45NDdjMjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jCkBAIC0xNywxMyArMTcsMTEgQEAKICAqIHdlIGxvY2F0ZSB0aGUgZGV2aWNlIGRpcmVjdGx5IGJ5IGl0cyBNTUlPIG9yIEkvTyBwb3J0IGFkZHJlc3MuCiAgKgogICogVGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhlIGRldmljZSBkaXJlY3RseSwgZS5nLiwKLSAqCWNvbnNvbGU9dWFydCxpbywweDNmOCw5NjAwbjgKLSAqCWNvbnNvbGU9dWFydCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgKLSAqIG9yIHBsYXRmb3JtIGNvZGUgY2FuIGNhbGwgZWFybHlfdWFydF9jb25zb2xlX2luaXQoKSB0byBzZXQKLSAqIHRoZSBlYXJseSBVQVJUIGRldmljZS4KLSAqCi0gKiBBZnRlciB0aGUgbm9ybWFsIHNlcmlhbCBkcml2ZXIgc3RhcnRzLCB3ZSB0cnkgdG8gbG9jYXRlIHRoZQotICogbWF0Y2hpbmcgdHR5UyBkZXZpY2UgYW5kIHN0YXJ0IGEgY29uc29sZSB0aGVyZS4KKyAqCWVhcmx5Y29uPXVhcnQ4MjUwLGlvLDB4M2Y4LDk2MDBuOAorICoJZWFybHljb249dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44CisgKiBvcgorICoJY29uc29sZT11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgKKyAqCWNvbnNvbGU9dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44CiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtMzIsMTcgKzMwLDIxIEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CisjaWZkZWYgQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU0KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNlbmRpZgogCi1zdHJ1Y3QgZWFybHlfdWFydF9kZXZpY2Ugeworc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlIHsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CiAJY2hhciBvcHRpb25zWzE2XTsJCS8qIGUuZy4sIDExNTIwMG44ICovCiAJdW5zaWduZWQgaW50IGJhdWQ7CiB9OwogCi1zdGF0aWMgc3RydWN0IGVhcmx5X3VhcnRfZGV2aWNlIGVhcmx5X2RldmljZSBfX2luaXRkYXRhOwotc3RhdGljIGludCBlYXJseV91YXJ0X3JlZ2lzdGVyZWQgX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgZWFybHlfZGV2aWNlOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBzZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IG9mZnNldCkKIHsKQEAgLTgwLDcgKzgyLDcgQEAKIAlzZXJpYWxfb3V0KHBvcnQsIFVBUlRfVFgsIGMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfdWFydF93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQorc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3NlcmlhbDgyNTBfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmVhcmx5X2RldmljZS5wb3J0OwogCXVuc2lnbmVkIGludCBpZXI7CkBAIC0xMTEsNyArMTEzLDcgQEAKIAlyZXR1cm4gKHBvcnQtPnVhcnRjbGsgLyAxNikgLyBxdW90OwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9wb3J0KHN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlKQorc3RhdGljIHZvaWQgX19pbml0IGluaXRfcG9ydChzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKIAl1bnNpZ25lZCBpbnQgZGl2aXNvcjsKQEAgLTEzMCwxMCArMTMyLDkgQEAKIAlzZXJpYWxfb3V0KHBvcnQsIFVBUlRfTENSLCBjICYgflVBUlRfTENSX0RMQUIpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9vcHRpb25zKHN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlLCBjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSwgY2hhciAqb3B0aW9ucykKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKLQlpbnQgbWFwc2l6ZSA9IDY0OwogCWludCBtbWlvLCBsZW5ndGg7CiAKIAlpZiAoIW9wdGlvbnMpCkBAIC0xNDMsMTIgKzE0NCwxOCBAQAogCWlmICghc3RybmNtcChvcHRpb25zLCAibW1pbywiLCA1KSkgewogCQlwb3J0LT5pb3R5cGUgPSBVUElPX01FTTsKIAkJcG9ydC0+bWFwYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMgKyA1LCAmb3B0aW9ucywgMCk7Ci0JCXBvcnQtPm1lbWJhc2UgPSBpb3JlbWFwKHBvcnQtPm1hcGJhc2UsIG1hcHNpemUpOworI2lmZGVmIENPTkZJR19GSVhfRUFSTFlDT05fTUVNCisJCXNldF9maXhtYXBfbm9jYWNoZShGSVhfRUFSTFlDT05fTUVNX0JBU0UsIHBvcnQtPm1hcGJhc2UgJiBQQUdFX01BU0spOworCQlwb3J0LT5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKV9fZml4X3RvX3ZpcnQoRklYX0VBUkxZQ09OX01FTV9CQVNFKTsKKwkJcG9ydC0+bWVtYmFzZSArPSBwb3J0LT5tYXBiYXNlICYgflBBR0VfTUFTSzsKKyNlbHNlCisJCXBvcnQtPm1lbWJhc2UgPSBpb3JlbWFwKHBvcnQtPm1hcGJhc2UsIDY0KTsKIAkJaWYgKCFwb3J0LT5tZW1iYXNlKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBpb3JlbWFwIDB4JWx4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgcG9ydC0+bWFwYmFzZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQorI2VuZGlmCiAJCW1taW8gPSAxOwogCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgImlvLCIsIDMpKSB7CiAJCXBvcnQtPmlvdHlwZSA9IFVQSU9fUE9SVDsKQEAgLTE3NSw5ICsxODIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfdWFydF9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY2hhciAqb3B0aW9ucykKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBlYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUgX19pbml0ZGF0YSA9IHsKKwkubmFtZQk9ICJ1YXJ0IiwKKwkud3JpdGUJPSBlYXJseV9zZXJpYWw4MjUwX3dyaXRlLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9CT09ULAorCS5pbmRleAk9IC0xLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZWFybHlfc2VyaWFsODI1MF9zZXR1cChjaGFyICpvcHRpb25zKQogewotCXN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlID0gJmVhcmx5X2RldmljZTsKKwlzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSA9ICZlYXJseV9kZXZpY2U7CiAJaW50IGVycjsKIAogCWlmIChkZXZpY2UtPnBvcnQubWVtYmFzZSB8fCBkZXZpY2UtPnBvcnQuaW9iYXNlKQpAQCAtMTkwLDYxICsyMDQsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjb25zb2xlIGVhcmx5X3VhcnRfY29uc29sZSBfX2luaXRkYXRhID0gewotCS5uYW1lCT0gInVhcnQiLAotCS53cml0ZQk9IGVhcmx5X3VhcnRfd3JpdGUsCi0JLnNldHVwCT0gZWFybHlfdWFydF9zZXR1cCwKLQkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CT0gLTEsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlYXJseV91YXJ0X2NvbnNvbGVfaW5pdCh2b2lkKQotewotCWlmICghZWFybHlfdWFydF9yZWdpc3RlcmVkKSB7Ci0JCXJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X3VhcnRfY29uc29sZSk7Ci0JCWVhcmx5X3VhcnRfcmVnaXN0ZXJlZCA9IDE7Ci0JfQotCXJldHVybiAwOwotfQotY29uc29sZV9pbml0Y2FsbChlYXJseV91YXJ0X2NvbnNvbGVfaW5pdCk7Ci0KLWludCBfX2luaXQgZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChjaGFyICpjbWRsaW5lKQoraW50IF9faW5pdCBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUoY2hhciAqY21kbGluZSkKIHsKIAljaGFyICpvcHRpb25zOwogCWludCBlcnI7CiAKLQlvcHRpb25zID0gc3Ryc3RyKGNtZGxpbmUsICJjb25zb2xlPXVhcnQsIik7Ci0JaWYgKCFvcHRpb25zKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlvcHRpb25zID0gc3Ryc3RyKGNtZGxpbmUsICJ1YXJ0ODI1MCwiKTsKKwlpZiAoIW9wdGlvbnMpIHsKKwkJb3B0aW9ucyA9IHN0cnN0cihjbWRsaW5lLCAidWFydCwiKTsKKwkJaWYgKCFvcHRpb25zKQorCQkJcmV0dXJuIDA7CisJfQogCiAJb3B0aW9ucyA9IHN0cmNocihjbWRsaW5lLCAnLCcpICsgMTsKLQlpZiAoKGVyciA9IGVhcmx5X3VhcnRfc2V0dXAoTlVMTCwgb3B0aW9ucykpIDwgMCkKKwlpZiAoKGVyciA9IGVhcmx5X3NlcmlhbDgyNTBfc2V0dXAob3B0aW9ucykpIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlyZXR1cm4gZWFybHlfdWFydF9jb25zb2xlX2luaXQoKTsKLX0KIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfdWFydF9jb25zb2xlX3N3aXRjaCh2b2lkKQotewotCXN0cnVjdCBlYXJseV91YXJ0X2RldmljZSAqZGV2aWNlID0gJmVhcmx5X2RldmljZTsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKLQlpbnQgbW1pbywgbGluZTsKLQotCWlmICghKGVhcmx5X3VhcnRfY29uc29sZS5mbGFncyAmIENPTl9FTkFCTEVEKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUcnkgdG8gc3RhcnQgdGhlIG5vcm1hbCBkcml2ZXIgb24gYSBtYXRjaGluZyBsaW5lLiAgKi8KLQltbWlvID0gKHBvcnQtPmlvdHlwZSA9PSBVUElPX01FTSk7Ci0JbGluZSA9IHNlcmlhbDgyNTBfc3RhcnRfY29uc29sZShwb3J0LCBkZXZpY2UtPm9wdGlvbnMpOwotCWlmIChsaW5lIDwgMCkKLQkJcHJpbnRrKCJObyB0dHlTIGRldmljZSBhdCAlcyAweCVseCBmb3IgY29uc29sZVxuIiwKLQkJCW1taW8gPyAiTU1JTyIgOiAiSS9PIHBvcnQiLAotCQkJbW1pbyA/IHBvcnQtPm1hcGJhc2UgOgotCQkJICAgICh1bnNpZ25lZCBsb25nKSBwb3J0LT5pb2Jhc2UpOwotCi0JdW5yZWdpc3Rlcl9jb25zb2xlKCZlYXJseV91YXJ0X2NvbnNvbGUpOwotCWlmIChtbWlvKQotCQlpb3VubWFwKHBvcnQtPm1lbWJhc2UpOworCXJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X3NlcmlhbDgyNTBfY29uc29sZSk7CiAKIAlyZXR1cm4gMDsKIH0KLWxhdGVfaW5pdGNhbGwoZWFybHlfdWFydF9jb25zb2xlX3N3aXRjaCk7CisKK2ludCBfX2luaXQgc2VyaWFsODI1MF9maW5kX3BvcnRfZm9yX2Vhcmx5Y29uKHZvaWQpCit7CisJc3RydWN0IGVhcmx5X3NlcmlhbDgyNTBfZGV2aWNlICpkZXZpY2UgPSAmZWFybHlfZGV2aWNlOworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmZGV2aWNlLT5wb3J0OworCWludCBsaW5lOworCWludCByZXQ7CisKKwlpZiAoIWRldmljZS0+cG9ydC5tZW1iYXNlICYmICFkZXZpY2UtPnBvcnQuaW9iYXNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxpbmUgPSBzZXJpYWw4MjUwX2ZpbmRfcG9ydChwb3J0KTsKKwlpZiAobGluZSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gdXBkYXRlX2NvbnNvbGVfY21kbGluZSgidWFydCIsIDgyNTAsCisJCQkgICAgICJ0dHlTIiwgbGluZSwgZGV2aWNlLT5vcHRpb25zKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0ID0gdXBkYXRlX2NvbnNvbGVfY21kbGluZSgidWFydCIsIDAsCisJCQkJICAgICAidHR5UyIsIGxpbmUsIGRldmljZS0+b3B0aW9ucyk7CisKKwlyZXR1cm4gcmV0OworfQorCitlYXJseV9wYXJhbSgiZWFybHljb24iLCBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggMmFkYmVkNC4uN2ZhNDEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC02Miw4ICs2MiwyMiBAQAogCSAga2VybmVsIHdpbGwgYXV0b21hdGljYWxseSB1c2UgdGhlIGZpcnN0IHNlcmlhbCBsaW5lLCAvZGV2L3R0eVMwLCBhcwogCSAgc3lzdGVtIGNvbnNvbGUuCiAKKwkgIHlvdSBjYW4gc2V0IHRoYXQgdXNpbmcgYSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiBzdWNoIGFzCisJICAiY29uc29sZT11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgiCisJICAiY29uc29sZT11YXJ0ODI1MCxtbWlvLDB4ZmY1ZTAwMDAsMTE1MjAwbjgiLgorCSAgYW5kIGl0IHdpbGwgc3dpdGNoIHRvIG5vcm1hbCBzZXJpYWwgY29uc29sZSB3aGVuIGNvcnJlcG9uZGluZyBwb3J0IGlzCisJICByZWFkeS4KKwkgICJlYXJseWNvbj11YXJ0ODI1MCxpbywweDNmOCw5NjAwbjgiCisJICAiZWFybHljb249dWFydDgyNTAsbW1pbywweGZmNWUwMDAwLDExNTIwMG44Ii4KKwkgIGl0IHdpbGwgbm90IG9ubHkgc2V0dXAgZWFybHkgY29uc29sZS4KKwogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIEZJWF9FQVJMWUNPTl9NRU0KKwlib29sCisJZGVwZW5kcyBvbiBYODYKKwlkZWZhdWx0IHkKKwogY29uZmlnIFNFUklBTF84MjUwX0dTQwogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAmJiBHU0MKQEAgLTMyNCw2ICszMzgsMzQgQEAKIAkgIHlvdXIgYm9vdCBsb2FkZXIgKGxpbG8gb3IgbG9hZGxpbikgYWJvdXQgaG93IHRvIHBhc3Mgb3B0aW9ucyB0byB0aGUKIAkgIGtlcm5lbCBhdCBib290IHRpbWUuKQogCitjb25maWcgU0VSSUFMX1NCMTI1MF9EVUFSVAorCXRyaXN0YXRlICJCQ00xeHh4IG9uLWNoaXAgRFVBUlQgc2VyaWFsIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTSUJZVEVfU0IxeHh4X1NPQz15CisJc2VsZWN0IFNFUklBTF9DT1JFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIGFzeW5jaHJvbm91cyBzZXJpYWwgaW50ZXJmYWNlIChEVUFSVCkgaW5jbHVkZWQgaW4KKwkgIHRoZSBCQ00xMjUwIGFuZCBkZXJpdmVkIFN5c3RlbS1Pbi1hLUNoaXAgKFNPQykgZGV2aWNlcy4gIE5vdGUgdGhhdAorCSAgdGhlIGxldHRlciBEIGluIERVQVJUIHN0YW5kcyBmb3IgImR1YWwiLCB3aGljaCBpcyBob3cgdGhlIGRldmljZQorCSAgaXMgaW1wbGVtZW50ZWQuICBEZXBlbmRpbmcgb24gdGhlIFNPQyBjb25maWd1cmF0aW9uIHRoZXJlIG1heSBiZQorCSAgb25lIG9yIG1vcmUgRFVBUlRzIGF2YWlsYWJsZSBvZiB3aGljaCBhbGwgYXJlIGhhbmRsZWQuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOgorCSAgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzYjEyNTAtZHVhcnQuCisKK2NvbmZpZyBTRVJJQUxfU0IxMjUwX0RVQVJUX0NPTlNPTEUKKwlib29sICJTdXBwb3J0IGZvciBjb25zb2xlIG9uIGEgQkNNMXh4eCBEVUFSVCBzZXJpYWwgcG9ydCIKKwlkZXBlbmRzIG9uIFNFUklBTF9TQjEyNTBfRFVBUlQ9eQorCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIGl0IHdpbGwgYmUgcG9zc2libGUgdG8gdXNlIGEgc2VyaWFsIHBvcnQgYXMgdGhlCisJICBzeXN0ZW0gY29uc29sZSAodGhlIHN5c3RlbSBjb25zb2xlIGlzIHRoZSBkZXZpY2Ugd2hpY2ggcmVjZWl2ZXMgYWxsCisJICBrZXJuZWwgbWVzc2FnZXMgYW5kIHdhcm5pbmdzIGFuZCB3aGljaCBhbGxvd3MgbG9naW5zIGluIHNpbmdsZSB1c2VyCisJICBtb2RlKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIFNFUklBTF9BVE1FTAogCWJvb2wgIkFUOTEgLyBBVDMyIG9uLWNoaXAgc2VyaWFsIHBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIChBUk0gJiYgQVJDSF9BVDkxKSB8fCBBVlIzMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCAwOGFkMGQ5Li5jNDhjZGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtNTEsNiArNTEsNyBAQAogb2JqLSQoQ09ORklHX1NFUklBTF9JQ09NKSArPSBpY29tLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTTMyUl9TSU8pICs9IG0zMnJfc2lvLm8KIG9iai0kKENPTkZJR19TRVJJQUxfTVBTQykgKz0gbXBzYy5vCitvYmotJChDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVCkgKz0gc2IxMjUwLWR1YXJ0Lm8KIG9iai0kKENPTkZJR19FVFJBWF9TRVJJQUwpICs9IGNyaXN2MTAubwogb2JqLSQoQ09ORklHX1NFUklBTF9KU00pICs9IGpzbS8KIG9iai0kKENPTkZJR19TRVJJQUxfVFhYOSkgKz0gc2VyaWFsX3R4eDkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYwppbmRleCAzMzIwYmNkLi40ZDZiM2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTE0LDYgKzExNCw3IEBACiAJc3RydWN0IHVhcnRfcG9ydAl1YXJ0OwkJLyogdWFydCAqLwogCXN0cnVjdCBjbGsJCSpjbGs7CQkvKiB1YXJ0IGNsb2NrICovCiAJdW5zaWduZWQgc2hvcnQJCXN1c3BlbmRlZDsJLyogaXMgcG9ydCBzdXNwZW5kZWQ/ICovCisJaW50CQkJYnJlYWtfYWN0aXZlOwkvKiBicmVhayBiZWluZyByZWNlaXZlZCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgYXRtZWxfcG9ydHNbQVRNRUxfTUFYX1VBUlRdOwpAQCAtMjUyLDYgKzI1Myw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0bWVsX3J4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IChzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICopIHBvcnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgZmxnOwogCkBAIC0yNjcsMTMgKzI2OSwyOSBAQAogCQkgKiBub3RlIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGNvZGUgaXMKIAkJICogb3V0IG9mIHRoZSBtYWluIGV4ZWN1dGlvbiBwYXRoCiAJCSAqLwotCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKEFUTUVMX1VTX1BBUkUgfCBBVE1FTF9VU19GUkFNRSB8IEFUTUVMX1VTX09WUkUgfCBBVE1FTF9VU19SWEJSSykpKSB7CisJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FCisJCQkJICAgICAgIHwgQVRNRUxfVVNfT1ZSRSB8IEFUTUVMX1VTX1JYQlJLKQorCQkJICAgICB8fCBhdG1lbF9wb3J0LT5icmVha19hY3RpdmUpKSB7CiAJCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEpOwkvKiBjbGVhciBlcnJvciAqLwotCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1JYQlJLKSB7CisJCQlpZiAoc3RhdHVzICYgQVRNRUxfVVNfUlhCUksKKwkJCSAgICAmJiAhYXRtZWxfcG9ydC0+YnJlYWtfYWN0aXZlKSB7CiAJCQkJc3RhdHVzICY9IH4oQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FKTsJLyogaWdub3JlIHNpZGUtZWZmZWN0ICovCiAJCQkJcG9ydC0+aWNvdW50LmJyaysrOworCQkJCWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSA9IDE7CisJCQkJVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX1JYQlJLKTsKIAkJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCiAJCQkJCWdvdG8gaWdub3JlX2NoYXI7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyBlaXRoZXIgdGhlIGVuZC1vZi1icmVhaworCQkJCSAqIGNvbmRpdGlvbiBvciB3ZSd2ZSByZWNlaXZlZCBhdAorCQkJCSAqIGxlYXN0IG9uZSBjaGFyYWN0ZXIgd2l0aG91dCBSWEJSSworCQkJCSAqIGJlaW5nIHNldC4gSW4gYm90aCBjYXNlcywgdGhlIG5leHQKKwkJCQkgKiBSWEJSSyB3aWxsIGluZGljYXRlIHN0YXJ0LW9mLWJyZWFrLgorCQkJCSAqLworCQkJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19SWEJSSyk7CisJCQkJc3RhdHVzICY9IH5BVE1FTF9VU19SWEJSSzsKKwkJCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAwOwogCQkJfQogCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1BBUkUpCiAJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwpAQCAtMzUyLDYgKzM3MCwxNiBAQAogCQkvKiBJbnRlcnJ1cHQgcmVjZWl2ZSAqLwogCQlpZiAocGVuZGluZyAmIEFUTUVMX1VTX1JYUkRZKQogCQkJYXRtZWxfcnhfY2hhcnMocG9ydCk7CisJCWVsc2UgaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SWEJSSykgeworCQkJLyoKKwkJCSAqIEVuZCBvZiBicmVhayBkZXRlY3RlZC4gSWYgaXQgY2FtZSBhbG9uZworCQkJICogd2l0aCBhIGNoYXJhY3RlciwgYXRtZWxfcnhfY2hhcnMgd2lsbAorCQkJICogaGFuZGxlIGl0LgorCQkJICovCisJCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEpOworCQkJVUFSVF9QVVRfSURSKHBvcnQsIEFUTUVMX1VTX1JYQlJLKTsKKwkJCWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSA9IDA7CisJCX0KIAogCQkvLyBUT0RPOiBBbGwgcmVhZHMgdG8gQ1NSIHdpbGwgY2xlYXIgdGhlc2UgaW50ZXJydXB0cyEKIAkJaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SSUlDKSBwb3J0LT5pY291bnQucm5nKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jb3JlLmMKaW5kZXggYjYzZmY4ZC4uY2VmZGU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NvcmUuYwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJCX0KIAkJYmRwLT5jYmRfZGF0bGVuID0gY291bnQ7CiAJCWJkcC0+Y2JkX3NjIHw9IEJEX1NDX1JFQURZOwotCQlfX2FzbV9fKCJlaWVpbyIpOworCQllaWVpbygpOwogCQkvKiBHZXQgbmV4dCBCRC4gKi8KIAkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfU0NfV1JBUCkKIAkJCWJkcCA9IHBpbmZvLT50eF9iZF9iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaXAyMnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwppbmRleCBjM2FiZmIzLi5mMzI1N2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYwpAQCAtODYyLDYgKzg2Miw3IEBACiAJdXAtPmNmbGFnID0gdGVybWlvcy0+Y19jZmxhZzsKIAogCWlwMjJ6aWxvZ19tYXliZV91cGRhdGVfcmVncyh1cCwgWklMT0dfQ0hBTk5FTF9GUk9NX1BPUlQocG9ydCkpOworCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CkBAIC0xMDE3LDYgKzEwMTgsOCBAQAogCX0KIAogCWNvbi0+Y2ZsYWcgPSBjZmxhZyB8IENTODsJCQkvKiA4TjEgKi8KKworCXVhcnRfdXBkYXRlX3RpbWVvdXQoJmlwMjJ6aWxvZ19wb3J0X3RhYmxlW2Nvbi0+aW5kZXhdLnBvcnQsIGNmbGFnLCBiYXVkKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaXAyMnppbG9nX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL29mX3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMKaW5kZXggN2ZmZGFlYS4uYTY0ZDg1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvb2Zfc2VyaWFsLmMKQEAgLTE3LDYgKzE3LDExIEBACiAjaW5jbHVkZSA8YXNtL29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAorc3RydWN0IG9mX3NlcmlhbF9pbmZvIHsKKwlpbnQgdHlwZTsKKwlpbnQgbGluZTsKK307CisKIC8qCiAgKiBGaWxsIGEgc3RydWN0IHVhcnRfcG9ydCBmb3IgYSBnaXZlbiBkZXZpY2Ugbm9kZQogICovCkBAIC02Miw2ICs2Nyw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBvZl9wbGF0Zm9ybV9zZXJpYWxfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYsCiAJCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZCkKIHsKKwlzdHJ1Y3Qgb2Zfc2VyaWFsX2luZm8gKmluZm87CiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OwogCWludCBwb3J0X3R5cGU7CiAJaW50IHJldDsKQEAgLTY5LDMwICs3NSwzNSBAQAogCWlmIChvZl9maW5kX3Byb3BlcnR5KG9mZGV2LT5ub2RlLCAidXNlZC1ieS1ydGFzIiwgTlVMTCkpCiAJCXJldHVybiAtRUJVU1k7CiAKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXBvcnRfdHlwZSA9ICh1bnNpZ25lZCBsb25nKWlkLT5kYXRhOwogCXJldCA9IG9mX3BsYXRmb3JtX3NlcmlhbF9zZXR1cChvZmRldiwgcG9ydF90eXBlLCAmcG9ydCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKIAlzd2l0Y2ggKHBvcnRfdHlwZSkgewotCWNhc2UgUE9SVF9VTktOT1dOOgotCQlkZXZfaW5mbygmb2ZkZXYtPmRldiwgIlVua25vd24gc2VyaWFsIHBvcnQgZm91bmQsICIKLQkJCSJhdHRlbXB0aW5nIHRvIHVzZSA4MjUwIGRyaXZlclxuIik7Ci0JCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBQT1JUXzgyNTAgLi4uIFBPUlRfTUFYXzgyNTA6CiAJCXJldCA9IHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmcG9ydCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCisJY2FzZSBQT1JUX1VOS05PV046CisJCWRldl9pbmZvKCZvZmRldi0+ZGV2LCAiVW5rbm93biBzZXJpYWwgcG9ydCBmb3VuZCwgaWdub3JlZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWJyZWFrOwogCX0KIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlvZmRldi0+ZGV2LmRyaXZlcl9kYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylyZXQ7CisJaW5mby0+dHlwZSA9IHBvcnRfdHlwZTsKKwlpbmZvLT5saW5lID0gcmV0OworCW9mZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBpbmZvOwogCXJldHVybiAwOwogb3V0OgorCWtmcmVlKGluZm8pOwogCWlycV9kaXNwb3NlX21hcHBpbmcocG9ydC5pcnEpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMDIsOCArMTEzLDE2IEBACiAgKi8KIHN0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fc2VyaWFsX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKIHsKLQlpbnQgbGluZSA9ICh1bnNpZ25lZCBsb25nKW9mZGV2LT5kZXYuZHJpdmVyX2RhdGE7Ci0Jc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQobGluZSk7CisJc3RydWN0IG9mX3NlcmlhbF9pbmZvICppbmZvID0gb2ZkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKwljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKKwkJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQoaW5mby0+bGluZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIG5lZWQgdG8gYWRkIGNvZGUgZm9yIHRoZXNlICovCisJCWJyZWFrOworCX0KKwlrZnJlZShpbmZvKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2IxMjUwLWR1YXJ0LmMgYi9kcml2ZXJzL3NlcmlhbC9zYjEyNTAtZHVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDlkNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvc2IxMjUwLWR1YXJ0LmMKQEAgLTAsMCArMSw5NzIgQEAKKy8qCisgKglkcml2ZXJzL3NlcmlhbC9zYjEyNTAtZHVhcnQuYworICoKKyAqCVN1cHBvcnQgZm9yIHRoZSBhc3luY2hyb25vdXMgc2VyaWFsIGludGVyZmFjZSAoRFVBUlQpIGluY2x1ZGVkCisgKglpbiB0aGUgQkNNMTI1MCBhbmQgZGVyaXZlZCBTeXN0ZW0tT24tYS1DaGlwIChTT0MpIGRldmljZXMuCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDA3ICBNYWNpZWogVy4gUm96eWNraQorICoKKyAqCURlcml2ZWQgZnJvbSBkcml2ZXJzL2NoYXIvc2IxMjUwX2R1YXJ0LmMgZm9yIHdoaWNoIHRoZSBmb2xsb3dpbmcKKyAqCWNvcHlyaWdodCBhcHBsaWVzOgorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVJlZmVyZW5jZXM6CisgKgorICoJIkJDTTEyNTAvQkNNMTEyNS9CQ00xMTI1SCBVc2VyIE1hbnVhbCIsIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFHSUNfU1lTUlEpCisjZGVmaW5lIFNVUFBPUlRfU1lTUlEKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS93YXIuaD4KKworI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfdWFydC5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc3dhcm0uaD4KKworCisjaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTF4NTUpIHx8IGRlZmluZWQoQ09ORklHX1NJQllURV9CQ00xeDgwKQorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9iY20xNDgwX2ludC5oPgorCisjZGVmaW5lIFNCRF9DSEFOUkVHUyhsaW5lKQlBX0JDTTE0ODBfRFVBUlRfQ0hBTlJFRygobGluZSksIDApCisjZGVmaW5lIFNCRF9DVFJMUkVHUyhsaW5lKQlBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygobGluZSksIDApCisjZGVmaW5lIFNCRF9JTlQobGluZSkJCShLX0JDTTE0ODBfSU5UX1VBUlRfMCArIChsaW5lKSkKKworI2VsaWYgZGVmaW5lZChDT05GSUdfU0lCWVRFX1NCMTI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0lCWVRFX0JDTTExMlgpCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2ludC5oPgorCisjZGVmaW5lIFNCRF9DSEFOUkVHUyhsaW5lKQlBX0RVQVJUX0NIQU5SRUcoKGxpbmUpLCAwKQorI2RlZmluZSBTQkRfQ1RSTFJFR1MobGluZSkJQV9EVUFSVF9DVFJMUkVHKDApCisjZGVmaW5lIFNCRF9JTlQobGluZSkJCShLX0lOVF9VQVJUXzAgKyAobGluZSkpCisKKyNlbHNlCisjZXJyb3IgaW52YWxpZCBTQjEyNTAgVUFSVCBjb25maWd1cmF0aW9uCisKKyNlbmRpZgorCisKK01PRFVMRV9BVVRIT1IoIk1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BsaW51eC1taXBzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQkNNMXh4eCBvbi1jaGlwIERVQVJUIHNlcmlhbCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisjZGVmaW5lIERVQVJUX01BWF9DSElQIDIKKyNkZWZpbmUgRFVBUlRfTUFYX1NJREUgMgorCisvKgorICogUGVyLXBvcnQgc3RhdGUuCisgKi8KK3N0cnVjdCBzYmRfcG9ydCB7CisJc3RydWN0IHNiZF9kdWFydAkqZHVhcnQ7CisJc3RydWN0IHVhcnRfcG9ydAlwb3J0OworCXVuc2lnbmVkIGNoYXIgX19pb21lbQkqbWVtY3RybDsKKwlpbnQJCQl0eF9zdG9wcGVkOworCWludAkJCWluaXRpYWxpc2VkOworfTsKKworLyoKKyAqIFBlci1EVUFSVCBzdGF0ZSBmb3IgdGhlIHNoYXJlZCByZWdpc3RlciBzcGFjZS4KKyAqLworc3RydWN0IHNiZF9kdWFydCB7CisJc3RydWN0IHNiZF9wb3J0CQlzcG9ydFsyXTsKKwl1bnNpZ25lZCBsb25nCQltYXBjdHJsOworCWF0b21pY190CQltYXBfZ3VhcmQ7Cit9OworCisjZGVmaW5lIHRvX3Nwb3J0KHVwb3J0KSBjb250YWluZXJfb2YodXBvcnQsIHN0cnVjdCBzYmRfcG9ydCwgcG9ydCkKKworc3RhdGljIHN0cnVjdCBzYmRfZHVhcnQgc2JkX2R1YXJ0c1tEVUFSVF9NQVhfQ0hJUF07CisKKyNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCisKKworLyoKKyAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgU0IxMjUwIERVQVJUIHJlZ2lzdGVycy4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgcmVnaXN0ZXIgc3BhY2VzOiB0d28gcGVyLWNoYW5uZWwgb25lcyBhbmQKKyAqIGEgc2hhcmVkIG9uZS4gIFdlIGhhdmUgdG8gZGVmaW5lIGFjY2Vzc29ycyBhcHByb3ByaWF0ZWx5LgorICogQWxsIHJlZ2lzdGVycyBhcmUgNjQtYml0IGFuZCBhbGwgYnV0IHRoZSBCYXVkIFJhdGUgQ2xvY2sKKyAqIHJlZ2lzdGVycyBvbmx5IGRlZmluZSA4IGxlYXN0IHNpZ25pZmljYW50IGJpdHMuICBUaGVyZSBpcworICogYWxzbyBhIHdvcmthcm91bmQgdG8gdGFrZSBpbnRvIGFjY291bnQuICBSYXcgYWNjZXNzb3JzIHVzZQorICogdGhlIGZ1bGwgcmVnaXN0ZXIgd2lkdGgsIGJ1dCBjb29rZWQgb25lcyB0cnVuY2F0ZSBpdAorICogaW50ZW50aW9uYWxseSBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBkcml2ZXIgZG9lcyBub3QgY2FyZS4KKyAqLworc3RhdGljIHU2NCBfX3JlYWRfc2JkY2huKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcpCit7CisJdm9pZCBfX2lvbWVtICpjc3IgPSBzcG9ydC0+cG9ydC5tZW1iYXNlICsgcmVnOworCisJcmV0dXJuIF9fcmF3X3JlYWRxKGNzcik7Cit9CisKK3N0YXRpYyB1NjQgX19yZWFkX3NiZHNocihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPm1lbWN0cmwgKyByZWc7CisKKwlyZXR1cm4gX19yYXdfcmVhZHEoY3NyKTsKK30KKworc3RhdGljIHZvaWQgX193cml0ZV9zYmRjaG4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdTY0IHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPnBvcnQubWVtYmFzZSArIHJlZzsKKworCV9fcmF3X3dyaXRlcSh2YWx1ZSwgY3NyKTsKK30KKworc3RhdGljIHZvaWQgX193cml0ZV9zYmRzaHIoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdTY0IHZhbHVlKQoreworCXZvaWQgX19pb21lbSAqY3NyID0gc3BvcnQtPm1lbWN0cmwgKyByZWc7CisKKwlfX3Jhd193cml0ZXEodmFsdWUsIGNzcik7Cit9CisKKy8qCisgKiBJbiBidWcgMTk1Niwgd2UgZ2V0IGdsaXRjaGVzIHRoYXQgY2FuIG1lc3MgdXAgdWFydCByZWdpc3RlcnMuICBUaGlzCisgKiAicmVhZC1tb2RlLXJlZyBhZnRlciBhbnkgcmVnaXN0ZXIgYWNjZXNzIiBpcyBhbiBhY2NlcHRlZCB3b3JrYXJvdW5kLgorICovCitzdGF0aWMgdm9pZCBfX3dhcl9zYmQxOTU2KHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJX19yZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xKTsKKwlfX3JlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX3NiZGNobihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dmFsOworCisJcmV0dmFsID0gX19yZWFkX3NiZGNobihzcG9ydCwgcmVnKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX3NiZHNocihzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0LCBpbnQgcmVnKQoreworCXVuc2lnbmVkIGNoYXIgcmV0dmFsOworCisJcmV0dmFsID0gX19yZWFkX3NiZHNocihzcG9ydCwgcmVnKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9zYmRjaG4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCwgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCV9fd3JpdGVfc2JkY2huKHNwb3J0LCByZWcsIHZhbHVlKTsKKwlpZiAoU0lCWVRFXzE5NTZfV0FSKQorCQlfX3dhcl9zYmQxOTU2KHNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfc2Jkc2hyKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQsIGludCByZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlfX3dyaXRlX3NiZHNocihzcG9ydCwgcmVnLCB2YWx1ZSk7CisJaWYgKFNJQllURV8xOTU2X1dBUikKKwkJX193YXJfc2JkMTk1NihzcG9ydCk7Cit9CisKKworc3RhdGljIGludCBzYmRfcmVjZWl2ZV9yZWFkeShzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXJldHVybiByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9TVEFUVVMpICYgTV9EVUFSVF9SWF9SRFk7Cit9CisKK3N0YXRpYyBpbnQgc2JkX3JlY2VpdmVfZHJhaW4oc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlpbnQgbG9vcHMgPSAxMDAwMDsKKworCXdoaWxlIChzYmRfcmVjZWl2ZV9yZWFkeShzcG9ydCkgJiYgbG9vcHMtLSkKKwkJcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfUlhfSE9MRCk7CisJcmV0dXJuIGxvb3BzOworfQorCitzdGF0aWMgaW50IF9fdW51c2VkIHNiZF90cmFuc21pdF9yZWFkeShzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXJldHVybiByZWFkX3NiZGNobihzcG9ydCwgUl9EVUFSVF9TVEFUVVMpICYgTV9EVUFSVF9UWF9SRFk7Cit9CisKK3N0YXRpYyBpbnQgX191bnVzZWQgc2JkX3RyYW5zbWl0X2RyYWluKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJaW50IGxvb3BzID0gMTAwMDA7CisKKwl3aGlsZSAoIXNiZF90cmFuc21pdF9yZWFkeShzcG9ydCkgJiYgbG9vcHMtLSkKKwkJdWRlbGF5KDIpOworCXJldHVybiBsb29wczsKK30KKworc3RhdGljIGludCBzYmRfdHJhbnNtaXRfZW1wdHkoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlyZXR1cm4gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfU1RBVFVTKSAmIE1fRFVBUlRfVFhfRU1UOworfQorCitzdGF0aWMgaW50IHNiZF9saW5lX2RyYWluKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJaW50IGxvb3BzID0gMTAwMDA7CisKKwl3aGlsZSAoIXNiZF90cmFuc21pdF9lbXB0eShzcG9ydCkgJiYgbG9vcHMtLSkKKwkJdWRlbGF5KDIpOworCXJldHVybiBsb29wczsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IHNiZF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJcmV0dXJuIHNiZF90cmFuc21pdF9lbXB0eShzcG9ydCkgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNiZF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgbWN0cmwsIHN0YXR1czsKKworCXN0YXR1cyA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lOX1BPUlQpOworCXN0YXR1cyA+Pj0gKHVwb3J0LT5saW5lKSAlIDI7CisJbWN0cmwgPSAoIShzdGF0dXMgJiBNX0RVQVJUX0lOX1BJTjBfVkFMKSA/IFRJT0NNX0NUUyA6IDApIHwKKwkJKCEoc3RhdHVzICYgTV9EVUFSVF9JTl9QSU40X1ZBTCkgPyBUSU9DTV9DQVIgOiAwKSB8CisJCSghKHN0YXR1cyAmIE1fRFVBUlRfUklOMF9QSU4pID8gVElPQ01fUk5HIDogMCkgfAorCQkoIShzdGF0dXMgJiBNX0RVQVJUX0lOX1BJTjJfVkFMKSA/IFRJT0NNX0RTUiA6IDApOworCXJldHVybiBtY3RybDsKK30KKworc3RhdGljIHZvaWQgc2JkX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IGNsciA9IDAsIHNldCA9IDAsIG1vZGUyOworCisJaWYgKG1jdHJsICYgVElPQ01fRFRSKQorCQlzZXQgfD0gTV9EVUFSVF9TRVRfT1BSMjsKKwllbHNlCisJCWNsciB8PSBNX0RVQVJUX0NMUl9PUFIyOworCWlmIChtY3RybCAmIFRJT0NNX1JUUykKKwkJc2V0IHw9IE1fRFVBUlRfU0VUX09QUjA7CisJZWxzZQorCQljbHIgfD0gTV9EVUFSVF9DTFJfT1BSMDsKKwljbHIgPDw9ICh1cG9ydC0+bGluZSkgJSAyOworCXNldCA8PD0gKHVwb3J0LT5saW5lKSAlIDI7CisKKwltb2RlMiA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIpOworCW1vZGUyICY9IH5NX0RVQVJUX0NIQU5fTU9ERTsKKwlpZiAobWN0cmwgJiBUSU9DTV9MT09QKQorCQltb2RlMiB8PSBWX0RVQVJUX0NIQU5fTU9ERV9MQ0xfTE9PUDsKKwllbHNlCisJCW1vZGUyIHw9IFZfRFVBUlRfQ0hBTl9NT0RFX05PUk1BTDsKKworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9DTEVBUl9PUFIsIGNscik7CisJd3JpdGVfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX1NFVF9PUFIsIHNldCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzIsIG1vZGUyKTsKK30KKworc3RhdGljIHZvaWQgc2JkX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTKTsKKwlzcG9ydC0+dHhfc3RvcHBlZCA9IDE7Cit9OworCitzdGF0aWMgdm9pZCBzYmRfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwl1bnNpZ25lZCBpbnQgbWFzazsKKworCS8qIEVuYWJsZSB0eCBpbnRlcnJ1cHRzLiAgKi8KKwltYXNrID0gcmVhZF9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJbWFzayB8PSBNX0RVQVJUX0lNUl9UWDsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgbWFzayk7CisKKwkvKiBHbyEsIGdvISwgZ28hLi4uICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRU4pOworCXNwb3J0LT50eF9zdG9wcGVkID0gMDsKK307CisKK3N0YXRpYyB2b2lkIHNiZF9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgMCk7Cit9OworCitzdGF0aWMgdm9pZCBzYmRfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQVVYQ1RMX1gsCisJCSAgICAgTV9EVUFSVF9DSU5fQ0hOR19FTkEgfCBNX0RVQVJUX0NUU19DSE5HX0VOQSk7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9icmVha19jdGwoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIGludCBicmVha19zdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJaWYgKGJyZWFrX3N0YXRlID09IC0xKQorCQl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBWX0RVQVJUX01JU0NfQ01EX1NUQVJUX0JSRUFLKTsKKwllbHNlCisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfU1RPUF9CUkVBSyk7Cit9CisKKworc3RhdGljIHZvaWQgc2JkX3JlY2VpdmVfY2hhcnMoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwlzdHJ1Y3QgdWFydF9pY291bnQgKmljb3VudDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgZmxhZzsKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMTY7IGNvdW50OyBjb3VudC0tKSB7CisJCXN0YXR1cyA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1NUQVRVUyk7CisJCWlmICghKHN0YXR1cyAmIE1fRFVBUlRfUlhfUkRZKSkKKwkJCWJyZWFrOworCisJCWNoID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfUlhfSE9MRCk7CisKKwkJZmxhZyA9IFRUWV9OT1JNQUw7CisKKwkJaWNvdW50ID0gJnVwb3J0LT5pY291bnQ7CisJCWljb3VudC0+cngrKzsKKworCQlpZiAodW5saWtlbHkoc3RhdHVzICYKKwkJCSAgICAgKE1fRFVBUlRfUkNWRF9CUksgfCBNX0RVQVJUX0ZSTV9FUlIgfAorCQkJICAgICAgTV9EVUFSVF9QQVJJVFlfRVJSIHwgTV9EVUFSVF9PVlJVTl9FUlIpKSkgeworCQkJaWYgKHN0YXR1cyAmIE1fRFVBUlRfUkNWRF9CUkspIHsKKwkJCQlpY291bnQtPmJyaysrOworCQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayh1cG9ydCkpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBNX0RVQVJUX0ZSTV9FUlIpCisJCQkJaWNvdW50LT5mcmFtZSsrOworCQkJZWxzZSBpZiAoc3RhdHVzICYgTV9EVUFSVF9QQVJJVFlfRVJSKQorCQkJCWljb3VudC0+cGFyaXR5Kys7CisJCQlpZiAoc3RhdHVzICYgTV9EVUFSVF9PVlJVTl9FUlIpCisJCQkJaWNvdW50LT5vdmVycnVuKys7CisKKwkJCXN0YXR1cyAmPSB1cG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKKwkJCWlmIChzdGF0dXMgJiBNX0RVQVJUX1JDVkRfQlJLKQorCQkJCWZsYWcgPSBUVFlfQlJFQUs7CisJCQllbHNlIGlmIChzdGF0dXMgJiBNX0RVQVJUX0ZSTV9FUlIpCisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIE1fRFVBUlRfUEFSSVRZX0VSUikKKwkJCQlmbGFnID0gVFRZX1BBUklUWTsKKwkJfQorCisJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHVwb3J0LCBjaCkpCisJCQljb250aW51ZTsKKworCQl1YXJ0X2luc2VydF9jaGFyKHVwb3J0LCBzdGF0dXMsIE1fRFVBUlRfT1ZSVU5fRVJSLCBjaCwgZmxhZyk7CisJfQorCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2godXBvcnQtPmluZm8tPnR0eSk7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF90cmFuc21pdF9jaGFycyhzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5pbmZvLT54bWl0OworCXVuc2lnbmVkIGludCBtYXNrOworCWludCBzdG9wX3R4OworCisJLyogWE9OL1hPRkYgY2hhcnMuICAqLworCWlmIChzcG9ydC0+cG9ydC54X2NoYXIpIHsKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX1RYX0hPTEQsIHNwb3J0LT5wb3J0LnhfY2hhcik7CisJCXNwb3J0LT5wb3J0Lmljb3VudC50eCsrOworCQlzcG9ydC0+cG9ydC54X2NoYXIgPSAwOworCQlyZXR1cm47CisJfQorCisJLyogSWYgbm90aGluZyB0byBkbyBvciBzdG9wcGVkIG9yIGhhcmR3YXJlIHN0b3BwZWQuICAqLworCXN0b3BfdHggPSAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmc3BvcnQtPnBvcnQpKTsKKworCS8qIFNlbmQgY2hhci4gICovCisJaWYgKCFzdG9wX3R4KSB7CisJCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9UWF9IT0xELCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOworCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOworCQlzcG9ydC0+cG9ydC5pY291bnQudHgrKzsKKworCQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCQl1YXJ0X3dyaXRlX3dha2V1cCgmc3BvcnQtPnBvcnQpOworCX0KKworCS8qIEFyZSB3ZSBhcmUgZG9uZT8gICovCisJaWYgKHN0b3BfdHggfHwgdWFydF9jaXJjX2VtcHR5KHhtaXQpKSB7CisJCS8qIERpc2FibGUgdHggaW50ZXJydXB0cy4gICovCisJCW1hc2sgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwkJbWFzayAmPSB+TV9EVUFSVF9JTVJfVFg7CisJCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCBtYXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zdGF0dXNfaGFuZGxlKHN0cnVjdCBzYmRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJdW5zaWduZWQgaW50IGRlbHRhOworCisJZGVsdGEgPSByZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTkNIUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisJZGVsdGEgPj49ICh1cG9ydC0+bGluZSkgJSAyOworCisJaWYgKGRlbHRhICYgKE1fRFVBUlRfSU5fUElOMF9WQUwgPDwgU19EVUFSVF9JTl9QSU5fQ0hORykpCisJCXVhcnRfaGFuZGxlX2N0c19jaGFuZ2UodXBvcnQsICEoZGVsdGEgJiBNX0RVQVJUX0lOX1BJTjBfVkFMKSk7CisKKwlpZiAoZGVsdGEgJiAoTV9EVUFSVF9JTl9QSU4yX1ZBTCA8PCBTX0RVQVJUX0lOX1BJTl9DSE5HKSkKKwkJdXBvcnQtPmljb3VudC5kc3IrKzsKKworCWlmIChkZWx0YSAmICgoTV9EVUFSVF9JTl9QSU4yX1ZBTCB8IE1fRFVBUlRfSU5fUElOMF9WQUwpIDw8CisJCSAgICAgU19EVUFSVF9JTl9QSU5fQ0hORykpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdXBvcnQtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNiZF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSBkZXZfaWQ7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQgPSAmc3BvcnQtPnBvcnQ7CisJaXJxcmV0dXJuX3Qgc3RhdHVzID0gSVJRX05PTkU7CisJdW5zaWduZWQgaW50IGludHN0YXQ7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IDE2OyBjb3VudDsgY291bnQtLSkgeworCQlpbnRzdGF0ID0gcmVhZF9zYmRzaHIoc3BvcnQsCisJCQkJICAgICAgUl9EVUFSVF9JU1JSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwkJaW50c3RhdCAmPSByZWFkX3NiZHNocihzcG9ydCwKKwkJCQkgICAgICAgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpKTsKKwkJaW50c3RhdCAmPSBNX0RVQVJUX0lTUl9BTEw7CisJCWlmICghaW50c3RhdCkKKwkJCWJyZWFrOworCisJCWlmIChpbnRzdGF0ICYgTV9EVUFSVF9JU1JfUlgpCisJCQlzYmRfcmVjZWl2ZV9jaGFycyhzcG9ydCk7CisJCWlmIChpbnRzdGF0ICYgTV9EVUFSVF9JU1JfSU4pCisJCQlzYmRfc3RhdHVzX2hhbmRsZShzcG9ydCk7CisJCWlmIChpbnRzdGF0ICYgTV9EVUFSVF9JU1JfVFgpCisJCQlzYmRfdHJhbnNtaXRfY2hhcnMoc3BvcnQpOworCisJCXN0YXR1cyA9IElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBzYmRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCXVuc2lnbmVkIGludCBtb2RlMTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoc3BvcnQtPnBvcnQuaXJxLCBzYmRfaW50ZXJydXB0LAorCQkJICBJUlFGX1NIQVJFRCwgInNiMTI1MC1kdWFydCIsIHNwb3J0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQ2xlYXIgdGhlIHJlY2VpdmUgRklGTy4gICovCisJc2JkX3JlY2VpdmVfZHJhaW4oc3BvcnQpOworCisJLyogQ2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMuICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIFZfRFVBUlRfTUlTQ19DTURfUkVTRVRfQlJFQUtfSU5UKTsKKwlyZWFkX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTkNIUkVHKCh1cG9ydC0+bGluZSkgJSAyKSk7CisKKwkvKiBTZXQgcngvdHggaW50ZXJydXB0IHRvIEZJRk8gYXZhaWxhYmxlLiAgKi8KKwltb2RlMSA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEpOworCW1vZGUxICY9IH4oTV9EVUFSVF9SWF9JUlFfU0VMX1JYRlVMTCB8IE1fRFVBUlRfVFhfSVJRX1NFTF9UWEVNUFQpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xLCBtb2RlMSk7CisKKwkvKiBEaXNhYmxlIHR4LCBlbmFibGUgcnguICAqLworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRElTIHwgTV9EVUFSVF9SWF9FTik7CisJc3BvcnQtPnR4X3N0b3BwZWQgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMuICAqLworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLAorCQkgICAgIE1fRFVBUlRfSU1SX0lOIHwgTV9EVUFSVF9JTVJfUlgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gdG9fc3BvcnQodXBvcnQpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMgfCBNX0RVQVJUX1JYX0RJUyk7CisJc3BvcnQtPnR4X3N0b3BwZWQgPSAxOworCWZyZWVfaXJxKHNwb3J0LT5wb3J0LmlycSwgc3BvcnQpOworfQorCisKK3N0YXRpYyB2b2lkIHNiZF9pbml0X3BvcnQoc3RydWN0IHNiZF9wb3J0ICpzcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCWlmIChzcG9ydC0+aW5pdGlhbGlzZWQpCisJCXJldHVybjsKKworCS8qIFRoZXJlIGlzIG5vIERVQVJUIHJlc2V0IGZlYXR1cmUsIHNvIGp1c3Qgc2V0IHNvbWUgc2FuZSBkZWZhdWx0cy4gICovCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9SRVNFVF9UWCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgVl9EVUFSVF9NSVNDX0NNRF9SRVNFVF9SWCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEsIFZfRFVBUlRfQklUU19QRVJfQ0hBUl84KTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMiwgMCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0ZVTExfQ1RMLAorCQkgICAgIFZfRFVBUlRfSU5UX1RJTUUoMCkgfCBWX0RVQVJUX1NJR19GVUxMKDE1KSk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX09QQ1JfWCwgMCk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0FVWENUTF9YLCAwKTsKKwl3cml0ZV9zYmRzaHIoc3BvcnQsIFJfRFVBUlRfSU1SUkVHKCh1cG9ydC0+bGluZSkgJSAyKSwgMCk7CisKKwlzcG9ydC0+aW5pdGlhbGlzZWQgPSAxOworfQorCitzdGF0aWMgdm9pZCBzYmRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisJdW5zaWduZWQgaW50IG1vZGUxID0gMCwgbW9kZTIgPSAwLCBhdXggPSAwOworCXVuc2lnbmVkIGludCBtb2RlMW1hc2sgPSAwLCBtb2RlMm1hc2sgPSAwLCBhdXhtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgb2xkbW9kZTEsIG9sZG1vZGUyLCBvbGRhdXg7CisJdW5zaWduZWQgaW50IGJhdWQsIGJyZzsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZDsKKworCW1vZGUxbWFzayB8PSB+KE1fRFVBUlRfUEFSSVRZX01PREUgfCBNX0RVQVJUX1BBUklUWV9UWVBFX09ERCB8CisJCSAgICAgICBNX0RVQVJUX0JJVFNfUEVSX0NIQVIpOworCW1vZGUybWFzayB8PSB+TV9EVUFSVF9TVE9QX0JJVF9MRU5fMjsKKwlhdXhtYXNrIHw9IH5NX0RVQVJUX0NUU19DSE5HX0VOQTsKKworCS8qIEJ5dGUgc2l6ZS4gICovCisJc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNToKKwljYXNlIENTNjoKKwkJLyogVW5zdXBwb3J0ZWQsIGxlYXZlIHVuY2hhbmdlZC4gICovCisJCW1vZGUxbWFzayB8PSBNX0RVQVJUX1BBUklUWV9NT0RFOworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbW9kZTEgfD0gVl9EVUFSVF9CSVRTX1BFUl9DSEFSXzc7CisJCWJyZWFrOworCWNhc2UgQ1M4OgorCWRlZmF1bHQ6CisJCW1vZGUxIHw9IFZfRFVBUlRfQklUU19QRVJfQ0hBUl84OworCQlicmVhazsKKwl9CisKKwkvKiBQYXJpdHkgYW5kIHN0b3AgYml0cy4gICovCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIpCisJCW1vZGUyIHw9IE1fRFVBUlRfU1RPUF9CSVRfTEVOXzI7CisJZWxzZQorCQltb2RlMiB8PSBNX0RVQVJUX1NUT1BfQklUX0xFTl8xOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQorCQltb2RlMSB8PSBWX0RVQVJUX1BBUklUWV9NT0RFX0FERDsKKwllbHNlCisJCW1vZGUxIHw9IFZfRFVBUlRfUEFSSVRZX01PREVfTk9ORTsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJbW9kZTEgfD0gTV9EVUFSVF9QQVJJVFlfVFlQRV9PREQ7CisJZWxzZQorCQltb2RlMSB8PSBNX0RVQVJUX1BBUklUWV9UWVBFX0VWRU47CisKKwliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHVwb3J0LCB0ZXJtaW9zLCBvbGRfdGVybWlvcywgMTIwMCwgNTAwMDAwMCk7CisJYnJnID0gVl9EVUFSVF9CQVVEX1JBVEUoYmF1ZCk7CisJLyogVGhlIGFjdHVhbCBsb3dlciBib3VuZCBpcyAxMjIxYnBzLCBzbyBjb21wZW5zYXRlLiAgKi8KKwlpZiAoYnJnID4gTV9EVUFSVF9DTEtfQ09VTlRFUikKKwkJYnJnID0gTV9EVUFSVF9DTEtfQ09VTlRFUjsKKworCXVhcnRfdXBkYXRlX3RpbWVvdXQodXBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOworCisJdXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPSBNX0RVQVJUX09WUlVOX0VSUjsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElOUENLKQorCQl1cG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNX0RVQVJUX0ZSTV9FUlIgfAorCQkJCQkgICBNX0RVQVJUX1BBUklUWV9FUlI7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5UIHwgUEFSTVJLKSkKKwkJdXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9SQ1ZEX0JSSzsKKworCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQorCQl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfRlJNX0VSUiB8CisJCQkJCSAgICAgTV9EVUFSVF9QQVJJVFlfRVJSOworCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOQlJLKSB7CisJCXVwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gTV9EVUFSVF9SQ1ZEX0JSSzsKKwkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCQl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IE1fRFVBUlRfT1ZSVU5fRVJSOworCX0KKworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpCisJCWNvbW1hbmQgPSBNX0RVQVJUX1JYX0VOOworCWVsc2UKKwkJY29tbWFuZCA9IE1fRFVBUlRfUlhfRElTOworCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQlhdXggfD0gTV9EVUFSVF9DVFNfQ0hOR19FTkE7CisJZWxzZQorCQlhdXggJj0gfk1fRFVBUlRfQ1RTX0NITkdfRU5BOworCisJc3Bpbl9sb2NrKCZ1cG9ydC0+bG9jayk7CisKKwlpZiAoc3BvcnQtPnR4X3N0b3BwZWQpCisJCWNvbW1hbmQgfD0gTV9EVUFSVF9UWF9ESVM7CisJZWxzZQorCQljb21tYW5kIHw9IE1fRFVBUlRfVFhfRU47CisKKwlvbGRtb2RlMSA9IHJlYWRfc2JkY2huKHNwb3J0LCBSX0RVQVJUX01PREVfUkVHXzEpICYgbW9kZTFtYXNrOworCW9sZG1vZGUyID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMikgJiBtb2RlMm1hc2s7CisJb2xkYXV4ID0gcmVhZF9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQVVYQ1RMX1gpICYgYXV4bWFzazsKKworCWlmICghc3BvcnQtPnR4X3N0b3BwZWQpCisJCXNiZF9saW5lX2RyYWluKHNwb3J0KTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfQ01ELCBNX0RVQVJUX1RYX0RJUyB8IE1fRFVBUlRfUlhfRElTKTsKKworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9NT0RFX1JFR18xLCBtb2RlMSB8IG9sZG1vZGUxKTsKKwl3cml0ZV9zYmRjaG4oc3BvcnQsIFJfRFVBUlRfTU9ERV9SRUdfMiwgbW9kZTIgfCBvbGRtb2RlMik7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NMS19TRUwsIGJyZyk7CisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0FVWENUTF9YLCBhdXggfCBvbGRhdXgpOworCisJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgY29tbWFuZCk7CisKKwlzcGluX3VubG9jaygmdXBvcnQtPmxvY2spOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpzYmRfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlyZXR1cm4gIlNCMTI1MCBEVUFSVCI7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCit7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9IHNwb3J0LT5kdWFydDsKKwlpbnQgbWFwX2d1YXJkOworCisJaW91bm1hcChzcG9ydC0+bWVtY3RybCk7CisJc3BvcnQtPm1lbWN0cmwgPSBOVUxMOworCWlvdW5tYXAodXBvcnQtPm1lbWJhc2UpOworCXVwb3J0LT5tZW1iYXNlID0gTlVMTDsKKworCW1hcF9ndWFyZCA9IGF0b21pY19hZGRfcmV0dXJuKC0xLCAmZHVhcnQtPm1hcF9ndWFyZCk7CisJaWYgKCFtYXBfZ3VhcmQpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihkdWFydC0+bWFwY3RybCwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwlyZWxlYXNlX21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7Cit9CisKK3N0YXRpYyBpbnQgc2JkX21hcF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcnIgPSBLRVJOX0VSUiAic2JkOiBDYW5ub3QgbWFwIE1NSU9cbiI7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9IHRvX3Nwb3J0KHVwb3J0KTsKKwlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9IHNwb3J0LT5kdWFydDsKKworCWlmICghdXBvcnQtPm1lbWJhc2UpCisJCXVwb3J0LT5tZW1iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHVwb3J0LT5tYXBiYXNlLAorCQkJCQkJIERVQVJUX0NIQU5SRUdfU1BBQ0lORyk7CisJaWYgKCF1cG9ydC0+bWVtYmFzZSkgeworCQlwcmludGsoZXJyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFzcG9ydC0+bWVtY3RybCkKKwkJc3BvcnQtPm1lbWN0cmwgPSBpb3JlbWFwX25vY2FjaGUoZHVhcnQtPm1hcGN0cmwsCisJCQkJCQkgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwlpZiAoIXNwb3J0LT5tZW1jdHJsKSB7CisJCXByaW50ayhlcnIpOworCQlpb3VubWFwKHVwb3J0LT5tZW1iYXNlKTsKKwkJdXBvcnQtPm1lbWJhc2UgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYmRfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcnIgPSBLRVJOX0VSUgorCQkJCSAic2JkOiBVbmFibGUgdG8gcmVzZXJ2ZSBNTUlPIHJlc291cmNlXG4iOworCXN0cnVjdCBzYmRfZHVhcnQgKmR1YXJ0ID0gdG9fc3BvcnQodXBvcnQpLT5kdWFydDsKKwlpbnQgbWFwX2d1YXJkOworCWludCByZXQgPSAwOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIERVQVJUX0NIQU5SRUdfU1BBQ0lORywKKwkJCQkic2IxMjUwLWR1YXJ0IikpIHsKKwkJcHJpbnRrKGVycik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW1hcF9ndWFyZCA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZkdWFydC0+bWFwX2d1YXJkKTsKKwlpZiAobWFwX2d1YXJkID09IDEpIHsKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZHVhcnQtPm1hcGN0cmwsIERVQVJUX0NIQU5SRUdfU1BBQ0lORywKKwkJCQkJInNiMTI1MC1kdWFydCIpKSB7CisJCQlhdG9taWNfYWRkKC0xLCAmZHVhcnQtPm1hcF9ndWFyZCk7CisJCQlwcmludGsoZXJyKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJfQorCX0KKwlpZiAoIXJldCkgeworCQlyZXQgPSBzYmRfbWFwX3BvcnQodXBvcnQpOworCQlpZiAocmV0KSB7CisJCQltYXBfZ3VhcmQgPSBhdG9taWNfYWRkX3JldHVybigtMSwgJmR1YXJ0LT5tYXBfZ3VhcmQpOworCQkJaWYgKCFtYXBfZ3VhcmQpCisJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGR1YXJ0LT5tYXBjdHJsLAorCQkJCQkJICAgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwkJfQorCX0KKwlpZiAocmV0KSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbih1cG9ydC0+bWFwYmFzZSwgRFVBUlRfQ0hBTlJFR19TUEFDSU5HKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwlpZiAoZmxhZ3MgJiBVQVJUX0NPTkZJR19UWVBFKSB7CisJCWlmIChzYmRfcmVxdWVzdF9wb3J0KHVwb3J0KSkKKwkJCXJldHVybjsKKworCQl1cG9ydC0+dHlwZSA9IFBPUlRfU0IxMjUwX0RVQVJUOworCisJCXNiZF9pbml0X3BvcnQoc3BvcnQpOworCX0KK30KKworc3RhdGljIGludCBzYmRfdmVyaWZ5X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc2VyLT50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBzZXItPnR5cGUgIT0gUE9SVF9TQjEyNTBfRFVBUlQpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlci0+aXJxICE9IHVwb3J0LT5pcnEpCisJCXJldCA9IC1FSU5WQUw7CisJaWYgKHNlci0+YmF1ZF9iYXNlICE9IHVwb3J0LT51YXJ0Y2xrIC8gMTYpCisJCXJldCA9IC1FSU5WQUw7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3RydWN0IHVhcnRfb3BzIHNiZF9vcHMgPSB7CisJLnR4X2VtcHR5CT0gc2JkX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwJPSBzYmRfc2V0X21jdHJsLAorCS5nZXRfbWN0cmwJPSBzYmRfZ2V0X21jdHJsLAorCS5zdG9wX3R4CT0gc2JkX3N0b3BfdHgsCisJLnN0YXJ0X3R4CT0gc2JkX3N0YXJ0X3R4LAorCS5zdG9wX3J4CT0gc2JkX3N0b3BfcngsCisJLmVuYWJsZV9tcwk9IHNiZF9lbmFibGVfbXMsCisJLmJyZWFrX2N0bAk9IHNiZF9icmVha19jdGwsCisJLnN0YXJ0dXAJPSBzYmRfc3RhcnR1cCwKKwkuc2h1dGRvd24JPSBzYmRfc2h1dGRvd24sCisJLnNldF90ZXJtaW9zCT0gc2JkX3NldF90ZXJtaW9zLAorCS50eXBlCQk9IHNiZF90eXBlLAorCS5yZWxlYXNlX3BvcnQJPSBzYmRfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQJPSBzYmRfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydAk9IHNiZF9jb25maWdfcG9ydCwKKwkudmVyaWZ5X3BvcnQJPSBzYmRfdmVyaWZ5X3BvcnQsCit9OworCisvKiBJbml0aWFsaXplIFNCMTI1MCBEVUFSVCBwb3J0IHN0cnVjdHVyZXMuICAqLworc3RhdGljIHZvaWQgX19pbml0IHNiZF9wcm9iZV9kdWFydHModm9pZCkKK3sKKwlzdGF0aWMgaW50IHByb2JlZDsKKwlpbnQgY2hpcCwgc2lkZTsKKwlpbnQgbWF4X2xpbmVzLCBsaW5lOworCisJaWYgKHByb2JlZCkKKwkJcmV0dXJuOworCisJLyogU2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHVuaXRzIGJhc2VkIG9uIHRoZSBTT0MgdHlwZS4gICovCisJc3dpdGNoIChzb2NfdHlwZSkgeworCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMXg1NToKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTF4ODA6CisJCW1heF9saW5lcyA9IDQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFzc3VtZSBhdCBsZWFzdCB0d28gc2VyaWFsIHBvcnRzIGF0IHRoZSBub3JtYWwgYWRkcmVzcy4gICovCisJCW1heF9saW5lcyA9IDI7CisJCWJyZWFrOworCX0KKworCXByb2JlZCA9IDE7CisKKwlmb3IgKGNoaXAgPSAwLCBsaW5lID0gMDsgY2hpcCA8IERVQVJUX01BWF9DSElQICYmIGxpbmUgPCBtYXhfbGluZXM7CisJICAgICBjaGlwKyspIHsKKwkJc2JkX2R1YXJ0c1tjaGlwXS5tYXBjdHJsID0gU0JEX0NUUkxSRUdTKGxpbmUpOworCisJCWZvciAoc2lkZSA9IDA7IHNpZGUgPCBEVUFSVF9NQVhfU0lERSAmJiBsaW5lIDwgbWF4X2xpbmVzOworCQkgICAgIHNpZGUrKywgbGluZSsrKSB7CisJCQlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJnNiZF9kdWFydHNbY2hpcF0uc3BvcnRbc2lkZV07CisJCQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCQkJc3BvcnQtPmR1YXJ0CT0gJnNiZF9kdWFydHNbY2hpcF07CisKKwkJCXVwb3J0LT5pcnEJPSBTQkRfSU5UKGxpbmUpOworCQkJdXBvcnQtPnVhcnRjbGsJPSAxMDAwMDAwMDAgLyAyMCAqIDE2OworCQkJdXBvcnQtPmZpZm9zaXplCT0gMTY7CisJCQl1cG9ydC0+aW90eXBlCT0gVVBJT19NRU07CisJCQl1cG9ydC0+ZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORjsKKwkJCXVwb3J0LT5vcHMJPSAmc2JkX29wczsKKwkJCXVwb3J0LT5saW5lCT0gbGluZTsKKwkJCXVwb3J0LT5tYXBiYXNlCT0gU0JEX0NIQU5SRUdTKGxpbmUpOworCQl9CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCisvKgorICogU2VyaWFsIGNvbnNvbGUgc3R1ZmYuICBWZXJ5IGJhc2ljLCBwb2xsaW5nIGRyaXZlciBmb3IgZG9pbmcgc2VyaWFsCisgKiBjb25zb2xlIG91dHB1dC4gIFRoZSBjb25zb2xlX3NlbSBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIsIHNvIHdlCisgKiBzaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQgZm9yIG1vcmUgY29uc29sZSBhY3Rpdml0eS4KKyAqLworc3RhdGljIHZvaWQgc2JkX2NvbnNvbGVfcHV0Y2hhcihzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCwgaW50IGNoKQoreworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSB0b19zcG9ydCh1cG9ydCk7CisKKwlzYmRfdHJhbnNtaXRfZHJhaW4oc3BvcnQpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9UWF9IT0xELCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHNiZF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgY2hpcCA9IGNvLT5pbmRleCAvIERVQVJUX01BWF9TSURFOworCWludCBzaWRlID0gY28tPmluZGV4ICUgRFVBUlRfTUFYX1NJREU7CisJc3RydWN0IHNiZF9wb3J0ICpzcG9ydCA9ICZzYmRfZHVhcnRzW2NoaXBdLnNwb3J0W3NpZGVdOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0IGludGVycnVwdHMgYW5kIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJbWFzayA9IHJlYWRfc2Jkc2hyKHNwb3J0LCBSX0RVQVJUX0lNUlJFRygodXBvcnQtPmxpbmUpICUgMikpOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLAorCQkgICAgIG1hc2sgJiB+TV9EVUFSVF9JTVJfVFgpOworCXdyaXRlX3NiZGNobihzcG9ydCwgUl9EVUFSVF9DTUQsIE1fRFVBUlRfVFhfRU4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisKKwl1YXJ0X2NvbnNvbGVfd3JpdGUoJnNwb3J0LT5wb3J0LCBzLCBjb3VudCwgc2JkX2NvbnNvbGVfcHV0Y2hhcik7CisKKwkvKiBSZXN0b3JlIHRyYW5zbWl0IGludGVycnVwdHMgYW5kIHRoZSB0cmFuc21pdHRlciBlbmFibGUuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVwb3J0LT5sb2NrLCBmbGFncyk7CisJc2JkX2xpbmVfZHJhaW4oc3BvcnQpOworCWlmIChzcG9ydC0+dHhfc3RvcHBlZCkKKwkJd3JpdGVfc2JkY2huKHNwb3J0LCBSX0RVQVJUX0NNRCwgTV9EVUFSVF9UWF9ESVMpOworCXdyaXRlX3NiZHNocihzcG9ydCwgUl9EVUFSVF9JTVJSRUcoKHVwb3J0LT5saW5lKSAlIDIpLCBtYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cG9ydC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzYmRfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGNoaXAgPSBjby0+aW5kZXggLyBEVUFSVF9NQVhfU0lERTsKKwlpbnQgc2lkZSA9IGNvLT5pbmRleCAlIERVQVJUX01BWF9TSURFOworCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmc2JkX2R1YXJ0c1tjaGlwXS5zcG9ydFtzaWRlXTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKwlpbnQgYmF1ZCA9IDExNTIwMDsKKwlpbnQgYml0cyA9IDg7CisJaW50IHBhcml0eSA9ICduJzsKKwlpbnQgZmxvdyA9ICduJzsKKwlpbnQgcmV0OworCisJaWYgKCFzcG9ydC0+ZHVhcnQpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBzYmRfbWFwX3BvcnQodXBvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzYmRfaW5pdF9wb3J0KHNwb3J0KTsKKworCWlmIChvcHRpb25zKQorCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CisJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnModXBvcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOworfQorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHNiZF9yZWc7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2JkX2NvbnNvbGUgPSB7CisJLm5hbWUJPSAiZHVhcnQiLAorCS53cml0ZQk9IHNiZF9jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJPSB1YXJ0X2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAk9IHNiZF9jb25zb2xlX3NldHVwLAorCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiwKKwkuaW5kZXgJPSAtMSwKKwkuZGF0YQk9ICZzYmRfcmVnCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYmRfc2VyaWFsX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXNiZF9wcm9iZV9kdWFydHMoKTsKKwlyZWdpc3Rlcl9jb25zb2xlKCZzYmRfY29uc29sZSk7CisKKwlyZXR1cm4gMDsKK30KKworY29uc29sZV9pbml0Y2FsbChzYmRfc2VyaWFsX2NvbnNvbGVfaW5pdCk7CisKKyNkZWZpbmUgU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCSZzYmRfY29uc29sZQorI2Vsc2UKKyNkZWZpbmUgU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFCU5VTEwKKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX1NCMTI1MF9EVUFSVF9DT05TT0xFICovCisKKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzYmRfcmVnID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAic2VyaWFsIiwKKwkuZGV2X25hbWUJPSAiZHVhcnQiLAorCS5tYWpvcgkJPSBUVFlfTUFKT1IsCisJLm1pbm9yCQk9IFNCMTI1MF9EVUFSVF9NSU5PUl9CQVNFLAorCS5ucgkJPSBEVUFSVF9NQVhfQ0hJUCAqIERVQVJUX01BWF9TSURFLAorCS5jb25zCQk9IFNFUklBTF9TQjEyNTBfRFVBUlRfQ09OU09MRSwKK307CisKKy8qIFNldCB1cCB0aGUgZHJpdmVyIGFuZCByZWdpc3RlciBpdC4gICovCitzdGF0aWMgaW50IF9faW5pdCBzYmRfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisKKwlzYmRfcHJvYmVfZHVhcnRzKCk7CisKKwlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2JkX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBEVUFSVF9NQVhfQ0hJUCAqIERVQVJUX01BWF9TSURFOyBpKyspIHsKKwkJc3RydWN0IHNiZF9kdWFydCAqZHVhcnQgPSAmc2JkX2R1YXJ0c1tpIC8gRFVBUlRfTUFYX1NJREVdOworCQlzdHJ1Y3Qgc2JkX3BvcnQgKnNwb3J0ID0gJmR1YXJ0LT5zcG9ydFtpICUgRFVBUlRfTUFYX1NJREVdOworCQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9ICZzcG9ydC0+cG9ydDsKKworCQlpZiAoc3BvcnQtPmR1YXJ0KQorCQkJdWFydF9hZGRfb25lX3BvcnQoJnNiZF9yZWcsIHVwb3J0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVW5sb2FkIHRoZSBkcml2ZXIuICBVbnJlZ2lzdGVyIHN0dWZmLCBnZXQgcmVhZHkgdG8gZ28gYXdheS4gICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc2JkX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IERVQVJUX01BWF9DSElQICogRFVBUlRfTUFYX1NJREUgLSAxOyBpID49IDA7IGktLSkgeworCQlzdHJ1Y3Qgc2JkX2R1YXJ0ICpkdWFydCA9ICZzYmRfZHVhcnRzW2kgLyBEVUFSVF9NQVhfU0lERV07CisJCXN0cnVjdCBzYmRfcG9ydCAqc3BvcnQgPSAmZHVhcnQtPnNwb3J0W2kgJSBEVUFSVF9NQVhfU0lERV07CisJCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJnNwb3J0LT5wb3J0OworCisJCWlmIChzcG9ydC0+ZHVhcnQpCisJCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2JkX3JlZywgdXBvcnQpOworCX0KKworCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNiZF9yZWcpOworfQorCittb2R1bGVfaW5pdChzYmRfaW5pdCk7Cittb2R1bGVfZXhpdChzYmRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCAzMjYwMjBmLi45YzU3NDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTE5MTAsNiArMTkxMCwxMiBAQAogCWlmIChmbG93ID09ICdyJykKIAkJdGVybWlvcy5jX2NmbGFnIHw9IENSVFNDVFM7CiAKKwkvKgorCSAqIHNvbWUgdWFydHMgb24gb3RoZXIgc2lkZSBkb24ndCBzdXBwb3J0IG5vIGZsb3cgY29udHJvbC4KKwkgKiBTbyB3ZSBzZXQgKiBEVFIgaW4gaG9zdCB1YXJ0IHRvIG1ha2UgdGhlbSBoYXBweQorCSAqLworCXBvcnQtPm1jdHJsIHw9IFRJT0NNX0RUUjsKKwogCXBvcnQtPm9wcy0+c2V0X3Rlcm1pb3MocG9ydCwgJnRlcm1pb3MsIE5VTEwpOwogCWNvLT5jZmxhZyA9IHRlcm1pb3MuY19jZmxhZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwppbmRleCAxZjg5NDk2Li42NzJjZDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuYwpAQCAtMzY3LDcgKzM2Nyw5IEBACiAJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzCiAJCS8qIE5vdGhpbmcgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCiAJCWN0cmxfb3V0dygweDAwODAsIFNDU1BUUjApOyAvKiBTZXQgUlRTID0gMSAqLwogI2Vsc2UKIAkJY3RybF9vdXR3KDB4MDA4MCwgU0NTUFRSMik7IC8qIFNldCBSVFMgPSAxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaCBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCmluZGV4IGZiMDRmYjUuLjI0N2ZiNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oCkBAIC01Myw3ICs1MywxMiBAQAogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpIDB4M2EgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpCiAjIGRlZmluZSBTQ1NQVFIxIDB4ZmZlMDAwMWMgLyogOCAgYml0IFNDSSAqLwogIyBkZWZpbmUgU0NTUFRSMiAweEZGRTgwMDIwIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KQEAgLTczLDcgKzc4LDcgQEAKICMgZGVmaW5lIFNDUERSICAweEE0MDUwMTM2ICAgICAgICAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAgMHgwMDMwIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikgCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikKICMgZGVmaW5lIFNDU1BUUjAgMHhBNDQwMDAwMAkgIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ0lfTlBPUlRTIDIKICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwpAQCAtMTY4LDYgKzE3MywxNCBAQAogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KICMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkJMHgzOCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0xICovCiAjIGRlZmluZSBTQ0lGX09OTFkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCisjIGRlZmluZSBTQ1NQVFIwIDB4ZmZjMzAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIxIDB4ZmZjNDAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIyIDB4ZmZjNTAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIzIDB4ZmZjNjAwMjAJCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxCQkvKiBPdmVycnVuIGVycm9yIGJpdCAqLworIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KQkweDM4CS8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSxSRUlFPTEgKi8KKyMgZGVmaW5lIFNDSUZfT05MWQogI2Vsc2UKICMgZXJyb3IgQ1BVIHN1YnR5cGUgbm90IGRlZmluZWQKICNlbmRpZgpAQCAtMTc3LDEwICsxOTAsMTUgQEAKICNkZWZpbmUgU0NJX0NUUkxfRkxBR1NfUklFICAweDQwIC8qIGFsbCAqLwogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19URSAgIDB4MjAgLyogYWxsICovCiAjZGVmaW5lIFNDSV9DVFJMX0ZMQUdTX1JFICAgMHgxMCAvKiBhbGwgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUykgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRUlFIDB4MDggLyogNzc1MCBTQ0lGICovCiAjZWxzZQogI2RlZmluZSBTQ0lfQ1RSTF9GTEFHU19SRUlFIDAKQEAgLTUxNCw4ICs1MzIsMTIgQEAKIAl9CiB9CiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSB8fCBcCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpICB8fCBcCiAgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQogc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewpAQCAtNjUzLDYgKzY3NSwxOCBAQAogCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMikgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLwogCXJldHVybiAxOwogfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKK3N0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmYzMwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMCkgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZjNDAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIxKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmM1MDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjIpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmYzYwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMykgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworfQogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMgYi9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKaW5kZXggYTI3ZTllOS4uNDFmYzYxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NuX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zbl9jb25zb2xlLmMKQEAgLTc1OSw3ICs3NTksNyBAQAogICovCiAKIHN0YXRpYyB2b2lkIHNuX3NhbF9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQpOwotc3RhdGljIGludCBfX2luaXQgc25fc2FsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgc25fc2FsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKiwgY2hhciAqKTsKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc2FsX2NvbnNvbGVfdWFydDsKIGV4dGVybiBzdHJ1Y3QgdHR5X2RyaXZlciAqdWFydF9jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqLCBpbnQgKik7CiAKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAgKiBoZXJlIHNvIHByb3ZpZGluZyBpdCBpcyBlYXNpZXIuCiAgKgogICovCi1zdGF0aWMgaW50IF9faW5pdCBzbl9zYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IHNuX3NhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCmluZGV4IDk2NTU3ZTYuLmQ4MmJlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3VuaHYuYwpAQCAtMjU4LDE3ICsyNTgsNyBAQAogLyogcG9ydC0+bG9jayBoZWxkIGJ5IGNhbGxlci4gICovCiBzdGF0aWMgdm9pZCBzdW5odl9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OwotCi0Jd2hpbGUgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKLQkJbG9uZyBzdGF0dXMgPSBzdW40dl9jb25fcHV0Y2hhcih4bWl0LT5idWZbeG1pdC0+dGFpbF0pOwotCi0JCWlmIChzdGF0dXMgIT0gSFZfRU9LKQotCQkJYnJlYWs7Ci0KLQkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQkJcG9ydC0+aWNvdW50LnR4Kys7Ci0JfQorCXRyYW5zbWl0X2NoYXJzKHBvcnQpOwogfQogCiAvKiBwb3J0LT5sb2NrIGlzIG5vdCBoZWxkLiAgKi8KQEAgLTQ0MCw4ICs0MzAsMTYgQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gc3VuaHZfcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsb2NrZWQgPSAxOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHBvcnQtPnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcG9ydC0+bG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKIAl3aGlsZSAobiA+IDApIHsKIAkJdW5zaWduZWQgbG9uZyByYSA9IF9fcGEoY29uX3dyaXRlX3BhZ2UpOwogCQl1bnNpZ25lZCBsb25nIHBhZ2VfYnl0ZXM7CkBAIC00NjksNyArNDY3LDEwIEBACiAJCQlyYSArPSB3cml0dGVuOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdW5odl9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgY2hhciBjKQpAQCAtNDg4LDcgKzQ4OSwxNSBAQAogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBzdW5odl9wb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7CisJaW50IGksIGxvY2tlZCA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHBvcnQtPnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmcG9ydC0+bG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKQEAgLTQ5Niw3ICs1MDUsMTAgQEAKIAkJCXN1bmh2X2NvbnNvbGVfcHV0Y2hhcihwb3J0LCAnXHInKTsKIAkJc3VuaHZfY29uc29sZV9wdXRjaGFyKHBvcnQsICpzKyspOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgc3VuaHZfY29uc29sZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggZGViOWFiNC4uOGEwZjllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTg2MCwyMiArODYwLDMxIEBACiBzdGF0aWMgdm9pZCBzdW5zYWJfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjKQogewogCXN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKIAlzdW5zYWJfdGVjX3dhaXQodXApOwogCXdyaXRlYihjLCAmdXAtPnJlZ3MtPncudGljKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc3Vuc2FiX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbiwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgbikKIHsKIAlzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqdXAgPSAmc3Vuc2FiX3BvcnRzW2Nvbi0+aW5kZXhdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxvY2tlZCA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHVwLT5wb3J0LnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUoJnVwLT5wb3J0LCBzLCBuLCBzdW5zYWJfY29uc29sZV9wdXRjaGFyKTsKIAlzdW5zYWJfdGVjX3dhaXQodXApOworCisJaWYgKGxvY2tlZCkKKwkJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzdW5zYWJfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY29uLCBjaGFyICpvcHRpb25zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKaW5kZXggMmE2M2NkYi4uMjZkNzIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCkBAIC0xMjg4LDcgKzEyODgsMTcgQEAKIAkJCQl1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJc3RydWN0IHVhcnRfc3Vuc3VfcG9ydCAqdXAgPSAmc3Vuc3VfcG9ydHNbY28tPmluZGV4XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpZXI7CisJaW50IGxvY2tlZCA9IDE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKHVwLT5wb3J0LnN5c3JxKSB7CisJCWxvY2tlZCA9IDA7CisJfSBlbHNlIGlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmdXAtPnBvcnQubG9jayk7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmdXAtPnBvcnQubG9jayk7CiAKIAkvKgogCSAqCUZpcnN0IHNhdmUgdGhlIFVFUiB0aGVuIGRpc2FibGUgdGhlIGludGVycnVwdHMKQEAgLTEzMDQsNiArMTMxNCwxMCBAQAogCSAqLwogCXdhaXRfZm9yX3htaXRyKHVwKTsKIAlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgaWVyKTsKKworCWlmIChsb2NrZWQpCisJCXNwaW5fdW5sb2NrKCZ1cC0+cG9ydC5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwppbmRleCAxNWI2ZTFjLi4wYTNlMTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKQEAgLTksNyArOSw3IEBACiAgKiBDLiBEb3N0LCBQZXRlIFphaXRjZXYsIFRlZCBUcydvIGFuZCBBbGV4IEJ1ZWxsIGZvciB0aGVpcgogICogd29yayB0aGVyZS4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNiwgMjAwNyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTE1MSwxMSArMTE1MSwyMiBAQAogewogCXN0cnVjdCB1YXJ0X3N1bnppbG9nX3BvcnQgKnVwID0gJnN1bnppbG9nX3BvcnRfdGFibGVbY29uLT5pbmRleF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbG9ja2VkID0gMTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICh1cC0+cG9ydC5zeXNycSkgeworCQlsb2NrZWQgPSAwOworCX0gZWxzZSBpZiAob29wc19pbl9wcm9ncmVzcykgeworCQlsb2NrZWQgPSBzcGluX3RyeWxvY2soJnVwLT5wb3J0LmxvY2spOworCX0gZWxzZQorCQlzcGluX2xvY2soJnVwLT5wb3J0LmxvY2spOworCiAJdWFydF9jb25zb2xlX3dyaXRlKCZ1cC0+cG9ydCwgcywgY291bnQsIHN1bnppbG9nX3B1dGNoYXIpOwogCXVkZWxheSgyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlpZiAobG9ja2VkKQorCQlzcGluX3VubG9jaygmdXAtPnBvcnQubG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzdW56aWxvZ19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjb24sIGNoYXIgKm9wdGlvbnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9LY29uZmlnIGIvZHJpdmVycy9zcGkvS2NvbmZpZwppbmRleCA1ZTNmNzQ4Li5iOTE1NzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTEwNyw2ICsxMDcsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgRnJlZXNjYWxlIGlNWCBTUEkgY29udHJvbGxlciBpbiBtYXN0ZXIKIAkgIG1vZGUuCiAKK2NvbmZpZyBTUElfTE03MF9MTFAKKwl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIGZvciBMTTcwIGV2YWwgYm9hcmQgKERFVkVMT1BNRU5UKSIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTlMgTE03MCBMTFAgRXZhbHVhdGlvbiBCb2FyZCwKKwkgIHdoaWNoIGludGVyZmFjZXMgdG8gYW4gTE03MCB0ZW1wZXJhdHVyZSBzZW5zb3IgdXNpbmcKKwkgIGEgcGFyYWxsZWwgcG9ydC4KKwogY29uZmlnIFNQSV9NUEM1Mnh4X1BTQwogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTJ4eCBQU0MgU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFBQQ19NUEM1Mnh4ICYmIEVYUEVSSU1FTlRBTApAQCAtMTMzLDYgKzE0MiwxMiBAQAogCWhlbHAKIAkgIFRoaXMgaG9va3MgdXAgdG8gdGhlIE1pY3JvV2lyZSBjb250cm9sbGVyIG9uIE9NQVAxIGNoaXBzLgogCitjb25maWcgU1BJX09NQVAyNFhYCisJdHJpc3RhdGUgIk1jU1BJIGRyaXZlciBmb3IgT01BUDI0eHgiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEFSQ0hfT01BUDI0WFgKKwloZWxwCisJICBTUEkgbWFzdGVyIGNvbnRyb2xsZXIgZm9yIE9NQVAyNHh4IE11bHRpY2hhbm5lbCBTUEkKKwkgIChNY1NQSSkgbW9kdWxlcy4KIAogY29uZmlnIFNQSV9QWEEyWFgKIAl0cmlzdGF0ZSAiUFhBMnh4IFNTUCBTUEkgbWFzdGVyIgpAQCAtMTQ1LDE3ICsxNjAsMzYgQEAKIGNvbmZpZyBTUElfUzNDMjRYWAogCXRyaXN0YXRlICJTYW1zdW5nIFMzQzI0WFggc2VyaWVzIFNQSSIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgQVJDSF9TM0MyNDEwICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTUElfQklUQkFORwogCWhlbHAKIAkgIFNQSSBkcml2ZXIgZm9yIFNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgQVJNIFNvQ3MKIAogY29uZmlnIFNQSV9TM0MyNFhYX0dQSU8KIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBTUEkgYnkgR1BJTyIKLQlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgQVJDSF9TM0MyNDEwICYmIFNQSV9CSVRCQU5HICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBBUkNIX1MzQzI0MTAgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgU2Ftc3VuZyBTM0MyNFhYIHNlcmllcyBBUk0gU29DcyB1c2luZwogCSAgR1BJTyBsaW5lcyB0byBwcm92aWRlIHRoZSBTUEkgYnVzLiBUaGlzIGNhbiBiZSB1c2VkIHdoZXJlCiAJICB0aGUgaW5idWlsdCBoYXJkd2FyZSBjYW5ub3QgcHJvdmlkZSB0aGUgdHJhbnNmZXIgbW9kZSwgb3IKIAkgIHdoZXJlIHRoZSBib2FyZCBpcyB1c2luZyBub24gaGFyZHdhcmUgY29ubmVjdGVkIHBpbnMuCisKK2NvbmZpZyBTUElfVFhYOQorCXRyaXN0YXRlICJUb3NoaWJhIFRYeDkgU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEdFTkVSSUNfR1BJTyAmJiBDUFVfVFg0OVhYCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgVG9zaGliYSBUWHg5IE1JUFMgU29DcworCitjb25maWcgU1BJX1hJTElOWAorCXRyaXN0YXRlICJYaWxpbnggU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFhJTElOWF9WSVJURVggJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFNQSV9CSVRCQU5HCisJaGVscAorCSAgVGhpcyBleHBvc2VzIHRoZSBTUEkgY29udHJvbGxlciBJUCBmcm9tIHRoZSBYaWxpbnggRURLLgorCisJICBTZWUgdGhlICJPUEIgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpICh2MS4wMGUpIgorCSAgUHJvZHVjdCBTcGVjaWZpY2F0aW9uIGRvY3VtZW50IChEUzQ2NCkgZm9yIGhhcmR3YXJlIGRldGFpbHMuCisKICMKICMgQWRkIG5ldyBTUEkgbWFzdGVyIGNvbnRyb2xsZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlciBhYm92ZSB0aGlzIGxpbmUKICMKQEAgLTE4Nyw2ICsyMjEsMTUgQEAKIAkgIE5vdGUgdGhhdCB0aGlzIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBFWFBFUklNRU5UQUwKIAkgIGFuZCBoZW5jZSBTVUJKRUNUIFRPIENIQU5HRSBXSVRIT1VUIE5PVElDRSB3aGlsZSBpdCBzdGFiaWxpemVzLgogCitjb25maWcgU1BJX1RMRTYyWDAKKwl0cmlzdGF0ZSAiSW5maW5lb24gVExFNjJYMCAoZm9yIHBvd2VyIHN3aXRjaGluZykiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFNZU0ZTCisJaGVscAorCSAgU1BJIGRyaXZlciBmb3IgSW5maW5lb24gVExFNjJYMCBzZXJpZXMgbGluZSBkcml2ZXIgY2hpcHMsCisJICBzdWNoIGFzIHRoZSBUTEU2MjIwLCBUTEU2MjMwIGFuZCBUTEU2MjQwLiAgVGhpcyBwcm92aWRlcyBhCisJICBzeXNmcyBpbnRlcmZhY2UsIHdpdGggZWFjaCBsaW5lIHByZXNlbnRlZCBhcyBhIGtpbmQgb2YgR1BJTworCSAgZXhwb3NpbmcgYm90aCBzd2l0Y2ggY29udHJvbCBhbmQgZGlhZ25vc3RpYyBmZWVkYmFjay4KKwogIwogIyBBZGQgbmV3IFNQSSBwcm90b2NvbCBtYXN0ZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlciBhYm92ZSB0aGlzIGxpbmUKICMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL01ha2VmaWxlIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKaW5kZXggNTc4OGQ4Ni4uNDFmYmFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTE3LDE3ICsxNywyMiBAQAogb2JqLSQoQ09ORklHX1NQSV9BVTE1NTApCQkrPSBhdTE1NTBfc3BpLm8KIG9iai0kKENPTkZJR19TUElfQlVUVEVSRkxZKQkJKz0gc3BpX2J1dHRlcmZseS5vCiBvYmotJChDT05GSUdfU1BJX0lNWCkJCQkrPSBzcGlfaW14Lm8KK29iai0kKENPTkZJR19TUElfTE03MF9MTFApCQkrPSBzcGlfbG03MGxscC5vCiBvYmotJChDT05GSUdfU1BJX1BYQTJYWCkJCSs9IHB4YTJ4eF9zcGkubwogb2JqLSQoQ09ORklHX1NQSV9PTUFQX1VXSVJFKQkJKz0gb21hcF91d2lyZS5vCitvYmotJChDT05GSUdfU1BJX09NQVAyNFhYKQkJKz0gb21hcDJfbWNzcGkubwogb2JqLSQoQ09ORklHX1NQSV9NUEM1Mnh4X1BTQykJCSs9IG1wYzUyeHhfcHNjX3NwaS5vCiBvYmotJChDT05GSUdfU1BJX01QQzgzeHgpCQkrPSBzcGlfbXBjODN4eC5vCiBvYmotJChDT05GSUdfU1BJX1MzQzI0WFhfR1BJTykJCSs9IHNwaV9zM2MyNHh4X2dwaW8ubwogb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYKQkJKz0gc3BpX3MzYzI0eHgubworb2JqLSQoQ09ORklHX1NQSV9UWFg5KQkJCSs9IHNwaV90eHg5Lm8KK29iai0kKENPTkZJR19TUElfWElMSU5YKQkJKz0geGlsaW54X3NwaS5vCiAjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KIAogIyBTUEkgcHJvdG9jb2wgZHJpdmVycyAoZGV2aWNlL2xpbmsgb24gYnVzKQogb2JqLSQoQ09ORklHX1NQSV9BVDI1KQkJKz0gYXQyNS5vCiBvYmotJChDT05GSUdfU1BJX1NQSURFVikJKz0gc3BpZGV2Lm8KK29iai0kKENPTkZJR19TUElfVExFNjJYMCkJKz0gdGxlNjJ4MC5vCiAjIAkuLi4gYWRkIGFib3ZlIHRoaXMgbGluZSAuLi4KIAogIyBTUEkgc2xhdmUgY29udHJvbGxlciBkcml2ZXJzICh1cHN0cmVhbSBsaW5rKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYXRtZWxfc3BpLmMgYi9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYwppbmRleCA4YjI2MDFkLi5hZDE0NDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9hdG1lbF9zcGkuYwpAQCAtNDYsNiArNDYsNyBAQAogCXN0cnVjdCBjbGsJCSpjbGs7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAl1bnNpZ25lZAkJbmV3XzE6MTsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3RheTsKIAogCXU4CQkJc3RvcHBpbmc7CiAJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKQEAgLTYyLDI5ICs2Myw2MiBAQAogLyoKICAqIEVhcmxpZXIgU1BJIGNvbnRyb2xsZXJzIChlLmcuIG9uIGF0OTFybTkyMDApIGhhdmUgYSBkZXNpZ24gYnVnIHdoZXJlYnkKICAqIHRoZXkgYXNzdW1lIHRoYXQgc3BpIHNsYXZlIGRldmljZSBzdGF0ZSB3aWxsIG5vdCBjaGFuZ2Ugb24gZGVzZWxlY3QsIHNvCi0gKiB0aGF0IGF1dG9tYWdpYyBkZXNlbGVjdGlvbiBpcyBPSy4gIE5vdCBzbyEgIFdvcmthcm91bmQgdXNlcyBuQ1N4IHBpbnMKLSAqIGFzIEdQSU9zOyBvciBuZXdlciBjb250cm9sbGVycyBoYXZlIENTQUFUIGFuZCBmcmllbmRzLgorICogdGhhdCBhdXRvbWFnaWMgZGVzZWxlY3Rpb24gaXMgT0suICAoIk5QQ1N4IHJpc2VzIGlmIG5vIGRhdGEgaXMgdG8gYmUKKyAqIHRyYW5zbWl0dGVkIikgIE5vdCBzbyEgIFdvcmthcm91bmQgdXNlcyBuQ1N4IHBpbnMgYXMgR1BJT3M7IG9yIG5ld2VyCisgKiBjb250cm9sbGVycyBoYXZlIENTQUFUIGFuZCBmcmllbmRzLgogICoKLSAqIFNpbmNlIHRoZSBDU0FBVCBmdW5jdGlvbmFsaXR5IGlzIGEgYml0IHdlaXJkIG9uIG5ld2VyIGNvbnRyb2xsZXJzCi0gKiBhcyB3ZWxsLCB3ZSB1c2UgR1BJTyB0byBjb250cm9sIG5DU3ggcGlucyBvbiBhbGwgY29udHJvbGxlcnMuCisgKiBTaW5jZSB0aGUgQ1NBQVQgZnVuY3Rpb25hbGl0eSBpcyBhIGJpdCB3ZWlyZCBvbiBuZXdlciBjb250cm9sbGVycyBhcworICogd2VsbCwgd2UgdXNlIEdQSU8gdG8gY29udHJvbCBuQ1N4IHBpbnMgb24gYWxsIGNvbnRyb2xsZXJzLCB1cGRhdGluZworICogTVIuUENTIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgY29udHJvbGxlci4gIFVzaW5nIEdQSU9zIGFsc28gbGV0cyB1cworICogc3VwcG9ydCBhY3RpdmUtaGlnaCBjaGlwc2VsZWN0cyBkZXNwaXRlIHRoZSBjb250cm9sbGVyJ3MgYmVsaWVmIHRoYXQKKyAqIG9ubHkgYWN0aXZlLWxvdyBkZXZpY2VzL3N5c3RlbXMgZXhpc3RzLgorICoKKyAqIEhvd2V2ZXIsIGF0OTFybTkyMDAgaGFzIGEgc2Vjb25kIGVycmF0dW0gd2hlcmVieSBuQ1MwIGRvZXNuJ3Qgd29yaworICogcmlnaHQgd2hlbiBkcml2ZW4gd2l0aCBHUElPLiAgKCJNb2RlIEZhdWx0IGRvZXMgbm90IGFsbG93IG1vcmUgdGhhbiBvbmUKKyAqIE1hc3RlciBvbiBDaGlwIFNlbGVjdCAwLiIpICBObyB3b3JrYXJvdW5kIGV4aXN0cyBmb3IgdGhhdCAuLi4gc28gZm9yCisgKiBuQ1MwIG9uIHRoYXQgY2hpcCwgd2UgKGEpIGRvbid0IHVzZSB0aGUgR1BJTywgKGIpIGNhbid0IHN1cHBvcnQgQ1NfSElHSCwKKyAqIGFuZCAoYykgd2lsbCB0cmlnZ2VyIHRoYXQgZmlyc3QgZXJyYXR1bSBpbiBzb21lIGNhc2VzLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjc19hY3RpdmF0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIHZvaWQgY3NfYWN0aXZhdGUoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJdW5zaWduZWQgZ3BpbyA9ICh1bnNpZ25lZCkgc3BpLT5jb250cm9sbGVyX2RhdGE7CiAJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CisJdTMyIG1yOwogCi0JZGV2X2RiZygmc3BpLT5kZXYsICJhY3RpdmF0ZSAldSVzXG4iLCBncGlvLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIik7Ci0JZ3Bpb19zZXRfdmFsdWUoZ3BpbywgYWN0aXZlKTsKKwltciA9IHNwaV9yZWFkbChhcywgTVIpOworCW1yID0gU1BJX0JGSU5TKFBDUywgfigxIDw8IHNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgImFjdGl2YXRlICV1JXMsIG1yICUwOHhcbiIsCisJCQlncGlvLCBhY3RpdmUgPyAiIChoaWdoKSIgOiAiIiwKKwkJCW1yKTsKKworCWlmICghKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwKSkKKwkJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgYWN0aXZlKTsKKwlzcGlfd3JpdGVsKGFzLCBNUiwgbXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3NfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIHZvaWQgY3NfZGVhY3RpdmF0ZShzdHJ1Y3QgYXRtZWxfc3BpICphcywgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAl1bnNpZ25lZCBncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKIAl1bnNpZ25lZCBhY3RpdmUgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKwl1MzIgbXI7CiAKLQlkZXZfZGJnKCZzcGktPmRldiwgIkRFYWN0aXZhdGUgJXUlc1xuIiwgZ3BpbywgYWN0aXZlID8gIiAobG93KSIgOiAiIik7Ci0JZ3Bpb19zZXRfdmFsdWUoZ3BpbywgIWFjdGl2ZSk7CisJLyogb25seSBkZWFjdGl2YXRlICp0aGlzKiBkZXZpY2U7IHNvbWV0aW1lcyB0cmFuc2ZlcnMgdG8KKwkgKiBhbm90aGVyIGRldmljZSBtYXkgYmUgYWN0aXZlIHdoZW4gdGhpcyByb3V0aW5lIGlzIGNhbGxlZC4KKwkgKi8KKwltciA9IHNwaV9yZWFkbChhcywgTVIpOworCWlmICh+U1BJX0JGRVhUKFBDUywgbXIpICYgKDEgPDwgc3BpLT5jaGlwX3NlbGVjdCkpIHsKKwkJbXIgPSBTUElfQkZJTlMoUENTLCAweGYsIG1yKTsKKwkJc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKKwl9CisKKwlkZXZfZGJnKCZzcGktPmRldiwgIkRFYWN0aXZhdGUgJXUlcywgbXIgJTA4eFxuIiwKKwkJCWdwaW8sIGFjdGl2ZSA/ICIgKGxvdykiIDogIiIsCisJCQltcik7CisKKwlpZiAoIShjcHVfaXNfYXQ5MXJtOTIwMCgpICYmIHNwaS0+Y2hpcF9zZWxlY3QgPT0gMCkpCisJCWdwaW9fc2V0X3ZhbHVlKGdwaW8sICFhY3RpdmUpOwogfQogCiAvKgpAQCAtMTQwLDYgKzE3NCw3IEBACiAKIAkvKiBSRVZJU0lUOiB3aGVuIHhmZXItPmRlbGF5X3VzZWNzID09IDAsIHRoZSBQREMgIm5leHQgdHJhbnNmZXIiCiAJICogbWVjaGFuaXNtIG1pZ2h0IGhlbHAgYXZvaWQgdGhlIElSUSBsYXRlbmN5IGJldHdlZW4gdHJhbnNmZXJzCisJICogKGFuZCBpbXByb3ZlIHRoZSBuQ1MwIGVycmF0YSBoYW5kbGluZyBvbiBhdDkxcm05MjAwIGNoaXBzKQogCSAqCiAJICogV2UncmUgYWxzbyB3YWl0aW5nIGZvciBFTkRSWCBiZWZvcmUgd2Ugc3RhcnQgdGhlIG5leHQKIAkgKiB0cmFuc2ZlciBiZWNhdXNlIHdlIG5lZWQgdG8gaGFuZGxlIHNvbWUgZGlmZmljdWx0IHRpbWluZwpAQCAtMTY5LDMzICsyMDQsNjIgQEAKIHsKIAlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKm1zZzsKLQl1MzIJCQltcjsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpOwogCiAJQlVHX09OKGFzLT5jdXJyZW50X3RyYW5zZmVyKTsKIAogCW1zZyA9IGxpc3RfZW50cnkoYXMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCXNwaSA9IG1zZy0+c3BpOwogCi0JLyogU2VsZWN0IHRoZSBjaGlwICovCi0JbXIgPSBzcGlfcmVhZGwoYXMsIE1SKTsKLQltciA9IFNQSV9CRklOUyhQQ1MsIH4oMSA8PCBtc2ctPnNwaS0+Y2hpcF9zZWxlY3QpLCBtcik7Ci0Jc3BpX3dyaXRlbChhcywgTVIsIG1yKTsKLQljc19hY3RpdmF0ZShtc2ctPnNwaSk7CisJZGV2X2RiZyhtYXN0ZXItPmNkZXYuZGV2LCAic3RhcnQgbWVzc2FnZSAlcCBmb3IgJXNcbiIsCisJCQltc2csIHNwaS0+ZGV2LmJ1c19pZCk7CisKKwkvKiBzZWxlY3QgY2hpcCBpZiBpdCdzIG5vdCBzdGlsbCBhY3RpdmUgKi8KKwlpZiAoYXMtPnN0YXkpIHsKKwkJaWYgKGFzLT5zdGF5ICE9IHNwaSkgeworCQkJY3NfZGVhY3RpdmF0ZShhcywgYXMtPnN0YXkpOworCQkJY3NfYWN0aXZhdGUoYXMsIHNwaSk7CisJCX0KKwkJYXMtPnN0YXkgPSBOVUxMOworCX0gZWxzZQorCQljc19hY3RpdmF0ZShhcywgc3BpKTsKIAogCWF0bWVsX3NwaV9uZXh0X3hmZXIobWFzdGVyLCBtc2cpOwogfQogCi1zdGF0aWMgdm9pZAorLyoKKyAqIEZvciBETUEsIHR4X2J1Zi90eF9kbWEgaGF2ZSB0aGUgc2FtZSByZWxhdGlvbnNoaXAgYXMgcnhfYnVmL3J4X2RtYToKKyAqICAtIFRoZSBidWZmZXIgaXMgZWl0aGVyIHZhbGlkIGZvciBDUFUgYWNjZXNzLCBlbHNlIE5VTEwKKyAqICAtIElmIHRoZSBidWZmZXIgaXMgdmFsaWQsIHNvIGlzIGl0cyBETUEgYWRkcmVzc3MKKyAqCisgKiBUaGlzIGRyaXZlciBtYW5hZ2VzIHRoZSBkbWEgYWRkcmVzc3MgdW5sZXNzIG1lc3NhZ2UtPmlzX2RtYV9tYXBwZWQuCisgKi8KK3N0YXRpYyBpbnQKIGF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoc3RydWN0IGF0bWVsX3NwaSAqYXMsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7CisJc3RydWN0IGRldmljZQkqZGV2ID0gJmFzLT5wZGV2LT5kZXY7CisKIAl4ZmVyLT50eF9kbWEgPSB4ZmVyLT5yeF9kbWEgPSBJTlZBTElEX0RNQV9BRERSRVNTOwotCWlmICh4ZmVyLT50eF9idWYpCi0JCXhmZXItPnR4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZhcy0+cGRldi0+ZGV2LAorCWlmICh4ZmVyLT50eF9idWYpIHsKKwkJeGZlci0+dHhfZG1hID0gZG1hX21hcF9zaW5nbGUoZGV2LAogCQkJCSh2b2lkICopIHhmZXItPnR4X2J1ZiwgeGZlci0+bGVuLAogCQkJCURNQV9UT19ERVZJQ0UpOwotCWlmICh4ZmVyLT5yeF9idWYpCi0JCXhmZXItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZhcy0+cGRldi0+ZGV2LAorCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoeGZlci0+dHhfZG1hKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoeGZlci0+cnhfYnVmKSB7CisJCXhmZXItPnJ4X2RtYSA9IGRtYV9tYXBfc2luZ2xlKGRldiwKIAkJCQl4ZmVyLT5yeF9idWYsIHhmZXItPmxlbiwKIAkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoeGZlci0+dHhfZG1hKSkgeworCQkJaWYgKHhmZXItPnR4X2J1ZikKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwKKwkJCQkJCXhmZXItPnR4X2RtYSwgeGZlci0+bGVuLAorCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYXRtZWxfc3BpX2RtYV91bm1hcF94ZmVyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCkBAIC0yMTEsOSArMjc1LDEzIEBACiAKIHN0YXRpYyB2b2lkCiBhdG1lbF9zcGlfbXNnX2RvbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IGF0bWVsX3NwaSAqYXMsCi0JCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLCBpbnQgc3RhdHVzKQorCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZywgaW50IHN0YXR1cywgaW50IHN0YXkpCiB7Ci0JY3NfZGVhY3RpdmF0ZShtc2ctPnNwaSk7CisJaWYgKCFzdGF5IHx8IHN0YXR1cyA8IDApCisJCWNzX2RlYWN0aXZhdGUoYXMsIG1zZy0+c3BpKTsKKwllbHNlCisJCWFzLT5zdGF5ID0gbXNnLT5zcGk7CisKIAlsaXN0X2RlbCgmbXNnLT5xdWV1ZSk7CiAJbXNnLT5zdGF0dXMgPSBzdGF0dXM7CiAKQEAgLTMwMyw3ICszNzEsNyBAQAogCQkvKiBDbGVhciBhbnkgb3ZlcnJ1biBoYXBwZW5pbmcgd2hpbGUgY2xlYW5pbmcgdXAgKi8KIAkJc3BpX3JlYWRsKGFzLCBTUik7CiAKLQkJYXRtZWxfc3BpX21zZ19kb25lKG1hc3RlciwgYXMsIG1zZywgLUVJTyk7CisJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIC1FSU8sIDApOwogCX0gZWxzZSBpZiAocGVuZGluZyAmIFNQSV9CSVQoRU5EUlgpKSB7CiAJCXJldCA9IElSUV9IQU5ETEVEOwogCkBAIC0zMjEsMTIgKzM4OSwxMyBAQAogCiAJCQlpZiAobXNnLT50cmFuc2ZlcnMucHJldiA9PSAmeGZlci0+dHJhbnNmZXJfbGlzdCkgewogCQkJCS8qIHJlcG9ydCBjb21wbGV0ZWQgbWVzc2FnZSAqLwotCQkJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIDApOworCQkJCWF0bWVsX3NwaV9tc2dfZG9uZShtYXN0ZXIsIGFzLCBtc2csIDAsCisJCQkJCQl4ZmVyLT5jc19jaGFuZ2UpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoeGZlci0+Y3NfY2hhbmdlKSB7Ci0JCQkJCWNzX2RlYWN0aXZhdGUobXNnLT5zcGkpOworCQkJCQljc19kZWFjdGl2YXRlKGFzLCBtc2ctPnNwaSk7CiAJCQkJCXVkZWxheSgxKTsKLQkJCQkJY3NfYWN0aXZhdGUobXNnLT5zcGkpOworCQkJCQljc19hY3RpdmF0ZShhcywgbXNnLT5zcGkpOwogCQkJCX0KIAogCQkJCS8qCkBAIC0zNTAsNiArNDE5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KICNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKIAogc3RhdGljIGludCBhdG1lbF9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKQEAgLTM4OCw2ICs0NTgsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogc2VlIG5vdGVzIGFib3ZlIHJlIGNoaXBzZWxlY3QgKi8KKwlpZiAoY3B1X2lzX2F0OTFybTkyMDAoKQorCQkJJiYgc3BpLT5jaGlwX3NlbGVjdCA9PSAwCisJCQkmJiAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IGNhbid0IGJlIGFjdGl2ZS1oaWdoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogc3BlZWQgemVybyBjb252ZW50aW9uIGlzIHVzZWQgYnkgc29tZSB1cHBlciBsYXllcnMgKi8KIAlidXNfaHogPSBjbGtfZ2V0X3JhdGUoYXMtPmNsayk7CiAJaWYgKHNwaS0+bWF4X3NwZWVkX2h6KSB7CkBAIC0zOTcsOCArNDc1LDkgQEAKIAkJc2NiciA9ICgoYnVzX2h6ICsgc3BpLT5tYXhfc3BlZWRfaHogLSAxKQogCQkJLyBzcGktPm1heF9zcGVlZF9oeik7CiAJCWlmIChzY2JyID49ICgxIDw8IFNQSV9TQ0JSX1NJWkUpKSB7Ci0JCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiAlZCBIeiB0b28gc2xvdywgc2NiciAldVxuIiwKLQkJCQkJc3BpLT5tYXhfc3BlZWRfaHosIHNjYnIpOworCQkJZGV2X2RiZygmc3BpLT5kZXYsCisJCQkJInNldHVwOiAlZCBIeiB0b28gc2xvdywgc2NiciAldTsgbWluICVsZCBIelxuIiwKKwkJCQlzcGktPm1heF9zcGVlZF9oeiwgc2NiciwgYnVzX2h6LzI1NSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0gZWxzZQpAQCAtNDIzLDYgKzUwMiwxNCBAQAogCQkJcmV0dXJuIHJldDsKIAkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gKHZvaWQgKilucGNzX3BpbjsKIAkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KG5wY3NfcGluLCAhKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFzLT5sb2NrLCBmbGFncyk7CisJCWlmIChhcy0+c3RheSA9PSBzcGkpCisJCQlhcy0+c3RheSA9IE5VTEw7CisJCWNzX2RlYWN0aXZhdGUoYXMsIHNwaSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzLT5sb2NrLCBmbGFncyk7CiAJfQogCiAJZGV2X2RiZygmc3BpLT5kZXYsCkBAIC00NjQsMTQgKzU1MSwyMiBAQAogCQkJZGV2X2RiZygmc3BpLT5kZXYsICJubyBwcm90b2NvbCBvcHRpb25zIHlldFxuIik7CiAJCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCQl9CisKKwkJLyoKKwkJICogRE1BIG1hcCBlYXJseSwgZm9yIHBlcmZvcm1hbmNlIChlbXB0aWVzIGRjYWNoZSBBU0FQKSBhbmQKKwkJICogYmV0dGVyIGZhdWx0IHJlcG9ydGluZy4gIFRoaXMgaXMgYSBETUEtb25seSBkcml2ZXIuCisJCSAqCisJCSAqIE5PVEUgdGhhdCBpZiBkbWFfdW5tYXBfc2luZ2xlKCkgZXZlciBzdGFydHMgdG8gZG8gd29yayBvbgorCQkgKiBwbGF0Zm9ybXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCB3ZSB3b3VsZCBuZWVkIHRvIGNsZWFuCisJCSAqIHVwIG1hcHBpbmdzIGZvciBwcmV2aW91c2x5LW1hcHBlZCB0cmFuc2ZlcnMuCisJCSAqLworCQlpZiAoIW1zZy0+aXNfZG1hX21hcHBlZCkgeworCQkJaWYgKGF0bWVsX3NwaV9kbWFfbWFwX3hmZXIoYXMsIHhmZXIpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCX0KIAotCS8qIHNjcnViIGRjYWNoZSAiZWFybHkiICovCi0JaWYgKCFtc2ctPmlzX2RtYV9tYXBwZWQpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpCi0JCQlhdG1lbF9zcGlfZG1hX21hcF94ZmVyKGFzLCB4ZmVyKTsKLQl9Ci0KKyNpZmRlZiBWRVJCT1NFCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh4ZmVyLCAmbXNnLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKIAkJZGV2X2RiZyhjb250cm9sbGVyLAogCQkJIiAgeGZlciAlcDogbGVuICV1IHR4ICVwLyUwOHggcnggJXAvJTA4eFxuIiwKQEAgLTQ3OSw2ICs1NzQsNyBAQAogCQkJeGZlci0+dHhfYnVmLCB4ZmVyLT50eF9kbWEsCiAJCQl4ZmVyLT5yeF9idWYsIHhmZXItPnJ4X2RtYSk7CiAJfQorI2VuZGlmCiAKIAltc2ctPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKIAltc2ctPmFjdHVhbF9sZW5ndGggPSAwOwpAQCAtNDk0LDggKzU5MCwyMSBAQAogCiBzdGF0aWMgdm9pZCBhdG1lbF9zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWlmIChzcGktPmNvbnRyb2xsZXJfc3RhdGUpCi0JCWdwaW9fZnJlZSgodW5zaWduZWQgaW50KXNwaS0+Y29udHJvbGxlcl9kYXRhKTsKKwlzdHJ1Y3QgYXRtZWxfc3BpCSphcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXVuc2lnbmVkCQlncGlvID0gKHVuc2lnbmVkKSBzcGktPmNvbnRyb2xsZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKworCWlmICghc3BpLT5jb250cm9sbGVyX3N0YXRlKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoYXMtPnN0YXkgPT0gc3BpKSB7CisJCWFzLT5zdGF5ID0gTlVMTDsKKwkJY3NfZGVhY3RpdmF0ZShhcywgc3BpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXMtPmxvY2ssIGZsYWdzKTsKKworCWdwaW9fZnJlZShncGlvKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUzNiw2ICs2NDUsMTAgQEAKIAogCWFzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCisJLyoKKwkgKiBTY3JhdGNoIGJ1ZmZlciBpcyB1c2VkIGZvciB0aHJvd2F3YXkgcnggYW5kIHR4IGRhdGEuCisJICogSXQncyBjb2hlcmVudCB0byBtaW5pbWl6ZSBkY2FjaGUgcG9sbHV0aW9uLgorCSAqLwogCWFzLT5idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgQlVGRkVSX1NJWkUsCiAJCQkJCSZhcy0+YnVmZmVyX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcy0+YnVmZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jIGIvZHJpdmVycy9zcGkvYXUxNTUwX3NwaS5jCmluZGV4IGFlMmIxYWYuLmM0N2E2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL2F1MTU1MF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9hdTE1NTBfc3BpLmMKQEAgLTI4MCw2ICsyODAsOSBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCB8IFNQSV9MU0JfRklSU1QpCisKIHN0YXRpYyBpbnQgYXUxNTUwX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBhdTE1NTBfc3BpICpodyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtMjkyLDYgKzI5NSwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChzcGktPm1heF9zcGVlZF9oeiA9PSAwKQogCQlzcGktPm1heF9zcGVlZF9oeiA9IGh3LT5mcmVxX21heDsKIAlpZiAoc3BpLT5tYXhfc3BlZWRfaHogPiBody0+ZnJlcV9tYXgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKaW5kZXggMTFmMzZiZS4uZDJhNGIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKQEAgLTI3MCw2ICsyNzAsOSBAQAogCXNwaW5fdW5sb2NrX2lycSgmbXBzLT5sb2NrKTsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTFNCX0ZJUlNUKQorCiBzdGF0aWMgaW50IG1wYzUyeHhfcHNjX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKm1wcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwpAQCAtMjc5LDYgKzI4MiwxMiBAQAogCWlmIChzcGktPmJpdHNfcGVyX3dvcmQlOCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICghY3MpIHsKIAkJY3MgPSBremFsbG9jKHNpemVvZiAqY3MsIEdGUF9LRVJORUwpOwogCQlpZiAoIWNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvb21hcDJfbWNzcGkuYyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNTdjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL29tYXAyX21jc3BpLmMKQEAgLTAsMCArMSwxMDgxIEBACisvKgorICogT01BUDIgTWNTUEkgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjoJU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPiBhbmQKKyAqCQlKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrLmg+CisKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9NQVhfRlJFUQkJNDgwMDAwMDAKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9SRVZJU0lPTgkJMHgwMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNDT05GSUcJCTB4MTAKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTU1RBVFVTCQkweDE0CisjZGVmaW5lIE9NQVAyX01DU1BJX0lSUVNUQVRVUwkJMHgxOAorI2RlZmluZSBPTUFQMl9NQ1NQSV9JUlFFTkFCTEUJCTB4MWMKKyNkZWZpbmUgT01BUDJfTUNTUElfV0FLRVVQRU5BQkxFCTB4MjAKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTVAkJMHgyNAorI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkwJCTB4MjgKKworLyogcGVyLWNoYW5uZWwgYmFua3MsIDB4MTQgYnl0ZXMgZWFjaCwgZmlyc3QgaXM6ICovCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORjAJCTB4MmMKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hTVEFUMAkJMHgzMAorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENUUkwwCQkweDM0CisjZGVmaW5lIE9NQVAyX01DU1BJX1RYMAkJCTB4MzgKKyNkZWZpbmUgT01BUDJfTUNTUElfUlgwCQkJMHgzYworCisvKiBwZXItcmVnaXN0ZXIgYml0bWFza3M6ICovCisKKyNkZWZpbmUgT01BUDJfTUNTUElfU1lTQ09ORklHX0FVVE9JRExFCSgxIDw8IDApCisjZGVmaW5lIE9NQVAyX01DU1BJX1NZU0NPTkZJR19TT0ZUUkVTRVQJKDEgPDwgMSkKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9TWVNTVEFUVVNfUkVTRVRET05FCSgxIDw8IDApCisKKyNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NJTkdMRQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfTVMJKDEgPDwgMikKKyNkZWZpbmUgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NURVNUCSgxIDw8IDMpCisKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1BIQQkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1BPTAkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0NMS0RfTUFTSwkoMHgwZiA8PCAyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRVBPTAkJKDEgPDwgNikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1dMX01BU0sJKDB4MWYgPDwgNykKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX1RSTV9SWF9PTkxZCSgweDAxIDw8IDEyKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFkJKDB4MDIgPDwgMTIpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSwkoMHgwMyA8PCAxMikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0RNQVcJCSgxIDw8IDE0KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BUgkJKDEgPDwgMTUpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9EUEUwCQkoMSA8PCAxNikKKyNkZWZpbmUgT01BUDJfTUNTUElfQ0hDT05GX0RQRTEJCSgxIDw8IDE3KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfSVMJCSgxIDw8IDE4KQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSENPTkZfVFVSQk8JKDEgPDwgMTkpCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ09ORl9GT1JDRQkoMSA8PCAyMCkKKworI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfUlhTCQkoMSA8PCAwKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfVFhTCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQMl9NQ1NQSV9DSFNUQVRfRU9UCQkoMSA8PCAyKQorCisjZGVmaW5lIE9NQVAyX01DU1BJX0NIQ1RSTF9FTgkJKDEgPDwgMCkKKworCisvKiBXZSBoYXZlIDIgRE1BIGNoYW5uZWxzIHBlciBDUywgb25lIGZvciBSWCBhbmQgb25lIGZvciBUWCAqLworc3RydWN0IG9tYXAyX21jc3BpX2RtYSB7CisJaW50IGRtYV90eF9jaGFubmVsOworCWludCBkbWFfcnhfY2hhbm5lbDsKKworCWludCBkbWFfdHhfc3luY19kZXY7CisJaW50IGRtYV9yeF9zeW5jX2RldjsKKworCXN0cnVjdCBjb21wbGV0aW9uIGRtYV90eF9jb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uIGRtYV9yeF9jb21wbGV0aW9uOworfTsKKworLyogdXNlIFBJTyBmb3Igc21hbGwgdHJhbnNmZXJzLCBhdm9pZGluZyBETUEgc2V0dXAvdGVhcmRvd24gb3ZlcmhlYWQgYW5kCisgKiBjYWNoZSBvcGVyYXRpb25zOyBiZXR0ZXIgaGV1cmlzdGljcyBjb25zaWRlciB3b3Jkc2l6ZSBhbmQgYml0cmF0ZS4KKyAqLworI2RlZmluZSBETUFfTUlOX0JZVEVTCQkJOAorCisKK3N0cnVjdCBvbWFwMl9tY3NwaSB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJLyogbG9jayBwcm90ZWN0cyBxdWV1ZSBhbmQgcmVnaXN0ZXJzICovCisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW1zZ19xdWV1ZTsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCXN0cnVjdCBjbGsJCSppY2s7CisJc3RydWN0IGNsawkJKmZjazsKKwkvKiBWaXJ0dWFsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciAqLworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJLyogU1BJMSBoYXMgNCBjaGFubmVscywgd2hpbGUgU1BJMiBoYXMgMiAqLworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKmRtYV9jaGFubmVsczsKK307CisKK3N0cnVjdCBvbWFwMl9tY3NwaV9jcyB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlpbnQJCQl3b3JkX2xlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqb21hcDJfbWNzcGlfd3E7CisKKyNkZWZpbmUgTU9EX1JFR19CSVQodmFsLCBtYXNrLCBzZXQpIGRvIHsgXAorCWlmIChzZXQpIFwKKwkJdmFsIHw9IG1hc2s7IFwKKwllbHNlIFwKKwkJdmFsICY9IH5tYXNrOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNzcGlfd3JpdGVfcmVnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCWludCBpZHgsIHUzMiB2YWwpCit7CisJc3RydWN0IG9tYXAyX21jc3BpICptY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCV9fcmF3X3dyaXRlbCh2YWwsIG1jc3BpLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbWNzcGlfcmVhZF9yZWcoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKG1jc3BpLT5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1jc3BpX3dyaXRlX2NzX3JlZyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgaWR4LCB1MzIgdmFsKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlfX3Jhd193cml0ZWwodmFsLCBjcy0+YmFzZSArICBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3NwaV9yZWFkX2NzX3JlZyhjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgaWR4KQoreworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisKKwlyZXR1cm4gX19yYXdfcmVhZGwoY3MtPmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgdm9pZCBvbWFwMl9tY3NwaV9zZXRfZG1hX3JlcShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlpbnQgaXNfcmVhZCwgaW50IGVuYWJsZSkKK3sKKwl1MzIgbCwgcnc7CisKKwlsID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKworCWlmIChpc19yZWFkKSAvKiAxIGlzIHJlYWQsIDAgd3JpdGUgKi8KKwkJcncgPSBPTUFQMl9NQ1NQSV9DSENPTkZfRE1BUjsKKwllbHNlCisJCXJ3ID0gT01BUDJfTUNTUElfQ0hDT05GX0RNQVc7CisKKwlNT0RfUkVHX0JJVChsLCBydywgZW5hYmxlKTsKKwltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfc2V0X2VuYWJsZShjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgZW5hYmxlKQoreworCXUzMiBsOworCisJbCA9IGVuYWJsZSA/IE9NQVAyX01DU1BJX0NIQ1RSTF9FTiA6IDA7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDVFJMMCwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX2ZvcmNlX2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCBjc19hY3RpdmUpCit7CisJdTMyIGw7CisKKwlsID0gbWNzcGlfcmVhZF9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9DSENPTkZfRk9SQ0UsIGNzX2FjdGl2ZSk7CisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3NldF9tYXN0ZXJfbW9kZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXUzMiBsOworCisJLyogc2V0dXAgd2hlbiBzd2l0Y2hpbmcgZnJvbSAocmVzZXQgZGVmYXVsdCkgc2xhdmUgbW9kZQorCSAqIHRvIHNpbmdsZS1jaGFubmVsIG1hc3RlciBtb2RlCisJICovCisJbCA9IG1jc3BpX3JlYWRfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfTU9EVUxDVFJMKTsKKwlNT0RfUkVHX0JJVChsLCBPTUFQMl9NQ1NQSV9NT0RVTENUUkxfU1RFU1QsIDApOworCU1PRF9SRUdfQklUKGwsIE9NQVAyX01DU1BJX01PRFVMQ1RSTF9NUywgMCk7CisJTU9EX1JFR19CSVQobCwgT01BUDJfTUNTUElfTU9EVUxDVFJMX1NJTkdMRSwgMSk7CisJbWNzcGlfd3JpdGVfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfTU9EVUxDVFJMLCBsKTsKK30KKworc3RhdGljIHVuc2lnbmVkCitvbWFwMl9tY3NwaV90eHJ4X2RtYShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2NzCSpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hICAqbWNzcGlfZG1hOworCXVuc2lnbmVkIGludAkJY291bnQsIGM7CisJdW5zaWduZWQgbG9uZwkJYmFzZSwgdHhfcmVnLCByeF9yZWc7CisJaW50CQkJd29yZF9sZW4sIGRhdGFfdHlwZSwgZWxlbWVudF9jb3VudDsKKwl1OAkJCSogcng7CisJY29uc3QgdTgJCSogdHg7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJY291bnQgPSB4ZmVyLT5sZW47CisJYyA9IGNvdW50OworCXdvcmRfbGVuID0gY3MtPndvcmRfbGVuOworCisJYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBpb192MnAoY3MtPmJhc2UpOworCXR4X3JlZyA9IGJhc2UgKyBPTUFQMl9NQ1NQSV9UWDA7CisJcnhfcmVnID0gYmFzZSArIE9NQVAyX01DU1BJX1JYMDsKKwlyeCA9IHhmZXItPnJ4X2J1ZjsKKwl0eCA9IHhmZXItPnR4X2J1ZjsKKworCWlmICh3b3JkX2xlbiA8PSA4KSB7CisJCWRhdGFfdHlwZSA9IE9NQVBfRE1BX0RBVEFfVFlQRV9TODsKKwkJZWxlbWVudF9jb3VudCA9IGNvdW50OworCX0gZWxzZSBpZiAod29yZF9sZW4gPD0gMTYpIHsKKwkJZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1MxNjsKKwkJZWxlbWVudF9jb3VudCA9IGNvdW50ID4+IDE7CisJfSBlbHNlIC8qIHdvcmRfbGVuIDw9IDMyICovIHsKKwkJZGF0YV90eXBlID0gT01BUF9ETUFfREFUQV9UWVBFX1MzMjsKKwkJZWxlbWVudF9jb3VudCA9IGNvdW50ID4+IDI7CisJfQorCisJaWYgKHR4ICE9IE5VTEwpIHsKKwkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsLAorCQkJCWRhdGFfdHlwZSwgZWxlbWVudF9jb3VudCwgMSwKKwkJCQlPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCisJCQkJbWNzcGlfZG1hLT5kbWFfdHhfc3luY19kZXYsIDApOworCisJCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJCXR4X3JlZywgMCwgMCk7CisKKwkJb21hcF9zZXRfZG1hX3NyY19wYXJhbXMobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCwgMCwKKwkJCQlPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywKKwkJCQl4ZmVyLT50eF9kbWEsIDAsIDApOworCX0KKworCWlmIChyeCAhPSBOVUxMKSB7CisJCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCwKKwkJCQlkYXRhX3R5cGUsIGVsZW1lbnRfY291bnQsIDEsCisJCQkJT01BUF9ETUFfU1lOQ19FTEVNRU5ULAorCQkJCW1jc3BpX2RtYS0+ZG1hX3J4X3N5bmNfZGV2LCAxKTsKKworCQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsLCAwLAorCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAorCQkJCXJ4X3JlZywgMCwgMCk7CisKKwkJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwsIDAsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJeGZlci0+cnhfZG1hLCAwLCAwKTsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsKTsKKwkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAxKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQlvbWFwX3N0YXJ0X2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAxKTsKKwl9CisKKwlpZiAodHggIT0gTlVMTCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCB4ZmVyLT50eF9kbWEsIGNvdW50LCBETUFfVE9fREVWSUNFKTsKKwl9CisKKwlpZiAocnggIT0gTlVMTCkgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV9yeF9jb21wbGV0aW9uKTsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCB4ZmVyLT5yeF9kbWEsIGNvdW50LCBETUFfRlJPTV9ERVZJQ0UpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbWNzcGlfd2FpdF9mb3JfcmVnX2JpdCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgbG9uZyBiaXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCXdoaWxlICghKF9fcmF3X3JlYWRsKHJlZykgJiBiaXQpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC0xOworCQljcHVfcmVsYXgoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorb21hcDJfbWNzcGlfdHhyeF9waW8oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9jcwkqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CisJdW5zaWduZWQgaW50CQljb3VudCwgYzsKKwl1MzIJCQlsOworCXZvaWQgX19pb21lbQkJKmJhc2UgPSBjcy0+YmFzZTsKKwl2b2lkIF9faW9tZW0JCSp0eF9yZWc7CisJdm9pZCBfX2lvbWVtCQkqcnhfcmVnOworCXZvaWQgX19pb21lbQkJKmNoc3RhdF9yZWc7CisJaW50CQkJd29yZF9sZW47CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCWNvdW50ID0geGZlci0+bGVuOworCWMgPSBjb3VudDsKKwl3b3JkX2xlbiA9IGNzLT53b3JkX2xlbjsKKworCWwgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9UUk1fTUFTSzsKKworCS8qIFdlIHN0b3JlIHRoZSBwcmUtY2FsY3VsYXRlZCByZWdpc3RlciBhZGRyZXNzZXMgb24gc3RhY2sgdG8gc3BlZWQKKwkgKiB1cCB0aGUgdHJhbnNmZXIgbG9vcC4gKi8KKwl0eF9yZWcJCT0gYmFzZSArIE9NQVAyX01DU1BJX1RYMDsKKwlyeF9yZWcJCT0gYmFzZSArIE9NQVAyX01DU1BJX1JYMDsKKwljaHN0YXRfcmVnCT0gYmFzZSArIE9NQVAyX01DU1BJX0NIU1RBVDA7CisKKwlpZiAod29yZF9sZW4gPD0gOCkgeworCQl1OAkJKnJ4OworCQljb25zdCB1OAkqdHg7CisKKwkJcnggPSB4ZmVyLT5yeF9idWY7CisJCXR4ID0geGZlci0+dHhfYnVmOworCisJCWRvIHsKKwkJCWlmICh0eCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUtJWQgJTAyeFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqdHgpOworI2VuZGlmCisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBwcmV2ZW50IGxhc3QgUlhfT05MWSByZWFkIGZyb20gdHJpZ2dlcmluZworCQkJCSAqIG1vcmUgd29yZCBpL286IHN3aXRjaCB0byByeCt0eAorCQkJCSAqLworCQkJCWlmIChjID09IDAgJiYgdHggPT0gTlVMTCkKKwkJCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwKKwkJCQkJCQlPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDJ4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisjZW5kaWYKKwkJCX0KKwkJCWMgLT0gMTsKKwkJfSB3aGlsZSAoYyk7CisJfSBlbHNlIGlmICh3b3JkX2xlbiA8PSAxNikgeworCQl1MTYJCSpyeDsKKwkJY29uc3QgdTE2CSp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisJCWRvIHsKKwkJCWlmICh0eCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqdHgpOworI2VuZGlmCisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBwcmV2ZW50IGxhc3QgUlhfT05MWSByZWFkIGZyb20gdHJpZ2dlcmluZworCQkJCSAqIG1vcmUgd29yZCBpL286IHN3aXRjaCB0byByeCt0eAorCQkJCSAqLworCQkJCWlmIChjID09IDAgJiYgdHggPT0gTlVMTCkKKwkJCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwKKwkJCQkJCQlPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisjZW5kaWYKKwkJCX0KKwkJCWMgLT0gMjsKKwkJfSB3aGlsZSAoYyk7CisJfSBlbHNlIGlmICh3b3JkX2xlbiA8PSAzMikgeworCQl1MzIJCSpyeDsKKwkJY29uc3QgdTMyCSp0eDsKKworCQlyeCA9IHhmZXItPnJ4X2J1ZjsKKwkJdHggPSB4ZmVyLT50eF9idWY7CisJCWRvIHsKKwkJCWlmICh0eCAhPSBOVUxMKSB7CisJCQkJaWYgKG1jc3BpX3dhaXRfZm9yX3JlZ19iaXQoY2hzdGF0X3JlZywKKwkJCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgIlRYUyB0aW1lZCBvdXRcbiIpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JpdGUtJWQgJTA0eFxuIiwKKwkJCQkJCXdvcmRfbGVuLCAqdHgpOworI2VuZGlmCisJCQkJX19yYXdfd3JpdGVsKCp0eCsrLCB0eF9yZWcpOworCQkJfQorCQkJaWYgKHJ4ICE9IE5VTEwpIHsKKwkJCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCQkJT01BUDJfTUNTUElfQ0hTVEFUX1JYUykgPCAwKSB7CisJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiUlhTIHRpbWVkIG91dFxuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQkvKiBwcmV2ZW50IGxhc3QgUlhfT05MWSByZWFkIGZyb20gdHJpZ2dlcmluZworCQkJCSAqIG1vcmUgd29yZCBpL286IHN3aXRjaCB0byByeCt0eAorCQkJCSAqLworCQkJCWlmIChjID09IDAgJiYgdHggPT0gTlVMTCkKKwkJCQkJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwKKwkJCQkJCQlPTUFQMl9NQ1NQSV9DSENPTkYwLCBsKTsKKwkJCQkqcngrKyA9IF9fcmF3X3JlYWRsKHJ4X3JlZyk7CisjaWZkZWYgVkVSQk9TRQorCQkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZC0lZCAlMDR4XG4iLAorCQkJCQkJd29yZF9sZW4sICoocnggLSAxKSk7CisjZW5kaWYKKwkJCX0KKwkJCWMgLT0gNDsKKwkJfSB3aGlsZSAoYyk7CisJfQorCisJLyogZm9yIFRYX09OTFkgbW9kZSwgYmUgc3VyZSBhbGwgd29yZHMgaGF2ZSBzaGlmdGVkIG91dCAqLworCWlmICh4ZmVyLT5yeF9idWYgPT0gTlVMTCkgeworCQlpZiAobWNzcGlfd2FpdF9mb3JfcmVnX2JpdChjaHN0YXRfcmVnLAorCQkJCU9NQVAyX01DU1BJX0NIU1RBVF9UWFMpIDwgMCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJUWFMgdGltZWQgb3V0XG4iKTsKKwkJfSBlbHNlIGlmIChtY3NwaV93YWl0X2Zvcl9yZWdfYml0KGNoc3RhdF9yZWcsCisJCQkJT01BUDJfTUNTUElfQ0hTVEFUX0VPVCkgPCAwKQorCQkJZGV2X2Vycigmc3BpLT5kZXYsICJFT1QgdGltZWQgb3V0XG4iKTsKKwl9CitvdXQ6CisJcmV0dXJuIGNvdW50IC0gYzsKK30KKworLyogY2FsbGVkIG9ubHkgd2hlbiBubyB0cmFuc2ZlciBpcyBhY3RpdmUgdG8gdGhpcyBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXN0cnVjdCBvbWFwMl9tY3NwaSAqbWNzcGk7CisJdTMyIGwgPSAwLCBkaXYgPSAwOworCXU4IHdvcmRfbGVuID0gc3BpLT5iaXRzX3Blcl93b3JkOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWlmICh0ICE9IE5VTEwgJiYgdC0+Yml0c19wZXJfd29yZCkKKwkJd29yZF9sZW4gPSB0LT5iaXRzX3Blcl93b3JkOworCisJY3MtPndvcmRfbGVuID0gd29yZF9sZW47CisKKwlpZiAoc3BpLT5tYXhfc3BlZWRfaHopIHsKKwkJd2hpbGUgKGRpdiA8PSAxNSAmJiAoT01BUDJfTUNTUElfTUFYX0ZSRVEgLyAoMSA8PCBkaXYpKQorCQkJCQk+IHNwaS0+bWF4X3NwZWVkX2h6KQorCQkJZGl2Kys7CisJfSBlbHNlCisJCWRpdiA9IDE1OworCisJbCA9IG1jc3BpX3JlYWRfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCk7CisKKwkvKiBzdGFuZGFyZCA0LXdpcmUgbWFzdGVyIG1vZGU6ICBTQ0ssIE1PU0kvb3V0LCBNSVNPL2luLCBuQ1MKKwkgKiBSRVZJU0lUOiB0aGlzIGNvbnRyb2xsZXIgY291bGQgc3VwcG9ydCBTUElfM1dJUkUgbW9kZS4KKwkgKi8KKwlsICY9IH4oT01BUDJfTUNTUElfQ0hDT05GX0lTfE9NQVAyX01DU1BJX0NIQ09ORl9EUEUxKTsKKwlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9EUEUwOworCisJLyogd29yZGxlbmd0aCAqLworCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9XTF9NQVNLOworCWwgfD0gKHdvcmRfbGVuIC0gMSkgPDwgNzsKKworCS8qIHNldCBjaGlwc2VsZWN0IHBvbGFyaXR5OyBtYW5hZ2Ugd2l0aCBGT1JDRSAqLworCWlmICghKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSkKKwkJbCB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfRVBPTDsJLyogYWN0aXZlLWxvdzsgbm9ybWFsICovCisJZWxzZQorCQlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfRVBPTDsKKworCS8qIHNldCBjbG9jayBkaXZpc29yICovCisJbCAmPSB+T01BUDJfTUNTUElfQ0hDT05GX0NMS0RfTUFTSzsKKwlsIHw9IGRpdiA8PCAyOworCisJLyogc2V0IFNQSSBtb2RlIDAuLjMgKi8KKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCWwgfD0gT01BUDJfTUNTUElfQ0hDT05GX1BPTDsKKwllbHNlCisJCWwgJj0gfk9NQVAyX01DU1BJX0NIQ09ORl9QT0w7CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQlsIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9QSEE7CisJZWxzZQorCQlsICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfUEhBOworCisJbWNzcGlfd3JpdGVfY3NfcmVnKHNwaSwgT01BUDJfTUNTUElfQ0hDT05GMCwgbCk7CisKKwlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiBzcGVlZCAlZCwgc2FtcGxlICVzIGVkZ2UsIGNsayAlc1xuIiwKKwkJCU9NQVAyX01DU1BJX01BWF9GUkVRIC8gKDEgPDwgZGl2KSwKKwkJCShzcGktPm1vZGUgJiBTUElfQ1BIQSkgPyAidHJhaWxpbmciIDogImxlYWRpbmciLAorCQkJKHNwaS0+bW9kZSAmIFNQSV9DUE9MKSA/ICJpbnZlcnRlZCIgOiAibm9ybWFsIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3J4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7CisKKwljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisKKwkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBSWCByZXF1ZXN0ICovCisJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAxLCAwKTsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UJKnNwaSA9IGRhdGE7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfZG1hCSptY3NwaV9kbWE7CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICYobWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XSk7CisKKwljb21wbGV0ZSgmbWNzcGlfZG1hLT5kbWFfdHhfY29tcGxldGlvbik7CisKKwkvKiBXZSBtdXN0IGRpc2FibGUgdGhlIERNQSBUWCByZXF1ZXN0ICovCisJb21hcDJfbWNzcGlfc2V0X2RtYV9yZXEoc3BpLCAwLCAwKTsKK30KKworc3RhdGljIGludCBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCW1jc3BpX2RtYSA9IG1jc3BpLT5kbWFfY2hhbm5lbHMgKyBzcGktPmNoaXBfc2VsZWN0OworCisJaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNzcGlfZG1hLT5kbWFfcnhfc3luY19kZXYsICJNY1NQSSBSWCIsCisJCQlvbWFwMl9tY3NwaV9kbWFfcnhfY2FsbGJhY2ssIHNwaSwKKwkJCSZtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFJYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jc3BpX2RtYS0+ZG1hX3R4X3N5bmNfZGV2LCAiTWNTUEkgVFgiLAorCQkJb21hcDJfbWNzcGlfZG1hX3R4X2NhbGxiYWNrLCBzcGksCisJCQkmbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCkpIHsKKwkJb21hcF9mcmVlX2RtYShtY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsKTsKKwkJbWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9IC0xOworCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIFRYIERNQSBjaGFubmVsIGZvciBNY1NQSVxuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWluaXRfY29tcGxldGlvbigmbWNzcGlfZG1hLT5kbWFfcnhfY29tcGxldGlvbik7CisJaW5pdF9jb21wbGV0aW9uKCZtY3NwaV9kbWEtPmRtYV90eF9jb21wbGV0aW9uKTsKKworCXJldHVybiAwOworfQorCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKworc3RhdGljIGludCBvbWFwMl9tY3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWludAkJCXJldDsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKm1jc3BpX2RtYTsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID09IDApCisJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisJZWxzZSBpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgNCB8fCBzcGktPmJpdHNfcGVyX3dvcmQgPiAzMikgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCAlZCBiaXQgd29yZHNcbiIsCisJCQlzcGktPmJpdHNfcGVyX3dvcmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltY3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCW1jc3BpX2RtYSA9ICZtY3NwaS0+ZG1hX2NoYW5uZWxzW3NwaS0+Y2hpcF9zZWxlY3RdOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY3MtPmJhc2UgPSBtY3NwaS0+YmFzZSArIHNwaS0+Y2hpcF9zZWxlY3QgKiAweDE0OworCQlzcGktPmNvbnRyb2xsZXJfc3RhdGUgPSBjczsKKwl9CisKKwlpZiAobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCA9PSAtMQorCQkJfHwgbWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCA9PSAtMSkgeworCQlyZXQgPSBvbWFwMl9tY3NwaV9yZXF1ZXN0X2RtYShzcGkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJY2xrX2VuYWJsZShtY3NwaS0+aWNrKTsKKwljbGtfZW5hYmxlKG1jc3BpLT5mY2spOworCXJldCA9ICBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCWNsa19kaXNhYmxlKG1jc3BpLT5mY2spOworCWNsa19kaXNhYmxlKG1jc3BpLT5pY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb21hcDJfbWNzcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJc3RydWN0IG9tYXAyX21jc3BpX2RtYQkqbWNzcGlfZG1hOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwltY3NwaV9kbWEgPSAmbWNzcGktPmRtYV9jaGFubmVsc1tzcGktPmNoaXBfc2VsZWN0XTsKKworCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7CisKKwlpZiAobWNzcGlfZG1hLT5kbWFfcnhfY2hhbm5lbCAhPSAtMSkgeworCQlvbWFwX2ZyZWVfZG1hKG1jc3BpX2RtYS0+ZG1hX3J4X2NoYW5uZWwpOworCQltY3NwaV9kbWEtPmRtYV9yeF9jaGFubmVsID0gLTE7CisJfQorCWlmIChtY3NwaV9kbWEtPmRtYV90eF9jaGFubmVsICE9IC0xKSB7CisJCW9tYXBfZnJlZV9kbWEobWNzcGlfZG1hLT5kbWFfdHhfY2hhbm5lbCk7CisJCW1jc3BpX2RtYS0+ZG1hX3R4X2NoYW5uZWwgPSAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXAyX21jc3BpX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisKKwltY3NwaSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgb21hcDJfbWNzcGksIHdvcmspOworCXNwaW5fbG9ja19pcnEoJm1jc3BpLT5sb2NrKTsKKworCWNsa19lbmFibGUobWNzcGktPmljayk7CisJY2xrX2VuYWJsZShtY3NwaS0+ZmNrKTsKKworCS8qIFdlIG9ubHkgZW5hYmxlIG9uZSBjaGFubmVsIGF0IGEgdGltZSAtLSB0aGUgb25lIHdob3NlIG1lc3NhZ2UgaXMKKwkgKiBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgLS0gYWx0aG91Z2ggdGhpcyBjb250cm9sbGVyIHdvdWxkIGdsYWRseQorCSAqIGFyYml0cmF0ZSBhbW9uZyBtdWx0aXBsZSBjaGFubmVscy4gIFRoaXMgY29ycmVzcG9uZHMgdG8gInNpbmdsZQorCSAqIGNoYW5uZWwiIG1hc3RlciBtb2RlLiAgQXMgYSBzaWRlIGVmZmVjdCwgd2UgbmVlZCB0byBtYW5hZ2UgdGhlCisJICogY2hpcHNlbGVjdCB3aXRoIHRoZSBGT1JDRSBiaXQgLi4uIENTICE9IGNoYW5uZWwgZW5hYmxlLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmbWNzcGktPm1zZ19xdWV1ZSkpIHsKKwkJc3RydWN0IHNwaV9tZXNzYWdlCQkqbTsKKwkJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIJCSp0ID0gTlVMTDsKKwkJaW50CQkJCWNzX2FjdGl2ZSA9IDA7CisJCXN0cnVjdCBvbWFwMl9tY3NwaV9kZXZpY2VfY29uZmlnICpjb25mOworCQlzdHJ1Y3Qgb21hcDJfbWNzcGlfY3MJCSpjczsKKwkJaW50CQkJCXBhcl9vdmVycmlkZSA9IDA7CisJCWludAkJCQlzdGF0dXMgPSAwOworCQl1MzIJCQkJY2hjb25mOworCisJCW0gPSBjb250YWluZXJfb2YobWNzcGktPm1zZ19xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UsCisJCQkJIHF1ZXVlKTsKKworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmbWNzcGktPmxvY2spOworCisJCXNwaSA9IG0tPnNwaTsKKwkJY29uZiA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOworCQljcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKworCQlvbWFwMl9tY3NwaV9zZXRfZW5hYmxlKHNwaSwgMSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQkJaWYgKHQtPnR4X2J1ZiA9PSBOVUxMICYmIHQtPnJ4X2J1ZiA9PSBOVUxMICYmIHQtPmxlbikgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocGFyX292ZXJyaWRlIHx8IHQtPnNwZWVkX2h6IHx8IHQtPmJpdHNfcGVyX3dvcmQpIHsKKwkJCQlwYXJfb3ZlcnJpZGUgPSAxOworCQkJCXN0YXR1cyA9IG9tYXAyX21jc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJCWlmICghdC0+c3BlZWRfaHogJiYgIXQtPmJpdHNfcGVyX3dvcmQpCisJCQkJCXBhcl9vdmVycmlkZSA9IDA7CisJCQl9CisKKwkJCWlmICghY3NfYWN0aXZlKSB7CisJCQkJb21hcDJfbWNzcGlfZm9yY2VfY3Moc3BpLCAxKTsKKwkJCQljc19hY3RpdmUgPSAxOworCQkJfQorCisJCQljaGNvbmYgPSBtY3NwaV9yZWFkX2NzX3JlZyhzcGksIE9NQVAyX01DU1BJX0NIQ09ORjApOworCQkJY2hjb25mICY9IH5PTUFQMl9NQ1NQSV9DSENPTkZfVFJNX01BU0s7CisJCQlpZiAodC0+dHhfYnVmID09IE5VTEwpCisJCQkJY2hjb25mIHw9IE9NQVAyX01DU1BJX0NIQ09ORl9UUk1fUlhfT05MWTsKKwkJCWVsc2UgaWYgKHQtPnJ4X2J1ZiA9PSBOVUxMKQorCQkJCWNoY29uZiB8PSBPTUFQMl9NQ1NQSV9DSENPTkZfVFJNX1RYX09OTFk7CisJCQltY3NwaV93cml0ZV9jc19yZWcoc3BpLCBPTUFQMl9NQ1NQSV9DSENPTkYwLCBjaGNvbmYpOworCisJCQlpZiAodC0+bGVuKSB7CisJCQkJdW5zaWduZWQJY291bnQ7CisKKwkJCQkvKiBSWF9PTkxZIG1vZGUgbmVlZHMgZHVtbXkgZGF0YSBpbiBUWCByZWcgKi8KKwkJCQlpZiAodC0+dHhfYnVmID09IE5VTEwpCisJCQkJCV9fcmF3X3dyaXRlbCgwLCBjcy0+YmFzZQorCQkJCQkJCSsgT01BUDJfTUNTUElfVFgwKTsKKworCQkJCWlmIChtLT5pc19kbWFfbWFwcGVkIHx8IHQtPmxlbiA+PSBETUFfTUlOX0JZVEVTKQorCQkJCQljb3VudCA9IG9tYXAyX21jc3BpX3R4cnhfZG1hKHNwaSwgdCk7CisJCQkJZWxzZQorCQkJCQljb3VudCA9IG9tYXAyX21jc3BpX3R4cnhfcGlvKHNwaSwgdCk7CisJCQkJbS0+YWN0dWFsX2xlbmd0aCArPSBjb3VudDsKKworCQkJCWlmIChjb3VudCAhPSB0LT5sZW4pIHsKKwkJCQkJc3RhdHVzID0gLUVJTzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQkJLyogaWdub3JlIHRoZSAibGVhdmUgaXQgb24gYWZ0ZXIgbGFzdCB4ZmVyIiBoaW50ICovCisJCQlpZiAodC0+Y3NfY2hhbmdlKSB7CisJCQkJb21hcDJfbWNzcGlfZm9yY2VfY3Moc3BpLCAwKTsKKwkJCQljc19hY3RpdmUgPSAwOworCQkJfQorCQl9CisKKwkJLyogUmVzdG9yZSBkZWZhdWx0cyBpZiB0aGV5IHdlcmUgb3ZlcnJpZGVuICovCisJCWlmIChwYXJfb3ZlcnJpZGUpIHsKKwkJCXBhcl9vdmVycmlkZSA9IDA7CisJCQlzdGF0dXMgPSBvbWFwMl9tY3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCQl9CisKKwkJaWYgKGNzX2FjdGl2ZSkKKwkJCW9tYXAyX21jc3BpX2ZvcmNlX2NzKHNwaSwgMCk7CisKKwkJb21hcDJfbWNzcGlfc2V0X2VuYWJsZShzcGksIDApOworCisJCW0tPnN0YXR1cyA9IHN0YXR1czsKKwkJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkJc3Bpbl9sb2NrX2lycSgmbWNzcGktPmxvY2spOworCX0KKworCWNsa19kaXNhYmxlKG1jc3BpLT5mY2spOworCWNsa19kaXNhYmxlKG1jc3BpLT5pY2spOworCisJc3Bpbl91bmxvY2tfaXJxKCZtY3NwaS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgb21hcDJfbWNzcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBvbWFwMl9tY3NwaQkqbWNzcGk7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc3RydWN0IHNwaV90cmFuc2ZlcgkqdDsKKworCW0tPmFjdHVhbF9sZW5ndGggPSAwOworCW0tPnN0YXR1cyA9IDA7CisKKwkvKiByZWplY3QgaW52YWxpZCBtZXNzYWdlcyBhbmQgdHJhbnNmZXJzICovCisJaWYgKGxpc3RfZW1wdHkoJm0tPnRyYW5zZmVycykgfHwgIW0tPmNvbXBsZXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJY29uc3Qgdm9pZAkqdHhfYnVmID0gdC0+dHhfYnVmOworCQl2b2lkCQkqcnhfYnVmID0gdC0+cnhfYnVmOworCQl1bnNpZ25lZAlsZW4gPSB0LT5sZW47CisKKwkJaWYgKHQtPnNwZWVkX2h6ID4gT01BUDJfTUNTUElfTUFYX0ZSRVEKKwkJCQl8fCAobGVuICYmICEocnhfYnVmIHx8IHR4X2J1ZikpCisJCQkJfHwgKHQtPmJpdHNfcGVyX3dvcmQgJiYKKwkJCQkJKCAgdC0+Yml0c19wZXJfd29yZCA8IDQKKwkJCQkJfHwgdC0+Yml0c19wZXJfd29yZCA+IDMyKSkpIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAidHJhbnNmZXI6ICVkIEh6LCAlZCAlcyVzLCAlZCBicHdcbiIsCisJCQkJCXQtPnNwZWVkX2h6LAorCQkJCQlsZW4sCisJCQkJCXR4X2J1ZiA/ICJ0eCIgOiAiIiwKKwkJCQkJcnhfYnVmID8gInJ4IiA6ICIiLAorCQkJCQl0LT5iaXRzX3Blcl93b3JkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh0LT5zcGVlZF9oeiAmJiB0LT5zcGVlZF9oeiA8IE9NQVAyX01DU1BJX01BWF9GUkVRLygxPDwxNikpIHsKKwkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiJWQgSHogbWF4IGV4Y2VlZHMgJWRcbiIsCisJCQkJCXQtPnNwZWVkX2h6LAorCQkJCQlPTUFQMl9NQ1NQSV9NQVhfRlJFUS8oMTw8MTYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKG0tPmlzX2RtYV9tYXBwZWQgfHwgbGVuIDwgRE1BX01JTl9CWVRFUykKKwkJCWNvbnRpbnVlOworCisJCS8qIERvIERNQSBtYXBwaW5nICJlYXJseSIgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcgYW5kCisJCSAqIGRjYWNoZSB1c2UuICBOb3RlIHRoYXQgaWYgZG1hX3VubWFwX3NpbmdsZSgpIGV2ZXIgc3RhcnRzCisJCSAqIHRvIGRvIHJlYWwgd29yayBvbiBBUk0sIHdlJ2QgbmVlZCB0byBjbGVhbiB1cCBtYXBwaW5ncworCQkgKiBmb3IgcHJldmlvdXMgdHJhbnNmZXJzIG9uICpBTEwqIGV4aXRzIG9mIHRoaXMgbG9vcC4uLgorCQkgKi8KKwkJaWYgKHR4X2J1ZiAhPSBOVUxMKSB7CisJCQl0LT50eF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmc3BpLT5kZXYsICh2b2lkICopIHR4X2J1ZiwKKwkJCQkJbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0LT50eF9kbWEpKSB7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJkbWEgJWNYICVkIGJ5dGVzIGVycm9yXG4iLAorCQkJCQkJJ1QnLCBsZW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCWlmIChyeF9idWYgIT0gTlVMTCkgeworCQkJdC0+cnhfZG1hID0gZG1hX21hcF9zaW5nbGUoJnNwaS0+ZGV2LCByeF9idWYsIHQtPmxlbiwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0LT5yeF9kbWEpKSB7CisJCQkJZGV2X2RiZygmc3BpLT5kZXYsICJkbWEgJWNYICVkIGJ5dGVzIGVycm9yXG4iLAorCQkJCQkJJ1InLCBsZW4pOworCQkJCWlmICh0eF9idWYgIT0gTlVMTCkKKwkJCQkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCB0LT50eF9kbWEsCisJCQkJCQkJbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNzcGktPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZtLT5xdWV1ZSwgJm1jc3BpLT5tc2dfcXVldWUpOworCXF1ZXVlX3dvcmsob21hcDJfbWNzcGlfd3EsICZtY3NwaS0+d29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNzcGktPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9yZXNldChzdHJ1Y3Qgb21hcDJfbWNzcGkgKm1jc3BpKQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXIgPSBtY3NwaS0+bWFzdGVyOworCXUzMgkJCXRtcDsKKworCWNsa19lbmFibGUobWNzcGktPmljayk7CisJY2xrX2VuYWJsZShtY3NwaS0+ZmNrKTsKKworCW1jc3BpX3dyaXRlX3JlZyhtYXN0ZXIsIE9NQVAyX01DU1BJX1NZU0NPTkZJRywKKwkJCU9NQVAyX01DU1BJX1NZU0NPTkZJR19TT0ZUUkVTRVQpOworCWRvIHsKKwkJdG1wID0gbWNzcGlfcmVhZF9yZWcobWFzdGVyLCBPTUFQMl9NQ1NQSV9TWVNTVEFUVVMpOworCX0gd2hpbGUgKCEodG1wICYgT01BUDJfTUNTUElfU1lTU1RBVFVTX1JFU0VURE9ORSkpOworCisJbWNzcGlfd3JpdGVfcmVnKG1hc3RlciwgT01BUDJfTUNTUElfU1lTQ09ORklHLAorCQkJLyogKDMgPDwgOCkgfCAoMiA8PCAzKSB8ICovCisJCQlPTUFQMl9NQ1NQSV9TWVNDT05GSUdfQVVUT0lETEUpOworCisJb21hcDJfbWNzcGlfc2V0X21hc3Rlcl9tb2RlKG1hc3Rlcik7CisKKwljbGtfZGlzYWJsZShtY3NwaS0+ZmNrKTsKKwljbGtfZGlzYWJsZShtY3NwaS0+aWNrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMV9yeGRtYV9pZCBbXSA9IHsKKwlPTUFQMjRYWF9ETUFfU1BJMV9SWDAsCisJT01BUDI0WFhfRE1BX1NQSTFfUlgxLAorCU9NQVAyNFhYX0RNQV9TUEkxX1JYMiwKKwlPTUFQMjRYWF9ETUFfU1BJMV9SWDMsCit9OworCitzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkxX3R4ZG1hX2lkIFtdID0geworCU9NQVAyNFhYX0RNQV9TUEkxX1RYMCwKKwlPTUFQMjRYWF9ETUFfU1BJMV9UWDEsCisJT01BUDI0WFhfRE1BX1NQSTFfVFgyLAorCU9NQVAyNFhYX0RNQV9TUEkxX1RYMywKK307CisKK3N0YXRpYyB1OCBfX2luaXRkYXRhIHNwaTJfcnhkbWFfaWRbXSA9IHsKKwlPTUFQMjRYWF9ETUFfU1BJMl9SWDAsCisJT01BUDI0WFhfRE1BX1NQSTJfUlgxLAorfTsKKworc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMl90eGRtYV9pZFtdID0geworCU9NQVAyNFhYX0RNQV9TUEkyX1RYMCwKKwlPTUFQMjRYWF9ETUFfU1BJMl9UWDEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwMl9tY3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyCSptYXN0ZXI7CisJc3RydWN0IG9tYXAyX21jc3BpCSptY3NwaTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyOworCWludAkJCXN0YXR1cyA9IDAsIGk7CisJY29uc3QgdTgJCSpyeGRtYV9pZCwgKnR4ZG1hX2lkOworCXVuc2lnbmVkCQludW1fY2hpcHNlbGVjdDsKKworCXN3aXRjaCAocGRldi0+aWQpIHsKKwljYXNlIDE6CisJCXJ4ZG1hX2lkID0gc3BpMV9yeGRtYV9pZDsKKwkJdHhkbWFfaWQgPSBzcGkxX3R4ZG1hX2lkOworCQludW1fY2hpcHNlbGVjdCA9IDQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcnhkbWFfaWQgPSBzcGkyX3J4ZG1hX2lkOworCQl0eGRtYV9pZCA9IHNwaTJfdHhkbWFfaWQ7CisJCW51bV9jaGlwc2VsZWN0ID0gMjsKKwkJYnJlYWs7CisJLyogUkVWSVNJVCBvbWFwMjQzMCBoYXMgYSB0aGlyZCBNY1NQSSAuLi4gKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZiAqbWNzcGkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtYXN0ZXIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAocGRldi0+aWQgIT0gLTEpCisJCW1hc3Rlci0+YnVzX251bSA9IHBkZXYtPmlkOworCisJbWFzdGVyLT5zZXR1cCA9IG9tYXAyX21jc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBvbWFwMl9tY3NwaV90cmFuc2ZlcjsKKwltYXN0ZXItPmNsZWFudXAgPSBvbWFwMl9tY3NwaV9jbGVhbnVwOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBudW1fY2hpcHNlbGVjdDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBtYXN0ZXIpOworCisJbWNzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJbWNzcGktPm1hc3RlciA9IG1hc3RlcjsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyID09IE5VTEwpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBlcnIxOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwgKHItPmVuZCAtIHItPnN0YXJ0KSArIDEsCisJCQlwZGV2LT5kZXYuYnVzX2lkKSkgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyMTsKKwl9CisKKwltY3NwaS0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKikgaW9fcDJ2KHItPnN0YXJ0KTsKKworCUlOSVRfV09SSygmbWNzcGktPndvcmssIG9tYXAyX21jc3BpX3dvcmspOworCisJc3Bpbl9sb2NrX2luaXQoJm1jc3BpLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmbWNzcGktPm1zZ19xdWV1ZSk7CisKKwltY3NwaS0+aWNrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibWNzcGlfaWNrIik7CisJaWYgKElTX0VSUihtY3NwaS0+aWNrKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBnZXQgbWNzcGlfaWNrXG4iKTsKKwkJc3RhdHVzID0gUFRSX0VSUihtY3NwaS0+aWNrKTsKKwkJZ290byBlcnIxYTsKKwl9CisJbWNzcGktPmZjayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIm1jc3BpX2ZjayIpOworCWlmIChJU19FUlIobWNzcGktPmZjaykpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY2FuJ3QgZ2V0IG1jc3BpX2Zja1xuIik7CisJCXN0YXR1cyA9IFBUUl9FUlIobWNzcGktPmZjayk7CisJCWdvdG8gZXJyMjsKKwl9CisKKwltY3NwaS0+ZG1hX2NoYW5uZWxzID0ga2NhbGxvYyhtYXN0ZXItPm51bV9jaGlwc2VsZWN0LAorCQkJc2l6ZW9mKHN0cnVjdCBvbWFwMl9tY3NwaV9kbWEpLAorCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAobWNzcGktPmRtYV9jaGFubmVscyA9PSBOVUxMKQorCQlnb3RvIGVycjM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQltY3NwaS0+ZG1hX2NoYW5uZWxzW2ldLmRtYV9yeF9jaGFubmVsID0gLTE7CisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3J4X3N5bmNfZGV2ID0gcnhkbWFfaWRbaV07CisJCW1jc3BpLT5kbWFfY2hhbm5lbHNbaV0uZG1hX3R4X2NoYW5uZWwgPSAtMTsKKwkJbWNzcGktPmRtYV9jaGFubmVsc1tpXS5kbWFfdHhfc3luY19kZXYgPSB0eGRtYV9pZFtpXTsKKwl9CisKKwlpZiAob21hcDJfbWNzcGlfcmVzZXQobWNzcGkpIDwgMCkKKwkJZ290byBlcnI0OworCisJc3RhdHVzID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycjQ7CisKKwlyZXR1cm4gc3RhdHVzOworCitlcnI0OgorCWtmcmVlKG1jc3BpLT5kbWFfY2hhbm5lbHMpOworZXJyMzoKKwljbGtfcHV0KG1jc3BpLT5mY2spOworZXJyMjoKKwljbGtfcHV0KG1jc3BpLT5pY2spOworZXJyMWE6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHItPnN0YXJ0LCAoci0+ZW5kIC0gci0+c3RhcnQpICsgMSk7CitlcnIxOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2V4aXQgb21hcDJfbWNzcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIJKm1hc3RlcjsKKwlzdHJ1Y3Qgb21hcDJfbWNzcGkJKm1jc3BpOworCXN0cnVjdCBvbWFwMl9tY3NwaV9kbWEJKmRtYV9jaGFubmVsczsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSpyOworCisJbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCW1jc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWRtYV9jaGFubmVscyA9IG1jc3BpLT5kbWFfY2hhbm5lbHM7CisKKwljbGtfcHV0KG1jc3BpLT5mY2spOworCWNsa19wdXQobWNzcGktPmljayk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oci0+c3RhcnQsIChyLT5lbmQgLSByLT5zdGFydCkgKyAxKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWtmcmVlKGRtYV9jaGFubmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcDJfbWNzcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0JCSJvbWFwMl9tY3NwaSIsCisJCS5vd25lciA9CVRISVNfTU9EVUxFLAorCX0sCisJLnJlbW92ZSA9CV9fZXhpdF9wKG9tYXAyX21jc3BpX3JlbW92ZSksCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXAyX21jc3BpX2luaXQodm9pZCkKK3sKKwlvbWFwMl9tY3NwaV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAorCQkJCW9tYXAyX21jc3BpX2RyaXZlci5kcml2ZXIubmFtZSk7CisJaWYgKG9tYXAyX21jc3BpX3dxID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZvbWFwMl9tY3NwaV9kcml2ZXIsIG9tYXAyX21jc3BpX3Byb2JlKTsKK30KK3N1YnN5c19pbml0Y2FsbChvbWFwMl9tY3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG9tYXAyX21jc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcDJfbWNzcGlfZHJpdmVyKTsKKworCWRlc3Ryb3lfd29ya3F1ZXVlKG9tYXAyX21jc3BpX3dxKTsKK30KK21vZHVsZV9leGl0KG9tYXAyX21jc3BpX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMgYi9kcml2ZXJzL3NwaS9vbWFwX3V3aXJlLmMKaW5kZXggOTUxODNlMS4uZDI3NWM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvb21hcF91d2lyZS5jCisrKyBiL2RyaXZlcnMvc3BpL29tYXBfdXdpcmUuYwpAQCAtNDQ1LDEwICs0NDUsMTkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKwogc3RhdGljIGludCB1d2lyZV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCB1d2lyZV9zdGF0ZSAqdXN0ID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOwogCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykgeworCQlkZXZfZGJnKCZzcGktPmRldiwgInNldHVwOiB1bnN1cHBvcnRlZCBtb2RlIGJpdHMgJXhcbiIsCisJCQlzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAodXN0ID09IE5VTEwpIHsKIAkJdXN0ID0ga3phbGxvYyhzaXplb2YoKnVzdCksIEdGUF9LRVJORUwpOwogCQlpZiAodXN0ID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKaW5kZXggOWYyYzg4Ny4uZTUxMzExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYwpAQCAtMTA2Nyw2ICsxMDY3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTIChTUElfQ1BPTCB8IFNQSV9DUEhBKQorCiBzdGF0aWMgaW50IHNldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCAqY2hpcF9pbmZvID0gTlVMTDsKQEAgLTEwOTMsNiArMTA5NiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCS8qIE9ubHkgYWxsb2Mgb24gZmlyc3Qgc2V0dXAgKi8KIAljaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CiAJaWYgKCFjaGlwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS5jCmluZGV4IDQ4MzFlZGIuLjAxODg4NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKIApAQCAtMTg1LDcgKzE4Niw3IEBACiB9OwogCiBzdGF0aWMgTElTVF9IRUFEKGJvYXJkX2xpc3QpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoYm9hcmRfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKGJvYXJkX2xvY2spOwogCiAKIC8qKgpAQCAtMjkyLDkgKzI5Myw5IEBACiAJYmktPm5fYm9hcmRfaW5mbyA9IG47CiAJbWVtY3B5KGJpLT5ib2FyZF9pbmZvLCBpbmZvLCBuICogc2l6ZW9mICppbmZvKTsKIAotCWRvd24oJmJvYXJkX2xvY2spOworCW11dGV4X2xvY2soJmJvYXJkX2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJmJpLT5saXN0LCAmYm9hcmRfbGlzdCk7Ci0JdXAoJmJvYXJkX2xvY2spOworCW11dGV4X3VubG9jaygmYm9hcmRfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwOCw3ICszMDksNyBAQAogCXN0cnVjdCBib2FyZGluZm8JKmJpOwogCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSBtYXN0ZXItPmNkZXYuZGV2OwogCi0JZG93bigmYm9hcmRfbG9jayk7CisJbXV0ZXhfbG9jaygmYm9hcmRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShiaSwgJmJvYXJkX2xpc3QsIGxpc3QpIHsKIAkJc3RydWN0IHNwaV9ib2FyZF9pbmZvCSpjaGlwID0gYmktPmJvYXJkX2luZm87CiAJCXVuc2lnbmVkCQluOwpAQCAtMzMwLDcgKzMzMSw3IEBACiAJCQkodm9pZCkgc3BpX25ld19kZXZpY2UobWFzdGVyLCBjaGlwKTsKIAkJfQogCX0KLQl1cCgmYm9hcmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZib2FyZF9sb2NrKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCmluZGV4IDg4NDI1ZTEuLjBjODVjOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpAQCAtMTg3LDEyICsxODcsMTAgQEAKIAogCWJpdGJhbmcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAotCS8qIFJFVklTSVQ6IHNvbWUgc3lzdGVtcyB3aWxsIHdhbnQgdG8gc3VwcG9ydCBkZXZpY2VzIHVzaW5nIGxzYi1maXJzdAotCSAqIGJpdCBlbmNvZGluZ3Mgb24gdGhlIHdpcmUuICBJbiBwdXJlIHNvZnR3YXJlIHRoYXQgd291bGQgYmUgdHJpdmlhbCwKLQkgKiBqdXN0IGJpdGJhbmdfdHhyeF9sZV9jcGhhWCgpIHJvdXRpbmVzIHNoaWZ0aW5nIHRoZSBvdGhlciB3YXksIGFuZAotCSAqIHNvbWUgaGFyZHdhcmUgY29udHJvbGxlcnMgYWxzbyBoYXZlIHRoaXMgc3VwcG9ydC4KKwkvKiBCaXRiYW5nZXJzIGNhbiBzdXBwb3J0IFNQSV9DU19ISUdILCBTUElfM1dJUkUsIGFuZCBzbyBvbjsKKwkgKiBhZGQgdGhvc2UgdG8gbWFzdGVyLT5mbGFncywgYW5kIHByb3ZpZGUgdGhlIG90aGVyIHN1cHBvcnQuCiAJICovCi0JaWYgKChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUKSAhPSAwKQorCWlmICgoc3BpLT5tb2RlICYgfihTUElfQ1BPTHxTUElfQ1BIQXxiaXRiYW5nLT5mbGFncykpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFjcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2lteC5jIGIvZHJpdmVycy9zcGkvc3BpX2lteC5jCmluZGV4IDY1NmJlNGEuLmFlZTlhZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9pbXguYworKysgYi9kcml2ZXJzL3NwaS9zcGlfaW14LmMKQEAgLTExNjMsNiArMTE2Myw5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQorCiAvKiBPbiBmaXJzdCBzZXR1cCBiYWQgdmFsdWVzIG11c3QgZnJlZSBjaGlwX2RhdGEgbWVtb3J5IHNpbmNlIHdpbGwgY2F1c2UKICAgIHNwaV9uZXdfZGV2aWNlIHRvIGZhaWwuIEJhZCB2YWx1ZSBzZXR1cCBmcm9tIHByb3RvY29sIGRyaXZlciBhcmUgc2ltcGx5IG5vdAogICAgYXBwbGllZCBhbmQgbm90aWZpZWQgdG8gdGhlIGNhbGxpbmcgZHJpdmVyLiAqLwpAQCAtMTE3NCw2ICsxMTc3LDEyIEBACiAJdTMyIHRtcDsKIAlpbnQgc3RhdHVzID0gMDsKIAorCWlmIChzcGktPm1vZGUgJiB+TU9ERUJJVFMpIHsKKwkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXR1cDogdW5zdXBwb3J0ZWQgbW9kZSBiaXRzICV4XG4iLAorCQkJc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogR2V0IGNvbnRyb2xsZXIgZGF0YSAqLwogCWNoaXBfaW5mbyA9IHNwaS0+Y29udHJvbGxlcl9kYXRhOwogCkBAIC0xMjQ1LDIxICsxMjU0LDYgQEAKIAogCS8qIFNQSSBtb2RlICovCiAJdG1wID0gc3BpLT5tb2RlOwotCWlmICh0bXAgJiBTUElfTFNCX0ZJUlNUKSB7Ci0JCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCWlmIChmaXJzdF9zZXR1cCkgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJInNldHVwIC0gIgotCQkJCSJIVyBkb2Vzbid0IHN1cHBvcnQgTFNCIGZpcnN0IHRyYW5zZmVyXG4iKTsKLQkJCWdvdG8gZXJyX2ZpcnN0X3NldHVwOwotCQl9IGVsc2UgewotCQkJZGV2X2Vycigmc3BpLT5kZXYsCi0JCQkJInNldHVwIC0gIgotCQkJCSJIVyBkb2Vzbid0IHN1cHBvcnQgTFNCIGZpcnN0IHRyYW5zZmVyLCAiCi0JCQkJImRlZmF1bHQgdG8gTVNCIGZpcnN0XG4iKTsKLQkJCXNwaS0+bW9kZSAmPSB+U1BJX0xTQl9GSVJTVDsKLQkJfQotCX0KIAlpZiAodG1wICYgU1BJX0NTX0hJR0gpIHsKIAkJdTMyX0VESVQoY2hpcC0+Y29udHJvbCwKIAkJCQlTUElfQ09OVFJPTF9TU1BPTCwgU1BJX0NPTlRST0xfU1NQT0xfQUNUX0hJR0gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpX2xtNzBsbHAuYyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhNjhhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaV9sbTcwbGxwLmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBzcGlfbG03MGxscC5jIC0gZHJpdmVyIGZvciBsbTcwbGxwIGV2YWwgYm9hcmQgZm9yIHRoZSBMTTcwIHNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKworI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworCisvKgorICogVGhlIExNNzAgY29tbXVuaWNhdGVzIHdpdGggYSBob3N0IHByb2Nlc3NvciB1c2luZyBhIDMtd2lyZSB2YXJpYW50IG9mCisgKiB0aGUgU1BJL01pY3Jvd2lyZSBidXMgaW50ZXJmYWNlLiBUaGlzIGRyaXZlciBzcGVjaWZpY2FsbHkgc3VwcG9ydHMgYW4KKyAqIE5TIExNNzAgTExQIEV2YWx1YXRpb24gQm9hcmQsIGludGVyZmFjaW5nIHRvIGEgUEMgdXNpbmcgaXRzIHBhcmFsbGVsCisgKiBwb3J0IHRvIGJpdGJhbmcgYW4gU1BJLXBhcnBvcnQgYnJpZGdlLiAgQWNjb3JkaW5nbHksIHRoaXMgaXMgYW4gU1BJCisgKiBtYXN0ZXIgY29udHJvbGxlciBkcml2ZXIuICBUaGUgaHdtb24vbG03MCBkcml2ZXIgaXMgYSAiU1BJIHByb3RvY29sCisgKiBkcml2ZXIiLCBsYXllcmVkIG9uIHRvcCBvZiB0aGlzIG9uZSBhbmQgdXNhYmxlIHdpdGhvdXQgdGhlIGxtNzBsbHAuCisgKgorICogVGhlIExNNzAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3I7IGl0cworICogZGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKKyAqCisgKiBBbHNvIHNlZSBEb2N1bWVudGF0aW9uL3NwaS9zcGktbG03MGxscC4gIFRoZSBTUEk8LT5wYXJwb3J0IGNvZGUgaGVyZSBpcworICogKGhlYXZpbHkpIGJhc2VkIG9uIHNwaS1idXR0ZXJmbHkgYnkgRGF2aWQgQnJvd25lbGwuCisgKgorICogVGhlIExNNzAgTExQIGNvbm5lY3RzIHRvIHRoZSBQQyBwYXJhbGxlbCBwb3J0IGluIHRoZSBmb2xsb3dpbmcgbWFubmVyOgorICoKKyAqICAgUGFyYWxsZWwgICAgICAgICAgICAgICAgIExNNzAgTExQCisgKiAgICAgUG9ydCAgICAgIERpcmVjdGlvbiAgIEpQMiBIZWFkZXIKKyAqICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0KKyAqICAgICAgRDAgICAgMiAgICAgIC0gICAgICAgICAtCisgKiAgICAgIEQxICAgIDMgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBEMiAgICA0ICAgICAtLT4gICAgICBWKyAgIDUKKyAqICAgICAgRDMgICAgNSAgICAgLS0+ICAgICAgVisgICA1CisgKiAgICAgIEQ0ICAgIDYgICAgIC0tPiAgICAgIFYrICAgNQorICogICAgICBENSAgICA3ICAgICAtLT4gICAgICBuQ1MgIDgKKyAqICAgICAgRDYgICAgOCAgICAgLS0+ICAgICAgU0NMSyAzCisgKiAgICAgIEQ3ICAgIDkgICAgIC0tPiAgICAgIFNJL08gNQorICogICAgIEdORCAgIDI1ICAgICAgLSAgICAgICBHTkQgIDcKKyAqICAgIFNlbGVjdCAxMyAgICAgPC0tICAgICAgU0kvTyAxCisgKgorICogTm90ZSB0aGF0IHBhcnBvcnQgcGluIDEzIGFjdHVhbGx5IGdldHMgaW52ZXJ0ZWQgYnkgdGhlIHRyYW5zaXN0b3IKKyAqIGFycmFuZ2VtZW50IHdoaWNoIGxldHMgZWl0aGVyIHRoZSBwYXJwb3J0IG9yIHRoZSBMTTcwIGRyaXZlIHRoZQorICogU0kvU08gc2lnbmFsLgorICovCisKKyNkZWZpbmUgRFJWTkFNRQkJInNwaS1sbTcwbGxwIgorCisjZGVmaW5lIGxtNzBfSU5JVAkweEJFCisjZGVmaW5lIFNJTwkJMHgxMAorI2RlZmluZSBuQ1MJCTB4MjAKKyNkZWZpbmUgU0NMSwkJMHg0MAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdHJ1Y3Qgc3BpX2xtNzBsbHAgeworCXN0cnVjdCBzcGlfYml0YmFuZwliaXRiYW5nOworCXN0cnVjdCBwYXJwb3J0CQkqcG9ydDsKKwlzdHJ1Y3QgcGFyZGV2aWNlCSpwZDsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkqc3BpZGV2X2xtNzA7CisJc3RydWN0IHNwaV9ib2FyZF9pbmZvCWluZm87CisJc3RydWN0IGNsYXNzX2RldmljZQkqY2RldjsKK307CisKKy8qIFJFVklTSVQgOiB1Z2x5IGdsb2JhbCA7IHByb3ZpZGVzICJleGNsdXNpdmUgb3BlbiIgZmFjaWxpdHkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3BpX2xtNzBsbHAgKmxtNzBsbHA7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnNwaWRldl90b19wcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBzcGktPmNvbnRyb2xsZXJfZGF0YTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExNNzAgTExQIGV2YWwgYm9hcmQtc3BlY2lmaWMgaW5saW5lcyBmb2xsb3cgKi8KKworLyogTk9URTogIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gcmVyZWFkIHRoZSBvdXRwdXQgdmFsdWVzLCBzaW5jZSB0aGV5J2xsCisgKiBzdGlsbCBiZSB3aGF0IHdlIHdyb3RlIGJlZm9yZS4gIFBsdXMsIGdvaW5nIHRocm91Z2ggcGFycG9ydCBidWlsZHMgaW4KKyAqIGEgfjFtcy9vcGVyYXRpb24gZGVsYXk7IHRoZXNlIFNQSSB0cmFuc2ZlcnMgY291bGQgZWFzaWx5IGJlIGZhc3Rlci4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhc3NlcnRDUyhzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwKQoreworCXU4IGRhdGEgPSBwYXJwb3J0X3JlYWRfZGF0YShwcC0+cG9ydCk7CisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCBkYXRhIHwgbkNTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFzc2VydENTKHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgJiB+bkNTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsa0hpZ2goc3RydWN0IHNwaV9sbTcwbGxwICpwcCkKK3sKKwl1OCBkYXRhID0gcGFycG9ydF9yZWFkX2RhdGEocHAtPnBvcnQpOworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgZGF0YSB8IFNDTEspOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xrTG93KHN0cnVjdCBzcGlfbG03MGxscCAqcHApCit7CisJdTggZGF0YSA9IHBhcnBvcnRfcmVhZF9kYXRhKHBwLT5wb3J0KTsKKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGRhdGEgJiB+U0NMSyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEktTE03MC1zcGVjaWZpYyBpbmxpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpZGVsYXkodW5zaWduZWQgZCkKK3sKKwl1ZGVsYXkoZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRzY2soc3RydWN0IHNwaV9kZXZpY2UgKnMsIGludCBpc19vbikKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwID0gc3BpZGV2X3RvX3BwKHMpOworCisJaWYgKGlzX29uKQorCQljbGtIaWdoKHBwKTsKKwllbHNlCisJCWNsa0xvdyhwcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRtb3NpKHN0cnVjdCBzcGlfZGV2aWNlICpzLCBpbnQgaXNfb24pCit7CisJLyogRklYTUUgdXBkYXRlIEQ3IC4uLiB0aGlzIHdheSB3ZSBjYW4gcHV0IHRoZSBjaGlwCisJICogaW50byBzaHV0ZG93biBtb2RlIGFuZCByZWFkIHRoZSBtYW51ZmFjdHVyZXIgSUQsCisJICogYnV0IHdlIGNhbid0IHB1dCBpdCBiYWNrIGludG8gb3BlcmF0aW9uYWwgbW9kZS4KKwkgKi8KK30KKworLyoKKyAqIGdldG1pc286CisgKiBXaHkgZG8gd2UgcmV0dXJuIDAgd2hlbiB0aGUgU0lPIGxpbmUgaXMgaGlnaCBhbmQgdmljZS12ZXJzYT8KKyAqIFRoZSBmYWN0IGlzLCB0aGUgbG03MCBldmFsIGJvYXJkIGZyb20gTlMgKHdoaWNoIHRoaXMgZHJpdmVyIGRyaXZlcyksCisgKiBpcyB3aXJlZCBpbiBqdXN0IHN1Y2ggYSB3YXkgOiB3aGVuIHRoZSBsbTcwJ3MgU0lPIGdvZXMgaGlnaCwgYSB0cmFuc2lzdG9yCisgKiBzd2l0Y2hlcyBpdCB0byBsb3cgcmVmbGVjdGluZyB0aGlzIG9uIHRoZSBwYXJwb3J0IChwaW4gMTMpLCBhbmQgdmljZS12ZXJzYS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0bWlzbyhzdHJ1Y3Qgc3BpX2RldmljZSAqcykKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwID0gc3BpZGV2X3RvX3BwKHMpOworCXJldHVybiAoKFNJTyA9PSAocGFycG9ydF9yZWFkX3N0YXR1cyhwcC0+cG9ydCkgJiBTSU8pKSA/IDAgOiAxICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBFWFBBTkRfQklUQkFOR19UWFJYIDEKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKworc3RhdGljIHZvaWQgbG03MF9jaGlwc2VsZWN0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc3BpX2xtNzBsbHAgKnBwID0gc3BpZGV2X3RvX3BwKHNwaSk7CisKKwlpZiAodmFsdWUpCisJCWFzc2VydENTKHBwKTsKKwllbHNlCisJCWRlYXNzZXJ0Q1MocHApOworfQorCisvKgorICogT3VyIGFjdHVhbCBiaXRiYW5nZXIgcm91dGluZS4KKyAqLworc3RhdGljIHUzMiBsbTcwX3R4cngoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgbnNlY3MsIHUzMiB3b3JkLCB1OCBiaXRzKQoreworCXN0YXRpYyB1MzIgc2lvPTA7CisJc3RhdGljIGludCBmaXJzdF90aW1lPTE7CisKKwkvKiBGaXJzdCB0aW1lOiBwZXJmb3JtIFNQSSBiaXRiYW5nIGFuZCByZXR1cm4gdGhlIExTQiBvZgorCSAqIHRoZSByZXN1bHQgb2YgdGhlIFNQSSBjYWxsLgorCSAqLworCWlmIChmaXJzdF90aW1lKSB7CisJCXNpbyA9IGJpdGJhbmdfdHhyeF9iZV9jcGhhMChzcGksIG5zZWNzLCAwLCB3b3JkLCBiaXRzKTsKKwkJZmlyc3RfdGltZT0wOworCQlyZXR1cm4gKHNpbyAmIDB4MDBmZik7CisJfQorCS8qIFJldHVybiB0aGUgTVNCIG9mIHRoZSByZXN1bHQgb2YgdGhlIFNQSSBjYWxsICovCisJZWxzZSB7CisJCWZpcnN0X3RpbWU9MTsKKwkJcmV0dXJuIChzaW8gPj4gOCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9hdHRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHBhcmRldmljZQkqcGQ7CisJc3RydWN0IHNwaV9sbTcwbGxwCSpwcDsKKwlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOworCWludAkJCXN0YXR1czsKKworCWlmIChsbTcwbGxwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogc3BpX2xtNzBsbHAgaW5zdGFuY2UgYWxyZWFkeSBsb2FkZWQuIEFib3J0aW5nLlxuIiwKKwkJCURSVk5BTUUpOworCQlyZXR1cm47CisJfQorCisJLyogVE9ETzogIHRoaXMganVzdCBfYXNzdW1lc18gYSBsbTcwIGlzIHRoZXJlIC4uLiBubyBwcm9iZTsKKwkgKiB0aGUgbG03MCBkcml2ZXIgY291bGQgdmVyaWZ5IGl0LCByZWFkaW5nIHRoZSBtYW5mIElELgorCSAqLworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihwLT5waHlzcG9ydC0+ZGV2LCBzaXplb2YgKnBwKTsKKwlpZiAoIW1hc3RlcikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsOworCX0KKwlwcCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCW1hc3Rlci0+YnVzX251bSA9IC0xOwkvKiBkeW5hbWljIGFsbG9jIG9mIGEgYnVzIG51bWJlciAqLworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAxOworCisJLyoKKwkgKiBTUEkgYW5kIGJpdGJhbmcgaG9va3VwLgorCSAqLworCXBwLT5iaXRiYW5nLm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KG1hc3Rlcik7CisJcHAtPmJpdGJhbmcuY2hpcHNlbGVjdCA9IGxtNzBfY2hpcHNlbGVjdDsKKwlwcC0+Yml0YmFuZy50eHJ4X3dvcmRbU1BJX01PREVfMF0gPSBsbTcwX3R4cng7CisJcHAtPmJpdGJhbmcuZmxhZ3MgPSBTUElfM1dJUkU7CisKKwkvKgorCSAqIFBhcnBvcnQgaG9va3VwCisJICovCisJcHAtPnBvcnQgPSBwOworCXBkID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocCwgRFJWTkFNRSwKKwkJCU5VTEwsIE5VTEwsIE5VTEwsCisJCQlQQVJQT1JUX0ZMQUdfRVhDTCwgcHApOworCWlmICghcGQpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9tYXN0ZXI7CisJfQorCXBwLT5wZCA9IHBkOworCisJc3RhdHVzID0gcGFycG9ydF9jbGFpbShwZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X3BhcnBvcnRfdW5yZWc7CisKKwkvKgorCSAqIFN0YXJ0IFNQSSAuLi4KKwkgKi8KKwlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdGFydCgmcHAtPmJpdGJhbmcpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogc3BpX2JpdGJhbmdfc3RhcnQgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLAorCQkJRFJWTkFNRSwgc3RhdHVzKTsKKwkJZ290byBvdXRfb2ZmX2FuZF9yZWxlYXNlOworCX0KKworCS8qCisJICogVGhlIG1vZGFsaWFzIG5hbWUgTVVTVCBtYXRjaCB0aGUgZGV2aWNlX2RyaXZlciBuYW1lCisJICogZm9yIHRoZSBidXMgZ2x1ZSBjb2RlIHRvIG1hdGNoIGFuZCBzdWJzZXF1ZW50bHkgYmluZCB0aGVtLgorCSAqIFdlIGFyZSBiaW5kaW5nIHRvIHRoZSBnZW5lcmljIGRyaXZlcnMvaHdtb24vbG03MC5jIGRldmljZQorCSAqIGRyaXZlci4KKwkgKi8KKwlzdHJjcHkocHAtPmluZm8ubW9kYWxpYXMsICJsbTcwIik7CisJcHAtPmluZm8ubWF4X3NwZWVkX2h6ID0gNiAqIDEwMDAgKiAxMDAwOworCXBwLT5pbmZvLmNoaXBfc2VsZWN0ID0gMDsKKwlwcC0+aW5mby5tb2RlID0gU1BJXzNXSVJFIHwgU1BJX01PREVfMDsKKworCS8qIHBvd2VyIHVwIHRoZSBjaGlwLCBhbmQgbGV0IHRoZSBMTTcwIGNvbnRyb2wgU0kvU08gKi8KKwlwYXJwb3J0X3dyaXRlX2RhdGEocHAtPnBvcnQsIGxtNzBfSU5JVCk7CisKKwkvKiBFbmFibGUgYWNjZXNzIHRvIG91ciBwcmltYXJ5IGRhdGEgc3RydWN0dXJlIHZpYQorCSAqIHRoZSBib2FyZCBpbmZvJ3MgKHZvaWQgKiljb250cm9sbGVyX2RhdGEuCisJICovCisJcHAtPmluZm8uY29udHJvbGxlcl9kYXRhID0gcHA7CisJcHAtPnNwaWRldl9sbTcwID0gc3BpX25ld19kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLCAmcHAtPmluZm8pOworCWlmIChwcC0+c3BpZGV2X2xtNzApCisJCWRldl9kYmcoJnBwLT5zcGlkZXZfbG03MC0+ZGV2LCAic3BpZGV2X2xtNzAgYXQgJXNcbiIsCisJCQkJcHAtPnNwaWRldl9sbTcwLT5kZXYuYnVzX2lkKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNwaV9uZXdfZGV2aWNlIGZhaWxlZFxuIiwgRFJWTkFNRSk7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2JpdGJhbmdfc3RvcDsKKwl9CisJcHAtPnNwaWRldl9sbTcwLT5iaXRzX3Blcl93b3JkID0gMTY7CisKKwlsbTcwbGxwID0gcHA7CisKKwlyZXR1cm47CisKK291dF9iaXRiYW5nX3N0b3A6CisJc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOworb3V0X29mZl9hbmRfcmVsZWFzZToKKwkvKiBwb3dlciBkb3duICovCisJcGFycG9ydF93cml0ZV9kYXRhKHBwLT5wb3J0LCAwKTsKKwltZGVsYXkoMTApOworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworb3V0X3BhcnBvcnRfdW5yZWc6CisJcGFycG9ydF91bnJlZ2lzdGVyX2RldmljZShwZCk7CitvdXRfZnJlZV9tYXN0ZXI6CisJKHZvaWQpIHNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CitvdXRfZmFpbDoKKwlwcl9pbmZvKCIlczogc3BpX2xtNzBsbHAgcHJvYmUgZmFpbCwgc3RhdHVzICVkXG4iLCBEUlZOQU1FLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBzcGlfbG03MGxscF9kZXRhY2goc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IHNwaV9sbTcwbGxwCQkqcHA7CisKKwlpZiAoIWxtNzBsbHAgfHwgbG03MGxscC0+cG9ydCAhPSBwKQorCQlyZXR1cm47CisKKwlwcCA9IGxtNzBsbHA7CisJc3BpX2JpdGJhbmdfc3RvcCgmcHAtPmJpdGJhbmcpOworCisJLyogcG93ZXIgZG93biAqLworCXBhcnBvcnRfd3JpdGVfZGF0YShwcC0+cG9ydCwgMCk7CisJbXNsZWVwKDEwKTsKKworCXBhcnBvcnRfcmVsZWFzZShwcC0+cGQpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UocHAtPnBkKTsKKworCSh2b2lkKSBzcGlfbWFzdGVyX3B1dChwcC0+Yml0YmFuZy5tYXN0ZXIpOworCisJbG03MGxscCA9IE5VTEw7Cit9CisKKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBzcGlfbG03MGxscF9kcnYgPSB7CisJLm5hbWUgPQkJRFJWTkFNRSwKKwkuYXR0YWNoID0Jc3BpX2xtNzBsbHBfYXR0YWNoLAorCS5kZXRhY2ggPQlzcGlfbG03MGxscF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NwaV9sbTcwbGxwKHZvaWQpCit7CisJcmV0dXJuIHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyKCZzcGlfbG03MGxscF9kcnYpOworfQorbW9kdWxlX2luaXQoaW5pdF9zcGlfbG03MGxscCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3NwaV9sbTcwbGxwKHZvaWQpCit7CisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmc3BpX2xtNzBsbHBfZHJ2KTsKK30KK21vZHVsZV9leGl0KGNsZWFudXBfc3BpX2xtNzBsbHApOworCitNT0RVTEVfQVVUSE9SKCJLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigKKwkiUGFycG9ydCBhZGFwdGVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTcwIExMUCBldmFsIGJvYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfbXBjODN4eC5jIGIvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYwppbmRleCBlOTc5OGJmLi4zMjk1Y2ZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpX21wYzgzeHguYworKysgYi9kcml2ZXJzL3NwaS9zcGlfbXBjODN4eC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjZGVmaW5lCVNQTU9ERV9FTkFCTEUJCSgxIDw8IDI0KQogI2RlZmluZQlTUE1PREVfTEVOKHgpCQkoKHgpIDw8IDIwKQogI2RlZmluZQlTUE1PREVfUE0oeCkJCSgoeCkgPDwgMTYpCisjZGVmaW5lCVNQTU9ERV9PUAkJKDEgPDwgMTQpCiAKIC8qCiAgKiBEZWZhdWx0IGZvciBTUEkgTW9kZToKQEAgLTg1LDYgKzg2LDExIEBACiAJdW5zaWduZWQgbnNlY3M7CQkvKiAoY2xvY2sgY3ljbGUgdGltZSkvMiAqLwogCiAJdTMyIHN5c2NsazsKKwl1MzIgcnhfc2hpZnQ7CQkvKiBSWCBkYXRhIHJlZyBzaGlmdCB3aGVuIGluIHFlIG1vZGUgKi8KKwl1MzIgdHhfc2hpZnQ7CQkvKiBUWCBkYXRhIHJlZyBzaGlmdCB3aGVuIGluIHFlIG1vZGUgKi8KKworCWJvb2wgcWVfbW9kZTsKKwogCXZvaWQgKCphY3RpdmF0ZV9jcykgKHU4IGNzLCB1OCBwb2xhcml0eSk7CiAJdm9pZCAoKmRlYWN0aXZhdGVfY3MpICh1OCBjcywgdTggcG9sYXJpdHkpOwogfTsKQEAgLTEwMyw3ICsxMDksNyBAQAogdm9pZCBtcGM4M3h4X3NwaV9yeF9idWZfIyN0eXBlKHUzMiBkYXRhLCBzdHJ1Y3QgbXBjODN4eF9zcGkgKm1wYzgzeHhfc3BpKSBcCiB7CQkJCQkJCQkJICBcCiAJdHlwZSAqIHJ4ID0gbXBjODN4eF9zcGktPnJ4OwkJCQkJICBcCi0JKnJ4KysgPSAodHlwZSlkYXRhOwkJCQkJCSAgXAorCSpyeCsrID0gKHR5cGUpKGRhdGEgPj4gbXBjODN4eF9zcGktPnJ4X3NoaWZ0KTsJCQkgIFwKIAltcGM4M3h4X3NwaS0+cnggPSByeDsJCQkJCQkgIFwKIH0KIApAQCAtMTE0LDcgKzEyMCw3IEBACiAJY29uc3QgdHlwZSAqIHR4ID0gbXBjODN4eF9zcGktPnR4OwkJCVwKIAlpZiAoIXR4KQkJCQkJCVwKIAkJcmV0dXJuIDA7CQkJCQlcCi0JZGF0YSA9ICp0eCsrOwkJCQkJCVwKKwlkYXRhID0gKnR4KysgPDwgbXBjODN4eF9zcGktPnR4X3NoaWZ0OwkJCVwKIAltcGM4M3h4X3NwaS0+dHggPSB0eDsJCQkJCVwKIAlyZXR1cm4gZGF0YTsJCQkJCQlcCiB9CkBAIC0xNTgsNiArMTY0LDEyIEBACiAKIAkJaWYgKChtcGM4M3h4X3NwaS0+c3lzY2xrIC8gc3BpLT5tYXhfc3BlZWRfaHopID49IDY0KSB7CiAJCQl1OCBwbSA9IG1wYzgzeHhfc3BpLT5zeXNjbGsgLyAoc3BpLT5tYXhfc3BlZWRfaHogKiA2NCk7CisJCQlpZiAocG0gPiAweDBmKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVBDODN4eCBTUEk6IFNQSUNMSyBjYW4ndCBiZSBsZXNzIHRoZW4gYSBTWVNDTEsvMTAyNCFcbiIKKwkJCQkJCSJSZXF1ZXN0ZWQgU1BJQ0xLIGlzICVkIEh6LiBXaWxsIHVzZSAlZCBIeiBpbnN0ZWFkLlxuIiwKKwkJCQkJCXNwaS0+bWF4X3NwZWVkX2h6LCBtcGM4M3h4X3NwaS0+c3lzY2xrIC8gMTAyNCk7CisJCQkJcG0gPSAweDBmOworCQkJfQogCQkJcmVndmFsIHw9IFNQTU9ERV9QTShwbSkgfCBTUE1PREVfRElWMTY7CiAJCX0gZWxzZSB7CiAJCQl1OCBwbSA9IG1wYzgzeHhfc3BpLT5zeXNjbGsgLyAoc3BpLT5tYXhfc3BlZWRfaHogKiA0KTsKQEAgLTE5NywxMiArMjA5LDIyIEBACiAJICAgIHx8ICgoYml0c19wZXJfd29yZCA+IDE2KSAmJiAoYml0c19wZXJfd29yZCAhPSAzMikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW1wYzgzeHhfc3BpLT5yeF9zaGlmdCA9IDA7CisJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMDsKIAlpZiAoYml0c19wZXJfd29yZCA8PSA4KSB7CiAJCW1wYzgzeHhfc3BpLT5nZXRfcnggPSBtcGM4M3h4X3NwaV9yeF9idWZfdTg7CiAJCW1wYzgzeHhfc3BpLT5nZXRfdHggPSBtcGM4M3h4X3NwaV90eF9idWZfdTg7CisJCWlmIChtcGM4M3h4X3NwaS0+cWVfbW9kZSkgeworCQkJbXBjODN4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7CisJCQltcGM4M3h4X3NwaS0+dHhfc2hpZnQgPSAyNDsKKwkJfQogCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCA8PSAxNikgewogCQltcGM4M3h4X3NwaS0+Z2V0X3J4ID0gbXBjODN4eF9zcGlfcnhfYnVmX3UxNjsKIAkJbXBjODN4eF9zcGktPmdldF90eCA9IG1wYzgzeHhfc3BpX3R4X2J1Zl91MTY7CisJCWlmIChtcGM4M3h4X3NwaS0+cWVfbW9kZSkgeworCQkJbXBjODN4eF9zcGktPnJ4X3NoaWZ0ID0gMTY7CisJCQltcGM4M3h4X3NwaS0+dHhfc2hpZnQgPSAxNjsKKwkJfQogCX0gZWxzZSBpZiAoYml0c19wZXJfd29yZCA8PSAzMikgewogCQltcGM4M3h4X3NwaS0+Z2V0X3J4ID0gbXBjODN4eF9zcGlfcnhfYnVmX3UzMjsKIAkJbXBjODN4eF9zcGktPmdldF90eCA9IG1wYzgzeHhfc3BpX3R4X2J1Zl91MzI7CkBAIC0yMzIsMTIgKzI1NCwyMSBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGUgc3BpLT5tb2RlIGJpdHMgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSCkKKwogc3RhdGljIGludCBtcGM4M3h4X3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBzcGlfYml0YmFuZyAqYml0YmFuZzsKIAlzdHJ1Y3QgbXBjODN4eF9zcGkgKm1wYzgzeHhfc3BpOwogCWludCByZXR2YWw7CiAKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICghc3BpLT5tYXhfc3BlZWRfaHopCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0zNzEsNyArNDAyLDYgQEAKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBmcmVlX21hc3RlcjsKIAl9Ci0KIAltcGM4M3h4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAltcGM4M3h4X3NwaS0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOwogCW1wYzgzeHhfc3BpLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSBtcGM4M3h4X3NwaV9jaGlwc2VsZWN0OwpAQCAtMzgwLDkgKzQxMCwxNyBAQAogCW1wYzgzeHhfc3BpLT5zeXNjbGsgPSBwZGF0YS0+c3lzY2xrOwogCW1wYzgzeHhfc3BpLT5hY3RpdmF0ZV9jcyA9IHBkYXRhLT5hY3RpdmF0ZV9jczsKIAltcGM4M3h4X3NwaS0+ZGVhY3RpdmF0ZV9jcyA9IHBkYXRhLT5kZWFjdGl2YXRlX2NzOworCW1wYzgzeHhfc3BpLT5xZV9tb2RlID0gcGRhdGEtPnFlX21vZGU7CiAJbXBjODN4eF9zcGktPmdldF9yeCA9IG1wYzgzeHhfc3BpX3J4X2J1Zl91ODsKIAltcGM4M3h4X3NwaS0+Z2V0X3R4ID0gbXBjODN4eF9zcGlfdHhfYnVmX3U4OwogCisJbXBjODN4eF9zcGktPnJ4X3NoaWZ0ID0gMDsKKwltcGM4M3h4X3NwaS0+dHhfc2hpZnQgPSAwOworCWlmIChtcGM4M3h4X3NwaS0+cWVfbW9kZSkgeworCQltcGM4M3h4X3NwaS0+cnhfc2hpZnQgPSAxNjsKKwkJbXBjODN4eF9zcGktPnR4X3NoaWZ0ID0gMjQ7CisJfQorCiAJbXBjODN4eF9zcGktPmJpdGJhbmcubWFzdGVyLT5zZXR1cCA9IG1wYzgzeHhfc3BpX3NldHVwOwogCWluaXRfY29tcGxldGlvbigmbXBjODN4eF9zcGktPmRvbmUpOwogCkBAIC00MTcsNiArNDU1LDkgQEAKIAogCS8qIEVuYWJsZSBTUEkgaW50ZXJmYWNlICovCiAJcmVndmFsID0gcGRhdGEtPmluaXRpYWxfc3Btb2RlIHwgU1BNT0RFX0lOSVRfVkFMIHwgU1BNT0RFX0VOQUJMRTsKKwlpZiAocGRhdGEtPnFlX21vZGUpCisJCXJlZ3ZhbCB8PSBTUE1PREVfT1A7CisKIAltcGM4M3h4X3NwaV93cml0ZV9yZWcoJm1wYzgzeHhfc3BpLT5iYXNlLT5tb2RlLCByZWd2YWwpOwogCiAJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJm1wYzgzeHhfc3BpLT5iaXRiYW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMgYi9kcml2ZXJzL3NwaS9zcGlfczNjMjR4eC5jCmluZGV4IGQ1YTcxMGYuLjcwNzFmZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9zM2MyNHh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX3MzYzI0eHguYwpAQCAtMTQ2LDYgKzE0Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIKQorCiBzdGF0aWMgaW50IHMzYzI0eHhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaW50IHJldDsKQEAgLTE1Myw4ICsxNTYsMTEgQEAKIAlpZiAoIXNwaS0+Yml0c19wZXJfd29yZCkKIAkJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKIAotCWlmICgoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgIT0gMCkKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0dXA6IHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCXNwaS0+bW9kZSAmIH5NT0RFQklUUyk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IHMzYzI0eHhfc3BpX3NldHVweGZlcihzcGksIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlfdHh4OS5jIGIvZHJpdmVycy9zcGkvc3BpX3R4eDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGU5ODFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpX3R4eDkuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIHNwaV90eHg5LmMgLSBUWHg5IFNQSSBjb250cm9sbGVyIGRyaXZlci4KKyAqCisgKiBCYXNlZCBvbiBsaW51eC9hcmNoL21pcHMvdHg0OTM4L3Rvc2hpYmFfcmJ0eDQ5Mzgvc3BpX3R4eDkuYworICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbgorICoKKyAqIDIwMDMtMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKiBTdXBwb3J0IGZvciBUWDQ5MzggaW4gMi42IC0gTWFuaXNoIExhY2h3YW5pIChtbGFjaHdhbmlAbXZpc3RhLmNvbSkKKyAqCisgKiBDb252ZXJ0IHRvIGdlbmVyaWMgU1BJIGZyYW1ld29yayAtIEF0c3VzaGkgTmVtb3RvIChhbmVtb0BtYmEub2NuLm5lLmpwKQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisKKworI2RlZmluZSBTUElfRklGT19TSVpFIDQKKworI2RlZmluZSBUWHg5X1NQTUNSCQkweDAwCisjZGVmaW5lIFRYeDlfU1BDUjAJCTB4MDQKKyNkZWZpbmUgVFh4OV9TUENSMQkJMHgwOAorI2RlZmluZSBUWHg5X1NQRlMJCTB4MGMKKyNkZWZpbmUgVFh4OV9TUFNSCQkweDE0CisjZGVmaW5lIFRYeDlfU1BEUgkJMHgxOAorCisvKiBTUE1DUiA6IFNQSSBNYXN0ZXIgQ29udHJvbCAqLworI2RlZmluZSBUWHg5X1NQTUNSX09QTU9ERQkweGMwCisjZGVmaW5lIFRYeDlfU1BNQ1JfQ09ORklHCTB4NDAKKyNkZWZpbmUgVFh4OV9TUE1DUl9BQ1RJVkUJMHg4MAorI2RlZmluZSBUWHg5X1NQTUNSX1NQU1RQCTB4MDIKKyNkZWZpbmUgVFh4OV9TUE1DUl9CQ0xSCQkweDAxCisKKy8qIFNQQ1IwIDogU1BJIENvbnRyb2wgMCAqLworI2RlZmluZSBUWHg5X1NQQ1IwX1RYSUZMX01BU0sJMHhjMDAwCisjZGVmaW5lIFRYeDlfU1BDUjBfUlhJRkxfTUFTSwkweDMwMDAKKyNkZWZpbmUgVFh4OV9TUENSMF9TSURJRQkweDA4MDAKKyNkZWZpbmUgVFh4OV9TUENSMF9TT0VJRQkweDA0MDAKKyNkZWZpbmUgVFh4OV9TUENSMF9SQlNJRQkweDAyMDAKKyNkZWZpbmUgVFh4OV9TUENSMF9UQlNJRQkweDAxMDAKKyNkZWZpbmUgVFh4OV9TUENSMF9JRlNQU0UJMHgwMDEwCisjZGVmaW5lIFRYeDlfU1BDUjBfU0JPUwkJMHgwMDA0CisjZGVmaW5lIFRYeDlfU1BDUjBfU1BIQQkJMHgwMDAyCisjZGVmaW5lIFRYeDlfU1BDUjBfU1BPTAkJMHgwMDAxCisKKy8qIFNQU1IgOiBTUEkgU3RhdHVzICovCisjZGVmaW5lIFRYeDlfU1BTUl9UQlNJCQkweDgwMDAKKyNkZWZpbmUgVFh4OV9TUFNSX1JCU0kJCTB4NDAwMAorI2RlZmluZSBUWHg5X1NQU1JfVEJTX01BU0sJMHgzODAwCisjZGVmaW5lIFRYeDlfU1BTUl9SQlNfTUFTSwkweDA3MDAKKyNkZWZpbmUgVFh4OV9TUFNSX1NQT0UJCTB4MDA4MAorI2RlZmluZSBUWHg5X1NQU1JfSUZTRAkJMHgwMDA4CisjZGVmaW5lIFRYeDlfU1BTUl9TSURMRQkJMHgwMDA0CisjZGVmaW5lIFRYeDlfU1BTUl9TVFJEWQkJMHgwMDAyCisjZGVmaW5lIFRYeDlfU1BTUl9TUlJEWQkJMHgwMDAxCisKKworc3RydWN0IHR4eDlzcGkgeworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp3b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwcm90ZWN0ICdxdWV1ZScgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCXZvaWQgX19pb21lbSAqbWVtYmFzZTsKKwlpbnQgaXJxOworCWludCBiYXNlY2xrOworCXN0cnVjdCBjbGsgKmNsazsKKwl1MzIgbWF4X3NwZWVkX2h6LCBtaW5fc3BlZWRfaHo7CisJaW50IGxhc3RfY2hpcHNlbGVjdDsKKwlpbnQgbGFzdF9jaGlwc2VsZWN0X3ZhbDsKK307CisKK3N0YXRpYyB1MzIgdHh4OXNwaV9yZChzdHJ1Y3QgdHh4OXNwaSAqYywgaW50IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYy0+bWVtYmFzZSArIHJlZyk7Cit9CitzdGF0aWMgdm9pZCB0eHg5c3BpX3dyKHN0cnVjdCB0eHg5c3BpICpjLCB1MzIgdmFsLCBpbnQgcmVnKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGMtPm1lbWJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCB0eHg5c3BpX2NzX2Z1bmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHR4eDlzcGkgKmMsCisJCWludCBvbiwgdW5zaWduZWQgaW50IGNzX2RlbGF5KQoreworCWludCB2YWwgPSAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gb24gOiAhb247CisJaWYgKG9uKSB7CisJCS8qIGRlc2VsZWN0IHRoZSBjaGlwIHdpdGggY3NfY2hhbmdlIGhpbnQgaW4gbGFzdCB0cmFuc2ZlciAqLworCQlpZiAoYy0+bGFzdF9jaGlwc2VsZWN0ID49IDApCisJCQlncGlvX3NldF92YWx1ZShjLT5sYXN0X2NoaXBzZWxlY3QsCisJCQkJCSFjLT5sYXN0X2NoaXBzZWxlY3RfdmFsKTsKKwkJYy0+bGFzdF9jaGlwc2VsZWN0ID0gc3BpLT5jaGlwX3NlbGVjdDsKKwkJYy0+bGFzdF9jaGlwc2VsZWN0X3ZhbCA9IHZhbDsKKwl9IGVsc2UgeworCQljLT5sYXN0X2NoaXBzZWxlY3QgPSAtMTsKKwkJbmRlbGF5KGNzX2RlbGF5KTsJLyogQ1MgSG9sZCBUaW1lICovCisJfQorCWdwaW9fc2V0X3ZhbHVlKHNwaS0+Y2hpcF9zZWxlY3QsIHZhbCk7CisJbmRlbGF5KGNzX2RlbGF5KTsJLyogQ1MgU2V0dXAgVGltZSAvIENTIFJlY292ZXJ5IFRpbWUgKi8KK30KKworLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCisjZGVmaW5lIE1PREVCSVRTCShTUElfQ1NfSElHSHxTUElfQ1BPTHxTUElfQ1BIQSkKKworc3RhdGljIGludCB0eHg5c3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwl1OCBiaXRzX3Blcl93b3JkOworCisJaWYgKHNwaS0+bW9kZSAmIH5NT0RFQklUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNwaS0+bWF4X3NwZWVkX2h6CisJCQl8fCBzcGktPm1heF9zcGVlZF9oeiA+IGMtPm1heF9zcGVlZF9oegorCQkJfHwgc3BpLT5tYXhfc3BlZWRfaHogPCBjLT5taW5fc3BlZWRfaHopCisJCXJldHVybiAtRUlOVkFMOworCisJYml0c19wZXJfd29yZCA9IHNwaS0+Yml0c19wZXJfd29yZCA/IDogODsKKwlpZiAoYml0c19wZXJfd29yZCAhPSA4ICYmIGJpdHNfcGVyX3dvcmQgIT0gMTYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdwaW9fZGlyZWN0aW9uX291dHB1dChzcGktPmNoaXBfc2VsZWN0LAorCQkJIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiQ2Fubm90IHNldHVwIEdQSU8gZm9yIGNoaXBzZWxlY3QuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGVzZWxlY3QgY2hpcCAqLworCXNwaW5fbG9jaygmYy0+bG9jayk7CisJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMCwgKE5TRUNfUEVSX1NFQyAvIDIpIC8gc3BpLT5tYXhfc3BlZWRfaHopOworCXNwaW5fdW5sb2NrKCZjLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdHh4OXNwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB0eHg5c3BpICpjID0gZGV2X2lkOworCisJLyogZGlzYWJsZSByeCBpbnRyICovCisJdHh4OXNwaV93cihjLCB0eHg5c3BpX3JkKGMsIFRYeDlfU1BDUjApICYgflRYeDlfU1BDUjBfUkJTSUUsCisJCQlUWHg5X1NQQ1IwKTsKKwl3YWtlX3VwKCZjLT53YWl0cSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCB0eHg5c3BpX3dvcmtfb25lKHN0cnVjdCB0eHg5c3BpICpjLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG0tPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXVuc2lnbmVkIGludCBjc19kZWxheTsKKwl1bnNpZ25lZCBpbnQgY3NfY2hhbmdlID0gMTsKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIgbWNyOworCXUzMiBwcmV2X3NwZWVkX2h6ID0gMDsKKwl1OCBwcmV2X2JpdHNfcGVyX3dvcmQgPSAwOworCisJLyogQ1Mgc2V0dXAvaG9sZC9yZWNvdmVyeSB0aW1lIGluIG5zZWMgKi8KKwljc19kZWxheSA9IDEwMCArIChOU0VDX1BFUl9TRUMgLyAyKSAvIHNwaS0+bWF4X3NwZWVkX2h6OworCisJbWNyID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQTUNSKTsKKwlpZiAodW5saWtlbHkoKG1jciAmIFRYeDlfU1BNQ1JfT1BNT0RFKSA9PSBUWHg5X1NQTUNSX0FDVElWRSkpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJCYWQgbW9kZS5cbiIpOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIGV4aXQ7CisJfQorCW1jciAmPSB+KFRYeDlfU1BNQ1JfT1BNT0RFIHwgVFh4OV9TUE1DUl9TUFNUUCB8IFRYeDlfU1BNQ1JfQkNMUik7CisKKwkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9DT05GSUcgfCBUWHg5X1NQTUNSX0JDTFIsIFRYeDlfU1BNQ1IpOworCXR4eDlzcGlfd3IoYywgVFh4OV9TUENSMF9TQk9TCisJCQl8ICgoc3BpLT5tb2RlICYgU1BJX0NQT0wpID8gVFh4OV9TUENSMF9TUE9MIDogMCkKKwkJCXwgKChzcGktPm1vZGUgJiBTUElfQ1BIQSkgPyBUWHg5X1NQQ1IwX1NQSEEgOiAwKQorCQkJfCAweDA4LAorCQkJVFh4OV9TUENSMCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisJCWNvbnN0IHZvaWQgKnR4YnVmID0gdC0+dHhfYnVmOworCQl2b2lkICpyeGJ1ZiA9IHQtPnJ4X2J1ZjsKKwkJdTMyIGRhdGE7CisJCXVuc2lnbmVkIGludCBsZW4gPSB0LT5sZW47CisJCXVuc2lnbmVkIGludCB3c2l6ZTsKKwkJdTMyIHNwZWVkX2h6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OworCQl1OCBiaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZCA/IDogc3BpLT5iaXRzX3Blcl93b3JkOworCisJCWJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkID8gOiA4OworCQl3c2l6ZSA9IGJpdHNfcGVyX3dvcmQgPj4gMzsgLyogaW4gYnl0ZXMgKi8KKworCQlpZiAocHJldl9zcGVlZF9oeiAhPSBzcGVlZF9oegorCQkJCXx8IHByZXZfYml0c19wZXJfd29yZCAhPSBiaXRzX3Blcl93b3JkKSB7CisJCQl1MzIgbiA9IChjLT5iYXNlY2xrICsgc3BlZWRfaHogLSAxKSAvIHNwZWVkX2h6OworCQkJaWYgKG4gPCAxKQorCQkJCW4gPSAxOworCQkJZWxzZSBpZiAobiA+IDB4ZmYpCisJCQkJbiA9IDB4ZmY7CisJCQkvKiBlbnRlciBjb25maWcgbW9kZSAqLworCQkJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwKKwkJCQkJVFh4OV9TUE1DUik7CisJCQl0eHg5c3BpX3dyKGMsIChuIDw8IDgpIHwgYml0c19wZXJfd29yZCwgVFh4OV9TUENSMSk7CisJCQkvKiBlbnRlciBhY3RpdmUgbW9kZSAqLworCQkJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0FDVElWRSwgVFh4OV9TUE1DUik7CisKKwkJCXByZXZfc3BlZWRfaHogPSBzcGVlZF9oejsKKwkJCXByZXZfYml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQ7CisJCX0KKworCQlpZiAoY3NfY2hhbmdlKQorCQkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMSwgY3NfZGVsYXkpOworCQljc19jaGFuZ2UgPSB0LT5jc19jaGFuZ2U7CisJCXdoaWxlIChsZW4pIHsKKwkJCXVuc2lnbmVkIGludCBjb3VudCA9IFNQSV9GSUZPX1NJWkU7CisJCQlpbnQgaTsKKwkJCXUzMiBjcjA7CisKKwkJCWlmIChsZW4gPCBjb3VudCAqIHdzaXplKQorCQkJCWNvdW50ID0gbGVuIC8gd3NpemU7CisJCQkvKiBub3cgdHggbXVzdCBiZSBpZGxlLi4uICovCisJCQl3aGlsZSAoISh0eHg5c3BpX3JkKGMsIFRYeDlfU1BTUikgJiBUWHg5X1NQU1JfU0lETEUpKQorCQkJCWNwdV9yZWxheCgpOworCQkJY3IwID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQQ1IwKTsKKwkJCWNyMCAmPSB+VFh4OV9TUENSMF9SWElGTF9NQVNLOworCQkJY3IwIHw9IChjb3VudCAtIDEpIDw8IDEyOworCQkJLyogZW5hYmxlIHJ4IGludHIgKi8KKwkJCWNyMCB8PSBUWHg5X1NQQ1IwX1JCU0lFOworCQkJdHh4OXNwaV93cihjLCBjcjAsIFRYeDlfU1BDUjApOworCQkJLyogc2VuZCAqLworCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCQlpZiAodHhidWYpIHsKKwkJCQkJZGF0YSA9ICh3c2l6ZSA9PSAxKQorCQkJCQkJPyAqKGNvbnN0IHU4ICopdHhidWYKKwkJCQkJCTogKihjb25zdCB1MTYgKil0eGJ1ZjsKKwkJCQkJdHh4OXNwaV93cihjLCBkYXRhLCBUWHg5X1NQRFIpOworCQkJCQl0eGJ1ZiArPSB3c2l6ZTsKKwkJCQl9IGVsc2UKKwkJCQkJdHh4OXNwaV93cihjLCAwLCBUWHg5X1NQRFIpOworCQkJfQorCQkJLyogd2FpdCBhbGwgcnggZGF0YSAqLworCQkJd2FpdF9ldmVudChjLT53YWl0cSwKKwkJCQl0eHg5c3BpX3JkKGMsIFRYeDlfU1BTUikgJiBUWHg5X1NQU1JfUkJTSSk7CisJCQkvKiByZWNlaXZlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJCWRhdGEgPSB0eHg5c3BpX3JkKGMsIFRYeDlfU1BEUik7CisJCQkJaWYgKHJ4YnVmKSB7CisJCQkJCWlmICh3c2l6ZSA9PSAxKQorCQkJCQkJKih1OCAqKXJ4YnVmID0gZGF0YTsKKwkJCQkJZWxzZQorCQkJCQkJKih1MTYgKilyeGJ1ZiA9IGRhdGE7CisJCQkJCXJ4YnVmICs9IHdzaXplOworCQkJCX0KKwkJCX0KKwkJCWxlbiAtPSBjb3VudCAqIHdzaXplOworCQl9CisJCW0tPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOworCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOworCisJCWlmICghY3NfY2hhbmdlKQorCQkJY29udGludWU7CisJCWlmICh0LT50cmFuc2Zlcl9saXN0Lm5leHQgPT0gJm0tPnRyYW5zZmVycykKKwkJCWJyZWFrOworCQkvKiBzb21ldGltZXMgYSBzaG9ydCBtaWQtbWVzc2FnZSBkZXNlbGVjdCBvZiB0aGUgY2hpcAorCQkgKiBtYXkgYmUgbmVlZGVkIHRvIHRlcm1pbmF0ZSBhIG1vZGUgb3IgY29tbWFuZAorCQkgKi8KKwkJdHh4OXNwaV9jc19mdW5jKHNwaSwgYywgMCwgY3NfZGVsYXkpOworCX0KKworZXhpdDoKKwltLT5zdGF0dXMgPSBzdGF0dXM7CisJbS0+Y29tcGxldGUobS0+Y29udGV4dCk7CisKKwkvKiBub3JtYWxseSBkZWFjdGl2YXRlIGNoaXBzZWxlY3QgLi4uIHVubGVzcyBubyBlcnJvciBhbmQKKwkgKiBjc19jaGFuZ2UgaGFzIGhpbnRlZCB0aGF0IHRoZSBuZXh0IG1lc3NhZ2Ugd2lsbCBwcm9iYWJseQorCSAqIGJlIGZvciB0aGlzIGNoaXAgdG9vLgorCSAqLworCWlmICghKHN0YXR1cyA9PSAwICYmIGNzX2NoYW5nZSkpCisJCXR4eDlzcGlfY3NfZnVuYyhzcGksIGMsIDAsIGNzX2RlbGF5KTsKKworCS8qIGVudGVyIGNvbmZpZyBtb2RlICovCisJdHh4OXNwaV93cihjLCBtY3IgfCBUWHg5X1NQTUNSX0NPTkZJRyB8IFRYeDlfU1BNQ1JfQkNMUiwgVFh4OV9TUE1DUik7Cit9CisKK3N0YXRpYyB2b2lkIHR4eDlzcGlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHR4eDlzcGksIHdvcmspOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+bG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+cXVldWUpKSB7CisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbTsKKworCQltID0gY29udGFpbmVyX29mKGMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKKworCQl0eHg5c3BpX3dvcmtfb25lKGMsIG0pOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0eHg5c3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfbWVzc2FnZSAqbSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CisJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbS0+YWN0dWFsX2xlbmd0aCA9IDA7CisKKwkvKiBjaGVjayBlYWNoIHRyYW5zZmVyJ3MgcGFyYW1ldGVycyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJdTMyIHNwZWVkX2h6ID0gdC0+c3BlZWRfaHogPyA6IHNwaS0+bWF4X3NwZWVkX2h6OworCQl1OCBiaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZCA/IDogc3BpLT5iaXRzX3Blcl93b3JkOworCisJCWJpdHNfcGVyX3dvcmQgPSBiaXRzX3Blcl93b3JkID8gOiA4OworCQlpZiAoIXQtPnR4X2J1ZiAmJiAhdC0+cnhfYnVmICYmIHQtPmxlbikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYml0c19wZXJfd29yZCAhPSA4ICYmIGJpdHNfcGVyX3dvcmQgIT0gMTYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHQtPmxlbiAmICgoYml0c19wZXJfd29yZCA+PiAzKSAtIDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzcGVlZF9oeiA8IGMtPm1pbl9zcGVlZF9oeiB8fCBzcGVlZF9oeiA+IGMtPm1heF9zcGVlZF9oeikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZjLT5xdWV1ZSk7CisJcXVldWVfd29yayhjLT53b3JrcXVldWUsICZjLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdHh4OXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgdHh4OXNwaSAqYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKwl1MzIgbWNyOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmZGV2LT5kZXYsIHNpemVvZigqYykpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gcmV0OworCWMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJYy0+aXJxID0gLTE7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBtYXN0ZXIpOworCisJSU5JVF9XT1JLKCZjLT53b3JrLCB0eHg5c3BpX3dvcmspOworCXNwaW5fbG9ja19pbml0KCZjLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+cXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmMtPndhaXRxKTsKKworCWMtPmNsayA9IGNsa19nZXQoJmRldi0+ZGV2LCAic3BpLWJhc2VjbGsiKTsKKwlpZiAoSVNfRVJSKGMtPmNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihjLT5jbGspOworCQljLT5jbGsgPSBOVUxMOworCQlnb3RvIGV4aXQ7CisJfQorCXJldCA9IGNsa19lbmFibGUoYy0+Y2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa19wdXQoYy0+Y2xrKTsKKwkJYy0+Y2xrID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKwljLT5iYXNlY2xrID0gY2xrX2dldF9yYXRlKGMtPmNsayk7CisJYy0+bWluX3NwZWVkX2h6ID0gKGMtPmJhc2VjbGsgKyAweGZmIC0gMSkgLyAweGZmOworCWMtPm1heF9zcGVlZF9oeiA9IGMtPmJhc2VjbGs7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCWdvdG8gZXhpdDsKKwljLT5tZW1iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKKwlpZiAoIWMtPm1lbWJhc2UpCisJCWdvdG8gZXhpdDsKKworCS8qIGVudGVyIGNvbmZpZyBtb2RlICovCisJbWNyID0gdHh4OXNwaV9yZChjLCBUWHg5X1NQTUNSKTsKKwltY3IgJj0gfihUWHg5X1NQTUNSX09QTU9ERSB8IFRYeDlfU1BNQ1JfU1BTVFAgfCBUWHg5X1NQTUNSX0JDTFIpOworCXR4eDlzcGlfd3IoYywgbWNyIHwgVFh4OV9TUE1DUl9DT05GSUcgfCBUWHg5X1NQTUNSX0JDTFIsIFRYeDlfU1BNQ1IpOworCisJYy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCWlmIChjLT5pcnEgPCAwKQorCQlnb3RvIGV4aXQ7CisJcmV0ID0gcmVxdWVzdF9pcnEoYy0+aXJxLCB0eHg5c3BpX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBjKTsKKwlpZiAocmV0KSB7CisJCWMtPmlycSA9IC0xOworCQlnb3RvIGV4aXQ7CisJfQorCisJYy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUobWFzdGVyLT5jZGV2LmRldi0+YnVzX2lkKTsKKwlpZiAoIWMtPndvcmtxdWV1ZSkKKwkJZ290byBleGl0OworCWMtPmxhc3RfY2hpcHNlbGVjdCA9IC0xOworCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiYXQgJSNsbHgsIGlycSAlZCwgJWRNSHpcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsIGMtPmlycSwKKwkJIChjLT5iYXNlY2xrICsgNTAwMDAwKSAvIDEwMDAwMDApOworCisJbWFzdGVyLT5idXNfbnVtID0gZGV2LT5pZDsKKwltYXN0ZXItPnNldHVwID0gdHh4OXNwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyID0gdHh4OXNwaV90cmFuc2ZlcjsKKwltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gKHUxNilVSU5UX01BWDsgLyogYW55IEdQSU8gbnVtYmVycyAqLworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKwlyZXR1cm4gMDsKK2V4aXQ6CisJaWYgKGMtPndvcmtxdWV1ZSkKKwkJZGVzdHJveV93b3JrcXVldWUoYy0+d29ya3F1ZXVlKTsKKwlpZiAoYy0+aXJxID49IDApCisJCWZyZWVfaXJxKGMtPmlycSwgYyk7CisJaWYgKGMtPm1lbWJhc2UpCisJCWlvdW5tYXAoYy0+bWVtYmFzZSk7CisJaWYgKGMtPmNsaykgeworCQljbGtfZGlzYWJsZShjLT5jbGspOworCQljbGtfcHV0KGMtPmNsayk7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCB0eHg5c3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOworCXN0cnVjdCB0eHg5c3BpICpjID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShjLT53b3JrcXVldWUpOworCWZyZWVfaXJxKGMtPmlycSwgYyk7CisJaW91bm1hcChjLT5tZW1iYXNlKTsKKwljbGtfZGlzYWJsZShjLT5jbGspOworCWNsa19wdXQoYy0+Y2xrKTsKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0eHg5c3BpX2RyaXZlciA9IHsKKwkucmVtb3ZlID0gX19leGl0X3AodHh4OXNwaV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInR4eDlzcGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHh4OXNwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmdHh4OXNwaV9kcml2ZXIsIHR4eDlzcGlfcHJvYmUpOworfQorc3Vic3lzX2luaXRjYWxsKHR4eDlzcGlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0eHg5c3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHh4OXNwaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQodHh4OXNwaV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUWHg5IFNQSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaWRldi5jIGIvZHJpdmVycy9zcGkvc3BpZGV2LmMKaW5kZXggZDA0MjQyYS4uMzhiNjBhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpZGV2LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpZGV2LmMKQEAgLTE4MSw3ICsxODEsOCBAQAogCQl9CiAJCWlmICh1X3RtcC0+dHhfYnVmKSB7CiAJCQlrX3RtcC0+dHhfYnVmID0gYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgKGNvbnN0IHU4IF9fdXNlciAqKXVfdG1wLT50eF9idWYsCisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAoY29uc3QgdTggX191c2VyICopCisJCQkJCQkocHRyZGlmZl90KSB1X3RtcC0+dHhfYnVmLAogCQkJCQl1X3RtcC0+bGVuKSkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KQEAgLTIxMyw3ICsyMTQsOCBAQAogCWJ1ZiA9IHNwaWRldi0+YnVmZmVyOwogCWZvciAobiA9IG5feGZlcnMsIHVfdG1wID0gdV94ZmVyczsgbjsgbi0tLCB1X3RtcCsrKSB7CiAJCWlmICh1X3RtcC0+cnhfYnVmKSB7Ci0JCQlpZiAoX19jb3B5X3RvX3VzZXIoKHU4IF9fdXNlciAqKXVfdG1wLT5yeF9idWYsIGJ1ZiwKKwkJCWlmIChfX2NvcHlfdG9fdXNlcigodTggX191c2VyICopCisJCQkJCShwdHJkaWZmX3QpIHVfdG1wLT5yeF9idWYsIGJ1ZiwKIAkJCQkJdV90bXAtPmxlbikpIHsKIAkJCQlzdGF0dXMgPSAtRUZBVUxUOwogCQkJCWdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3RsZTYyeDAuYyBiL2RyaXZlcnMvc3BpL3RsZTYyeDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGE1OGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvdGxlNjJ4MC5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogdGxlNjJ4MC5jIC0tIHN1cHBvcnQgSW5maW5lb24gVExFNjJ4MCBkcml2ZXIgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS90bGU2MngwLmg+CisKKworI2RlZmluZSBDTURfUkVBRAkweDAwCisjZGVmaW5lIENNRF9TRVQJCTB4ZmYKKworI2RlZmluZSBESUFHX05PUk1BTAkweDAzCisjZGVmaW5lIERJQUdfT1ZFUkxPQUQJMHgwMgorI2RlZmluZSBESUFHX09QRU4JMHgwMQorI2RlZmluZSBESUFHX1NIT1JUR05ECTB4MDAKKworc3RydWN0IHRsZTYyeDBfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCSp1czsKKwlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJdW5zaWduZWQgaW50CQlucl9ncGlvOworCXVuc2lnbmVkIGludAkJZ3Bpb19zdGF0ZTsKKworCXVuc2lnbmVkIGNoYXIJCXR4X2J1ZmZbNF07CisJdW5zaWduZWQgY2hhcgkJcnhfYnVmZls0XTsKK307CisKK3N0YXRpYyBpbnQgdG9fZ3Bpb19udW0oc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIpOworCitzdGF0aWMgaW5saW5lIGludCB0bGU2MngwX3dyaXRlKHN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmID0gc3QtPnR4X2J1ZmY7CisJdW5zaWduZWQgaW50IGdwaW9fc3RhdGUgPSBzdC0+Z3Bpb19zdGF0ZTsKKworCWJ1ZmZbMF0gPSBDTURfU0VUOworCisJaWYgKHN0LT5ucl9ncGlvID09IDE2KSB7CisJCWJ1ZmZbMV0gPSBncGlvX3N0YXRlID4+IDg7CisJCWJ1ZmZbMl0gPSBncGlvX3N0YXRlOworCX0gZWxzZSB7CisJCWJ1ZmZbMV0gPSBncGlvX3N0YXRlOworCX0KKworCWRldl9kYmcoJnN0LT51cy0+ZGV2LCAiYnVmZiAlMDJ4LCUwMngsJTAyeFxuIiwKKwkJYnVmZlswXSwgYnVmZlsxXSwgYnVmZlsyXSk7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHN0LT51cywgYnVmZiwgKHN0LT5ucl9ncGlvID09IDE2KSA/IDMgOiAyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGxlNjJ4MF9yZWFkKHN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0eGJ1ZmYgPSBzdC0+dHhfYnVmZjsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXIgPSB7CisJCS50eF9idWYJCT0gdHhidWZmLAorCQkucnhfYnVmCQk9IHN0LT5yeF9idWZmLAorCQkubGVuCQk9IChzdC0+bnJfZ3BpbyAqIDIpIC8gOCwKKwl9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisKKwl0eGJ1ZmZbMF0gPSBDTURfUkVBRDsKKwl0eGJ1ZmZbMV0gPSAweDAwOworCXR4YnVmZlsyXSA9IDB4MDA7CisJdHhidWZmWzNdID0gMHgwMDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJcmV0dXJuIHNwaV9zeW5jKHN0LT51cywgJm1zZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpkZWNvZGVfZmF1bHQodW5zaWduZWQgaW50IGZhdWx0X2NvZGUpCit7CisJZmF1bHRfY29kZSAmPSAzOworCisJc3dpdGNoIChmYXVsdF9jb2RlKSB7CisJY2FzZSBESUFHX05PUk1BTDoKKwkJcmV0dXJuICJOIjsKKwljYXNlIERJQUdfT1ZFUkxPQUQ6CisJCXJldHVybiAiViI7CisJY2FzZSBESUFHX09QRU46CisJCXJldHVybiAiTyI7CisJY2FzZSBESUFHX1NIT1JUR05EOgorCQlyZXR1cm4gIkciOworCX0KKworCXJldHVybiAiPyI7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRsZTYyeDBfc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNoYXIgKmJwID0gYnVmOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmYgPSBzdC0+cnhfYnVmZjsKKwl1bnNpZ25lZCBsb25nIGZhdWx0ID0gMDsKKwlpbnQgcHRyOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJcmV0ID0gdGxlNjJ4MF9yZWFkKHN0KTsKKworCWRldl9kYmcoZGV2LCAidGxlNjJ4MF9yZWFkKCkgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IChzdC0+bnJfZ3BpbyAqIDIpLzg7IHB0ciArPSAxKSB7CisJCWZhdWx0IDw8PSA4OworCQlmYXVsdCAgfD0gKCh1bnNpZ25lZCBsb25nKWJ1ZmZbcHRyXSk7CisKKwkJZGV2X2RiZyhkZXYsICJieXRlICVkIGlzICUwMnhcbiIsIHB0ciwgYnVmZltwdHJdKTsKKwl9CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IHN0LT5ucl9ncGlvOyBwdHIrKykgeworCQlicCArPSBzcHJpbnRmKGJwLCAiJXMgIiwgZGVjb2RlX2ZhdWx0KGZhdWx0ID4+IChwdHIgKiAyKSkpOworCX0KKworCSpicCsrID0gJ1xuJzsKKworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBicCAtIGJ1ZjsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHN0YXR1c19zaG93LCBTX0lSVUdPLCB0bGU2MngwX3N0YXR1c19zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgdGxlNjJ4MF9ncGlvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBncGlvX251bSA9IHRvX2dwaW9fbnVtKGF0dHIpOworCWludCB2YWx1ZTsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwl2YWx1ZSA9IChzdC0+Z3Bpb19zdGF0ZSA+PiBncGlvX251bSkgJiAxOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQiLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRsZTYyeDBfZ3Bpb19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGdwaW9fbnVtID0gdG9fZ3Bpb19udW0oYXR0cik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJY2hhciAqZW5kcDsKKworCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCWlmIChidWYgPT0gZW5kcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKGRldiwgInNldHRpbmcgZ3BpbyAlZCB0byAlbGRcbiIsIGdwaW9fbnVtLCB2YWwpOworCisJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCisJaWYgKHZhbCkKKwkJc3QtPmdwaW9fc3RhdGUgfD0gMSA8PCBncGlvX251bTsKKwllbHNlCisJCXN0LT5ncGlvX3N0YXRlICY9IH4oMSA8PCBncGlvX251bSk7CisKKwl0bGU2MngwX3dyaXRlKHN0KTsKKwltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMSwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMiwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMywgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvNCwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvNSwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvNiwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvNywgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvOCwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvOSwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTAsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzExLCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xMiwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTMsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzE0LCBTX0lXVVNSfFNfSVJVR08sCisJCXRsZTYyeDBfZ3Bpb19zaG93LCB0bGU2MngwX2dwaW9fc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGdwaW8xNSwgU19JV1VTUnxTX0lSVUdPLAorCQl0bGU2MngwX2dwaW9fc2hvdywgdGxlNjJ4MF9ncGlvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMTYsIFNfSVdVU1J8U19JUlVHTywKKwkJdGxlNjJ4MF9ncGlvX3Nob3csIHRsZTYyeDBfZ3Bpb19zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZ3Bpb19hdHRyc1tdID0geworCVswXQkJPSAmZGV2X2F0dHJfZ3BpbzEsCisJWzFdCQk9ICZkZXZfYXR0cl9ncGlvMiwKKwlbMl0JCT0gJmRldl9hdHRyX2dwaW8zLAorCVszXQkJPSAmZGV2X2F0dHJfZ3BpbzQsCisJWzRdCQk9ICZkZXZfYXR0cl9ncGlvNSwKKwlbNV0JCT0gJmRldl9hdHRyX2dwaW82LAorCVs2XQkJPSAmZGV2X2F0dHJfZ3BpbzcsCisJWzddCQk9ICZkZXZfYXR0cl9ncGlvOCwKKwlbOF0JCT0gJmRldl9hdHRyX2dwaW85LAorCVs5XQkJPSAmZGV2X2F0dHJfZ3BpbzEwLAorCVsxMF0JCT0gJmRldl9hdHRyX2dwaW8xMSwKKwlbMTFdCQk9ICZkZXZfYXR0cl9ncGlvMTIsCisJWzEyXQkJPSAmZGV2X2F0dHJfZ3BpbzEzLAorCVsxM10JCT0gJmRldl9hdHRyX2dwaW8xNCwKKwlbMTRdCQk9ICZkZXZfYXR0cl9ncGlvMTUsCisJWzE1XQkJPSAmZGV2X2F0dHJfZ3BpbzE2Cit9OworCitzdGF0aWMgaW50IHRvX2dwaW9fbnVtKHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWludCBwdHI7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoZ3Bpb19hdHRycyk7IHB0cisrKSB7CisJCWlmIChncGlvX2F0dHJzW3B0cl0gPT0gYXR0cikKKwkJCXJldHVybiBwdHI7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0bGU2MngwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHRsZTYyeDBfc3RhdGUgKnN0OworCXN0cnVjdCB0bGU2MngwX3BkYXRhICpwZGF0YTsKKwlpbnQgcHRyOworCWludCByZXQ7CisKKwlwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBkZXZpY2UgZGF0YSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bGU2MngwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0ID09IE5VTEwpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBtZW1vcnkgZm9yIGRldmljZSBzdGF0ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXN0LT51cyA9IHNwaTsKKwlzdC0+bnJfZ3BpbyA9IHBkYXRhLT5ncGlvX2NvdW50OworCXN0LT5ncGlvX3N0YXRlID0gcGRhdGEtPmluaXRfc3RhdGU7CisKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfc3RhdHVzX3Nob3cpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJjYW5ub3QgY3JlYXRlIHN0YXR1cyBhdHRyaWJ1dGVcbiIpOworCQlnb3RvIGVycl9zdGF0dXM7CisJfQorCisJZm9yIChwdHIgPSAwOyBwdHIgPCBwZGF0YS0+Z3Bpb19jb3VudDsgcHRyKyspIHsKKwkJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZzcGktPmRldiwgZ3Bpb19hdHRyc1twdHJdKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJjYW5ub3QgY3JlYXRlIGdwaW8gYXR0cmlidXRlXG4iKTsKKwkJCWdvdG8gZXJyX2dwaW9zOworCQl9CisJfQorCisJLyogdGxlNjJ4MF93cml0ZShzdCk7ICovCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgc3QpOworCXJldHVybiAwOworCisgZXJyX2dwaW9zOgorCWZvciAoOyBwdHIgPiAwOyBwdHItLSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgZ3Bpb19hdHRyc1twdHJdKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl9zdGF0dXNfc2hvdyk7CisKKyBlcnJfc3RhdHVzOgorCWtmcmVlKHN0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0bGU2MngwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0bGU2MngwX3N0YXRlICpzdCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCWludCBwdHI7CisKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IHN0LT5ucl9ncGlvOyBwdHIrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzcGktPmRldiwgZ3Bpb19hdHRyc1twdHJdKTsKKworCWtmcmVlKHN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRsZTYyeDBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInRsZTYyeDAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSB0bGU2MngwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGxlNjJ4MF9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgdGxlNjJ4MF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJnRsZTYyeDBfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHRsZTYyeDBfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmdGxlNjJ4MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bGU2MngwX2luaXQpOworbW9kdWxlX2V4aXQodGxlNjJ4MF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUTEU2MngwIFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYyBiL2RyaXZlcnMvc3BpL3hpbGlueF9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGJmOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkveGlsaW54X3NwaS5jCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogeGlsaW54X3NwaS5jCisgKgorICogWGlsaW54IFNQSSBjb250cm9sbGVyIGRyaXZlciAobWFzdGVyIG1vZGUgb25seSkKKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCXNvdXJjZUBtdmlzdGEuY29tCisgKgorICogMjAwMi0yMDA3IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkCisgKiAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8c3lzbGliL3ZpcnRleF9kZXZpY2VzLmg+CisKKyNkZWZpbmUgWElMSU5YX1NQSV9OQU1FICJ4c3BpIgorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyBhcyBwZXIgIk9QQiBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgKHYxLjAwZSkKKyAqIFByb2R1Y3QgU3BlY2lmaWNhdGlvbiIsIERTNDY0CisgKi8KKyNkZWZpbmUgWFNQSV9DUl9PRkZTRVQJCTB4NjIJLyogMTYtYml0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBYU1BJX0NSX0VOQUJMRQkJMHgwMgorI2RlZmluZSBYU1BJX0NSX01BU1RFUl9NT0RFCTB4MDQKKyNkZWZpbmUgWFNQSV9DUl9DUE9MCQkweDA4CisjZGVmaW5lIFhTUElfQ1JfQ1BIQQkJMHgxMAorI2RlZmluZSBYU1BJX0NSX01PREVfTUFTSwkoWFNQSV9DUl9DUEhBIHwgWFNQSV9DUl9DUE9MKQorI2RlZmluZSBYU1BJX0NSX1RYRklGT19SRVNFVAkweDIwCisjZGVmaW5lIFhTUElfQ1JfUlhGSUZPX1JFU0VUCTB4NDAKKyNkZWZpbmUgWFNQSV9DUl9NQU5VQUxfU1NFTEVDVAkweDgwCisjZGVmaW5lIFhTUElfQ1JfVFJBTlNfSU5ISUJJVAkweDEwMAorCisjZGVmaW5lIFhTUElfU1JfT0ZGU0VUCQkweDY3CS8qIDgtYml0IFN0YXR1cyBSZWdpc3RlciAqLworCisjZGVmaW5lIFhTUElfU1JfUlhfRU1QVFlfTUFTSwkweDAxCS8qIFJlY2VpdmUgRklGTyBpcyBlbXB0eSAqLworI2RlZmluZSBYU1BJX1NSX1JYX0ZVTExfTUFTSwkweDAyCS8qIFJlY2VpdmUgRklGTyBpcyBmdWxsICovCisjZGVmaW5lIFhTUElfU1JfVFhfRU1QVFlfTUFTSwkweDA0CS8qIFRyYW5zbWl0IEZJRk8gaXMgZW1wdHkgKi8KKyNkZWZpbmUgWFNQSV9TUl9UWF9GVUxMX01BU0sJMHgwOAkvKiBUcmFuc21pdCBGSUZPIGlzIGZ1bGwgKi8KKyNkZWZpbmUgWFNQSV9TUl9NT0RFX0ZBVUxUX01BU0sJMHgxMAkvKiBNb2RlIGZhdWx0IGVycm9yICovCisKKyNkZWZpbmUgWFNQSV9UWERfT0ZGU0VUCQkweDZiCS8qIDgtYml0IERhdGEgVHJhbnNtaXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWFNQSV9SWERfT0ZGU0VUCQkweDZmCS8qIDgtYml0IERhdGEgUmVjZWl2ZSBSZWdpc3RlciAqLworCisjZGVmaW5lIFhTUElfU1NSX09GRlNFVAkJMHg3MAkvKiAzMi1iaXQgU2xhdmUgU2VsZWN0IFJlZ2lzdGVyICovCisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zIGFzIHBlciAiT1BCIElQSUYgKHYzLjAxYykgUHJvZHVjdCBTcGVjaWZpY2F0aW9uIiwgRFM0MTQKKyAqIElQSUYgcmVnaXN0ZXJzIGFyZSAzMiBiaXQKKyAqLworI2RlZmluZSBYSVBJRl9WMTIzQl9ER0lFUl9PRkZTRVQJMHgxYwkvKiBJUElGIGdsb2JhbCBpbnQgZW5hYmxlIHJlZyAqLworI2RlZmluZSBYSVBJRl9WMTIzQl9HSU5UUl9FTkFCTEUJMHg4MDAwMDAwMAorCisjZGVmaW5lIFhJUElGX1YxMjNCX0lJU1JfT0ZGU0VUCQkweDIwCS8qIElQSUYgaW50ZXJydXB0IHN0YXR1cyByZWcgKi8KKyNkZWZpbmUgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQJCTB4MjgJLyogSVBJRiBpbnRlcnJ1cHQgZW5hYmxlIHJlZyAqLworCisjZGVmaW5lIFhTUElfSU5UUl9NT0RFX0ZBVUxUCQkweDAxCS8qIE1vZGUgZmF1bHQgZXJyb3IgKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1NMQVZFX01PREVfRkFVTFQJMHgwMgkvKiBTZWxlY3RlZCBhcyBzbGF2ZSB3aGlsZQorCQkJCQkJICogZGlzYWJsZWQgKi8KKyNkZWZpbmUgWFNQSV9JTlRSX1RYX0VNUFRZCQkweDA0CS8qIFR4RklGTyBpcyBlbXB0eSAqLworI2RlZmluZSBYU1BJX0lOVFJfVFhfVU5ERVJSVU4JCTB4MDgJLyogVHhGSUZPIHdhcyB1bmRlcnJ1biAqLworI2RlZmluZSBYU1BJX0lOVFJfUlhfRlVMTAkJMHgxMAkvKiBSeEZJRk8gaXMgZnVsbCAqLworI2RlZmluZSBYU1BJX0lOVFJfUlhfT1ZFUlJVTgkJMHgyMAkvKiBSeEZJRk8gd2FzIG92ZXJydW4gKi8KKworI2RlZmluZSBYSVBJRl9WMTIzQl9SRVNFVFJfT0ZGU0VUCTB4NDAJLyogSVBJRiByZXNldCByZWdpc3RlciAqLworI2RlZmluZSBYSVBJRl9WMTIzQl9SRVNFVF9NQVNLCQkweDBhCS8qIHRoZSB2YWx1ZSB0byB3cml0ZSAqLworCitzdHJ1Y3QgeGlsaW54X3NwaSB7CisJLyogYml0YmFuZyBoYXMgdG8gYmUgZmlyc3QgKi8KKwlzdHJ1Y3Qgc3BpX2JpdGJhbmcgYml0YmFuZzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCisJdm9pZCBfX2lvbWVtCSpyZWdzOwkvKiB2aXJ0LiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyAqLworCisJdTMyCQlpcnE7CisKKwl1MzIJCXNwZWVkX2h6OyAvKiBTQ0sgaGFzIGEgZml4ZWQgZnJlcXVlbmN5IG9mIHNwZWVkX2h6IEh6ICovCisKKwl1OCAqcnhfcHRyOwkJLyogcG9pbnRlciBpbiB0aGUgVHggYnVmZmVyICovCisJY29uc3QgdTggKnR4X3B0cjsJLyogcG9pbnRlciBpbiB0aGUgUnggYnVmZmVyICovCisJaW50IHJlbWFpbmluZ19ieXRlczsJLyogdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHRyYW5zZmVyICovCit9OworCitzdGF0aWMgdm9pZCB4c3BpX2luaXRfaHcodm9pZCBfX2lvbWVtICpyZWdzX2Jhc2UpCit7CisJLyogUmVzZXQgdGhlIFNQSSBkZXZpY2UgKi8KKwlvdXRfYmUzMihyZWdzX2Jhc2UgKyBYSVBJRl9WMTIzQl9SRVNFVFJfT0ZGU0VULAorCQkgWElQSUZfVjEyM0JfUkVTRVRfTUFTSyk7CisJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMganVzdCBpbiBjYXNlICovCisJb3V0X2JlMzIocmVnc19iYXNlICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQsIDApOworCS8qIEVuYWJsZSB0aGUgZ2xvYmFsIElQSUYgaW50ZXJydXB0ICovCisJb3V0X2JlMzIocmVnc19iYXNlICsgWElQSUZfVjEyM0JfREdJRVJfT0ZGU0VULAorCQkgWElQSUZfVjEyM0JfR0lOVFJfRU5BQkxFKTsKKwkvKiBEZXNlbGVjdCB0aGUgc2xhdmUgb24gdGhlIFNQSSBidXMgKi8KKwlvdXRfYmUzMihyZWdzX2Jhc2UgKyBYU1BJX1NTUl9PRkZTRVQsIDB4ZmZmZik7CisJLyogRGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIsIGVuYWJsZSBNYW51YWwgU2xhdmUgU2VsZWN0IEFzc2VydGlvbiwKKwkgKiBwdXQgU1BJIGNvbnRyb2xsZXIgaW50byBtYXN0ZXIgbW9kZSwgYW5kIGVuYWJsZSBpdCAqLworCW91dF9iZTE2KHJlZ3NfYmFzZSArIFhTUElfQ1JfT0ZGU0VULAorCQkgWFNQSV9DUl9UUkFOU19JTkhJQklUIHwgWFNQSV9DUl9NQU5VQUxfU1NFTEVDVAorCQkgfCBYU1BJX0NSX01BU1RFUl9NT0RFIHwgWFNQSV9DUl9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCB4aWxpbnhfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50IGlzX29uKQoreworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwlpZiAoaXNfb24gPT0gQklUQkFOR19DU19JTkFDVElWRSkgeworCQkvKiBEZXNlbGVjdCB0aGUgc2xhdmUgb24gdGhlIFNQSSBidXMgKi8KKwkJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhTUElfU1NSX09GRlNFVCwgMHhmZmZmKTsKKwl9IGVsc2UgaWYgKGlzX29uID09IEJJVEJBTkdfQ1NfQUNUSVZFKSB7CisJCS8qIFNldCB0aGUgU1BJIGNsb2NrIHBoYXNlIGFuZCBwb2xhcml0eSAqLworCQl1MTYgY3IgPSBpbl9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCkKKwkJCSAmIH5YU1BJX0NSX01PREVfTUFTSzsKKwkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQkJY3IgfD0gWFNQSV9DUl9DUEhBOworCQlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCQljciB8PSBYU1BJX0NSX0NQT0w7CisJCW91dF9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCwgY3IpOworCisJCS8qIFdlIGRvIG5vdCBjaGVjayBzcGktPm1heF9zcGVlZF9oeiBoZXJlIGFzIHRoZSBTUEkgY2xvY2sKKwkJICogZnJlcXVlbmN5IGlzIG5vdCBzb2Z0d2FyZSBwcm9ncmFtbWFibGUgKHRoZSBJUCBibG9jayBkZXNpZ24KKwkJICogcGFyYW1ldGVyKQorCQkgKi8KKworCQkvKiBBY3RpdmF0ZSB0aGUgY2hpcCBzZWxlY3QgKi8KKwkJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhTUElfU1NSX09GRlNFVCwKKwkJCSB+KDB4MDAwMSA8PCBzcGktPmNoaXBfc2VsZWN0KSk7CisJfQorfQorCisvKiBzcGlfYml0YmFuZyByZXF1aXJlcyBjdXN0b20gc2V0dXBfdHJhbnNmZXIoKSB0byBiZSBkZWZpbmVkIGlmIHRoZXJlIGlzIGEKKyAqIGN1c3RvbSB0eHJ4X2J1ZnMoKS4gV2UgaGF2ZSBub3RoaW5nIHRvIHNldHVwIGhlcmUgYXMgdGhlIFNQSSBJUCBibG9jaworICogc3VwcG9ydHMganVzdCA4IGJpdHMgcGVyIHdvcmQsIGFuZCBTUEkgY2xvY2sgY2FuJ3QgYmUgY2hhbmdlZCBpbiBzb2Z0d2FyZS4KKyAqIENoZWNrIGZvciA4IGJpdHMgcGVyIHdvcmQuIENoaXAgc2VsZWN0IGRlbGF5IGNhbGN1bGF0aW9ucyBjb3VsZCBiZQorICogYWRkZWQgaGVyZSBhcyBzb29uIGFzIGJpdGJhbmdfd29yaygpIGNhbiBiZSBtYWRlIGF3YXJlIG9mIHRoZSBkZWxheSB2YWx1ZS4KKyAqLworc3RhdGljIGludCB4aWxpbnhfc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJdTggYml0c19wZXJfd29yZDsKKwl1MzIgaHo7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworCWJpdHNfcGVyX3dvcmQgPSAodCkgPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOworCWh6ID0gKHQpID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKKwlpZiAoYml0c19wZXJfd29yZCAhPSA4KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXMsIHVuc3VwcG9ydGVkIGJpdHNfcGVyX3dvcmQ9JWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGJpdHNfcGVyX3dvcmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaHogJiYgeHNwaS0+c3BlZWRfaHogPiBoeikgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzLCB1bnN1cHBvcnRlZCBjbG9jayByYXRlICV1SHpcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGh6KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworI2RlZmluZSBNT0RFQklUUyAoU1BJX0NQT0wgfCBTUElfQ1BIQSkKKworc3RhdGljIGludCB4aWxpbnhfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHNwaV9iaXRiYW5nICpiaXRiYW5nOworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpOworCWludCByZXR2YWw7CisKKwl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJYml0YmFuZyA9ICZ4c3BpLT5iaXRiYW5nOworCisJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCisJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXMsIHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgc3BpLT5tb2RlICYgfk1PREVCSVRTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dmFsID0geGlsaW54X3NwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJZGV2X2RiZygmc3BpLT5kZXYsICIlcywgbW9kZSAlZCwgJXUgYml0cy93LCAldSBuc2VjL2JpdFxuIiwKKwkJX19GVU5DVElPTl9fLCBzcGktPm1vZGUgJiBNT0RFQklUUywgc3BpLT5iaXRzX3Blcl93b3JkLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4aWxpbnhfc3BpX2ZpbGxfdHhfZmlmbyhzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSkKK3sKKwl1OCBzcjsKKworCS8qIEZpbGwgdGhlIFR4IEZJRk8gd2l0aCBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlICovCisJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJd2hpbGUgKChzciAmIFhTUElfU1JfVFhfRlVMTF9NQVNLKSA9PSAwICYmIHhzcGktPnJlbWFpbmluZ19ieXRlcyA+IDApIHsKKwkJaWYgKHhzcGktPnR4X3B0cikgeworCQkJb3V0XzgoeHNwaS0+cmVncyArIFhTUElfVFhEX09GRlNFVCwgKnhzcGktPnR4X3B0cisrKTsKKwkJfSBlbHNlIHsKKwkJCW91dF84KHhzcGktPnJlZ3MgKyBYU1BJX1RYRF9PRkZTRVQsIDApOworCQl9CisJCXhzcGktPnJlbWFpbmluZ19ieXRlcy0tOworCQlzciA9IGluXzgoeHNwaS0+cmVncyArIFhTUElfU1JfT0ZGU0VUKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGlsaW54X3NwaV90eHJ4X2J1ZnMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXUzMiBpcGlmX2llcjsKKwl1MTYgY3I7CisKKwkvKiBXZSBnZXQgaGVyZSB3aXRoIHRyYW5zbWl0dGVyIGluaGliaXRlZCAqLworCisJeHNwaS0+dHhfcHRyID0gdC0+dHhfYnVmOworCXhzcGktPnJ4X3B0ciA9IHQtPnJ4X2J1ZjsKKwl4c3BpLT5yZW1haW5pbmdfYnl0ZXMgPSB0LT5sZW47CisJSU5JVF9DT01QTEVUSU9OKHhzcGktPmRvbmUpOworCisJeGlsaW54X3NwaV9maWxsX3R4X2ZpZm8oeHNwaSk7CisKKwkvKiBFbmFibGUgdGhlIHRyYW5zbWl0IGVtcHR5IGludGVycnVwdCwgd2hpY2ggd2UgdXNlIHRvIGRldGVybWluZQorCSAqIHByb2dyZXNzIG9uIHRoZSB0cmFuc21pc3Npb24uCisJICovCisJaXBpZl9pZXIgPSBpbl9iZTMyKHhzcGktPnJlZ3MgKyBYSVBJRl9WMTIzQl9JSUVSX09GRlNFVCk7CisJb3V0X2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJRVJfT0ZGU0VULAorCQkgaXBpZl9pZXIgfCBYU1BJX0lOVFJfVFhfRU1QVFkpOworCisJLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IG5vdCBpbmhpYml0aW5nIHRoZSB0cmFuc21pdHRlciBhbnkgbG9uZ2VyICovCisJY3IgPSBpbl9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCkgJiB+WFNQSV9DUl9UUkFOU19JTkhJQklUOworCW91dF9iZTE2KHhzcGktPnJlZ3MgKyBYU1BJX0NSX09GRlNFVCwgY3IpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmeHNwaS0+ZG9uZSk7CisKKwkvKiBEaXNhYmxlIHRoZSB0cmFuc21pdCBlbXB0eSBpbnRlcnJ1cHQgKi8KKwlvdXRfYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlFUl9PRkZTRVQsIGlwaWZfaWVyKTsKKworCXJldHVybiB0LT5sZW4gLSB4c3BpLT5yZW1haW5pbmdfYnl0ZXM7Cit9CisKKworLyogVGhpcyBkcml2ZXIgc3VwcG9ydHMgc2luZ2xlIG1hc3RlciBtb2RlIG9ubHkuIEhlbmNlIFR4IEZJRk8gRW1wdHkKKyAqIGlzIHRoZSBvbmx5IGludGVycnVwdCB3ZSBjYXJlIGFib3V0LgorICogUmVjZWl2ZSBGSUZPIE92ZXJydW4sIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4sIE1vZGUgRmF1bHQsIGFuZCBTbGF2ZSBNb2RlCisgKiBGYXVsdCBhcmUgbm90IHRvIGhhcHBlbi4KKyAqLworc3RhdGljIGlycXJldHVybl90IHhpbGlueF9zcGlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgeGlsaW54X3NwaSAqeHNwaSA9IGRldl9pZDsKKwl1MzIgaXBpZl9pc3I7CisKKwkvKiBHZXQgdGhlIElQSUYgaW50ZXJydXB0cywgYW5kIGNsZWFyIHRoZW0gaW1tZWRpYXRlbHkgKi8KKwlpcGlmX2lzciA9IGluX2JlMzIoeHNwaS0+cmVncyArIFhJUElGX1YxMjNCX0lJU1JfT0ZGU0VUKTsKKwlvdXRfYmUzMih4c3BpLT5yZWdzICsgWElQSUZfVjEyM0JfSUlTUl9PRkZTRVQsIGlwaWZfaXNyKTsKKworCWlmIChpcGlmX2lzciAmIFhTUElfSU5UUl9UWF9FTVBUWSkgewkvKiBUcmFuc21pc3Npb24gY29tcGxldGVkICovCisJCXUxNiBjcjsKKwkJdTggc3I7CisKKwkJLyogQSB0cmFuc21pdCBoYXMganVzdCBjb21wbGV0ZWQuIFByb2Nlc3MgcmVjZWl2ZWQgZGF0YSBhbmQKKwkJICogY2hlY2sgZm9yIG1vcmUgZGF0YSB0byB0cmFuc21pdC4gQWx3YXlzIGluaGliaXQgdGhlCisJCSAqIHRyYW5zbWl0dGVyIHdoaWxlIHRoZSBJc3IgcmVmaWxscyB0aGUgdHJhbnNtaXQgcmVnaXN0ZXIvRklGTywKKwkJICogb3IgbWFrZSBzdXJlIGl0IGlzIHN0b3BwZWQgaWYgd2UncmUgZG9uZS4KKwkJICovCisJCWNyID0gaW5fYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQpOworCQlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsCisJCQkgY3IgfCBYU1BJX0NSX1RSQU5TX0lOSElCSVQpOworCisJCS8qIFJlYWQgb3V0IGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBSeCBGSUZPICovCisJCXNyID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9TUl9PRkZTRVQpOworCQl3aGlsZSAoKHNyICYgWFNQSV9TUl9SWF9FTVBUWV9NQVNLKSA9PSAwKSB7CisJCQl1OCBkYXRhOworCisJCQlkYXRhID0gaW5fOCh4c3BpLT5yZWdzICsgWFNQSV9SWERfT0ZGU0VUKTsKKwkJCWlmICh4c3BpLT5yeF9wdHIpIHsKKwkJCQkqeHNwaS0+cnhfcHRyKysgPSBkYXRhOworCQkJfQorCQkJc3IgPSBpbl84KHhzcGktPnJlZ3MgKyBYU1BJX1NSX09GRlNFVCk7CisJCX0KKworCQkvKiBTZWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIHNlbmQgKi8KKwkJaWYgKHhzcGktPnJlbWFpbmluZ19ieXRlcyA+IDApIHsKKwkJCXhpbGlueF9zcGlfZmlsbF90eF9maWZvKHhzcGkpOworCQkJLyogU3RhcnQgdGhlIHRyYW5zZmVyIGJ5IG5vdCBpbmhpYml0aW5nIHRoZQorCQkJICogdHJhbnNtaXR0ZXIgYW55IGxvbmdlcgorCQkJICovCisJCQlvdXRfYmUxNih4c3BpLT5yZWdzICsgWFNQSV9DUl9PRkZTRVQsIGNyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIG1vcmUgZGF0YSB0byBzZW5kLgorCQkJICogSW5kaWNhdGUgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZC4KKwkJCSAqLworCQkJY29tcGxldGUoJnhzcGktPmRvbmUpOworCQl9CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdCB4aWxpbnhfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCB4aWxpbnhfc3BpICp4c3BpOworCXN0cnVjdCB4c3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKworCS8qIEdldCByZXNvdXJjZXMobWVtb3J5LCBJUlEpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlICovCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgeGlsaW54X3NwaSkpOworCisJaWYgKG1hc3RlciA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKKwlwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAociA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcHV0X21hc3RlcjsKKwl9CisKKwl4c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXhzcGktPmJpdGJhbmcubWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobWFzdGVyKTsKKwl4c3BpLT5iaXRiYW5nLmNoaXBzZWxlY3QgPSB4aWxpbnhfc3BpX2NoaXBzZWxlY3Q7CisJeHNwaS0+Yml0YmFuZy5zZXR1cF90cmFuc2ZlciA9IHhpbGlueF9zcGlfc2V0dXBfdHJhbnNmZXI7CisJeHNwaS0+Yml0YmFuZy50eHJ4X2J1ZnMgPSB4aWxpbnhfc3BpX3R4cnhfYnVmczsKKwl4c3BpLT5iaXRiYW5nLm1hc3Rlci0+c2V0dXAgPSB4aWxpbnhfc3BpX3NldHVwOworCWluaXRfY29tcGxldGlvbigmeHNwaS0+ZG9uZSk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyLT5zdGFydCwKKwkJCXItPmVuZCAtIHItPnN0YXJ0ICsgMSwgWElMSU5YX1NQSV9OQU1FKSkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gcHV0X21hc3RlcjsKKwl9CisKKwl4c3BpLT5yZWdzID0gaW9yZW1hcChyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlpZiAoeHNwaS0+cmVncyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gcHV0X21hc3RlcjsKKwl9CisKKwl4c3BpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CisJaWYgKHhzcGktPmlycSA8IDApIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIHVubWFwX2lvOworCX0KKworCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBwZGF0YS0+bnVtX2NoaXBzZWxlY3Q7CisJeHNwaS0+c3BlZWRfaHogPSBwZGF0YS0+c3BlZWRfaHo7CisKKwkvKiBTUEkgY29udHJvbGxlciBpbml0aWFsaXphdGlvbnMgKi8KKwl4c3BpX2luaXRfaHcoeHNwaS0+cmVncyk7CisKKwkvKiBSZWdpc3RlciBmb3IgU1BJIEludGVycnVwdCAqLworCXJldCA9IHJlcXVlc3RfaXJxKHhzcGktPmlycSwgeGlsaW54X3NwaV9pcnEsIDAsIFhJTElOWF9TUElfTkFNRSwgeHNwaSk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIHVubWFwX2lvOworCisJcmV0ID0gc3BpX2JpdGJhbmdfc3RhcnQoJnhzcGktPmJpdGJhbmcpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgInNwaV9iaXRiYW5nX3N0YXJ0IEZBSUxFRFxuIik7CisJCWdvdG8gZnJlZV9pcnE7CisJfQorCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiYXQgMHglMDhYIG1hcHBlZCB0byAweCUwOFgsIGlycT0lZFxuIiwKKwkJCXItPnN0YXJ0LCAodTMyKXhzcGktPnJlZ3MsIHhzcGktPmlycSk7CisKKwlyZXR1cm4gcmV0OworCitmcmVlX2lycToKKwlmcmVlX2lycSh4c3BpLT5pcnEsIHhzcGkpOwordW5tYXBfaW86CisJaW91bm1hcCh4c3BpLT5yZWdzKTsKK3B1dF9tYXN0ZXI6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB4aWxpbnhfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpbGlueF9zcGkgKnhzcGk7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJeHNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXNwaV9iaXRiYW5nX3N0b3AoJnhzcGktPmJpdGJhbmcpOworCWZyZWVfaXJxKHhzcGktPmlycSwgeHNwaSk7CisJaW91bm1hcCh4c3BpLT5yZWdzKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIDApOworCXNwaV9tYXN0ZXJfcHV0KHhzcGktPmJpdGJhbmcubWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4aWxpbnhfc3BpX2RyaXZlciA9IHsKKwkucHJvYmUJPSB4aWxpbnhfc3BpX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcCh4aWxpbnhfc3BpX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBYSUxJTlhfU1BJX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4aWxpbnhfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ4aWxpbnhfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdCh4aWxpbnhfc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgeGlsaW54X3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnhpbGlueF9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHhpbGlueF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90ZWxlcGhvbnkvS2NvbmZpZyBiL2RyaXZlcnMvdGVsZXBob255L0tjb25maWcKaW5kZXggZGQxZDZhNS4uNWY5OGY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy90ZWxlcGhvbnkvS2NvbmZpZworKysgYi9kcml2ZXJzL3RlbGVwaG9ueS9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgVGVsZXBob255IGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIlRlbGVwaG9ueSBTdXBwb3J0IgorbWVudWNvbmZpZyBQSE9ORQorCXRyaXN0YXRlICJUZWxlcGhvbnkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQotCi1jb25maWcgUEhPTkUKLQl0cmlzdGF0ZSAiTGludXggdGVsZXBob255IHN1cHBvcnQiCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIHRlbGVwaG9ueSBjYXJkLCB3aGljaCBmb3IgZXhhbXBsZSBhbGxvd3MKIAkgIHlvdSB0byB1c2UgYSByZWd1bGFyIHBob25lIGZvciB2b2ljZS1vdmVyLUlQIGFwcGxpY2F0aW9ucy4KQEAgLTE3LDkgKzE1LDExIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwaG9uZWRldi4KIAoraWYgUEhPTkUKKwogY29uZmlnIFBIT05FX0lYSgogCXRyaXN0YXRlICJRdWlja05ldCBJbnRlcm5ldCBMaW5lSmFjay9QaG9uZUphY2sgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBIT05FCisJZGVwZW5kcyBJU0EgfHwgUENJCiAJLS0taGVscC0tLQogCSAgU2F5IE0gaWYgeW91IGhhdmUgYSB0ZWxlcGhvbnkgY2FyZCBtYW51ZmFjdHVyZWQgYnkgUXVpY2tuZXQKIAkgIFRlY2hub2xvZ2llcywgSW5jLiAgVGhlc2UgaW5jbHVkZSB0aGUgSW50ZXJuZXQgUGhvbmVKQUNLIGFuZApAQCAtNDQsNSArNDQsNCBAQAogCSAgY2FyZHMgbWFudWZhY3R1cmVkIGJ5IFF1aWNrbmV0IFRlY2hub2xvZ2llcywgSW5jLiAgVGhpcyBjaGFuZ2VzIHRoZQogCSAgY2FyZCBpbml0aWFsaXphdGlvbiBjb2RlIHRvIHdvcmsgd2l0aCB0aGUgY2FyZCBtYW5hZ2VyIGRhZW1vbi4KIAotZW5kbWVudQotCitlbmRpZiAjIFBIT05FCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCAwNzFiOTY3Li43ZGQ3MzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTE2LDcgKzE2LDcgQEAKIAlib29sZWFuCiAJZGVmYXVsdCB5IGlmIFVTQl9BUkNIX0hBU19PSENJCiAJZGVmYXVsdCB5IGlmIFVTQl9BUkNIX0hBU19FSENJCi0JZGVmYXVsdCB5IGlmIFBDTUNJQQkJCQkjIHNsODExX2NzCisJZGVmYXVsdCB5IGlmIFBDTUNJQSAmJiAhTTMyUgkJCSMgc2w4MTFfY3MKIAlkZWZhdWx0IHkgaWYgQVJNCQkJCSMgU0wtODExCiAJZGVmYXVsdCBQQ0kKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKaW5kZXggNDk3M2UxNC4uOGYwNDY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCkBAIC0xMTY4LDYgKzExNjgsNyBAQAogCXN0cnVjdCB1ZWFfc29mdGMgKnNjID0gZGF0YTsKIAlpbnQgcmV0ID0gLUVBR0FJTjsKIAorCXNldF9mcmVlemFibGUoKTsKIAl1ZWFfZW50ZXJzKElOU19UT19VU0JERVYoc2MpKTsKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlpZiAocmV0IDwgMCB8fCBzYy0+cmVzZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCA1MGU3OTAxLi5mZDc0YzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTI3MjgsNiArMjcyOCw3IEBACiAKIHN0YXRpYyBpbnQgaHViX3RocmVhZCh2b2lkICpfX3VudXNlZCkKIHsKKwlzZXRfZnJlZXphYmxlKCk7CiAJZG8gewogCQlodWJfZXZlbnRzKCk7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IDg3MTJlZjkuLmJlN2ExYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTM0MzQsNiArMzQzNCw5IEBACiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwogCWFsbG93X3NpZ25hbChTSUdVU1IxKTsKIAorCS8qIEFsbG93IHRoZSB0aHJlYWQgdG8gYmUgZnJvemVuICovCisJc2V0X2ZyZWV6YWJsZSgpOworCiAJLyogQXJyYW5nZSBmb3IgdXNlcnNwYWNlIHJlZmVyZW5jZXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMga2VybmVsCiAJICogcG9pbnRlcnMuICBUaGF0IHdheSB3ZSBjYW4gcGFzcyBhIGtlcm5lbCBwb2ludGVyIHRvIGEgcm91dGluZQogCSAqIHRoYXQgZXhwZWN0cyBhIF9fdXNlciBwb2ludGVyIGFuZCBpdCB3aWxsIHdvcmsgb2theS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IGJlZjhiY2QuLjI4ODQyZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtMzExLDggKzMxMSw2IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHVzX3RvX2hvc3QodXMpOwogCWludCBhdXRvcG1fcmM7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLQogCWZvcig7OykgewogCQlVU19ERUJVR1AoIioqKiB0aHJlYWQgc2xlZXBpbmcuXG4iKTsKIAkJaWYoZG93bl9pbnRlcnJ1cHRpYmxlKCZ1cy0+c2VtYSkpCkBAIC05MjAsNiArOTE4LDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRwogCQkidXNiLXN0b3JhZ2U6IGRldmljZSBmb3VuZCBhdCAlZFxuIiwgdXMtPnB1c2JfZGV2LT5kZXZudW0pOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCS8qIFdhaXQgZm9yIHRoZSB0aW1lb3V0IHRvIGV4cGlyZSBvciBmb3IgYSBkaXNjb25uZWN0ICovCiAJaWYgKGRlbGF5X3VzZSA+IDApIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInVzYi1zdG9yYWdlOiB3YWl0aW5nIGZvciBkZXZpY2UgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby82ODMyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvLzY4MzI4ZmIuYwppbmRleCAwZGRhNzNkLi43ZjkwN2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvLzY4MzI4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvLzY4MzI4ZmIuYwpAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIHVfbG9uZyB2aWRlb21lbW9yeXNpemU7CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyBmYl9pbmZvOwotc3RhdGljIHUzMiBtYzY4eDMyOGZiX3BzZXVkb19wYWxldHRlWzE3XTsKK3N0YXRpYyB1MzIgbWM2OHgzMjhmYl9wc2V1ZG9fcGFsZXR0ZVsxNl07CiAKIHN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gbWM2OHgzMjhmYl9kZWZhdWx0IF9faW5pdGRhdGEgPSB7CiAJLnJlZCA9CQl7IDAsIDgsIDAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA0MDNkYWM3Li4wYzU2NDRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwpAQCAtODEyLDcgKzgxMiw3IEBACiAKIGNvbmZpZyBGQl9FUFNPTjEzNTUKIAlib29sICJFcHNvbiAxMzU1IGZyYW1lYnVmZmVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiAoU1VQRVJIIHx8IEFSQ0hfQ0VJVkEpCisJZGVwZW5kcyBvbiAoRkIgPSB5KSAmJiBBUkNIX0NFSVZBCiAJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAogCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKIAlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVApAQCAtMTc5MCw4ICsxNzkwLDggQEAKIAkgIGFkYXB0b3IsIGZvdW5kIG9uIHNvbWUgSUJNIFN5c3RlbSBQIChwU2VyaWVzKSBtYWNoaW5lcy4KIAogY29uZmlnIEZCX1BTMwotCWJvb2wgIlBTMyBHUFUgZnJhbWVidWZmZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gKEZCID0geSkgJiYgUFMzX1BTM0FWCisJdHJpc3RhdGUgIlBTMyBHUFUgZnJhbWVidWZmZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gRkIgJiYgUFMzX1BTM0FWCiAJc2VsZWN0IEZCX1NZU19GSUxMUkVDVAogCXNlbGVjdCBGQl9TWVNfQ09QWUFSRUEKIAlzZWxlY3QgRkJfU1lTX0lNQUdFQkxJVApAQCAtMTgyMCw2ICsxODIwLDEwIEBACiAJICBmcmFtZWJ1ZmZlci4gTUwzMDAgY2FycmllcyBhIDY0MCo0ODAgTENEIGRpc3BsYXkgb24gdGhlIGJvYXJkLAogCSAgTUw0MDMgdXNlcyBhIHN0YW5kYXJkIERCMTUgVkdBIGNvbm5lY3Rvci4KIAoraWYgQVJDSF9PTUFQCisJc291cmNlICJkcml2ZXJzL3ZpZGVvL29tYXAvS2NvbmZpZyIKK2VuZGlmCisKIGNvbmZpZyBGQl9WSVJUVUFMCiAJdHJpc3RhdGUgIlZpcnR1YWwgRnJhbWUgQnVmZmVyIHN1cHBvcnQgKE9OTFkgRk9SIFRFU1RJTkchKSIKIAlkZXBlbmRzIG9uIEZCCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQppbmRleCBiZDhiMDUyLi5hNTYyZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKQEAgLTExMyw2ICsxMTMsNyBAQAogb2JqLSQoQ09ORklHX0ZCX1BTMykJCSAgKz0gcHMzZmIubwogb2JqLSQoQ09ORklHX0ZCX1NNNTAxKSAgICAgICAgICAgICs9IHNtNTAxZmIubwogb2JqLSQoQ09ORklHX0ZCX1hJTElOWCkgICAgICAgICAgICs9IHhpbGlueGZiLm8KK29iai0kKENPTkZJR19GQl9PTUFQKSAgICAgICAgICAgICArPSBvbWFwLwogCiAjIFBsYXRmb3JtIG9yIGZhbGxiYWNrIGRyaXZlcnMgZ28gaGVyZQogb2JqLSQoQ09ORklHX0ZCX1ZFU0EpICAgICAgICAgICAgICs9IHZlc2FmYi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdGlfaWRzLmggYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdGlfaWRzLmgKaW5kZXggOTBlN2RmMi4uNjg1YTc1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXRpX2lkcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0aV9pZHMuaApAQCAtMjA0LDYgKzIwNCw3IEBACiAjZGVmaW5lIFBDSV9DSElQX1JWMjgwXzU5NjEJCTB4NTk2MQogI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81OTYyCQkweDU5NjIKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNTk2NAkJMHg1OTY0CisjZGVmaW5lIFBDSV9DSElQX1JTNDg1XzU5NzUJCTB4NTk3NQogI2RlZmluZSBQQ0lfQ0hJUF9SVjI4MF81QzYxCQkweDVDNjEKICNkZWZpbmUgUENJX0NISVBfUlYyODBfNUM2MwkJMHg1QzYzCiAjZGVmaW5lIFBDSV9DSElQX1I0MjNfNUQ1NyAgICAgICAgICAgICAgMHg1RDU3CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKaW5kZXggMmZiZmY2My4uZWYzMzBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYwpAQCAtNTQxLDcgKzU0MSw3IEBACiAjZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwogCiAKLXN0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTddOworc3RhdGljIHUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07CiAKICNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCiBzdGF0aWMgY2hhciAqYXR5X2d4X3JhbVs4XSBfX2RldmluaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKaW5kZXggMjM0OWU3MS4uNDdjYTYyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCkBAIC0xNTMsNiArMTUzLDggQEAKIAkvKiBNb2JpbGl0eSA5MjAwIChNOSspICovCiAJQ0hJUF9ERUYoUENJX0NISVBfUlYyODBfNUM2MSwJUlYyODAsCUNISVBfSEFTX0NSVEMyIHwgQ0hJUF9JU19NT0JJTElUWSksCiAJQ0hJUF9ERUYoUENJX0NISVBfUlYyODBfNUM2MywJUlYyODAsCUNISVBfSEFTX0NSVEMyIHwgQ0hJUF9JU19NT0JJTElUWSksCisJLypNb2JpbGl0eSBYcHJlc3MgMjAwICovCisJQ0hJUF9ERUYoUENJX0NISVBfUlM0ODVfNTk3NSwJUjMwMCwJQ0hJUF9IQVNfQ1JUQzIgfCBDSElQX0lTX0lHUCB8IENISVBfSVNfTU9CSUxJVFkpLAogCS8qIDkyMDAgKi8KIAlDSElQX0RFRihQQ0lfQ0hJUF9SVjI4MF81OTYwLAlSVjI4MCwJQ0hJUF9IQVNfQ1JUQzIpLAogCUNISVBfREVGKFBDSV9DSElQX1JWMjgwXzU5NjEsCVJWMjgwLAlDSElQX0hBU19DUlRDMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaAppbmRleCA3ZWJmZmNkLi43YzkyMmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKQEAgLTMwMSw3ICszMDEsNyBAQAogCXZvaWQgX19pb21lbQkJKmJpb3Nfc2VnOwogCWludAkJCWZwX2Jpb3Nfc3RhcnQ7CiAKLQl1MzIJCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQkJcHNldWRvX3BhbGV0dGVbMTZdOwogCXN0cnVjdCB7IHU4IHJlZCwgZ3JlZW4sIGJsdWUsIHBhZDsgfQogCQkJCXBhbGV0dGVbMjU2XTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwppbmRleCBkM2I4YTZiLi40OTY0Mzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwpAQCAtMTE4LDYgKzExOCwyMiBAQAogCWhlbHAKIAkgIExvdy1sZXZlbCBmcmFtZWJ1ZmZlci1iYXNlZCBjb25zb2xlIGRyaXZlci4KIAorY29uZmlnIEZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkKKyAgICAgICBib29sICJNYXAgdGhlIGNvbnNvbGUgdG8gdGhlIHByaW1hcnkgZGlzcGxheSBkZXZpY2UiCisgICAgICAgZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFCisgICAgICAgZGVmYXVsdCBuCisgICAgICAgLS0taGVscC0tLQorICAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQsIHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlIHdpbGwKKyAgICAgICAgIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBwcmltYXJ5IGRpc3BsYXkgZGV2aWNlIChpZiB0aGUgYXJjaGl0ZWN0dXJlCisJIHN1cHBvcnRzIHRoaXMgZmVhdHVyZSkuICBPdGhlcndpc2UsIHRoZSBmcmFtZWJ1ZmZlciBjb25zb2xlIHdpbGwKKyAgICAgICAgIGFsd2F5cyBzZWxlY3QgdGhlIGZpcnN0IGZyYW1lYnVmZmVyIGRyaXZlciB0aGF0IGlzIGxvYWRlZC4gVGhlIGxhdHRlcgorICAgICAgICAgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisKKwkgWW91IGNhbiBhbHdheXMgb3ZlcnJpZGUgdGhlIGF1dG9tYXRpYyBzZWxlY3Rpb24gb2YgdGhlIHByaW1hcnkgZGV2aWNlCisJIGJ5IHVzaW5nIHRoZSBmYmNvbj1tYXA6IGJvb3Qgb3B0aW9uLgorCisJIElmIHVuc3VyZSwgc2VsZWN0IG4uCisKIGNvbmZpZyBGUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OCiAgICAgICAgYm9vbCAiRnJhbWVidWZmZXIgQ29uc29sZSBSb3RhdGlvbiIKICAgICAgICBkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKaW5kZXggNzM4MTNjNi4uZGVjZmRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKQEAgLTc1LDYgKzc1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4gLyogRm9yIGNvdW50aW5nIGZvbnQgY2hlY2tzdW1zICovCisjaW5jbHVkZSA8YXNtL2ZiLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTI1LDYgKzEyNiw4IEBACiBzdGF0aWMgaW50IGxhc3RfZmJfdmMgPSBNQVhfTlJfQ09OU09MRVMgLSAxOwogc3RhdGljIGludCBmYmNvbl9pc19kZWZhdWx0ID0gMTsgCiBzdGF0aWMgaW50IGZiY29uX2hhc19leGl0ZWQ7CitzdGF0aWMgaW50IHByaW1hcnlfZGV2aWNlID0gLTE7CitzdGF0aWMgaW50IG1hcF9vdmVycmlkZTsKIAogLyogZm9udCBkYXRhICovCiBzdGF0aWMgY2hhciBmb250bmFtZVs0MF07CkBAIC0xNTIsNiArMTU1LDcgQEAKICNkZWZpbmUgREVGQVVMVF9DVVJTT1JfQkxJTktfUkFURQkoMjApCiAKIHN0YXRpYyBpbnQgdmJsX2N1cnNvcl9jbnQ7CitzdGF0aWMgaW50IGZiY29uX2N1cnNvcl9ub2JsaW5rOwogCiAjZGVmaW5lIGRpdmlkZXMoYSwgYikJKCghKGEpIHx8IChiKSUoYSkpID8gMCA6IDEpCiAKQEAgLTE4OCwxNiArMTkyLDE0IEBACiBzdGF0aWMgdm9pZCBmYmNvbl9ibW92ZV9yZWMoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHN5LCBpbnQgc3gsCiAJCQkgICAgaW50IGR5LCBpbnQgZHgsIGludCBoZWlnaHQsIGludCB3aWR0aCwgdV9pbnQgeV9icmVhayk7CiBzdGF0aWMgdm9pZCBmYmNvbl9zZXRfZGlzcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICBzdHJ1Y3QgdmNfZGF0YSAqdmMpOwotc3RhdGljIHZvaWQgZmJjb25fcHJlc2V0X2Rpc3Aoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgICAgaW50IHVuaXQpOworCQkJICAgaW50IHVuaXQpOwogc3RhdGljIHZvaWQgZmJjb25fcmVkcmF3X21vdmUoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZGlzcGxheSAqcCwKIAkJCSAgICAgIGludCBsaW5lLCBpbnQgY291bnQsIGludCBkeSk7CiBzdGF0aWMgdm9pZCBmYmNvbl9tb2RlY2hhbmdlZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgdm9pZCBmYmNvbl9zZXRfYWxsX3ZjcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBzdGF0aWMgdm9pZCBmYmNvbl9zdGFydCh2b2lkKTsKIHN0YXRpYyB2b2lkIGZiY29uX2V4aXQodm9pZCk7Ci1zdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZSAqZmJjb25fY2xhc3NfZGV2aWNlOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmZiY29uX2RldmljZTsKIAogI2lmZGVmIENPTkZJR19NQUMKIC8qCkBAIC00NDEsNyArNDQzLDggQEAKIAlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAKIAlpZiAoKCFpbmZvLT5xdWV1ZS5mdW5jIHx8IGluZm8tPnF1ZXVlLmZ1bmMgPT0gZmJfZmxhc2hjdXJzb3IpICYmCi0JICAgICEob3BzLT5mbGFncyAmIEZCQ09OX0ZMQUdTX0NVUlNPUl9USU1FUikpIHsKKwkgICAgIShvcHMtPmZsYWdzICYgRkJDT05fRkxBR1NfQ1VSU09SX1RJTUVSKSAmJgorCSAgICAhZmJjb25fY3Vyc29yX25vYmxpbmspIHsKIAkJaWYgKCFpbmZvLT5xdWV1ZS5mdW5jKQogCQkJSU5JVF9XT1JLKCZpbmZvLT5xdWV1ZSwgZmJfZmxhc2hjdXJzb3IpOwogCkBAIC00OTUsMTMgKzQ5OCwxNyBAQAogCQkKIAkJaWYgKCFzdHJuY21wKG9wdGlvbnMsICJtYXA6IiwgNCkpIHsKIAkJCW9wdGlvbnMgKz0gNDsKLQkJCWlmICgqb3B0aW9ucykKKwkJCWlmICgqb3B0aW9ucykgewogCQkJCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgTUFYX05SX0NPTlNPTEVTOyBpKyspIHsKIAkJCQkJaWYgKCFvcHRpb25zW2pdKQogCQkJCQkJaiA9IDA7CiAJCQkJCWNvbjJmYl9tYXBfYm9vdFtpXSA9CiAJCQkJCQkob3B0aW9uc1tqKytdLScwJykgJSBGQl9NQVg7CiAJCQkJfQorCisJCQkJbWFwX292ZXJyaWRlID0gMTsKKwkJCX0KKwogCQkJcmV0dXJuIDE7CiAJCX0KIApAQCAtNzM2LDcgKzc0Myw5IEBACiAKIAlpZiAoIWVycikgewogCQlpbmZvLT5mYmNvbl9wYXIgPSBvcHM7Ci0JCXNldF9ibGl0dGluZ190eXBlKHZjLCBpbmZvKTsKKworCQlpZiAodmMpCisJCQlzZXRfYmxpdHRpbmdfdHlwZSh2YywgaW5mbyk7CiAJfQogCiAJaWYgKGVycikgewpAQCAtNzk4LDExICs4MDcsNyBAQAogCiAJb3BzLT5mbGFncyB8PSBGQkNPTl9GTEFHU19JTklUOwogCW9wcy0+Z3JhcGhpY3MgPSAwOwotCi0JaWYgKHZjKQotCQlmYmNvbl9zZXRfZGlzcChpbmZvLCAmaW5mby0+dmFyLCB2Yyk7Ci0JZWxzZQotCQlmYmNvbl9wcmVzZXRfZGlzcChpbmZvLCAmaW5mby0+dmFyLCB1bml0KTsKKwlmYmNvbl9zZXRfZGlzcChpbmZvLCAmaW5mby0+dmFyLCB1bml0KTsKIAogCWlmIChzaG93X2xvZ28pIHsKIAkJc3RydWN0IHZjX2RhdGEgKmZnX3ZjID0gdmNfY29uc1tmZ19jb25zb2xlXS5kOwpAQCAtMTEwNyw2ICsxMTEyLDkgQEAKIAlpZiAodmFyX3RvX2Rpc3BsYXkocCwgJmluZm8tPnZhciwgaW5mbykpCiAJCXJldHVybjsKIAorCWlmICghaW5mby0+ZmJjb25fcGFyKQorCQljb24yZmJfYWNxdWlyZV9uZXdpbmZvKHZjLCBpbmZvLCB2Yy0+dmNfbnVtLCAtMSk7CisKIAkvKiBJZiB3ZSBhcmUgbm90IHRoZSBmaXJzdCBjb25zb2xlIG9uIHRoaXMKIAkgICBmYiwgY29weSB0aGUgZm9udCBmcm9tIHRoYXQgY29uc29sZSAqLwogCXQgPSAmZmJfZGlzcGxheVtmZ19jb25zb2xlXTsKQEAgLTEzNDksNiArMTM1NywxMSBAQAogCWlmIChmYmNvbl9pc19pbmFjdGl2ZSh2YywgaW5mbykgfHwgdmMtPnZjX2RlY2NtICE9IDEpCiAJCXJldHVybjsKIAorCWlmICh2Yy0+dmNfY3Vyc29yX3R5cGUgJiAweDEwKQorCQlmYmNvbl9kZWxfY3Vyc29yX3RpbWVyKGluZm8pOworCWVsc2UKKwkJZmJjb25fYWRkX2N1cnNvcl90aW1lcihpbmZvKTsKKwogCW9wcy0+Y3Vyc29yX2ZsYXNoID0gKG1vZGUgPT0gQ01fRVJBU0UpID8gMCA6IDE7CiAJaWYgKG1vZGUgJiBDTV9TT0ZUQkFDSykgewogCQltb2RlICY9IH5DTV9TT0ZUQkFDSzsKQEAgLTEzNjgsMzYgKzEzODEsMjkgQEAKIHN0YXRpYyBpbnQgc2Nyb2xsYmFja19tYXggPSAwOwogc3RhdGljIGludCBzY3JvbGxiYWNrX2N1cnJlbnQgPSAwOwogCi0vKgotICogSWYgbm8gdmMgaXMgZXhpc3RlbnQgeWV0LCBqdXN0IHNldCBzdHJ1Y3QgZGlzcGxheQotICovCi1zdGF0aWMgdm9pZCBmYmNvbl9wcmVzZXRfZGlzcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgICBpbnQgdW5pdCkKLXsKLQlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3VuaXRdOwotCXN0cnVjdCBkaXNwbGF5ICp0ID0gJmZiX2Rpc3BsYXlbZmdfY29uc29sZV07Ci0KLQlpZiAodmFyX3RvX2Rpc3BsYXkocCwgdmFyLCBpbmZvKSkKLQkJcmV0dXJuOwotCi0JcC0+Zm9udGRhdGEgPSB0LT5mb250ZGF0YTsKLQlwLT51c2VyZm9udCA9IHQtPnVzZXJmb250OwotCWlmIChwLT51c2VyZm9udCkKLQkJUkVGQ09VTlQocC0+Zm9udGRhdGEpKys7Ci19Ci0KIHN0YXRpYyB2b2lkIGZiY29uX3NldF9kaXNwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgIHN0cnVjdCB2Y19kYXRhICp2YykKKwkJCSAgIGludCB1bml0KQogewotCXN0cnVjdCBkaXNwbGF5ICpwID0gJmZiX2Rpc3BsYXlbdmMtPnZjX251bV0sICp0OwotCXN0cnVjdCB2Y19kYXRhICoqZGVmYXVsdF9tb2RlID0gdmMtPnZjX2Rpc3BsYXlfZmc7Ci0Jc3RydWN0IHZjX2RhdGEgKnN2YyA9ICpkZWZhdWx0X21vZGU7CisJc3RydWN0IGRpc3BsYXkgKnAsICp0OworCXN0cnVjdCB2Y19kYXRhICoqZGVmYXVsdF9tb2RlLCAqdmM7CisJc3RydWN0IHZjX2RhdGEgKnN2YzsKIAlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CiAJaW50IHJvd3MsIGNvbHMsIGNoYXJjbnQgPSAyNTY7CiAKKwlwID0gJmZiX2Rpc3BsYXlbdW5pdF07CisKIAlpZiAodmFyX3RvX2Rpc3BsYXkocCwgdmFyLCBpbmZvKSkKIAkJcmV0dXJuOworCisJdmMgPSB2Y19jb25zW3VuaXRdLmQ7CisKKwlpZiAoIXZjKQorCQlyZXR1cm47CisKKwlkZWZhdWx0X21vZGUgPSB2Yy0+dmNfZGlzcGxheV9mZzsKKwlzdmMgPSAqZGVmYXVsdF9tb2RlOwogCXQgPSAmZmJfZGlzcGxheVtzdmMtPnZjX251bV07CisKIAlpZiAoIXZjLT52Y19mb250LmRhdGEpIHsKIAkJdmMtPnZjX2ZvbnQuZGF0YSA9ICh2b2lkICopKHAtPmZvbnRkYXRhID0gdC0+Zm9udGRhdGEpOwogCQl2Yy0+dmNfZm9udC53aWR0aCA9ICgqZGVmYXVsdF9tb2RlKS0+dmNfZm9udC53aWR0aDsKQEAgLTE3MDQsNiArMTcxMCw1NiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZmJjb25fcmVkcmF3X2JsaXQoc3RydWN0IHZjX2RhdGEgKnZjLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgbGluZSwgaW50IGNvdW50LCBpbnQgeWNvdW50KQoreworCWludCBvZmZzZXQgPSB5Y291bnQgKiB2Yy0+dmNfY29sczsKKwl1bnNpZ25lZCBzaG9ydCAqZCA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCSAgICAodmMtPnZjX29yaWdpbiArIHZjLT52Y19zaXplX3JvdyAqIGxpbmUpOworCXVuc2lnbmVkIHNob3J0ICpzID0gZCArIG9mZnNldDsKKwlzdHJ1Y3QgZmJjb25fb3BzICpvcHMgPSBpbmZvLT5mYmNvbl9wYXI7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQl1bnNpZ25lZCBzaG9ydCAqc3RhcnQgPSBzOworCQl1bnNpZ25lZCBzaG9ydCAqbGUgPSBhZHZhbmNlX3JvdyhzLCAxKTsKKwkJdW5zaWduZWQgc2hvcnQgYzsKKwkJaW50IHggPSAwOworCisJCWRvIHsKKwkJCWMgPSBzY3JfcmVhZHcocyk7CisKKwkJCWlmIChjID09IHNjcl9yZWFkdyhkKSkgeworCQkJCWlmIChzID4gc3RhcnQpIHsKKwkJCQkJb3BzLT5ibW92ZSh2YywgaW5mbywgbGluZSArIHljb3VudCwgeCwKKwkJCQkJCSAgIGxpbmUsIHgsIDEsIHMtc3RhcnQpOworCQkJCQl4ICs9IHMgLSBzdGFydCArIDE7CisJCQkJCXN0YXJ0ID0gcyArIDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJeCsrOworCQkJCQlzdGFydCsrOworCQkJCX0KKwkJCX0KKworCQkJc2NyX3dyaXRldyhjLCBkKTsKKwkJCWNvbnNvbGVfY29uZGl0aW9uYWxfc2NoZWR1bGUoKTsKKwkJCXMrKzsKKwkJCWQrKzsKKwkJfSB3aGlsZSAocyA8IGxlKTsKKwkJaWYgKHMgPiBzdGFydCkKKwkJCW9wcy0+Ym1vdmUodmMsIGluZm8sIGxpbmUgKyB5Y291bnQsIHgsIGxpbmUsIHgsIDEsCisJCQkJICAgcy1zdGFydCk7CisJCWNvbnNvbGVfY29uZGl0aW9uYWxfc2NoZWR1bGUoKTsKKwkJaWYgKHljb3VudCA+IDApCisJCQlsaW5lKys7CisJCWVsc2UgeworCQkJbGluZS0tOworCQkJLyogTk9URTogV2Ugc3VidHJhY3QgdHdvIGxpbmVzIGZyb20gdGhlc2UgcG9pbnRlcnMgKi8KKwkJCXMgLT0gdmMtPnZjX3NpemVfcm93OworCQkJZCAtPSB2Yy0+dmNfc2l6ZV9yb3c7CisJCX0KKwl9Cit9CisKIHN0YXRpYyB2b2lkIGZiY29uX3JlZHJhdyhzdHJ1Y3QgdmNfZGF0YSAqdmMsIHN0cnVjdCBkaXNwbGF5ICpwLAogCQkJIGludCBsaW5lLCBpbnQgY291bnQsIGludCBvZmZzZXQpCiB7CkBAIC0xNzg5LDcgKzE4NDUsNiBAQAogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcmVnaXN0ZXJlZF9mYltjb24yZmJfbWFwW3ZjLT52Y19udW1dXTsKIAlzdHJ1Y3QgZGlzcGxheSAqcCA9ICZmYl9kaXNwbGF5W3ZjLT52Y19udW1dOwotCXN0cnVjdCBmYmNvbl9vcHMgKm9wcyA9IGluZm8tPmZiY29uX3BhcjsKIAlpbnQgc2Nyb2xsX3BhcnRpYWwgPSBpbmZvLT5mbGFncyAmIEZCSU5GT19QQVJUSUFMX1BBTl9PSzsKIAogCWlmIChmYmNvbl9pc19pbmFjdGl2ZSh2YywgaW5mbykpCkBAIC0xODEzLDEwICsxODY4LDE1IEBACiAJCQlnb3RvIHJlZHJhd191cDsKIAkJc3dpdGNoIChwLT5zY3JvbGxtb2RlKSB7CiAJCWNhc2UgU0NST0xMX01PVkU6Ci0JCQlvcHMtPmJtb3ZlKHZjLCBpbmZvLCB0ICsgY291bnQsIDAsIHQsIDAsCi0JCQkJICAgIGIgLSB0IC0gY291bnQsIHZjLT52Y19jb2xzKTsKLQkJCW9wcy0+Y2xlYXIodmMsIGluZm8sIGIgLSBjb3VudCwgMCwgY291bnQsCi0JCQkJICB2Yy0+dmNfY29scyk7CisJCQlmYmNvbl9yZWRyYXdfYmxpdCh2YywgaW5mbywgcCwgdCwgYiAtIHQgLSBjb3VudCwKKwkJCQkgICAgIGNvdW50KTsKKwkJCWZiY29uX2NsZWFyKHZjLCBiIC0gY291bnQsIDAsIGNvdW50LCB2Yy0+dmNfY29scyk7CisJCQlzY3JfbWVtc2V0dygodW5zaWduZWQgc2hvcnQgKikgKHZjLT52Y19vcmlnaW4gKworCQkJCQkJCXZjLT52Y19zaXplX3JvdyAqCisJCQkJCQkJKGIgLSBjb3VudCkpLAorCQkJCSAgICB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKKwkJCQkgICAgdmMtPnZjX3NpemVfcm93ICogY291bnQpOworCQkJcmV0dXJuIDE7CiAJCQlicmVhazsKIAogCQljYXNlIFNDUk9MTF9XUkFQX01PVkU6CkBAIC0xODk5LDkgKzE5NTksMTUgQEAKIAkJCWdvdG8gcmVkcmF3X2Rvd247CiAJCXN3aXRjaCAocC0+c2Nyb2xsbW9kZSkgewogCQljYXNlIFNDUk9MTF9NT1ZFOgotCQkJb3BzLT5ibW92ZSh2YywgaW5mbywgdCwgMCwgdCArIGNvdW50LCAwLAotCQkJCSAgICBiIC0gdCAtIGNvdW50LCB2Yy0+dmNfY29scyk7Ci0JCQlvcHMtPmNsZWFyKHZjLCBpbmZvLCB0LCAwLCBjb3VudCwgdmMtPnZjX2NvbHMpOworCQkJZmJjb25fcmVkcmF3X2JsaXQodmMsIGluZm8sIHAsIGIgLSAxLCBiIC0gdCAtIGNvdW50LAorCQkJCSAgICAgLWNvdW50KTsKKwkJCWZiY29uX2NsZWFyKHZjLCB0LCAwLCBjb3VudCwgdmMtPnZjX2NvbHMpOworCQkJc2NyX21lbXNldHcoKHVuc2lnbmVkIHNob3J0ICopICh2Yy0+dmNfb3JpZ2luICsKKwkJCQkJCQl2Yy0+dmNfc2l6ZV9yb3cgKgorCQkJCQkJCXQpLAorCQkJCSAgICB2Yy0+dmNfdmlkZW9fZXJhc2VfY2hhciwKKwkJCQkgICAgdmMtPnZjX3NpemVfcm93ICogY291bnQpOworCQkJcmV0dXJuIDE7CiAJCQlicmVhazsKIAogCQljYXNlIFNDUk9MTF9XUkFQX01PVkU6CkBAIC0yOTM3LDkgKzMwMDMsNDggQEAKIAlyZXR1cm4gZm91bmQ7CiB9CiAKLXN0YXRpYyBpbnQgZmJjb25fZmJfdW5yZWdpc3RlcmVkKGludCBpZHgpCisjaWZkZWYgQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORworc3RhdGljIGludCBmYmNvbl91bmJpbmQodm9pZCkKIHsKLQlpbnQgaTsKKwlpbnQgcmV0OworCisJcmV0ID0gdW5iaW5kX2Nvbl9kcml2ZXIoJmZiX2NvbiwgZmlyc3RfZmJfdmMsIGxhc3RfZmJfdmMsCisJCQkJZmJjb25faXNfZGVmYXVsdCk7CisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBmYmNvbl91bmJpbmQodm9pZCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HICovCisKK3N0YXRpYyBpbnQgZmJjb25fZmJfdW5iaW5kKGludCBpZHgpCit7CisJaW50IGksIG5ld19pZHggPSAtMSwgcmV0ID0gMDsKKworCWZvciAoaSA9IGZpcnN0X2ZiX3ZjOyBpIDw9IGxhc3RfZmJfdmM7IGkrKykgeworCQlpZiAoY29uMmZiX21hcFtpXSAhPSBpZHggJiYKKwkJICAgIGNvbjJmYl9tYXBbaV0gIT0gLTEpIHsKKwkJCW5ld19pZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobmV3X2lkeCAhPSAtMSkgeworCQlmb3IgKGkgPSBmaXJzdF9mYl92YzsgaSA8PSBsYXN0X2ZiX3ZjOyBpKyspIHsKKwkJCWlmIChjb24yZmJfbWFwW2ldID09IGlkeCkKKwkJCQlzZXRfY29uMmZiX21hcChpLCBuZXdfaWR4LCAwKTsKKwkJfQorCX0gZWxzZQorCQlyZXQgPSBmYmNvbl91bmJpbmQoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmJjb25fZmJfdW5yZWdpc3RlcmVkKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBpLCBpZHggPSBpbmZvLT5ub2RlOwogCiAJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CiAJCWlmIChjb24yZmJfbWFwW2ldID09IGlkeCkKQEAgLTI5NjcsMTIgKzMwNzIsNDggQEAKIAlpZiAoIW51bV9yZWdpc3RlcmVkX2ZiKQogCQl1bnJlZ2lzdGVyX2Nvbl9kcml2ZXIoJmZiX2Nvbik7CiAKKworCWlmIChwcmltYXJ5X2RldmljZSA9PSBpZHgpCisJCXByaW1hcnlfZGV2aWNlID0gLTE7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmYmNvbl9mYl9yZWdpc3RlcmVkKGludCBpZHgpCisjaWZkZWYgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfREVURUNUX1BSSU1BUlkKK3N0YXRpYyB2b2lkIGZiY29uX3NlbGVjdF9wcmltYXJ5KHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCWludCByZXQgPSAwLCBpOworCWlmICghbWFwX292ZXJyaWRlICYmIHByaW1hcnlfZGV2aWNlID09IC0xICYmCisJICAgIGZiX2lzX3ByaW1hcnlfZGV2aWNlKGluZm8pKSB7CisJCWludCBpOworCisJCXByaW50ayhLRVJOX0lORk8gImZiY29uOiAlcyAoZmIlaSkgaXMgcHJpbWFyeSBkZXZpY2VcbiIsCisJCSAgICAgICBpbmZvLT5maXguaWQsIGluZm8tPm5vZGUpOworCQlwcmltYXJ5X2RldmljZSA9IGluZm8tPm5vZGU7CisKKwkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKQorCQkJY29uMmZiX21hcF9ib290W2ldID0gcHJpbWFyeV9kZXZpY2U7CisKKwkJaWYgKGNvbl9pc19ib3VuZCgmZmJfY29uKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiZmJjb246IFJlbWFwcGluZyBwcmltYXJ5IGRldmljZSwgIgorCQkJICAgICAgICJmYiVpLCB0byB0dHkgJWktJWlcbiIsIGluZm8tPm5vZGUsCisJCQkgICAgICAgZmlyc3RfZmJfdmMgKyAxLCBsYXN0X2ZiX3ZjICsgMSk7CisJCQlpbmZvX2lkeCA9IHByaW1hcnlfZGV2aWNlOworCQl9CisJfQorCit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZiY29uX3NlbGVjdF9wcmltYXJ5KHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybjsKK30KKyNlbmRpZiAvKiBDT05GSUdfRlJBTUVCVUZGRVJfREVURUNUX1BSSU1BUlkgKi8KKworc3RhdGljIGludCBmYmNvbl9mYl9yZWdpc3RlcmVkKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCByZXQgPSAwLCBpLCBpZHggPSBpbmZvLT5ub2RlOworCisJZmJjb25fc2VsZWN0X3ByaW1hcnkoaW5mbyk7CiAKIAlpZiAoaW5mb19pZHggPT0gLTEpIHsKIAkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7CkBAIC0yOTg2LDggKzMxMjcsNyBAQAogCQkJcmV0ID0gZmJjb25fdGFrZW92ZXIoMSk7CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gZmlyc3RfZmJfdmM7IGkgPD0gbGFzdF9mYl92YzsgaSsrKSB7Ci0JCQlpZiAoY29uMmZiX21hcF9ib290W2ldID09IGlkeCAmJgotCQkJICAgIGNvbjJmYl9tYXBbaV0gPT0gLTEpCisJCQlpZiAoY29uMmZiX21hcF9ib290W2ldID09IGlkeCkKIAkJCQlzZXRfY29uMmZiX21hcChpLCBpZHgsIDApOwogCQl9CiAJfQpAQCAtMzAzNCwxMiArMzE3NCw3IEBACiAJCW1vZGUgPSBmYl9maW5kX25lYXJlc3RfbW9kZShmYl9kaXNwbGF5W2ldLm1vZGUsCiAJCQkJCSAgICAmaW5mby0+bW9kZWxpc3QpOwogCQlmYl92aWRlb21vZGVfdG9fdmFyKCZ2YXIsIG1vZGUpOwotCi0JCWlmICh2YykKLQkJCWZiY29uX3NldF9kaXNwKGluZm8sICZ2YXIsIHZjKTsKLQkJZWxzZQotCQkJZmJjb25fcHJlc2V0X2Rpc3AoaW5mbywgJnZhciwgaSk7Ci0KKwkJZmJjb25fc2V0X2Rpc3AoaW5mbywgJnZhciwgdmMtPnZjX251bSk7CiAJfQogfQogCkBAIC0zMTE0LDExICszMjQ5LDE0IEBACiAJCW1vZGUgPSBldmVudC0+ZGF0YTsKIAkJcmV0ID0gZmJjb25fbW9kZV9kZWxldGVkKGluZm8sIG1vZGUpOwogCQlicmVhazsKKwljYXNlIEZCX0VWRU5UX0ZCX1VOQklORDoKKwkJcmV0ID0gZmJjb25fZmJfdW5iaW5kKGluZm8tPm5vZGUpOworCQlicmVhazsKIAljYXNlIEZCX0VWRU5UX0ZCX1JFR0lTVEVSRUQ6Ci0JCXJldCA9IGZiY29uX2ZiX3JlZ2lzdGVyZWQoaW5mby0+bm9kZSk7CisJCXJldCA9IGZiY29uX2ZiX3JlZ2lzdGVyZWQoaW5mbyk7CiAJCWJyZWFrOwogCWNhc2UgRkJfRVZFTlRfRkJfVU5SRUdJU1RFUkVEOgotCQlyZXQgPSBmYmNvbl9mYl91bnJlZ2lzdGVyZWQoaW5mby0+bm9kZSk7CisJCXJldCA9IGZiY29uX2ZiX3VucmVnaXN0ZXJlZChpbmZvKTsKIAkJYnJlYWs7CiAJY2FzZSBGQl9FVkVOVF9TRVRfQ09OU09MRV9NQVA6CiAJCWNvbjJmYiA9IGV2ZW50LT5kYXRhOwpAQCAtMzE3OSw4ICszMzE3LDkgQEAKIAkubm90aWZpZXJfY2FsbAk9IGZiY29uX2V2ZW50X25vdGlmeSwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCByb3RhdGUsIGlkeDsKQEAgLTMyMDMsOCArMzM0Miw5IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9yb3RhdGVfYWxsKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3JvdGF0ZV9hbGwoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CiAJaW50IHJvdGF0ZSwgaWR4OwpAQCAtMzIyNyw3ICszMzY3LDggQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcm90YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19yb3RhdGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsY2hhciAqYnVmKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWludCByb3RhdGUgPSAwLCBpZHg7CkBAIC0zMjQ4LDIwICszMzg5LDg2IEBACiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHJvdGF0ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cnNbXSA9IHsKK3N0YXRpYyBzc2l6ZV90IHNob3dfY3Vyc29yX2JsaW5rKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZmJjb25fb3BzICpvcHM7CisJaW50IGlkeCwgYmxpbmsgPSAtMTsKKworCWlmIChmYmNvbl9oYXNfZXhpdGVkKQorCQlyZXR1cm4gMDsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwlpZHggPSBjb24yZmJfbWFwW2ZnX2NvbnNvbGVdOworCisJaWYgKGlkeCA9PSAtMSB8fCByZWdpc3RlcmVkX2ZiW2lkeF0gPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpbmZvID0gcmVnaXN0ZXJlZF9mYltpZHhdOworCW9wcyA9IGluZm8tPmZiY29uX3BhcjsKKworCWlmICghb3BzKQorCQlnb3RvIGVycjsKKworCWJsaW5rID0gKG9wcy0+ZmxhZ3MgJiBGQkNPTl9GTEFHU19DVVJTT1JfVElNRVIpID8gMSA6IDA7CitlcnI6CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBibGluayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2N1cnNvcl9ibGluayhzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCWludCBibGluaywgaWR4OworCWNoYXIgKipsYXN0ID0gTlVMTDsKKworCWlmIChmYmNvbl9oYXNfZXhpdGVkKQorCQlyZXR1cm4gY291bnQ7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJaWR4ID0gY29uMmZiX21hcFtmZ19jb25zb2xlXTsKKworCWlmIChpZHggPT0gLTEgfHwgcmVnaXN0ZXJlZF9mYltpZHhdID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbaWR4XTsKKworCWlmICghaW5mby0+ZmJjb25fcGFyKQorCQlnb3RvIGVycjsKKworCWJsaW5rID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBsYXN0LCAwKTsKKworCWlmIChibGluaykgeworCQlmYmNvbl9jdXJzb3Jfbm9ibGluayA9IDA7CisJCWZiY29uX2FkZF9jdXJzb3JfdGltZXIoaW5mbyk7CisJfSBlbHNlIHsKKwkJZmJjb25fY3Vyc29yX25vYmxpbmsgPSAxOworCQlmYmNvbl9kZWxfY3Vyc29yX3RpbWVyKGluZm8pOworCX0KKworZXJyOgorCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZpY2VfYXR0cnNbXSA9IHsKIAlfX0FUVFIocm90YXRlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfcm90YXRlLCBzdG9yZV9yb3RhdGUpLAogCV9fQVRUUihyb3RhdGVfYWxsLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9yb3RhdGVfYWxsKSwKKwlfX0FUVFIoY3Vyc29yX2JsaW5rLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfY3Vyc29yX2JsaW5rLAorCSAgICAgICBzdG9yZV9jdXJzb3JfYmxpbmspLAogfTsKIAotc3RhdGljIGludCBmYmNvbl9pbml0X2NsYXNzX2RldmljZSh2b2lkKQorc3RhdGljIGludCBmYmNvbl9pbml0X2RldmljZSh2b2lkKQogewogCWludCBpLCBlcnJvciA9IDA7CiAKIAlmYmNvbl9oYXNfc3lzZnMgPSAxOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKSB7Ci0JCWVycm9yID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGZiY29uX2NsYXNzX2RldmljZSwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspIHsKKwkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZmJjb25fZGV2aWNlLCAmZGV2aWNlX2F0dHJzW2ldKTsKIAogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKQEAgLTMyNjksOCArMzQ3Niw3IEBACiAKIAlpZiAoZXJyb3IpIHsKIAkJd2hpbGUgKC0taSA+PSAwKQotCQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGZiY29uX2NsYXNzX2RldmljZSwKLQkJCQkJCSAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShmYmNvbl9kZXZpY2UsICZkZXZpY2VfYXR0cnNbaV0pOwogCiAJCWZiY29uX2hhc19zeXNmcyA9IDA7CiAJfQpAQCAtMzM1NiwxNiArMzU2MiwxNSBAQAogCiAJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCWZiX3JlZ2lzdGVyX2NsaWVudCgmZmJjb25fZXZlbnRfbm90aWZpZXIpOwotCWZiY29uX2NsYXNzX2RldmljZSA9Ci0JICAgIGNsYXNzX2RldmljZV9jcmVhdGUoZmJfY2xhc3MsIE5VTEwsIE1LREVWKDAsIDApLCBOVUxMLCAiZmJjb24iKTsKKwlmYmNvbl9kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGZiX2NsYXNzLCBOVUxMLCBNS0RFVigwLCAwKSwgImZiY29uIik7CiAKLQlpZiAoSVNfRVJSKGZiY29uX2NsYXNzX2RldmljZSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGNyZWF0ZSBjbGFzc19kZXZpY2UgIgorCWlmIChJU19FUlIoZmJjb25fZGV2aWNlKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gY3JlYXRlIGRldmljZSAiCiAJCSAgICAgICAiZm9yIGZiY29uOyBlcnJubyA9ICVsZFxuIiwKLQkJICAgICAgIFBUUl9FUlIoZmJjb25fY2xhc3NfZGV2aWNlKSk7Ci0JCWZiY29uX2NsYXNzX2RldmljZSA9IE5VTEw7CisJCSAgICAgICBQVFJfRVJSKGZiY29uX2RldmljZSkpOworCQlmYmNvbl9kZXZpY2UgPSBOVUxMOwogCX0gZWxzZQotCQlmYmNvbl9pbml0X2NsYXNzX2RldmljZSgpOworCQlmYmNvbl9pbml0X2RldmljZSgpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9DT05TT0xFUzsgaSsrKQogCQljb24yZmJfbWFwW2ldID0gLTE7CkBAIC0zMzc5LDE0ICszNTg0LDEzIEBACiAKICNpZmRlZiBNT0RVTEUKIAotc3RhdGljIHZvaWQgX19leGl0IGZiY29uX2RlaW5pdF9jbGFzc19kZXZpY2Uodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBmYmNvbl9kZWluaXRfZGV2aWNlKHZvaWQpCiB7CiAJaW50IGk7CiAKIAlpZiAoZmJjb25faGFzX3N5c2ZzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKLQkJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShmYmNvbl9jbGFzc19kZXZpY2UsCi0JCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZV9hdHRycyk7IGkrKykKKwkJCWRldmljZV9yZW1vdmVfZmlsZShmYmNvbl9kZXZpY2UsICZkZXZpY2VfYXR0cnNbaV0pOwogCiAJCWZiY29uX2hhc19zeXNmcyA9IDA7CiAJfQpAQCAtMzM5Niw4ICszNjAwLDggQEAKIHsKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAJZmJfdW5yZWdpc3Rlcl9jbGllbnQoJmZiY29uX2V2ZW50X25vdGlmaWVyKTsKLQlmYmNvbl9kZWluaXRfY2xhc3NfZGV2aWNlKCk7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3koZmJfY2xhc3MsIE1LREVWKDAsIDApKTsKKwlmYmNvbl9kZWluaXRfZGV2aWNlKCk7CisJZGV2aWNlX2Rlc3Ryb3koZmJfY2xhc3MsIE1LREVWKDAsIDApKTsKIAlmYmNvbl9leGl0KCk7CiAJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwogCXVucmVnaXN0ZXJfY29uX2RyaXZlcigmZmJfY29uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnRyb2xmYi5jCmluZGV4IDhiNzYyNzMuLmIwYmU3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29udHJvbGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jb250cm9sZmIuYwpAQCAtOTQsNyArOTQsNyBAQAogc3RydWN0IGZiX2luZm9fY29udHJvbCB7CiAJc3RydWN0IGZiX2luZm8JCWluZm87CiAJc3RydWN0IGZiX3Bhcl9jb250cm9sCXBhcjsKLQl1MzIJCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQkJcHNldWRvX3BhbGV0dGVbMTZdOwogCQkKIAlzdHJ1Y3QgY21hcF9yZWdzCV9faW9tZW0gKmNtYXBfcmVnczsKIAl1bnNpZ25lZCBsb25nCQljbWFwX3JlZ3NfcGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY3libGFmYi5jIGIvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKaW5kZXggOTRhNjZjMi4uZTIzMzI0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9jeWJsYWZiLmMKQEAgLTEwNjgsMTUgKzEwNjgsMTggQEAKIAkJb3V0OCgweDNDOSwgZ3JlZW4gPj4gMTApOwogCQlvdXQ4KDB4M0M5LCBibHVlID4+IDEwKTsKIAotCX0gZWxzZSBpZiAoYnBwID09IDE2KQkvLyBSR0IgNTY1Ci0JCSgodTMyICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQotCQkgICAgKHJlZCAmIDB4RjgwMCkgfAotCQkgICAgKChncmVlbiAmIDB4RkMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweEY4MDApID4+IDExKTsKLQllbHNlIGlmIChicHAgPT0gMzIpCS8vIEFSR0IgODg4OAotCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KLQkJICAgICgodHJhbnNwICYgMHhGRjAwKSA8PCAxNikgfAotCQkgICAgKChyZWQgJiAweEZGMDApIDw8IDgpIHwKLQkJICAgICgoZ3JlZW4gJiAweEZGMDApKSB8ICgoYmx1ZSAmIDB4RkYwMCkgPj4gOCk7CisJfSBlbHNlIGlmIChyZWdubyA8IDE2KSB7CisJCWlmIChicHAgPT0gMTYpCS8vIFJHQiA1NjUKKwkJCSgodTMyICopIGluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQorCQkJCShyZWQgJiAweEY4MDApIHwKKwkJCQkoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8CisJCQkJKChibHVlICYgMHhGODAwKSA+PiAxMSk7CisJCWVsc2UgaWYgKGJwcCA9PSAzMikJLy8gQVJHQiA4ODg4CisJCQkoKHUzMiAqKSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KKwkJCQkoKHRyYW5zcCAmIDB4RkYwMCkgPDwgMTYpIHwKKwkJCQkoKHJlZCAmIDB4RkYwMCkgPDwgOCkgfAorCQkJCSgoZ3JlZW4gJiAweEZGMDApKSB8ICgoYmx1ZSAmIDB4RkYwMCkgPj4gOCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMgYi9kcml2ZXJzL3ZpZGVvL2Vwc29uMTM1NWZiLmMKaW5kZXggY2EyYzU0Yy4uMzNiZTQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9lcHNvbjEzNTVmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZXBzb24xMzU1ZmIuYwpAQCAtNjMsMjMgKzYzLDEyIEBACiAKIHN0cnVjdCBlcHNvbjEzNTVfcGFyIHsKIAl1bnNpZ25lZCBsb25nIHJlZ19hZGRyOworCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBDT05GSUdfU1VQRVJICi0KLXN0YXRpYyBpbmxpbmUgdTggZXBzb24xMzU1X3JlYWRfcmVnKGludCBpbmRleCkKLXsKLQlyZXR1cm4gY3RybF9pbmIocGFyLnJlZ19hZGRyICsgaW5kZXgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZXBzb24xMzU1X3dyaXRlX3JlZyh1OCBkYXRhLCBpbnQgaW5kZXgpCi17Ci0JY3RybF9vdXRiKGRhdGEsIHBhci5yZWdfYWRkciArIGluZGV4KTsKLX0KLQotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNKQorI2lmIGRlZmluZWQoQ09ORklHX0FSTSkKIAogIyBpZmRlZiBDT05GSUdfQVJDSF9DRUlWQQogIyAgaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KQEAgLTI4OSw3ICsyNzgsNyBAQAogCXN0cnVjdCBlcHNvbjEzNTVfcGFyICpwYXIgPSBpbmZvLT5wYXI7CiAKIAlzd2l0Y2ggKGJsYW5rX21vZGUpIHsKLQljYXNlIEZCX0JMQU5LX1VOQkxBTktJTkc6CisJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgogCWNhc2UgRkJfQkxBTktfTk9STUFMOgogCQlsY2RfZW5hYmxlKHBhciwgMSk7CiAJCWJhY2tsaWdodF9lbmFibGUoMSk7CkBAIC02MzUsNyArNjI0LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGVwc29uMTM1NV9wYXIpICsgc2l6ZW9mKHUzMikgKiAyNTYsICZkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZXBzb24xMzU1X3BhciksICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBiYWlsOwpAQCAtNjQ4LDcgKzYzNyw3IEBACiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBiYWlsOwogCX0KLQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICh2b2lkICopKGRlZmF1bHRfcGFyICsgMSk7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBkZWZhdWx0X3Bhci0+cHNldWRvX3BhbGV0dGU7CiAKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoRVBTT04xMzU1RkJfRkJfUEhZUywgRVBTT04xMzU1RkJfRkJfTEVOKTsKIAlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMgYi9kcml2ZXJzL3ZpZGVvL2ZibWVtLmMKaW5kZXggMzhjMmUyNS4uMjE1YWM1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZmJtZW0uYwpAQCAtMzMsMTggKzMzLDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+Ci0KLSNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKSB8fCBkZWZpbmVkKENPTkZJR19BUFVTKQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAKKyNpbmNsdWRlIDxhc20vZmIuaD4KKworCiAgICAgLyoKICAgICAgKiAgRnJhbWUgYnVmZmVyIGRldmljZSBpbml0aWFsaXphdGlvbiBhbmQgc2V0dXAgcm91dGluZXMKICAgICAgKi8KQEAgLTQxMSwxMCArNDA0LDE0NiBAQAogCX0KIH0KIAorc3RhdGljIGludCBmYl9zaG93X2xvZ29fbGluZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHJvdGF0ZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmxvZ28sIGludCB5LAorCQkJICAgICB1bnNpZ25lZCBpbnQgbikKK3sKKwl1MzIgKnBhbGV0dGUgPSBOVUxMLCAqc2F2ZWRfcHNldWRvX3BhbGV0dGUgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmxvZ29fbmV3ID0gTlVMTCwgKmxvZ29fcm90YXRlID0gTlVMTDsKKwlzdHJ1Y3QgZmJfaW1hZ2UgaW1hZ2U7CisKKwkvKiBSZXR1cm4gaWYgdGhlIGZyYW1lIGJ1ZmZlciBpcyBub3QgbWFwcGVkIG9yIHN1c3BlbmRlZCAqLworCWlmIChsb2dvID09IE5VTEwgfHwgaW5mby0+c3RhdGUgIT0gRkJJTkZPX1NUQVRFX1JVTk5JTkcgfHwKKwkgICAgaW5mby0+ZmxhZ3MgJiBGQklORk9fTU9EVUxFKQorCQlyZXR1cm4gMDsKKworCWltYWdlLmRlcHRoID0gODsKKwlpbWFnZS5kYXRhID0gbG9nby0+ZGF0YTsKKworCWlmIChmYl9sb2dvLm5lZWRzX2NtYXByZXNldCkKKwkJZmJfc2V0X2xvZ29jbWFwKGluZm8sIGxvZ28pOworCisJaWYgKGZiX2xvZ28ubmVlZHNfdHJ1ZXBhbGV0dGUgfHwKKwkgICAgZmJfbG9nby5uZWVkc19kaXJlY3RwYWxldHRlKSB7CisJCXBhbGV0dGUgPSBrbWFsbG9jKDI1NiAqIDQsIEdGUF9LRVJORUwpOworCQlpZiAocGFsZXR0ZSA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGZiX2xvZ28ubmVlZHNfdHJ1ZXBhbGV0dGUpCisJCQlmYl9zZXRfbG9nb190cnVlcGFsZXR0ZShpbmZvLCBsb2dvLCBwYWxldHRlKTsKKwkJZWxzZQorCQkJZmJfc2V0X2xvZ29fZGlyZWN0cGFsZXR0ZShpbmZvLCBsb2dvLCBwYWxldHRlKTsKKworCQlzYXZlZF9wc2V1ZG9fcGFsZXR0ZSA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCQlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhbGV0dGU7CisJfQorCisJaWYgKGZiX2xvZ28uZGVwdGggPD0gNCkgeworCQlsb2dvX25ldyA9IGttYWxsb2MobG9nby0+d2lkdGggKiBsb2dvLT5oZWlnaHQsIEdGUF9LRVJORUwpOworCQlpZiAobG9nb19uZXcgPT0gTlVMTCkgeworCQkJa2ZyZWUocGFsZXR0ZSk7CisJCQlpZiAoc2F2ZWRfcHNldWRvX3BhbGV0dGUpCisJCQkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBzYXZlZF9wc2V1ZG9fcGFsZXR0ZTsKKwkJCXJldHVybiAwOworCQl9CisJCWltYWdlLmRhdGEgPSBsb2dvX25ldzsKKwkJZmJfc2V0X2xvZ28oaW5mbywgbG9nbywgbG9nb19uZXcsIGZiX2xvZ28uZGVwdGgpOworCX0KKworCWltYWdlLmR4ID0gMDsKKwlpbWFnZS5keSA9IHk7CisJaW1hZ2Uud2lkdGggPSBsb2dvLT53aWR0aDsKKwlpbWFnZS5oZWlnaHQgPSBsb2dvLT5oZWlnaHQ7CisKKwlpZiAocm90YXRlKSB7CisJCWxvZ29fcm90YXRlID0ga21hbGxvYyhsb2dvLT53aWR0aCAqCisJCQkJICAgICAgbG9nby0+aGVpZ2h0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKGxvZ29fcm90YXRlKQorCQkJZmJfcm90YXRlX2xvZ28oaW5mbywgbG9nb19yb3RhdGUsICZpbWFnZSwgcm90YXRlKTsKKwl9CisKKwlmYl9kb19zaG93X2xvZ28oaW5mbywgJmltYWdlLCByb3RhdGUsIG4pOworCisJa2ZyZWUocGFsZXR0ZSk7CisJaWYgKHNhdmVkX3BzZXVkb19wYWxldHRlICE9IE5VTEwpCisJCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2F2ZWRfcHNldWRvX3BhbGV0dGU7CisJa2ZyZWUobG9nb19uZXcpOworCWtmcmVlKGxvZ29fcm90YXRlKTsKKwlyZXR1cm4gbG9nby0+aGVpZ2h0OworfQorCisKKyNpZmRlZiBDT05GSUdfRkJfTE9HT19FWFRSQQorCisjZGVmaW5lIEZCX0xPR09fRVhfTlVNX01BWCAxMAorc3RhdGljIHN0cnVjdCBsb2dvX2RhdGFfZXh0cmEgeworCWNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvOworCXVuc2lnbmVkIGludCBuOworfSBmYl9sb2dvX2V4W0ZCX0xPR09fRVhfTlVNX01BWF07CitzdGF0aWMgdW5zaWduZWQgaW50IGZiX2xvZ29fZXhfbnVtOworCit2b2lkIGZiX2FwcGVuZF9leHRyYV9sb2dvKGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlpZiAoIW4gfHwgZmJfbG9nb19leF9udW0gPT0gRkJfTE9HT19FWF9OVU1fTUFYKQorCQlyZXR1cm47CisKKwlmYl9sb2dvX2V4W2ZiX2xvZ29fZXhfbnVtXS5sb2dvID0gbG9nbzsKKwlmYl9sb2dvX2V4W2ZiX2xvZ29fZXhfbnVtXS5uID0gbjsKKwlmYl9sb2dvX2V4X251bSsrOworfQorCitzdGF0aWMgaW50IGZiX3ByZXBhcmVfZXh0cmFfbG9nb3Moc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkJICB1bnNpZ25lZCBpbnQgeXJlcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZJWE1FOiBsb2dvX2V4IHN1cHBvcnRzIG9ubHkgdHJ1ZWNvbG9yIGZiLiAqLworCWlmIChpbmZvLT5maXgudmlzdWFsICE9IEZCX1ZJU1VBTF9UUlVFQ09MT1IpCisJCWZiX2xvZ29fZXhfbnVtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBmYl9sb2dvX2V4X251bTsgaSsrKSB7CisJCWhlaWdodCArPSBmYl9sb2dvX2V4W2ldLmxvZ28tPmhlaWdodDsKKwkJaWYgKGhlaWdodCA+IHlyZXMpIHsKKwkJCWhlaWdodCAtPSBmYl9sb2dvX2V4W2ldLmxvZ28tPmhlaWdodDsKKwkJCWZiX2xvZ29fZXhfbnVtID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBoZWlnaHQ7Cit9CisKK3N0YXRpYyBpbnQgZmJfc2hvd19leHRyYV9sb2dvcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHksIGludCByb3RhdGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJfbG9nb19leF9udW07IGkrKykKKwkJeSArPSBmYl9zaG93X2xvZ29fbGluZShpbmZvLCByb3RhdGUsCisJCQkJICAgICAgIGZiX2xvZ29fZXhbaV0ubG9nbywgeSwgZmJfbG9nb19leFtpXS5uKTsKKworCXJldHVybiB5OworfQorCisjZWxzZSAvKiAhQ09ORklHX0ZCX0xPR09fRVhUUkEgKi8KKworc3RhdGljIGlubGluZSBpbnQgZmJfcHJlcGFyZV9leHRyYV9sb2dvcyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQkJIHVuc2lnbmVkIGludCBoZWlnaHQsCisJCQkJCSB1bnNpZ25lZCBpbnQgeXJlcykKK3sKKwlyZXR1cm4gaGVpZ2h0OworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9zaG93X2V4dHJhX2xvZ29zKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgeSwgaW50IHJvdGF0ZSkKK3sKKwlyZXR1cm4geTsKK30KKworI2VuZGlmIC8qIENPTkZJR19GQl9MT0dPX0VYVFJBICovCisKKwogaW50IGZiX3ByZXBhcmVfbG9nbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHJvdGF0ZSkKIHsKIAlpbnQgZGVwdGggPSBmYl9nZXRfY29sb3JfZGVwdGgoJmluZm8tPnZhciwgJmluZm8tPmZpeCk7Ci0JaW50IHlyZXM7CisJdW5zaWduZWQgaW50IHlyZXM7CiAKIAltZW1zZXQoJmZiX2xvZ28sIDAsIHNpemVvZihzdHJ1Y3QgbG9nb19kYXRhKSk7CiAKQEAgLTQ1Niw3ICs1ODUsNyBAQAogCWlmICghZmJfbG9nby5sb2dvKSB7CiAJCXJldHVybiAwOwogCX0KLQkKKwogCWlmIChyb3RhdGUgPT0gRkJfUk9UQVRFX1VSIHx8IHJvdGF0ZSA9PSBGQl9ST1RBVEVfVUQpCiAJCXlyZXMgPSBpbmZvLT52YXIueXJlczsKIAllbHNlCkBAIC00NzMsNzUgKzYwMiwyMCBAQAogCWVsc2UgaWYgKGZiX2xvZ28ubG9nby0+dHlwZSA9PSBMSU5VWF9MT0dPX1ZHQTE2KQogCQlmYl9sb2dvLmRlcHRoID0gNDsKIAllbHNlCi0JCWZiX2xvZ28uZGVwdGggPSAxOwkJCi0JcmV0dXJuIGZiX2xvZ28ubG9nby0+aGVpZ2h0OworCQlmYl9sb2dvLmRlcHRoID0gMTsKKworCXJldHVybiBmYl9wcmVwYXJlX2V4dHJhX2xvZ29zKGluZm8sIGZiX2xvZ28ubG9nby0+aGVpZ2h0LCB5cmVzKTsKIH0KIAogaW50IGZiX3Nob3dfbG9nbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHJvdGF0ZSkKIHsKLQl1MzIgKnBhbGV0dGUgPSBOVUxMLCAqc2F2ZWRfcHNldWRvX3BhbGV0dGUgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgKmxvZ29fbmV3ID0gTlVMTCwgKmxvZ29fcm90YXRlID0gTlVMTDsKLQlzdHJ1Y3QgZmJfaW1hZ2UgaW1hZ2U7CisJaW50IHk7CiAKLQkvKiBSZXR1cm4gaWYgdGhlIGZyYW1lIGJ1ZmZlciBpcyBub3QgbWFwcGVkIG9yIHN1c3BlbmRlZCAqLwotCWlmIChmYl9sb2dvLmxvZ28gPT0gTlVMTCB8fCBpbmZvLT5zdGF0ZSAhPSBGQklORk9fU1RBVEVfUlVOTklORyB8fAotCSAgICBpbmZvLT5mbGFncyAmIEZCSU5GT19NT0RVTEUpCi0JCXJldHVybiAwOworCXkgPSBmYl9zaG93X2xvZ29fbGluZShpbmZvLCByb3RhdGUsIGZiX2xvZ28ubG9nbywgMCwKKwkJCSAgICAgIG51bV9vbmxpbmVfY3B1cygpKTsKKwl5ID0gZmJfc2hvd19leHRyYV9sb2dvcyhpbmZvLCB5LCByb3RhdGUpOwogCi0JaW1hZ2UuZGVwdGggPSA4OwotCWltYWdlLmRhdGEgPSBmYl9sb2dvLmxvZ28tPmRhdGE7Ci0KLQlpZiAoZmJfbG9nby5uZWVkc19jbWFwcmVzZXQpCi0JCWZiX3NldF9sb2dvY21hcChpbmZvLCBmYl9sb2dvLmxvZ28pOwotCi0JaWYgKGZiX2xvZ28ubmVlZHNfdHJ1ZXBhbGV0dGUgfHwgCi0JICAgIGZiX2xvZ28ubmVlZHNfZGlyZWN0cGFsZXR0ZSkgewotCQlwYWxldHRlID0ga21hbGxvYygyNTYgKiA0LCBHRlBfS0VSTkVMKTsKLQkJaWYgKHBhbGV0dGUgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCi0JCWlmIChmYl9sb2dvLm5lZWRzX3RydWVwYWxldHRlKQotCQkJZmJfc2V0X2xvZ29fdHJ1ZXBhbGV0dGUoaW5mbywgZmJfbG9nby5sb2dvLCBwYWxldHRlKTsKLQkJZWxzZQotCQkJZmJfc2V0X2xvZ29fZGlyZWN0cGFsZXR0ZShpbmZvLCBmYl9sb2dvLmxvZ28sIHBhbGV0dGUpOwotCi0JCXNhdmVkX3BzZXVkb19wYWxldHRlID0gaW5mby0+cHNldWRvX3BhbGV0dGU7Ci0JCWluZm8tPnBzZXVkb19wYWxldHRlID0gcGFsZXR0ZTsKLQl9Ci0KLQlpZiAoZmJfbG9nby5kZXB0aCA8PSA0KSB7Ci0JCWxvZ29fbmV3ID0ga21hbGxvYyhmYl9sb2dvLmxvZ28tPndpZHRoICogZmJfbG9nby5sb2dvLT5oZWlnaHQsIAotCQkJCSAgIEdGUF9LRVJORUwpOwotCQlpZiAobG9nb19uZXcgPT0gTlVMTCkgewotCQkJa2ZyZWUocGFsZXR0ZSk7Ci0JCQlpZiAoc2F2ZWRfcHNldWRvX3BhbGV0dGUpCi0JCQkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBzYXZlZF9wc2V1ZG9fcGFsZXR0ZTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWltYWdlLmRhdGEgPSBsb2dvX25ldzsKLQkJZmJfc2V0X2xvZ28oaW5mbywgZmJfbG9nby5sb2dvLCBsb2dvX25ldywgZmJfbG9nby5kZXB0aCk7Ci0JfQotCi0JaW1hZ2UuZHggPSAwOwotCWltYWdlLmR5ID0gMDsKLQlpbWFnZS53aWR0aCA9IGZiX2xvZ28ubG9nby0+d2lkdGg7Ci0JaW1hZ2UuaGVpZ2h0ID0gZmJfbG9nby5sb2dvLT5oZWlnaHQ7Ci0KLQlpZiAocm90YXRlKSB7Ci0JCWxvZ29fcm90YXRlID0ga21hbGxvYyhmYl9sb2dvLmxvZ28tPndpZHRoICoKLQkJCQkgICAgICBmYl9sb2dvLmxvZ28tPmhlaWdodCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChsb2dvX3JvdGF0ZSkKLQkJCWZiX3JvdGF0ZV9sb2dvKGluZm8sIGxvZ29fcm90YXRlLCAmaW1hZ2UsIHJvdGF0ZSk7Ci0JfQotCi0JZmJfZG9fc2hvd19sb2dvKGluZm8sICZpbWFnZSwgcm90YXRlLCBudW1fb25saW5lX2NwdXMoKSk7Ci0KLQlrZnJlZShwYWxldHRlKTsKLQlpZiAoc2F2ZWRfcHNldWRvX3BhbGV0dGUgIT0gTlVMTCkKLQkJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBzYXZlZF9wc2V1ZG9fcGFsZXR0ZTsKLQlrZnJlZShsb2dvX25ldyk7Ci0Ja2ZyZWUobG9nb19yb3RhdGUpOwotCXJldHVybiBmYl9sb2dvLmxvZ28tPmhlaWdodDsKKwlyZXR1cm4geTsKIH0KICNlbHNlCiBpbnQgZmJfcHJlcGFyZV9sb2dvKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgcm90YXRlKSB7IHJldHVybiAwOyB9CkBAIC0xMTU1LDE3ICsxMjI5LDE1IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIGZiX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKIHsKIAlpbnQgZmJpZHggPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSByZWdpc3RlcmVkX2ZiW2ZiaWR4XTsKIAlzdHJ1Y3QgZmJfb3BzICpmYiA9IGluZm8tPmZib3BzOwogCXVuc2lnbmVkIGxvbmcgb2ZmOwotI2lmICFkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX3NwYXJjX3Y5X18pCiAJdW5zaWduZWQgbG9uZyBzdGFydDsKIAl1MzIgbGVuOwotI2VuZGlmCiAKIAlpZiAodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExODAsMTIgKzEyNTIsNiBAQAogCQlyZXR1cm4gcmVzOwogCX0KIAotI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pCi0JLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBhbGwgZmIgZHJpdmVycyBzaG91bGQgaGF2ZSB0aGVpciBvd24KLQkgICBtbWFwIHJvdXRpbmVzICovCi0JcmV0dXJuIC1FSU5WQUw7Ci0jZWxzZQotCS8qICFzcGFyYzMyLi4uICovCiAJbG9ja19rZXJuZWwoKTsKIAogCS8qIGZyYW1lIGJ1ZmZlciBtZW1vcnkgKi8KQEAgLTEyMDksNTAgKzEyNzUsMTEgQEAKIAl2bWEtPnZtX3Bnb2ZmID0gb2ZmID4+IFBBR0VfU0hJRlQ7CiAJLyogVGhpcyBpcyBhbiBJTyBtYXAgLSB0ZWxsIG1heWR1bXAgdG8gc2tpcCB0aGlzIFZNQSAqLwogCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKLSNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQotI2lmIGRlZmluZWQoQ09ORklHX1NVTjMpCi0JcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gU1VOM19QQUdFX05PQ0FDSEU7Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19NTVUpCi0JaWYgKENQVV9JU18wMjBfT1JfMDMwKQotCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT0NBQ0hFMDMwOwotCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgewotCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPSBfQ0FDSEVNQVNLMDQwOwotCQkvKiBVc2Ugbm8tY2FjaGUgbW9kZSwgc2VyaWFsaXplZCAqLwotCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT0NBQ0hFX1M7Ci0JfQotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQotCXZtYS0+dm1fcGFnZV9wcm90ID0gcGh5c19tZW1fYWNjZXNzX3Byb3QoZmlsZSwgb2ZmID4+IFBBR0VfU0hJRlQsCi0JCQkJCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAotCQkJCQkJIHZtYS0+dm1fcGFnZV9wcm90KTsKLSNlbGlmIGRlZmluZWQoX19hbHBoYV9fKQotCS8qIENhY2hpbmcgaXMgb2ZmIGluIHRoZSBJL08gc3BhY2UgcXVhZHJhbnQgYnkgZGVzaWduLiAgKi8KLSNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQotCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7Ci0jZWxpZiBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfdjlfXykKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwotI2VsaWYgZGVmaW5lZChfX2hwcGFfXykKLQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT19DQUNIRTsKLSNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX3NoX18pIHx8IGRlZmluZWQoX19tMzJyX18pCi0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKLSNlbGlmIGRlZmluZWQoX19hdnIzMl9fKQotCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QoKHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpCi0JCQkJICAgICAgJiB+X1BBR0VfQ0FDSEFCTEUpCi0JCQkJICAgICB8IChfUEFHRV9CVUZGRVIgfCBfUEFHRV9ESVJUWSkpOwotI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKLQlpZiAoZWZpX3JhbmdlX2lzX3djKHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCi0JCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0JZWxzZQotCQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwotI2Vsc2UKLSN3YXJuaW5nIFdoYXQgZG8gd2UgaGF2ZSB0byBkbyBoZXJlPz8KLSNlbmRpZgorCWZiX3BncHJvdGVjdChmaWxlLCB2bWEsIG9mZik7CiAJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZiA+PiBQQUdFX1NISUZULAogCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkKIAkJcmV0dXJuIC1FQUdBSU47CiAJcmV0dXJuIDA7Ci0jZW5kaWYgLyogIXNwYXJjMzIgKi8KIH0KIAogc3RhdGljIGludApAQCAtMTM4OCwxNyArMTQxNSwzNCBAQAogICoKICAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCiAgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBub3RpZnkgdGhlIGZyYW1lYnVmZmVyIGNvbnNvbGUKKyAqICAgICAgdG8gcmVsZWFzZSB0aGUgZHJpdmVyLgorICoKKyAqICAgICAgVGhpcyBpcyBtZWFudCB0byBiZSBjYWxsZWQgd2l0aGluIGEgZHJpdmVyJ3MgbW9kdWxlX2V4aXQoKQorICogICAgICBmdW5jdGlvbi4gSWYgdGhpcyBpcyBjYWxsZWQgb3V0c2lkZSBtb2R1bGVfZXhpdCgpLCBlbnN1cmUKKyAqICAgICAgdGhhdCB0aGUgZHJpdmVyIGltcGxlbWVudHMgZmJfb3BlbigpIGFuZCBmYl9yZWxlYXNlKCkgdG8KKyAqICAgICAgY2hlY2sgdGhhdCBubyBwcm9jZXNzZXMgYXJlIHVzaW5nIHRoZSBkZXZpY2UuCiAgKi8KIAogaW50CiB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQogewogCXN0cnVjdCBmYl9ldmVudCBldmVudDsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0ID0gMDsKIAogCWkgPSBmYl9pbmZvLT5ub2RlOwotCWlmICghcmVnaXN0ZXJlZF9mYltpXSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFyZWdpc3RlcmVkX2ZiW2ldKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlldmVudC5pbmZvID0gZmJfaW5mbzsKKwlyZXQgPSBmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX0ZCX1VOQklORCwgJmV2ZW50KTsKKworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KIAogCWlmIChmYl9pbmZvLT5waXhtYXAuYWRkciAmJgogCSAgICAoZmJfaW5mby0+cGl4bWFwLmZsYWdzICYgRkJfUElYTUFQX0RFRkFVTFQpKQpAQCAtMTQxMCw3ICsxNDU0LDggQEAKIAlkZXZpY2VfZGVzdHJveShmYl9jbGFzcywgTUtERVYoRkJfTUFKT1IsIGkpKTsKIAlldmVudC5pbmZvID0gZmJfaW5mbzsKIAlmYl9ub3RpZmllcl9jYWxsX2NoYWluKEZCX0VWRU5UX0ZCX1VOUkVHSVNURVJFRCwgJmV2ZW50KTsKLQlyZXR1cm4gMDsKK2RvbmU6CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZtMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL2ZtMmZiLmMKaW5kZXggNzBmZjU1Yi4uNmM5MWM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mbTJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vZm0yZmIuYwpAQCAtMTk1LDEzICsxOTUsMTUgQEAKIHN0YXRpYyBpbnQgZm0yZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JaWYgKHJlZ25vID4gaW5mby0+Y21hcC5sZW4pCi0JCXJldHVybiAxOwotCXJlZCA+Pj0gODsKLQlncmVlbiA+Pj0gODsKLQlibHVlID4+PSA4OworCWlmIChyZWdubyA8IDE2KSB7CisJCXJlZCA+Pj0gODsKKwkJZ3JlZW4gPj49IDg7CisJCWJsdWUgPj49IDg7CiAKLQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gKHJlZCA8PCAxNikgfCAoZ3JlZW4gPDwgOCkgfCBibHVlOworCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gKHJlZCA8PCAxNikgfAorCQkJKGdyZWVuIDw8IDgpIHwgYmx1ZTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjM3LDcgKzIzOSw3IEBACiAJaWYgKCF6b3Jyb19yZXF1ZXN0X2RldmljZSh6LCJmbTJmYiIpKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKDI1NiAqIHNpemVvZih1MzIpLCAmei0+ZGV2KTsKKwlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2MoMTYgKiBzaXplb2YodTMyKSwgJnotPmRldik7CiAJaWYgKCFpbmZvKSB7CiAJCXpvcnJvX3JlbGVhc2VfZGV2aWNlKHopOwogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYyBiL2RyaXZlcnMvdmlkZW8vZ2JlZmIuYwppbmRleCBiZjBlNjBiLi5iOWI1NzJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2diZWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9nYmVmYi5jCkBAIC04Niw3ICs4Niw3IEBACiAKIHN0YXRpYyBpbnQgeXBhbiwgeXdyYXA7CiAKLXN0YXRpYyB1aW50MzJfdCBwc2V1ZG9fcGFsZXR0ZVsyNTZdOworc3RhdGljIHVpbnQzMl90IHBzZXVkb19wYWxldHRlWzE2XTsKIAogc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9faW5pdGRhdGEgPSBOVUxMOwogCkBAIC04NTQsOCArODU0LDcgQEAKIAlncmVlbiA+Pj0gODsKIAlibHVlID4+PSA4OwogCi0Jc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKLQljYXNlIDg6CisJaWYgKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCA8PSA4KSB7CiAJCS8qIHdhaXQgZm9yIHRoZSBjb2xvciBtYXAgRklGTyB0byBoYXZlIGEgZnJlZSBlbnRyeSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgMTAwMCAmJiBnYmUtPmNtX2ZpZm8gPj0gNjM7IGkrKykKIAkJCXVkZWxheSgxMCk7CkBAIC04NjQsMjMgKzg2MywyNSBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAkJZ2JlLT5jbWFwW3JlZ25vXSA9IChyZWQgPDwgMjQpIHwgKGdyZWVuIDw8IDE2KSB8IChibHVlIDw8IDgpOwotCQlicmVhazsKLQljYXNlIDE1OgotCWNhc2UgMTY6Ci0JCXJlZCA+Pj0gMzsKLQkJZ3JlZW4gPj49IDM7Ci0JCWJsdWUgPj49IDM7Ci0JCXBzZXVkb19wYWxldHRlW3JlZ25vXSA9Ci0JCQkocmVkIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSB8Ci0JCQkoZ3JlZW4gPDwgaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAotCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJcHNldWRvX3BhbGV0dGVbcmVnbm9dID0KLQkJCShyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKLQkJCShncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8Ci0JCQkoYmx1ZSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpOwotCQlicmVhazsKKwl9IGVsc2UgaWYgKHJlZ25vIDwgMTYpIHsKKwkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSAxNToKKwkJY2FzZSAxNjoKKwkJCXJlZCA+Pj0gMzsKKwkJCWdyZWVuID4+PSAzOworCQkJYmx1ZSA+Pj0gMzsKKwkJCXBzZXVkb19wYWxldHRlW3JlZ25vXSA9CisJCQkJKHJlZCA8PCBpbmZvLT52YXIucmVkLm9mZnNldCkgfAorCQkJCShncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkJKGJsdWUgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJcHNldWRvX3BhbGV0dGVbcmVnbm9dID0KKwkJCQkocmVkIDw8IGluZm8tPnZhci5yZWQub2Zmc2V0KSB8CisJCQkJKGdyZWVuIDw8IGluZm8tPnZhci5ncmVlbi5vZmZzZXQpIHwKKwkJCQkoYmx1ZSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpOworCQkJYnJlYWs7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmggYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC5oCmluZGV4IDg4OWU0ZWEuLjMyOGFlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwLmgKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTAuaApAQCAtMjY2LDcgKzI2Niw3IEBACiAJc3RydWN0IGk4MTBmYl9pMmNfY2hhbiAgIGNoYW5bM107CiAJc3RydWN0IG11dGV4CQkgb3Blbl9sb2NrOwogCXVuc2lnbmVkIGludAkJIHVzZV9jb3VudDsKLQl1MzIgcHNldWRvX3BhbGV0dGVbMTddOworCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07CiAJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0X3BoeXM7CiAJdTggX19pb21lbSAqbW1pb19zdGFydF92aXJ0dWFsOwogCXU4ICplZGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaCBiL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKaW5kZXggODBiOTRjMS4uNjE0ODMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCkBAIC0zMDIsNyArMzAyLDcgQEAKIAl1MzIgcmluZ19sb2NrdXA7CiAKIAkvKiBwYWxldHRlICovCi0JdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKKwl1MzIgcHNldWRvX3BhbGV0dGVbMTZdOwogCiAJLyogY2hpcCBpbmZvICovCiAJaW50IHBjaV9jaGlwc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwppbmRleCA5Mzk3YmNlLi5kYTIxOWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwpAQCAtMTAsNiArMTAsMTEgQEAKIAogaWYgTE9HTwogCitjb25maWcgRkJfTE9HT19FWFRSQQorCWJvb2wKKwlkZXBlbmRzIG9uIEZCCisJZGVmYXVsdCB5IGlmIFNQVV9CQVNFCisKIGNvbmZpZyBMT0dPX0xJTlVYX01PTk8KIAlib29sICJTdGFuZGFyZCBibGFjayBhbmQgd2hpdGUgTGludXggbG9nbyIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQppbmRleCBiOTg1ZGZhLi5hNWZjNGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw4IEBACiBvYmotJChDT05GSUdfTE9HT19TVVBFUkhfQ0xVVDIyNCkJKz0gbG9nb19zdXBlcmhfY2x1dDIyNC5vCiBvYmotJChDT05GSUdfTE9HT19NMzJSX0NMVVQyMjQpCQkrPSBsb2dvX20zMnJfY2x1dDIyNC5vCiAKK29iai0kKENPTkZJR19TUFVfQkFTRSkJCQkrPSBsb2dvX3NwZV9jbHV0MjI0Lm8KKwogIyBIb3cgdG8gZ2VuZXJhdGUgbG9nbydzCiAKICMgVXNlIGxvZ28tY2ZpbGVzIHRvIHJldHJpZXZlIGxpc3Qgb2YgLmMgZmlsZXMgdG8gYmUgYnVpbHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvX3NwZV9jbHV0MjI0LnBwbSBiL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvX3NwZV9jbHV0MjI0LnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZhZDYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fc3BlX2NsdXQyMjQucHBtCkBAIC0wLDAgKzEsMjgzIEBACitQMworNDAgNDAKKzI1NQorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyICA2IDYgNgorMTUgMTUgMTUgIDIxIDIxIDIxICAxOSAxOSAxOSAgMTQgMTQgMTQgIDYgNiA2ICAyIDIgMgorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyICAyMSAyMSAyMSAgNTUgNTUgNTUKKzU2IDU2IDU2ICA1NCA1NCA1NCAgNTMgNTMgNTMgIDYwIDYwIDYwICA1NiA1NiA1NiAgMjUgMjUgMjUKKzYgNiA2ICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDIgMiAyICAyNyAyNyAyNyAgNjIgNjIgNjIgIDE3IDE3IDE5CisyIDIgNiAgMiAyIDYgIDIgMiA2ICAyIDIgNiAgMTYgMTYgMTggIDU3IDU3IDU3Cis0NSA0NSA0NSAgOCA4IDggIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMSAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAxNiAxNiAxNiAgNjIgNjIgNjIgIDggOCAxMCAgMiAyIDYKKzIgMiA2ICAyIDIgNiAgMiAyIDYgIDEyIDEyIDE0ICA2NyA2NyA2NyAgMTYgMTYgMTcKKzQ1IDQ1IDQ1ICA0MSA0MSA0MSAgNCA0IDQgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMiAyIDIgIDM1IDM1IDM1ICA0MCA0MCA0MCAgMiAyIDYgIDIgMiA2CisyIDIgNiAgMiAyIDYgIDIgMiA2ICAxNSAxNSAxNyAgNzAgNzAgNzAgIDI3IDI3IDI3CiszIDMgNiAgNjIgNjIgNjIgIDIwIDIwIDIwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDQgNCA0ICA1OCA1OCA1OCAgMTIgMTIgMTQgIDIgMiA2ICAyIDIgNgorMiAyIDYgIDIgMiA2ICAyIDIgNiAgNCA0IDcgIDQgNCA3ICAyIDIgNgorMiAyIDYgIDM0IDM0IDM2ICA0MCA0MCA0MCAgMyAzIDMgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA3IDcgNyAgNjQgNjQgNjQgIDIgMiA2ICA1IDUgNSAgMTcgMTcgMTcKKzMgMyA2ICAyIDIgNiAgMiAyIDYgIDE1IDE1IDE1ICAyMSAyMSAyMSAgNyA3IDEwCisyIDIgNiAgOCA4IDEwICA2MiA2MiA2MiAgNiA2IDYgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA3IDcgNyAgNjYgNjYgNjYgIDUgNSA4ICAxMjIgMTIyIDEyMiAgMTIyIDEyMiAxMjIKKzkgOSAxMSAgMyAzIDYgIDEwNCA5NiA4MSAgMTc5IDE3OSAxNzkgIDEyMiAxMjIgMTIyICAxMyAxMyAxMworMiAyIDYgIDIgMiA2ICA2NyA2NyA2NyAgMTAgMTAgMTAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA3IDcgNyAgNjUgNjUgNjUgIDQxIDQxIDQzICAxNTIgMTQ5IDE0MiAgMTkyIDE5MSAxODkKKzQ4IDQ4IDQ5ICAyMyAyMyAyNCAgMjI4IDIxMCAyMTAgIDg2IDg2IDg2ICAxOTIgMTkxIDE4OSAgNTkgNTkgNjEKKzIgMiA2ICAyIDIgNiAgNjQgNjQgNjQgIDE0IDE0IDE0ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAxICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNyA3IDcgIDY2IDY2IDY2ICA1OSA1OSA1OSAgNTkgNTkgNjEgIDg2IDg2IDg2Cis5OSA4NCA1MCAgNzggNjYgMjggIDE1MiAxNDkgMTQyICA1IDUgOCAgMTIyIDEyMiAxMjIgIDEwNCA5NiA4MQorMiAyIDYgIDIgMiA2ICA2NyA2NyA2NyAgMTQgMTQgMTQgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA1IDUgNSAgNjMgNjMgNjMgIDI0IDI0IDI0ICAxNTIgMTQ5IDE0MiAgMTc1IDEyMiAxMworMjM4IDE4NCAxMiAgMjIwIDE3MCAxMyAgMjI2IDE4MSA1MiAgMTEyIDg2IDMyICAxOTQgMTY1IDE1MSAgNDYgNDYgNDcKKzIgMiA2ICAyIDIgNiAgNjUgNjUgNjUgIDE3IDE3IDE3ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNSA1IDUgIDU5IDU5IDU5ICAyMSAyMSAyMSAgMTc1IDEyMiAxMyAgMjMxIDE3NCAxMQorMjQwIDE5MiAxMyAgMjM3IDE4MyA2MSAgMjQwIDE5MiAxMyAgMjQwIDE5MiAxMyAgMjM0IDE3OSAxNiAgODEgNjQgOQorMiAyIDYgIDIgMiA2ICA2MyA2MyA2MyAgMjUgMjUgMjUgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICA1IDUgNSAgNTQgNTQgNTQgIDUxIDQ4IDM5ICAxODkgMTM4IDkgIDIzOCAxODQgMTIKKzI0MCAxOTIgMTMgIDI0MCAxOTIgMTMgIDI0MCAxOTIgMTMgIDIxNSAxNjEgMTEgIDIwNyAxNTIgMTkgIDgxIDY0IDkKKzE2IDE2IDE4ICA1IDUgOCAgNDAgNDAgNDAgIDQ0IDQ0IDQ0ICA0IDQgNCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgNSA1IDUgIDU5IDU5IDU5ICAyNyAyNyAyNyAgMTI2IDEwNyA2NCAgMTg3IDEzNiAxMgorMjIwIDE3MCAxMyAgMjAxIDE0NyAyMCAgMTg5IDEzOCA5ICAxOTggMTU0IDQ2ICAxOTkgMTgyIDEyNSAgNzAgNzAgNzAKKzI3IDI3IDI3ICAxMDQgOTYgODEgIDEyIDEyIDE0ICA3MCA3MCA3MCAgMTYgMTYgMTYgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDE3IDE3IDE3ICA3MCA3MCA3MCAgMTIgMTIgMTIgIDE2OCAxNjggMTY4ICAxNzQgMTM1IDEzNQorMTc1IDEyMiAxMyAgMTc1IDEyMiAxMyAgMTc4IDE1MSA4MyAgMTkyIDE5MSAxODkgIDIzMyAyMzMgMjMzICAxNzkgMTc5IDE3OQorMyAzIDYgIDI5IDI5IDMxICAzIDMgNiAgNDEgNDEgNDEgIDQ0IDQ0IDQ0ICA1IDUgNQorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzggOCA4ICA1MyA1MyA1MyAgNDQgNDQgNDQgIDU5IDU5IDU5ICAyMzggMjM4IDIzOCAgMTkyIDE5MSAxODkKKzE5MiAxOTEgMTg5ICAxOTIgMTkxIDE4OSAgMjIxIDIwNSAyMDUgIDI0MCAyNDAgMjQwICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzcwIDcwIDcwICAyIDIgNiAgMiAyIDYgIDUgNSA4ICA2NyA2NyA2NyAgMjIgMjIgMjIKKzIgMiAyICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDUgNSA1CiszOCAzOCAzOCAgNTYgNTYgNTYgIDcgNyA5ICAyMjEgMjA1IDIwNSAgMjUzIDI1MyAyNTMgIDIzMyAyMzMgMjMzCisyMjEgMjA1IDIwNSAgMjMzIDIzMyAyMzMgIDI1MSAyNTEgMjUxICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisxOTIgMTkxIDE4OSAgMiAyIDYgIDIgMiA2ICAyIDIgNiAgMjUgMjUgMjUgIDY0IDY0IDY0CisxNSAxNSAxNSAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDIgMiAyICAyNyAyNyAyNworNjYgNjYgNjYgIDcgNyA5ICA4NiA4NiA4NiAgMjUyIDI1MiAyNTIgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUyIDI1MiAyNTIgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjQ0IDI0NCAyNDQgIDE5IDE5IDIxICAyIDIgNiAgMiAyIDYgIDIgMiA2ICAzOCAzOCAzOAorNTQgNTQgNTQgIDEwIDEwIDEwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAxNCAxNCAxNCAgNjIgNjIgNjIKKzEwIDEwIDEyICAzIDMgNiAgMTIyIDEyMiAxMjIgIDIzNSAyMzUgMjM1ICAyNTEgMjUxIDI1MSAgMjQ4IDI0OCAyNDgKKzIzNSAyMzUgMjM1ICAyNDggMjQ4IDI0OCAgMjUyIDI1MiAyNTIgIDI0NiAyNDYgMjQ2ICAyMzMgMjMzIDIzMyAgMjM3IDIyOCAyMjgKKzIyMyAyMDcgMjA3ICA3MCA3MCA3MCAgMiAyIDYgIDIgMiA2ICAyIDIgNiAgMiAyIDYKKzQ2IDQ2IDQ3ICAzOCAzOCAzOCAgNCA0IDQgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAyIDIgMiAgMzMgMzMgMzMgIDQ0IDQ0IDQ0Cis0IDQgNyAgOSA5IDExICAxNjggMTY4IDE2OCAgMjQwIDI0MCAyNDAgIDI1MiAyNTIgMjUyICAyNTIgMjUyIDI1MgorMjQ2IDI0NiAyNDYgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUxIDI1MSAyNTEgIDI0NSAyNDEgMjQxICAyMzMgMjMzIDIzMworMjIxIDIwNSAyMDUgIDE5MiAxOTEgMTg5ICAyOSAyOSAzMSAgMjcgMjcgMjcgIDkgOSAxMiAgMiAyIDYKKzMgMyA2ICA2NSA2NSA2NSAgMTUgMTUgMTUgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA2IDYgNiAgNTkgNTkgNTkgIDE5IDE5IDIxCisyNCAyNCAyNCAgODYgODYgODYgIDI0OSAyNDkgMjQ5ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjI4IDIxMCAyMTAgIDI0MSAyMzAgMjMwICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTEgMjUxIDI1MSAgMjI4IDIxMCAyMTAgIDE1MiAxNDkgMTQyICA1IDUgOCAgMjcgMjcgMjcgIDQgNCA3CisyIDIgNiAgNDYgNDYgNDcgIDM0IDM0IDM0ICAyIDIgMiAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMTYgMTYgMTYgIDY3IDY3IDY3ICAxOSAxOSAyMQorMTIgMTIgMTQgIDIyMyAyMDcgMjA3ICAyNTQgMjAgMjAgIDI1NCAyMCAyMCAgMjUzIDEyNyAxMjcgIDI0MiAyMjMgMjIzCisyNTQgMjAgMjAgIDI1MyAxMjcgMTI3ICAyNTQgNDggNDggIDI0MiAyMjMgMjIzICAyNTQgODYgODYgIDI1NCAyMCAyMAorMjU0IDIwIDIwICAyNTMgMTM3IDEzNyAgMjMzIDIzMyAyMzMgIDMyIDMyIDMyICAzNSAzNSAzNSAgMjMgMjMgMjQKKzIgMiA2ICAxNSAxNSAxNSAgNjAgNjAgNjAgIDYgNiA2ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDQgNCA0ICAzOCAzOCAzOCAgNDggNDggNDkgIDIyIDIyIDIyCis4NiA4NiA4NiAgMjUzIDI1MyAyNTMgIDI1NCAyMCAyMCAgMjQxIDIzMCAyMzAgIDIyNyAyMTYgMTg2ICAyNTMgMTM3IDEzNworMjUzIDEzNyAxMzcgIDI1MyAyNTMgMjUzICAyNTMgMTM3IDEzNyAgMjUzIDEzNyAxMzcgIDI1NCA0OCA0OCAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDYyIDYyIDYyICAyIDIgNiAgMjMgMjMgMjQKKzIgMiA2ICAyIDIgNiAgNjIgNjIgNjIgIDE3IDE3IDE3ICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDE0IDE0IDE0ICA3MCA3MCA3MCAgMTQgMTQgMTQgIDE2IDE2IDE4CisxNzkgMTc5IDE3OSAgMjUzIDI1MyAyNTMgIDIyNyAyMTYgMTg2ICAyNTQgNDggNDggIDI0MCAyMTkgMTYwICAyNTMgMTI3IDEyNworMjU0IDIwIDIwICAyNTMgMTM3IDEzNyAgMjU0IDg2IDg2ICAyMzEgMjAzIDE0MSAgMjU0IDIwIDIwICAyNTQgMjAgMjAKKzI1MyAxMzcgMTM3ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDEwNCA5NiA4MSAgMiAyIDYgIDIzIDIzIDI0CisyIDIgNiAgMiAyIDYgIDQ2IDQ2IDQ3ICAyNyAyNyAyNyAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDQgNCA0ICAzOSAzOSAzOSAgNDIgNDIgNDMgIDE5IDE5IDIxICAxMyAxMyAxMworMjI4IDIxMCAyMTAgIDI0MiAyMjMgMjIzICAyNTMgMjUzIDI1MyAgMjQyIDIyMyAyMjMgIDI1MyAxMjcgMTI3ICAyNTMgMTI3IDEyNworMjUzIDEyNyAxMjcgIDI1MyAxMjcgMTI3ICAyNTMgMTM3IDEzNyAgMjUzIDI1MyAyNTMgIDI1NCA0OCA0OCAgMjUzIDI1MyAyNTMKKzIyOCAyMTAgMjEwICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDEyMiAxMjIgMTIyICAyIDIgNiAgMTkgMTkgMTkKKzIgMiA2ICAyIDIgNiAgMzkgMzkgMzkgIDM4IDM4IDM4ICAzIDMgMyAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgOCA4IDggIDYwIDYwIDYwICAzIDMgNiAgMzMgMzMgMzMgIDM4IDM4IDM4CisyNTMgMTM3IDEzNyAgMjU0IDg2IDg2ICAyNTMgMTM3IDEzNyAgMjU0IDg2IDg2ICAyNTMgMTM3IDEzNyAgMjA5IDE5NyAxNjgKKzI1MyAxMjcgMTI3ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMTI3IDEyNyAgMjU0IDg2IDg2CisyNTQgODYgODYgIDI1MyAxMzcgMTM3ICAyNTMgMjUzIDI1MyAgMTIyIDEyMiAxMjIgIDIgMiA2ICAxNyAxNyAxNworMiAyIDYgIDIgMiA2ICAzNCAzNCAzNiAgNDIgNDIgNDMgIDMgMyAzICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAxMyAxMyAxMyAgNTkgNTkgNTkgIDIgMiA2ICA5IDkgMTIgIDU2IDU2IDU2CisyNTIgMjUyIDI1MiAgMjQwIDIxOSAxNjAgIDI1MyAxMzcgMTM3ICAyNDAgMjE5IDE2MCAgMjUzIDI1MyAyNTMgIDIzNyAyMjggMjI4CisyNTQgODYgODYgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNDIgMjIzIDIyMworMjI3IDIxNiAxODYgIDI0OSAyNDkgMjQ5ICAyNTMgMjUzIDI1MyAgMTIyIDEyMiAxMjIgIDE2IDE2IDE3ICAxNyAxNyAxNworMTIgMTIgMTQgIDMgMyA2ICAzOSAzOSAzOSAgMzggMzggMzggIDMgMyAzICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIKKzUgNSA1ICAyMiAyMiAyMiAgMTA0IDk2IDgxICAxODcgMTM2IDEyICAyMDcgMTUyIDE5ICA1MSA0OCAzOQorMjIxIDIwNSAyMDUgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNDAgMjQwIDI0MAorMjUwIDI0NyAyNDMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI1MCAyNDcgMjQzICAyNDAgMjE5IDE2MCAgOTkgODQgNTAgIDUgNSA4ICAyIDIgNgorNyA3IDkgIDQ2IDQ2IDQ3ICA1OCA1OCA1OCAgMzUgMzUgMzUgIDMgMyAzICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICA4IDggOCAgMzMgMzMgMzMKKzU4IDU4IDU4ICA4NiA4NiA4NiAgMTcwIDEzNiA1MyAgMjM5IDE4MiAxMyAgMjQ2IDE5MCAxNCAgMjIwIDE3MCAxMworNDQgMzggMjkgIDE3OSAxNzkgMTc5ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNDAgMjQwIDI0MAorMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MworMjUzIDI1MyAyNTMgIDI0MCAyMTkgMTYwICAyNDAgMTkyIDEzICAxMTIgODYgMzIgIDIgMiA2ICAyIDIgNgorMyAzIDYgIDQxIDMzIDIwICAyMjAgMTcwIDEzICA1MyA1MyA1MyAgNCA0IDQgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMiAyIDIgIDMyIDMyIDMyICAxNTAgMTE2IDQ0CisyMTUgMTYxIDExICAyMTUgMTYxIDExICAyMjggMTcwIDExICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisxODcgMTM2IDEyICA5IDkgMTEgIDEyMiAxMjIgMTIyICAyNTEgMjUxIDI1MSAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyNDggMjQ4IDI0OCAgMjExIDE5NiAxMzUgIDIzOSAxODIgMTMgIDE3NSAxMjIgMTMgIDYgNSA2ICAyIDIgNgorMTYgMTQgMTIgIDE4NyAxMzYgMTIgIDIzOCAxODQgMTIgIDg0IDc4IDY1ICAxMCAxMCAxMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA0IDQgNCAgNTMgNTMgNTMgIDIwNyAxNTIgMTkKKzI0MiAxODUgMTMgIDI0NSAxODggMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0MCAxOTIgMTMgIDgxIDY0IDkgIDIgMiA2ICA4NiA4NiA4NiAgMjQ0IDI0NCAyNDQgIDI1MyAyNTMgMjUzCisyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzCisyMzMgMjMzIDIzMyAgMTk5IDE4MiAxMjUgIDIzMSAxNzQgMTEgIDIwNyAxNTIgMTkgIDE3NSAxMjIgMTMgIDE3NSAxMjIgMTMKKzIwMSAxNDcgMjAgIDIzOSAxODIgMTMgIDI0NCAxODcgMTQgIDE1MCAxMTYgNDQgIDM1IDM1IDM1ICA2IDYgNgorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDUgNSA1ICA1MyA1MyA1MyAgMjAxIDE0NyAyMAorMjQyIDE4NSAxMyAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNAorMjQ2IDE5MCAxNCAgMjIwIDE3MCAxMyAgMTMgMTEgMTAgIDIgMiA2ICAxNTIgMTQ5IDE0MiAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzIzNSAyMzUgMjM1ICAxOTkgMTgyIDEyNSAgMjI4IDE3MCAxMSAgMjM0IDE3NyAxMiAgMjI2IDE2OCAxMSAgMjI2IDE2OCAxMQorMjM0IDE3NyAxMiAgMjQ2IDE5MCAxNCAgMjQ2IDE5MCAxNCAgMjM0IDE3OSAxNiAgMTI2IDEwNyA2NCAgMzYgMzYgMzYKKzYgNiA2ICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAzIDMgMyAgNDggNDggNDkgIDE4OSAxNDIgMzUKKzI0MiAxODUgMTMgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDE0MCAxMTIgMzkgIDM2IDM2IDM2ICAxOTIgMTkxIDE4OSAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzE5MiAxOTEgMTg5ICAxMTIgODYgMzIgIDIyNiAxNjggMTEgIDI0NCAxODcgMTQgIDI0NCAxODcgMTQgIDI0NCAxODcgMTQKKzI0NSAxODggMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0MiAxODUgMTMgIDE1MCAxMTYgNDQKKzI3IDI3IDI3ICAyIDIgMiAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICA2IDYgNiAgNTggNTggNTggIDE4OSAxNDIgMzUKKzIzOSAxODIgMTMgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDIzOSAxODggMTQgIDIwOSAxOTcgMTY4ICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMKKzI1MyAyNTMgMjUzICAyNTMgMjUzIDI1MyAgMjUzIDI1MyAyNTMgIDI1MyAyNTMgMjUzICAyNTIgMjUyIDI1MiAgMTY4IDE2OCAxNjgKKzE2IDE2IDE4ICA5NyA2NyA4ICAyMjggMTcwIDExICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDQgMTg3IDE0ICAxOTggMTU0IDQ2CiszNSAzNSAzNSAgMyAzIDMgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMTMgMTMgMTMgIDg0IDc4IDY1ICAyMTUgMTYxIDExCisyNDQgMTg3IDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyMzggMTg0IDEyICAxODcgMTM2IDEyICAxNjggMTY4IDE2OCAgMjQ0IDI0NCAyNDQKKzI1MyAyNTMgMjUzICAyNTIgMjUyIDI1MiAgMjQwIDI0MCAyNDAgIDE3OSAxNzkgMTc5ICA2NyA2NyA2NyAgMiAyIDYKKzIgMiA2ICA5NyA2NyA4ICAyMjggMTcwIDExICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDYgMTkwIDE0CisyNDYgMTkwIDE0ICAyNDYgMTkwIDE0ICAyNDUgMTg4IDE0ICAyMzQgMTc3IDEyICAxODkgMTQyIDM1ICA4NiA3NyA2MQorMTYgMTYgMTYgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDEzIDEzIDEzICAxMDMgOTIgNTYgIDIwNyAxNTIgMTkKKzIyOCAxNzAgMTEgIDIzNCAxNzcgMTIgIDIzOSAxODIgMTMgIDI0MiAxODYgMTQgIDI0NSAxODggMTQgIDI0NiAxOTAgMTQKKzI0NiAxOTAgMTQgIDI0NiAxOTAgMTQgIDIzOSAxODIgMTMgIDE4OSAxMzggOSAgNDEgMzMgMjAgIDEwIDEwIDEyCiszMCAzMCAzMSAgMjMgMjMgMjQgIDUgNSA4ICAyIDIgNiAgMiAyIDYgIDIgMiA2Cis0IDQgNiAgMTEyIDg2IDMyICAyMTUgMTYxIDExICAyNDUgMTg4IDE0ICAyNDYgMTkwIDE0ICAyNDUgMTg4IDE0CisyMzkgMTgyIDEzICAyMjggMTcwIDExICAxODkgMTQyIDM1ICAxMDQgOTYgODEgIDQ4IDQ4IDQ5ICAxNyAxNyAxNworMiAyIDIgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDUgNSA1ICAzOSAzOSAzOSAgMTAzIDkyIDU2CisxNDEgMTA5IDQ0ICAxNzUgMTIyIDEzICAxODcgMTM2IDEyICAxODkgMTM4IDkgIDIwNyAxNTIgMTkgIDIyOCAxNzAgMTEKKzIzOSAxODIgMTMgIDIzOSAxODIgMTMgIDIxNSAxNjEgMTEgIDE3NSAxMjIgMTMgIDQxIDMzIDIwICAyIDIgNgorMTUgMTUgMTcgIDIwIDIwIDIyICAyMCAyMCAyMiAgMjAgMjAgMjIgIDIwIDIwIDIyICA4IDggMTAKKzQgNCA2ICA5NyA2NyA4ICAxODkgMTM4IDkgIDIzMSAxNzQgMTEgIDIzOSAxODIgMTMgIDIyNiAxNjggMTEKKzE4OSAxMzggOSAgMTI2IDEwNyA2NCAgNTkgNTkgNTkgIDIxIDIxIDIxICA1IDUgNSAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCiswIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgNSA1IDUgIDE3IDE3IDE3CiszNCAzNCAzNCAgNTcgNTcgNTcgIDg0IDc4IDY1ICAxMDMgOTIgNTYgIDEyNSAxMDEgNDEgIDE0MCAxMTIgMzkKKzE3NSAxMjIgMTMgIDE3NSAxMjIgMTMgIDE3NSAxMjIgMTMgIDk3IDY3IDggIDcyIDY3IDU4ICA4NCA3OCA2NQorNjAgNjAgNjAgIDU2IDU2IDU2ICA1NiA1NiA1NiAgNTYgNTYgNTYgIDU3IDU3IDU3ICA2NSA2NSA2NQorODYgODYgODYgIDk1IDczIDM0ICAxNzUgMTIyIDEzICAxODcgMTM2IDEyICAxODcgMTM2IDEyICAxNzUgMTIyIDEzCisxMDMgOTIgNTYgIDQxIDQxIDQxICAxMCAxMCAxMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzIgMiAyICA0IDQgNCAgMTIgMTIgMTIgIDI0IDI0IDI0ICA0MCA0MCA0MCAgNzAgNzAgNzAKKzg2IDc3IDYxICA5NSA3MyAzNCAgODggNzIgNDEgIDcyIDY3IDU4ICAzNiAzNiAzNiAgMTAgMTAgMTAKKzUgNSA1ICA1IDUgNSAgNSA1IDUgIDQgNCA0ICA1IDUgNSAgNiA2IDYKKzIyIDIyIDIyICA2MSA2MSA1OSAgODggNzIgNDEgIDExMiA4NiAzMiAgMTEyIDg2IDMyICA4NCA3OCA2NQorMzIgMzIgMzIgIDYgNiA2ICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMAorMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAzIDMgMyAgMTAgMTAgMTAKKzIxIDIxIDIxICAzMyAzMyAzMyAgMzEgMzEgMzEgIDE2IDE2IDE2ICAyIDIgMiAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzIgMiAyICAxMiAxMiAxMiAgMzAgMzAgMzEgIDQwIDQwIDQwICAzMiAzMiAzMiAgMTYgMTYgMTYKKzIgMiAyICAwIDAgMCAgMCAwIDAgIDAgMCAwICAwIDAgMCAgMCAwIDAKKzAgMCAwICAwIDAgMCAgMCAwIDAgIDAgMCAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL21hY2ZiLmMKaW5kZXggZjdkNjQ3ZC4uYWE4YzcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYWNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbWFjZmIuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGZiX2luZm8gZmJfaW5mbzsKLXN0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTddOworc3RhdGljIHUzMiBwc2V1ZG9fcGFsZXR0ZVsxNl07CiBzdGF0aWMgaW50IGludmVyc2UgICA9IDA7CiBzdGF0aWMgaW50IHZpZHRlc3QgICA9IDA7CiAKQEAgLTUyOSw1NiArNTI5LDYzIEBACiAJaWYgKHJlZ25vID49IGZiX2luZm8tPmNtYXAubGVuKQogCQlyZXR1cm4gMTsKIAotCXN3aXRjaCAoZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7Ci0JY2FzZSAxOgotCQkvKiBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgNDoKLQljYXNlIDg6Ci0JCWlmIChtYWNmYl9zZXRwYWxldHRlKQotCQkJbWFjZmJfc2V0cGFsZXR0ZShyZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgZmJfaW5mbyk7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQljYXNlIDE2OgotCQlpZiAoZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQgPT0gMTApIHsKLQkJCS8qIDE6NTo1OjUgKi8KLQkJCSgodTMyKikgKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KKwlpZiAoZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIDw9IDgpIHsKKwkJc3dpdGNoIChmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSAxOgorCQkJLyogV2Ugc2hvdWxkbid0IGdldCBoZXJlICovCisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgODoKKwkJCWlmIChtYWNmYl9zZXRwYWxldHRlKQorCQkJCW1hY2ZiX3NldHBhbGV0dGUocmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsCisJCQkJCQkgZmJfaW5mbyk7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAocmVnbm8gPCAxNikgeworCQlzd2l0Y2ggKGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDE2OgorCQkJaWYgKGZiX2luZm8tPnZhci5yZWQub2Zmc2V0ID09IDEwKSB7CisJCQkJLyogMTo1OjU6NSAqLworCQkJCSgodTMyKikgKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KIAkJCQkJKChyZWQgICAmIDB4ZjgwMCkgPj4gIDEpIHwKIAkJCQkJKChncmVlbiAmIDB4ZjgwMCkgPj4gIDYpIHwKIAkJCQkJKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpIHwKIAkJCQkJKCh0cmFuc3AgIT0gMCkgPDwgMTUpOwotCQl9IGVsc2UgewotCQkJLyogMDo1OjY6NSAqLwotCQkJKCh1MzIqKSAoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQorCQkJfSBlbHNlIHsKKwkJCQkvKiAwOjU6Njo1ICovCisJCQkJKCh1MzIqKSAoZmJfaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPQogCQkJCQkoKHJlZCAgICYgMHhmODAwKSAgICAgICkgfAogCQkJCQkoKGdyZWVuICYgMHhmYzAwKSA+PiAgNSkgfAogCQkJCQkoKGJsdWUgICYgMHhmODAwKSA+PiAxMSk7CisJCQl9CisJCQlicmVhazsKKwkJCS8qIEknbSBwcmV0dHkgc3VyZSB0aGF0IG9uZSBvciB0aGUgb3RoZXIgb2YgdGhlc2UKKwkJCSAgIGRvZXNuJ3QgZXhpc3Qgb24gNjhrIE1hY3MgKi8KKwkJY2FzZSAyNDoKKwkJCXJlZCAgID4+PSA4OworCQkJZ3JlZW4gPj49IDg7CisJCQlibHVlICA+Pj0gODsKKwkJCSgodTMyICopKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KKwkJCQkocmVkICAgPDwgZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAorCQkJCShncmVlbiA8PCBmYl9pbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkJKGJsdWUgIDw8IGZiX2luZm8tPnZhci5ibHVlLm9mZnNldCk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCXJlZCAgID4+PSA4OworCQkJZ3JlZW4gPj49IDg7CisJCQlibHVlICA+Pj0gODsKKwkJCSgodTMyICopKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KKwkJCQkocmVkICAgPDwgZmJfaW5mby0+dmFyLnJlZC5vZmZzZXQpICAgfAorCQkJCShncmVlbiA8PCBmYl9pbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkJKGJsdWUgIDw8IGZiX2luZm8tPnZhci5ibHVlLm9mZnNldCk7CisJCQlicmVhazsKIAkJfQotCQlicmVhazsJCi0JCS8qIEknbSBwcmV0dHkgc3VyZSB0aGF0IG9uZSBvciB0aGUgb3RoZXIgb2YgdGhlc2UKLQkJICAgZG9lc24ndCBleGlzdCBvbiA2OGsgTWFjcyAqLwotCWNhc2UgMjQ6Ci0JCXJlZCAgID4+PSA4OwotCQlncmVlbiA+Pj0gODsKLQkJYmx1ZSAgPj49IDg7Ci0JCSgodTMyICopKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KLQkJCShyZWQgICA8PCBmYl9pbmZvLT52YXIucmVkLm9mZnNldCkgICB8Ci0JCQkoZ3JlZW4gPDwgZmJfaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAotCQkJKGJsdWUgIDw8IGZiX2luZm8tPnZhci5ibHVlLm9mZnNldCk7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCXJlZCAgID4+PSA4OwotCQlncmVlbiA+Pj0gODsKLQkJYmx1ZSAgPj49IDg7Ci0JCSgodTMyICopKGZiX2luZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KLQkJCShyZWQgICA8PCBmYl9pbmZvLT52YXIucmVkLm9mZnNldCkgICB8Ci0JCQkoZ3JlZW4gPDwgZmJfaW5mby0+dmFyLmdyZWVuLm9mZnNldCkgfAotCQkJKGJsdWUgIDw8IGZiX2luZm8tPnZhci5ibHVlLm9mZnNldCk7Ci0JCWJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBmYl9vcHMgbWFjZmJfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5jCmluZGV4IGFiMjE0OTUuLjA4M2Y2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmMKQEAgLTM2OSw5ICszNjksOCBAQAogICoKICAqLwogCi1pbnQgX19kZXZpbml0IG1hY19maW5kX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLAotCQkJICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X2JwcCkKK2ludCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJICBjb25zdCBjaGFyICptb2RlX29wdGlvbiwgdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKQogewogICAgIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgKmRiID0gTlVMTDsKICAgICB1bnNpZ25lZCBpbnQgZGJzaXplID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuaCBiL2RyaXZlcnMvdmlkZW8vbWFjbW9kZXMuaAppbmRleCBiYWJlYjgxLi5iODZiYTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hY21vZGVzLmgKKysrIGIvZHJpdmVycy92aWRlby9tYWNtb2Rlcy5oCkBAIC01NSwxMCArNTUsMTAgQEAKIGV4dGVybiBpbnQgbWFjX3Zhcl90b192bW9kZShjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50ICp2bW9kZSwKIAkJCSAgICBpbnQgKmNtb2RlKTsKIGV4dGVybiBpbnQgbWFjX21hcF9tb25pdG9yX3NlbnNlKGludCBzZW5zZSk7Ci1leHRlcm4gaW50IF9fZGV2aW5pdCBtYWNfZmluZF9tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvLAotCQkJCSAgIGNvbnN0IGNoYXIgKm1vZGVfb3B0aW9uLAotCQkJCSAgIHVuc2lnbmVkIGludCBkZWZhdWx0X2JwcCk7CitleHRlcm4gaW50IG1hY19maW5kX21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgY29uc3QgY2hhciAqbW9kZV9vcHRpb24sCisJCQkgdW5zaWduZWQgaW50IGRlZmF1bHRfYnBwKTsKIAogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2FjY2VsLmMgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9hY2NlbC5jCmluZGV4IGM1N2FhYWQuLjM2NjBkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2FjY2VsLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYWNjZWwuYwpAQCAtOTEsNyArOTEsNiBAQAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXBhbFtpXSA9IGkgKiAweDExMTExMTExVTsKIAl9Ci0JcGFsW2ldID0gMHhGRkZGRkZGRjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG1hdHJveF9jZmI4X3BhbCh1X2ludDMyX3QqIHBhbCkgewpAQCAtMTAwLDcgKzk5LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlwYWxbaV0gPSBpICogMHgwMTAxMDEwMVU7CiAJfQotCXBhbFtpXSA9IDB4MEYwRjBGMEY7CiB9CiAKIHN0YXRpYyB2b2lkIG1hdHJveGZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvKiBpbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEqIGFyZWEpOwpAQCAtMTQ1LDEzICsxNDMsMTAgQEAKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfaW1hZ2VibGl0ID0gbWF0cm94ZmJfaW1hZ2VibGl0OwogCQkJCX0KIAkJCQlicmVhazsKLQkJY2FzZSAxNjoJaWYgKEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5ncmVlbi5sZW5ndGggPT0gNSkgeworCQljYXNlIDE2OglpZiAoQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmdyZWVuLmxlbmd0aCA9PSA1KQogCQkJCQltYWNjZXNzID0gMHhDMDAwMDAwMTsKLQkJCQkJQUNDRVNTX0ZCSU5GTyhjbWFwWzE2XSkgPSAweDdGRkY3RkZGOwotCQkJCX0gZWxzZSB7CisJCQkJZWxzZQogCQkJCQltYWNjZXNzID0gMHg0MDAwMDAwMTsKLQkJCQkJQUNDRVNTX0ZCSU5GTyhjbWFwWzE2XSkgPSAweEZGRkZGRkZGOwotCQkJCX0KIAkJCQltb3Btb2RlID0gTV9PUE1PREVfMTZCUFA7CiAJCQkJaWYgKGFjY2VsKSB7CiAJCQkJCUFDQ0VTU19GQklORk8oZmJvcHMpLmZiX2NvcHlhcmVhID0gbWF0cm94ZmJfY29weWFyZWE7CkBAIC0xNjEsNyArMTU2LDYgQEAKIAkJCQlicmVhazsKIAkJY2FzZSAyNDoJbWFjY2VzcyA9IDB4MDAwMDAwMDM7CiAJCQkJbW9wbW9kZSA9IE1fT1BNT0RFXzI0QlBQOwotCQkJCUFDQ0VTU19GQklORk8oY21hcFsxNl0pID0gMHhGRkZGRkZGRjsKIAkJCQlpZiAoYWNjZWwpIHsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfY29weWFyZWEgPSBtYXRyb3hmYl9jb3B5YXJlYTsKIAkJCQkJQUNDRVNTX0ZCSU5GTyhmYm9wcykuZmJfZmlsbHJlY3QgPSBtYXRyb3hmYl9maWxscmVjdDsKQEAgLTE3MCw3ICsxNjQsNiBAQAogCQkJCWJyZWFrOwogCQljYXNlIDMyOgltYWNjZXNzID0gMHgwMDAwMDAwMjsKIAkJCQltb3Btb2RlID0gTV9PUE1PREVfMzJCUFA7Ci0JCQkJQUNDRVNTX0ZCSU5GTyhjbWFwWzE2XSkgPSAweEZGRkZGRkZGOwogCQkJCWlmIChhY2NlbCkgewogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9jb3B5YXJlYSA9IG1hdHJveGZiX2NvcHlhcmVhOwogCQkJCQlBQ0NFU1NfRkJJTkZPKGZib3BzKS5mYl9maWxscmVjdCA9IG1hdHJveGZiX2ZpbGxyZWN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCmluZGV4IDg4NmU0NzUuLjg2Y2E3YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKQEAgLTY3OSw2ICs2NzksOCBAQAogCQltZ2Ffb3V0YihNX0RBQ19WQUwsIGJsdWUpOwogCQlicmVhazsKIAljYXNlIDE2OgorCQlpZiAocmVnbm8gPj0gMTYpCisJCQlicmVhazsKIAkJewogCQkJdV9pbnQxNl90IGNvbCA9CiAJCQkJKHJlZCA8PCBBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIucmVkLm9mZnNldCkgICAgIHwKQEAgLTY5MCw2ICs2OTIsOCBAQAogCQlicmVhazsKIAljYXNlIDI0OgogCWNhc2UgMzI6CisJCWlmIChyZWdubyA+PSAxNikKKwkJCWJyZWFrOwogCQlBQ0NFU1NfRkJJTkZPKGNtYXBbcmVnbm9dKSA9CiAJCQkocmVkICAgPDwgQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLnJlZC5vZmZzZXQpICAgfAogCQkJKGdyZWVuIDw8IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci5ncmVlbi5vZmZzZXQpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuaCBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuaAppbmRleCA5YzI1YzJmLi5kNTk1NzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmgKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5oCkBAIC01MTgsNyArNTE4LDcgQEAKIAkJCQkJZGxsOjE7CiAJCQkJICAgICAgfSBtZW1vcnk7CiAJCQkgICAgICB9IHZhbHVlczsKLQl1X2ludDMyX3QgY21hcFsxN107CisJdV9pbnQzMl90IGNtYXBbMTZdOwogfTsKIAogI2RlZmluZSBpbmZvMm1pbmZvKGluZm8pIGNvbnRhaW5lcl9vZihpbmZvLCBzdHJ1Y3QgbWF0cm94X2ZiX2luZm8sIGZiY29uKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmMKaW5kZXggMDNhZTU1Yi4uNGIzMzQ0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuYworKysgYi9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5jCkBAIC0xNjMsMTEgKzE2Myw2IEBACiAJQUNDRVNTX0ZCSU5GTyhodykuY3J0YzIuY3RsID0gMHgwMDAwMDAwNDsKIH0KIAotc3RhdGljIHZvaWQgbWF0cm94ZmJfZGhfY2ZiWF9pbml0KHN0cnVjdCBtYXRyb3hmYl9kaF9mYl9pbmZvKiBtMmluZm8pIHsKLQkvKiBubyBhY2NlbGVyYXRpb24gZm9yIHNlY29uZGFyeSBoZWFkLi4uICovCi0JbTJpbmZvLT5jbWFwWzE2XSA9IDB4RkZGRkZGRkY7Ci19Ci0KIHN0YXRpYyB2b2lkIG1hdHJveGZiX2RoX3Bhbl92YXIoc3RydWN0IG1hdHJveGZiX2RoX2ZiX2luZm8qIG0yaW5mbywKIAkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKiB2YXIpIHsKIAl1bnNpZ25lZCBpbnQgcG9zOwpAQCAtMzg1LDcgKzM4MCw2IEBACiAJCQl9CiAJCX0KIAkJdXBfcmVhZCgmQUNDRVNTX0ZCSU5GTyhhbHRvdXQpLmxvY2spOwotCQltYXRyb3hmYl9kaF9jZmJYX2luaXQobTJpbmZvKTsKIAl9CiAJbTJpbmZvLT5pbml0aWFsaXplZCA9IDE7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5oIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfY3J0YzIuaAppbmRleCAxNzcxNzc2Li4xMDA1NTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9jcnRjMi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2NydGMyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogCXVuc2lnbmVkIGludAkJaW50ZXJsYWNlZDoxOwogCi0JdV9pbnQzMl90IGNtYXBbMTddOworCXVfaW50MzJfdCBjbWFwWzE2XTsKIH07CiAKICNlbmRpZiAvKiBfX01BVFJPWEZCX0NSVEMyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKaW5kZXggYWZmMTFiYi4uZDFhMTA1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCkBAIC0xNTAsOCArMTUwLDcgQEAKIAkJTSA9IHBsbCAmIDB4RkY7CiAJCU4gPSAocGxsID4+IDgpICYgMHhGRjsKIAkJaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHx8Ci0JCQkoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSB8fAotCQkJKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDJFMCkpIHsKKwkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzOTApKSB7CiAJCQlNQiA9IDE7CiAJCQlOQiA9IDE7CiAJCX0gZWxzZSB7CkBAIC0xNjEsNyArMTYwLDcgQEAKIAkJKk1DbGsgPSAoKE4gKiBOQiAqIHBhci0+Q3J5c3RhbEZyZXFLSHopIC8gKE0gKiBNQikpID4+IFA7CiAKIAkJcGxsID0gTlZfUkQzMihwYXItPlBNQywgMHg0MDAwKTsKLQkJUCA9IChwbGwgPj4gMTYpICYgMHgwMzsKKwkJUCA9IChwbGwgPj4gMTYpICYgMHgwNzsKIAkJcGxsID0gTlZfUkQzMihwYXItPlBNQywgMHg0MDA0KTsKIAkJTSA9IHBsbCAmIDB4RkY7CiAJCU4gPSAocGxsID4+IDgpICYgMHhGRjsKQEAgLTg5MiwxMSArODkxLDE3IEBACiAJCXN0YXRlLT5nZW5lcmFsID0gYnBwID09IDE2ID8gMHgwMDEwMTEwMCA6IDB4MDAxMDAxMDA7CiAJCXN0YXRlLT5yZXBhaW50MSA9IGhEaXNwbGF5U2l6ZSA8IDEyODAgPyAweDA0IDogMHgwMDsKIAkJYnJlYWs7CisJY2FzZSBOVl9BUkNIXzQwOgorCQlpZiAoIXBhci0+RmxhdFBhbmVsKQorCQkJc3RhdGUtPmNvbnRyb2wgPSBOVl9SRDMyKHBhci0+UFJBTURBQzAsIDB4MDU4MCkgJgorCQkJCTB4ZWZmZmZlZmY7CisJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBOVl9BUkNIXzEwOgogCWNhc2UgTlZfQVJDSF8yMDoKIAljYXNlIE5WX0FSQ0hfMzA6CiAJZGVmYXVsdDoKLQkJaWYgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI0MCkgeworCQlpZiAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjQwIHx8CisJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzZDApIHsKIAkJCXN0YXRlLT5hcmJpdHJhdGlvbjAgPSAyNTY7CiAJCQlzdGF0ZS0+YXJiaXRyYXRpb24xID0gMHgwNDgwOwogCQl9IGVsc2UgaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmZmKSA9PSAweDAxQTApIHx8CkBAIC05MzksNyArOTQ0LDcgQEAKIAogdm9pZCBOVkxvYWRTdGF0ZUV4dChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyLCBSSVZBX0hXX1NUQVRFICogc3RhdGUpCiB7Ci0JaW50IGk7CisJaW50IGksIGo7CiAKIAlOVl9XUjMyKHBhci0+UE1DLCAweDAxNDAsIDB4MDAwMDAwMDApOwogCU5WX1dSMzIocGFyLT5QTUMsIDB4MDIwMCwgMHhGRkZGMDBGRik7CkBAIC05NTEsNyArOTU2LDggQEAKIAlOVl9XUjMyKHBhci0+UFRJTUVSLCAweDAxMDAgKiA0LCAweEZGRkZGRkZGKTsKIAogCWlmIChwYXItPkFyY2hpdGVjdHVyZSA9PSBOVl9BUkNIXzA0KSB7Ci0JCU5WX1dSMzIocGFyLT5QRkIsIDB4MDIwMCwgc3RhdGUtPmNvbmZpZyk7CisJCWlmIChzdGF0ZSkKKwkJCU5WX1dSMzIocGFyLT5QRkIsIDB4MDIwMCwgc3RhdGUtPmNvbmZpZyk7CiAJfSBlbHNlIGlmICgocGFyLT5BcmNoaXRlY3R1cmUgPCBOVl9BUkNIXzQwKSB8fAogCQkgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwNDApIHsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewpAQCAtOTY0LDggKzk3MCw5IEBACiAKIAkJaWYgKCgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwOTApIHx8CiAJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMUQwKSB8fAotCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDJFMCkgfHwKLQkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApKQorCQkgICAgKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkgfHwKKwkJICAgICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzOTApIHx8CisJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwM0QwKSkKIAkJCXJlZ2lvbnMgPSAxNTsKIAkJZm9yKGkgPSAwOyBpIDwgcmVnaW9uczsgaSsrKSB7CiAJCQlOVl9XUjMyKHBhci0+UEZCLCAweDA2MDAgKyAoaSAqIDB4MTApLCAwKTsKQEAgLTEyMDYsMTYgKzEyMTMsMjAgQEAKIAkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDYwOCwgMHhGRkZGRkZGRik7CiAJCX0gZWxzZSB7CiAJCQlpZiAocGFyLT5BcmNoaXRlY3R1cmUgPj0gTlZfQVJDSF80MCkgewotCQkJCXUzMiB0bXA7Ci0KIAkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDAwODQsIDB4NDAxMjg3YzApOwogCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDA4QywgMHg2MGRlODA1MSk7CiAJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwMDkwLCAweDAwMDA4MDAwKTsKIAkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDA2MTAsIDB4MDBiZTNjNWYpOworCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MGJjNCwKKwkJCQkJTlZfUkQzMihwYXItPlBHUkFQSCwgMHgwYmM0KSB8CisJCQkJCTB4MDAwMDgwMDApOwogCi0JCQkJdG1wID0gTlZfUkQzMihwYXItPlJFR1MsIDB4MTU0MCkgJiAweGZmOwotCQkJCWZvcihpID0gMDsgdG1wICYmICEodG1wICYgMSk7IHRtcCA+Pj0gMSwgaSsrKTsKLQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDUwMDAsIGkpOworCQkJCWogPSBOVl9SRDMyKHBhci0+UkVHUywgMHgxNTQwKSAmIDB4ZmY7CisKKwkJCQlpZiAoaikgeworCQkJCQlmb3IgKGkgPSAwOyAhKGogJiAxKTsgaiA+Pj0gMSwgaSsrKTsKKwkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHg1MDAwLCBpKTsKKwkJCQl9CiAKIAkJCQlpZiAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDQwKSB7CiAJCQkJCU5WX1dSMzIocGFyLT5QR1JBUEgsIDB4MDliMCwKQEAgLTEyNTAsNiArMTI2MSw3IEBACiAJCQkJY2FzZSAweDAxNjA6CiAJCQkJY2FzZSAweDAxRDA6CiAJCQkJY2FzZSAweDAyNDA6CisJCQkJY2FzZSAweDAzRDA6CiAJCQkJCU5WX1dSMzIocGFyLT5QTUMsIDB4MTcwMCwKIAkJCQkJCU5WX1JEMzIocGFyLT5QRkIsIDB4MDIwQykpOwogCQkJCQlOVl9XUjMyKHBhci0+UE1DLCAweDE3MDQsIDApOwpAQCAtMTI2OSw3ICsxMjgxLDYgQEAKIAkJCQkJCTB4MDAwMDAxMDgpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDB4MDIyMDoKLQkJCQljYXNlIDB4MDIzMDoKIAkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwODYwLCAwKTsKIAkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwgMHgwODY0LCAwKTsKIAkJCQkJTlZfV1IzMihwYXItPlBSQU1EQUMsIDB4MDYwOCwKQEAgLTEyNzcsOCArMTI4OCw4IEBACiAJCQkJCQkweDAwMTAwMDAwKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAweDAwOTA6Ci0JCQkJY2FzZSAweDAyRTA6CiAJCQkJY2FzZSAweDAyOTA6CisJCQkJY2FzZSAweDAzOTA6CiAJCQkJCU5WX1dSMzIocGFyLT5QUkFNREFDLCAweDA2MDgsCiAJCQkJCQlOVl9SRDMyKHBhci0+UFJBTURBQywgMHgwNjA4KSB8CiAJCQkJCQkweDAwMTAwMDAwKTsKQEAgLTEzNTUsOCArMTM2Niw5IEBACiAJCQl9IGVsc2UgewogCQkJCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMDkwKSB8fAogCQkJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMUQwKSB8fAotCQkJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMkUwKSB8fAotCQkJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSkgeworCQkJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB8fAorCQkJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSB8fAorCQkJCSAgICAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwM0QwKSkgewogCQkJCQlmb3IgKGkgPSAwOyBpIDwgNjA7IGkrKykgewogCQkJCQkJTlZfV1IzMihwYXItPlBHUkFQSCwKIAkJCQkJCQkweDBEMDAgKyBpKjQsCkBAIC0xNDA3LDggKzE0MTksOCBAQAogCQkJCX0gZWxzZSB7CiAJCQkJCWlmICgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAwOTAgfHwKIAkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDFEMCB8fAotCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMkUwIHx8Ci0JCQkJCSAgICAocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAyOTApIHsKKwkJCQkJICAgIChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCB8fAorCQkJCQkgICAgKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSB7CiAJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBERjAsCiAJCQkJCQkJTlZfUkQzMihwYXItPlBGQiwgMHgwMjAwKSk7CiAJCQkJCQlOVl9XUjMyKHBhci0+UEdSQVBILCAweDBERjQsCkBAIC0xNDk1LDYgKzE1MDcsMTIgQEAKIAlOVl9XUjMyKHBhci0+UEZJRk8sIDB4MDQ5NCAqIDQsIDB4MDAwMDAwMDEpOwogCU5WX1dSMzIocGFyLT5QRklGTywgMHgwNDk1ICogNCwgMHgwMDAwMDAwMSk7CiAJTlZfV1IzMihwYXItPlBGSUZPLCAweDAxNDAgKiA0LCAweDAwMDAwMDAxKTsKKworICAgIGlmICghc3RhdGUpIHsKKwkgICAgcGFyLT5DdXJyZW50U3RhdGUgPSBOVUxMOworCSAgICByZXR1cm47CisgICAgfQorCiAJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfMTApIHsKIAkJaWYgKHBhci0+dHdvSGVhZHMpIHsKIAkJCU5WX1dSMzIocGFyLT5QQ1JUQzAsIDB4MDg2MCwgc3RhdGUtPmhlYWQpOwpAQCAtMTU2Niw2ICsxNTg0LDkgQEAKIAlWR0FfV1IwOChwYXItPlBDSU8sIDB4MDNENSwgc3RhdGUtPmludGVybGFjZSk7CiAKIAlpZiAoIXBhci0+RmxhdFBhbmVsKSB7CisJCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzQwKQorCQkJTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA1ODAsIHN0YXRlLT5jb250cm9sKTsKKwogCQlOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDUwQywgc3RhdGUtPnBsbHNlbCk7CiAJCU5WX1dSMzIocGFyLT5QUkFNREFDMCwgMHgwNTA4LCBzdGF0ZS0+dnBsbCk7CiAJCWlmIChwYXItPnR3b0hlYWRzKQpAQCAtMTYzMSw2ICsxNjUyLDkgQEAKIAlzdGF0ZS0+c2NhbGUgPSBOVl9SRDMyKHBhci0+UFJBTURBQywgMHgwODQ4KTsKIAlzdGF0ZS0+Y29uZmlnID0gTlZfUkQzMihwYXItPlBGQiwgMHgwMjAwKTsKIAorCWlmIChwYXItPkFyY2hpdGVjdHVyZSA+PSBOVl9BUkNIXzQwICYmICFwYXItPkZsYXRQYW5lbCkKKwkJc3RhdGUtPmNvbnRyb2wgID0gTlZfUkQzMihwYXItPlBSQU1EQUMwLCAweDA1ODApOworCiAJaWYgKHBhci0+QXJjaGl0ZWN0dXJlID49IE5WX0FSQ0hfMTApIHsKIAkJaWYgKHBhci0+dHdvSGVhZHMpIHsKIAkJCXN0YXRlLT5oZWFkID0gTlZfUkQzMihwYXItPlBDUlRDMCwgMHgwODYwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9zZXR1cC5jCmluZGV4IDcwN2UyYzguLjgyNTc5ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3NldHVwLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfc2V0dXAuYwpAQCAtMTY2LDExICsxNjYsMTMgQEAKIHN0YXRpYyBpbnQgTlZJc0Nvbm5lY3RlZChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyLCBpbnQgb3V0cHV0KQogewogCXZvbGF0aWxlIHUzMiBfX2lvbWVtICpQUkFNREFDID0gcGFyLT5QUkFNREFDMDsKLQl1MzIgcmVnNTJDLCByZWc2MDg7CisJdTMyIHJlZzUyQywgcmVnNjA4LCBkYWMwX3JlZzYwOCA9IDA7CiAJaW50IHByZXNlbnQ7CiAKLQlpZiAob3V0cHV0KQotCQlQUkFNREFDICs9IDB4ODAwOworCWlmIChvdXRwdXQpIHsKKwkgICAgZGFjMF9yZWc2MDggPSBOVl9SRDMyKFBSQU1EQUMsIDB4MDYwOCk7CisJICAgIFBSQU1EQUMgKz0gMHg4MDA7CisJfQogCiAJcmVnNTJDID0gTlZfUkQzMihQUkFNREFDLCAweDA1MkMpOwogCXJlZzYwOCA9IE5WX1JEMzIoUFJBTURBQywgMHgwNjA4KTsKQEAgLTE5NCw4ICsxOTYsOCBAQAogCWVsc2UKIAkJcHJpbnRrKCJudmlkaWFmYjogQ1JUQyVpIGFuYWxvZyBub3QgZm91bmRcbiIsIG91dHB1dCk7CiAKLQlOVl9XUjMyKHBhci0+UFJBTURBQzAsIDB4MDYwOCwgTlZfUkQzMihwYXItPlBSQU1EQUMwLCAweDA2MDgpICYKLQkJMHgwMDAwRUZGRik7CisJaWYgKG91dHB1dCkKKwkgICAgTlZfV1IzMihwYXItPlBSQU1EQUMwLCAweDA2MDgsIGRhYzBfcmVnNjA4KTsKIAogCU5WX1dSMzIoUFJBTURBQywgMHgwNTJDLCByZWc1MkMpOwogCU5WX1dSMzIoUFJBTURBQywgMHgwNjA4LCByZWc2MDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfdHlwZS5oCmluZGV4IDM4ZjdjYzAuLjJmZGY3N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3R5cGUuaAorKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl90eXBlLmgKQEAgLTg2LDYgKzg2LDcgQEAKIAl1MzIgdGltaW5nVjsKIAl1MzIgZGlzcGxheVY7CiAJdTMyIGNydGNTeW5jOworCXUzMiBjb250cm9sOwogfSBSSVZBX0hXX1NUQVRFOwogCiBzdHJ1Y3Qgcml2YV9yZWdzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252aWRpYS5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKaW5kZXggNDFmNjM2NS4uYTdmZTIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMKQEAgLTY3NCw2ICs2NzQsNyBAQAogCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IG52aWRpYWZiX3N5bmM7CiAJCWluZm8tPnBpeG1hcC5zY2FuX2FsaWduID0gNDsKIAkJaW5mby0+ZmxhZ3MgJj0gfkZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOworCQlpbmZvLT5mbGFncyB8PSBGQklORk9fUkVBRFNfRkFTVDsKIAkJTlZSZXNldEdyYXBoaWNzKGluZm8pOwogCX0gZWxzZSB7CiAJCWluZm8tPmZib3BzLT5mYl9pbWFnZWJsaXQgPSBjZmJfaW1hZ2VibGl0OwpAQCAtNjgyLDYgKzY4Myw3IEBACiAJCWluZm8tPmZib3BzLT5mYl9zeW5jID0gTlVMTDsKIAkJaW5mby0+cGl4bWFwLnNjYW5fYWxpZ24gPSAxOwogCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKKwkJaW5mby0+ZmxhZ3MgJj0gfkZCSU5GT19SRUFEU19GQVNUOwogCX0KIAogCXBhci0+Y3Vyc29yX3Jlc2V0ID0gMTsKQEAgLTExOTMsNyArMTE5NSw4IEBACiAKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiRGV2aWNlIElEOiAleCBcbiIsIGlkKTsKIAotCWlmICgoaWQgJiAweGZmZjApID09IDB4MDBmMCkgeworCWlmICgoaWQgJiAweGZmZjApID09IDB4MDBmMCB8fAorCSAgICAoaWQgJiAweGZmZjApID09IDB4MDJlMCkgewogCQkvKiBwY2ktZSAqLwogCQlpZCA9IE5WX1JEMzIocGFyLT5SRUdTLCAweDE4MDApOwogCkBAIC0xMjM4LDE4ICsxMjQxLDE2IEBACiAJY2FzZSAweDAwNDA6CQkvKiBHZUZvcmNlIDY4MDAgKi8KIAljYXNlIDB4MDBDMDoJCS8qIEdlRm9yY2UgNjgwMCAqLwogCWNhc2UgMHgwMTIwOgkJLyogR2VGb3JjZSA2ODAwICovCi0JY2FzZSAweDAxMzA6CiAJY2FzZSAweDAxNDA6CQkvKiBHZUZvcmNlIDY2MDAgKi8KIAljYXNlIDB4MDE2MDoJCS8qIEdlRm9yY2UgNjIwMCAqLwogCWNhc2UgMHgwMUQwOgkJLyogR2VGb3JjZSA3MjAwLCA3MzAwLCA3NDAwICovCi0JY2FzZSAweDAyRTA6CQkvKiBHZUZvcmNlIDczMDAgR1QgKi8KIAljYXNlIDB4MDA5MDoJCS8qIEdlRm9yY2UgNzgwMCAqLwogCWNhc2UgMHgwMjEwOgkJLyogR2VGb3JjZSA2ODAwICovCiAJY2FzZSAweDAyMjA6CQkvKiBHZUZvcmNlIDYyMDAgKi8KLQljYXNlIDB4MDIzMDoKIAljYXNlIDB4MDI0MDoJCS8qIEdlRm9yY2UgNjEwMCAqLwogCWNhc2UgMHgwMjkwOgkJLyogR2VGb3JjZSA3OTAwICovCiAJY2FzZSAweDAzOTA6CQkvKiBHZUZvcmNlIDc2MDAgKi8KKwljYXNlIDB4MDNEMDoKIAkJYXJjaCA9IE5WX0FSQ0hfNDA7CiAJCWJyZWFrOwogCWNhc2UgMHgwMDIwOgkJLyogVE5ULCBUTlQyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29mZmIuYyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCmluZGV4IDg4NWI0MjguLjQ1MjQzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNpemUgPSBzaXplb2Yoc3RydWN0IGZiX2luZm8pICsgc2l6ZW9mKHUzMikgKiAxNzsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBmYl9pbmZvKSArIHNpemVvZih1MzIpICogMTY7CiAKIAlpbmZvID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKIAkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0ZDI1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnCkBAIC0wLDAgKzEsNTggQEAKK2NvbmZpZyBGQl9PTUFQCisJdHJpc3RhdGUgIk9NQVAgZnJhbWUgYnVmZmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGQgorCXNlbGVjdCBGQl9DRkJfRklMTFJFQ1QKKwlzZWxlY3QgRkJfQ0ZCX0NPUFlBUkVBCisJc2VsZWN0IEZCX0NGQl9JTUFHRUJMSVQKKwloZWxwCisgICAgICAgICAgRnJhbWUgYnVmZmVyIGRyaXZlciBmb3IgT01BUCBiYXNlZCBib2FyZHMuCisKK2NvbmZpZyBGQl9PTUFQX0JPT1RMT0FERVJfSU5JVAorCWJvb2wgIkNoZWNrIGJvb3Rsb2FkZXIgaW5pdGlhbGl6YWlvbiIKKwlkZXBlbmRzIG9uIEZCX09NQVAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBjaGVja2luZyBpZiB0aGUgYm9vdGxvYWRlciBoYXMKKwkgIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhlIGRpc3BsYXkgY29udHJvbGxlci4gSW4gdGhpcyBjYXNlIHRoZQorCSAgZHJpdmVyIHdpbGwgc2tpcCB0aGUgaW5pdGlhbGl6YXRpb24uCisKK2NvbmZpZyBGQl9PTUFQX0NPTlNJU1RFTlRfRE1BX1NJWkUKKwlpbnQgIkNvbnNpc3RlbnQgRE1BIG1lbW9yeSBzaXplIChNQikiCisJZGVwZW5kcyBvbiBGQl9PTUFQCisJcmFuZ2UgMSAxNAorCWRlZmF1bHQgMgorCWhlbHAKKwkgIEluY3JlYXNlIHRoZSBETUEgY29uc2lzdGVudCBtZW1vcnkgc2l6ZSBhY2NvcmRpbmcgdG8geW91ciB2aWRlbworCSAgbWVtb3J5IG5lZWRzLCBmb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byB1c2UgbXVsdGlwbGUgcGxhbmVzLgorCSAgVGhlIHNpemUgbXVzdCBiZSAyTUIgYWxpZ25lZC4KKwkgIElmIHVuc3VyZSBzYXkgMS4KKworY29uZmlnIEZCX09NQVBfRE1BX1RVTkUKKyAgICAgICAgYm9vbCAiU2V0IERNQSBTRFJBTSBhY2Nlc3MgcHJpb3JpdHkgaGlnaCIKKyAgICAgICAgZGVwZW5kcyBvbiBGQl9PTUFQICYmIEFSQ0hfT01BUDEKKyAgICAgICAgaGVscAorICAgICAgICAgIE9uIHN5c3RlbXMgaW4gd2hpY2ggdmlkZW8gbWVtb3J5IGlzIGluIHN5c3RlbSBtZW1vcnkKKyAgICAgICAgICAoU0RSQU0pIHRoaXMgd2lsbCBzcGVlZCB1cCBncmFwaGljcyBETUEgb3BlcmF0aW9ucy4KKyAgICAgICAgICBJZiB5b3UgaGF2ZSBzdWNoIGEgc3lzdGVtIGFuZCB3YW50IHRvIHVzZSByb3RhdGlvbgorICAgICAgICAgIGFuc3dlciB5ZXMuIEFuc3dlciBubyBpZiB5b3UgaGF2ZSBhIGRlZGljYXRlZCB2aWRlbworICAgICAgICAgIG1lbW9yeSwgb3IgZG9uJ3QgdXNlIGFueSBvZiB0aGUgYWNjZWxlcmF0ZWQgZmVhdHVyZXMuCisKK2NvbmZpZyBGQl9PTUFQX0xDRENfRVhURVJOQUwKKwlib29sICJFeHRlcm5hbCBMQ0QgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gRkJfT01BUAorCWhlbHAKKwkgIFNheSBZIGhlcmUsIGlmIHlvdSB3YW50IHRvIGhhdmUgc3VwcG9ydCBmb3IgYm9hcmRzIHdpdGggYW4KKwkgIGV4dGVybmFsIExDRCBjb250cm9sbGVyIGNvbm5lY3RlZCB0byB0aGUgU29TU0kvUkZCSSBpbnRlcmZhY2UuCisKK2NvbmZpZyBGQl9PTUFQX0xDRENfSFdBNzQyCisJYm9vbCAiRXBzb24gSFdBNzQyIExDRCBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9PTUFQICYmIEZCX09NQVBfTENEQ19FWFRFUk5BTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgZXh0ZXJuYWwKKwkgIEVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlci4KKworY29uZmlnIEZCX09NQVBfTENEQ19CTElaWkFSRAorCWJvb2wgIkVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQl9PTUFQICYmIEZCX09NQVBfTENEQ19FWFRFUk5BTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgZXh0ZXJuYWwKKwkgIEVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZGE4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIG5ldyBPTUFQIGZyYW1lYnVmZmVyIGRldmljZSBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0ZCX09NQVApICs9IG9tYXBmYi5vCisKK29ianMteXkgOj0gb21hcGZiX21haW4ubworCitvYmpzLXkkKENPTkZJR19BUkNIX09NQVAxKSArPSBsY2RjLm8KK29ianMteSQoQ09ORklHX0FSQ0hfT01BUDIpICs9IGRpc3BjLm8KKworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAxKSQoQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCkgKz0gc29zc2kubworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAyKSQoQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCkgKz0gcmZiaS5vCisKK29ianMteSQoQ09ORklHX0ZCX09NQVBfTENEQ19IV0E3NDIpICs9IGh3YTc0Mi5vCitvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfQkxJWlpBUkQpICs9IGJsaXp6YXJkLm8KKworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0g0KSArPSBsY2RfaDQubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX0gzKSArPSBsY2RfaDMubworb2Jqcy15JChDT05GSUdfTUFDSF9PTUFQX1BBTE1URSkgKz0gbGNkX3BhbG10ZS5vCitvYmpzLXkkKENPTkZJR19NQUNIX09NQVBfUEFMTVRUKSArPSBsY2RfcGFsbXR0Lm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9QQUxNWjcxKSArPSBsY2RfcGFsbXo3MS5vCitvYmpzLSQoQ09ORklHX0FSQ0hfT01BUDE2WFgpJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGNkX2lubjE2MTAubworb2Jqcy0kKENPTkZJR19BUkNIX09NQVAxNVhYKSQoQ09ORklHX01BQ0hfT01BUF9JTk5PVkFUT1IpICs9IGxjZF9pbm4xNTEwLm8KK29ianMteSQoQ09ORklHX01BQ0hfT01BUF9PU0spICs9IGxjZF9vc2subworb2Jqcy15JChDT05GSUdfTUFDSF9TWDEpICs9IGxjZF9zeDEubworCitvbWFwZmItb2JqcyA6PSAkKG9ianMteXkpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4Mjk0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCkBAIC0wLDAgKzEsMTU2OCBAQAorLyoKKyAqIEVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3JzOiAgICAgSnVoYSBZcmpvbGEgICA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoJICAgICAgICBJbXJlIERlYWsgICAgIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICogWVVWIHN1cHBvcnQ6IEp1c3NpIExhYWtvICAgPGp1c3NpLmxhYWtvQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYmxpenphcmQuaD4KKworI2luY2x1ZGUgImRpc3BjLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUJCQkJImJsaXp6YXJkIgorCisjZGVmaW5lIEJMSVpaQVJEX1JFVl9DT0RFCQkJMHgwMAorI2RlZmluZSBCTElaWkFSRF9DT05GSUcJCQkJMHgwMgorI2RlZmluZSBCTElaWkFSRF9QTExfRElWCQkJMHgwNAorI2RlZmluZSBCTElaWkFSRF9QTExfTE9DS19SQU5HRQkJCTB4MDYKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0NMT0NLX1NZTlRIXzAJCTB4MDgKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0NMT0NLX1NZTlRIXzEJCTB4MGEKKyNkZWZpbmUgQkxJWlpBUkRfUExMX01PREUJCQkweDBjCisjZGVmaW5lIEJMSVpaQVJEX0NMS19TUkMJCQkweDBlCisjZGVmaW5lIEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURQkJMHgxMAorI2RlZmluZSBCTElaWkFSRF9NRU1fQkFOSzBfU1RBVFVTCQkweDE0CisjZGVmaW5lIEJMSVpaQVJEX0hESVNQCQkJCTB4MmEKKyNkZWZpbmUgQkxJWlpBUkRfSE5EUAkJCQkweDJjCisjZGVmaW5lIEJMSVpaQVJEX1ZESVNQMAkJCQkweDJlCisjZGVmaW5lIEJMSVpaQVJEX1ZESVNQMQkJCQkweDMwCisjZGVmaW5lIEJMSVpaQVJEX1ZORFAJCQkJMHgzMgorI2RlZmluZSBCTElaWkFSRF9IU1cJCQkJMHgzNAorI2RlZmluZSBCTElaWkFSRF9WU1cJCQkJMHgzOAorI2RlZmluZSBCTElaWkFSRF9ESVNQTEFZX01PREUJCQkweDY4CisjZGVmaW5lIEJMSVpaQVJEX0lOUFVUX1dJTl9YX1NUQVJUXzAJCTB4NmMKKyNkZWZpbmUgQkxJWlpBUkRfREFUQV9TT1VSQ0VfU0VMRUNUCQkweDhlCisjZGVmaW5lIEJMSVpaQVJEX0RJU1BfTUVNX0RBVEFfUE9SVAkJMHg5MAorI2RlZmluZSBCTElaWkFSRF9ESVNQX01FTV9SRUFEX0FERFIwCQkweDkyCisjZGVmaW5lIEJMSVpaQVJEX1BPV0VSX1NBVkUJCQkweEU2CisjZGVmaW5lIEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTCQkweEU4CisKKy8qIERhdGEgc291cmNlIHNlbGVjdCAqLworLyogRm9yIFMxRDEzNzQ1ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0RfQkFDS0dST1VORAkweDAwCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkUJMHgwMQorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfT1ZFUkxBWV9FTkFCTEUJMHgwNAorI2RlZmluZSBCTElaWkFSRF9TUkNfRElTQUJMRV9PVkVSTEFZCQkweDA1CisvKiBGb3IgUzFEMTM3NDQgKi8KKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX0xDRAkJCTB4MDAKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX0JMVF9MQ0QJCQkweDA2CisKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfUkdCNTY1CQkJMHgwMQorI2RlZmluZSBCTElaWkFSRF9DT0xPUl9ZVVY0MjAJCQkweDA5CisKKyNkZWZpbmUgQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NQkJMHgwMQkvKiBIYWlsc3Rvcm0gKi8KKyNkZWZpbmUgQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NAkJMHgwMgkvKiBCbGl6emFyZCAqLworCisjZGVmaW5lIEJMSVpaQVJEX0FVVE9fVVBEQVRFX1RJTUUJCShIWiAvIDIwKQorCisvKiBSZXNlcnZlIDQgcmVxdWVzdCBzbG90cyBmb3IgcmVxdWVzdHMgaW4gaXJxIGNvbnRleHQgKi8KKyNkZWZpbmUgUkVRX1BPT0xfU0laRQkJCTI0CisjZGVmaW5lIElSUV9SRVFfUE9PTF9TSVpFCQk0CisKKyNkZWZpbmUgUkVRX0ZST01fSVJRX1BPT0wgMHgwMQorCisjZGVmaW5lIFJFUV9DT01QTEVURQkwCisjZGVmaW5lIFJFUV9QRU5ESU5HCTEKKworc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IHsKKwlpbnQJc3RhcnQ7CisJaW50CWVuZDsKK307CisKKy8qIFRoZXNlIG5lZWQgdG8gYmUgc2F2ZWQgLyByZXN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlc3QuICovCitzdGF0aWMgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IGJsaXp6YXJkX3BsbF9yZWdzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDA0LAkJLyogRG9uJ3Qgc2F2ZSBQTEwgY3RybCAoMHgwQykgKi8KKwkJLmVuZAk9IDB4MGEsCisJfSwKKwl7CisJCS5zdGFydAk9IDB4MGUsCQkvKiBDbG9jayBjb25maWd1cmF0aW9uICovCisJCS5lbmQJPSAweDBlLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0IGJsaXp6YXJkX2dlbl9yZWdzW10gPSB7CisJeworCQkuc3RhcnQJPSAweDE4LAkJLyogU0RSQU0gY29udHJvbCAqLworCQkuZW5kCT0gMHgyMCwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gMHgyOCwJCS8qIExDRCBQYW5lbCBjb25maWd1cmF0aW9uICovCisJCS5lbmQJPSAweDVhLAkJLyogSFNTSSBpbnRlcmZhY2UsIFRWIGNvbmZpZ3VyYXRpb24gKi8KKwl9LAorfTsKKworc3RhdGljIHU4IGJsaXp6YXJkX3JlZ19jYWNoZVsweDVhIC8gMl07CisKK3N0cnVjdCB1cGRhdGVfcGFyYW0geworCWludAlwbGFuZTsKKwlpbnQJeCwgeSwgd2lkdGgsIGhlaWdodDsKKwlpbnQJb3V0X3gsIG91dF95OworCWludAlvdXRfd2lkdGgsIG91dF9oZWlnaHQ7CisJaW50CWNvbG9yX21vZGU7CisJaW50CWJwcDsKKwlpbnQJZmxhZ3M7Cit9OworCitzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl1bnNpZ25lZCBpbnQJIGZsYWdzOworCisJaW50CQkgKCpoYW5kbGVyKShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKTsKKwl2b2lkCQkgKCpjb21wbGV0ZSkodm9pZCAqZGF0YSk7CisJdm9pZAkJICpjb21wbGV0ZV9kYXRhOworCisJdW5pb24geworCQlzdHJ1Y3QgdXBkYXRlX3BhcmFtCXVwZGF0ZTsKKwkJc3RydWN0IGNvbXBsZXRpb24JKnN5bmM7CisJfSBwYXI7Cit9OworCitzdHJ1Y3QgcGxhbmVfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IHBvc194LCBwb3NfeTsKKwlpbnQgd2lkdGgsIGhlaWdodDsKKwlpbnQgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OworCWludCBzY3Jfd2lkdGg7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGJwcDsKK307CisKK3N0cnVjdCBibGl6emFyZF9zdHJ1Y3QgeworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlOworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlCXVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kOworCisJc3RydWN0IHRpbWVyX2xpc3QJYXV0b191cGRhdGVfdGltZXI7CisJaW50CQkJc3RvcF9hdXRvX3VwZGF0ZTsKKwlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cJYXV0b191cGRhdGVfd2luZG93OworCWludAkJCWVuYWJsZWRfcGxhbmVzOworCWludAkJCXZpZF9ub25zdGRfY29sb3I7CisJaW50CQkJdmlkX3NjYWxlZDsKKwlpbnQJCQlsYXN0X2NvbG9yX21vZGU7CisJaW50CQkJem9vbV9vbjsKKwlpbnQJCQlzY3JlZW5fd2lkdGg7CisJaW50CQkJc2NyZWVuX2hlaWdodDsKKwl1bnNpZ25lZAkJdGVfY29ubmVjdGVkOjE7CisJdW5zaWduZWQJCXZzeW5jX29ubHk6MTsKKworCXN0cnVjdCBwbGFuZV9pbmZvCXBsYW5lW09NQVBGQl9QTEFORV9OVU1dOworCisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QJcmVxX3Bvb2xbUkVRX1BPT0xfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX3JlcV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9yZXFfbGlzdDsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXJlcV9zZW1hOworCXNwaW5sb2NrX3QJCXJlcV9sb2NrOworCisJdW5zaWduZWQgbG9uZwkJc3lzX2NrX3JhdGU7CisJc3RydWN0IGV4dGlmX3RpbWluZ3MJcmVnX3RpbWluZ3MsIGx1dF90aW1pbmdzOworCisJdTMyCQkJbWF4X3RyYW5zbWl0X3NpemU7CisJdTMyCQkJZXh0aWZfY2xrX3BlcmlvZDsKKwlpbnQJCQlleHRpZl9jbGtfZGl2OworCXVuc2lnbmVkIGxvbmcJCXBpeF90eF90aW1lOworCXVuc2lnbmVkIGxvbmcJCWxpbmVfdXBkX3RpbWU7CisKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisJc3RydWN0IGxjZF9jdHJsX2V4dGlmCSpleHRpZjsKKwlzdHJ1Y3QgbGNkX2N0cmwJCSppbnRfY3RybDsKKworCXZvaWQJCQkoKnBvd2VyX3VwKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXZvaWQJCQkoKnBvd2VyX2Rvd24pKHN0cnVjdCBkZXZpY2UgKmRldik7CisKKwlpbnQJCQl2ZXJzaW9uOworfSBibGl6emFyZDsKKworc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmw7CisKK3N0YXRpYyB1OCBibGl6emFyZF9yZWFkX3JlZyh1OCByZWcpCit7CisJdTggZGF0YTsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJYmxpenphcmQuZXh0aWYtPnJlYWRfZGF0YSgmZGF0YSwgMSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfd3JpdGVfcmVnKHU4IHJlZywgdTggdmFsKQoreworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJnJlZywgMSk7CisJYmxpenphcmQuZXh0aWYtPndyaXRlX2RhdGEoJnZhbCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3RhcnRfc2RyYW0odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUsIDApOworCXVkZWxheSg1MCk7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSwgMSk7CisJdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwKTsKKwl3aGlsZSAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9NRU1fQkFOSzBfU1RBVFVTKSAmIDB4MDEpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkJInMxZDEzNzR4OiBTRFJBTSBub3QgcmVhZHkiKTsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3N0b3Bfc2RyYW0odm9pZCkKK3sKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTUVNX0JBTkswX0FDVElWQVRFLCAwKTsKK30KKworLyogV2FpdCB1bnRpbCB0aGUgbGFzdCB3aW5kb3cgd2FzIGNvbXBsZXRlbHkgd3JpdHRlbiBpbnRvIHRoZSBjb250cm9sbGVycworICogU0RSQU0gYW5kIHdlIGNhbiBzdGFydCB0cmFuc2ZlcnJpbmcgdGhlIG5leHQgd2luZG93LgorICovCitzdGF0aWMgdm9pZCBibGl6emFyZF93YWl0X2xpbmVfYnVmZmVyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzMCk7CisKKwl3aGlsZSAoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpICYgKDEgPDwgNykpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdG1vKSkgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJCSJzMWQxMzc0eDogbGluZSBidWZmZXIgbm90IHJlYWR5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBXYWl0IHVudGlsIHRoZSBZWUMgY29sb3Igc3BhY2UgY29udmVydGVyIGlzIGlkbGUuICovCitzdGF0aWMgdm9pZCBibGl6emFyZF93YWl0X3l5Yyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzApOworCisJd2hpbGUgKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKSAmICgxIDw8IDQpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCQkiczFkMTM3NHg6IFlZQyBub3QgcmVhZHlcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfb3ZlcmxheSh2b2lkKQoreworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9EQVRBX1NPVVJDRV9TRUxFQ1QsCisJCQkJQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF93aW5kb3dfcmVncyhpbnQgeF9zdGFydCwgaW50IHlfc3RhcnQsIGludCB4X2VuZCwgaW50IHlfZW5kLAorCQkJICAgIGludCB4X291dF9zdGFydCwgaW50IHlfb3V0X3N0YXJ0LAorCQkJICAgIGludCB4X291dF9lbmQsIGludCB5X291dF9lbmQsIGludCBjb2xvcl9tb2RlLAorCQkJICAgIGludCB6b29tX29mZiwgaW50IGZsYWdzKQoreworCXU4IHRtcFsxOF07CisJdTggY21kOworCisJeF9lbmQtLTsKKwl5X2VuZC0tOworCXRtcFswXSA9IHhfc3RhcnQ7CisJdG1wWzFdID0geF9zdGFydCA+PiA4OworCXRtcFsyXSA9IHlfc3RhcnQ7CisJdG1wWzNdID0geV9zdGFydCA+PiA4OworCXRtcFs0XSA9IHhfZW5kOworCXRtcFs1XSA9IHhfZW5kID4+IDg7CisJdG1wWzZdID0geV9lbmQ7CisJdG1wWzddID0geV9lbmQgPj4gODsKKworCXhfb3V0X2VuZC0tOworCXlfb3V0X2VuZC0tOworCXRtcFs4XSAgPSB4X291dF9zdGFydDsKKwl0bXBbOV0gID0geF9vdXRfc3RhcnQgPj4gODsKKwl0bXBbMTBdID0geV9vdXRfc3RhcnQ7CisJdG1wWzExXSA9IHlfb3V0X3N0YXJ0ID4+IDg7CisJdG1wWzEyXSA9IHhfb3V0X2VuZDsKKwl0bXBbMTNdID0geF9vdXRfZW5kID4+IDg7CisJdG1wWzE0XSA9IHlfb3V0X2VuZDsKKwl0bXBbMTVdID0geV9vdXRfZW5kID4+IDg7CisKKwl0bXBbMTZdID0gY29sb3JfbW9kZTsKKwlpZiAoem9vbV9vZmYgJiYgYmxpenphcmQudmVyc2lvbiA9PSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1KQorCQl0bXBbMTddID0gQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9CQUNLR1JPVU5EOworCWVsc2UgaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0VOQUJMRV9PVkVSTEFZKQorCQl0bXBbMTddID0gQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFOworCWVsc2UKKwkJdG1wWzE3XSA9IGJsaXp6YXJkLnZlcnNpb24gPT0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NCA/CisJCQkJQkxJWlpBUkRfU1JDX1dSSVRFX0xDRCA6CisJCQkJQkxJWlpBUkRfU1JDX1dSSVRFX0xDRF9ERVNUUlVDVElWRTsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJY21kID0gQkxJWlpBUkRfSU5QVVRfV0lOX1hfU1RBUlRfMDsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfY29tbWFuZCgmY21kLCAxKTsKKwlibGl6emFyZC5leHRpZi0+d3JpdGVfZGF0YSh0bXAsIDE4KTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3RlYXJzeW5jKGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzY3JlZW5faGVpZ2h0LAorCQkJICAgIGludCBvdXRfaGVpZ2h0LCBpbnQgZm9yY2VfdnN5bmMpCit7CisJdTggYjsKKworCWIgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7CisJYiB8PSAxIDw8IDM7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTLCBiKTsKKworCWlmIChsaWtlbHkoYmxpenphcmQudnN5bmNfb25seSB8fCBmb3JjZV92c3luYykpIHsKKwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh3aWR0aCAqIGJsaXp6YXJkLnBpeF90eF90aW1lIDwgYmxpenphcmQubGluZV91cGRfdGltZSkgeworCQlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKCh3aWR0aCAqIGJsaXp6YXJkLnBpeF90eF90aW1lIC8gMTAwMCkgKiBoZWlnaHQgPAorCSAgICAoeSArIG91dF9oZWlnaHQpICogKGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUgLyAxMDAwKSkgeworCQlibGl6emFyZC5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCB5ICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfdGVhcnN5bmModm9pZCkKK3sKKwl1OCBiOworCisJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygwLCAwKTsKKwliID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworCWIgJj0gfigxIDw8IDMpOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9leHRpZl90aW1pbmdzKGNvbnN0IHN0cnVjdCBleHRpZl90aW1pbmdzICp0KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqYWxsb2NfcmVxKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCWludCByZXFfZmxhZ3MgPSAwOworCisJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwkJZG93bigmYmxpenphcmQucmVxX3NlbWEpOworCWVsc2UKKwkJcmVxX2ZsYWdzID0gUkVRX0ZST01fSVJRX1BPT0w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKwlCVUdfT04obGlzdF9lbXB0eSgmYmxpenphcmQuZnJlZV9yZXFfbGlzdCkpOworCXJlcSA9IGxpc3RfZW50cnkoYmxpenphcmQuZnJlZV9yZXFfbGlzdC5uZXh0LAorCQkJIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisJbGlzdF9kZWwoJnJlcS0+ZW50cnkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5lbnRyeSk7CisJcmVxLT5mbGFncyA9IHJlcV9mbGFnczsKKworCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3JlcShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlsaXN0X2FkZCgmcmVxLT5lbnRyeSwgJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpOworCWlmICghKHJlcS0+ZmxhZ3MgJiBSRVFfRlJPTV9JUlFfUE9PTCkpCisJCXVwKCZibGl6emFyZC5yZXFfc2VtYSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QpKSB7CisJCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXE7CisJCXZvaWQgKCpjb21wbGV0ZSkodm9pZCAqKTsKKwkJdm9pZCAqY29tcGxldGVfZGF0YTsKKworCQlyZXEgPSBsaXN0X2VudHJ5KGJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QubmV4dCwKKwkJCQkgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QsIGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCQlpZiAocmVxLT5oYW5kbGVyKHJlcSkgPT0gUkVRX1BFTkRJTkcpCisJCQlyZXR1cm47CisKKwkJY29tcGxldGUgPSByZXEtPmNvbXBsZXRlOworCQljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCQlmcmVlX3JlcShyZXEpOworCisJCWlmIChjb21wbGV0ZSkKKwkJCWNvbXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9yZXFfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHByb2Nlc3MgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisJaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmYmxpenphcmQucGVuZGluZ19yZXFfbGlzdCkpKQorCQlwcm9jZXNzID0gMDsKKwlsaXN0X3NwbGljZV9pbml0KGhlYWQsIGJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QucHJldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKKworCWlmIChwcm9jZXNzKQorCQlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworc3RhdGljIHZvaWQgcmVxdWVzdF9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0CSpyZXEgPSAoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKilkYXRhOworCXZvaWQJCQkoKmNvbXBsZXRlKSh2b2lkICopOworCXZvaWQJCQkqY29tcGxldGVfZGF0YTsKKworCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCisJZnJlZV9yZXEocmVxKTsKKworCWlmIChjb21wbGV0ZSkKKwkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworCitzdGF0aWMgaW50IGRvX2Z1bGxfc2NyZWVuX3VwZGF0ZShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCWludCBpOworCWludCBmbGFnczsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJc3RydWN0IHBsYW5lX2luZm8gKnAgPSAmYmxpenphcmQucGxhbmVbaV07CisJCWlmICghKGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICYgKDEgPDwgaSkpKSB7CisJCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDApOworCQkJY29udGludWU7CisJCX0KKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAicHcgJWQgcGggJWRcbiIsCisJCQlwLT53aWR0aCwgcC0+aGVpZ2h0KTsKKwkJYmxpenphcmQuaW50X2N0cmwtPnNldHVwX3BsYW5lKGksCisJCQkJT01BUEZCX0NIQU5ORUxfT1VUX0xDRCwgcC0+b2Zmc2V0LAorCQkJCXAtPnNjcl93aWR0aCwgcC0+cG9zX3gsIHAtPnBvc195LAorCQkJCXAtPndpZHRoLCBwLT5oZWlnaHQsCisJCQkJcC0+Y29sb3JfbW9kZSk7CisJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMSk7CisJfQorCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAic3cgJWQgc2ggJWRcbiIsCisJCWJsaXp6YXJkLnNjcmVlbl93aWR0aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCk7CisJYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcigpOworCWZsYWdzID0gcmVxLT5wYXIudXBkYXRlLmZsYWdzOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykKKwkJZW5hYmxlX3RlYXJzeW5jKDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0aCwKKwkJCQlibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQlmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQyk7CisJZWxzZQorCQlkaXNhYmxlX3RlYXJzeW5jKCk7CisKKwlzZXRfd2luZG93X3JlZ3MoMCwgMCwgYmxpenphcmQuc2NyZWVuX3dpZHRoLCBibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJMCwgMCwgYmxpenphcmQuc2NyZWVuX3dpZHRoLCBibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJQkxJWlpBUkRfQ09MT1JfUkdCNTY1LCBibGl6emFyZC56b29tX29uLCBmbGFncyk7CisJYmxpenphcmQuem9vbV9vbiA9IDA7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDE2KTsKKwkvKiBzZXRfd2luZG93X3JlZ3MgaGFzIGxlZnQgdGhlIHJlZ2lzdGVyIGluZGV4IGF0IHRoZSByaWdodAorCSAqIHBsYWNlLCBzbyBubyBuZWVkIHRvIHNldCBpdCBoZXJlLgorCSAqLworCWJsaXp6YXJkLmV4dGlmLT50cmFuc2Zlcl9hcmVhKGJsaXp6YXJkLnNjcmVlbl93aWR0aCwKKwkJCQkgICAgICBibGl6emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCSAgICAgIHJlcXVlc3RfY29tcGxldGUsIHJlcSk7CisJcmV0dXJuIFJFUV9QRU5ESU5HOworfQorCisvKiBTZXR1cCBhbGwgcGxhbmVzIHdpdGggYW4gb3ZlcmxhcHBpbmcgYXJlYSB3aXRoIHRoZSB1cGRhdGUgd2luZG93LiAqLworc3RhdGljIGludCBkb19wYXJ0aWFsX3VwZGF0ZShzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxLCBpbnQgcGxhbmUsCisJCQkgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorCQkJICAgICBpbnQgeF9vdXQsIGludCB5X291dCwgaW50IHdfb3V0LCBpbnQgaF9vdXQsCisJCQkgICAgIGludCB3bmRfY29sb3JfbW9kZSwgaW50IGJwcCkKK3sKKwlpbnQgaTsKKwlpbnQgZ3gxLCBneTEsIGd4MiwgZ3kyOworCWludCBneDFfb3V0LCBneTFfb3V0LCBneDJfb3V0LCBneTJfb3V0OworCWludCBjb2xvcl9tb2RlOworCWludCBmbGFnczsKKwlpbnQgem9vbV9vZmY7CisKKwkvKiBHbG9iYWwgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHBpeGVsIDAsMCBvZiB0aGUgTENEICovCisJZ3gxID0geCArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeDsKKwlneTEgPSB5ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc195OworCWd4MiA9IGd4MSArIHc7CisJZ3kyID0gZ3kxICsgaDsKKworCWZsYWdzID0gcmVxLT5wYXIudXBkYXRlLmZsYWdzOworCWlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ET1VCTEUpIHsKKwkJZ3gxX291dCA9IGd4MTsKKwkJZ3kxX291dCA9IGd5MTsKKwkJZ3gyX291dCA9IGd4MSArIHcgKiAyOworCQlneTJfb3V0ID0gZ3kxICsgaCAqIDI7CisJfSBlbHNlIHsKKwkJZ3gxX291dCA9IHhfb3V0ICsgYmxpenphcmQucGxhbmVbcGxhbmVdLnBvc194OworCQlneTFfb3V0ID0geV9vdXQgKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3k7CisJCWd4Ml9vdXQgPSBneDFfb3V0ICsgd19vdXQ7CisJCWd5Ml9vdXQgPSBneTFfb3V0ICsgaF9vdXQ7CisJfQorCXpvb21fb2ZmID0gYmxpenphcmQuem9vbV9vbiAmJiBneDEgPT0gMCAmJiBneTEgPT0gMCAmJgorCQl3ID09IGJsaXp6YXJkLnNjcmVlbl93aWR0aCAmJiBoID09IGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQ7CisJYmxpenphcmQuem9vbV9vbiA9ICghem9vbV9vZmYgJiYgYmxpenphcmQuem9vbV9vbikgfHwKKwkJCSAgICh3IDwgd19vdXQgfHwgaCA8IGhfb3V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBPTUFQRkJfUExBTkVfTlVNOyBpKyspIHsKKwkJc3RydWN0IHBsYW5lX2luZm8gKnAgPSAmYmxpenphcmQucGxhbmVbaV07CisJCWludCBweDEsIHB5MTsKKwkJaW50IHB4MiwgcHkyOworCQlpbnQgcHcsIHBoOworCQlpbnQgcHBvc3gsIHBwb3N5OworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKworCQlpZiAoIShibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmICgxIDw8IGkpKSAgfHwKKwkJICAgICh3bmRfY29sb3JfbW9kZSAmJiBpICE9IHBsYW5lKSkgeworCQkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFBsYW5lIGNvb3JkaW5hdGVzICovCisJCWlmIChpID09IHBsYW5lKSB7CisJCQkvKiBQbGFuZSBpbiB3aGljaCB3ZSBhcmUgZG9pbmcgdGhlIHVwZGF0ZS4KKwkJCSAqIExvY2FsIGNvb3JkaW5hdGVzIGFyZSB0aGUgb25lIGluIHRoZSB1cGRhdGUKKwkJCSAqIHJlcXVlc3QuCisJCQkgKi8KKwkJCXB4MSA9IHg7CisJCQlweTEgPSB5OworCQkJcHgyID0geCArIHc7CisJCQlweTIgPSB5ICsgaDsKKwkJCXBwb3N4ID0gMDsKKwkJCXBwb3N5ID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGlmIHRoaXMgcGxhbmUgaGFzIGFuIG92ZXJsYXBwaW5nIHBhcnQgKi8KKwkJCXB4MSA9IGd4MSAtIHAtPnBvc194OworCQkJcHkxID0gZ3kxIC0gcC0+cG9zX3k7CisJCQlweDIgPSBneDIgLSBwLT5wb3NfeDsKKwkJCXB5MiA9IGd5MiAtIHAtPnBvc195OworCQkJaWYgKHB4MSA+PSBwLT53aWR0aCB8fCBweTEgPj0gcC0+aGVpZ2h0IHx8CisJCQkgICAgcHgyIDw9IDAgfHwgcHkyIDw9IDApIHsKKwkJCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogQ2FsY3VsYXRlIHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIG92ZXJsYXBwaW5nCisJCQkgKiBwYXJ0IGluIHRoZSBwbGFuZSdzIGxvY2FsIGNvb3JkaW5hdGVzLgorCQkJICovCisJCQlwcG9zeCA9IC1weDE7CisJCQlwcG9zeSA9IC1weTE7CisJCQlpZiAocHgxIDwgMCkKKwkJCQlweDEgPSAwOworCQkJaWYgKHB5MSA8IDApCisJCQkJcHkxID0gMDsKKwkJCWlmIChweDIgPiBwLT53aWR0aCkKKwkJCQlweDIgPSBwLT53aWR0aDsKKwkJCWlmIChweTIgPiBwLT5oZWlnaHQpCisJCQkJcHkyID0gcC0+aGVpZ2h0OworCQkJaWYgKHBwb3N4IDwgMCkKKwkJCQlwcG9zeCA9IDA7CisJCQlpZiAocHBvc3kgPCAwKQorCQkJCXBwb3N5ID0gMDsKKwkJfQorCQlwdyA9IHB4MiAtIHB4MTsKKwkJcGggPSBweTIgLSBweTE7CisJCW9mZnNldCA9IHAtPm9mZnNldCArIChwLT5zY3Jfd2lkdGggKiBweTEgKyBweDEpICogcC0+YnBwIC8gODsKKwkJaWYgKHduZF9jb2xvcl9tb2RlKQorCQkJLyogV2luZG93IGVtYmVkZGVkIGluIHRoZSBwbGFuZSB3aXRoIGEgZGlmZmVyaW5nCisJCQkgKiBjb2xvciBtb2RlIC8gYnBwLiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBETUEKKwkJCSAqIHRyYW5zZmVyIGVsZW1lbnRzIGluIHRlcm1zIG9mIHRoZSBwbGFuZSdzIGJwcC4KKwkJCSAqLworCQkJcHcgPSAocHcgKyAxKSAqIGJwcCAvIHAtPmJwcDsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCSJwbGFuZSAlZCBvZmZzZXQgJSMwOGx4IHBwb3N4ICVkIHBwb3N5ICVkICIKKwkJCSJweDEgJWQgcHkxICVkIHB3ICVkIHBoICVkXG4iLAorCQkJaSwgb2Zmc2V0LCBwcG9zeCwgcHBvc3ksIHB4MSwgcHkxLCBwdywgcGgpOworI2VuZGlmCisJCWJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9wbGFuZShpLAorCQkJCU9NQVBGQl9DSEFOTkVMX09VVF9MQ0QsIG9mZnNldCwKKwkJCQlwLT5zY3Jfd2lkdGgsCisJCQkJcHBvc3gsIHBwb3N5LCBwdywgcGgsCisJCQkJcC0+Y29sb3JfbW9kZSk7CisKKwkJYmxpenphcmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAxKTsKKwl9CisKKwlzd2l0Y2ggKHduZF9jb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQljb2xvcl9tb2RlID0gQkxJWlpBUkRfQ09MT1JfWVVWNDIwOworCQkvKiBDdXJyZW50bHkgb25seSB0aGUgMTYgYml0cy9waXhlbCBjeWNsZSBmb3JtYXQgaXMKKwkJICogc3VwcG9ydGVkIG9uIHRoZSBleHRlcm5hbCBpbnRlcmZhY2UuIEFkanVzdCB0aGUgbnVtYmVyCisJCSAqIG9mIHRyYW5zZmVyIGVsZW1lbnRzIHBlciBsaW5lIGZvciAxMmJwcCBmb3JtYXQuCisJCSAqLworCQl3ID0gKHcgKyAxKSAqIDMgLyA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb2xvcl9tb2RlID0gQkxJWlpBUkRfQ09MT1JfUkdCNTY1OworCQlicmVhazsKKwl9CisKKwlibGl6emFyZF93YWl0X2xpbmVfYnVmZmVyKCk7CisJaWYgKGJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSA9PSBCTElaWkFSRF9DT0xPUl9ZVVY0MjApCisJCWJsaXp6YXJkX3dhaXRfeXljKCk7CisJYmxpenphcmQubGFzdF9jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsKKwlpZiAoZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpCisJCWVuYWJsZV90ZWFyc3luYyhneTEsIHcsIGgsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQloX291dCwKKwkJCQlmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQyk7CisJZWxzZQorCQlkaXNhYmxlX3RlYXJzeW5jKCk7CisKKwlzZXRfd2luZG93X3JlZ3MoZ3gxLCBneTEsIGd4MiwgZ3kyLCBneDFfb3V0LCBneTFfb3V0LCBneDJfb3V0LCBneTJfb3V0LAorCQkJY29sb3JfbW9kZSwgem9vbV9vZmYsIGZsYWdzKTsKKworCWJsaXp6YXJkLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoMTYpOworCS8qIHNldF93aW5kb3dfcmVncyBoYXMgbGVmdCB0aGUgcmVnaXN0ZXIgaW5kZXggYXQgdGhlIHJpZ2h0CisJICogcGxhY2UsIHNvIG5vIG5lZWQgdG8gc2V0IGl0IGhlcmUuCisJICovCisJYmxpenphcmQuZXh0aWYtPnRyYW5zZmVyX2FyZWEodywgaCwgcmVxdWVzdF9jb21wbGV0ZSwgcmVxKTsKKworCXJldHVybiBSRVFfUEVORElORzsKK30KKworc3RhdGljIGludCBzZW5kX2ZyYW1lX2hhbmRsZXIoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdXBkYXRlX3BhcmFtICpwYXIgPSAmcmVxLT5wYXIudXBkYXRlOworCWludCBwbGFuZSA9IHBhci0+cGxhbmU7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkic2VuZF9mcmFtZTogeCAlZCB5ICVkIHcgJWQgaCAlZCAiCisJCSJ4X291dCAlZCB5X291dCAlZCB3X291dCAlZCBoX291dCAlZCAiCisJCSJjb2xvcl9tb2RlICUwNHggZmxhZ3MgJTA0eCBwbGFuZXMgJTAxeFxuIiwKKwkJcGFyLT54LCBwYXItPnksIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LAorCQlwYXItPm91dF94LCBwYXItPm91dF95LCBwYXItPm91dF93aWR0aCwgcGFyLT5vdXRfaGVpZ2h0LAorCQlwYXItPmNvbG9yX21vZGUsIHBhci0+ZmxhZ3MsIGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzKTsKKyNlbmRpZgorCWlmIChwYXItPmZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0RJU0FCTEVfT1ZFUkxBWSkKKwkJZGlzYWJsZV9vdmVybGF5KCk7CisKKwlpZiAoKGJsaXp6YXJkLmVuYWJsZWRfcGxhbmVzICYgYmxpenphcmQudmlkX25vbnN0ZF9jb2xvcikgfHwKKwkgICAgIChibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmIGJsaXp6YXJkLnZpZF9zY2FsZWQpKQorCQlyZXR1cm4gZG9fZnVsbF9zY3JlZW5fdXBkYXRlKHJlcSk7CisKKwlyZXR1cm4gZG9fcGFydGlhbF91cGRhdGUocmVxLCBwbGFuZSwgcGFyLT54LCBwYXItPnksCisJCQkJIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LAorCQkJCSBwYXItPm91dF94LCBwYXItPm91dF95LAorCQkJCSBwYXItPm91dF93aWR0aCwgcGFyLT5vdXRfaGVpZ2h0LAorCQkJCSBwYXItPmNvbG9yX21vZGUsIHBhci0+YnBwKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9mcmFtZV9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworfQorCisjZGVmaW5lIEFERF9QUkVRKF94LCBfeSwgX3csIF9oLCBfeF9vdXQsIF95X291dCwgX3dfb3V0LCBfaF9vdXQpIGRvIHsJXAorCXJlcSA9IGFsbG9jX3JlcSgpOwkJCVwKKwlyZXEtPmhhbmRsZXIJPSBzZW5kX2ZyYW1lX2hhbmRsZXI7CVwKKwlyZXEtPmNvbXBsZXRlCT0gc2VuZF9mcmFtZV9jb21wbGV0ZTsJXAorCXJlcS0+cGFyLnVwZGF0ZS5wbGFuZSA9IHBsYW5lX2lkeDsJXAorCXJlcS0+cGFyLnVwZGF0ZS54ID0gX3g7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS55ID0gX3k7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS53aWR0aCAgPSBfdzsJCVwKKwlyZXEtPnBhci51cGRhdGUuaGVpZ2h0ID0gX2g7CQlcCisJcmVxLT5wYXIudXBkYXRlLm91dF94ID0gX3hfb3V0OwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRfeSA9IF95X291dDsJCVwKKwlyZXEtPnBhci51cGRhdGUub3V0X3dpZHRoID0gX3dfb3V0OwlcCisJcmVxLT5wYXIudXBkYXRlLm91dF9oZWlnaHQgPSBfaF9vdXQ7CVwKKwlyZXEtPnBhci51cGRhdGUuYnBwID0gYnBwOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5jb2xvcl9tb2RlID0gY29sb3JfbW9kZTtcCisJcmVxLT5wYXIudXBkYXRlLmZsYWdzCSAgPSBmbGFnczsJXAorCWxpc3RfYWRkX3RhaWwoJnJlcS0+ZW50cnksIHJlcV9oZWFkKTsJXAorfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBjcmVhdGVfcmVxX2xpc3QoaW50IHBsYW5lX2lkeCwKKwkJCSAgICBzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZXFfaGVhZCkKK3sKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCWludCB4ID0gd2luLT54OworCWludCB5ID0gd2luLT55OworCWludCB3aWR0aCA9IHdpbi0+d2lkdGg7CisJaW50IGhlaWdodCA9IHdpbi0+aGVpZ2h0OworCWludCB4X291dCA9IHdpbi0+b3V0X3g7CisJaW50IHlfb3V0ID0gd2luLT5vdXRfeTsKKwlpbnQgd2lkdGhfb3V0ID0gd2luLT5vdXRfd2lkdGg7CisJaW50IGhlaWdodF9vdXQgPSB3aW4tPm91dF9oZWlnaHQ7CisJaW50IGNvbG9yX21vZGU7CisJaW50IGJwcDsKKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHlzdGFydCA9IHk7CisJdW5zaWduZWQgaW50IHlzcGFuID0gaGVpZ2h0OworCXVuc2lnbmVkIGludCB5c3RhcnRfb3V0ID0geV9vdXQ7CisJdW5zaWduZWQgaW50IHlzcGFuX291dCA9IGhlaWdodF9vdXQ7CisKKwlmbGFncyA9IHdpbi0+Zm9ybWF0ICYgfk9NQVBGQl9GT1JNQVRfTUFTSzsKKwljb2xvcl9tb2RlID0gd2luLT5mb3JtYXQgJiBPTUFQRkJfRk9STUFUX01BU0s7CisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQkvKiBFbWJlZGRlZCB3aW5kb3cgd2l0aCBkaWZmZXJlbnQgY29sb3IgbW9kZSAqLworCQlicHAgPSAxMjsKKwkJLyogWCwgWSwgaGVpZ2h0IG11c3QgYmUgYWxpZ25lZCBhdCAyLCB3aWR0aCBhdCA0IHBpeGVscyAqLworCQl4ICY9IH4xOworCQl5ICY9IH4xOworCQloZWlnaHQgPSB5c3BhbiA9IGhlaWdodCAmIH4xOworCQl3aWR0aCA9IHdpZHRoICYgfjM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNhbWUgYXMgdGhlIHBsYW5lIGNvbG9yIG1vZGUgKi8KKwkJYnBwID0gYmxpenphcmQucGxhbmVbcGxhbmVfaWR4XS5icHA7CisJCWJyZWFrOworCX0KKwlpZiAod2lkdGggKiBoZWlnaHQgKiBicHAgLyA4ID4gYmxpenphcmQubWF4X3RyYW5zbWl0X3NpemUpIHsKKwkJeXNwYW4gPSBibGl6emFyZC5tYXhfdHJhbnNtaXRfc2l6ZSAvICh3aWR0aCAqIGJwcCAvIDgpOworCQl5c3Bhbl9vdXQgPSB5c3BhbiAqIGhlaWdodF9vdXQgLyBoZWlnaHQ7CisJCUFERF9QUkVRKHgsIHlzdGFydCwgd2lkdGgsIHlzcGFuLCB4X291dCwgeXN0YXJ0X291dCwKKwkJCSB3aWR0aF9vdXQsIHlzcGFuX291dCk7CisJCXlzdGFydCArPSB5c3BhbjsKKwkJeXN0YXJ0X291dCArPSB5c3Bhbl9vdXQ7CisJCXlzcGFuID0gaGVpZ2h0IC0geXNwYW47CisJCXlzcGFuX291dCA9IGhlaWdodF9vdXQgLSB5c3Bhbl9vdXQ7CisJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJfQorCisJQUREX1BSRVEoeCwgeXN0YXJ0LCB3aWR0aCwgeXNwYW4sIHhfb3V0LCB5c3RhcnRfb3V0LAorCQkgd2lkdGhfb3V0LCB5c3Bhbl9vdXQpOworfQorCitzdGF0aWMgdm9pZCBhdXRvX3VwZGF0ZV9jb21wbGV0ZSh2b2lkICpkYXRhKQoreworCWlmICghYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0ZSkKKwkJbW9kX3RpbWVyKCZibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lciwKKwkJCSAgamlmZmllcyArIEJMSVpaQVJEX0FVVE9fVVBEQVRFX1RJTUUpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF91cGRhdGVfd2luZG93X2F1dG8odW5zaWduZWQgbG9uZyBhcmcpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqbGFzdDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmU7CisKKwlwbGFuZSA9IGJsaXp6YXJkLmZiZGV2LT5mYl9pbmZvWzBdLT5wYXI7CisJY3JlYXRlX3JlcV9saXN0KHBsYW5lLT5pZHgsCisJCQkmYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LCAmcmVxX2xpc3QpOworCWxhc3QgPSBsaXN0X2VudHJ5KHJlcV9saXN0LnByZXYsIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBlbnRyeSk7CisKKwlsYXN0LT5jb21wbGV0ZSA9IGF1dG9fdXBkYXRlX2NvbXBsZXRlOworCWxhc3QtPmNvbXBsZXRlX2RhdGEgPSBOVUxMOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7Cit9CisKK2ludCBibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5jKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCSB2b2lkICgqY29tcGxldGVfY2FsbGJhY2spKHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmNvbXBsZXRlX2NhbGxiYWNrX2RhdGEpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqbGFzdDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKworCWlmICh1bmxpa2VseShibGl6emFyZC51cGRhdGVfbW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSghYmxpenphcmQudGVfY29ubmVjdGVkICYmCisJCSAgICAgKHdpbi0+Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY3JlYXRlX3JlcV9saXN0KHBsYW5lLT5pZHgsIHdpbiwgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBjb21wbGV0ZV9jYWxsYmFjazsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gKHZvaWQgKiljb21wbGV0ZV9jYWxsYmFja19kYXRhOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYyk7CisKK3N0YXRpYyBpbnQgdXBkYXRlX2Z1bGxfc2NyZWVuKHZvaWQpCit7CisJcmV0dXJuIGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMoYmxpenphcmQuZmJkZXYtPmZiX2luZm9bMF0sCisJCQkJICAgICAmYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LCBOVUxMLCBOVUxMKTsKKworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX3NldHVwX3BsYW5lKGludCBwbGFuZSwgaW50IGNoYW5uZWxfb3V0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCBzY3JlZW5fd2lkdGgsCisJCQkJICBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSAgaW50IGNvbG9yX21vZGUpCit7CisJc3RydWN0IHBsYW5lX2luZm8gKnA7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgICAgInBsYW5lICVkIGNoX291dCAlZCBvZmZzZXQgJSMwOGx4IHNjcl93aWR0aCAlZCAiCisJCSAgICAicG9zX3ggJWQgcG9zX3kgJWQgd2lkdGggJWQgaGVpZ2h0ICVkIGNvbG9yX21vZGUgJWRcbiIsCisJCSAgICBwbGFuZSwgY2hhbm5lbF9vdXQsIG9mZnNldCwgc2NyZWVuX3dpZHRoLAorCQkgICAgcG9zX3gsIHBvc195LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcl9tb2RlKTsKKyNlbmRpZgorCWlmICgodW5zaWduZWQpcGxhbmUgPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwID0gJmJsaXp6YXJkLnBsYW5lW3BsYW5lXTsKKworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCXAtPmJwcCA9IDE2OworCQlibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yICY9IH4oMSA8PCBwbGFuZSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJcC0+YnBwID0gMTI7CisJCWJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IgfD0gMSA8PCBwbGFuZTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQlwLT5icHAgPSAxNjsKKwkJYmxpenphcmQudmlkX25vbnN0ZF9jb2xvciAmPSB+KDEgPDwgcGxhbmUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwLT5vZmZzZXQgPSBvZmZzZXQ7CisJcC0+cG9zX3ggPSBwb3NfeDsKKwlwLT5wb3NfeSA9IHBvc195OworCXAtPndpZHRoID0gd2lkdGg7CisJcC0+aGVpZ2h0ID0gaGVpZ2h0OworCXAtPnNjcl93aWR0aCA9IHNjcmVlbl93aWR0aDsKKwlpZiAoIXAtPm91dF93aWR0aCkKKwkJcC0+b3V0X3dpZHRoID0gd2lkdGg7CisJaWYgKCFwLT5vdXRfaGVpZ2h0KQorCQlwLT5vdXRfaGVpZ2h0ID0gaGVpZ2h0OworCisJcC0+Y29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXRfc2NhbGUoaW50IHBsYW5lLCBpbnQgb3JpZ193LCBpbnQgb3JpZ19oLAorCQkJICAgICAgaW50IG91dF93LCBpbnQgb3V0X2gpCit7CisJc3RydWN0IHBsYW5lX2luZm8gKnAgPSAmYmxpenphcmQucGxhbmVbcGxhbmVdOworCWludCByOworCisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkicGxhbmUgJWQgb3JpZ193ICVkIG9yaWdfaCAlZCBvdXRfdyAlZCBvdXRfaCAlZFxuIiwKKwkJcGxhbmUsIG9yaWdfdywgb3JpZ19oLCBvdXRfdywgb3V0X2gpOworCWlmICgodW5zaWduZWQpcGxhbmUgPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXIgPSBibGl6emFyZC5pbnRfY3RybC0+c2V0X3NjYWxlKHBsYW5lLCBvcmlnX3csIG9yaWdfaCwgb3V0X3csIG91dF9oKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJcC0+d2lkdGggPSBvcmlnX3c7CisJcC0+aGVpZ2h0ID0gb3JpZ19oOworCXAtPm91dF93aWR0aCA9IG91dF93OworCXAtPm91dF9oZWlnaHQgPSBvdXRfaDsKKwlpZiAob3JpZ193ID09IG91dF93ICYmIG9yaWdfaCA9PSBvdXRfaCkKKwkJYmxpenphcmQudmlkX3NjYWxlZCAmPSB+KDEgPDwgcGxhbmUpOworCWVsc2UKKwkJYmxpenphcmQudmlkX3NjYWxlZCB8PSAxIDw8IHBsYW5lOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfZW5hYmxlX3BsYW5lKGludCBwbGFuZSwgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQlibGl6emFyZC5lbmFibGVkX3BsYW5lcyB8PSAxIDw8IHBsYW5lOworCWVsc2UKKwkJYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJj0gfigxIDw8IHBsYW5lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bmNfaGFuZGxlcihzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxKQoreworCWNvbXBsZXRlKHJlcS0+cGFyLnN5bmMpOworCXJldHVybiBSRVFfQ09NUExFVEU7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3N5bmModm9pZCkKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcDsKKworCXJlcSA9IGFsbG9jX3JlcSgpOworCisJcmVxLT5oYW5kbGVyID0gc3luY19oYW5kbGVyOworCXJlcS0+Y29tcGxldGUgPSBOVUxMOworCWluaXRfY29tcGxldGlvbigmY29tcCk7CisJcmVxLT5wYXIuc3luYyA9ICZjb21wOworCisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZyZXFfbGlzdCk7CisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wKTsKK30KKworCitzdGF0aWMgdm9pZCBibGl6emFyZF9iaW5kX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpZiAoYmxpenphcmQudXBkYXRlX21vZGUgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpIHsKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGJsaXp6YXJkLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCX0KK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpZiAodW5saWtlbHkobW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSAmJgorCQkgICAgIG1vZGUgIT0gT01BUEZCX0FVVE9fVVBEQVRFICYmCisJCSAgICAgbW9kZSAhPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobW9kZSA9PSBibGl6emFyZC51cGRhdGVfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbyhibGl6emFyZC5mYmRldi0+ZGV2LCAiczFkMTM3NHg6IHNldHRpbmcgdXBkYXRlIG1vZGUgdG8gJXNcbiIsCisJCQltb2RlID09IE9NQVBGQl9VUERBVEVfRElTQUJMRUQgPyAiZGlzYWJsZWQiIDoKKwkJCShtb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSA/ICJhdXRvIiA6ICJtYW51YWwiKSk7CisKKwlzd2l0Y2ggKGJsaXp6YXJkLnVwZGF0ZV9tb2RlKSB7CisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGJsaXp6YXJkLmZiZGV2LCBPTUFQRkJfRVZFTlRfRElTQUJMRUQpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0ZSA9IDE7CisJCWRlbF90aW1lcl9zeW5jKCZibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1lcik7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJYmxpenphcmQudXBkYXRlX21vZGUgPSBtb2RlOworCWJsaXp6YXJkX3N5bmMoKTsKKwlibGl6emFyZC5zdG9wX2F1dG9fdXBkYXRlID0gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01BUEZCX0VWRU5UX1JFQURZKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXV0bygwKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIGJsaXp6YXJkX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBibGl6emFyZC51cGRhdGVfbW9kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9leHRpZl90aW1pbmdzKGNvbnN0IHN0cnVjdCBleHRpZl90aW1pbmdzICp0KQoreworCWJsaXp6YXJkLmV4dGlmLT5zZXRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJvdW5kX3RvX2V4dGlmX3RpY2tzKHVuc2lnbmVkIGxvbmcgcHMsIGludCBkaXYpCit7CisJaW50IGJ1c190aWNrID0gYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCAqIGRpdjsKKwlyZXR1cm4gKHBzICsgYnVzX3RpY2sgLSAxKSAvIGJ1c190aWNrICogYnVzX3RpY2s7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19yZWdfdGltaW5nKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgZGl2KQoreworCXN0cnVjdCBleHRpZl90aW1pbmdzICp0OworCXVuc2lnbmVkIGxvbmcgc3lzdGltOworCisJLyogQ1NPblRpbWUgMCwgV0VPblRpbWUgMiBucywgUkVPblRpbWUgMiBucywKKwkgKiBBY2Nlc3NUaW1lIDIgbnMgKyAxMi4yIG5zIChyZWdzKSwKKwkgKiBXRU9mZlRpbWUgPSBXRU9uVGltZSArIDEgbnMsCisJICogUkVPZmZUaW1lID0gUkVPblRpbWUgKyAxMiBucyAocmVncyksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDIqU1lTQ0xLICAocmVncyksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucyAqLworCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAwKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAgIkJsaXp6YXJkIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBkaXYgJWRcbiIsCisJCSAgc3lzdGltLCBibGl6emFyZC5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZibGl6emFyZC5yZWdfdGltaW5nczsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisKKwl0LT5jbGtfZGl2ID0gZGl2OworCisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMjIwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDEzMDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJbcmVnXWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ113ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsICJbcmVnXXJkYWNjZXNzICVkIGNzcHVsc2UgJWRcbiIsCisJCSB0LT5hY2Nlc3NfdGltZSwgdC0+Y3NfcHVsc2Vfd2lkdGgpOworCisJcmV0dXJuIGJsaXp6YXJkLmV4dGlmLT5jb252ZXJ0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19sdXRfdGltaW5nKHVuc2lnbmVkIGxvbmcgc3lzY2xrLCBpbnQgZGl2KQoreworCXN0cnVjdCBleHRpZl90aW1pbmdzICp0OworCXVuc2lnbmVkIGxvbmcgc3lzdGltOworCisJLyogQ1NPblRpbWUgMCwgV0VPblRpbWUgMiBucywgUkVPblRpbWUgMiBucywKKwkgKiBBY2Nlc3NUaW1lIDIgbnMgKyA0ICogU1lTQ0xLICsgMjYgKGx1dCksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgNCpTWVNDTEsgKyAyNiBucyAobHV0KSwKKwkgKiBDU09mZlRpbWUgPSBSRU9mZlRpbWUgKyAxIG5zCisJICogUmVhZEN5Y2xlID0gMm5zICsgNCpTWVNDTEsgKyAyNiBucyAobHV0KSwKKwkgKiBXcml0ZUN5Y2xlID0gMipTWVNDTEsgKyAyIG5zLAorCSAqIENTUHVsc2VXaWR0aCA9IDEwIG5zICovCisKKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJIkJsaXp6YXJkIHN5c3RpbSAlbHUgcHMgZXh0aWZfY2xrX3BlcmlvZCAldSBkaXYgJWRcbiIsCisJCXN5c3RpbSwgYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwgZGl2KTsKKworCXQgPSAmYmxpenphcmQubHV0X3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQtPndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPndlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+d2Vfb25fdGltZSArIDEwMDAsIGRpdik7CisJdC0+cmVfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vbl90aW1lICsgNCAqIHN5c3RpbSArCisJCQkJCSAgICAgIDI2MDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIwMDAgKyA0ICogc3lzdGltICsgMjYwMDAsIGRpdik7CisJaWYgKHQtPnJlX2N5Y2xlX3RpbWUgPCB0LT5yZV9vZmZfdGltZSkKKwkJdC0+cmVfY3ljbGVfdGltZSA9IHQtPnJlX29mZl90aW1lOworCXQtPmNzX3B1bHNlX3dpZHRoID0gMDsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJICJbbHV0XWNzb24gJWQgY3NvZmYgJWQgcmVvbiAlZCByZW9mZiAlZFxuIiwKKwkJIHQtPmNzX29uX3RpbWUsIHQtPmNzX29mZl90aW1lLCB0LT5yZV9vbl90aW1lLCB0LT5yZV9vZmZfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LAorCQkgIltsdXRdd2VvbiAlZCB3ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29mZl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW2x1dF1yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBibGl6emFyZC5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfZXh0aWZfdGltaW5ncyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50ICpleHRpZl9tZW1fZGl2KQoreworCWludCBtYXhfY2xrX2RpdjsKKwlpbnQgZGl2OworCisJYmxpenphcmQuZXh0aWYtPmdldF9jbGtfaW5mbygmYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwgJm1heF9jbGtfZGl2KTsKKwlmb3IgKGRpdiA9IDE7IGRpdiA8PSBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfcmVnX3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpIHsKKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAicmVnIHRpbWluZyBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisJKmV4dGlmX21lbV9kaXYgPSBkaXY7CisKKwlmb3IgKGRpdiA9IDE7IGRpdiA8PSBtYXhfY2xrX2RpdjsgZGl2KyspIHsKKwkJaWYgKGNhbGNfbHV0X3RpbWluZyhzeXNjbGssIGRpdikgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChkaXYgPiBtYXhfY2xrX2RpdikKKwkJZ290byBlcnI7CisKKwlibGl6emFyZC5leHRpZl9jbGtfZGl2ID0gZGl2OworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LCAiY2FuJ3Qgc2V0dXAgdGltaW5nc1xuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2JsaXp6YXJkX2Nsa19yYXRlcyh1bnNpZ25lZCBsb25nIGV4dF9jbGssCisJCQkJdW5zaWduZWQgbG9uZyAqc3lzX2NsaywgdW5zaWduZWQgbG9uZyAqcGl4X2NsaykKK3sKKwlpbnQgcGl4X2Nsa19zcmM7CisJaW50IHN5c19kaXYgPSAwLCBzeXNfbXVsID0gMDsKKwlpbnQgcGl4X2RpdjsKKworCXBpeF9jbGtfc3JjID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfQ0xLX1NSQyk7CisJcGl4X2RpdiA9ICgocGl4X2Nsa19zcmMgPj4gMykgJiAweDFmKSArIDE7CisJaWYgKChwaXhfY2xrX3NyYyAmICgweDMgPDwgMSkpID09IDApIHsKKwkJLyogU291cmNlIGlzIHRoZSBQTEwgKi8KKwkJc3lzX2RpdiA9IChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfRElWKSAmIDB4M2YpICsgMTsKKwkJc3lzX211bCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8wKTsKKwkJc3lzX211bCB8PSAoKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xKQorCQkJCSYgMHgwZikJPDwgMTEpOworCQkqc3lzX2NsayA9IGV4dF9jbGsgKiBzeXNfbXVsIC8gc3lzX2RpdjsKKwl9IGVsc2UJLyogZWxzZSBzb3VyY2UgaXMgZXh0IGNsaywgb3Igb3NjaWxsYXRvciAqLworCQkqc3lzX2NsayA9IGV4dF9jbGs7CisKKwkqcGl4X2NsayA9ICpzeXNfY2xrIC8gcGl4X2RpdjsJCQkvKiBIWiAqLworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJImV4dF9jbGsgJWxkIHBpeF9zcmMgJWQgcGl4X2RpdiAlZCBzeXNfZGl2ICVkIHN5c19tdWwgJWRcbiIsCisJCWV4dF9jbGssIHBpeF9jbGtfc3JjICYgKDB4MyA8PCAxKSwgcGl4X2Rpdiwgc3lzX2Rpdiwgc3lzX211bCk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAic3lzX2NsayAlbGQgcGl4X2NsayAlbGRcbiIsCisJCSpzeXNfY2xrLCAqcGl4X2Nsayk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfdGVhcnN5bmModW5zaWduZWQgbG9uZyBwaXhfY2xrLCBpbnQgZXh0aWZfZGl2KQoreworCWludCBoZGlzcCwgdmRpc3A7CisJaW50IGhuZHAsIHZuZHA7CisJaW50IGhzdywgdnN3OworCWludCBocywgdnM7CisJaW50IGhzX3BvbF9pbnYsIHZzX3BvbF9pbnY7CisJaW50IHVzZV9oc3ZzLCB1c2VfbmRwOworCXU4ICBiOworCisJaHN3ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfSFNXKTsKKwl2c3cgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9WU1cpOworCWhzX3BvbF9pbnYgPSAhKGhzdyAmIDB4ODApOworCXZzX3BvbF9pbnYgPSAhKHZzdyAmIDB4ODApOworCWhzdyA9IGhzdyAmIDB4N2Y7CisJdnN3ID0gdnN3ICYgMHgzZjsKKworCWhkaXNwID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfSERJU1ApICogODsKKwl2ZGlzcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZESVNQMCkgKworCQkoKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZESVNQMSkgJiAweDMpIDw8IDgpOworCisJaG5kcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hORFApICYgMHgzZjsKKwl2bmRwID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVk5EUCk7CisKKwkvKiB0aW1lIHRvIHRyYW5zZmVyIG9uZSBwaXhlbCAoMTZicHApIGluIHBzICovCisJYmxpenphcmQucGl4X3R4X3RpbWUgPSBibGl6emFyZC5yZWdfdGltaW5ncy53ZV9jeWNsZV90aW1lOworCWlmIChibGl6emFyZC5leHRpZi0+Z2V0X21heF90eF9yYXRlICE9IE5VTEwpIHsKKwkJLyogVGhlIGV4dGVybmFsIGludGVyZmFjZSBtaWdodCBoYXZlIGEgcmF0ZSBsaW1pdGF0aW9uLAorCQkgKiBpZiBzbywgd2UgaGF2ZSB0byBtYXhpbWl6ZSBvdXIgdHJhbnNmZXIgcmF0ZS4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgbWluX3R4X3RpbWU7CisJCXVuc2lnbmVkIGxvbmcgbWF4X3R4X3JhdGUgPSBibGl6emFyZC5leHRpZi0+Z2V0X21heF90eF9yYXRlKCk7CisKKwkJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2LCAibWF4X3R4X3JhdGUgJWxkIEhaXG4iLAorCQkJbWF4X3R4X3JhdGUpOworCQltaW5fdHhfdGltZSA9IDEwMDAwMDAwMDAgLyAobWF4X3R4X3JhdGUgLyAxMDAwKTsgIC8qIHBzICovCisJCWlmIChibGl6emFyZC5waXhfdHhfdGltZSA8IG1pbl90eF90aW1lKQorCQkJYmxpenphcmQucGl4X3R4X3RpbWUgPSBtaW5fdHhfdGltZTsKKwl9CisKKwkvKiB0aW1lIHRvIHVwZGF0ZSBvbmUgbGluZSBpbiBwcyAqLworCWJsaXp6YXJkLmxpbmVfdXBkX3RpbWUgPSAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOworCWJsaXp6YXJkLmxpbmVfdXBkX3RpbWUgKj0gMTAwMDsKKwlpZiAoaGRpc3AgKiBibGl6emFyZC5waXhfdHhfdGltZSA+IGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUpCisJCS8qIHRyYW5zZmVyIHNwZWVkIHRvbyBsb3csIHdlIG1pZ2h0IGhhdmUgdG8gdXNlIGJvdGgKKwkJICogSFMgYW5kIFZTICovCisJCXVzZV9oc3ZzID0gMTsKKwllbHNlCisJCS8qIGRlY2VudCB0cmFuc2ZlciBzcGVlZCwgd2UnbGwgYWx3YXlzIHVzZSBvbmx5IFZTICovCisJCXVzZV9oc3ZzID0gMDsKKworCWlmICh1c2VfaHN2cyAmJiAoaHNfcG9sX2ludiB8fCB2c19wb2xfaW52KSkgeworCQkvKiBIUyBvcidlZCB3aXRoIFZTIGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBhY3RpdmUgaGlnaAorCQkgKiBURSBzaWduYWwgYmFzZWQgb24gSE5EUCAvIFZORFAgKi8KKwkJdXNlX25kcCA9IDE7CisJCWhzX3BvbF9pbnYgPSAwOworCQl2c19wb2xfaW52ID0gMDsKKwkJaHMgPSBobmRwOworCQl2cyA9IHZuZHA7CisJfSBlbHNlIHsKKwkJLyogVXNlIEhTIG9yJ2VkIHdpdGggVlMgYXMgYSBURSBzaWduYWwgaWYgYm90aCBhcmUgbmVlZGVkCisJCSAqIG9yIFZORFAgaWYgb25seSB2c3luYyBpcyBuZWVkZWQuICovCisJCXVzZV9uZHAgPSAwOworCQlocyA9IGhzdzsKKwkJdnMgPSB2c3c7CisJCWlmICghdXNlX2hzdnMpIHsKKwkJCWhzX3BvbF9pbnYgPSAwOworCQkJdnNfcG9sX2ludiA9IDA7CisJCX0KKwl9CisKKwlocyA9IGhzICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CQkgIC8qIHBzICovCisJaHMgKj0gMTAwMDsKKworCXZzID0gdnMgKiAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOyAvKiBwcyAqLworCXZzICo9IDEwMDA7CisKKwlpZiAodnMgPD0gaHMpCisJCXJldHVybiAtRURPTTsKKwkvKiBzZXQgVlMgdG8gMTIwJSBvZiBIUyB0byBtaW5pbWl6ZSBWUyBkZXRlY3Rpb24gdGltZSAqLworCXZzID0gaHMgKiAxMiAvIDEwOworCS8qIG1pbmltaXplIEhTIHRvbyAqLworCWlmIChocyA+IDEwMDAwKQorCQlocyA9IDEwMDAwOworCisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKKwliICY9IH4weDM7CisJYiB8PSB1c2VfaHN2cyA/IDEgOiAwOworCWIgfD0gKHVzZV9uZHAgJiYgdXNlX2hzdnMpID8gMCA6IDI7CisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTLCBiKTsKKworCWJsaXp6YXJkLnZzeW5jX29ubHkgPSAhdXNlX2hzdnM7CisKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJwaXhfY2xrICVsZCBIWiBwaXhfdHhfdGltZSAlbGQgcHMgbGluZV91cGRfdGltZSAlbGQgcHNcbiIsCisJCXBpeF9jbGssIGJsaXp6YXJkLnBpeF90eF90aW1lLCBibGl6emFyZC5saW5lX3VwZF90aW1lKTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJocyAlZCBwcyB2cyAlZCBwcyBtb2RlICVkIHZzeW5jX29ubHkgJWRcbiIsCisJCWhzLCB2cywgYiAmIDB4MywgIXVzZV9oc3ZzKTsKKworCXJldHVybiBibGl6emFyZC5leHRpZi0+c2V0dXBfdGVhcnN5bmMoMSwgaHMsIHZzLAorCQkJCQkgICAgICBoc19wb2xfaW52LCB2c19wb2xfaW52LAorCQkJCQkgICAgICBleHRpZl9kaXYpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwlibGl6emFyZC5pbnRfY3RybC0+Z2V0X2NhcHMocGxhbmUsIGNhcHMpOworCWNhcHMtPmN0cmwgfD0gT01BUEZCX0NBUFNfTUFOVUFMX1VQREFURSB8CisJCU9NQVBGQl9DQVBTX1dJTkRPV19QSVhFTF9ET1VCTEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfU0NBTEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfT1ZFUkxBWTsKKwlpZiAoYmxpenphcmQudGVfY29ubmVjdGVkKQorCQljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1RFQVJTWU5DOworCWNhcHMtPnduZF9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1KSB8CisJCQkgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIwKTsKK30KKworc3RhdGljIHZvaWQgX3NhdmVfcmVncyhzdHJ1Y3QgYmxpenphcmRfcmVnX2xpc3QgKmxpc3QsIGludCBjbnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGxpc3QrKykgeworCQlpbnQgcmVnOworCQlmb3IgKHJlZyA9IGxpc3QtPnN0YXJ0OyByZWcgPD0gbGlzdC0+ZW5kOyByZWcgKz0gMikKKwkJCWJsaXp6YXJkX3JlZ19jYWNoZVtyZWcgLyAyXSA9IGJsaXp6YXJkX3JlYWRfcmVnKHJlZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcmVzdG9yZV9yZWdzKHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCAqbGlzdCwgaW50IGNudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgbGlzdCsrKSB7CisJCWludCByZWc7CisJCWZvciAocmVnID0gbGlzdC0+c3RhcnQ7IHJlZyA8PSBsaXN0LT5lbmQ7IHJlZyArPSAyKQorCQkJYmxpenphcmRfd3JpdGVfcmVnKHJlZywgYmxpenphcmRfcmVnX2NhY2hlW3JlZyAvIDJdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3NhdmVfYWxsX3JlZ3Modm9pZCkKK3sKKwlfc2F2ZV9yZWdzKGJsaXp6YXJkX3BsbF9yZWdzLCBBUlJBWV9TSVpFKGJsaXp6YXJkX3BsbF9yZWdzKSk7CisJX3NhdmVfcmVncyhibGl6emFyZF9nZW5fcmVncywgQVJSQVlfU0laRShibGl6emFyZF9nZW5fcmVncykpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0b3JlX3BsbF9yZWdzKHZvaWQpCit7CisJX3Jlc3RvcmVfcmVncyhibGl6emFyZF9wbGxfcmVncywgQVJSQVlfU0laRShibGl6emFyZF9wbGxfcmVncykpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0b3JlX2dlbl9yZWdzKHZvaWQpCit7CisJX3Jlc3RvcmVfcmVncyhibGl6emFyZF9nZW5fcmVncywgQVJSQVlfU0laRShibGl6emFyZF9nZW5fcmVncykpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9zdXNwZW5kKHZvaWQpCit7CisJdTMyIGw7CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwlpZiAoYmxpenphcmQubGFzdF9jb2xvcl9tb2RlKSB7CisJCXVwZGF0ZV9mdWxsX3NjcmVlbigpOworCQlibGl6emFyZF9zeW5jKCk7CisJfQorCWJsaXp6YXJkLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kID0gYmxpenphcmQudXBkYXRlX21vZGU7CisJLyogdGhlIGZvbGxvd2luZyB3aWxsIGRpc2FibGUgY2xvY2tzIGFzIHdlbGwgKi8KKwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisKKwlibGl6emFyZF9zYXZlX2FsbF9yZWdzKCk7CisKKwlibGl6emFyZF9zdG9wX3NkcmFtKCk7CisKKwlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSk7CisJLyogU3RhbmRieSwgU2xlZXAuIFdlIGFzc3VtZSB3ZSB1c2UgYW4gZXh0ZXJuYWwgY2xvY2suICovCisJbCB8PSAweDAzOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QT1dFUl9TQVZFLCBsKTsKKworCXRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX01PREUpICYgKDEgPDwgMSkpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkiczFkMTM3NHg6IHNsZWVwIHRpbWVvdXQsIHN0b3BwaW5nIFBMTCBtYW51YWxseVxuIik7CisJCQlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX01PREUpOworCQkJbCAmPSB+MHgwMzsKKwkJCS8qIERpc2FibGUgUExMLCBjb3VudGVyIGZ1bmN0aW9uICovCisJCQlsIHw9IDB4MjsKKwkJCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QTExfTU9ERSwgbCk7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorCisJaWYgKGJsaXp6YXJkLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfZG93bihibGl6emFyZC5mYmRldi0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfcmVzdW1lKHZvaWQpCit7CisJdTMyIGw7CisKKwlpZiAoYmxpenphcmQucG93ZXJfdXAgIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfdXAoYmxpenphcmQuZmJkZXYtPmRldik7CisKKwlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSk7CisJLyogU3RhbmRieSwgU2xlZXAgKi8KKwlsICY9IH4weDAzOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QT1dFUl9TQVZFLCBsKTsKKworCWJsaXp6YXJkX3Jlc3RvcmVfcGxsX3JlZ3MoKTsKKwlsID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX01PREUpOworCWwgJj0gfjB4MDM7CisJLyogRW5hYmxlIFBMTCwgY291bnRlciBmdW5jdGlvbiAqLworCWwgfD0gMHgxOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9QTExfTU9ERSwgbCk7CisKKwl3aGlsZSAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfRElWKSAmICgxIDw8IDcpKSkKKwkJbXNsZWVwKDEpOworCisJYmxpenphcmRfcmVzdGFydF9zZHJhbSgpOworCisJYmxpenphcmRfcmVzdG9yZV9nZW5fcmVncygpOworCisJLyogRW5hYmxlIGRpc3BsYXkgKi8KKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfRElTUExBWV9NT0RFLCAweDAxKTsKKworCS8qIHRoZSBmb2xsb3dpbmcgd2lsbCBlbmFibGUgY2xvY2tzIGFzIG5lY2Vzc2FyeSAqLworCWJsaXp6YXJkX3NldF91cGRhdGVfbW9kZShibGl6emFyZC51cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZCk7CisKKwkvKiBGb3JjZSBhIGJhY2tncm91bmQgdXBkYXRlICovCisJYmxpenphcmQuem9vbV9vbiA9IDE7CisJdXBkYXRlX2Z1bGxfc2NyZWVuKCk7CisJYmxpenphcmRfc3luYygpOworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCQkgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHIgPSAwLCBpOworCXU4IHJldiwgY29uZjsKKwl1bnNpZ25lZCBsb25nIGV4dF9jbGs7CisJaW50IGV4dGlmX2RpdjsKKwl1bnNpZ25lZCBsb25nIHN5c19jbGssIHBpeF9jbGs7CisJc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpvbWFwZmJfY29uZjsKKwlzdHJ1Y3QgYmxpenphcmRfcGxhdGZvcm1fZGF0YSAqY3RybF9jb25mOworCisJYmxpenphcmQuZmJkZXYgPSBmYmRldjsKKworCUJVR19PTighZmJkZXYtPmV4dF9pZiB8fCAhZmJkZXYtPmludF9jdHJsKTsKKworCWJsaXp6YXJkLmZiZGV2ID0gZmJkZXY7CisJYmxpenphcmQuZXh0aWYgPSBmYmRldi0+ZXh0X2lmOworCWJsaXp6YXJkLmludF9jdHJsID0gZmJkZXYtPmludF9jdHJsOworCisJb21hcGZiX2NvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWN0cmxfY29uZiA9IG9tYXBmYl9jb25mLT5jdHJsX3BsYXRmb3JtX2RhdGE7CisJaWYgKGN0cmxfY29uZiA9PSBOVUxMIHx8IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUgPT0gTlVMTCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJzMWQxMzc0eDogbWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlibGl6emFyZC5wb3dlcl9kb3duID0gY3RybF9jb25mLT5wb3dlcl9kb3duOworCWJsaXp6YXJkLnBvd2VyX3VwID0gY3RybF9jb25mLT5wb3dlcl91cDsKKworCXNwaW5fbG9ja19pbml0KCZibGl6emFyZC5yZXFfbG9jayk7CisKKwlpZiAoKHIgPSBibGl6emFyZC5pbnRfY3RybC0+aW5pdChmYmRldiwgMSwgcmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmICgociA9IGJsaXp6YXJkLmV4dGlmLT5pbml0KGZiZGV2KSkgPCAwKQorCQlnb3RvIGVycjI7CisKKwlibGl6emFyZF9jdHJsLnNldF9jb2xvcl9rZXkgPSBibGl6emFyZC5pbnRfY3RybC0+c2V0X2NvbG9yX2tleTsKKwlibGl6emFyZF9jdHJsLmdldF9jb2xvcl9rZXkgPSBibGl6emFyZC5pbnRfY3RybC0+Z2V0X2NvbG9yX2tleTsKKwlibGl6emFyZF9jdHJsLnNldHVwX21lbSA9IGJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9tZW07CisJYmxpenphcmRfY3RybC5tbWFwID0gYmxpenphcmQuaW50X2N0cmwtPm1tYXA7CisKKwlleHRfY2xrID0gY3RybF9jb25mLT5nZXRfY2xvY2tfcmF0ZShmYmRldi0+ZGV2KTsKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3MoZXh0X2NsaywgJmV4dGlmX2RpdikpIDwgMCkKKwkJZ290byBlcnIzOworCisJc2V0X2V4dGlmX3RpbWluZ3MoJmJsaXp6YXJkLnJlZ190aW1pbmdzKTsKKworCWlmIChibGl6emFyZC5wb3dlcl91cCAhPSBOVUxMKQorCQlibGl6emFyZC5wb3dlcl91cChmYmRldi0+ZGV2KTsKKworCWNhbGNfYmxpenphcmRfY2xrX3JhdGVzKGV4dF9jbGssICZzeXNfY2xrLCAmcGl4X2Nsayk7CisKKwlpZiAoKHIgPSBjYWxjX2V4dGlmX3RpbWluZ3Moc3lzX2NsaywgJmV4dGlmX2RpdikpIDwgMCkKKwkJZ290byBlcnIzOworCXNldF9leHRpZl90aW1pbmdzKCZibGl6emFyZC5yZWdfdGltaW5ncyk7CisKKwlpZiAoIShibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExfRElWKSAmIDB4ODApKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCSJjb250cm9sbGVyIG5vdCBpbml0aWFsaXplZCBieSB0aGUgYm9vdGxvYWRlclxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGVycjM7CisJfQorCisJaWYgKGN0cmxfY29uZi0+dGVfY29ubmVjdGVkKSB7CisJCWlmICgociA9IHNldHVwX3RlYXJzeW5jKHBpeF9jbGssIGV4dGlmX2RpdikpIDwgMCkKKwkJCWdvdG8gZXJyMzsKKwkJYmxpenphcmQudGVfY29ubmVjdGVkID0gMTsKKwl9CisKKwlyZXYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9SRVZfQ09ERSk7CisJY29uZiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0NPTkZJRyk7CisKKwlzd2l0Y2ggKHJldiAmIDB4ZmMpIHsKKwljYXNlIDB4OWM6CisJCWJsaXp6YXJkLnZlcnNpb24gPSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ0OworCQlwcl9pbmZvKCJvbWFwZmI6IHMxZDEzNzQ0IExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCQlicmVhazsKKwljYXNlIDB4YTQ6CisJCWJsaXp6YXJkLnZlcnNpb24gPSBCTElaWkFSRF9WRVJTSU9OX1MxRDEzNzQ1OworCQlwcl9pbmZvKCJvbWFwZmI6IHMxZDEzNzQ1IExDRCBjb250cm9sbGVyIHJldiAlZCAiCisJCQkiaW5pdGlhbGl6ZWQgKENORiBwaW5zICV4KVxuIiwgcmV2ICYgMHgwMywgY29uZiAmIDB4MDcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJpbnZhbGlkIHMxZDEzNzR4IHJldmlzaW9uICUwMnhcbiIsCisJCQlyZXYpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIzOworCX0KKworCWJsaXp6YXJkLm1heF90cmFuc21pdF9zaXplID0gYmxpenphcmQuZXh0aWYtPm1heF90cmFuc21pdF9zaXplOworCisJYmxpenphcmQudXBkYXRlX21vZGUgPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOworCisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LnggPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy55ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cud2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfeCA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF94ID0gMDsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cub3V0X2hlaWdodCA9IGZiZGV2LT5wYW5lbC0+eV9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93LmZvcm1hdCA9IDA7CisKKwlibGl6emFyZC5zY3JlZW5fd2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzOworCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCisJaW5pdF90aW1lcigmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIpOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyLmZ1bmN0aW9uID0gYmxpenphcmRfdXBkYXRlX3dpbmRvd19hdXRvOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyLmRhdGEgPSAwOworCisJSU5JVF9MSVNUX0hFQUQoJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShibGl6emFyZC5yZXFfcG9vbCk7IGkrKykKKwkJbGlzdF9hZGQoJmJsaXp6YXJkLnJlcV9wb29sW2ldLmVudHJ5LCAmYmxpenphcmQuZnJlZV9yZXFfbGlzdCk7CisJQlVHX09OKGkgPD0gSVJRX1JFUV9QT09MX1NJWkUpOworCXNlbWFfaW5pdCgmYmxpenphcmQucmVxX3NlbWEsIGkgLSBJUlFfUkVRX1BPT0xfU0laRSk7CisKKwlyZXR1cm4gMDsKK2VycjM6CisJaWYgKGJsaXp6YXJkLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfZG93bihmYmRldi0+ZGV2KTsKKwlibGl6emFyZC5leHRpZi0+Y2xlYW51cCgpOworZXJyMjoKKwlibGl6emFyZC5pbnRfY3RybC0+Y2xlYW51cCgpOworZXJyMToKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfY2xlYW51cCh2b2lkKQoreworCWJsaXp6YXJkX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwlibGl6emFyZC5leHRpZi0+Y2xlYW51cCgpOworCWJsaXp6YXJkLmludF9jdHJsLT5jbGVhbnVwKCk7CisJaWYgKGJsaXp6YXJkLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfZG93bihibGl6emFyZC5mYmRldi0+ZGV2KTsKK30KKworc3RydWN0IGxjZF9jdHJsIGJsaXp6YXJkX2N0cmwgPSB7CisJLm5hbWUJCQk9ICJibGl6emFyZCIsCisJLmluaXQJCQk9IGJsaXp6YXJkX2luaXQsCisJLmNsZWFudXAJCT0gYmxpenphcmRfY2xlYW51cCwKKwkuYmluZF9jbGllbnQJCT0gYmxpenphcmRfYmluZF9jbGllbnQsCisJLmdldF9jYXBzCQk9IGJsaXp6YXJkX2dldF9jYXBzLAorCS5zZXRfdXBkYXRlX21vZGUJPSBibGl6emFyZF9zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IGJsaXp6YXJkX2dldF91cGRhdGVfbW9kZSwKKwkuc2V0dXBfcGxhbmUJCT0gYmxpenphcmRfc2V0dXBfcGxhbmUsCisJLnNldF9zY2FsZQkJPSBibGl6emFyZF9zZXRfc2NhbGUsCisJLmVuYWJsZV9wbGFuZQkJPSBibGl6emFyZF9lbmFibGVfcGxhbmUsCisJLnVwZGF0ZV93aW5kb3cJCT0gYmxpenphcmRfdXBkYXRlX3dpbmRvd19hc3luYywKKwkuc3luYwkJCT0gYmxpenphcmRfc3luYywKKwkuc3VzcGVuZAkJPSBibGl6emFyZF9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGJsaXp6YXJkX3Jlc3VtZSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjMjM0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5jCkBAIC0wLDAgKzEsMTUwMiBAQAorLyoKKyAqIE9NQVAyIGRpc3BsYXkgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9zcmFtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKworI2luY2x1ZGUgImRpc3BjLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUJCQkiZGlzcGMiCisKKyNkZWZpbmUgRFNTX0JBU0UJCQkweDQ4MDUwMDAwCisjZGVmaW5lIERTU19TWVNDT05GSUcJCQkweDAwMTAKKworI2RlZmluZSBESVNQQ19CQVNFCQkJMHg0ODA1MDQwMAorCisvKiBESVNQQyBjb21tb24gKi8KKyNkZWZpbmUgRElTUENfUkVWSVNJT04JCQkweDAwMDAKKyNkZWZpbmUgRElTUENfU1lTQ09ORklHCQkJMHgwMDEwCisjZGVmaW5lIERJU1BDX1NZU1NUQVRVUwkJCTB4MDAxNAorI2RlZmluZSBESVNQQ19JUlFTVEFUVVMJCQkweDAwMTgKKyNkZWZpbmUgRElTUENfSVJRRU5BQkxFCQkJMHgwMDFDCisjZGVmaW5lIERJU1BDX0NPTlRST0wJCQkweDAwNDAKKyNkZWZpbmUgRElTUENfQ09ORklHCQkJMHgwMDQ0CisjZGVmaW5lIERJU1BDX0NBUEFCTEUJCQkweDAwNDgKKyNkZWZpbmUgRElTUENfREVGQVVMVF9DT0xPUjAJCTB4MDA0QworI2RlZmluZSBESVNQQ19ERUZBVUxUX0NPTE9SMQkJMHgwMDUwCisjZGVmaW5lIERJU1BDX1RSQU5TX0NPTE9SMAkJMHgwMDU0CisjZGVmaW5lIERJU1BDX1RSQU5TX0NPTE9SMQkJMHgwMDU4CisjZGVmaW5lIERJU1BDX0xJTkVfU1RBVFVTCQkweDAwNUMKKyNkZWZpbmUgRElTUENfTElORV9OVU1CRVIJCTB4MDA2MAorI2RlZmluZSBESVNQQ19USU1JTkdfSAkJCTB4MDA2NAorI2RlZmluZSBESVNQQ19USU1JTkdfVgkJCTB4MDA2OAorI2RlZmluZSBESVNQQ19QT0xfRlJFUQkJCTB4MDA2QworI2RlZmluZSBESVNQQ19ESVZJU09SCQkJMHgwMDcwCisjZGVmaW5lIERJU1BDX1NJWkVfRElHCQkJMHgwMDc4CisjZGVmaW5lIERJU1BDX1NJWkVfTENECQkJMHgwMDdDCisKKyNkZWZpbmUgRElTUENfREFUQV9DWUNMRTEJCTB4MDFENAorI2RlZmluZSBESVNQQ19EQVRBX0NZQ0xFMgkJMHgwMUQ4CisjZGVmaW5lIERJU1BDX0RBVEFfQ1lDTEUzCQkweDAxREMKKworLyogRElTUEMgR0ZYIHBsYW5lICovCisjZGVmaW5lIERJU1BDX0dGWF9CQTAJCQkweDAwODAKKyNkZWZpbmUgRElTUENfR0ZYX0JBMQkJCTB4MDA4NAorI2RlZmluZSBESVNQQ19HRlhfUE9TSVRJT04JCTB4MDA4OAorI2RlZmluZSBESVNQQ19HRlhfU0laRQkJCTB4MDA4QworI2RlZmluZSBESVNQQ19HRlhfQVRUUklCVVRFUwkJMHgwMEEwCisjZGVmaW5lIERJU1BDX0dGWF9GSUZPX1RIUkVTSE9MRAkweDAwQTQKKyNkZWZpbmUgRElTUENfR0ZYX0ZJRk9fU0laRV9TVEFUVVMJMHgwMEE4CisjZGVmaW5lIERJU1BDX0dGWF9ST1dfSU5DCQkweDAwQUMKKyNkZWZpbmUgRElTUENfR0ZYX1BJWEVMX0lOQwkJMHgwMEIwCisjZGVmaW5lIERJU1BDX0dGWF9XSU5ET1dfU0tJUAkJMHgwMEI0CisjZGVmaW5lIERJU1BDX0dGWF9UQUJMRV9CQQkJMHgwMEI4CisKKy8qIERJU1BDIFZpZGVvIHBsYW5lIDEvMiAqLworI2RlZmluZSBESVNQQ19WSUQxX0JBU0UJCQkweDAwQkMKKyNkZWZpbmUgRElTUENfVklEMl9CQVNFCQkJMHgwMTRDCisKKy8qIE9mZnNldHMgaW50byBESVNQQ19WSUQxLzJfQkFTRSAqLworI2RlZmluZSBESVNQQ19WSURfQkEwCQkJMHgwMDAwCisjZGVmaW5lIERJU1BDX1ZJRF9CQTEJCQkweDAwMDQKKyNkZWZpbmUgRElTUENfVklEX1BPU0lUSU9OCQkweDAwMDgKKyNkZWZpbmUgRElTUENfVklEX1NJWkUJCQkweDAwMEMKKyNkZWZpbmUgRElTUENfVklEX0FUVFJJQlVURVMJCTB4MDAxMAorI2RlZmluZSBESVNQQ19WSURfRklGT19USFJFU0hPTEQJMHgwMDE0CisjZGVmaW5lIERJU1BDX1ZJRF9GSUZPX1NJWkVfU1RBVFVTCTB4MDAxOAorI2RlZmluZSBESVNQQ19WSURfUk9XX0lOQwkJMHgwMDFDCisjZGVmaW5lIERJU1BDX1ZJRF9QSVhFTF9JTkMJCTB4MDAyMAorI2RlZmluZSBESVNQQ19WSURfRklSCQkJMHgwMDI0CisjZGVmaW5lIERJU1BDX1ZJRF9QSUNUVVJFX1NJWkUJCTB4MDAyOAorI2RlZmluZSBESVNQQ19WSURfQUNDVTAJCQkweDAwMkMKKyNkZWZpbmUgRElTUENfVklEX0FDQ1UxCQkJMHgwMDMwCisKKy8qIDggZWxlbWVudHMgaW4gOCBieXRlIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgRElTUENfVklEX0ZJUl9DT0VGX0gwCQkweDAwMzQKKy8qIDggZWxlbWVudHMgaW4gOCBieXRlIGluY3JlbWVudHMgKi8KKyNkZWZpbmUgRElTUENfVklEX0ZJUl9DT0VGX0hWMAkJMHgwMDM4CisvKiA1IGVsZW1lbnRzIGluIDQgYnl0ZSBpbmNyZW1lbnRzICovCisjZGVmaW5lIERJU1BDX1ZJRF9DT05WX0NPRUYwCQkweDAwNzQKKworI2RlZmluZSBESVNQQ19JUlFfRlJBTUVNQVNLCQkweDAwMDEKKyNkZWZpbmUgRElTUENfSVJRX1ZTWU5DCQkJMHgwMDAyCisjZGVmaW5lIERJU1BDX0lSUV9FVlNZTkNfRVZFTgkJMHgwMDA0CisjZGVmaW5lIERJU1BDX0lSUV9FVlNZTkNfT0RECQkweDAwMDgKKyNkZWZpbmUgRElTUENfSVJRX0FDQklBU19DT1VOVF9TVEFUCTB4MDAxMAorI2RlZmluZSBESVNQQ19JUlFfUFJPR19MSU5FX05VTQkJMHgwMDIwCisjZGVmaW5lIERJU1BDX0lSUV9HRlhfRklGT19VTkRFUkZMT1cJMHgwMDQwCisjZGVmaW5lIERJU1BDX0lSUV9HRlhfRU5EX1dJTgkJMHgwMDgwCisjZGVmaW5lIERJU1BDX0lSUV9QQUxfR0FNTUFfTUFTSwkweDAxMDAKKyNkZWZpbmUgRElTUENfSVJRX09DUF9FUlIJCTB4MDIwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMV9GSUZPX1VOREVSRkxPVwkweDA0MDAKKyNkZWZpbmUgRElTUENfSVJRX1ZJRDFfRU5EX1dJTgkJMHgwODAwCisjZGVmaW5lIERJU1BDX0lSUV9WSUQyX0ZJRk9fVU5ERVJGTE9XCTB4MTAwMAorI2RlZmluZSBESVNQQ19JUlFfVklEMl9FTkRfV0lOCQkweDIwMDAKKyNkZWZpbmUgRElTUENfSVJRX1NZTkNfTE9TVAkJMHg0MDAwCisKKyNkZWZpbmUgRElTUENfSVJRX01BU0tfQUxMCQkweDdmZmYKKworI2RlZmluZSBESVNQQ19JUlFfTUFTS19FUlJPUgkJKERJU1BDX0lSUV9HRlhfRklGT19VTkRFUkZMT1cgfAlcCisJCQkJCSAgICAgRElTUENfSVJRX1ZJRDFfRklGT19VTkRFUkZMT1cgfCBcCisJCQkJCSAgICAgRElTUENfSVJRX1ZJRDJfRklGT19VTkRFUkZMT1cgfCBcCisJCQkJCSAgICAgRElTUENfSVJRX1NZTkNfTE9TVCkKKworI2RlZmluZSBSRkJJX0NPTlRST0wJCQkweDQ4MDUwMDQwCisKKyNkZWZpbmUgTUFYX1BBTEVUVEVfU0laRQkJKDI1NiAqIDE2KQorCisjZGVmaW5lIEZMRF9NQVNLKHBvcywgbGVuKQkoKCgxIDw8IGxlbikgLSAxKSA8PCBwb3MpCisKKyNkZWZpbmUgTU9EX1JFR19GTEQocmVnLCBtYXNrLCB2YWwpIFwKKwlkaXNwY193cml0ZV9yZWcoKHJlZyksIChkaXNwY19yZWFkX3JlZyhyZWcpICYgfihtYXNrKSkgfCAodmFsKSk7CisKKyNkZWZpbmUgT01BUDJfU1JBTV9TVEFSVAkJMHg0MDIwMDAwMAorLyogTWF4aW11bSBzaXplLCBpbiByZWFsaXR5IHRoaXMgaXMgc21hbGxlciBpZiBTUkFNIGlzIHBhcnRpYWxseSBsb2NrZWQuICovCisjZGVmaW5lIE9NQVAyX1NSQU1fU0laRQkJCTB4YTAwMDAJCS8qIDY0MGsgKi8KKworLyogV2Ugc3VwcG9ydCB0aGUgU0RSQU0gLyBTUkFNIHR5cGVzLiBTZWUgT01BUEZCX1BMQU5FX01FTVRZUEVfKiBpbiBvbWFwZmIuaCAqLworI2RlZmluZSBESVNQQ19NRU1UWVBFX05VTQkJMgorCisjZGVmaW5lIFJFU01BUF9TSVpFKF9wYWdlX2NudCkJCQkJCQlcCisJKChfcGFnZV9jbnQgKyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgLSAxKSAvIDgpCisjZGVmaW5lIFJFU01BUF9QVFIoX3Jlc19tYXAsIF9wYWdlX25yKQkJCQkJXAorCSgoKF9yZXNfbWFwKS0+bWFwKSArIChfcGFnZV9ucikgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkpCisjZGVmaW5lIFJFU01BUF9NQVNLKF9wYWdlX25yKQkJCQkJCVwKKwkoMSA8PCAoKF9wYWdlX25yKSAmIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4IC0gMSkpKQorCitzdHJ1Y3QgcmVzbWFwIHsKKwl1bnNpZ25lZCBsb25nCXN0YXJ0OworCXVuc2lnbmVkCXBhZ2VfY250OworCXVuc2lnbmVkIGxvbmcJKm1hcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCXUzMgkJYmFzZTsKKworCXN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MJbWVtX2Rlc2M7CisJc3RydWN0IHJlc21hcAkJKnJlc19tYXBbRElTUENfTUVNVFlQRV9OVU1dOworCWF0b21pY190CQltYXBfY291bnRbT01BUEZCX1BMQU5FX05VTV07CisKKwlkbWFfYWRkcl90CXBhbGV0dGVfcGFkZHI7CisJdm9pZAkJKnBhbGV0dGVfdmFkZHI7CisKKwlpbnQJCWV4dF9tb2RlOworCisJdW5zaWduZWQgbG9uZwllbmFibGVkX2lycXM7CisJdm9pZAkJKCppcnFfY2FsbGJhY2spKHZvaWQgKik7CisJdm9pZAkJKmlycV9jYWxsYmFja19kYXRhOworCXN0cnVjdCBjb21wbGV0aW9uCWZyYW1lX2RvbmU7CisKKwlpbnQJCWZpcl9oaW5jW09NQVBGQl9QTEFORV9OVU1dOworCWludAkJZmlyX3ZpbmNbT01BUEZCX1BMQU5FX05VTV07CisKKwlzdHJ1Y3QgY2xrCSpkc3NfaWNrLCAqZHNzMV9mY2s7CisJc3RydWN0IGNsawkqZHNzXzU0bV9mY2s7CisKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXY7CisKKwlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleQljb2xvcl9rZXk7Cit9IGRpc3BjOworCitzdGF0aWMgdm9pZCBlbmFibGVfbGNkX2Nsb2NrcyhpbnQgZW5hYmxlKTsKKworc3RhdGljIHZvaWQgaW5saW5lIGRpc3BjX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIGRpc3BjLmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgdTMyIGlubGluZSBkaXNwY19yZWFkX3JlZyhpbnQgaWR4KQoreworCXUzMiBsID0gX19yYXdfcmVhZGwoZGlzcGMuYmFzZSArIGlkeCk7CisJcmV0dXJuIGw7Cit9CisKKy8qIFNlbGVjdCBSRkJJIG9yIGJ5cGFzcyBtb2RlICovCitzdGF0aWMgdm9pZCBlbmFibGVfcmZiaV9tb2RlKGludCBlbmFibGUpCit7CisJdTMyIGw7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJLyogRW5hYmxlIFJGQkksIEdQSU8wLzEgKi8KKwlsICY9IH4oKDEgPDwgMTEpIHwgKDEgPDwgMTUpIHwgKDEgPDwgMTYpKTsKKwlsIHw9IGVuYWJsZSA/ICgxIDw8IDExKSA6IDA7CisJLyogUkZCSSBFbjogR1BJTzAvMT0xMCAgUkZCSSBEaXM6IEdQSU8wLzE9MTEgKi8KKwlsIHw9IDEgPDwgMTU7CisJbCB8PSBlbmFibGUgPyAwIDogKDEgPDwgMTYpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKKworCS8qIFNldCBieXBhc3MgbW9kZSBpbiBSRkJJIG1vZHVsZSAqLworCWwgPSBfX3Jhd19yZWFkbChpb19wMnYoUkZCSV9DT05UUk9MKSk7CisJbCB8PSBlbmFibGUgPyAwIDogKDEgPDwgMSk7CisJX19yYXdfd3JpdGVsKGwsIGlvX3AydihSRkJJX0NPTlRST0wpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xjZF9kYXRhX2xpbmVzKGludCBkYXRhX2xpbmVzKQoreworCXUzMiBsOworCWludCBjb2RlID0gMDsKKworCXN3aXRjaCAoZGF0YV9saW5lcykgeworCWNhc2UgMTI6CisJCWNvZGUgPSAwOworCQlicmVhazsKKwljYXNlIDE2OgorCQljb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxODoKKwkJY29kZSA9IDI7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCWNvZGUgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJbCAmPSB+KDB4MDMgPDwgOCk7CisJbCB8PSBjb2RlIDw8IDg7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NPTlRST0wsIGwpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbG9hZF9tb2RlKGludCBtb2RlKQoreworCUJVR19PTihtb2RlICYgfihESVNQQ19MT0FEX0NMVVRfT05MWSB8IERJU1BDX0xPQURfRlJBTUVfT05MWSB8CisJCQlESVNQQ19MT0FEX0NMVVRfT05DRV9GUkFNRSkpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTkZJRywgMHgwMyA8PCAxLCBtb2RlIDw8IDEpOworfQorCit2b2lkIG9tYXBfZGlzcGNfc2V0X2xjZF9zaXplKGludCB4LCBpbnQgeSkKK3sKKwlCVUdfT04oKHggPiAoMSA8PCAxMSkpIHx8ICh5ID4gKDEgPDwgMTEpKSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfU0laRV9MQ0QsIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksCisJCQkoKHkgLSAxKSA8PCAxNikgfCAoeCAtIDEpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19zZXRfbGNkX3NpemUpOworCit2b2lkIG9tYXBfZGlzcGNfc2V0X2RpZ2l0X3NpemUoaW50IHgsIGludCB5KQoreworCUJVR19PTigoeCA+ICgxIDw8IDExKSkgfHwgKHkgPiAoMSA8PCAxMSkpKTsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19TSVpFX0RJRywgRkxEX01BU0soMTYsIDExKSB8IEZMRF9NQVNLKDAsIDExKSwKKwkJCSgoeSAtIDEpIDw8IDE2KSB8ICh4IC0gMSkpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworfQorRVhQT1JUX1NZTUJPTChvbWFwX2Rpc3BjX3NldF9kaWdpdF9zaXplKTsKKworc3RhdGljIHZvaWQgc2V0dXBfcGxhbmVfZmlmbyhpbnQgcGxhbmUsIGludCBleHRfbW9kZSkKK3sKKwljb25zdCB1MzIgZnRyc19yZWdbXSA9IHsgRElTUENfR0ZYX0ZJRk9fVEhSRVNIT0xELAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSUZPX1RIUkVTSE9MRCwKKwkJCSAgICAgICAgRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJRk9fVEhSRVNIT0xEIH07CisJY29uc3QgdTMyIGZzel9yZWdbXSA9IHsgRElTUENfR0ZYX0ZJRk9fU0laRV9TVEFUVVMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0ZJRk9fU0laRV9TVEFUVVMsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJRk9fU0laRV9TVEFUVVMgfTsKKwlpbnQgbG93LCBoaWdoOworCXUzMiBsOworCisJQlVHX09OKHBsYW5lID4gMik7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoZnN6X3JlZ1twbGFuZV0pOworCWwgJj0gRkxEX01BU0soMCwgOSk7CisJaWYgKGV4dF9tb2RlKSB7CisJCWxvdyA9IGwgKiAzIC8gNDsKKwkJaGlnaCA9IGw7CisJfSBlbHNlIHsKKwkJbG93ID0gbCAvIDQ7CisJCWhpZ2ggPSBsICogMyAvIDQ7CisJfQorCU1PRF9SRUdfRkxEKGZ0cnNfcmVnW3BsYW5lXSwgRkxEX01BU0soMTYsIDkpIHwgRkxEX01BU0soMCwgOSksCisJCQkoaGlnaCA8PCAxNikgfCBsb3cpOworfQorCit2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoaW50IGVuYWJsZSkKK3sKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05UUk9MLCAxLCBlbmFibGUgPyAxIDogMCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQpOworCit2b2lkIG9tYXBfZGlzcGNfZW5hYmxlX2RpZ2l0X291dChpbnQgZW5hYmxlKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCU1PRF9SRUdfRkxEKERJU1BDX0NPTlRST0wsIDEgPDwgMSwgZW5hYmxlID8gMSA8PCAxIDogMCk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZW5hYmxlX2RpZ2l0X291dCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHUzMiBwYWRkciwgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwljb25zdCB1MzIgYXRfcmVnW10gPSB7IERJU1BDX0dGWF9BVFRSSUJVVEVTLAorCQkJCURJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTLAorCQkJICAgICAgICBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQVRUUklCVVRFUyB9OworCWNvbnN0IHUzMiBiYV9yZWdbXSA9IHsgRElTUENfR0ZYX0JBMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0JBMCwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQkEwIH07CisJY29uc3QgdTMyIHBzX3JlZ1tdID0geyBESVNQQ19HRlhfUE9TSVRJT04sCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1BPU0lUSU9OLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9QT1NJVElPTiB9OworCWNvbnN0IHUzMiBzel9yZWdbXSA9IHsgRElTUENfR0ZYX1NJWkUsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX1BJQ1RVUkVfU0laRSwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfUElDVFVSRV9TSVpFIH07CisJY29uc3QgdTMyIHJpX3JlZ1tdID0geyBESVNQQ19HRlhfUk9XX0lOQywKKwkJCQlESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfUk9XX0lOQywKKwkJCSAgICAgICAgRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX1JPV19JTkMgfTsKKwljb25zdCB1MzIgdnNfcmVnW10gPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9TSVpFLAorCQkJCURJU1BDX1ZJRDJfQkFTRSArIERJU1BDX1ZJRF9TSVpFIH07CisKKwlpbnQgY2hvdXRfc2hpZnQsIGJ1cnN0X3NoaWZ0OworCWludCBjaG91dF92YWw7CisJaW50IGNvbG9yX2NvZGU7CisJaW50IGJwcDsKKwlpbnQgY2NvbnZfZW47CisJaW50IHNldF92c2l6ZTsKKwl1MzIgbDsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJwbGFuZSAlZCBjaGFubmVsICVkIHBhZGRyICUjMDh4IHNjcl93aWR0aCAlZCIKKwkJICAgICIgcG9zX3ggJWQgcG9zX3kgJWQgd2lkdGggJWQgaGVpZ2h0ICVkIGNvbG9yX21vZGUgJWRcbiIsCisJCSAgICBwbGFuZSwgY2hhbm5lbF9vdXQsIHBhZGRyLCBzY3JlZW5fd2lkdGgsIHBvc194LCBwb3NfeSwKKwkJICAgIHdpZHRoLCBoZWlnaHQsIGNvbG9yX21vZGUpOworI2VuZGlmCisKKwlzZXRfdnNpemUgPSAwOworCXN3aXRjaCAocGxhbmUpIHsKKwljYXNlIE9NQVBGQl9QTEFORV9HRlg6CisJCWJ1cnN0X3NoaWZ0ID0gNjsKKwkJY2hvdXRfc2hpZnQgPSA4OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9QTEFORV9WSUQxOgorCWNhc2UgT01BUEZCX1BMQU5FX1ZJRDI6CisJCWJ1cnN0X3NoaWZ0ID0gMTQ7CisJCWNob3V0X3NoaWZ0ID0gMTY7CisJCXNldF92c2l6ZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoY2hhbm5lbF9vdXQpIHsKKwljYXNlIE9NQVBGQl9DSEFOTkVMX09VVF9MQ0Q6CisJCWNob3V0X3ZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0RJR0lUOgorCQljaG91dF92YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljY29udl9lbiA9IDA7CisJc3dpdGNoIChjb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQljb2xvcl9jb2RlID0gRElTUENfUkdCXzE2X0JQUDsKKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJaWYgKHBsYW5lID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY29sb3JfY29kZSA9IERJU1BDX1VZVllfNDIyOworCQljY29udl9lbiA9IDE7CisJCWJwcCA9IDE2OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCWlmIChwbGFuZSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNvbG9yX2NvZGUgPSBESVNQQ19ZVVYyXzQyMjsKKwkJY2NvbnZfZW4gPSAxOworCQlicHAgPSAxNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbCA9IGRpc3BjX3JlYWRfcmVnKGF0X3JlZ1twbGFuZV0pOworCisJbCAmPSB+KDB4MGYgPDwgMSk7CisJbCB8PSBjb2xvcl9jb2RlIDw8IDE7CisJbCAmPSB+KDEgPDwgOSk7CisJbCB8PSBjY29udl9lbiA8PCA5OworCisJbCAmPSB+KDB4MDMgPDwgYnVyc3Rfc2hpZnQpOworCWwgfD0gRElTUENfQlVSU1RfOHgzMiA8PCBidXJzdF9zaGlmdDsKKworCWwgJj0gfigxIDw8IGNob3V0X3NoaWZ0KTsKKwlsIHw9IGNob3V0X3ZhbCA8PCBjaG91dF9zaGlmdDsKKworCWRpc3BjX3dyaXRlX3JlZyhhdF9yZWdbcGxhbmVdLCBsKTsKKworCWRpc3BjX3dyaXRlX3JlZyhiYV9yZWdbcGxhbmVdLCBwYWRkcik7CisJTU9EX1JFR19GTEQocHNfcmVnW3BsYW5lXSwKKwkJICAgIEZMRF9NQVNLKDE2LCAxMSkgfCBGTERfTUFTSygwLCAxMSksIChwb3NfeSA8PCAxNikgfCBwb3NfeCk7CisKKwlNT0RfUkVHX0ZMRChzel9yZWdbcGxhbmVdLCBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkJKChoZWlnaHQgLSAxKSA8PCAxNikgfCAod2lkdGggLSAxKSk7CisKKwlpZiAoc2V0X3ZzaXplKSB7CisJCS8qIFNldCB2aWRlbyBzaXplIGlmIHNldF9zY2FsZSBoYXNuJ3Qgc2V0IGl0ICovCisJCWlmICghZGlzcGMuZmlyX3ZpbmNbcGxhbmVdKQorCQkJTU9EX1JFR19GTEQodnNfcmVnW3BsYW5lXSwKKwkJCQlGTERfTUFTSygxNiwgMTEpLCAoaGVpZ2h0IC0gMSkgPDwgMTYpOworCQlpZiAoIWRpc3BjLmZpcl9oaW5jW3BsYW5lXSkKKwkJCU1PRF9SRUdfRkxEKHZzX3JlZ1twbGFuZV0sCisJCQkJRkxEX01BU0soMCwgMTEpLCB3aWR0aCAtIDEpOworCX0KKworCWRpc3BjX3dyaXRlX3JlZyhyaV9yZWdbcGxhbmVdLCAoc2NyZWVuX3dpZHRoIC0gd2lkdGgpICogYnBwIC8gOCArIDEpOworCisJcmV0dXJuIGhlaWdodCAqIHNjcmVlbl93aWR0aCAqIGJwcCAvIDg7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgaW50IHNjcmVlbl93aWR0aCwKKwkJCQkgIGludCBwb3NfeCwgaW50IHBvc195LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJICBpbnQgY29sb3JfbW9kZSkKK3sKKwl1MzIgcGFkZHI7CisJaW50IHI7CisKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGFkZHIgPSBkaXNwYy5tZW1fZGVzYy5yZWdpb25bcGxhbmVdLnBhZGRyICsgb2Zmc2V0OworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCXIgPSBfc2V0dXBfcGxhbmUocGxhbmUsIGNoYW5uZWxfb3V0LCBwYWRkciwKKwkJCXNjcmVlbl93aWR0aCwKKwkJCXBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwgY29sb3JfbW9kZSk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2ZpcmhfcmVnKGludCBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQoreworCXUzMiBiYXNlOworCisJaWYgKHBsYW5lID09IDEpCisJCWJhc2UgPSBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfRklSX0NPRUZfSDA7CisJZWxzZQorCQliYXNlID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0gwOworCWRpc3BjX3dyaXRlX3JlZyhiYXNlICsgcmVnICogOCwJdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9maXJodl9yZWcoaW50IHBsYW5lLCBpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJdTMyIGJhc2U7CisKKwlpZiAocGxhbmUgPT0gMSkKKwkJYmFzZSA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSVJfQ09FRl9IVjA7CisJZWxzZQorCQliYXNlID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJUl9DT0VGX0hWMDsKKwlkaXNwY193cml0ZV9yZWcoYmFzZSArIHJlZyAqIDgsCXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3Vwc2FtcGxpbmdfY29lZl90YWJsZShpbnQgcGxhbmUpCit7CisJY29uc3QgdTMyIGNvZWZbXVsyXSA9IHsKKwkJeyAweDAwODAwMDAwLCAweDAwODAwMDAwIH0sCisJCXsgMHgwRDdDRjgwMCwgMHgwMzdCMDJGRiB9LAorCQl7IDB4MUU3MEY1RkYsIDB4MEM2RjA1RkUgfSwKKwkJeyAweDMzNUZGNUZFLCAweDIwNTkwN0ZCIH0sCisJCXsgMHhGNzQ5NDlGNywgMHgwMDQwNDAwMCB9LAorCQl7IDB4RjU1RjMzRkIsIDB4MDc1OTIwRkUgfSwKKwkJeyAweEY1NzAxRUZFLCAweDA1NkYwQ0ZGIH0sCisJCXsgMHhGODdDMERGRiwgMHgwMjdCMDMwMCB9LAorCX07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXdyaXRlX2ZpcmhfcmVnKHBsYW5lLCBpLCBjb2VmW2ldWzBdKTsKKwkJd3JpdGVfZmlyaHZfcmVnKHBsYW5lLCBpLCBjb2VmW2ldWzFdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXRfc2NhbGUoaW50IHBsYW5lLAorCQkJCWludCBvcmlnX3dpZHRoLCBpbnQgb3JpZ19oZWlnaHQsCisJCQkJaW50IG91dF93aWR0aCwgaW50IG91dF9oZWlnaHQpCit7CisJY29uc3QgdTMyIGF0X3JlZ1tdICA9IHsgMCwgRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMgfTsKKwljb25zdCB1MzIgdnNfcmVnW10gID0geyAwLCBESVNQQ19WSUQxX0JBU0UgKyBESVNQQ19WSURfU0laRSwKKwkJCQlESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfU0laRSB9OworCWNvbnN0IHUzMiBmaXJfcmVnW10gPSB7IDAsIERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9GSVIsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0ZJUiB9OworCisJdTMyIGw7CisJaW50IGZpcl9oaW5jOworCWludCBmaXJfdmluYzsKKworCWlmICgodW5zaWduZWQpcGxhbmUgPiBPTUFQRkJfUExBTkVfTlVNKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwbGFuZSA9PSBPTUFQRkJfUExBTkVfR0ZYICYmCisJICAgIChvdXRfd2lkdGggIT0gb3JpZ193aWR0aCB8fCBvdXRfaGVpZ2h0ICE9IG9yaWdfaGVpZ2h0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKwlpZiAob3JpZ193aWR0aCA8IG91dF93aWR0aCkgeworCQkvKgorCQkgKiBVcHNhbXBsaW5nLgorCQkgKiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNjYWxlIGJvdGggZGltZW5zaW9ucyBpbiBvbmUgd2F5LgorCQkgKi8KKwkJaWYgKG9yaWdfaGVpZ2h0ID4gb3V0X2hlaWdodCB8fAorCQkgICAgb3JpZ193aWR0aCAqIDggPCBvdXRfd2lkdGggfHwKKwkJICAgIG9yaWdfaGVpZ2h0ICogOCA8IG91dF9oZWlnaHQpIHsKKwkJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc2V0X3Vwc2FtcGxpbmdfY29lZl90YWJsZShwbGFuZSk7CisJfSBlbHNlIGlmIChvcmlnX3dpZHRoID4gb3V0X3dpZHRoKSB7CisJCS8qIERvd25zYW1wbGluZyBub3QgeWV0IHN1cHBvcnRlZAorCQkqLworCisJCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFvcmlnX3dpZHRoIHx8IG9yaWdfd2lkdGggPT0gb3V0X3dpZHRoKQorCQlmaXJfaGluYyA9IDA7CisJZWxzZQorCQlmaXJfaGluYyA9IDEwMjQgKiBvcmlnX3dpZHRoIC8gb3V0X3dpZHRoOworCWlmICghb3JpZ19oZWlnaHQgfHwgb3JpZ19oZWlnaHQgPT0gb3V0X2hlaWdodCkKKwkJZmlyX3ZpbmMgPSAwOworCWVsc2UKKwkJZmlyX3ZpbmMgPSAxMDI0ICogb3JpZ19oZWlnaHQgLyBvdXRfaGVpZ2h0OworCWRpc3BjLmZpcl9oaW5jW3BsYW5lXSA9IGZpcl9oaW5jOworCWRpc3BjLmZpcl92aW5jW3BsYW5lXSA9IGZpcl92aW5jOworCisJTU9EX1JFR19GTEQoZmlyX3JlZ1twbGFuZV0sCisJCSAgICBGTERfTUFTSygxNiwgMTIpIHwgRkxEX01BU0soMCwgMTIpLAorCQkgICAgKChmaXJfdmluYyAmIDQwOTUpIDw8IDE2KSB8CisJCSAgICAoZmlyX2hpbmMgJiA0MDk1KSk7CisKKwlkZXZfZGJnKGRpc3BjLmZiZGV2LT5kZXYsICJvdXRfd2lkdGggJWQgb3V0X2hlaWdodCAlZCBvcmlnX3dpZHRoICVkICIKKwkJIm9yaWdfaGVpZ2h0ICVkIGZpcl9oaW5jICAlZCBmaXJfdmluYyAlZFxuIiwKKwkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodCwKKwkJZmlyX2hpbmMsIGZpcl92aW5jKTsKKworCU1PRF9SRUdfRkxEKHZzX3JlZ1twbGFuZV0sCisJCSAgICBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpLAorCQkgICAgKChvdXRfaGVpZ2h0IC0gMSkgPDwgMTYpIHwgKG91dF93aWR0aCAtIDEpKTsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhhdF9yZWdbcGxhbmVdKTsKKwlsICY9IH4oMHgwMyA8PCA1KTsKKwlsIHw9IGZpcl9oaW5jID8gKDEgPDwgNSkgOiAwOworCWwgfD0gZmlyX3ZpbmMgPyAoMSA8PCA2KSA6IDA7CisJZGlzcGNfd3JpdGVfcmVnKGF0X3JlZ1twbGFuZV0sIGwpOworCisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWNvbnN0IHUzMiBhdF9yZWdbXSA9IHsgRElTUENfR0ZYX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMsCisJCQkJRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVMgfTsKKwlpZiAoKHVuc2lnbmVkIGludClwbGFuZSA+IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoYXRfcmVnW3BsYW5lXSwgMSwgZW5hYmxlID8gMSA6IDApOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9kaXNwY19zZXRfY29sb3Jfa2V5KHN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwl1MzIgZGZfcmVnLCB0cl9yZWc7CisJaW50IHNoaWZ0LCB2YWw7CisKKwlzd2l0Y2ggKGNrLT5jaGFubmVsX291dCkgeworCWNhc2UgT01BUEZCX0NIQU5ORUxfT1VUX0xDRDoKKwkJZGZfcmVnID0gRElTUENfREVGQVVMVF9DT0xPUjA7CisJCXRyX3JlZyA9IERJU1BDX1RSQU5TX0NPTE9SMDsKKwkJc2hpZnQgPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ0hBTk5FTF9PVVRfRElHSVQ6CisJCWRmX3JlZyA9IERJU1BDX0RFRkFVTFRfQ09MT1IxOworCQl0cl9yZWcgPSBESVNQQ19UUkFOU19DT0xPUjE7CisJCXNoaWZ0ID0gMTI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzd2l0Y2ggKGNrLT5rZXlfdHlwZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9ESVNBQkxFRDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfS0VZX0dGWF9EU1Q6CisJCXZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX0tFWV9WSURfU1JDOgorCQl2YWwgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJTU9EX1JFR19GTEQoRElTUENfQ09ORklHLCBGTERfTUFTSyhzaGlmdCwgMiksIHZhbCA8PCBzaGlmdCk7CisKKwlpZiAodmFsICE9IDApCisJCWRpc3BjX3dyaXRlX3JlZyh0cl9yZWcsIGNrLT50cmFuc19rZXkpOworCWRpc3BjX3dyaXRlX3JlZyhkZl9yZWcsIGNrLT5iYWNrZ3JvdW5kKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKworCWRpc3BjLmNvbG9yX2tleSA9ICpjazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfZ2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleSAqY2spCit7CisJKmNrID0gZGlzcGMuY29sb3Jfa2V5OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb2FkX3BhbGV0dGUodm9pZCkKK3sKK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3NldF91cGRhdGVfbW9kZShlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQoreworCWludCByID0gMDsKKworCWlmIChtb2RlICE9IGRpc3BjLnVwZGF0ZV9tb2RlKSB7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCQkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgxKTsKKwkJCWRpc3BjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWJyZWFrOworCQljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCQlpbml0X2NvbXBsZXRpb24oJmRpc3BjLmZyYW1lX2RvbmUpOworCQkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgwKTsKKwkJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkaXNwYy5mcmFtZV9kb25lLAorCQkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7CisJCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LAorCQkJCQkgInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisJCQl9CisJCQlkaXNwYy51cGRhdGVfbW9kZSA9IG1vZGU7CisJCQllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJciA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1BMQU5FX1JFTE9DQVRFX01FTTsKKwlpZiAocGxhbmUgPiAwKQorCQljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1BMQU5FX1NDQUxFOworCWNhcHMtPnBsYW5lX2NvbG9yIHw9ICgxIDw8IE9NQVBGQl9DT0xPUl9SR0I1NjUpIHwKKwkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMikgfAorCQkJICAgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVZNDIyKTsKKwlpZiAocGxhbmUgPT0gMCkKKwkJY2Fwcy0+cGxhbmVfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfOEJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfNEJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfMkJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX0NMVVRfMUJQUCkgfAorCQkJCSAgICAgKDEgPDwgT01BUEZCX0NPTE9SX1JHQjQ0NCk7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBvbWFwX2Rpc3BjX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBkaXNwYy51cGRhdGVfbW9kZTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfY29sb3JfY29udl9jb2VmKHZvaWQpCit7CisJdTMyIG1hc2sgPSBGTERfTUFTSygxNiwgMTEpIHwgRkxEX01BU0soMCwgMTEpOworCWludCBjZjFfcmVnID0gRElTUENfVklEMV9CQVNFICsgRElTUENfVklEX0NPTlZfQ09FRjA7CisJaW50IGNmMl9yZWcgPSBESVNQQ19WSUQyX0JBU0UgKyBESVNQQ19WSURfQ09OVl9DT0VGMDsKKwlpbnQgYXQxX3JlZyA9IERJU1BDX1ZJRDFfQkFTRSArIERJU1BDX1ZJRF9BVFRSSUJVVEVTOworCWludCBhdDJfcmVnID0gRElTUENfVklEMl9CQVNFICsgRElTUENfVklEX0FUVFJJQlVURVM7CisJY29uc3Qgc3RydWN0IGNvbG9yX2NvbnZfY29lZiB7CisJCWludCAgcnksICByY3IsICByY2IsICAgZ3ksICBnY3IsICBnY2IsICAgYnksICBiY3IsICBiY2I7CisJCWludCAgZnVsbF9yYW5nZTsKKwl9ICBjdGJsX2J0NjAxXzUgPSB7CisJCSAgICAyOTgsICA0MDksICAgIDAsICAyOTgsIC0yMDgsIC0xMDAsICAyOTgsICAgIDAsICA1MTcsIDAsCisJfTsKKwljb25zdCBzdHJ1Y3QgY29sb3JfY29udl9jb2VmICpjdDsKKyNkZWZpbmUgQ1ZBTCh4LCB5KQkoKCh4ICYgMjA0NykgPDwgMTYpIHwgKHkgJiAyMDQ3KSkKKworCWN0ID0gJmN0YmxfYnQ2MDFfNTsKKworCU1PRF9SRUdfRkxEKGNmMV9yZWcsCQltYXNrLAlDVkFMKGN0LT5yY3IsIGN0LT5yeSkpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyA0LAltYXNrLAlDVkFMKGN0LT5neSwgIGN0LT5yY2IpKTsKKwlNT0RfUkVHX0ZMRChjZjFfcmVnICsgOCwJbWFzaywJQ1ZBTChjdC0+Z2NiLCBjdC0+Z2NyKSk7CisJTU9EX1JFR19GTEQoY2YxX3JlZyArIDEyLAltYXNrLAlDVkFMKGN0LT5iY3IsIGN0LT5ieSkpOworCU1PRF9SRUdfRkxEKGNmMV9yZWcgKyAxNiwJbWFzaywJQ1ZBTCgwLAkgICAgICBjdC0+YmNiKSk7CisKKwlNT0RfUkVHX0ZMRChjZjJfcmVnLAkJbWFzaywJQ1ZBTChjdC0+cmNyLCBjdC0+cnkpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgNCwJbWFzaywJQ1ZBTChjdC0+Z3ksICBjdC0+cmNiKSk7CisJTU9EX1JFR19GTEQoY2YyX3JlZyArIDgsCW1hc2ssCUNWQUwoY3QtPmdjYiwgY3QtPmdjcikpOworCU1PRF9SRUdfRkxEKGNmMl9yZWcgKyAxMiwJbWFzaywJQ1ZBTChjdC0+YmNyLCBjdC0+YnkpKTsKKwlNT0RfUkVHX0ZMRChjZjJfcmVnICsgMTYsCW1hc2ssCUNWQUwoMCwJICAgICAgY3QtPmJjYikpOworI3VuZGVmIENWQUwKKworCU1PRF9SRUdfRkxEKGF0MV9yZWcsICgxIDw8IDExKSwgY3QtPmZ1bGxfcmFuZ2UpOworCU1PRF9SRUdfRkxEKGF0Ml9yZWcsICgxIDw8IDExKSwgY3QtPmZ1bGxfcmFuZ2UpOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2NrX2RpdihpbnQgaXNfdGZ0LCBpbnQgcGNrLCBpbnQgKmxja19kaXYsIGludCAqcGNrX2RpdikKK3sKKwl1bnNpZ25lZCBsb25nIGZjaywgbGNrOworCisJKmxja19kaXYgPSAxOworCXBjayA9IG1heCgxLCBwY2spOworCWZjayA9IGNsa19nZXRfcmF0ZShkaXNwYy5kc3MxX2Zjayk7CisJbGNrID0gZmNrOworCSpwY2tfZGl2ID0gKGxjayArIHBjayAtIDEpIC8gcGNrOworCWlmIChpc190ZnQpCisJCSpwY2tfZGl2ID0gbWF4KDIsICpwY2tfZGl2KTsKKwllbHNlCisJCSpwY2tfZGl2ID0gbWF4KDMsICpwY2tfZGl2KTsKKwlpZiAoKnBja19kaXYgPiAyNTUpIHsKKwkJKnBja19kaXYgPSAyNTU7CisJCWxjayA9IHBjayAqICpwY2tfZGl2OworCQkqbGNrX2RpdiA9IGZjayAvIGxjazsKKwkJQlVHX09OKCpsY2tfZGl2IDwgMSk7CisJCWlmICgqbGNrX2RpdiA+IDI1NSkgeworCQkJKmxja19kaXYgPSAyNTU7CisJCQlkZXZfd2FybihkaXNwYy5mYmRldi0+ZGV2LCAicGl4Y2xvY2sgJWQga0h6IHRvbyBsb3cuXG4iLAorCQkJCSBwY2sgLyAxMDAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2xjZF90ZnRfbW9kZShpbnQgZW5hYmxlKQoreworCXUzMiBtYXNrOworCisJbWFzayA9IDEgPDwgMzsKKwlNT0RfUkVHX0ZMRChESVNQQ19DT05UUk9MLCBtYXNrLCBlbmFibGUgPyBtYXNrIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sY2RfdGltaW5ncyh2b2lkKQoreworCXUzMiBsOworCWludCBsY2tfZGl2LCBwY2tfZGl2OworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZGlzcGMuZmJkZXYtPnBhbmVsOworCWludCBpc190ZnQgPSBwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1BBTkVMX1RGVDsKKwl1bnNpZ25lZCBsb25nIGZjazsKKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19USU1JTkdfSCk7CisJbCAmPSB+KEZMRF9NQVNLKDAsIDYpIHwgRkxEX01BU0soOCwgOCkgfCBGTERfTUFTSygyMCwgOCkpOworCWwgfD0gKCBtYXgoMSwgKG1pbig2NCwgIHBhbmVsLT5oc3cpKSkgLSAxICkgPDwgMDsKKwlsIHw9ICggbWF4KDEsIChtaW4oMjU2LCBwYW5lbC0+aGZwKSkpIC0gMSApIDw8IDg7CisJbCB8PSAoIG1heCgxLCAobWluKDI1NiwgcGFuZWwtPmhicCkpKSAtIDEgKSA8PCAyMDsKKwlkaXNwY193cml0ZV9yZWcoRElTUENfVElNSU5HX0gsIGwpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RJTUlOR19WKTsKKwlsICY9IH4oRkxEX01BU0soMCwgNikgfCBGTERfTUFTSyg4LCA4KSB8IEZMRF9NQVNLKDIwLCA4KSk7CisJbCB8PSAoIG1heCgxLCAobWluKDY0LCAgcGFuZWwtPnZzdykpKSAtIDEgKSA8PCAwOworCWwgfD0gKCBtYXgoMCwgKG1pbigyNTUsIHBhbmVsLT52ZnApKSkgLSAwICkgPDwgODsKKwlsIHw9ICggbWF4KDAsIChtaW4oMjU1LCBwYW5lbC0+dmJwKSkpIC0gMCApIDw8IDIwOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19USU1JTkdfViwgbCk7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfUE9MX0ZSRVEpOworCWwgJj0gfkZMRF9NQVNLKDEyLCA2KTsKKwlsIHw9IChwYW5lbC0+Y29uZmlnICYgT01BUF9MQ0RDX1NJR05BTF9NQVNLKSA8PCAxMjsKKwlsIHw9IHBhbmVsLT5hY2IgJiAweGZmOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19QT0xfRlJFUSwgbCk7CisKKwljYWxjX2NrX2Rpdihpc190ZnQsIHBhbmVsLT5waXhlbF9jbG9jayAqIDEwMDAsICZsY2tfZGl2LCAmcGNrX2Rpdik7CisKKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfRElWSVNPUik7CisJbCAmPSB+KEZMRF9NQVNLKDE2LCA4KSB8IEZMRF9NQVNLKDAsIDgpKTsKKwlsIHw9IChsY2tfZGl2IDw8IDE2KSB8IChwY2tfZGl2IDw8IDApOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19ESVZJU09SLCBsKTsKKworCS8qIHVwZGF0ZSBwYW5lbCBpbmZvIHdpdGggdGhlIGV4YWN0IGNsb2NrICovCisJZmNrID0gY2xrX2dldF9yYXRlKGRpc3BjLmRzczFfZmNrKTsKKwlwYW5lbC0+cGl4ZWxfY2xvY2sgPSBmY2sgLyBsY2tfZGl2IC8gcGNrX2RpdiAvIDEwMDA7Cit9CisKK2ludCBvbWFwX2Rpc3BjX3JlcXVlc3RfaXJxKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCit7CisJaW50IHIgPSAwOworCisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJaWYgKGRpc3BjLmlycV9jYWxsYmFjaykKKwkJciA9IC1FQlVTWTsKKwllbHNlIHsKKwkJZGlzcGMuaXJxX2NhbGxiYWNrID0gY2FsbGJhY2s7CisJCWRpc3BjLmlycV9jYWxsYmFja19kYXRhID0gZGF0YTsKKwl9CisKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19yZXF1ZXN0X2lycSk7CisKK3ZvaWQgb21hcF9kaXNwY19lbmFibGVfaXJxcyhpbnQgaXJxX21hc2spCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJZGlzcGMuZW5hYmxlZF9pcnFzID0gaXJxX21hc2s7CisJaXJxX21hc2sgfD0gRElTUENfSVJRX01BU0tfRVJST1I7CisJTU9EX1JFR19GTEQoRElTUENfSVJRRU5BQkxFLCAweDdmZmYsIGlycV9tYXNrKTsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19lbmFibGVfaXJxcyk7CisKK3ZvaWQgb21hcF9kaXNwY19kaXNhYmxlX2lycXMoaW50IGlycV9tYXNrKQoreworCWVuYWJsZV9sY2RfY2xvY2tzKDEpOworCWRpc3BjLmVuYWJsZWRfaXJxcyAmPSB+aXJxX21hc2s7CisJaXJxX21hc2sgJj0gfkRJU1BDX0lSUV9NQVNLX0VSUk9SOworCU1PRF9SRUdfRkxEKERJU1BDX0lSUUVOQUJMRSwgMHg3ZmZmLCBpcnFfbWFzayk7CisJZW5hYmxlX2xjZF9jbG9ja3MoMCk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzcGNfZGlzYWJsZV9pcnFzKTsKKwordm9pZCBvbWFwX2Rpc3BjX2ZyZWVfaXJxKHZvaWQpCit7CisJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJb21hcF9kaXNwY19kaXNhYmxlX2lycXMoRElTUENfSVJRX01BU0tfQUxMKTsKKwlkaXNwYy5pcnFfY2FsbGJhY2sgPSBOVUxMOworCWRpc3BjLmlycV9jYWxsYmFja19kYXRhID0gTlVMTDsKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKK30KK0VYUE9SVF9TWU1CT0wob21hcF9kaXNwY19mcmVlX2lycSk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX2Rpc3BjX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwl1MzIgc3RhdCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0lSUVNUQVRVUyk7CisKKwlpZiAoc3RhdCAmIERJU1BDX0lSUV9GUkFNRU1BU0spCisJCWNvbXBsZXRlKCZkaXNwYy5mcmFtZV9kb25lKTsKKworCWlmIChzdGF0ICYgRElTUENfSVJRX01BU0tfRVJST1IpIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiaXJxIGVycm9yIHN0YXR1cyAlMDR4XG4iLAorCQkJCXN0YXQgJiAweDdmZmYpOworCQl9CisJfQorCisJaWYgKChzdGF0ICYgZGlzcGMuZW5hYmxlZF9pcnFzKSAmJiBkaXNwYy5pcnFfY2FsbGJhY2spCisJCWRpc3BjLmlycV9jYWxsYmFjayhkaXNwYy5pcnFfY2FsbGJhY2tfZGF0YSk7CisKKwlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCBzdGF0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBnZXRfZHNzX2Nsb2Nrcyh2b2lkKQoreworCWlmIChJU19FUlIoKGRpc3BjLmRzc19pY2sgPSBjbGtfZ2V0KGRpc3BjLmZiZGV2LT5kZXYsICJkc3NfaWNrIikpKSkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzX2ljayIpOworCQlyZXR1cm4gUFRSX0VSUihkaXNwYy5kc3NfaWNrKTsKKwl9CisKKwlpZiAoSVNfRVJSKChkaXNwYy5kc3MxX2ZjayA9IGNsa19nZXQoZGlzcGMuZmJkZXYtPmRldiwgImRzczFfZmNrIikpKSkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzMV9mY2siKTsKKwkJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcGMuZHNzMV9mY2spOworCX0KKworCWlmIChJU19FUlIoKGRpc3BjLmRzc181NG1fZmNrID0KKwkJCQljbGtfZ2V0KGRpc3BjLmZiZGV2LT5kZXYsICJkc3NfNTRtX2ZjayIpKSkpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGRzc181NG1fZmNrIik7CisJCWNsa19wdXQoZGlzcGMuZHNzX2ljayk7CisJCWNsa19wdXQoZGlzcGMuZHNzMV9mY2spOworCQlyZXR1cm4gUFRSX0VSUihkaXNwYy5kc3NfNTRtX2Zjayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kc3NfY2xvY2tzKHZvaWQpCit7CisJY2xrX3B1dChkaXNwYy5kc3NfNTRtX2Zjayk7CisJY2xrX3B1dChkaXNwYy5kc3MxX2Zjayk7CisJY2xrX3B1dChkaXNwYy5kc3NfaWNrKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xjZF9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQljbGtfZW5hYmxlKGRpc3BjLmRzczFfZmNrKTsKKwllbHNlCisJCWNsa19kaXNhYmxlKGRpc3BjLmRzczFfZmNrKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2ludGVyZmFjZV9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQljbGtfZW5hYmxlKGRpc3BjLmRzc19pY2spOworCWVsc2UKKwkJY2xrX2Rpc2FibGUoZGlzcGMuZHNzX2ljayk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9kaWdpdF9jbG9ja3MoaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQorCQljbGtfZW5hYmxlKGRpc3BjLmRzc181NG1fZmNrKTsKKwllbHNlCisJCWNsa19kaXNhYmxlKGRpc3BjLmRzc181NG1fZmNrKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9kaXNwY19zdXNwZW5kKHZvaWQpCit7CisJaWYgKGRpc3BjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlpbml0X2NvbXBsZXRpb24oJmRpc3BjLmZyYW1lX2RvbmUpOworCQlvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KDApOworCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGlzcGMuZnJhbWVfZG9uZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7CisJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsCisJCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisJCX0KKwkJZW5hYmxlX2xjZF9jbG9ja3MoMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvbWFwX2Rpc3BjX3Jlc3VtZSh2b2lkKQoreworCWlmIChkaXNwYy51cGRhdGVfbW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpIHsKKwkJZW5hYmxlX2xjZF9jbG9ja3MoMSk7CisJCWlmICghZGlzcGMuZXh0X21vZGUpIHsKKwkJCXNldF9sY2RfdGltaW5ncygpOworCQkJbG9hZF9wYWxldHRlKCk7CisJCX0KKwkJb21hcF9kaXNwY19lbmFibGVfbGNkX291dCgxKTsKKwl9Cit9CisKKworc3RhdGljIGludCBvbWFwX2Rpc3BjX3VwZGF0ZV93aW5kb3coc3RydWN0IGZiX2luZm8gKmZiaSwKKwkJCQkgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkJIHZvaWQgKCpjb21wbGV0ZV9jYWxsYmFjaykodm9pZCAqYXJnKSwKKwkJCQkgdm9pZCAqY29tcGxldGVfY2FsbGJhY2tfZGF0YSkKK3sKKwlyZXR1cm4gZGlzcGMudXBkYXRlX21vZGUgPT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCA/IC1FTk9ERVYgOiAwOworfQorCitzdGF0aWMgaW50IG1tYXBfa2VybihzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0CSprdm1hOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAl2bWE7CisJcGdwcm90X3QJCXBncHJvdDsKKwl1bnNpZ25lZCBsb25nCQl2YWRkcjsKKworCWt2bWEgPSBnZXRfdm1fYXJlYShyZWdpb24tPnNpemUsIFZNX0lPUkVNQVApOworCWlmIChrdm1hID09IE5VTEwpIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGtlcm5lbCB2bSBhcmVhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZtYS52bV9tbSA9ICZpbml0X21tOworCisJdmFkZHIgPSAodW5zaWduZWQgbG9uZylrdm1hLT5hZGRyOworCisJcGdwcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShwZ3Byb3Rfa2VybmVsKTsKKwl2bWEudm1fc3RhcnQgPSB2YWRkcjsKKwl2bWEudm1fZW5kID0gdmFkZHIgKyByZWdpb24tPnNpemU7CisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSgmdm1hLCB2YWRkciwgcmVnaW9uLT5wYWRkciA+PiBQQUdFX1NISUZULAorCQkJICAgcmVnaW9uLT5zaXplLCBwZ3Byb3QpIDwgMCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJrZXJuZWwgbW1hcCBmb3IgRkJNRU0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJlZ2lvbi0+dmFkZHIgPSAodm9pZCAqKXZhZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfdXNlcl9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWludCBwbGFuZSA9IChpbnQpdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfaW5jKCZkaXNwYy5tYXBfY291bnRbcGxhbmVdKTsKK30KKworc3RhdGljIHZvaWQgbW1hcF91c2VyX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWludCBwbGFuZSA9IChpbnQpdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfZGVjKCZkaXNwYy5tYXBfY291bnRbcGxhbmVdKTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBtbWFwX3VzZXJfb3BzID0geworCS5vcGVuID0gbW1hcF91c2VyX29wZW4sCisJLmNsb3NlID0gbW1hcF91c2VyX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBvbWFwX2Rpc3BjX21tYXBfdXNlcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBpbmZvLT5wYXI7CisJdW5zaWduZWQgbG9uZyBvZmY7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1MzIgbGVuOworCisJaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlvZmYgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisKKwlzdGFydCA9IGluZm8tPmZpeC5zbWVtX3N0YXJ0OworCWxlbiA9IGluZm8tPmZpeC5zbWVtX2xlbjsKKwlpZiAob2ZmID49IGxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQgKyBvZmYpID4gbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlvZmYgKz0gc3RhcnQ7CisJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworCXZtYS0+dm1fb3BzID0gJm1tYXBfdXNlcl9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSAodm9pZCAqKXBsYW5lLT5pZHg7CisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIG9mZiA+PiBQQUdFX1NISUZULAorCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisJLyogdm1fb3BzLm9wZW4gd29uJ3QgYmUgY2FsbGVkIGZvciBtbWFwIGl0c2VsZi4gKi8KKwlhdG9taWNfaW5jKCZkaXNwYy5tYXBfY291bnRbcGxhbmUtPmlkeF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bm1hcF9rZXJuKHN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmVnaW9uKQoreworCXZ1bm1hcChyZWdpb24tPnZhZGRyKTsKK30KKworc3RhdGljIGludCBhbGxvY19wYWxldHRlX3JhbSh2b2lkKQoreworCWRpc3BjLnBhbGV0dGVfdmFkZHIgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsCisJCU1BWF9QQUxFVFRFX1NJWkUsICZkaXNwYy5wYWxldHRlX3BhZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGlzcGMucGFsZXR0ZV92YWRkciA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBwYWxldHRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsIE1BWF9QQUxFVFRFX1NJWkUsCisJCQlkaXNwYy5wYWxldHRlX3ZhZGRyLCBkaXNwYy5wYWxldHRlX3BhZGRyKTsKK30KKworc3RhdGljIGludCBhbGxvY19mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlyZWdpb24tPnZhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShkaXNwYy5mYmRldi0+ZGV2LAorCQkJcmVnaW9uLT5zaXplLCAmcmVnaW9uLT5wYWRkciwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocmVnaW9uLT52YWRkciA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGlzcGMuZmJkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBGQiBETUEgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZmJtZW0oc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uICpyZWdpb24pCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGRpc3BjLmZiZGV2LT5kZXYsIHJlZ2lvbi0+c2l6ZSwKKwkJCSAgICAgIHJlZ2lvbi0+dmFkZHIsIHJlZ2lvbi0+cGFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IHJlc21hcCAqaW5pdF9yZXNtYXAodW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IHNpemUpCit7CisJdW5zaWduZWQgcGFnZV9jbnQ7CisJc3RydWN0IHJlc21hcCAqcmVzX21hcDsKKworCXBhZ2VfY250ID0gUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlyZXNfbWFwID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc21hcCkgKyBSRVNNQVBfU0laRShwYWdlX2NudCksIEdGUF9LRVJORUwpOworCWlmIChyZXNfbWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJlc19tYXAtPnN0YXJ0ID0gc3RhcnQ7CisJcmVzX21hcC0+cGFnZV9jbnQgPSBwYWdlX2NudDsKKwlyZXNfbWFwLT5tYXAgPSAodW5zaWduZWQgbG9uZyAqKShyZXNfbWFwICsgMSk7CisJcmV0dXJuIHJlc19tYXA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfcmVzbWFwKHN0cnVjdCByZXNtYXAgKnJlc19tYXApCit7CisJa2ZyZWUocmVzX21hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc21hcF9tZW1fdHlwZSh1bnNpZ25lZCBsb25nIHN0YXJ0KQoreworCWlmIChzdGFydCA+PSBPTUFQMl9TUkFNX1NUQVJUICYmCisJICAgIHN0YXJ0IDwgT01BUDJfU1JBTV9TVEFSVCArIE9NQVAyX1NSQU1fU0laRSkKKwkJcmV0dXJuIE9NQVBGQl9NRU1UWVBFX1NSQU07CisJZWxzZQorCQlyZXR1cm4gT01BUEZCX01FTVRZUEVfU0RSQU07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc21hcF9wYWdlX3Jlc2VydmVkKHN0cnVjdCByZXNtYXAgKnJlc19tYXAsIHVuc2lnbmVkIHBhZ2VfbnIpCit7CisJcmV0dXJuICpSRVNNQVBfUFRSKHJlc19tYXAsIHBhZ2VfbnIpICYgUkVTTUFQX01BU0socGFnZV9ucikgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc21hcF9yZXNlcnZlX3BhZ2Uoc3RydWN0IHJlc21hcCAqcmVzX21hcCwgdW5zaWduZWQgcGFnZV9ucikKK3sKKwlCVUdfT04ocmVzbWFwX3BhZ2VfcmVzZXJ2ZWQocmVzX21hcCwgcGFnZV9ucikpOworCSpSRVNNQVBfUFRSKHJlc19tYXAsIHBhZ2VfbnIpIHw9IFJFU01BUF9NQVNLKHBhZ2VfbnIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzbWFwX2ZyZWVfcGFnZShzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwLCB1bnNpZ25lZCBwYWdlX25yKQoreworCUJVR19PTighcmVzbWFwX3BhZ2VfcmVzZXJ2ZWQocmVzX21hcCwgcGFnZV9ucikpOworCSpSRVNNQVBfUFRSKHJlc19tYXAsIHBhZ2VfbnIpICY9IH5SRVNNQVBfTUFTSyhwYWdlX25yKTsKK30KKworc3RhdGljIHZvaWQgcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBzaXplKQoreworCisJc3RydWN0IHJlc21hcAkqcmVzX21hcDsKKwl1bnNpZ25lZAlzdGFydF9wYWdlOworCXVuc2lnbmVkCWVuZF9wYWdlOworCWludAkJbXR5cGU7CisJdW5zaWduZWQJaTsKKworCW10eXBlID0gcmVzbWFwX21lbV90eXBlKHN0YXJ0KTsKKwlyZXNfbWFwID0gZGlzcGMucmVzX21hcFttdHlwZV07CisJZGV2X2RiZyhkaXNwYy5mYmRldi0+ZGV2LCAicmVzZXJ2ZSBtZW0gdHlwZSAlZCBzdGFydCAlMDhseCBzaXplICVkXG4iLAorCQltdHlwZSwgc3RhcnQsIHNpemUpOworCXN0YXJ0X3BhZ2UgPSAoc3RhcnQgLSByZXNfbWFwLT5zdGFydCkgLyBQQUdFX1NJWkU7CisJZW5kX3BhZ2UgPSBzdGFydF9wYWdlICsgUEFHRV9BTElHTihzaXplKSAvIFBBR0VfU0laRTsKKwlmb3IgKGkgPSBzdGFydF9wYWdlOyBpIDwgZW5kX3BhZ2U7IGkrKykKKwkJcmVzbWFwX3Jlc2VydmVfcGFnZShyZXNfbWFwLCBpKTsKK30KKworc3RhdGljIHZvaWQgcmVzbWFwX2ZyZWVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCByZXNtYXAJKnJlc19tYXA7CisJdW5zaWduZWQJc3RhcnRfcGFnZTsKKwl1bnNpZ25lZAllbmRfcGFnZTsKKwl1bnNpZ25lZAlpOworCWludAkJbXR5cGU7CisKKwltdHlwZSA9IHJlc21hcF9tZW1fdHlwZShzdGFydCk7CisJcmVzX21hcCA9IGRpc3BjLnJlc19tYXBbbXR5cGVdOworCWRldl9kYmcoZGlzcGMuZmJkZXYtPmRldiwgImZyZWUgbWVtIHR5cGUgJWQgc3RhcnQgJTA4bHggc2l6ZSAlZFxuIiwKKwkJbXR5cGUsIHN0YXJ0LCBzaXplKTsKKwlzdGFydF9wYWdlID0gKHN0YXJ0IC0gcmVzX21hcC0+c3RhcnQpIC8gUEFHRV9TSVpFOworCWVuZF9wYWdlID0gc3RhcnRfcGFnZSArIFBBR0VfQUxJR04oc2l6ZSkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspCisJCXJlc21hcF9mcmVlX3BhZ2UocmVzX21hcCwgaSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlc21hcF9hbGxvY19yZWdpb24oaW50IG10eXBlLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHRvdGFsOworCXVuc2lnbmVkIHN0YXJ0X3BhZ2U7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlzdHJ1Y3QgcmVzbWFwICpyZXNfbWFwID0gZGlzcGMucmVzX21hcFttdHlwZV07CisKKwlCVUdfT04obXR5cGUgPj0gRElTUENfTUVNVFlQRV9OVU0gfHwgcmVzX21hcCA9PSBOVUxMIHx8ICFzaXplKTsKKworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpIC8gUEFHRV9TSVpFOworCXN0YXJ0X3BhZ2UgPSAwOworCXRvdGFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzX21hcC0+cGFnZV9jbnQ7IGkrKykgeworCQlpZiAocmVzbWFwX3BhZ2VfcmVzZXJ2ZWQocmVzX21hcCwgaSkpIHsKKwkJCXN0YXJ0X3BhZ2UgPSBpICsgMTsKKwkJCXRvdGFsID0gMDsKKwkJfSBlbHNlIGlmICgrK3RvdGFsID09IHNpemUpCisJCQlicmVhazsKKwl9CisJaWYgKHRvdGFsIDwgc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlzdGFydCA9IHJlc19tYXAtPnN0YXJ0ICsgc3RhcnRfcGFnZSAqIFBBR0VfU0laRTsKKwlyZXNtYXBfcmVzZXJ2ZV9yZWdpb24oc3RhcnQsIHNpemUgKiBQQUdFX1NJWkUpOworCisJcmV0dXJuIHN0YXJ0OworfQorCisvKiBOb3RlIHRoYXQgdGhpcyB3aWxsIG9ubHkgd29yayBmb3IgdXNlciBtYXBwaW5ncywgd2UgZG9uJ3QgZGVhbCB3aXRoCisgKiBrZXJuZWwgbWFwcGluZ3MgaGVyZSwgc28gZmJjb24gd2lsbCBrZWVwIHVzaW5nIHRoZSBvbGQgcmVnaW9uLgorICovCitzdGF0aWMgaW50IG9tYXBfZGlzcGNfc2V0dXBfbWVtKGludCBwbGFuZSwgc2l6ZV90IHNpemUsIGludCBtZW1fdHlwZSwKKwkJCQl1bnNpZ25lZCBsb25nICpwYWRkcikKK3sKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCXVuc2lnbmVkIGxvbmcgbmV3X2FkZHIgPSAwOworCisJaWYgKCh1bnNpZ25lZClwbGFuZSA+IGRpc3BjLm1lbV9kZXNjLnJlZ2lvbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtZW1fdHlwZSA+PSBESVNQQ19NRU1UWVBFX05VTSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRpc3BjLnJlc19tYXBbbWVtX3R5cGVdID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJnID0gJmRpc3BjLm1lbV9kZXNjLnJlZ2lvbltwbGFuZV07CisJaWYgKHNpemUgPT0gcmctPnNpemUgJiYgbWVtX3R5cGUgPT0gcmctPnR5cGUpCisJCXJldHVybiAwOworCWlmIChhdG9taWNfcmVhZCgmZGlzcGMubWFwX2NvdW50W3BsYW5lXSkpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHJnLT5zaXplICE9IDApCisJCXJlc21hcF9mcmVlX3JlZ2lvbihyZy0+cGFkZHIsIHJnLT5zaXplKTsKKwlpZiAoc2l6ZSAhPSAwKSB7CisJCW5ld19hZGRyID0gcmVzbWFwX2FsbG9jX3JlZ2lvbihtZW1fdHlwZSwgc2l6ZSk7CisJCWlmICghbmV3X2FkZHIpIHsKKwkJCS8qIFJlYWxsb2NhdGUgb2xkIHJlZ2lvbi4gKi8KKwkJCXJlc21hcF9yZXNlcnZlX3JlZ2lvbihyZy0+cGFkZHIsIHJnLT5zaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJnLT5wYWRkciA9IG5ld19hZGRyOworCXJnLT5zaXplID0gc2l6ZTsKKwlyZy0+dHlwZSA9IG1lbV90eXBlOworCisJKnBhZGRyID0gbmV3X2FkZHI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXR1cF9mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfbWQpCit7CisJc3RydWN0IG9tYXBmYl9tZW1fcmVnaW9uCSpyZzsKKwlpbnQgaTsKKwlpbnQgcjsKKwl1bnNpZ25lZCBsb25nCQkJbWVtX3N0YXJ0W0RJU1BDX01FTVRZUEVfTlVNXTsKKwl1bnNpZ25lZCBsb25nCQkJbWVtX2VuZFtESVNQQ19NRU1UWVBFX05VTV07CisKKwlpZiAoIXJlcV9tZC0+cmVnaW9uX2NudCkgeworCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJubyBtZW1vcnkgcmVnaW9ucyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmcgPSAmcmVxX21kLT5yZWdpb25bMF07CisJbWVtc2V0KG1lbV9zdGFydCwgMHhmZiwgc2l6ZW9mKG1lbV9zdGFydCkpOworCW1lbXNldChtZW1fZW5kLCAwLCBzaXplb2YobWVtX2VuZCkpOworCisJZm9yIChpID0gMDsgaSA8IHJlcV9tZC0+cmVnaW9uX2NudDsgaSsrLCByZysrKSB7CisJCWludCBtdHlwZTsKKwkJaWYgKHJnLT5wYWRkcikgeworCQkJcmctPmFsbG9jID0gMDsKKwkJCWlmIChyZy0+dmFkZHIgPT0gTlVMTCkgeworCQkJCXJnLT5tYXAgPSAxOworCQkJCWlmICgociA9IG1tYXBfa2VybihyZykpIDwgMCkKKwkJCQkJcmV0dXJuIHI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocmctPnR5cGUgIT0gT01BUEZCX01FTVRZUEVfU0RSQU0pIHsKKwkJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsCisJCQkJCSJ1bnN1cHBvcnRlZCBtZW1vcnkgdHlwZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZy0+YWxsb2MgPSByZy0+bWFwID0gMTsKKwkJCWlmICgociA9IGFsbG9jX2ZibWVtKHJnKSkgPCAwKQorCQkJCXJldHVybiByOworCQl9CisJCW10eXBlID0gcmctPnR5cGU7CisKKwkJaWYgKHJnLT5wYWRkciA8IG1lbV9zdGFydFttdHlwZV0pCisJCQltZW1fc3RhcnRbbXR5cGVdID0gcmctPnBhZGRyOworCQlpZiAocmctPnBhZGRyICsgcmctPnNpemUgPiBtZW1fZW5kW210eXBlXSkKKwkJCW1lbV9lbmRbbXR5cGVdID0gcmctPnBhZGRyICsgcmctPnNpemU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IERJU1BDX01FTVRZUEVfTlVNOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydDsKKwkJc2l6ZV90IHNpemU7CisJCWlmIChtZW1fZW5kW2ldID09IDApCisJCQljb250aW51ZTsKKwkJc3RhcnQgPSBtZW1fc3RhcnRbaV07CisJCXNpemUgPSBtZW1fZW5kW2ldIC0gc3RhcnQ7CisJCWRpc3BjLnJlc19tYXBbaV0gPSBpbml0X3Jlc21hcChzdGFydCwgc2l6ZSk7CisJCXIgPSAtRU5PTUVNOworCQlpZiAoZGlzcGMucmVzX21hcFtpXSA9PSBOVUxMKQorCQkJZ290byBmYWlsOworCQkvKiBJbml0aWFsIHN0YXRlIGlzIHRoYXQgZXZlcnl0aGluZyBpcyByZXNlcnZlZC4gVGhpcworCQkgKiBpbmNsdWRlcyBwb3NzaWJsZSBob2xlcyBhcyB3ZWxsLCB3aGljaCB3aWxsIG5ldmVyIGJlCisJCSAqIGZyZWVkLgorCQkgKi8KKwkJcmVzbWFwX3Jlc2VydmVfcmVnaW9uKHN0YXJ0LCBzaXplKTsKKwl9CisKKwlkaXNwYy5tZW1fZGVzYyA9ICpyZXFfbWQ7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJZm9yIChpID0gMDsgaSA8IERJU1BDX01FTVRZUEVfTlVNOyBpKyspIHsKKwkJaWYgKGRpc3BjLnJlc19tYXBbaV0gIT0gTlVMTCkKKwkJCWNsZWFudXBfcmVzbWFwKGRpc3BjLnJlc19tYXBbaV0pOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9mYm1lbSh2b2lkKQoreworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmc7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRElTUENfTUVNVFlQRV9OVU07IGkrKykgeworCQlpZiAoZGlzcGMucmVzX21hcFtpXSAhPSBOVUxMKQorCQkJY2xlYW51cF9yZXNtYXAoZGlzcGMucmVzX21hcFtpXSk7CisJfQorCXJnID0gJmRpc3BjLm1lbV9kZXNjLnJlZ2lvblswXTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrLCByZysrKSB7CisJCWlmIChyZy0+YWxsb2MpCisJCQlmcmVlX2ZibWVtKHJnKTsKKwkJZWxzZSB7CisJCQlpZiAocmctPm1hcCkKKwkJCQl1bm1hcF9rZXJuKHJnKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBvbWFwX2Rpc3BjX2luaXQoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBpbnQgZXh0X21vZGUsCisJCQkgICBzdHJ1Y3Qgb21hcGZiX21lbV9kZXNjICpyZXFfdnJhbSkKK3sKKwlpbnQgcjsKKwl1MzIgbDsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwlpbnQgdG1vID0gMTAwMDA7CisJaW50IHNraXBfaW5pdCA9IDA7CisJaW50IGk7CisKKwltZW1zZXQoJmRpc3BjLCAwLCBzaXplb2YoZGlzcGMpKTsKKworCWRpc3BjLmJhc2UgPSBpb19wMnYoRElTUENfQkFTRSk7CisJZGlzcGMuZmJkZXYgPSBmYmRldjsKKwlkaXNwYy5leHRfbW9kZSA9IGV4dF9tb2RlOworCisJaW5pdF9jb21wbGV0aW9uKCZkaXNwYy5mcmFtZV9kb25lKTsKKworCWlmICgociA9IGdldF9kc3NfY2xvY2tzKCkpIDwgMCkKKwkJcmV0dXJuIHI7CisKKwllbmFibGVfaW50ZXJmYWNlX2Nsb2NrcygxKTsKKwllbmFibGVfbGNkX2Nsb2NrcygxKTsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0JPT1RMT0FERVJfSU5JVAorCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05UUk9MKTsKKwkvKiBMQ0QgZW5hYmxlZCA/ICovCisJaWYgKGwgJiAxKSB7CisJCXByX2luZm8oIm9tYXBmYjogc2tpcHBpbmcgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb25cbiIpOworCQlza2lwX2luaXQgPSAxOworCX0KKyNlbmRpZgorCisJaWYgKCFza2lwX2luaXQpIHsKKwkJLyogUmVzZXQgbW9uaXRvcmluZyB3b3JrcyBvbmx5IHcvIHRoZSA1NE0gY2xrICovCisJCWVuYWJsZV9kaWdpdF9jbG9ja3MoMSk7CisKKwkJLyogU29mdCByZXNldCAqLworCQlNT0RfUkVHX0ZMRChESVNQQ19TWVNDT05GSUcsIDEgPDwgMSwgMSA8PCAxKTsKKworCQl3aGlsZSAoIShkaXNwY19yZWFkX3JlZyhESVNQQ19TWVNTVEFUVVMpICYgMSkpIHsKKwkJCWlmICghLS10bW8pIHsKKwkJCQlkZXZfZXJyKGRpc3BjLmZiZGV2LT5kZXYsICJzb2Z0IHJlc2V0IGZhaWxlZFxuIik7CisJCQkJciA9IC1FTk9ERVY7CisJCQkJZW5hYmxlX2RpZ2l0X2Nsb2NrcygwKTsKKwkJCQlnb3RvIGZhaWwxOworCQkJfQorCQl9CisKKwkJZW5hYmxlX2RpZ2l0X2Nsb2NrcygwKTsKKwl9CisKKwkvKiBFbmFibGUgc21hcnQgaWRsZSBhbmQgYXV0b2lkbGUgKi8KKwlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTCk7CisJbCAmPSB+KCgzIDw8IDEyKSB8ICgzIDw8IDMpKTsKKwlsIHw9ICgyIDw8IDEyKSB8ICgyIDw8IDMpIHwgKDEgPDwgMCk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1NZU0NPTkZJRywgbCk7CisJb21hcF93cml0ZWwoMSA8PCAwLCBEU1NfQkFTRSArIERTU19TWVNDT05GSUcpOworCisJLyogU2V0IGZ1bmN0aW9uYWwgY2xvY2sgYXV0b2dhdGluZyAqLworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19DT05GSUcpOworCWwgfD0gMSA8PCA5OworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05GSUcsIGwpOworCisJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0lSUVNUQVRVUyk7CisJZGlzcGNfd3JpdGVfcmVnKGwsIERJU1BDX0lSUVNUQVRVUyk7CisKKwkvKiBFbmFibGUgdGhvc2UgdGhhdCB3ZSBoYW5kbGUgYWx3YXlzICovCisJb21hcF9kaXNwY19lbmFibGVfaXJxcyhESVNQQ19JUlFfRlJBTUVNQVNLKTsKKworCWlmICgociA9IHJlcXVlc3RfaXJxKElOVF8yNFhYX0RTU19JUlEsIG9tYXBfZGlzcGNfaXJxX2hhbmRsZXIsCisJCQkgICAwLCBNT0RVTEVfTkFNRSwgZmJkZXYpKSA8IDApIHsKKwkJZGV2X2VycihkaXNwYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IERTUyBJUlFcbiIpOworCQlnb3RvIGZhaWwxOworCX0KKworCS8qIEwzIGZpcmV3YWxsIHNldHRpbmc6IGVuYWJsZSBhY2Nlc3MgdG8gT0NNIFJBTSAqLworCV9fcmF3X3dyaXRlbCgweDQwMjAwMGIwLCBpb19wMnYoMHg2ODAwNTBhMCkpOworCisJaWYgKChyID0gYWxsb2NfcGFsZXR0ZV9yYW0oKSkgPCAwKQorCQlnb3RvIGZhaWwyOworCisJaWYgKChyID0gc2V0dXBfZmJtZW0ocmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZmFpbDM7CisKKwlpZiAoIXNraXBfaW5pdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCQltZW1zZXQoZGlzcGMubWVtX2Rlc2MucmVnaW9uW2ldLnZhZGRyLCAwLAorCQkJCWRpc3BjLm1lbV9kZXNjLnJlZ2lvbltpXS5zaXplKTsKKwkJfQorCisJCS8qIFNldCBsb2dpYyBjbG9jayB0byBmY2ssIHBpeGVsIGNsb2NrIHRvIGZjay8yIGZvciBub3cgKi8KKwkJTU9EX1JFR19GTEQoRElTUENfRElWSVNPUiwgRkxEX01BU0soMTYsIDgpLCAxIDw8IDE2KTsKKwkJTU9EX1JFR19GTEQoRElTUENfRElWSVNPUiwgRkxEX01BU0soMCwgOCksIDIgPDwgMCk7CisKKwkJc2V0dXBfcGxhbmVfZmlmbygwLCBleHRfbW9kZSk7CisJCXNldHVwX3BsYW5lX2ZpZm8oMSwgZXh0X21vZGUpOworCQlzZXR1cF9wbGFuZV9maWZvKDIsIGV4dF9tb2RlKTsKKworCQlzZXR1cF9jb2xvcl9jb252X2NvZWYoKTsKKworCQlzZXRfbGNkX3RmdF9tb2RlKHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfUEFORUxfVEZUKTsKKwkJc2V0X2xvYWRfbW9kZShESVNQQ19MT0FEX0ZSQU1FX09OTFkpOworCisJCWlmICghZXh0X21vZGUpIHsKKwkJCXNldF9sY2RfZGF0YV9saW5lcyhwYW5lbC0+ZGF0YV9saW5lcyk7CisJCQlvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZShwYW5lbC0+eF9yZXMsIHBhbmVsLT55X3Jlcyk7CisJCQlzZXRfbGNkX3RpbWluZ3MoKTsKKwkJfSBlbHNlCisJCQlzZXRfbGNkX2RhdGFfbGluZXMocGFuZWwtPmJwcCk7CisJCWVuYWJsZV9yZmJpX21vZGUoZXh0X21vZGUpOworCX0KKworCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19SRVZJU0lPTik7CisJcHJfaW5mbygib21hcGZiOiBESVNQQyB2ZXJzaW9uICVkLiVkIGluaXRpYWxpemVkXG4iLAorCQkgbCA+PiA0ICYgMHgwZiwgbCAmIDB4MGYpOworCWVuYWJsZV9sY2RfY2xvY2tzKDApOworCisJcmV0dXJuIDA7CitmYWlsMzoKKwlmcmVlX3BhbGV0dGVfcmFtKCk7CitmYWlsMjoKKwlmcmVlX2lycShJTlRfMjRYWF9EU1NfSVJRLCBmYmRldik7CitmYWlsMToKKwllbmFibGVfbGNkX2Nsb2NrcygwKTsKKwllbmFibGVfaW50ZXJmYWNlX2Nsb2NrcygwKTsKKwlwdXRfZHNzX2Nsb2NrcygpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfZGlzcGNfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJb21hcF9kaXNwY19zZXRfdXBkYXRlX21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJLyogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBjbG9ja3MgdGhhdCBhcmUgb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGlzcGMubWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKQorCQlvbWFwX2Rpc3BjX2VuYWJsZV9wbGFuZShpLCAwKTsKKwljbGVhbnVwX2ZibWVtKCk7CisJZnJlZV9wYWxldHRlX3JhbSgpOworCWZyZWVfaXJxKElOVF8yNFhYX0RTU19JUlEsIGRpc3BjLmZiZGV2KTsKKwllbmFibGVfaW50ZXJmYWNlX2Nsb2NrcygwKTsKKwlwdXRfZHNzX2Nsb2NrcygpOworfQorCitjb25zdCBzdHJ1Y3QgbGNkX2N0cmwgb21hcDJfaW50X2N0cmwgPSB7CisJLm5hbWUJCQk9ICJpbnRlcm5hbCIsCisJLmluaXQJCQk9IG9tYXBfZGlzcGNfaW5pdCwKKwkuY2xlYW51cAkJPSBvbWFwX2Rpc3BjX2NsZWFudXAsCisJLmdldF9jYXBzCQk9IG9tYXBfZGlzcGNfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IG9tYXBfZGlzcGNfc2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBvbWFwX2Rpc3BjX2dldF91cGRhdGVfbW9kZSwKKwkudXBkYXRlX3dpbmRvdwkJPSBvbWFwX2Rpc3BjX3VwZGF0ZV93aW5kb3csCisJLnN1c3BlbmQJCT0gb21hcF9kaXNwY19zdXNwZW5kLAorCS5yZXN1bWUJCQk9IG9tYXBfZGlzcGNfcmVzdW1lLAorCS5zZXR1cF9wbGFuZQkJPSBvbWFwX2Rpc3BjX3NldHVwX3BsYW5lLAorCS5zZXR1cF9tZW0JCT0gb21hcF9kaXNwY19zZXR1cF9tZW0sCisJLnNldF9zY2FsZQkJPSBvbWFwX2Rpc3BjX3NldF9zY2FsZSwKKwkuZW5hYmxlX3BsYW5lCQk9IG9tYXBfZGlzcGNfZW5hYmxlX3BsYW5lLAorCS5zZXRfY29sb3Jfa2V5CQk9IG9tYXBfZGlzcGNfc2V0X2NvbG9yX2tleSwKKwkuZ2V0X2NvbG9yX2tleQkJPSBvbWFwX2Rpc3BjX2dldF9jb2xvcl9rZXksCisJLm1tYXAJCQk9IG9tYXBfZGlzcGNfbW1hcF91c2VyLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5oIGIvZHJpdmVycy92aWRlby9vbWFwL2Rpc3BjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxNTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9kaXNwYy5oCkBAIC0wLDAgKzEsNDMgQEAKKyNpZm5kZWYgX0RJU1BDX0gKKyNkZWZpbmUgX0RJU1BDX0gKKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjZGVmaW5lIERJU1BDX1BMQU5FX0dGWAkJCTAKKyNkZWZpbmUgRElTUENfUExBTkVfVklEMQkJMQorI2RlZmluZSBESVNQQ19QTEFORV9WSUQyCQkyCisKKyNkZWZpbmUgRElTUENfUkdCXzFfQlBQCQkJMHgwMAorI2RlZmluZSBESVNQQ19SR0JfMl9CUFAJCQkweDAxCisjZGVmaW5lIERJU1BDX1JHQl80X0JQUAkJCTB4MDIKKyNkZWZpbmUgRElTUENfUkdCXzhfQlBQCQkJMHgwMworI2RlZmluZSBESVNQQ19SR0JfMTJfQlBQCQkweDA0CisjZGVmaW5lIERJU1BDX1JHQl8xNl9CUFAJCTB4MDYKKyNkZWZpbmUgRElTUENfUkdCXzI0X0JQUAkJMHgwOAorI2RlZmluZSBESVNQQ19SR0JfMjRfQlBQX1VOUEFDS18zMgkweDA5CisjZGVmaW5lIERJU1BDX1lVVjJfNDIyCQkJMHgwYQorI2RlZmluZSBESVNQQ19VWVZZXzQyMgkJCTB4MGIKKworI2RlZmluZSBESVNQQ19CVVJTVF80eDMyCQkwCisjZGVmaW5lIERJU1BDX0JVUlNUXzh4MzIJCTEKKyNkZWZpbmUgRElTUENfQlVSU1RfMTZ4MzIJCTIKKworI2RlZmluZSBESVNQQ19MT0FEX0NMVVRfQU5EX0ZSQU1FCTB4MDAKKyNkZWZpbmUgRElTUENfTE9BRF9DTFVUX09OTFkJCTB4MDEKKyNkZWZpbmUgRElTUENfTE9BRF9GUkFNRV9PTkxZCQkweDAyCisjZGVmaW5lIERJU1BDX0xPQURfQ0xVVF9PTkNFX0ZSQU1FCTB4MDMKKworI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18xMgkJMAorI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18xNgkJMQorI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18xOAkJMgorI2RlZmluZSBESVNQQ19URlRfREFUQV9MSU5FU18yNAkJMworCitleHRlcm4gdm9pZCBvbWFwX2Rpc3BjX3NldF9sY2Rfc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCitleHRlcm4gdm9pZCBvbWFwX2Rpc3BjX2VuYWJsZV9sY2Rfb3V0KGludCBlbmFibGUpOworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19lbmFibGVfZGlnaXRfb3V0KGludCBlbmFibGUpOworCitleHRlcm4gaW50ICBvbWFwX2Rpc3BjX3JlcXVlc3RfaXJxKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgb21hcF9kaXNwY19mcmVlX2lycSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvaHdhNzQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0OGUwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9od2E3NDIuYwpAQCAtMCwwICsxLDEwNzcgQEAKKy8qCisgKiBFcHNvbiBIV0E3NDIgTENEIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcnM6ICAgICBKdWhhIFlyasO2bMOkICAgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgICAgICAgSW1yZSBEZWFrICAgICA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIFlVViBzdXBwb3J0OiBKdXNzaSBMYWFrbyAgIDxqdXNzaS5sYWFrb0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3YTc0Mi5oPgorCisjZGVmaW5lIEhXQTc0Ml9SRVZfQ09ERV9SRUcgICAgICAgMHgwCisjZGVmaW5lIEhXQTc0Ml9DT05GSUdfUkVHICAgICAgICAgMHgyCisjZGVmaW5lIEhXQTc0Ml9QTExfRElWX1JFRyAgICAgICAgMHg0CisjZGVmaW5lIEhXQTc0Ml9QTExfMF9SRUcgICAgICAgICAgMHg2CisjZGVmaW5lIEhXQTc0Ml9QTExfMV9SRUcgICAgICAgICAgMHg4CisjZGVmaW5lIEhXQTc0Ml9QTExfMl9SRUcgICAgICAgICAgMHhhCisjZGVmaW5lIEhXQTc0Ml9QTExfM19SRUcgICAgICAgICAgMHhjCisjZGVmaW5lIEhXQTc0Ml9QTExfNF9SRUcgICAgICAgICAgMHhlCisjZGVmaW5lIEhXQTc0Ml9DTEtfU1JDX1JFRyAgICAgICAgMHgxMgorI2RlZmluZSBIV0E3NDJfUEFORUxfVFlQRV9SRUcgICAgIDB4MTQKKyNkZWZpbmUgSFdBNzQyX0hfRElTUF9SRUcgICAgICAgICAweDE2CisjZGVmaW5lIEhXQTc0Ml9IX05EUF9SRUcgICAgICAgICAgMHgxOAorI2RlZmluZSBIV0E3NDJfVl9ESVNQXzFfUkVHICAgICAgIDB4MWEKKyNkZWZpbmUgSFdBNzQyX1ZfRElTUF8yX1JFRyAgICAgICAweDFjCisjZGVmaW5lIEhXQTc0Ml9WX05EUF9SRUcgICAgICAgICAgMHgxZQorI2RlZmluZSBIV0E3NDJfSFNfV19SRUcgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSFdBNzQyX0hQX1NfUkVHICAgICAgICAgICAweDIyCisjZGVmaW5lIEhXQTc0Ml9WU19XX1JFRyAgICAgICAgICAgMHgyNAorI2RlZmluZSBIV0E3NDJfVlBfU19SRUcgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgSFdBNzQyX1BDTEtfUE9MX1JFRyAgICAgICAweDI4CisjZGVmaW5lIEhXQTc0Ml9JTlBVVF9NT0RFX1JFRyAgICAgMHgyYQorI2RlZmluZSBIV0E3NDJfVFJBTlNMX01PREVfUkVHMSAgIDB4MmUKKyNkZWZpbmUgSFdBNzQyX0RJU1BfTU9ERV9SRUcgICAgICAweDM0CisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfVFlQRSAgICAgICAgMHgzNgorI2RlZmluZSBIV0E3NDJfV0lORE9XX1hfU1RBUlRfMCAgIDB4MzgKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX1NUQVJUXzEgICAweDNhCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWV9TVEFSVF8wICAgMHgzYworI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfU1RBUlRfMSAgIDB4M2UKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19YX0VORF8wICAgICAweDQwCisjZGVmaW5lIEhXQTc0Ml9XSU5ET1dfWF9FTkRfMSAgICAgMHg0MgorI2RlZmluZSBIV0E3NDJfV0lORE9XX1lfRU5EXzAgICAgIDB4NDQKKyNkZWZpbmUgSFdBNzQyX1dJTkRPV19ZX0VORF8xICAgICAweDQ2CisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfV1JJVEVfTFNCICAgMHg0OAorI2RlZmluZSBIV0E3NDJfTUVNT1JZX1dSSVRFX01TQiAgIDB4NDkKKyNkZWZpbmUgSFdBNzQyX01FTU9SWV9SRUFEXzAgICAgICAweDRhCisjZGVmaW5lIEhXQTc0Ml9NRU1PUllfUkVBRF8xICAgICAgMHg0YworI2RlZmluZSBIV0E3NDJfTUVNT1JZX1JFQURfMiAgICAgIDB4NGUKKyNkZWZpbmUgSFdBNzQyX1BPV0VSX1NBVkUgICAgICAgICAweDU2CisjZGVmaW5lIEhXQTc0Ml9ORFBfQ1RSTCAgICAgICAgICAgMHg1OAorCisjZGVmaW5lIEhXQTc0Ml9BVVRPX1VQREFURV9USU1FCQkoSFogLyAyMCkKKworLyogUmVzZXJ2ZSA0IHJlcXVlc3Qgc2xvdHMgZm9yIHJlcXVlc3RzIGluIGlycSBjb250ZXh0ICovCisjZGVmaW5lIFJFUV9QT09MX1NJWkUJCQkyNAorI2RlZmluZSBJUlFfUkVRX1BPT0xfU0laRQkJNAorCisjZGVmaW5lIFJFUV9GUk9NX0lSUV9QT09MIDB4MDEKKworI2RlZmluZSBSRVFfQ09NUExFVEUJMAorI2RlZmluZSBSRVFfUEVORElORwkxCisKK3N0cnVjdCB1cGRhdGVfcGFyYW0geworCWludAl4LCB5LCB3aWR0aCwgaGVpZ2h0OworCWludAljb2xvcl9tb2RlOworCWludAlmbGFnczsKK307CisKK3N0cnVjdCBod2E3NDJfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwl1bnNpZ25lZCBpbnQJIGZsYWdzOworCisJaW50CQkgKCpoYW5kbGVyKShzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcSk7CisJdm9pZAkJICgqY29tcGxldGUpKHZvaWQgKmRhdGEpOworCXZvaWQJCSAqY29tcGxldGVfZGF0YTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHVwZGF0ZV9wYXJhbQl1cGRhdGU7CisJCXN0cnVjdCBjb21wbGV0aW9uCSpzeW5jOworCX0gcGFyOworfTsKKworc3RydWN0IHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZDsKKworCXN0cnVjdCB0aW1lcl9saXN0CWF1dG9fdXBkYXRlX3RpbWVyOworCWludAkJCXN0b3BfYXV0b191cGRhdGU7CisJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93CWF1dG9fdXBkYXRlX3dpbmRvdzsKKwl1bnNpZ25lZAkJdGVfY29ubmVjdGVkOjE7CisJdW5zaWduZWQJCXZzeW5jX29ubHk6MTsKKworCXN0cnVjdCBod2E3NDJfcmVxdWVzdAlyZXFfcG9vbFtSRVFfUE9PTF9TSVpFXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBlbmRpbmdfcmVxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlmcmVlX3JlcV9saXN0OworCXN0cnVjdCBzZW1hcGhvcmUJcmVxX3NlbWE7CisJc3BpbmxvY2tfdAkJcmVxX2xvY2s7CisKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncwlyZWdfdGltaW5ncywgbHV0X3RpbWluZ3M7CisKKwlpbnQJCQlwcmV2X2NvbG9yX21vZGU7CisJaW50CQkJcHJldl9mbGFnczsKKwlpbnQJCQl3aW5kb3dfdHlwZTsKKworCXUzMgkJCW1heF90cmFuc21pdF9zaXplOworCXUzMgkJCWV4dGlmX2Nsa19wZXJpb2Q7CisJdW5zaWduZWQgbG9uZwkJcGl4X3R4X3RpbWU7CisJdW5zaWduZWQgbG9uZwkJbGluZV91cGRfdGltZTsKKworCisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCXN0cnVjdCBsY2RfY3RybF9leHRpZgkqZXh0aWY7CisJc3RydWN0IGxjZF9jdHJsCQkqaW50X2N0cmw7CisKKwl2b2lkCQkJKCpwb3dlcl91cCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkCQkJKCpwb3dlcl9kb3duKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworfSBod2E3NDI7CisKK3N0cnVjdCBsY2RfY3RybCBod2E3NDJfY3RybDsKKworc3RhdGljIHU4IGh3YTc0Ml9yZWFkX3JlZyh1OCByZWcpCit7CisJdTggZGF0YTsKKworCWh3YTc0Mi5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWh3YTc0Mi5leHRpZi0+d3JpdGVfY29tbWFuZCgmcmVnLCAxKTsKKwlod2E3NDIuZXh0aWYtPnJlYWRfZGF0YSgmZGF0YSwgMSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3dyaXRlX3JlZyh1OCByZWcsIHU4IGRhdGEpCit7CisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJaHdhNzQyLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWh3YTc0Mi5leHRpZi0+d3JpdGVfZGF0YSgmZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF93aW5kb3dfcmVncyhpbnQgeF9zdGFydCwgaW50IHlfc3RhcnQsIGludCB4X2VuZCwgaW50IHlfZW5kKQoreworCXU4IHRtcFs4XTsKKwl1OCBjbWQ7CisKKwl4X2VuZC0tOworCXlfZW5kLS07CisJdG1wWzBdID0geF9zdGFydDsKKwl0bXBbMV0gPSB4X3N0YXJ0ID4+IDg7CisJdG1wWzJdID0geV9zdGFydDsKKwl0bXBbM10gPSB5X3N0YXJ0ID4+IDg7CisJdG1wWzRdID0geF9lbmQ7CisJdG1wWzVdID0geF9lbmQgPj4gODsKKwl0bXBbNl0gPSB5X2VuZDsKKwl0bXBbN10gPSB5X2VuZCA+PiA4OworCisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoOCk7CisJY21kID0gSFdBNzQyX1dJTkRPV19YX1NUQVJUXzA7CisKKwlod2E3NDIuZXh0aWYtPndyaXRlX2NvbW1hbmQoJmNtZCwgMSk7CisKKwlod2E3NDIuZXh0aWYtPndyaXRlX2RhdGEodG1wLCA4KTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Zvcm1hdF9yZWdzKGludCBjb252LCBpbnQgdHJhbnNsLCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRSkgeworCQlod2E3NDIud2luZG93X3R5cGUgPSAoKGh3YTc0Mi53aW5kb3dfdHlwZSAmIDB4ZmMpIHwgMHgwMSk7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaHdhNzQyOiBlbmFibGVkIHBpeGVsIGRvdWJsaW5nXG4iKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWh3YTc0Mi53aW5kb3dfdHlwZSA9IChod2E3NDIud2luZG93X3R5cGUgJiAweGZjKTsKKyNpZmRlZiBWRVJCT1NFCisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJod2E3NDI6IGRpc2FibGVkIHBpeGVsIGRvdWJsaW5nXG4iKTsKKyNlbmRpZgorCX0KKworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX0lOUFVUX01PREVfUkVHLCBjb252KTsKKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9UUkFOU0xfTU9ERV9SRUcxLCB0cmFuc2wpOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX1dJTkRPV19UWVBFLCBod2E3NDIud2luZG93X3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfdGVhcnN5bmMoaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNjcmVlbl9oZWlnaHQsCisJCQkgICAgaW50IGZvcmNlX3ZzeW5jKQoreworCXU4IGI7CisKKwliID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9ORFBfQ1RSTCk7CisJYiB8PSAxIDw8IDI7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfTkRQX0NUUkwsIGIpOworCisJaWYgKGxpa2VseShod2E3NDIudnN5bmNfb25seSB8fCBmb3JjZV92c3luYykpIHsKKwkJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod2lkdGggKiBod2E3NDIucGl4X3R4X3RpbWUgPCBod2E3NDIubGluZV91cGRfdGltZSkgeworCQlod2E3NDIuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgod2lkdGggKiBod2E3NDIucGl4X3R4X3RpbWUgLyAxMDAwKSAqIGhlaWdodCA8CisJICAgICh5ICsgaGVpZ2h0KSAqIChod2E3NDIubGluZV91cGRfdGltZSAvIDEwMDApKSB7CisJCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDEsIDApOworCQlyZXR1cm47CisJfQorCisJaHdhNzQyLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgeSArIDEpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3RlYXJzeW5jKHZvaWQpCit7CisJdTggYjsKKworCWh3YTc0Mi5leHRpZi0+ZW5hYmxlX3RlYXJzeW5jKDAsIDApOworCisJYiA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfTkRQX0NUUkwpOworCWIgJj0gfigxIDw8IDIpOworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX05EUF9DVFJMLCBiKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKmFsbG9jX3JlcSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXE7CisJaW50IHJlcV9mbGFncyA9IDA7CisKKwlpZiAoIWluX2ludGVycnVwdCgpKQorCQlkb3duKCZod2E3NDIucmVxX3NlbWEpOworCWVsc2UKKwkJcmVxX2ZsYWdzID0gUkVRX0ZST01fSVJRX1BPT0w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisJQlVHX09OKGxpc3RfZW1wdHkoJmh3YTc0Mi5mcmVlX3JlcV9saXN0KSk7CisJcmVxID0gbGlzdF9lbnRyeShod2E3NDIuZnJlZV9yZXFfbGlzdC5uZXh0LAorCQkJIHN0cnVjdCBod2E3NDJfcmVxdWVzdCwgZW50cnkpOworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCUlOSVRfTElTVF9IRUFEKCZyZXEtPmVudHJ5KTsKKwlyZXEtPmZsYWdzID0gcmVxX2ZsYWdzOworCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcmVxKHN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJbGlzdF9hZGQoJnJlcS0+ZW50cnksICZod2E3NDIuZnJlZV9yZXFfbGlzdCk7CisJaWYgKCEocmVxLT5mbGFncyAmIFJFUV9GUk9NX0lSUV9QT09MKSkKKwkJdXAoJmh3YTc0Mi5yZXFfc2VtYSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZod2E3NDIucmVxX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QpKSB7CisJCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCQl2b2lkICgqY29tcGxldGUpKHZvaWQgKik7CisJCXZvaWQgKmNvbXBsZXRlX2RhdGE7CisKKwkJcmVxID0gbGlzdF9lbnRyeShod2E3NDIucGVuZGluZ19yZXFfbGlzdC5uZXh0LAorCQkJCSBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJlcS0+aGFuZGxlcihyZXEpID09IFJFUV9QRU5ESU5HKQorCQkJcmV0dXJuOworCisJCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwkJY29tcGxldGVfZGF0YSA9IHJlcS0+Y29tcGxldGVfZGF0YTsKKwkJZnJlZV9yZXEocmVxKTsKKworCQlpZiAoY29tcGxldGUpCisJCQljb21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9yZXFfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHByb2Nlc3MgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3YTc0Mi5yZXFfbG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmh3YTc0Mi5wZW5kaW5nX3JlcV9saXN0KSkpCisJCXByb2Nlc3MgPSAwOworCWxpc3Rfc3BsaWNlX2luaXQoaGVhZCwgaHdhNzQyLnBlbmRpbmdfcmVxX2xpc3QucHJldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHdhNzQyLnJlcV9sb2NrLCBmbGFncyk7CisKKwlpZiAocHJvY2VzcykKKwkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QJKnJlcSA9IChzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKilkYXRhOworCXZvaWQJCQkoKmNvbXBsZXRlKSh2b2lkICopOworCXZvaWQJCQkqY29tcGxldGVfZGF0YTsKKworCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwljb21wbGV0ZV9kYXRhID0gcmVxLT5jb21wbGV0ZV9kYXRhOworCisJZnJlZV9yZXEocmVxKTsKKworCWlmIChjb21wbGV0ZSkKKwkJY29tcGxldGUoY29tcGxldGVfZGF0YSk7CisKKwlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdHMoKTsKK30KKworc3RhdGljIGludCBzZW5kX2ZyYW1lX2hhbmRsZXIoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHVwZGF0ZV9wYXJhbSAqcGFyID0gJnJlcS0+cGFyLnVwZGF0ZTsKKwlpbnQgeCA9IHBhci0+eDsKKwlpbnQgeSA9IHBhci0+eTsKKwlpbnQgdyA9IHBhci0+d2lkdGg7CisJaW50IGggPSBwYXItPmhlaWdodDsKKwlpbnQgYnBwOworCWludCBjb252LCB0cmFuc2w7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJaW50IGNvbG9yX21vZGUgPSBwYXItPmNvbG9yX21vZGU7CisJaW50IGZsYWdzID0gcGFyLT5mbGFnczsKKwlpbnQgc2NyX3dpZHRoID0gaHdhNzQyLmZiZGV2LT5wYW5lbC0+eF9yZXM7CisJaW50IHNjcl9oZWlnaHQgPSBod2E3NDIuZmJkZXYtPnBhbmVsLT55X3JlczsKKworI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAieCAlZCB5ICVkIHcgJWQgaCAlZCBzY3Jfd2lkdGggJWQgIgorCQkiY29sb3JfbW9kZSAlZCBmbGFncyAlZFxuIiwKKwkJeCwgeSwgdywgaCwgc2NyX3dpZHRoLCBjb2xvcl9tb2RlLCBmbGFncyk7CisjZW5kaWYKKworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMjoKKwkJYnBwID0gMTY7CisJCWNvbnYgPSAweDA4OworCQl0cmFuc2wgPSAweDI1OworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCWJwcCA9IDEyOworCQljb252ID0gMHgwOTsKKwkJdHJhbnNsID0gMHgyNTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNTY1OgorCQlicHAgPSAxNjsKKwkJY29udiA9IDB4MDE7CisJCXRyYW5zbCA9IDB4MDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChod2E3NDIucHJldl9mbGFncyAhPSBmbGFncyB8fAorCSAgICBod2E3NDIucHJldl9jb2xvcl9tb2RlICE9IGNvbG9yX21vZGUpIHsKKwkJc2V0X2Zvcm1hdF9yZWdzKGNvbnYsIHRyYW5zbCwgZmxhZ3MpOworCQlod2E3NDIucHJldl9jb2xvcl9tb2RlID0gY29sb3JfbW9kZTsKKwkJaHdhNzQyLnByZXZfZmxhZ3MgPSBmbGFnczsKKwl9CisJZmxhZ3MgPSByZXEtPnBhci51cGRhdGUuZmxhZ3M7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKQorCQllbmFibGVfdGVhcnN5bmMoeSwgc2NyX3dpZHRoLCBoLCBzY3JfaGVpZ2h0LAorCQkJCWZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX0ZPUkNFX1ZTWU5DKTsKKwllbHNlCisJCWRpc2FibGVfdGVhcnN5bmMoKTsKKworCXNldF93aW5kb3dfcmVncyh4LCB5LCB4ICsgdywgeSArIGgpOworCisJb2Zmc2V0ID0gKHNjcl93aWR0aCAqIHkgKyB4KSAqIGJwcCAvIDg7CisKKwlod2E3NDIuaW50X2N0cmwtPnNldHVwX3BsYW5lKE9NQVBGQl9QTEFORV9HRlgsCisJCQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENELCBvZmZzZXQsIHNjcl93aWR0aCwgMCwgMCwgdywgaCwKKwkJCWNvbG9yX21vZGUpOworCisJaHdhNzQyLmV4dGlmLT5zZXRfYml0c19wZXJfY3ljbGUoMTYpOworCisJaHdhNzQyLmludF9jdHJsLT5lbmFibGVfcGxhbmUoT01BUEZCX1BMQU5FX0dGWCwgMSk7CisJaHdhNzQyLmV4dGlmLT50cmFuc2Zlcl9hcmVhKHcsIGgsIHJlcXVlc3RfY29tcGxldGUsIHJlcSk7CisKKwlyZXR1cm4gUkVRX1BFTkRJTkc7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZnJhbWVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlod2E3NDIuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShPTUFQRkJfUExBTkVfR0ZYLCAwKTsKK30KKworI2RlZmluZSBBRERfUFJFUShfeCwgX3ksIF93LCBfaCkgZG8gewkJXAorCXJlcSA9IGFsbG9jX3JlcSgpOwkJCVwKKwlyZXEtPmhhbmRsZXIJPSBzZW5kX2ZyYW1lX2hhbmRsZXI7CVwKKwlyZXEtPmNvbXBsZXRlCT0gc2VuZF9mcmFtZV9jb21wbGV0ZTsJXAorCXJlcS0+cGFyLnVwZGF0ZS54ID0gX3g7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS55ID0gX3k7CQkJXAorCXJlcS0+cGFyLnVwZGF0ZS53aWR0aCAgPSBfdzsJCVwKKwlyZXEtPnBhci51cGRhdGUuaGVpZ2h0ID0gX2g7CQlcCisJcmVxLT5wYXIudXBkYXRlLmNvbG9yX21vZGUgPSBjb2xvcl9tb2RlO1wKKwlyZXEtPnBhci51cGRhdGUuZmxhZ3MJICA9IGZsYWdzOwlcCisJbGlzdF9hZGRfdGFpbCgmcmVxLT5lbnRyeSwgcmVxX2hlYWQpOwlcCit9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9yZXFfbGlzdChzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpyZXFfaGVhZCkKK3sKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKnJlcTsKKwlpbnQgeCA9IHdpbi0+eDsKKwlpbnQgeSA9IHdpbi0+eTsKKwlpbnQgd2lkdGggPSB3aW4tPndpZHRoOworCWludCBoZWlnaHQgPSB3aW4tPmhlaWdodDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgZmxhZ3M7CisKKwlmbGFncyA9IHdpbi0+Zm9ybWF0ICYgfk9NQVBGQl9GT1JNQVRfTUFTSzsKKwljb2xvcl9tb2RlID0gd2luLT5mb3JtYXQgJiBPTUFQRkJfRk9STUFUX01BU0s7CisKKwlpZiAoeCAmIDEpIHsKKwkJQUREX1BSRVEoeCwgeSwgMSwgaGVpZ2h0KTsKKwkJd2lkdGgtLTsKKwkJeCsrOworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DOworCX0KKwlpZiAod2lkdGggJiB+MSkgeworCQl1bnNpZ25lZCBpbnQgeHNwYW4gPSB3aWR0aCAmIH4xOworCQl1bnNpZ25lZCBpbnQgeXN0YXJ0ID0geTsKKwkJdW5zaWduZWQgaW50IHlzcGFuID0gaGVpZ2h0OworCisJCWlmICh4c3BhbiAqIGhlaWdodCAqIDIgPiBod2E3NDIubWF4X3RyYW5zbWl0X3NpemUpIHsKKwkJCXlzcGFuID0gaHdhNzQyLm1heF90cmFuc21pdF9zaXplIC8gKHhzcGFuICogMik7CisJCQlBRERfUFJFUSh4LCB5c3RhcnQsIHhzcGFuLCB5c3Bhbik7CisJCQl5c3RhcnQgKz0geXNwYW47CisJCQl5c3BhbiA9IGhlaWdodCAtIHlzcGFuOworCQkJZmxhZ3MgJj0gfk9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQzsKKwkJfQorCisJCUFERF9QUkVRKHgsIHlzdGFydCwgeHNwYW4sIHlzcGFuKTsKKwkJeCArPSB4c3BhbjsKKwkJd2lkdGggLT0geHNwYW47CisJCWZsYWdzICY9IH5PTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkM7CisJfQorCWlmICh3aWR0aCkKKwkJQUREX1BSRVEoeCwgeSwgMSwgaGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgYXV0b191cGRhdGVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlpZiAoIWh3YTc0Mi5zdG9wX2F1dG9fdXBkYXRlKQorCQltb2RfdGltZXIoJmh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lciwKKwkJCSAgamlmZmllcyArIEhXQTc0Ml9BVVRPX1VQREFURV9USU1FKTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXV0byh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqbGFzdDsKKworCWNyZWF0ZV9yZXFfbGlzdCgmaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdywgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRyeShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gYXV0b191cGRhdGVfY29tcGxldGU7CisJbGFzdC0+Y29tcGxldGVfZGF0YSA9IE5VTEw7CisKKwlzdWJtaXRfcmVxX2xpc3QoJnJlcV9saXN0KTsKK30KKworaW50IGh3YTc0Ml91cGRhdGVfd2luZG93X2FzeW5jKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJIHN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luLAorCQkJCSB2b2lkICgqY29tcGxldGVfY2FsbGJhY2spKHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmNvbXBsZXRlX2NhbGxiYWNrX2RhdGEpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3QgaHdhNzQyX3JlcXVlc3QgKmxhc3Q7CisJaW50IHIgPSAwOworCisJaWYgKGh3YTc0Mi51cGRhdGVfbW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkgeworCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiaW52YWxpZCB1cGRhdGUgbW9kZVxuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHVubGlrZWx5KHdpbi0+Zm9ybWF0ICYKKwkgICAgfigweDAzIHwgT01BUEZCX0ZPUk1BVF9GTEFHX0RPVUJMRSB8CisJICAgIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQyB8IE9NQVBGQl9GT1JNQVRfRkxBR19GT1JDRV9WU1lOQykpKSB7CisJCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJpbnZhbGlkIHdpbmRvdyBmbGFnIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwljcmVhdGVfcmVxX2xpc3Qod2luLCAmcmVxX2xpc3QpOworCWxhc3QgPSBsaXN0X2VudHJ5KHJlcV9saXN0LnByZXYsIHN0cnVjdCBod2E3NDJfcmVxdWVzdCwgZW50cnkpOworCisJbGFzdC0+Y29tcGxldGUgPSBjb21wbGV0ZV9jYWxsYmFjazsKKwlsYXN0LT5jb21wbGV0ZV9kYXRhID0gKHZvaWQgKiljb21wbGV0ZV9jYWxsYmFja19kYXRhOworCisJc3VibWl0X3JlcV9saXN0KCZyZXFfbGlzdCk7CisKK291dDoKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0woaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMgaW50IGh3YTc0Ml9zZXR1cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCWlmIChwbGFuZSAhPSBPTUFQRkJfUExBTkVfR0ZYIHx8CisJICAgIGNoYW5uZWxfb3V0ICE9IE9NQVBGQl9DSEFOTkVMX09VVF9MQ0QpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHdhNzQyX2VuYWJsZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJaWYgKHBsYW5lICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaHdhNzQyLmludF9jdHJsLT5lbmFibGVfcGxhbmUocGxhbmUsIGVuYWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW5jX2hhbmRsZXIoc3RydWN0IGh3YTc0Ml9yZXF1ZXN0ICpyZXEpCit7CisJY29tcGxldGUocmVxLT5wYXIuc3luYyk7CisJcmV0dXJuIFJFUV9DT01QTEVURTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3N5bmModm9pZCkKK3sKKwlMSVNUX0hFQUQocmVxX2xpc3QpOworCXN0cnVjdCBod2E3NDJfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisKKwlyZXEgPSBhbGxvY19yZXEoKTsKKworCXJlcS0+aGFuZGxlciA9IHN5bmNfaGFuZGxlcjsKKwlyZXEtPmNvbXBsZXRlID0gTlVMTDsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXApOworCXJlcS0+cGFyLnN5bmMgPSAmY29tcDsKKworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmcmVxX2xpc3QpOworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9iaW5kX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAidXBkYXRlX21vZGUgJWRcbiIsIGh3YTc0Mi51cGRhdGVfbW9kZSk7CisJaWYgKGh3YTc0Mi51cGRhdGVfbW9kZSA9PSBPTUFQRkJfTUFOVUFMX1VQREFURSkgeworCQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoaHdhNzQyLmZiZGV2LCBPTUFQRkJfRVZFTlRfUkVBRFkpOworCX0KK30KKworc3RhdGljIGludCBod2E3NDJfc2V0X3VwZGF0ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaWYgKG1vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUgJiYgbW9kZSAhPSBPTUFQRkJfQVVUT19VUERBVEUgJiYKKwkgICAgbW9kZSAhPSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtb2RlID09IGh3YTc0Mi51cGRhdGVfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfaW5mbyhod2E3NDIuZmJkZXYtPmRldiwgIkhXQTc0Mjogc2V0dGluZyB1cGRhdGUgbW9kZSB0byAlc1xuIiwKKwkJCW1vZGUgPT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCA/ICJkaXNhYmxlZCIgOgorCQkJKG1vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFID8gImF1dG8iIDogIm1hbnVhbCIpKTsKKworCXN3aXRjaCAoaHdhNzQyLnVwZGF0ZV9tb2RlKSB7CisJY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKKwkJb21hcGZiX25vdGlmeV9jbGllbnRzKGh3YTc0Mi5mYmRldiwgT01BUEZCX0VWRU5UX0RJU0FCTEVEKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6CisJCWh3YTc0Mi5zdG9wX2F1dG9fdXBkYXRlID0gMTsKKwkJZGVsX3RpbWVyX3N5bmMoJmh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lcik7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKKwkJYnJlYWs7CisJfQorCisJaHdhNzQyLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwlod2E3NDJfc3luYygpOworCWh3YTc0Mi5zdG9wX2F1dG9fdXBkYXRlID0gMDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhod2E3NDIuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFEWSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlod2E3NDJfdXBkYXRlX3dpbmRvd19hdXRvKDApOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgaHdhNzQyX2dldF91cGRhdGVfbW9kZSh2b2lkKQoreworCXJldHVybiBod2E3NDIudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJvdW5kX3RvX2V4dGlmX3RpY2tzKHVuc2lnbmVkIGxvbmcgcHMsIGludCBkaXYpCit7CisJaW50IGJ1c190aWNrID0gaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QgKiBkaXY7CisJcmV0dXJuIChwcyArIGJ1c190aWNrIC0gMSkgLyBidXNfdGljayAqIGJ1c190aWNrOworfQorCitzdGF0aWMgaW50IGNhbGNfcmVnX3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgMTIuMiBucyAocmVncyksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGltZSA9IFJFT25UaW1lICsgMTYgbnMgKHJlZ3MpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSArIDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyAyKlNZU0NMSyAgKHJlZ3MpLAorCSAqIFdyaXRlQ3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMgKi8KKwlzeXN0aW0gPSAxMDAwMDAwMDAwIC8gKHN5c2NsayAvIDEwMDApOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJIV0E3NDIgc3lzdGltICVsdSBwcyBleHRpZl9jbGtfcGVyaW9kICV1IHBzIgorCQkgICJleHRpZl9jbGtfZGl2ICVkXG4iLCBzeXN0aW0sIGh3YTc0Mi5leHRpZl9jbGtfcGVyaW9kLCBkaXYpOworCisJdCA9ICZod2E3NDIucmVnX3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVvZigqdCkpOworCXQtPmNsa19kaXYgPSBkaXY7CisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMjIwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndlX29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDE2MDAwLCBkaXYpOworCXQtPmNzX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+cmVfb2ZmX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPndlX2N5Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+d2VfY3ljbGVfdGltZSA8IHQtPndlX29mZl90aW1lKQorCQl0LT53ZV9jeWNsZV90aW1lID0gdC0+d2Vfb2ZmX3RpbWU7CisJdC0+cmVfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJlX2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW3JlZ11jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbcmVnXXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJCSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQtPndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJbcmVnXXJkYWNjZXNzICVkIGNzcHVsc2UgJWRcbiIsCisJCSB0LT5hY2Nlc3NfdGltZSwgdC0+Y3NfcHVsc2Vfd2lkdGgpOworCisJcmV0dXJuIGh3YTc0Mi5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfbHV0X3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgNCAqIFNZU0NMSyArIDI2IChsdXQpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9mZlRpbWUgPSBSRU9uVGltZSArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogQ1NPZmZUaW1lID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNlV2lkdGggPSAxMCBucworCSAqLworCXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIkhXQTc0MiBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgcHMiCisJCSAgImV4dGlmX2Nsa19kaXYgJWRcbiIsIHN5c3RpbSwgaHdhNzQyLmV4dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmh3YTc0Mi5sdXRfdGltaW5nczsKKwltZW1zZXQodCwgMCwgc2l6ZW9mKCp0KSk7CisKKwl0LT5jbGtfZGl2ID0gZGl2OworCisJdC0+Y3Nfb25fdGltZSA9IDA7CisJdC0+d2Vfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPnJlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwgZGl2KTsKKwl0LT5hY2Nlc3NfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyA0ICogc3lzdGltICsKKwkJCQkJICAgICAgMjYwMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyA0ICogc3lzdGltICsKKwkJCQkJICAgICAgMjYwMDAsIGRpdik7CisJdC0+Y3Nfb2ZmX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5yZV9vZmZfdGltZSArIDEwMDAsIGRpdik7CisJdC0+d2VfY3ljbGVfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKDIgKiBzeXN0aW0gKyAyMDAwLCBkaXYpOworCWlmICh0LT53ZV9jeWNsZV90aW1lIDwgdC0+d2Vfb2ZmX3RpbWUpCisJCXQtPndlX2N5Y2xlX3RpbWUgPSB0LT53ZV9vZmZfdGltZTsKKwl0LT5yZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMjAwMCArIDQgKiBzeXN0aW0gKyAyNjAwMCwgZGl2KTsKKwlpZiAodC0+cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhod2E3NDIuZmJkZXYtPmRldiwgIltsdXRdY3NvbiAlZCBjc29mZiAlZCByZW9uICVkIHJlb2ZmICVkXG4iLAorCQkgdC0+Y3Nfb25fdGltZSwgdC0+Y3Nfb2ZmX3RpbWUsIHQtPnJlX29uX3RpbWUsIHQtPnJlX29mZl90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW2x1dF13ZW9uICVkIHdlb2ZmICVkIHJlY3ljICVkIHdlY3ljICVkXG4iLAorCQkgdC0+d2Vfb25fdGltZSwgdC0+d2Vfb2ZmX3RpbWUsIHQtPnJlX2N5Y2xlX3RpbWUsCisJCSB0LT53ZV9jeWNsZV90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAiW2x1dF1yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAorCQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBod2E3NDIuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30KKworc3RhdGljIGludCBjYWxjX2V4dGlmX3RpbWluZ3ModW5zaWduZWQgbG9uZyBzeXNjbGssIGludCAqZXh0aWZfbWVtX2RpdikKK3sKKwlpbnQgbWF4X2Nsa19kaXY7CisJaW50IGRpdjsKKworCWh3YTc0Mi5leHRpZi0+Z2V0X2Nsa19pbmZvKCZod2E3NDIuZXh0aWZfY2xrX3BlcmlvZCwgJm1heF9jbGtfZGl2KTsKKwlmb3IgKGRpdiA9IDE7IGRpdiA8IG1heF9jbGtfZGl2OyBkaXYrKykgeworCQlpZiAoY2FsY19yZWdfdGltaW5nKHN5c2NsaywgZGl2KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChkaXYgPiBtYXhfY2xrX2RpdikKKwkJZ290byBlcnI7CisKKwkqZXh0aWZfbWVtX2RpdiA9IGRpdjsKKworCWZvciAoZGl2ID0gMTsgZGl2IDwgbWF4X2Nsa19kaXY7IGRpdisrKSB7CisJCWlmIChjYWxjX2x1dF90aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlkZXZfZXJyKGh3YTc0Mi5mYmRldi0+ZGV2LCAiY2FuJ3Qgc2V0dXAgdGltaW5nc1xuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2h3YTc0Ml9jbGtfcmF0ZXModW5zaWduZWQgbG9uZyBleHRfY2xrLAorCQkJCXVuc2lnbmVkIGxvbmcgKnN5c19jbGssIHVuc2lnbmVkIGxvbmcgKnBpeF9jbGspCit7CisJaW50IHBpeF9jbGtfc3JjOworCWludCBzeXNfZGl2ID0gMCwgc3lzX211bCA9IDA7CisJaW50IHBpeF9kaXY7CisKKwlwaXhfY2xrX3NyYyA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfQ0xLX1NSQ19SRUcpOworCXBpeF9kaXYgPSAoKHBpeF9jbGtfc3JjID4+IDMpICYgMHgxZikgKyAxOworCWlmICgocGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpKSA9PSAwKSB7CisJCS8qIFNvdXJjZSBpcyB0aGUgUExMICovCisJCXN5c19kaXYgPSAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfRElWX1JFRykgJiAweDNmKSArIDE7CisJCXN5c19tdWwgPSAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfNF9SRUcpICYgMHg3ZikgKyAxOworCQkqc3lzX2NsayA9IGV4dF9jbGsgKiBzeXNfbXVsIC8gc3lzX2RpdjsKKwl9IGVsc2UJLyogZWxzZSBzb3VyY2UgaXMgZXh0IGNsaywgb3Igb3NjaWxsYXRvciAqLworCQkqc3lzX2NsayA9IGV4dF9jbGs7CisKKwkqcGl4X2NsayA9ICpzeXNfY2xrIC8gcGl4X2RpdjsJCQkvKiBIWiAqLworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsCisJCSJleHRfY2xrICVsZCBwaXhfc3JjICVkIHBpeF9kaXYgJWQgc3lzX2RpdiAlZCBzeXNfbXVsICVkXG4iLAorCQlleHRfY2xrLCBwaXhfY2xrX3NyYyAmICgweDMgPDwgMSksIHBpeF9kaXYsIHN5c19kaXYsIHN5c19tdWwpOworCWRldl9kYmcoaHdhNzQyLmZiZGV2LT5kZXYsICJzeXNfY2xrICVsZCBwaXhfY2xrICVsZFxuIiwKKwkJKnN5c19jbGssICpwaXhfY2xrKTsKK30KKworCitzdGF0aWMgaW50IHNldHVwX3RlYXJzeW5jKHVuc2lnbmVkIGxvbmcgcGl4X2NsaywgaW50IGV4dGlmX2RpdikKK3sKKwlpbnQgaGRpc3AsIHZkaXNwOworCWludCBobmRwLCB2bmRwOworCWludCBoc3csIHZzdzsKKwlpbnQgaHMsIHZzOworCWludCBoc19wb2xfaW52LCB2c19wb2xfaW52OworCWludCB1c2VfaHN2cywgdXNlX25kcDsKKwl1OCAgYjsKKworCWhzdyA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfSFNfV19SRUcpOworCXZzdyA9IGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVlNfV19SRUcpOworCWhzX3BvbF9pbnYgPSAhKGhzdyAmIDB4ODApOworCXZzX3BvbF9pbnYgPSAhKHZzdyAmIDB4ODApOworCWhzdyA9IGhzdyAmIDB4N2Y7CisJdnN3ID0gdnN3ICYgMHgzZjsKKworCWhkaXNwID0gKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfSF9ESVNQX1JFRykgJiAweDdmKSAqIDg7CisJdmRpc3AgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1ZfRElTUF8xX1JFRykgKworCQkoKGh3YTc0Ml9yZWFkX3JlZyhIV0E3NDJfVl9ESVNQXzJfUkVHKSAmIDB4MykgPDwgOCk7CisKKwlobmRwID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9IX05EUF9SRUcpICYgMHg3ZjsKKwl2bmRwID0gaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9WX05EUF9SRUcpOworCisJLyogdGltZSB0byB0cmFuc2ZlciBvbmUgcGl4ZWwgKDE2YnBwKSBpbiBwcyAqLworCWh3YTc0Mi5waXhfdHhfdGltZSA9IGh3YTc0Mi5yZWdfdGltaW5ncy53ZV9jeWNsZV90aW1lOworCWlmIChod2E3NDIuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgbWlnaHQgaGF2ZSBhIHJhdGUgbGltaXRhdGlvbiwKKwkJICogaWYgc28sIHdlIGhhdmUgdG8gbWF4aW1pemUgb3VyIHRyYW5zZmVyIHJhdGUuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIG1pbl90eF90aW1lOworCQl1bnNpZ25lZCBsb25nIG1heF90eF9yYXRlID0gaHdhNzQyLmV4dGlmLT5nZXRfbWF4X3R4X3JhdGUoKTsKKworCQlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LCAibWF4X3R4X3JhdGUgJWxkIEhaXG4iLAorCQkJbWF4X3R4X3JhdGUpOworCQltaW5fdHhfdGltZSA9IDEwMDAwMDAwMDAgLyAobWF4X3R4X3JhdGUgLyAxMDAwKTsgIC8qIHBzICovCisJCWlmIChod2E3NDIucGl4X3R4X3RpbWUgPCBtaW5fdHhfdGltZSkKKwkJCWh3YTc0Mi5waXhfdHhfdGltZSA9IG1pbl90eF90aW1lOworCX0KKworCS8qIHRpbWUgdG8gdXBkYXRlIG9uZSBsaW5lIGluIHBzICovCisJaHdhNzQyLmxpbmVfdXBkX3RpbWUgPSAoaGRpc3AgKyBobmRwKSAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOworCWh3YTc0Mi5saW5lX3VwZF90aW1lICo9IDEwMDA7CisJaWYgKGhkaXNwICogaHdhNzQyLnBpeF90eF90aW1lID4gaHdhNzQyLmxpbmVfdXBkX3RpbWUpCisJCS8qCisJCSAqIHRyYW5zZmVyIHNwZWVkIHRvbyBsb3csIHdlIG1pZ2h0IGhhdmUgdG8gdXNlIGJvdGgKKwkJICogSFMgYW5kIFZTCisJCSAqLworCQl1c2VfaHN2cyA9IDE7CisJZWxzZQorCQkvKiBkZWNlbnQgdHJhbnNmZXIgc3BlZWQsIHdlJ2xsIGFsd2F5cyB1c2Ugb25seSBWUyAqLworCQl1c2VfaHN2cyA9IDA7CisKKwlpZiAodXNlX2hzdnMgJiYgKGhzX3BvbF9pbnYgfHwgdnNfcG9sX2ludikpIHsKKwkJLyoKKwkJICogSFMgb3InZWQgd2l0aCBWUyBkb2Vzbid0IHdvcmssIHVzZSB0aGUgYWN0aXZlIGhpZ2gKKwkJICogVEUgc2lnbmFsIGJhc2VkIG9uIEhORFAgLyBWTkRQCisJCSAqLworCQl1c2VfbmRwID0gMTsKKwkJaHNfcG9sX2ludiA9IDA7CisJCXZzX3BvbF9pbnYgPSAwOworCQlocyA9IGhuZHA7CisJCXZzID0gdm5kcDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBVc2UgSFMgb3InZWQgd2l0aCBWUyBhcyBhIFRFIHNpZ25hbCBpZiBib3RoIGFyZSBuZWVkZWQKKwkJICogb3IgVk5EUCBpZiBvbmx5IHZzeW5jIGlzIG5lZWRlZC4KKwkJICovCisJCXVzZV9uZHAgPSAwOworCQlocyA9IGhzdzsKKwkJdnMgPSB2c3c7CisJCWlmICghdXNlX2hzdnMpIHsKKwkJCWhzX3BvbF9pbnYgPSAwOworCQkJdnNfcG9sX2ludiA9IDA7CisJCX0KKwl9CisKKwlocyA9IGhzICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CQkJLyogcHMgKi8KKwlocyAqPSAxMDAwOworCisJdnMgPSB2cyAqIChoZGlzcCArIGhuZHApICogMTAwMDAwMCAvIChwaXhfY2xrIC8gMTAwMCk7CS8qIHBzICovCisJdnMgKj0gMTAwMDsKKworCWlmICh2cyA8PSBocykKKwkJcmV0dXJuIC1FRE9NOworCS8qIHNldCBWUyB0byAxMjAlIG9mIEhTIHRvIG1pbmltaXplIFZTIGRldGVjdGlvbiB0aW1lICovCisJdnMgPSBocyAqIDEyIC8gMTA7CisJLyogbWluaW1pemUgSFMgdG9vICovCisJaHMgPSAxMDAwMDsKKworCWIgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX05EUF9DVFJMKTsKKwliICY9IH4weDM7CisJYiB8PSB1c2VfaHN2cyA/IDEgOiAwOworCWIgfD0gKHVzZV9uZHAgJiYgdXNlX2hzdnMpID8gMCA6IDI7CisJaHdhNzQyX3dyaXRlX3JlZyhIV0E3NDJfTkRQX0NUUkwsIGIpOworCisJaHdhNzQyLnZzeW5jX29ubHkgPSAhdXNlX2hzdnM7CisKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkicGl4X2NsayAlbGQgSFogcGl4X3R4X3RpbWUgJWxkIHBzIGxpbmVfdXBkX3RpbWUgJWxkIHBzXG4iLAorCQlwaXhfY2xrLCBod2E3NDIucGl4X3R4X3RpbWUsIGh3YTc0Mi5saW5lX3VwZF90aW1lKTsKKwlkZXZfZGJnKGh3YTc0Mi5mYmRldi0+ZGV2LAorCQkiaHMgJWQgcHMgdnMgJWQgcHMgbW9kZSAlZCB2c3luY19vbmx5ICVkXG4iLAorCQlocywgdnMsIChiICYgMHgzKSwgIXVzZV9oc3ZzKTsKKworCXJldHVybiBod2E3NDIuZXh0aWYtPnNldHVwX3RlYXJzeW5jKDEsIGhzLCB2cywKKwkJCQkJICAgIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYsIGV4dGlmX2Rpdik7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9nZXRfY2FwcyhpbnQgcGxhbmUsIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwlod2E3NDIuaW50X2N0cmwtPmdldF9jYXBzKHBsYW5lLCBjYXBzKTsKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX01BTlVBTF9VUERBVEUgfAorCQkgICAgICBPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFOworCWlmIChod2E3NDIudGVfY29ubmVjdGVkKQorCQljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBTX1RFQVJTWU5DOworCWNhcHMtPnduZF9jb2xvciB8PSAoMSA8PCBPTUFQRkJfQ09MT1JfUkdCNTY1KSB8CisJCQkgICAoMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIwKTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3N1c3BlbmQodm9pZCkKK3sKKwlod2E3NDIudXBkYXRlX21vZGVfYmVmb3JlX3N1c3BlbmQgPSBod2E3NDIudXBkYXRlX21vZGU7CisJaHdhNzQyX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwkvKiBFbmFibGUgc2xlZXAgbW9kZSAqLworCWh3YTc0Ml93cml0ZV9yZWcoSFdBNzQyX1BPV0VSX1NBVkUsIDEgPDwgMSk7CisJaWYgKGh3YTc0Mi5wb3dlcl9kb3duICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl9kb3duKGh3YTc0Mi5mYmRldi0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgaHdhNzQyX3Jlc3VtZSh2b2lkKQoreworCWlmIChod2E3NDIucG93ZXJfdXAgIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX3VwKGh3YTc0Mi5mYmRldi0+ZGV2KTsKKwkvKiBEaXNhYmxlIHNsZWVwIG1vZGUgKi8KKwlod2E3NDJfd3JpdGVfcmVnKEhXQTc0Ml9QT1dFUl9TQVZFLCAwKTsKKwl3aGlsZSAoMSkgeworCQkvKiBMb29wIHVudGlsIFBMTCBvdXRwdXQgaXMgc3RhYmlsaXplZCAqLworCQlpZiAoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfRElWX1JFRykgJiAoMSA8PCA3KSkKKwkJCWJyZWFrOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyg1KSk7CisJfQorCWh3YTc0Ml9zZXRfdXBkYXRlX21vZGUoaHdhNzQyLnVwZGF0ZV9tb2RlX2JlZm9yZV9zdXNwZW5kKTsKK30KKworc3RhdGljIGludCBod2E3NDJfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBleHRfbW9kZSwKKwkJICAgICAgIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQoreworCWludCByID0gMCwgaTsKKwl1OCByZXYsIGNvbmY7CisJdW5zaWduZWQgbG9uZyBleHRfY2xrOworCXVuc2lnbmVkIGxvbmcgc3lzX2NsaywgcGl4X2NsazsKKwlpbnQgZXh0aWZfbWVtX2RpdjsKKwlzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgKm9tYXBmYl9jb25mOworCXN0cnVjdCBod2E3NDJfcGxhdGZvcm1fZGF0YSAqY3RybF9jb25mOworCisJQlVHX09OKCFmYmRldi0+ZXh0X2lmIHx8ICFmYmRldi0+aW50X2N0cmwpOworCisJaHdhNzQyLmZiZGV2ID0gZmJkZXY7CisJaHdhNzQyLmV4dGlmID0gZmJkZXYtPmV4dF9pZjsKKwlod2E3NDIuaW50X2N0cmwgPSBmYmRldi0+aW50X2N0cmw7CisKKwlvbWFwZmJfY29uZiA9IGZiZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJY3RybF9jb25mID0gb21hcGZiX2NvbmYtPmN0cmxfcGxhdGZvcm1fZGF0YTsKKworCWlmIChjdHJsX2NvbmYgPT0gTlVMTCB8fCBjdHJsX2NvbmYtPmdldF9jbG9ja19yYXRlID09IE5VTEwpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiSFdBNzQyOiBtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyID0gLUVOT0VOVDsKKwkJZ290byBlcnIxOworCX0KKworCWh3YTc0Mi5wb3dlcl9kb3duID0gY3RybF9jb25mLT5wb3dlcl9kb3duOworCWh3YTc0Mi5wb3dlcl91cCA9IGN0cmxfY29uZi0+cG93ZXJfdXA7CisKKwlzcGluX2xvY2tfaW5pdCgmaHdhNzQyLnJlcV9sb2NrKTsKKworCWlmICgociA9IGh3YTc0Mi5pbnRfY3RybC0+aW5pdChmYmRldiwgMSwgcmVxX3ZyYW0pKSA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmICgociA9IGh3YTc0Mi5leHRpZi0+aW5pdChmYmRldikpIDwgMCkKKwkJZ290byBlcnIyOworCisJZXh0X2NsayA9IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUoZmJkZXYtPmRldik7CisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKGV4dF9jbGssICZleHRpZl9tZW1fZGl2KSkgPCAwKQorCQlnb3RvIGVycjM7CisJaHdhNzQyLmV4dGlmLT5zZXRfdGltaW5ncygmaHdhNzQyLnJlZ190aW1pbmdzKTsKKwlpZiAoaHdhNzQyLnBvd2VyX3VwICE9IE5VTEwpCisJCWh3YTc0Mi5wb3dlcl91cChmYmRldi0+ZGV2KTsKKworCWNhbGNfaHdhNzQyX2Nsa19yYXRlcyhleHRfY2xrLCAmc3lzX2NsaywgJnBpeF9jbGspOworCWlmICgociA9IGNhbGNfZXh0aWZfdGltaW5ncyhzeXNfY2xrLCAmZXh0aWZfbWVtX2RpdikpIDwgMCkKKwkJZ290byBlcnI0OworCWh3YTc0Mi5leHRpZi0+c2V0X3RpbWluZ3MoJmh3YTc0Mi5yZWdfdGltaW5ncyk7CisKKwlyZXYgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX1JFVl9DT0RFX1JFRyk7CisJaWYgKChyZXYgJiAweGZjKSAhPSAweDgwKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgIkhXQTc0MjogaW52YWxpZCByZXZpc2lvbiAlMDJ4XG4iLCByZXYpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI0OworCX0KKworCisJaWYgKCEoaHdhNzQyX3JlYWRfcmVnKEhXQTc0Ml9QTExfRElWX1JFRykgJiAweDgwKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCSAgICAgICJIV0E3NDI6IGNvbnRyb2xsZXIgbm90IGluaXRpYWxpemVkIGJ5IHRoZSBib290bG9hZGVyXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyNDsKKwl9CisKKwlpZiAoY3RybF9jb25mLT50ZV9jb25uZWN0ZWQpIHsKKwkJaWYgKChyID0gc2V0dXBfdGVhcnN5bmMocGl4X2NsaywgZXh0aWZfbWVtX2RpdikpIDwgMCkgeworCQkJZGV2X2Vycihod2E3NDIuZmJkZXYtPmRldiwKKwkJCSAgICAgICAiSFdBNzQyOiBjYW4ndCBzZXR1cCB0ZWFyaW5nIHN5bmNocm9uaXphdGlvblxuIik7CisJCQlnb3RvIGVycjQ7CisJCX0KKwkJaHdhNzQyLnRlX2Nvbm5lY3RlZCA9IDE7CisJfQorCisJaHdhNzQyLm1heF90cmFuc21pdF9zaXplID0gaHdhNzQyLmV4dGlmLT5tYXhfdHJhbnNtaXRfc2l6ZTsKKworCWh3YTc0Mi51cGRhdGVfbW9kZSA9IE9NQVBGQl9VUERBVEVfRElTQUJMRUQ7CisKKwlod2E3NDIuYXV0b191cGRhdGVfd2luZG93LnggPSAwOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cueSA9IDA7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy53aWR0aCA9IGZiZGV2LT5wYW5lbC0+eF9yZXM7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3dpbmRvdy5oZWlnaHQgPSBmYmRldi0+cGFuZWwtPnlfcmVzOworCWh3YTc0Mi5hdXRvX3VwZGF0ZV93aW5kb3cuZm9ybWF0ID0gMDsKKworCWluaXRfdGltZXIoJmh3YTc0Mi5hdXRvX3VwZGF0ZV90aW1lcik7CisJaHdhNzQyLmF1dG9fdXBkYXRlX3RpbWVyLmZ1bmN0aW9uID0gaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXV0bzsKKwlod2E3NDIuYXV0b191cGRhdGVfdGltZXIuZGF0YSA9IDA7CisKKwlod2E3NDIucHJldl9jb2xvcl9tb2RlID0gLTE7CisJaHdhNzQyLnByZXZfZmxhZ3MgPSAwOworCisJaHdhNzQyLmZiZGV2ID0gZmJkZXY7CisKKwlJTklUX0xJU1RfSEVBRCgmaHdhNzQyLmZyZWVfcmVxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZod2E3NDIucGVuZGluZ19yZXFfbGlzdCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdhNzQyLnJlcV9wb29sKTsgaSsrKQorCQlsaXN0X2FkZCgmaHdhNzQyLnJlcV9wb29sW2ldLmVudHJ5LCAmaHdhNzQyLmZyZWVfcmVxX2xpc3QpOworCUJVR19PTihpIDw9IElSUV9SRVFfUE9PTF9TSVpFKTsKKwlzZW1hX2luaXQoJmh3YTc0Mi5yZXFfc2VtYSwgaSAtIElSUV9SRVFfUE9PTF9TSVpFKTsKKworCWNvbmYgPSBod2E3NDJfcmVhZF9yZWcoSFdBNzQyX0NPTkZJR19SRUcpOworCWRldl9pbmZvKGZiZGV2LT5kZXYsICI6IEVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKworCXJldHVybiAwOworZXJyNDoKKwlpZiAoaHdhNzQyLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX2Rvd24oZmJkZXYtPmRldik7CitlcnIzOgorCWh3YTc0Mi5leHRpZi0+Y2xlYW51cCgpOworZXJyMjoKKwlod2E3NDIuaW50X2N0cmwtPmNsZWFudXAoKTsKK2VycjE6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGh3YTc0Ml9jbGVhbnVwKHZvaWQpCit7CisJaHdhNzQyX3NldF91cGRhdGVfbW9kZShPTUFQRkJfVVBEQVRFX0RJU0FCTEVEKTsKKwlod2E3NDIuZXh0aWYtPmNsZWFudXAoKTsKKwlod2E3NDIuaW50X2N0cmwtPmNsZWFudXAoKTsKKwlpZiAoaHdhNzQyLnBvd2VyX2Rvd24gIT0gTlVMTCkKKwkJaHdhNzQyLnBvd2VyX2Rvd24oaHdhNzQyLmZiZGV2LT5kZXYpOworfQorCitzdHJ1Y3QgbGNkX2N0cmwgaHdhNzQyX2N0cmwgPSB7CisJLm5hbWUJCQk9ICJod2E3NDIiLAorCS5pbml0CQkJPSBod2E3NDJfaW5pdCwKKwkuY2xlYW51cAkJPSBod2E3NDJfY2xlYW51cCwKKwkuYmluZF9jbGllbnQJCT0gaHdhNzQyX2JpbmRfY2xpZW50LAorCS5nZXRfY2FwcwkJPSBod2E3NDJfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IGh3YTc0Ml9zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IGh3YTc0Ml9nZXRfdXBkYXRlX21vZGUsCisJLnNldHVwX3BsYW5lCQk9IGh3YTc0Ml9zZXR1cF9wbGFuZSwKKwkuZW5hYmxlX3BsYW5lCQk9IGh3YTc0Ml9lbmFibGVfcGxhbmUsCisJLnVwZGF0ZV93aW5kb3cJCT0gaHdhNzQyX3VwZGF0ZV93aW5kb3dfYXN5bmMsCisJLnN5bmMJCQk9IGh3YTc0Ml9zeW5jLAorCS5zdXNwZW5kCQk9IGh3YTc0Ml9zdXNwZW5kLAorCS5yZXN1bWUJCQk9IGh3YTc0Ml9yZXN1bWUsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2gzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4MDdiNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDMuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBIMyBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNkZWZpbmUgTU9EVUxFX05BTUUJIm9tYXBmYi1sY2RfaDMiCisKKyNkZWZpbmUgcHJfZXJyKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIE1PRFVMRV9OQU1FICI6ICIgZm10LCAjIyBhcmdzKQorCitzdGF0aWMgaW50IGgzX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaDNfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBoM19wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJaW50IHIgPSAwOworCisJLyogR1BJTzEgYW5kIEdQSU8yIG9mIFRQUzY1MDEwIHNlbmQgTENEX0VOQktMIGFuZCBMQ0RfRU5WREQgc2lnbmFscyAqLworCXIgPSB0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzEsIEhJR0gpOworCWlmICghcikKKwkJciA9IHRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMiwgSElHSCk7CisJaWYgKHIpCisJCXByX2VycigiVW5hYmxlIHRvIHR1cm4gb24gTENEIHBhbmVsXG4iKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBoM19wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCWludCByID0gMDsKKworCS8qIEdQSU8xIGFuZCBHUElPMiBvZiBUUFM2NTAxMCBzZW5kIExDRF9FTkJLTCBhbmQgTENEX0VOVkREIHNpZ25hbHMgKi8KKwlyID0gdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8xLCBMT1cpOworCWlmICghcikKKwkJdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8yLCBMT1cpOworCWlmIChyKQorCQlwcl9lcnIoIlVuYWJsZSB0byB0dXJuIG9mZiBMQ0QgcGFuZWxcbiIpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoM19wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBoM19wYW5lbCA9IHsKKwkubmFtZQkJPSAiaDMiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5kYXRhX2xpbmVzCT0gMTYsCisJLmJwcAkJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTIwMDAsCisJLmhzdwkJPSAxMiwKKwkuaGZwCQk9IDE0LAorCS5oYnAJCT0gNzIgLSAxMiwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMCwKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBoM19wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaDNfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGgzX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGgzX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaDNfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGgzX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZoM19wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoM19wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoM19wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGgzX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gaDNfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaDNfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGgzX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX2gzIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaDNfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoM19wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBoM19wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoM19wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChoM19wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChoM19wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZmMGViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9oNC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQIEg0IGJvYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworc3RhdGljIGludCBoNF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLCBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGg0X3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoNF9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoNF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBoNF9wYW5lbCA9IHsKKwkubmFtZQkJPSAiaDQiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gNjI1MCwKKwkuaHN3CQk9IDE1LAorCS5oZnAJCT0gMTUsCisJLmhicAkJPSA2MCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMSwKKworCS5pbml0CQk9IGg0X3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBoNF9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gaDRfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaDRfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBoNF9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgaDRfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmg0X3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoNF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGg0X3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGg0X3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaDRfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBoNF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBoNF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaDRfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaDQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBoNF9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmg0X3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGg0X3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmg0X3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGg0X3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGg0X3BhbmVsX2Rydl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX2lubjE1MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTFmMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNTEwLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMQ0QgcGFuZWwgc3VwcG9ydCBmb3IgdGhlIFRJIE9NQVAxNTEwIElubm92YXRvciBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCSAgICBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE1MTBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlmcGdhX3dyaXRlKDB4NywgT01BUDE1MTBfRlBHQV9MQ0RfUEFORUxfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE1MTBfcGFuZWxfZGlzYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlmcGdhX3dyaXRlKDB4MCwgT01BUDE1MTBfRlBHQV9MQ0RfUEFORUxfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlubm92YXRvcjE1MTBfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgaW5ub3ZhdG9yMTUxMF9wYW5lbCA9IHsKKwkubmFtZQkJPSAiaW5uMTUxMCIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZULAorCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAyNDAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSAxMjUwMCwKKwkuaHN3CQk9IDQwLAorCS5oZnAJCT0gNDAsCisJLmhicAkJPSA3MiwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSAxLAorCS52YnAJCT0gMCwKKwkucGNkCQk9IDEyLAorCisJLmluaXQJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBpbm5vdmF0b3IxNTEwX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmaW5ub3ZhdG9yMTUxMF9wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbm5vdmF0b3IxNTEwX3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICAgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbm5vdmF0b3IxNTEwX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IGlubm92YXRvcjE1MTBfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaW5ub3ZhdG9yMTUxMF9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9pbm4xNTEwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlubm92YXRvcjE1MTBfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpbm5vdmF0b3IxNTEwX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlubm92YXRvcjE1MTBfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoaW5ub3ZhdG9yMTUxMF9wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9pbm4xNjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2MDRjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfaW5uMTYxMC5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBUSSBPTUFQMTYxMCBJbm5vdmF0b3IgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwZmIuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRQkib21hcGZiLWxjZF9oMyIKKworI2RlZmluZSBwcl9lcnIoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgTU9EVUxFX05BTUUgIjogIiBmbXQsICMjIGFyZ3MpCisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCSAgICBzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJaW50IHIgPSAwOworCisJaWYgKG9tYXBfcmVxdWVzdF9ncGlvKDE0KSkgeworCQlwcl9lcnIoImNhbid0IHJlcXVlc3QgR1BJTyAxNFxuIik7CisJCXIgPSAtMTsKKwkJZ290byBleGl0OworCX0KKwlpZiAob21hcF9yZXF1ZXN0X2dwaW8oMTUpKSB7CisJCXByX2VycigiY2FuJ3QgcmVxdWVzdCBHUElPIDE1XG4iKTsKKwkJb21hcF9mcmVlX2dwaW8oMTQpOworCQlyID0gLTE7CisJCWdvdG8gZXhpdDsKKwl9CisJLyogY29uZmlndXJlIEdQSU8oMTQsIDE1KSBhcyBvdXRwdXRzICovCisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMTQsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDE1LCAwKTsKK2V4aXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE2MTBfcGFuZWxfY2xlYW51cChzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlvbWFwX2ZyZWVfZ3BpbygxNSk7CisJb21hcF9mcmVlX2dwaW8oMTQpOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfZW5hYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIHNldCBHUElPMTQgYW5kIEdQSU8xNSBoaWdoICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE0LCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTUsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbm5vdmF0b3IxNjEwX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJLyogc2V0IEdQSU8xMywgR1BJTzE0IGFuZCBHUElPMTUgbG93ICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDE0LCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMTUsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbm5vdmF0b3IxNjEwX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIGlubm92YXRvcjE2MTBfcGFuZWwgPSB7CisJLm5hbWUJCT0gImlubjE2MTAiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMzIwLAorCS55X3JlcwkJPSAyNDAsCisJLnBpeGVsX2Nsb2NrCT0gMTI1MDAsCisJLmhzdwkJPSA0MCwKKwkuaGZwCQk9IDQwLAorCS5oYnAJCT0gNzIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAxMiwKKworCS5pbml0CQk9IGlubm92YXRvcjE2MTBfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IGlubm92YXRvcjE2MTBfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gaW5ub3ZhdG9yMTYxMF9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IGlubm92YXRvcjE2MTBfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJmlubm92YXRvcjE2MTBfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub3ZhdG9yMTYxMF9wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBpbm5vdmF0b3IxNjEwX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGlubm92YXRvcjE2MTBfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGlubm92YXRvcjE2MTBfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2RfaW5uMTYxMCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpbm5vdmF0b3IxNjEwX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaW5ub3ZhdG9yMTYxMF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbm5vdmF0b3IxNjEwX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KGlubm92YXRvcjE2MTBfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX29zay5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzgwMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9vc2suYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciB0aGUgVEkgT01BUCBPU0sgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICogQWRhcHRlZCBmb3IgT1NLIGJ5IDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NrX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwkvKiBjb25maWd1cmUgUFdMIHBpbiAqLworCW9tYXBfY2ZnX3JlZyhQV0wpOworCisJLyogRW5hYmxlIFBXTCB1bml0ICovCisJb21hcF93cml0ZWIoMHgwMSwgT01BUF9QV0xfQ0xLX0VOQUJMRSk7CisKKwkvKiBTZXQgUFdMIGxldmVsICovCisJb21hcF93cml0ZWIoMHhGRiwgT01BUF9QV0xfRU5BQkxFKTsKKworCS8qIGNvbmZpZ3VyZSBHUElPMiBhcyBvdXRwdXQgKi8KKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigyLCAwKTsKKworCS8qIHNldCBHUElPMiBoaWdoICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDIsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9za19wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCS8qIFNldCBQV0wgbGV2ZWwgdG8gemVybyAqLworCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfUFdMX0VOQUJMRSk7CisKKwkvKiBEaXNhYmxlIFBXTCB1bml0ICovCisJb21hcF93cml0ZWIoMHgwMCwgT01BUF9QV0xfQ0xLX0VOQUJMRSk7CisKKwkvKiBzZXQgR1BJTzIgbG93ICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDIsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvc2tfcGFuZWxfZ2V0X2NhcHMoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBsY2RfcGFuZWwgb3NrX3BhbmVsID0geworCS5uYW1lCQk9ICJvc2siLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCwKKworCS5icHAJCT0gMTYsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkueF9yZXMJCT0gMjQwLAorCS55X3JlcwkJPSAzMjAsCisJLnBpeGVsX2Nsb2NrCT0gMTI1MDAsCisJLmhzdwkJPSA0MCwKKwkuaGZwCQk9IDQwLAorCS5oYnAJCT0gNzIsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gMSwKKwkudmJwCQk9IDAsCisJLnBjZAkJPSAxMiwKKworCS5pbml0CQk9IG9za19wYW5lbF9pbml0LAorCS5jbGVhbnVwCT0gb3NrX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBvc2tfcGFuZWxfZW5hYmxlLAorCS5kaXNhYmxlCT0gb3NrX3BhbmVsX2Rpc2FibGUsCisJLmdldF9jYXBzCT0gb3NrX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBvc2tfcGFuZWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoJm9za19wYW5lbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9za19wYW5lbF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvc2tfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBvc2tfcGFuZWxfcHJvYmUsCisJLnJlbW92ZQkJPSBvc2tfcGFuZWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gb3NrX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvc2tfcGFuZWxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2Rfb3NrIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgb3NrX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb3NrX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIG9za19wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvc2tfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3NrX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KG9za19wYW5lbF9kcnZfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXRlLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYmRmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10ZS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBQYWxtIFR1bmdzdGVuIEUKKyAqCisgKiBPcmlnaW5hbCB2ZXJzaW9uIDogUm9tYWluIEdveWV0IDxyLmdveWV0QGdtYWlsLmNvbT4KKyAqIEN1cnJlbnQgdmVyc2lvbiA6IExhdXJlbnQgR29uemFsZXogPHBhbG10ZS5saW51eEBmcmVlLmZyPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXRlX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXRlX3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhbG10ZV9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBwYWxtdGVfcGFuZWwgPSB7CisJLm5hbWUJCT0gInBhbG10ZSIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQkgIE9NQVBfTENEQ19JTlZfSFNZTkMgfCBPTUFQX0xDRENfSFNWU19SSVNJTkdfRURHRSB8CisJCQkgIE9NQVBfTENEQ19IU1ZTX09QUE9TSVRFLAorCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDgsCisJLnBpeGVsX2Nsb2NrCT0gMTIwMDAsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMzIwLAorCS5oc3cJCT0gNCwKKwkuaGZwCQk9IDgsCisJLmhicAkJPSAyOCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSA4LAorCS52YnAJCT0gNywKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBwYWxtdGVfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IHBhbG10ZV9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gcGFsbXRlX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBhbG10ZV9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IHBhbG10ZV9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgcGFsbXRlX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZwYWxtdGVfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdGVfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGFsbXRlX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcGFsbXRlX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gcGFsbXRlX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHBhbG10ZV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcGFsbXRlX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX3BhbG10ZSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IHBhbG10ZV9wYW5lbF9kcnZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBhbG10ZV9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBwYWxtdGVfcGFuZWxfZHJ2X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGFsbXRlX3BhbmVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBhbG10ZV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChwYWxtdGVfcGFuZWxfZHJ2X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3BhbG10dC5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIzNDlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtdHQuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIExDRCBwYW5lbCBzdXBwb3J0IGZvciBQYWxtIFR1bmdzdGVufFQKKyAqIEN1cnJlbnQgdmVyc2lvbiA6IE1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+CisgKgorICogTW9kaWZpZWQgZnJvbSBsY2RfaW5uMTUxMC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyoKK0dQSU8xMSAtIGJhY2tsaWdodAorR1BJTzEyIC0gc2NyZWVuIGJsYW5raW5nCitHUElPMTMgLSBzY3JlZW4gYmxhbmtpbmcKKyovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXR0X3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXR0X3BhbmVsX2Rpc2FibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhbG10dF9wYW5lbF9nZXRfY2FwcyhzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gT01BUEZCX0NBUFNfU0VUX0JBQ0tMSUdIVDsKK30KKworc3RydWN0IGxjZF9wYW5lbCBwYWxtdHRfcGFuZWwgPSB7CisJLm5hbWUJCT0gInBhbG10dCIsCisJLmNvbmZpZwkJPSBPTUFQX0xDRENfUEFORUxfVEZUIHwgT01BUF9MQ0RDX0lOVl9WU1lOQyB8CisJCQlPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgfAorCQkJT01BUF9MQ0RDX0hTVlNfT1BQT1NJVEUsCisJLmJwcAkJPSAxNiwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS54X3JlcwkJPSAzMjAsCisJLnlfcmVzCQk9IDMyMCwKKwkucGl4ZWxfY2xvY2sJPSAxMDAwMCwKKwkuaHN3CQk9IDQsCisJLmhmcAkJPSA4LAorCS5oYnAJCT0gMjgsCisJLnZzdwkJPSAxLAorCS52ZnAJCT0gOCwKKwkudmJwCQk9IDcsCisJLnBjZAkJPSAwLAorCisJLmluaXQJCT0gcGFsbXR0X3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBwYWxtdHRfcGFuZWxfY2xlYW51cCwKKwkuZW5hYmxlCQk9IHBhbG10dF9wYW5lbF9lbmFibGUsCisJLmRpc2FibGUJPSBwYWxtdHRfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBwYWxtdHRfcGFuZWxfZ2V0X2NhcHMsCit9OworCitzdGF0aWMgaW50IHBhbG10dF9wYW5lbF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9tYXBmYl9yZWdpc3Rlcl9wYW5lbCgmcGFsbXR0X3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFsbXR0X3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBhbG10dF9wYW5lbF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBhbG10dF9wYW5lbF9wcm9iZSwKKwkucmVtb3ZlCQk9IHBhbG10dF9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBwYWxtdHRfcGFuZWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHBhbG10dF9wYW5lbF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImxjZF9wYWxtdHQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBwYWxtdHRfcGFuZWxfZHJ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwYWxtdHRfcGFuZWxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgcGFsbXR0X3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhbG10dF9wYW5lbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwYWxtdHRfcGFuZWxfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQocGFsbXR0X3BhbmVsX2Rydl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZF9wYWxtejcxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2MTcwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9sY2RfcGFsbXo3MS5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBQYWxtIFppcmU3MQorICoKKyAqIE9yaWdpbmFsIHZlcnNpb24gOiBSb21haW4gR295ZXQKKyAqIEN1cnJlbnQgdmVyc2lvbiA6IExhdXJlbnQgR29uemFsZXoKKyAqIE1vZGlmaWVkIGZvciB6aXJlNzEgOiBNYXJlayBWYXN1dAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKK3N0YXRpYyBpbnQgcGFsbXo3MV9wYW5lbF9pbml0KHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsLAorCQkJICAgICAgc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYWxtejcxX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX2VuYWJsZShzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFsbXo3MV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWxtejcxX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiBPTUFQRkJfQ0FQU19TRVRfQkFDS0xJR0hUOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIHBhbG16NzFfcGFuZWwgPSB7CisJLm5hbWUJCT0gInBhbG16NzEiLAorCS5jb25maWcJCT0gT01BUF9MQ0RDX1BBTkVMX1RGVCB8IE9NQVBfTENEQ19JTlZfVlNZTkMgfAorCQkJICBPTUFQX0xDRENfSU5WX0hTWU5DIHwgT01BUF9MQ0RDX0hTVlNfUklTSU5HX0VER0UgfAorCQkJICBPTUFQX0xDRENfSFNWU19PUFBPU0lURSwKKwkuZGF0YV9saW5lcwk9IDE2LAorCS5icHAJCT0gMTYsCisJLnBpeGVsX2Nsb2NrCT0gMjQwMDAsCisJLnhfcmVzCQk9IDMyMCwKKwkueV9yZXMJCT0gMzIwLAorCS5oc3cJCT0gNCwKKwkuaGZwCQk9IDgsCisJLmhicAkJPSAyOCwKKwkudnN3CQk9IDEsCisJLnZmcAkJPSA4LAorCS52YnAJCT0gNywKKwkucGNkCQk9IDAsCisKKwkuaW5pdAkJPSBwYWxtejcxX3BhbmVsX2luaXQsCisJLmNsZWFudXAJPSBwYWxtejcxX3BhbmVsX2NsZWFudXAsCisJLmVuYWJsZQkJPSBwYWxtejcxX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBhbG16NzFfcGFuZWxfZGlzYWJsZSwKKwkuZ2V0X2NhcHMJPSBwYWxtejcxX3BhbmVsX2dldF9jYXBzLAorfTsKKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZwYWxtejcxX3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhbG16NzFfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBhbG16NzFfcGFuZWxfZHJpdmVyID0geworCS5wcm9iZQkJPSBwYWxtejcxX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gcGFsbXo3MV9wYW5lbF9yZW1vdmUsCisJLnN1c3BlbmQJPSBwYWxtejcxX3BhbmVsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYWxtejcxX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibGNkX3BhbG16NzEiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBwYWxtejcxX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcGFsbXo3MV9wYW5lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBwYWxtejcxX3BhbmVsX2Rydl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBhbG16NzFfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGFsbXo3MV9wYW5lbF9kcnZfaW5pdCk7Cittb2R1bGVfZXhpdChwYWxtejcxX3BhbmVsX2Rydl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9sY2Rfc3gxLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZjMwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkX3N4MS5jCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogTENEIHBhbmVsIHN1cHBvcnQgZm9yIHRoZSBTaWVtZW5zIFNYMSBtb2JpbGUgcGhvbmUKKyAqCisgKiBDdXJyZW50IHZlcnNpb24gOiBWb3Zhbjg4OEBnbWFpbC5jb20sIGdyZWF0IGhlbHAgZnJvbSBGQ0EwMDAwMAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWNic3AuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKworLyoKKyAqIE9NQVAzMTAgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBHUElPX0RBVEFfSU5QVVQJCTB4ZmZmY2UwMDAKKyNkZWZpbmUgR1BJT19EQVRBX09VVFBVVAkweGZmZmNlMDA0CisjZGVmaW5lIEdQSU9fRElSX0NPTlRST0wJMHhmZmZjZTAwOAorI2RlZmluZSBHUElPX0lOVF9DT05UUk9MCTB4ZmZmY2UwMGMKKyNkZWZpbmUgR1BJT19JTlRfTUFTSwkJMHhmZmZjZTAxMAorI2RlZmluZSBHUElPX0lOVF9TVEFUVVMJCTB4ZmZmY2UwMTQKKyNkZWZpbmUgR1BJT19QSU5fQ09OVFJPTAkweGZmZmNlMDE4CisKKworI2RlZmluZSBBX0xDRF9TU0NfUkQJMworI2RlZmluZSBBX0xDRF9TU0NfU0QJNworI2RlZmluZSBfQV9MQ0RfUkVTRVQJOQorI2RlZmluZSBfQV9MQ0RfU1NDX0NTCTEyCisjZGVmaW5lIF9BX0xDRF9TU0NfQTAJMTMKKworI2RlZmluZSBEU1BfUkVHCQkweEUxMDE3MDI0CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgSU5JVF8xWzEyXSA9IHsKKwkweDFDLCAweDAyLCAweDg4LCAweDAwLCAweDFFLCAweEUwLCAweDAwLCAweERDLCAweDAwLCAweDAyLCAweDAwCit9OworCitjb25zdCB1bnNpZ25lZCBjaGFyIElOSVRfMlsxMjddID0geworCTB4MTUsIDB4MDAsIDB4MjksIDB4MDAsIDB4M0UsIDB4MDAsIDB4NTEsIDB4MDAsCisJMHg2NSwgMHgwMCwgMHg3QSwgMHgwMCwgMHg4RCwgMHgwMCwgMHhBMSwgMHgwMCwKKwkweEI2LCAweDAwLCAweEM3LCAweDAwLCAweEQ4LCAweDAwLCAweEVCLCAweDAwLAorCTB4RkIsIDB4MDAsIDB4MEIsIDB4MDEsIDB4MUIsIDB4MDEsIDB4MjcsIDB4MDEsCisJMHgzNCwgMHgwMSwgMHg0MSwgMHgwMSwgMHg0QywgMHgwMSwgMHg1NSwgMHgwMSwKKwkweDVGLCAweDAxLCAweDY4LCAweDAxLCAweDcwLCAweDAxLCAweDc4LCAweDAxLAorCTB4N0UsIDB4MDEsIDB4ODYsIDB4MDEsIDB4OEMsIDB4MDEsIDB4OTQsIDB4MDEsCisJMHg5QiwgMHgwMSwgMHhBMSwgMHgwMSwgMHhBNCwgMHgwMSwgMHhBOSwgMHgwMSwKKwkweEFELCAweDAxLCAweEIyLCAweDAxLCAweEI3LCAweDAxLCAweEJDLCAweDAxLAorCTB4QzAsIDB4MDEsIDB4QzQsIDB4MDEsIDB4QzgsIDB4MDEsIDB4Q0IsIDB4MDEsCisJMHhDRiwgMHgwMSwgMHhEMiwgMHgwMSwgMHhENSwgMHgwMSwgMHhEOCwgMHgwMSwKKwkweERCLCAweDAxLCAweEUwLCAweDAxLCAweEUzLCAweDAxLCAweEU2LCAweDAxLAorCTB4RTgsIDB4MDEsIDB4RUIsIDB4MDEsIDB4RUUsIDB4MDEsIDB4RjEsIDB4MDEsCisJMHhGMywgMHgwMSwgMHhGOCwgMHgwMSwgMHhGOSwgMHgwMSwgMHhGQywgMHgwMSwKKwkweDAwLCAweDAyLCAweDAzLCAweDAyLCAweDA3LCAweDAyLCAweDA5LCAweDAyLAorCTB4MEUsIDB4MDIsIDB4MTMsIDB4MDIsIDB4MUMsIDB4MDIsIDB4MDAKK307CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgSU5JVF8zWzE1XSA9IHsKKwkweDE0LCAweDI2LCAweDMzLCAweDNELCAweDQ1LCAweDRELCAweDUzLCAweDU5LAorCTB4NUUsIDB4NjMsIDB4NjcsIDB4NkQsIDB4NzEsIDB4NzgsIDB4RkYKK307CisKK3N0YXRpYyB2b2lkIGVwc29uX3NlbmRieXRlKGludCBmbGFnLCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaW50IGksIHNoaWZ0ZXIgPSAweDgwOworCisJaWYgKCFmbGFnKQorCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19BMCwgMCk7CisJbWRlbGF5KDIpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfUkQsIDEpOworCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEFfTENEX1NTQ19TRCwgZmxhZyk7CisKKwlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDApOworCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlPTUFQX01DQlNQX1dSSVRFKE9NQVAxNTEwX01DQlNQM19CQVNFLCBQQ1IwLCAweDIyMDApOworCQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCBzaGlmdGVyICYgYnl0ZSk7CisJCU9NQVBfTUNCU1BfV1JJVEUoT01BUDE1MTBfTUNCU1AzX0JBU0UsIFBDUjAsIDB4MjIwMik7CisJCXNoaWZ0ZXIgPj49IDE7CisJfQorCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0EwLCAxKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9zeXN0ZW0odm9pZCkKK3sKKwlvbWFwX21jYnNwX3JlcXVlc3QoT01BUF9NQ0JTUDMpOworCW9tYXBfbWNic3Bfc3RvcChPTUFQX01DQlNQMyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX0dQSU8odm9pZCkKK3sKKwkvKiBuZXcgd2F2ZSAqLworCW9tYXBfcmVxdWVzdF9ncGlvKEFfTENEX1NTQ19SRCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oQV9MQ0RfU1NDX1NEKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbyhfQV9MQ0RfUkVTRVQpOworCW9tYXBfcmVxdWVzdF9ncGlvKF9BX0xDRF9TU0NfQ1MpOworCW9tYXBfcmVxdWVzdF9ncGlvKF9BX0xDRF9TU0NfQTApOworCisJLyogc2V0IGFsbCBHUElPcyB0byBvdXRwdXQgKi8KKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihBX0xDRF9TU0NfUkQsIDApOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKEFfTENEX1NTQ19TRCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oX0FfTENEX1JFU0VULCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihfQV9MQ0RfU1NDX0NTLCAwKTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihfQV9MQ0RfU1NDX0EwLCAwKTsKKworCS8qIHNldCBHUElPIGRhdGEgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1JELCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoQV9MQ0RfU1NDX1NELCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1JFU0VULCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQTAsIDEpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCW9tYXBfY2ZnX3JlZyhNQ0JTUDNfQ0xLWCk7CisKKwltZGVsYXkoMik7CisJc2V0dXBfR1BJTygpOworCW1kZWxheSgyKTsKKworCS8qIHJlc2V0IExDRCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChBX0xDRF9TU0NfU0QsIDEpOworCWVwc29uX3NlbmRieXRlKDAsIDB4MjUpOworCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9SRVNFVCwgMCk7CisJbWRlbGF5KDEwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1JFU0VULCAxKTsKKworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwltZGVsYXkoMik7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QsIHBoYXNlIDEgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweENBKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJZXBzb25fc2VuZGJ5dGUoMSwgSU5JVF8xW2ldKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgMiAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4Q0IpOworCWZvciAoaSA9IDA7IGkgPCAxMjU7IGkrKykKKwkJZXBzb25fc2VuZGJ5dGUoMSwgSU5JVF8yW2ldKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgMmEgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweENDKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJZXBzb25fc2VuZGJ5dGUoMSwgSU5JVF8zW2ldKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgMyAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4QkMpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDgpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA0ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHgwNyk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwNSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDUgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweDk0KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNiAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4QzYpOworCWVwc29uX3NlbmRieXRlKDEsIDB4ODApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwltZGVsYXkoMTAwKTsgLyogdXNlZCB0byBiZSAxMDAwICovCisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJLyogaW5pdCBMQ0QgcGhhc2UgNyAqLworCWVwc29uX3NlbmRieXRlKDAsIDB4MTYpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDIpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCWVwc29uX3NlbmRieXRlKDEsIDB4QjEpOworCWVwc29uX3NlbmRieXRlKDEsIDB4MDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwkvKiBpbml0IExDRCBwaGFzZSA4ICovCisJZXBzb25fc2VuZGJ5dGUoMCwgMHg3Nik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHhEQik7CisJZXBzb25fc2VuZGJ5dGUoMSwgMHgwMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dChfQV9MQ0RfU1NDX0NTLCAwKTsKKworCS8qIGluaXQgTENEIHBoYXNlIDkgKi8KKwllcHNvbl9zZW5kYnl0ZSgwLCAweEFGKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7Cit9CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX2luaXQoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwsIHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3gxX3BhbmVsX2NsZWFudXAoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7Cit9CisKK3N0YXRpYyB2b2lkIHN4MV9wYW5lbF9kaXNhYmxlKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXByaW50ayhLRVJOX0lORk8gIlNYMTogTENEIHBhbmVsIGRpc2FibGVcbiIpOworCXN4MV9zZXRtbWlwb3dlcigwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisKKwllcHNvbl9zZW5kYnl0ZSgwLCAweDI1KTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMCk7CisKKwllcHNvbl9zZW5kYnl0ZSgwLCAweEFFKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoX0FfTENEX1NTQ19DUywgMSk7CisJbWRlbGF5KDEwMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDApOworCisJZXBzb25fc2VuZGJ5dGUoMCwgMHg5NSk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KF9BX0xDRF9TU0NfQ1MsIDEpOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9lbmFibGUoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAibGNkX3N4MTogTENEIHBhbmVsIGVuYWJsZVxuIik7CisJaW5pdF9zeXN0ZW0oKTsKKwlkaXNwbGF5X2luaXQoKTsKKworCXN4MV9zZXRtbWlwb3dlcigxKTsKKwlzeDFfc2V0YmFja2xpZ2h0KDB4MTgpOworCXN4MV9zZXRrZXlsaWdodCAoMHgwNik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3gxX3BhbmVsX2dldF9jYXBzKHN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGNkX3BhbmVsIHN4MV9wYW5lbCA9IHsKKwkubmFtZQkJPSAic3gxIiwKKwkuY29uZmlnCQk9IE9NQVBfTENEQ19QQU5FTF9URlQgfCBPTUFQX0xDRENfSU5WX1ZTWU5DIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9IU1lOQyB8IE9NQVBfTENEQ19JTlZfUElYX0NMT0NLIHwKKwkJCSAgT01BUF9MQ0RDX0lOVl9PVVRQVVRfRU4sCisKKwkueF9yZXMJCT0gMTc2LAorCS55X3JlcwkJPSAyMjAsCisJLmRhdGFfbGluZXMJPSAxNiwKKwkuYnBwCQk9IDE2LAorCS5oc3cJCT0gNSwKKwkuaGZwCQk9IDUsCisJLmhicAkJPSA1LAorCS52c3cJCT0gMiwKKwkudmZwCQk9IDEsCisJLnZicAkJPSAxLAorCS5waXhlbF9jbG9jawk9IDE1MDAsCisKKwkuaW5pdAkJPSBzeDFfcGFuZWxfaW5pdCwKKwkuY2xlYW51cAk9IHN4MV9wYW5lbF9jbGVhbnVwLAorCS5lbmFibGUJCT0gc3gxX3BhbmVsX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHN4MV9wYW5lbF9kaXNhYmxlLAorCS5nZXRfY2Fwcwk9IHN4MV9wYW5lbF9nZXRfY2FwcywKK307CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJb21hcGZiX3JlZ2lzdGVyX3BhbmVsKCZzeDFfcGFuZWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN4MV9wYW5lbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeDFfcGFuZWxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3gxX3BhbmVsX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc3gxX3BhbmVsX3Byb2JlLAorCS5yZW1vdmUJCT0gc3gxX3BhbmVsX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHN4MV9wYW5lbF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc3gxX3BhbmVsX3Jlc3VtZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJsY2Rfc3gxIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgc3gxX3BhbmVsX2Rydl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3gxX3BhbmVsX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHN4MV9wYW5lbF9kcnZfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzeDFfcGFuZWxfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3gxX3BhbmVsX2Rydl9pbml0KTsKK21vZHVsZV9leGl0KHN4MV9wYW5lbF9kcnZfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5jIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg1MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuYwpAQCAtMCwwICsxLDg5MyBAQAorLyoKKyAqIE9NQVAxIGludGVybmFsIExDRCBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJImxjZGMiCisKKyNkZWZpbmUgT01BUF9MQ0RDX0JBU0UJCQkweGZmZmVjMDAwCisjZGVmaW5lIE9NQVBfTENEQ19TSVpFCQkJMjU2CisjZGVmaW5lIE9NQVBfTENEQ19JUlEJCQlJTlRfTENEX0NUUkwKKworI2RlZmluZSBPTUFQX0xDRENfQ09OVFJPTAkJKE9NQVBfTENEQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgT01BUF9MQ0RDX1RJTUlORzAJCShPTUFQX0xDRENfQkFTRSArIDB4MDQpCisjZGVmaW5lIE9NQVBfTENEQ19USU1JTkcxCQkoT01BUF9MQ0RDX0JBU0UgKyAweDA4KQorI2RlZmluZSBPTUFQX0xDRENfVElNSU5HMgkJKE9NQVBfTENEQ19CQVNFICsgMHgwYykKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRVUwkJKE9NQVBfTENEQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgT01BUF9MQ0RDX1NVQlBBTkVMCQkoT01BUF9MQ0RDX0JBU0UgKyAweDE0KQorI2RlZmluZSBPTUFQX0xDRENfTElORV9JTlQJCShPTUFQX0xDRENfQkFTRSArIDB4MTgpCisjZGVmaW5lIE9NQVBfTENEQ19ESVNQTEFZX1NUQVRVUwkoT01BUF9MQ0RDX0JBU0UgKyAweDFjKQorCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX0RPTkUJCSgxIDw8IDApCisjZGVmaW5lIE9NQVBfTENEQ19TVEFUX1ZTWU5DCQkoMSA8PCAxKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9TWU5DX0xPU1QJKDEgPDwgMikKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfQUJDCQkoMSA8PCAzKQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9MSU5FX0lOVAkJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9MQ0RDX1NUQVRfRlVGCQkoMSA8PCA1KQorI2RlZmluZSBPTUFQX0xDRENfU1RBVF9MT0FERURfUEFMRVRURQkoMSA8PCA2KQorCisjZGVmaW5lIE9NQVBfTENEQ19DVFJMX0xDRF9FTgkJKDEgPDwgMCkKKyNkZWZpbmUgT01BUF9MQ0RDX0NUUkxfTENEX1RGVAkJKDEgPDwgNykKKyNkZWZpbmUgT01BUF9MQ0RDX0NUUkxfTElORV9JUlFfQ0xSX1NFTAkoMSA8PCAxMCkKKworI2RlZmluZSBPTUFQX0xDRENfSVJRX1ZTWU5DCQkoMSA8PCAyKQorI2RlZmluZSBPTUFQX0xDRENfSVJRX0RPTkUJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTE9BREVEX1BBTEVUVEUJKDEgPDwgNCkKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9MSU5FX05JUlEJCSgxIDw8IDUpCisjZGVmaW5lIE9NQVBfTENEQ19JUlFfTElORQkJKDEgPDwgNikKKyNkZWZpbmUgT01BUF9MQ0RDX0lSUV9NQVNLCQkoKCgxIDw8IDUpIC0gMSkgPDwgMikKKworI2RlZmluZSBNQVhfUEFMRVRURV9TSVpFCQlQQUdFX1NJWkUKKworZW51bSBsY2RjX2xvYWRfbW9kZSB7CisJT01BUF9MQ0RDX0xPQURfUEFMRVRURSwKKwlPTUFQX0xDRENfTE9BRF9GUkFNRSwKKwlPTUFQX0xDRENfTE9BRF9QQUxFVFRFX0FORF9GUkFNRQorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2xjZF9jb250cm9sbGVyIHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwlpbnQJCQlleHRfbW9kZTsKKworCXVuc2lnbmVkIGxvbmcJCWZyYW1lX29mZnNldDsKKwlpbnQJCQlzY3JlZW5fd2lkdGg7CisJaW50CQkJeHJlczsKKwlpbnQJCQl5cmVzOworCisJZW51bSBvbWFwZmJfY29sb3JfZm9ybWF0CWNvbG9yX21vZGU7CisJaW50CQkJYnBwOworCXZvaWQJCQkqcGFsZXR0ZV92aXJ0OworCWRtYV9hZGRyX3QJCXBhbGV0dGVfcGh5czsKKwlpbnQJCQlwYWxldHRlX2NvZGU7CisJaW50CQkJcGFsZXR0ZV9zaXplOworCisJdW5zaWduZWQgaW50CQlpcnFfbWFzazsKKwlzdHJ1Y3QgY29tcGxldGlvbglsYXN0X2ZyYW1lX2NvbXBsZXRlOworCXN0cnVjdCBjb21wbGV0aW9uCXBhbGV0dGVfbG9hZF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY2xrCQkqbGNkX2NrOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKKworCXZvaWQJCQkoKmRtYV9jYWxsYmFjaykodm9pZCAqZGF0YSk7CisJdm9pZAkJCSpkbWFfY2FsbGJhY2tfZGF0YTsKKworCWludAkJCWZibWVtX2FsbG9jYXRlZDsKKwlkbWFfYWRkcl90CQl2cmFtX3BoeXM7CisJdm9pZAkJCSp2cmFtX3ZpcnQ7CisJdW5zaWduZWQgbG9uZwkJdnJhbV9zaXplOworfSBsY2RjOworCitzdGF0aWMgdm9pZCBpbmxpbmUgZW5hYmxlX2lycXMoaW50IG1hc2spCit7CisJbGNkYy5pcnFfbWFzayB8PSBtYXNrOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgZGlzYWJsZV9pcnFzKGludCBtYXNrKQoreworCWxjZGMuaXJxX21hc2sgJj0gfm1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9sb2FkX21vZGUoZW51bSBsY2RjX2xvYWRfbW9kZSBtb2RlKQoreworCXUzMiBsOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCWwgJj0gfigzIDw8IDIwKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBfTENEQ19MT0FEX1BBTEVUVEU6CisJCWwgfD0gMSA8PCAyMDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0xDRENfTE9BRF9GUkFNRToKKwkJbCB8PSAyIDw8IDIwOworCQlicmVhazsKKwljYXNlIE9NQVBfTENEQ19MT0FEX1BBTEVUVEVfQU5EX0ZSQU1FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJb21hcF93cml0ZWwobCwgT01BUF9MQ0RDX0NPTlRST0wpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfY29udHJvbGxlcih2b2lkKQoreworCXUzMiBsOworCisJbCA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX0NPTlRST0wpOworCWwgfD0gT01BUF9MQ0RDX0NUUkxfTENEX0VOOworCWwgJj0gfk9NQVBfTENEQ19JUlFfTUFTSzsKKwlsIHw9IGxjZGMuaXJxX21hc2sgfCBPTUFQX0xDRENfSVJRX0RPTkU7CS8qIGVuYWJsZWQgSVJRcyAqLworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb250cm9sbGVyX2FzeW5jKHZvaWQpCit7CisJdTMyIGw7CisJdTMyIG1hc2s7CisKKwlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJbWFzayA9IE9NQVBfTENEQ19DVFJMX0xDRF9FTiB8IE9NQVBfTENEQ19JUlFfTUFTSzsKKwkvKgorCSAqIFByZXNlcnZlIHRoZSBET05FIG1hc2ssIHNpbmNlIHdlIHN0aWxsIHdhbnQgdG8gZ2V0IHRoZQorCSAqIGZpbmFsIERPTkUgaXJxLiBJdCB3aWxsIGJlIGRpc2FibGVkIGluIHRoZSBJUlEgaGFuZGxlci4KKwkgKi8KKwltYXNrICY9IH5PTUFQX0xDRENfSVJRX0RPTkU7CisJbCAmPSB+bWFzazsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29udHJvbGxlcih2b2lkKQoreworCWluaXRfY29tcGxldGlvbigmbGNkYy5sYXN0X2ZyYW1lX2NvbXBsZXRlKTsKKwlkaXNhYmxlX2NvbnRyb2xsZXJfYXN5bmMoKTsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbGNkYy5sYXN0X2ZyYW1lX2NvbXBsZXRlLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpCisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBGUkFNRSBET05FXG4iKTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfY29udHJvbGxlcih1MzIgc3RhdHVzKQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X2NvdW50OworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKworCWRpc2FibGVfY29udHJvbGxlcl9hc3luYygpOworCXJlc2V0X2NvdW50Kys7CisJaWYgKHJlc2V0X2NvdW50ID09IDEgfHwgdGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X2ppZmZpZXMgKyBIWikpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsCisJCQkgICJyZXNldHRpbmcgKHN0YXR1cyAlIzAxMHgscmVzZXQgY291bnQgJWx1KVxuIiwKKwkJCSAgc3RhdHVzLCByZXNldF9jb3VudCk7CisJCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisJfQorCWlmIChyZXNldF9jb3VudCA8IDEwMCkgeworCQllbmFibGVfY29udHJvbGxlcigpOworCX0gZWxzZSB7CisJCXJlc2V0X2NvdW50ID0gMDsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsCisJCQkidG9vIG1hbnkgcmVzZXQgYXR0ZW1wdHMsIGdpdmluZyB1cC5cbiIpOworCX0KK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTENEIERNQSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbW9kZSBzcGVjaWZpZWQgYnkgcGFyYW1ldGVycworICogaW4gbGNkYy5mYmRldiBhbmQgZmJkZXYtPnZhci4KKyAqLworc3RhdGljIHZvaWQgc2V0dXBfbGNkX2RtYSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBpbnQgZG1hX2VsZW1fdHlwZVtdID0geworCQkwLAorCQlPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCisJCU9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJCTAsCisJCU9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCisJfTsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBsY2RjLmZiZGV2LT5mYl9pbmZvWzBdLT5wYXI7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmbGNkYy5mYmRldi0+ZmJfaW5mb1swXS0+dmFyOworCXVuc2lnbmVkIGxvbmcJc3JjOworCWludAkJZXNpemUsIHhlbGVtLCB5ZWxlbTsKKworCXNyYyA9IGxjZGMudnJhbV9waHlzICsgbGNkYy5mcmFtZV9vZmZzZXQ7CisKKwlzd2l0Y2ggKHZhci0+cm90YXRlKSB7CisJY2FzZSAwOgorCQlpZiAocGxhbmUtPmluZm8ubWlycm9yIHx8IChzcmMgJiAzKSB8fAorCQkgICAgbGNkYy5jb2xvcl9tb2RlID09IE9NQVBGQl9DT0xPUl9ZVVY0MjAgfHwKKwkJICAgIChsY2RjLnhyZXMgJiAxKSkKKwkJCWVzaXplID0gMjsKKwkJZWxzZQorCQkJZXNpemUgPSA0OworCQl4ZWxlbSA9IGxjZGMueHJlcyAqIGxjZGMuYnBwIC8gOCAvIGVzaXplOworCQl5ZWxlbSA9IGxjZGMueXJlczsKKwkJYnJlYWs7CisJY2FzZSA5MDoKKwljYXNlIDE4MDoKKwljYXNlIDI3MDoKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQlCVUcoKTsKKwkJfQorCQllc2l6ZSA9IDI7CisJCXhlbGVtID0gbGNkYy55cmVzICogbGNkYy5icHAgLyAxNjsKKwkJeWVsZW0gPSBsY2RjLnhyZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorI2lmZGVmIFZFUkJPU0UKKwlkZXZfZGJnKGxjZGMuZmJkZXYtPmRldiwKKwkJICJzZXR1cF9kbWE6IHNyYyAlIzAxMGx4IGVzaXplICVkIHhlbGVtICVkIHllbGVtICVkXG4iLAorCQkgc3JjLCBlc2l6ZSwgeGVsZW0sIHllbGVtKTsKKyNlbmRpZgorCW9tYXBfc2V0X2xjZF9kbWFfYjEoc3JjLCB4ZWxlbSwgeWVsZW0sIGRtYV9lbGVtX3R5cGVbZXNpemVdKTsKKwlpZiAoIWNwdV9pc19vbWFwMTV4eCgpKSB7CisJCWludCBicHAgPSBsY2RjLmJwcDsKKworCQkvKgorCQkgKiBZVVYgc3VwcG9ydCBpcyBvbmx5IGZvciBleHRlcm5hbCBtb2RlIHdoZW4gd2UgaGF2ZSB0aGUKKwkJICogWVVWIHdpbmRvdyBlbWJlZGRlZCBpbiBhIDE2YnBwIGZyYW1lIGJ1ZmZlci4KKwkJICovCisJCWlmIChsY2RjLmNvbG9yX21vZGUgPT0gT01BUEZCX0NPTE9SX1lVVjQyMCkKKwkJCWJwcCA9IDE2OworCQkvKiBTZXQgdmlydHVhbCB4cmVzIGVsZW0gc2l6ZSAqLworCQlvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKAorCQkJbGNkYy5zY3JlZW5fd2lkdGggKiBicHAgLyA4IC8gZXNpemUpOworCQkvKiBTZXR1cCB0cmFuc2Zvcm1hdGlvbnMgKi8KKwkJb21hcF9zZXRfbGNkX2RtYV9iMV9yb3RhdGlvbih2YXItPnJvdGF0ZSk7CisJCW9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKHBsYW5lLT5pbmZvLm1pcnJvcik7CisJfQorCW9tYXBfc2V0dXBfbGNkX2RtYSgpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGNkY19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IG9tYXBfcmVhZGwoT01BUF9MQ0RDX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgKE9NQVBfTENEQ19TVEFUX0ZVRiB8IE9NQVBfTENEQ19TVEFUX1NZTkNfTE9TVCkpCisJCXJlc2V0X2NvbnRyb2xsZXIoc3RhdHVzKTsKKwllbHNlIHsKKwkJaWYgKHN0YXR1cyAmIE9NQVBfTENEQ19TVEFUX0RPTkUpIHsKKwkJCXUzMiBsOworCisJCQkvKgorCQkJICogRGlzYWJsZSBJUlFfRE9ORS4gVGhlIHN0YXR1cyBiaXQgd2lsbCBiZSBjbGVhcmVkCisJCQkgKiBvbmx5IHdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgcmVlbmFibGVkIGFuZCB3ZSBkb24ndAorCQkJICogd2FudCB0byBnZXQgbW9yZSBpbnRlcnJ1cHRzLgorCQkJICovCisJCQlsID0gb21hcF9yZWFkbChPTUFQX0xDRENfQ09OVFJPTCk7CisJCQlsICY9IH5PTUFQX0xDRENfSVJRX0RPTkU7CisJCQlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7CisJCQljb21wbGV0ZSgmbGNkYy5sYXN0X2ZyYW1lX2NvbXBsZXRlKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUpIHsKKwkJCWRpc2FibGVfY29udHJvbGxlcl9hc3luYygpOworCQkJY29tcGxldGUoJmxjZGMucGFsZXR0ZV9sb2FkX2NvbXBsZXRlKTsKKwkJfQorCX0KKworCS8qCisJICogQ2xlYXIgdGhlc2UgaW50ZXJydXB0IHN0YXR1cyBiaXRzLgorCSAqIFN5bmNfbG9zdCwgRlVGIGJpdHMgd2VyZSBjbGVhcmVkIGJ5IGRpc2FibGluZyB0aGUgTENEIGNvbnRyb2xsZXIKKwkgKiBMT0FERURfUEFMRVRURSBjYW4gYmUgY2xlYXJlZCB0aGlzIHdheSBvbmx5IGluIHBhbGV0dGUgb25seQorCSAqIGxvYWQgbW9kZS4gSW4gb3RoZXIgbG9hZCBtb2RlcyBpdCdzIGNsZWFyZWQgYnkgZGlzYWJsaW5nIHRoZQorCSAqIGNvbnRyb2xsZXIuCisJICovCisJc3RhdHVzICY9IH4oT01BUF9MQ0RDX1NUQVRfVlNZTkMgfAorCQkgICAgT01BUF9MQ0RDX1NUQVRfTE9BREVEX1BBTEVUVEUgfAorCQkgICAgT01BUF9MQ0RDX1NUQVRfQUJDIHwKKwkJICAgIE9NQVBfTENEQ19TVEFUX0xJTkVfSU5UKTsKKwlvbWFwX3dyaXRlbChzdGF0dXMsIE9NQVBfTENEQ19TVEFUVVMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIENoYW5nZSB0byBhIG5ldyB2aWRlbyBtb2RlLiBXZSBkZWZlciB0aGlzIHRvIGEgbGF0ZXIgdGltZSB0byBhdm9pZCBhbnkKKyAqIGZsaWNrZXIgYW5kIG5vdCB0byBtZXNzIHVwIHRoZSBjdXJyZW50IExDRCBETUEgY29udGV4dC4gRm9yIHRoaXMgd2UgZGlzYWJsZQorICogdGhlIExDRCBjb250cm9sZXIsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgYSBET05FIGlycSBhZnRlciB0aGUgbGFzdCBmcmFtZSBoYXMKKyAqIGJlZW4gdHJhbnNmZXJyZWQuIFRoZW4gaXQnbGwgYmUgc2FmZSB0byByZWNvbmZpZ3VyZSBib3RoIHRoZSBMQ0QgY29udHJvbGxlcgorICogYXMgd2VsbCBhcyB0aGUgTENEIERNQS4KKyAqLworc3RhdGljIGludCBvbWFwX2xjZGNfc2V0dXBfcGxhbmUoaW50IHBsYW5lLCBpbnQgY2hhbm5lbF9vdXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSBpbnQgcG9zX3gsIGludCBwb3NfeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCSBpbnQgY29sb3JfbW9kZSkKK3sKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZsY2RjLmZiZGV2LT5mYl9pbmZvWzBdLT52YXI7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBsY2RjLmZiZGV2LT5wYW5lbDsKKwlpbnQgcm90X3gsIHJvdF95OworCisJaWYgKHZhci0+cm90YXRlID09IDApIHsKKwkJcm90X3ggPSBwYW5lbC0+eF9yZXM7CisJCXJvdF95ID0gcGFuZWwtPnlfcmVzOworCX0gZWxzZSB7CisJCXJvdF94ID0gcGFuZWwtPnlfcmVzOworCQlyb3RfeSA9IHBhbmVsLT54X3JlczsKKwl9CisJaWYgKHBsYW5lICE9IDAgfHwgY2hhbm5lbF9vdXQgIT0gMCB8fCBwb3NfeCAhPSAwIHx8IHBvc195ICE9IDAgfHwKKwkgICAgd2lkdGggPiByb3RfeCB8fCBoZWlnaHQgPiByb3RfeSkgeworI2lmZGVmIFZFUkJPU0UKKwkJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsCisJCQkiaW52YWxpZCBwbGFuZSBwYXJhbXMgcGxhbmUgJWQgcG9zX3ggJWQgcG9zX3kgJWQgIgorCQkJIncgJWQgaCAlZFxuIiwgcGxhbmUsIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCk7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbGNkYy5mcmFtZV9vZmZzZXQgPSBvZmZzZXQ7CisJbGNkYy54cmVzID0gd2lkdGg7CisJbGNkYy55cmVzID0gaGVpZ2h0OworCWxjZGMuc2NyZWVuX3dpZHRoID0gc2NyZWVuX3dpZHRoOworCWxjZGMuY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7CisKKwlzd2l0Y2ggKGNvbG9yX21vZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzhCUFA6CisJCWxjZGMuYnBwID0gODsKKwkJbGNkYy5wYWxldHRlX2NvZGUgPSAweDMwMDA7CisJCWxjZGMucGFsZXR0ZV9zaXplID0gNTEyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJCWxjZGMuYnBwID0gMTY7CisJCWxjZGMucGFsZXR0ZV9jb2RlID0gMHg0MDAwOworCQlsY2RjLnBhbGV0dGVfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I0NDQ6CisJCWxjZGMuYnBwID0gMTY7CisJCWxjZGMucGFsZXR0ZV9jb2RlID0gMHg0MDAwOworCQlsY2RjLnBhbGV0dGVfc2l6ZSA9IDMyOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCWlmIChsY2RjLmV4dF9tb2RlKSB7CisJCQlsY2RjLmJwcCA9IDEyOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCWlmIChsY2RjLmV4dF9tb2RlKSB7CisJCQlsY2RjLmJwcCA9IDE2OworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQkvKiBGSVhNRTogb3RoZXIgQlBQcy4KKwkJICogYnBwMTogY29kZSAgMCwgICAgIHNpemUgMjU2CisJCSAqIGJwcDI6IGNvZGUgIDB4MTAwMCBzaXplIDI1NgorCQkgKiBicHA0OiBjb2RlICAweDIwMDAgc2l6ZSAyNTYKKwkJICogYnBwMTI6IGNvZGUgMHg0MDAwIHNpemUgMzIKKwkJICovCisJCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LCAiaW52YWxpZCBjb2xvciBtb2RlICVkXG4iLCBjb2xvcl9tb2RlKTsKKwkJQlVHKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobGNkYy5leHRfbW9kZSkgeworCQlzZXR1cF9sY2RfZG1hKCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsY2RjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwkJc2V0dXBfbGNkX2RtYSgpOworCQllbmFibGVfY29udHJvbGxlcigpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfbGNkY19lbmFibGVfcGxhbmUoaW50IHBsYW5lLCBpbnQgZW5hYmxlKQoreworCWRldl9kYmcobGNkYy5mYmRldi0+ZGV2LAorCQkicGxhbmUgJWQgZW5hYmxlICVkIHVwZGF0ZV9tb2RlICVkIGV4dF9tb2RlICVkXG4iLAorCQlwbGFuZSwgZW5hYmxlLCBsY2RjLnVwZGF0ZV9tb2RlLCBsY2RjLmV4dF9tb2RlKTsKKwlpZiAocGxhbmUgIT0gT01BUEZCX1BMQU5FX0dGWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTENEIERNQSBmb3IgYSBwYWxldHRlIGxvYWQgb3BlcmF0aW9uIGFuZCBkbyB0aGUgcGFsZXR0ZQorICogZG93bmxvYWRpbmcgc3luY2hyb25vdXNseS4gV2UgZG9uJ3QgdXNlIHRoZSBmcmFtZStwYWxldHRlIGxvYWQgbW9kZSBvZgorICogdGhlIGNvbnRyb2xsZXIsIHNpbmNlIHRoZSBwYWxldHRlIGNhbiBhbHdheXMgYmUgZG93bmxvYWRlZCBzZXBlcmF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBsb2FkX3BhbGV0dGUodm9pZCkKK3sKKwl1MTYJKnBhbGV0dGU7CisKKwlwYWxldHRlID0gKHUxNiAqKWxjZGMucGFsZXR0ZV92aXJ0OworCisJKih1MTYgKilwYWxldHRlICY9IDB4MGZmZjsKKwkqKHUxNiAqKXBhbGV0dGUgfD0gbGNkYy5wYWxldHRlX2NvZGU7CisKKwlvbWFwX3NldF9sY2RfZG1hX2IxKGxjZGMucGFsZXR0ZV9waHlzLAorCQlsY2RjLnBhbGV0dGVfc2l6ZSAvIDQgKyAxLCAxLCBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyKTsKKworCW9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKDEpOworCW9tYXBfc2V0dXBfbGNkX2RtYSgpOworCisJaW5pdF9jb21wbGV0aW9uKCZsY2RjLnBhbGV0dGVfbG9hZF9jb21wbGV0ZSk7CisJZW5hYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9MT0FERURfUEFMRVRURSk7CisJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9QQUxFVFRFKTsKKwllbmFibGVfY29udHJvbGxlcigpOworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZsY2RjLnBhbGV0dGVfbG9hZF9jb21wbGV0ZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDUwMCkpKQorCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgRlJBTUUgRE9ORVxuIik7CisJLyogVGhlIGNvbnRyb2xsZXIgZ2V0cyBkaXNhYmxlZCBpbiB0aGUgaXJxIGhhbmRsZXIgKi8KKwlkaXNhYmxlX2lycXMoT01BUF9MQ0RDX0lSUV9MT0FERURfUEFMRVRURSk7CisJb21hcF9zdG9wX2xjZF9kbWEoKTsKKworCW9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGxjZGMuZXh0X21vZGUpOworfQorCisvKiBVc2VkIG9ubHkgaW4gaW50ZXJuYWwgY29udHJvbGxlciBtb2RlICovCitzdGF0aWMgaW50IG9tYXBfbGNkY19zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHUxNiByZWQsIHUxNiBncmVlbiwgdTE2IGJsdWUsCisJCQkgICAgICAgdTE2IHRyYW5zcCwgaW50IHVwZGF0ZV9od19wYWwpCit7CisJdTE2ICpwYWxldHRlOworCisJaWYgKGxjZGMuY29sb3JfbW9kZSAhPSBPTUFQRkJfQ09MT1JfQ0xVVF84QlBQIHx8IHJlZ25vID4gMjU1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhbGV0dGUgPSAodTE2ICopbGNkYy5wYWxldHRlX3ZpcnQ7CisKKwlwYWxldHRlW3JlZ25vXSAmPSB+MHgwZmZmOworCXBhbGV0dGVbcmVnbm9dIHw9ICgocmVkID4+IDEyKSA8PCA4KSB8ICgoZ3JlZW4gPj4gMTIpIDw8IDQgKSB8CisJCQkgICAoYmx1ZSA+PiAxMik7CisKKwlpZiAodXBkYXRlX2h3X3BhbCkgeworCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJb21hcF9zdG9wX2xjZF9kbWEoKTsKKwkJbG9hZF9wYWxldHRlKCk7CisJCXNldHVwX2xjZF9kbWEoKTsKKwkJc2V0X2xvYWRfbW9kZShPTUFQX0xDRENfTE9BRF9GUkFNRSk7CisJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGNfY2tfZGl2KGludCBpc190ZnQsIGludCBwY2ssIGludCAqcGNrX2RpdikKK3sKKwl1bnNpZ25lZCBsb25nIGxjazsKKworCXBjayA9IG1heCgxLCBwY2spOworCWxjayA9IGNsa19nZXRfcmF0ZShsY2RjLmxjZF9jayk7CisJKnBja19kaXYgPSAobGNrICsgcGNrIC0gMSkgLyBwY2s7CisJaWYgKGlzX3RmdCkKKwkJKnBja19kaXYgPSBtYXgoMiwgKnBja19kaXYpOworCWVsc2UKKwkJKnBja19kaXYgPSBtYXgoMywgKnBja19kaXYpOworCWlmICgqcGNrX2RpdiA+IDI1NSkgeworCQkvKiBGSVhNRTogdHJ5IHRvIGFkanVzdCBsb2dpYyBjbG9jayBkaXZpZGVyIGFzIHdlbGwgKi8KKwkJKnBja19kaXYgPSAyNTU7CisJCWRldl93YXJuKGxjZGMuZmJkZXYtPmRldiwgInBpeGNsb2NrICVkIGtIeiB0b28gbG93LlxuIiwKKwkJCSBwY2sgLyAxMDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlubGluZSBzZXR1cF9yZWdzKHZvaWQpCit7CisJdTMyIGw7CisJc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwgPSBsY2RjLmZiZGV2LT5wYW5lbDsKKwlpbnQgaXNfdGZ0ID0gcGFuZWwtPmNvbmZpZyAmIE9NQVBfTENEQ19QQU5FTF9URlQ7CisJdW5zaWduZWQgbG9uZyBsY2s7CisJaW50IHBjZDsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19DT05UUk9MKTsKKwlsICY9IH5PTUFQX0xDRENfQ1RSTF9MQ0RfVEZUOworCWwgfD0gaXNfdGZ0ID8gT01BUF9MQ0RDX0NUUkxfTENEX1RGVCA6IDA7CisjaWZkZWYgQ09ORklHX01BQ0hfT01BUF9QQUxNVEUKKy8qIEZJWE1FOmlmIChtYWNoaW5lX2lzX29tYXBfcGFsbXRlKCkpIHsgKi8KKwkJLyogUGFsbVRFIHVzZXMgYWx0ZXJuYXRlIFRGVCBzZXR0aW5nIGluIDhCUFAgbW9kZSAqLworCQlsIHw9IChpc190ZnQgJiYgcGFuZWwtPmJwcCA9PSA4KSA/IDB4ODEwMDAwIDogMDsKKy8qCX0gKi8KKyNlbmRpZgorCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19DT05UUk9MKTsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19USU1JTkcyKTsKKwlsICY9IH4oKCgxIDw8IDYpIC0gMSkgPDwgMjApOworCWwgfD0gKHBhbmVsLT5jb25maWcgJiBPTUFQX0xDRENfU0lHTkFMX01BU0spIDw8IDIwOworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcyKTsKKworCWwgPSBwYW5lbC0+eF9yZXMgLSAxOworCWwgfD0gKHBhbmVsLT5oc3cgLSAxKSA8PCAxMDsKKwlsIHw9IChwYW5lbC0+aGZwIC0gMSkgPDwgMTY7CisJbCB8PSAocGFuZWwtPmhicCAtIDEpIDw8IDI0OworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcwKTsKKworCWwgPSBwYW5lbC0+eV9yZXMgLSAxOworCWwgfD0gKHBhbmVsLT52c3cgLSAxKSA8PCAxMDsKKwlsIHw9IHBhbmVsLT52ZnAgPDwgMTY7CisJbCB8PSBwYW5lbC0+dmJwIDw8IDI0OworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcxKTsKKworCWwgPSBvbWFwX3JlYWRsKE9NQVBfTENEQ19USU1JTkcyKTsKKwlsICY9IH4weGZmOworCisJbGNrID0gY2xrX2dldF9yYXRlKGxjZGMubGNkX2NrKTsKKworCWlmICghcGFuZWwtPnBjZCkKKwkJY2FsY19ja19kaXYoaXNfdGZ0LCBwYW5lbC0+cGl4ZWxfY2xvY2sgKiAxMDAwLCAmcGNkKTsKKwllbHNlIHsKKwkJZGV2X3dhcm4obGNkYy5mYmRldi0+ZGV2LAorCQkgICAgIlBpeGVsIGNsb2NrIGRpdmlkZXIgdmFsdWUgaXMgb2Jzb2xldGUuXG4iCisJCSAgICAiVHJ5IHRvIHNldCBwaXhlbF9jbG9jayB0byAlbHUgYW5kIHBjZCB0byAwICIKKwkJICAgICJpbiBkcml2ZXJzL3ZpZGVvL29tYXAvbGNkXyVzLmMgYW5kIHN1Ym1pdCBhIHBhdGNoLlxuIiwKKwkJCWxjayAvIHBhbmVsLT5wY2QgLyAxMDAwLCBwYW5lbC0+bmFtZSk7CisKKwkJcGNkID0gcGFuZWwtPnBjZDsKKwl9CisJbCB8PSBwY2QgJiAweGZmOworCWwgfD0gcGFuZWwtPmFjYiA8PCA4OworCW9tYXBfd3JpdGVsKGwsIE9NQVBfTENEQ19USU1JTkcyKTsKKworCS8qIHVwZGF0ZSBwYW5lbCBpbmZvIHdpdGggdGhlIGV4YWN0IGNsb2NrICovCisJcGFuZWwtPnBpeGVsX2Nsb2NrID0gbGNrIC8gcGNkIC8gMTAwMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgTENEIGNvbnRyb2xsZXIsIGRvd25sb2FkIHRoZSBjb2xvciBwYWxldHRlIGFuZCBzdGFydCBhIGxvb3BlZAorICogRE1BIHRyYW5zZmVyIG9mIHRoZSBmcmFtZSBpbWFnZSBkYXRhLiBDYWxsZWQgb25seSBpbiBpbnRlcm5hbAorICogY29udHJvbGxlciBtb2RlLgorICovCitzdGF0aWMgaW50IG9tYXBfbGNkY19zZXRfdXBkYXRlX21vZGUoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgciA9IDA7CisKKwlpZiAobW9kZSAhPSBsY2RjLnVwZGF0ZV9tb2RlKSB7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKKwkJCXNldHVwX3JlZ3MoKTsKKwkJCWxvYWRfcGFsZXR0ZSgpOworCisJCQkvKiBTZXR1cCBhbmQgc3RhcnQgTENEIERNQSAqLworCQkJc2V0dXBfbGNkX2RtYSgpOworCisJCQlzZXRfbG9hZF9tb2RlKE9NQVBfTENEQ19MT0FEX0ZSQU1FKTsKKwkJCWVuYWJsZV9pcnFzKE9NQVBfTENEQ19JUlFfRE9ORSk7CisJCQkvKiBUaGlzIHdpbGwgc3RhcnQgdGhlIGFjdHVhbCBETUEgdHJhbnNmZXIgKi8KKwkJCWVuYWJsZV9jb250cm9sbGVyKCk7CisJCQlsY2RjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWJyZWFrOworCQljYXNlIE9NQVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCQlkaXNhYmxlX2NvbnRyb2xsZXIoKTsKKwkJCW9tYXBfc3RvcF9sY2RfZG1hKCk7CisJCQlsY2RjLnVwZGF0ZV9tb2RlID0gbW9kZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJciA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG9tYXBfbGNkY19nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gbGNkYy51cGRhdGVfbW9kZTsKK30KKworLyogUE0gY29kZSBjYWxsZWQgb25seSBpbiBpbnRlcm5hbCBjb250cm9sbGVyIG1vZGUgKi8KK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19zdXNwZW5kKHZvaWQpCit7CisJaWYgKGxjZGMudXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFKSB7CisJCWRpc2FibGVfY29udHJvbGxlcigpOworCQlvbWFwX3N0b3BfbGNkX2RtYSgpOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9sY2RjX3Jlc3VtZSh2b2lkKQoreworCWlmIChsY2RjLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkgeworCQlzZXR1cF9yZWdzKCk7CisJCWxvYWRfcGFsZXR0ZSgpOworCQlzZXR1cF9sY2RfZG1hKCk7CisJCXNldF9sb2FkX21vZGUoT01BUF9MQ0RDX0xPQURfRlJBTUUpOworCQllbmFibGVfaXJxcyhPTUFQX0xDRENfSVJRX0RPTkUpOworCQllbmFibGVfY29udHJvbGxlcigpOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9sY2RjX2dldF9jYXBzKGludCBwbGFuZSwgc3RydWN0IG9tYXBmYl9jYXBzICpjYXBzKQoreworCXJldHVybjsKK30KKworaW50IG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKHZvaWQgKCpjYWxsYmFjaykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpCit7CisJQlVHX09OKGNhbGxiYWNrID09IE5VTEwpOworCisJaWYgKGxjZGMuZG1hX2NhbGxiYWNrKQorCQlyZXR1cm4gLUVCVVNZOworCWVsc2UgeworCQlsY2RjLmRtYV9jYWxsYmFjayA9IGNhbGxiYWNrOworCQlsY2RjLmRtYV9jYWxsYmFja19kYXRhID0gZGF0YTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKTsKKwordm9pZCBvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2sodm9pZCkKK3sKKwlsY2RjLmRtYV9jYWxsYmFjayA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfbGNkY19mcmVlX2RtYV9jYWxsYmFjayk7CisKK3N0YXRpYyB2b2lkIGxjZGNfZG1hX2hhbmRsZXIodTE2IHN0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlpZiAobGNkYy5kbWFfY2FsbGJhY2spCisJCWxjZGMuZG1hX2NhbGxiYWNrKGxjZGMuZG1hX2NhbGxiYWNrX2RhdGEpOworfQorCitzdGF0aWMgaW50IG1tYXBfa2Vybih2b2lkKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QJKmt2bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0CXZtYTsKKwlwZ3Byb3RfdAkJcGdwcm90OworCXVuc2lnbmVkIGxvbmcJCXZhZGRyOworCisJa3ZtYSA9IGdldF92bV9hcmVhKGxjZGMudnJhbV9zaXplLCBWTV9JT1JFTUFQKTsKKwlpZiAoa3ZtYSA9PSBOVUxMKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IGtlcm5lbCB2bSBhcmVhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXZtYS52bV9tbSA9ICZpbml0X21tOworCisJdmFkZHIgPSAodW5zaWduZWQgbG9uZylrdm1hLT5hZGRyOworCXZtYS52bV9zdGFydCA9IHZhZGRyOworCXZtYS52bV9lbmQgPSB2YWRkciArIGxjZGMudnJhbV9zaXplOworCisJcGdwcm90ID0gcGdwcm90X3dyaXRlY29tYmluZShwZ3Byb3Rfa2VybmVsKTsKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKCZ2bWEsIHZhZGRyLAorCQkJICAgbGNkYy52cmFtX3BoeXMgPj4gUEFHRV9TSElGVCwKKwkJCSAgIGxjZGMudnJhbV9zaXplLCBwZ3Byb3QpIDwgMCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgImtlcm5lbCBtbWFwIGZvciBGQiBtZW1vcnkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJbGNkYy52cmFtX3ZpcnQgPSAodm9pZCAqKXZhZGRyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX2tlcm4odm9pZCkKK3sKKwl2dW5tYXAobGNkYy52cmFtX3ZpcnQpOworfQorCitzdGF0aWMgaW50IGFsbG9jX3BhbGV0dGVfcmFtKHZvaWQpCit7CisJbGNkYy5wYWxldHRlX3ZpcnQgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwKKwkJTUFYX1BBTEVUVEVfU0laRSwgJmxjZGMucGFsZXR0ZV9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAobGNkYy5wYWxldHRlX3ZpcnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKGxjZGMuZmJkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvYyBwYWxldHRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobGNkYy5wYWxldHRlX3ZpcnQsIDAsIE1BWF9QQUxFVFRFX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGFsZXR0ZV9yYW0odm9pZCkKK3sKKwlkbWFfZnJlZV93cml0ZWNvbWJpbmUobGNkYy5mYmRldi0+ZGV2LCBNQVhfUEFMRVRURV9TSVpFLAorCQkJbGNkYy5wYWxldHRlX3ZpcnQsIGxjZGMucGFsZXR0ZV9waHlzKTsKK30KKworc3RhdGljIGludCBhbGxvY19mYm1lbShzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJlZ2lvbikKK3sKKwlpbnQgYnBwOworCWludCBmcmFtZV9zaXplOworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gbGNkYy5mYmRldi0+cGFuZWw7CisKKwlicHAgPSBwYW5lbC0+YnBwOworCWlmIChicHAgPT0gMTIpCisJCWJwcCA9IDE2OworCWZyYW1lX3NpemUgPSBQQUdFX0FMSUdOKHBhbmVsLT54X3JlcyAqIGJwcCAvIDggKiBwYW5lbC0+eV9yZXMpOworCWlmIChyZWdpb24tPnNpemUgPiBmcmFtZV9zaXplKQorCQlmcmFtZV9zaXplID0gcmVnaW9uLT5zaXplOworCWxjZGMudnJhbV9zaXplID0gZnJhbWVfc2l6ZTsKKwlsY2RjLnZyYW1fdmlydCA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUobGNkYy5mYmRldi0+ZGV2LAorCQkJbGNkYy52cmFtX3NpemUsICZsY2RjLnZyYW1fcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKGxjZGMudnJhbV92aXJ0ID09IE5VTEwpIHsKKwkJZGV2X2VycihsY2RjLmZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgRkIgRE1BIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZWdpb24tPnNpemUgPSBmcmFtZV9zaXplOworCXJlZ2lvbi0+cGFkZHIgPSBsY2RjLnZyYW1fcGh5czsKKwlyZWdpb24tPnZhZGRyID0gbGNkYy52cmFtX3ZpcnQ7CisJcmVnaW9uLT5hbGxvYyA9IDE7CisKKwltZW1zZXQobGNkYy52cmFtX3ZpcnQsIDAsIGxjZGMudnJhbV9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2ZibWVtKHZvaWQpCit7CisJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKGxjZGMuZmJkZXYtPmRldiwgbGNkYy52cmFtX3NpemUsCisJCQkgICAgICBsY2RjLnZyYW1fdmlydCwgbGNkYy52cmFtX3BoeXMpOworfQorCitzdGF0aWMgaW50IHNldHVwX2ZibWVtKHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV9tZCkKK3sKKwlpbnQgcjsKKworCWlmICghcmVxX21kLT5yZWdpb25fY250KSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAibm8gbWVtb3J5IHJlZ2lvbnMgZGVmaW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZXFfbWQtPnJlZ2lvbl9jbnQgPiAxKSB7CisJCWRldl9lcnIobGNkYy5mYmRldi0+ZGV2LCAib25seSBvbmUgcGxhbmUgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcmVxX21kLT5yZWdpb25fY250ID0gMTsKKwl9CisKKwlpZiAocmVxX21kLT5yZWdpb25bMF0ucGFkZHIgPT0gMCkgeworCQlsY2RjLmZibWVtX2FsbG9jYXRlZCA9IDE7CisJCWlmICgociA9IGFsbG9jX2ZibWVtKCZyZXFfbWQtPnJlZ2lvblswXSkpIDwgMCkKKwkJCXJldHVybiByOworCQlyZXR1cm4gMDsKKwl9CisKKwlsY2RjLnZyYW1fcGh5cyA9IHJlcV9tZC0+cmVnaW9uWzBdLnBhZGRyOworCWxjZGMudnJhbV9zaXplID0gcmVxX21kLT5yZWdpb25bMF0uc2l6ZTsKKworCWlmICgociA9IG1tYXBfa2VybigpKSA8IDApCisJCXJldHVybiByOworCisJZGV2X2RiZyhsY2RjLmZiZGV2LT5kZXYsICJ2cmFtIGF0ICUwOHggc2l6ZSAlMDhseCBtYXBwZWQgdG8gMHglcFxuIiwKKwkJIGxjZGMudnJhbV9waHlzLCBsY2RjLnZyYW1fc2l6ZSwgbGNkYy52cmFtX3ZpcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZmJtZW0odm9pZCkKK3sKKwlpZiAobGNkYy5mYm1lbV9hbGxvY2F0ZWQpCisJCWZyZWVfZmJtZW0oKTsKKwllbHNlCisJCXVubWFwX2tlcm4oKTsKK30KKworc3RhdGljIGludCBvbWFwX2xjZGNfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBleHRfbW9kZSwKKwkJCSAgc3RydWN0IG9tYXBmYl9tZW1fZGVzYyAqcmVxX3ZyYW0pCit7CisJaW50IHI7CisJdTMyIGw7CisJaW50IHJhdGU7CisJc3RydWN0IGNsayAqdGNfY2s7CisKKwlsY2RjLmlycV9tYXNrID0gMDsKKworCWxjZGMuZmJkZXYgPSBmYmRldjsKKwlsY2RjLmV4dF9tb2RlID0gZXh0X21vZGU7CisKKwlsID0gMDsKKwlvbWFwX3dyaXRlbChsLCBPTUFQX0xDRENfQ09OVFJPTCk7CisKKwkvKiBGSVhNRToKKwkgKiBBY2NvcmRpbmcgdG8gZXJyYXRhIHNvbWUgcGxhdGZvcm1zIGhhdmUgYSBjbG9jayByYXRlIGxpbWl0aWF0aW9uCisJICovCisJbGNkYy5sY2RfY2sgPSBjbGtfZ2V0KE5VTEwsICJsY2RfY2siKTsKKwlpZiAoSVNfRVJSKGxjZGMubGNkX2NrKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gYWNjZXNzIExDRCBjbG9ja1xuIik7CisJCXIgPSBQVFJfRVJSKGxjZGMubGNkX2NrKTsKKwkJZ290byBmYWlsMDsKKwl9CisKKwl0Y19jayA9IGNsa19nZXQoTlVMTCwgInRjX2NrIik7CisJaWYgKElTX0VSUih0Y19jaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGFjY2VzcyBUQyBjbG9ja1xuIik7CisJCXIgPSBQVFJfRVJSKHRjX2NrKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwlyYXRlID0gY2xrX2dldF9yYXRlKHRjX2NrKTsKKwljbGtfcHV0KHRjX2NrKTsKKworCWlmIChtYWNoaW5lX2lzX2Ftc19kZWx0YSgpKQorCQlyYXRlIC89IDQ7CisJaWYgKG1hY2hpbmVfaXNfb21hcF9oMygpKQorCQlyYXRlIC89IDM7CisJciA9IGNsa19zZXRfcmF0ZShsY2RjLmxjZF9jaywgcmF0ZSk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkanVzdCBMQ0QgcmF0ZVxuIik7CisJCWdvdG8gZmFpbDE7CisJfQorCWNsa19lbmFibGUobGNkYy5sY2RfY2spOworCisJciA9IHJlcXVlc3RfaXJxKE9NQVBfTENEQ19JUlEsIGxjZGNfaXJxX2hhbmRsZXIsIDAsIE1PRFVMRV9OQU1FLCBmYmRldik7CisJaWYgKHIpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBJUlFcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKworCXIgPSBvbWFwX3JlcXVlc3RfbGNkX2RtYShsY2RjX2RtYV9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IExDRCBETUFcbiIpOworCQlnb3RvIGZhaWwzOworCX0KKworCW9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGV4dF9tb2RlKTsKKwlvbWFwX3NldF9sY2RfZG1hX2V4dF9jb250cm9sbGVyKGV4dF9tb2RlKTsKKworCWlmICghZXh0X21vZGUpCisJCWlmICgociA9IGFsbG9jX3BhbGV0dGVfcmFtKCkpIDwgMCkKKwkJCWdvdG8gZmFpbDQ7CisKKwlpZiAoKHIgPSBzZXR1cF9mYm1lbShyZXFfdnJhbSkpIDwgMCkKKwkJZ290byBmYWlsNTsKKworCXByX2luZm8oIm9tYXBmYjogTENEQyBpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKK2ZhaWw1OgorCWlmICghZXh0X21vZGUpCisJCWZyZWVfcGFsZXR0ZV9yYW0oKTsKK2ZhaWw0OgorCW9tYXBfZnJlZV9sY2RfZG1hKCk7CitmYWlsMzoKKwlmcmVlX2lycShPTUFQX0xDRENfSVJRLCBsY2RjLmZiZGV2KTsKK2ZhaWwyOgorCWNsa19kaXNhYmxlKGxjZGMubGNkX2NrKTsKK2ZhaWwxOgorCWNsa19wdXQobGNkYy5sY2RfY2spOworZmFpbDA6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbGNkY19jbGVhbnVwKHZvaWQpCit7CisJaWYgKCFsY2RjLmV4dF9tb2RlKQorCQlmcmVlX3BhbGV0dGVfcmFtKCk7CisJY2xlYW51cF9mYm1lbSgpOworCW9tYXBfZnJlZV9sY2RfZG1hKCk7CisJZnJlZV9pcnEoT01BUF9MQ0RDX0lSUSwgbGNkYy5mYmRldik7CisJY2xrX2Rpc2FibGUobGNkYy5sY2RfY2spOworCWNsa19wdXQobGNkYy5sY2RfY2spOworfQorCitjb25zdCBzdHJ1Y3QgbGNkX2N0cmwgb21hcDFfaW50X2N0cmwgPSB7CisJLm5hbWUJCQk9ICJpbnRlcm5hbCIsCisJLmluaXQJCQk9IG9tYXBfbGNkY19pbml0LAorCS5jbGVhbnVwCQk9IG9tYXBfbGNkY19jbGVhbnVwLAorCS5nZXRfY2FwcwkJPSBvbWFwX2xjZGNfZ2V0X2NhcHMsCisJLnNldF91cGRhdGVfbW9kZQk9IG9tYXBfbGNkY19zZXRfdXBkYXRlX21vZGUsCisJLmdldF91cGRhdGVfbW9kZQk9IG9tYXBfbGNkY19nZXRfdXBkYXRlX21vZGUsCisJLnVwZGF0ZV93aW5kb3cJCT0gTlVMTCwKKwkuc3VzcGVuZAkJPSBvbWFwX2xjZGNfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBvbWFwX2xjZGNfcmVzdW1lLAorCS5zZXR1cF9wbGFuZQkJPSBvbWFwX2xjZGNfc2V0dXBfcGxhbmUsCisJLmVuYWJsZV9wbGFuZQkJPSBvbWFwX2xjZGNfZW5hYmxlX3BsYW5lLAorCS5zZXRjb2xyZWcJCT0gb21hcF9sY2RjX3NldGNvbHJlZywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvbGNkYy5oIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGI3MzFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL2xjZGMuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgTENEQ19ICisjZGVmaW5lIExDRENfSAorCitpbnQgb21hcF9sY2RjX3NldF9kbWFfY2FsbGJhY2sodm9pZCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7Cit2b2lkIG9tYXBfbGNkY19mcmVlX2RtYV9jYWxsYmFjayh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9vbWFwZmJfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZDBmN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvb21hcGZiX21haW4uYwpAQCAtMCwwICsxLDE5NDEgQEAKKy8qCisgKiBGcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIFRJIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqCisgKiBBY2tub3dsZWRnZW1lbnRzOgorICogICBBbGV4IE1jTWFpbnMgPGFhbUByaWRnZXJ1bi5jb20+ICAgICAgIC0gT3JpZ2luYWwgZHJpdmVyCisgKiAgIEp1aGEgWXJqb2xhIDxqdWhhLnlyam9sYUBub2tpYS5jb20+ICAgLSBPcmlnaW5hbCBkcml2ZXIgYW5kIGltcHJvdmVtZW50cworICogICBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4gIC0gY2hhbmdlcyBmb3IgMi42IGtlcm5lbCBBUEkKKyAqICAgVGV4YXMgSW5zdHJ1bWVudHMgICAgICAgICAgICAgICAgICAgICAtIEgzIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNkZWZpbmUgTU9EVUxFX05BTUUJIm9tYXBmYiIKKworc3RhdGljIHVuc2lnbmVkIGludAlkZWZfYWNjZWw7CitzdGF0aWMgdW5zaWduZWQgbG9uZwlkZWZfdnJhbVtPTUFQRkJfUExBTkVfTlVNXTsKK3N0YXRpYyBpbnQJCWRlZl92cmFtX2NudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWRlZl92eHJlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCWRlZl92eXJlczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJZGVmX3JvdGF0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJZGVmX21pcnJvcjsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX01BTlVBTF9VUERBVEUKK3N0YXRpYyBpbnQJCW1hbnVhbF91cGRhdGUgPSAxOworI2Vsc2UKK3N0YXRpYyBpbnQJCW1hbnVhbF91cGRhdGU7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKmZiZGV2X3BkZXY7CitzdGF0aWMgc3RydWN0IGxjZF9wYW5lbAkJKmZiZGV2X3BhbmVsOworc3RhdGljIHN0cnVjdCBvbWFwZmJfZGV2aWNlCSpvbWFwZmJfZGV2OworCitzdHJ1Y3QgY2Fwc190YWJsZV9zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBjYXBzX3RhYmxlX3N0cnVjdCBjdHJsX2NhcHNbXSA9IHsKKwl7IE9NQVBGQl9DQVBTX01BTlVBTF9VUERBVEUsICAibWFudWFsIHVwZGF0ZSIgfSwKKwl7IE9NQVBGQl9DQVBTX1RFQVJTWU5DLCAgICAgICAidGVhcmluZyBzeW5jaHJvbml6YXRpb24iIH0sCisJeyBPTUFQRkJfQ0FQU19QTEFORV9SRUxPQ0FURV9NRU0sICJyZWxvY2F0ZSBwbGFuZSBtZW1vcnkiIH0sCisJeyBPTUFQRkJfQ0FQU19QTEFORV9TQ0FMRSwgICAgInNjYWxlIHBsYW5lIiB9LAorCXsgT01BUEZCX0NBUFNfV0lORE9XX1BJWEVMX0RPVUJMRSwgInBpeGVsIGRvdWJsZSB3aW5kb3ciIH0sCisJeyBPTUFQRkJfQ0FQU19XSU5ET1dfU0NBTEUsICAgInNjYWxlIHdpbmRvdyIgfSwKKwl7IE9NQVBGQl9DQVBTX1dJTkRPV19PVkVSTEFZLCAib3ZlcmxheSB3aW5kb3ciIH0sCisJeyBPTUFQRkJfQ0FQU19TRVRfQkFDS0xJR0hULCAgImJhY2tsaWdodCBzZXR0aW5nIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjYXBzX3RhYmxlX3N0cnVjdCBjb2xvcl9jYXBzW10gPSB7CisJeyAxIDw8IE9NQVBGQl9DT0xPUl9SR0I1NjUsCSJSR0I1NjUiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfWVVWNDIyLAkiWVVWNDIyIiwgfSwKKwl7IDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMCwJIllVVjQyMCIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzhCUFAsCSJDTFVUOCIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzRCUFAsCSJDTFVUNCIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzJCUFAsCSJDTFVUMiIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9DTFVUXzFCUFAsCSJDTFVUMSIsIH0sCisJeyAxIDw8IE9NQVBGQl9DT0xPUl9SR0I0NDQsCSJSR0I0NDQiLCB9LAorCXsgMSA8PCBPTUFQRkJfQ09MT1JfWVVZNDIyLAkiWVVZNDIyIiwgfSwKK307CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExDRCBwYW5lbAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgb21hcDFfaW50X2N0cmw7CitleHRlcm4gc3RydWN0IGxjZF9jdHJsIG9tYXAyX2ludF9jdHJsOworZXh0ZXJuIHN0cnVjdCBsY2RfY3RybCBod2E3NDJfY3RybDsKK2V4dGVybiBzdHJ1Y3QgbGNkX2N0cmwgYmxpenphcmRfY3RybDsKKworc3RhdGljIHN0cnVjdCBsY2RfY3RybCAqY3RybHNbXSA9IHsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQorCSZvbWFwMV9pbnRfY3RybCwKKyNlbHNlCisJJm9tYXAyX2ludF9jdHJsLAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0hXQTc0MgorCSZod2E3NDJfY3RybCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfQkxJWlpBUkQKKwkmYmxpenphcmRfY3RybCwKKyNlbmRpZgorfTsKKworI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQorZXh0ZXJuIHN0cnVjdCBsY2RfY3RybF9leHRpZiBvbWFwMV9leHRfaWY7CisjZWxzZQorZXh0ZXJuIHN0cnVjdCBsY2RfY3RybF9leHRpZiBvbWFwMl9leHRfaWY7CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvbWFwZmJfcnF1ZXVlX2xvY2soc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCW11dGV4X2xvY2soJmZiZGV2LT5ycXVldWVfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBvbWFwZmJfcnF1ZXVlX3VubG9jayhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJbXV0ZXhfdW5sb2NrKCZmYmRldi0+cnF1ZXVlX211dGV4KTsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTENEIGNvbnRyb2xsZXIgYW5kIExDRCBETUEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBMb29rdXAgdGFibGUgdG8gbWFwIGVsZW0gc2l6ZSB0byBlbGVtIHR5cGUuICovCitzdGF0aWMgY29uc3QgaW50IGRtYV9lbGVtX3R5cGVbXSA9IHsKKwkwLAorCU9NQVBfRE1BX0RBVEFfVFlQRV9TOCwKKwlPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAorCTAsCisJT01BUF9ETUFfREFUQV9UWVBFX1MzMiwKK307CisKKy8qCisgKiBBbGxvY2F0ZSByZXNvdXJjZXMgbmVlZGVkIGZvciBMQ0QgY29udHJvbGxlciBhbmQgTENEIERNQSBvcGVyYXRpb25zLiBWaWRlbworICogbWVtb3J5IGlzIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSBtZW1vcnkgYWNjb3JkaW5nIHRvIHRoZSB2aXJ0dWFsIGRpc3BsYXkKKyAqIHNpemUsIGV4Y2VwdCBpZiBhIGJpZ2dlciBtZW1vcnkgc2l6ZSBpcyBzcGVjaWZpZWQgZXhwbGljaXRseSBhcyBhIGtlcm5lbAorICogcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50IGN0cmxfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJaW50IHI7CisJaW50IGk7CisKKwkvKiBrZXJuZWwvbW9kdWxlIHZyYW0gcGFyYW1ldGVycyBvdmVycmlkZSBib290IHRhZ3MvYm9hcmQgY29uZmlnICovCisJaWYgKGRlZl92cmFtX2NudCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGVmX3ZyYW1fY250OyBpKyspCisJCQlmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnNpemUgPQorCQkJCVBBR0VfQUxJR04oZGVmX3ZyYW1baV0pOworCQlmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudCA9IGk7CisJfSBlbHNlIHsKKwkJc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhICpjb25mOworCisJCWNvbmYgPSBmYmRldi0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlmYmRldi0+bWVtX2Rlc2MgPSBjb25mLT5tZW1fZGVzYzsKKwl9CisKKwlpZiAoIWZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250KSB7CisJCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZmJkZXYtPnBhbmVsOworCQlpbnQgZGVmX3NpemU7CisJCWludCBicHAgPSBwYW5lbC0+YnBwOworCisJCS8qIDEyIGJwcCBpcyBwYWNrZWQgaW4gMTYgYml0cyAqLworCQlpZiAoYnBwID09IDEyKQorCQkJYnBwID0gMTY7CisJCWRlZl9zaXplID0gZGVmX3Z4cmVzICogZGVmX3Z5cmVzICogYnBwIC8gODsKKwkJZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQgPSAxOworCQlmYmRldi0+bWVtX2Rlc2MucmVnaW9uWzBdLnNpemUgPSBQQUdFX0FMSUdOKGRlZl9zaXplKTsKKwl9CisJciA9IGZiZGV2LT5jdHJsLT5pbml0KGZiZGV2LCAwLCAmZmJkZXYtPm1lbV9kZXNjKTsKKwlpZiAociA8IDApIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY29udHJvbGxlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJCXIpOworCQlyZXR1cm4gcjsKKwl9CisKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCWRldl9kYmcoZmJkZXYtPmRldiwgInJlZ2lvbiVkIHBoeXMgJTA4eCB2aXJ0ICVwIHNpemU9JWx1XG4iLAorCQkJIGksCisJCQkgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltpXS5wYWRkciwKKwkJCSBmYmRldi0+bWVtX2Rlc2MucmVnaW9uW2ldLnZhZGRyLAorCQkJIGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZSk7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGN0cmxfY2xlYW51cChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJZmJkZXYtPmN0cmwtPmNsZWFudXAoKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBmYmRldi0+cnF1ZXVlX211dGV4IGhlbGQuICovCitzdGF0aWMgaW50IGN0cmxfY2hhbmdlX21vZGUoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZmJpLT52YXI7CisKKwlvZmZzZXQgPSB2YXItPnlvZmZzZXQgKiBmYmktPmZpeC5saW5lX2xlbmd0aCArCisJCSB2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gODsKKworCWlmIChmYmRldi0+Y3RybC0+c3luYykKKwkJZmJkZXYtPmN0cmwtPnN5bmMoKTsKKwlyID0gZmJkZXYtPmN0cmwtPnNldHVwX3BsYW5lKHBsYW5lLT5pZHgsIHBsYW5lLT5pbmZvLmNoYW5uZWxfb3V0LAorCQkJCSBvZmZzZXQsIHZhci0+eHJlc192aXJ0dWFsLAorCQkJCSBwbGFuZS0+aW5mby5wb3NfeCwgcGxhbmUtPmluZm8ucG9zX3ksCisJCQkJIHZhci0+eHJlcywgdmFyLT55cmVzLCBwbGFuZS0+Y29sb3JfbW9kZSk7CisJaWYgKGZiZGV2LT5jdHJsLT5zZXRfc2NhbGUgIT0gTlVMTCkKKwkJciA9IGZiZGV2LT5jdHJsLT5zZXRfc2NhbGUocGxhbmUtPmlkeCwKKwkJCQkgICB2YXItPnhyZXMsIHZhci0+eXJlcywKKwkJCQkgICBwbGFuZS0+aW5mby5vdXRfd2lkdGgsCisJCQkJICAgcGxhbmUtPmluZm8ub3V0X2hlaWdodCk7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmJkZXYgZnJhbWV3b3JrIGNhbGxiYWNrcyBhbmQgdGhlIGlvY3RsIGludGVyZmFjZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIENhbGxlZCBlYWNoIHRpbWUgdGhlIG9tYXBmYiBkZXZpY2UgaXMgb3BlbmVkICovCitzdGF0aWMgaW50IG9tYXBmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pOworCisvKiBDYWxsZWQgd2hlbiB0aGUgb21hcGZiIGRldmljZSBpcyBjbG9zZWQuIFdlIG1ha2Ugc3VyZSB0aGF0IGFueSBwZW5kaW5nCisgKiBnZnggRE1BIG9wZXJhdGlvbnMgYXJlIGVuZGVkLCBiZWZvcmUgd2UgcmV0dXJuLiAqLworc3RhdGljIGludCBvbWFwZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCit7CisJb21hcGZiX3N5bmMoaW5mbyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN0b3JlIGEgc2luZ2xlIGNvbG9yIHBhbGV0dGUgZW50cnkgaW50byBhIHBzZXVkbyBwYWxldHRlIG9yIHRoZSBoYXJkd2FyZQorICogcGFsZXR0ZSBpZiBvbmUgaXMgYXZhaWxhYmxlLiBGb3Igbm93IHdlIHN1cHBvcnQgb25seSAxNmJwcCBhbmQgdGh1cyBzdG9yZQorICogdGhlIGVudHJ5IG9ubHkgdG8gdGhlIHBzZXVkbyBwYWxldHRlLgorICovCitzdGF0aWMgaW50IF9zZXRjb2xyZWcoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLAorCQkJdV9pbnQgYmx1ZSwgdV9pbnQgdHJhbnNwLCBpbnQgdXBkYXRlX2h3X3BhbCkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBpbmZvLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKKwlpbnQgciA9IDA7CisKKwlzd2l0Y2ggKHBsYW5lLT5jb2xvcl9tb2RlKSB7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIyOgorCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVk0MjI6CisJCXIgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzhCUFA6CisJY2FzZSBPTUFQRkJfQ09MT1JfQ0xVVF80QlBQOgorCWNhc2UgT01BUEZCX0NPTE9SX0NMVVRfMkJQUDoKKwljYXNlIE9NQVBGQl9DT0xPUl9DTFVUXzFCUFA6CisJCWlmIChmYmRldi0+Y3RybC0+c2V0Y29scmVnKQorCQkJciA9IGZiZGV2LT5jdHJsLT5zZXRjb2xyZWcocmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsCisJCQkJCQkJdHJhbnNwLCB1cGRhdGVfaHdfcGFsKTsKKwkJLyogRmFsbHRocm91Z2ggKi8KKwljYXNlIE9NQVBGQl9DT0xPUl9SR0I1NjU6CisJY2FzZSBPTUFQRkJfQ09MT1JfUkdCNDQ0OgorCQlpZiAociAhPSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHJlZ25vIDwgMCkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZWdubyA8IDE2KSB7CisJCQl1MTYgcGFsOworCQkJcGFsID0gKChyZWQgPj4gKDE2IC0gdmFyLT5yZWQubGVuZ3RoKSkgPDwKKwkJCQkJdmFyLT5yZWQub2Zmc2V0KSB8CisJCQkgICAgICAoKGdyZWVuID4+ICgxNiAtIHZhci0+Z3JlZW4ubGVuZ3RoKSkgPDwKKwkJCQkJdmFyLT5ncmVlbi5vZmZzZXQpIHwKKwkJCSAgICAgIChibHVlID4+ICgxNiAtIHZhci0+Ymx1ZS5sZW5ndGgpKTsKKwkJCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gcGFsOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAorCQkJICAgIHVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIF9zZXRjb2xyZWcoaW5mbywgcmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUsIHRyYW5zcCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3NldGNtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBjb3VudCwgaW5kZXgsIHI7CisJdTE2ICpyZWQsICpncmVlbiwgKmJsdWUsICp0cmFuc3A7CisJdTE2IHRyYW5zID0gMHhmZmZmOworCisJcmVkICAgICA9IGNtYXAtPnJlZDsKKwlncmVlbiAgID0gY21hcC0+Z3JlZW47CisJYmx1ZSAgICA9IGNtYXAtPmJsdWU7CisJdHJhbnNwICA9IGNtYXAtPnRyYW5zcDsKKwlpbmRleCAgID0gY21hcC0+c3RhcnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBjbWFwLT5sZW47IGNvdW50KyspIHsKKwkJaWYgKHRyYW5zcCkKKwkJCXRyYW5zID0gKnRyYW5zcCsrOworCQlyID0gX3NldGNvbHJlZyhpbmZvLCBpbmRleCsrLCAqcmVkKyssICpncmVlbisrLCAqYmx1ZSsrLCB0cmFucywKKwkJCQljb3VudCA9PSBjbWFwLT5sZW4gLSAxKTsKKwkJaWYgKHIgIT0gMCkKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl91cGRhdGVfZnVsbF9zY3JlZW4oc3RydWN0IGZiX2luZm8gKmZiaSk7CisKK3N0YXRpYyBpbnQgb21hcGZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IGRvX3VwZGF0ZSA9IDA7CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlzd2l0Y2ggKGJsYW5rKSB7CisJY2FzZSBWRVNBX05PX0JMQU5LSU5HOgorCQlpZiAoZmJkZXYtPnN0YXRlID09IE9NQVBGQl9TVVNQRU5ERUQpIHsKKwkJCWlmIChmYmRldi0+Y3RybC0+cmVzdW1lKQorCQkJCWZiZGV2LT5jdHJsLT5yZXN1bWUoKTsKKwkJCWZiZGV2LT5wYW5lbC0+ZW5hYmxlKGZiZGV2LT5wYW5lbCk7CisJCQlmYmRldi0+c3RhdGUgPSBPTUFQRkJfQUNUSVZFOworCQkJaWYgKGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUoKSA9PQorCQkJCQlPTUFQRkJfTUFOVUFMX1VQREFURSkKKwkJCQlkb191cGRhdGUgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgVkVTQV9QT1dFUkRPV046CisJCWlmIChmYmRldi0+c3RhdGUgPT0gT01BUEZCX0FDVElWRSkgeworCQkJZmJkZXYtPnBhbmVsLT5kaXNhYmxlKGZiZGV2LT5wYW5lbCk7CisJCQlpZiAoZmJkZXYtPmN0cmwtPnN1c3BlbmQpCisJCQkJZmJkZXYtPmN0cmwtPnN1c3BlbmQoKTsKKwkJCWZiZGV2LT5zdGF0ZSA9IE9NQVBGQl9TVVNQRU5ERUQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCWlmIChyID09IDAgJiYgZG9fdXBkYXRlKQorCQlyID0gb21hcGZiX3VwZGF0ZV9mdWxsX3NjcmVlbihmYmkpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAoZmJkZXYtPmN0cmwtPnN5bmMpCisJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworfQorCisvKgorICogU2V0IGZiX2luZm8uZml4IGZpZWxkcyBhbmQgYWxzbyB1cGRhdGVzIGZiZGV2LgorICogV2hlbiBjYWxsaW5nIHRoaXMgZmJfaW5mby52YXIgbXVzdCBiZSBzZXQgdXAgYWxyZWFkeS4KKyAqLworc3RhdGljIHZvaWQgc2V0X2ZiX2ZpeChzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmZiaS0+Zml4OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmZiaS0+dmFyOworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmc7CisJaW50IGJwcDsKKworCXJnID0gJnBsYW5lLT5mYmRldi0+bWVtX2Rlc2MucmVnaW9uW3BsYW5lLT5pZHhdOworCWZiaS0+c2NyZWVuX2Jhc2UJPSAoY2hhciBfX2lvbWVtICopcmctPnZhZGRyOworCWZpeC0+c21lbV9zdGFydAkJPSByZy0+cGFkZHI7CisJZml4LT5zbWVtX2xlbgkJPSByZy0+c2l6ZTsKKworCWZpeC0+dHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOworCWlmICh2YXItPm5vbnN0ZCkKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJZWxzZSBzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDE2OgorCWNhc2UgMTI6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJLyogMTJicHAgaXMgc3RvcmVkIGluIDE2IGJpdHMgKi8KKwkJYnBwID0gMTY7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSA0OgorCWNhc2UgODoKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CisJCWJyZWFrOworCX0KKwlmaXgtPmFjY2VsCQk9IEZCX0FDQ0VMX09NQVAxNjEwOworCWZpeC0+bGluZV9sZW5ndGgJPSB2YXItPnhyZXNfdmlydHVhbCAqIGJwcCAvIDg7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbG9yX21vZGUoc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lLAorCQkJICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzd2l0Y2ggKHZhci0+bm9uc3RkKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSAxNjsKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSB2YXItPm5vbnN0ZDsKKwkJcmV0dXJuIDA7CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVWNDIwOgorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gMTI7CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gdmFyLT5ub25zdGQ7CisJCXJldHVybiAwOworCWNhc2UgT01BUEZCX0NPTE9SX1lVWTQyMjoKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDE2OworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IHZhci0+bm9uc3RkOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDE6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX0NMVVRfMUJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSAyOgorCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9DTFVUXzJCUFA7CisJCXJldHVybiAwOworCWNhc2UgNDoKKwkJcGxhbmUtPmNvbG9yX21vZGUgPSBPTUFQRkJfQ09MT1JfQ0xVVF80QlBQOworCQlyZXR1cm4gMDsKKwljYXNlIDg6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX0NMVVRfOEJQUDsKKwkJcmV0dXJuIDA7CisJY2FzZSAxMjoKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IDE2OworCQlwbGFuZS0+Y29sb3JfbW9kZSA9IE9NQVBGQl9DT0xPUl9SR0I0NDQ7CisJCXJldHVybiAwOworCWNhc2UgMTY6CisJCXBsYW5lLT5jb2xvcl9tb2RlID0gT01BUEZCX0NPTE9SX1JHQjU2NTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogQ2hlY2sgdGhlIHZhbHVlcyBpbiB2YXIgYWdhaW5zdCBvdXIgY2FwYWJpbGl0aWVzIGFuZCBpbiBjYXNlIG9mIG91dCBvZgorICogYm91bmQgdmFsdWVzIHRyeSB0byBhZGp1c3QgdGhlbS4KKyAqLworc3RhdGljIGludCBzZXRfZmJfdmFyKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCSAgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCWludAkJYnBwOworCXVuc2lnbmVkIGxvbmcJbWF4X2ZyYW1lX3NpemU7CisJdW5zaWduZWQgbG9uZwlsaW5lX3NpemU7CisJaW50CQl4cmVzX21pbiwgeHJlc19tYXg7CisJaW50CQl5cmVzX21pbiwgeXJlc19tYXg7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBsY2RfcGFuZWwgKnBhbmVsID0gZmJkZXYtPnBhbmVsOworCisJaWYgKHNldF9jb2xvcl9tb2RlKHBsYW5lLCB2YXIpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOworCWlmIChwbGFuZS0+Y29sb3JfbW9kZSA9PSBPTUFQRkJfQ09MT1JfUkdCNDQ0KQorCQlicHAgPSAxNjsKKworCXN3aXRjaCAodmFyLT5yb3RhdGUpIHsKKwljYXNlIDA6CisJY2FzZSAxODA6CisJCXhyZXNfbWluID0gT01BUEZCX1BMQU5FX1hSRVNfTUlOOworCQl4cmVzX21heCA9IHBhbmVsLT54X3JlczsKKwkJeXJlc19taW4gPSBPTUFQRkJfUExBTkVfWVJFU19NSU47CisJCXlyZXNfbWF4ID0gcGFuZWwtPnlfcmVzOworCQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCXZhci0+eHJlcyA9IHBhbmVsLT54X3JlczsKKwkJCXZhci0+eXJlcyA9IHBhbmVsLT55X3JlczsKKwkJfQorCQlicmVhazsKKwljYXNlIDkwOgorCWNhc2UgMjcwOgorCQl4cmVzX21pbiA9IE9NQVBGQl9QTEFORV9ZUkVTX01JTjsKKwkJeHJlc19tYXggPSBwYW5lbC0+eV9yZXM7CisJCXlyZXNfbWluID0gT01BUEZCX1BMQU5FX1hSRVNfTUlOOworCQl5cmVzX21heCA9IHBhbmVsLT54X3JlczsKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQl2YXItPnhyZXMgPSBwYW5lbC0+eV9yZXM7CisJCQl2YXItPnlyZXMgPSBwYW5lbC0+eF9yZXM7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhci0+eHJlcyA8IHhyZXNfbWluKQorCQl2YXItPnhyZXMgPSB4cmVzX21pbjsKKwlpZiAodmFyLT55cmVzIDwgeXJlc19taW4pCisJCXZhci0+eXJlcyA9IHlyZXNfbWluOworCWlmICh2YXItPnhyZXMgPiB4cmVzX21heCkKKwkJdmFyLT54cmVzID0geHJlc19tYXg7CisJaWYgKHZhci0+eXJlcyA+IHlyZXNfbWF4KQorCQl2YXItPnlyZXMgPSB5cmVzX21heDsKKworCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKKwkJdmFyLT54cmVzX3ZpcnR1YWwgPSB2YXItPnhyZXM7CisJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQorCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKwltYXhfZnJhbWVfc2l6ZSA9IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF0uc2l6ZTsKKwlsaW5lX3NpemUgPSB2YXItPnhyZXNfdmlydHVhbCAqIGJwcCAvIDg7CisJaWYgKGxpbmVfc2l6ZSAqIHZhci0+eXJlc192aXJ0dWFsID4gbWF4X2ZyYW1lX3NpemUpIHsKKwkJLyogVHJ5IHRvIGtlZXAgeXJlc192aXJ0dWFsIGZpcnN0ICovCisJCWxpbmVfc2l6ZSA9IG1heF9mcmFtZV9zaXplIC8gdmFyLT55cmVzX3ZpcnR1YWw7CisJCXZhci0+eHJlc192aXJ0dWFsID0gbGluZV9zaXplICogOCAvIGJwcDsKKwkJaWYgKHZhci0+eHJlc192aXJ0dWFsIDwgdmFyLT54cmVzKSB7CisJCQkvKiBTdGlsbCBkb2Vzbid0IGZpdC4gU2hyaW5rIHlyZXNfdmlydHVhbCB0b28gKi8KKwkJCXZhci0+eHJlc192aXJ0dWFsID0gdmFyLT54cmVzOworCQkJbGluZV9zaXplID0gdmFyLT54cmVzICogYnBwIC8gODsKKwkJCXZhci0+eXJlc192aXJ0dWFsID0gbWF4X2ZyYW1lX3NpemUgLyBsaW5lX3NpemU7CisJCX0KKwkJLyogUmVjaGVjayB0aGlzLCBhcyB0aGUgdmlydHVhbCBzaXplIGNoYW5nZWQuICovCisJCWlmICh2YXItPnhyZXNfdmlydHVhbCA8IHZhci0+eHJlcykKKwkJCXZhci0+eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsOworCQlpZiAodmFyLT55cmVzX3ZpcnR1YWwgPCB2YXItPnlyZXMpCisJCQl2YXItPnlyZXMgPSB2YXItPnlyZXNfdmlydHVhbDsKKwkJaWYgKHZhci0+eHJlcyA8IHhyZXNfbWluIHx8IHZhci0+eXJlcyA8IHlyZXNfbWluKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh2YXItPnhyZXMgKyB2YXItPnhvZmZzZXQgPiB2YXItPnhyZXNfdmlydHVhbCkKKwkJdmFyLT54b2Zmc2V0ID0gdmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXM7CisJaWYgKHZhci0+eXJlcyArIHZhci0+eW9mZnNldCA+IHZhci0+eXJlc192aXJ0dWFsKQorCQl2YXItPnlvZmZzZXQgPSB2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlczsKKwlsaW5lX3NpemUgPSB2YXItPnhyZXMgKiBicHAgLyA4OworCisJaWYgKHBsYW5lLT5jb2xvcl9tb2RlID09IE9NQVBGQl9DT0xPUl9SR0I0NDQpIHsKKwkJdmFyLT5yZWQub2Zmc2V0CSAgPSA4OyB2YXItPnJlZC5sZW5ndGgJID0gNDsKKwkJCQkJCXZhci0+cmVkLm1zYl9yaWdodCAgID0gMDsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA0OyB2YXItPmdyZWVuLmxlbmd0aCA9IDQ7CisJCQkJCQl2YXItPmdyZWVuLm1zYl9yaWdodCA9IDA7CisJCXZhci0+Ymx1ZS5vZmZzZXQgID0gMDsgdmFyLT5ibHVlLmxlbmd0aCAgPSA0OworCQkJCQkJdmFyLT5ibHVlLm1zYl9yaWdodCAgPSAwOworCX0gZWxzZSB7CisJCXZhci0+cmVkLm9mZnNldAkgPSAxMTsgdmFyLT5yZWQubGVuZ3RoCSA9IDU7CisJCQkJCQl2YXItPnJlZC5tc2JfcmlnaHQgICA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsgIHZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKKwkJCQkJCXZhci0+Z3JlZW4ubXNiX3JpZ2h0ID0gMDsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7ICB2YXItPmJsdWUubGVuZ3RoICA9IDU7CisJCQkJCQl2YXItPmJsdWUubXNiX3JpZ2h0ICA9IDA7CisJfQorCisJdmFyLT5oZWlnaHQJCT0gLTE7CisJdmFyLT53aWR0aAkJPSAtMTsKKwl2YXItPmdyYXlzY2FsZQkJPSAwOworCisJLyogcGl4Y2xvY2sgaW4gcHMsIHRoZSByZXN0IGluIHBpeGNsb2NrICovCisJdmFyLT5waXhjbG9jawkJPSAxMDAwMDAwMCAvIChwYW5lbC0+cGl4ZWxfY2xvY2sgLyAxMDApOworCXZhci0+bGVmdF9tYXJnaW4JPSBwYW5lbC0+aGZwOworCXZhci0+cmlnaHRfbWFyZ2luCT0gcGFuZWwtPmhicDsKKwl2YXItPnVwcGVyX21hcmdpbgk9IHBhbmVsLT52ZnA7CisJdmFyLT5sb3dlcl9tYXJnaW4JPSBwYW5lbC0+dmJwOworCXZhci0+aHN5bmNfbGVuCQk9IHBhbmVsLT5oc3c7CisJdmFyLT52c3luY19sZW4JCT0gcGFuZWwtPnZzdzsKKworCS8qIFRPRE86IGdldCB0aGVzZSBmcm9tIHBhbmVsLT5jb25maWcgKi8KKwl2YXItPnZtb2RlCQk9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CisJdmFyLT5zeW5jCQk9IDA7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBTZXQgcm90YXRpb24gKDAsIDkwLCAxODAsIDI3MCBkZWdyZWUpLCBhbmQgc3dpdGNoIHRvIHRoZSBuZXcgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIG9tYXBmYl9yb3RhdGUoc3RydWN0IGZiX2luZm8gKmZiaSwgaW50IHJvdGF0ZSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmIChjcHVfaXNfb21hcDE1eHgoKSAmJiByb3RhdGUgIT0gZmJpLT52YXIucm90YXRlKSB7CisJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqbmV3X3ZhciA9ICZmYmRldi0+bmV3X3ZhcjsKKworCQltZW1jcHkobmV3X3ZhciwgJmZiaS0+dmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJbmV3X3Zhci0+cm90YXRlID0gcm90YXRlOworCQlpZiAoc2V0X2ZiX3ZhcihmYmksIG5ld192YXIpID09IDAgJiYKKwkJICAgIG1lbWNtcChuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpKSB7CisJCQltZW1jcHkoJmZiaS0+dmFyLCBuZXdfdmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJCWN0cmxfY2hhbmdlX21vZGUoZmJpKTsKKwkJfQorCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7Cit9CisKKy8qCisgKiBTZXQgbmV3IHgseSBvZmZzZXRzIGluIHRoZSB2aXJ0dWFsIGRpc3BsYXkgZm9yIHRoZSB2aXNpYmxlIGFyZWEgYW5kIHN3aXRjaAorICogdG8gdGhlIG5ldyBtb2RlLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlpbnQgciA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCWlmICh2YXItPnhvZmZzZXQgIT0gZmJpLT52YXIueG9mZnNldCB8fAorCSAgICB2YXItPnlvZmZzZXQgIT0gZmJpLT52YXIueW9mZnNldCkgeworCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKm5ld192YXIgPSAmZmJkZXYtPm5ld192YXI7CisKKwkJbWVtY3B5KG5ld192YXIsICZmYmktPnZhciwgc2l6ZW9mKCpuZXdfdmFyKSk7CisJCW5ld192YXItPnhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7CisJCW5ld192YXItPnlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CisJCWlmIChzZXRfZmJfdmFyKGZiaSwgbmV3X3ZhcikpCisJCQlyID0gLUVJTlZBTDsKKwkJZWxzZSB7CisJCQltZW1jcHkoJmZiaS0+dmFyLCBuZXdfdmFyLCBzaXplb2YoKm5ld192YXIpKTsKKwkJCWN0cmxfY2hhbmdlX21vZGUoZmJpKTsKKwkJfQorCX0KKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworLyogU2V0IG1pcnJvciB0byB2ZXJ0aWNhbCBheGlzIGFuZCBzd2l0Y2ggdG8gdGhlIG5ldyBtb2RlLiAqLworc3RhdGljIGludCBvbWFwZmJfbWlycm9yKHN0cnVjdCBmYl9pbmZvICpmYmksIGludCBtaXJyb3IpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByID0gMDsKKworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJbWlycm9yID0gbWlycm9yID8gMSA6IDA7CisJaWYgKGNwdV9pc19vbWFwMTV4eCgpKQorCQlyID0gLUVJTlZBTDsKKwllbHNlIGlmIChtaXJyb3IgIT0gcGxhbmUtPmluZm8ubWlycm9yKSB7CisJCXBsYW5lLT5pbmZvLm1pcnJvciA9IG1pcnJvcjsKKwkJciA9IGN0cmxfY2hhbmdlX21vZGUoZmJpKTsKKwl9CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBDaGVjayB2YWx1ZXMgaW4gdmFyLCB0cnkgdG8gYWRqdXN0IHRoZW0gaW4gY2FzZSBvZiBvdXQgb2YgYm91bmQgdmFsdWVzIGlmCisgKiBwb3NzaWJsZSwgb3IgcmV0dXJuIGVycm9yLgorICovCitzdGF0aWMgaW50IG9tYXBmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICpmYmkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAoZmJkZXYtPmN0cmwtPnN5bmMgIT0gTlVMTCkKKwkJZmJkZXYtPmN0cmwtPnN5bmMoKTsKKwlyID0gc2V0X2ZiX3ZhcihmYmksIHZhcik7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBTd2l0Y2ggdG8gYSBuZXcgbW9kZS4gVGhlIHBhcmFtZXRlcnMgZm9yIGl0IGhhcyBiZWVuIGNoZWNrIGFscmVhZHkgYnkKKyAqIG9tYXBmYl9jaGVja192YXIuCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmZiaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJaW50IHIgPSAwOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlzZXRfZmJfZml4KGZiaSk7CisJciA9IGN0cmxfY2hhbmdlX21vZGUoZmJpKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworaW50IG9tYXBmYl91cGRhdGVfd2luZG93X2FzeW5jKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCQkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLAorCQkJCXZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyOworCisJdmFyID0gJmZiaS0+dmFyOworCWlmICh3aW4tPnggPj0gdmFyLT54cmVzIHx8IHdpbi0+eSA+PSB2YXItPnlyZXMgfHwKKwkgICAgd2luLT5vdXRfeCA+IHZhci0+eHJlcyB8fCB3aW4tPm91dF95ID49IHZhci0+eXJlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93IHx8CisJICAgIGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUoKSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAod2luLT54ICsgd2luLT53aWR0aCA+PSB2YXItPnhyZXMpCisJCXdpbi0+d2lkdGggPSB2YXItPnhyZXMgLSB3aW4tPng7CisJaWYgKHdpbi0+eSArIHdpbi0+aGVpZ2h0ID49IHZhci0+eXJlcykKKwkJd2luLT5oZWlnaHQgPSB2YXItPnlyZXMgLSB3aW4tPnk7CisJLyogVGhlIG91dCBzaXplcyBzaG91bGQgYmUgY3JvcHBlZCB0byB0aGUgTENEIHNpemUgKi8KKwlpZiAod2luLT5vdXRfeCArIHdpbi0+b3V0X3dpZHRoID4gZmJkZXYtPnBhbmVsLT54X3JlcykKKwkJd2luLT5vdXRfd2lkdGggPSBmYmRldi0+cGFuZWwtPnhfcmVzIC0gd2luLT5vdXRfeDsKKwlpZiAod2luLT5vdXRfeSArIHdpbi0+b3V0X2hlaWdodCA+IGZiZGV2LT5wYW5lbC0+eV9yZXMpCisJCXdpbi0+b3V0X2hlaWdodCA9IGZiZGV2LT5wYW5lbC0+eV9yZXMgLSB3aW4tPm91dF95OworCWlmICghd2luLT53aWR0aCB8fCAhd2luLT5oZWlnaHQgfHwgIXdpbi0+b3V0X3dpZHRoIHx8ICF3aW4tPm91dF9oZWlnaHQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGZiZGV2LT5jdHJsLT51cGRhdGVfd2luZG93KGZiaSwgd2luLCBjYWxsYmFjaywgY2FsbGJhY2tfZGF0YSk7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl91cGRhdGVfd2luZG93X2FzeW5jKTsKKworc3RhdGljIGludCBvbWFwZmJfdXBkYXRlX3dpbihzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCXN0cnVjdCBvbWFwZmJfdXBkYXRlX3dpbmRvdyAqd2luKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCWludCByZXQ7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2socGxhbmUtPmZiZGV2KTsKKwlyZXQgPSBvbWFwZmJfdXBkYXRlX3dpbmRvd19hc3luYyhmYmksIHdpbiwgTlVMTCwgMCk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2socGxhbmUtPmZiZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX3VwZGF0ZV9mdWxsX3NjcmVlbihzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgd2luOworCWludCByOworCisJaWYgKCFmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyB8fAorCSAgICBmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCkgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAtRU5PREVWOworCisJd2luLnggPSAwOworCXdpbi55ID0gMDsKKwl3aW4ud2lkdGggPSBmYmktPnZhci54cmVzOworCXdpbi5oZWlnaHQgPSBmYmktPnZhci55cmVzOworCXdpbi5vdXRfeCA9IDA7CisJd2luLm91dF95ID0gMDsKKwl3aW4ub3V0X3dpZHRoID0gZmJpLT52YXIueHJlczsKKwl3aW4ub3V0X2hlaWdodCA9IGZiaS0+dmFyLnlyZXM7CisJd2luLmZvcm1hdCA9IDA7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyhmYmksICZ3aW4sIE5VTEwsIDApOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXR1cF9wbGFuZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8gKnBpKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCA9IGZiZGV2LT5wYW5lbDsKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX2luZm8gb2xkX2luZm87CisJaW50IHIgPSAwOworCisJaWYgKHBpLT5wb3NfeCArIHBpLT5vdXRfd2lkdGggPiBwYW5lbC0+eF9yZXMgfHwKKwkgICAgcGktPnBvc195ICsgcGktPm91dF9oZWlnaHQgPiBwYW5lbC0+eV9yZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlpZiAocGktPmVuYWJsZWQgJiYgIWZiZGV2LT5tZW1fZGVzYy5yZWdpb25bcGxhbmUtPmlkeF0uc2l6ZSkgeworCQkvKgorCQkgKiBUaGlzIHBsYW5lJ3MgbWVtb3J5IHdhcyBmcmVlZCwgY2FuJ3QgZW5hYmxlIGl0CisJCSAqIHVudGlsIGl0J3MgcmVhbGxvY2F0ZWQuCisJCSAqLworCQlyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCW9sZF9pbmZvID0gcGxhbmUtPmluZm87CisJcGxhbmUtPmluZm8gPSAqcGk7CisJaWYgKHBpLT5lbmFibGVkKSB7CisJCXIgPSBjdHJsX2NoYW5nZV9tb2RlKGZiaSk7CisJCWlmIChyIDwgMCkgeworCQkJcGxhbmUtPmluZm8gPSBvbGRfaW5mbzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXIgPSBmYmRldi0+Y3RybC0+ZW5hYmxlX3BsYW5lKHBsYW5lLT5pZHgsIHBpLT5lbmFibGVkKTsKKwlpZiAociA8IDApIHsKKwkJcGxhbmUtPmluZm8gPSBvbGRfaW5mbzsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfcXVlcnlfcGxhbmUoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvICpwaSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKworCSpwaSA9IHBsYW5lLT5pbmZvOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9zZXR1cF9tZW0oc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBmYl9tZW1faW5mbyAqbWkpCit7CisJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCXN0cnVjdCBvbWFwZmJfbWVtX3JlZ2lvbiAqcmcgPSAmZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XTsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgciA9IDA7CisKKwlpZiAoZmJkZXYtPmN0cmwtPnNldHVwX21lbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAobWktPnR5cGUgPiBPTUFQRkJfTUVNVFlQRV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9IFBBR0VfQUxJR04obWktPnNpemUpOworCW9tYXBmYl9ycXVldWVfbG9jayhmYmRldik7CisJaWYgKHBsYW5lLT5pbmZvLmVuYWJsZWQpIHsKKwkJciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChyZy0+c2l6ZSAhPSBzaXplIHx8IHJnLT50eXBlICE9IG1pLT50eXBlKSB7CisJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqbmV3X3ZhciA9ICZmYmRldi0+bmV3X3ZhcjsKKwkJdW5zaWduZWQgbG9uZyBvbGRfc2l6ZSA9IHJnLT5zaXplOworCQl1OAkgICAgICBvbGRfdHlwZSA9IHJnLT50eXBlOworCQl1bnNpZ25lZCBsb25nIHBhZGRyOworCisJCXJnLT5zaXplID0gc2l6ZTsKKwkJcmctPnR5cGUgPSBtaS0+dHlwZTsKKwkJLyoKKwkJICogc2l6ZSA9PSAwIGlzIGEgc3BlY2lhbCBjYXNlLCBmb3Igd2hpY2ggd2UKKwkJICogZG9uJ3QgY2hlY2sgLyBhZGp1c3QgdGhlIHNjcmVlbiBwYXJhbWV0ZXJzLgorCQkgKiBUaGlzIGlzbid0IGEgcHJvYmxlbSBzaW5jZSB0aGUgcGxhbmUgY2FuJ3QKKwkJICogYmUgcmVlbmFibGVkIHVubGVzcyBpdHMgc2l6ZSBpcyA+IDAuCisJCSAqLworCQlpZiAob2xkX3NpemUgIT0gc2l6ZSAmJiBzaXplKSB7CisJCQlpZiAoc2l6ZSkgeworCQkJCW1lbWNweShuZXdfdmFyLCAmZmJpLT52YXIsIHNpemVvZigqbmV3X3ZhcikpOworCQkJCXIgPSBzZXRfZmJfdmFyKGZiaSwgbmV3X3Zhcik7CisJCQkJaWYgKHIgPCAwKQorCQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWlmIChmYmRldi0+Y3RybC0+c3luYykKKwkJCWZiZGV2LT5jdHJsLT5zeW5jKCk7CisJCXIgPSBmYmRldi0+Y3RybC0+c2V0dXBfbWVtKHBsYW5lLT5pZHgsIHNpemUsIG1pLT50eXBlLCAmcGFkZHIpOworCQlpZiAociA8IDApIHsKKwkJCS8qIFJldmVydCBjaGFuZ2VzLiAqLworCQkJcmctPnNpemUgPSBvbGRfc2l6ZTsKKwkJCXJnLT50eXBlID0gb2xkX3R5cGU7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZy0+cGFkZHIgPSBwYWRkcjsKKworCQlpZiAob2xkX3NpemUgIT0gc2l6ZSkgeworCQkJaWYgKHNpemUpIHsKKwkJCQltZW1jcHkoJmZiaS0+dmFyLCBuZXdfdmFyLCBzaXplb2YoZmJpLT52YXIpKTsKKwkJCQlzZXRfZmJfZml4KGZiaSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogU2V0IHRoZXNlIGV4cGxpY2l0bHkgdG8gaW5kaWNhdGUgdGhhdCB0aGUKKwkJCQkgKiBwbGFuZSBtZW1vcnkgaXMgZGVhbGxvY2UnZCwgdGhlIG90aGVyCisJCQkJICogc2NyZWVuIHBhcmFtZXRlcnMgaW4gdmFyIC8gZml4IGFyZSBpbnZhbGlkLgorCQkJCSAqLworCQkJCWZiaS0+Zml4LnNtZW1fc3RhcnQgPSAwOworCQkJCWZiaS0+Zml4LnNtZW1fbGVuID0gMDsKKwkJCX0KKwkJfQorCX0KK291dDoKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfcXVlcnlfbWVtKHN0cnVjdCBmYl9pbmZvICpmYmksIHN0cnVjdCBvbWFwZmJfbWVtX2luZm8gKm1pKQoreworCXN0cnVjdCBvbWFwZmJfcGxhbmVfc3RydWN0ICpwbGFuZSA9IGZiaS0+cGFyOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYW5lLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX21lbV9yZWdpb24gKnJnOworCisJcmcgPSAmZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbltwbGFuZS0+aWR4XTsKKwltZW1zZXQobWksIDAsIHNpemVvZigqbWkpKTsKKwltaS0+c2l6ZSA9IHJnLT5zaXplOworCW1pLT50eXBlID0gcmctPnR5cGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwZmJfc2V0X2NvbG9yX2tleShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsCisJCQkJc3RydWN0IG9tYXBmYl9jb2xvcl9rZXkgKmNrKQoreworCWludCByOworCisJaWYgKCFmYmRldi0+Y3RybC0+c2V0X2NvbG9yX2tleSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+c2V0X2NvbG9yX2tleShjayk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgb21hcGZiX2dldF9jb2xvcl9rZXkoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LAorCQkJCXN0cnVjdCBvbWFwZmJfY29sb3Jfa2V5ICpjaykKK3sKKwlpbnQgcjsKKworCWlmICghZmJkZXYtPmN0cmwtPmdldF9jb2xvcl9rZXkpCisJCXJldHVybiAtRU5PREVWOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPmdldF9jb2xvcl9rZXkoY2spOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgb21hcGZiX2NsaWVudF9saXN0W09NQVBGQl9QTEFORV9OVU1dOworc3RhdGljIGludCBub3RpZmllcl9pbml0ZWQ7CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9pbml0X25vdGlmaWVyKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT01BUEZCX1BMQU5FX05VTTsgaSsrKQorCQlCTE9DS0lOR19JTklUX05PVElGSUVSX0hFQUQoJm9tYXBmYl9jbGllbnRfbGlzdFtpXSk7Cit9CisKK2ludCBvbWFwZmJfcmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBvbWFwZmJfbm90aWZpZXJfYmxvY2sgKm9tYXBmYl9uYiwKKwkJCQlvbWFwZmJfbm90aWZpZXJfY2FsbGJhY2tfdCBjYWxsYmFjaywKKwkJCQl2b2lkICpjYWxsYmFja19kYXRhKQoreworCWludCByOworCisJaWYgKCh1bnNpZ25lZClvbWFwZmJfbmItPnBsYW5lX2lkeCA+IE9NQVBGQl9QTEFORV9OVU0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFub3RpZmllcl9pbml0ZWQpIHsKKwkJb21hcGZiX2luaXRfbm90aWZpZXIoKTsKKwkJbm90aWZpZXJfaW5pdGVkID0gMTsKKwl9CisKKwlvbWFwZmJfbmItPm5iLm5vdGlmaWVyX2NhbGwgPSAoaW50ICgqKShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwKKwkJCQkJdW5zaWduZWQgbG9uZywgdm9pZCAqKSljYWxsYmFjazsKKwlvbWFwZmJfbmItPmRhdGEgPSBjYWxsYmFja19kYXRhOworCXIgPSBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigKKwkJCQkmb21hcGZiX2NsaWVudF9saXN0W29tYXBmYl9uYi0+cGxhbmVfaWR4XSwKKwkJCQkmb21hcGZiX25iLT5uYik7CisJaWYgKHIpCisJCXJldHVybiByOworCWlmIChvbWFwZmJfZGV2ICE9IE5VTEwgJiYKKwkgICAgb21hcGZiX2Rldi0+Y3RybCAmJiBvbWFwZmJfZGV2LT5jdHJsLT5iaW5kX2NsaWVudCkgeworCQlvbWFwZmJfZGV2LT5jdHJsLT5iaW5kX2NsaWVudChvbWFwZmJfbmIpOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfcmVnaXN0ZXJfY2xpZW50KTsKKworaW50IG9tYXBmYl91bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3Qgb21hcGZiX25vdGlmaWVyX2Jsb2NrICpvbWFwZmJfbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoCisJCSZvbWFwZmJfY2xpZW50X2xpc3Rbb21hcGZiX25iLT5wbGFuZV9pZHhdLCAmb21hcGZiX25iLT5uYik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBmYl91bnJlZ2lzdGVyX2NsaWVudCk7CisKK3ZvaWQgb21hcGZiX25vdGlmeV9jbGllbnRzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgdW5zaWduZWQgbG9uZyBldmVudCkKK3sKKwlpbnQgaTsKKworCWlmICghbm90aWZpZXJfaW5pdGVkKQorCQkvKiBubyBjbGllbnQgcmVnaXN0ZXJlZCB5ZXQgKi8KKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IE9NQVBGQl9QTEFORV9OVU07IGkrKykKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmb21hcGZiX2NsaWVudF9saXN0W2ldLCBldmVudCwKKwkJCQkgICAgZmJkZXYtPmZiX2luZm9baV0pOworfQorRVhQT1JUX1NZTUJPTChvbWFwZmJfbm90aWZ5X2NsaWVudHMpOworCitzdGF0aWMgaW50IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LAorCQkJCSAgIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaW50IHI7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+c2V0X3VwZGF0ZV9tb2RlKG1vZGUpOworCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgb21hcGZiX2dldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJaW50IHI7CisKKwlvbWFwZmJfcnF1ZXVlX2xvY2soZmJkZXYpOworCXIgPSBmYmRldi0+Y3RybC0+Z2V0X3VwZGF0ZV9tb2RlKCk7CisJb21hcGZiX3JxdWV1ZV91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBmYl9nZXRfY2FwcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBwbGFuZSwKKwkJCQkgICAgIHN0cnVjdCBvbWFwZmJfY2FwcyAqY2FwcykKK3sKKwltZW1zZXQoY2FwcywgMCwgc2l6ZW9mKCpjYXBzKSk7CisJZmJkZXYtPmN0cmwtPmdldF9jYXBzKHBsYW5lLCBjYXBzKTsKKwljYXBzLT5jdHJsIHw9IGZiZGV2LT5wYW5lbC0+Z2V0X2NhcHMoZmJkZXYtPnBhbmVsKTsKK30KKworLyogRm9yIGxjZCB0ZXN0aW5nICovCit2b2lkIG9tYXBmYl93cml0ZV9maXJzdF9waXhlbChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIHUxNiBwaXh2YWwpCit7CisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwkqKHUxNiAqKWZiZGV2LT5tZW1fZGVzYy5yZWdpb25bMF0udmFkZHIgPSBwaXh2YWw7CisJaWYgKGZiZGV2LT5jdHJsLT5nZXRfdXBkYXRlX21vZGUoKSA9PSBPTUFQRkJfTUFOVUFMX1VQREFURSkgeworCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cgd2luOworCisJCW1lbXNldCgmd2luLCAwLCBzaXplb2Yod2luKSk7CisJCXdpbi53aWR0aCA9IDI7CisJCXdpbi5oZWlnaHQgPSAyOworCQl3aW4ub3V0X3dpZHRoID0gMjsKKwkJd2luLm91dF9oZWlnaHQgPSAyOworCQlmYmRldi0+Y3RybC0+dXBkYXRlX3dpbmRvdyhmYmRldi0+ZmJfaW5mb1swXSwgJndpbiwgTlVMTCwgMCk7CisJfQorCW9tYXBmYl9ycXVldWVfdW5sb2NrKGZiZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wob21hcGZiX3dyaXRlX2ZpcnN0X3BpeGVsKTsKKworLyoKKyAqIElvY3RsIGludGVyZmFjZS4gUGFydCBvZiB0aGUga2VybmVsIG1vZGUgZnJhbWUgYnVmZmVyIEFQSSBpcyBkdXBsaWNhdGVkCisgKiBoZXJlIHRvIGJlIGFjY2Vzc2libGUgYnkgdXNlciBtb2RlIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgb21hcGZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICpmYmksIHVuc2lnbmVkIGludCBjbWQsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBmYmktPnBhcjsKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXYgPSBwbGFuZS0+ZmJkZXY7CisJc3RydWN0IGZiX29wcwkJKm9wcyA9IGZiaS0+ZmJvcHM7CisJdW5pb24geworCQlzdHJ1Y3Qgb21hcGZiX3VwZGF0ZV93aW5kb3cJdXBkYXRlX3dpbmRvdzsKKwkJc3RydWN0IG9tYXBmYl9wbGFuZV9pbmZvCXBsYW5lX2luZm87CisJCXN0cnVjdCBvbWFwZmJfbWVtX2luZm8JCW1lbV9pbmZvOworCQlzdHJ1Y3Qgb21hcGZiX2NvbG9yX2tleQkJY29sb3Jfa2V5OworCQllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQkJdXBkYXRlX21vZGU7CisJCXN0cnVjdCBvbWFwZmJfY2FwcwkJY2FwczsKKwkJdW5zaWduZWQgaW50CQltaXJyb3I7CisJCWludAkJCXBsYW5lX291dDsKKwkJaW50CQkJZW5hYmxlX3BsYW5lOworCX0gcDsKKwlpbnQgciA9IDA7CisKKwlCVUdfT04oIW9wcyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9NQVBGQl9NSVJST1I6CisJCWlmIChnZXRfdXNlcihwLm1pcnJvciwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCW9tYXBmYl9taXJyb3IoZmJpLCBwLm1pcnJvcik7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NZTkNfR0ZYOgorCQlvbWFwZmJfc3luYyhmYmkpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9WU1lOQzoKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU0VUX1VQREFURV9NT0RFOgorCQlpZiAoZ2V0X3VzZXIocC51cGRhdGVfbW9kZSwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKGZiZGV2LCBwLnVwZGF0ZV9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfR0VUX1VQREFURV9NT0RFOgorCQlwLnVwZGF0ZV9tb2RlID0gb21hcGZiX2dldF91cGRhdGVfbW9kZShmYmRldik7CisJCWlmIChwdXRfdXNlcihwLnVwZGF0ZV9tb2RlLAorCQkJCQkoZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgX191c2VyICopYXJnKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfV0lORE9XX09MRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLnVwZGF0ZV93aW5kb3csICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93X29sZCkpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UgeworCQkJc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp1ID0gJnAudXBkYXRlX3dpbmRvdzsKKwkJCXUtPm91dF94ID0gdS0+eDsKKwkJCXUtPm91dF95ID0gdS0+eTsKKwkJCXUtPm91dF93aWR0aCA9IHUtPndpZHRoOworCQkJdS0+b3V0X2hlaWdodCA9IHUtPmhlaWdodDsKKwkJCW1lbXNldCh1LT5yZXNlcnZlZCwgMCwgc2l6ZW9mKHUtPnJlc2VydmVkKSk7CisJCQlyID0gb21hcGZiX3VwZGF0ZV93aW4oZmJpLCB1KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9NQVBGQl9VUERBVEVfV0lORE9XOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAudXBkYXRlX3dpbmRvdywgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLnVwZGF0ZV93aW5kb3cpKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3VwZGF0ZV93aW4oZmJpLCAmcC51cGRhdGVfd2luZG93KTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU0VUVVBfUExBTkU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcC5wbGFuZV9pbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHAucGxhbmVfaW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfc2V0dXBfcGxhbmUoZmJpLCAmcC5wbGFuZV9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfUVVFUllfUExBTkU6CisJCWlmICgociA9IG9tYXBmYl9xdWVyeV9wbGFuZShmYmksICZwLnBsYW5lX2luZm8pKSA8IDApCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLnBsYW5lX2luZm8sCisJCQkJICAgc2l6ZW9mKHAucGxhbmVfaW5mbykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1NFVFVQX01FTToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLm1lbV9pbmZvLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJICAgc2l6ZW9mKHAubWVtX2luZm8pKSkKKwkJCXIgPSAtRUZBVUxUOworCQllbHNlCisJCQlyID0gb21hcGZiX3NldHVwX21lbShmYmksICZwLm1lbV9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfUVVFUllfTUVNOgorCQlpZiAoKHIgPSBvbWFwZmJfcXVlcnlfbWVtKGZiaSwgJnAubWVtX2luZm8pKSA8IDApCisJCQlicmVhazsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLm1lbV9pbmZvLAorCQkJCSAgIHNpemVvZihwLm1lbV9pbmZvKSkpCisJCQlyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfU0VUX0NPTE9SX0tFWToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLmNvbG9yX2tleSwgKHZvaWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihwLmNvbG9yX2tleSkpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBvbWFwZmJfc2V0X2NvbG9yX2tleShmYmRldiwgJnAuY29sb3Jfa2V5KTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJfR0VUX0NPTE9SX0tFWToKKwkJaWYgKChyID0gb21hcGZiX2dldF9jb2xvcl9rZXkoZmJkZXYsICZwLmNvbG9yX2tleSkpIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnAuY29sb3Jfa2V5LAorCQkJCSBzaXplb2YocC5jb2xvcl9rZXkpKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9HRVRfQ0FQUzoKKwkJb21hcGZiX2dldF9jYXBzKGZiZGV2LCBwbGFuZS0+aWR4LCAmcC5jYXBzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZwLmNhcHMsIHNpemVvZihwLmNhcHMpKSkKKwkJCXIgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9MQ0RfVEVTVDoKKwkJeworCQkJaW50IHRlc3RfbnVtOworCisJCQlpZiAoZ2V0X3VzZXIodGVzdF9udW0sIChpbnQgX191c2VyICopYXJnKSkgeworCQkJCXIgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFmYmRldi0+cGFuZWwtPnJ1bl90ZXN0KSB7CisJCQkJciA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyID0gZmJkZXYtPnBhbmVsLT5ydW5fdGVzdChmYmRldi0+cGFuZWwsIHRlc3RfbnVtKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPTUFQRkJfQ1RSTF9URVNUOgorCQl7CisJCQlpbnQgdGVzdF9udW07CisKKwkJCWlmIChnZXRfdXNlcih0ZXN0X251bSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQkJciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWZiZGV2LT5jdHJsLT5ydW5fdGVzdCkgeworCQkJCXIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJciA9IGZiZGV2LT5jdHJsLT5ydW5fdGVzdCh0ZXN0X251bSk7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXIgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG9tYXBmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX3BsYW5lX3N0cnVjdCAqcGxhbmUgPSBpbmZvLT5wYXI7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhbmUtPmZiZGV2OworCWludCByOworCisJb21hcGZiX3JxdWV1ZV9sb2NrKGZiZGV2KTsKKwlyID0gZmJkZXYtPmN0cmwtPm1tYXAoaW5mbywgdm1hKTsKKwlvbWFwZmJfcnF1ZXVlX3VubG9jayhmYmRldik7CisKKwlyZXR1cm4gcjsKK30KKworLyoKKyAqIENhbGxiYWNrIHRhYmxlIGZvciB0aGUgZnJhbWUgYnVmZmVyIGZyYW1ld29yay4gU29tZSBvZiB0aGVzZSBwb2ludGVycworICogd2lsbCBiZSBjaGFuZ2VkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZXR0aW5nIG9mIGZiX2luZm8tPmFjY2VsX2ZsYWdzLgorICovCitzdGF0aWMgc3RydWN0IGZiX29wcyBvbWFwZmJfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmJfb3BlbiAgICAgICAgPSBvbWFwZmJfb3BlbiwKKwkuZmJfcmVsZWFzZSAgICAgPSBvbWFwZmJfcmVsZWFzZSwKKwkuZmJfc2V0Y29scmVnCT0gb21hcGZiX3NldGNvbHJlZywKKwkuZmJfc2V0Y21hcAk9IG9tYXBmYl9zZXRjbWFwLAorCS5mYl9maWxscmVjdAk9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEJPSBjZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdAk9IGNmYl9pbWFnZWJsaXQsCisJLmZiX2JsYW5rICAgICAgID0gb21hcGZiX2JsYW5rLAorCS5mYl9pb2N0bAk9IG9tYXBmYl9pb2N0bCwKKwkuZmJfY2hlY2tfdmFyCT0gb21hcGZiX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3Bhcgk9IG9tYXBmYl9zZXRfcGFyLAorCS5mYl9yb3RhdGUJPSBvbWFwZmJfcm90YXRlLAorCS5mYl9wYW5fZGlzcGxheSA9IG9tYXBmYl9wYW5fZGlzcGxheSwKK307CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN5c2ZzIGludGVyZmFjZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIG9tYXBmYlggc3lzZnMgZW50cmllcyAqLworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfY2Fwc19udW0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IHBsYW5lOworCXNpemVfdCBzaXplOworCXN0cnVjdCBvbWFwZmJfY2FwcyBjYXBzOworCisJcGxhbmUgPSAwOworCXNpemUgPSAwOworCXdoaWxlIChzaXplIDwgUEFHRV9TSVpFICYmIHBsYW5lIDwgT01BUEZCX1BMQU5FX05VTSkgeworCQlvbWFwZmJfZ2V0X2NhcHMoZmJkZXYsIHBsYW5lLCAmY2Fwcyk7CisJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCSJwbGFuZSMlZCAlIzAxMHggJSMwMTB4ICUjMDEweFxuIiwKKwkJCXBsYW5lLCBjYXBzLmN0cmwsIGNhcHMucGxhbmVfY29sb3IsIGNhcHMud25kX2NvbG9yKTsKKwkJcGxhbmUrKzsKKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2NhcHNfdGV4dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisJaW50IGk7CisJc3RydWN0IG9tYXBmYl9jYXBzIGNhcHM7CisJaW50IHBsYW5lOworCXNpemVfdCBzaXplOworCisJcGxhbmUgPSAwOworCXNpemUgPSAwOworCXdoaWxlIChzaXplIDwgUEFHRV9TSVpFICYmIHBsYW5lIDwgT01BUEZCX1BMQU5FX05VTSkgeworCQlvbWFwZmJfZ2V0X2NhcHMoZmJkZXYsIHBsYW5lLCAmY2Fwcyk7CisJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkgInBsYW5lIyVkOlxuIiwgcGxhbmUpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHJsX2NhcHMpICYmCisJCSAgICAgc2l6ZSA8IFBBR0VfU0laRTsgaSsrKSB7CisJCQlpZiAoY3RybF9jYXBzW2ldLmZsYWcgJiBjYXBzLmN0cmwpCisJCQkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCQkiICVzXG4iLCBjdHJsX2NhcHNbaV0ubmFtZSk7CisJCX0KKwkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCSAiIHBsYW5lIGNvbG9yczpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2xvcl9jYXBzKSAmJgorCQkgICAgIHNpemUgPCBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKGNvbG9yX2NhcHNbaV0uZmxhZyAmIGNhcHMucGxhbmVfY29sb3IpCisJCQkJc2l6ZSArPSBzbnByaW50ZigmYnVmW3NpemVdLCBQQUdFX1NJWkUgLSBzaXplLAorCQkJCQkiICAlc1xuIiwgY29sb3JfY2Fwc1tpXS5uYW1lKTsKKwkJfQorCQlzaXplICs9IHNucHJpbnRmKCZidWZbc2l6ZV0sIFBBR0VfU0laRSAtIHNpemUsCisJCQkJICIgd2luZG93IGNvbG9yczpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb2xvcl9jYXBzKSAmJgorCQkgICAgIHNpemUgPCBQQUdFX1NJWkU7IGkrKykgeworCQkJaWYgKGNvbG9yX2NhcHNbaV0uZmxhZyAmIGNhcHMud25kX2NvbG9yKQorCQkJCXNpemUgKz0gc25wcmludGYoJmJ1ZltzaXplXSwgUEFHRV9TSVpFIC0gc2l6ZSwKKwkJCQkJIiAgJXNcbiIsIGNvbG9yX2NhcHNbaV0ubmFtZSk7CisJCX0KKworCQlwbGFuZSsrOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNhcHNfbnVtLCAwNDQ0LCBvbWFwZmJfc2hvd19jYXBzX251bSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2Fwc190ZXh0LCAwNDQ0LCBvbWFwZmJfc2hvd19jYXBzX3RleHQsIE5VTEwpOworCisvKiBwYW5lbCBzeXNmcyBlbnRyaWVzICovCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc2hvd19wYW5lbF9uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZmJkZXYtPnBhbmVsLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3Qgb21hcGZiX3Nob3dfYmtsaWdodF9sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCByOworCisJaWYgKGZiZGV2LT5wYW5lbC0+Z2V0X2JrbGlnaHRfbGV2ZWwpIHsKKwkJciA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQkgICAgIGZiZGV2LT5wYW5lbC0+Z2V0X2JrbGlnaHRfbGV2ZWwoZmJkZXYtPnBhbmVsKSk7CisJfSBlbHNlCisJCXIgPSAtRU5PREVWOworCXJldHVybiByOworfQorCitzdGF0aWMgc3NpemVfdCBvbWFwZmJfc3RvcmVfYmtsaWdodF9sZXZlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCByOworCisJaWYgKGZiZGV2LT5wYW5lbC0+c2V0X2JrbGlnaHRfbGV2ZWwpIHsKKwkJdW5zaWduZWQgaW50IGxldmVsOworCisJCWlmIChzc2NhbmYoYnVmLCAiJTEwZCIsICZsZXZlbCkgPT0gMSkgeworCQkJciA9IGZiZGV2LT5wYW5lbC0+c2V0X2JrbGlnaHRfbGV2ZWwoZmJkZXYtPnBhbmVsLAorCQkJCQkJCSAgICBsZXZlbCk7CisJCX0gZWxzZQorCQkJciA9IC1FSU5WQUw7CisJfSBlbHNlCisJCXIgPSAtRU5PREVWOworCXJldHVybiByID8gciA6IHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2JrbGlnaHRfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKilkZXYtPmRyaXZlcl9kYXRhOworCWludCByOworCisJaWYgKGZiZGV2LT5wYW5lbC0+Z2V0X2JrbGlnaHRfbGV2ZWwpIHsKKwkJciA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQkgICAgIGZiZGV2LT5wYW5lbC0+Z2V0X2JrbGlnaHRfbWF4KGZiZGV2LT5wYW5lbCkpOworCX0gZWxzZQorCQlyID0gLUVOT0RFVjsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3BhbmVsX25hbWUgPQorCV9fQVRUUihuYW1lLCAwNDQ0LCBvbWFwZmJfc2hvd19wYW5lbF9uYW1lLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYWNrbGlnaHRfbGV2ZWwsIDA2NjQsCisJCSAgIG9tYXBmYl9zaG93X2JrbGlnaHRfbGV2ZWwsIG9tYXBmYl9zdG9yZV9ia2xpZ2h0X2xldmVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYWNrbGlnaHRfbWF4LCAwNDQ0LCBvbWFwZmJfc2hvd19ia2xpZ2h0X21heCwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwYW5lbF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9wYW5lbF9uYW1lLmF0dHIsCisJJmRldl9hdHRyX2JhY2tsaWdodF9sZXZlbC5hdHRyLAorCSZkZXZfYXR0cl9iYWNrbGlnaHRfbWF4LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBhbmVsX2F0dHJfZ3JwID0geworCS5uYW1lICA9ICJwYW5lbCIsCisJLmF0dHJzID0gcGFuZWxfYXR0cnMsCit9OworCisvKiBjdHJsIHN5c2ZzIGVudHJpZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG9tYXBmYl9zaG93X2N0cmxfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqKWRldi0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZmJkZXYtPmN0cmwtPm5hbWUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfY3RybF9uYW1lID0KKwlfX0FUVFIobmFtZSwgMDQ0NCwgb21hcGZiX3Nob3dfY3RybF9uYW1lLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmN0cmxfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfY3RybF9uYW1lLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGN0cmxfYXR0cl9ncnAgPSB7CisJLm5hbWUgID0gImN0cmwiLAorCS5hdHRycyA9IGN0cmxfYXR0cnMsCit9OworCitzdGF0aWMgaW50IG9tYXBmYl9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJaW50IHI7CisKKwlpZiAoKHIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfbnVtKSkpCisJCWdvdG8gZmFpbDA7CisKKwlpZiAoKHIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfdGV4dCkpKQorCQlnb3RvIGZhaWwxOworCisJaWYgKChyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmcGFuZWxfYXR0cl9ncnApKSkKKwkJZ290byBmYWlsMjsKKworCWlmICgociA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJmN0cmxfYXR0cl9ncnApKSkKKwkJZ290byBmYWlsMzsKKworCXJldHVybiAwOworZmFpbDM6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZmYmRldi0+ZGV2LT5rb2JqLCAmcGFuZWxfYXR0cl9ncnApOworZmFpbDI6CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX3RleHQpOworZmFpbDE6CisJZGV2aWNlX3JlbW92ZV9maWxlKGZiZGV2LT5kZXYsICZkZXZfYXR0cl9jYXBzX251bSk7CitmYWlsMDoKKwlkZXZfZXJyKGZiZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgc3lzZnMgaW50ZXJmYWNlXG4iKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgb21hcGZiX3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJmN0cmxfYXR0cl9ncnApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZmJkZXYtPmRldi0+a29iaiwgJnBhbmVsX2F0dHJfZ3JwKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfbnVtKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZmJkZXYtPmRldiwgJmRldl9hdHRyX2NhcHNfdGV4dCk7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExETSBjYWxsYmFja3MKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBJbml0aWFsaXplIHN5c3RlbSBmYl9pbmZvIG9iamVjdCBhbmQgc2V0IHRoZSBkZWZhdWx0IHZpZGVvIG1vZGUuCisgKiBUaGUgZnJhbWUgYnVmZmVyIG1lbW9yeSBhbHJlYWR5IGFsbG9jYXRlZCBieSBsY2RkbWFfaW5pdAorICovCitzdGF0aWMgaW50IGZiaW5mb19pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvCSp2YXIgPSAmaW5mby0+dmFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbwkqZml4ID0gJmluZm8tPmZpeDsKKwlpbnQJCQkJciA9IDA7CisKKwlpbmZvLT5mYm9wcyA9ICZvbWFwZmJfb3BzOworCWluZm8tPmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKKworCXN0cm5jcHkoZml4LT5pZCwgTU9EVUxFX05BTUUsIHNpemVvZihmaXgtPmlkKSk7CisKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IGZiZGV2LT5wc2V1ZG9fcGFsZXR0ZTsKKworCXZhci0+YWNjZWxfZmxhZ3MgID0gZGVmX2FjY2VsID8gRkJfQUNDRUxGX1RFWFQgOiAwOworCXZhci0+eHJlcyA9IGRlZl92eHJlczsKKwl2YXItPnlyZXMgPSBkZWZfdnlyZXM7CisJdmFyLT54cmVzX3ZpcnR1YWwgPSBkZWZfdnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSBkZWZfdnlyZXM7CisJdmFyLT5yb3RhdGUJICA9IGRlZl9yb3RhdGU7CisJdmFyLT5iaXRzX3Blcl9waXhlbCA9IGZiZGV2LT5wYW5lbC0+YnBwOworCisJc2V0X2ZiX3ZhcihpbmZvLCB2YXIpOworCXNldF9mYl9maXgoaW5mbyk7CisKKwlyID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMTYsIDApOworCWlmIChyICE9IDApCisJCWRldl9lcnIoZmJkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBjb2xvciBtYXAgbWVtb3J5XG4iKTsKKworCXJldHVybiByOworfQorCisvKiBSZWxlYXNlIHRoZSBmYl9pbmZvIG9iamVjdCAqLworc3RhdGljIHZvaWQgZmJpbmZvX2NsZWFudXAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2LCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQoreworCWZiX2RlYWxsb2NfY21hcCgmZmJpLT5jbWFwKTsKK30KKworc3RhdGljIHZvaWQgcGxhbmVzX2NsZWFudXAoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsKKwkJaWYgKGZiZGV2LT5mYl9pbmZvW2ldID09IE5VTEwpCisJCQlicmVhazsKKwkJZmJpbmZvX2NsZWFudXAoZmJkZXYsIGZiZGV2LT5mYl9pbmZvW2ldKTsKKwkJZnJhbWVidWZmZXJfcmVsZWFzZShmYmRldi0+ZmJfaW5mb1tpXSk7CisJfQorfQorCitzdGF0aWMgaW50IHBsYW5lc19pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpOworCWludCBpOworCWludCByOworCisJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25fY250OyBpKyspIHsKKwkJc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lOworCQlmYmkgPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QpLAorCQkJCQlmYmRldi0+ZGV2KTsKKwkJaWYgKGZiaSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBsYW5lIGluZm9cbiIpOworCQkJcGxhbmVzX2NsZWFudXAoZmJkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcGxhbmUgPSBmYmktPnBhcjsKKwkJcGxhbmUtPmlkeCA9IGk7CisJCXBsYW5lLT5mYmRldiA9IGZiZGV2OworCQlwbGFuZS0+aW5mby5taXJyb3IgPSBkZWZfbWlycm9yOworCQlmYmRldi0+ZmJfaW5mb1tpXSA9IGZiaTsKKworCQlpZiAoKHIgPSBmYmluZm9faW5pdChmYmRldiwgZmJpKSkgPCAwKSB7CisJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGZiaSk7CisJCQlwbGFuZXNfY2xlYW51cChmYmRldik7CisJCQlyZXR1cm4gcjsKKwkJfQorCQlwbGFuZS0+aW5mby5vdXRfd2lkdGggPSBmYmktPnZhci54cmVzOworCQlwbGFuZS0+aW5mby5vdXRfaGVpZ2h0ID0gZmJpLT52YXIueXJlczsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIGRyaXZlciByZXNvdXJjZXMuIENhbiBiZSBjYWxsZWQgdG8gcm9sbGJhY2sgYW4gYWJvcnRlZCBpbml0aWFsaXphdGlvbgorICogc2VxdWVuY2UuCisgKi8KK3N0YXRpYyB2b2lkIG9tYXBmYl9mcmVlX3Jlc291cmNlcyhzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYsIGludCBzdGF0ZSkKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE9NQVBGQl9BQ1RJVkU6CisJCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKQorCQkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYmRldi0+ZmJfaW5mb1tpXSk7CisJY2FzZSA3OgorCQlvbWFwZmJfdW5yZWdpc3Rlcl9zeXNmcyhmYmRldik7CisJY2FzZSA2OgorCQlmYmRldi0+cGFuZWwtPmRpc2FibGUoZmJkZXYtPnBhbmVsKTsKKwljYXNlIDU6CisJCW9tYXBmYl9zZXRfdXBkYXRlX21vZGUoZmJkZXYsIE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCWNhc2UgNDoKKwkJcGxhbmVzX2NsZWFudXAoZmJkZXYpOworCWNhc2UgMzoKKwkJY3RybF9jbGVhbnVwKGZiZGV2KTsKKwljYXNlIDI6CisJCWZiZGV2LT5wYW5lbC0+Y2xlYW51cChmYmRldi0+cGFuZWwpOworCWNhc2UgMToKKwkJZGV2X3NldF9kcnZkYXRhKGZiZGV2LT5kZXYsIE5VTEwpOworCQlrZnJlZShmYmRldik7CisJY2FzZSAwOgorCQkvKiBub3RoaW5nIHRvIGZyZWUgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgaW50IG9tYXBmYl9maW5kX2N0cmwoc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2KQoreworCXN0cnVjdCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqY29uZjsKKwljaGFyIG5hbWVbMTddOworCWludCBpOworCisJY29uZiA9IGZiZGV2LT5kZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlmYmRldi0+Y3RybCA9IE5VTEw7CisKKwlzdHJuY3B5KG5hbWUsIGNvbmYtPmxjZC5jdHJsX25hbWUsIHNpemVvZihuYW1lKSAtIDEpOworCW5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOworCisJaWYgKHN0cmNtcChuYW1lLCAiaW50ZXJuYWwiKSA9PSAwKSB7CisJCWZiZGV2LT5jdHJsID0gZmJkZXYtPmludF9jdHJsOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdHJscyk7IGkrKykgeworCQlkZXZfZGJnKGZiZGV2LT5kZXYsICJjdHJsICVzXG4iLCBjdHJsc1tpXS0+bmFtZSk7CisJCWlmIChzdHJjbXAoY3RybHNbaV0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWZiZGV2LT5jdHJsID0gY3RybHNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChmYmRldi0+Y3RybCA9PSBOVUxMKSB7CisJCWRldl9kYmcoZmJkZXYtPmRldiwgImN0cmwgJXMgbm90IHN1cHBvcnRlZFxuIiwgbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcmVxdWlyZWRfY2FsbGJhY2tzKHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldikKK3sKKyNkZWZpbmUgX0MoeCkgKGZiZGV2LT5jdHJsLT54ICE9IE5VTEwpCisjZGVmaW5lIF9QKHgpIChmYmRldi0+cGFuZWwtPnggIT0gTlVMTCkKKwlCVUdfT04oZmJkZXYtPmN0cmwgPT0gTlVMTCB8fCBmYmRldi0+cGFuZWwgPT0gTlVMTCk7CisJQlVHX09OKCEoX0MoaW5pdCkgJiYgX0MoY2xlYW51cCkgJiYgX0MoZ2V0X2NhcHMpICYmCisJCSBfQyhzZXRfdXBkYXRlX21vZGUpICYmIF9DKHNldHVwX3BsYW5lKSAmJiBfQyhlbmFibGVfcGxhbmUpICYmCisJCSBfUChpbml0KSAmJiBfUChjbGVhbnVwKSAmJiBfUChlbmFibGUpICYmIF9QKGRpc2FibGUpICYmCisJCSBfUChnZXRfY2FwcykpKTsKKyN1bmRlZiBfUAorI3VuZGVmIF9DCit9CisKKy8qCisgKiBDYWxsZWQgYnkgTERNIGJpbmRpbmcgdG8gcHJvYmUgYW5kIGF0dGFjaCBhIG5ldyBkZXZpY2UuCisgKiBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZToKKyAqICAgMS4gYWxsb2NhdGUgc3lzdGVtIG9tYXBmYl9kZXZpY2Ugc3RydWN0dXJlCisgKiAgIDIuIHNlbGVjdCBjb250cm9sbGVyIHR5cGUgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgaW5pdCBMQ0QgcGFuZWwKKyAqICAgMy4gaW5pdCBMQ0QgY29udHJvbGxlciBhbmQgTENEIERNQQorICogICA0LiBpbml0IHN5c3RlbSBmYl9pbmZvIHN0cnVjdHVyZSBmb3IgYWxsIHBsYW5lcworICogICA1LiBzZXR1cCB2aWRlbyBtb2RlIGZvciBmaXJzdCBwbGFuZSBhbmQgZW5hYmxlIGl0CisgKiAgIDYuIGVuYWJsZSBMQ0QgcGFuZWwKKyAqICAgNy4gcmVnaXN0ZXIgc3lzZnMgYXR0cmlidXRlcworICogICBPTUFQRkJfQUNUSVZFOiByZWdpc3RlciBzeXN0ZW0gZmJfaW5mbyBzdHJ1Y3R1cmUgZm9yIGFsbCBwbGFuZXMKKyAqLworc3RhdGljIGludCBvbWFwZmJfZG9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3QgbGNkX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZQkqZmJkZXYgPSBOVUxMOworCWludAkJCWluaXRfc3RhdGU7CisJdW5zaWduZWQgbG9uZwkJcGh6LCBoaHosIHZoejsKKwl1bnNpZ25lZCBsb25nCQl2cmFtOworCWludAkJCWk7CisJaW50CQkJciA9IDA7CisKKwlpbml0X3N0YXRlID0gMDsKKworCWlmIChwZGV2LT5udW1fcmVzb3VyY2VzICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicHJvYmVkIGZvciBhbiB1bmtub3duIGRldmljZVxuIik7CisJCXIgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJciA9IC1FTk9FTlQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlmYmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbWFwZmJfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZiZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBpbmZvXG4iKTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaW5pdF9zdGF0ZSsrOworCisJZmJkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisJZmJkZXYtPnBhbmVsID0gcGFuZWw7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZmJkZXYpOworCisJbXV0ZXhfaW5pdCgmZmJkZXYtPnJxdWV1ZV9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMQorCWZiZGV2LT5pbnRfY3RybCA9ICZvbWFwMV9pbnRfY3RybDsKKyNpZmRlZiBDT05GSUdfRkJfT01BUF9MQ0RDX0VYVEVSTkFMCisJZmJkZXYtPmV4dF9pZiA9ICZvbWFwMV9leHRfaWY7CisjZW5kaWYKKyNlbHNlCS8qIE9NQVAyICovCisJZmJkZXYtPmludF9jdHJsID0gJm9tYXAyX2ludF9jdHJsOworI2lmZGVmIENPTkZJR19GQl9PTUFQX0xDRENfRVhURVJOQUwKKwlmYmRldi0+ZXh0X2lmID0gJm9tYXAyX2V4dF9pZjsKKyNlbmRpZgorI2VuZGlmCisJaWYgKG9tYXBmYl9maW5kX2N0cmwoZmJkZXYpIDwgMCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkiTENEIGNvbnRyb2xsZXIgbm90IGZvdW5kLCBib2FyZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlyID0gZmJkZXYtPnBhbmVsLT5pbml0KGZiZGV2LT5wYW5lbCwgZmJkZXYpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisKKwlwcl9pbmZvKCJvbWFwZmI6IGNvbmZpZ3VyZWQgZm9yIHBhbmVsICVzXG4iLCBmYmRldi0+cGFuZWwtPm5hbWUpOworCisJZGVmX3Z4cmVzID0gZGVmX3Z4cmVzID8gOiBmYmRldi0+cGFuZWwtPnhfcmVzOworCWRlZl92eXJlcyA9IGRlZl92eXJlcyA/IDogZmJkZXYtPnBhbmVsLT55X3JlczsKKworCWluaXRfc3RhdGUrKzsKKworCXIgPSBjdHJsX2luaXQoZmJkZXYpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKGZiZGV2LT5jdHJsLT5tbWFwICE9IE5VTEwpCisJCW9tYXBmYl9vcHMuZmJfbW1hcCA9IG9tYXBmYl9tbWFwOworCWluaXRfc3RhdGUrKzsKKworCWNoZWNrX3JlcXVpcmVkX2NhbGxiYWNrcyhmYmRldik7CisKKwlyID0gcGxhbmVzX2luaXQoZmJkZXYpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisJaW5pdF9zdGF0ZSsrOworCisjaWZkZWYgQ09ORklHX0ZCX09NQVBfRE1BX1RVTkUKKwkvKiBTZXQgRE1BIHByaW9yaXR5IGZvciBFTUlGRiBhY2Nlc3MgdG8gaGlnaGVzdCAqLworCWlmIChjcHVfY2xhc3NfaXNfb21hcDEoKSkKKwkJb21hcF9zZXRfZG1hX3ByaW9yaXR5KDAsIE9NQVBfRE1BX1BPUlRfRU1JRkYsIDE1KTsKKyNlbmRpZgorCisJciA9IGN0cmxfY2hhbmdlX21vZGUoZmJkZXYtPmZiX2luZm9bMF0pOworCWlmIChyKSB7CisJCWRldl9lcnIoZmJkZXYtPmRldiwgIm1vZGUgc2V0dGluZyBmYWlsZWRcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogR0ZYIHBsYW5lIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCAqLworCXIgPSBmYmRldi0+Y3RybC0+ZW5hYmxlX3BsYW5lKE9NQVBGQl9QTEFORV9HRlgsIDEpOworCWlmIChyKQorCQlnb3RvIGNsZWFudXA7CisKKwlvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKGZiZGV2LCBtYW51YWxfdXBkYXRlID8KKwkJCQkgICBPTUFQRkJfTUFOVUFMX1VQREFURSA6IE9NQVBGQl9BVVRPX1VQREFURSk7CisJaW5pdF9zdGF0ZSsrOworCisJciA9IGZiZGV2LT5wYW5lbC0+ZW5hYmxlKGZiZGV2LT5wYW5lbCk7CisJaWYgKHIpCisJCWdvdG8gY2xlYW51cDsKKwlpbml0X3N0YXRlKys7CisKKwlyID0gb21hcGZiX3JlZ2lzdGVyX3N5c2ZzKGZiZGV2KTsKKwlpZiAocikKKwkJZ290byBjbGVhbnVwOworCWluaXRfc3RhdGUrKzsKKworCXZyYW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bWVtX2Rlc2MucmVnaW9uX2NudDsgaSsrKSB7CisJCXIgPSByZWdpc3Rlcl9mcmFtZWJ1ZmZlcihmYmRldi0+ZmJfaW5mb1tpXSk7CisJCWlmIChyICE9IDApIHsKKwkJCWRldl9lcnIoZmJkZXYtPmRldiwKKwkJCQkicmVnaXN0ZXJpbmcgZnJhbWVidWZmZXIgJWQgZmFpbGVkXG4iLCBpKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQl2cmFtICs9IGZiZGV2LT5tZW1fZGVzYy5yZWdpb25baV0uc2l6ZTsKKwl9CisKKwlmYmRldi0+c3RhdGUgPSBPTUFQRkJfQUNUSVZFOworCisJcGFuZWwgPSBmYmRldi0+cGFuZWw7CisJcGh6ID0gcGFuZWwtPnBpeGVsX2Nsb2NrICogMTAwMDsKKwloaHogPSBwaHogKiAxMCAvIChwYW5lbC0+aGZwICsgcGFuZWwtPnhfcmVzICsgcGFuZWwtPmhicCArIHBhbmVsLT5oc3cpOworCXZoeiA9IGhoeiAvIChwYW5lbC0+dmZwICsgcGFuZWwtPnlfcmVzICsgcGFuZWwtPnZicCArIHBhbmVsLT52c3cpOworCisJb21hcGZiX2RldiA9IGZiZGV2OworCisJcHJfaW5mbygib21hcGZiOiBGcmFtZWJ1ZmZlciBpbml0aWFsaXplZC4gVG90YWwgdnJhbSAlbHUgcGxhbmVzICVkXG4iLAorCQkJdnJhbSwgZmJkZXYtPm1lbV9kZXNjLnJlZ2lvbl9jbnQpOworCXByX2luZm8oIm9tYXBmYjogUGl4Y2xvY2sgJWx1IGtIeiBoZnJlcSAlbHUuJWx1IGtIeiAiCisJCQkidmZyZXEgJWx1LiVsdSBIelxuIiwKKwkJCXBoeiAvIDEwMDAsIGhoeiAvIDEwMDAwLCBoaHogJSAxMCwgdmh6IC8gMTAsIHZoeiAlIDEwKTsKKworCXJldHVybiAwOworCitjbGVhbnVwOgorCW9tYXBmYl9mcmVlX3Jlc291cmNlcyhmYmRldiwgaW5pdF9zdGF0ZSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvbWFwZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlCVUdfT04oZmJkZXZfcGRldiAhPSBOVUxMKTsKKworCS8qIERlbGF5IGFjdHVhbCBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgTENEIGlzIHJlZ2lzdGVyZWQgKi8KKwlmYmRldl9wZGV2ID0gcGRldjsKKwlpZiAoZmJkZXZfcGFuZWwgIT0gTlVMTCkKKwkJb21hcGZiX2RvX3Byb2JlKGZiZGV2X3BkZXYsIGZiZGV2X3BhbmVsKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbWFwZmJfcmVnaXN0ZXJfcGFuZWwoc3RydWN0IGxjZF9wYW5lbCAqcGFuZWwpCit7CisJQlVHX09OKGZiZGV2X3BhbmVsICE9IE5VTEwpOworCisJZmJkZXZfcGFuZWwgPSBwYW5lbDsKKwlpZiAoZmJkZXZfcGRldiAhPSBOVUxMKQorCQlvbWFwZmJfZG9fcHJvYmUoZmJkZXZfcGRldiwgZmJkZXZfcGFuZWwpOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGJlaW5nIGRldGFjaGVkIGZyb20gdGhlIGRyaXZlciAqLworc3RhdGljIGludCBvbWFwZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBmYl9kZXZpY2UgKmZiZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJZW51bSBvbWFwZmJfc3RhdGUgc2F2ZWRfc3RhdGUgPSBmYmRldi0+c3RhdGU7CisKKwkvKiBGSVhNRTogd2FpdCB0aWxsIGNvbXBsZXRpb24gb2YgcGVuZGluZyBldmVudHMgKi8KKworCWZiZGV2LT5zdGF0ZSA9IE9NQVBGQl9ESVNBQkxFRDsKKwlvbWFwZmJfZnJlZV9yZXNvdXJjZXMoZmJkZXYsIHNhdmVkX3N0YXRlKTsKKworCXJldHVybiAwOworfQorCisvKiBQTSBzdXNwZW5kICovCitzdGF0aWMgaW50IG9tYXBmYl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJb21hcGZiX2JsYW5rKFZFU0FfUE9XRVJET1dOLCBmYmRldi0+ZmJfaW5mb1swXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUE0gcmVzdW1lICovCitzdGF0aWMgaW50IG9tYXBmYl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9tYXBmYl9ibGFuayhWRVNBX05PX0JMQU5LSU5HLCBmYmRldi0+ZmJfaW5mb1swXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBmYl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9tYXBmYl9wcm9iZSwKKwkucmVtb3ZlCQk9IG9tYXBmYl9yZW1vdmUsCisJLnN1c3BlbmQJPSBvbWFwZmJfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG9tYXBmYl9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gTU9EVUxFX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCisjaWZuZGVmIE1PRFVMRQorCisvKiBQcm9jZXNzIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBfX2luaXQgb21hcGZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciAqdGhpc19vcHQgPSBOVUxMOworCWludCByID0gMDsKKworCXByX2RlYnVnKCJvbWFwZmI6IG9wdGlvbnMgJXNcbiIsIG9wdGlvbnMpOworCisJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoIXIgJiYgKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgImFjY2VsIiwgNSkpCisJCQlkZWZfYWNjZWwgPSAxOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZyYW06IiwgNSkpIHsKKwkJCWNoYXIgKnN1ZmZpeDsKKwkJCXVuc2lnbmVkIGxvbmcgdnJhbTsKKwkJCXZyYW0gPSAoc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA1LCAmc3VmZml4LCAwKSk7CisJCQlzd2l0Y2ggKHN1ZmZpeFswXSkgeworCQkJY2FzZSAnXDAnOgorCQkJCWJyZWFrOworCQkJY2FzZSAnbSc6CisJCQljYXNlICdNJzoKKwkJCQl2cmFtICo9IDEwMjQ7CisJCQkJLyogRmFsbCB0aHJvdWdoICovCisJCQljYXNlICdrJzoKKwkJCWNhc2UgJ0snOgorCQkJCXZyYW0gKj0gMTAyNDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJfZGVidWcoIm9tYXBmYjogaW52YWxpZCB2cmFtIHN1ZmZpeCAlY1xuIiwKKwkJCQkJIHN1ZmZpeFswXSk7CisJCQkJciA9IC0xOworCQkJfQorCQkJZGVmX3ZyYW1bZGVmX3ZyYW1fY250KytdID0gdnJhbTsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZ4cmVzOiIsIDYpKQorCQkJZGVmX3Z4cmVzID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA2LCBOVUxMLCAwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2eXJlczoiLCA2KSkKKwkJCWRlZl92eXJlcyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAicm90YXRlOiIsIDcpKQorCQkJZGVmX3JvdGF0ZSA9IChzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDcsIE5VTEwsIDApKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtaXJyb3I6IiwgNykpCisJCQlkZWZfbWlycm9yID0gKHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNywgTlVMTCwgMCkpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1hbnVhbF91cGRhdGUiLCAxMykpCisJCQltYW51YWxfdXBkYXRlID0gMTsKKwkJZWxzZSB7CisJCQlwcl9kZWJ1Zygib21hcGZiOiBpbnZhbGlkIG9wdGlvblxuIik7CisJCQlyID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gcjsKK30KKworI2VuZGlmCisKKy8qIFJlZ2lzdGVyIGJvdGggdGhlIGRyaXZlciBhbmQgdGhlIGRldmljZSAqLworc3RhdGljIGludCBfX2luaXQgb21hcGZiX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJY2hhciAqb3B0aW9uOworCisJaWYgKGZiX2dldF9vcHRpb25zKCJvbWFwZmIiLCAmb3B0aW9uKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJb21hcGZiX3NldHVwKG9wdGlvbik7CisjZW5kaWYKKwkvKiBSZWdpc3RlciB0aGUgZHJpdmVyIHdpdGggTERNICovCisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcGZiX2RyaXZlcikpIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byByZWdpc3RlciBvbWFwZmIgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwZmJfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZvbWFwZmJfZHJpdmVyKTsKK30KKworbW9kdWxlX3BhcmFtX25hbWVkKGFjY2VsLCBkZWZfYWNjZWwsIHVpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX2FycmF5X25hbWVkKHZyYW0sIGRlZl92cmFtLCB1bG9uZywgJmRlZl92cmFtX2NudCwgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQodnhyZXMsIGRlZl92eHJlcywgbG9uZywgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQodnlyZXMsIGRlZl92eXJlcywgbG9uZywgMDY2NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQocm90YXRlLCBkZWZfcm90YXRlLCB1aW50LCAwNjY0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChtaXJyb3IsIGRlZl9taXJyb3IsIHVpbnQsIDA2NjQpOworbW9kdWxlX3BhcmFtX25hbWVkKG1hbnVhbF91cGRhdGUsIG1hbnVhbF91cGRhdGUsIGJvb2wsIDA2NjQpOworCittb2R1bGVfaW5pdChvbWFwZmJfaW5pdCk7Cittb2R1bGVfZXhpdChvbWFwZmJfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVEkgT01BUCBmcmFtZWJ1ZmZlciBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9yZmJpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDI2OTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAvcmZiaS5jCkBAIC0wLDAgKzEsNTg4IEBACisvKgorICogT01BUDIgUmVtb3RlIEZyYW1lIEJ1ZmZlciBJbnRlcmZhY2Ugc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoJICAgSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcGZiLmg+CisKKyNpbmNsdWRlICJkaXNwYy5oIgorCisvKiBUbyB3b3JrIGFyb3VuZCBhbiBSRkJJIHRyYW5zZmVyIHJhdGUgbGltaXRhdGlvbiAqLworI2RlZmluZSBPTUFQX1JGQklfUkFURV9MSU1JVAkxCisKKyNkZWZpbmUgUkZCSV9CQVNFCQkweDQ4MDUwODAwCisjZGVmaW5lIFJGQklfUkVWSVNJT04JCTB4MDAwMAorI2RlZmluZSBSRkJJX1NZU0NPTkZJRwkJMHgwMDEwCisjZGVmaW5lIFJGQklfU1lTU1RBVFVTCQkweDAwMTQKKyNkZWZpbmUgUkZCSV9DT05UUk9MCQkweDAwNDAKKyNkZWZpbmUgUkZCSV9QSVhFTF9DTlQJCTB4MDA0NAorI2RlZmluZSBSRkJJX0xJTkVfTlVNQkVSCTB4MDA0OAorI2RlZmluZSBSRkJJX0NNRAkJMHgwMDRjCisjZGVmaW5lIFJGQklfUEFSQU0JCTB4MDA1MAorI2RlZmluZSBSRkJJX0RBVEEJCTB4MDA1NAorI2RlZmluZSBSRkJJX1JFQUQJCTB4MDA1OAorI2RlZmluZSBSRkJJX1NUQVRVUwkJMHgwMDVjCisjZGVmaW5lIFJGQklfQ09ORklHMAkJMHgwMDYwCisjZGVmaW5lIFJGQklfT05PRkZfVElNRTAJMHgwMDY0CisjZGVmaW5lIFJGQklfQ1lDTEVfVElNRTAJMHgwMDY4CisjZGVmaW5lIFJGQklfREFUQV9DWUNMRTFfMAkweDAwNmMKKyNkZWZpbmUgUkZCSV9EQVRBX0NZQ0xFMl8wCTB4MDA3MAorI2RlZmluZSBSRkJJX0RBVEFfQ1lDTEUzXzAJMHgwMDc0CisjZGVmaW5lIFJGQklfVlNZTkNfV0lEVEgJMHgwMDkwCisjZGVmaW5lIFJGQklfSFNZTkNfV0lEVEgJMHgwMDk0CisKKyNkZWZpbmUgRElTUENfQkFTRQkJMHg0ODA1MDQwMAorI2RlZmluZSBESVNQQ19DT05UUk9MCQkweDAwNDAKKworc3RhdGljIHN0cnVjdCB7CisJdTMyCQliYXNlOworCXZvaWQJCSgqbGNkY19jYWxsYmFjaykodm9pZCAqZGF0YSk7CisJdm9pZAkJKmxjZGNfY2FsbGJhY2tfZGF0YTsKKwl1bnNpZ25lZCBsb25nCWw0X2toejsKKwlpbnQJCWJpdHNfcGVyX2N5Y2xlOworCXN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldjsKKwlzdHJ1Y3QgY2xrCSpkc3NfaWNrOworCXN0cnVjdCBjbGsJKmRzczFfZmNrOworCXVuc2lnbmVkCXRlYXJzeW5jX3Bpbl9jbnQ7CisJdW5zaWduZWQJdGVhcnN5bmNfbW9kZTsKK30gcmZiaTsKKworc3RhdGljIGlubGluZSB2b2lkIHJmYmlfd3JpdGVfcmVnKGludCBpZHgsIHUzMiB2YWwpCit7CisJX19yYXdfd3JpdGVsKHZhbCwgcmZiaS5iYXNlICsgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcmZiaV9yZWFkX3JlZyhpbnQgaWR4KQoreworCXJldHVybiBfX3Jhd19yZWFkbChyZmJpLmJhc2UgKyBpZHgpOworfQorCitzdGF0aWMgaW50IHJmYmlfZ2V0X2Nsb2Nrcyh2b2lkKQoreworCWlmIChJU19FUlIoKHJmYmkuZHNzX2ljayA9IGNsa19nZXQocmZiaS5mYmRldi0+ZGV2LCAiZHNzX2ljayIpKSkpIHsKKwkJZGV2X2VycihyZmJpLmZiZGV2LT5kZXYsICJjYW4ndCBnZXQgZHNzX2ljayIpOworCQlyZXR1cm4gUFRSX0VSUihyZmJpLmRzc19pY2spOworCX0KKworCWlmIChJU19FUlIoKHJmYmkuZHNzMV9mY2sgPSBjbGtfZ2V0KHJmYmkuZmJkZXYtPmRldiwgImRzczFfZmNrIikpKSkgeworCQlkZXZfZXJyKHJmYmkuZmJkZXYtPmRldiwgImNhbid0IGdldCBkc3MxX2ZjayIpOworCQljbGtfcHV0KHJmYmkuZHNzX2ljayk7CisJCXJldHVybiBQVFJfRVJSKHJmYmkuZHNzMV9mY2spOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZmJpX3B1dF9jbG9ja3Modm9pZCkKK3sKKwljbGtfcHV0KHJmYmkuZHNzMV9mY2spOworCWNsa19wdXQocmZiaS5kc3NfaWNrKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9lbmFibGVfY2xvY2tzKGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkgeworCQljbGtfZW5hYmxlKHJmYmkuZHNzX2ljayk7CisJCWNsa19lbmFibGUocmZiaS5kc3MxX2Zjayk7CisJfSBlbHNlIHsKKwkJY2xrX2Rpc2FibGUocmZiaS5kc3MxX2Zjayk7CisJCWNsa19kaXNhYmxlKHJmYmkuZHNzX2ljayk7CisJfQorfQorCisKKyNpZmRlZiBWRVJCT1NFCitzdGF0aWMgdm9pZCByZmJpX3ByaW50X3RpbWluZ3Modm9pZCkKK3sKKwl1MzIgbDsKKwl1MzIgdGltZTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJdGltZSA9IDEwMDAwMDAwMDAgLyByZmJpLmw0X2toejsKKwlpZiAobCAmICgxIDw8IDQpKQorCQl0aW1lICo9IDI7CisKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwgIlRpY2sgdGltZSAldSBwc1xuIiwgdGltZSk7CisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9PTk9GRl9USU1FMCk7CisJZGV2X2RiZyhyZmJpLmZiZGV2LT5kZXYsCisJCSJDU09OVElNRSAlZCwgQ1NPRkZUSU1FICVkLCBXRU9OVElNRSAlZCwgV0VPRkZUSU1FICVkLCAiCisJCSJSRU9OVElNRSAlZCwgUkVPRkZUSU1FICVkXG4iLAorCQlsICYgMHgwZiwgKGwgPj4gNCkgJiAweDNmLCAobCA+PiAxMCkgJiAweDBmLCAobCA+PiAxNCkgJiAweDNmLAorCQkobCA+PiAyMCkgJiAweDBmLCAobCA+PiAyNCkgJiAweDNmKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ1lDTEVfVElNRTApOworCWRldl9kYmcocmZiaS5mYmRldi0+ZGV2LAorCQkiV0VDWUNMRVRJTUUgJWQsIFJFQ1lDTEVUSU1FICVkLCBDU1BVTFNFV0lEVEggJWQsICIKKwkJIkFDQ0VTU1RJTUUgJWRcbiIsCisJCShsICYgMHgzZiksIChsID4+IDYpICYgMHgzZiwgKGwgPj4gMTIpICYgMHgzZiwKKwkJKGwgPj4gMjIpICYgMHgzZik7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcmZiaV9wcmludF90aW1pbmdzKHZvaWQpIHt9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcmZiaV9zZXRfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwl1MzIgbDsKKworCUJVR19PTighdC0+Y29udmVydGVkKTsKKworCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX09OT0ZGX1RJTUUwLCB0LT50aW1bMF0pOworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ1lDTEVfVElNRTAsIHQtPnRpbVsxXSk7CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX0NPTkZJRzApOworCWwgJj0gfigxIDw8IDQpOworCWwgfD0gKHQtPnRpbVsyXSA/IDEgOiAwKSA8PCA0OworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09ORklHMCwgbCk7CisKKwlyZmJpX3ByaW50X3RpbWluZ3MoKTsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfZ2V0X2Nsa19pbmZvKHUzMiAqY2xrX3BlcmlvZCwgdTMyICptYXhfY2xrX2RpdikKK3sKKwkqY2xrX3BlcmlvZCA9IDEwMDAwMDAwMDAgLyByZmJpLmw0X2toejsKKwkqbWF4X2Nsa19kaXYgPSAyOworfQorCitzdGF0aWMgaW50IHBzX3RvX3JmYmlfdGlja3MoaW50IHRpbWUsIGludCBkaXYpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrX3BzOworCWludCByZXQ7CisKKwkvKiBDYWxjdWxhdGUgaW4gcGljb3NlY3MgdG8geWllbGQgbW9yZSBleGFjdCByZXN1bHRzICovCisJdGlja19wcyA9IDEwMDAwMDAwMDAgLyAocmZiaS5sNF9raHopICogZGl2OworCisJcmV0ID0gKHRpbWUgKyB0aWNrX3BzIC0gMSkgLyB0aWNrX3BzOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIE9NQVBfUkZCSV9SQVRFX0xJTUlUCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZmJpX2dldF9tYXhfdHhfcmF0ZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcJbDRfcmF0ZSwgZHNzMV9yYXRlOworCWludAkJbWluX2w0X3RpY2tzID0gMDsKKwlpbnQJCWk7CisKKwkvKiBBY2NvcmRpbmcgdG8gVEkgdGhpcyBjYW4ndCBiZSBjYWxjdWxhdGVkIHNvIG1ha2UgdGhlCisJICogYWRqdXN0bWVudHMgZm9yIGEgY291cGxlIG9mIGtub3duIGZyZXF1ZW5jaWVzIGFuZCB3YXJuIGZvcgorCSAqIG90aGVycy4KKwkgKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBsNF9jbGs7CQkvKiBIWiAqLworCQl1bnNpZ25lZCBsb25nIGRzczFfY2xrOwkJLyogSFogKi8KKwkJdW5zaWduZWQgbG9uZyBtaW5fbDRfdGlja3M7CisJfSBmdGFiW10gPSB7CisJCXsgNTUsCTEzMiwJNywgfSwJCS8qIDcuODYgTVBpeC9zICovCisJCXsgMTEwLAkxMTAsCTEyLCB9LAkJLyogOS4xNiBNUGl4L3MgKi8KKwkJeyAxMTAsCTEzMiwJMTAsIH0sCQkvKiAxMSAgIE1waXgvcyAqLworCQl7IDEyMCwJMTIwLAkxMCwgfSwJCS8qIDEyICAgTXBpeC9zICovCisJCXsgMTMzLAkxMzMsCTEwLCB9LAkJLyogMTMuMyBNcGl4L3MgKi8KKwl9OworCisJbDRfcmF0ZSA9IHJmYmkubDRfa2h6IC8gMTAwMDsKKwlkc3MxX3JhdGUgPSBjbGtfZ2V0X3JhdGUocmZiaS5kc3MxX2ZjaykgLyAxMDAwMDAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnRhYik7IGkrKykgeworCQkvKiBVc2UgYSB3aW5kb3cgaW5zdGVhZCBvZiBhbiBleGFjdCBtYXRjaCwgdG8gYWNjb3VudAorCQkgKiBmb3IgZGlmZmVyZW50IERQTEwgbXVsdGlwbGllciAvIGRpdmlkZXIgcGFpcnMuCisJCSAqLworCQlpZiAoYWJzKGZ0YWJbaV0ubDRfY2xrIC0gbDRfcmF0ZSkgPCAzICYmCisJCSAgICBhYnMoZnRhYltpXS5kc3MxX2NsayAtIGRzczFfcmF0ZSkgPCAzKSB7CisJCQltaW5fbDRfdGlja3MgPSBmdGFiW2ldLm1pbl9sNF90aWNrczsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUoZnRhYikpIHsKKwkJLyogQ2FuJ3QgYmUgc3VyZSwgcmV0dXJuIGFueXdheSB0aGUgbWF4aW11bSBub3QKKwkJICogcmF0ZS1saW1pdGVkLiBUaGlzIG1pZ2h0IGNhdXNlIGEgcHJvYmxlbSBvbmx5IGZvciB0aGUKKwkJICogdGVhcmluZyBzeW5jaHJvbmlzYXRpb24uCisJCSAqLworCQlkZXZfZXJyKHJmYmkuZmJkZXYtPmRldiwKKwkJCSJjYW4ndCBkZXRlcm1pbmUgbWF4aW11bSBSRkJJIHRyYW5zZmVyIHJhdGVcbiIpOworCQlyZXR1cm4gcmZiaS5sNF9raHogKiAxMDAwOworCX0KKwlyZXR1cm4gcmZiaS5sNF9raHogKiAxMDAwIC8gbWluX2w0X3RpY2tzOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgcmZiaV9nZXRfbWF4X3R4X3JhdGUodm9pZCkKK3sKKwlyZXR1cm4gcmZiaS5sNF9raHogKiAxMDAwOworfQorI2VuZGlmCisKKworc3RhdGljIGludCByZmJpX2NvbnZlcnRfdGltaW5ncyhzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwl1MzIgbDsKKwlpbnQgcmVvbiwgcmVvZmYsIHdlb24sIHdlb2ZmLCBjc29uLCBjc29mZiwgY3NfcHVsc2U7CisJaW50IGFjdGltLCByZWN5Yywgd2VjeWM7CisJaW50IGRpdiA9IHQtPmNsa19kaXY7CisKKwlpZiAoZGl2IDw9IDAgfHwgZGl2ID4gMikKKwkJcmV0dXJuIC0xOworCisJLyogTWFrZSBzdXJlIHRoYXQgYWZ0ZXIgY29udmVyc2lvbiBpdCBzdGlsbCBob2xkcyB0aGF0OgorCSAqIHdlb2ZmID4gd2VvbiwgcmVvZmYgPiByZW9uLCByZWN5YyA+PSByZW9mZiwgd2VjeWMgPj0gd2VvZmYsCisJICogY3NvZmYgPiBjc29uLCBjc29mZiA+PSBtYXgod2VvZmYsIHJlb2ZmKSwgYWN0aW0gPiByZW9uCisJICovCisJd2VvbiA9IHBzX3RvX3JmYmlfdGlja3ModC0+d2Vfb25fdGltZSwgZGl2KTsKKwl3ZW9mZiA9IHBzX3RvX3JmYmlfdGlja3ModC0+d2Vfb2ZmX3RpbWUsIGRpdik7CisJaWYgKHdlb2ZmIDw9IHdlb24pCisJCXdlb2ZmID0gd2VvbiArIDE7CisJaWYgKHdlb24gPiAweDBmKQorCQlyZXR1cm4gLTE7CisJaWYgKHdlb2ZmID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJcmVvbiA9IHBzX3RvX3JmYmlfdGlja3ModC0+cmVfb25fdGltZSwgZGl2KTsKKwlyZW9mZiA9IHBzX3RvX3JmYmlfdGlja3ModC0+cmVfb2ZmX3RpbWUsIGRpdik7CisJaWYgKHJlb2ZmIDw9IHJlb24pCisJCXJlb2ZmID0gcmVvbiArIDE7CisJaWYgKHJlb24gPiAweDBmKQorCQlyZXR1cm4gLTE7CisJaWYgKHJlb2ZmID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJY3NvbiA9IHBzX3RvX3JmYmlfdGlja3ModC0+Y3Nfb25fdGltZSwgZGl2KTsKKwljc29mZiA9IHBzX3RvX3JmYmlfdGlja3ModC0+Y3Nfb2ZmX3RpbWUsIGRpdik7CisJaWYgKGNzb2ZmIDw9IGNzb24pCisJCWNzb2ZmID0gY3NvbiArIDE7CisJaWYgKGNzb2ZmIDwgbWF4KHdlb2ZmLCByZW9mZikpCisJCWNzb2ZmID0gbWF4KHdlb2ZmLCByZW9mZik7CisJaWYgKGNzb24gPiAweDBmKQorCQlyZXR1cm4gLTE7CisJaWYgKGNzb2ZmID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJbCA9ICBjc29uOworCWwgfD0gY3NvZmYgPDwgNDsKKwlsIHw9IHdlb24gIDw8IDEwOworCWwgfD0gd2VvZmYgPDwgMTQ7CisJbCB8PSByZW9uICA8PCAyMDsKKwlsIHw9IHJlb2ZmIDw8IDI0OworCisJdC0+dGltWzBdID0gbDsKKworCWFjdGltID0gcHNfdG9fcmZiaV90aWNrcyh0LT5hY2Nlc3NfdGltZSwgZGl2KTsKKwlpZiAoYWN0aW0gPD0gcmVvbikKKwkJYWN0aW0gPSByZW9uICsgMTsKKwlpZiAoYWN0aW0gPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwl3ZWN5YyA9IHBzX3RvX3JmYmlfdGlja3ModC0+d2VfY3ljbGVfdGltZSwgZGl2KTsKKwlpZiAod2VjeWMgPCB3ZW9mZikKKwkJd2VjeWMgPSB3ZW9mZjsKKwlpZiAod2VjeWMgPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwlyZWN5YyA9IHBzX3RvX3JmYmlfdGlja3ModC0+cmVfY3ljbGVfdGltZSwgZGl2KTsKKwlpZiAocmVjeWMgPCByZW9mZikKKwkJcmVjeWMgPSByZW9mZjsKKwlpZiAocmVjeWMgPiAweDNmKQorCQlyZXR1cm4gLTE7CisKKwljc19wdWxzZSA9IHBzX3RvX3JmYmlfdGlja3ModC0+Y3NfcHVsc2Vfd2lkdGgsIGRpdik7CisJaWYgKGNzX3B1bHNlID4gMHgzZikKKwkJcmV0dXJuIC0xOworCisJbCA9ICB3ZWN5YzsKKwlsIHw9IHJlY3ljICAgIDw8IDY7CisJbCB8PSBjc19wdWxzZSA8PCAxMjsKKwlsIHw9IGFjdGltICAgIDw8IDIyOworCisJdC0+dGltWzFdID0gbDsKKworCXQtPnRpbVsyXSA9IGRpdiAtIDE7CisKKwl0LT5jb252ZXJ0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZiaV9zZXR1cF90ZWFyc3luYyh1bnNpZ25lZCBwaW5fY250LAorCQkJICAgICAgIHVuc2lnbmVkIGhzX3B1bHNlX3RpbWUsIHVuc2lnbmVkIHZzX3B1bHNlX3RpbWUsCisJCQkgICAgICAgaW50IGhzX3BvbF9pbnYsIGludCB2c19wb2xfaW52LCBpbnQgZXh0aWZfZGl2KQoreworCWludCBocywgdnM7CisJaW50IG1pbjsKKwl1MzIgbDsKKworCWlmIChwaW5fY250ICE9IDEgJiYgcGluX2NudCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhzID0gcHNfdG9fcmZiaV90aWNrcyhoc19wdWxzZV90aW1lLCAxKTsKKwl2cyA9IHBzX3RvX3JmYmlfdGlja3ModnNfcHVsc2VfdGltZSwgMSk7CisJaWYgKGhzIDwgMikKKwkJcmV0dXJuIC1FRE9NOworCWlmIChwaW5fY250ID09IDIpCisJCW1pbiA9IDI7CisJZWxzZQorCQltaW4gPSA0OworCWlmICh2cyA8IG1pbikKKwkJcmV0dXJuIC1FRE9NOworCWlmICh2cyA9PSBocykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmZiaS50ZWFyc3luY19waW5fY250ID0gcGluX2NudDsKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwKKwkJInNldHVwX3RlYXJzeW5jOiBwaW5zICVkIGhzICVkIHZzICVkIGhzX2ludiAlZCB2c19pbnYgJWRcbiIsCisJCXBpbl9jbnQsIGhzLCB2cywgaHNfcG9sX2ludiwgdnNfcG9sX2ludik7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9IU1lOQ19XSURUSCwgaHMpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfVlNZTkNfV0lEVEgsIHZzKTsKKworCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfQ09ORklHMCk7CisJaWYgKGhzX3BvbF9pbnYpCisJCWwgJj0gfigxIDw8IDIxKTsKKwllbHNlCisJCWwgfD0gMSA8PCAyMTsKKwlpZiAodnNfcG9sX2ludikKKwkJbCAmPSB+KDEgPDwgMjApOworCWVsc2UKKwkJbCB8PSAxIDw8IDIwOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYmlfZW5hYmxlX3RlYXJzeW5jKGludCBlbmFibGUsIHVuc2lnbmVkIGxpbmUpCit7CisJdTMyIGw7CisKKwlkZXZfZGJnKHJmYmkuZmJkZXYtPmRldiwgInRlYXJzeW5jICVkIGxpbmUgJWQgbW9kZSAlZFxuIiwKKwkJZW5hYmxlLCBsaW5lLCByZmJpLnRlYXJzeW5jX21vZGUpOworCWlmIChsaW5lID4gKDEgPDwgMTEpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwlsICY9IH4oMHgzIDw8IDIpOworCWlmIChlbmFibGUpIHsKKwkJcmZiaS50ZWFyc3luY19tb2RlID0gcmZiaS50ZWFyc3luY19waW5fY250OworCQlsIHw9IHJmYmkudGVhcnN5bmNfbW9kZSA8PCAyOworCX0gZWxzZQorCQlyZmJpLnRlYXJzeW5jX21vZGUgPSAwOworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09ORklHMCwgbCk7CisJcmZiaV93cml0ZV9yZWcoUkZCSV9MSU5FX05VTUJFUiwgbGluZSk7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfd3JpdGVfY29tbWFuZChjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWlmIChyZmJpLmJpdHNfcGVyX2N5Y2xlID09IDE2KSB7CisJCWNvbnN0IHUxNiAqdyA9IGJ1ZjsKKwkJQlVHX09OKGxlbiAmIDEpOworCQlmb3IgKDsgbGVuOyBsZW4gLT0gMikKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfQ01ELCAqdysrKTsKKwl9IGVsc2UgeworCQljb25zdCB1OCAqYiA9IGJ1ZjsKKwkJQlVHX09OKHJmYmkuYml0c19wZXJfY3ljbGUgIT0gOCk7CisJCWZvciAoOyBsZW47IGxlbi0tKQorCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9DTUQsICpiKyspOworCX0KKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfcmVhZF9kYXRhKHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJaWYgKHJmYmkuYml0c19wZXJfY3ljbGUgPT0gMTYpIHsKKwkJdTE2ICp3ID0gYnVmOworCQlCVUdfT04obGVuICYgfjEpOworCQlmb3IgKDsgbGVuOyBsZW4gLT0gMikgeworCQkJcmZiaV93cml0ZV9yZWcoUkZCSV9SRUFELCAwKTsKKwkJCSp3KysgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVBRCk7CisJCX0KKwl9IGVsc2UgeworCQl1OCAqYiA9IGJ1ZjsKKwkJQlVHX09OKHJmYmkuYml0c19wZXJfY3ljbGUgIT0gOCk7CisJCWZvciAoOyBsZW47IGxlbi0tKSB7CisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1JFQUQsIDApOworCQkJKmIrKyA9IHJmYmlfcmVhZF9yZWcoUkZCSV9SRUFEKTsKKwkJfQorCX0KKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfd3JpdGVfZGF0YShjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCWlmIChyZmJpLmJpdHNfcGVyX2N5Y2xlID09IDE2KSB7CisJCWNvbnN0IHUxNiAqdyA9IGJ1ZjsKKwkJQlVHX09OKGxlbiAmIDEpOworCQlmb3IgKDsgbGVuOyBsZW4gLT0gMikKKwkJCXJmYmlfd3JpdGVfcmVnKFJGQklfUEFSQU0sICp3KyspOworCX0gZWxzZSB7CisJCWNvbnN0IHU4ICpiID0gYnVmOworCQlCVUdfT04ocmZiaS5iaXRzX3Blcl9jeWNsZSAhPSA4KTsKKwkJZm9yICg7IGxlbjsgbGVuLS0pCisJCQlyZmJpX3dyaXRlX3JlZyhSRkJJX1BBUkFNLCAqYisrKTsKKwl9CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgdm9pZCByZmJpX3RyYW5zZmVyX2FyZWEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkJCXZvaWQgKGNhbGxiYWNrKSh2b2lkICogZGF0YSksIHZvaWQgKmRhdGEpCit7CisJdTMyIHc7CisKKwlCVUdfT04oY2FsbGJhY2sgPT0gTlVMTCk7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJb21hcF9kaXNwY19zZXRfbGNkX3NpemUod2lkdGgsIGhlaWdodCk7CisKKwlyZmJpLmxjZGNfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlyZmJpLmxjZGNfY2FsbGJhY2tfZGF0YSA9IGRhdGE7CisKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1BJWEVMX0NOVCwgd2lkdGggKiBoZWlnaHQpOworCisJdyA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05UUk9MKTsKKwl3IHw9IDE7CQkJCS8qIGVuYWJsZSAqLworCWlmICghcmZiaS50ZWFyc3luY19tb2RlKQorCQl3IHw9IDEgPDwgNDsJCS8qIGludGVybmFsIHRyaWdnZXIsIHJlc2V0IGJ5IEhXICovCisJcmZiaV93cml0ZV9yZWcoUkZCSV9DT05UUk9MLCB3KTsKKworCW9tYXBfZGlzcGNfZW5hYmxlX2xjZF9vdXQoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3RvcF90cmFuc2Zlcih2b2lkKQoreworCXUzMiB3OworCisJdyA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05UUk9MKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTlRST0wsIHcgJiB+KDEgPDwgMCkpOworCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKK30KKworc3RhdGljIHZvaWQgcmZiaV9kbWFfY2FsbGJhY2sodm9pZCAqZGF0YSkKK3sKKwlfc3RvcF90cmFuc2ZlcigpOworCXJmYmkubGNkY19jYWxsYmFjayhyZmJpLmxjZGNfY2FsbGJhY2tfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHJmYmlfc2V0X2JpdHNfcGVyX2N5Y2xlKGludCBicGMpCit7CisJdTMyIGw7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05GSUcwKTsKKwlsICY9IH4oMHgwMyA8PCAwKTsKKworCXN3aXRjaCAoYnBjKSB7CisJY2FzZSA4OgorCQlicmVhazsKKwljYXNlIDE2OgorCQlsIHw9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTkZJRzAsIGwpOworCXJmYmkuYml0c19wZXJfY3ljbGUgPSBicGM7CisJcmZiaV9lbmFibGVfY2xvY2tzKDApOworfQorCitzdGF0aWMgaW50IHJmYmlfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJdTMyIGw7CisJaW50IHI7CisKKwlyZmJpLmZiZGV2ID0gZmJkZXY7CisJcmZiaS5iYXNlID0gaW9fcDJ2KFJGQklfQkFTRSk7CisKKwlpZiAoKHIgPSByZmJpX2dldF9jbG9ja3MoKSkgPCAwKQorCQlyZXR1cm4gcjsKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMSk7CisKKwlyZmJpLmw0X2toeiA9IGNsa19nZXRfcmF0ZShyZmJpLmRzc19pY2spIC8gMTAwMDsKKworCS8qIFJlc2V0ICovCisJcmZiaV93cml0ZV9yZWcoUkZCSV9TWVNDT05GSUcsIDEgPDwgMSk7CisJd2hpbGUgKCEocmZiaV9yZWFkX3JlZyhSRkJJX1NZU1NUQVRVUykgJiAoMSA8PCAwKSkpOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9TWVNDT05GSUcpOworCS8qIEVuYWJsZSBhdXRvaWRsZSBhbmQgc21hcnQtaWRsZSAqLworCWwgfD0gKDEgPDwgMCkgfCAoMiA8PCAzKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX1NZU0NPTkZJRywgbCk7CisKKwkvKiAxNi1iaXQgaW50ZXJmYWNlLCBJVEUgdHJpZ2dlciBtb2RlLCAxNi1iaXQgZGF0YSAqLworCWwgPSAoMHgwMyA8PCAwKSB8ICgweDAwIDw8IDIpIHwgKDB4MDEgPDwgNSkgfCAoMHgwMiA8PCA3KTsKKwlsIHw9ICgwIDw8IDkpIHwgKDEgPDwgMjApIHwgKDEgPDwgMjEpOworCXJmYmlfd3JpdGVfcmVnKFJGQklfQ09ORklHMCwgbCk7CisKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0RBVEFfQ1lDTEUxXzAsIDB4MDAwMDAwMTApOworCisJbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9DT05UUk9MKTsKKwkvKiBTZWxlY3QgQ1MwLCBjbGVhciBieXBhc3MgbW9kZSAqLworCWwgPSAoMHgwMSA8PCAyKTsKKwlyZmJpX3dyaXRlX3JlZyhSRkJJX0NPTlRST0wsIGwpOworCisJaWYgKChyID0gb21hcF9kaXNwY19yZXF1ZXN0X2lycShyZmJpX2RtYV9jYWxsYmFjaywgTlVMTCkpIDwgMCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjYW4ndCBnZXQgRElTUEMgaXJxXG4iKTsKKwkJcmZiaV9lbmFibGVfY2xvY2tzKDApOworCQlyZXR1cm4gcjsKKwl9CisKKwlsID0gcmZiaV9yZWFkX3JlZyhSRkJJX1JFVklTSU9OKTsKKwlwcl9pbmZvKCJvbWFwZmI6IFJGQkkgdmVyc2lvbiAlZC4lZCBpbml0aWFsaXplZFxuIiwKKwkJKGwgPj4gNCkgJiAweDBmLCBsICYgMHgwZik7CisKKwlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmZiaV9jbGVhbnVwKHZvaWQpCit7CisJb21hcF9kaXNwY19mcmVlX2lycSgpOworCXJmYmlfcHV0X2Nsb2NrcygpOworfQorCitjb25zdCBzdHJ1Y3QgbGNkX2N0cmxfZXh0aWYgb21hcDJfZXh0X2lmID0geworCS5pbml0CQkJPSByZmJpX2luaXQsCisJLmNsZWFudXAJCT0gcmZiaV9jbGVhbnVwLAorCS5nZXRfY2xrX2luZm8JCT0gcmZiaV9nZXRfY2xrX2luZm8sCisJLmdldF9tYXhfdHhfcmF0ZQk9IHJmYmlfZ2V0X21heF90eF9yYXRlLAorCS5zZXRfYml0c19wZXJfY3ljbGUJPSByZmJpX3NldF9iaXRzX3Blcl9jeWNsZSwKKwkuY29udmVydF90aW1pbmdzCT0gcmZiaV9jb252ZXJ0X3RpbWluZ3MsCisJLnNldF90aW1pbmdzCQk9IHJmYmlfc2V0X3RpbWluZ3MsCisJLndyaXRlX2NvbW1hbmQJCT0gcmZiaV93cml0ZV9jb21tYW5kLAorCS5yZWFkX2RhdGEJCT0gcmZiaV9yZWFkX2RhdGEsCisJLndyaXRlX2RhdGEJCT0gcmZiaV93cml0ZV9kYXRhLAorCS50cmFuc2Zlcl9hcmVhCQk9IHJmYmlfdHJhbnNmZXJfYXJlYSwKKwkuc2V0dXBfdGVhcnN5bmMJCT0gcmZiaV9zZXR1cF90ZWFyc3luYywKKwkuZW5hYmxlX3RlYXJzeW5jCT0gcmZiaV9lbmFibGVfdGVhcnN5bmMsCisKKwkubWF4X3RyYW5zbWl0X3NpemUJPSAodTMyKSB+MCwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jIGIvZHJpdmVycy92aWRlby9vbWFwL3Nvc3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkYmNmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcC9zb3NzaS5jCkBAIC0wLDAgKzEsNjg2IEBACisvKgorICogT01BUDEgU3BlY2lhbCBPcHRpbWlTZWQgU2NyZWVuIEludGVyZmFjZSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorCisjaW5jbHVkZSAibGNkYy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkib21hcGZiLXNvc3NpIgorCisjZGVmaW5lIE9NQVBfU09TU0lfQkFTRSAgICAgICAgIDB4ZmZmYmFjMDAKKyNkZWZpbmUgU09TU0lfSURfUkVHCQkweDAwCisjZGVmaW5lIFNPU1NJX0lOSVQxX1JFRwkJMHgwNAorI2RlZmluZSBTT1NTSV9JTklUMl9SRUcJCTB4MDgKKyNkZWZpbmUgU09TU0lfSU5JVDNfUkVHCQkweDBjCisjZGVmaW5lIFNPU1NJX0ZJRk9fUkVHCQkweDEwCisjZGVmaW5lIFNPU1NJX1JFT1RBQkxFX1JFRwkweDE0CisjZGVmaW5lIFNPU1NJX1RFQVJJTkdfUkVHCTB4MTgKKyNkZWZpbmUgU09TU0lfSU5JVDFCX1JFRwkweDFjCisjZGVmaW5lIFNPU1NJX0ZJRk9CX1JFRwkJMHgyMAorCisjZGVmaW5lIERNQV9HU0NSICAgICAgICAgIDB4ZmZmZWRjMDQKKyNkZWZpbmUgRE1BX0xDRF9DQ1IgICAgICAgMHhmZmZlZTNjMgorI2RlZmluZSBETUFfTENEX0NUUkwgICAgICAweGZmZmVlM2M0CisjZGVmaW5lIERNQV9MQ0RfTENIX0NUUkwgIDB4ZmZmZWUzZWEKKworI2RlZmluZSBDT05GX1NPU1NJX1JFU0VUX1IgICAgICAoMSA8PCAyMykKKworI2RlZmluZSBSRF9BQ0NFU1MJCTAKKyNkZWZpbmUgV1JfQUNDRVNTCQkxCisKKyNkZWZpbmUgU09TU0lfTUFYX1hNSVRfQllURVMJKDUxMiAqIDEwMjQpCisKK3N0YXRpYyBzdHJ1Y3QgeworCXZvaWQgX19pb21lbQkqYmFzZTsKKwlzdHJ1Y3QgY2xrCSpmY2s7CisJdW5zaWduZWQgbG9uZwlmY2tfaHo7CisJc3BpbmxvY2tfdAlsb2NrOworCWludAkJYnVzX3BpY2tfY291bnQ7CisJaW50CQlidXNfcGlja193aWR0aDsKKwlpbnQJCXRlYXJzeW5jX21vZGU7CisJaW50CQl0ZWFyc3luY19saW5lOworCXZvaWQJCSgqbGNkY19jYWxsYmFjaykodm9pZCAqZGF0YSk7CisJdm9pZAkJKmxjZGNfY2FsbGJhY2tfZGF0YTsKKwlpbnQJCXZzeW5jX2RtYV9wZW5kaW5nOworCS8qIHRpbWluZyBmb3IgcmVhZCBhbmQgd3JpdGUgYWNjZXNzICovCisJaW50CQljbGtfZGl2OworCXU4CQljbGtfdHcwWzJdOworCXU4CQljbGtfdHcxWzJdOworCS8qCisJICogaWYgbGFzdF9hY2Nlc3MgaXMgdGhlIHNhbWUgYXMgY3VycmVudCB3ZSBkb24ndCBoYXZlIHRvIGNoYW5nZQorCSAqIHRoZSB0aW1pbmdzCisJICovCisJaW50CQlsYXN0X2FjY2VzczsKKworCXN0cnVjdCBvbWFwZmJfZGV2aWNlCSpmYmRldjsKK30gc29zc2k7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHNvc3NpX3JlYWRfcmVnKGludCByZWcpCit7CisJcmV0dXJuIHJlYWRsKHNvc3NpLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBzb3NzaV9yZWFkX3JlZzE2KGludCByZWcpCit7CisJcmV0dXJuIHJlYWR3KHNvc3NpLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHNvc3NpX3JlYWRfcmVnOChpbnQgcmVnKQoreworCXJldHVybiByZWFkYihzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvc3NpX3dyaXRlX3JlZyhpbnQgcmVnLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBzb3NzaS5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvc3NpX3dyaXRlX3JlZzE2KGludCByZWcsIHUxNiB2YWx1ZSkKK3sKKwl3cml0ZXcodmFsdWUsIHNvc3NpLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc29zc2lfd3JpdGVfcmVnOChpbnQgcmVnLCB1OCB2YWx1ZSkKK3sKKwl3cml0ZWIodmFsdWUsIHNvc3NpLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zZXRfYml0cyhpbnQgcmVnLCB1MzIgYml0cykKK3sKKwlzb3NzaV93cml0ZV9yZWcocmVnLCBzb3NzaV9yZWFkX3JlZyhyZWcpIHwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX2NsZWFyX2JpdHMoaW50IHJlZywgdTMyIGJpdHMpCit7CisJc29zc2lfd3JpdGVfcmVnKHJlZywgc29zc2lfcmVhZF9yZWcocmVnKSAmIH5iaXRzKTsKK30KKworI2RlZmluZSBIWl9UT19QUyh4KQkoMTAwMDAwMDAwMCAvICh4IC8gMTAwMCkpCisKK3N0YXRpYyB1MzIgcHNfdG9fc29zc2lfdGlja3ModTMyIHBzLCBpbnQgZGl2KQoreworCXUzMiBjbGtfcGVyaW9kID0gSFpfVE9fUFMoc29zc2kuZmNrX2h6KSAqIGRpdjsKKwlyZXR1cm4gKGNsa19wZXJpb2QgKyBwcyAtIDEpIC8gY2xrX3BlcmlvZDsKK30KKworc3RhdGljIGludCBjYWxjX3JkX3RpbWluZ3Moc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIHR3MCwgdHcxOworCWludCByZW9uLCByZW9mZiwgcmVjeWMsIGFjdGltOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBhZnRlciBjb252ZXJzaW9uIGl0IHN0aWxsIGhvbGRzIHRoYXQ6CisJICogcmVvZmYgPiByZW9uLCByZWN5YyA+PSByZW9mZiwgYWN0aW0gPiByZW9uCisJICovCisJcmVvbiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPnJlX29uX3RpbWUsIGRpdik7CisJLyogcmVvbiB3aWxsIGJlIGV4YWN0bHkgb25lIHNvc3NpIHRpY2sgKi8KKwlpZiAocmVvbiA+IDEpCisJCXJldHVybiAtMTsKKworCXJlb2ZmID0gcHNfdG9fc29zc2lfdGlja3ModC0+cmVfb2ZmX3RpbWUsIGRpdik7CisKKwlpZiAocmVvZmYgPD0gcmVvbikKKwkJcmVvZmYgPSByZW9uICsgMTsKKworCXR3MCA9IHJlb2ZmIC0gcmVvbjsKKwlpZiAodHcwID4gMHgxMCkKKwkJcmV0dXJuIC0xOworCisJcmVjeWMgPSBwc190b19zb3NzaV90aWNrcyh0LT5yZV9jeWNsZV90aW1lLCBkaXYpOworCWlmIChyZWN5YyA8PSByZW9mZikKKwkJcmVjeWMgPSByZW9mZiArIDE7CisKKwl0dzEgPSByZWN5YyAtIHR3MDsKKwkvKiB2YWx1ZXMgbGVzcyB0aGVuIDMgcmVzdWx0IGluIHRoZSBTT1NTSSBibG9jayByZXNldHRpbmcgaXRzZWxmICovCisJaWYgKHR3MSA8IDMpCisJCXR3MSA9IDM7CisJaWYgKHR3MSA+IDB4NDApCisJCXJldHVybiAtMTsKKworCWFjdGltID0gcHNfdG9fc29zc2lfdGlja3ModC0+YWNjZXNzX3RpbWUsIGRpdik7CisJaWYgKGFjdGltIDwgcmVvZmYpCisJCWFjdGltKys7CisJLyoKKwkgKiBhY2Nlc3MgdGltZSAoZGF0YSBob2xkIHRpbWUpIHdpbGwgYmUgZXhhY3RseSBvbmUgc29zc2kKKwkgKiB0aWNrCisJICovCisJaWYgKGFjdGltIC0gcmVvZmYgPiAxKQorCQlyZXR1cm4gLTE7CisKKwl0LT50aW1bMF0gPSB0dzAgLSAxOworCXQtPnRpbVsxXSA9IHR3MSAtIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYWxjX3dyX3RpbWluZ3Moc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJdTMyIHR3MCwgdHcxOworCWludCB3ZW9uLCB3ZW9mZiwgd2VjeWM7CisJaW50IGRpdiA9IHQtPmNsa19kaXY7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IGFmdGVyIGNvbnZlcnNpb24gaXQgc3RpbGwgaG9sZHMgdGhhdDoKKwkgKiB3ZW9mZiA+IHdlb24sIHdlY3ljID49IHdlb2ZmCisJICovCisJd2VvbiA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPndlX29uX3RpbWUsIGRpdik7CisJLyogd2VvbiB3aWxsIGJlIGV4YWN0bHkgb25lIHNvc3NpIHRpY2sgKi8KKwlpZiAod2VvbiA+IDEpCisJCXJldHVybiAtMTsKKworCXdlb2ZmID0gcHNfdG9fc29zc2lfdGlja3ModC0+d2Vfb2ZmX3RpbWUsIGRpdik7CisJaWYgKHdlb2ZmIDw9IHdlb24pCisJCXdlb2ZmID0gd2VvbiArIDE7CisJdHcwID0gd2VvZmYgLSB3ZW9uOworCWlmICh0dzAgPiAweDEwKQorCQlyZXR1cm4gLTE7CisKKwl3ZWN5YyA9IHBzX3RvX3Nvc3NpX3RpY2tzKHQtPndlX2N5Y2xlX3RpbWUsIGRpdik7CisJaWYgKHdlY3ljIDw9IHdlb2ZmKQorCQl3ZWN5YyA9IHdlb2ZmICsgMTsKKworCXR3MSA9IHdlY3ljIC0gdHcwOworCS8qIHZhbHVlcyBsZXNzIHRoZW4gMyByZXN1bHQgaW4gdGhlIFNPU1NJIGJsb2NrIHJlc2V0dGluZyBpdHNlbGYgKi8KKwlpZiAodHcxIDwgMykKKwkJdHcxID0gMzsKKwlpZiAodHcxID4gMHg0MCkKKwkJcmV0dXJuIC0xOworCisJdC0+dGltWzJdID0gdHcwIC0gMTsKKwl0LT50aW1bM10gPSB0dzEgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfdGltaW5nKGludCBkaXYsIGludCB0dzAsIGludCB0dzEpCit7CisJdTMyIGw7CisKKyNpZmRlZiBWRVJCT1NFCisJZGV2X2RiZyhzb3NzaS5mYmRldi0+ZGV2LCAiVXNpbmcgVFcwID0gJWQsIFRXMSA9ICVkLCBkaXYgPSAlZFxuIiwKKwkJIHR3MCArIDEsIHR3MSArIDEsIGRpdik7CisjZW5kaWYKKworCWNsa19zZXRfcmF0ZShzb3NzaS5mY2ssIHNvc3NpLmZja19oeiAvIGRpdik7CisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JTklUMV9SRUcpOworCWwgJj0gfigoMHgwZiA8PCAyMCkgfCAoMHgzZiA8PCAyNCkpOworCWwgfD0gKHR3MCA8PCAyMCkgfCAodHcxIDw8IDI0KTsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSU5JVDFfUkVHLCBsKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworfQorCitzdGF0aWMgdm9pZCBfc2V0X2JpdHNfcGVyX2N5Y2xlKGludCBidXNfcGlja19jb3VudCwgaW50IGJ1c19waWNrX3dpZHRoKQoreworCXUzMiBsOworCisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQzX1JFRyk7CisJbCAmPSB+MHgzZmY7CisJbCB8PSAoKGJ1c19waWNrX2NvdW50IC0gMSkgPDwgNSkgfCAoKGJ1c19waWNrX3dpZHRoIC0gMSkgJiAweDFmKTsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSU5JVDNfUkVHLCBsKTsKK30KKworc3RhdGljIHZvaWQgX3NldF90ZWFyc3luY19tb2RlKGludCBtb2RlLCB1bnNpZ25lZCBsaW5lKQoreworCXUzMiBsOworCisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX1RFQVJJTkdfUkVHKTsKKwlsICY9IH4oKCgxIDw8IDExKSAtIDEpIDw8IDE1KTsKKwlsIHw9IGxpbmUgPDwgMTU7CisJbCAmPSB+KDB4MyA8PCAyNik7CisJbCB8PSBtb2RlIDw8IDI2OworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9URUFSSU5HX1JFRywgbCk7CisJaWYgKG1vZGUpCisJCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA2KTsJLyogVEUgbG9naWMgKi8KKwllbHNlCisJCXNvc3NpX2NsZWFyX2JpdHMoU09TU0lfSU5JVDJfUkVHLCAxIDw8IDYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RpbWluZyhpbnQgYWNjZXNzKQoreworCWlmIChhY2Nlc3MgIT0gc29zc2kubGFzdF9hY2Nlc3MpIHsKKwkJc29zc2kubGFzdF9hY2Nlc3MgPSBhY2Nlc3M7CisJCV9zZXRfdGltaW5nKHNvc3NpLmNsa19kaXYsCisJCQkgICAgc29zc2kuY2xrX3R3MFthY2Nlc3NdLCBzb3NzaS5jbGtfdHcxW2FjY2Vzc10pOworCX0KK30KKworc3RhdGljIHZvaWQgc29zc2lfc3RhcnRfdHJhbnNmZXIodm9pZCkKK3sKKwkvKiBXRSAqLworCXNvc3NpX2NsZWFyX2JpdHMoU09TU0lfSU5JVDJfUkVHLCAxIDw8IDQpOworCS8qIENTIGFjdGl2ZSBsb3cgKi8KKwlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAzMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3N0b3BfdHJhbnNmZXIodm9pZCkKK3sKKwkvKiBXRSAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQyX1JFRywgMSA8PCA0KTsKKwkvKiBDUyBhY3RpdmUgbG93ICovCisJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDFfUkVHLCAxIDw8IDMwKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9lbmRfb2Zfd3JpdGUodm9pZCkKK3sKKwkvKiBCZWZvcmUgcmVhZGluZyB3ZSBtdXN0IGNoZWNrIGlmIHNvbWUgd3JpdGluZ3MgYXJlIGdvaW5nIG9uICovCisJd2hpbGUgKCEoc29zc2lfcmVhZF9yZWcoU09TU0lfSU5JVDJfUkVHKSAmICgxIDw8IDMpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZGF0YShjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXdoaWxlIChsZW4gPj0gNCkgeworCQlzb3NzaV93cml0ZV9yZWcoU09TU0lfRklGT19SRUcsICooY29uc3QgdTMyICopIGRhdGEpOworCQlsZW4gLT0gNDsKKwkJZGF0YSArPSA0OworCX0KKwl3aGlsZSAobGVuID49IDIpIHsKKwkJc29zc2lfd3JpdGVfcmVnMTYoU09TU0lfRklGT19SRUcsICooY29uc3QgdTE2ICopIGRhdGEpOworCQlsZW4gLT0gMjsKKwkJZGF0YSArPSAyOworCX0KKwl3aGlsZSAobGVuKSB7CisJCXNvc3NpX3dyaXRlX3JlZzgoU09TU0lfRklGT19SRUcsICooY29uc3QgdTggKikgZGF0YSk7CisJCWxlbi0tOworCQlkYXRhKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfY3ljbGVzKHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBucl9jeWNsZXMgPSBsZW4gLyAoc29zc2kuYnVzX3BpY2tfd2lkdGggLyA4KTsKKworCUJVR19PTigobnJfY3ljbGVzIC0gMSkgJiB+MHgzZmZmZik7CisKKwlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMHgzZmZmZik7CisJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDFfUkVHLCAobnJfY3ljbGVzIC0gMSkgJiAweDNmZmZmKTsKK30KKworc3RhdGljIGludCBzb3NzaV9jb252ZXJ0X3RpbWluZ3Moc3RydWN0IGV4dGlmX3RpbWluZ3MgKnQpCit7CisJaW50IHIgPSAwOworCWludCBkaXYgPSB0LT5jbGtfZGl2OworCisJdC0+Y29udmVydGVkID0gMDsKKworCWlmIChkaXYgPD0gMCB8fCBkaXYgPiA4KQorCQlyZXR1cm4gLTE7CisKKwkvKiBubyBDUyBvbiBTT1NTSSwgc28gaWdub3JlIGNzb24sIGNzb2ZmLCBjc19wdWxzZXdpZHRoICovCisJaWYgKChyID0gY2FsY19yZF90aW1pbmdzKHQpKSA8IDApCisJCXJldHVybiByOworCisJaWYgKChyID0gY2FsY193cl90aW1pbmdzKHQpKSA8IDApCisJCXJldHVybiByOworCisJdC0+dGltWzRdID0gZGl2OworCisJdC0+Y29udmVydGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9zZXRfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwlCVUdfT04oIXQtPmNvbnZlcnRlZCk7CisKKwlzb3NzaS5jbGtfdHcwW1JEX0FDQ0VTU10gPSB0LT50aW1bMF07CisJc29zc2kuY2xrX3R3MVtSRF9BQ0NFU1NdID0gdC0+dGltWzFdOworCisJc29zc2kuY2xrX3R3MFtXUl9BQ0NFU1NdID0gdC0+dGltWzJdOworCXNvc3NpLmNsa190dzFbV1JfQUNDRVNTXSA9IHQtPnRpbVszXTsKKworCXNvc3NpLmNsa19kaXYgPSB0LT50aW1bNF07Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX2dldF9jbGtfaW5mbyh1MzIgKmNsa19wZXJpb2QsIHUzMiAqbWF4X2Nsa19kaXYpCit7CisJKmNsa19wZXJpb2QgPSBIWl9UT19QUyhzb3NzaS5mY2tfaHopOworCSptYXhfY2xrX2RpdiA9IDg7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3NldF9iaXRzX3Blcl9jeWNsZShpbnQgYnBjKQoreworCWludCBidXNfcGlja19jb3VudCwgYnVzX3BpY2tfd2lkdGg7CisKKwkvKgorCSAqIFdlIHNldCBleHBsaWNpdGx5IHRoZSB0aGUgYnVzX3BpY2tfY291bnQgYXMgd2VsbCwgYWx0aG91Z2gKKwkgKiB3aXRoIHJlbWFwcGluZy9yZW9yZGVyaW5nIGRpc2FibGVkIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBieSBIVworCSAqIGFzICgzMiAvIGJ1c19waWNrX3dpZHRoKS4KKwkgKi8KKwlzd2l0Y2ggKGJwYykgeworCWNhc2UgODoKKwkJYnVzX3BpY2tfY291bnQgPSA0OworCQlidXNfcGlja193aWR0aCA9IDg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWJ1c19waWNrX2NvdW50ID0gMjsKKwkJYnVzX3BpY2tfd2lkdGggPSAxNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJc29zc2kuYnVzX3BpY2tfd2lkdGggPSBidXNfcGlja193aWR0aDsKKwlzb3NzaS5idXNfcGlja19jb3VudCA9IGJ1c19waWNrX2NvdW50OworfQorCitzdGF0aWMgaW50IHNvc3NpX3NldHVwX3RlYXJzeW5jKHVuc2lnbmVkIHBpbl9jbnQsCisJCQkJdW5zaWduZWQgaHNfcHVsc2VfdGltZSwgdW5zaWduZWQgdnNfcHVsc2VfdGltZSwKKwkJCQlpbnQgaHNfcG9sX2ludiwgaW50IHZzX3BvbF9pbnYsIGludCBkaXYpCit7CisJaW50IGhzLCB2czsKKwl1MzIgbDsKKworCWlmIChwaW5fY250ICE9IDEgfHwgZGl2IDwgMSB8fCBkaXYgPiA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhzID0gcHNfdG9fc29zc2lfdGlja3MoaHNfcHVsc2VfdGltZSwgZGl2KTsKKwl2cyA9IHBzX3RvX3Nvc3NpX3RpY2tzKHZzX3B1bHNlX3RpbWUsIGRpdik7CisJaWYgKHZzIDwgOCB8fCB2cyA8PSBocyB8fCB2cyA+PSAoMSA8PCAxMikpCisJCXJldHVybiAtRURPTTsKKwl2cyAvPSA4OworCXZzLS07CisJaWYgKGhzID4gOCkKKwkJaHMgPSA4OworCWlmIChocykKKwkJaHMtLTsKKworCWRldl9kYmcoc29zc2kuZmJkZXYtPmRldiwKKwkJInNldHVwX3RlYXJzeW5jOiBocyAlZCB2cyAlZCBoc19pbnYgJWQgdnNfaW52ICVkXG4iLAorCQlocywgdnMsIGhzX3BvbF9pbnYsIHZzX3BvbF9pbnYpOworCisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9URUFSSU5HX1JFRyk7CisJbCAmPSB+KCgxIDw8IDE1KSAtIDEpOworCWwgfD0gdnMgPDwgMzsKKwlsIHw9IGhzOworCWlmIChoc19wb2xfaW52KQorCQlsIHw9IDEgPDwgMjk7CisJZWxzZQorCQlsICY9IH4oMSA8PCAyOSk7CisJaWYgKHZzX3BvbF9pbnYpCisJCWwgfD0gMSA8PCAyODsKKwllbHNlCisJCWwgJj0gfigxIDw8IDI4KTsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfVEVBUklOR19SRUcsIGwpOworCWNsa19kaXNhYmxlKHNvc3NpLmZjayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb3NzaV9lbmFibGVfdGVhcnN5bmMoaW50IGVuYWJsZSwgdW5zaWduZWQgbGluZSkKK3sKKwlpbnQgbW9kZTsKKworCWRldl9kYmcoc29zc2kuZmJkZXYtPmRldiwgInRlYXJzeW5jICVkIGxpbmUgJWRcbiIsIGVuYWJsZSwgbGluZSk7CisJaWYgKGxpbmUgPj0gMSA8PCAxMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVuYWJsZSkgeworCQlpZiAobGluZSkKKwkJCW1vZGUgPSAyOwkJLyogSFMgb3IgVlMgKi8KKwkJZWxzZQorCQkJbW9kZSA9IDM7CQkvKiBWUyBvbmx5ICovCisJfSBlbHNlCisJCW1vZGUgPSAwOworCXNvc3NpLnRlYXJzeW5jX2xpbmUgPSBsaW5lOworCXNvc3NpLnRlYXJzeW5jX21vZGUgPSBtb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX3dyaXRlX2NvbW1hbmQoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljbGtfZW5hYmxlKHNvc3NpLmZjayk7CisJc2V0X3RpbWluZyhXUl9BQ0NFU1MpOworCV9zZXRfYml0c19wZXJfY3ljbGUoc29zc2kuYnVzX3BpY2tfY291bnQsIHNvc3NpLmJ1c19waWNrX3dpZHRoKTsKKwkvKiBDTUQjL0RBVEEgKi8KKwlzb3NzaV9jbGVhcl9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAxOCk7CisJc2V0X2N5Y2xlcyhsZW4pOworCXNvc3NpX3N0YXJ0X3RyYW5zZmVyKCk7CisJc2VuZF9kYXRhKGRhdGEsIGxlbik7CisJc29zc2lfc3RvcF90cmFuc2ZlcigpOworCXdhaXRfZW5kX29mX3dyaXRlKCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfd3JpdGVfZGF0YShjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlzZXRfdGltaW5nKFdSX0FDQ0VTUyk7CisJX3NldF9iaXRzX3Blcl9jeWNsZShzb3NzaS5idXNfcGlja19jb3VudCwgc29zc2kuYnVzX3BpY2tfd2lkdGgpOworCS8qIENNRCMvREFUQSAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAxOCk7CisJc2V0X2N5Y2xlcyhsZW4pOworCXNvc3NpX3N0YXJ0X3RyYW5zZmVyKCk7CisJc2VuZF9kYXRhKGRhdGEsIGxlbik7CisJc29zc2lfc3RvcF90cmFuc2ZlcigpOworCXdhaXRfZW5kX29mX3dyaXRlKCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfdHJhbnNmZXJfYXJlYShpbnQgd2lkdGgsIGludCBoZWlnaHQsCisJCQkJdm9pZCAoY2FsbGJhY2spKHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCUJVR19PTihjYWxsYmFjayA9PSBOVUxMKTsKKworCXNvc3NpLmxjZGNfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlzb3NzaS5sY2RjX2NhbGxiYWNrX2RhdGEgPSBkYXRhOworCisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCXNldF90aW1pbmcoV1JfQUNDRVNTKTsKKwlfc2V0X2JpdHNfcGVyX2N5Y2xlKHNvc3NpLmJ1c19waWNrX2NvdW50LCBzb3NzaS5idXNfcGlja193aWR0aCk7CisJX3NldF90ZWFyc3luY19tb2RlKHNvc3NpLnRlYXJzeW5jX21vZGUsIHNvc3NpLnRlYXJzeW5jX2xpbmUpOworCS8qIENNRCMvREFUQSAqLworCXNvc3NpX3NldF9iaXRzKFNPU1NJX0lOSVQxX1JFRywgMSA8PCAxOCk7CisJc2V0X2N5Y2xlcyh3aWR0aCAqIGhlaWdodCAqIHNvc3NpLmJ1c19waWNrX3dpZHRoIC8gOCk7CisKKwlzb3NzaV9zdGFydF90cmFuc2ZlcigpOworCWlmIChzb3NzaS50ZWFyc3luY19tb2RlKSB7CisJCS8qCisJCSAqIFdhaXQgZm9yIHRoZSBzeW5jIHNpZ25hbCBhbmQgc3RhcnQgdGhlIHRyYW5zZmVyIG9ubHkKKwkJICogdGhlbi4gV2UgY2FuJ3Qgc2VlbSB0byBiZSBhYmxlIHRvIHVzZSBIVyBzeW5jIERNQSBmb3IKKwkJICogdGhpcyBzaW5jZSBMQ0QgRE1BIHNob3dzIGh1Z2UgbGF0ZW5jaWVzLCBhcyBpZiBpdAorCQkgKiB3b3VsZCBpZ25vcmUgc29tZSBvZiB0aGUgRE1BIHJlcXVlc3RzIGZyb20gU29TU0kuCisJCSAqLworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzb3NzaS5sb2NrLCBmbGFncyk7CisJCXNvc3NpLnZzeW5jX2RtYV9wZW5kaW5nKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvc3NpLmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UKKwkJLyogSnVzdCBzdGFydCB0aGUgdHJhbnNmZXIgcmlnaHQgYXdheS4gKi8KKwkJb21hcF9lbmFibGVfbGNkX2RtYSgpOworfQorCitzdGF0aWMgdm9pZCBzb3NzaV9kbWFfY2FsbGJhY2sodm9pZCAqZGF0YSkKK3sKKwlvbWFwX3N0b3BfbGNkX2RtYSgpOworCXNvc3NpX3N0b3BfdHJhbnNmZXIoKTsKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworCXNvc3NpLmxjZGNfY2FsbGJhY2soc29zc2kubGNkY19jYWxsYmFja19kYXRhKTsKK30KKworc3RhdGljIHZvaWQgc29zc2lfcmVhZF9kYXRhKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY2xrX2VuYWJsZShzb3NzaS5mY2spOworCXNldF90aW1pbmcoUkRfQUNDRVNTKTsKKwlfc2V0X2JpdHNfcGVyX2N5Y2xlKHNvc3NpLmJ1c19waWNrX2NvdW50LCBzb3NzaS5idXNfcGlja193aWR0aCk7CisJLyogQ01EIy9EQVRBICovCisJc29zc2lfc2V0X2JpdHMoU09TU0lfSU5JVDFfUkVHLCAxIDw8IDE4KTsKKwlzZXRfY3ljbGVzKGxlbik7CisJc29zc2lfc3RhcnRfdHJhbnNmZXIoKTsKKwl3aGlsZSAobGVuID49IDQpIHsKKwkJKih1MzIgKikgZGF0YSA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0ZJRk9fUkVHKTsKKwkJbGVuIC09IDQ7CisJCWRhdGEgKz0gNDsKKwl9CisJd2hpbGUgKGxlbiA+PSAyKSB7CisJCSoodTE2ICopIGRhdGEgPSBzb3NzaV9yZWFkX3JlZzE2KFNPU1NJX0ZJRk9fUkVHKTsKKwkJbGVuIC09IDI7CisJCWRhdGEgKz0gMjsKKwl9CisJd2hpbGUgKGxlbikgeworCQkqKHU4ICopIGRhdGEgPSBzb3NzaV9yZWFkX3JlZzgoU09TU0lfRklGT19SRUcpOworCQlsZW4tLTsKKwkJZGF0YSsrOworCX0KKwlzb3NzaV9zdG9wX3RyYW5zZmVyKCk7CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNvc3NpX21hdGNoX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc29zc2kubG9jaywgZmxhZ3MpOworCWlmIChzb3NzaS52c3luY19kbWFfcGVuZGluZykgeworCQlzb3NzaS52c3luY19kbWFfcGVuZGluZy0tOworCQlvbWFwX2VuYWJsZV9sY2RfZG1hKCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvc3NpLmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc29zc2lfaW5pdChzdHJ1Y3Qgb21hcGZiX2RldmljZSAqZmJkZXYpCit7CisJdTMyIGwsIGs7CisJc3RydWN0IGNsayAqZmNrOworCXN0cnVjdCBjbGsgKmRwbGwxb3V0X2NrOworCWludCByOworCisJc29zc2kuYmFzZSA9ICh2b2lkIF9faW9tZW0gKilJT19BRERSRVNTKE9NQVBfU09TU0lfQkFTRSk7CisJc29zc2kuZmJkZXYgPSBmYmRldjsKKwlzcGluX2xvY2tfaW5pdCgmc29zc2kubG9jayk7CisKKwlkcGxsMW91dF9jayA9IGNsa19nZXQoZmJkZXYtPmRldiwgImNrX2RwbGwxb3V0Iik7CisJaWYgKElTX0VSUihkcGxsMW91dF9jaykpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiY2FuJ3QgZ2V0IERQTEwxT1VUIGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHBsbDFvdXRfY2spOworCX0KKwkvKgorCSAqIFdlIG5lZWQgdGhlIHBhcmVudCBjbG9jayByYXRlLCB3aGljaCB3ZSBtaWdodCBkaXZpZGUgZnVydGhlcgorCSAqIGRlcGVuZGluZyBvbiB0aGUgdGltaW5nIHJlcXVpcmVtZW50cyBvZiB0aGUgY29udHJvbGxlci4gU2VlCisJICogX3NldF90aW1pbmdzLgorCSAqLworCXNvc3NpLmZja19oeiA9IGNsa19nZXRfcmF0ZShkcGxsMW91dF9jayk7CisJY2xrX3B1dChkcGxsMW91dF9jayk7CisKKwlmY2sgPSBjbGtfZ2V0KGZiZGV2LT5kZXYsICJja19zb3NzaSIpOworCWlmIChJU19FUlIoZmNrKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjYW4ndCBnZXQgU29TU0kgZnVuY3Rpb25hbCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGZjayk7CisJfQorCXNvc3NpLmZjayA9IGZjazsKKworCS8qIFJlc2V0IGFuZCBlbmFibGUgdGhlIFNvU1NJIG1vZHVsZSAqLworCWwgPSBvbWFwX3JlYWRsKE1PRF9DT05GX0NUUkxfMSk7CisJbCB8PSBDT05GX1NPU1NJX1JFU0VUX1I7CisJb21hcF93cml0ZWwobCwgTU9EX0NPTkZfQ1RSTF8xKTsKKwlsICY9IH5DT05GX1NPU1NJX1JFU0VUX1I7CisJb21hcF93cml0ZWwobCwgTU9EX0NPTkZfQ1RSTF8xKTsKKworCWNsa19lbmFibGUoc29zc2kuZmNrKTsKKwlsID0gb21hcF9yZWFkbChBUk1fSURMRUNUMik7CisJbCAmPSB+KDEgPDwgOCk7CQkJLyogRE1BQ0tfUkVRICovCisJb21hcF93cml0ZWwobCwgQVJNX0lETEVDVDIpOworCisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQyX1JFRyk7CisJLyogRW5hYmxlIGFuZCByZXNldCB0aGUgU29TU0kgYmxvY2sgKi8KKwlsIHw9ICgxIDw8IDApIHwgKDEgPDwgMSk7CisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQyX1JFRywgbCk7CisJLyogVGFrZSBTb1NTSSBvdXQgb2YgcmVzZXQgKi8KKwlsICY9IH4oMSA8PCAxKTsKKwlzb3NzaV93cml0ZV9yZWcoU09TU0lfSU5JVDJfUkVHLCBsKTsKKworCXNvc3NpX3dyaXRlX3JlZyhTT1NTSV9JRF9SRUcsIDApOworCWwgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOworCWsgPSBzb3NzaV9yZWFkX3JlZyhTT1NTSV9JRF9SRUcpOworCisJaWYgKGwgIT0gMHg1NTU1NTU1NSB8fCBrICE9IDB4YWFhYWFhYWEpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LAorCQkJImludmFsaWQgU29TU0kgc3luYyBwYXR0ZXJuOiAlMDh4LCAlMDh4XG4iLCBsLCBrKTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCWlmICgociA9IG9tYXBfbGNkY19zZXRfZG1hX2NhbGxiYWNrKHNvc3NpX2RtYV9jYWxsYmFjaywgTlVMTCkpIDwgMCkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJjYW4ndCBnZXQgTENEQyBJUlFcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lEX1JFRyk7IC8qIENvbXBvbmVudCBjb2RlICovCisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lEX1JFRyk7CisJZGV2X2luZm8oZmJkZXYtPmRldiwgIlNvU1NJIHZlcnNpb24gJWQuJWQgaW5pdGlhbGl6ZWRcbiIsCisJCWwgPj4gMTYsIGwgJiAweGZmZmYpOworCisJbCA9IHNvc3NpX3JlYWRfcmVnKFNPU1NJX0lOSVQxX1JFRyk7CisJbCB8PSAoMSA8PCAxOSk7IC8qIERNQV9NT0RFICovCisJbCAmPSB+KDEgPDwgMzEpOyAvKiBSRU9SREVSSU5HICovCisJc29zc2lfd3JpdGVfcmVnKFNPU1NJX0lOSVQxX1JFRywgbCk7CisKKwlpZiAoKHIgPSByZXF1ZXN0X2lycShJTlRfMTYxMF9Tb1NTSV9NQVRDSCwgc29zc2lfbWF0Y2hfaXJxLAorCQkJICAgICBJUlFUX0ZBTExJTkcsCisJICAgICAic29zc2lfbWF0Y2giLCBzb3NzaS5mYmRldi0+ZGV2KSkgPCAwKSB7CisJCWRldl9lcnIoc29zc2kuZmJkZXYtPmRldiwgImNhbid0IGdldCBTb1NTSSBtYXRjaCBJUlFcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwljbGtfZGlzYWJsZShzb3NzaS5mY2spOworCXJldHVybiAwOworCitlcnI6CisJY2xrX2Rpc2FibGUoc29zc2kuZmNrKTsKKwljbGtfcHV0KHNvc3NpLmZjayk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHNvc3NpX2NsZWFudXAodm9pZCkKK3sKKwlvbWFwX2xjZGNfZnJlZV9kbWFfY2FsbGJhY2soKTsKKwljbGtfcHV0KHNvc3NpLmZjayk7Cit9CisKK3N0cnVjdCBsY2RfY3RybF9leHRpZiBvbWFwMV9leHRfaWYgPSB7CisJLmluaXQJCQk9IHNvc3NpX2luaXQsCisJLmNsZWFudXAJCT0gc29zc2lfY2xlYW51cCwKKwkuZ2V0X2Nsa19pbmZvCQk9IHNvc3NpX2dldF9jbGtfaW5mbywKKwkuY29udmVydF90aW1pbmdzCT0gc29zc2lfY29udmVydF90aW1pbmdzLAorCS5zZXRfdGltaW5ncwkJPSBzb3NzaV9zZXRfdGltaW5ncywKKwkuc2V0X2JpdHNfcGVyX2N5Y2xlCT0gc29zc2lfc2V0X2JpdHNfcGVyX2N5Y2xlLAorCS5zZXR1cF90ZWFyc3luYwkJPSBzb3NzaV9zZXR1cF90ZWFyc3luYywKKwkuZW5hYmxlX3RlYXJzeW5jCT0gc29zc2lfZW5hYmxlX3RlYXJzeW5jLAorCS53cml0ZV9jb21tYW5kCQk9IHNvc3NpX3dyaXRlX2NvbW1hbmQsCisJLnJlYWRfZGF0YQkJPSBzb3NzaV9yZWFkX2RhdGEsCisJLndyaXRlX2RhdGEJCT0gc29zc2lfd3JpdGVfZGF0YSwKKwkudHJhbnNmZXJfYXJlYQkJPSBzb3NzaV90cmFuc2Zlcl9hcmVhLAorCisJLm1heF90cmFuc21pdF9zaXplCT0gU09TU0lfTUFYX1hNSVRfQllURVMsCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCmluZGV4IGU2NGY4YjUuLjg1MDNlNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcGxhdGludW1mYi5jCkBAIC01Miw3ICs1Miw3IEBACiAJc3RydWN0IHsKIAkJX191OCByZWQsIGdyZWVuLCBibHVlOwogCX0JCQkJcGFsZXR0ZVsyNTZdOwotCXUzMgkJCQlwc2V1ZG9fcGFsZXR0ZVsxN107CisJdTMyCQkJCXBzZXVkb19wYWxldHRlWzE2XTsKIAkKIAl2b2xhdGlsZSBzdHJ1Y3QgY21hcF9yZWdzCV9faW9tZW0gKmNtYXBfcmVnczsKIAl1bnNpZ25lZCBsb25nCQkJY21hcF9yZWdzX3BoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKaW5kZXggMGEwNDQ4My4uMTBjMGNjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0yZmIuYwpAQCAtMjQsNyArMjQsNyBAQAogICogTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KICAqCi0gKiAKKyAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTgsNyArNTgsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBEcml2ZXIgZGF0YSAKKyAqIERyaXZlciBkYXRhCiAgKi8KIHN0YXRpYyBjaGFyICptb2RlIF9fZGV2aW5pdGRhdGEgPSBOVUxMOwogCkBAIC04MiwxMiArODIsMTIgQEAKIHsKIAlwbTJ0eXBlX3QJdHlwZTsJCS8qIEJvYXJkIHR5cGUgKi8KIAl1bnNpZ25lZCBjaGFyCV9faW9tZW0gKnZfcmVnczsvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcF9yZWdzICovCi0JdTMyIAkgICAJbWVtY2xvY2s7CS8qIG1lbWNsb2NrICovCisJdTMyCQltZW1jbG9jazsJLyogbWVtY2xvY2sgKi8KIAl1MzIJCXZpZGVvOwkJLyogdmlkZW8gZmxhZ3MgYmVmb3JlIGJsYW5raW5nICovCiAJdTMyCQltZW1fY29uZmlnOwkvKiBNZW1Db25maWcgcmVnIGF0IHByb2JlICovCiAJdTMyCQltZW1fY29udHJvbDsJLyogTWVtQ29udHJvbCByZWcgYXQgcHJvYmUgKi8KIAl1MzIJCWJvb3RfYWRkcmVzczsJLyogQm9vdEFkZHJlc3MgcmVnIGF0IHByb2JlICovCi0JdTMyICAgICAgICAgICAgIHBhbGV0dGVbMTZdOworCXUzMgkJcGFsZXR0ZVsxNl07CiB9OwogCiAvKgpAQCAtOTUsMTIgKzk1LDEyIEBACiAgKiBpZiB3ZSBkb24ndCB1c2UgbW9kZWRiLgogICovCiBzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIHBtMmZiX2ZpeCBfX2RldmluaXRkYXRhID0gewotCS5pZCA9CQkiIiwgCisJLmlkID0JCSIiLAogCS50eXBlID0JCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKIAkudmlzdWFsID0JRkJfVklTVUFMX1BTRVVET0NPTE9SLAogCS54cGFuc3RlcCA9CTEsCiAJLnlwYW5zdGVwID0JMSwKLQkueXdyYXBzdGVwID0JMCwgCisJLnl3cmFwc3RlcCA9CTAsCiAJLmFjY2VsID0JRkJfQUNDRUxfM0RMQUJTX1BFUk1FRElBMiwKIH07CiAKQEAgLTEwOSwyNiArMTA5LDI2IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gcG0yZmJfdmFyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLyogIjY0MHg0ODAsIDggYnBwIEAgNjAgSHogKi8KLQkueHJlcyA9CQk2NDAsCi0JLnlyZXMgPQkJNDgwLAotCS54cmVzX3ZpcnR1YWwgPQk2NDAsCi0JLnlyZXNfdmlydHVhbCA9CTQ4MCwKLQkuYml0c19wZXJfcGl4ZWwgPTgsCi0JLnJlZCA9CQl7MCwgOCwgMH0sCi0JLmJsdWUgPQkJezAsIDgsIDB9LAotCS5ncmVlbiA9CXswLCA4LCAwfSwKLQkuYWN0aXZhdGUgPQlGQl9BQ1RJVkFURV9OT1csCi0JLmhlaWdodCA9CS0xLAotCS53aWR0aCA9CS0xLAotCS5hY2NlbF9mbGFncyA9CTAsCi0JLnBpeGNsb2NrID0JMzk3MjEsCi0JLmxlZnRfbWFyZ2luID0JNDAsCi0JLnJpZ2h0X21hcmdpbiA9CTI0LAotCS51cHBlcl9tYXJnaW4gPQkzMiwKLQkubG93ZXJfbWFyZ2luID0JMTEsCi0JLmhzeW5jX2xlbiA9CTk2LAotCS52c3luY19sZW4gPQkyLAotCS52bW9kZSA9CUZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKwkueHJlcyA9CQkJNjQwLAorCS55cmVzID0JCQk0ODAsCisJLnhyZXNfdmlydHVhbCA9CQk2NDAsCisJLnlyZXNfdmlydHVhbCA9CQk0ODAsCisJLmJpdHNfcGVyX3BpeGVsID0JOCwKKwkucmVkID0JCQl7MCwgOCwgMH0sCisJLmJsdWUgPQkJCXswLCA4LCAwfSwKKwkuZ3JlZW4gPQkJezAsIDgsIDB9LAorCS5hY3RpdmF0ZSA9CQlGQl9BQ1RJVkFURV9OT1csCisJLmhlaWdodCA9CQktMSwKKwkud2lkdGggPQkJLTEsCisJLmFjY2VsX2ZsYWdzID0JCTAsCisJLnBpeGNsb2NrID0JCTM5NzIxLAorCS5sZWZ0X21hcmdpbiA9CQk0MCwKKwkucmlnaHRfbWFyZ2luID0JCTI0LAorCS51cHBlcl9tYXJnaW4gPQkJMzIsCisJLmxvd2VyX21hcmdpbiA9CQkxMSwKKwkuaHN5bmNfbGVuID0JCTk2LAorCS52c3luY19sZW4gPQkJMiwKKwkudm1vZGUgPQkJRkJfVk1PREVfTk9OSU5URVJMQUNFRAogfTsKIAogLyoKQEAgLTE2Niw3ICsxNjYsNyBAQAogCQlwbTJfV1IocCwgUE0yVlJfUkRfSU5ERVhfTE9XLCBpZHggJiAweGZmKTsKIAkJaW5kZXggPSBQTTJWUl9SRF9JTkRFWEVEX0RBVEE7CiAJCWJyZWFrOwotCX0JCisJfQogCW1iKCk7CiAJcmV0dXJuIHBtMl9SRChwLCBpbmRleCk7CiB9CkBAIC0xODIsNyArMTgyLDcgQEAKIAkJcG0yX1dSKHAsIFBNMlZSX1JEX0lOREVYX0xPVywgaWR4ICYgMHhmZik7CiAJCWluZGV4ID0gUE0yVlJfUkRfSU5ERVhFRF9EQVRBOwogCQlicmVhazsKLQl9CQorCX0KIAl3bWIoKTsKIAlwbTJfV1IocCwgaW5kZXgsIHYpOwogCXdtYigpOwpAQCAtMTk3LDcgKzE5Nyw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfRkJfUE0yX0ZJRk9fRElTQ09OTkVDVAotI2RlZmluZSBXQUlUX0ZJRk8ocCxhKQorI2RlZmluZSBXQUlUX0ZJRk8ocCwgYSkKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgV0FJVF9GSUZPKHN0cnVjdCBwbTJmYl9wYXIqIHAsIHUzMiBhKQogewpAQCAtMjA5LDcgKzIwOSw3IEBACiAvKgogICogcGFydGlhbCBwcm9kdWN0cyBmb3IgdGhlIHN1cHBvcnRlZCBob3Jpem9udGFsIHJlc29sdXRpb25zLgogICovCi0jZGVmaW5lIFBBQ0tQUChwMCxwMSxwMikJKCgocDIpIDw8IDYpIHwgKChwMSkgPDwgMykgfCAocDApKQorI2RlZmluZSBQQUNLUFAocDAsIHAxLCBwMikJKCgocDIpIDw8IDYpIHwgKChwMSkgPDwgMykgfCAocDApKQogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJdTE2IHdpZHRoOwogCXUxNiBwcDsKQEAgLTM1Nyw3ICszNTcsNyBAQAogc3RhdGljIHZvaWQgcmVzZXRfY29uZmlnKHN0cnVjdCBwbTJmYl9wYXIqIHApCiB7CiAJV0FJVF9GSUZPKHAsIDUyKTsKLQlwbTJfV1IocCwgUE0yUl9DSElQX0NPTkZJRywgcG0yX1JEKHAsIFBNMlJfQ0hJUF9DT05GSUcpJgorCXBtMl9XUihwLCBQTTJSX0NISVBfQ09ORklHLCBwbTJfUkQocCwgUE0yUl9DSElQX0NPTkZJRykgJgogCSAgICAgICB+KFBNMkZfVkdBX0VOQUJMRXxQTTJGX1ZHQV9GSVhFRCkpOwogCXBtMl9XUihwLCBQTTJSX0JZUEFTU19XUklURV9NQVNLLCB+KDBMKSk7CiAJcG0yX1dSKHAsIFBNMlJfRlJBTUVCVUZGRVJfV1JJVEVfTUFTSywgfigwTCkpOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJcG0yX1dSKHAsIFBNMlJfUkFTVEVSSVpFUl9NT0RFLCAwKTsKIAlwbTJfV1IocCwgUE0yUl9ERUxUQV9NT0RFLCBQTTJGX0RFTFRBX09SREVSX1JHQik7CiAJcG0yX1dSKHAsIFBNMlJfTEJfUkVBRF9GT1JNQVQsIDApOwotCXBtMl9XUihwLCBQTTJSX0xCX1dSSVRFX0ZPUk1BVCwgMCk7IAorCXBtMl9XUihwLCBQTTJSX0xCX1dSSVRFX0ZPUk1BVCwgMCk7CiAJcG0yX1dSKHAsIFBNMlJfTEJfUkVBRF9NT0RFLCAwKTsKIAlwbTJfV1IocCwgUE0yUl9MQl9TT1VSQ0VfT0ZGU0VULCAwKTsKIAlwbTJfV1IocCwgUE0yUl9GQl9TT1VSQ0VfT0ZGU0VULCAwKTsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCXZzeW5jID0gdmlkZW87CiAKIAlEUFJJTlRLKCJ2aWRlbyA9IDB4JXhcbiIsIHZpZGVvKTsKLQkKKwogCS8qCiAJICogVGhlIGhhcmR3YXJlIGN1cnNvciBuZWVkcyArdnN5bmMgdG8gcmVjb2duaXNlIHZlcnQgcmV0cmFjZS4KIAkgKiBXZSBtYXkgbm90IGJlIHVzaW5nIHRoZSBoYXJkd2FyZSBjdXJzb3IsIGJ1dCB0aGUgWCBHbGludApAQCAtNTc0LDkgKzU3NCw5IEBACiAgKi8KIAogLyoqCi0gKiAgICAgIHBtMmZiX2NoZWNrX3ZhciAtIE9wdGlvbmFsIGZ1bmN0aW9uLiBWYWxpZGF0ZXMgYSB2YXIgcGFzc2VkIGluLiAKLSAqICAgICAgQHZhcjogZnJhbWUgYnVmZmVyIHZhcmlhYmxlIHNjcmVlbiBzdHJ1Y3R1cmUKLSAqICAgICAgQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlciAKKyAqCXBtMmZiX2NoZWNrX3ZhciAtIE9wdGlvbmFsIGZ1bmN0aW9uLiBWYWxpZGF0ZXMgYSB2YXIgcGFzc2VkIGluLgorICoJQHZhcjogZnJhbWUgYnVmZmVyIHZhcmlhYmxlIHNjcmVlbiBzdHJ1Y3R1cmUKKyAqCUBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKICAqCiAgKglDaGVja3MgdG8gc2VlIGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyB0aGUgc3RhdGUgcmVxdWVzdGVkIGJ5CiAgKgl2YXIgcGFzc2VkIGluLgpAQCAtNjE1LDIzICs2MTUsMjMgQEAKIAogCXZhci0+eHJlcyA9ICh2YXItPnhyZXMgKyAxNSkgJiB+MTU7IC8qIGNvdWxkIHNvbWV0aW1lcyBiZSA4ICovCiAJbHBpdGNoID0gdmFyLT54cmVzICogKCh2YXItPmJpdHNfcGVyX3BpeGVsICsgNyk+PjMpOwotICAKKwogCWlmICh2YXItPnhyZXMgPCAzMjAgfHwgdmFyLT54cmVzID4gMTYwMCkgewogCQlEUFJJTlRLKCJ3aWR0aCBub3Qgc3VwcG9ydGVkOiAldVxuIiwgdmFyLT54cmVzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotICAKKwogCWlmICh2YXItPnlyZXMgPCAyMDAgfHwgdmFyLT55cmVzID4gMTIwMCkgewogCQlEUFJJTlRLKCJoZWlnaHQgbm90IHN1cHBvcnRlZDogJXVcbiIsIHZhci0+eXJlcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLSAgCisKIAlpZiAobHBpdGNoICogdmFyLT55cmVzX3ZpcnR1YWwgPiBpbmZvLT5maXguc21lbV9sZW4pIHsKIAkJRFBSSU5USygibm8gbWVtb3J5IGZvciBzY3JlZW4gKCV1eCV1eCV1KVxuIiwKIAkJCXZhci0+eHJlcywgdmFyLT55cmVzX3ZpcnR1YWwsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0gIAorCiAJaWYgKFBJQ09TMktIWih2YXItPnBpeGNsb2NrKSA+IFBNMl9NQVhfUElYQ0xPQ0spIHsKIAkJRFBSSU5USygicGl4Y2xvY2sgdG9vIGhpZ2ggKCVsZEtIeilcbiIsIFBJQ09TMktIWih2YXItPnBpeGNsb2NrKSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjcyLDE3ICs2NzIsMTcgQEAKIAkJYnJlYWs7CiAJfQogCXZhci0+aGVpZ2h0ID0gdmFyLT53aWR0aCA9IC0xOwotICAKKwogCXZhci0+YWNjZWxfZmxhZ3MgPSAwOwkvKiBDYW4ndCBtbWFwIGlmIHRoaXMgaXMgb24gKi8KLQkKKwogCURQUklOVEsoIkNoZWNraW5nIGdyYXBoaWNzIG1vZGUgYXQgJWR4JWQgZGVwdGggJWRcbiIsCiAJCXZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiAgICAgIHBtMmZiX3NldF9wYXIgLSBBbHRlcnMgdGhlIGhhcmR3YXJlIHN0YXRlLgotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKglwbTJmYl9zZXRfcGFyIC0gQWx0ZXJzIHRoZSBoYXJkd2FyZSBzdGF0ZS4KKyAqCUBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKICAqCiAgKglVc2luZyB0aGUgZmJfdmFyX3NjcmVlbmluZm8gaW4gZmJfaW5mbyB3ZSBzZXQgdGhlIHJlc29sdXRpb24gb2YgdGhlCiAgKgl0aGlzIHBhcnRpY3VsYXIgZnJhbWVidWZmZXIuCkBAIC03MDksNyArNzA5LDcgQEAKIAljbGVhcl9wYWxldHRlKHBhcik7CiAJaWYgKCBwYXItPm1lbWNsb2NrICkKIAkJc2V0X21lbWNsb2NrKHBhciwgcGFyLT5tZW1jbG9jayk7Ci0gICAgCisKIAl3aWR0aCA9IChpbmZvLT52YXIueHJlc192aXJ0dWFsICsgNykgJiB+NzsKIAloZWlnaHQgPSBpbmZvLT52YXIueXJlc192aXJ0dWFsOwogCWRlcHRoID0gKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCArIDcpICYgfjc7CkBAIC03MjIsNyArNzIyLDcgQEAKIAkJRFBSSU5USygicGl4Y2xvY2sgdG9vIGhpZ2ggKCV1S0h6KVxuIiwgcGl4Y2xvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0gICAgCisKIAloc3N0YXJ0ID0gdG8zMjY0KGluZm8tPnZhci5yaWdodF9tYXJnaW4sIGRlcHRoLCBkYXRhNjQpOwogCWhzZW5kID0gaHNzdGFydCArIHRvMzI2NChpbmZvLT52YXIuaHN5bmNfbGVuLCBkZXB0aCwgZGF0YTY0KTsKIAloYmVuZCA9IGhzZW5kICsgdG8zMjY0KGluZm8tPnZhci5sZWZ0X21hcmdpbiwgZGVwdGgsIGRhdGE2NCk7CkBAIC03MzcsNyArNzM3LDcgQEAKIAliYXNlID0gdG8zMjY0KGluZm8tPnZhci55b2Zmc2V0ICogeHJlcyArIGluZm8tPnZhci54b2Zmc2V0LCBkZXB0aCwgMSk7CiAJaWYgKGRhdGE2NCkKIAkJdmlkZW8gfD0gUE0yRl9EQVRBXzY0X0VOQUJMRTsKLSAgICAKKwogCWlmIChpbmZvLT52YXIuc3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSB7CiAJCWlmIChsb3doc3luYykgewogCQkJRFBSSU5USygiaWdub3JpbmcgK2hzeW5jLCB1c2luZyAtaHN5bmMuXG4iKTsKQEAgLTc3OCw5ICs3NzgsOSBAQAogCQlXQUlUX0ZJRk8ocGFyLCAxKTsKIAkJcG0yX1dSKHBhciwgUE0yVlJfUkRfSU5ERVhfSElHSCwgMCk7CiAJfQotICAgIAorCiAJc2V0X2FwZXJ0dXJlKHBhciwgZGVwdGgpOwotICAgIAorCiAJbWIoKTsKIAlXQUlUX0ZJRk8ocGFyLCAxOSk7CiAJcG0yX1JEQUNfV1IocGFyLCBQTTJJX1JEX0NPTE9SX0tFWV9DT05UUk9MLApAQCAtODQ3LDIyICs4NDcsMjIgQEAKIAlzZXRfcGl4Y2xvY2socGFyLCBwaXhjbG9jayk7CiAJRFBSSU5USygiU2V0dGluZyBncmFwaGljcyBtb2RlIGF0ICVkeCVkIGRlcHRoICVkXG4iLAogCQlpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsIGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7Ci0JcmV0dXJuIDA7CQorCXJldHVybiAwOwogfQogCiAvKioKLSAqICAJcG0yZmJfc2V0Y29scmVnIC0gU2V0cyBhIGNvbG9yIHJlZ2lzdGVyLgotICogICAgICBAcmVnbm86IGJvb2xlYW4sIDAgY29weSBsb2NhbCwgMSBnZXRfdXNlcigpIGZ1bmN0aW9uCi0gKiAgICAgIEByZWQ6IGZyYW1lIGJ1ZmZlciBjb2xvcm1hcCBzdHJ1Y3R1cmUKLSAqCUBncmVlbjogVGhlIGdyZWVuIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUgCisgKglwbTJmYl9zZXRjb2xyZWcgLSBTZXRzIGEgY29sb3IgcmVnaXN0ZXIuCisgKglAcmVnbm86IGJvb2xlYW4sIDAgY29weSBsb2NhbCwgMSBnZXRfdXNlcigpIGZ1bmN0aW9uCisgKglAcmVkOiBmcmFtZSBidWZmZXIgY29sb3JtYXAgc3RydWN0dXJlCisgKglAZ3JlZW46IFRoZSBncmVlbiB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlCiAgKglAYmx1ZTogIFRoZSBibHVlIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUuCi0gKglAdHJhbnNwOiBJZiBzdXBwb3J0ZWQgdGhlIGFscGhhIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUuCQotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCi0gKiAKLSAqICAJU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGhhdmUgYSAxNiBiaXQKLSAqICAJbWFnbml0dWRlIHdoaWNoIG5lZWRzIHRvIGJlIHNjYWxlZCBpbiB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgaGFyZHdhcmUuCisgKglAdHJhbnNwOiBJZiBzdXBwb3J0ZWQgdGhlIGFscGhhIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUuCisgKglAaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCisgKgorICoJU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGhhdmUgYSAxNiBiaXQKKyAqCW1hZ25pdHVkZSB3aGljaCBuZWVkcyB0byBiZSBzY2FsZWQgaW4gdGhpcyBmdW5jdGlvbiBmb3IgdGhlIGhhcmR3YXJlLgogICoJUHJldHR5IG11Y2ggYSBkaXJlY3QgbGlmdCBmcm9tIHRkZnhmYi5jLgotICogCisgKgogICoJUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvciwgb3IgemVybyBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50IHBtMmZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKQEAgLTkwNiw3ICs5MDYsNyBAQAogCSAqICAgIChibHVlIDw8IGJsdWUub2Zmc2V0KSB8ICh0cmFuc3AgPDwgdHJhbnNwLm9mZnNldCkKIAkgKiAgICBSQU1EQUMgZG9lcyBub3QgZXhpc3QKIAkgKi8KLSNkZWZpbmUgQ05WVF9UT0hXKHZhbCx3aWR0aCkgKCgoKHZhbCk8PCh3aWR0aCkpKzB4N0ZGRi0odmFsKSk+PjE2KQorI2RlZmluZSBDTlZUX1RPSFcodmFsLCB3aWR0aCkgKCgoKHZhbCkgPDwgKHdpZHRoKSkgKyAweDdGRkYgLSh2YWwpKSA+PiAxNikKIAlzd2l0Y2ggKGluZm8tPmZpeC52aXN1YWwpIHsKIAljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6CiAJY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6CkBAIC05MTYsOSArOTE2LDkgQEAKIAkJdHJhbnNwID0gQ05WVF9UT0hXKHRyYW5zcCwgaW5mby0+dmFyLnRyYW5zcC5sZW5ndGgpOwogCQlicmVhazsKIAljYXNlIEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjoKLQkJLyogZXhhbXBsZSBoZXJlIGFzc3VtZXMgOCBiaXQgREFDLiBNaWdodCBiZSBkaWZmZXJlbnQgCi0JCSAqIGZvciB5b3VyIGhhcmR3YXJlICovCQotCQlyZWQgPSBDTlZUX1RPSFcocmVkLCA4KTsgICAgICAgCisJCS8qIGV4YW1wbGUgaGVyZSBhc3N1bWVzIDggYml0IERBQy4gTWlnaHQgYmUgZGlmZmVyZW50CisJCSAqIGZvciB5b3VyIGhhcmR3YXJlICovCisJCXJlZCA9IENOVlRfVE9IVyhyZWQsIDgpOwogCQlncmVlbiA9IENOVlRfVE9IVyhncmVlbiwgOCk7CiAJCWJsdWUgPSBDTlZUX1RPSFcoYmx1ZSwgOCk7CiAJCS8qIGhleSwgdGhlcmUgaXMgYnVnIGluIHRyYW5zcCBoYW5kbGluZy4uLiAqLwpAQCAtOTQwLDExICs5NDAsMTEgQEAKIAogCQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgewogCQljYXNlIDg6Ci0JCQlicmVhazsJCi0gICAJCWNhc2UgMTY6CisJCQlicmVhazsKKwkJY2FzZSAxNjoKIAkJY2FzZSAyNDoKLQkJY2FzZSAzMjoJCi0gICAgICAgICAgIAkJcGFyLT5wYWxldHRlW3JlZ25vXSA9IHY7CisJCWNhc2UgMzI6CisJCQlwYXItPnBhbGV0dGVbcmVnbm9dID0gdjsKIAkJCWJyZWFrOwogCQl9CiAJCXJldHVybiAwOwpAQCAtOTU2LDE1ICs5NTYsMTUgQEAKIH0KIAogLyoqCi0gKiAgICAgIHBtMmZiX3Bhbl9kaXNwbGF5IC0gUGFucyB0aGUgZGlzcGxheS4KLSAqICAgICAgQHZhcjogZnJhbWUgYnVmZmVyIHZhcmlhYmxlIHNjcmVlbiBzdHJ1Y3R1cmUKLSAqICAgICAgQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgorICoJcG0yZmJfcGFuX2Rpc3BsYXkgLSBQYW5zIHRoZSBkaXNwbGF5LgorICoJQHZhcjogZnJhbWUgYnVmZmVyIHZhcmlhYmxlIHNjcmVlbiBzdHJ1Y3R1cmUKKyAqCUBpbmZvOiBmcmFtZSBidWZmZXIgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSBmcmFtZSBidWZmZXIKICAqCiAgKglQYW4gKG9yIHdyYXAsIGRlcGVuZGluZyBvbiB0aGUgYHZtb2RlJyBmaWVsZCkgdGhlIGRpc3BsYXkgdXNpbmcgdGhlCi0gKiAgCWB4b2Zmc2V0JyBhbmQgYHlvZmZzZXQnIGZpZWxkcyBvZiB0aGUgYHZhcicgc3RydWN0dXJlLgotICogIAlJZiB0aGUgdmFsdWVzIGRvbid0IGZpdCwgcmV0dXJuIC1FSU5WQUwuCisgKglgeG9mZnNldCcgYW5kIGB5b2Zmc2V0JyBmaWVsZHMgb2YgdGhlIGB2YXInIHN0cnVjdHVyZS4KKyAqCUlmIHRoZSB2YWx1ZXMgZG9uJ3QgZml0LCByZXR1cm4gLUVJTlZBTC4KICAqCi0gKiAgICAgIFJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KICAqCiAgKi8KIHN0YXRpYyBpbnQgcG0yZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCkBAIC05ODAsMjQgKzk4MCwyNCBAQAogCWRlcHRoID0gKGRlcHRoID4gMzIpID8gMzIgOiBkZXB0aDsKIAliYXNlID0gdG8zMjY0KHZhci0+eW9mZnNldCAqIHhyZXMgKyB2YXItPnhvZmZzZXQsIGRlcHRoLCAxKTsKIAlXQUlUX0ZJRk8ocCwgMSk7Ci0JcG0yX1dSKHAsIFBNMlJfU0NSRUVOX0JBU0UsIGJhc2UpOyAgICAKKwlwbTJfV1IocCwgUE0yUl9TQ1JFRU5fQkFTRSwgYmFzZSk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogICAgICBwbTJmYl9ibGFuayAtIEJsYW5rcyB0aGUgZGlzcGxheS4KLSAqICAgICAgQGJsYW5rX21vZGU6IHRoZSBibGFuayBtb2RlIHdlIHdhbnQuIAotICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKglwbTJmYl9ibGFuayAtIEJsYW5rcyB0aGUgZGlzcGxheS4KKyAqCUBibGFua19tb2RlOiB0aGUgYmxhbmsgbW9kZSB3ZSB3YW50LgorICoJQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgogICoKLSAqICAgICAgQmxhbmsgdGhlIHNjcmVlbiBpZiBibGFua19tb2RlICE9IDAsIGVsc2UgdW5ibGFuay4gUmV0dXJuIDAgaWYKLSAqICAgICAgYmxhbmtpbmcgc3VjY2VlZGVkLCAhPSAwIGlmIHVuLS9ibGFua2luZyBmYWlsZWQgZHVlIHRvIGUuZy4gYSAKLSAqICAgICAgdmlkZW8gbW9kZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgaXQuIEltcGxlbWVudHMgVkVTQSBzdXNwZW5kCi0gKiAgICAgIGFuZCBwb3dlcmRvd24gbW9kZXMgb24gaGFyZHdhcmUgdGhhdCBzdXBwb3J0cyBkaXNhYmxpbmcgaHN5bmMvdnN5bmM6Ci0gKiAgICAgIGJsYW5rX21vZGUgPT0gMjogc3VzcGVuZCB2c3luYwotICogICAgICBibGFua19tb2RlID09IDM6IHN1c3BlbmQgaHN5bmMKLSAqICAgICAgYmxhbmtfbW9kZSA9PSA0OiBwb3dlcmRvd24KKyAqCUJsYW5rIHRoZSBzY3JlZW4gaWYgYmxhbmtfbW9kZSAhPSAwLCBlbHNlIHVuYmxhbmsuIFJldHVybiAwIGlmCisgKglibGFua2luZyBzdWNjZWVkZWQsICE9IDAgaWYgdW4tL2JsYW5raW5nIGZhaWxlZCBkdWUgdG8gZS5nLiBhCisgKgl2aWRlbyBtb2RlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBpdC4gSW1wbGVtZW50cyBWRVNBIHN1c3BlbmQKKyAqCWFuZCBwb3dlcmRvd24gbW9kZXMgb24gaGFyZHdhcmUgdGhhdCBzdXBwb3J0cyBkaXNhYmxpbmcgaHN5bmMvdnN5bmM6CisgKglibGFua19tb2RlID09IDI6IHN1c3BlbmQgdnN5bmMKKyAqCWJsYW5rX21vZGUgPT0gMzogc3VzcGVuZCBoc3luYworICoJYmxhbmtfbW9kZSA9PSA0OiBwb3dlcmRvd24KICAqCi0gKiAgICAgIFJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4KICAqCiAgKi8KIHN0YXRpYyBpbnQgcG0yZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQpAQCAtMTA3MSw3ICsxMDcxLDcgQEAKIAlwbTJfV1IocGFyLCBQTTJSX1JFQ1RBTkdMRV9PUklHSU4sICh5IDw8IDE2KSB8IHgpOwogCXBtMl9XUihwYXIsIFBNMlJfUkVDVEFOR0xFX1NJWkUsIChoIDw8IDE2KSB8IHcpOwogCXdtYigpOwotCXBtMl9XUihwYXIsIFBNMlJfUkVOREVSLFBNMkZfUkVOREVSX1JFQ1RBTkdMRSB8CisJcG0yX1dSKHBhciwgUE0yUl9SRU5ERVIsIFBNMkZfUkVOREVSX1JFQ1RBTkdMRSB8CiAJCQkJKHg8eHNyYyA/IFBNMkZfSU5DUkVBU0VfWCA6IDApIHwKIAkJCQkoeTx5c3JjID8gUE0yRl9JTkNSRUFTRV9ZIDogMCkgfAogCQkJCShjb3B5ID8gMCA6IFBNMkZfUkVOREVSX0ZBU1RGSUxMKSk7CkBAIC0xMjM0LDcgKzEyMzQsNyBAQAogCURQUklOVEsoIkFkanVzdGluZyByZWdpc3RlciBiYXNlIGZvciBiaWctZW5kaWFuLlxuIik7CiAjZW5kaWYKIAlEUFJJTlRLKCJSZWdpc3RlciBiYXNlIGF0IDB4JWx4XG4iLCBwbTJmYl9maXgubW1pb19zdGFydCk7Ci0gICAgCisKIAkvKiBSZWdpc3RlcnMgLSByZXF1ZXN0IHJlZ2lvbiBhbmQgbWFwIGl0LiAqLwogCWlmICggIXJlcXVlc3RfbWVtX3JlZ2lvbihwbTJmYl9maXgubW1pb19zdGFydCwgcG0yZmJfZml4Lm1taW9fbGVuLAogCQkJCSAicG0yZmIgcmVnYmFzZSIpICkgewpAQCAtMTMxNywxNyArMTMxNywxNyBAQAogCX0KIAogCWluZm8tPmZib3BzCQk9ICZwbTJmYl9vcHM7Ci0JaW5mby0+Zml4CQk9IHBtMmZiX2ZpeDsgCQorCWluZm8tPmZpeAkJPSBwbTJmYl9maXg7CiAJaW5mby0+cHNldWRvX3BhbGV0dGUJPSBkZWZhdWx0X3Bhci0+cGFsZXR0ZTsKIAlpbmZvLT5mbGFncwkJPSBGQklORk9fREVGQVVMVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJJTkZPX0hXQUNDRUxfWVBBTiB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVDsKKwkJCQkgIEZCSU5GT19IV0FDQ0VMX1lQQU4gfAorCQkJCSAgRkJJTkZPX0hXQUNDRUxfQ09QWUFSRUEgfAorCQkJCSAgRkJJTkZPX0hXQUNDRUxfRklMTFJFQ1Q7CiAKIAlpZiAoIW1vZGUpCiAJCW1vZGUgPSAiNjQweDQ4MEA2MCI7Ci0JIAotCWVyciA9IGZiX2ZpbmRfbW9kZSgmaW5mby0+dmFyLCBpbmZvLCBtb2RlLCBOVUxMLCAwLCBOVUxMLCA4KTsgCisKKwllcnIgPSBmYl9maW5kX21vZGUoJmluZm8tPnZhciwgaW5mbywgbW9kZSwgTlVMTCwgMCwgTlVMTCwgOCk7CiAJaWYgKCFlcnIgfHwgZXJyID09IDQpCiAJCWluZm8tPnZhciA9IHBtMmZiX3ZhcjsKIApAQCAtMTM0OCw4ICsxMzQ4LDggQEAKIAlyZXR1cm4gMDsKIAogIGVycl9leGl0X2FsbDoKLQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwkKLSBlcnJfZXhpdF9ib3RoOiAgICAKKwlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworIGVycl9leGl0X2JvdGg6CiAJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHBtMmZiX2ZpeC5zbWVtX3N0YXJ0LCBwbTJmYl9maXguc21lbV9sZW4pOwogIGVycl9leGl0X21taW86CkBAIC0xMzc0LDcgKzEzNzQsNyBAQAogCXN0cnVjdCBwbTJmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7Ci0gICAgCisKIAlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKIAlyZWxlYXNlX21lbV9yZWdpb24oZml4LT5zbWVtX3N0YXJ0LCBmaXgtPnNtZW1fbGVuKTsKIAlpb3VubWFwKHBhci0+dl9yZWdzKTsKQEAgLTE0MDIsOSArMTQwMiw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwbTJmYl9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gInBtMmZiIiwKLQkuaWRfdGFibGUgCT0gcG0yZmJfaWRfdGFibGUsCi0JLnByb2JlIAkJPSBwbTJmYl9wcm9iZSwKLQkucmVtb3ZlIAk9IF9fZGV2ZXhpdF9wKHBtMmZiX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gcG0yZmJfaWRfdGFibGUsCisJLnByb2JlCQk9IHBtMmZiX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocG0yZmJfcmVtb3ZlKSwKIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwbTJmYl9pZF90YWJsZSk7CkBAIC0xNDIzLDcgKzE0MjMsNyBAQAogCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCiAJCXJldHVybiAwOwogCi0Jd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewkKKwl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CiAJCWlmICghKnRoaXNfb3B0KQogCQkJY29udGludWU7CiAJCWlmKCFzdHJjbXAodGhpc19vcHQsICJsb3doc3luYyIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKaW5kZXggYjUyZTg4My4uNWIzZjU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9wbTNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcG0zZmIuYwpAQCAtNzcsNyArNzcsNyBAQAogCS54cGFuc3RlcCA9CTEsCiAJLnlwYW5zdGVwID0JMSwKIAkueXdyYXBzdGVwID0JMCwKLQkuYWNjZWwgPQlGQl9BQ0NFTF9OT05FLAorCS5hY2NlbCA9CUZCX0FDQ0VMXzNETEFCU19QRVJNRURJQTMsCiB9OwogCiAvKgpAQCAtMTg1LDYgKzE4NSwyMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogYWNjZWxlcmF0aW9uICovCitzdGF0aWMgaW50IHBtM2ZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCVBNM19XQUlUKHBhciwgMik7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZpbHRlck1vZGUsIFBNM0ZpbHRlck1vZGVTeW5jKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3luYywgMCk7CisJbWIoKTsKKwlkbyB7CisJCXdoaWxlICgoUE0zX1JFQURfUkVHKHBhciwgUE0zT3V0RklGT1dvcmRzKSkgPT0gMCk7CisJCXJtYigpOworCX0gd2hpbGUgKChQTTNfUkVBRF9SRUcocGFyLCBQTTNPdXRwdXRGaWZvKSkgIT0gUE0zU3luY19UYWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBtM2ZiX2luaXRfZW5naW5lKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBwbTNfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJY29uc3QgdTMyIHdpZHRoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKyA3KSAmIH43OworCisJUE0zX1dBSVQocGFyLCA1MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZpbHRlck1vZGUsIFBNM0ZpbHRlck1vZGVTeW5jKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RhdGlzdGljTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGVsdGFNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNSYXN0ZXJpemVyTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU2Npc3Nvck1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xpbmVTdGlwcGxlTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQXJlYVN0aXBwbGVNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNHSURNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNEZXB0aE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0ZW5jaWxNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGVuY2lsRGF0YSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQ29sb3JEREFNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29vcmRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlSW5kZXhNb2RlMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUluZGV4TW9kZTEsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVSZWFkTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTFVUTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUZpbHRlck1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQXBwbGljYXRpb25Nb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29tcG9zaXRlQ29sb3JNb2RlMSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zVGV4dHVyZUNvbXBvc2l0ZUFscGhhTW9kZTEsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1RleHR1cmVDb21wb3NpdGVDb2xvck1vZGUwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNUZXh0dXJlQ29tcG9zaXRlQWxwaGFNb2RlMCwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRm9nTW9kZSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQ2hyb21hVGVzdE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0FscGhhVGVzdE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0FudGlhbGlhc01vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1lVVk1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0FscGhhQmxlbmRDb2xvck1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0FscGhhQmxlbmRBbHBoYU1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RpdGhlck1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xvZ2ljYWxPcE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1JvdXRlck1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1dpbmRvdywgMHgwKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNDb25maWcyRCwgMHgwKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNTcGFuQ29sb3JNYXNrLCAweGZmZmZmZmZmKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNYQmlhcywgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zWUJpYXMsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0RlbHRhQ29udHJvbCwgMHgwKTsKKworCVBNM19XUklURV9SRUcocGFyLCBQTTNCaXRNYXNrUGF0dGVybiwgMHhmZmZmZmZmZik7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJEZXN0UmVhZEVuYWJsZXMsCisJCQkgICBQTTNGQkRlc3RSZWFkRW5hYmxlc19FKDB4ZmYpIHwKKwkJCSAgIFBNM0ZCRGVzdFJlYWRFbmFibGVzX1IoMHhmZikgfAorCQkJICAgUE0zRkJEZXN0UmVhZEVuYWJsZXNfUmVmZXJlbmNlQWxwaGEoMHhmZikpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkQnVmZmVyQWRkcjAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCRGVzdFJlYWRCdWZmZXJPZmZzZXQwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkRlc3RSZWFkQnVmZmVyV2lkdGgwLAorCQkJICAgUE0zRkJEZXN0UmVhZEJ1ZmZlcldpZHRoX1dpZHRoKHdpZHRoKSk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJEZXN0UmVhZE1vZGUsCisJCQkgICBQTTNGQkRlc3RSZWFkTW9kZV9SZWFkRW5hYmxlIHwKKwkJCSAgIFBNM0ZCRGVzdFJlYWRNb2RlX0VuYWJsZTApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQlNvdXJjZVJlYWRCdWZmZXJBZGRyLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQlNvdXJjZVJlYWRCdWZmZXJPZmZzZXQsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU291cmNlUmVhZEJ1ZmZlcldpZHRoLAorCQkJICAgUE0zRkJTb3VyY2VSZWFkQnVmZmVyV2lkdGhfV2lkdGgod2lkdGgpKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJTb3VyY2VSZWFkTW9kZSwKKwkJCSAgIFBNM0ZCU291cmNlUmVhZE1vZGVfQmxvY2tpbmcgfAorCQkJICAgUE0zRkJTb3VyY2VSZWFkTW9kZV9SZWFkRW5hYmxlKTsKKworCVBNM19XQUlUKHBhciwgMik7CisJeworCQl1bnNpZ25lZCBsb25nIHJtID0gMTsKKwkJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwkJY2FzZSA4OgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1BpeGVsU2l6ZSwKKwkJCQkJICAgUE0zUGl4ZWxTaXplX0dMT0JBTF84QklUKTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1BpeGVsU2l6ZSwKKwkJCQkJICAgUE0zUGl4ZWxTaXplX0dMT0JBTF8xNkJJVCk7CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCVBNM19XUklURV9SRUcocGFyLCBQTTNQaXhlbFNpemUsCisJCQkJCSAgIFBNM1BpeGVsU2l6ZV9HTE9CQUxfMzJCSVQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKDEsICJVbnN1cHBvcnRlZCBkZXB0aCAlZFxuIiwKKwkJCQlpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOworCQkJYnJlYWs7CisJCX0KKwkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1Jhc3Rlcml6ZXJNb2RlLCBybSk7CisJfQorCisJUE0zX1dBSVQocGFyLCAyMCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCU29mdHdhcmVXcml0ZU1hc2ssIDB4ZmZmZmZmZmYpOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQkhhcmR3YXJlV3JpdGVNYXNrLCAweGZmZmZmZmZmKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRkJXcml0ZU1vZGUsCisJCQkgICBQTTNGQldyaXRlTW9kZV9Xcml0ZUVuYWJsZSB8CisJCQkgICBQTTNGQldyaXRlTW9kZV9PcGFxdWVTcGFuIHwKKwkJCSAgIFBNM0ZCV3JpdGVNb2RlX0VuYWJsZTApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQldyaXRlQnVmZmVyQWRkcjAsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0ZCV3JpdGVCdWZmZXJPZmZzZXQwLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNGQldyaXRlQnVmZmVyV2lkdGgwLAorCQkJICAgUE0zRkJXcml0ZUJ1ZmZlcldpZHRoX1dpZHRoKHdpZHRoKSk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU2l6ZU9mRnJhbWVidWZmZXIsIDB4MCk7CisJeworCQkvKiBzaXplIGluIGxpbmVzIG9mIEZCICovCisJCXVuc2lnbmVkIGxvbmcgc29mYiA9IGluZm8tPnNjcmVlbl9zaXplIC8KKwkJCWluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwkJaWYgKHNvZmIgPiA0MDk1KQorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1NpemVPZkZyYW1lYnVmZmVyLCA0MDk1KTsKKwkJZWxzZQorCQkJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1NpemVPZkZyYW1lYnVmZmVyLCBzb2ZiKTsKKworCQlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDg6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGl0aGVyTW9kZSwKKwkJCQkJICAgKDEgPDwgMTApIHwgKDIgPDwgMykpOworCQkJYnJlYWs7CisJCWNhc2UgMTY6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGl0aGVyTW9kZSwKKwkJCQkJICAgKDEgPDwgMTApIHwgKDEgPDwgMykpOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRGl0aGVyTW9kZSwKKwkJCQkJICAgKDEgPDwgMTApIHwgKDAgPDwgMykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKDEsICJVbnN1cHBvcnRlZCBkZXB0aCAlZFxuIiwKKwkJCQlpbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zZFhEb20sIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM2RYU3ViLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNkWSwgKDEgPDwgMTYpKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zU3RhcnRYRG9tLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNTdGFydFhTdWIsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1N0YXJ0WSwgMHgwKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQ291bnQsIDB4MCk7CisKKy8qIERpc2FibGUgTG9jYWxCdWZmZXIuIGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zTEJEZXN0UmVhZE1vZGUsIDB4MCk7CisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM0xCRGVzdFJlYWRFbmFibGVzLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMQlNvdXJjZVJlYWRNb2RlLCAweDApOworCVBNM19XUklURV9SRUcocGFyLCBQTTNMQldyaXRlTW9kZSwgMHgwKTsKKworCXBtM2ZiX3N5bmMoaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHBtM2ZiX2ZpbGxyZWN0IChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlZ2lvbikKK3sKKwlzdHJ1Y3QgcG0zX3BhciAqcGFyID0gaW5mby0+cGFyOworCXN0cnVjdCBmYl9maWxscmVjdCBtb2RkZWQ7CisJaW50IHZ4cmVzLCB2eXJlczsKKwl1MzIgY29sb3IgPSAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SKSA/CisJCSgodTMyKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnaW9uLT5jb2xvcl0gOiByZWdpb24tPmNvbG9yOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisJaWYgKChpbmZvLT5mbGFncyAmIEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEKSB8fAorCQlyZWdpb24tPnJvcCAhPSBST1BfQ09QWSApIHsKKwkJY2ZiX2ZpbGxyZWN0KGluZm8sIHJlZ2lvbik7CisJCXJldHVybjsKKwl9CisKKwl2eHJlcyA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7CisJdnlyZXMgPSBpbmZvLT52YXIueXJlc192aXJ0dWFsOworCisJbWVtY3B5KCZtb2RkZWQsIHJlZ2lvbiwgc2l6ZW9mKHN0cnVjdCBmYl9maWxscmVjdCkpOworCisJaWYoIW1vZGRlZC53aWR0aCB8fCAhbW9kZGVkLmhlaWdodCB8fAorCSAgIG1vZGRlZC5keCA+PSB2eHJlcyB8fCBtb2RkZWQuZHkgPj0gdnlyZXMpCisJCXJldHVybjsKKworCWlmKG1vZGRlZC5keCArIG1vZGRlZC53aWR0aCAgPiB2eHJlcykKKwkJbW9kZGVkLndpZHRoICA9IHZ4cmVzIC0gbW9kZGVkLmR4OworCWlmKG1vZGRlZC5keSArIG1vZGRlZC5oZWlnaHQgPiB2eXJlcykKKwkJbW9kZGVkLmhlaWdodCA9IHZ5cmVzIC0gbW9kZGVkLmR5OworCisJaWYoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCisJCWNvbG9yIHw9IGNvbG9yIDw8IDg7CisJaWYoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsIDw9IDE2KQorCQljb2xvciB8PSBjb2xvciA8PCAxNjsKKworCVBNM19XQUlUKHBhciwgNCk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zQ29uZmlnMkQsCisJCQkJICBQTTNDb25maWcyRF9Vc2VDb25zdGFudFNvdXJjZSB8CisJCQkJICBQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QRW5hYmxlIHwKKwkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLworCQkJCSAgUE0zQ29uZmlnMkRfRkJXcml0ZUVuYWJsZSk7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zRm9yZWdyb3VuZENvbG9yLCBjb2xvcik7CisKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUmVjdGFuZ2xlUG9zaXRpb24sCisJCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9YT2Zmc2V0KG1vZGRlZC5keCkpIHwKKwkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1lPZmZzZXQobW9kZGVkLmR5KSkpOworCisJUE0zX1dSSVRFX1JFRyhwYXIsIFBNM1JlbmRlcjJELAorCQkgICAgICBQTTNSZW5kZXIyRF9YUG9zaXRpdmUgfAorCQkgICAgICBQTTNSZW5kZXIyRF9ZUG9zaXRpdmUgfAorCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKKwkJICAgICAgUE0zUmVuZGVyMkRfU3Bhbk9wZXJhdGlvbiB8CisJCSAgICAgIChQTTNSZW5kZXIyRF9XaWR0aChtb2RkZWQud2lkdGgpKSB8CisJCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQobW9kZGVkLmhlaWdodCkpKTsKK30KKy8qIGVuZCBvZiBhY2NlbGVyYXRpb24gZnVuY3Rpb25zICovCisKIC8qIHdyaXRlIHRoZSBtb2RlIHRvIHJlZ2lzdGVycyAqLwogc3RhdGljIHZvaWQgcG0zZmJfd3JpdGVfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKQEAgLTM4MCw4ICs2MTIsNiBAQAogLyoKICAqIGhhcmR3YXJlIGluZGVwZW5kZW50IGZ1bmN0aW9ucwogICovCi1pbnQgcG0zZmJfaW5pdCh2b2lkKTsKLQogc3RhdGljIGludCBwbTNmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCXUzMiBscGl0Y2g7CkBAIC01MjgsNiArNzU4LDcgQEAKIAlwbTNmYl9jbGVhcl9jb2xvcm1hcChwYXIsIDAsIDAsIDApOwogCVBNM19XUklURV9EQUNfUkVHKHBhciwgUE0zUkRfQ3Vyc29yTW9kZSwKIAkJCSAgUE0zUkRfQ3Vyc29yTW9kZV9DVVJTT1JfRElTQUJMRSk7CisJcG0zZmJfaW5pdF9lbmdpbmUoaW5mbyk7CiAJcG0zZmJfd3JpdGVfbW9kZShpbmZvKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTY3NSwxMCArOTA2LDExIEBACiAJLmZiX3NldF9wYXIJPSBwbTNmYl9zZXRfcGFyLAogCS5mYl9zZXRjb2xyZWcJPSBwbTNmYl9zZXRjb2xyZWcsCiAJLmZiX3Bhbl9kaXNwbGF5CT0gcG0zZmJfcGFuX2Rpc3BsYXksCi0JLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9maWxscmVjdAk9IHBtM2ZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKIAkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKIAkuZmJfYmxhbmsJPSBwbTNmYl9ibGFuaywKKwkuZmJfc3luYwk9IHBtM2ZiX3N5bmMsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04NDcsNyArMTA3OSw4IEBACiAKIAlpbmZvLT5maXggPSBwbTNmYl9maXg7CiAJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBhbGV0dGU7Ci0JaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsvKiB8IEZCSU5GT19IV0FDQ0VMX1lQQU47Ki8KKwlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwKKwkJCUZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUOy8qIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsqLwogCiAJLyoKIAkgKiBUaGlzIHNob3VsZCBnaXZlIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZpZGVvIG1vZGUuIFRoZSBmb2xsb3dpbmcgaXMKQEAgLTkzNSwzNSArMTE2OCwxMiBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcG0zZmJfaWRfdGFibGUpOwogCi0jaWZuZGVmIE1PRFVMRQotCS8qCi0JICogIFNldHVwCi0JICovCi0KLS8qCi0gKiBPbmx5IG5lY2Vzc2FyeSBpZiB5b3VyIGRyaXZlciB0YWtlcyBzcGVjaWFsIG9wdGlvbnMsCi0gKiBvdGhlcndpc2Ugd2UgZmFsbCBiYWNrIG9uIHRoZSBnZW5lcmljIGZiX3NldHVwKCkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHBtM2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCitzdGF0aWMgaW50IF9faW5pdCBwbTNmYl9pbml0KHZvaWQpCiB7Ci0JLyogUGFyc2UgdXNlciBzcGVmaWNpZWQgb3B0aW9ucyAoYHZpZGVvPXBtM2ZiOicpICovCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogTU9EVUxFICovCi0KLWludCBfX2luaXQgcG0zZmJfaW5pdCh2b2lkKQotewotCS8qCi0JICogIEZvciBrZXJuZWwgYm9vdCBvcHRpb25zIChpbiAndmlkZW89cG0zZmI6PG9wdGlvbnM+JyBmb3JtYXQpCi0JICovCiAjaWZuZGVmIE1PRFVMRQotCWNoYXIgKm9wdGlvbiA9IE5VTEw7Ci0KLQlpZiAoZmJfZ2V0X29wdGlvbnMoInBtM2ZiIiwgJm9wdGlvbikpCisJaWYgKGZiX2dldF9vcHRpb25zKCJwbTNmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlwbTNmYl9zZXR1cChvcHRpb24pOwogI2VuZGlmCi0KIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcG0zZmJfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wczNmYi5jIGIvZHJpdmVycy92aWRlby9wczNmYi5jCmluZGV4IDljZjkyYmEuLjM5NzJhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHMzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BzM2ZiLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgpAQCAtNDYsNiArNDUsOSBAQAogI2luY2x1ZGUgPGFzbS9wczNmYi5oPgogI2luY2x1ZGUgPGFzbS9wczMuaD4KIAorCisjZGVmaW5lIERFVklDRV9OQU1FCQkicHMzZmIiCisKICNpZmRlZiBQUzNGQl9ERUJVRwogI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJpbnRrKCIlczogIiBmbXQsIF9fZnVuY19fICwgIyNhcmdzKQogI2Vsc2UKQEAgLTEyNiw3ICsxMjgsNiBAQAogCiBzdHJ1Y3QgcHMzZmJfcHJpdiB7CiAJdW5zaWduZWQgaW50IGlycV9ubzsKLQl2b2lkICpkZXY7CiAKIAl1NjQgY29udGV4dF9oYW5kbGUsIG1lbW9yeV9oYW5kbGU7CiAJdm9pZCAqeGRyX2VhOwpAQCAtMTcxLDcgKzE3Miw3IEBACiAJeyAgICAwLCAgICAwLCAgIDAsICAgMCAsIDB9IH07CiAKIC8qIGRlZmF1bHQgcmVzb2x1dGlvbiAqLwotI2RlZmluZSBHUFVfUkVTX0lOREVYIDAJCS8qIDcyMCB4IDQ4MCAqLworI2RlZmluZSBHUFVfUkVTX0lOREVYCTAJCS8qIDcyMCB4IDQ4MCAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSBwczNmYl9tb2RlZGJbXSA9IHsKICAgICAvKiA2MCBIeiBicm9hZGNhc3QgbW9kZXMgKG1vZGVzICIxIiB0byAiNSIpICovCkBAIC0yOTgsMTAgKzI5OSw5IEBACiAjZGVmaW5lIEZCX09GRihpKQkoR1BVX09GRlNFVCAtIFZQX09GRihpKSAlIEdQVV9PRkZTRVQpCiAKIHN0YXRpYyBpbnQgcHMzZmJfbW9kZTsKLW1vZHVsZV9wYXJhbShwczNmYl9tb2RlLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbShwczNmYl9tb2RlLCBpbnQsIDApOwogCi1zdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19pbml0ZGF0YTsKLQorc3RhdGljIGNoYXIgKm1vZGVfb3B0aW9uIF9fZGV2aW5pdGRhdGE7CiAKIHN0YXRpYyBpbnQgcHMzZmJfZ2V0X3Jlc190YWJsZSh1MzIgeHJlcywgdTMyIHlyZXMpCiB7CkBAIC02ODEsMTUgKzY4MSwxNSBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChwczNmYl93YWl0X2Zvcl92c3luYyk7CiAKLXZvaWQgcHMzZmJfZmxpcF9jdGwoaW50IG9uKQordm9pZCBwczNmYl9mbGlwX2N0bChpbnQgb24sIHZvaWQgKmRhdGEpCiB7CisJc3RydWN0IHBzM2ZiX3ByaXYgKnByaXYgPSBkYXRhOwogCWlmIChvbikKLQkJYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmcHMzZmIuZXh0X2ZsaXApOworCQlhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZwcml2LT5leHRfZmxpcCk7CiAJZWxzZQotCQlhdG9taWNfaW5jKCZwczNmYi5leHRfZmxpcCk7CisJCWF0b21pY19pbmMoJnByaXYtPmV4dF9mbGlwKTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfZmxpcF9jdGwpOwogCiAgICAgLyoKICAgICAgKiBpb2N0bApAQCAtODEyLDYgKzgxMiw3IEBACiAKIHN0YXRpYyBpbnQgcHMzZmJkKHZvaWQgKmFyZykKIHsKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwpAQCAtODUxLDM3ICs4NTIsOSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IHBzM2ZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCi17Ci0JY2hhciAqdGhpc19vcHQ7Ci0JaW50IG1vZGUgPSAwOwogCi0JaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKLQkJcmV0dXJuIDA7CS8qIG5vIG9wdGlvbnMgKi8KLQotCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKLQkJaWYgKCEqdGhpc19vcHQpCi0JCQljb250aW51ZTsKLQkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibW9kZToiLCA1KSkKLQkJCW1vZGUgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOwotCQllbHNlCi0JCQltb2RlX29wdGlvbiA9IHRoaXNfb3B0OwotCX0KLQlyZXR1cm4gbW9kZTsKLX0KLSNlbmRpZgkvKiBNT0RVTEUgKi8KLQotICAgIC8qCi0gICAgICogIEluaXRpYWxpc2F0aW9uCi0gICAgICovCi0KLXN0YXRpYyB2b2lkIHBzM2ZiX3BsYXRmb3JtX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIHplcm8uICovCi19Ci0KLXN0YXRpYyBpbnQgcHMzZmJfdnN5bmNfc2V0dGluZ3Moc3RydWN0IGdwdV9kcml2ZXJfaW5mbyAqZGluZm8sIHZvaWQgKmRldikKK3N0YXRpYyBpbnQgcHMzZmJfdnN5bmNfc2V0dGluZ3Moc3RydWN0IGdwdV9kcml2ZXJfaW5mbyAqZGluZm8sCisJCQkJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KQogewogCWludCBlcnJvcjsKIApAQCAtODk3LDcgKzg3MCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBzM2ZiLmRldiA9IGRldjsKIAllcnJvciA9IHBzM19pcnFfcGx1Z19zZXR1cChQUzNfQklORElOR19DUFVfQU5ZLCBkaW5mby0+aXJxLmlycV9vdXRsZXQsCiAJCQkJICAgJnBzM2ZiLmlycV9ubyk7CiAJaWYgKGVycm9yKSB7CkBAIC05MDcsNyArODc5LDcgQEAKIAl9CiAKIAllcnJvciA9IHJlcXVlc3RfaXJxKHBzM2ZiLmlycV9ubywgcHMzZmJfdnN5bmNfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAotCQkJICAgICJwczNmYiB2c3luYyIsIHBzM2ZiLmRldik7CisJCQkgICAgREVWSUNFX05BTUUsIGRldik7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCSAgICAgICBlcnJvcik7CkBAIC05NjYsMTYgKzkzOCw0NSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwczNmYl9maXggX19pbml0ZGF0YSA9IHsKLQkuaWQgPQkJIlBTMyBGQiIsCisJLmlkID0JCURFVklDRV9OQU1FLAogCS50eXBlID0JCUZCX1RZUEVfUEFDS0VEX1BJWEVMUywKIAkudmlzdWFsID0JRkJfVklTVUFMX1RSVUVDT0xPUiwKIAkuYWNjZWwgPQlGQl9BQ0NFTF9OT05FLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcHMzZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBwczNmYl9zZXRfc3luYyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKyNpZmRlZiBIRUFEX0EKKwlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKDB4MCwKKwkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRElTUExBWV9TWU5DLAorCQkJCQkgICAwLCBMMUdQVV9ESVNQTEFZX1NZTkNfVlNZTkMsIDAsIDApOworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSBESVNQTEFZX1NZTkMgIgorCQkgICAgICAgImZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisjaWZkZWYgSEVBRF9CCisJc3RhdHVzID0gbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSgweDAsCisJCQkJCSAgIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0RJU1BMQVlfU1lOQywKKwkJCQkJICAgMSwgTDFHUFVfRElTUExBWV9TWU5DX1ZTWU5DLCAwLCAwKTsKKworCWlmIChzdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSBESVNQTEFZX01PREUgIgorCQkgICAgICAgImZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBzM2ZiX3Byb2JlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKKwl1MzIgeHJlcywgeXJlczsKIAl1NjQgZGRyX2xwYXIgPSAwOwogCXU2NCBscGFyX2RtYV9jb250cm9sID0gMDsKIAl1NjQgbHBhcl9kcml2ZXJfaW5mbyA9IDA7CkBAIC05ODYsNiArOTg3LDMwIEBACiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCisJc3RhdHVzID0gcHMzX29wZW5faHZfZGV2aWNlKGRldik7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwczNfb3Blbl9odl9kZXZpY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghcHMzZmJfbW9kZSkKKwkJcHMzZmJfbW9kZSA9IHBzM2F2X2dldF9tb2RlKCk7CisJRFBSSU5USygicHMzYXZfbW9kZTolZFxuIiwgcHMzZmJfbW9kZSk7CisKKwlpZiAocHMzZmJfbW9kZSA+IDAgJiYKKwkgICAgIXBzM2F2X3ZpZGVvX21vZGUycmVzKHBzM2ZiX21vZGUsICZ4cmVzLCAmeXJlcykpIHsKKwkJcHMzZmIucmVzX2luZGV4ID0gcHMzZmJfZ2V0X3Jlc190YWJsZSh4cmVzLCB5cmVzKTsKKwkJRFBSSU5USygicmVzX2luZGV4OiVkXG4iLCBwczNmYi5yZXNfaW5kZXgpOworCX0gZWxzZQorCQlwczNmYi5yZXNfaW5kZXggPSBHUFVfUkVTX0lOREVYOworCisJYXRvbWljX3NldCgmcHMzZmIuZl9jb3VudCwgLTEpOwkvKiBmYmNvbiBvcGVucyBwczNmYiAqLworCWF0b21pY19zZXQoJnBzM2ZiLmV4dF9mbGlwLCAwKTsJLyogZm9yIGZsaXAgd2l0aCB2c3luYyAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBzM2ZiLndhaXRfdnN5bmMpOworCXBzM2ZiLm51bV9mcmFtZXMgPSAxOworCisJcHMzZmJfc2V0X3N5bmMoKTsKKwogCS8qIGdldCBncHUgY29udGV4dCBoYW5kbGUgKi8KIAlzdGF0dXMgPSBsdjFfZ3B1X21lbW9yeV9hbGxvY2F0ZShERFJfU0laRSwgMCwgMCwgMCwgMCwKIAkJCQkJICZwczNmYi5tZW1vcnlfaGFuZGxlLCAmZGRyX2xwYXIpOwpAQCAtMTAyOSw3ICsxMDU0LDcgQEAKIAkgKiBsZWFrYWdlIGludG8gdXNlcnNwYWNlCiAJICovCiAJbWVtc2V0KHBzM2ZiLnhkcl9lYSwgMCwgcHMzZmJfdmlkZW9tZW1vcnkuc2l6ZSk7Ci0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMTYsICZkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMTYsICZkZXYtPmNvcmUpOwogCWlmICghaW5mbykKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAKQEAgLTEwNjEsMTkgKzEwODYsMjAgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBlcnJfZmJfZGVhbGxvYzsKIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CisJZGV2LT5jb3JlLmRyaXZlcl9kYXRhID0gaW5mbzsKIAogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgImZiJWQ6IFBTMyBmcmFtZSBidWZmZXIgZGV2aWNlLCB1c2luZyAlbGQgS2lCIG9mIHZpZGVvIG1lbW9yeVxuIiwKIAkgICAgICAgaW5mby0+bm9kZSwgcHMzZmJfdmlkZW9tZW1vcnkuc2l6ZSA+PiAxMCk7CiAKLQl0YXNrID0ga3RocmVhZF9ydW4ocHMzZmJkLCBpbmZvLCAicHMzZmJkIik7CisJdGFzayA9IGt0aHJlYWRfcnVuKHBzM2ZiZCwgaW5mbywgREVWSUNFX05BTUUpOwogCWlmIChJU19FUlIodGFzaykpIHsKIAkJcmV0dmFsID0gUFRSX0VSUih0YXNrKTsKIAkJZ290byBlcnJfdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcjsKIAl9CiAKIAlwczNmYi50YXNrID0gdGFzazsKKwlwczNhdl9yZWdpc3Rlcl9mbGlwX2N0bChwczNmYl9mbGlwX2N0bCwgJnBzM2ZiKTsKIAogCXJldHVybiAwOwogCkBAIC0xMDg0LDcgKzExMTAsNyBAQAogZXJyX2ZyYW1lYnVmZmVyX3JlbGVhc2U6CiAJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKIGVycl9mcmVlX2lycToKLQlmcmVlX2lycShwczNmYi5pcnFfbm8sIHBzM2ZiLmRldik7CisJZnJlZV9pcnEocHMzZmIuaXJxX25vLCBkZXYpOwogCXBzM19pcnFfcGx1Z19kZXN0cm95KHBzM2ZiLmlycV9ubyk7CiBlcnJfaW91bm1hcF9kaW5mbzoKIAlpb3VubWFwKCh1OCBfX2lvbWVtICopcHMzZmIuZGluZm8pOwpAQCAtMTA5NiwyNiArMTEyMiwzMCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHBzM2ZiX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlwczNmYl9mbGlwX2N0bCgwKTsJLyogZmxpcCBvZmYgKi8KLQlwczNmYi5kaW5mby0+aXJxLm1hc2sgPSAwOwotCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgcHMzZmIuZGV2KTsKLQlwczNfaXJxX3BsdWdfZGVzdHJveShwczNmYi5pcnFfbm8pOwotCWlvdW5tYXAoKHU4IF9faW9tZW0gKilwczNmYi5kaW5mbyk7Ci19Ci0KLXZvaWQgcHMzZmJfY2xlYW51cCh2b2lkKQorc3RhdGljIGludCBwczNmYl9zaHV0ZG93bihzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IGRldi0+Y29yZS5kcml2ZXJfZGF0YTsKIAorCURQUklOVEsoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBzM2ZiX2ZsaXBfY3RsKDAsICZwczNmYik7CS8qIGZsaXAgb2ZmICovCisJcHMzZmIuZGluZm8tPmlycS5tYXNrID0gMDsKKworCWlmIChpbmZvKSB7CisJCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJfQorCisJcHMzYXZfcmVnaXN0ZXJfZmxpcF9jdGwoTlVMTCwgTlVMTCk7CiAJaWYgKHBzM2ZiLnRhc2spIHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHMzZmIudGFzazsKIAkJcHMzZmIudGFzayA9IE5VTEw7CiAJCWt0aHJlYWRfc3RvcCh0YXNrKTsKIAl9CiAJaWYgKHBzM2ZiLmlycV9ubykgewotCQlmcmVlX2lycShwczNmYi5pcnFfbm8sIHBzM2ZiLmRldik7CisJCWZyZWVfaXJxKHBzM2ZiLmlycV9ubywgZGV2KTsKIAkJcHMzX2lycV9wbHVnX2Rlc3Ryb3kocHMzZmIuaXJxX25vKTsKIAl9CiAJaW91bm1hcCgodTggX19pb21lbSAqKXBzM2ZiLmRpbmZvKTsKQEAgLTExMjgsMTM0ICsxMTU4LDY5IEBACiAJaWYgKHN0YXR1cykKIAkJRFBSSU5USygibHYxX2dwdV9tZW1vcnlfZnJlZSBmYWlsZWQ6ICVkXG4iLCBzdGF0dXMpOwogCi0JcHMzYXZfZGV2X2Nsb3NlKCk7Ci19CisJcHMzX2Nsb3NlX2h2X2RldmljZShkZXYpOworCURQUklOVEsoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAotRVhQT1JUX1NZTUJPTF9HUEwocHMzZmJfY2xlYW51cCk7Ci0KLXN0YXRpYyBpbnQgcHMzZmJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoaW5mbykgewotCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwotCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOwotCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwotCX0KLQlwczNmYl9jbGVhbnVwKCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBzM2ZiX2RyaXZlciA9IHsKLQkucHJvYmUJPSBwczNmYl9wcm9iZSwKLQkucmVtb3ZlID0gcHMzZmJfcmVtb3ZlLAotCS5zaHV0ZG93biA9IHBzM2ZiX3NodXRkb3duLAotCS5kcml2ZXIgPSB7IC5uYW1lID0gInBzM2ZiIiB9CitzdGF0aWMgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciBwczNmYl9kcml2ZXIgPSB7CisJLm1hdGNoX2lkCT0gUFMzX01BVENIX0lEX0dSQVBISUNTLAorCS5jb3JlLm5hbWUJPSBERVZJQ0VfTkFNRSwKKwkuY29yZS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5wcm9iZQkJPSBwczNmYl9wcm9iZSwKKwkucmVtb3ZlCQk9IHBzM2ZiX3NodXRkb3duLAorCS5zaHV0ZG93bgk9IHBzM2ZiX3NodXRkb3duLAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcHMzZmJfZGV2aWNlID0gewotCS5uYW1lCT0gInBzM2ZiIiwKLQkuaWQJPSAwLAotCS5kZXYJPSB7IC5yZWxlYXNlID0gcHMzZmJfcGxhdGZvcm1fcmVsZWFzZSB9Ci19OwotCi1pbnQgcHMzZmJfc2V0X3N5bmModm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBzM2ZiX3NldHVwKHZvaWQpCiB7Ci0JaW50IHN0YXR1czsKKwljaGFyICpvcHRpb25zOwogCi0jaWZkZWYgSEVBRF9BCi0Jc3RhdHVzID0gbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSgweDAsCi0JCQkJCSAgIEwxR1BVX0NPTlRFWFRfQVRUUklCVVRFX0RJU1BMQVlfU1lOQywKLQkJCQkJICAgMCwgTDFHUFVfRElTUExBWV9TWU5DX1ZTWU5DLCAwLCAwKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlIERJU1BMQVlfU1lOQyBmYWlsZWQ6ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHN0YXR1cyk7Ci0JCXJldHVybiAtMTsKLQl9CisjaWZkZWYgTU9EVUxFCisJcmV0dXJuIDA7CiAjZW5kaWYKLSNpZmRlZiBIRUFEX0IKLQlzdGF0dXMgPSBsdjFfZ3B1X2NvbnRleHRfYXR0cmlidXRlKDB4MCwKLQkJCQkJICAgTDFHUFVfQ09OVEVYVF9BVFRSSUJVVEVfRElTUExBWV9TWU5DLAotCQkJCQkgICAxLCBMMUdQVV9ESVNQTEFZX1NZTkNfVlNZTkMsIDAsIDApOwogCi0JaWYgKHN0YXR1cykgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogbHYxX2dwdV9jb250ZXh0X2F0dHJpYnV0ZSBESVNQTEFZX01PREUgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBzdGF0dXMpOwotCQlyZXR1cm4gLTE7CisJaWYgKGZiX2dldF9vcHRpb25zKERFVklDRV9OQU1FLCAmb3B0aW9ucykpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgxKSB7CisJCWNoYXIgKnRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpOworCisJCWlmICghdGhpc19vcHQpCisJCQlicmVhazsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibW9kZToiLCA1KSkKKwkJCXBzM2ZiX21vZGUgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOworCQllbHNlCisJCQltb2RlX29wdGlvbiA9IHRoaXNfb3B0OwogCX0KLSNlbmRpZgogCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChwczNmYl9zZXRfc3luYyk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IHBzM2ZiX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0jaWZuZGVmIE1PRFVMRQotCWludCBtb2RlOwotCWNoYXIgKm9wdGlvbiA9IE5VTEw7CisJaWYgKCFwczNmYl92aWRlb21lbW9yeS5hZGRyZXNzIHx8ICBwczNmYl9zZXR1cCgpKQorCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKGZiX2dldF9vcHRpb25zKCJwczNmYiIsICZvcHRpb24pKQotCQlnb3RvIGVycjsKLSNlbmRpZgorCXJldHVybiBwczNfc3lzdGVtX2J1c19kcml2ZXJfcmVnaXN0ZXIoJnBzM2ZiX2RyaXZlcik7Cit9CiAKLQlpZiAoIXBzM2ZiX3ZpZGVvbWVtb3J5LmFkZHJlc3MpCi0JCWdvdG8gZXJyOwotCi0JZXJyb3IgPSBwczNhdl9kZXZfb3BlbigpOwotCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwczNhdl9kZXZfb3BlbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcHMzZmJfbW9kZSA9IHBzM2F2X2dldF9tb2RlKCk7Ci0JRFBSSU5USygicHMzYXZfbW9kZTolZFxuIiwgcHMzZmJfbW9kZSk7Ci0jaWZuZGVmIE1PRFVMRQotCW1vZGUgPSBwczNmYl9zZXR1cChvcHRpb24pOwkvKiBjaGVjayBib290IG9wdGlvbiAqLwotCWlmIChtb2RlKQotCQlwczNmYl9tb2RlID0gbW9kZTsKLSNlbmRpZgotCWlmIChwczNmYl9tb2RlID4gMCkgewotCQl1MzIgeHJlcywgeXJlczsKLQkJcHMzYXZfdmlkZW9fbW9kZTJyZXMocHMzZmJfbW9kZSwgJnhyZXMsICZ5cmVzKTsKLQkJcHMzZmIucmVzX2luZGV4ID0gcHMzZmJfZ2V0X3Jlc190YWJsZSh4cmVzLCB5cmVzKTsKLQkJRFBSSU5USygicmVzX2luZGV4OiVkXG4iLCBwczNmYi5yZXNfaW5kZXgpOwotCX0gZWxzZQotCQlwczNmYi5yZXNfaW5kZXggPSBHUFVfUkVTX0lOREVYOwotCi0JYXRvbWljX3NldCgmcHMzZmIuZl9jb3VudCwgLTEpOwkvKiBmYmNvbiBvcGVucyBwczNmYiAqLwotCWF0b21pY19zZXQoJnBzM2ZiLmV4dF9mbGlwLCAwKTsJLyogZm9yIGZsaXAgd2l0aCB2c3luYyAqLwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBzM2ZiLndhaXRfdnN5bmMpOwotCXBzM2ZiLm51bV9mcmFtZXMgPSAxOwotCi0JZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBzM2ZiX2RyaXZlcik7Ci0JaWYgKCFlcnJvcikgewotCQllcnJvciA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcHMzZmJfZGV2aWNlKTsKLQkJaWYgKGVycm9yKQotCQkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnBzM2ZiX2RyaXZlcik7Ci0JfQotCi0JcHMzZmJfc2V0X3N5bmMoKTsKLQotCXJldHVybiBlcnJvcjsKLQotZXJyOgotCXJldHVybiAtRU5YSU87CitzdGF0aWMgdm9pZCBfX2V4aXQgcHMzZmJfZXhpdCh2b2lkKQoreworCURQUklOVEsoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwczNfc3lzdGVtX2J1c19kcml2ZXJfdW5yZWdpc3RlcigmcHMzZmJfZHJpdmVyKTsKKwlEUFJJTlRLKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiB9CiAKIG1vZHVsZV9pbml0KHBzM2ZiX2luaXQpOwotCi0jaWZkZWYgTU9EVUxFCi1zdGF0aWMgdm9pZCBfX2V4aXQgcHMzZmJfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZwczNmYl9kZXZpY2UpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwczNmYl9kcml2ZXIpOwotfQotCiBtb2R1bGVfZXhpdChwczNmYl9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworTU9EVUxFX0RFU0NSSVBUSU9OKCJQUzMgR1BVIEZyYW1lIEJ1ZmZlciBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuIik7CitNT0RVTEVfQUxJQVMoUFMzX01PRFVMRV9BTElBU19HUkFQSElDUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jIGIvZHJpdmVycy92aWRlby9wdnIyZmIuYwppbmRleCBkZjI5MDlhLi4wZjg4YzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMKQEAgLTExNSwxMSArMTE1LDExIEBACiBlbnVtIHsgUEFMX0FSR0IxNTU1LCBQQUxfUkdCNTY1LCBQQUxfQVJHQjQ0NDQsIFBBTF9BUkdCODg4OCB9OwogCiBzdHJ1Y3QgcHZyMl9wYXJhbXMgeyB1bnNpZ25lZCBpbnQgdmFsOyBjaGFyICpuYW1lOyB9Owotc3RhdGljIHN0cnVjdCBwdnIyX3BhcmFtcyBjYWJsZXNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBwdnIyX3BhcmFtcyBjYWJsZXNbXSBfX2RldmluaXRkYXRhID0gewogCXsgQ1RfVkdBLCAiVkdBIiB9LCB7IENUX1JHQiwgIlJHQiIgfSwgeyBDVF9DT01QT1NJVEUsICJDT01QT1NJVEUiIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHB2cjJfcGFyYW1zIG91dHB1dHNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBwdnIyX3BhcmFtcyBvdXRwdXRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7IFZPX1BBTCwgIlBBTCIgfSwgeyBWT19OVFNDLCAiTlRTQyIgfSwgeyBWT19WR0EsICJWR0EiIH0sCiB9OwogCkBAIC0xNDcsMTYgKzE0NywxNiBAQAogCiBzdGF0aWMgc3RydWN0IGZiX2luZm8gKmZiX2luZm87CiAKLXN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcHZyMl9maXggX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gcHZyMl9maXggX19kZXZpbml0ZGF0YSA9IHsKIAkuaWQgPQkJIk5FQyBQb3dlclZSMiIsCi0JLnR5cGUgPSAJRkJfVFlQRV9QQUNLRURfUElYRUxTLAotCS52aXN1YWwgPSAJRkJfVklTVUFMX1RSVUVDT0xPUiwKKwkudHlwZSA9CQlGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnZpc3VhbCA9CUZCX1ZJU1VBTF9UUlVFQ09MT1IsCiAJLnlwYW5zdGVwID0JMSwKIAkueXdyYXBzdGVwID0JMSwKLQkuYWNjZWwgPSAJRkJfQUNDRUxfTk9ORSwKKwkuYWNjZWwgPQlGQl9BQ0NFTF9OT05FLAogfTsKIAotc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBwdnIyX3ZhciBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBwdnIyX3ZhciBfX2RldmluaXRkYXRhID0gewogCS54cmVzID0JCTY0MCwKIAkueXJlcyA9CQk0ODAsCiAJLnhyZXNfdmlydHVhbCA9CTY0MCwKQEAgLTE5NSwxMCArMTk1LDYgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHZyMmRtYSA9IE9OQ0hJUF9OUl9ETUFfQ0hBTk5FTFM7CiAjZW5kaWYKIAotLyogSW50ZXJmYWNlIHVzZWQgYnkgdGhlIHdvcmxkICovCi0KLWludCBwdnIyZmJfc2V0dXAoY2hhciopOwotCiBzdGF0aWMgaW50IHB2cjJmYl9zZXRjb2xyZWcodW5zaWduZWQgaW50IHJlZ25vLCB1bnNpZ25lZCBpbnQgcmVkLCB1bnNpZ25lZCBpbnQgZ3JlZW4sIHVuc2lnbmVkIGludCBibHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIHN0YXRpYyBpbnQgcHZyMmZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pOwpAQCAtMjI3LDEyICsyMjMsMTIgQEAKICNpZmRlZiBDT05GSUdfU0hfRE1BCiAJLmZiX3dyaXRlCT0gcHZyMmZiX3dyaXRlLAogI2VuZGlmCi0JLmZiX2ZpbGxyZWN0IAk9IGNmYl9maWxscmVjdCwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogfTsKIAotc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgcHZyMl9tb2RlZGJbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgcHZyMl9tb2RlZGJbXSBfX2RldmluaXRkYXRhID0gewogICAgIC8qCiAgICAgICogQnJvYWRjYXN0IHZpZGVvIG1vZGVzIChQQUwgYW5kIE5UU0MpLiAgSSdtIHVuZmFtaWxpYXIgd2l0aAogICAgICAqIFBBTC1NIGFuZCBQQUwtTiwgYnV0IGZyb20gd2hhdCBJJ3ZlIHJlYWQgYm90aCBtb2RlcyBwYXJhbGxlbCBQQUwgYW5kCkBAIC0yNTIsNyArMjQ4LDcgQEAKIAkvKiA2NDB4NDgwIEAgNjBoeiAoVkdBKSAqLwogCSJ2Z2FfNjQweDQ4MCIsIDYwLCA2NDAsIDQ4MCwgVkdBX0NMSywgMzgsIDMzLCAwLCAxOCwgMTQ2LCAyNiwKIAkwLCBGQl9WTU9ERV9ZV1JBUAotICAgIH0sIAorICAgIH0sCiB9OwogCiAjZGVmaW5lIE5VTV9UT1RBTF9NT0RFUyAgQVJSQVlfU0laRShwdnIyX21vZGVkYikKQEAgLTI2Miw3ICsyNTgsNyBAQAogI2RlZmluZSBERUZNT0RFX1ZHQQkyCiAKIHN0YXRpYyBpbnQgZGVmbW9kZSA9IERFRk1PREVfTlRTQzsKLXN0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhID0gTlVMTDsKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2RldmluaXRkYXRhID0gTlVMTDsKIAogc3RhdGljIGlubGluZSB2b2lkIHB2cjJmYl9zZXRfcGFsX3R5cGUodW5zaWduZWQgaW50IHR5cGUpCiB7CkBAIC0yOTMsNyArMjg5LDcgQEAKIHsKIAlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKIAkgICAgY2FzZSAxNjogICAgICAgIC8qIFJHQiA1NjUgKi8KLQkgICAgCXB2cjJmYl9zZXRfcGFsX3R5cGUoUEFMX1JHQjU2NSk7CisJCXB2cjJmYl9zZXRfcGFsX3R5cGUoUEFMX1JHQjU2NSk7CiAJCXZhci0+cmVkLm9mZnNldCA9IDExOyAgICB2YXItPnJlZC5sZW5ndGggPSA1OwogCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7ICAgdmFyLT5ncmVlbi5sZW5ndGggPSA2OwogCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsgICAgdmFyLT5ibHVlLmxlbmd0aCA9IDU7CkBAIC0zMDYsNyArMzAyLDcgQEAKIAkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsgIHZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CiAJCWJyZWFrOwogCSAgICBjYXNlIDMyOiAgICAgICAgLyogQVJHQiA4ODg4ICovCi0JICAgIAlwdnIyZmJfc2V0X3BhbF90eXBlKFBBTF9BUkdCODg4OCk7CisJCXB2cjJmYl9zZXRfcGFsX3R5cGUoUEFMX0FSR0I4ODg4KTsKIAkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7ICAgIHZhci0+cmVkLmxlbmd0aCA9IDg7CiAJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsgICB2YXItPmdyZWVuLmxlbmd0aCA9IDg7CiAJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOyAgICB2YXItPmJsdWUubGVuZ3RoID0gODsKQEAgLTMzNywyNCArMzMzLDI1IEBACiAJCSAgICAgICgoYmx1ZSAgJiAweGY4MDApID4+IDExKTsKIAogCQlwdnIyZmJfc2V0X3BhbF9lbnRyeShwYXIsIHJlZ25vLCB0bXApOwotCQkoKHUxNiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gdG1wOwogCQlicmVhazsKIAkgICAgY2FzZSAyNDogLyogUkdCIDg4OCAqLwogCQlyZWQgPj49IDg7IGdyZWVuID4+PSA4OyBibHVlID4+PSA4OwotCQkoKHUzMiopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gKHJlZCA8PCAxNikgfCAoZ3JlZW4gPDwgOCkgfCBibHVlOworCQl0bXAgPSAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7CiAJCWJyZWFrOwogCSAgICBjYXNlIDMyOiAvKiBBUkdCIDg4ODggKi8KIAkJcmVkID4+PSA4OyBncmVlbiA+Pj0gODsgYmx1ZSA+Pj0gODsKIAkJdG1wID0gKHRyYW5zcCA8PCAyNCkgfCAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWU7CiAKIAkJcHZyMmZiX3NldF9wYWxfZW50cnkocGFyLCByZWdubywgdG1wKTsKLQkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHRtcDsKIAkJYnJlYWs7CiAJICAgIGRlZmF1bHQ6CiAJCXByX2RlYnVnKCJJbnZhbGlkIGJpdCBkZXB0aCAlZD8hP1xuIiwgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKIAkJcmV0dXJuIDE7CiAJfQogCisJaWYgKHJlZ25vIDwgMTYpCisJCSgodTMyKikoaW5mby0+cHNldWRvX3BhbGV0dGUpKVtyZWdub10gPSB0bXA7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzc5LDEzICszNzYsMTMgQEAKIAl2YXItPnZtb2RlICY9IEZCX1ZNT0RFX01BU0s7CiAJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEICYmIHZpZGVvX291dHB1dCAhPSBWT19WR0EpCiAJCXBhci0+aXNfaW50ZXJsYWNlZCA9IDE7Ci0JLyogCisJLyoKIAkgKiBYWFg6IE5lZWQgdG8gYmUgbW9yZSBjcmVhdGl2ZSB3aXRoIHRoaXMgKGkuZS4gYWxsb3cgZG91YmxlY2FuIGZvcgogCSAqIFBBTC9OVFNDIG91dHB1dCkuCiAJICovCiAJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUgJiYgdmlkZW9fb3V0cHV0ID09IFZPX1ZHQSkKIAkJcGFyLT5pc19kb3VibGVzY2FuID0gMTsKLQkKKwogCXBhci0+aHN5bmNfdG90YWwgPSB2YXItPmxlZnRfbWFyZ2luICsgdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKwogCSAgICAgICAgICAgICAgICAgICB2YXItPmhzeW5jX2xlbjsKIAlwYXItPnZzeW5jX3RvdGFsID0gdmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArCkBAIC00MDgsNyArNDA1LDcgQEAKIAl9IGVsc2UgewogCQkvKiBWR0EgbW9kZSAqLwogCQkvKiBYWFg6IFdoYXQgZWxzZSBuZWVkcyB0byBiZSBjaGVja2VkPyAqLwotCQkvKiAKKwkJLyoKIAkJICogWFhYOiBXZSBoYXZlIGEgbGl0dGxlIGZyZWVkb20gaW4gVkdBIG1vZGVzLCB3aGF0IHJhbmdlcwogCQkgKiBzaG91bGQgYmUgaGVyZSAoaS5lLiBoc3luYy92c3luYyB0b3RhbHMsIGV0Yy4pPwogCQkgKi8KQEAgLTQxOSw4ICs0MTYsOCBAQAogCS8qIENhbGN1bGF0ZSB0aGUgcmVtYWluZGluZyBvZmZzZXRzICovCiAJcGFyLT5kaXdzdGFydF9oID0gcGFyLT5ib3JkZXJzdGFydF9oICsgdmFyLT5sZWZ0X21hcmdpbjsKIAlwYXItPmRpd3N0YXJ0X3YgPSBwYXItPmJvcmRlcnN0YXJ0X3YgKyB2YXItPnVwcGVyX21hcmdpbjsKLQlwYXItPmJvcmRlcnN0b3BfaCA9IHBhci0+ZGl3c3RhcnRfaCArIHZhci0+eHJlcyArIAotCQkJICAgIHZhci0+cmlnaHRfbWFyZ2luOyAgICAKKwlwYXItPmJvcmRlcnN0b3BfaCA9IHBhci0+ZGl3c3RhcnRfaCArIHZhci0+eHJlcyArCisJCQkgICAgdmFyLT5yaWdodF9tYXJnaW47CiAJcGFyLT5ib3JkZXJzdG9wX3YgPSBwYXItPmRpd3N0YXJ0X3YgKyB2YXItPnlyZXMgKwogCQkJICAgIHZhci0+bG93ZXJfbWFyZ2luOwogCkBAIC00NjUsMTIgKzQ2MiwxMiBAQAogCXNldF9jb2xvcl9iaXRmaWVsZHModmFyKTsKIAogCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKLQkJaWYgKHZhci0+eG9mZnNldCB8fCB2YXItPnlvZmZzZXQgPCAwIHx8IAorCQlpZiAodmFyLT54b2Zmc2V0IHx8IHZhci0+eW9mZnNldCA8IDAgfHwKIAkJICAgIHZhci0+eW9mZnNldCA+PSB2YXItPnlyZXNfdmlydHVhbCkgewogCQkJdmFyLT54b2Zmc2V0ID0gdmFyLT55b2Zmc2V0ID0gMDsKIAkJfSBlbHNlIHsKIAkJCWlmICh2YXItPnhvZmZzZXQgPiB2YXItPnhyZXNfdmlydHVhbCAtIHZhci0+eHJlcyB8fAotCQkgICAgCSAgICB2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcyB8fCAKKwkJCSAgICB2YXItPnlvZmZzZXQgPiB2YXItPnlyZXNfdmlydHVhbCAtIHZhci0+eXJlcyB8fAogCQkJICAgIHZhci0+eG9mZnNldCA8IDAgfHwgdmFyLT55b2Zmc2V0IDwgMCkKIAkJCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwogCQl9CkBAIC00NzgsNyArNDc1LDcgQEAKIAkJdmFyLT54b2Zmc2V0ID0gdmFyLT55b2Zmc2V0ID0gMDsKIAl9CiAKLQkvKiAKKwkvKgogCSAqIFhYWDogTmVlZCB0byBiZSBtb3JlIGNyZWF0aXZlIHdpdGggdGhpcyAoaS5lLiBhbGxvdyBkb3VibGVjYW4gZm9yCiAJICogUEFML05UU0Mgb3V0cHV0KS4KIAkgKi8KQEAgLTUwNyw3ICs1MDQsNyBAQAogCQl2YXItPnZzeW5jX2xlbiAgICA9IHBhci0+Ym9yZGVyc3RvcF92ICsKIAkJCQkgICAocGFyLT52c3luY190b3RhbCAtIHBhci0+Ym9yZGVyc3RvcF92KTsKIAl9Ci0JCQorCiAJaHN5bmNfdG90YWwgPSB2YXItPmxlZnRfbWFyZ2luICsgdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKwogCQkgICAgICB2YXItPmhzeW5jX2xlbjsKIAl2dG90YWwgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsKQEAgLTUzMSw3ICs1MjgsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJLyogQ2hlY2sgbWVtb3J5IHNpemVzICovCiAJbGluZV9sZW5ndGggPSBnZXRfbGluZV9sZW5ndGgodmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwogCWlmIChsaW5lX2xlbmd0aCAqIHZhci0+eXJlc192aXJ0dWFsID4gaW5mby0+Zml4LnNtZW1fbGVuKQpAQCAtNTUyLDcgKzU0OSw3IEBACiAJICAgICAgICAgIERJU1BfRElXQUREUlMpOwogfQogCi0vKiAKKy8qCiAgKiBJbml0aWFsaXplIHRoZSB2aWRlbyBtb2RlLiAgQ3VycmVudGx5LCB0aGUgMTZicHAgYW5kIDI0YnBwIG1vZGVzIGFyZW4ndAogICogdmVyeSBzdGFibGUuICBJdCdzIHByb2JhYmx5IGR1ZSB0byB0aGUgZmFjdCB0aGF0IGEgbG90IG9mIHRoZSAyRCB2aWRlbwogICogcmVnaXN0ZXJzIGFyZSBzdGlsbCB1bmRvY3VtZW50ZWQuCkBAIC01OTIsMTggKzU4OSwxOCBAQAogCS8qIGRpc3BsYXkgd2luZG93IHN0YXJ0IHBvc2l0aW9uICovCiAJZmJfd3JpdGVsKHBhci0+ZGl3c3RhcnRfaCwgRElTUF9ESVdIU1RSVCk7CiAJZmJfd3JpdGVsKChwYXItPmRpd3N0YXJ0X3YgPDwgMTYpIHwgcGFyLT5kaXdzdGFydF92LCBESVNQX0RJV1ZTVFJUKTsKLQkKKwogCS8qIG1pc2MuIHNldHRpbmdzICovCiAJZmJfd3JpdGVsKCgweDE2IDw8IDE2KSB8IHBhci0+aXNfbG93cmVzLCBESVNQX0RJV0NPTkYpOwogCiAJLyogY2xvY2sgZG91YmxlciAoZm9yIFZHQSksIHNjYW4gZG91YmxlciwgZGlzcGxheSBlbmFibGUgKi8KLQlmYl93cml0ZWwoKCh2aWRlb19vdXRwdXQgPT0gVk9fVkdBKSA8PCAyMykgfCAKKwlmYl93cml0ZWwoKCh2aWRlb19vdXRwdXQgPT0gVk9fVkdBKSA8PCAyMykgfAogCSAgICAgICAgICAocGFyLT5pc19kb3VibGVzY2FuIDw8IDEpIHwgMSwgRElTUF9ESVdNT0RFKTsKIAogCS8qIGJpdHMgcGVyIHBpeGVsICovCiAJZmJfd3JpdGVsKGZiX3JlYWRsKERJU1BfRElXTU9ERSkgfCAoLS1ieXRlc3BlcnBpeGVsIDw8IDIpLCBESVNQX0RJV01PREUpOwogCi0JLyogdmlkZW8gZW5hYmxlLCBjb2xvciBzeW5jLCBpbnRlcmxhY2UsIAorCS8qIHZpZGVvIGVuYWJsZSwgY29sb3Igc3luYywgaW50ZXJsYWNlLAogCSAqIGhzeW5jIGFuZCB2c3luYyBwb2xhcml0eSAoY3VycmVudGx5IHVudXNlZCkgKi8KIAlmYl93cml0ZWwoMHgxMDAgfCAoKHBhci0+aXNfaW50ZXJsYWNlZCAvKnw0Ki8pIDw8IDQpLCBESVNQX1NZTkNDT05GKTsKIH0KQEAgLTY1Nyw3ICs2NTQsNyBAQAogc3RhdGljIGludCBwdnIyX2luaXRfY2FibGUodm9pZCkKIHsKIAlpZiAoY2FibGVfdHlwZSA8IDApIHsKLQkJZmJfd3JpdGVsKChmYl9yZWFkbChQQ1RSQSkgJiAweGZmZjBmZmZmKSB8IDB4MDAwYTAwMDAsIAorCQlmYl93cml0ZWwoKGZiX3JlYWRsKFBDVFJBKSAmIDB4ZmZmMGZmZmYpIHwgMHgwMDBhMDAwMCwKIAkgICAgICAgICAgICAgICAgICBQQ1RSQSk7CiAJCWNhYmxlX3R5cGUgPSAoZmJfcmVhZHcoUERUUkEpID4+IDgpICYgMzsKIAl9CkBAIC02ODcsNyArNjg0LDcgQEAKIAlwYWdlcyA9IGttYWxsb2MobnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9LRVJORUwpOwogCWlmICghcGFnZXMpCiAJCXJldHVybiAtRU5PTUVNOwotCQorCiAJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCAodW5zaWduZWQgbG9uZylidWYsCiAJCQkgICAgIG5yX3BhZ2VzLCBXUklURSwgMCwgcGFnZXMsIE5VTEwpOwpAQCAtNzAwLDcgKzY5Nyw3IEBACiAJfQogCiAJZG1hX2NvbmZpZ3VyZV9jaGFubmVsKHNoZG1hLCAweDEyYzEpOwotCQorCiAJZHN0ICAgPSAodW5zaWduZWQgbG9uZylmYl9pbmZvLT5zY3JlZW5fYmFzZSArICpwcG9zOwogCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2VzWzBdKTsKIAllbmQgICA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlc1tucl9wYWdlc10pOwpAQCAtNzQ0LDcgKzc0MSw3IEBACiAJa2ZyZWUocGFnZXMpOwogCiAJcmV0dXJuIHJldDsKLX0gCit9CiAjZW5kaWYgLyogQ09ORklHX1NIX0RNQSAqLwogCiAvKioKQEAgLTc2NSwyMSArNzYyLDIxIEBACiAgKiBpbiBmb3IgZmxleGliaWxpdHkgYW55d2F5cy4gV2hvIGtub3dzLCBtYXliZSBzb21lb25lIGhhcyB0di1vdXQgb24gYQogICogUENJLWJhc2VkIHZlcnNpb24gb2YgdGhlc2UgdGhpbmdzIDstKQogICovCi1zdGF0aWMgaW50IF9faW5pdCBwdnIyZmJfY29tbW9uX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB2cjJmYl9jb21tb25faW5pdCh2b2lkKQogewogCXN0cnVjdCBwdnIyZmJfcGFyICpwYXIgPSBjdXJyZW50cGFyOwogCXVuc2lnbmVkIGxvbmcgbW9kZW1lbXVzZWQsIHJldjsKIAogCWZiX2luZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHB2cjJfZml4LnNtZW1fc3RhcnQsCiAJCQkJCSAgICAgICBwdnIyX2ZpeC5zbWVtX2xlbik7Ci0JCisKIAlpZiAoIWZiX2luZm8tPnNjcmVlbl9iYXNlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicHZyMmZiOiBGYWlsZWQgdG8gcmVtYXAgc21lbSBzcGFjZVxuIik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlwYXItPm1taW9fYmFzZSA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXBfbm9jYWNoZShwdnIyX2ZpeC5tbWlvX3N0YXJ0LAotCQkJCQkgCQlwdnIyX2ZpeC5tbWlvX2xlbik7CisJCQkJCQkJcHZyMl9maXgubW1pb19sZW4pOwogCWlmICghcGFyLT5tbWlvX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwdnIyZmI6IEZhaWxlZCB0byByZW1hcCBtbWlvIHNwYWNlXG4iKTsKIAkJZ290byBvdXRfZXJyOwpAQCAtODIwLDcgKzgxNyw3IEBACiAJcHJpbnRrKCJmYiVkOiAlcyAocmV2ICVsZC4lbGQpIGZyYW1lIGJ1ZmZlciBkZXZpY2UsIHVzaW5nICVsZGsvJWxkayBvZiB2aWRlbyBtZW1vcnlcbiIsCiAJICAgICAgIGZiX2luZm8tPm5vZGUsIGZiX2luZm8tPmZpeC5pZCwgKHJldiA+PiA0KSAmIDB4MGYsIHJldiAmIDB4MGYsCiAJICAgICAgIG1vZGVtZW11c2VkID4+IDEwLCAodW5zaWduZWQgbG9uZykoZmJfaW5mby0+Zml4LnNtZW1fbGVuID4+IDEwKSk7Ci0JcHJpbnRrKCJmYiVkOiBNb2RlICVkeCVkLSVkIHBpdGNoID0gJWxkIGNhYmxlOiAlcyB2aWRlbyBvdXRwdXQ6ICVzXG4iLCAKKwlwcmludGsoImZiJWQ6IE1vZGUgJWR4JWQtJWQgcGl0Y2ggPSAlbGQgY2FibGU6ICVzIHZpZGVvIG91dHB1dDogJXNcbiIsCiAJICAgICAgIGZiX2luZm8tPm5vZGUsIGZiX2luZm8tPnZhci54cmVzLCBmYl9pbmZvLT52YXIueXJlcywKIAkgICAgICAgZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAogCSAgICAgICBnZXRfbGluZV9sZW5ndGgoZmJfaW5mby0+dmFyLnhyZXMsIGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCksCkBAIC04NzgsOCArODc1LDggQEAKIAkJCXZpZGVvX291dHB1dCA9IFZPX05UU0M7CiAJCX0KIAl9Ci0JCi0JLyogCisKKwkvKgogCSAqIE5vdGhpbmcgZXhjaXRpbmcgYWJvdXQgdGhlIERDIFBWUjIgLi4gb25seSBhIG1lYXNseSA4TWlCLgogCSAqLwogCXB2cjJfZml4LnNtZW1fc3RhcnQJPSAweGE1MDAwMDAwOwkvKiBSQU0gc3RhcnRzIGhlcmUgKi8KQEAgLTkwMyw3ICs5MDAsNyBAQAogCXJldHVybiBwdnIyZmJfY29tbW9uX2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQgcHZyMmZiX2RjX2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwdnIyZmJfZGNfZXhpdCh2b2lkKQogewogCWlmIChmYl9pbmZvLT5zY3JlZW5fYmFzZSkgewogCQlpb3VubWFwKGZiX2luZm8tPnNjcmVlbl9iYXNlKTsKQEAgLTk4NywxMyArOTg0LDEzIEBACiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnB2cjJmYl9wY2lfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgcHZyMmZiX3BjaV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcHZyMmZiX3BjaV9leGl0KHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwdnIyZmJfcGNpX2RyaXZlcik7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBwdnIyX2dldF9wYXJhbShjb25zdCBzdHJ1Y3QgcHZyMl9wYXJhbXMgKnAsIGNvbnN0IGNoYXIgKnMsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnIyX2dldF9wYXJhbShjb25zdCBzdHJ1Y3QgcHZyMl9wYXJhbXMgKnAsIGNvbnN0IGNoYXIgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwsIGludCBzaXplKQogewogCWludCBpOwpAQCAtMTAyMSw3ICsxMDE4LDcgQEAKICAqLwogCiAjaWZuZGVmIE1PRFVMRQotaW50IF9faW5pdCBwdnIyZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKK3N0YXRpYyBpbnQgX19pbml0IHB2cjJmYl9zZXR1cChjaGFyICpvcHRpb25zKQogewogCWNoYXIgKnRoaXNfb3B0OwogCWNoYXIgY2FibGVfYXJnWzgwXTsKQEAgLTEwNjEsNyArMTA1OCw3IEBACiAJaW50ICgqaW5pdCkodm9pZCk7CiAJdm9pZCAoKmV4aXQpKHZvaWQpOwogCWNoYXIgbmFtZVsxNl07Ci19IGJvYXJkX2xpc3RbXSA9IHsKK30gYm9hcmRfZHJpdmVyW10gPSB7CiAjaWZkZWYgQ09ORklHX1NIX0RSRUFNQ0FTVAogCXsgcHZyMmZiX2RjX2luaXQsIHB2cjJmYl9kY19leGl0LCAiU2VnYSBEQyBQVlIyIiB9LAogI2VuZGlmCkBAIC0xMDcxLDcgKzEwNjgsNyBAQAogCXsgMCwgfSwKIH07CiAKLWludCBfX2luaXQgcHZyMmZiX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHB2cjJmYl9pbml0KHZvaWQpCiB7CiAJaW50IGksIHJldCA9IC1FTk9ERVY7CiAJaW50IHNpemU7CkBAIC0xMDk1LDggKzEwOTIsOCBAQAogCiAJY3VycmVudHBhciA9IChzdHJ1Y3QgcHZyMmZiX3BhciAqKShmYl9pbmZvICsgMSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZF9saXN0KTsgaSsrKSB7Ci0JCXN0cnVjdCBwdnIyX2JvYXJkICpwdnJfYm9hcmQgPSBib2FyZF9saXN0ICsgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib2FyZF9kcml2ZXIpOyBpKyspIHsKKwkJc3RydWN0IHB2cjJfYm9hcmQgKnB2cl9ib2FyZCA9IGJvYXJkX2RyaXZlciArIGk7CiAKIAkJaWYgKCFwdnJfYm9hcmQtPmluaXQpCiAJCQljb250aW51ZTsKQEAgLTExMTgsMTMgKzExMTUsMTMgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkX2xpc3QpOyBpKyspIHsKLQkJc3RydWN0IHB2cjJfYm9hcmQgKnB2cl9ib2FyZCA9IGJvYXJkX2xpc3QgKyBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkX2RyaXZlcik7IGkrKykgeworCQlzdHJ1Y3QgcHZyMl9ib2FyZCAqcHZyX2JvYXJkID0gYm9hcmRfZHJpdmVyICsgaTsKIAogCQlpZiAocHZyX2JvYXJkLT5leGl0KQogCQkJcHZyX2JvYXJkLT5leGl0KCk7CiAJfQotCQkKKwogI2lmZGVmIENPTkZJR19TSF9TVE9SRV9RVUVVRVMKIAlzcV91bm1hcChwdnIyZmJfbWFwKTsKICNlbmRpZgpAQCAtMTEzOSw0ICsxMTM2LDMgQEAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+LCBNLiBSLiBCcm93biA8bXJicm93bkAweGQ2Lm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRnJhbWVidWZmZXIgZHJpdmVyIGZvciBORUMgUG93ZXJWUiAyIGJhc2VkIGdyYXBoaWNzIGJvYXJkcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3E0MGZiLmMKaW5kZXggNDg1MzZjMy4uNGJlYWMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9xNDBmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcTQwZmIuYwpAQCAtOTUsNyArOTUsNyBAQAogCS8qIG1hcHBlZCBpbiBxNDAvY29uZmlnLmMgKi8KIAlxNDBmYl9maXguc21lbV9zdGFydCA9IFE0MF9QSFlTX1NDUkVFTl9BRERSOwogCi0JaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZih1MzIpICogMjU2LCAmZGV2LT5kZXYpOworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YodTMyKSAqIDE2LCAmZGV2LT5kZXYpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2dpdndmYi5jIGIvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKaW5kZXggZWJiNjc1Ni4uNGZiMTYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zZ2l2d2ZiLmMKQEAgLTc1Miw3ICs3NTIsNyBAQAogCXN0cnVjdCBmYl9pbmZvICppbmZvOwogCWNoYXIgKm1vbml0b3I7CiAKLQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZ2l2d19wYXIpICsgc2l6ZW9mKHUzMikgKiAyNTYsICZkZXYtPmRldik7CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3Qgc2dpdndfcGFyKSArIHNpemVvZih1MzIpICogMTYsICZkZXYtPmRldik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAlwYXIgPSBpbmZvLT5wYXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Npcy9zaXMuaCBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oCmluZGV4IGQ1ZTJkOWMuLmQ1M2JmNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vc2lzL3Npcy5oCkBAIC00NzksNyArNDc5LDcgQEAKIAlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVmYXVsdF92YXI7CiAKIAlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gc2lzZmJfZml4OwotCXUzMgkJcHNldWRvX3BhbGV0dGVbMTddOworCXUzMgkJcHNldWRvX3BhbGV0dGVbMTZdOwogCiAJc3RydWN0IHNpc2ZiX21vbml0b3IgewogCQl1MTYgaG1pbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMgYi9kcml2ZXJzL3ZpZGVvL3Npcy9zaXNfbWFpbi5jCmluZGV4IDkzZDA3ZWYuLmU4Y2NhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2lzL3Npc19tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9zaXMvc2lzX21haW4uYwpAQCAtMTQwNSwxMiArMTQwNSwxOCBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgMTY6CisJCWlmIChyZWdubyA+PSAxNikKKwkJCWJyZWFrOworCiAJCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KIAkJCQkocmVkICYgMHhmODAwKSAgICAgICAgICB8CiAJCQkJKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfAogCQkJCSgoYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOwogCQlicmVhazsKIAljYXNlIDMyOgorCQlpZiAocmVnbm8gPj0gMTYpCisJCQlicmVhazsKKwogCQlyZWQgPj49IDg7CiAJCWdyZWVuID4+PSA4OwogCQlibHVlID4+PSA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90Z2FmYi5jIGIvZHJpdmVycy92aWRlby90Z2FmYi5jCmluZGV4IDVjMGRhYjYuLjg5ZmFjYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdGdhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RnYWZiLmMKQEAgLTE2MzQsNyArMTYzNCw3IEBACiAJCSAgICAgIEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVCB8IEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUOwogCWluZm8tPmZib3BzID0gJnRnYWZiX29wczsKIAlpbmZvLT5zY3JlZW5fYmFzZSA9IHBhci0+dGdhX2ZiX2Jhc2U7Ci0JaW5mby0+cHNldWRvX3BhbGV0dGUgPSAodm9pZCAqKShwYXIgKyAxKTsKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBhci0+cGFsZXR0ZTsKIAogCS8qIFRoaXMgc2hvdWxkIGdpdmUgYSByZWFzb25hYmxlIGRlZmF1bHQgdmlkZW8gbW9kZS4gICovCiAJaWYgKHRnYV9idXNfcGNpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jIGIvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYwppbmRleCA1NWU4YWE0Li5jNjk5ODY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKQEAgLTk3Niw3ICs5NzYsNyBAQAogCQlyZXR1cm4gMTsKIAogCi0JaWYgKGJwcD09OCkgeworCWlmIChicHAgPT0gOCkgewogCQl0X291dGIoMHhGRiwweDNDNik7CiAJCXRfb3V0YihyZWdubywweDNDOCk7CiAKQEAgLTk4NCwxOSArOTg0LDIxIEBACiAJCXRfb3V0YihncmVlbj4+MTAsMHgzQzkpOwogCQl0X291dGIoYmx1ZT4+MTAsMHgzQzkpOwogCi0JfSBlbHNlIGlmIChicHAgPT0gMTYpIHsJLyogUkdCIDU2NSAqLwotCQl1MzIgY29sOworCX0gZWxzZSBpZiAocmVnbm8gPCAxNikgeworCQlpZiAoYnBwID09IDE2KSB7CS8qIFJHQiA1NjUgKi8KKwkJCXUzMiBjb2w7CiAKLQkJY29sID0gKHJlZCAmIDB4RjgwMCkgfCAoKGdyZWVuICYgMHhGQzAwKSA+PiA1KSB8Ci0JCQkoKGJsdWUgJiAweEY4MDApID4+IDExKTsKLQkJY29sIHw9IGNvbCA8PCAxNjsJCi0JCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gY29sOwotCX0gZWxzZSBpZiAoYnBwID09IDMyKQkJLyogQVJHQiA4ODg4ICovCi0JCSgodTMyKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0KLQkJCSgodHJhbnNwICYgMHhGRjAwKSA8PDE2KSAJfAotCQkJKChyZWQgJiAweEZGMDApIDw8IDgpIAkJfAotCQkJKChncmVlbiAmIDB4RkYwMCkpCQl8Ci0JCQkoKGJsdWUgJiAweEZGMDApPj44KTsKKwkJCWNvbCA9IChyZWQgJiAweEY4MDApIHwgKChncmVlbiAmIDB4RkMwMCkgPj4gNSkgfAorCQkJCSgoYmx1ZSAmIDB4RjgwMCkgPj4gMTEpOworCQkJY29sIHw9IGNvbCA8PCAxNjsKKwkJCSgodTMyICopKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0gY29sOworCQl9IGVsc2UgaWYgKGJwcCA9PSAzMikJCS8qIEFSR0IgODg4OCAqLworCQkJKCh1MzIqKWluZm8tPnBzZXVkb19wYWxldHRlKVtyZWdub10gPQorCQkJCSgodHJhbnNwICYgMHhGRjAwKSA8PDE2KSAJfAorCQkJCSgocmVkICYgMHhGRjAwKSA8PCA4KSAJCXwKKwkJCQkoKGdyZWVuICYgMHhGRjAwKSkJCXwKKwkJCQkoKGJsdWUgJiAweEZGMDApPj44KTsKKwl9CiAKIC8vCWRlYnVnKCJleGl0XG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vdHgzOTEyZmIuYyBiL2RyaXZlcnMvdmlkZW8vdHgzOTEyZmIuYwppbmRleCAwNzM4OWJhLi5lNmY3Yzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3R4MzkxMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby90eDM5MTJmYi5jCkBAIC0yOTEsNyArMjkxLDcgQEAKIAlmYl9pbmZvLmZib3BzID0gJnR4MzkxMmZiX29wczsKIAlmYl9pbmZvLnZhciA9IHR4MzkxMmZiX3ZhcjsKIAlmYl9pbmZvLmZpeCA9IHR4MzkxMmZiX2ZpeDsKLQlmYl9pbmZvLnBzZXVkb19wYWxldHRlID0gcHNldWRvX3BhbGV0dGU7CisJZmJfaW5mby5wc2V1ZG9fcGFsZXR0ZSA9IGNmYjg7CiAJZmJfaW5mby5mbGFncyA9IEZCSU5GT19ERUZBVUxUOwogCiAJLyogQ2xlYXIgdGhlIGZyYW1lYnVmZmVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL3Z0ODYyM2ZiLmMKaW5kZXggMzBjMGI5NC4uNGMzYTYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92dDg2MjNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdnQ4NjIzZmIuYwpAQCAtNjgsMjYgKzY4LDI2IEBACiAKIC8qIENSVCB0aW1pbmcgcmVnaXN0ZXIgc2V0cyAqLwogCi1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF90b3RhbF9yZWdzW10gICAgICAgPSB7ezB4MDAsIDAsIDd9LCB7MHgzNiwgMywgM30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2Rpc3BsYXlfcmVnc1tdICAgICA9IHt7MHgwMSwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2JsYW5rX3N0YXJ0X3JlZ3NbXSA9IHt7MHgwMiwgMCwgN30sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2JsYW5rX2VuZF9yZWdzW10gICA9IHt7MHgwMywgMCwgNH0sIHsweDA1LCA3LCA3fSwgezB4MzMsIDUsIDV9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9zeW5jX3N0YXJ0X3JlZ3NbXSAgPSB7ezB4MDQsIDAsIDd9LCB7MHgzMywgNCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX3N5bmNfZW5kX3JlZ3NbXSAgICA9IHt7MHgwNSwgMCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF90b3RhbF9yZWdzW10gICAgICAgPSB7ezB4MDAsIDAsIDd9LCB7MHgzNiwgMywgM30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfaF9kaXNwbGF5X3JlZ3NbXSAgICAgPSB7ezB4MDEsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfYmxhbmtfc3RhcnRfcmVnc1tdID0ge3sweDAyLCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19oX2JsYW5rX2VuZF9yZWdzW10gICA9IHt7MHgwMywgMCwgNH0sIHsweDA1LCA3LCA3fSwgezB4MzMsIDUsIDV9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfc3luY19zdGFydF9yZWdzW10gID0ge3sweDA0LCAwLCA3fSwgezB4MzMsIDQsIDR9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2hfc3luY19lbmRfcmVnc1tdICAgID0ge3sweDA1LCAwLCA0fSwgVkdBX1JFR1NFVF9FTkR9OwogCi1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl90b3RhbF9yZWdzW10gICAgICAgPSB7ezB4MDYsIDAsIDd9LCB7MHgwNywgMCwgMH0sIHsweDA3LCA1LCA1fSwgezB4MzUsIDAsIDB9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9kaXNwbGF5X3JlZ3NbXSAgICAgPSB7ezB4MTIsIDAsIDd9LCB7MHgwNywgMSwgMX0sIHsweDA3LCA2LCA2fSwgezB4MzUsIDIsIDJ9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9ibGFua19zdGFydF9yZWdzW10gPSB7ezB4MTUsIDAsIDd9LCB7MHgwNywgMywgM30sIHsweDA5LCA1LCA1fSwgezB4MzUsIDMsIDN9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9ibGFua19lbmRfcmVnc1tdICAgPSB7ezB4MTYsIDAsIDd9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9zeW5jX3N0YXJ0X3JlZ3NbXSAgPSB7ezB4MTAsIDAsIDd9LCB7MHgwNywgMiwgMn0sIHsweDA3LCA3LCA3fSwgezB4MzUsIDEsIDF9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9zeW5jX2VuZF9yZWdzW10gICAgPSB7ezB4MTEsIDAsIDN9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfdG90YWxfcmVnc1tdICAgICAgID0ge3sweDA2LCAwLCA3fSwgezB4MDcsIDAsIDB9LCB7MHgwNywgNSwgNX0sIHsweDM1LCAwLCAwfSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X2Rpc3BsYXlfcmVnc1tdICAgICA9IHt7MHgxMiwgMCwgN30sIHsweDA3LCAxLCAxfSwgezB4MDcsIDYsIDZ9LCB7MHgzNSwgMiwgMn0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9ibGFua19zdGFydF9yZWdzW10gPSB7ezB4MTUsIDAsIDd9LCB7MHgwNywgMywgM30sIHsweDA5LCA1LCA1fSwgezB4MzUsIDMsIDN9LCBWR0FfUkVHU0VUX0VORH07CitzdGF0aWMgc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX3ZfYmxhbmtfZW5kX3JlZ3NbXSAgID0ge3sweDE2LCAwLCA3fSwgVkdBX1JFR1NFVF9FTkR9Oworc3RhdGljIHN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM192X3N5bmNfc3RhcnRfcmVnc1tdICA9IHt7MHgxMCwgMCwgN30sIHsweDA3LCAyLCAyfSwgezB4MDcsIDcsIDd9LCB7MHgzNSwgMSwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfdl9zeW5jX2VuZF9yZWdzW10gICAgPSB7ezB4MTEsIDAsIDN9LCBWR0FfUkVHU0VUX0VORH07CiAKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19vZmZzZXRfcmVnc1tdICAgICAgICA9IHt7MHgxMywgMCwgN30sIHsweDM1LCA1LCA3fSwgVkdBX1JFR1NFVF9FTkR9Owotc3RydWN0IHZnYV9yZWdzZXQgdnQ4NjIzX2xpbmVfY29tcGFyZV9yZWdzW10gID0ge3sweDE4LCAwLCA3fSwgezB4MDcsIDQsIDR9LCB7MHgwOSwgNiwgNn0sIHsweDMzLCAwLCAyfSwgezB4MzUsIDQsIDR9LCBWR0FfUkVHU0VUX0VORH07Ci1zdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfZmV0Y2hfY291bnRfcmVnc1tdICAgPSB7ezB4MUMsIDAsIDd9LCB7MHgxRCwgMCwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKLXN0cnVjdCB2Z2FfcmVnc2V0IHZ0ODYyM19zdGFydF9hZGRyZXNzX3JlZ3NbXSA9IHt7MHgwZCwgMCwgN30sIHsweDBjLCAwLCA3fSwgezB4MzQsIDAsIDd9LCB7MHg0OCwgMCwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfb2Zmc2V0X3JlZ3NbXSAgICAgICAgPSB7ezB4MTMsIDAsIDd9LCB7MHgzNSwgNSwgN30sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfbGluZV9jb21wYXJlX3JlZ3NbXSAgPSB7ezB4MTgsIDAsIDd9LCB7MHgwNywgNCwgNH0sIHsweDA5LCA2LCA2fSwgezB4MzMsIDAsIDJ9LCB7MHgzNSwgNCwgNH0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfZmV0Y2hfY291bnRfcmVnc1tdICAgPSB7ezB4MUMsIDAsIDd9LCB7MHgxRCwgMCwgMX0sIFZHQV9SRUdTRVRfRU5EfTsKK3N0YXRpYyBzdHJ1Y3QgdmdhX3JlZ3NldCB2dDg2MjNfc3RhcnRfYWRkcmVzc19yZWdzW10gPSB7ezB4MGQsIDAsIDd9LCB7MHgwYywgMCwgN30sIHsweDM0LCAwLCA3fSwgezB4NDgsIDAsIDF9LCBWR0FfUkVHU0VUX0VORH07CiAKLXN0cnVjdCBzdmdhX3RpbWluZ19yZWdzIHZ0ODYyM190aW1pbmdfcmVncyAgICAgPSB7CitzdGF0aWMgc3RydWN0IHN2Z2FfdGltaW5nX3JlZ3MgdnQ4NjIzX3RpbWluZ19yZWdzICAgICA9IHsKIAl2dDg2MjNfaF90b3RhbF9yZWdzLCB2dDg2MjNfaF9kaXNwbGF5X3JlZ3MsIHZ0ODYyM19oX2JsYW5rX3N0YXJ0X3JlZ3MsCiAJdnQ4NjIzX2hfYmxhbmtfZW5kX3JlZ3MsIHZ0ODYyM19oX3N5bmNfc3RhcnRfcmVncywgdnQ4NjIzX2hfc3luY19lbmRfcmVncywKIAl2dDg2MjNfdl90b3RhbF9yZWdzLCB2dDg2MjNfdl9kaXNwbGF5X3JlZ3MsIHZ0ODYyM192X2JsYW5rX3N0YXJ0X3JlZ3MsCkBAIC05MDMsNyArOTAzLDcgQEAKIAogLyogRHJpdmVyIEluaXRpYWxpc2F0aW9uICovCiAKLWludCBfX2luaXQgdnQ4NjIzZmJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgdnQ4NjIzZmJfaW5pdCh2b2lkKQogewogCiAjaWZuZGVmIE1PRFVMRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9LY29uZmlnIGIvZHJpdmVycy93MS9LY29uZmlnCmluZGV4IGNhNzViM2EuLjY4NTRmZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL0tjb25maWcKQEAgLTEsOCArMSw2IEBACi1tZW51ICJEYWxsYXMncyAxLXdpcmUgYnVzIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBXMQorbWVudWNvbmZpZyBXMQogCXRyaXN0YXRlICJEYWxsYXMncyAxLXdpcmUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCS0tLWhlbHAtLS0KIAkgIERhbGxhcycgMS13aXJlIGJ1cyBpcyB1c2VmdWwgdG8gY29ubmVjdCBzbG93IDEtcGluIGRldmljZXMKIAkgIHN1Y2ggYXMgaUJ1dHRvbnMgYW5kIHRoZXJtYWwgc2Vuc29ycy4KQEAgLTEyLDggKzEwLDEwIEBACiAJICBUaGlzIFcxIHN1cHBvcnQgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgd2lyZS5rby4KIAoraWYgVzEKKwogY29uZmlnIFcxX0NPTgotCWRlcGVuZHMgb24gQ09OTkVDVE9SICYmIFcxCisJZGVwZW5kcyBvbiBDT05ORUNUT1IKIAlib29sICJVc2Vyc3BhY2UgY29tbXVuaWNhdGlvbiBvdmVyIGNvbm5lY3RvciIKIAlkZWZhdWx0IHkKIAktLS0gaGVscCAtLS0KQEAgLTI3LDQgKzI3LDQgQEAKIHNvdXJjZSBkcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwogc291cmNlIGRyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKIAotZW5kbWVudQorZW5kaWYgIyBXMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwppbmRleCA4Zjc3OTMzLi44MjM2ZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvS2NvbmZpZwpAQCAtMywxMSArMywxMCBAQAogIwogCiBtZW51ICIxLXdpcmUgQnVzIE1hc3RlcnMiCi0JZGVwZW5kcyBvbiBXMQogCiBjb25maWcgVzFfTUFTVEVSX01BVFJPWAogCXRyaXN0YXRlICJNYXRyb3ggRzQwMCB0cmFuc3BvcnQgbGF5ZXIgZm9yIDEtd2lyZSIKLQlkZXBlbmRzIG9uIFcxICYmIFBDSQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb21tdW5pY2F0ZSB3aXRoIHlvdXIgMS13aXJlIGRldmljZXMKIAkgIHVzaW5nIE1hdHJveCdzIEc0MDAgR1BJTyBwaW5zLgpAQCAtMTcsNyArMTYsNyBAQAogCiBjb25maWcgVzFfTUFTVEVSX0RTMjQ5MAogCXRyaXN0YXRlICJEUzI0OTAgVVNCIDwtPiBXMSB0cmFuc3BvcnQgbGF5ZXIgZm9yIDEtd2lyZSIKLSAgCWRlcGVuZHMgb24gVzEgJiYgVVNCCisgIAlkZXBlbmRzIG9uIFVTQgogICAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZHJpdmVyIGZvciBEUzI0OTAgYmFzZWQgVVNCIDwtPiBXMSBicmlkZ2VzLAogCSAgZm9yIGV4YW1wbGUgRFM5NDkwKi4KQEAgLTI3LDcgKzI2LDcgQEAKIAogY29uZmlnIFcxX01BU1RFUl9EUzI0ODIKIAl0cmlzdGF0ZSAiTWF4aW0gRFMyNDgyIEkyQyB0byAxLVdpcmUgYnJpZGdlIgotCWRlcGVuZHMgb24gSTJDICYmIFcxICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgTWF4aW0gRFMyNDgyCiAJICBJMkMgdG8gMS1XaXJlIGJyaWRnZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCmluZGV4IGRmOTVkNmMuLjNkZjI5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwpAQCAtMywyNSArMywyMSBAQAogIwogCiBtZW51ICIxLXdpcmUgU2xhdmVzIgotCWRlcGVuZHMgb24gVzEKIAogY29uZmlnIFcxX1NMQVZFX1RIRVJNCiAJdHJpc3RhdGUgIlRoZXJtYWwgZmFtaWx5IGltcGxlbWVudGF0aW9uIgotCWRlcGVuZHMgb24gVzEKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgMS13aXJlIHRoZXJtYWwgc2Vuc29ycyB0byB5b3VyCiAJICB3aXJlLgogCiBjb25maWcgVzFfU0xBVkVfU01FTQogCXRyaXN0YXRlICJTaW1wbGUgNjRiaXQgbWVtb3J5IGZhbWlseSBpbXBsZW1lbnRhdGlvbiIKLQlkZXBlbmRzIG9uIFcxCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IDEtd2lyZQogCSAgc2ltcGxlIDY0Yml0IG1lbW9yeSByb20oZHMyNDAxL2RzMjQxMS9kczE5OTAqKSB0byB5b3VyIHdpcmUuCiAKIGNvbmZpZyBXMV9TTEFWRV9EUzI0MzMKIAl0cmlzdGF0ZSAiNGtiIEVFUFJPTSBmYW1pbHkgc3VwcG9ydCAoRFMyNDMzKSIKLQlkZXBlbmRzIG9uIFcxCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSAxLXdpcmUKIAkgIDRrYiBFRVBST00gZmFtaWx5IGRldmljZSAoRFMyNDMzKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCBmNWM1Yjc2Li5jNjMzMjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC04MDUsNiArODA1LDcgQEAKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsICpuOwogCWludCBoYXZlX3RvX3dhaXQgPSAwOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpIHx8IGhhdmVfdG9fd2FpdCkgewogCQloYXZlX3RvX3dhaXQgPSAwOwogCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCA5NGI5ZDg2Li42MTNkZjU1IDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTk5MSw3ICs5OTEsNyBAQAogCiBjb25maWcgSFVHRVRMQkZTCiAJYm9vbCAiSHVnZVRMQiBmaWxlIHN5c3RlbSBzdXBwb3J0IgotCWRlcGVuZHMgb24gWDg2IHx8IElBNjQgfHwgUFBDNjQgfHwgU1BBUkM2NCB8fCBTVVBFUkggfHwgQlJPS0VOCisJZGVwZW5kcyBvbiBYODYgfHwgSUE2NCB8fCBQUEM2NCB8fCBTUEFSQzY0IHx8IChTVVBFUkggJiYgTU1VKSB8fCBCUk9LRU4KIAloZWxwCiAJICBodWdldGxiZnMgaXMgYSBmaWxlc3lzdGVtIGJhY2tpbmcgZm9yIEh1Z2VUTEIgcGFnZXMsIGJhc2VkIG9uCiAJICByYW1mcy4gRm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IGl0LCBzYXkgWSBoZXJlIGFuZCByZWFkCkBAIC0xNjc1LDYgKzE2NzUsNyBAQAogY29uZmlnIE5GU0RfVjQKIAlib29sICJQcm92aWRlIE5GU3Y0IHNlcnZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gTkZTRF9WMyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgUlBDU0VDX0dTU19LUkI1CiAJaGVscAogCSAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5jbHVkZSB0aGUgTkZTdjQgc2VydmVyIGFzIHdlbGwgYXMgdGhlIE5GU3YyCiAJICBhbmQgTkZTdjMgc2VydmVycywgc2F5IFkgaGVyZS4gIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwsIGFuZApkaWZmIC0tZ2l0IGEvZnMvYWZzL01ha2VmaWxlIGIvZnMvYWZzL01ha2VmaWxlCmluZGV4IDczY2U1NjEuLmE2NjY3MTAgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9NYWtlZmlsZQorKysgYi9mcy9hZnMvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBACiAJY21zZXJ2aWNlLm8gXAogCWRpci5vIFwKIAlmaWxlLm8gXAorCWZsb2NrLm8gXAogCWZzY2xpZW50Lm8gXAogCWlub2RlLm8gXAogCW1haW4ubyBcCmRpZmYgLS1naXQgYS9mcy9hZnMvYWZzLmggYi9mcy9hZnMvYWZzLmgKaW5kZXggMjQ1MjU3OS4uYzU0OGFhMyAxMDA2NDQKLS0tIGEvZnMvYWZzL2Fmcy5oCisrKyBiL2ZzL2Fmcy9hZnMuaApAQCAtMzcsNiArMzcsMTMgQEAKIAlBRlNfRlRZUEVfU1lNTElOSwk9IDMsCiB9IGFmc19maWxlX3R5cGVfdDsKIAordHlwZWRlZiBlbnVtIHsKKwlBRlNfTE9DS19SRUFECQk9IDAsCS8qIHJlYWQgbG9jayByZXF1ZXN0ICovCisJQUZTX0xPQ0tfV1JJVEUJCT0gMSwJLyogd3JpdGUgbG9jayByZXF1ZXN0ICovCit9IGFmc19sb2NrX3R5cGVfdDsKKworI2RlZmluZSBBRlNfTE9DS1dBSVQJCSg1ICogNjApIC8qIHRpbWUgdW50aWwgYSBsb2NrIHRpbWVzIG91dCAoc2Vjb25kcykgKi8KKwogLyoKICAqIEFGUyBmaWxlIGlkZW50aWZpZXIKICAqLwpAQCAtMTIwLDYgKzEyNyw3IEBACiAJc3RydWN0IGFmc19maWQJCXBhcmVudDsJCS8qIHBhcmVudCBkaXIgSUQgZm9yIG5vbi1kaXJzIG9ubHkgKi8KIAl0aW1lX3QJCQltdGltZV9jbGllbnQ7CS8qIGxhc3QgdGltZSBjbGllbnQgY2hhbmdlZCBkYXRhICovCiAJdGltZV90CQkJbXRpbWVfc2VydmVyOwkvKiBsYXN0IHRpbWUgc2VydmVyIGNoYW5nZWQgZGF0YSAqLworCXMzMgkJCWxvY2tfY291bnQ7CS8qIGZpbGUgbG9jayBjb3VudCAoMD1VTkxLIC0xPVdSTENLICt2ZT0jUkRMQ0sgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9hZnMvYWZzX2ZzLmggYi9mcy9hZnMvYWZzX2ZzLmgKaW5kZXggYTE4YzM3NC4uZWI2NDczMiAxMDA2NDQKLS0tIGEvZnMvYWZzL2Fmc19mcy5oCisrKyBiL2ZzL2Fmcy9hZnNfZnMuaApAQCAtMzEsNiArMzEsOSBAQAogCUZTR0VUVk9MVU1FSU5GTwkJPSAxNDgsCS8qIEFGUyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB2b2x1bWUgKi8KIAlGU0dFVFZPTFVNRVNUQVRVUwk9IDE0OSwJLyogQUZTIEdldCB2b2x1bWUgc3RhdHVzIGluZm9ybWF0aW9uICovCiAJRlNHRVRST09UVk9MVU1FCQk9IDE1MSwJLyogQUZTIEdldCByb290IHZvbHVtZSBuYW1lICovCisJRlNTRVRMT0NLCQk9IDE1NiwJLyogQUZTIFJlcXVlc3QgYSBmaWxlIGxvY2sgKi8KKwlGU0VYVEVORExPQ0sJCT0gMTU3LAkvKiBBRlMgRXh0ZW5kIGEgZmlsZSBsb2NrICovCisJRlNSRUxFQVNFTE9DSwkJPSAxNTgsCS8qIEFGUyBSZWxlYXNlIGEgZmlsZSBsb2NrICovCiAJRlNMT09LVVAJCT0gMTYxLAkvKiBBRlMgbG9va3VwIGZpbGUgaW4gZGlyZWN0b3J5ICovCiAJRlNGRVRDSERBVEE2NAkJPSA2NTUzNywgLyogQUZTIEZldGNoIGZpbGUgZGF0YSAqLwogCUZTU1RPUkVEQVRBNjQJCT0gNjU1MzgsIC8qIEFGUyBTdG9yZSBmaWxlIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jYWxsYmFjay5jIGIvZnMvYWZzL2NhbGxiYWNrLmMKaW5kZXggYmFjZjUxOC4uYjgyNDM5NCAxMDA2NDQKLS0tIGEvZnMvYWZzL2NhbGxiYWNrLmMKKysrIGIvZnMvYWZzL2NhbGxiYWNrLmMKQEAgLTEyNSw2ICsxMjUsOSBAQAogCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKIAogCQlxdWV1ZV93b3JrKGFmc19jYWxsYmFja191cGRhdGVfd29ya2VyLCAmdm5vZGUtPmNiX2Jyb2tlbl93b3JrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSAmJgorCQkgICAgIWxpc3RfZW1wdHkoJnZub2RlLT5wZW5kaW5nX2xvY2tzKSkKKwkJCWFmc19sb2NrX21heV9iZV9hdmFpbGFibGUodm5vZGUpOwogCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwogCX0KIH0KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwppbmRleCA1NDZjNTk1Li4zM2ZlMzlhIDEwMDY0NAotLS0gYS9mcy9hZnMvZGlyLmMKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC00NCw2ICs0NCw3IEBACiAJLm9wZW4JCT0gYWZzX2Rpcl9vcGVuLAogCS5yZWxlYXNlCT0gYWZzX3JlbGVhc2UsCiAJLnJlYWRkaXIJPSBhZnNfcmVhZGRpciwKKwkubG9jawkJPSBhZnNfbG9jaywKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9maWxlLmMgYi9mcy9hZnMvZmlsZS5jCmluZGV4IGFlZGU3ZWIuLjUyNWY3YzUgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9maWxlLmMKKysrIGIvZnMvYWZzL2ZpbGUuYwpAQCAtMzQsNiArMzQsOCBAQAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuZnN5bmMJCT0gYWZzX2ZzeW5jLAorCS5sb2NrCQk9IGFmc19sb2NrLAorCS5mbG9jawkJPSBhZnNfZmxvY2ssCiB9OwogCiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Zsb2NrLmMgYi9mcy9hZnMvZmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA3ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Zsb2NrLmMKQEAgLTAsMCArMSw1NTggQEAKKy8qIEFGUyBmaWxlIGxvY2tpbmcgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEFGU19MT0NLX0dSQU5URUQJMAorI2RlZmluZSBBRlNfTE9DS19QRU5ESU5HCTEKKworc3RhdGljIHZvaWQgYWZzX2ZsX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKTsKK3N0YXRpYyB2b2lkIGFmc19mbF9yZWxlYXNlX3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqZmwpOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFmc19sb2NrX21hbmFnZXI7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX29wZXJhdGlvbnMgYWZzX2xvY2tfb3BzID0geworCS5mbF9jb3B5X2xvY2sJCT0gYWZzX2ZsX2NvcHlfbG9jaywKKwkuZmxfcmVsZWFzZV9wcml2YXRlCT0gYWZzX2ZsX3JlbGVhc2VfcHJpdmF0ZSwKK307CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBsb2NrIG1hbmFnZXIgdGhyZWFkIGlmIGl0IGlzbid0IGFscmVhZHkgcnVubmluZworICovCitzdGF0aWMgaW50IGFmc19pbml0X2xvY2tfbWFuYWdlcih2b2lkKQoreworCWlmICghYWZzX2xvY2tfbWFuYWdlcikgeworCQlhZnNfbG9ja19tYW5hZ2VyID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfbG9ja2QiKTsKKwkJaWYgKCFhZnNfbG9ja19tYW5hZ2VyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCisvKgorICogZGVzdHJveSB0aGUgbG9jayBtYW5hZ2VyIHRocmVhZCBpZiBpdCdzIHJ1bm5pbmcKKyAqLwordm9pZCBfX2V4aXQgYWZzX2tpbGxfbG9ja19tYW5hZ2VyKHZvaWQpCit7CisJaWYgKGFmc19sb2NrX21hbmFnZXIpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc19sb2NrX21hbmFnZXIpOworfQorCisvKgorICogaWYgdGhlIGNhbGxiYWNrIGlzIGJyb2tlbiBvbiB0aGlzIHZub2RlLCB0aGVuIHRoZSBsb2NrIG1heSBub3cgYmUgYXZhaWxhYmxlCisgKi8KK3ZvaWQgYWZzX2xvY2tfbWF5X2JlX2F2YWlsYWJsZShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlfZW50ZXIoInsleDoldX0iLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX2xvY2tfbWFuYWdlciwgJnZub2RlLT5sb2NrX3dvcmssIDApOworfQorCisvKgorICogdGhlIGxvY2sgd2lsbCB0aW1lIG91dCBpbiA1IG1pbnV0ZXMgdW5sZXNzIHdlIGV4dGVuZCBpdCwgc28gc2NoZWR1bGUKKyAqIGV4dGVuc2lvbiBpbiBhIGJpdCBsZXNzIHRoYW4gdGhhdCB0aW1lCisgKi8KK3N0YXRpYyB2b2lkIGFmc19zY2hlZHVsZV9sb2NrX2V4dGVuc2lvbihzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWZzX2xvY2tfbWFuYWdlciwgJnZub2RlLT5sb2NrX3dvcmssCisJCQkgICBBRlNfTE9DS1dBSVQgKiBIWiAvIDIpOworfQorCisvKgorICogZG8gd29yayBmb3IgYSBsb2NrLCBpbmNsdWRpbmc6CisgKiAtIHByb2JpbmcgZm9yIGEgbG9jayB3ZSdyZSB3YWl0aW5nIG9uIGJ1dCBkaWRuJ3QgZ2V0IGltbWVkaWF0ZWx5CisgKiAtIGV4dGVuZGluZyBhIGxvY2sgdGhhdCdzIGNsb3NlIHRvIHRpbWluZyBvdXQKKyAqLwordm9pZCBhZnNfbG9ja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX3Zub2RlLCBsb2NrX3dvcmsud29yayk7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJYWZzX2xvY2tfdHlwZV90IHR5cGU7CisJc3RydWN0IGtleSAqa2V5OworCWludCByZXQ7CisKKwlfZW50ZXIoInsleDoldX0iLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCWlmICh0ZXN0X2JpdChBRlNfVk5PREVfVU5MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKSkgeworCQlfZGVidWcoInVubG9jayIpOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCS8qIGF0dGVtcHQgdG8gcmVsZWFzZSB0aGUgc2VydmVyIGxvY2s7IGlmIGl0IGZhaWxzLCB3ZSBqdXN0CisJCSAqIHdhaXQgNSBtaW51dGVzIGFuZCBpdCdsbCB0aW1lIG91dCBhbnl3YXkgKi8KKwkJcmV0ID0gYWZzX3Zub2RlX3JlbGVhc2VfbG9jayh2bm9kZSwgdm5vZGUtPnVubG9ja19rZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGUzoiCisJCQkgICAgICAgIiBGYWlsZWQgdG8gcmVsZWFzZSBsb2NrIG9uIHsleDoleH0gZXJyb3IgJWRcbiIsCisJCQkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHJldCk7CisKKwkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCWtleV9wdXQodm5vZGUtPnVubG9ja19rZXkpOworCQl2bm9kZS0+dW5sb2NrX2tleSA9IE5VTEw7CisJCWNsZWFyX2JpdChBRlNfVk5PREVfVU5MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwl9CisKKwkvKiBpZiB3ZSd2ZSBnb3QgYSBsb2NrLCB0aGVuIGl0IG11c3QgYmUgdGltZSB0byBleHRlbmQgdGhhdCBsb2NrIGFzIEFGUworCSAqIGxvY2tzIHRpbWUgb3V0IGFmdGVyIDUgbWludXRlcyAqLworCWlmICghbGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKSB7CisJCV9kZWJ1ZygiZXh0ZW5kIik7CisKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKQorCQkJQlVHKCk7CisJCWZsID0gbGlzdF9lbnRyeSh2bm9kZS0+Z3JhbnRlZF9sb2Nrcy5uZXh0LAorCQkJCXN0cnVjdCBmaWxlX2xvY2ssIGZsX3UuYWZzLmxpbmspOworCQlrZXkgPSBrZXlfZ2V0KGZsLT5mbF9maWxlLT5wcml2YXRlX2RhdGEpOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCXJldCA9IGFmc192bm9kZV9leHRlbmRfbG9jayh2bm9kZSwga2V5KTsKKwkJY2xlYXJfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwkJa2V5X3B1dChrZXkpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCQlhZnNfc2NoZWR1bGVfbG9ja19leHRlbnNpb24odm5vZGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB1bW1tLi4uIHdlIGZhaWxlZCB0byBleHRlbmQgdGhlIGxvY2sgLSByZXRyeQorCQkJICogZXh0ZW5zaW9uIHNob3J0bHkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGUzoiCisJCQkgICAgICAgIiBGYWlsZWQgdG8gZXh0ZW5kIGxvY2sgb24geyV4OiV4fSBlcnJvciAlZFxuIiwKKwkJCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgcmV0KTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhhZnNfbG9ja19tYW5hZ2VyLCAmdm5vZGUtPmxvY2tfd29yaywKKwkJCQkJICAgSFogKiAxMCk7CisJCQlicmVhazsKKwkJfQorCQlfbGVhdmUoIiBbZXh0ZW5kXSIpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgd2UgZG9uJ3QgaGF2ZSBhIGdyYW50ZWQgbG9jaywgdGhlbiB3ZSBtdXN0J3ZlIGJlZW4gY2FsbGVkIGJhY2sgYnkKKwkgKiB0aGUgc2VydmVyLCBhbmQgc28gaWYgbWlnaHQgYmUgcG9zc2libGUgdG8gZ2V0IGEgbG9jayB3ZSdyZQorCSAqIGN1cnJlbnRseSB3YWl0aW5nIGZvciAqLworCWlmICghbGlzdF9lbXB0eSgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpKSB7CisJCV9kZWJ1ZygiZ2V0Iik7CisKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKQorCQkJQlVHKCk7CisJCWZsID0gbGlzdF9lbnRyeSh2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0LAorCQkJCXN0cnVjdCBmaWxlX2xvY2ssIGZsX3UuYWZzLmxpbmspOworCQlrZXkgPSBrZXlfZ2V0KGZsLT5mbF9maWxlLT5wcml2YXRlX2RhdGEpOworCQl0eXBlID0gKGZsLT5mbF90eXBlID09IEZfUkRMQ0spID8KKwkJCUFGU19MT0NLX1JFQUQgOiBBRlNfTE9DS19XUklURTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCQlyZXQgPSBhZnNfdm5vZGVfc2V0X2xvY2sodm5vZGUsIGtleSwgdHlwZSk7CisJCWNsZWFyX2JpdChBRlNfVk5PREVfTE9DS0lORywgJnZub2RlLT5mbGFncyk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgLUVXT1VMREJMT0NLOgorCQkJX2RlYnVnKCJibG9ja2VkIik7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJX2RlYnVnKCJhY3F1aXJlZCIpOworCQkJaWYgKHR5cGUgPT0gQUZTX0xPQ0tfUkVBRCkKKwkJCQlzZXRfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCWVsc2UKKwkJCQlzZXRfYml0KEFGU19WTk9ERV9XUklURUxPQ0tFRCwgJnZub2RlLT5mbGFncyk7CisJCQlyZXQgPSBBRlNfTE9DS19HUkFOVEVEOworCQlkZWZhdWx0OgorCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkvKiB0aGUgcGVuZGluZyBsb2NrIG1heSBoYXZlIGJlZW4gd2l0aGRyYXduIGR1ZSB0byBhCisJCQkgKiBzaWduYWwgKi8KKwkJCWlmIChsaXN0X2VudHJ5KHZub2RlLT5wZW5kaW5nX2xvY2tzLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBmaWxlX2xvY2ssIGZsX3UuYWZzLmxpbmspID09IGZsKSB7CisJCQkJZmwtPmZsX3UuYWZzLnN0YXRlID0gcmV0OworCQkJCWlmIChyZXQgPT0gQUZTX0xPQ0tfR1JBTlRFRCkKKwkJCQkJbGlzdF9tb3ZlX3RhaWwoJmZsLT5mbF91LmFmcy5saW5rLAorCQkJCQkJICAgICAgICZ2bm9kZS0+Z3JhbnRlZF9sb2Nrcyk7CisJCQkJZWxzZQorCQkJCQlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfdS5hZnMubGluayk7CisJCQkJd2FrZV91cCgmZmwtPmZsX3dhaXQpOworCQkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQl9IGVsc2UgeworCQkJCV9kZWJ1Zygid2l0aGRyYXduIik7CisJCQkJY2xlYXJfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQUZTX1ZOT0RFX1dSSVRFTE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwkJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJCWFmc192bm9kZV9yZWxlYXNlX2xvY2sodm5vZGUsIGtleSk7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZ2bm9kZS0+cGVuZGluZ19sb2NrcykpCisJCQkJCWFmc19sb2NrX21heV9iZV9hdmFpbGFibGUodm5vZGUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJa2V5X3B1dChrZXkpOworCQlfbGVhdmUoIiBbcGVuZF0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGxvb2tzIGxpa2UgdGhlIGxvY2sgcmVxdWVzdCB3YXMgd2l0aGRyYXduIG9uIGEgc2lnbmFsICovCisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlfbGVhdmUoIiBbbm8gbG9ja3NdIik7Cit9CisKKy8qCisgKiBwYXNzIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgdW5sb2NraW5nIG9mIGEgdm5vZGUgb24gdGhlIHNlcnZlciB0byB0aGUKKyAqIG1hbmFnZXIgdGhyZWFkLCBsZXN0IGEgcGVuZGluZyBzaWduYWwgaW4gdGhlIGNhbGxpbmcgdGhyZWFkIGludGVycnVwdAorICogQUZfUlhSUEMKKyAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHZub2RlIGxvY2sKKyAqLworc3RhdGljIHZvaWQgYWZzX2RlZmVyX3VubG9jayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5KQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnZub2RlLT5sb2NrX3dvcmspOworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKSAmJgorCSAgICAhdGVzdF9hbmRfY2xlYXJfYml0KEFGU19WTk9ERV9XUklURUxPQ0tFRCwgJnZub2RlLT5mbGFncykpCisJCUJVRygpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KEFGU19WTk9ERV9VTkxPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpKQorCQlCVUcoKTsKKwl2bm9kZS0+dW5sb2NrX2tleSA9IGtleV9nZXQoa2V5KTsKKwlhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHZub2RlKTsKK30KKworLyoKKyAqIHJlcXVlc3QgYSBsb2NrIG9uIGEgZmlsZSBvbiB0aGUgc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RvX3NldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGZpbGUtPmZfbWFwcGluZy0+aG9zdCk7CisJYWZzX2xvY2tfdHlwZV90IHR5cGU7CisJc3RydWN0IGtleSAqa2V5ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwlfZW50ZXIoInsleDoldX0sJXUiLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgZmwtPmZsX3R5cGUpOworCisJLyogb25seSB3aG9sZS1maWxlIGxvY2tzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoZmwtPmZsX3N0YXJ0ICE9IDAgfHwgZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFmc19pbml0X2xvY2tfbWFuYWdlcigpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZmwtPmZsX29wcyA9ICZhZnNfbG9ja19vcHM7CisJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwlmbC0+ZmxfdS5hZnMuc3RhdGUgPSBBRlNfTE9DS19QRU5ESU5HOworCisJdHlwZSA9IChmbC0+ZmxfdHlwZSA9PSBGX1JETENLKSA/IEFGU19MT0NLX1JFQUQgOiBBRlNfTE9DS19XUklURTsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiBtYWtlIHN1cmUgd2UndmUgZ290IGEgY2FsbGJhY2sgb24gdGhpcyBmaWxlIGFuZCB0aGF0IG91ciB2aWV3IG9mIHRoZQorCSAqIGRhdGEgdmVyc2lvbiBpcyB1cCB0byBkYXRlICovCisJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyh2bm9kZSwgTlVMTCwga2V5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmICh2bm9kZS0+c3RhdHVzLmxvY2tfY291bnQgIT0gMCAmJiAhKGZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGVycm9yOworCX0KKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5wZW5kaW5nX2xvY2tzKSkgeworCQkvKiBpZiB0aGVyZSdzIG5vLW9uZSBlbHNlIHdpdGggYSBsb2NrIG9uIHRoaXMgdm5vZGUsIHRoZW4gd2UKKwkJICogbmVlZCB0byBhc2sgdGhlIHNlcnZlciBmb3IgYSBsb2NrICovCisJCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpIHsKKwkJCV9kZWJ1Zygibm90IGxvY2tlZCIpOworCQkJQVNTRVJUQ01QKHZub2RlLT5mbGFncyAmCisJCQkJICAoKDEgPDwgQUZTX1ZOT0RFX0xPQ0tJTkcpIHwKKwkJCQkgICAoMSA8PCBBRlNfVk5PREVfUkVBRExPQ0tFRCkgfAorCQkJCSAgICgxIDw8IEFGU19WTk9ERV9XUklURUxPQ0tFRCkpLCA9PSwgMCk7CisJCQlsaXN0X2FkZF90YWlsKCZmbC0+ZmxfdS5hZnMubGluaywgJnZub2RlLT5wZW5kaW5nX2xvY2tzKTsKKwkJCXNldF9iaXQoQUZTX1ZOT0RFX0xPQ0tJTkcsICZ2bm9kZS0+ZmxhZ3MpOworCQkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCQkJcmV0ID0gYWZzX3Zub2RlX3NldF9sb2NrKHZub2RlLCBrZXksIHR5cGUpOworCQkJY2xlYXJfYml0KEFGU19WTk9ERV9MT0NLSU5HLCAmdm5vZGUtPmZsYWdzKTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CisJCQkJZ290byBhY3F1aXJlZF9zZXJ2ZXJfbG9jazsKKwkJCWNhc2UgLUVXT1VMREJMT0NLOgorCQkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQkJCUFTU0VSVChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpOworCQkJCUFTU0VSVENNUCh2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0LCA9PSwKKwkJCQkJICAmZmwtPmZsX3UuYWZzLmxpbmspOworCQkJCWdvdG8gd2FpdDsKKwkJCWRlZmF1bHQ6CisJCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCQkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCisJCS8qIGlmIHdlJ3ZlIGFscmVhZHkgZ290IGEgcmVhZGxvY2sgb24gdGhlIHNlcnZlciBhbmQgbm8gd2FpdGluZworCQkgKiB3cml0ZWxvY2tzLCB0aGVuIHdlIG1pZ2h0IGJlIGFibGUgdG8gaW5zdGFudGx5IGdyYW50IGFub3RoZXIKKwkJICogcmVhZGxvY2sgKi8KKwkJaWYgKHR5cGUgPT0gQUZTX0xPQ0tfUkVBRCAmJgorCQkgICAgdm5vZGUtPmZsYWdzICYgKDEgPDwgQUZTX1ZOT0RFX1JFQURMT0NLRUQpKSB7CisJCQlfZGVidWcoImluc3RhbnQgcmVhZGxvY2siKTsKKwkJCUFTU0VSVENNUCh2bm9kZS0+ZmxhZ3MgJgorCQkJCSAgKCgxIDw8IEFGU19WTk9ERV9MT0NLSU5HKSB8CisJCQkJICAgKDEgPDwgQUZTX1ZOT0RFX1dSSVRFTE9DS0VEKSksID09LCAwKTsKKwkJCUFTU0VSVCghbGlzdF9lbXB0eSgmdm5vZGUtPmdyYW50ZWRfbG9ja3MpKTsKKwkJCWdvdG8gc2hhcmluZ19leGlzdGluZ19sb2NrOworCQl9CisJfQorCisJLyogb3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGEgbG9jYWwgbG9jayB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJX2RlYnVnKCJ3YWl0IGxvY2FsIik7CisJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UuYWZzLmxpbmssICZ2bm9kZS0+cGVuZGluZ19sb2Nrcyk7Cit3YWl0OgorCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSkgeworCQlfZGVidWcoIm5vYmxvY2siKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBhYm9ydF9hdHRlbXB0OworCX0KKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJLyogbm93IHdlIG5lZWQgdG8gc2xlZXAgYW5kIHdhaXQgZm9yIHRoZSBsb2NrIG1hbmFnZXIgdGhyZWFkIHRvIGdldCB0aGUKKwkgKiBsb2NrIGZyb20gdGhlIHNlcnZlciAqLworCV9kZWJ1Zygic2xlZXAiKTsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmwtPmZsX3dhaXQsCisJCQkJICAgICAgIGZsLT5mbF91LmFmcy5zdGF0ZSA8PSBBRlNfTE9DS19HUkFOVEVEKTsKKwlpZiAoZmwtPmZsX3UuYWZzLnN0YXRlIDw9IEFGU19MT0NLX0dSQU5URUQpIHsKKwkJcmV0ID0gZmwtPmZsX3UuYWZzLnN0YXRlOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCQlnb3RvIGdpdmVuX2xvY2s7CisJfQorCisJLyogd2Ugd2VyZSBpbnRlcnJ1cHRlZCwgYnV0IHNvbWVvbmUgbWF5IHN0aWxsIGJlIGluIHRoZSB0aHJvZXMgb2YKKwkgKiBnaXZpbmcgdXMgdGhlIGxvY2sgKi8KKwlfZGVidWcoImludHIiKTsKKwlBU1NFUlRDTVAocmV0LCA9PSwgLUVSRVNUQVJUU1lTKTsKKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCWlmIChmbC0+ZmxfdS5hZnMuc3RhdGUgPD0gQUZTX0xPQ0tfR1JBTlRFRCkgeworCQlyZXQgPSBmbC0+ZmxfdS5hZnMuc3RhdGU7CisJCWlmIChyZXQgPCAwKSB7CisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlnb3RvIGdpdmVuX2xvY2s7CisJfQorCithYm9ydF9hdHRlbXB0OgorCS8qIHdlIGFyZW4ndCBnb2luZyB0byBnZXQgdGhlIGxvY2ssIGVpdGhlciBiZWNhdXNlIHdlJ3JlIHVud2lsbGluZyB0bworCSAqIHdhaXQsIG9yIGJlY2F1c2Ugc29tZSBzaWduYWwgaGFwcGVuZWQgKi8KKwlfZGVidWcoImFib3J0Iik7CisJaWYgKGxpc3RfZW1wdHkoJnZub2RlLT5ncmFudGVkX2xvY2tzKSAmJgorCSAgICB2bm9kZS0+cGVuZGluZ19sb2Nrcy5uZXh0ID09ICZmbC0+ZmxfdS5hZnMubGluaykgeworCQlpZiAodm5vZGUtPnBlbmRpbmdfbG9ja3MucHJldiAhPSAmZmwtPmZsX3UuYWZzLmxpbmspIHsKKwkJCS8qIGtpY2sgdGhlIG5leHQgcGVuZGluZyBsb2NrIGludG8gaGF2aW5nIGEgZ28gKi8KKwkJCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKKwkJCWFmc19sb2NrX21heV9iZV9hdmFpbGFibGUodm5vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCX0KKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCWdvdG8gZXJyb3I7CisKK2FjcXVpcmVkX3NlcnZlcl9sb2NrOgorCS8qIHdlJ3ZlIGFjcXVpcmVkIGEgc2VydmVyIGxvY2ssIGJ1dCBpdCBuZWVkcyB0byBiZSByZW5ld2VkIGFmdGVyIDUKKwkgKiBtaW5zICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJYWZzX3NjaGVkdWxlX2xvY2tfZXh0ZW5zaW9uKHZub2RlKTsKKwlpZiAodHlwZSA9PSBBRlNfTE9DS19SRUFEKQorCQlzZXRfYml0KEFGU19WTk9ERV9SRUFETE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKKwllbHNlCisJCXNldF9iaXQoQUZTX1ZOT0RFX1dSSVRFTE9DS0VELCAmdm5vZGUtPmZsYWdzKTsKK3NoYXJpbmdfZXhpc3RpbmdfbG9jazoKKwkvKiB0aGUgbG9jayBoYXMgYmVlbiBncmFudGVkIGFzIGZhciBhcyB3ZSdyZSBjb25jZXJuZWQuLi4gKi8KKwlmbC0+ZmxfdS5hZnMuc3RhdGUgPSBBRlNfTE9DS19HUkFOVEVEOworCWxpc3RfbW92ZV90YWlsKCZmbC0+ZmxfdS5hZnMubGluaywgJnZub2RlLT5ncmFudGVkX2xvY2tzKTsKK2dpdmVuX2xvY2s6CisJLyogLi4uIGJ1dCB3ZSBkbyBzdGlsbCBuZWVkIHRvIGdldCB0aGUgVkZTJ3MgYmxlc3NpbmcgKi8KKwlBU1NFUlQoISh2bm9kZS0+ZmxhZ3MgJiAoMSA8PCBBRlNfVk5PREVfTE9DS0lORykpKTsKKwlBU1NFUlQoKHZub2RlLT5mbGFncyAmICgoMSA8PCBBRlNfVk5PREVfUkVBRExPQ0tFRCkgfAorCQkJCSgxIDw8IEFGU19WTk9ERV9XUklURUxPQ0tFRCkpKSAhPSAwKTsKKwlyZXQgPSBwb3NpeF9sb2NrX2ZpbGUoZmlsZSwgZmwsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHZmc19yZWplY3RlZF9sb2NrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkvKiBhZ2FpbiwgbWFrZSBzdXJlIHdlJ3ZlIGdvdCBhIGNhbGxiYWNrIG9uIHRoaXMgZmlsZSBhbmQsIGFnYWluLCBtYWtlCisJICogc3VyZSB0aGF0IG91ciB2aWV3IG9mIHRoZSBkYXRhIHZlcnNpb24gaXMgdXAgdG8gZGF0ZSAod2UgaWdub3JlCisJICogZXJyb3JzIGluY3VycmVkIGhlcmUgYW5kIGRlYWwgd2l0aCB0aGUgY29uc2VxdWVuY2VzIGVsc2V3aGVyZSkgKi8KKwlhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCitlcnJvcjoKKwl1bmxvY2tfa2VybmVsKCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKwordmZzX3JlamVjdGVkX2xvY2s6CisJLyogdGhlIFZGUyByZWplY3RlZCB0aGUgbG9jayB3ZSBqdXN0IG9idGFpbmVkLCBzbyB3ZSBoYXZlIHRvIGRpc2NhcmQKKwkgKiB3aGF0IHdlIGp1c3QgZ290ICovCisJX2RlYnVnKCJ2ZnMgcmVmdXNlZCAlZCIsIHJldCk7CisJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UuYWZzLmxpbmspOworCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpCisJCWFmc19kZWZlcl91bmxvY2sodm5vZGUsIGtleSk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlnb3RvIGFib3J0X2F0dGVtcHQ7Cit9CisKKy8qCisgKiB1bmxvY2sgb24gYSBmaWxlIG9uIHRoZSBzZXJ2ZXIKKyAqLworc3RhdGljIGludCBhZnNfZG9fdW5sayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCXN0cnVjdCBrZXkgKmtleSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JXg6JXV9LCV1Iiwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGZsLT5mbF90eXBlKTsKKworCS8qIG9ubHkgd2hvbGUtZmlsZSB1bmxvY2tzIGFyZSBzdXBwb3J0ZWQgKi8KKwlpZiAoZmwtPmZsX3N0YXJ0ICE9IDAgfHwgZmwtPmZsX2VuZCAhPSBPRkZTRVRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZsLT5mbF9vcHMgPSAmYWZzX2xvY2tfb3BzOworCUlOSVRfTElTVF9IRUFEKCZmbC0+ZmxfdS5hZnMubGluayk7CisJZmwtPmZsX3UuYWZzLnN0YXRlID0gQUZTX0xPQ0tfUEVORElORzsKKworCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCXJldCA9IHBvc2l4X2xvY2tfZmlsZShmaWxlLCBmbCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJX2xlYXZlKCIgPSAlZCBbdmZzXSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZGlzY2FyZCB0aGUgc2VydmVyIGxvY2sgb25seSBpZiBhbGwgZ3JhbnRlZCBsb2NrcyBhcmUgZ29uZSAqLworCWlmIChsaXN0X2VtcHR5KCZ2bm9kZS0+Z3JhbnRlZF9sb2NrcykpCisJCWFmc19kZWZlcl91bmxvY2sodm5vZGUsIGtleSk7CisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIGxvY2sgd2UgY3VycmVudGx5IGhvbGQsIGlmIGluZGVlZCB3ZSBob2xkIG9uZQorICovCitzdGF0aWMgaW50IGFmc19kb19nZXRsayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOworCXN0cnVjdCBrZXkgKmtleSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0LCBsb2NrX2NvdW50OworCisJX2VudGVyKCIiKTsKKworCWZsLT5mbF90eXBlID0gRl9VTkxDSzsKKworCW11dGV4X2xvY2soJnZub2RlLT52ZnNfaW5vZGUuaV9tdXRleCk7CisKKwkvKiBjaGVjayBsb2NhbCBsb2NrIHJlY29yZHMgZmlyc3QgKi8KKwlyZXQgPSAwOworCWlmIChwb3NpeF90ZXN0X2xvY2soZmlsZSwgZmwpID09IDApIHsKKwkJLyogbm8gbG9jYWwgbG9ja3M7IGNvbnN1bHQgdGhlIHNlcnZlciAqLworCQlyZXQgPSBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHZub2RlLCBOVUxMLCBrZXkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWxvY2tfY291bnQgPSB2bm9kZS0+c3RhdHVzLmxvY2tfY291bnQ7CisJCWlmIChsb2NrX2NvdW50KSB7CisJCQlpZiAobG9ja19jb3VudCA+IDApCisJCQkJZmwtPmZsX3R5cGUgPSBGX1JETENLOworCQkJZWxzZQorCQkJCWZsLT5mbF90eXBlID0gRl9XUkxDSzsKKwkJCWZsLT5mbF9zdGFydCA9IDA7CisJCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkJfQorCX0KKworZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZ2bm9kZS0+dmZzX2lub2RlLmlfbXV0ZXgpOworCV9sZWF2ZSgiID0gJWQgWyVoZF0iLCByZXQsIGZsLT5mbF90eXBlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbWFuYWdlIFBPU0lYIGxvY2tzIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJX2VudGVyKCJ7JXg6JXV9LCVkLHt0PSV4LGZsPSV4LHI9JUxkOiVMZH0iLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSwgY21kLAorCSAgICAgICBmbC0+ZmxfdHlwZSwgZmwtPmZsX2ZsYWdzLAorCSAgICAgICAobG9uZyBsb25nKSBmbC0+Zmxfc3RhcnQsIChsb25nIGxvbmcpIGZsLT5mbF9lbmQpOworCisJLyogQUZTIGRvZXNuJ3Qgc3VwcG9ydCBtYW5kYXRvcnkgbG9ja3MgKi8KKwlpZiAoKHZub2RlLT52ZnNfaW5vZGUuaV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCAmJgorCSAgICBmbC0+ZmxfdHlwZSAhPSBGX1VOTENLKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCWlmIChJU19HRVRMSyhjbWQpKQorCQlyZXR1cm4gYWZzX2RvX2dldGxrKGZpbGUsIGZsKTsKKwlpZiAoZmwtPmZsX3R5cGUgPT0gRl9VTkxDSykKKwkJcmV0dXJuIGFmc19kb191bmxrKGZpbGUsIGZsKTsKKwlyZXR1cm4gYWZzX2RvX3NldGxrKGZpbGUsIGZsKTsKK30KKworLyoKKyAqIG1hbmFnZSBGTE9DSyBsb2NrcyBvbiBhIGZpbGUKKyAqLworaW50IGFmc19mbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwlfZW50ZXIoInsleDoldX0sJWQse3Q9JXgsZmw9JXh9IiwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIGNtZCwKKwkgICAgICAgZmwtPmZsX3R5cGUsIGZsLT5mbF9mbGFncyk7CisKKwkvKgorCSAqIE5vIEJTRCBmbG9ja3Mgb3ZlciBORlMgYWxsb3dlZC4KKwkgKiBOb3RlOiB3ZSBjb3VsZCB0cnkgdG8gZmFrZSBhIFBPU0lYIGxvY2sgcmVxdWVzdCBoZXJlIGJ5CisJICogdXNpbmcgKCh1MzIpIGZpbHAgfCAweDgwMDAwMDAwKSBvciBzb21lIHN1Y2ggYXMgdGhlIHBpZC4KKwkgKiBOb3Qgc3VyZSB3aGV0aGVyIHRoYXQgd291bGQgYmUgdW5pcXVlLCB0aG91Z2gsIG9yIHdoZXRoZXIKKwkgKiB0aGF0IHdvdWxkIGJyZWFrIGluIG90aGVyIHBsYWNlcy4KKwkgKi8KKwlpZiAoIShmbC0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykpCisJCXJldHVybiAtRU5PTENLOworCisJLyogd2UncmUgc2ltdWxhdGluZyBmbG9jaygpIGxvY2tzIHVzaW5nIHBvc2l4IGxvY2tzIG9uIHRoZSBzZXJ2ZXIgKi8KKwlmbC0+Zmxfb3duZXIgPSAoZmxfb3duZXJfdCkgZmlsZTsKKwlmbC0+Zmxfc3RhcnQgPSAwOworCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCisJaWYgKGZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiBhZnNfZG9fdW5sayhmaWxlLCBmbCk7CisJcmV0dXJuIGFmc19kb19zZXRsayhmaWxlLCBmbCk7Cit9CisKKy8qCisgKiB0aGUgUE9TSVggbG9jayBtYW5hZ2VtZW50IGNvcmUgVkZTIGNvZGUgY29waWVzIHRoZSBsb2NrIHJlY29yZCBhbmQgYWRkcyB0aGUKKyAqIGNvcHkgaW50byBpdHMgb3duIGxpc3QsIHNvIHdlIG5lZWQgdG8gYWRkIHRoYXQgY29weSB0byB0aGUgdm5vZGUncyBsb2NrCisgKiBxdWV1ZSBpbiB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgb3JpZ2luYWwgKHdoaWNoIHdpbGwgYmUgZGVsZXRlZCBzaG9ydGx5CisgKiBhZnRlcikKKyAqLworc3RhdGljIHZvaWQgYWZzX2ZsX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCV9lbnRlcigiIik7CisKKwlsaXN0X2FkZCgmbmV3LT5mbF91LmFmcy5saW5rLCAmZmwtPmZsX3UuYWZzLmxpbmspOworfQorCisvKgorICogbmVlZCB0byByZW1vdmUgdGhpcyBsb2NrIGZyb20gdGhlIHZub2RlIHF1ZXVlIHdoZW4gaXQncyByZW1vdmVkIGZyb20gdGhlCisgKiBWRlMncyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGFmc19mbF9yZWxlYXNlX3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJX2VudGVyKCIiKTsKKworCWxpc3RfZGVsX2luaXQoJmZsLT5mbF91LmFmcy5saW5rKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mc2NsaWVudC5jIGIvZnMvYWZzL2ZzY2xpZW50LmMKaW5kZXggNWRmZjEzMC4uMDIzYjk1YiAxMDA2NDQKLS0tIGEvZnMvYWZzL2ZzY2xpZW50LmMKKysrIGIvZnMvYWZzL2ZzY2xpZW50LmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlFWFRSQUNUKHN0YXR1cy0+Z3JvdXApOwogCWJwKys7IC8qIHN5bmMgY291bnRlciAqLwogCWRhdGFfdmVyc2lvbiB8PSAodTY0KSBudG9obCgqYnArKykgPDwgMzI7Ci0JYnArKzsgLyogbG9jayBjb3VudCAqLworCUVYVFJBQ1Qoc3RhdHVzLT5sb2NrX2NvdW50KTsKIAlzaXplIHw9ICh1NjQpIG50b2hsKCpicCsrKSA8PCAzMjsKIAlicCsrOyAvKiBzcGFyZSA0ICovCiAJKl9icCA9IGJwOwpAQCAtMTc0OCwzICsxNzQ4LDE1NiBAQAogCiAJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7CiB9CisKKy8qCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU2V0TG9jaywgRlMuRXh0ZW5kTG9jayBvciBGUy5SZWxlYXNlTG9jaworICovCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3sKKwljb25zdCBfX2JlMzIgKmJwOworCisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisKKwlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKKwlpZiAoIWxhc3QpCisJCXJldHVybiAwOworCisJaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQorCQlyZXR1cm4gLUVCQURNU0c7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLworCWJwID0gY2FsbC0+YnVmZmVyOworCS8qIHhkcl9kZWNvZGVfQUZTVm9sU3luYygmYnAsIGNhbGwtPnJlcGx5WCk7ICovCisKKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGUy5TZXRMb2NrIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU1NldExvY2sgPSB7CisJLm5hbWUJCT0gIkZTLlNldExvY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBGUy5FeHRlbmRMb2NrIG9wZXJhdGlvbiB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSBhZnNfUlhGU0V4dGVuZExvY2sgPSB7CisJLm5hbWUJCT0gIkZTLkV4dGVuZExvY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBGUy5SZWxlYXNlTG9jayBvcGVyYXRpb24gdHlwZQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgYWZzX1JYRlNSZWxlYXNlTG9jayA9IHsKKwkubmFtZQkJPSAiRlMuUmVsZWFzZUxvY2siLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfeHh4eF9sb2NrLAorCS5hYm9ydF90b19lcnJvcgk9IGFmc19hYm9ydF90b19lcnJvciwKKwkuZGVzdHJ1Y3Rvcgk9IGFmc19mbGF0X2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBnZXQgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX2ZzX3NldF9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgICBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJICAgIGFmc19sb2NrX3R5cGVfdCB0eXBlLAorCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJX19iZTMyICpicDsKKworCV9lbnRlcigiIik7CisKKwljYWxsID0gYWZzX2FsbG9jX2ZsYXRfY2FsbCgmYWZzX1JYRlNTZXRMb2NrLCA1ICogNCwgNiAqIDQpOworCWlmICghY2FsbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYWxsLT5rZXkgPSBrZXk7CisJY2FsbC0+cmVwbHkgPSB2bm9kZTsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJKmJwKysgPSBodG9ubChGU1NFVExPQ0spOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisJKmJwKysgPSBodG9ubCh0eXBlKTsKKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQorCisvKgorICogZXh0ZW5kIGEgbG9jayBvbiBhIGZpbGUKKyAqLworaW50IGFmc19mc19leHRlbmRfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgc3RydWN0IGtleSAqa2V5LAorCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqd2FpdF9tb2RlKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbDsKKwlfX2JlMzIgKmJwOworCisJX2VudGVyKCIiKTsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU0V4dGVuZExvY2ssIDQgKiA0LCA2ICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTRVhURU5ETE9DSyk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnZub2RlKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudW5pcXVlKTsKKworCXJldHVybiBhZnNfbWFrZV9jYWxsKCZzZXJ2ZXItPmFkZHIsIGNhbGwsIEdGUF9OT0ZTLCB3YWl0X21vZGUpOworfQorCisvKgorICogcmVsZWFzZSBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfZnNfcmVsZWFzZV9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQlzdHJ1Y3Qga2V5ICprZXksCisJCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGUpCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsOworCV9fYmUzMiAqYnA7CisKKwlfZW50ZXIoIiIpOworCisJY2FsbCA9IGFmc19hbGxvY19mbGF0X2NhbGwoJmFmc19SWEZTUmVsZWFzZUxvY2ssIDQgKiA0LCA2ICogNCk7CisJaWYgKCFjYWxsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnNlcnZpY2VfaWQgPSBGU19TRVJWSUNFOworCWNhbGwtPnBvcnQgPSBodG9ucyhBRlNfRlNfUE9SVCk7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gY2FsbC0+cmVxdWVzdDsKKwkqYnArKyA9IGh0b25sKEZTUkVMRUFTRUxPQ0spOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52aWQpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC52bm9kZSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+ZmlkLnVuaXF1ZSk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggMmM1NWRkOS4uNjMwNjQzOCAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTM1MSwxMCArMzUxLDE4IEBACiAjZGVmaW5lIEFGU19WTk9ERV9aQVBfREFUQQkzCQkvKiBzZXQgaWYgdm5vZGUncyBkYXRhIHNob3VsZCBiZSBpbnZhbGlkYXRlZCAqLwogI2RlZmluZSBBRlNfVk5PREVfREVMRVRFRAk0CQkvKiBzZXQgaWYgdm5vZGUgZGVsZXRlZCBvbiBzZXJ2ZXIgKi8KICNkZWZpbmUgQUZTX1ZOT0RFX01PVU5UUE9JTlQJNQkJLyogc2V0IGlmIHZub2RlIGlzIGEgbW91bnRwb2ludCBzeW1saW5rICovCisjZGVmaW5lIEFGU19WTk9ERV9MT0NLSU5HCTYJCS8qIHNldCBpZiB3YWl0aW5nIGZvciBsb2NrIG9uIHZub2RlICovCisjZGVmaW5lIEFGU19WTk9ERV9SRUFETE9DS0VECTcJCS8qIHNldCBpZiB2bm9kZSBpcyByZWFkLWxvY2tlZCBvbiB0aGUgc2VydmVyICovCisjZGVmaW5lIEFGU19WTk9ERV9XUklURUxPQ0tFRAk4CQkvKiBzZXQgaWYgdm5vZGUgaXMgd3JpdGUtbG9ja2VkIG9uIHRoZSBzZXJ2ZXIgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX1VOTE9DS0lORwk5CQkvKiBzZXQgaWYgdm5vZGUgaXMgYmVpbmcgdW5sb2NrZWQgb24gdGhlIHNlcnZlciAqLwogCiAJbG9uZwkJCWFjbF9vcmRlcjsJLyogQUNMIGNoZWNrIGNvdW50IChjYWxsYmFjayBicmVhayBjb3VudCkgKi8KIAogCXN0cnVjdCBsaXN0X2hlYWQJd3JpdGViYWNrczsJLyogYWx0ZXJhdGlvbnMgaW4gcGFnZWNhY2hlIHRoYXQgbmVlZCB3cml0aW5nICovCisJc3RydWN0IGxpc3RfaGVhZAlwZW5kaW5nX2xvY2tzOwkvKiBsb2NrcyB3YWl0aW5nIHRvIGJlIGdyYW50ZWQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWdyYW50ZWRfbG9ja3M7CS8qIGxvY2tzIGdyYW50ZWQgb24gdGhpcyBmaWxlICovCisJc3RydWN0IGRlbGF5ZWRfd29yawlsb2NrX3dvcms7CS8qIHdvcmsgdG8gYmUgZG9uZSBpbiBsb2NraW5nICovCisJc3RydWN0IGtleQkJKnVubG9ja19rZXk7CS8qIGtleSB0byBiZSB1c2VkIGluIHVubG9ja2luZyAqLwogCiAJLyogb3V0c3RhbmRpbmcgY2FsbGJhY2sgbm90aWZpY2F0aW9uIG9uIHRoaXMgZmlsZSAqLwogCXN0cnVjdCByYl9ub2RlCQlzZXJ2ZXJfcmI7CS8qIGxpbmsgaW4gc2VydmVyLT5mc192bm9kZXMgKi8KQEAgLTQ3NCw2ICs0ODIsMTUgQEAKIGV4dGVybiBpbnQgYWZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogCiAvKgorICogZmxvY2suYworICovCitleHRlcm4gdm9pZCBfX2V4aXQgYWZzX2tpbGxfbG9ja19tYW5hZ2VyKHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2xvY2tfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBhZnNfbG9ja19tYXlfYmVfYXZhaWxhYmxlKHN0cnVjdCBhZnNfdm5vZGUgKik7CitleHRlcm4gaW50IGFmc19sb2NrKHN0cnVjdCBmaWxlICosIGludCwgc3RydWN0IGZpbGVfbG9jayAqKTsKK2V4dGVybiBpbnQgYWZzX2Zsb2NrKHN0cnVjdCBmaWxlICosIGludCwgc3RydWN0IGZpbGVfbG9jayAqKTsKKworLyoKICAqIGZzY2xpZW50LmMKICAqLwogZXh0ZXJuIGludCBhZnNfZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLApAQCAtNTEzLDYgKzUzMCwxNSBAQAogCQkJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICosCiAJCQkJICAgIHN0cnVjdCBhZnNfdm9sdW1lX3N0YXR1cyAqLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3NldF9sb2NrKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCSAgIHN0cnVjdCBhZnNfdm5vZGUgKiwgYWZzX2xvY2tfdHlwZV90LAorCQkJICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CitleHRlcm4gaW50IGFmc19mc19leHRlbmRfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgICAgICBzdHJ1Y3QgYWZzX3Zub2RlICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3NlcnZlciAqLCBzdHJ1Y3Qga2V5ICosCisJCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOwogCiAvKgogICogaW5vZGUuYwpAQCAtNjgxLDYgKzcwNywxMCBAQAogZXh0ZXJuIGludCBhZnNfdm5vZGVfc2V0YXR0cihzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgc3RydWN0IGlhdHRyICopOwogZXh0ZXJuIGludCBhZnNfdm5vZGVfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICosCiAJCQkJICAgICAgIHN0cnVjdCBhZnNfdm9sdW1lX3N0YXR1cyAqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX3NldF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqLAorCQkJICAgICAgYWZzX2xvY2tfdHlwZV90KTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2V4dGVuZF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKiwgc3RydWN0IGtleSAqKTsKK2V4dGVybiBpbnQgYWZzX3Zub2RlX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKik7CiAKIC8qCiAgKiB2b2x1bWUuYwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggY2QyMTE5NS4uMGY2MGY2YiAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0xNjgsNiArMTY4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSB1bnJlZ2lzdGVyaW5nLlxuIik7CiAKIAlhZnNfZnNfZXhpdCgpOworCWFmc19raWxsX2xvY2tfbWFuYWdlcigpOwogCWFmc19jbG9zZV9zb2NrZXQoKTsKIAlhZnNfcHVyZ2Vfc2VydmVycygpOwogCWFmc19jYWxsYmFja191cGRhdGVfa2lsbCgpOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21pc2MuYyBiL2ZzL2Fmcy9taXNjLmMKaW5kZXggZDFhODg5Yy4uMmQzM2E1ZiAxMDA2NDQKLS0tIGEvZnMvYWZzL21pc2MuYworKysgYi9mcy9hZnMvbWlzYy5jCkBAIC0zNSw2ICszNSw3IEBACiAJY2FzZSBWT1ZFUlFVT1RBOglyZXR1cm4gLUVEUVVPVDsKIAljYXNlIFZCVVNZOgkJcmV0dXJuIC1FQlVTWTsKIAljYXNlIFZNT1ZFRDoJCXJldHVybiAtRU5YSU87CisJY2FzZSAweDJmNmRmMGE6CQlyZXR1cm4gLUVXT1VMREJMT0NLOwogCWNhc2UgMHgyZjZkZjBjOgkJcmV0dXJuIC1FQUNDRVM7CiAJY2FzZSAweDJmNmRmMGY6CQlyZXR1cm4gLUVCVVNZOwogCWNhc2UgMHgyZjZkZjEwOgkJcmV0dXJuIC1FRVhJU1Q7CmRpZmYgLS1naXQgYS9mcy9hZnMvcHJvYy5jIGIvZnMvYWZzL3Byb2MuYwppbmRleCAxM2RmNTEyLi42ZWRiNTY2IDEwMDY0NAotLS0gYS9mcy9hZnMvcHJvYy5jCisrKyBiL2ZzL2Fmcy9wcm9jLmMKQEAgLTIwMSwyMyArMjAxLDkgQEAKICAqLwogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKLQogCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KIAlkb3duX3JlYWQoJmFmc19wcm9jX2NlbGxzX3NlbSk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiAodm9pZCAqKSAxOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJmFmc19wcm9jX2NlbGxzKQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZhZnNfcHJvY19jZWxscywgKl9wb3MpOwogfQogCiAvKgpAQCAtMjI1LDE0ICsyMTEsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSB2ID09ICh2b2lkICopIDEgPyBhZnNfcHJvY19jZWxscy5uZXh0IDogX3AtPm5leHQ7Ci0KLQlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZhZnNfcHJvY19jZWxscywgcG9zKTsKIH0KIAogLyoKQEAgLTI1MCw3ICsyMjksNyBAQAogewogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IGxpc3RfZW50cnkodiwgc3RydWN0IGFmc19jZWxsLCBwcm9jX2xpbmspOwogCi0JaWYgKHYgPT0gKHZvaWQgKikgMSkgeworCWlmICh2ID09ICZhZnNfcHJvY19jZWxscykgewogCQkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KIAkJc2VxX3B1dHMobSwgIlVTRSBOQU1FXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC01MDMsMjYgKzQ4MiwxMyBAQAogICovCiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7Ci0JbG9mZl90IHBvcyA9ICpfcG9zOwogCiAJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CiAKIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJZG93bl9yZWFkKCZjZWxsLT52bF9zZW0pOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gKHZvaWQgKikgMTsKLQlwb3MtLTsKLQotCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2goX3AsICZjZWxsLT52bF9saXN0KQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJmNlbGwtPnZsX2xpc3QsICpfcG9zKTsKIH0KIAogLyoKQEAgLTUzMSwxNyArNDk3LDEwIEBACiBzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LAogCQkJCQlsb2ZmX3QgKl9wb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7CiAJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKIAogCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOwotCi0JKCpfcG9zKSsrOwotCi0JX3AgPSB2OwotCV9wID0gKHYgPT0gKHZvaWQgKikgMSkgPyBjZWxsLT52bF9saXN0Lm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiAoX3AgIT0gJmNlbGwtPnZsX2xpc3QpID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZjZWxsLT52bF9saXN0LCBfcG9zKTsKIH0KIAogLyoKQEAgLTU2OSwxMSArNTI4LDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogeworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9CiAJCWxpc3RfZW50cnkodiwgc3RydWN0IGFmc192bG9jYXRpb24sIGxpbmspOwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gKHZvaWQgKikgMSkgeworCWlmICh2ID09ICZjZWxsLT52bF9saXN0KSB7CiAJCXNlcV9wdXRzKG0sICJVU0UgU1RUIFZMSURbMF0gIFZMSURbMV0gIFZMSURbMl0gIE5BTUVcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC03MzQsMjYgKzY5NCwxMyBAQAogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIAlfX2FjcXVpcmVzKG0tPnByaXZhdGUtPnNlcnZlcnNfbG9jaykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKIAlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKIAogCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOwogCiAJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLwogCXJlYWRfbG9jaygmY2VsbC0+c2VydmVyc19sb2NrKTsKLQotCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KLQlpZiAoIXBvcykKLQkJcmV0dXJuICh2b2lkICopIDE7Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmY2VsbC0+c2VydmVycykKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZjZWxsLT5zZXJ2ZXJzLCAqX3Bvcyk7CiB9CiAKIC8qCkBAIC03NjIsMTcgKzcwOSwxMCBAQAogc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKIAkJCQkJbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwogCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CiAKIAlfZW50ZXIoImNlbGw9JXAgcG9zPSVMZCIsIGNlbGwsICpfcG9zKTsKLQotCSgqX3BvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9IHYgPT0gKHZvaWQgKikgMSA/IGNlbGwtPnNlcnZlcnMubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZjZWxsLT5zZXJ2ZXJzID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZjZWxsLT5zZXJ2ZXJzLCBfcG9zKTsKIH0KIAogLyoKQEAgLTc5MSwxMSArNzMxLDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogeworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IGxpc3RfZW50cnkodiwgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOwogCWNoYXIgaXBhZGRyWzIwXTsKIAogCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLwotCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwlpZiAodiA9PSAmY2VsbC0+c2VydmVycykgewogCQlzZXFfcHV0cyhtLCAiVVNFIEFERFIgICAgICAgICAgICBTVEFURVxuIik7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zdXBlci5jIGIvZnMvYWZzL3N1cGVyLmMKaW5kZXggMmU4NDk2Yi4uOTkzY2RmMSAxMDA2NDQKLS0tIGEvZnMvYWZzL3N1cGVyLmMKKysrIGIvZnMvYWZzL3N1cGVyLmMKQEAgLTQ2MCw2ICs0NjAsOSBAQAogCXNwaW5fbG9ja19pbml0KCZ2bm9kZS0+d3JpdGViYWNrX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZ2bm9kZS0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT53cml0ZWJhY2tzKTsKKwlJTklUX0xJU1RfSEVBRCgmdm5vZGUtPnBlbmRpbmdfbG9ja3MpOworCUlOSVRfTElTVF9IRUFEKCZ2bm9kZS0+Z3JhbnRlZF9sb2Nrcyk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnZub2RlLT5sb2NrX3dvcmssIGFmc19sb2NrX3dvcmspOwogCUlOSVRfV09SSygmdm5vZGUtPmNiX2Jyb2tlbl93b3JrLCBhZnNfYnJva2VuX2NhbGxiYWNrX3dvcmspOwogfQogCmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuYyBiL2ZzL2Fmcy92bm9kZS5jCmluZGV4IDIzMmM1NWQuLjJmMDVjNGYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bm9kZS5jCisrKyBiL2ZzL2Fmcy92bm9kZS5jCkBAIC01NjEsNyArNTYxLDcgQEAKIC8qCiAgKiBjcmVhdGUgYSBoYXJkIGxpbmsKICAqLwotZXh0ZXJuIGludCBhZnNfdm5vZGVfbGluayhzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUsIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAoraW50IGFmc192bm9kZV9saW5rKHN0cnVjdCBhZnNfdm5vZGUgKmR2bm9kZSwgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCiAJCQkgIHN0cnVjdCBrZXkgKmtleSwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwpAQCAtODg3LDExICs4ODcsNiBAQAogCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKIAkgICAgICAga2V5X3NlcmlhbChrZXkpKTsKIAotCS8qIHRoaXMgb3Agd2lsbCBmZXRjaCB0aGUgc3RhdHVzICovCi0Jc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0Jdm5vZGUtPnVwZGF0ZV9jbnQrKzsKLQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwotCiAJZG8gewogCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCiAJCXNlcnZlciA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlKTsKQEAgLTkwNSwyMCArOTAwLDEyNyBAQAogCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKIAogCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KLQlpZiAocmV0ID09IDApIHsKLQkJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlcik7CisJaWYgKHJldCA9PSAwKQogCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOwotCX0gZWxzZSB7Ci0JCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZCh2bm9kZSwgcmV0KTsKLQl9CiAKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogCiBub19zZXJ2ZXI6Ci0Jc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7Ci0Jdm5vZGUtPnVwZGF0ZV9jbnQtLTsKLQlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKLQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CisKKy8qCisgKiBnZXQgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX3Zub2RlX3NldF9sb2NrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXksCisJCSAgICAgICBhZnNfbG9ja190eXBlX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV4OiV1LiV1fSwleCwldSIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSwgdHlwZSk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19zZXRfbG9jayhzZXJ2ZXIsIGtleSwgdm5vZGUsIHR5cGUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKworLyoKKyAqIGV4dGVuZCBhIGxvY2sgb24gYSBmaWxlCisgKi8KK2ludCBhZnNfdm5vZGVfZXh0ZW5kX2xvY2soc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIHN0cnVjdCBrZXkgKmtleSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV4OiV1LiV1fSwleCIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUsCisJICAgICAgIGtleV9zZXJpYWwoa2V5KSk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19leHRlbmRfbG9jayhzZXJ2ZXIsIGtleSwgdm5vZGUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKK30KKworLyoKKyAqIHJlbGVhc2UgYSBsb2NrIG9uIGEgZmlsZQorICovCitpbnQgYWZzX3Zub2RlX3JlbGVhc2VfbG9jayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwgc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXN7JXg6JXUuJXV9LCV4IiwKKwkgICAgICAgdm5vZGUtPnZvbHVtZS0+dmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZub2RlLT5maWQudmlkLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+ZmlkLnVuaXF1ZSwKKwkgICAgICAga2V5X3NlcmlhbChrZXkpKTsKKworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlzZXJ2ZXIgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZSk7CisJCWlmIChJU19FUlIoc2VydmVyKSkKKwkJCWdvdG8gbm9fc2VydmVyOworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX2ZzX3JlbGVhc2VfbG9jayhzZXJ2ZXIsIGtleSwgdm5vZGUsICZhZnNfc3luY19jYWxsKTsKKworCX0gd2hpbGUgKCFhZnNfdm9sdW1lX3JlbGVhc2VfZmlsZXNlcnZlcih2bm9kZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlpZiAocmV0ID09IDApCisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CiAJcmV0dXJuIFBUUl9FUlIoc2VydmVyKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2Fub25faW5vZGVzLmMgYi9mcy9hbm9uX2lub2Rlcy5jCmluZGV4IGVkYzY3NDguLmI0YTc1ODggMTAwNjQ0Ci0tLSBhL2ZzL2Fub25faW5vZGVzLmMKKysrIGIvZnMvYW5vbl9pbm9kZXMuYwpAQCAtNTMsNyArNTMsNyBAQAogfTsKIAogLyoqCi0gKiBhbm9uX2lub2RlX2dldGZkIC0gY3JlYXRlcyBhIG5ldyBmaWxlIGluc3RhbmNlIGJ5IGhvb2tpbmcgaXQgdXAgdG8gYW5kCisgKiBhbm9uX2lub2RlX2dldGZkIC0gY3JlYXRlcyBhIG5ldyBmaWxlIGluc3RhbmNlIGJ5IGhvb2tpbmcgaXQgdXAgdG8gYW4KICAqICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXMgaW5vZGUsIGFuZCBhIGRlbnRyeSB0aGF0IGRlc2NyaWJlIHRoZSAiY2xhc3MiCiAgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUKICAqCkBAIC02Niw3ICs2Niw3IEBACiAgKgogICogQ3JlYXRlcyBhIG5ldyBmaWxlIGJ5IGhvb2tpbmcgaXQgb24gYSBzaW5nbGUgaW5vZGUuIFRoaXMgaXMgdXNlZnVsIGZvciBmaWxlcwogICogdGhhdCBkbyBub3QgbmVlZCB0byBoYXZlIGEgZnVsbC1mbGVkZ2VkIGlub2RlIGluIG9yZGVyIHRvIG9wZXJhdGUgY29ycmVjdGx5LgotICogQWxsIHRoZSBmaWxlcyBjcmVhdGVkIHdpdGggYW5vbl9pbm9kZV9nZXRmZCgpIHdpbGwgc2hhcmUgYSBzaW5nbGUgaW5vZGUsIGJ5CisgKiBBbGwgdGhlIGZpbGVzIGNyZWF0ZWQgd2l0aCBhbm9uX2lub2RlX2dldGZkKCkgd2lsbCBzaGFyZSBhIHNpbmdsZSBpbm9kZSwKICAqIGhlbmNlIHNhdmluZyBtZW1vcnkgYW5kIGF2b2lkaW5nIGNvZGUgZHVwbGljYXRpb24gZm9yIHRoZSBmaWxlL2lub2RlL2RlbnRyeQogICogc2V0dXAuCiAgKi8KQEAgLTE0Miw5ICsxNDIsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYW5vbl9pbm9kZV9nZXRmZCk7CiAKIC8qCi0gKiBBIHNpbmdsZSBpbm9kZSBleGlzdCBmb3IgYWxsIGFub25faW5vZGUgZmlsZXMuIENvbnRyYXJ5IHRvIHBpcGVzLAotICogYW5vbl9pbm9kZSBpbm9kZXMgaGFzIG5vIHBlci1pbnN0YW5jZSBkYXRhIGFzc29jaWF0ZWQsIHNvIHdlIGNhbiBhdm9pZAotICogdGhlIGFsbG9jYXRpb24gb2YgbXVsdGlwbGUgb2YgdGhlbS4KKyAqIEEgc2luZ2xlIGlub2RlIGV4aXN0cyBmb3IgYWxsIGFub25faW5vZGUgZmlsZXMuIENvbnRyYXJ5IHRvIHBpcGVzLAorICogYW5vbl9pbm9kZSBpbm9kZXMgaGF2ZSBubyBhc3NvY2lhdGVkIHBlci1pbnN0YW5jZSBkYXRhLCBzbyB3ZSBuZWVkCisgKiBvbmx5IGFsbG9jYXRlIG9uZSBvZiB0aGVtLgogICovCiBzdGF0aWMgc3RydWN0IGlub2RlICphbm9uX2lub2RlX21raW5vZGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCAwOGU0NDE0Li5hMjdlNDJiIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC00NSw3ICs0NSw3IEBACiAKIHN0YXRpYyBpbnQgbG9hZF9lbGZfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyBpbnQgbG9hZF9lbGZfbGlicmFyeShzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBlbGZfcGhkciAqLCBpbnQsIGludCk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfbWFwIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgZWxmX3BoZHIgKiwgaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCiAvKgogICogSWYgd2UgZG9uJ3Qgc3VwcG9ydCBjb3JlIGR1bXBpbmcsIHRoZW4gc3VwcGx5IGEgTlVMTCBzbyB3ZQpAQCAtODAsNyArODAsNyBAQAogCQkuaGFzdmRzbwk9IDEKIH07CiAKLSNkZWZpbmUgQkFEX0FERFIoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSA+PSBUQVNLX1NJWkUpCisjZGVmaW5lIEJBRF9BRERSKHgpIElTX0VSUl9WQUxVRSh4KQogCiBzdGF0aWMgaW50IHNldF9icmsodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CkBAIC0yODUsMzMgKzI4NSw3MCBAQAogI2lmbmRlZiBlbGZfbWFwCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSkKKwkJc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlLAorCQl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXBfYWRkcjsKLQl1bnNpZ25lZCBsb25nIHBhZ2VvZmZzZXQgPSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcik7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZXBwbnQtPnBfZmlsZXN6ICsgRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpOworCXVuc2lnbmVkIGxvbmcgb2ZmID0gZXBwbnQtPnBfb2Zmc2V0IC0gRUxGX1BBR0VPRkZTRVQoZXBwbnQtPnBfdmFkZHIpOworCWFkZHIgPSBFTEZfUEFHRVNUQVJUKGFkZHIpOworCXNpemUgPSBFTEZfUEFHRUFMSUdOKHNpemUpOwogCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAkvKiBtbWFwKCkgd2lsbCByZXR1cm4gLUVJTlZBTCBpZiBnaXZlbiBhIHplcm8gc2l6ZSwgYnV0IGEKIAkgKiBzZWdtZW50IHdpdGggemVybyBmaWxlc2l6ZSBpcyBwZXJmZWN0bHkgdmFsaWQgKi8KLQlpZiAoZXBwbnQtPnBfZmlsZXN6ICsgcGFnZW9mZnNldCkKLQkJbWFwX2FkZHIgPSBkb19tbWFwKGZpbGVwLCBFTEZfUEFHRVNUQVJUKGFkZHIpLAotCQkJCSAgIGVwcG50LT5wX2ZpbGVzeiArIHBhZ2VvZmZzZXQsIHByb3QsIHR5cGUsCi0JCQkJICAgZXBwbnQtPnBfb2Zmc2V0IC0gcGFnZW9mZnNldCk7Ci0JZWxzZQotCQltYXBfYWRkciA9IEVMRl9QQUdFU1RBUlQoYWRkcik7CisJaWYgKCFzaXplKQorCQlyZXR1cm4gYWRkcjsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJLyoKKwkqIHRvdGFsX3NpemUgaXMgdGhlIHNpemUgb2YgdGhlIEVMRiAoaW50ZXJwcmV0ZXIpIGltYWdlLgorCSogVGhlIF9maXJzdF8gbW1hcCBuZWVkcyB0byBrbm93IHRoZSBmdWxsIHNpemUsIG90aGVyd2lzZQorCSogcmFuZG9taXphdGlvbiBtaWdodCBwdXQgdGhpcyBpbWFnZSBpbnRvIGFuIG92ZXJsYXBwaW5nCisJKiBwb3NpdGlvbiB3aXRoIHRoZSBFTEYgYmluYXJ5IGltYWdlLiAoc2luY2Ugc2l6ZSA8IHRvdGFsX3NpemUpCisJKiBTbyB3ZSBmaXJzdCBtYXAgdGhlICdiaWcnIGltYWdlIC0gYW5kIHVubWFwIHRoZSByZW1haW5kZXIgYXQKKwkqIHRoZSBlbmQuICh3aGljaCB1bm1hcCBpcyBuZWVkZWQgZm9yIEVMRiBpbWFnZXMgd2l0aCBob2xlcy4pCisJKi8KKwlpZiAodG90YWxfc2l6ZSkgeworCQl0b3RhbF9zaXplID0gRUxGX1BBR0VBTElHTih0b3RhbF9zaXplKTsKKwkJbWFwX2FkZHIgPSBkb19tbWFwKGZpbGVwLCBhZGRyLCB0b3RhbF9zaXplLCBwcm90LCB0eXBlLCBvZmYpOworCQlpZiAoIUJBRF9BRERSKG1hcF9hZGRyKSkKKwkJCWRvX211bm1hcChjdXJyZW50LT5tbSwgbWFwX2FkZHIrc2l6ZSwgdG90YWxfc2l6ZS1zaXplKTsKKwl9IGVsc2UKKwkJbWFwX2FkZHIgPSBkb19tbWFwKGZpbGVwLCBhZGRyLCBzaXplLCBwcm90LCB0eXBlLCBvZmYpOworCiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuKG1hcF9hZGRyKTsKIH0KIAogI2VuZGlmIC8qICFlbGZfbWFwICovCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX21hcHBpbmdfc2l6ZShzdHJ1Y3QgZWxmX3BoZHIgKmNtZHMsIGludCBucikKK3sKKwlpbnQgaSwgZmlyc3RfaWR4ID0gLTEsIGxhc3RfaWR4ID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlpZiAoY21kc1tpXS5wX3R5cGUgPT0gUFRfTE9BRCkgeworCQkJbGFzdF9pZHggPSBpOworCQkJaWYgKGZpcnN0X2lkeCA9PSAtMSkKKwkJCQlmaXJzdF9pZHggPSBpOworCQl9CisJfQorCWlmIChmaXJzdF9pZHggPT0gLTEpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNtZHNbbGFzdF9pZHhdLnBfdmFkZHIgKyBjbWRzW2xhc3RfaWR4XS5wX21lbXN6IC0KKwkJCQlFTEZfUEFHRVNUQVJUKGNtZHNbZmlyc3RfaWR4XS5wX3ZhZGRyKTsKK30KKworCiAvKiBUaGlzIGlzIG11Y2ggbW9yZSBnZW5lcmFsaXplZCB0aGFuIHRoZSBsaWJyYXJ5IHJvdXRpbmUgcmVhZCBmdW5jdGlvbiwKICAgIHNvIHdlIGtlZXAgdGhpcyBzZXBhcmF0ZS4gIFRlY2huaWNhbGx5IHRoZSBsaWJyYXJ5IHJlYWQgZnVuY3Rpb24KICAgIGlzIG9ubHkgcHJvdmlkZWQgc28gdGhhdCB3ZSBjYW4gcmVhZCBhLm91dCBsaWJyYXJpZXMgdGhhdCBoYXZlCiAgICBhbiBFTEYgaGVhZGVyICovCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfZWxmX2ludGVycChzdHJ1Y3QgZWxmaGRyICppbnRlcnBfZWxmX2V4LAotCQlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIsIHVuc2lnbmVkIGxvbmcgKmludGVycF9sb2FkX2FkZHIpCisJCXN0cnVjdCBmaWxlICppbnRlcnByZXRlciwgdW5zaWduZWQgbG9uZyAqaW50ZXJwX21hcF9hZGRyLAorCQl1bnNpZ25lZCBsb25nIG5vX2Jhc2UpCiB7CiAJc3RydWN0IGVsZl9waGRyICplbGZfcGhkYXRhOwogCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQ7CkBAIC0zMTksNiArMzU2LDcgQEAKIAlpbnQgbG9hZF9hZGRyX3NldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2JzcyA9IDAsIGVsZl9ic3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSB+MFVMOworCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKIAlpbnQgcmV0dmFsLCBpLCBzaXplOwogCiAJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KQEAgLTM1Nyw2ICszOTUsMTIgQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCisJdG90YWxfc2l6ZSA9IHRvdGFsX21hcHBpbmdfc2l6ZShlbGZfcGhkYXRhLCBpbnRlcnBfZWxmX2V4LT5lX3BobnVtKTsKKwlpZiAoIXRvdGFsX3NpemUpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKIAllcHBudCA9IGVsZl9waGRhdGE7CiAJZm9yIChpID0gMDsgaSA8IGludGVycF9lbGZfZXgtPmVfcGhudW07IGkrKywgZXBwbnQrKykgewogCQlpZiAoZXBwbnQtPnBfdHlwZSA9PSBQVF9MT0FEKSB7CkBAIC0zNzQsOSArNDE4LDE0IEBACiAJCQl2YWRkciA9IGVwcG50LT5wX3ZhZGRyOwogCQkJaWYgKGludGVycF9lbGZfZXgtPmVfdHlwZSA9PSBFVF9FWEVDIHx8IGxvYWRfYWRkcl9zZXQpCiAJCQkJZWxmX3R5cGUgfD0gTUFQX0ZJWEVEOworCQkJZWxzZSBpZiAobm9fYmFzZSAmJiBpbnRlcnBfZWxmX2V4LT5lX3R5cGUgPT0gRVRfRFlOKQorCQkJCWxvYWRfYWRkciA9IC12YWRkcjsKIAogCQkJbWFwX2FkZHIgPSBlbGZfbWFwKGludGVycHJldGVyLCBsb2FkX2FkZHIgKyB2YWRkciwKLQkJCQkJICAgZXBwbnQsIGVsZl9wcm90LCBlbGZfdHlwZSk7CisJCQkJCSAgIGVwcG50LCBlbGZfcHJvdCwgZWxmX3R5cGUsIHRvdGFsX3NpemUpOworCQkJdG90YWxfc2l6ZSA9IDA7CisJCQlpZiAoISppbnRlcnBfbWFwX2FkZHIpCisJCQkJKmludGVycF9tYXBfYWRkciA9IG1hcF9hZGRyOwogCQkJZXJyb3IgPSBtYXBfYWRkcjsKIAkJCWlmIChCQURfQUREUihtYXBfYWRkcikpCiAJCQkJZ290byBvdXRfY2xvc2U7CkBAIC00NDIsOCArNDkxLDcgQEAKIAkJCWdvdG8gb3V0X2Nsb3NlOwogCX0KIAotCSppbnRlcnBfbG9hZF9hZGRyID0gbG9hZF9hZGRyOwotCWVycm9yID0gKCh1bnNpZ25lZCBsb25nKWludGVycF9lbGZfZXgtPmVfZW50cnkpICsgbG9hZF9hZGRyOworCWVycm9yID0gbG9hZF9hZGRyOwogCiBvdXRfY2xvc2U6CiAJa2ZyZWUoZWxmX3BoZGF0YSk7CkBAIC01NDAsNyArNTg4LDggQEAKIAlpbnQgZWxmX2V4ZWNfZmlsZW5vOwogCWludCByZXR2YWwsIGk7CiAJdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgbG9uZyBlbGZfZW50cnksIGludGVycF9sb2FkX2FkZHIgPSAwOworCXVuc2lnbmVkIGxvbmcgZWxmX2VudHJ5OworCXVuc2lnbmVkIGxvbmcgaW50ZXJwX2xvYWRfYWRkciA9IDA7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfZGF0YSwgZW5kX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZWxvY19mdW5jX2Rlc2MgPSAwOwogCWNoYXIgcGFzc2VkX2ZpbGVub1s2XTsKQEAgLTgwOCw5ICs4NTcsNyBAQAogCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IGJwcm0tPnA7CiAKIAkvKiBOb3cgd2UgZG8gYSBsaXR0bGUgZ3J1bmd5IHdvcmsgYnkgbW1hcGluZyB0aGUgRUxGIGltYWdlIGludG8KLQkgICB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiBtZW1vcnkuICBBdCB0aGlzIHBvaW50LCB3ZSBhc3N1bWUgdGhhdAotCSAgIHRoZSBpbWFnZSBzaG91bGQgYmUgbG9hZGVkIGF0IGZpeGVkIGFkZHJlc3MsIG5vdCBhdCBhIHZhcmlhYmxlCi0JICAgYWRkcmVzcy4gKi8KKwkgICB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiBtZW1vcnkuICovCiAJZm9yKGkgPSAwLCBlbGZfcHBudCA9IGVsZl9waGRhdGE7CiAJICAgIGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyssIGVsZl9wcG50KyspIHsKIAkJaW50IGVsZl9wcm90ID0gMCwgZWxmX2ZsYWdzOwpAQCAtODY0LDExICs5MTEsMTUgQEAKIAkJCSAqIGRlZmF1bHQgbW1hcCBiYXNlLCBhcyB3ZWxsIGFzIHdoYXRldmVyIHByb2dyYW0gdGhleQogCQkJICogbWlnaHQgdHJ5IHRvIGV4ZWMuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGJyayB3aWxsCiAJCQkgKiBmb2xsb3cgdGhlIGxvYWRlciwgYW5kIGlzIG5vdCBtb3ZhYmxlLiAgKi8KKyNpZmRlZiBDT05GSUdfWDg2CisJCQlsb2FkX2JpYXMgPSAwOworI2Vsc2UKIAkJCWxvYWRfYmlhcyA9IEVMRl9QQUdFU1RBUlQoRUxGX0VUX0RZTl9CQVNFIC0gdmFkZHIpOworI2VuZGlmCiAJCX0KIAogCQllcnJvciA9IGVsZl9tYXAoYnBybS0+ZmlsZSwgbG9hZF9iaWFzICsgdmFkZHIsIGVsZl9wcG50LAotCQkJCWVsZl9wcm90LCBlbGZfZmxhZ3MpOworCQkJCWVsZl9wcm90LCBlbGZfZmxhZ3MsMCk7CiAJCWlmIChCQURfQUREUihlcnJvcikpIHsKIAkJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOwogCQkJcmV0dmFsID0gSVNfRVJSKCh2b2lkICopZXJyb3IpID8KQEAgLTk0NCwxMyArOTk1LDI1IEBACiAJfQogCiAJaWYgKGVsZl9pbnRlcnByZXRlcikgewotCQlpZiAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKQorCQlpZiAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKSB7CiAJCQllbGZfZW50cnkgPSBsb2FkX2FvdXRfaW50ZXJwKCZsb2MtPmludGVycF9leCwKIAkJCQkJCSAgICAgaW50ZXJwcmV0ZXIpOwotCQllbHNlCisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGludGVycF9tYXBfYWRkcik7CisKIAkJCWVsZl9lbnRyeSA9IGxvYWRfZWxmX2ludGVycCgmbG9jLT5pbnRlcnBfZWxmX2V4LAogCQkJCQkJICAgIGludGVycHJldGVyLAotCQkJCQkJICAgICZpbnRlcnBfbG9hZF9hZGRyKTsKKwkJCQkJCSAgICAmaW50ZXJwX21hcF9hZGRyLAorCQkJCQkJICAgIGxvYWRfYmlhcyk7CisJCQlpZiAoIUJBRF9BRERSKGVsZl9lbnRyeSkpIHsKKwkJCQkvKgorCQkJCSAqIGxvYWRfZWxmX2ludGVycCgpIHJldHVybnMgcmVsb2NhdGlvbgorCQkJCSAqIGFkanVzdG1lbnQKKwkJCQkgKi8KKwkJCQlpbnRlcnBfbG9hZF9hZGRyID0gZWxmX2VudHJ5OworCQkJCWVsZl9lbnRyeSArPSBsb2MtPmludGVycF9lbGZfZXguZV9lbnRyeTsKKwkJCX0KKwkJfQogCQlpZiAoQkFEX0FERFIoZWxmX2VudHJ5KSkgewogCQkJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCQkJcmV0dmFsID0gSVNfRVJSKCh2b2lkICopZWxmX2VudHJ5KSA/CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IGIzZTliZmEuLjM2MzUzMTUgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC01ODgsMTIgKzU4OCwxMCBAQAogCiBsb25nIG5yX2Jsb2NrZGV2X3BhZ2VzKHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCWxvbmcgcmV0ID0gMDsKIAlzcGluX2xvY2soJmJkZXZfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmYWxsX2JkZXZzKSB7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0JCWJkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBibG9ja19kZXZpY2UsIGJkX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmRldiwgJmFsbF9iZGV2cywgYmRfbGlzdCkgewogCQlyZXQgKz0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlczsKIAl9CiAJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7CkBAIC04NzQsNyArODcyLDcgQEAKICAqLwogc3RhdGljIGludCBhZGRfYmRfaG9sZGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBiZF9ob2xkZXIgKmJvKQogewotCWludCByZXQ7CisJaW50IGVycjsKIAogCWlmICghYm8pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODgyLDE1ICs4ODAsMTggQEAKIAlpZiAoIWJkX2hvbGRlcl9ncmFiX2RpcnMoYmRldiwgYm8pKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcmV0ID0gYWRkX3N5bWxpbmsoYm8tPnNkaXIsIGJvLT5zZGV2KTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gYWRkX3N5bWxpbmsoYm8tPmhkaXIsIGJvLT5oZGV2KTsKLQkJaWYgKHJldCkKLQkJCWRlbF9zeW1saW5rKGJvLT5zZGlyLCBiby0+c2Rldik7CisJZXJyID0gYWRkX3N5bWxpbmsoYm8tPnNkaXIsIGJvLT5zZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gYWRkX3N5bWxpbmsoYm8tPmhkaXIsIGJvLT5oZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRlbF9zeW1saW5rKGJvLT5zZGlyLCBiby0+c2Rldik7CisJCXJldHVybiBlcnI7CiAJfQotCWlmIChyZXQgPT0gMCkKLQkJbGlzdF9hZGRfdGFpbCgmYm8tPmxpc3QsICZiZGV2LT5iZF9ob2xkZXJfbGlzdCk7Ci0JcmV0dXJuIHJldDsKKworCWxpc3RfYWRkX3RhaWwoJmJvLT5saXN0LCAmYmRldi0+YmRfaG9sZGVyX2xpc3QpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTk0OCw3ICs5NDksNyBAQAogc3RhdGljIGludCBiZF9jbGFpbV9ieV9rb2JqZWN0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHZvaWQgKmhvbGRlciwKIAkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlpbnQgcmVzOworCWludCBlcnI7CiAJc3RydWN0IGJkX2hvbGRlciAqYm8sICpmb3VuZDsKIAogCWlmICgha29iaikKQEAgLTk1OSwyMSArOTYwLDI0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOwotCXJlcyA9IGJkX2NsYWltKGJkZXYsIGhvbGRlcik7Ci0JaWYgKHJlcyA9PSAwKSB7Ci0JCWZvdW5kID0gZmluZF9iZF9ob2xkZXIoYmRldiwgYm8pOwotCQlpZiAoZm91bmQgPT0gTlVMTCkgewotCQkJcmVzID0gYWRkX2JkX2hvbGRlcihiZGV2LCBibyk7Ci0JCQlpZiAocmVzKQotCQkJCWJkX3JlbGVhc2UoYmRldik7Ci0JCX0KLQl9CiAKLQlpZiAocmVzIHx8IGZvdW5kKQotCQlmcmVlX2JkX2hvbGRlcihibyk7CisJZXJyID0gYmRfY2xhaW0oYmRldiwgaG9sZGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKKwlmb3VuZCA9IGZpbmRfYmRfaG9sZGVyKGJkZXYsIGJvKTsKKwlpZiAoZm91bmQpCisJCWdvdG8gZmFpbDsKKworCWVyciA9IGFkZF9iZF9ob2xkZXIoYmRldiwgYm8pOworCWlmIChlcnIpCisJCWJkX3JlbGVhc2UoYmRldik7CisJZWxzZQorCQlibyA9IE5VTEw7CitmYWlsOgogCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwotCi0JcmV0dXJuIHJlczsKKwlmcmVlX2JkX2hvbGRlcihibyk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoqCkBAIC05ODcsMTUgKzk5MSwxMiBAQAogc3RhdGljIHZvaWQgYmRfcmVsZWFzZV9mcm9tX2tvYmplY3Qoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCQkJc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0Jc3RydWN0IGJkX2hvbGRlciAqYm87Ci0KIAlpZiAoIWtvYmopCiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmJkZXYtPmJkX211dGV4KTsKIAliZF9yZWxlYXNlKGJkZXYpOwotCWlmICgoYm8gPSBkZWxfYmRfaG9sZGVyKGJkZXYsIGtvYmopKSkKLQkJZnJlZV9iZF9ob2xkZXIoYm8pOworCWZyZWVfYmRfaG9sZGVyKGRlbF9iZF9ob2xkZXIoYmRldiwga29iaikpOwogCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOwogfQogCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IGFhNjgyMDYuLjBmOTAwNjcgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0zNTYsNyArMzU2LDcgQEAKIAlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKIAkJem9uZXMgPSBwZ2RhdC0+bm9kZV96b25lbGlzdHNbZ2ZwX3pvbmUoR0ZQX05PRlMpXS56b25lczsKIAkJaWYgKCp6b25lcykKLQkJCXRyeV90b19mcmVlX3BhZ2VzKHpvbmVzLCBHRlBfTk9GUyk7CisJCQl0cnlfdG9fZnJlZV9wYWdlcyh6b25lcywgMCwgR0ZQX05PRlMpOwogCX0KIH0KIApAQCAtNjc2LDYgKzY3NiwzOSBAQAogRVhQT1JUX1NZTUJPTChtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSk7CiAKIC8qCisgKiBNYXJrIHRoZSBwYWdlIGRpcnR5LCBhbmQgc2V0IGl0IGRpcnR5IGluIHRoZSByYWRpeCB0cmVlLCBhbmQgbWFyayB0aGUgaW5vZGUKKyAqIGRpcnR5LgorICoKKyAqIElmIHdhcm4gaXMgdHJ1ZSwgdGhlbiBlbWl0IGEgd2FybmluZyBpZiB0aGUgcGFnZSBpcyBub3QgdXB0b2RhdGUgYW5kIGhhcworICogbm90IGJlZW4gdHJ1bmNhdGVkLgorICovCitzdGF0aWMgaW50IF9fc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBpbnQgd2FybikKK3sKKwlpZiAodW5saWtlbHkoIW1hcHBpbmcpKQorCQlyZXR1cm4gIVRlc3RTZXRQYWdlRGlydHkocGFnZSk7CisKKwlpZiAoVGVzdFNldFBhZ2VEaXJ0eShwYWdlKSkKKwkJcmV0dXJuIDA7CisKKwl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlpZiAocGFnZS0+bWFwcGluZykgewkvKiBSYWNlIHdpdGggdHJ1bmNhdGU/ICovCisJCVdBUk5fT05fT05DRSh3YXJuICYmICFQYWdlVXB0b2RhdGUocGFnZSkpOworCisJCWlmIChtYXBwaW5nX2NhcF9hY2NvdW50X2RpcnR5KG1hcHBpbmcpKSB7CisJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9ESVJUWSk7CisJCQl0YXNrX2lvX2FjY291bnRfd3JpdGUoUEFHRV9DQUNIRV9TSVpFKTsKKwkJfQorCQlyYWRpeF90cmVlX3RhZ19zZXQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKKwkJCQlwYWdlX2luZGV4KHBhZ2UpLCBQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKKwl9CisJd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKICAqIEFkZCBhIHBhZ2UgdG8gdGhlIGRpcnR5IHBhZ2UgbGlzdC4KICAqCiAgKiBJdCBpcyBhIHNhZCBmYWN0IG9mIGxpZmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHNldmVyYWwgcGxhY2VzCkBAIC03MDIsNyArNzM1LDcgQEAKICAqLwogaW50IF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CiAKIAlpZiAodW5saWtlbHkoIW1hcHBpbmcpKQogCQlyZXR1cm4gIVRlc3RTZXRQYWdlRGlydHkocGFnZSk7CkBAIC03MTksMjEgKzc1Miw3IEBACiAJfQogCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOwogCi0JaWYgKFRlc3RTZXRQYWdlRGlydHkocGFnZSkpCi0JCXJldHVybiAwOwotCi0Jd3JpdGVfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JaWYgKHBhZ2UtPm1hcHBpbmcpIHsJLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLwotCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgewotCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOwotCQkJdGFza19pb19hY2NvdW50X3dyaXRlKFBBR0VfQ0FDSEVfU0laRSk7Ci0JCX0KLQkJcmFkaXhfdHJlZV90YWdfc2V0KCZtYXBwaW5nLT5wYWdlX3RyZWUsCi0JCQkJcGFnZV9pbmRleChwYWdlKSwgUEFHRUNBQ0hFX1RBR19ESVJUWSk7Ci0JfQotCXdyaXRlX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JX19tYXJrX2lub2RlX2RpcnR5KG1hcHBpbmctPmhvc3QsIElfRElSVFlfUEFHRVMpOwotCXJldHVybiAxOworCXJldHVybiBfX3NldF9wYWdlX2RpcnR5KHBhZ2UsIG1hcHBpbmcsIDEpOwogfQogRVhQT1JUX1NZTUJPTChfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMpOwogCkBAIC05ODIsNyArMTAwMSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAogCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4LAotCQltYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpICYgfl9fR0ZQX0ZTKTsKKwkJKG1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZykgJiB+X19HRlBfRlMpfF9fR0ZQX01PVkFCTEUpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTEwMjYsMTEgKzEwNDUsNiBAQAogLyoKICAqIENyZWF0ZSBidWZmZXJzIGZvciB0aGUgc3BlY2lmaWVkIGJsb2NrIGRldmljZSBibG9jaydzIHBhZ2UuICBJZgogICogdGhhdCBwYWdlIHdhcyBkaXJ0eSwgdGhlIGJ1ZmZlcnMgYXJlIHNldCBkaXJ0eSBhbHNvLgotICoKLSAqIEV4Y2VwdCB0aGF0J3MgYSBidWcuICBBdHRhY2hpbmcgZGlydHkgYnVmZmVycyB0byBhIGRpcnR5Ci0gKiBibG9ja2RldidzIHBhZ2UgY2FuIHJlc3VsdCBpbiBmaWxlc3lzdGVtIGNvcnJ1cHRpb24sIGJlY2F1c2UKLSAqIHNvbWUgb2YgdGhvc2UgYnVmZmVycyBtYXkgYmUgYWxpYXNlcyBvZiBmaWxlc3lzdGVtIGRhdGEuCi0gKiBncm93X2Rldl9wYWdlKCkgd2lsbCBnbyBCVUcoKSBpZiB0aGlzIGhhcHBlbnMuCiAgKi8KIHN0YXRpYyBpbnQKIGdyb3dfYnVmZmVycyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCkBAIC0xMTM3LDggKzExNTEsOSBAQAogICovCiB2b2lkIGZhc3RjYWxsIG1hcmtfYnVmZmVyX2RpcnR5KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CisJV0FSTl9PTl9PTkNFKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKIAlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkgJiYgIXRlc3Rfc2V0X2J1ZmZlcl9kaXJ0eShiaCkpCi0JCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKGJoLT5iX3BhZ2UpOworCQlfX3NldF9wYWdlX2RpcnR5KGJoLT5iX3BhZ2UsIHBhZ2VfbWFwcGluZyhiaC0+Yl9wYWdlKSwgMCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5jIGIvZnMvY2lmcy9jaWZzZnMuYwppbmRleCA4YjBjYmY0Li5iZDBmMmYyIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5jCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmMKQEAgLTg0OSw2ICs4NDksNyBAQAogCV9fdTE2ICBuZXRmaWQ7CiAJaW50IHJjOwogCisJc2V0X2ZyZWV6YWJsZSgpOwogCWRvIHsKIAkJaWYgKHRyeV90b19mcmVlemUoKSkgCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggZjRlOTI2Ni4uMGExYjhiZCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTM2Myw2ICszNjMsNyBAQAogCQkJR0ZQX0tFUk5FTCk7CiAJfQogCisJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZXhwb3J0LmMgYi9mcy9jaWZzL2V4cG9ydC5jCmluZGV4IDFkNzE2MzkuLjk2ZGYxZDUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZXhwb3J0LmMKKysrIGIvZnMvY2lmcy9leHBvcnQuYwpAQCAtMjksNiArMjksNyBAQAogICAqLwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogIAogI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAogIApkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCA2YjQ0Y2RjLi5lNDQwYTdiIDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtNjMsNiArNjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9sb29wLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpLmg+CkBAIC0zNDg5LDYgKzM0OTAsOSBAQAogCiBJR05PUkVfSU9DVEwoVkZBVF9JT0NUTF9SRUFERElSX0JPVEgzMikKIElHTk9SRV9JT0NUTChWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQzMikKKworLyogbG9vcCAqLworSUdOT1JFX0lPQ1RMKExPT1BfQ0xSX0ZEKQogfTsKIAogI2RlZmluZSBJT0NUTF9IQVNIU0laRSAyNTYKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmggYi9mcy9jb25maWdmcy9jb25maWdmc19pbnRlcm5hbC5oCmluZGV4IDdiNDhjMDMuLjNiMDE4NWYgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2NvbmZpZ2ZzX2ludGVybmFsLmgKKysrIGIvZnMvY29uZmlnZnMvY29uZmlnZnNfaW50ZXJuYWwuaApAQCAtMjksMTAgKzI5LDExIEBACiAKIHN0cnVjdCBjb25maWdmc19kaXJlbnQgewogCWF0b21pY190CQlzX2NvdW50OworCWludAkJCXNfZGVwZW5kZW50X2NvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQJc19zaWJsaW5nOwogCXN0cnVjdCBsaXN0X2hlYWQJc19jaGlsZHJlbjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNfbGlua3M7Ci0Jdm9pZCAJCQkqIHNfZWxlbWVudDsKKwl2b2lkCQkJKiBzX2VsZW1lbnQ7CiAJaW50CQkJc190eXBlOwogCXVtb2RlX3QJCQlzX21vZGU7CiAJc3RydWN0IGRlbnRyeQkJKiBzX2RlbnRyeTsKQEAgLTQxLDggKzQyLDggQEAKIAogI2RlZmluZSBDT05GSUdGU19ST09UCQkweDAwMDEKICNkZWZpbmUgQ09ORklHRlNfRElSCQkweDAwMDIKLSNkZWZpbmUgQ09ORklHRlNfSVRFTV9BVFRSIAkweDAwMDQKLSNkZWZpbmUgQ09ORklHRlNfSVRFTV9MSU5LIAkweDAwMjAKKyNkZWZpbmUgQ09ORklHRlNfSVRFTV9BVFRSCTB4MDAwNAorI2RlZmluZSBDT05GSUdGU19JVEVNX0xJTksJMHgwMDIwCiAjZGVmaW5lIENPTkZJR0ZTX1VTRVRfRElSCTB4MDA0MAogI2RlZmluZSBDT05GSUdGU19VU0VUX0RFRkFVTFQJMHgwMDgwCiAjZGVmaW5lIENPTkZJR0ZTX1VTRVRfRFJPUFBJTkcJMHgwMTAwCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9kaXIuYyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCmluZGV4IDVlNmUzN2UuLjJmNDM2ZDQgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL2Rpci5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2Rpci5jCkBAIC0zNTUsNiArMzU1LDEwIEBACiAJCQkvKiBNYXJrIHRoYXQgd2UndmUgdGFrZW4gaV9tdXRleCAqLwogCQkJc2QtPnNfdHlwZSB8PSBDT05GSUdGU19VU0VUX0RST1BQSU5HOwogCisJCQkvKgorCQkJICogWXVwLCByZWN1cnNpdmUuICBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgYmxhbWUKKwkJCSAqIGRlZXAgbmVzdGluZyBvZiBkZWZhdWx0X2dyb3VwcworCQkJICovCiAJCQlyZXQgPSBjb25maWdmc19kZXRhY2hfcHJlcChzZC0+c19kZW50cnkpOwogCQkJaWYgKCFyZXQpCiAJCQkJY29udGludWU7CkBAIC01NjIsNyArNTY2LDcgQEAKIAogLyoKICAqIEFsbCBvZiBsaW5rX29iai91bmxpbmtfb2JqL2xpbmtfZ3JvdXAvdW5saW5rX2dyb3VwIHJlcXVpcmUgdGhhdAotICogc3Vic3lzLT5zdV9zZW0gaXMgaGVsZC4KKyAqIHN1YnN5cy0+c3VfbXV0ZXggaXMgaGVsZC4KICAqLwogCiBzdGF0aWMgdm9pZCB1bmxpbmtfb2JqKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKQEAgLTcxNCw2ICs3MTgsMjggQEAKIH0KIAogLyoKKyAqIEFmdGVyIHRoZSBpdGVtIGhhcyBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGZpbGVzeXN0ZW0gdmlldywgd2UgYXJlCisgKiByZWFkeSB0byB0ZWFyIGl0IG91dCBvZiB0aGUgaGllcmFyY2h5LiAgTm90aWZ5IHRoZSBjbGllbnQgYmVmb3JlCisgKiB3ZSBkbyB0aGF0IHNvIHRoZXkgY2FuIHBlcmZvcm0gYW55IGNsZWFudXAgdGhhdCByZXF1aXJlcworICogbmF2aWdhdGluZyB0aGUgaGllcmFyY2h5LiAgQSBjbGllbnQgZG9lcyBub3QgbmVlZCB0byBwcm92aWRlIHRoaXMKKyAqIGNhbGxiYWNrLiAgVGhlIHN1YnN5c3RlbSBzZW1hcGhvcmUgTVVTVCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIsIGFuZAorICogcmVmZXJlbmNlcyBtdXN0IGJlIHZhbGlkIGZvciBib3RoIGl0ZW1zLiAgSXQgYWxzbyBhc3N1bWVzIHRoZQorICogY2FsbGVyIGhhcyB2YWxpZGF0ZWQgY2lfdHlwZS4KKyAqLworc3RhdGljIHZvaWQgY2xpZW50X2Rpc2Nvbm5lY3Rfbm90aWZ5KHN0cnVjdCBjb25maWdfaXRlbSAqcGFyZW50X2l0ZW0sCisJCQkJICAgICBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCit7CisJc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKnR5cGU7CisKKwl0eXBlID0gcGFyZW50X2l0ZW0tPmNpX3R5cGU7CisJQlVHX09OKCF0eXBlKTsKKworCWlmICh0eXBlLT5jdF9ncm91cF9vcHMgJiYgdHlwZS0+Y3RfZ3JvdXBfb3BzLT5kaXNjb25uZWN0X25vdGlmeSkKKwkJdHlwZS0+Y3RfZ3JvdXBfb3BzLT5kaXNjb25uZWN0X25vdGlmeSh0b19jb25maWdfZ3JvdXAocGFyZW50X2l0ZW0pLAorCQkJCQkJICAgICAgaXRlbSk7Cit9CisKKy8qCiAgKiBEcm9wIHRoZSBpbml0aWFsIHJlZmVyZW5jZSBmcm9tIG1ha2VfaXRlbSgpL21ha2VfZ3JvdXAoKQogICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgcmVmZXJlbmNlIGlzIGhlbGQgb24gaXRlbQogICogYW5kIHRoYXQgaXRlbSBob2xkcyBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50LiAgQWxzbywgaXQKQEAgLTczMywxMSArNzU5LDI0NCBAQAogCSAqLwogCWlmICh0eXBlLT5jdF9ncm91cF9vcHMgJiYgdHlwZS0+Y3RfZ3JvdXBfb3BzLT5kcm9wX2l0ZW0pCiAJCXR5cGUtPmN0X2dyb3VwX29wcy0+ZHJvcF9pdGVtKHRvX2NvbmZpZ19ncm91cChwYXJlbnRfaXRlbSksCi0JCQkJCQlpdGVtKTsKKwkJCQkJICAgICAgaXRlbSk7CiAJZWxzZQogCQljb25maWdfaXRlbV9wdXQoaXRlbSk7CiB9CiAKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgY29uZmlnZnNfZHVtcF9vbmUoc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqc2QsIGludCBsZXZlbCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlKnNcIiVzXCI6XG4iLCBsZXZlbCwgIiAiLCBjb25maWdmc19nZXRfbmFtZShzZCkpOworCisjZGVmaW5lIHR5cGVfcHJpbnQoX3R5cGUpIGlmIChzZC0+c190eXBlICYgX3R5cGUpIHByaW50ayhLRVJOX0lORk8gIiUqcyAlc1xuIiwgbGV2ZWwsICIgIiwgI190eXBlKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX1JPT1QpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfRElSKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX0lURU1fQVRUUik7CisJdHlwZV9wcmludChDT05GSUdGU19JVEVNX0xJTkspOworCXR5cGVfcHJpbnQoQ09ORklHRlNfVVNFVF9ESVIpOworCXR5cGVfcHJpbnQoQ09ORklHRlNfVVNFVF9ERUZBVUxUKTsKKwl0eXBlX3ByaW50KENPTkZJR0ZTX1VTRVRfRFJPUFBJTkcpOworI3VuZGVmIHR5cGVfcHJpbnQKK30KKworc3RhdGljIGludCBjb25maWdmc19kdW1wKHN0cnVjdCBjb25maWdmc19kaXJlbnQgKnNkLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGNvbmZpZ2ZzX2RpcmVudCAqY2hpbGRfc2Q7CisJaW50IHJldCA9IDA7CisKKwljb25maWdmc19kdW1wX29uZShzZCwgbGV2ZWwpOworCisJaWYgKCEoc2QtPnNfdHlwZSAmIChDT05GSUdGU19ESVJ8Q09ORklHRlNfUk9PVCkpKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfc2QsICZzZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCXJldCA9IGNvbmZpZ2ZzX2R1bXAoY2hpbGRfc2QsIGxldmVsICsgMik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworLyoKKyAqIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKCkgYW5kIGNvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oKQorICoKKyAqIFdBUk5JTkc6IERvIG5vdCBjYWxsIHRoZXNlIGZyb20gYSBjb25maWdmcyBjYWxsYmFjayEKKyAqCisgKiBUaGlzIGRlc2NyaWJlcyB0aGVzZSBmdW5jdGlvbnMgYW5kIHRoZWlyIGhlbHBlcnMuCisgKgorICogQWxsb3cgYW5vdGhlciBrZXJuZWwgc3lzdGVtIHRvIGRlcGVuZCBvbiBhIGNvbmZpZ19pdGVtLiAgSWYgdGhpcworICogaGFwcGVucywgdGhlIGl0ZW0gY2Fubm90IGdvIGF3YXkgdW50aWwgdGhlIGRlcGVuZGFudCBjYW4gbGl2ZSB3aXRob3V0CisgKiBpdC4gIFRoZSBpZGVhIGlzIHRvIGdpdmUgY2xpZW50IG1vZHVsZXMgYXMgc2ltcGxlIGFuIGludGVyZmFjZSBhcworICogcG9zc2libGUuICBXaGVuIGEgc3lzdGVtIGFza3MgdGhlbSB0byBkZXBlbmQgb24gYW4gaXRlbSwgdGhleSBqdXN0CisgKiBjYWxsIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKCkuICBJZiB0aGUgaXRlbSBpcyBsaXZlIGFuZCB0aGUgY2xpZW50CisgKiBkcml2ZXIgaXMgaW4gZ29vZCBzaGFwZSwgd2UnbGwgaGFwcGlseSBkbyB0aGUgd29yayBmb3IgdGhlbS4KKyAqCisgKiBXaHkgaXMgdGhlIGxvY2tpbmcgY29tcGxleD8gIEJlY2F1c2UgY29uZmlnZnMgdXNlcyB0aGUgVkZTIHRvIGhhbmRsZQorICogYWxsIGxvY2tpbmcsIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvdXRzaWRlIHRoZSBub3JtYWwKKyAqIFZGUy0+Y29uZmlnZnMgcGF0aC4gIFNvIGl0IG11c3QgdGFrZSBWRlMgbG9ja3MgdG8gcHJldmVudCB0aGUKKyAqIFZGUy0+Y29uZmlnZnMgc3R1ZmYgKGNvbmZpZ2ZzX21rZGlyKCksIGNvbmZpZ2ZzX3JtZGlyKCksIGV0YykuICBUaGlzIGlzCisgKiB3aHkgeW91IGNhbid0IGNhbGwgdGhlc2UgZnVuY3Rpb25zIHVuZGVybmVhdGggY29uZmlnZnMgY2FsbGJhY2tzLgorICoKKyAqIE5vdGUsIGJ0dywgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYXQgKmFueSogdGltZSwgZXZlbiB3aGVuIGEgY29uZmlnZnMKKyAqIHN1YnN5c3RlbSBpc24ndCByZWdpc3RlcmVkLCBvciB3aGVuIGNvbmZpZ2ZzIGlzIGxvYWRpbmcgb3IgdW5sb2FkaW5nLgorICogSnVzdCBsaWtlIGNvbmZpZ2ZzX3JlZ2lzdGVyX3N1YnN5c3RlbSgpLiAgU28gd2UgdGFrZSB0aGUgc2FtZQorICogcHJlY2F1dGlvbnMuICBXZSBwaW4gdGhlIGZpbGVzeXN0ZW0uICBXZSBsb2NrIGVhY2ggaV9tdXRleCBfaW5fb3JkZXJfCisgKiBvbiBvdXIgd2F5IGRvd24gdGhlIHRyZWUuICBJZiB3ZSBjYW4gZmluZCB0aGUgdGFyZ2V0IGl0ZW0gaW4gdGhlCisgKiBjb25maWdmcyB0cmVlLCBpdCBtdXN0IGJlIHBhcnQgb2YgdGhlIHN1YnN5c3RlbSB0cmVlIGFzIHdlbGwsIHNvIHdlCisgKiBkbyBub3QgbmVlZCB0aGUgc3Vic3lzdGVtIHNlbWFwaG9yZS4gIEhvbGRpbmcgdGhlIGlfbXV0ZXggY2hhaW4gbG9ja3MKKyAqIG91dCBta2RpcigpIGFuZCBybWRpcigpLCB3aG8gbWlnaHQgYmUgcmFjaW5nIHVzLgorICovCisKKy8qCisgKiBjb25maWdmc19kZXBlbmRfcHJlcCgpCisgKgorICogT25seSBzdWJkaXJlY3RvcmllcyBjb3VudCBoZXJlLiAgRmlsZXMgKENPTkZJR0ZTX05PVF9QSU5ORUQpIGFyZQorICogYXR0cmlidXRlcy4gIFRoaXMgaXMgc2ltaWxhciBidXQgbm90IHRoZSBzYW1lIHRvIGNvbmZpZ2ZzX2RldGFjaF9wcmVwKCkuCisgKiBOb3RlIHRoYXQgY29uZmlnZnNfZGV0YWNoX3ByZXAoKSBleHBlY3RzIHRoZSBwYXJlbnQgdG8gYmUgbG9ja2VkIHdoZW4gaXQKKyAqIGlzIGNhbGxlZCwgYnV0IHdlIGxvY2sgdGhlIHBhcmVudCAqaW5zaWRlKiBjb25maWdmc19kZXBlbmRfcHJlcCgpLiAgV2UKKyAqIGRvIHRoYXQgc28gd2UgY2FuIHVubG9jayBpdCBpZiB3ZSBmaW5kIG5vdGhpbmcuCisgKgorICogSGVyZSB3ZSBkbyBhIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgZGVudHJ5IGhpZXJhcmNoeSBsb29raW5nIGZvcgorICogb3VyIG9iamVjdC4gIFdlIHRha2UgaV9tdXRleCBvbiBlYWNoIHN0ZXAgb2YgdGhlIHdheSBkb3duLiAgSVQgSVMKKyAqIEVTU0VOVElBTCBUSEFUIGlfbXV0ZXggTE9DS0lORyBJUyBPUkRFUkVELiAgSWYgd2UgY29tZSBiYWNrIHVwIGEgYnJhbmNoLAorICogd2UnbGwgZHJvcCB0aGUgaV9tdXRleC4KKyAqCisgKiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBmb3VuZCwgLUVOT0VOVCBpcyBidWJibGVkIHVwIGFuZCB3ZSBoYXZlIHJlbGVhc2VkCisgKiBhbGwgbG9ja3MuICBJZiB0aGUgdGFyZ2V0IHdhcyBmb3VuZCwgdGhlIGxvY2tzIHdpbGwgYmUgY2xlYXJlZCBieQorICogY29uZmlnZnNfZGVwZW5kX3JvbGxiYWNrKCkuCisgKgorICogVGhpcyBhZGRzIGEgcmVxdWlyZW1lbnQgdGhhdCBhbGwgY29uZmlnX2l0ZW1zIGJlIHVuaXF1ZSEKKyAqCisgKiBUaGlzIGlzIHJlY3Vyc2l2ZSBiZWNhdXNlIHRoZSBsb2NraW5nIHRyYXZlcnNhbCBpcyB0cmlja3kuICBUaGVyZSBpc24ndAorICogbXVjaCBvbiB0aGUgc3RhY2ssIHRob3VnaCwgc28gZm9sa3MgdGhhdCBuZWVkIHRoaXMgZnVuY3Rpb24gLSBiZSBjYXJlZnVsCisgKiBhYm91dCB5b3VyIHN0YWNrISAgUGF0Y2hlcyB3aWxsIGJlIGFjY2VwdGVkIHRvIG1ha2UgaXQgaXRlcmF0aXZlLgorICovCitzdGF0aWMgaW50IGNvbmZpZ2ZzX2RlcGVuZF9wcmVwKHN0cnVjdCBkZW50cnkgKm9yaWdpbiwKKwkJCQlzdHJ1Y3QgY29uZmlnX2l0ZW0gKnRhcmdldCkKK3sKKwlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpjaGlsZF9zZCwgKnNkID0gb3JpZ2luLT5kX2ZzZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCUJVR19PTighb3JpZ2luIHx8ICFzZCk7CisKKwkvKiBMb2NrIHRoaXMgZ3V5IG9uIHRoZSB3YXkgZG93biAqLworCW11dGV4X2xvY2soJnNkLT5zX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJaWYgKHNkLT5zX2VsZW1lbnQgPT0gdGFyZ2V0KSAgLyogQm9vLXlhaCAqLworCQlnb3RvIG91dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGRfc2QsICZzZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCWlmIChjaGlsZF9zZC0+c190eXBlICYgQ09ORklHRlNfRElSKSB7CisJCQlyZXQgPSBjb25maWdmc19kZXBlbmRfcHJlcChjaGlsZF9zZC0+c19kZW50cnksCisJCQkJCQkgICB0YXJnZXQpOworCQkJaWYgKCFyZXQpCisJCQkJZ290byBvdXQ7ICAvKiBDaGlsZCBwYXRoIGJvby15YWggKi8KKwkJfQorCX0KKworCS8qIFdlIGxvb3BlZCBhbGwgb3VyIGNoaWxkcmVuIGFuZCBkaWRuJ3QgZmluZCB0YXJnZXQgKi8KKwltdXRleF91bmxvY2soJnNkLT5zX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CisJcmV0ID0gLUVOT0VOVDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIE9OTFkgY2FsbGVkIGlmIGNvbmZpZ2ZzX2RlcGVuZF9wcmVwKCkgZGlkIGl0cyBqb2IuICBTbyB3ZSBjYW4KKyAqIHRydXN0IHRoZSBlbnRpcmUgcGF0aCBmcm9tIGl0ZW0gYmFjayB1cCB0byBvcmlnaW4uCisgKgorICogV2Ugd2FsayBiYWNrd2FyZHMgZnJvbSBpdGVtLCB1bmxvY2tpbmcgZWFjaCBpX211dGV4LiAgV2UgZmluaXNoIGJ5CisgKiB1bmxvY2tpbmcgb3JpZ2luLgorICovCitzdGF0aWMgdm9pZCBjb25maWdmc19kZXBlbmRfcm9sbGJhY2soc3RydWN0IGRlbnRyeSAqb3JpZ2luLAorCQkJCSAgICAgc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGl0ZW0tPmNpX2RlbnRyeTsKKworCXdoaWxlIChkZW50cnkgIT0gb3JpZ2luKSB7CisJCW11dGV4X3VubG9jaygmZGVudHJ5LT5kX2lub2RlLT5pX211dGV4KTsKKwkJZGVudHJ5ID0gZGVudHJ5LT5kX3BhcmVudDsKKwl9CisKKwltdXRleF91bmxvY2soJm9yaWdpbi0+ZF9pbm9kZS0+aV9tdXRleCk7Cit9CisKK2ludCBjb25maWdmc19kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICpzdWJzeXMsCisJCQkgc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY29uZmlnZnNfZGlyZW50ICpwLCAqcm9vdF9zZCwgKnN1YnN5c19zZCA9IE5VTEw7CisJc3RydWN0IGNvbmZpZ19pdGVtICpzX2l0ZW0gPSAmc3Vic3lzLT5zdV9ncm91cC5jZ19pdGVtOworCisJLyoKKwkgKiBQaW4gdGhlIGNvbmZpZ2ZzIGZpbGVzeXN0ZW0uICBUaGlzIG1lYW5zIHdlIGNhbiBzYWZlbHkgYWNjZXNzCisJICogdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ2ZzIGZpbGVzeXN0ZW0uCisJICovCisJcmV0ID0gY29uZmlnZnNfcGluX2ZzKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogTmV4dCwgbG9jayB0aGUgcm9vdCBkaXJlY3RvcnkuICBXZSdyZSBnb2luZyB0byBjaGVjayB0aGF0IHRoZQorCSAqIHN1YnN5c3RlbSBpcyByZWFsbHkgcmVnaXN0ZXJlZCwgYW5kIHNvIHdlIG5lZWQgdG8gbG9jayBvdXQKKwkgKiBjb25maWdmc19bdW5dcmVnaXN0ZXJfc3Vic3lzdGVtKCkuCisJICovCisJbXV0ZXhfbG9jaygmY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwlyb290X3NkID0gY29uZmlnZnNfc2ItPnNfcm9vdC0+ZF9mc2RhdGE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZyb290X3NkLT5zX2NoaWxkcmVuLCBzX3NpYmxpbmcpIHsKKwkJaWYgKHAtPnNfdHlwZSAmIENPTkZJR0ZTX0RJUikgeworCQkJaWYgKHAtPnNfZWxlbWVudCA9PSBzX2l0ZW0pIHsKKwkJCQlzdWJzeXNfc2QgPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFzdWJzeXNfc2QpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXRfdW5sb2NrX2ZzOworCX0KKworCS8qIE9rLCBub3cgd2UgY2FuIHRydXN0IHN1YnN5cy9zX2l0ZW0gKi8KKworCS8qIFNjYW4gdGhlIHRyZWUsIGxvY2tpbmcgaV9tdXRleCByZWN1cnNpdmVseSwgcmV0dXJuIDAgaWYgZm91bmQgKi8KKwlyZXQgPSBjb25maWdmc19kZXBlbmRfcHJlcChzdWJzeXNfc2QtPnNfZGVudHJ5LCB0YXJnZXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VubG9ja19mczsKKworCS8qIFdlIGhvbGQgYWxsIGlfbXV0ZXhlcyBmcm9tIHRoZSBzdWJzeXN0ZW0gZG93biB0byB0aGUgdGFyZ2V0ICovCisJcCA9IHRhcmdldC0+Y2lfZGVudHJ5LT5kX2ZzZGF0YTsKKwlwLT5zX2RlcGVuZGVudF9jb3VudCArPSAxOworCisJY29uZmlnZnNfZGVwZW5kX3JvbGxiYWNrKHN1YnN5c19zZC0+c19kZW50cnksIHRhcmdldCk7CisKK291dF91bmxvY2tfZnM6CisJbXV0ZXhfdW5sb2NrKCZjb25maWdmc19zYi0+c19yb290LT5kX2lub2RlLT5pX211dGV4KTsKKworCS8qCisJICogSWYgd2Ugc3VjY2VlZGVkLCB0aGUgZnMgaXMgcGlubmVkIHZpYSBvdGhlciBtZXRob2RzLiAgSWYgbm90LAorCSAqIHdlJ3JlIGRvbmUgd2l0aCBpdCBhbnl3YXkuICBTbyByZWxlYXNlX2ZzKCkgaXMgYWx3YXlzIHJpZ2h0LgorCSAqLworCWNvbmZpZ2ZzX3JlbGVhc2VfZnMoKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKTsKKworLyoKKyAqIFJlbGVhc2UgdGhlIGRlcGVuZGVudCBsaW5rYWdlLiAgVGhpcyBpcyBtdWNoIHNpbXBsZXIgdGhhbgorICogY29uZmlnZnNfZGVwZW5kX2l0ZW0oKSBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGF0IHRoZSBjbGllbnQgZHJpdmVyIGlzCisgKiBwaW5uZWQsIHRodXMgdGhlIHN1YnN5c3RlbSBpcyBwaW5uZWQsIGFuZCB0aGVyZWZvcmUgY29uZmlnZnMgaXMgcGlubmVkLgorICovCit2b2lkIGNvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSAqc3Vic3lzLAorCQkJICAgIHN0cnVjdCBjb25maWdfaXRlbSAqdGFyZ2V0KQoreworCXN0cnVjdCBjb25maWdmc19kaXJlbnQgKnNkOworCisJLyoKKwkgKiBTaW5jZSB3ZSBjYW4gdHJ1c3QgZXZlcnl0aGluZyBpcyBwaW5uZWQsIHdlIGp1c3QgbmVlZCBpX211dGV4CisJICogb24gdGhlIGl0ZW0uCisJICovCisJbXV0ZXhfbG9jaygmdGFyZ2V0LT5jaV9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJc2QgPSB0YXJnZXQtPmNpX2RlbnRyeS0+ZF9mc2RhdGE7CisJQlVHX09OKHNkLT5zX2RlcGVuZGVudF9jb3VudCA8IDEpOworCisJc2QtPnNfZGVwZW5kZW50X2NvdW50IC09IDE7CisKKwkvKgorCSAqIEFmdGVyIHRoaXMgdW5sb2NrLCB3ZSBjYW5ub3QgdHJ1c3QgdGhlIGl0ZW0gdG8gc3RheSBhbGl2ZSEKKwkgKiBETyBOT1QgUkVGRVJFTkNFIGl0ZW0gYWZ0ZXIgdGhpcyB1bmxvY2suCisJICovCisJbXV0ZXhfdW5sb2NrKCZ0YXJnZXQtPmNpX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0pOwogCiBzdGF0aWMgaW50IGNvbmZpZ2ZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQogewpAQCAtNzgzLDcgKzEwNDIsNyBAQAogCiAJc25wcmludGYobmFtZSwgZGVudHJ5LT5kX25hbWUubGVuICsgMSwgIiVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKLQlkb3duKCZzdWJzeXMtPnN1X3NlbSk7CisJbXV0ZXhfbG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CiAJZ3JvdXAgPSBOVUxMOwogCWl0ZW0gPSBOVUxMOwogCWlmICh0eXBlLT5jdF9ncm91cF9vcHMtPm1ha2VfZ3JvdXApIHsKQEAgLTc5Nyw3ICsxMDU2LDcgQEAKIAkJaWYgKGl0ZW0pCiAJCQlsaW5rX29iaihwYXJlbnRfaXRlbSwgaXRlbSk7CiAJfQotCXVwKCZzdWJzeXMtPnN1X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKIAogCWtmcmVlKG5hbWUpOwogCWlmICghaXRlbSkgewpAQCAtODQxLDEzICsxMTAwLDE2IEBACiBvdXRfdW5saW5rOgogCWlmIChyZXQpIHsKIAkJLyogVGVhciBkb3duIGV2ZXJ5dGhpbmcgd2UgYnVpbHQgdXAgKi8KLQkJZG93bigmc3Vic3lzLT5zdV9zZW0pOworCQltdXRleF9sb2NrKCZzdWJzeXMtPnN1X211dGV4KTsKKworCQljbGllbnRfZGlzY29ubmVjdF9ub3RpZnkocGFyZW50X2l0ZW0sIGl0ZW0pOwogCQlpZiAoZ3JvdXApCiAJCQl1bmxpbmtfZ3JvdXAoZ3JvdXApOwogCQllbHNlCiAJCQl1bmxpbmtfb2JqKGl0ZW0pOwogCQljbGllbnRfZHJvcF9pdGVtKHBhcmVudF9pdGVtLCBpdGVtKTsKLQkJdXAoJnN1YnN5cy0+c3Vfc2VtKTsKKworCQltdXRleF91bmxvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOwogCiAJCWlmIChtb2R1bGVfZ290KQogCQkJbW9kdWxlX3B1dChvd25lcik7CkBAIC04ODEsNiArMTE0MywxMyBAQAogCWlmIChzZC0+c190eXBlICYgQ09ORklHRlNfVVNFVF9ERUZBVUxUKQogCQlyZXR1cm4gLUVQRVJNOwogCisJLyoKKwkgKiBIZXJlJ3Mgd2hlcmUgd2UgY2hlY2sgZm9yIGRlcGVuZGVudHMuICBXZSdyZSBwcm90ZWN0ZWQgYnkKKwkgKiBpX211dGV4LgorCSAqLworCWlmIChzZC0+c19kZXBlbmRlbnRfY291bnQpCisJCXJldHVybiAtRUJVU1k7CisKIAkvKiBHZXQgYSB3b3JraW5nIHJlZiB1bnRpbCB3ZSBoYXZlIHRoZSBjaGlsZCAqLwogCXBhcmVudF9pdGVtID0gY29uZmlnZnNfZ2V0X2NvbmZpZ19pdGVtKGRlbnRyeS0+ZF9wYXJlbnQpOwogCXN1YnN5cyA9IHRvX2NvbmZpZ19ncm91cChwYXJlbnRfaXRlbSktPmNnX3N1YnN5czsKQEAgLTkxMCwxNyArMTE3OSwxOSBAQAogCWlmIChzZC0+c190eXBlICYgQ09ORklHRlNfVVNFVF9ESVIpIHsKIAkJY29uZmlnZnNfZGV0YWNoX2dyb3VwKGl0ZW0pOwogCi0JCWRvd24oJnN1YnN5cy0+c3Vfc2VtKTsKKwkJbXV0ZXhfbG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CisJCWNsaWVudF9kaXNjb25uZWN0X25vdGlmeShwYXJlbnRfaXRlbSwgaXRlbSk7CiAJCXVubGlua19ncm91cCh0b19jb25maWdfZ3JvdXAoaXRlbSkpOwogCX0gZWxzZSB7CiAJCWNvbmZpZ2ZzX2RldGFjaF9pdGVtKGl0ZW0pOwogCi0JCWRvd24oJnN1YnN5cy0+c3Vfc2VtKTsKKwkJbXV0ZXhfbG9jaygmc3Vic3lzLT5zdV9tdXRleCk7CisJCWNsaWVudF9kaXNjb25uZWN0X25vdGlmeShwYXJlbnRfaXRlbSwgaXRlbSk7CiAJCXVubGlua19vYmooaXRlbSk7CiAJfQogCiAJY2xpZW50X2Ryb3BfaXRlbShwYXJlbnRfaXRlbSwgaXRlbSk7Ci0JdXAoJnN1YnN5cy0+c3Vfc2VtKTsKKwltdXRleF91bmxvY2soJnN1YnN5cy0+c3VfbXV0ZXgpOwogCiAJLyogRHJvcCBvdXIgcmVmZXJlbmNlIGZyb20gYWJvdmUgKi8KIAljb25maWdfaXRlbV9wdXQoaXRlbSk7CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9maWxlLmMgYi9mcy9jb25maWdmcy9maWxlLmMKaW5kZXggMzUyN2M3Yy4uYTM2NThmOSAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvZmlsZS5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwpAQCAtMjcsMTkgKzI3LDI2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZ2ZzLmg+CiAjaW5jbHVkZSAiY29uZmlnZnNfaW50ZXJuYWwuaCIKIAorLyoKKyAqIEEgc2ltcGxlIGF0dHJpYnV0ZSBjYW4gb25seSBiZSA0MDk2IGNoYXJhY3RlcnMuICBXaHkgNGs/ICBCZWNhdXNlIHRoZQorICogb3JpZ2luYWwgY29kZSBsaW1pdGVkIGl0IHRvIFBBR0VfU0laRS4gIFRoYXQncyBhIGJhZCBpZGVhLCB0aG91Z2gsCisgKiBiZWNhdXNlIGFuIGF0dHJpYnV0ZSBvZiAxNmsgb24gaWE2NCB3b24ndCB3b3JrIG9uIHg4Ni4gIFNvIHdlIGxpbWl0IHRvCisgKiA0aywgb3VyIG1pbmltdW0gY29tbW9uIHBhZ2Ugc2l6ZS4KKyAqLworI2RlZmluZSBTSU1QTEVfQVRUUl9TSVpFIDQwOTYKIAogc3RydWN0IGNvbmZpZ2ZzX2J1ZmZlciB7CiAJc2l6ZV90CQkJY291bnQ7CiAJbG9mZl90CQkJcG9zOwogCWNoYXIJCQkqIHBhZ2U7CiAJc3RydWN0IGNvbmZpZ2ZzX2l0ZW1fb3BlcmF0aW9ucwkqIG9wczsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCWludAkJCW5lZWRzX3JlYWRfZmlsbDsKIH07CiAKQEAgLTY5LDcgKzc2LDcgQEAKIAogCWNvdW50ID0gb3BzLT5zaG93X2F0dHJpYnV0ZShpdGVtLGF0dHIsYnVmZmVyLT5wYWdlKTsKIAlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDA7Ci0JQlVHX09OKGNvdW50ID4gKHNzaXplX3QpUEFHRV9TSVpFKTsKKwlCVUdfT04oY291bnQgPiAoc3NpemVfdClTSU1QTEVfQVRUUl9TSVpFKTsKIAlpZiAoY291bnQgPj0gMCkKIAkJYnVmZmVyLT5jb3VudCA9IGNvdW50OwogCWVsc2UKQEAgLTEwMiw3ICsxMDksNyBAQAogCXN0cnVjdCBjb25maWdmc19idWZmZXIgKiBidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3NpemVfdCByZXR2YWwgPSAwOwogCi0JZG93bigmYnVmZmVyLT5zZW0pOworCW11dGV4X2xvY2soJmJ1ZmZlci0+bXV0ZXgpOwogCWlmIChidWZmZXItPm5lZWRzX3JlYWRfZmlsbCkgewogCQlpZiAoKHJldHZhbCA9IGZpbGxfcmVhZF9idWZmZXIoZmlsZS0+Zl9wYXRoLmRlbnRyeSxidWZmZXIpKSkKIAkJCWdvdG8gb3V0OwpAQCAtMTEyLDcgKzExOSw3IEBACiAJcmV0dmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgYnVmZmVyLT5wYWdlLAogCQkJCQkgYnVmZmVyLT5jb3VudCk7CiBvdXQ6Ci0JdXAoJmJ1ZmZlci0+c2VtKTsKKwltdXRleF91bmxvY2soJmJ1ZmZlci0+bXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEzNyw4ICsxNDQsOCBAQAogCWlmICghYnVmZmVyLT5wYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChjb3VudCA+PSBQQUdFX1NJWkUpCi0JCWNvdW50ID0gUEFHRV9TSVpFIC0gMTsKKwlpZiAoY291bnQgPj0gU0lNUExFX0FUVFJfU0laRSkKKwkJY291bnQgPSBTSU1QTEVfQVRUUl9TSVpFIC0gMTsKIAllcnJvciA9IGNvcHlfZnJvbV91c2VyKGJ1ZmZlci0+cGFnZSxidWYsY291bnQpOwogCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKIAkvKiBpZiBidWYgaXMgYXNzdW1lZCB0byBjb250YWluIGEgc3RyaW5nLCB0ZXJtaW5hdGUgaXQgYnkgXDAsCkBAIC0xOTMsMTMgKzIwMCwxMyBAQAogCXN0cnVjdCBjb25maWdmc19idWZmZXIgKiBidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3NpemVfdCBsZW47CiAKLQlkb3duKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfbG9jaygmYnVmZmVyLT5tdXRleCk7CiAJbGVuID0gZmlsbF93cml0ZV9idWZmZXIoYnVmZmVyLCBidWYsIGNvdW50KTsKIAlpZiAobGVuID4gMCkKIAkJbGVuID0gZmx1c2hfd3JpdGVfYnVmZmVyKGZpbGUtPmZfcGF0aC5kZW50cnksIGJ1ZmZlciwgY291bnQpOwogCWlmIChsZW4gPiAwKQogCQkqcHBvcyArPSBsZW47Ci0JdXAoJmJ1ZmZlci0+c2VtKTsKKwltdXRleF91bmxvY2soJmJ1ZmZlci0+bXV0ZXgpOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTI1Myw3ICsyNjAsNyBAQAogCQllcnJvciA9IC1FTk9NRU07CiAJCWdvdG8gRW5vbWVtOwogCX0KLQlpbml0X01VVEVYKCZidWZmZXItPnNlbSk7CisJbXV0ZXhfaW5pdCgmYnVmZmVyLT5tdXRleCk7CiAJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOwogCWJ1ZmZlci0+b3BzID0gb3BzOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ1ZmZlcjsKQEAgLTI5Miw2ICsyOTksNyBAQAogCWlmIChidWZmZXIpIHsKIAkJaWYgKGJ1ZmZlci0+cGFnZSkKIAkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWZmZXItPnBhZ2UpOworCQltdXRleF9kZXN0cm95KCZidWZmZXItPm11dGV4KTsKIAkJa2ZyZWUoYnVmZmVyKTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9pdGVtLmMgYi9mcy9jb25maWdmcy9pdGVtLmMKaW5kZXggMjQ0MjEyMC4uNzZkYzRjMyAxMDA2NDQKLS0tIGEvZnMvY29uZmlnZnMvaXRlbS5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2l0ZW0uYwpAQCAtNjIsNyArNjIsNiBAQAogICoJZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cmluZyB0aGF0IEBpdGVtLT5jaV9uYW1lIHBvaW50cyB0by4KICAqCU90aGVyd2lzZSwgdXNlIHRoZSBzdGF0aWMgQGl0ZW0tPmNpX25hbWVidWYgYXJyYXkuCiAgKi8KLQogaW50IGNvbmZpZ19pdGVtX3NldF9uYW1lKHN0cnVjdCBjb25maWdfaXRlbSAqIGl0ZW0sIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMTM5LDEyICsxMzgsNyBAQAogCXJldHVybiBpdGVtOwogfQogCi0vKioKLSAqCWNvbmZpZ19pdGVtX2NsZWFudXAgLSBmcmVlIGNvbmZpZ19pdGVtIHJlc291cmNlcy4KLSAqCUBpdGVtOglpdGVtLgotICovCi0KLXZvaWQgY29uZmlnX2l0ZW1fY2xlYW51cChzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBpdGVtKQorc3RhdGljIHZvaWQgY29uZmlnX2l0ZW1fY2xlYW51cChzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBpdGVtKQogewogCXN0cnVjdCBjb25maWdfaXRlbV90eXBlICogdCA9IGl0ZW0tPmNpX3R5cGU7CiAJc3RydWN0IGNvbmZpZ19ncm91cCAqIHMgPSBpdGVtLT5jaV9ncm91cDsKQEAgLTE3OSwzOSArMTczLDM1IEBACiAJCWtyZWZfcHV0KCZpdGVtLT5jaV9rcmVmLCBjb25maWdfaXRlbV9yZWxlYXNlKTsKIH0KIAotCiAvKioKICAqCWNvbmZpZ19ncm91cF9pbml0IC0gaW5pdGlhbGl6ZSBhIGdyb3VwIGZvciB1c2UKICAqCUBrOglncm91cAogICovCi0KIHZvaWQgY29uZmlnX2dyb3VwX2luaXQoc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXApCiB7CiAJY29uZmlnX2l0ZW1faW5pdCgmZ3JvdXAtPmNnX2l0ZW0pOwogCUlOSVRfTElTVF9IRUFEKCZncm91cC0+Y2dfY2hpbGRyZW4pOwogfQogCi0KIC8qKgotICoJY29uZmlnX2dyb3VwX2ZpbmRfb2JqIC0gc2VhcmNoIGZvciBpdGVtIGluIGdyb3VwLgorICoJY29uZmlnX2dyb3VwX2ZpbmRfaXRlbSAtIHNlYXJjaCBmb3IgaXRlbSBpbiBncm91cC4KICAqCUBncm91cDoJZ3JvdXAgd2UncmUgbG9va2luZyBpbi4KICAqCUBuYW1lOglpdGVtJ3MgbmFtZS4KICAqCi0gKglMb2NrIGdyb3VwIHZpYSBAZ3JvdXAtPmNnX3N1YnN5cywgYW5kIGl0ZXJhdGUgb3ZlciBAZ3JvdXAtPmNnX2xpc3QsCi0gKglsb29raW5nIGZvciBhIG1hdGNoaW5nIGNvbmZpZ19pdGVtLiBJZiBtYXRjaGluZyBpdGVtIGlzIGZvdW5kCi0gKgl0YWtlIGEgcmVmZXJlbmNlIGFuZCByZXR1cm4gdGhlIGl0ZW0uCisgKglJdGVyYXRlIG92ZXIgQGdyb3VwLT5jZ19saXN0LCBsb29raW5nIGZvciBhIG1hdGNoaW5nIGNvbmZpZ19pdGVtLgorICoJSWYgbWF0Y2hpbmcgaXRlbSBpcyBmb3VuZCB0YWtlIGEgcmVmZXJlbmNlIGFuZCByZXR1cm4gdGhlIGl0ZW0uCisgKglDYWxsZXIgbXVzdCBoYXZlIGxvY2tlZCBncm91cCB2aWEgQGdyb3VwLT5jZ19zdWJzeXMtPnN1X210eC4KICAqLwotCi1zdHJ1Y3QgY29uZmlnX2l0ZW0gKiBjb25maWdfZ3JvdXBfZmluZF9vYmooc3RydWN0IGNvbmZpZ19ncm91cCAqIGdyb3VwLCBjb25zdCBjaGFyICogbmFtZSkKK3N0cnVjdCBjb25maWdfaXRlbSAqY29uZmlnX2dyb3VwX2ZpbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKKwkJCQkJICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICogZW50cnk7CiAJc3RydWN0IGNvbmZpZ19pdGVtICogcmV0ID0gTlVMTDsKIAotICAgICAgICAvKiBYWFggTE9DS0lORyEgKi8KIAlsaXN0X2Zvcl9lYWNoKGVudHJ5LCZncm91cC0+Y2dfY2hpbGRyZW4pIHsKIAkJc3RydWN0IGNvbmZpZ19pdGVtICogaXRlbSA9IHRvX2l0ZW0oZW50cnkpOwogCQlpZiAoY29uZmlnX2l0ZW1fbmFtZShpdGVtKSAmJgotICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGNvbmZpZ19pdGVtX25hbWUoaXRlbSksIG5hbWUpKSB7CisJCSAgICAhc3RyY21wKGNvbmZpZ19pdGVtX25hbWUoaXRlbSksIG5hbWUpKSB7CiAJCQlyZXQgPSBjb25maWdfaXRlbV9nZXQoaXRlbSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMjE5LDkgKzIwOSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiBFWFBPUlRfU1lNQk9MKGNvbmZpZ19pdGVtX2luaXQpOwogRVhQT1JUX1NZTUJPTChjb25maWdfZ3JvdXBfaW5pdCk7CiBFWFBPUlRfU1lNQk9MKGNvbmZpZ19pdGVtX2dldCk7CiBFWFBPUlRfU1lNQk9MKGNvbmZpZ19pdGVtX3B1dCk7Ci1FWFBPUlRfU1lNQk9MKGNvbmZpZ19ncm91cF9maW5kX29iaik7CitFWFBPUlRfU1lNQk9MKGNvbmZpZ19ncm91cF9maW5kX2l0ZW0pOwpkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCAwZTczYWEwLi5jYjlkMDUwIDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtODgzLDYgKzg4MywxMSBAQAogCXJldHVybiAoZGVudHJ5X3N0YXQubnJfdW51c2VkIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgZGNhY2hlX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBzaHJpbmtfZGNhY2hlX21lbW9yeSwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKKwogLyoqCiAgKiBkX2FsbG9jCS0JYWxsb2NhdGUgYSBkY2FjaGUgZW50cnkKICAqIEBwYXJlbnQ6IHBhcmVudCBvZiBlbnRyeSB0byBhbGxvY2F0ZQpAQCAtMjExNSw3ICsyMTIwLDcgQEAKIAlkZW50cnlfY2FjaGUgPSBLTUVNX0NBQ0hFKGRlbnRyeSwKIAkJU0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQ3xTTEFCX01FTV9TUFJFQUQpOwogCQotCXNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBzaHJpbmtfZGNhY2hlX21lbW9yeSk7CisJcmVnaXN0ZXJfc2hyaW5rZXIoJmRjYWNoZV9zaHJpbmtlcik7CiAKIAkvKiBIYXNoIG1heSBoYXZlIGJlZW4gc2V0IHVwIGluIGRjYWNoZV9pbml0X2Vhcmx5ICovCiAJaWYgKCFoYXNoZGlzdCkKZGlmZiAtLWdpdCBhL2ZzL2RsbS9jb25maWcuYyBiL2ZzL2RsbS9jb25maWcuYwppbmRleCA1MDY5YjJjLi4yZjhlM2M4IDEwMDY0NAotLS0gYS9mcy9kbG0vY29uZmlnLmMKKysrIGIvZnMvZGxtL2NvbmZpZy5jCkBAIC0xMzMsMTQgKzEzMyw2IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotI2RlZmluZSBfX0NPTkZJR0ZTX0FUVFIoX25hbWUsX21vZGUsX3JlYWQsX3dyaXRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS5hdHRyICAgPSB7IC5jYV9uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICAuY2FfbW9kZSA9IF9tb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkgICAgLmNhX293bmVyID0gVEhJU19NT0RVTEUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkuc2hvdyAgID0gX3JlYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCS5zdG9yZSAgPSBfd3JpdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KICNkZWZpbmUgQ0xVU1RFUl9BVFRSKG5hbWUsIGNoZWNrX3plcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHN0YXRpYyBzc2l6ZV90IG5hbWUjI193cml0ZShzdHJ1Y3QgY2x1c3RlciAqY2wsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTYxNSw3ICs2MDcsNyBAQAogaW50IGRsbV9jb25maWdfaW5pdCh2b2lkKQogewogCWNvbmZpZ19ncm91cF9pbml0KCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9ncm91cCk7Ci0JaW5pdF9NVVRFWCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3Vfc2VtKTsKKwltdXRleF9pbml0KCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9tdXRleCk7CiAJcmV0dXJuIGNvbmZpZ2ZzX3JlZ2lzdGVyX3N1YnN5c3RlbSgmY2x1c3RlcnNfcm9vdC5zdWJzeXMpOwogfQogCkBAIC03NTksOSArNzUxLDkgQEAKIAlpZiAoIXNwYWNlX2xpc3QpCiAJCXJldHVybiBOVUxMOwogCi0JZG93bigmc3BhY2VfbGlzdC0+Y2dfc3Vic3lzLT5zdV9zZW0pOwotCWkgPSBjb25maWdfZ3JvdXBfZmluZF9vYmooc3BhY2VfbGlzdCwgbmFtZSk7Ci0JdXAoJnNwYWNlX2xpc3QtPmNnX3N1YnN5cy0+c3Vfc2VtKTsKKwltdXRleF9sb2NrKCZzcGFjZV9saXN0LT5jZ19zdWJzeXMtPnN1X211dGV4KTsKKwlpID0gY29uZmlnX2dyb3VwX2ZpbmRfaXRlbShzcGFjZV9saXN0LCBuYW1lKTsKKwltdXRleF91bmxvY2soJnNwYWNlX2xpc3QtPmNnX3N1YnN5cy0+c3VfbXV0ZXgpOwogCiAJcmV0dXJuIHRvX3NwYWNlKGkpOwogfQpAQCAtNzgwLDcgKzc3Miw3IEBACiAJaWYgKCFjb21tX2xpc3QpCiAJCXJldHVybiBOVUxMOwogCi0JZG93bigmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3Vfc2VtKTsKKwltdXRleF9sb2NrKCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9tdXRleCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZjb21tX2xpc3QtPmNnX2NoaWxkcmVuLCBjaV9lbnRyeSkgewogCQljbSA9IHRvX2NvbW0oaSk7CkBAIC04MDAsNyArNzkyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXVwKCZjbHVzdGVyc19yb290LnN1YnN5cy5zdV9zZW0pOworCW11dGV4X3VubG9jaygmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfbXV0ZXgpOwogCiAJaWYgKCFmb3VuZCkKIAkJY20gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvZHF1b3QuYyBiL2ZzL2RxdW90LmMKaW5kZXggODgxOWQyOC4uN2UyNzMxNSAxMDA2NDQKLS0tIGEvZnMvZHF1b3QuYworKysgYi9mcy9kcXVvdC5jCkBAIC01MzgsNiArNTM4LDExIEBACiAJcmV0dXJuIChkcXN0YXRzLmZyZWVfZHF1b3RzIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgZHFjYWNoZV9zaHJpbmtlciA9IHsKKwkuc2hyaW5rID0gc2hyaW5rX2RxY2FjaGVfbWVtb3J5LAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OworCiAvKgogICogUHV0IHJlZmVyZW5jZSB0byBkcXVvdAogICogTk9URTogSWYgeW91IGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHBsZWFzZSBjaGVjayB3aGV0aGVyIGRxcHV0X2Jsb2NrcygpIHdvcmtzIHJpZ2h0Li4uCkBAIC0xODcwLDcgKzE4NzUsNyBAQAogCXByaW50aygiRHF1b3QtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAlbGQgKG9yZGVyICVsZCwgJWxkIGJ5dGVzKVxuIiwKIAkJCW5yX2hhc2gsIG9yZGVyLCAoUEFHRV9TSVpFIDw8IG9yZGVyKSk7CiAKLQlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2RxY2FjaGVfbWVtb3J5KTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmZHFjYWNoZV9zaHJpbmtlcik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2Ryb3BfY2FjaGVzLmMgYi9mcy9kcm9wX2NhY2hlcy5jCmluZGV4IDAzZWE3NjkuLjU5Mzc1ZWYgMTAwNjQ0Ci0tLSBhL2ZzL2Ryb3BfY2FjaGVzLmMKKysrIGIvZnMvZHJvcF9jYWNoZXMuYwpAQCAtMjAsNyArMjAsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZzYi0+c19pbm9kZXMsIGlfc2JfbGlzdCkgewogCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HfElfV0lMTF9GUkVFKSkKIAkJCWNvbnRpbnVlOwotCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgMCwgLTEpOworCQlfX2ludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwLCAtMSwgdHJ1ZSk7CiAJfQogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2lub2RlLmMgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCmluZGV4IDgzZTk0ZmUuLmU3N2EyZWMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL2lub2RlLmMKKysrIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJc3RydWN0IGRlbnRyeSAqbG93ZXJfZGVudHJ5OwogCXN0cnVjdCB2ZnNtb3VudCAqbG93ZXJfbW50OwogCWNoYXIgKmVuY29kZWRfbmFtZTsKLQl1bnNpZ25lZCBpbnQgZW5jb2RlZF9uYW1lbGVuOworCWludCBlbmNvZGVkX25hbWVsZW47CiAJc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQgPSBOVUxMOwogCXN0cnVjdCBlY3J5cHRmc19tb3VudF9jcnlwdF9zdGF0ICptb3VudF9jcnlwdF9zdGF0OwogCWNoYXIgKnBhZ2VfdmlydCA9IE5VTEw7CkBAIC00NzMsNyArNDczLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpsb3dlcl9kaXJfZGVudHJ5OwogCXVtb2RlX3QgbW9kZTsKIAljaGFyICplbmNvZGVkX3N5bW5hbWU7Ci0JdW5zaWduZWQgaW50IGVuY29kZWRfc3ltbGVuOworCWludCBlbmNvZGVkX3N5bWxlbjsKIAlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCA9IE5VTEw7CiAKIAlsb3dlcl9kZW50cnkgPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXIoZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9uYW1laS5jIGIvZnMvZWZzL25hbWVpLmMKaW5kZXggZWQ0YTIwNy4uNTI3NmIxOSAxMDA2NDQKLS0tIGEvZnMvZWZzL25hbWVpLmMKKysrIGIvZnMvZWZzL25hbWVpLmMKQEAgLTc1LDYgKzc1LDM4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0cnVjdCBkZW50cnkgKmVmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQoreworCV9fdTMyICpvYmpwID0gdm9ianA7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBvYmpwWzBdOworCV9fdTMyIGdlbmVyYXRpb24gPSBvYmpwWzFdOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCisJaWYgKGlubyA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwlpbm9kZSA9IGlnZXQoc2IsIGlubyk7CisJaWYgKGlub2RlID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKKwkgICAgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKSkgeworCSAgICAJcmVzdWx0ID0gRVJSX1BUUigtRVNUQUxFKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9CisKKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCXJlc3VsdCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCXJldHVybiByZXN1bHQ7CisKKyBvdXRfaXB1dDoKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCiBzdHJ1Y3QgZGVudHJ5ICplZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CmRpZmYgLS1naXQgYS9mcy9lZnMvc3VwZXIuYyBiL2ZzL2Vmcy9zdXBlci5jCmluZGV4IGUwYTY4MzkuLmQzNjBjODEgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9zdXBlci5jCisrKyBiL2ZzL2Vmcy9zdXBlci5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZWZzX3ZoLmg+CiAjaW5jbHVkZSA8bGludXgvZWZzX2ZzX3NiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KQEAgLTExMyw2ICsxMTQsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBlZnNfZXhwb3J0X29wcyA9IHsKKwkuZ2V0X2RlbnRyeQk9IGVmc19nZXRfZGVudHJ5LAogCS5nZXRfcGFyZW50CT0gZWZzX2dldF9wYXJlbnQsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHBvcnRmcy9leHBmcy5jIGIvZnMvZXhwb3J0ZnMvZXhwZnMuYwppbmRleCBlOThmNmNkLi44YWRiMzJhIDEwMDY0NAotLS0gYS9mcy9leHBvcnRmcy9leHBmcy5jCisrKyBiL2ZzL2V4cG9ydGZzL2V4cGZzLmMKQEAgLTEsMTUgKzEsNDUgQEAKIAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogCi1zdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXhwb3J0X29wX2RlZmF1bHQ7Ci0KLSNkZWZpbmUJQ0FMTChvcHMsZnVuKSAoKG9wcy0+ZnVuKT8ob3BzLT5mdW4pOmV4cG9ydF9vcF9kZWZhdWx0LmZ1bikKLQogI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikgZG97fXdoaWxlKDApCiAKKworc3RhdGljIGludCBnZXRfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKm5hbWUsCisJCXN0cnVjdCBkZW50cnkgKmNoaWxkKTsKKworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZXhwb3J0ZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvYmopCit7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0ID0gRVJSX1BUUigtRVNUQUxFKTsKKworCWlmIChzYi0+c19leHBvcnRfb3AtPmdldF9kZW50cnkpIHsKKwkJcmVzdWx0ID0gc2ItPnNfZXhwb3J0X29wLT5nZXRfZGVudHJ5KHNiLCBvYmopOworCQlpZiAoIXJlc3VsdCkKKwkJCXJlc3VsdCA9IEVSUl9QVFIoLUVTVEFMRSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBleHBvcnRmc19nZXRfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkaXIsIGNoYXIgKm5hbWUsCisJCXN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wID0gZGlyLT5kX3NiLT5zX2V4cG9ydF9vcDsKKworCWlmIChub3AtPmdldF9uYW1lKQorCQlyZXR1cm4gbm9wLT5nZXRfbmFtZShkaXIsIG5hbWUsIGNoaWxkKTsKKwllbHNlCisJCXJldHVybiBnZXRfbmFtZShkaXIsIG5hbWUsIGNoaWxkKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBkZW50cnkgb3IgYW55IG9mIGl0J3MgYWxpYXNlcyBpcyBhY2NlcHRhYmxlLgorICovCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqCiBmaW5kX2FjY2VwdGFibGVfYWxpYXMoc3RydWN0IGRlbnRyeSAqcmVzdWx0LAogCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpLApAQCAtMTcsNiArNDcsOSBAQAogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgKnRvcHV0ID0gTlVMTDsKIAorCWlmIChhY2NlcHRhYmxlKGNvbnRleHQsIHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKIAlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlbnRyeSwgJnJlc3VsdC0+ZF9pbm9kZS0+aV9kZW50cnksIGRfYWxpYXMpIHsKIAkJZGdldF9sb2NrZWQoZGVudHJ5KTsKQEAgLTM3LDYgKzcwLDE1MCBAQAogCXJldHVybiBOVUxMOwogfQogCisvKgorICogRmluZCByb290IG9mIGEgZGlzY29ubmVjdGVkIHN1YnRyZWUgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0byBpdC4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorZmluZF9kaXNjb25uZWN0ZWRfcm9vdChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJZGdldChkZW50cnkpOworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCXdoaWxlICghSVNfUk9PVChkZW50cnkpICYmCisJICAgICAgIChkZW50cnktPmRfcGFyZW50LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwkJZGdldChwYXJlbnQpOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IHBhcmVudDsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworCisvKgorICogTWFrZSBzdXJlIHRhcmdldF9kaXIgaXMgZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBkZW50cnkgdHJlZS4KKyAqCisgKiBJdCBtYXkgYWxyZWFkeSBiZSwgYXMgdGhlIGZsYWcgaXNuJ3QgYWx3YXlzIHVwZGF0ZWQgd2hlbiBjb25uZWN0aW9uIGhhcHBlbnMuCisgKi8KK3N0YXRpYyBpbnQKK3JlY29ubmVjdF9wYXRoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKnRhcmdldF9kaXIpCit7CisJY2hhciBuYnVmW05BTUVfTUFYKzFdOworCWludCBub3Byb2dyZXNzID0gMDsKKwlpbnQgZXJyID0gLUVTVEFMRTsKKworCS8qCisJICogSXQgaXMgcG9zc2libGUgdGhhdCBhIGNvbmZ1c2VkIGZpbGUgc3lzdGVtIG1pZ2h0IG5vdCBsZXQgdXMgY29tcGxldGUKKwkgKiB0aGUgcGF0aCB0byB0aGUgcm9vdC4gIEZvciBleGFtcGxlLCBpZiBnZXRfcGFyZW50IHJldHVybnMgYSBkaXJlY3RvcnkKKwkgKiBpbiB3aGljaCB3ZSBjYW5ub3QgZmluZCBhIG5hbWUgZm9yIHRoZSBjaGlsZC4gIFdoaWxlIHRoaXMgaW1wbGllcyBhCisJICogdmVyeSBzaWNrIGZpbGVzeXN0ZW0gd2UgZG9uJ3Qgd2FudCBpdCB0byBjYXVzZSBrbmZzZCB0byBzcGluLiAgSGVuY2UKKwkgKiB0aGUgbm9wcm9ncmVzcyBjb3VudGVyLiAgSWYgd2UgZ28gdGhyb3VnaCB0aGUgbG9vcCAxMCB0aW1lcyAoMiBpcworCSAqIHByb2JhYmx5IGVub3VnaCkgd2l0aG91dCBnZXR0aW5nIGFueXdoZXJlLCB3ZSBqdXN0IGdpdmUgdXAKKwkgKi8KKwl3aGlsZSAodGFyZ2V0X2Rpci0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQgJiYgbm9wcm9ncmVzcysrIDwgMTApIHsKKwkJc3RydWN0IGRlbnRyeSAqcGQgPSBmaW5kX2Rpc2Nvbm5lY3RlZF9yb290KHRhcmdldF9kaXIpOworCisJCWlmICghSVNfUk9PVChwZCkpIHsKKwkJCS8qIG11c3QgaGF2ZSBmb3VuZCBhIGNvbm5lY3RlZCBwYXJlbnQgLSBncmVhdCAqLworCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJbm9wcm9ncmVzcyA9IDA7CisJCX0gZWxzZSBpZiAocGQgPT0gc2ItPnNfcm9vdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJleHBvcnQ6IEVlZWsgZmlsZXN5c3RlbSByb290IGlzIG5vdCBjb25uZWN0ZWQsIGltcG9zc2libGVcbiIpOworCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJbm9wcm9ncmVzcyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogV2UgaGF2ZSBoaXQgdGhlIHRvcCBvZiBhIGRpc2Nvbm5lY3RlZCBwYXRoLCB0cnkgdG8KKwkJCSAqIGZpbmQgcGFyZW50IGFuZCBjb25uZWN0LgorCQkJICoKKwkJCSAqIFJhY2luZyB3aXRoIHNvbWUgb3RoZXIgcHJvY2VzcyByZW5hbWluZyBhIGRpcmVjdG9yeQorCQkJICogaXNuJ3QgbXVjaCBvZiBhIHByb2JsZW0gaGVyZS4gIElmIHNvbWVvbmUgcmVuYW1lcworCQkJICogdGhlIGRpcmVjdG9yeSwgaXQgd2lsbCBlbmQgdXAgcHJvcGVybHkgY29ubmVjdGVkLAorCQkJICogd2hpY2ggaXMgd2hhdCB3ZSB3YW50CisJCQkgKgorCQkJICogR2V0dGluZyB0aGUgcGFyZW50IGNhbid0IGJlIHN1cHBvcnRlZCBnZW5lcmljYWxseSwKKwkJCSAqIHRoZSBsb2NraW5nIGlzIHRvbyBpY2t5LgorCQkJICoKKwkJCSAqIEluc3RlYWQgd2UganVzdCByZXR1cm4gRUFDQ0VTLiAgSWYgc2VydmVyIHJlYm9vdHMKKwkJCSAqIG9yIGlub2RlcyBnZXQgZmx1c2hlZCwgeW91IGxvc2UKKwkJCSAqLworCQkJc3RydWN0IGRlbnRyeSAqcHBkID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJCXN0cnVjdCBkZW50cnkgKm5wZDsKKworCQkJbXV0ZXhfbG9jaygmcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJaWYgKHNiLT5zX2V4cG9ydF9vcC0+Z2V0X3BhcmVudCkKKwkJCQlwcGQgPSBzYi0+c19leHBvcnRfb3AtPmdldF9wYXJlbnQocGQpOworCQkJbXV0ZXhfdW5sb2NrKCZwZC0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwkJCWlmIChJU19FUlIocHBkKSkgeworCQkJCWVyciA9IFBUUl9FUlIocHBkKTsKKwkJCQlkcHJpbnRrKCIlczogZ2V0X3BhcmVudCBvZiAlbGQgZmFpbGVkLCBlcnIgJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgcGQtPmRfaW5vZGUtPmlfaW5vLCBlcnIpOworCQkJCWRwdXQocGQpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlkcHJpbnRrKCIlczogZmluZCBuYW1lIG9mICVsdSBpbiAlbHVcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQlwZC0+ZF9pbm9kZS0+aV9pbm8sIHBwZC0+ZF9pbm9kZS0+aV9pbm8pOworCQkJZXJyID0gZXhwb3J0ZnNfZ2V0X25hbWUocHBkLCBuYnVmLCBwZCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZHB1dChwcGQpOworCQkJCWRwdXQocGQpOworCQkJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCQkJLyogc29tZSByYWNlIGJldHdlZW4gZ2V0X3BhcmVudCBhbmQKKwkJCQkJICogZ2V0X25hbWU/ICBqdXN0IHRyeSBhZ2FpbgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcHJpbnRrKCIlczogZm91bmQgbmFtZTogJXNcbiIsIF9fRlVOQ1RJT05fXywgbmJ1Zik7CisJCQltdXRleF9sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJbnBkID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgcHBkLCBzdHJsZW4obmJ1ZikpOworCQkJbXV0ZXhfdW5sb2NrKCZwcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJaWYgKElTX0VSUihucGQpKSB7CisJCQkJZXJyID0gUFRSX0VSUihucGQpOworCQkJCWRwcmludGsoIiVzOiBsb29rdXAgZmFpbGVkOiAlZFxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBlcnIpOworCQkJCWRwdXQocHBkKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIHdlIGRpZG4ndCByZWFsbHkgd2FudCBucGQsIHdlIHJlYWxseSB3YW50ZWQKKwkJCSAqIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGxvb2t1cC4KKwkJCSAqIGhvcGVmdWxseSwgbnBkID09IHBkLCB0aG91Z2ggaXQgaXNuJ3QgcmVhbGx5CisJCQkgKiBhIHByb2JsZW0gaWYgaXQgaXNuJ3QKKwkJCSAqLworCQkJaWYgKG5wZCA9PSBwZCkKKwkJCQlub3Byb2dyZXNzID0gMDsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiVzOiBucGQgIT0gcGRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlkcHV0KG5wZCk7CisJCQlkcHV0KHBwZCk7CisJCQlpZiAoSVNfUk9PVChwZCkpIHsKKwkJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZywgd2UgaGF2ZSB0byBnaXZlIHVwICovCisJCQkJZHB1dChwZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZHB1dChwZCk7CisJfQorCisJaWYgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSB7CisJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nIC0gb2gtd2VsbCAqLworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FU1RBTEU7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogZmluZF9leHBvcnRlZF9kZW50cnkgLSBoZWxwZXIgcm91dGluZSB0byBpbXBsZW1lbnQgZXhwb3J0X29wZXJhdGlvbnMtPmRlY29kZV9maAogICogQHNiOgkJVGhlICZzdXBlcl9ibG9jayBpZGVudGlmeWluZyB0aGUgZmlsZXN5c3RlbQpAQCAtNzQsMTg0ICsyNTEsNTggQEAKIAkJICAgICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCiAJCSAgICAgdm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBkZW50cnkgKnRhcmdldF9kaXI7Ci0JaW50IGVycjsKLQlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcHMgPSBzYi0+c19leHBvcnRfb3A7Ci0Jc3RydWN0IGRlbnRyeSAqYWxpYXM7Ci0JaW50IG5vcHJvZ3Jlc3M7Ci0JY2hhciBuYnVmW05BTUVfTUFYKzFdOworCXN0cnVjdCBkZW50cnkgKnJlc3VsdCwgKmFsaWFzOworCWludCBlcnIgPSAtRVNUQUxFOwogCiAJLyoKIAkgKiBBdHRlbXB0IHRvIGZpbmQgdGhlIGlub2RlLgogCSAqLwotCXJlc3VsdCA9IENBTEwoc2ItPnNfZXhwb3J0X29wLGdldF9kZW50cnkpKHNiLG9iaik7Ci0JZXJyID0gLUVTVEFMRTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCWdvdG8gZXJyX291dDsKLQlpZiAoSVNfRVJSKHJlc3VsdCkpIHsKLQkJZXJyID0gUFRSX0VSUihyZXN1bHQpOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCWlmIChTX0lTRElSKHJlc3VsdC0+ZF9pbm9kZS0+aV9tb2RlKSAmJgotCSAgICAocmVzdWx0LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKLQkJLyogaXQgaXMgYW4gdW5jb25uZWN0ZWQgZGlyZWN0b3J5LCB3ZSBtdXN0IGNvbm5lY3QgaXQgKi8KLQkJOwotCX0gZWxzZSB7Ci0JCWlmIChhY2NlcHRhYmxlKGNvbnRleHQsIHJlc3VsdCkpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwlyZXN1bHQgPSBleHBvcnRmc19nZXRfZGVudHJ5KHNiLCBvYmopOworCWlmIChJU19FUlIocmVzdWx0KSkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWlmIChTX0lTRElSKHJlc3VsdC0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoIShyZXN1bHQtPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSkgeworCQkJaWYgKGFjY2VwdGFibGUoY29udGV4dCwgcmVzdWx0KSkKKwkJCQlyZXR1cm4gcmVzdWx0OwogCQkJZXJyID0gLUVBQ0NFUzsKIAkJCWdvdG8gZXJyX3Jlc3VsdDsKIAkJfQogCisJCWVyciA9IHJlY29ubmVjdF9wYXRoKHNiLCByZXN1bHQpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcmVzdWx0OworCX0gZWxzZSB7CisJCXN0cnVjdCBkZW50cnkgKnRhcmdldF9kaXIsICpucmVzdWx0OworCQljaGFyIG5idWZbTkFNRV9NQVgrMV07CisKIAkJYWxpYXMgPSBmaW5kX2FjY2VwdGFibGVfYWxpYXMocmVzdWx0LCBhY2NlcHRhYmxlLCBjb250ZXh0KTsKIAkJaWYgKGFsaWFzKQogCQkJcmV0dXJuIGFsaWFzOwotCX0JCQkKIAotCS8qIEl0J3MgYSBkaXJlY3RvcnksIG9yIHdlIGFyZSByZXF1aXJlZCB0byBjb25maXJtIHRoZSBmaWxlJ3MKLQkgKiBsb2NhdGlvbiBpbiB0aGUgdHJlZSBiYXNlZCBvbiB0aGUgcGFyZW50IGluZm9ybWF0aW9uCi0gCSAqLwotCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBuZWVkIHRvIGxvb2sgaGFyZGVyIGZvciAlcy8lZFxuIixzYi0+c19pZCwqKGludCopb2JqKTsKLQlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkpCi0JCXRhcmdldF9kaXIgPSBkZ2V0KHJlc3VsdCk7Ci0JZWxzZSB7CiAJCWlmIChwYXJlbnQgPT0gTlVMTCkKIAkJCWdvdG8gZXJyX3Jlc3VsdDsKIAotCQl0YXJnZXRfZGlyID0gQ0FMTChzYi0+c19leHBvcnRfb3AsZ2V0X2RlbnRyeSkoc2IscGFyZW50KTsKLQkJaWYgKElTX0VSUih0YXJnZXRfZGlyKSkKKwkJdGFyZ2V0X2RpciA9IGV4cG9ydGZzX2dldF9kZW50cnkoc2IscGFyZW50KTsKKwkJaWYgKElTX0VSUih0YXJnZXRfZGlyKSkgewogCQkJZXJyID0gUFRSX0VSUih0YXJnZXRfZGlyKTsKLQkJaWYgKHRhcmdldF9kaXIgPT0gTlVMTCB8fCBJU19FUlIodGFyZ2V0X2RpcikpCiAJCQlnb3RvIGVycl9yZXN1bHQ7Ci0JfQotCS8qCi0JICogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGFyZ2V0X2RpciBpcyBwcm9wZXJseSBjb25uZWN0ZWQuCi0JICogSXQgbWF5IGFscmVhZHkgYmUsIGFzIHRoZSBmbGFnIGlzbid0IGFsd2F5cyB1cGRhdGVkIHdoZW4gY29ubmVjdGlvbgotCSAqIGhhcHBlbnMuCi0JICogU28sIHdlIHdhbGsgdXAgcGFyZW50IGxpbmtzIHVudGlsIHdlIGZpbmQgYSBjb25uZWN0ZWQgZGlyZWN0b3J5LAotCSAqIG9yIHdlIHJ1biBvdXQgb2YgZGlyZWN0b3JpZXMuICBUaGVuIHdlIGZpbmQgdGhlIHBhcmVudCwgZmluZAotCSAqIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCBpbiB0aGF0IHBhcmVudCwgYW5kIGRvIGEgbG9va3VwLgotCSAqIFRoaXMgc2hvdWxkIGNvbm5lY3QgdGhlIGNoaWxkIGludG8gdGhlIHBhcmVudAotCSAqIFdlIHRoZW4gcmVwZWF0LgotCSAqLwotCi0JLyogaXQgaXMgcG9zc2libGUgdGhhdCBhIGNvbmZ1c2VkIGZpbGUgc3lzdGVtIG1pZ2h0IG5vdCBsZXQgdXMgY29tcGxldGUgCi0JICogdGhlIHBhdGggdG8gdGhlIHJvb3QuICBGb3IgZXhhbXBsZSwgaWYgZ2V0X3BhcmVudCByZXR1cm5zIGEgZGlyZWN0b3J5Ci0JICogaW4gd2hpY2ggd2UgY2Fubm90IGZpbmQgYSBuYW1lIGZvciB0aGUgY2hpbGQuICBXaGlsZSB0aGlzIGltcGxpZXMgYQotCSAqIHZlcnkgc2ljayBmaWxlc3lzdGVtIHdlIGRvbid0IHdhbnQgaXQgdG8gY2F1c2Uga25mc2QgdG8gc3Bpbi4gIEhlbmNlCi0JICogdGhlIG5vcHJvZ3Jlc3MgY291bnRlci4gIElmIHdlIGdvIHRocm91Z2ggdGhlIGxvb3AgMTAgdGltZXMgKDIgaXMKLQkgKiBwcm9iYWJseSBlbm91Z2gpIHdpdGhvdXQgZ2V0dGluZyBhbnl3aGVyZSwgd2UganVzdCBnaXZlIHVwCi0JICovCi0Jbm9wcm9ncmVzcz0gMDsKLQl3aGlsZSAodGFyZ2V0X2Rpci0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQgJiYgbm9wcm9ncmVzcysrIDwgMTApIHsKLQkJc3RydWN0IGRlbnRyeSAqcGQgPSB0YXJnZXRfZGlyOwotCi0JCWRnZXQocGQpOwotCQlzcGluX2xvY2soJnBkLT5kX2xvY2spOwotCQl3aGlsZSAoIUlTX1JPT1QocGQpICYmCi0JCQkJKHBkLT5kX3BhcmVudC0+ZF9mbGFncyZEQ0FDSEVfRElTQ09OTkVDVEVEKSkgewotCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gcGQtPmRfcGFyZW50OwotCi0JCQlkZ2V0KHBhcmVudCk7Ci0JCQlzcGluX3VubG9jaygmcGQtPmRfbG9jayk7Ci0JCQlkcHV0KHBkKTsKLQkJCXBkID0gcGFyZW50OwotCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKIAkJfQotCQlzcGluX3VubG9jaygmcGQtPmRfbG9jayk7CiAKLQkJaWYgKCFJU19ST09UKHBkKSkgewotCQkJLyogbXVzdCBoYXZlIGZvdW5kIGEgY29ubmVjdGVkIHBhcmVudCAtIGdyZWF0ICovCi0JCQlzcGluX2xvY2soJnBkLT5kX2xvY2spOwotCQkJcGQtPmRfZmxhZ3MgJj0gfkRDQUNIRV9ESVNDT05ORUNURUQ7Ci0JCQlzcGluX3VubG9jaygmcGQtPmRfbG9jayk7Ci0JCQlub3Byb2dyZXNzID0gMDsKLQkJfSBlbHNlIGlmIChwZCA9PSBzYi0+c19yb290KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImV4cG9ydDogRWVlayBmaWxlc3lzdGVtIHJvb3QgaXMgbm90IGNvbm5lY3RlZCwgaW1wb3NzaWJsZVxuIik7Ci0JCQlzcGluX2xvY2soJnBkLT5kX2xvY2spOwotCQkJcGQtPmRfZmxhZ3MgJj0gfkRDQUNIRV9ESVNDT05ORUNURUQ7Ci0JCQlzcGluX3VubG9jaygmcGQtPmRfbG9jayk7Ci0JCQlub3Byb2dyZXNzID0gMDsKLQkJfSBlbHNlIHsKLQkJCS8qIHdlIGhhdmUgaGl0IHRoZSB0b3Agb2YgYSBkaXNjb25uZWN0ZWQgcGF0aC4gIFRyeQotCQkJICogdG8gZmluZCBwYXJlbnQgYW5kIGNvbm5lY3QKLQkJCSAqIG5vdGU6IHJhY2luZyB3aXRoIHNvbWUgb3RoZXIgcHJvY2VzcyByZW5hbWluZyBhCi0JCQkgKiBkaXJlY3RvcnkgaXNuJ3QgbXVjaCBvZiBhIHByb2JsZW0gaGVyZS4gIElmIHNvbWVvbmUKLQkJCSAqIHJlbmFtZXMgdGhlIGRpcmVjdG9yeSwgaXQgd2lsbCBlbmQgdXAgcHJvcGVybHkKLQkJCSAqIGNvbm5lY3RlZCwgd2hpY2ggaXMgd2hhdCB3ZSB3YW50Ci0JCQkgKi8KLQkJCXN0cnVjdCBkZW50cnkgKnBwZDsKLQkJCXN0cnVjdCBkZW50cnkgKm5wZDsKLQotCQkJbXV0ZXhfbG9jaygmcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQkJcHBkID0gQ0FMTChub3BzLGdldF9wYXJlbnQpKHBkKTsKLQkJCW11dGV4X3VubG9jaygmcGQtPmRfaW5vZGUtPmlfbXV0ZXgpOwotCi0JCQlpZiAoSVNfRVJSKHBwZCkpIHsKLQkJCQllcnIgPSBQVFJfRVJSKHBwZCk7Ci0JCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGdldF9wYXJlbnQgb2YgJWxkIGZhaWxlZCwgZXJyICVkXG4iLAotCQkJCQlwZC0+ZF9pbm9kZS0+aV9pbm8sIGVycik7Ci0JCQkJZHB1dChwZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZmluZCBuYW1lIG9mICVsdSBpbiAlbHVcbiIsIHBkLT5kX2lub2RlLT5pX2lubywgcHBkLT5kX2lub2RlLT5pX2lubyk7Ci0JCQllcnIgPSBDQUxMKG5vcHMsZ2V0X25hbWUpKHBwZCwgbmJ1ZiwgcGQpOwotCQkJaWYgKGVycikgewotCQkJCWRwdXQocHBkKTsKLQkJCQlkcHV0KHBkKTsKLQkJCQlpZiAoZXJyID09IC1FTk9FTlQpCi0JCQkJCS8qIHNvbWUgcmFjZSBiZXR3ZWVuIGdldF9wYXJlbnQgYW5kCi0JCQkJCSAqIGdldF9uYW1lPyAganVzdCB0cnkgYWdhaW4KLQkJCQkJICovCi0JCQkJCWNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGZvdW5kIG5hbWU6ICVzXG4iLCBuYnVmKTsKLQkJCW11dGV4X2xvY2soJnBwZC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlucGQgPSBsb29rdXBfb25lX2xlbihuYnVmLCBwcGQsIHN0cmxlbihuYnVmKSk7Ci0JCQltdXRleF91bmxvY2soJnBwZC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0JCQlpZiAoSVNfRVJSKG5wZCkpIHsKLQkJCQllcnIgPSBQVFJfRVJSKG5wZCk7Ci0JCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGxvb2t1cCBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotCQkJCWRwdXQocHBkKTsKLQkJCQlkcHV0KHBkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIHdlIGRpZG4ndCByZWFsbHkgd2FudCBucGQsIHdlIHJlYWxseSB3YW50ZWQKLQkJCSAqIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGxvb2t1cC4KLQkJCSAqIGhvcGVmdWxseSwgbnBkID09IHBkLCB0aG91Z2ggaXQgaXNuJ3QgcmVhbGx5Ci0JCQkgKiBhIHByb2JsZW0gaWYgaXQgaXNuJ3QKLQkJCSAqLwotCQkJaWYgKG5wZCA9PSBwZCkKLQkJCQlub3Byb2dyZXNzID0gMDsKLQkJCWVsc2UKLQkJCQlwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBucGQgIT0gcGRcbiIpOwotCQkJZHB1dChucGQpOwotCQkJZHB1dChwcGQpOwotCQkJaWYgKElTX1JPT1QocGQpKSB7Ci0JCQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdlIGhhdmUgdG8gZ2l2ZSB1cCAqLwotCQkJCWRwdXQocGQpOwotCQkJCWJyZWFrOwotCQkJfQorCQllcnIgPSByZWNvbm5lY3RfcGF0aChzYiwgdGFyZ2V0X2Rpcik7CisJCWlmIChlcnIpIHsKKwkJCWRwdXQodGFyZ2V0X2Rpcik7CisJCQlnb3RvIGVycl9yZXN1bHQ7CiAJCX0KLQkJZHB1dChwZCk7Ci0JfQogCi0JaWYgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSB7Ci0JCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nIC0gb2gtd2VsbCAqLwotCQlpZiAoIWVycikKLQkJCWVyciA9IC1FU1RBTEU7Ci0JCWdvdG8gZXJyX3RhcmdldDsKLQl9Ci0JLyogaWYgd2Ugd2VyZW4ndCBhZnRlciBhIGRpcmVjdG9yeSwgaGF2ZSBvbmUgbW9yZSBzdGVwIHRvIGdvICovCi0JaWYgKHJlc3VsdCAhPSB0YXJnZXRfZGlyKSB7Ci0JCXN0cnVjdCBkZW50cnkgKm5yZXN1bHQ7Ci0JCWVyciA9IENBTEwobm9wcyxnZXRfbmFtZSkodGFyZ2V0X2RpciwgbmJ1ZiwgcmVzdWx0KTsKKwkJLyoKKwkJICogQXMgd2Ugd2VyZW4ndCBhZnRlciBhIGRpcmVjdG9yeSwgaGF2ZSBvbmUgbW9yZSBzdGVwIHRvIGdvLgorCQkgKi8KKwkJZXJyID0gZXhwb3J0ZnNfZ2V0X25hbWUodGFyZ2V0X2RpciwgbmJ1ZiwgcmVzdWx0KTsKIAkJaWYgKCFlcnIpIHsKIAkJCW11dGV4X2xvY2soJnRhcmdldF9kaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwotCQkJbnJlc3VsdCA9IGxvb2t1cF9vbmVfbGVuKG5idWYsIHRhcmdldF9kaXIsIHN0cmxlbihuYnVmKSk7CisJCQlucmVzdWx0ID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgdGFyZ2V0X2RpciwKKwkJCQkJCSBzdHJsZW4obmJ1ZikpOwogCQkJbXV0ZXhfdW5sb2NrKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIAkJCWlmICghSVNfRVJSKG5yZXN1bHQpKSB7CiAJCQkJaWYgKG5yZXN1bHQtPmRfaW5vZGUpIHsKQEAgLTI2MSwxMSArMzEyLDggQEAKIAkJCQkJZHB1dChucmVzdWx0KTsKIAkJCX0KIAkJfQorCQlkcHV0KHRhcmdldF9kaXIpOwogCX0KLQlkcHV0KHRhcmdldF9kaXIpOwotCS8qIG5vdyByZXN1bHQgaXMgcHJvcGVybHkgY29ubmVjdGVkLCBpdCBpcyBvdXIgYmVzdCBiZXQgKi8KLQlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQotCQlyZXR1cm4gcmVzdWx0OwogCiAJYWxpYXMgPSBmaW5kX2FjY2VwdGFibGVfYWxpYXMocmVzdWx0LCBhY2NlcHRhYmxlLCBjb250ZXh0KTsKIAlpZiAoYWxpYXMpCkBAIC0yNzUsMzIgKzMyMywxNiBAQAogCWRwdXQocmVzdWx0KTsKIAkvKiBJdCBtaWdodCBiZSBqdXN0aWZpYWJsZSB0byByZXR1cm4gRVNUQUxFIGhlcmUsCiAJICogYnV0IHRoZSBmaWxlaGFuZGxlIGF0LWxlYXN0IGxvb2tzIHJlYXNvbmFibGUgZ29vZAotCSAqIGFuZCBpdCBqdXN0IGJlIGEgcGVybWlzc2lvbiBwcm9ibGVtLCBzbyByZXR1cm5pbmcKKwkgKiBhbmQgaXQgbWF5IGp1c3QgYmUgYSBwZXJtaXNzaW9uIHByb2JsZW0sIHNvIHJldHVybmluZwogCSAqIC1FQUNDRVNTIGlzIHNhZmVyCiAJICovCiAJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAKLSBlcnJfdGFyZ2V0OgotCWRwdXQodGFyZ2V0X2Rpcik7CiAgZXJyX3Jlc3VsdDoKIAlkcHV0KHJlc3VsdCk7Ci0gZXJyX291dDoKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi0KLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCi17Ci0JLyogZ2V0X3BhcmVudCBjYW5ub3QgYmUgc3VwcG9ydGVkIGdlbmVyaWNhbGx5LCB0aGUgbG9ja2luZwotCSAqIGlzIHRvbyBpY2t5LgotCSAqIGluc3RlYWQsIHdlIGp1c3QgcmV0dXJuIEVBQ0NFUy4gIElmIHNlcnZlciByZWJvb3RzIG9yIGlub2RlcwotCSAqIGdldCBmbHVzaGVkLCB5b3UgbG9zZQotCSAqLwotCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotfQotCi0KIHN0cnVjdCBnZXRkZW50c19jYWxsYmFjayB7CiAJY2hhciAqbmFtZTsJCS8qIG5hbWUgdGhhdCB3YXMgZm91bmQuIEl0IGFscmVhZHkgcG9pbnRzIHRvIGEKIAkJCQkgICBidWZmZXIgTkFNRV9NQVgrMSBpcyBzaXplICovCkBAIC0zOTAsNjEgKzQyMiw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubywgX191MzIgZ2VuZXJhdGlvbikKLXsKLQotCS8qIGlnZXQgaXNuJ3QgcmVhbGx5IHJpZ2h0IGlmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgdW5hbGxvY2F0ZWQhIQotCSAqIFRoaXMgc2hvdWxkIHJlYWxseSBhbGwgYmUgZG9uZSBpbnNpZGUgZWFjaCBmaWxlc3lzdGVtCi0JICoKLQkgKiBleHQyZnMnIHJlYWRfaW5vZGUgaGFzIGJlZW4gc3RyZW5ndGhlZCB0byByZXR1cm4gYSBiYWRfaW5vZGUgaWYKLQkgKiB0aGUgaW5vZGUgaGFkIGJlZW4gZGVsZXRlZC4KLQkgKgotCSAqIEN1cnJlbnRseSB3ZSBkb24ndCBrbm93IHRoZSBnZW5lcmF0aW9uIGZvciBwYXJlbnQgZGlyZWN0b3J5LCBzbwotCSAqIGEgZ2VuZXJhdGlvbiBvZiAwIG1lYW5zICJhY2NlcHQgYW55IgotCSAqLwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGRlbnRyeSAqcmVzdWx0OwotCWlmIChpbm8gPT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7Ci0JaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOwotCWlmIChpbm9kZSA9PSBOVUxMKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKQotCSAgICB8fCAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pCi0JCSkgewotCQkvKiB3ZSBkaWRuJ3QgZmluZCB0aGUgcmlnaHQgaW5vZGUuLiAqLwotCQlkcHJpbnRrKCJmaF92ZXJpZnk6IElub2RlICVsdSwgQmFkIGNvdW50OiAlZCAlZCBvciB2ZXJzaW9uICAldSAldVxuIiwKLQkJCWlub2RlLT5pX2lubywKLQkJCWlub2RlLT5pX25saW5rLCBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLAotCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiwKLQkJCWdlbmVyYXRpb24pOwotCi0JCWlwdXQoaW5vZGUpOwotCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKLQl9Ci0JLyogbm93IHRvIGZpbmQgYSBkZW50cnkuCi0JICogSWYgcG9zc2libGUsIGdldCBhIHdlbGwtY29ubmVjdGVkIG9uZQotCSAqLwotCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJaXB1dChpbm9kZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfb2JqZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQotewotCV9fdTMyICpvYmpwID0gdm9ianA7Ci0JdW5zaWduZWQgbG9uZyBpbm8gPSBvYmpwWzBdOwotCV9fdTMyIGdlbmVyYXRpb24gPSBvYmpwWzFdOwotCi0JcmV0dXJuIGV4cG9ydF9pZ2V0KHNiLCBpbm8sIGdlbmVyYXRpb24pOwotfQotCi0KIC8qKgogICogZXhwb3J0X2VuY29kZV9maCAtIGRlZmF1bHQgZXhwb3J0X29wZXJhdGlvbnMtPmVuY29kZV9maCBmdW5jdGlvbgogICogQGRlbnRyeTogIHRoZSBkZW50cnkgdG8gZW5jb2RlCkBAIC01MTcsMTYgKzQ5NCw0MCBAQAogCQkJCSAgIGFjY2VwdGFibGUsIGNvbnRleHQpOwogfQogCi1zdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXhwb3J0X29wX2RlZmF1bHQgPSB7Ci0JLmRlY29kZV9maAk9IGV4cG9ydF9kZWNvZGVfZmgsCi0JLmVuY29kZV9maAk9IGV4cG9ydF9lbmNvZGVfZmgsCitpbnQgZXhwb3J0ZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCisJCWludCBjb25uZWN0YWJsZSkKK3sKKyAJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBkZW50cnktPmRfc2ItPnNfZXhwb3J0X29wOworCWludCBlcnJvcjsKIAotCS5nZXRfbmFtZQk9IGdldF9uYW1lLAotCS5nZXRfcGFyZW50CT0gZ2V0X3BhcmVudCwKLQkuZ2V0X2RlbnRyeQk9IGdldF9vYmplY3QsCi19OworCWlmIChub3AtPmVuY29kZV9maCkKKwkJZXJyb3IgPSBub3AtPmVuY29kZV9maChkZW50cnksIGZoLCBtYXhfbGVuLCBjb25uZWN0YWJsZSk7CisJZWxzZQorCQllcnJvciA9IGV4cG9ydF9lbmNvZGVfZmgoZGVudHJ5LCBmaCwgbWF4X2xlbiwgY29ubmVjdGFibGUpOwogCi1FWFBPUlRfU1lNQk9MKGV4cG9ydF9vcF9kZWZhdWx0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHBvcnRmc19lbmNvZGVfZmgpOworCitzdHJ1Y3QgZGVudHJ5ICpleHBvcnRmc19kZWNvZGVfZmgoc3RydWN0IHZmc21vdW50ICptbnQsIF9fdTMyICpmaCwgaW50IGZoX2xlbiwKKwkJaW50IGZpbGVpZF90eXBlLCBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICosIHN0cnVjdCBkZW50cnkgKiksCisJCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBtbnQtPm1udF9zYi0+c19leHBvcnRfb3A7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCisJaWYgKG5vcC0+ZGVjb2RlX2ZoKSB7CisJCXJlc3VsdCA9IG5vcC0+ZGVjb2RlX2ZoKG1udC0+bW50X3NiLCBmaCwgZmhfbGVuLCBmaWxlaWRfdHlwZSwKKwkJCWFjY2VwdGFibGUsIGNvbnRleHQpOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IGV4cG9ydF9kZWNvZGVfZmgobW50LT5tbnRfc2IsIGZoLCBmaF9sZW4sIGZpbGVpZF90eXBlLAorCQkJYWNjZXB0YWJsZSwgY29udGV4dCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4cG9ydGZzX2RlY29kZV9maCk7CisKIEVYUE9SVF9TWU1CT0woZmluZF9leHBvcnRlZF9kZW50cnkpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZpbGUuYyBiL2ZzL2V4dDIvZmlsZS5jCmluZGV4IDA0YWZlZWMuLmFiNzk2MTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZmlsZS5jCisrKyBiL2ZzL2V4dDIvZmlsZS5jCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSAiYWNsLmgiCiAKIC8qCi0gKiBDYWxsZWQgd2hlbiBhbiBpbm9kZSBpcyByZWxlYXNlZC4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50Ci0gKiBmcm9tIGV4dDJfb3Blbl9maWxlOiBvcGVuIGdldHMgY2FsbGVkIGF0IGV2ZXJ5IG9wZW4sIGJ1dCByZWxlYXNlCi0gKiBnZXRzIGNhbGxlZCBvbmx5IHdoZW4gL2FsbC8gdGhlIGZpbGVzIGFyZSBjbG9zZWQuCisgKiBDYWxsZWQgd2hlbiBmaWxwIGlzIHJlbGVhc2VkLiBUaGlzIGhhcHBlbnMgd2hlbiBhbGwgZmlsZSBkZXNjcmlwdG9ycworICogZm9yIGEgc2luZ2xlIHN0cnVjdCBmaWxlIGFyZSBjbG9zZWQuIE5vdGUgdGhhdCBkaWZmZXJlbnQgb3BlbigpIGNhbGxzCisgKiBmb3IgdGhlIHNhbWUgZmlsZSB5aWVsZCBkaWZmZXJlbnQgc3RydWN0IGZpbGUgc3RydWN0dXJlcy4KICAqLwogc3RhdGljIGludCBleHQyX3JlbGVhc2VfZmlsZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKIHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA1ZGU1MDYxLi4zZWVmYTk3IDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KQEAgLTEwOTksMTUgKzExMDAsMTggQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOwogCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKLQl1bnNpZ25lZCBsb25nIG92ZXJoZWFkOwotCWludCBpOwogCXU2NCBmc2lkOwogCiAJaWYgKHRlc3Rfb3B0IChzYiwgTUlOSVhfREYpKQotCQlvdmVyaGVhZCA9IDA7Ci0JZWxzZSB7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gMDsKKwllbHNlIGlmIChzYmktPnNfYmxvY2tzX2xhc3QgIT0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQl1bnNpZ25lZCBsb25nIGksIG92ZXJoZWFkID0gMDsKKwkJc21wX3JtYigpOworCiAJCS8qCi0JCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKQorCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykuIFRoaXMgaXMgY29uc3RhbnQKKwkJICogZm9yIGEgZ2l2ZW4gZmlsZXN5c3RlbSB1bmxlc3MgdGhlIG51bWJlciBvZiBibG9jayBncm91cHMKKwkJICogY2hhbmdlcyBzbyB3ZSBjYWNoZSB0aGUgcHJldmlvdXMgdmFsdWUgdW50aWwgaXQgZG9lcy4KIAkJICovCiAKIAkJLyoKQEAgLTExMzEsMTcgKzExMzUsMjIgQEAKIAkJICovCiAJCW92ZXJoZWFkICs9IChzYmktPnNfZ3JvdXBzX2NvdW50ICoKIAkJCSAgICAgKDIgKyBzYmktPnNfaXRiX3Blcl9ncm91cCkpOworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IG92ZXJoZWFkOworCQlzbXBfd21iKCk7CisJCXNiaS0+c19ibG9ja3NfbGFzdCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CiAJfQogCiAJYnVmLT5mX3R5cGUgPSBFWFQyX1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0gc2JpLT5zX292ZXJoZWFkX2xhc3Q7CiAJYnVmLT5mX2JmcmVlID0gZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyhzYik7CisJZXMtPnNfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfYmZyZWUpOwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgLSBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCk7CiAJaWYgKGJ1Zi0+Zl9iZnJlZSA8IGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KSkKIAkJYnVmLT5mX2JhdmFpbCA9IDA7CiAJYnVmLT5mX2ZpbGVzID0gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KTsKIAlidWYtPmZfZmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfaW5vZGVzKHNiKTsKKwllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9mZnJlZSk7CiAJYnVmLT5mX25hbWVsZW4gPSBFWFQyX05BTUVfTEVOOwogCWZzaWQgPSBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkKSBeCiAJICAgICAgIGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQgKyBzaXplb2YodTY0KSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMmE4NWRkZS4uZGU0ZTMxNiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMzE5NSw3ICszMTk1LDcgQEAKIAkgKi8KIAogCWpvdXJuYWwgPSBFWFQzX0pPVVJOQUwoaW5vZGUpOwotCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkgfHwgSVNfUkRPTkxZKGlub2RlKSkKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQogCQlyZXR1cm4gLUVST0ZTOwogCiAJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CmRpZmYgLS1naXQgYS9mcy9leHQzL25hbWVpLmMgYi9mcy9leHQzL25hbWVpLmMKaW5kZXggOWJiMDQ2ZC4uMTU4NjgwNyAxMDA2NDQKLS0tIGEvZnMvZXh0My9uYW1laS5jCisrKyBiL2ZzL2V4dDMvbmFtZWkuYwpAQCAtMTAxOSw2ICsxMDE5LDExIEBACiAKIAkJaWYgKCFpbm9kZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCisJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQl9CiAJfQogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KQEAgLTEwNTQsNiArMTA1OSwxMSBAQAogCWlmICghaW5vZGUpCiAJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKwogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CiAJaWYgKCFwYXJlbnQpIHsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL3N1cGVyLmMgYi9mcy9leHQzL3N1cGVyLmMKaW5kZXggNmUzMDYyOS4uNGY4NGRjOCAxMDA2NDQKLS0tIGEvZnMvZXh0My9zdXBlci5jCisrKyBiL2ZzL2V4dDMvc3VwZXIuYwpAQCAtMjksMTIgKzI5LDE0IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC00NTksNiArNDYxLDE0IEBACiAKIHN0YXRpYyB2b2lkIGV4dDNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCWlmICghbGlzdF9lbXB0eSgmKEVYVDNfSShpbm9kZSktPmlfb3JwaGFuKSkpIHsKKwkJcHJpbnRrKCJFWFQzIElub2RlICVwOiBvcnBoYW4gbGlzdCBjaGVjayBmYWlsZWQhXG4iLAorCQkJRVhUM19JKGlub2RlKSk7CisJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LAorCQkJCUVYVDNfSShpbm9kZSksIHNpemVvZihzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvKSwKKwkJCQlmYWxzZSk7CisJCWR1bXBfc3RhY2soKTsKKwl9CiAJa21lbV9jYWNoZV9mcmVlKGV4dDNfaW5vZGVfY2FjaGVwLCBFWFQzX0koaW5vZGUpKTsKIH0KIApAQCAtMTU2Niw3ICsxNTc2LDcgQEAKIAkJc2JpLT5zX2lub2RlX3NpemUgPSBsZTE2X3RvX2NwdShlcy0+c19pbm9kZV9zaXplKTsKIAkJc2JpLT5zX2ZpcnN0X2lubyA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2lubyk7CiAJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8Ci0JCSAgICAoc2JpLT5zX2lub2RlX3NpemUgJiAoc2JpLT5zX2lub2RlX3NpemUgLSAxKSkgfHwKKwkJICAgICghaXNfcG93ZXJfb2ZfMihzYmktPnNfaW5vZGVfc2l6ZSkpIHx8CiAJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgPiBibG9ja3NpemUpKSB7CiAJCQlwcmludGsgKEtFUk5fRVJSCiAJCQkJIkVYVDMtZnM6IHVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkXG4iLApAQCAtMjA3NSw2ICsyMDg1LDcgQEAKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKQogewogCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgZXJyOwogCiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogcmVhZG9ubHkgZmlsZXN5c3RlbSB3aGVuIHRyeWluZyB0byAiCkBAIC0yMDgyLDEzICsyMDkzLDE1IEBACiAJCXJldHVybiAtRVJPRlM7CiAJfQogCi0JaWYgKCEoam91cm5hbCA9IGV4dDNfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSkpKQorCWpvdXJuYWwgPSBleHQzX2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pOworCWlmICgham91cm5hbCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiBjcmVhdGluZyBuZXcgam91cm5hbCBvbiBpbm9kZSAldVxuIiwKIAkgICAgICAgam91cm5hbF9pbnVtKTsKIAotCWlmIChqb3VybmFsX2NyZWF0ZShqb3VybmFsKSkgeworCWVyciA9IGpvdXJuYWxfY3JlYXRlKGpvdXJuYWwpOworCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciBjcmVhdGluZyBqb3VybmFsLlxuIik7CiAJCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0yMTM5LDEyICsyMTUyLDE0IEBACiAKIAlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKIAlqb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCWxvY2tfc3VwZXIoc2IpOwogCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgJiYKIAkgICAgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKIAkJRVhUM19DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CiAJCXNiLT5zX2RpcnQgPSAwOwogCQlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwogCX0KKwl1bmxvY2tfc3VwZXIoc2IpOwogCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CiB9CiAKQEAgLTIzMzMsNyArMjM0OCwxMyBAQAogCQkJICAgIChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQzX1ZBTElEX0ZTKSkKIAkJCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CiAKKwkJCS8qCisJCQkgKiBXZSBoYXZlIHRvIHVubG9jayBzdXBlciBzbyB0aGF0IHdlIGNhbiB3YWl0IGZvcgorCQkJICogdHJhbnNhY3Rpb25zLgorCQkJICovCisJCQl1bmxvY2tfc3VwZXIoc2IpOwogCQkJZXh0M19tYXJrX3JlY292ZXJ5X2NvbXBsZXRlKHNiLCBlcyk7CisJCQlsb2NrX3N1cGVyKHNiKTsKIAkJfSBlbHNlIHsKIAkJCV9fbGUzMiByZXQ7CiAJCQlpZiAoKHJldCA9IEVYVDNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLApAQCAtMjQwNiwxOSArMjQyNywxOSBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwotCWV4dDNfZnNibGtfdCBvdmVyaGVhZDsKLQlpbnQgaTsKIAl1NjQgZnNpZDsKIAotCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKLQkJb3ZlcmhlYWQgPSAwOwotCWVsc2UgewotCQl1bnNpZ25lZCBsb25nIG5ncm91cHM7Ci0JCW5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJaWYgKHRlc3Rfb3B0KHNiLCBNSU5JWF9ERikpIHsKKwkJc2JpLT5zX292ZXJoZWFkX2xhc3QgPSAwOworCX0gZWxzZSBpZiAoc2JpLT5zX2Jsb2Nrc19sYXN0ICE9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJdW5zaWduZWQgbG9uZyBuZ3JvdXBzID0gc2JpLT5zX2dyb3Vwc19jb3VudCwgaTsKKwkJZXh0M19mc2Jsa190IG92ZXJoZWFkID0gMDsKIAkJc21wX3JtYigpOwogCiAJCS8qCi0JCSAqIENvbXB1dGUgdGhlIG92ZXJoZWFkIChGUyBzdHJ1Y3R1cmVzKQorCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykuICBUaGlzIGlzIGNvbnN0YW50CisJCSAqIGZvciBhIGdpdmVuIGZpbGVzeXN0ZW0gdW5sZXNzIHRoZSBudW1iZXIgb2YgYmxvY2sgZ3JvdXBzCisJCSAqIGNoYW5nZXMgc28gd2UgY2FjaGUgdGhlIHByZXZpb3VzIHZhbHVlIHVudGlsIGl0IGRvZXMuCiAJCSAqLwogCiAJCS8qCkBAIC0yNDQyLDE4ICsyNDYzLDIzIEBACiAJCSAqIEV2ZXJ5IGJsb2NrIGdyb3VwIGhhcyBhbiBpbm9kZSBiaXRtYXAsIGEgYmxvY2sKIAkJICogYml0bWFwLCBhbmQgYW4gaW5vZGUgdGFibGUuCiAJCSAqLwotCQlvdmVyaGVhZCArPSAobmdyb3VwcyAqICgyICsgRVhUM19TQihzYiktPnNfaXRiX3Blcl9ncm91cCkpOworCQlvdmVyaGVhZCArPSBuZ3JvdXBzICogKDIgKyBzYmktPnNfaXRiX3Blcl9ncm91cCk7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gb3ZlcmhlYWQ7CisJCXNtcF93bWIoKTsKKwkJc2JpLT5zX2Jsb2Nrc19sYXN0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKIAl9CiAKIAlidWYtPmZfdHlwZSA9IEVYVDNfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWJ1Zi0+Zl9ibG9ja3MgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0gb3ZlcmhlYWQ7CisJYnVmLT5mX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBzYmktPnNfb3ZlcmhlYWRfbGFzdDsKIAlidWYtPmZfYmZyZWUgPSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoYnVmLT5mX2JmcmVlKTsKIAlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOwogCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9mZnJlZSk7CiAJYnVmLT5mX25hbWVsZW4gPSBFWFQzX05BTUVfTEVOOwogCWZzaWQgPSBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkKSBeCiAJICAgICAgIGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQgKyBzaXplb2YodTY0KSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2JhbGxvYy5jIGIvZnMvZXh0NC9iYWxsb2MuYwppbmRleCAzYjY0YmIxLi45ZGU1NGFlIDEwMDY0NAotLS0gYS9mcy9leHQ0L2JhbGxvYy5jCisrKyBiL2ZzL2V4dDQvYmFsbG9jLmMKQEAgLTE1ODUsNyArMTU4NSw3IEBACiAJcmV0X2Jsb2NrID0gZ3JwX2FsbG9jX2JsayArIGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwX25vKTsKIAogCWlmIChpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKSwgcmV0X2Jsb2NrLCBudW0pIHx8Ci0JICAgIGluX3JhbmdlKGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApLCByZXRfYmxvY2ssIG51bSkgfHwKKwkgICAgaW5fcmFuZ2UoZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCksIHJldF9ibG9jaywgbnVtKSB8fAogCSAgICBpbl9yYW5nZShyZXRfYmxvY2ssIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCiAJCSAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkgfHwKIAkgICAgaW5fcmFuZ2UocmV0X2Jsb2NrICsgbnVtIC0gMSwgZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKSwKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCAyODExZTU3Li4yZGUzMzlkIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC0xMDE3LDYgKzEwMTcsMTEgQEAKIAogCQlpZiAoIWlub2RlKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KIAl9CiAJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOwogfQpAQCAtMTA1Miw2ICsxMDU3LDExIEBACiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJfQorCiAJcGFyZW50ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKIAlpZiAoIXBhcmVudCkgewogCQlpcHV0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCAxNzViNjhjLi5iODA2ZTY4IDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KQEAgLTUxMCw2ICs1MTEsMTQgQEAKIAogc3RhdGljIHZvaWQgZXh0NF9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJaWYgKCFsaXN0X2VtcHR5KCYoRVhUNF9JKGlub2RlKS0+aV9vcnBoYW4pKSkgeworCQlwcmludGsoIkVYVDQgSW5vZGUgJXA6IG9ycGhhbiBsaXN0IGNoZWNrIGZhaWxlZCFcbiIsCisJCQlFWFQ0X0koaW5vZGUpKTsKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9JTkZPLCAiIiwgRFVNUF9QUkVGSVhfQUREUkVTUywgMTYsIDQsCisJCQkJRVhUNF9JKGlub2RlKSwgc2l6ZW9mKHN0cnVjdCBleHQ0X2lub2RlX2luZm8pLAorCQkJCXRydWUpOworCQlkdW1wX3N0YWNrKCk7CisJfQogCWttZW1fY2FjaGVfZnJlZShleHQ0X2lub2RlX2NhY2hlcCwgRVhUNF9JKGlub2RlKSk7CiB9CiAKQEAgLTIxNTAsNiArMjE1OSw3IEBACiAJCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKIAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHJlYWRvbmx5IGZpbGVzeXN0ZW0gd2hlbiB0cnlpbmcgdG8gIgpAQCAtMjE1NywxMyArMjE2NywxNSBAQAogCQlyZXR1cm4gLUVST0ZTOwogCX0KIAotCWlmICghKGpvdXJuYWwgPSBleHQ0X2dldF9qb3VybmFsKHNiLCBqb3VybmFsX2ludW0pKSkKKwlqb3VybmFsID0gZXh0NF9nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKTsKKwlpZiAoIWpvdXJuYWwpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogY3JlYXRpbmcgbmV3IGpvdXJuYWwgb24gaW5vZGUgJXVcbiIsCiAJICAgICAgIGpvdXJuYWxfaW51bSk7CiAKLQlpZiAoamJkMl9qb3VybmFsX2NyZWF0ZShqb3VybmFsKSkgeworCWVyciA9IGpiZDJfam91cm5hbF9jcmVhdGUoam91cm5hbCk7CisJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGVycm9yIGNyZWF0aW5nIGpvdXJuYWwuXG4iKTsKIAkJamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CiAJCXJldHVybiAtRUlPOwpAQCAtMjIxNCwxMiArMjIyNiwxNCBAQAogCiAJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKIAlqYmQyX2pvdXJuYWxfZmx1c2goam91cm5hbCk7CisJbG9ja19zdXBlcihzYik7CiAJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSAmJgogCSAgICBzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlFWFQ0X0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAkJc2ItPnNfZGlydCA9IDA7CiAJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CiAJfQorCXVubG9ja19zdXBlcihzYik7CiAJamJkMl9qb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOwogfQogCkBAIC0yNDA4LDcgKzI0MjIsMTMgQEAKIAkJCSAgICAoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUNF9WQUxJRF9GUykpCiAJCQkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwogCisJCQkvKgorCQkJICogV2UgaGF2ZSB0byB1bmxvY2sgc3VwZXIgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IKKwkJCSAqIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJdW5sb2NrX3N1cGVyKHNiKTsKIAkJCWV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCQkJbG9ja19zdXBlcihzYik7CiAJCX0gZWxzZSB7CiAJCQlfX2xlMzIgcmV0OwogCQkJaWYgKChyZXQgPSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKQEAgLTI0ODEsMTkgKzI1MDEsMTkgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKLQlleHQ0X2ZzYmxrX3Qgb3ZlcmhlYWQ7Ci0JaW50IGk7CiAJdTY0IGZzaWQ7CiAKLQlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCi0JCW92ZXJoZWFkID0gMDsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBuZ3JvdXBzOwotCQluZ3JvdXBzID0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWlmICh0ZXN0X29wdChzYiwgTUlOSVhfREYpKSB7CisJCXNiaS0+c19vdmVyaGVhZF9sYXN0ID0gMDsKKwl9IGVsc2UgaWYgKHNiaS0+c19ibG9ja3NfbGFzdCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCXVuc2lnbmVkIGxvbmcgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQsIGk7CisJCWV4dDRfZnNibGtfdCBvdmVyaGVhZCA9IDA7CiAJCXNtcF9ybWIoKTsKIAogCQkvKgotCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpLiAgVGhpcyBpcyBjb25zdGFudAorCQkgKiBmb3IgYSBnaXZlbiBmaWxlc3lzdGVtIHVubGVzcyB0aGUgbnVtYmVyIG9mIGJsb2NrIGdyb3VwcworCQkgKiBjaGFuZ2VzIHNvIHdlIGNhY2hlIHRoZSBwcmV2aW91cyB2YWx1ZSB1bnRpbCBpdCBkb2VzLgogCQkgKi8KIAogCQkvKgpAQCAtMjUxNywxOCArMjUzNywyMyBAQAogCQkgKiBFdmVyeSBibG9jayBncm91cCBoYXMgYW4gaW5vZGUgYml0bWFwLCBhIGJsb2NrCiAJCSAqIGJpdG1hcCwgYW5kIGFuIGlub2RlIHRhYmxlLgogCQkgKi8KLQkJb3ZlcmhlYWQgKz0gKG5ncm91cHMgKiAoMiArIEVYVDRfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKTsKKwkJb3ZlcmhlYWQgKz0gbmdyb3VwcyAqICgyICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApOworCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IG92ZXJoZWFkOworCQlzbXBfd21iKCk7CisJCXNiaS0+c19ibG9ja3NfbGFzdCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCk7CiAJfQogCiAJYnVmLT5mX3R5cGUgPSBFWFQ0X1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQlidWYtPmZfYmxvY2tzID0gZXh0NF9ibG9ja3NfY291bnQoZXMpIC0gb3ZlcmhlYWQ7CisJYnVmLT5mX2Jsb2NrcyA9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtIHNiaS0+c19vdmVyaGVhZF9sYXN0OwogCWJ1Zi0+Zl9iZnJlZSA9IHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJZXMtPnNfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihidWYtPmZfYmZyZWUpOwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgLSBleHQ0X3JfYmxvY2tzX2NvdW50KGVzKTsKIAlpZiAoYnVmLT5mX2JmcmVlIDwgZXh0NF9yX2Jsb2Nrc19jb3VudChlcykpCiAJCWJ1Zi0+Zl9iYXZhaWwgPSAwOwogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CiAJYnVmLT5mX2ZmcmVlID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGJ1Zi0+Zl9mZnJlZSk7CiAJYnVmLT5mX25hbWVsZW4gPSBFWFQ0X05BTUVfTEVOOwogCWZzaWQgPSBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkKSBeCiAJICAgICAgIGxlNjRfdG9fY3B1cCgodm9pZCAqKWVzLT5zX3V1aWQgKyBzaXplb2YodTY0KSk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZGlyLmMgYi9mcy9mYXQvZGlyLmMKaW5kZXggY2NmMTYxZC4uNzJjYmNkNiAxMDA2NDQKLS0tIGEvZnMvZmF0L2Rpci5jCisrKyBiL2ZzL2ZhdC9kaXIuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJd2NoYXJfdCBidWZ1bmFtZVsxNF07CiAJdW5zaWduZWQgY2hhciB4bGF0ZV9sZW4sIG5yX3Nsb3RzOwogCXdjaGFyX3QgKnVuaWNvZGUgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgd29ya1s4XSwgYnVmbmFtZVsyNjBdOwkvKiAyNTYgKyA0ICovCisJdW5zaWduZWQgY2hhciB3b3JrW01TRE9TX05BTUVdLCBidWZuYW1lWzI2MF07CS8qIDI1NiArIDQgKi8KIAlpbnQgdW5pX3hsYXRlID0gc2JpLT5vcHRpb25zLnVuaWNvZGVfeGxhdGU7CiAJaW50IHV0ZjggPSBzYmktPm9wdGlvbnMudXRmODsKIAlpbnQgYW55Y2FzZSA9IChzYmktPm9wdGlvbnMubmFtZV9jaGVjayAhPSAncycpOwpAQCAtMzUxLDcgKzM1MSw4IEBACiAJCWlmICh3b3JrWzBdID09IDB4MDUpCiAJCQl3b3JrWzBdID0gMHhFNTsKIAkJZm9yIChpID0gMCwgaiA9IDAsIGxhc3RfdSA9IDA7IGkgPCA4OykgewotCQkJaWYgKCF3b3JrW2ldKSBicmVhazsKKwkJCWlmICghd29ya1tpXSkKKwkJCQlicmVhazsKIAkJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmd29ya1tpXSwgOCAtIGksCiAJCQkJCQkmYnVmdW5hbWVbaisrXSwgb3B0X3Nob3J0bmFtZSwKIAkJCQkJCWRlLT5sY2FzZSAmIENBU0VfTE9XRVJfQkFTRSk7CkBAIC0zNjUsMTMgKzM2NiwxNSBAQAogCQl9CiAJCWogPSBsYXN0X3U7CiAJCWZhdF9zaG9ydDJ1bmkobmxzX2Rpc2ssICIuIiwgMSwgJmJ1ZnVuYW1lW2orK10pOwotCQlmb3IgKGkgPSAwOyBpIDwgMzspIHsKLQkJCWlmICghZGUtPmV4dFtpXSkgYnJlYWs7Ci0JCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJmRlLT5leHRbaV0sIDMgLSBpLAorCQlmb3IgKGkgPSA4OyBpIDwgTVNET1NfTkFNRTspIHsKKwkJCWlmICghd29ya1tpXSkKKwkJCQlicmVhazsKKwkJCWNobCA9IGZhdF9zaG9ydG5hbWUydW5pKG5sc19kaXNrLCAmd29ya1tpXSwKKwkJCQkJCU1TRE9TX05BTUUgLSBpLAogCQkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCiAJCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0VYVCk7CiAJCQlpZiAoY2hsIDw9IDEpIHsKLQkJCQlpZiAoZGUtPmV4dFtpXSAhPSAnICcpCisJCQkJaWYgKHdvcmtbaV0gIT0gJyAnKQogCQkJCQlsYXN0X3UgPSBqOwogCQkJfSBlbHNlIHsKIAkJCQlsYXN0X3UgPSBqOwpAQCAtNDQ1LDcgKzQ0OCw3IEBACiAJaW50IGZpbGxfbGVuOwogCXdjaGFyX3QgYnVmdW5hbWVbMTRdOwogCXdjaGFyX3QgKnVuaWNvZGUgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgYywgd29ya1s4XSwgYnVmbmFtZVs1Nl0sICpwdG5hbWUgPSBidWZuYW1lOworCXVuc2lnbmVkIGNoYXIgYywgd29ya1tNU0RPU19OQU1FXSwgYnVmbmFtZVs1Nl0sICpwdG5hbWUgPSBidWZuYW1lOwogCXVuc2lnbmVkIGxvbmcgbHBvcywgZHVtbXksICpmdXJyZnUgPSAmbHBvczsKIAlpbnQgdW5pX3hsYXRlID0gc2JpLT5vcHRpb25zLnVuaWNvZGVfeGxhdGU7CiAJaW50IGlzdmZhdCA9IHNiaS0+b3B0aW9ucy5pc3ZmYXQ7CkBAIC01MjcsNyArNTMwLDggQEAKIAlpZiAod29ya1swXSA9PSAweDA1KQogCQl3b3JrWzBdID0gMHhFNTsKIAlmb3IgKGkgPSAwLCBqID0gMCwgbGFzdCA9IDAsIGxhc3RfdSA9IDA7IGkgPCA4OykgewotCQlpZiAoIShjID0gd29ya1tpXSkpIGJyZWFrOworCQlpZiAoIShjID0gd29ya1tpXSkpCisJCQlicmVhazsKIAkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZ3b3JrW2ldLCA4IC0gaSwKIAkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCiAJCQkJCWRlLT5sY2FzZSAmIENBU0VfTE9XRVJfQkFTRSk7CkBAIC01NDksOSArNTUzLDEwIEBACiAJaiA9IGxhc3RfdTsKIAlmYXRfc2hvcnQydW5pKG5sc19kaXNrLCAiLiIsIDEsICZidWZ1bmFtZVtqKytdKTsKIAlwdG5hbWVbaSsrXSA9ICcuJzsKLQlmb3IgKGkyID0gMDsgaTIgPCAzOykgewotCQlpZiAoIShjID0gZGUtPmV4dFtpMl0pKSBicmVhazsKLQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZkZS0+ZXh0W2kyXSwgMyAtIGkyLAorCWZvciAoaTIgPSA4OyBpMiA8IE1TRE9TX05BTUU7KSB7CisJCWlmICghKGMgPSB3b3JrW2kyXSkpCisJCQlicmVhazsKKwkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZ3b3JrW2kyXSwgTVNET1NfTkFNRSAtIGkyLAogCQkJCQkmYnVmdW5hbWVbaisrXSwgb3B0X3Nob3J0bmFtZSwKIAkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9FWFQpOwogCQlpZiAoY2hsIDw9IDEpIHsKQEAgLTU2Myw4ICs1NjgsOCBAQAogCQkJfQogCQl9IGVsc2UgewogCQkJbGFzdF91ID0gajsKLQkJCWZvciAoY2hpID0gMDsgY2hpIDwgY2hsICYmIGkyIDwgMzsgY2hpKyspIHsKLQkJCQlwdG5hbWVbaSsrXSA9IGRlLT5leHRbaTIrK107CisJCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobCAmJiBpMiA8IE1TRE9TX05BTUU7IGNoaSsrKSB7CisJCQkJcHRuYW1lW2krK10gPSB3b3JrW2kyKytdOwogCQkJCWxhc3QgPSBpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0ZW50LmMgYi9mcy9mYXQvZmF0ZW50LmMKaW5kZXggYWIxNzFlYS4uMmMxYjczZiAxMDA2NDQKLS0tIGEvZnMvZmF0L2ZhdGVudC5jCisrKyBiL2ZzL2ZhdC9mYXRlbnQuYwpAQCAtMTcsNiArMTcsOCBAQAogCWludCAoKmVudF9uZXh0KShzdHJ1Y3QgZmF0X2VudHJ5ICopOwogfTsKIAorc3RhdGljIERFRklORV9TUElOTE9DSyhmYXQxMl9lbnRyeV9sb2NrKTsKKwogc3RhdGljIHZvaWQgZmF0MTJfZW50X2Jsb2NrbnIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVudHJ5LAogCQkJICAgICAgaW50ICpvZmZzZXQsIHNlY3Rvcl90ICpibG9ja25yKQogewpAQCAtMTE2LDEwICsxMTgsMTMgQEAKIAl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKIAlpbnQgbmV4dDsKIAorCXNwaW5fbG9jaygmZmF0MTJfZW50cnlfbG9jayk7CiAJaWYgKGZhdGVudC0+ZW50cnkgJiAxKQogCQluZXh0ID0gKCplbnQxMl9wWzBdID4+IDQpIHwgKCplbnQxMl9wWzFdIDw8IDQpOwogCWVsc2UKIAkJbmV4dCA9ICgqZW50MTJfcFsxXSA8PCA4KSB8ICplbnQxMl9wWzBdOworCXNwaW5fdW5sb2NrKCZmYXQxMl9lbnRyeV9sb2NrKTsKKwogCW5leHQgJj0gMHgwZmZmOwogCWlmIChuZXh0ID49IEJBRF9GQVQxMikKIAkJbmV4dCA9IEZBVF9FTlRfRU9GOwpAQCAtMTUxLDYgKzE1Niw3IEBACiAJaWYgKG5ldyA9PSBGQVRfRU5UX0VPRikKIAkJbmV3ID0gRU9GX0ZBVDEyOwogCisJc3Bpbl9sb2NrKCZmYXQxMl9lbnRyeV9sb2NrKTsKIAlpZiAoZmF0ZW50LT5lbnRyeSAmIDEpIHsKIAkJKmVudDEyX3BbMF0gPSAobmV3IDw8IDQpIHwgKCplbnQxMl9wWzBdICYgMHgwZik7CiAJCSplbnQxMl9wWzFdID0gbmV3ID4+IDQ7CkBAIC0xNTgsNiArMTY0LDcgQEAKIAkJKmVudDEyX3BbMF0gPSBuZXcgJiAweGZmOwogCQkqZW50MTJfcFsxXSA9ICgqZW50MTJfcFsxXSAmIDB4ZjApIHwgKG5ldyA+PiA4KTsKIAl9CisJc3Bpbl91bmxvY2soJmZhdDEyX2VudHJ5X2xvY2spOwogCiAJbWFya19idWZmZXJfZGlydHkoZmF0ZW50LT5iaHNbMF0pOwogCWlmIChmYXRlbnQtPm5yX2JocyA9PSAyKQpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCA0Nzk3MjJkLi4wYTdkZGIzIDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgpAQCAtMzU0LDggKzM1NSw3IEBACiAJfSBlbHNlIHsgLyogbm90IGEgZGlyZWN0b3J5ICovCiAJCWlub2RlLT5pX2dlbmVyYXRpb24gfD0gMTsKIAkJaW5vZGUtPmlfbW9kZSA9IE1TRE9TX01LTU9ERShkZS0+YXR0ciwKLQkJICAgICgoc2JpLT5vcHRpb25zLnNob3dleGVjICYmCi0JCQkhaXNfZXhlYyhkZS0+ZXh0KSkKKwkJICAgICgoc2JpLT5vcHRpb25zLnNob3dleGVjICYmICFpc19leGVjKGRlLT5uYW1lICsgOCkpCiAJCQk/IFNfSVJVR098U19JV1VHTyA6IFNfSVJXWFVHTykKIAkJICAgICYgfnNiaS0+b3B0aW9ucy5mc19mbWFzaykgfCBTX0lGUkVHOwogCQlNU0RPU19JKGlub2RlKS0+aV9zdGFydCA9IGxlMTZfdG9fY3B1KGRlLT5zdGFydCk7CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaAppbmRleCA4YTRkZmVmLi4zYzk2ZDZlIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZGlyLmgKQEAgLTgwLDcgKzgwLDcgQEAKICAqCWEgZF9uYW1lIHdpdGggc2l6ZSBsZW4uCiAgKi8KICNkZWZpbmUgVlhGU19ESVJQQUQJCTQKLSNkZWZpbmUgVlhGU19OQU1FTUlOCQkoKGludCkoKHN0cnVjdCB2eGZzX2RpcmVjdCAqKTApLT5kX25hbWUpCisjZGVmaW5lIFZYRlNfTkFNRU1JTgkJb2Zmc2V0b2Yoc3RydWN0IHZ4ZnNfZGlyZWN0LCBkX25hbWUpCiAjZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKQkoKFZYRlNfRElSUEFEICsgKGxlbikgLSAxKSAmIH4oVlhGU19ESVJQQUQgLTEpKQogI2RlZmluZSBWWEZTX0RJUkxFTihsZW4pCShWWEZTX0RJUlJPVU5EKFZYRlNfTkFNRU1JTiArIChsZW4pKSkKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9lYW9wcy5jIGIvZnMvZ2ZzMi9lYW9wcy5jCmluZGV4IGMxZjQ0MDAuLjFhYjNlOWQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZWFvcHMuYworKysgYi9mcy9nZnMyL2Vhb3BzLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbG1faW50ZXJmYWNlLmg+CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19leHBvcnQuYyBiL2ZzL2dmczIvb3BzX2V4cG9ydC5jCmluZGV4IDk5ZWE1NjUuLmI4MzEyZWQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2V4cG9ydC5jCisrKyBiL2ZzL2dmczIvb3BzX2V4cG9ydC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9sbV9pbnRlcmZhY2UuaD4KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYnRyZWUuYyBiL2ZzL2hmc3BsdXMvYnRyZWUuYwppbmRleCA5MGViYWI3Li4wNTBkMjljIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2J0cmVlLmMKKysrIGIvZnMvaGZzcGx1cy9idHJlZS5jCkBAIC02Miw4ICs2MiwxMCBAQAogCQlpZiAoKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9IRlNYKSAmJgogCQkgICAgKGhlYWQtPmtleV90eXBlID09IEhGU1BMVVNfS0VZX0JJTkFSWSkpCiAJCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2NhdF9iaW5fY21wX2tleTsKLQkJZWxzZQorCQllbHNlIHsKIAkJCXRyZWUtPmtleWNtcCA9IGhmc3BsdXNfY2F0X2Nhc2VfY21wX2tleTsKKwkJCUhGU1BMVVNfU0Ioc2IpLmZsYWdzIHw9IEhGU1BMVVNfU0JfQ0FTRUZPTEQ7CisJCX0KIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgImhmczogdW5rbm93biBCKlRyZWUgcmVxdWVzdGVkXG4iKTsKIAkJZ290byBmYWlsX3BhZ2U7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2Rpci5jIGIvZnMvaGZzcGx1cy9kaXIuYwppbmRleCA4MGI1NjgyLi4xOTU1ZWU2IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2Rpci5jCisrKyBiL2ZzL2hmc3BsdXMvZGlyLmMKQEAgLTM2LDYgKzM2LDggQEAKIAl1MTYgdHlwZTsKIAogCXNiID0gZGlyLT5pX3NiOworCisJZGVudHJ5LT5kX29wID0gJmhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnM7CiAJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CiAJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSwgJmZkKTsKIAloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2hmc3BsdXNfZnMuaCBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCmluZGV4IDM5MTU2MzUuLmQ5ZjVlZGEgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCisrKyBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCkBAIC0xNTAsNiArMTUwLDcgQEAKICNkZWZpbmUgSEZTUExVU19TQl9OT0RFQ09NUE9TRQkweDAwMDIKICNkZWZpbmUgSEZTUExVU19TQl9GT1JDRQkweDAwMDQKICNkZWZpbmUgSEZTUExVU19TQl9IRlNYCQkweDAwMDgKKyNkZWZpbmUgSEZTUExVU19TQl9DQVNFRk9MRAkweDAwMTAKIAogCiBzdHJ1Y3QgaGZzcGx1c19pbm9kZV9pbmZvIHsKQEAgLTMyMSw2ICszMjIsNyBAQAogLyogaW5vZGUuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaGZzcGx1c19hb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaGZzcGx1c19idHJlZV9hb3BzOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zOwogCiB2b2lkIGhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqKTsKIHZvaWQgaGZzcGx1c19pbm9kZV93cml0ZV9mb3JrKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqKTsKQEAgLTM1Myw2ICszNTUsOCBAQAogaW50IGhmc3BsdXNfc3RyY21wKGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKik7CiBpbnQgaGZzcGx1c191bmkyYXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY2hhciAqLCBpbnQgKik7CiBpbnQgaGZzcGx1c19hc2MydW5pKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworaW50IGhmc3BsdXNfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqc3RyKTsKK2ludCBoZnNwbHVzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnMxLCBzdHJ1Y3QgcXN0ciAqczIpOwogCiAvKiB3cmFwcGVyLmMgKi8KIGludCBoZnNwbHVzX3JlYWRfd3JhcHBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggNDA5Y2U1NC4uNmY3YzY2MiAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9pbm9kZS5jCisrKyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpAQCAtMTMxLDYgKzEzMSwxMSBAQAogCS53cml0ZXBhZ2VzCT0gaGZzcGx1c193cml0ZXBhZ2VzLAogfTsKIAorc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGhmc3BsdXNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfaGFzaCAgICAgICA9IGhmc3BsdXNfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZSAgICA9IGhmc3BsdXNfY29tcGFyZV9kZW50cnksCit9OworCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqaGZzcGx1c19maWxlX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQkgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9zdXBlci5jIGIvZnMvaGZzcGx1cy9zdXBlci5jCmluZGV4IGViZDFiMzguLjZkODdhMmEgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvc3VwZXIuYworKysgYi9mcy9oZnNwbHVzL3N1cGVyLmMKQEAgLTI4MywxMSArMjgzLDEwIEBACiAJc3RydWN0IG5sc190YWJsZSAqbmxzID0gTlVMTDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKEhGU1BMVVNfU0Ioc2IpKSk7CiAJc2ItPnNfZnNfaW5mbyA9IHNiaTsKIAlJTklUX0hMSVNUX0hFQUQoJnNiaS0+cnNyY19pbm9kZXMpOwogCWhmc3BsdXNfZmlsbF9kZWZhdWx0cyhzYmkpOwpAQCAtMzgxLDYgKzM4MCw3IEBACiAJCWlwdXQocm9vdCk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CisJc2ItPnNfcm9vdC0+ZF9vcCA9ICZoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zOwogCiAJc3RyLmxlbiA9IHNpemVvZihIRlNQX0hJRERFTkRJUl9OQU1FKSAtIDE7CiAJc3RyLm5hbWUgPSBIRlNQX0hJRERFTkRJUl9OQU1FOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy91bmljb2RlLmMgYi9mcy9oZnNwbHVzL3VuaWNvZGUuYwppbmRleCA2ODljOGJkLi45ZTEwZjk0IDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3VuaWNvZGUuYworKysgYi9mcy9oZnNwbHVzL3VuaWNvZGUuYwpAQCAtMjM5LDYxICsyMzksMjAxIEBACiAJcmV0dXJuIHJlczsKIH0KIAotaW50IGhmc3BsdXNfYXNjMnVuaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsIGNvbnN0IGNoYXIgKmFzdHIsIGludCBsZW4pCisvKgorICogQ29udmVydCBvbmUgb3IgbW9yZSBBU0NJSSBjaGFyYWN0ZXJzIGludG8gYSBzaW5nbGUgdW5pY29kZSBjaGFyYWN0ZXIuCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgQVNDSUkgY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmljb2RlIGNoYXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFzYzJ1bmljaGFyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmFzdHIsIGludCBsZW4sCisJCQkgICAgICB3Y2hhcl90ICp1YykKIHsKLQlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSBIRlNQTFVTX1NCKHNiKS5ubHM7Ci0JaW50IHNpemUsIG9mZiwgZGVjb21wb3NlOworCWludCBzaXplID0gSEZTUExVU19TQihzYikubmxzLT5jaGFyMnVuaShhc3RyLCBsZW4sIHVjKTsKKwlpZiAoc2l6ZSA8PSAwKSB7CisJCSp1YyA9ICc/JzsKKwkJc2l6ZSA9IDE7CisJfQorCXN3aXRjaCAoKnVjKSB7CisJY2FzZSAweDI0MDA6CisJCSp1YyA9IDA7CisJCWJyZWFrOworCWNhc2UgJzonOgorCQkqdWMgPSAnLyc7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworLyogRGVjb21wb3NlcyBhIHNpbmdsZSB1bmljb2RlIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyBpbmxpbmUgdTE2ICpkZWNvbXBvc2VfdW5pY2hhcih3Y2hhcl90IHVjLCBpbnQgKnNpemUpCit7CisJaW50IG9mZjsKKworCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlWyh1YyA+PiAxMikgJiAweGZdOworCWlmIChvZmYgPT0gMCB8fCBvZmYgPT0gMHhmZmZmKQorCQlyZXR1cm4gTlVMTDsKKworCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArICgodWMgPj4gOCkgJiAweGYpXTsKKwlpZiAoIW9mZikKKwkJcmV0dXJuIE5VTEw7CisKKwlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKHVjID4+IDQpICYgMHhmKV07CisJaWYgKCFvZmYpCisJCXJldHVybiBOVUxMOworCisJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKHVjICYgMHhmKV07CisJKnNpemUgPSBvZmYgJiAzOworCWlmICgqc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaGZzcGx1c19kZWNvbXBvc2VfdGFibGUgKyAob2ZmIC8gNCk7Cit9CisKK2ludCBoZnNwbHVzX2FzYzJ1bmkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGhmc3BsdXNfdW5pc3RyICp1c3RyLAorCQkgICAgY29uc3QgY2hhciAqYXN0ciwgaW50IGxlbikKK3sKKwlpbnQgc2l6ZSwgZHNpemUsIGRlY29tcG9zZTsKKwl1MTYgKmRzdHIsIG91dGxlbiA9IDA7CiAJd2NoYXJfdCBjOwotCXUxNiBvdXRsZW4gPSAwOwogCiAJZGVjb21wb3NlID0gIShIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UpOwotCiAJd2hpbGUgKG91dGxlbiA8IEhGU1BMVVNfTUFYX1NUUkxFTiAmJiBsZW4gPiAwKSB7Ci0JCXNpemUgPSBubHMtPmNoYXIydW5pKGFzdHIsIGxlbiwgJmMpOwotCQlpZiAoc2l6ZSA8PSAwKSB7Ci0JCQljID0gJz8nOwotCQkJc2l6ZSA9IDE7Ci0JCX0KLQkJYXN0ciArPSBzaXplOwotCQlsZW4gLT0gc2l6ZTsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgMHgyNDAwOgotCQkJYyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAnOic6Ci0JCQljID0gJy8nOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGMgPj0gMHhjMCAmJiBkZWNvbXBvc2UpIHsKLQkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlWyhjID4+IDEyKSAmIDB4Zl07Ci0JCQlpZiAoIW9mZikKLQkJCQlnb3RvIGRvbmU7Ci0JCQlpZiAob2ZmID09IDB4ZmZmZikgewotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArICgoYyA+PiA4KSAmIDB4ZildOwotCQkJaWYgKCFvZmYpCi0JCQkJZ290byBkb25lOwotCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKChjID4+IDQpICYgMHhmKV07Ci0JCQlpZiAoIW9mZikKLQkJCQlnb3RvIGRvbmU7Ci0JCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoYyAmIDB4ZildOwotCQkJc2l6ZSA9IG9mZiAmIDM7Ci0JCQlpZiAoIXNpemUpCi0JCQkJZ290byBkb25lOwotCQkJb2ZmIC89IDQ7Ci0JCQlpZiAob3V0bGVuICsgc2l6ZSA+IEhGU1BMVVNfTUFYX1NUUkxFTikKKwkJc2l6ZSA9IGFzYzJ1bmljaGFyKHNiLCBhc3RyLCBsZW4sICZjKTsKKworCQlpZiAoZGVjb21wb3NlICYmIChkc3RyID0gZGVjb21wb3NlX3VuaWNoYXIoYywgJmRzaXplKSkpIHsKKwkJCWlmIChvdXRsZW4gKyBkc2l6ZSA+IEhGU1BMVVNfTUFYX1NUUkxFTikKIAkJCQlicmVhazsKIAkJCWRvIHsKLQkJCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZisrXSk7Ci0JCQl9IHdoaWxlICgtLXNpemUgPiAwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JZG9uZToKLQkJdXN0ci0+dW5pY29kZVtvdXRsZW4rK10gPSBjcHVfdG9fYmUxNihjKTsKKwkJCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KCpkc3RyKyspOworCQkJfSB3aGlsZSAoLS1kc2l6ZSA+IDApOworCQl9IGVsc2UKKwkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoYyk7CisKKwkJYXN0ciArPSBzaXplOworCQlsZW4gLT0gc2l6ZTsKIAl9CiAJdXN0ci0+bGVuZ3RoID0gY3B1X3RvX2JlMTYob3V0bGVuKTsKIAlpZiAobGVuID4gMCkKIAkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBIYXNoIGEgc3RyaW5nIHRvIGFuIGludGVnZXIgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBIRlMrIGZpbGVzeXN0ZW0uCisgKiBDb21wb3NlZCB1bmljb2RlIGNoYXJhY3RlcnMgYXJlIGRlY29tcG9zZWQgYW5kIGNhc2UtZm9sZGluZyBpcyBwZXJmb3JtZWQKKyAqIGlmIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSAodW4pc2V0IG9uIHRoZSBzdXBlcmJsb2NrLgorICovCitpbnQgaGZzcGx1c19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpzdHIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwljb25zdCBjaGFyICphc3RyOworCWNvbnN0IHUxNiAqZHN0cjsKKwlpbnQgY2FzZWZvbGQsIGRlY29tcG9zZSwgc2l6ZSwgZHNpemUsIGxlbjsKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJd2NoYXJfdCBjOworCXUxNiBjMjsKKworCWNhc2Vmb2xkID0gKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9DQVNFRk9MRCk7CisJZGVjb21wb3NlID0gIShIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UpOworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCWFzdHIgPSBzdHItPm5hbWU7CisJbGVuID0gc3RyLT5sZW47CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJc2l6ZSA9IGFzYzJ1bmljaGFyKHNiLCBhc3RyLCBsZW4sICZjKTsKKwkJYXN0ciArPSBzaXplOworCQlsZW4gLT0gc2l6ZTsKKworCQlpZiAoZGVjb21wb3NlICYmIChkc3RyID0gZGVjb21wb3NlX3VuaWNoYXIoYywgJmRzaXplKSkpIHsKKwkJCWRvIHsKKwkJCQljMiA9ICpkc3RyKys7CisJCQkJaWYgKCFjYXNlZm9sZCB8fCAoYzIgPSBjYXNlX2ZvbGQoYzIpKSkKKwkJCQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGMyLCBoYXNoKTsKKwkJCX0gd2hpbGUgKC0tZHNpemUgPiAwKTsKKwkJfSBlbHNlIHsKKwkJCWMyID0gYzsKKwkJCWlmICghY2FzZWZvbGQgfHwgKGMyID0gY2FzZV9mb2xkKGMyKSkpCisJCQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGMyLCBoYXNoKTsKKwkJfQorCX0KKwlzdHItPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb21wYXJlIHN0cmluZ3Mgd2l0aCBIRlMrIGZpbGVuYW1lIG9yZGVyaW5nLgorICogQ29tcG9zZWQgdW5pY29kZSBjaGFyYWN0ZXJzIGFyZSBkZWNvbXBvc2VkIGFuZCBjYXNlLWZvbGRpbmcgaXMgcGVyZm9ybWVkCisgKiBpZiB0aGUgYXBwcm9wcmlhdGUgYml0cyBhcmUgKHVuKXNldCBvbiB0aGUgc3VwZXJibG9jay4KKyAqLworaW50IGhmc3BsdXNfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqczEsIHN0cnVjdCBxc3RyICpzMikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOworCWludCBjYXNlZm9sZCwgZGVjb21wb3NlLCBzaXplOworCWludCBkc2l6ZTEsIGRzaXplMiwgbGVuMSwgbGVuMjsKKwljb25zdCB1MTYgKmRzdHIxLCAqZHN0cjI7CisJY29uc3QgY2hhciAqYXN0cjEsICphc3RyMjsKKwl1MTYgYzEsIGMyOworCXdjaGFyX3QgYzsKKworCWNhc2Vmb2xkID0gKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9DQVNFRk9MRCk7CisJZGVjb21wb3NlID0gIShIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UpOworCWFzdHIxID0gczEtPm5hbWU7CisJbGVuMSA9IHMxLT5sZW47CisJYXN0cjIgPSBzMi0+bmFtZTsKKwlsZW4yID0gczItPmxlbjsKKwlkc2l6ZTEgPSBkc2l6ZTIgPSAwOworCWRzdHIxID0gZHN0cjIgPSBOVUxMOworCisJd2hpbGUgKGxlbjEgPiAwICYmIGxlbjIgPiAwKSB7CisJCWlmICghZHNpemUxKSB7CisJCQlzaXplID0gYXNjMnVuaWNoYXIoc2IsIGFzdHIxLCBsZW4xLCAmYyk7CisJCQlhc3RyMSArPSBzaXplOworCQkJbGVuMSAtPSBzaXplOworCisJCQlpZiAoIWRlY29tcG9zZSB8fCAhKGRzdHIxID0gZGVjb21wb3NlX3VuaWNoYXIoYywgJmRzaXplMSkpKSB7CisJCQkJYzEgPSBjOworCQkJCWRzdHIxID0gJmMxOworCQkJCWRzaXplMSA9IDE7CisJCQl9CisJCX0KKworCQlpZiAoIWRzaXplMikgeworCQkJc2l6ZSA9IGFzYzJ1bmljaGFyKHNiLCBhc3RyMiwgbGVuMiwgJmMpOworCQkJYXN0cjIgKz0gc2l6ZTsKKwkJCWxlbjIgLT0gc2l6ZTsKKworCQkJaWYgKCFkZWNvbXBvc2UgfHwgIShkc3RyMiA9IGRlY29tcG9zZV91bmljaGFyKGMsICZkc2l6ZTIpKSkgeworCQkJCWMyID0gYzsKKwkJCQlkc3RyMiA9ICZjMjsKKwkJCQlkc2l6ZTIgPSAxOworCQkJfQorCQl9CisKKwkJYzEgPSAqZHN0cjE7CisJCWMyID0gKmRzdHIyOworCQlpZiAoY2FzZWZvbGQpIHsKKwkJCWlmICAoIShjMSA9IGNhc2VfZm9sZChjMSkpKSB7CisJCQkJZHN0cjErKzsKKwkJCQlkc2l6ZTEtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghKGMyID0gY2FzZV9mb2xkKGMyKSkpIHsKKwkJCQlkc3RyMisrOworCQkJCWRzaXplMi0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChjMSA8IGMyKQorCQkJcmV0dXJuIC0xOworCQllbHNlIGlmIChjMSA+IGMyKQorCQkJcmV0dXJuIDE7CisKKwkJZHN0cjErKzsKKwkJZHNpemUxLS07CisJCWRzdHIyKys7CisJCWRzaXplMi0tOworCX0KKworCWlmIChsZW4xIDwgbGVuMikKKwkJcmV0dXJuIC0xOworCWlmIChsZW4xID4gbGVuMikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IGU2YjQ2YjMuLmQxNDVjYjcgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC0xMywxNSArMTMsMTggQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00Nyw2ICs1MCwyMSBAQAogCiBpbnQgc3lzY3RsX2h1Z2V0bGJfc2htX2dyb3VwOwogCitlbnVtIHsKKwlPcHRfc2l6ZSwgT3B0X25yX2lub2RlcywKKwlPcHRfbW9kZSwgT3B0X3VpZCwgT3B0X2dpZCwKKwlPcHRfZXJyLAorfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfc2l6ZSwJInNpemU9JXMifSwKKwl7T3B0X25yX2lub2RlcywJIm5yX2lub2Rlcz0lcyJ9LAorCXtPcHRfbW9kZSwJIm1vZGU9JW8ifSwKKwl7T3B0X3VpZCwJInVpZD0ldSJ9LAorCXtPcHRfZ2lkLAkiZ2lkPSV1In0sCisJe09wdF9lcnIsCU5VTEx9LAorfTsKKwogc3RhdGljIHZvaWQgaHVnZV9wYWdldmVjX3JlbGVhc2Uoc3RydWN0IHBhZ2V2ZWMgKnB2ZWMpCiB7CiAJaW50IGk7CkBAIC01OTQsNDYgKzYxMiw3MyBAQAogc3RhdGljIGludAogaHVnZXRsYmZzX3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgc3RydWN0IGh1Z2V0bGJmc19jb25maWcgKnBjb25maWcpCiB7Ci0JY2hhciAqb3B0LCAqdmFsdWUsICpyZXN0OworCWNoYXIgKnAsICpyZXN0OworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgb3B0aW9uOwogCiAJaWYgKCFvcHRpb25zKQogCQlyZXR1cm4gMDsKLQl3aGlsZSAoKG9wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewotCQlpZiAoISpvcHQpCisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuOworCQlpZiAoISpwKQogCQkJY29udGludWU7CiAKLQkJdmFsdWUgPSBzdHJjaHIob3B0LCAnPScpOwotCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZWxzZQotCQkJKnZhbHVlKysgPSAnXDAnOworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisgCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXBjb25maWctPnVpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOwogCi0JCWlmICghc3RyY21wKG9wdCwgInVpZCIpKQotCQkJcGNvbmZpZy0+dWlkID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7Ci0JCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiZ2lkIikpCi0JCQlwY29uZmlnLT5naWQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb2RlIikpCi0JCQlwY29uZmlnLT5tb2RlID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsJnZhbHVlLDApICYgMDc3N1U7Ci0JCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic2l6ZSIpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IG1lbXBhcnNlKHZhbHVlLCAmcmVzdCk7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorIAkJCQlnb3RvIGJhZF92YWw7CisJCQlwY29uZmlnLT5naWQgPSBvcHRpb247CisJCQlicmVhazsKKworCQljYXNlIE9wdF9tb2RlOgorCQkJaWYgKG1hdGNoX29jdGFsKCZhcmdzWzBdLCAmb3B0aW9uKSkKKyAJCQkJZ290byBiYWRfdmFsOworCQkJcGNvbmZpZy0+bW9kZSA9IG9wdGlvbiAmIDA3NzdVOworCQkJYnJlYWs7CisKKwkJY2FzZSBPcHRfc2l6ZTogeworIAkJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplOworCQkJLyogbWVtcGFyc2UoKSB3aWxsIGFjY2VwdCBhIEsvTS9HIHdpdGhvdXQgYSBkaWdpdCAqLworCQkJaWYgKCFpc2RpZ2l0KCphcmdzWzBdLmZyb20pKQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCXNpemUgPSBtZW1wYXJzZShhcmdzWzBdLmZyb20sICZyZXN0KTsKIAkJCWlmICgqcmVzdCA9PSAnJScpIHsKIAkJCQlzaXplIDw8PSBIUEFHRV9TSElGVDsKIAkJCQlzaXplICo9IG1heF9odWdlX3BhZ2VzOwogCQkJCWRvX2RpdihzaXplLCAxMDApOwotCQkJCXJlc3QrKzsKIAkJCX0KIAkJCXBjb25maWctPm5yX2Jsb2NrcyA9IChzaXplID4+IEhQQUdFX1NISUZUKTsKLQkJCXZhbHVlID0gcmVzdDsKLQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwibnJfaW5vZGVzIikpIHsKLQkJCXBjb25maWctPm5yX2lub2RlcyA9IG1lbXBhcnNlKHZhbHVlLCAmcmVzdCk7Ci0JCQl2YWx1ZSA9IHJlc3Q7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQogCi0JCWlmICgqdmFsdWUpCisJCWNhc2UgT3B0X25yX2lub2RlczoKKwkJCS8qIG1lbXBhcnNlKCkgd2lsbCBhY2NlcHQgYSBLL00vRyB3aXRob3V0IGEgZGlnaXQgKi8KKwkJCWlmICghaXNkaWdpdCgqYXJnc1swXS5mcm9tKSkKKwkJCQlnb3RvIGJhZF92YWw7CisJCQlwY29uZmlnLT5ucl9pbm9kZXMgPSBtZW1wYXJzZShhcmdzWzBdLmZyb20sICZyZXN0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImh1Z2V0bGJmczogQmFkIG1vdW50IG9wdGlvbjogXCIlc1wiXG4iLAorCQkJCSBwKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAl9CiAJcmV0dXJuIDA7CisKK2JhZF92YWw6CisgCXByaW50ayhLRVJOX0VSUiAiaHVnZXRsYmZzOiBCYWQgdmFsdWUgJyVzJyBmb3IgbW91bnQgb3B0aW9uICclcydcbiIsCisJICAgICAgIGFyZ3NbMF0uZnJvbSwgcCk7CisgCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CkBAIC02NTEsNyArNjk2LDYgQEAKIAljb25maWcuZ2lkID0gY3VycmVudC0+ZnNnaWQ7CiAJY29uZmlnLm1vZGUgPSAwNzU1OwogCXJldCA9IGh1Z2V0bGJmc19wYXJzZV9vcHRpb25zKGRhdGEsICZjb25maWcpOwotCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggOWEwMTJjYy4uMzIwZTA4OCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJbWFwcGluZy0+YV9vcHMgPSAmZW1wdHlfYW9wczsKICAJCW1hcHBpbmctPmhvc3QgPSBpbm9kZTsKIAkJbWFwcGluZy0+ZmxhZ3MgPSAwOwotCQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVIpOworCQltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFKTsKIAkJbWFwcGluZy0+YXNzb2NfbWFwcGluZyA9IE5VTEw7CiAJCW1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOwogCkBAIC00NjIsNiArNDYyLDExIEBACiAJcmV0dXJuIChpbm9kZXNfc3RhdC5ucl91bnVzZWQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KIAorc3RhdGljIHN0cnVjdCBzaHJpbmtlciBpY2FjaGVfc2hyaW5rZXIgPSB7CisJLnNocmluayA9IHNocmlua19pY2FjaGVfbWVtb3J5LAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OworCiBzdGF0aWMgdm9pZCBfX3dhaXRfb25fZnJlZWluZ19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIC8qCiAgKiBDYWxsZWQgd2l0aCB0aGUgaW5vZGUgbG9jayBoZWxkLgpAQCAtNTE5LDcgKzUyNCwxMyBAQAogICoJbmV3X2lub2RlIAktIG9idGFpbiBhbiBpbm9kZQogICoJQHNiOiBzdXBlcmJsb2NrCiAgKgotICoJQWxsb2NhdGVzIGEgbmV3IGlub2RlIGZvciBnaXZlbiBzdXBlcmJsb2NrLgorICoJQWxsb2NhdGVzIGEgbmV3IGlub2RlIGZvciBnaXZlbiBzdXBlcmJsb2NrLiBUaGUgZGVmYXVsdCBnZnBfbWFzaworICoJZm9yIGFsbG9jYXRpb25zIHJlbGF0ZWQgdG8gaW5vZGUtPmlfbWFwcGluZyBpcyBHRlBfSElHSFVTRVJfUEFHRUNBQ0hFLgorICoJSWYgSElHSE1FTSBwYWdlcyBhcmUgdW5zdWl0YWJsZSBvciBpdCBpcyBrbm93biB0aGF0IHBhZ2VzIGFsbG9jYXRlZAorICoJZm9yIHRoZSBwYWdlIGNhY2hlIGFyZSBub3QgcmVjbGFpbWFibGUgb3IgbWlncmF0YWJsZSwKKyAqCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBzdWl0YWJsZSBmbGFncyBvbiB0aGUKKyAqCW5ld2x5IGNyZWF0ZWQgaW5vZGUncyBtYXBwaW5nCisgKgogICovCiBzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewpAQCAtMTM3OSw3ICsxMzkwLDcgQEAKIAkJCQkJIFNMQUJfTUVNX1NQUkVBRCksCiAJCQkJCSBpbml0X29uY2UsCiAJCQkJCSBOVUxMKTsKLQlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2ljYWNoZV9tZW1vcnkpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZpY2FjaGVfc2hyaW5rZXIpOwogCiAJLyogSGFzaCBtYXkgaGF2ZSBiZWVuIHNldCB1cCBpbiBpbm9kZV9pbml0X2Vhcmx5ICovCiAJaWYgKCFoYXNoZGlzdCkKZGlmZiAtLWdpdCBhL2ZzL2lvY3RsLmMgYi9mcy9pb2N0bC5jCmluZGV4IDhjOTBjYmMuLmMyYTc3M2UgMTAwNjQ0Ci0tLSBhL2ZzL2lvY3RsLmMKKysrIGIvZnMvaW9jdGwuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CkBAIC0yMSw3ICsyMCw2IEBACiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCBlcnJvciA9IC1FTk9UVFk7Ci0Jdm9pZCAqZjsKIAogCWlmICghZmlscC0+Zl9vcCkKIAkJZ290byBvdXQ7CkBAIC0zMSwxNiArMjksMTAgQEAKIAkJaWYgKGVycm9yID09IC1FTk9JT0NUTENNRCkKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmICgoZiA9IGZpbHAtPmZfb3AtPmlvY3RsKSkgeworCX0gZWxzZSBpZiAoZmlscC0+Zl9vcC0+aW9jdGwpIHsKIAkJbG9ja19rZXJuZWwoKTsKLQkJaWYgKCFmaWxwLT5mX29wLT5pb2N0bCkgewotCQkJcHJpbnRrKCIlczogaW9jdGwgJXAgZGlzYXBwZWFyZWRcbiIsIF9fRlVOQ1RJT05fXywgZik7Ci0JCQlwcmludF9zeW1ib2woInN5bWJvbDogJXNcbiIsICh1bnNpZ25lZCBsb25nKWYpOwotCQkJZHVtcF9zdGFjaygpOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSBmaWxwLT5mX29wLT5pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAotCQkJCQkJICBmaWxwLCBjbWQsIGFyZyk7Ci0JCX0KKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5pb2N0bChmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLAorCQkJCQkgIGZpbHAsIGNtZCwgYXJnKTsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCX0KIApAQCAtMTgyLDExICsxNzQsMyBAQAogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9Ci0KLS8qCi0gKiBQbGF0Zm9ybXMgaW1wbGVtZW50aW5nIDMyIGJpdCBjb21wYXRpYmlsaXR5IGlvY3RsIGhhbmRsZXJzIGluCi0gKiBtb2R1bGVzIG5lZWQgdGhpcyBleHBvcnRlZAotICovCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotRVhQT1JUX1NZTUJPTChzeXNfaW9jdGwpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9pc29mcy9kaXIuYyBiL2ZzL2lzb2ZzL2Rpci5jCmluZGV4IDBlOTRjMzEuLjFiYTQwN2MgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2Rpci5jCisrKyBiL2ZzL2lzb2ZzL2Rpci5jCkBAIC03LDM0ICs3LDE4IEBACiAgKgogICogIFN0ZXZlIEJleW5vbgkJICAgICAgIDogTWlzc2luZyBsYXN0IGRpcmVjdG9yeSBlbnRyaWVzIGZpeGVkCiAgKiAgKHN0ZXBoZW5AYXNrb25lLmRlbW9uLmNvLnVrKSAgICAgIDogMjFzdCBKdW5lIDE5OTYKLSAqIAorICoKICAqICBpc29mcyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCiAgKi8KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgImlzb2ZzLmgiCiAKLXN0YXRpYyBpbnQgaXNvZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNvZnNfZGlyX29wZXJhdGlvbnMgPQotewotCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCi0JLnJlYWRkaXIJPSBpc29mc19yZWFkZGlyLAotfTsKLQotLyoKLSAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCi0gKi8KLWNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KLXsKLQkubG9va3VwCQk9IGlzb2ZzX2xvb2t1cCwKLX07Ci0KIGludCBpc29mc19uYW1lX3RyYW5zbGF0ZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLCBjaGFyICpuZXcsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJY2hhciAqIG9sZCA9IGRlLT5uYW1lOwogCWludCBsZW4gPSBkZS0+bmFtZV9sZW5bMF07CiAJaW50IGk7Ci0JCQkKKwogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQl1bnNpZ25lZCBjaGFyIGMgPSBvbGRbaV07CiAJCWlmICghYykKQEAgLTYyLDIyICs0NiwyNyBAQAogfQogCiAvKiBBY29ybiBleHRlbnNpb25zIHdyaXR0ZW4gYnkgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGJvZmguYWk+IDE5OTggKi8KLWludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGUsCi0JCQkgICAgY2hhciAqIHJldG5hbWUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoraW50IGdldF9hY29ybl9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLAorCQkJICAgIGNoYXIgKnJldG5hbWUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IHN0ZDsKLQl1bnNpZ25lZCBjaGFyICogY2hyOworCXVuc2lnbmVkIGNoYXIgKmNocjsKIAlpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTsKLQlpZiAocmV0bmFtbGVuID09IDApIHJldHVybiAwOworCisJaWYgKHJldG5hbWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKIAlzdGQgPSBzaXplb2Yoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKSArIGRlLT5uYW1lX2xlblswXTsKLQlpZiAoc3RkICYgMSkgc3RkKys7Ci0JaWYgKCgqKCh1bnNpZ25lZCBjaGFyICopIGRlKSAtIHN0ZCkgIT0gMzIpIHJldHVybiByZXRuYW1sZW47CisJaWYgKHN0ZCAmIDEpCisJCXN0ZCsrOworCWlmICgoKigodW5zaWduZWQgY2hhciAqKSBkZSkgLSBzdGQpICE9IDMyKQorCQlyZXR1cm4gcmV0bmFtbGVuOwogCWNociA9ICgodW5zaWduZWQgY2hhciAqKSBkZSkgKyBzdGQ7Ci0JaWYgKHN0cm5jbXAoY2hyLCAiQVJDSElNRURFUyIsIDEwKSkgcmV0dXJuIHJldG5hbWxlbjsKLQlpZiAoKCpyZXRuYW1lID09ICdfJykgJiYgKChjaHJbMTldICYgMSkgPT0gMSkpICpyZXRuYW1lID0gJyEnOworCWlmIChzdHJuY21wKGNociwgIkFSQ0hJTUVERVMiLCAxMCkpCisJCXJldHVybiByZXRuYW1sZW47CisJaWYgKCgqcmV0bmFtZSA9PSAnXycpICYmICgoY2hyWzE5XSAmIDEpID09IDEpKQorCQkqcmV0bmFtZSA9ICchJzsKIAlpZiAoKChkZS0+ZmxhZ3NbMF0gJiAyKSA9PSAwKSAmJiAoY2hyWzEzXSA9PSAweGZmKQotCQkmJiAoKGNoclsxMl0gJiAweGYwKSA9PSAweGYwKSkKLQl7CisJCSYmICgoY2hyWzEyXSAmIDB4ZjApID09IDB4ZjApKSB7CiAJCXJldG5hbWVbcmV0bmFtbGVuXSA9ICcsJzsKIAkJc3ByaW50ZihyZXRuYW1lK3JldG5hbWxlbisxLCAiJTMuM3giLAogCQkJKChjaHJbMTJdICYgMHhmKSA8PCA4KSB8IGNoclsxMV0pOwpAQCAtOTEsNyArODAsNyBAQAogICovCiBzdGF0aWMgaW50IGRvX2lzb2ZzX3JlYWRkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCi0JCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKKwkJY2hhciAqdG1wbmFtZSwgc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICp0bXBkZSkKIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CiAJdW5zaWduZWQgY2hhciBidWZiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOwpAQCAtMTIxLDkgKzExMCwxMSBAQAogCiAJCWRlX2xlbiA9ICoodW5zaWduZWQgY2hhciAqKSBkZTsKIAotCQkvKiBJZiB0aGUgbGVuZ3RoIGJ5dGUgaXMgemVybywgd2Ugc2hvdWxkIG1vdmUgb24gdG8gdGhlIG5leHQKLQkJICAgQ0RST00gc2VjdG9yLiAgSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeSwgd2UKLQkJICAga2ljayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AuICovCisJCS8qCisJCSAqIElmIHRoZSBsZW5ndGggYnl0ZSBpcyB6ZXJvLCB3ZSBzaG91bGQgbW92ZSBvbiB0byB0aGUgbmV4dAorCQkgKiBDRFJPTSBzZWN0b3IuICBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5LCB3ZQorCQkgKiBraWNrIG91dCBvZiB0aGUgd2hpbGUgbG9vcC4KKwkJICovCiAKIAkJaWYgKGRlX2xlbiA9PSAwKSB7CiAJCQlicmVsc2UoYmgpOwpAQCAtMTU3LDExICsxNDgsMTAgQEAKIAogCQlpZiAoZmlyc3RfZGUpIHsKIAkJCWlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLAotCQkJCQkJCSAmYmxvY2tfc2F2ZWQsCi0JCQkJCQkJICZvZmZzZXRfc2F2ZWQpOworCQkJCQkJCSZibG9ja19zYXZlZCwKKwkJCQkJCQkmb2Zmc2V0X3NhdmVkKTsKIAkJCWlub2RlX251bWJlciA9IGlzb2ZzX2dldF9pbm8oYmxvY2tfc2F2ZWQsCi0JCQkJCQkgICAgIG9mZnNldF9zYXZlZCwKLQkJCQkJCSAgICAgYnVmYml0cyk7CisJCQkJCQkJb2Zmc2V0X3NhdmVkLCBidWZiaXRzKTsKIAkJfQogCiAJCWlmIChkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiAweDgwKSB7CkBAIC0xOTksNyArMTg5LDcgQEAKIAkJICovCiAJCWlmICgoc2JpLT5zX2hpZGUgPT0gJ3knICYmCiAJCQkJKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDEpKSB8fAotCQkgICAgICAoc2JpLT5zX3Nob3dhc3NvYyA9PSduJyAmJgorCQkJCShzYmktPnNfc2hvd2Fzc29jID09J24nICYmCiAJCQkJKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDQpKSkgewogCQkJZmlscC0+Zl9wb3MgKz0gZGVfbGVuOwogCQkJY29udGludWU7CkBAIC0yNDAsNyArMjMwLDggQEAKIAogCQljb250aW51ZTsKIAl9Ci0JaWYgKGJoKSBicmVsc2UoYmgpOworCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjUzLDggKzI0NCw4IEBACiAJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJaW50IHJlc3VsdDsKLQljaGFyICogdG1wbmFtZTsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZTsKKwljaGFyICp0bXBuYW1lOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGU7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAKIAl0bXBuYW1lID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CkBAIC0yNzAsMyArMjYxLDE5IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiByZXN1bHQ7CiB9CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNvZnNfZGlyX29wZXJhdGlvbnMgPQoreworCS5yZWFkID0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpciA9IGlzb2ZzX3JlYWRkaXIsCit9OworCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5sb29rdXAgPSBpc29mc19sb29rdXAsCit9OworCisKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lub2RlLmMgYi9mcy9pc29mcy9pbm9kZS5jCmluZGV4IDVjM2VlY2YuLjRmNTQxOGIgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lub2RlLmMKKysrIGIvZnMvaXNvZnMvaW5vZGUuYwpAQCAtNzMsMjAgKzczLDIwIEBACiAJa21lbV9jYWNoZV9mcmVlKGlzb2ZzX2lub2RlX2NhY2hlcCwgSVNPRlNfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IGZvbzsKIAogCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CiB9Ci0gCisKIHN0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCiB7CiAJaXNvZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlzb2ZzX2lub2RlX2NhY2hlIiwKLQkJCQkJICAgICBzaXplb2Yoc3RydWN0IGlzb19pbm9kZV9pbmZvKSwKLQkJCQkJICAgICAwLCAoU0xBQl9SRUNMQUlNX0FDQ09VTlR8Ci0JCQkJCQlTTEFCX01FTV9TUFJFQUQpLAotCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLAorCQkJCQkwLCAoU0xBQl9SRUNMQUlNX0FDQ09VTlR8CisJCQkJCVNMQUJfTUVNX1NQUkVBRCksCisJCQkJCWluaXRfb25jZSwgTlVMTCk7CiAJaWYgKGlzb2ZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTE1MCw5ICsxNTAsOSBAQAogCXVpZF90IHVpZDsKIAljaGFyICppb2NoYXJzZXQ7CiAJdW5zaWduZWQgY2hhciB1dGY4OwotICAgICAgICAvKiBMVkUgKi8KLSAgICAgICAgczMyIHNlc3Npb247Ci0gICAgICAgIHMzMiBzYnNlY3RvcjsKKwkvKiBMVkUgKi8KKwlzMzIgc2Vzc2lvbjsKKwlzMzIgc2JzZWN0b3I7CiB9OwogCiAvKgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CiAJd2hpbGUgKGxlbi0tKSB7CiAJCWMgPSB0b2xvd2VyKCpuYW1lKyspOwotCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2godG9sb3dlcihjKSwgaGFzaCk7CisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjLCBoYXNoKTsKIAl9CiAJcXN0ci0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CiAKQEAgLTM2MCwxMCArMzYwLDEyIEBACiAJcG9wdC0+Y2hlY2sgPSAndSc7CQkvKiB1bnNldCAqLwogCXBvcHQtPm5vY29tcHJlc3MgPSAwOwogCXBvcHQtPmJsb2Nrc2l6ZSA9IDEwMjQ7Ci0JcG9wdC0+bW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPOyAvKiByLXggZm9yIGFsbC4gIFRoZSBkaXNjIGNvdWxkCi0JCQkJCSAgIGJlIHNoYXJlZCB3aXRoIERPUyBtYWNoaW5lcyBzbwotCQkJCQkgICB2aXJ0dWFsbHkgYW55dGhpbmcgY291bGQgYmUKLQkJCQkJICAgYSB2YWxpZCBleGVjdXRhYmxlLiAqLworCXBvcHQtPm1vZGUgPSBTX0lSVUdPIHwgU19JWFVHTzsgLyoKKwkJCQkJICogci14IGZvciBhbGwuICBUaGUgZGlzYyBjb3VsZAorCQkJCQkgKiBiZSBzaGFyZWQgd2l0aCBET1MgbWFjaGluZXMgc28KKwkJCQkJICogdmlydHVhbGx5IGFueXRoaW5nIGNvdWxkIGJlCisJCQkJCSAqIGEgdmFsaWQgZXhlY3V0YWJsZS4KKwkJCQkJICovCiAJcG9wdC0+Z2lkID0gMDsKIAlwb3B0LT51aWQgPSAwOwogCXBvcHQtPmlvY2hhcnNldCA9IE5VTEw7CkBAIC01MDMsMzAgKzUwNSwzMCBAQAogCQlUZS5jZHRlX2Zvcm1hdD1DRFJPTV9MQkE7CiAJCWkgPSBpb2N0bF9ieV9iZGV2KGJkZXYsIENEUk9NUkVBRFRPQ0VOVFJZLCAodW5zaWduZWQgbG9uZykgJlRlKTsKIAkJaWYgKCFpKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiU2Vzc2lvbiAlZCBzdGFydCAlZCB0eXBlICVkXG4iLAotCQkJICAgICAgIHNlc3Npb24sIFRlLmNkdGVfYWRkci5sYmEsCi0JCQkgICAgICAgVGUuY2R0ZV9jdHJsJkNEUk9NX0RBVEFfVFJBQ0spOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBTZXNzaW9uICVkIHN0YXJ0ICVkIHR5cGUgJWRcbiIsCisJCQkJc2Vzc2lvbiwgVGUuY2R0ZV9hZGRyLmxiYSwKKwkJCQlUZS5jZHRlX2N0cmwmQ0RST01fREFUQV9UUkFDSyk7CiAJCQlpZiAoKFRlLmNkdGVfY3RybCZDRFJPTV9EQVRBX1RSQUNLKSA9PSA0KQogCQkJCXJldHVybiBUZS5jZHRlX2FkZHIubGJhOwogCQl9Ci0JCQkKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCisJCXByaW50ayhLRVJOX0VSUiAiSVNPRlM6IEludmFsaWQgc2Vzc2lvbiBudW1iZXIgb3IgdHlwZSBvZiB0cmFja1xuIik7CiAJfQogCWkgPSBpb2N0bF9ieV9iZGV2KGJkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykgJm1zX2luZm8pOwogCWlmIChzZXNzaW9uID4gMCkKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJU09GUzogSW52YWxpZCBzZXNzaW9uIG51bWJlclxuIik7CiAjaWYgMAotCXByaW50aygiaXNvZnMuaW5vZGU6IENEUk9NTVVMVElTRVNTSU9OOiByYz0lZFxuIixpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaXNvZnMuaW5vZGU6IENEUk9NTVVMVElTRVNTSU9OOiByYz0lZFxuIixpKTsKIAlpZiAoaT09MCkgewotCQlwcmludGsoImlzb2ZzLmlub2RlOiBYQSBkaXNrOiAlc1xuIixtc19pbmZvLnhhX2ZsYWc/InllcyI6Im5vIik7Ci0JCXByaW50aygiaXNvZnMuaW5vZGU6IHZvbF9kZXNjX3N0YXJ0ID0gJWRcbiIsIG1zX2luZm8uYWRkci5sYmEpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaXNvZnMuaW5vZGU6IFhBIGRpc2s6ICVzXG4iLG1zX2luZm8ueGFfZmxhZz8ieWVzIjoibm8iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlzb2ZzLmlub2RlOiB2b2xfZGVzY19zdGFydCA9ICVkXG4iLCBtc19pbmZvLmFkZHIubGJhKTsKIAl9CiAjZW5kaWYKIAlpZiAoaT09MCkKICNpZiBXRV9PQkVZX1RIRV9XUklUVEVOX1NUQU5EQVJEUwotICAgICAgICBpZiAobXNfaW5mby54YV9mbGFnKSAvKiBuZWNlc3NhcnkgZm9yIGEgdmFsaWQgbXNfaW5mby5hZGRyICovCisJCWlmIChtc19pbmZvLnhhX2ZsYWcpIC8qIG5lY2Vzc2FyeSBmb3IgYSB2YWxpZCBtc19pbmZvLmFkZHIgKi8KICNlbmRpZgotCQl2b2xfZGVzY19zdGFydD1tc19pbmZvLmFkZHIubGJhOworCQkJdm9sX2Rlc2Nfc3RhcnQ9bXNfaW5mby5hZGRyLmxiYTsKIAlyZXR1cm4gdm9sX2Rlc2Nfc3RhcnQ7CiB9CiAKQEAgLTUzOCwyMCArNTQwLDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgaXNvZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkCSAgICAgICogYmggPSBOVUxMLCAqcHJpX2JoID0gTlVMTDsKLQlzdHJ1Y3QgaHNfcHJpbWFyeV9kZXNjcmlwdG9yICAqIGhfcHJpID0gTlVMTDsKLQlzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqIHByaSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwsICpwcmlfYmggPSBOVUxMOworCXN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKmhfcHJpID0gTlVMTDsKKwlzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqcHJpID0gTlVMTDsKIAlzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqc2VjID0gTlVMTDsKLQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgICAqIHJvb3RwOwotCWludAkJCQlqb2xpZXRfbGV2ZWwgPSAwOwotCWludAkJCQlpc29fYmxrbnVtLCBibG9jazsKLQlpbnQJCQkJb3JpZ196b25lc2l6ZTsKLQlpbnQJCQkJdGFibGU7Ci0JdW5zaWduZWQgaW50CQkJdm9sX2Rlc2Nfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZwkJCWZpcnN0X2RhdGFfem9uZTsKLQlzdHJ1Y3QgaW5vZGUJCSAgICAgICogaW5vZGU7Ci0Jc3RydWN0IGlzbzk2NjBfb3B0aW9ucwkJb3B0OwotCXN0cnVjdCBpc29mc19zYl9pbmZvCSAgICAgICogc2JpOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqcm9vdHA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaXNvOTY2MF9vcHRpb25zIG9wdDsKKwlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZGF0YV96b25lOworCWludCBqb2xpZXRfbGV2ZWwgPSAwOworCWludCBpc29fYmxrbnVtLCBibG9jazsKKwlpbnQgb3JpZ196b25lc2l6ZTsKKwlpbnQgdGFibGU7CisJdW5zaWduZWQgaW50IHZvbF9kZXNjX3N0YXJ0OwogCiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQpAQCAtNTc3LDcyICs1NzksNzMgQEAKIAl2b2xfZGVzY19zdGFydCA9IChvcHQuc2JzZWN0b3IgIT0gLTEpID8KIAkJb3B0LnNic2VjdG9yIDogaXNvZnNfZ2V0X2xhc3Rfc2Vzc2lvbihzLG9wdC5zZXNzaW9uKTsKIAotICAJZm9yIChpc29fYmxrbnVtID0gdm9sX2Rlc2Nfc3RhcnQrMTY7Ci0gICAgICAgICAgICAgaXNvX2Jsa251bSA8IHZvbF9kZXNjX3N0YXJ0KzEwMDsgaXNvX2Jsa251bSsrKQotCXsKLQkgICAgc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICAgKiBoZHA7Ci0JICAgIHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgICogdmRwOworCWZvciAoaXNvX2Jsa251bSA9IHZvbF9kZXNjX3N0YXJ0KzE2OworCQlpc29fYmxrbnVtIDwgdm9sX2Rlc2Nfc3RhcnQrMTAwOyBpc29fYmxrbnVtKyspIHsKKwkJc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICpoZHA7CisJCXN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgICp2ZHA7CiAKLQkgICAgYmxvY2sgPSBpc29fYmxrbnVtIDw8IChJU09GU19CTE9DS19CSVRTIC0gcy0+c19ibG9ja3NpemVfYml0cyk7Ci0JICAgIGlmICghKGJoID0gc2JfYnJlYWQocywgYmxvY2spKSkKLQkJZ290byBvdXRfbm9fcmVhZDsKKwkJYmxvY2sgPSBpc29fYmxrbnVtIDw8IChJU09GU19CTE9DS19CSVRTIC0gcy0+c19ibG9ja3NpemVfYml0cyk7CisJCWlmICghKGJoID0gc2JfYnJlYWQocywgYmxvY2spKSkKKwkJCWdvdG8gb3V0X25vX3JlYWQ7CiAKLQkgICAgdmRwID0gKHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOwotCSAgICBoZHAgPSAoc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKLQkgICAgCi0JICAgIC8qIER1ZSB0byB0aGUgb3ZlcmxhcHBpbmcgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLCAKLQkgICAgICogSVNPIENEcyBjYW4gbWF0Y2ggaGRwLT5pZD09SFNfU1RBTkRBUkRfSUQgYXMgd2VsbC4gVG8gZW5zdXJlIAotCSAgICAgKiBwcm9wZXIgaWRlbnRpZmljYXRpb24gaW4gdGhpcyBjYXNlLCB3ZSBmaXJzdCBjaGVjayBmb3IgSVNPLgotCSAgICAgKi8KLQkgICAgaWYgKHN0cm5jbXAgKHZkcC0+aWQsIElTT19TVEFOREFSRF9JRCwgc2l6ZW9mIHZkcC0+aWQpID09IDApIHsKLQkJaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX0VORCkKLQkJICAgIGJyZWFrOwotCQlpZiAoaXNvbnVtXzcxMSAodmRwLT50eXBlKSA9PSBJU09fVkRfUFJJTUFSWSkgewotCQkgICAgaWYgKHByaSA9PSBOVUxMKSB7Ci0JCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7Ci0JCQkvKiBTYXZlIHRoZSBidWZmZXIgaW4gY2FzZSB3ZSBuZWVkIGl0IC4uLiAqLwotCQkJcHJpX2JoID0gYmg7Ci0JCQliaCA9IE5VTEw7Ci0JCSAgICB9Ci0JCX0KLSNpZmRlZiBDT05GSUdfSk9MSUVUCi0JCWVsc2UgaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1NVUFBMRU1FTlRBUlkpIHsKLQkJICAgIHNlYyA9IChzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqKXZkcDsKLQkJICAgIGlmIChzZWMtPmVzY2FwZVswXSA9PSAweDI1ICYmIHNlYy0+ZXNjYXBlWzFdID09IDB4MmYpIHsKLQkJCWlmIChvcHQuam9saWV0ID09ICd5JykgewotCQkJICAgIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQwKSB7Ci0JCQkJam9saWV0X2xldmVsID0gMTsKLQkJCSAgICB9IGVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDMpIHsKLQkJCQlqb2xpZXRfbGV2ZWwgPSAyOwotCQkJICAgIH0gZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0NSkgewotCQkJCWpvbGlldF9sZXZlbCA9IDM7Ci0JCQkgICAgfQotCQkJICAgIHByaW50ayhLRVJOX0RFQlVHIklTTyA5NjYwIEV4dGVuc2lvbnM6IE1pY3Jvc29mdCBKb2xpZXQgTGV2ZWwgJWRcbiIsCi0JCQkJICAgam9saWV0X2xldmVsKTsKKwkJdmRwID0gKHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOworCQloZHAgPSAoc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKKworCQkvKgorCQkgKiBEdWUgdG8gdGhlIG92ZXJsYXBwaW5nIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSBkZXNjcmlwdG9ycywKKwkJICogSVNPIENEcyBjYW4gbWF0Y2ggaGRwLT5pZD09SFNfU1RBTkRBUkRfSUQgYXMgd2VsbC4gVG8gZW5zdXJlCisJCSAqIHByb3BlciBpZGVudGlmaWNhdGlvbiBpbiB0aGlzIGNhc2UsIHdlIGZpcnN0IGNoZWNrIGZvciBJU08uCisJCSAqLworCQlpZiAoc3RybmNtcCAodmRwLT5pZCwgSVNPX1NUQU5EQVJEX0lELCBzaXplb2YgdmRwLT5pZCkgPT0gMCkgeworCQkJaWYgKGlzb251bV83MTEodmRwLT50eXBlKSA9PSBJU09fVkRfRU5EKQorCQkJCWJyZWFrOworCQkJaWYgKGlzb251bV83MTEodmRwLT50eXBlKSA9PSBJU09fVkRfUFJJTUFSWSkgeworCQkJCWlmIChwcmkgPT0gTlVMTCkgeworCQkJCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkJCS8qIFNhdmUgdGhlIGJ1ZmZlciBpbiBjYXNlIHdlIG5lZWQgaXQgLi4uICovCisJCQkJCXByaV9iaCA9IGJoOworCQkJCQliaCA9IE5VTEw7CisJCQkJfQogCQkJfQotCQkJZ290byByb290X2ZvdW5kOwotCQkgICAgfSBlbHNlIHsKLQkJCS8qIFVua25vd24gc3VwcGxlbWVudGFyeSB2b2x1bWUgZGVzY3JpcHRvciAqLwotCQkJc2VjID0gTlVMTDsKLQkJICAgIH0KLQkJfQorI2lmZGVmIENPTkZJR19KT0xJRVQKKwkJCWVsc2UgaWYgKGlzb251bV83MTEodmRwLT50eXBlKSA9PSBJU09fVkRfU1VQUExFTUVOVEFSWSkgeworCQkJCXNlYyA9IChzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqKXZkcDsKKwkJCQlpZiAoc2VjLT5lc2NhcGVbMF0gPT0gMHgyNSAmJiBzZWMtPmVzY2FwZVsxXSA9PSAweDJmKSB7CisJCQkJCWlmIChvcHQuam9saWV0ID09ICd5JykgeworCQkJCQkJaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDApCisJCQkJCQkJam9saWV0X2xldmVsID0gMTsKKwkJCQkJCWVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDMpCisJCQkJCQkJam9saWV0X2xldmVsID0gMjsKKwkJCQkJCWVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDUpCisJCQkJCQkJam9saWV0X2xldmVsID0gMzsKKworCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklTTyA5NjYwIEV4dGVuc2lvbnM6ICIKKwkJCQkJCQkiTWljcm9zb2Z0IEpvbGlldCBMZXZlbCAlZFxuIiwKKwkJCQkJCQlqb2xpZXRfbGV2ZWwpOworCQkJCQl9CisJCQkJCWdvdG8gcm9vdF9mb3VuZDsKKwkJCQl9IGVsc2UgeworCQkJCS8qIFVua25vd24gc3VwcGxlbWVudGFyeSB2b2x1bWUgZGVzY3JpcHRvciAqLworCQkJCXNlYyA9IE5VTEw7CisJCQkJfQorCQkJfQogI2VuZGlmCi0JICAgIH0gZWxzZSB7Ci0JICAgICAgICBpZiAoc3RybmNtcCAoaGRwLT5pZCwgSFNfU1RBTkRBUkRfSUQsIHNpemVvZiBoZHAtPmlkKSA9PSAwKSB7Ci0JCSAgICBpZiAoaXNvbnVtXzcxMSAoaGRwLT50eXBlKSAhPSBJU09fVkRfUFJJTUFSWSkKLQkJICAgICAgICBnb3RvIG91dF9mcmVlYmg7Ci0JCQotCQkgICAgc2JpLT5zX2hpZ2hfc2llcnJhID0gMTsKLQkJICAgIG9wdC5yb2NrID0gJ24nOwotCQkgICAgaF9wcmkgPSAoc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAqKXZkcDsKLQkJICAgIGdvdG8gcm9vdF9mb3VuZDsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJuY21wIChoZHAtPmlkLCBIU19TVEFOREFSRF9JRCwgc2l6ZW9mIGhkcC0+aWQpID09IDApIHsKKwkJCQlpZiAoaXNvbnVtXzcxMShoZHAtPnR5cGUpICE9IElTT19WRF9QUklNQVJZKQorCQkJCQlnb3RvIG91dF9mcmVlYmg7CisKKwkJCQlzYmktPnNfaGlnaF9zaWVycmEgPSAxOworCQkJCW9wdC5yb2NrID0gJ24nOworCQkJCWhfcHJpID0gKHN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkJZ290byByb290X2ZvdW5kOworCQkJfQogCQl9Ci0JICAgIH0KIAotICAgICAgICAgICAgLyogSnVzdCBza2lwIGFueSB2b2x1bWUgZGVzY3JpcHRvcnMgd2UgZG9uJ3QgcmVjb2duaXplICovCisJCS8qIEp1c3Qgc2tpcCBhbnkgdm9sdW1lIGRlc2NyaXB0b3JzIHdlIGRvbid0IHJlY29nbml6ZSAqLwogCi0JICAgIGJyZWxzZShiaCk7Ci0JICAgIGJoID0gTlVMTDsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBOVUxMOwogCX0KIAkvKgogCSAqIElmIHdlIGZhbGwgdGhyb3VnaCwgZWl0aGVyIG5vIHZvbHVtZSBkZXNjcmlwdG9yIHdhcyBmb3VuZCwKQEAgLTY1NywyNCArNjYwLDI0IEBACiByb290X2ZvdW5kOgogCiAJaWYgKGpvbGlldF9sZXZlbCAmJiAocHJpID09IE5VTEwgfHwgb3B0LnJvY2sgPT0gJ24nKSkgewotCSAgICAvKiBUaGlzIGlzIHRoZSBjYXNlIG9mIEpvbGlldCB3aXRoIHRoZSBub3JvY2sgbW91bnQgZmxhZy4KLQkgICAgICogQSBkaXNjIHdpdGggYm90aCBKb2xpZXQgYW5kIFJvY2sgUmlkZ2UgaXMgaGFuZGxlZCBsYXRlcgotCSAgICAgKi8KLQkgICAgcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopIHNlYzsKKwkJLyogVGhpcyBpcyB0aGUgY2FzZSBvZiBKb2xpZXQgd2l0aCB0aGUgbm9yb2NrIG1vdW50IGZsYWcuCisJCSAqIEEgZGlzYyB3aXRoIGJvdGggSm9saWV0IGFuZCBSb2NrIFJpZGdlIGlzIGhhbmRsZWQgbGF0ZXIKKwkJICovCisJCXByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKSBzZWM7CiAJfQogCiAJaWYoc2JpLT5zX2hpZ2hfc2llcnJhKXsKLQkgIHJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSBoX3ByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOwotCSAgc2JpLT5zX256b25lcyA9IGlzb251bV83MzMgKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7Ci0JICBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMgKGhfcHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOwotCSAgc2JpLT5zX21heF9zaXplID0gaXNvbnVtXzczMyhoX3ByaS0+dm9sdW1lX3NwYWNlX3NpemUpOworCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgaF9wcmktPnJvb3RfZGlyZWN0b3J5X3JlY29yZDsKKwkJc2JpLT5zX256b25lcyA9IGlzb251bV83MzMoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkJc2JpLT5zX2xvZ196b25lX3NpemUgPSBpc29udW1fNzIzKGhfcHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOworCQlzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CiAJfSBlbHNlIHsKLQkgIGlmICghcHJpKQotCSAgICBnb3RvIG91dF9mcmVlYmg7Ci0JICByb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7Ci0JICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7Ci0JICBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMgKHByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKLQkgIHNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJCWlmICghcHJpKQorCQkJZ290byBvdXRfZnJlZWJoOworCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJCXNiaS0+c19uem9uZXMgPSBpc29udW1fNzMzKHByaS0+dm9sdW1lX3NwYWNlX3NpemUpOworCQlzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMocHJpLT5sb2dpY2FsX2Jsb2NrX3NpemUpOworCQlzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKHByaS0+dm9sdW1lX3NwYWNlX3NpemUpOwogCX0KIAogCXNiaS0+c19uaW5vZGVzID0gMDsgLyogTm8gd2F5IHRvIGZpZ3VyZSB0aGlzIG91dCBlYXNpbHkgKi8KQEAgLTY4Nyw0MiArNjkwLDQzIEBACiAJICogYmxvY2tzIHRoYXQgd2VyZSA1MTIgYnl0ZXMgKHdoaWNoIHNob3VsZCBvbmx5IHZlcnkgcmFyZWx5CiAJICogaGFwcGVuLikKIAkgKi8KLQlpZihvcmlnX3pvbmVzaXplIDwgb3B0LmJsb2Nrc2l6ZSkKKwlpZiAob3JpZ196b25lc2l6ZSA8IG9wdC5ibG9ja3NpemUpCiAJCWdvdG8gb3V0X2JhZF9zaXplOwogCiAJLyogUkRFOiBjb252ZXJ0IGxvZyB6b25lIHNpemUgdG8gYml0IHNoaWZ0ICovCi0Jc3dpdGNoIChzYmktPnNfbG9nX3pvbmVfc2l6ZSkKLQkgIHsgY2FzZSAgNTEyOiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9ICA5OyBicmVhazsKLQkgICAgY2FzZSAxMDI0OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDEwOyBicmVhazsKLQkgICAgY2FzZSAyMDQ4OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDExOyBicmVhazsKKwlzd2l0Y2ggKHNiaS0+c19sb2dfem9uZV9zaXplKSB7CisJY2FzZSAgNTEyOiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9ICA5OyBicmVhazsKKwljYXNlIDEwMjQ6IHNiaS0+c19sb2dfem9uZV9zaXplID0gMTA7IGJyZWFrOworCWNhc2UgMjA0ODogc2JpLT5zX2xvZ196b25lX3NpemUgPSAxMTsgYnJlYWs7CiAKLQkgICAgZGVmYXVsdDoKKwlkZWZhdWx0OgogCQlnb3RvIG91dF9iYWRfem9uZV9zaXplOwotCSAgfQorCX0KIAogCXMtPnNfbWFnaWMgPSBJU09GU19TVVBFUl9NQUdJQzsKIAlzLT5zX21heGJ5dGVzID0gMHhmZmZmZmZmZjsgLyogV2UgY2FuIGhhbmRsZSBmaWxlcyB1cCB0byA0IEdCICovCiAKLQkvKiBUaGUgQ0RST00gaXMgcmVhZC1vbmx5LCBoYXMgbm8gbm9kZXMgKGRldmljZXMpIG9uIGl0LCBhbmQgc2luY2UKLQkgICBhbGwgb2YgdGhlIGZpbGVzIGFwcGVhciB0byBiZSBvd25lZCBieSByb290LCB3ZSByZWFsbHkgZG8gbm90IHdhbnQKLQkgICB0byBhbGxvdyBzdWlkLiAgKHN1aWQgb3IgZGV2aWNlcyB3aWxsIG5vdCBzaG93IHVwIHVubGVzcyB3ZSBoYXZlCi0JICAgUm9jayBSaWRnZSBleHRlbnNpb25zKSAqLworCS8qCisJICogVGhlIENEUk9NIGlzIHJlYWQtb25seSwgaGFzIG5vIG5vZGVzIChkZXZpY2VzKSBvbiBpdCwgYW5kIHNpbmNlCisJICogYWxsIG9mIHRoZSBmaWxlcyBhcHBlYXIgdG8gYmUgb3duZWQgYnkgcm9vdCwgd2UgcmVhbGx5IGRvIG5vdCB3YW50CisJICogdG8gYWxsb3cgc3VpZC4gIChzdWlkIG9yIGRldmljZXMgd2lsbCBub3Qgc2hvdyB1cCB1bmxlc3Mgd2UgaGF2ZQorCSAqIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucykKKwkgKi8KIAogCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIC8qIHwgTVNfTk9ERVYgfCBNU19OT1NVSUQgKi87CiAKIAkvKiBTZXQgdGhpcyBmb3IgcmVmZXJlbmNlLiBJdHMgbm90IGN1cnJlbnRseSB1c2VkIGV4Y2VwdCBvbiB3cml0ZQogCSAgIHdoaWNoIHdlIGRvbid0IGhhdmUgLi4gKi8KLQkgICAKLQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzIChyb290cC0+ZXh0ZW50KSArCi0JCQkgIGlzb251bV83MTEgKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOworCisJZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyhyb290cC0+ZXh0ZW50KSArCisJCQkgIGlzb251bV83MTEocm9vdHAtPmV4dF9hdHRyX2xlbmd0aCk7CiAJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmaXJzdF9kYXRhX3pvbmU7CiAjaWZuZGVmIEJFUVVJRVQKLQlwcmludGsoS0VSTl9ERUJVRyAiTWF4IHNpemU6JWxkICAgTG9nIHpvbmUgc2l6ZTolbGRcbiIsCi0JICAgICAgIHNiaS0+c19tYXhfc2l6ZSwKLQkgICAgICAgMVVMIDw8IHNiaS0+c19sb2dfem9uZV9zaXplKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiRmlyc3QgZGF0YXpvbmU6JWxkXG4iLCBzYmktPnNfZmlyc3RkYXRhem9uZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBNYXggc2l6ZTolbGQgICBMb2cgem9uZSBzaXplOiVsZFxuIiwKKwkJc2JpLT5zX21heF9zaXplLCAxVUwgPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJJU09GUzogRmlyc3QgZGF0YXpvbmU6JWxkXG4iLCBzYmktPnNfZmlyc3RkYXRhem9uZSk7CiAJaWYoc2JpLT5zX2hpZ2hfc2llcnJhKQotCQlwcmludGsoS0VSTl9ERUJVRyAiRGlzYyBpbiBIaWdoIFNpZXJyYSBmb3JtYXQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBEaXNjIGluIEhpZ2ggU2llcnJhIGZvcm1hdC5cbiIpOwogI2VuZGlmCiAKIAkvKgpAQCAtNzM3LDggKzc0MSw4IEBACiAJCXByaSA9IChzdHJ1Y3QgaXNvX3ByaW1hcnlfZGVzY3JpcHRvciAqKSBzZWM7CiAJCXJvb3RwID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKQogCQkJcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7Ci0JCWZpcnN0X2RhdGFfem9uZSA9IGlzb251bV83MzMgKHJvb3RwLT5leHRlbnQpICsKLQkJCSAgCWlzb251bV83MTEgKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOworCQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzKHJvb3RwLT5leHRlbnQpICsKKwkJCQlpc29udW1fNzExKHJvb3RwLT5leHRfYXR0cl9sZW5ndGgpOwogCX0KIAogCS8qCkBAIC03NzEsNyArNzc1LDcgQEAKIAogI2lmZGVmIENPTkZJR19KT0xJRVQKIAlpZiAoam9saWV0X2xldmVsICYmIG9wdC51dGY4ID09IDApIHsKLQkJY2hhciAqIHAgPSBvcHQuaW9jaGFyc2V0ID8gb3B0LmlvY2hhcnNldCA6IENPTkZJR19OTFNfREVGQVVMVDsKKwkJY2hhciAqcCA9IG9wdC5pb2NoYXJzZXQgPyBvcHQuaW9jaGFyc2V0IDogQ09ORklHX05MU19ERUZBVUxUOwogCQlzYmktPnNfbmxzX2lvY2hhcnNldCA9IGxvYWRfbmxzKHApOwogCQlpZiAoISBzYmktPnNfbmxzX2lvY2hhcnNldCkgewogCQkJLyogRmFpbCBvbmx5IGlmIGV4cGxpY2l0IGNoYXJzZXQgc3BlY2lmaWVkICovCkBAIC04MjEsNyArODI1LDcgQEAKIAkJc2JpLT5zX3JvY2sgPSAwOwogCQlpZiAoc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgIT0gZmlyc3RfZGF0YV96b25lKSB7CiAJCQlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKLQkJCXByaW50ayhLRVJOX0RFQlVHIAorCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkiSVNPRlM6IGNoYW5naW5nIHRvIHNlY29uZGFyeSByb290XG4iKTsKIAkJCWlwdXQoaW5vZGUpOwogCQkJaW5vZGUgPSBpc29mc19pZ2V0KHMsIHNiaS0+c19maXJzdGRhdGF6b25lLCAwKTsKQEAgLTgzMCw4ICs4MzQsMTAgQEAKIAogCWlmIChvcHQuY2hlY2sgPT0gJ3UnKSB7CiAJCS8qIE9ubHkgSm9saWV0IGlzIGNhc2UgaW5zZW5zaXRpdmUgYnkgZGVmYXVsdCAqLwotCQlpZiAoam9saWV0X2xldmVsKSBvcHQuY2hlY2sgPSAncic7Ci0JCWVsc2Ugb3B0LmNoZWNrID0gJ3MnOworCQlpZiAoam9saWV0X2xldmVsKQorCQkJb3B0LmNoZWNrID0gJ3InOworCQllbHNlCisJCQlvcHQuY2hlY2sgPSAncyc7CiAJfQogCXNiaS0+c19qb2xpZXRfbGV2ZWwgPSBqb2xpZXRfbGV2ZWw7CiAKQEAgLTg0Niw4ICs4NTIsMTAgQEAKIAkJZ290byBvdXRfbm9fcm9vdDsKIAogCXRhYmxlID0gMDsKLQlpZiAoam9saWV0X2xldmVsKSB0YWJsZSArPSAyOwotCWlmIChvcHQuY2hlY2sgPT0gJ3InKSB0YWJsZSsrOworCWlmIChqb2xpZXRfbGV2ZWwpCisJCXRhYmxlICs9IDI7CisJaWYgKG9wdC5jaGVjayA9PSAncicpCisJCXRhYmxlKys7CiAJcy0+c19yb290LT5kX29wID0gJmlzb2ZzX2RlbnRyeV9vcHNbdGFibGVdOwogCiAJa2ZyZWUob3B0LmlvY2hhcnNldCk7CkBAIC04NTgsMTAgKzg2NiwxMCBAQAogCSAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZXMgYW5kIGZyZWUgcmVzb3VyY2VzLgogCSAqLwogb3V0X2JhZF9yb290OgotCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6IHJvb3QgaW5vZGUgbm90IGluaXRpYWxpemVkXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcm9vdCBpbm9kZSBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKIAlnb3RvIG91dF9pcHV0Owogb3V0X25vX3Jvb3Q6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnNfZmlsbF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiBvdXRfaXB1dDoKIAlpcHV0KGlub2RlKTsKICNpZmRlZiBDT05GSUdfSk9MSUVUCkBAIC04NzAsMjEgKzg3OCwyMCBAQAogI2VuZGlmCiAJZ290byBvdXRfZnJlZXNiaTsKIG91dF9ub19yZWFkOgotCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6ICIKLQkJImJyZWFkIGZhaWxlZCwgZGV2PSVzLCBpc29fYmxrbnVtPSVkLCBibG9jaz0lZFxuIiwKLQkJcy0+c19pZCwgaXNvX2Jsa251bSwgYmxvY2spOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBicmVhZCBmYWlsZWQsIGRldj0lcywgaXNvX2Jsa251bT0lZCwgYmxvY2s9JWRcbiIsCisJCV9fZnVuY19fLCBzLT5zX2lkLCBpc29fYmxrbnVtLCBibG9jayk7CiAJZ290byBvdXRfZnJlZXNiaTsKIG91dF9iYWRfem9uZV9zaXplOgotCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBsb2dpY2FsIHpvbmUgc2l6ZSAlbGRcbiIsCisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNPRlM6IEJhZCBsb2dpY2FsIHpvbmUgc2l6ZSAlbGRcbiIsCiAJCXNiaS0+c19sb2dfem9uZV9zaXplKTsKIAlnb3RvIG91dF9mcmVlYmg7CiBvdXRfYmFkX3NpemU6Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiTG9naWNhbCB6b25lIHNpemUoJWQpIDwgaGFyZHdhcmUgYmxvY2tzaXplKCV1KVxuIiwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJJU09GUzogTG9naWNhbCB6b25lIHNpemUoJWQpIDwgaGFyZHdhcmUgYmxvY2tzaXplKCV1KVxuIiwKIAkJb3JpZ196b25lc2l6ZSwgb3B0LmJsb2Nrc2l6ZSk7CiAJZ290byBvdXRfZnJlZWJoOwogb3V0X3Vua25vd25fZm9ybWF0OgogCWlmICghc2lsZW50KQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmFibGUgdG8gaWRlbnRpZnkgQ0QtUk9NIGZvcm1hdC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJU09GUzogVW5hYmxlIHRvIGlkZW50aWZ5IENELVJPTSBmb3JtYXQuXG4iKTsKIAogb3V0X2ZyZWViaDoKIAlicmVsc2UoYmgpOwpAQCAtOTAyLDcgKzkwOSw3IEBACiAJYnVmLT5mX3R5cGUgPSBJU09GU19TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IChJU09GU19TQihzYiktPnNfbnpvbmVzCi0gICAgICAgICAgICAgICAgICA8PCAoSVNPRlNfU0Ioc2IpLT5zX2xvZ196b25lX3NpemUgLSBzYi0+c19ibG9ja3NpemVfYml0cykpOworCQk8PCAoSVNPRlNfU0Ioc2IpLT5zX2xvZ196b25lX3NpemUgLSBzYi0+c19ibG9ja3NpemVfYml0cykpOwogCWJ1Zi0+Zl9iZnJlZSA9IDA7CiAJYnVmLT5mX2JhdmFpbCA9IDA7CiAJYnVmLT5mX2ZpbGVzID0gSVNPRlNfU0Ioc2IpLT5zX25pbm9kZXM7CkBAIC05MzEsMjAgKzkzOCwyMCBAQAogCiAJcnYgPSAwOwogCWlmIChpYmxvY2sgPCAwIHx8IGlibG9jayAhPSBpYmxvY2tfcykgewotCQlwcmludGsoImlzb2ZzX2dldF9ibG9ja3M6IGJsb2NrIG51bWJlciB0b28gbGFyZ2VcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJsb2NrIG51bWJlciB0b28gbGFyZ2VcbiIsIF9fZnVuY19fKTsKIAkJZ290byBhYm9ydDsKIAl9CiAKIAliX29mZiA9IGlibG9jazsKLQkKLQlvZmZzZXQgICAgPSAwOwotCWZpcnN0ZXh0ICA9IGVpLT5pX2ZpcnN0X2V4dGVudDsKLQlzZWN0X3NpemUgPSBlaS0+aV9zZWN0aW9uX3NpemUgPj4gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOwotCW5leHRibGsgICA9IGVpLT5pX25leHRfc2VjdGlvbl9ibG9jazsKLQluZXh0b2ZmICAgPSBlaS0+aV9uZXh0X3NlY3Rpb25fb2Zmc2V0OwotCXNlY3Rpb24gICA9IDA7CiAKLQl3aGlsZSAoIG5ibG9ja3MgKSB7CisJb2Zmc2V0ID0gMDsKKwlmaXJzdGV4dCA9IGVpLT5pX2ZpcnN0X2V4dGVudDsKKwlzZWN0X3NpemUgPSBlaS0+aV9zZWN0aW9uX3NpemUgPj4gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOworCW5leHRibGsgPSBlaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CisJbmV4dG9mZiA9IGVpLT5pX25leHRfc2VjdGlvbl9vZmZzZXQ7CisJc2VjdGlvbiA9IDA7CisKKwl3aGlsZSAobmJsb2NrcykgewogCQkvKiBJZiB3ZSBhcmUgKndheSogYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHByaW50IGEgbWVzc2FnZS4KIAkJICogQWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIHVwIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkKIAkJICogaXMgbm9ybWFsLCBob3dldmVyIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgcGFnZSBjYWNoZSB3b3Jrcy4KQEAgLTk1MywxMSArOTYwLDExIEBACiAJCSAqIEkvTyBlcnJvcnMuCiAJCSAqLwogCQlpZiAoYl9vZmYgPiAoKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBJU09GU19CVUZGRVJfQklUUyhpbm9kZSkpKSB7Ci0JCQlwcmludGsoImlzb2ZzX2dldF9ibG9ja3M6IGJsb2NrID49IEVPRiAoJWxkLCAlbGQpXG4iLAotCQkJICAgICAgIGlibG9jaywgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX3NpemUpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibG9jayA+PSBFT0YgKCVsZCwgJWxkKVxuIiwKKwkJCQlfX2Z1bmNfXywgaWJsb2NrLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSk7CiAJCQlnb3RvIGFib3J0OwogCQl9Ci0JCQorCiAJCS8qIE9uIHRoZSBsYXN0IHNlY3Rpb24sIG5leHRibGsgPT0gMCwgc2VjdGlvbiBzaXplIGlzIGxpa2VseSB0bwogCQkgKiBleGNlZWQgc2VjdF9zaXplIGJ5IGEgcGFydGlhbCBibG9jaywgYW5kIGFjY2VzcyBiZXlvbmQgdGhlCiAJCSAqIGVuZCBvZiB0aGUgZmlsZSB3aWxsIHJlYWNoIGJleW9uZCB0aGUgc2VjdGlvbiBzaXplLCB0b28uCkBAIC05NzYsMjAgKzk4MywyMSBAQAogCQkJaXB1dChuaW5vZGUpOwogCiAJCQlpZiAoKytzZWN0aW9uID4gMTAwKSB7Ci0JCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIik7Ci0JCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBibG9jaz0lbGQgZmlyc3RleHQ9JXUgc2VjdF9zaXplPSV1ICIKLQkJCQkgICAgICAgIm5leHRibGs9JWx1IG5leHRvZmY9JWx1XG4iLAotCQkJCSAgICAgICBpYmxvY2ssIGZpcnN0ZXh0LCAodW5zaWduZWQpIHNlY3Rfc2l6ZSwKLQkJCQkgICAgICAgbmV4dGJsaywgbmV4dG9mZik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/IgorCQkJCQkiIGFib3J0aW5nLi4uXG4iLCBfX2Z1bmNfXyk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibG9jaz0lbGQgZmlyc3RleHQ9JXUgc2VjdF9zaXplPSV1ICIKKwkJCQkJIm5leHRibGs9JWx1IG5leHRvZmY9JWx1XG4iLCBfX2Z1bmNfXywKKwkJCQkJaWJsb2NrLCBmaXJzdGV4dCwgKHVuc2lnbmVkKSBzZWN0X3NpemUsCisJCQkJCW5leHRibGssIG5leHRvZmYpOwogCQkJCWdvdG8gYWJvcnQ7CiAJCQl9CiAJCX0KLQkJCi0JCWlmICggKmJoICkgeworCisJCWlmICgqYmgpIHsKIAkJCW1hcF9iaCgqYmgsIGlub2RlLT5pX3NiLCBmaXJzdGV4dCArIGJfb2ZmIC0gb2Zmc2V0KTsKIAkJfSBlbHNlIHsKIAkJCSpiaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZmlyc3RleHQrYl9vZmYtb2Zmc2V0KTsKLQkJCWlmICggISpiaCApCisJCQlpZiAoISpiaCkKIAkJCQlnb3RvIGFib3J0OwogCQl9CiAJCWJoKys7CS8qIE5leHQgYnVmZmVyIGhlYWQgKi8KQEAgLTEwMTAsNyArMTAxOCw3IEBACiAJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAlpZiAoY3JlYXRlKSB7Ci0JCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrOiBLZXJuZWwgdHJpZXMgdG8gYWxsb2NhdGUgYSBibG9ja1xuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogS2VybmVsIHRyaWVzIHRvIGFsbG9jYXRlIGEgYmxvY2tcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FUk9GUzsKIAl9CiAKQEAgLTEwNzAsMTEgKzEwNzgsMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CiAJaW50IGhpZ2hfc2llcnJhID0gSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2hpZ2hfc2llcnJhOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGJsb2NrLCBvZmZzZXQsIGJsb2NrX3NhdmVkLCBvZmZzZXRfc2F2ZWQ7CiAJaW50IGkgPSAwOwogCWludCBtb3JlX2VudHJpZXMgPSAwOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlID0gTlVMTDsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKnRtcGRlID0gTlVMTDsKIAlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gSVNPRlNfSShpbm9kZSk7CiAKIAlpbm9kZS0+aV9zaXplID0gMDsKQEAgLTEwODksNyArMTA5Nyw3IEBACiAJb2Zmc2V0ID0gZWktPmlfaWdldDVfb2Zmc2V0OwogCiAJZG8gewotCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKKwkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKIAkJdW5zaWduZWQgaW50IGRlX2xlbjsKIAogCQlpZiAoIWJoKSB7CkBAIC0xMTYzLDEwICsxMTcxLDkgQEAKIAlyZXR1cm4gLUVJTzsKIAogb3V0X3Rvb21hbnk6Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogIgotCQkiTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPywgYWJvcnRpbmcuLi5cbiIKLQkgIAkiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogaW5vZGU9JWx1XG4iLAotCQlpbm9kZS0+aV9pbm8pOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIgorCQkiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogaW5vZGU9JWx1XG4iLAorCQlfX2Z1bmNfXywgaW5vZGUtPmlfaW5vKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtMTE3Nyw5ICsxMTg0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CiAJdW5zaWduZWQgbG9uZyBibG9jazsKIAlpbnQgaGlnaF9zaWVycmEgPSBzYmktPnNfaGlnaF9zaWVycmE7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIGRlOwotCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqIHRtcGRlID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGUgPSBOVUxMOwogCXVuc2lnbmVkIGludCBkZV9sZW47CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IElTT0ZTX0koaW5vZGUpOwpAQCAtMTE5OSw3ICsxMjA2LDcgQEAKIAogCQl0bXBkZSA9IGttYWxsb2MoZGVfbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHRtcGRlID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImlzb2ZzX3JlYWRfaW5vZGU6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQltZW1jcHkodG1wZGUsIGJoLT5iX2RhdGEgKyBvZmZzZXQsIGZyYWcxKTsKQEAgLTEyMTIsMjQgKzEyMTksMjYgQEAKIAl9CiAKIAlpbm9kZS0+aV9pbm8gPSBpc29mc19nZXRfaW5vKGVpLT5pX2lnZXQ1X2Jsb2NrLAotCQkJCSAgICAgZWktPmlfaWdldDVfb2Zmc2V0LAotCQkJCSAgICAgSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpKTsKKwkJCQkJZWktPmlfaWdldDVfb2Zmc2V0LAorCQkJCQlJU09GU19CVUZGRVJfQklUUyhpbm9kZSkpOwogCiAJLyogQXNzdW1lIGl0IGlzIGEgbm9ybWFsLWZvcm1hdCBmaWxlIHVubGVzcyB0b2xkIG90aGVyd2lzZSAqLwogCWVpLT5pX2ZpbGVfZm9ybWF0ID0gaXNvZnNfZmlsZV9ub3JtYWw7CiAKIAlpZiAoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiAyKSB7CiAJCWlub2RlLT5pX21vZGUgPSBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSUZESVI7Ci0JCWlub2RlLT5pX25saW5rID0gMTsgLyogU2V0IHRvIDEuICBXZSBrbm93IHRoZXJlIGFyZSAyLCBidXQKLQkJCQkgICAgICAgdGhlIGZpbmQgdXRpbGl0eSB0cmllcyB0byBvcHRpbWl6ZQotCQkJCSAgICAgICBpZiBpdCBpcyAyLCBhbmQgaXQgc2NyZXdzIHVwLiAgSXQgaXMKLQkJCQkgICAgICAgZWFzaWVyIHRvIGdpdmUgMSB3aGljaCB0ZWxscyBmaW5kIHRvCi0JCQkJICAgICAgIGRvIGl0IHRoZSBoYXJkIHdheS4gKi8KKwkJaW5vZGUtPmlfbmxpbmsgPSAxOwkvKgorCQkJCQkgKiBTZXQgdG8gMS4gIFdlIGtub3cgdGhlcmUgYXJlIDIsIGJ1dAorCQkJCQkgKiB0aGUgZmluZCB1dGlsaXR5IHRyaWVzIHRvIG9wdGltaXplCisJCQkJCSAqIGlmIGl0IGlzIDIsIGFuZCBpdCBzY3Jld3MgdXAuICBJdCBpcworCQkJCQkgKiBlYXNpZXIgdG8gZ2l2ZSAxIHdoaWNoIHRlbGxzIGZpbmQgdG8KKwkJCQkJICogZG8gaXQgdGhlIGhhcmQgd2F5LgorCQkJCQkgKi8KIAl9IGVsc2UgewotIAkJLyogRXZlcnlib2R5IGdldHMgdG8gcmVhZCB0aGUgZmlsZS4gKi8KKwkJLyogRXZlcnlib2R5IGdldHMgdG8gcmVhZCB0aGUgZmlsZS4gKi8KIAkJaW5vZGUtPmlfbW9kZSA9IHNiaS0+c19tb2RlOwogCQlpbm9kZS0+aV9ubGluayA9IDE7Ci0JICAgICAgICBpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKIAl9CiAJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOwpAQCAtMTIzOSwxMyArMTI0OCwxNCBAQAogCWVpLT5pX2Zvcm1hdF9wYXJtWzFdID0gMDsKIAllaS0+aV9mb3JtYXRfcGFybVsyXSA9IDA7CiAKLQllaS0+aV9zZWN0aW9uX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJZWktPmlfc2VjdGlvbl9zaXplID0gaXNvbnVtXzczMyhkZS0+c2l6ZSk7CiAJaWYgKGRlLT5mbGFnc1staGlnaF9zaWVycmFdICYgMHg4MCkgewotCQlpZihpc29mc19yZWFkX2xldmVsM19zaXplKGlub2RlKSkgZ290byBmYWlsOworCQlpZihpc29mc19yZWFkX2xldmVsM19zaXplKGlub2RlKSkKKwkJCWdvdG8gZmFpbDsKIAl9IGVsc2UgewogCQllaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2sgPSAwOwogCQllaS0+aV9uZXh0X3NlY3Rpb25fb2Zmc2V0ID0gMDsKLQkJaW5vZGUtPmlfc2l6ZSA9IGlzb251bV83MzMgKGRlLT5zaXplKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGlzb251bV83MzMoZGUtPnNpemUpOwogCX0KIAogCS8qCkBAIC0xMjU4LDIzICsxMjY4LDI0IEBACiAJCWlub2RlLT5pX3NpemUgJj0gMHgwMGZmZmZmZjsKIAogCWlmIChkZS0+aW50ZXJsZWF2ZVswXSkgewotCQlwcmludGsoIkludGVybGVhdmVkIGZpbGVzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTT0ZTOiBJbnRlcmxlYXZlZCBmaWxlcyBub3QgKHlldCkgc3VwcG9ydGVkLlxuIik7CiAJCWlub2RlLT5pX3NpemUgPSAwOwogCX0KIAogCS8qIEkgaGF2ZSBubyBpZGVhIHdoYXQgZmlsZV91bml0X3NpemUgaXMgdXNlZCBmb3IsIHNvCiAJICAgd2Ugd2lsbCBmbGFnIGl0IGZvciBub3cgKi8KIAlpZiAoZGUtPmZpbGVfdW5pdF9zaXplWzBdICE9IDApIHsKLQkJcHJpbnRrKCJGaWxlIHVuaXQgc2l6ZSAhPSAwIGZvciBJU08gZmlsZSAoJWxkKS5cbiIsCi0JCSAgICAgICBpbm9kZS0+aV9pbm8pOworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IEZpbGUgdW5pdCBzaXplICE9IDAgZm9yIElTTyBmaWxlICglbGQpLlxuIiwKKwkJCWlub2RlLT5pX2lubyk7CiAJfQogCiAJLyogSSBoYXZlIG5vIGlkZWEgd2hhdCBvdGhlciBmbGFnIGJpdHMgYXJlIHVzZWQgZm9yLCBzbwogCSAgIHdlIHdpbGwgZmxhZyBpdCBmb3Igbm93ICovCiAjaWZkZWYgREVCVUcKIAlpZigoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiB+MikhPSAwKXsKLQkJcHJpbnRrKCJVbnVzdWFsIGZsYWcgc2V0dGluZ3MgZm9yIElTTyBmaWxlICglbGQgJXgpLlxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubywgZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0pOworCQlwcmludGsoS0VSTl9ERUJVRyAiSVNPRlM6IFVudXN1YWwgZmxhZyBzZXR0aW5ncyBmb3IgSVNPIGZpbGUgIgorCQkJCSIoJWxkICV4KS5cbiIsCisJCQlpbm9kZS0+aV9pbm8sIGRlLT5mbGFnc1staGlnaF9zaWVycmFdKTsKIAl9CiAjZW5kaWYKIApAQCAtMTI4NSwxMSArMTI5NiwxMSBAQAogCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPQogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwogCi0JZWktPmlfZmlyc3RfZXh0ZW50ID0gKGlzb251bV83MzMgKGRlLT5leHRlbnQpICsKLQkJCSAgICAgIGlzb251bV83MTEgKGRlLT5leHRfYXR0cl9sZW5ndGgpKTsKKwllaS0+aV9maXJzdF9leHRlbnQgPSAoaXNvbnVtXzczMyhkZS0+ZXh0ZW50KSArCisJCQlpc29udW1fNzExKGRlLT5leHRfYXR0cl9sZW5ndGgpKTsKIAogCS8qIFNldCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3Igc3RhdCgpIC0gc2hvdWxkIGJlIGRvbmUgYmVmb3JlIFJSICovCi0JaW5vZGUtPmlfYmxvY2tzICA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OwogCiAJLyoKIAkgKiBOb3cgdGVzdCBmb3IgcG9zc2libGUgUm9jayBSaWRnZSBleHRlbnNpb25zIHdoaWNoIHdpbGwgb3ZlcnJpZGUKQEAgLTEzMDYsNyArMTMxNyw3IEBACiAJLyogSW5zdGFsbCB0aGUgaW5vZGUgb3BlcmF0aW9ucyB2ZWN0b3IgKi8KIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOwotCQlzd2l0Y2ggKCBlaS0+aV9maWxlX2Zvcm1hdCApIHsKKwkJc3dpdGNoIChlaS0+aV9maWxlX2Zvcm1hdCkgewogI2lmZGVmIENPTkZJR19aSVNPRlMKIAkJY2FzZSBpc29mc19maWxlX2NvbXByZXNzZWQ6CiAJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnppc29mc19hb3BzOwpAQCAtMTM1MCw3ICsxMzYxLDcgQEAKIAlzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSAqZCA9CiAJCShzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSopZGF0YTsKIAlyZXR1cm4gKGktPmlfaWdldDVfYmxvY2sgPT0gZC0+YmxvY2spCi0JICAgICAgICYmIChpLT5pX2lnZXQ1X29mZnNldCA9PSBkLT5vZmZzZXQpOworCQkmJiAoaS0+aV9pZ2V0NV9vZmZzZXQgPT0gZC0+b2Zmc2V0KTsKIH0KIAogc3RhdGljIGludCBpc29mc19pZ2V0NV9zZXQoc3RydWN0IGlub2RlICppbm8sIHZvaWQgKmRhdGEpCkBAIC0xMzg0LDcgKzEzOTUsNyBAQAogCWhhc2h2YWwgPSAoYmxvY2sgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpIHwgb2Zmc2V0OwogCiAJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGhhc2h2YWwsICZpc29mc19pZ2V0NV90ZXN0LAotCQkJICAgICAmaXNvZnNfaWdldDVfc2V0LCAmZGF0YSk7CisJCQkJJmlzb2ZzX2lnZXQ1X3NldCwgJmRhdGEpOwogCiAJaWYgKGlub2RlICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgewogCQlzYi0+c19vcC0+cmVhZF9pbm9kZShpbm9kZSk7CkBAIC0xMzk4LDcgKzE0MDksNyBAQAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGlzb2ZzX2ZpbGxfc3VwZXIsCi0JCQkgICBtbnQpOworCQkJCW1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBpc285NjYwX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9pc29mcy5oIGIvZnMvaXNvZnMvaXNvZnMuaAppbmRleCBlZmUyODcyLi5hMDdlNjdiIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pc29mcy5oCisrKyBiL2ZzL2lzb2ZzL2lzb2ZzLmgKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCmRpZmYgLS1naXQgYS9mcy9pc29mcy9qb2xpZXQuYyBiL2ZzL2lzb2ZzL2pvbGlldC5jCmluZGV4IGZiOGZlN2EuLjkyYzE0YjggMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2pvbGlldC5jCisrKyBiL2ZzL2lzb2ZzL2pvbGlldC5jCkBAIC04MCwyMiArODAsMjAgQEAKIAogCWlmICh1dGY4KSB7CiAJCWxlbiA9IHdjc250b21ic19iZShvdXRuYW1lLCBkZS0+bmFtZSwKLQkJCQkgICBkZS0+bmFtZV9sZW5bMF0gPj4gMSwgUEFHRV9TSVpFKTsKKwkJCQlkZS0+bmFtZV9sZW5bMF0gPj4gMSwgUEFHRV9TSVpFKTsKIAl9IGVsc2UgewogCQlsZW4gPSB1bmkxNl90b194OChvdXRuYW1lLCAoX19iZTE2ICopIGRlLT5uYW1lLAotCQkJCSAgZGUtPm5hbWVfbGVuWzBdID4+IDEsIG5scyk7CisJCQkJZGUtPm5hbWVfbGVuWzBdID4+IDEsIG5scyk7CiAJfQotCWlmICgobGVuID4gMikgJiYgKG91dG5hbWVbbGVuLTJdID09ICc7JykgJiYgKG91dG5hbWVbbGVuLTFdID09ICcxJykpIHsKKwlpZiAoKGxlbiA+IDIpICYmIChvdXRuYW1lW2xlbi0yXSA9PSAnOycpICYmIChvdXRuYW1lW2xlbi0xXSA9PSAnMScpKQogCQlsZW4gLT0gMjsKLQl9CiAKIAkvKgogCSAqIFdpbmRvd3MgZG9lc24ndCBsaWtlIHBlcmlvZHMgYXQgdGhlIGVuZCBvZiBhIG5hbWUsCiAJICogc28gbmVpdGhlciBkbyB3ZQogCSAqLwotCXdoaWxlIChsZW4gPj0gMiAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJy4nKSkgeworCXdoaWxlIChsZW4gPj0gMiAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJy4nKSkKIAkJbGVuLS07Ci0JfQogCiAJcmV0dXJuIGxlbjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL25hbWVpLmMgYi9mcy9pc29mcy9uYW1laS5jCmluZGV4IGMwNGIzYTEuLmM4YzdlNTEgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL25hbWVpLmMKKysrIGIvZnMvaXNvZnMvbmFtZWkuYwpAQCAtMTUsNyArMTUsNyBAQAogICogc29tZSBzYW5pdHkgdGVzdHMuCiAgKi8KIHN0YXRpYyBpbnQKLWlzb2ZzX2NtcChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBjb25zdCBjaGFyICogY29tcGFyZSwgaW50IGRsZW4pCitpc29mc19jbXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpjb21wYXJlLCBpbnQgZGxlbikKIHsKIAlzdHJ1Y3QgcXN0ciBxc3RyOwogCkBAIC00OCwyNCArNDgsMjQgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKIGlzb2ZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQl1bnNpZ25lZCBsb25nICpibG9ja19ydiwgdW5zaWduZWQgbG9uZyogb2Zmc2V0X3J2LAotCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKKwl1bnNpZ25lZCBsb25nICpibG9ja19ydiwgdW5zaWduZWQgbG9uZyAqb2Zmc2V0X3J2LAorCWNoYXIgKnRtcG5hbWUsIHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqdG1wZGUpCiB7CiAJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoZGlyKTsKIAl1bnNpZ25lZCBjaGFyIGJ1ZmJpdHMgPSBJU09GU19CVUZGRVJfQklUUyhkaXIpOwogCXVuc2lnbmVkIGxvbmcgYmxvY2ssIGZfcG9zLCBvZmZzZXQsIGJsb2NrX3NhdmVkLCBvZmZzZXRfc2F2ZWQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihkaXItPmlfc2IpOwogCiAJaWYgKCFJU09GU19JKGRpciktPmlfZmlyc3RfZXh0ZW50KQogCQlyZXR1cm4gMDsKLSAgCisKIAlmX3BvcyA9IDA7CiAJb2Zmc2V0ID0gMDsKIAlibG9jayA9IDA7CiAKIAl3aGlsZSAoZl9wb3MgPCBkaXItPmlfc2l6ZSkgewotCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKKwkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKIAkJaW50IGRlX2xlbiwgbWF0Y2gsIGksIGRsZW47CiAJCWNoYXIgKmRwbnQ7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAJCWlmIChzYmktPnNfcm9jayAmJgogCQkgICAgKChpID0gZ2V0X3JvY2tfcmlkZ2VfZmlsZW5hbWUoZGUsIHRtcG5hbWUsIGRpcikpKSkgewotCQkJZGxlbiA9IGk7IAkvKiBwb3NzaWJseSAtMSAqLworCQkJZGxlbiA9IGk7CS8qIHBvc3NpYmx5IC0xICovCiAJCQlkcG50ID0gdG1wbmFtZTsKICNpZmRlZiBDT05GSUdfSk9MSUVUCiAJCX0gZWxzZSBpZiAoc2JpLT5zX2pvbGlldF9sZXZlbCkgewpAQCAtMTQ1LDggKzE0NSw4IEBACiAJCQlpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldChkZSwKIAkJCQkJCQkgJmJsb2NrX3NhdmVkLAogCQkJCQkJCSAmb2Zmc2V0X3NhdmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpibG9ja19ydiA9IGJsb2NrX3NhdmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldF9ydiA9IG9mZnNldF9zYXZlZDsKKwkJCSpibG9ja19ydiA9IGJsb2NrX3NhdmVkOworCQkJKm9mZnNldF9ydiA9IG9mZnNldF9zYXZlZDsKIAkJCWJyZWxzZShiaCk7CiAJCQlyZXR1cm4gMTsKIAkJfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBkZW50cnkgKmlzb2ZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RydWN0IGRlbnRyeSAqaXNvZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWludCBmb3VuZDsKIAl1bnNpZ25lZCBsb25nIGJsb2NrLCBvZmZzZXQ7CkBAIC0xNzAsOSArMTcwLDkgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAJZm91bmQgPSBpc29mc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LAotCQkJCSAmYmxvY2ssICZvZmZzZXQsCi0JCQkJIHBhZ2VfYWRkcmVzcyhwYWdlKSwKLQkJCQkgMTAyNCArIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJCQkJJmJsb2NrLCAmb2Zmc2V0LAorCQkJCXBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJCQkxMDI0ICsgcGFnZV9hZGRyZXNzKHBhZ2UpKTsKIAlfX2ZyZWVfcGFnZShwYWdlKTsKIAogCWlub2RlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCAxZmFjZmFmLi5hMDAzZDUwIDEwMDY0NAotLS0gYS9mcy9qYmQvY29tbWl0LmMKKysrIGIvZnMvamJkL2NvbW1pdC5jCkBAIC04ODcsNyArODg3LDggQEAKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCi0JaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCkgeworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwgJiYKKwkgICAgY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCA9PSBOVUxMKSB7CiAJCV9fam91cm5hbF9kcm9wX3RyYW5zYWN0aW9uKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CiAJfSBlbHNlIHsKIAkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZnMvamJkL3Jldm9rZS5jIGIvZnMvamJkL3Jldm9rZS5jCmluZGV4IDgyNGUzYjcuLjhkYjJmYTIgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9yZXZva2UuYworKysgYi9mcy9qYmQvcmV2b2tlLmMKQEAgLTY4LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJldm9rZV9yZWNvcmRfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJldm9rZV90YWJsZV9jYWNoZTsKQEAgLTIxMSw3ICsyMTIsNyBAQAogCWpvdXJuYWwtPmpfcmV2b2tlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF07CiAKIAkvKiBDaGVjayB0aGF0IHRoZSBoYXNoX3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KLQlKX0FTU0VSVCAoKGhhc2hfc2l6ZSAmIChoYXNoX3NpemUtMSkpID09IDApOworCUpfQVNTRVJUKGlzX3Bvd2VyX29mXzIoaGFzaF9zaXplKSk7CiAKIAlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplID0gaGFzaF9zaXplOwogCkBAIC0yMzgsNyArMjM5LDcgQEAKIAlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOwogCiAJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCi0JSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKwlKX0FTU0VSVChpc19wb3dlcl9vZl8yKGhhc2hfc2l6ZSkpOwogCiAJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2l6ZSA9IGhhc2hfc2l6ZTsKIApkaWZmIC0tZ2l0IGEvZnMvamJkMi9jb21taXQuYyBiL2ZzL2piZDIvY29tbWl0LmMKaW5kZXggMjg1NmUxMS4uYzBmNTlkMSAxMDA2NDQKLS0tIGEvZnMvamJkMi9jb21taXQuYworKysgYi9mcy9qYmQyL2NvbW1pdC5jCkBAIC04OTYsNyArODk2LDggQEAKIAlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCi0JaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCkgeworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwgJiYKKwkgICAgY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCA9PSBOVUxMKSB7CiAJCV9famJkMl9qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKIAl9IGVsc2UgewogCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9mcy9qYmQyL3Jldm9rZS5jIGIvZnMvamJkMi9yZXZva2UuYwppbmRleCA5MjQ2ZTc2Li4yOGNhYzA0IDEwMDY0NAotLS0gYS9mcy9qYmQyL3Jldm9rZS5jCisrKyBiL2ZzL2piZDIvcmV2b2tlLmMKQEAgLTY4LDYgKzY4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmpiZDJfcmV2b2tlX3JlY29yZF9jYWNoZTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqamJkMl9yZXZva2VfdGFibGVfY2FjaGU7CkBAIC0yMTIsNyArMjEzLDcgQEAKIAlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOwogCiAJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCi0JSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKwlKX0FTU0VSVChpc19wb3dlcl9vZl8yKGhhc2hfc2l6ZSkpOwogCiAJam91cm5hbC0+al9yZXZva2UtPmhhc2hfc2l6ZSA9IGhhc2hfc2l6ZTsKIApAQCAtMjM5LDcgKzI0MCw3IEBACiAJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXTsKIAogCS8qIENoZWNrIHRoYXQgdGhlIGhhc2hfc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLwotCUpfQVNTRVJUICgoaGFzaF9zaXplICYgKGhhc2hfc2l6ZS0xKSkgPT0gMCk7CisJSl9BU1NFUlQoaXNfcG93ZXJfb2ZfMihoYXNoX3NpemUpKTsKIAogCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2JhY2tncm91bmQuYyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwppbmRleCAwYzgyZGZjLi4xNDNjNTUzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKKysrIGIvZnMvamZmczIvYmFja2dyb3VuZC5jCkBAIC04MSw2ICs4MSw3IEBACiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDEwKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAlmb3IgKDs7KSB7CiAJCWFsbG93X3NpZ25hbChTSUdIVVApOwogCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2lub2RlLmggYi9mcy9qZnMvamZzX2lub2RlLmgKaW5kZXggMjM3NGI1OS4uZjBlYzcyYiAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbm9kZS5oCisrKyBiL2ZzL2pmcy9qZnNfaW5vZGUuaApAQCAtMzIsNiArMzIsNyBAQAogZXh0ZXJuIHZvaWQgamZzX2ZyZWVfemVyb19saW5rKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogZXh0ZXJuIHZvaWQgamZzX2dldF9pbm9kZV9mbGFncyhzdHJ1Y3QgamZzX2lub2RlX2luZm8gKik7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqamZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApOwogZXh0ZXJuIHZvaWQgamZzX3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gaW50IGpmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKIApkaWZmIC0tZ2l0IGEvZnMvamZzL25hbWVpLmMgYi9mcy9qZnMvbmFtZWkuYwppbmRleCAyNTE2MWM0Li45MzI3OTdiIDEwMDY0NAotLS0gYS9mcy9qZnMvbmFtZWkuYworKysgYi9mcy9qZnMvbmFtZWkuYwpAQCAtMTQ3Nyw2ICsxNDc3LDM4IEBACiAJcmV0dXJuIGRlbnRyeTsKIH0KIAorc3RydWN0IGRlbnRyeSAqamZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApCit7CisJX191MzIgKm9ianAgPSB2b2JqcDsKKwl1bnNpZ25lZCBsb25nIGlubyA9IG9ianBbMF07CisJX191MzIgZ2VuZXJhdGlvbiA9IG9ianBbMV07CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisKKwlpZiAoaW5vID09IDApCisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCWlub2RlID0gaWdldChzYiwgaW5vKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAorCSAgICAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pKSB7CisJICAgIAlyZXN1bHQgPSBFUlJfUFRSKC1FU1RBTEUpOworCQlnb3RvIG91dF9pcHV0OworCX0KKworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJcmVzdWx0ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXRfaXB1dDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKKworIG91dF9pcHV0OgorCWlwdXQoaW5vZGUpOworCXJldHVybiByZXN1bHQ7Cit9CisKIHN0cnVjdCBkZW50cnkgKmpmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX2lub2RlLT5pX3NiOwpkaWZmIC0tZ2l0IGEvZnMvamZzL3N1cGVyLmMgYi9mcy9qZnMvc3VwZXIuYwppbmRleCAyMGU0YWMxLi45MjlmY2VjIDEwMDY0NAotLS0gYS9mcy9qZnMvc3VwZXIuYworKysgYi9mcy9qZnMvc3VwZXIuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCkBAIC03MzcsNiArNzM4LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgamZzX2V4cG9ydF9vcGVyYXRpb25zID0geworCS5nZXRfZGVudHJ5CT0gamZzX2dldF9kZW50cnksCiAJLmdldF9wYXJlbnQJPSBqZnNfZ2V0X3BhcmVudCwKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKaW5kZXggMjY4MDkzMi4uODJlMjE5MiAxMDA2NDQKLS0tIGEvZnMvbG9ja2Qvc3ZjLmMKKysrIGIvZnMvbG9ja2Qvc3ZjLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CkBAIC03NSwxOCArNzYsMzEgQEAKIAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICogbmxtX3N5c2N0bF90YWJsZTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2dyYWNlX3BlcmlvZCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2xvY2tkX2dyYWNlX3BlcmlvZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZ3JhY2VfcGVyaW9kOwotCiAJLyogTm90ZTogbmxtX3RpbWVvdXQgc2hvdWxkIGFsd2F5cyBiZSBub256ZXJvICovCiAJaWYgKG5sbV9ncmFjZV9wZXJpb2QpCi0JCWdyYWNlX3BlcmlvZCA9ICgobmxtX2dyYWNlX3BlcmlvZCArIG5sbV90aW1lb3V0IC0gMSkKLQkJCQkvIG5sbV90aW1lb3V0KSAqIG5sbV90aW1lb3V0ICogSFo7CisJCXJldHVybiByb3VuZHVwKG5sbV9ncmFjZV9wZXJpb2QsIG5sbV90aW1lb3V0KSAqIEhaOwogCWVsc2UKLQkJZ3JhY2VfcGVyaW9kID0gbmxtX3RpbWVvdXQgKiA1ICogSFo7CisJCXJldHVybiBubG1fdGltZW91dCAqIDUgKiBIWjsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfbmZzX2dyYWNlX3BlcmlvZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9ja2RncmFjZSA9IGdldF9sb2NrZF9ncmFjZV9wZXJpb2QoKTsKKwl1bnNpZ25lZCBsb25nIG5mc2RncmFjZSA9IDA7CisKKwlpZiAobmxtc3ZjX29wcykKKwkJbmZzZGdyYWNlID0gbmxtc3ZjX29wcy0+Z2V0X2dyYWNlX3BlcmlvZCgpOworCisJcmV0dXJuIG1heChsb2NrZGdyYWNlLCBuZnNkZ3JhY2UpOworfQorRVhQT1JUX1NZTUJPTChnZXRfbmZzX2dyYWNlX3BlcmlvZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9ncmFjZV9wZXJpb2Qodm9pZCkKK3sKIAlubG1zdmNfZ3JhY2VfcGVyaW9kID0gMTsKLQlyZXR1cm4gZ3JhY2VfcGVyaW9kICsgamlmZmllczsKKwlyZXR1cm4gZ2V0X25mc19ncmFjZV9wZXJpb2QoKSArIGppZmZpZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ncmFjZV9wZXJpb2Qodm9pZCkKQEAgLTExOSw2ICsxMzMsNyBAQAogCWNvbXBsZXRlKCZsb2NrZF9zdGFydF9kb25lKTsKIAogCWRhZW1vbml6ZSgibG9ja2QiKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAkvKiBQcm9jZXNzIHJlcXVlc3Qgd2l0aCBzaWduYWxzIGJsb2NrZWQsIGJ1dCBhbGxvdyBTSUdLSUxMLiAgKi8KIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CmRpZmYgLS1naXQgYS9mcy9tYmNhY2hlLmMgYi9mcy9tYmNhY2hlLmMKaW5kZXggZGVlYjlkYy4uZmJiMWQwMiAxMDA2NDQKLS0tIGEvZnMvbWJjYWNoZS5jCisrKyBiL2ZzL21iY2FjaGUuYwpAQCAtMTAwLDcgKzEwMCw2IEBACiBzdGF0aWMgTElTVF9IRUFEKG1iX2NhY2hlX2xpc3QpOwogc3RhdGljIExJU1RfSEVBRChtYl9jYWNoZV9scnVfbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1iX2NhY2hlX3NwaW5sb2NrKTsKLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKm1iX3Nocmlua2VyOwogCiBzdGF0aWMgaW5saW5lIGludAogbWJfY2FjaGVfaW5kZXhlcyhzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlKQpAQCAtMTE4LDYgKzExNywxMCBAQAogCiBzdGF0aWMgaW50IG1iX2NhY2hlX3Nocmlua19mbihpbnQgbnJfdG9fc2NhbiwgZ2ZwX3QgZ2ZwX21hc2spOwogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIG1iX2NhY2hlX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBtYl9jYWNoZV9zaHJpbmtfZm4sCisJLnNlZWtzID0gREVGQVVMVF9TRUVLUywKK307CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQpAQCAtNjYyLDEzICs2NjUsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9tYmNhY2hlKHZvaWQpCiB7Ci0JbWJfc2hyaW5rZXIgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgbWJfY2FjaGVfc2hyaW5rX2ZuKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmbWJfY2FjaGVfc2hyaW5rZXIpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tYmNhY2hlKHZvaWQpCiB7Ci0JcmVtb3ZlX3Nocmlua2VyKG1iX3Nocmlua2VyKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZtYl9jYWNoZV9zaHJpbmtlcik7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfbWJjYWNoZSkKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggYjY5NmUzYS4uNDE5ODAwMyAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlICJwbm9kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKIC8qIHNwaW5sb2NrIGZvciB2ZnNtb3VudCByZWxhdGVkIG9wZXJhdGlvbnMsIGlucGxhY2Ugb2YgZGNhY2hlX2xvY2sgKi8KIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TUElOTE9DSyh2ZnNtb3VudF9sb2NrKTsKQEAgLTMyMCwyMiArMzIxLDE2IEBACiBzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewogCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCWxvZmZfdCBsID0gKnBvczsKIAogCWRvd25fcmVhZCgmbmFtZXNwYWNlX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmbi0+bGlzdCkKLQkJaWYgKCFsLS0pCi0JCQlyZXR1cm4gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9saXN0KTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJm4tPmxpc3QsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IG1udF9uYW1lc3BhY2UgKm4gPSBtLT5wcml2YXRlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnAgPSAoKHN0cnVjdCB2ZnNtb3VudCAqKXYpLT5tbnRfbGlzdC5uZXh0OwotCSgqcG9zKSsrOwotCXJldHVybiBwID09ICZuLT5saXN0ID8gTlVMTCA6IGxpc3RfZW50cnkocCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CisKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmbi0+bGlzdCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgbV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKQEAgLTM1MCw3ICszNDUsNyBAQAogCiBzdGF0aWMgaW50IHNob3dfdmZzbW50KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHY7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOwogCWludCBlcnIgPSAwOwogCXN0YXRpYyBzdHJ1Y3QgcHJvY19mc19pbmZvIHsKIAkJaW50IGZsYWc7CkBAIC00MDUsNyArNDAwLDcgQEAKIAogc3RhdGljIGludCBzaG93X3Zmc3N0YXQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gdjsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CiAJaW50IGVyciA9IDA7CiAKIAkvKiBkZXZpY2UgKi8KQEAgLTE0NTcsNyArMTQ1Miw3IEBACiAKIAluZXdfbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbW50X25hbWVzcGFjZSksIEdGUF9LRVJORUwpOwogCWlmICghbmV3X25zKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlhdG9taWNfc2V0KCZuZXdfbnMtPmNvdW50LCAxKTsKIAlJTklUX0xJU1RfSEVBRCgmbmV3X25zLT5saXN0KTsKQEAgLTE0NzEsNyArMTQ2Niw3IEBACiAJaWYgKCFuZXdfbnMtPnJvb3QpIHsKIAkJdXBfd3JpdGUoJm5hbWVzcGFjZV9zZW0pOwogCQlrZnJlZShuZXdfbnMpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7OwogCX0KIAlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwogCWxpc3RfYWRkX3RhaWwoJm5ld19ucy0+bGlzdCwgJm5ld19ucy0+cm9vdC0+bW50X2xpc3QpOwpAQCAtMTUxNSw3ICsxNTEwLDcgQEAKIAlyZXR1cm4gbmV3X25zOwogfQogCi1zdHJ1Y3QgbW50X25hbWVzcGFjZSAqY29weV9tbnRfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMsCitzdHJ1Y3QgbW50X25hbWVzcGFjZSAqY29weV9tbnRfbnModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zLAogCQlzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpCiB7CiAJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5ld19uczsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2ZpbGUuYyBiL2ZzL25jcGZzL2ZpbGUuYwppbmRleCBkMzE1MmY4Li4yYjE0NWRlIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9maWxlLmMKKysrIGIvZnMvbmNwZnMvZmlsZS5jCkBAIC0yMDMsNyArMjAzLDYgQEAKIAogCWlmIChwb3MgKyBjb3VudCA+IE1BWF9OT05fTEZTICYmICEoZmlsZS0+Zl9mbGFncyZPX0xBUkdFRklMRSkpIHsKIAkJaWYgKHBvcyA+PSBNQVhfTk9OX0xGUykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJCWlmIChjb3VudCA+IE1BWF9OT05fTEZTIC0gKHUzMilwb3MpIHsKQEAgLTIxMiw3ICsyMTEsNiBAQAogCX0KIAlpZiAocG9zID49IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CiAJCWlmIChjb3VudCB8fCBwb3MgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewotCQkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CiAJCQlyZXR1cm4gLUVGQklHOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwppbmRleCA3NWYzMDljLi5hNzk2YmU1IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2suYworKysgYi9mcy9uZnMvY2FsbGJhY2suYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNzb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAKQEAgLTY3LDYgKzY4LDcgQEAKIAlkYWVtb25pemUoIm5mc3Y0LXN2YyIpOwogCS8qIFByb2Nlc3MgcmVxdWVzdCB3aXRoIHNpZ25hbHMgYmxvY2tlZCwgYnV0IGFsbG93IFNJR0tJTEwuICAqLwogCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwlzZXRfZnJlZXphYmxlKCk7CiAKIAljb21wbGV0ZSgmbmZzX2NhbGxiYWNrX2luZm8uc3RhcnRlZCk7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9jbGllbnQuYyBiL2ZzL25mcy9jbGllbnQuYwppbmRleCBjY2I0NTUwLi5hNDlmOWZlIDEwMDY0NAotLS0gYS9mcy9uZnMvY2xpZW50LmMKKysrIGIvZnMvbmZzL2NsaWVudC5jCkBAIC0xMjA2LDIzICsxMjA2LDkgQEAKICAqLwogc3RhdGljIHZvaWQgKm5mc19zZXJ2ZXJfbGlzdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKLQlsb2ZmX3QgcG9zID0gKl9wb3M7Ci0KIAkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCiAJc3Bpbl9sb2NrKCZuZnNfY2xpZW50X2xvY2spOwotCi0JLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLwotCWlmICghcG9zKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCXBvcy0tOwotCi0JLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaChfcCwgJm5mc19jbGllbnRfbGlzdCkKLQkJaWYgKCFwb3MtLSkKLQkJCWJyZWFrOwotCi0JcmV0dXJuIF9wICE9ICZuZnNfY2xpZW50X2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJm5mc19jbGllbnRfbGlzdCwgKl9wb3MpOwogfQogCiAvKgpAQCAtMTIzMCwxNCArMTIxNiw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICpuZnNfc2VydmVyX2xpc3RfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCi0JKCpwb3MpKys7Ci0KLQlfcCA9IHY7Ci0JX3AgPSAodiA9PSBTRVFfU1RBUlRfVE9LRU4pID8gbmZzX2NsaWVudF9saXN0Lm5leHQgOiBfcC0+bmV4dDsKLQotCXJldHVybiBfcCAhPSAmbmZzX2NsaWVudF9saXN0ID8gX3AgOiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZuZnNfY2xpZW50X2xpc3QsIHBvcyk7CiB9CiAKIC8qCkBAIC0xMjU2LDcgKzEyMzUsNyBAQAogCXN0cnVjdCBuZnNfY2xpZW50ICpjbHA7CiAKIAkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwlpZiAodiA9PSAmbmZzX2NsaWVudF9saXN0KSB7CiAJCXNlcV9wdXRzKG0sICJOViBTRVJWRVIgICBQT1JUIFVTRSBIT1NUTkFNRVxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTEyOTcsMjMgKzEyNzYsOSBAQAogICovCiBzdGF0aWMgdm9pZCAqbmZzX3ZvbHVtZV9saXN0X3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKl9wOwotCWxvZmZfdCBwb3MgPSAqX3BvczsKLQogCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KIAlzcGluX2xvY2soJm5mc19jbGllbnRfbG9jayk7Ci0KLQkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCi0JaWYgKCFwb3MpCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0JcG9zLS07Ci0KLQkvKiBmaW5kIHRoZSBuJ3RoIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKF9wLCAmbmZzX3ZvbHVtZV9saXN0KQotCQlpZiAoIXBvcy0tKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gX3AgIT0gJm5mc192b2x1bWVfbGlzdCA/IF9wIDogTlVMTDsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmbmZzX3ZvbHVtZV9saXN0LCAqX3Bvcyk7CiB9CiAKIC8qCkBAIC0xMzIxLDE0ICsxMjg2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgKm5mc192b2x1bWVfbGlzdF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX3A7Ci0KLQkoKnBvcykrKzsKLQotCV9wID0gdjsKLQlfcCA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyBuZnNfdm9sdW1lX2xpc3QubmV4dCA6IF9wLT5uZXh0OwotCi0JcmV0dXJuIF9wICE9ICZuZnNfdm9sdW1lX2xpc3QgPyBfcCA6IE5VTEw7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJm5mc192b2x1bWVfbGlzdCwgcG9zKTsKIH0KIAogLyoKQEAgLTEzNDksNyArMTMwNyw3IEBACiAJY2hhciBkZXZbOF0sIGZzaWRbMTddOwogCiAJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJaWYgKHYgPT0gJm5mc192b2x1bWVfbGlzdCkgewogCQlzZXFfcHV0cyhtLCAiTlYgU0VSVkVSICAgUE9SVCBERVYgICAgIEZTSURcbiIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCmluZGV4IGEyYjFhZjguLmFkZmZlMTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zdXBlci5jCisrKyBiL2ZzL25mcy9zdXBlci5jCkBAIC0zMDAsNyArMzAwLDEwIEBACiB9OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgKmFjbF9zaHJpbmtlcjsKK3N0YXRpYyBzdHJ1Y3Qgc2hyaW5rZXIgYWNsX3Nocmlua2VyID0geworCS5zaHJpbmsJCT0gbmZzX2FjY2Vzc19jYWNoZV9zaHJpbmtlciwKKwkuc2Vla3MJCT0gREVGQVVMVF9TRUVLUywKK307CiAKIC8qCiAgKiBSZWdpc3RlciB0aGUgTkZTIGZpbGVzeXN0ZW1zCkBAIC0zMjEsNyArMzI0LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcl8yOwogI2VuZGlmCi0JYWNsX3Nocmlua2VyID0gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIG5mc19hY2Nlc3NfY2FjaGVfc2hyaW5rZXIpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZhY2xfc2hyaW5rZXIpOwogCXJldHVybiAwOwogCiAjaWZkZWYgQ09ORklHX05GU19WNApAQCAtMzM5LDggKzM0Miw3IEBACiAgKi8KIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfbmZzX2ZzKHZvaWQpCiB7Ci0JaWYgKGFjbF9zaHJpbmtlciAhPSBOVUxMKQotCQlyZW1vdmVfc2hyaW5rZXIoYWNsX3Nocmlua2VyKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZhY2xfc2hyaW5rZXIpOwogI2lmZGVmIENPTkZJR19ORlNfVjQKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm5mczRfZnNfdHlwZSk7CiAJbmZzX3VucmVnaXN0ZXJfc3lzY3RsKCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2F1dGguYyBiL2ZzL25mc2QvYXV0aC5jCmluZGV4IDZlOTJiMGYuLmNmNjFkYzggMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvYXV0aC5jCisrKyBiL2ZzL25mc2QvYXV0aC5jCkBAIC0xMiwxNyArMTIsMzEgQEAKIAogI2RlZmluZQlDQVBfTkZTRF9NQVNLIChDQVBfRlNfTUFTS3xDQVBfVE9fTUFTSyhDQVBfU1lTX1JFU09VUkNFKSkKIAorc3RhdGljIGludCBuZnNleHBfZmxhZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmOworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmVuZCA9IGV4cC0+ZXhfZmxhdm9ycyArIGV4cC0+ZXhfbmZsYXZvcnM7CisKKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBlbmQ7IGYrKykgeworCQlpZiAoZi0+cHNldWRvZmxhdm9yID09IHJxc3RwLT5ycV9mbGF2b3IpCisJCQlyZXR1cm4gZi0+ZmxhZ3M7CisJfQorCXJldHVybiBleHAtPmV4X2ZsYWdzOworCit9CisKIGludCBuZnNkX3NldHVzZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKIHsKIAlzdHJ1Y3Qgc3ZjX2NyZWQJY3JlZCA9IHJxc3RwLT5ycV9jcmVkOwogCWludCBpOworCWludCBmbGFncyA9IG5mc2V4cF9mbGFncyhycXN0cCwgZXhwKTsKIAlpbnQgcmV0OwogCi0JaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfQUxMU1FVQVNIKSB7CisJaWYgKGZsYWdzICYgTkZTRVhQX0FMTFNRVUFTSCkgewogCQljcmVkLmNyX3VpZCA9IGV4cC0+ZXhfYW5vbl91aWQ7CiAJCWNyZWQuY3JfZ2lkID0gZXhwLT5leF9hbm9uX2dpZDsKIAkJY3JlZC5jcl9ncm91cF9pbmZvID0gZ3JvdXBzX2FsbG9jKDApOwotCX0gZWxzZSBpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9ST09UU1FVQVNIKSB7CisJfSBlbHNlIGlmIChmbGFncyAmIE5GU0VYUF9ST09UU1FVQVNIKSB7CiAJCXN0cnVjdCBncm91cF9pbmZvICpnaTsKIAkJaWYgKCFjcmVkLmNyX3VpZCkKIAkJCWNyZWQuY3JfdWlkID0gZXhwLT5leF9hbm9uX3VpZDsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvZXhwb3J0LmMgYi9mcy9uZnNkL2V4cG9ydC5jCmluZGV4IDc5YmQwM2IuLmM3YmJmNDYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvZXhwb3J0LmMKKysrIGIvZnMvbmZzZC9leHBvcnQuYwpAQCAtMjYsMTIgKzI2LDE1IEBACiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2ZoLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9tc2dfcHJvdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQlORlNEREJHX0VYUE9SVAogCkBAIC00NTEsOCArNDU0LDQ4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBzZWNpbmZvX3BhcnNlKGNoYXIgKiptZXNnLCBjaGFyICpidWYsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJaW50IGxpc3RzaXplLCBlcnI7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKworCWVyciA9IGdldF9pbnQobWVzZywgJmxpc3RzaXplKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChsaXN0c2l6ZSA8IDAgfHwgbGlzdHNpemUgPiBNQVhfU0VDSU5GT19MSVNUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoZiA9IGV4cC0+ZXhfZmxhdm9yczsgZiA8IGV4cC0+ZXhfZmxhdm9ycyArIGxpc3RzaXplOyBmKyspIHsKKwkJZXJyID0gZ2V0X2ludChtZXNnLCAmZi0+cHNldWRvZmxhdm9yKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCS8qCisJCSAqIEp1c3QgYSBxdWljayBzYW5pdHkgY2hlY2s7IHdlIGNvdWxkIGFsc28gdHJ5IHRvIGNoZWNrCisJCSAqIHdoZXRoZXIgdGhpcyBwc2V1ZG9mbGF2b3IgaXMgc3VwcG9ydGVkLCBidXQgYXQgd29yc3QKKwkJICogYW4gdW5zdXBwb3J0ZWQgcHNldWRvZmxhdm9yIG9uIHRoZSBleHBvcnQgd291bGQganVzdAorCQkgKiBiZSBhIHBzZXVkb2ZsYXZvciB0aGF0IHdvbid0IG1hdGNoIHRoZSBmbGF2b3Igb2YgYW55CisJCSAqIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdC4gIFRoZSBhZG1pbmlzdHJhdG9yIHdpbGwKKwkJICogcHJvYmFibHkgZGlzY292ZXIgdGhlIHByb2JsZW0gd2hlbiBzb21lb25lIGZhaWxzIHRvCisJCSAqIGF1dGhlbnRpY2F0ZS4KKwkJICovCisJCWlmIChmLT5wc2V1ZG9mbGF2b3IgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IGdldF9pbnQobWVzZywgJmYtPmZsYWdzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCS8qIE9ubHkgc29tZSBmbGFncyBhcmUgYWxsb3dlZCB0byBkaWZmZXIgYmV0d2VlbiBmbGF2b3JzOiAqLworCQlpZiAofk5GU0VYUF9TRUNJTkZPX0ZMQUdTICYgKGYtPmZsYWdzIF4gZXhwLT5leF9mbGFncykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXhwLT5leF9uZmxhdm9ycyA9IGxpc3RzaXplOworCXJldHVybiAwOworfQorCiAjZWxzZSAvKiBDT05GSUdfTkZTRF9WNCAqLwotc3RhdGljIGlubGluZSBpbnQgZnNsb2NfcGFyc2UoY2hhciAqKm1lc2csIGNoYXIgKmJ1Ziwgc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyAqZnNsb2MpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50Citmc2xvY19wYXJzZShjaGFyICoqbWVzZywgY2hhciAqYnVmLCBzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvYyl7cmV0dXJuIDA7fQorc3RhdGljIGlubGluZSBpbnQKK3NlY2luZm9fcGFyc2UoY2hhciAqKm1lc2csIGNoYXIgKmJ1Ziwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQgc3ZjX2V4cG9ydF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgY2hhciAqbWVzZywgaW50IG1sZW4pCkBAIC00NzYsNiArNTE5LDkgQEAKIAogCWV4cC5leF91dWlkID0gTlVMTDsKIAorCS8qIHNlY2luZm8gKi8KKwlleHAuZXhfbmZsYXZvcnMgPSAwOworCiAJaWYgKG1lc2dbbWxlbi0xXSAhPSAnXG4nKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltZXNnW21sZW4tMV0gPSAwOwpAQCAtNTUzLDcgKzU5OSw5IEBACiAJCQkJCWlmIChleHAuZXhfdXVpZCA9PSBOVUxMKQogCQkJCQkJZXJyID0gLUVOT01FTTsKIAkJCQl9Ci0JCQl9IGVsc2UKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGJ1ZiwgInNlY2luZm8iKSA9PSAwKQorCQkJCWVyciA9IHNlY2luZm9fcGFyc2UoJm1lc2csIGJ1ZiwgJmV4cCk7CisJCQllbHNlCiAJCQkJLyogcXVpZXRseSBpZ25vcmUgdW5rbm93biB3b3JkcyBhbmQgYW55dGhpbmcKIAkJCQkgKiBmb2xsb3dpbmcuIE5ld2VyIHVzZXItc3BhY2UgY2FuIHRyeSB0byBzZXQKIAkJCQkgKiBuZXcgdmFsdWVzLCB0aGVuIHNlZSB3aGF0IHRoZSByZXN1bHQgd2FzLgpAQCAtNTkzLDYgKzY0MSw3IEBACiAKIHN0YXRpYyB2b2lkIGV4cF9mbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFnLCBpbnQgZnNpZCwKIAkJdWlkX3QgYW5vbnUsIHVpZF90IGFub25nLCBzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvY3MpOworc3RhdGljIHZvaWQgc2hvd19zZWNpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCk7CiAKIHN0YXRpYyBpbnQgc3ZjX2V4cG9ydF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwKIAkJCSAgIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLApAQCAtNjIyLDYgKzY3MSw3IEBACiAJCQkJc2VxX3ByaW50ZihtLCAiJTAyeCIsIGV4cC0+ZXhfdXVpZFtpXSk7CiAJCQl9CiAJCX0KKwkJc2hvd19zZWNpbmZvKG0sIGV4cCk7CiAJfQogCXNlcV9wdXRzKG0sICIpXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTY1NCw2ICs3MDQsNyBAQAogewogCXN0cnVjdCBzdmNfZXhwb3J0ICpuZXcgPSBjb250YWluZXJfb2YoY25ldywgc3RydWN0IHN2Y19leHBvcnQsIGgpOwogCXN0cnVjdCBzdmNfZXhwb3J0ICppdGVtID0gY29udGFpbmVyX29mKGNpdGVtLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCwgaCk7CisJaW50IGk7CiAKIAluZXctPmV4X2ZsYWdzID0gaXRlbS0+ZXhfZmxhZ3M7CiAJbmV3LT5leF9hbm9uX3VpZCA9IGl0ZW0tPmV4X2Fub25fdWlkOwpAQCAtNjY5LDYgKzcyMCwxMCBAQAogCWl0ZW0tPmV4X2ZzbG9jcy5sb2NhdGlvbnNfY291bnQgPSAwOwogCW5ldy0+ZXhfZnNsb2NzLm1pZ3JhdGVkID0gaXRlbS0+ZXhfZnNsb2NzLm1pZ3JhdGVkOwogCWl0ZW0tPmV4X2ZzbG9jcy5taWdyYXRlZCA9IDA7CisJbmV3LT5leF9uZmxhdm9ycyA9IGl0ZW0tPmV4X25mbGF2b3JzOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VDSU5GT19MSVNUOyBpKyspIHsKKwkJbmV3LT5leF9mbGF2b3JzW2ldID0gaXRlbS0+ZXhfZmxhdm9yc1tpXTsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2FjaGVfaGVhZCAqc3ZjX2V4cG9ydF9hbGxvYyh2b2lkKQpAQCAtNzM4LDE2ICs3OTMsMTggQEAKIAlpbnQgZXJyOwogCQogCWlmICghY2xwKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAKIAlrZXkuZWtfY2xpZW50ID0gY2xwOwogCWtleS5la19mc2lkdHlwZSA9IGZzaWRfdHlwZTsKIAltZW1jcHkoa2V5LmVrX2ZzaWQsIGZzaWR2LCBrZXlfbGVuKGZzaWRfdHlwZSkpOwogCiAJZWsgPSBzdmNfZXhwa2V5X2xvb2t1cCgma2V5KTsKLQlpZiAoZWsgIT0gTlVMTCkKLQkJaWYgKChlcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cGtleV9jYWNoZSwgJmVrLT5oLCByZXFwKSkpCi0JCQllayA9IEVSUl9QVFIoZXJyKTsKKwlpZiAoZWsgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZXJyID0gY2FjaGVfY2hlY2soJnN2Y19leHBrZXlfY2FjaGUsICZlay0+aCwgcmVxcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAlyZXR1cm4gZWs7CiB9CiAKQEAgLTgwOCwzMCArODY1LDIxIEBACiAJCXN0cnVjdCBjYWNoZV9yZXEgKnJlcXApCiB7CiAJc3RydWN0IHN2Y19leHBvcnQgKmV4cCwga2V5OworCWludCBlcnI7CiAJCiAJaWYgKCFjbHApCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAogCWtleS5leF9jbGllbnQgPSBjbHA7CiAJa2V5LmV4X21udCA9IG1udDsKIAlrZXkuZXhfZGVudHJ5ID0gZGVudHJ5OwogCiAJZXhwID0gc3ZjX2V4cG9ydF9sb29rdXAoJmtleSk7Ci0JaWYgKGV4cCAhPSBOVUxMKSAgewotCQlpbnQgZXJyOwotCi0JCWVyciA9IGNhY2hlX2NoZWNrKCZzdmNfZXhwb3J0X2NhY2hlLCAmZXhwLT5oLCByZXFwKTsKLQkJc3dpdGNoIChlcnIpIHsKLQkJY2FzZSAwOiBicmVhazsKLQkJY2FzZSAtRUFHQUlOOgotCQljYXNlIC1FVElNRURPVVQ6Ci0JCQlleHAgPSBFUlJfUFRSKGVycik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWV4cCA9IE5VTEw7Ci0JCX0KLQl9Ci0KKwlpZiAoZXhwID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVyciA9IGNhY2hlX2NoZWNrKCZzdmNfZXhwb3J0X2NhY2hlLCAmZXhwLT5oLCByZXFwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCXJldHVybiBleHA7CiB9CiAKQEAgLTg0Nyw3ICs4OTUsNyBAQAogCWRnZXQoZGVudHJ5KTsKIAlleHAgPSBleHBfZ2V0X2J5X25hbWUoY2xwLCBtbnQsIGRlbnRyeSwgcmVxcCk7CiAKLQl3aGlsZSAoZXhwID09IE5VTEwgJiYgIUlTX1JPT1QoZGVudHJ5KSkgeworCXdoaWxlIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCAmJiAhSVNfUk9PVChkZW50cnkpKSB7CiAJCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKIAogCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOwpAQCAtOTAwLDcgKzk0OCw3IEBACiAJCXJldHVybjsKIAogCWVrID0gZXhwX2dldF9mc2lkX2tleShleHAtPmV4X2NsaWVudCwgZXhwLT5leF9mc2lkKTsKLQlpZiAoZWsgJiYgIUlTX0VSUihlaykpIHsKKwlpZiAoIUlTX0VSUihlaykpIHsKIAkJZWstPmguZXhwaXJ5X3RpbWUgPSBnZXRfc2Vjb25kcygpLTE7CiAJCWNhY2hlX3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKIAl9CkBAIC05MzgsNyArOTg2LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZXhwLT5leF9kZW50cnktPmRfaW5vZGU7CiAKIAllayA9IGV4cF9nZXRfa2V5KGV4cC0+ZXhfY2xpZW50LCBpbm9kZS0+aV9zYi0+c19kZXYsIGlub2RlLT5pX2lubyk7Ci0JaWYgKGVrICYmICFJU19FUlIoZWspKSB7CisJaWYgKCFJU19FUlIoZWspKSB7CiAJCWVrLT5oLmV4cGlyeV90aW1lID0gZ2V0X3NlY29uZHMoKS0xOwogCQljYWNoZV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CiAJfQpAQCAtOTg5LDEzICsxMDM3LDEyIEBACiAKIAkvKiBtdXN0IG1ha2Ugc3VyZSB0aGVyZSB3b24ndCBiZSBhbiBleF9mc2lkIGNsYXNoICovCiAJaWYgKChueHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpICYmCi0JICAgIChmc2lkX2tleSA9IGV4cF9nZXRfZnNpZF9rZXkoY2xwLCBueHAtPmV4X2RldikpICYmCi0JICAgICFJU19FUlIoZnNpZF9rZXkpICYmCisJICAgICghSVNfRVJSKGZzaWRfa2V5ID0gZXhwX2dldF9mc2lkX2tleShjbHAsIG54cC0+ZXhfZGV2KSkpICYmCiAJICAgIGZzaWRfa2V5LT5la19tbnQgJiYKIAkgICAgKGZzaWRfa2V5LT5la19tbnQgIT0gbmQubW50IHx8IGZzaWRfa2V5LT5la19kZW50cnkgIT0gbmQuZGVudHJ5KSApCiAJCWdvdG8gZmluaXNoOwogCi0JaWYgKGV4cCkgeworCWlmICghSVNfRVJSKGV4cCkpIHsKIAkJLyoganVzdCBhIGZsYWdzL2lkL2ZzaWQgdXBkYXRlICovCiAKIAkJZXhwX2ZzaWRfdW5oYXNoKGV4cCk7CkBAIC0xMTA0LDcgKzExNTEsNyBAQAogCWVyciA9IC1FSU5WQUw7CiAJZXhwID0gZXhwX2dldF9ieV9uYW1lKGRvbSwgbmQubW50LCBuZC5kZW50cnksIE5VTEwpOwogCXBhdGhfcmVsZWFzZSgmbmQpOwotCWlmICghZXhwKQorCWlmIChJU19FUlIoZXhwKSkKIAkJZ290byBvdXRfZG9tYWluOwogCiAJZXhwX2RvX3VuZXhwb3J0KGV4cCk7CkBAIC0xMTQ5LDEwICsxMTk2LDYgQEAKIAkJZXJyID0gUFRSX0VSUihleHApOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCFleHApIHsKLQkJZHByaW50aygibmZzZDogZXhwX3Jvb3RmaCBleHBvcnQgbm90IGZvdW5kLlxuIik7Ci0JCWdvdG8gb3V0OwotCX0KIAogCS8qCiAJICogZmggbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBmaF9jb21wb3NlCkBAIC0xMTc2LDE3ICsxMjE5LDEzMCBAQAogewogCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CiAJc3RydWN0IHN2Y19leHBrZXkgKmVrID0gZXhwX2ZpbmRfa2V5KGNscCwgZnNpZF90eXBlLCBmc2lkdiwgcmVxcCk7Ci0JaWYgKCFlayB8fCBJU19FUlIoZWspKQorCWlmIChJU19FUlIoZWspKQogCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGVrKSk7CiAKIAlleHAgPSBleHBfZ2V0X2J5X25hbWUoY2xwLCBlay0+ZWtfbW50LCBlay0+ZWtfZGVudHJ5LCByZXFwKTsKIAljYWNoZV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CiAKLQlpZiAoIWV4cCB8fCBJU19FUlIoZXhwKSkKKwlpZiAoSVNfRVJSKGV4cCkpCiAJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoZXhwKSk7CiAJcmV0dXJuIGV4cDsKIH0KIAorX19iZTMyIGNoZWNrX25mc2RfYWNjZXNzKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZjsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICplbmQgPSBleHAtPmV4X2ZsYXZvcnMgKyBleHAtPmV4X25mbGF2b3JzOworCisJLyogbGVnYWN5IGdzcy1vbmx5IGNsaWVudHMgYXJlIGFsd2F5cyBPSzogKi8KKwlpZiAoZXhwLT5leF9jbGllbnQgPT0gcnFzdHAtPnJxX2dzc2NsaWVudCkKKwkJcmV0dXJuIDA7CisJLyogaXAtYWRkcmVzcyBiYXNlZCBjbGllbnQ7IGNoZWNrIHNlYz0gZXhwb3J0IG9wdGlvbjogKi8KKwlmb3IgKGYgPSBleHAtPmV4X2ZsYXZvcnM7IGYgPCBlbmQ7IGYrKykgeworCQlpZiAoZi0+cHNldWRvZmxhdm9yID09IHJxc3RwLT5ycV9mbGF2b3IpCisJCQlyZXR1cm4gMDsKKwl9CisJLyogZGVmYXVsdHMgaW4gYWJzZW5jZSBvZiBzZWM9IG9wdGlvbnM6ICovCisJaWYgKGV4cC0+ZXhfbmZsYXZvcnMgPT0gMCkgeworCQlpZiAocnFzdHAtPnJxX2ZsYXZvciA9PSBSUENfQVVUSF9OVUxMIHx8CisJCSAgICBycXN0cC0+cnFfZmxhdm9yID09IFJQQ19BVVRIX1VOSVgpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIG5mc2Vycl93cm9uZ3NlYzsKK30KKworLyoKKyAqIFVzZXMgcnFfY2xpZW50IGFuZCBycV9nc3NjbGllbnQgdG8gZmluZCBhbiBleHBvcnQ7IHVzZXMgcnFfY2xpZW50IChhbgorICogYXV0aF91bml4IGNsaWVudCkgaWYgaXQncyBhdmFpbGFibGUgYW5kIGhhcyBzZWNpbmZvIGluZm9ybWF0aW9uOworICogb3RoZXJ3aXNlLCB3aWxsIHRyeSB0byB1c2UgcnFfZ3NzY2xpZW50LgorICoKKyAqIENhbGxlZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSByZXF1ZXN0czsgZnVuY3Rpb25zIHRoYXQgZG8gd29yayBvbgorICogYmVoYWxmIG9mIG1vdW50ZCBhcmUgcGFzc2VkIGEgc2luZ2xlIGNsaWVudCBuYW1lIHRvIHVzZSwgYW5kIHNob3VsZAorICogdXNlIGV4cF9nZXRfYnlfbmFtZSgpIG9yIGV4cF9maW5kKCkuCisgKi8KK3N0cnVjdCBzdmNfZXhwb3J0ICoKK3Jxc3RfZXhwX2dldF9ieV9uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN2Y19leHBvcnQgKmdzc2V4cCwgKmV4cCA9IE5VTEw7CisKKwlpZiAocnFzdHAtPnJxX2NsaWVudCA9PSBOVUxMKQorCQlnb3RvIGdzczsKKworCS8qIEZpcnN0IHRyeSB0aGUgYXV0aF91bml4IGNsaWVudDogKi8KKwlleHAgPSBleHBfZ2V0X2J5X25hbWUocnFzdHAtPnJxX2NsaWVudCwgbW50LCBkZW50cnksCisJCQkJCQkmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCkKKwkJZ290byBnc3M7CisJaWYgKElTX0VSUihleHApKQorCQlyZXR1cm4gZXhwOworCS8qIElmIGl0IGhhcyBzZWNpbmZvLCBhc3N1bWUgdGhlcmUgYXJlIG5vIGdzcy8uLi4gY2xpZW50cyAqLworCWlmIChleHAtPmV4X25mbGF2b3JzID4gMCkKKwkJcmV0dXJuIGV4cDsKK2dzczoKKwkvKiBPdGhlcndpc2UsIHRyeSBmYWxsaW5nIGJhY2sgb24gZ3NzIGNsaWVudCAqLworCWlmIChycXN0cC0+cnFfZ3NzY2xpZW50ID09IE5VTEwpCisJCXJldHVybiBleHA7CisJZ3NzZXhwID0gZXhwX2dldF9ieV9uYW1lKHJxc3RwLT5ycV9nc3NjbGllbnQsIG1udCwgZGVudHJ5LAorCQkJCQkJJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlpZiAoUFRSX0VSUihnc3NleHApID09IC1FTk9FTlQpCisJCXJldHVybiBleHA7CisJaWYgKGV4cCAmJiAhSVNfRVJSKGV4cCkpCisJCWV4cF9wdXQoZXhwKTsKKwlyZXR1cm4gZ3NzZXhwOworfQorCitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCitycXN0X2V4cF9maW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCBmc2lkX3R5cGUsIHUzMiAqZnNpZHYpCit7CisJc3RydWN0IHN2Y19leHBvcnQgKmdzc2V4cCwgKmV4cCA9IE5VTEw7CisKKwlpZiAocnFzdHAtPnJxX2NsaWVudCA9PSBOVUxMKQorCQlnb3RvIGdzczsKKworCS8qIEZpcnN0IHRyeSB0aGUgYXV0aF91bml4IGNsaWVudDogKi8KKwlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCBmc2lkX3R5cGUsIGZzaWR2LCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCkKKwkJZ290byBnc3M7CisJaWYgKElTX0VSUihleHApKQorCQlyZXR1cm4gZXhwOworCS8qIElmIGl0IGhhcyBzZWNpbmZvLCBhc3N1bWUgdGhlcmUgYXJlIG5vIGdzcy8uLi4gY2xpZW50cyAqLworCWlmIChleHAtPmV4X25mbGF2b3JzID4gMCkKKwkJcmV0dXJuIGV4cDsKK2dzczoKKwkvKiBPdGhlcndpc2UsIHRyeSBmYWxsaW5nIGJhY2sgb24gZ3NzIGNsaWVudCAqLworCWlmIChycXN0cC0+cnFfZ3NzY2xpZW50ID09IE5VTEwpCisJCXJldHVybiBleHA7CisJZ3NzZXhwID0gZXhwX2ZpbmQocnFzdHAtPnJxX2dzc2NsaWVudCwgZnNpZF90eXBlLCBmc2lkdiwKKwkJCQkJCSZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKFBUUl9FUlIoZ3NzZXhwKSA9PSAtRU5PRU5UKQorCQlyZXR1cm4gZXhwOworCWlmIChleHAgJiYgIUlTX0VSUihleHApKQorCQlleHBfcHV0KGV4cCk7CisJcmV0dXJuIGdzc2V4cDsKK30KKworc3RydWN0IHN2Y19leHBvcnQgKgorcnFzdF9leHBfcGFyZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cDsKKworCWRnZXQoZGVudHJ5KTsKKwlleHAgPSBycXN0X2V4cF9nZXRfYnlfbmFtZShycXN0cCwgbW50LCBkZW50cnkpOworCisJd2hpbGUgKFBUUl9FUlIoZXhwKSA9PSAtRU5PRU5UICYmICFJU19ST09UKGRlbnRyeSkpIHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJCXBhcmVudCA9IGRnZXRfcGFyZW50KGRlbnRyeSk7CisJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gcGFyZW50OworCQlleHAgPSBycXN0X2V4cF9nZXRfYnlfbmFtZShycXN0cCwgbW50LCBkZW50cnkpOworCX0KKwlkcHV0KGRlbnRyeSk7CisJcmV0dXJuIGV4cDsKK30KIAogLyoKICAqIENhbGxlZCB3aGVuIHdlIG5lZWQgdGhlIGZpbGVoYW5kbGUgZm9yIHRoZSByb290IG9mIHRoZSBwc2V1ZG9mcywKQEAgLTExOTQsOCArMTM1MCw3IEBACiAgKiBleHBvcnQgcG9pbnQgd2l0aCBmc2lkPT0wCiAgKi8KIF9fYmUzMgotZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICpjbHAsIHN0cnVjdCBzdmNfZmggKmZocCwKLQkgICAgICAgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSkKK2V4cF9wc2V1ZG9yb290KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCkKIHsKIAlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwOwogCV9fYmUzMiBydjsKQEAgLTEyMDMsMTIgKzEzNTgsMTYgQEAKIAogCW1rX2ZzaWQoRlNJRF9OVU0sIGZzaWR2LCAwLCAwLCAwLCBOVUxMKTsKIAotCWV4cCA9IGV4cF9maW5kKGNscCwgRlNJRF9OVU0sIGZzaWR2LCBjcmVxKTsKKwlleHAgPSBycXN0X2V4cF9maW5kKHJxc3RwLCBGU0lEX05VTSwgZnNpZHYpOworCWlmIChQVFJfRVJSKGV4cCkgPT0gLUVOT0VOVCkKKwkJcmV0dXJuIG5mc2Vycl9wZXJtOwogCWlmIChJU19FUlIoZXhwKSkKIAkJcmV0dXJuIG5mc2Vycm5vKFBUUl9FUlIoZXhwKSk7Ci0JaWYgKGV4cCA9PSBOVUxMKQotCQlyZXR1cm4gbmZzZXJyX3Blcm07CiAJcnYgPSBmaF9jb21wb3NlKGZocCwgZXhwLCBleHAtPmV4X2RlbnRyeSwgTlVMTCk7CisJaWYgKHJ2KQorCQlnb3RvIG91dDsKKwlydiA9IGNoZWNrX25mc2RfYWNjZXNzKGV4cCwgcnFzdHApOworb3V0OgogCWV4cF9wdXQoZXhwKTsKIAlyZXR1cm4gcnY7CiB9CkBAIC0xMjk2LDI4ICsxNDU1LDYyIEBACiAJeyAwLCB7IiIsICIifX0KIH07CiAKLXN0YXRpYyB2b2lkIGV4cF9mbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFnLCBpbnQgZnNpZCwKLQkJdWlkX3QgYW5vbnUsIHVpZF90IGFub25nLCBzdHJ1Y3QgbmZzZDRfZnNfbG9jYXRpb25zICpmc2xvYykKK3N0YXRpYyB2b2lkIHNob3dfZXhwZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZ3MsIGludCBtYXNrKQogewotCWludCBmaXJzdCA9IDA7CiAJc3RydWN0IGZsYWdzICpmbGc7CisJaW50IHN0YXRlLCBmaXJzdCA9IDA7CiAKIAlmb3IgKGZsZyA9IGV4cGZsYWdzOyBmbGctPmZsYWc7IGZsZysrKSB7Ci0JCWludCBzdGF0ZSA9IChmbGctPmZsYWcgJiBmbGFnKT8wOjE7CisJCWlmIChmbGctPmZsYWcgJiB+bWFzaykKKwkJCWNvbnRpbnVlOworCQlzdGF0ZSA9IChmbGctPmZsYWcgJiBmbGFncykgPyAwIDogMTsKIAkJaWYgKCpmbGctPm5hbWVbc3RhdGVdKQogCQkJc2VxX3ByaW50ZihtLCAiJXMlcyIsIGZpcnN0Kys/IiwiOiIiLCBmbGctPm5hbWVbc3RhdGVdKTsKIAl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc2VjaW5mb19mbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBmbGFncykKK3sKKwlzZXFfcHJpbnRmKG0sICIsIik7CisJc2hvd19leHBmbGFncyhtLCBmbGFncywgTkZTRVhQX1NFQ0lORk9fRkxBR1MpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3NlY2luZm8oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZW5kID0gZXhwLT5leF9mbGF2b3JzICsgZXhwLT5leF9uZmxhdm9yczsKKwlpbnQgbGFzdGZsYWdzID0gMCwgZmlyc3QgPSAwOworCisJaWYgKGV4cC0+ZXhfbmZsYXZvcnMgPT0gMCkKKwkJcmV0dXJuOworCWZvciAoZiA9IGV4cC0+ZXhfZmxhdm9yczsgZiA8IGVuZDsgZisrKSB7CisJCWlmIChmaXJzdCB8fCBmLT5mbGFncyAhPSBsYXN0ZmxhZ3MpIHsKKwkJCWlmICghZmlyc3QpCisJCQkJc2hvd19zZWNpbmZvX2ZsYWdzKG0sIGxhc3RmbGFncyk7CisJCQlzZXFfcHJpbnRmKG0sICIsc2VjPSVkIiwgZi0+cHNldWRvZmxhdm9yKTsKKwkJCWxhc3RmbGFncyA9IGYtPmZsYWdzOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihtLCAiOiVkIiwgZi0+cHNldWRvZmxhdm9yKTsKKwkJfQorCX0KKwlzaG93X3NlY2luZm9fZmxhZ3MobSwgbGFzdGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZXhwX2ZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWcsIGludCBmc2lkLAorCQl1aWRfdCBhbm9udSwgdWlkX3QgYW5vbmcsIHN0cnVjdCBuZnNkNF9mc19sb2NhdGlvbnMgKmZzbG9jKQoreworCXNob3dfZXhwZmxhZ3MobSwgZmxhZywgTkZTRVhQX0FMTEZMQUdTKTsKIAlpZiAoZmxhZyAmIE5GU0VYUF9GU0lEKQotCQlzZXFfcHJpbnRmKG0sICIlc2ZzaWQ9JWQiLCBmaXJzdCsrPyIsIjoiIiwgZnNpZCk7CisJCXNlcV9wcmludGYobSwgIixmc2lkPSVkIiwgZnNpZCk7CiAJaWYgKGFub251ICE9ICh1aWRfdCktMiAmJiBhbm9udSAhPSAoMHgxMDAwMC0yKSkKLQkJc2VxX3ByaW50ZihtLCAiJXNhbm9udWlkPSVkIiwgZmlyc3QrKz8iLCI6IiIsIGFub251KTsKKwkJc2VxX3ByaW50ZihtLCAiLHNhbm9udWlkPSVkIiwgYW5vbnUpOwogCWlmIChhbm9uZyAhPSAoZ2lkX3QpLTIgJiYgYW5vbmcgIT0gKDB4MTAwMDAtMikpCi0JCXNlcV9wcmludGYobSwgIiVzYW5vbmdpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBhbm9uZyk7CisJCXNlcV9wcmludGYobSwgIixzYW5vbmdpZD0lZCIsIGFub25nKTsKIAlpZiAoZnNsb2MgJiYgZnNsb2MtPmxvY2F0aW9uc19jb3VudCA+IDApIHsKIAkJY2hhciAqbG9jdHlwZSA9IChmc2xvYy0+bWlncmF0ZWQpID8gInJlZmVyIiA6ICJyZXBsaWNhcyI7CiAJCWludCBpOwogCi0JCXNlcV9wcmludGYobSwgIiVzJXM9IiwgZmlyc3QrKz8iLCI6IiIsIGxvY3R5cGUpOworCQlzZXFfcHJpbnRmKG0sICIsJXM9IiwgbG9jdHlwZSk7CiAJCXNlcV9lc2NhcGUobSwgZnNsb2MtPmxvY2F0aW9uc1swXS5wYXRoLCAiLDtAIFx0XG5cXCIpOwogCQlzZXFfcHV0YyhtLCAnQCcpOwogCQlzZXFfZXNjYXBlKG0sIGZzbG9jLT5sb2NhdGlvbnNbMF0uaG9zdHMsICIsO0AgXHRcblxcIik7CmRpZmYgLS1naXQgYS9mcy9uZnNkL2xvY2tkLmMgYi9mcy9uZnNkL2xvY2tkLmMKaW5kZXggMjIxYWNkMS4uOWU0YTU2OCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9sb2NrZC5jCisrKyBiL2ZzL25mc2QvbG9ja2QuYwpAQCAtNjUsNiArNjUsNyBAQAogc3RhdGljIHN0cnVjdCBubG1zdmNfYmluZGluZwluZnNkX25sbV9vcHMgPSB7CiAJLmZvcGVuCQk9IG5sbV9mb3BlbiwJCS8qIG9wZW4gZmlsZSBmb3IgbG9ja2luZyAqLwogCS5mY2xvc2UJCT0gbmxtX2ZjbG9zZSwJCS8qIGNsb3NlIGZpbGUgKi8KKwkuZ2V0X2dyYWNlX3BlcmlvZCA9IGdldF9uZnM0X2dyYWNlX3BlcmlvZCwKIH07CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGFjbC5jIGIvZnMvbmZzZC9uZnM0YWNsLmMKaW5kZXggY2MzYjdiYS4uYjZlZDM4MyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0YWNsLmMKKysrIGIvZnMvbmZzZC9uZnM0YWNsLmMKQEAgLTE4Myw4ICsxODMsMTMgQEAKIHN1bW1hcml6ZV9wb3NpeF9hY2woc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX3N1bW1hcnkgKnBhcykKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOwotCXBhcy0+dXNlcnMgPSAwOwotCXBhcy0+Z3JvdXBzID0gMDsKKworCS8qCisJICogT25seSBwYXMudXNlcnMgYW5kIHBhcy5ncm91cHMgbmVlZCBpbml0aWFsaXphdGlvbjsgcHJldmlvdXMKKwkgKiBwb3NpeF9hY2xfdmFsaWQoKSBjYWxscyBlbnN1cmUgdGhhdCB0aGUgb3RoZXIgZmllbGRzIHdpbGwgYmUKKwkgKiBpbml0aWFsaXplZCBpbiB0aGUgZm9sbG93aW5nIGxvb3AuICBCdXQsIGp1c3QgdG8gcGxhY2F0ZSBnY2M6CisJICovCisJbWVtc2V0KHBhcywgMCwgc2l6ZW9mKCpwYXMpKTsKIAlwYXMtPm1hc2sgPSAwNzsKIAogCXBlID0gYWNsLT5hX2VudHJpZXMgKyBhY2wtPmFfY291bnQ7CkBAIC03MzIsMTMgKzczNywxNiBAQAogCSpwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZlZmZlY3RpdmVfYWNsX3N0YXRlLCBmbGFncyk7CiAJaWYgKElTX0VSUigqcGFjbCkpIHsKIAkJcmV0ID0gUFRSX0VSUigqcGFjbCk7CisJCSpwYWNsID0gTlVMTDsKIAkJZ290byBvdXRfZHN0YXRlOwogCX0KIAkqZHBhY2wgPSBwb3NpeF9zdGF0ZV90b19hY2woJmRlZmF1bHRfYWNsX3N0YXRlLAogCQkJCQkJZmxhZ3MgfCBORlM0X0FDTF9UWVBFX0RFRkFVTFQpOwogCWlmIChJU19FUlIoKmRwYWNsKSkgewogCQlyZXQgPSBQVFJfRVJSKCpkcGFjbCk7CisJCSpkcGFjbCA9IE5VTEw7CiAJCXBvc2l4X2FjbF9yZWxlYXNlKCpwYWNsKTsKKwkJKnBhY2wgPSBOVUxMOwogCQlnb3RvIG91dF9kc3RhdGU7CiAJfQogCXNvcnRfcGFjbCgqcGFjbCk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCA1NDQzYzUyLi4zMWQ2NjMzIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTc1LDcgKzc1LDcgQEAKICNkZWZpbmUgb3BfZW5jX3N6CQkJMQogI2RlZmluZSBvcF9kZWNfc3oJCQkyCiAjZGVmaW5lIGVuY19uZnM0X2ZoX3N6CQkJKDEgKyAoTkZTNF9GSFNJWkUgPj4gMikpCi0jZGVmaW5lIGVuY19zdGF0ZWlkX3N6CQkJMTYKKyNkZWZpbmUgZW5jX3N0YXRlaWRfc3oJCQkoTkZTNF9TVEFURUlEX1NJWkUgPj4gMikKICNkZWZpbmUgTkZTNF9lbmNfY2JfcmVjYWxsX3N6CQkoY2JfY29tcG91bmRfZW5jX2hkcl9zeiArICAgICAgIFwKIAkJCQkJMSArIGVuY19zdGF0ZWlkX3N6ICsgICAgICAgICAgICBcCiAJCQkJCWVuY19uZnM0X2ZoX3N6KQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0aWRtYXAuYyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKaW5kZXggNDVhYTIxYy4uMmNmOWE5YSAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0aWRtYXAuYworKysgYi9mcy9uZnNkL25mczRpZG1hcC5jCkBAIC01ODcsNiArNTg3LDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNoYXIgKgorcnFzdF9hdXRobmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwOworCisJY2xwID0gcnFzdHAtPnJxX2dzc2NsaWVudCA/IHJxc3RwLT5ycV9nc3NjbGllbnQgOiBycXN0cC0+cnFfY2xpZW50OworCXJldHVybiBjbHAtPm5hbWU7Cit9CisKIHN0YXRpYyBpbnQKIGlkbWFwX25hbWVfdG9faWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBuYW1lbGVuLAogCQl1aWRfdCAqaWQpCkBAIC02MDAsNyArNjA5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbWVtY3B5KGtleS5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKIAlrZXkubmFtZVtuYW1lbGVuXSA9ICdcMCc7Ci0Jc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RwLT5ycV9jbGllbnQtPm5hbWUsIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKKwlzdHJsY3B5KGtleS5hdXRobmFtZSwgcnFzdF9hdXRobmFtZShycXN0cCksIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKIAlyZXQgPSBpZG1hcF9sb29rdXAocnFzdHAsIG5hbWV0b2lkX2xvb2t1cCwgJmtleSwgJm5hbWV0b2lkX2NhY2hlLCAmaXRlbSk7CiAJaWYgKHJldCA9PSAtRU5PRU5UKQogCQlyZXQgPSAtRVNSQ0g7IC8qIG5mc2Vycl9iYWRuYW1lICovCkBAIC02MjAsNyArNjI5LDcgQEAKIAl9OwogCWludCByZXQ7CiAKLQlzdHJsY3B5KGtleS5hdXRobmFtZSwgcnFzdHAtPnJxX2NsaWVudC0+bmFtZSwgc2l6ZW9mKGtleS5hdXRobmFtZSkpOworCXN0cmxjcHkoa2V5LmF1dGhuYW1lLCBycXN0X2F1dGhuYW1lKHJxc3RwKSwgc2l6ZW9mKGtleS5hdXRobmFtZSkpOwogCXJldCA9IGlkbWFwX2xvb2t1cChycXN0cCwgaWR0b25hbWVfbG9va3VwLCAma2V5LCAmaWR0b25hbWVfY2FjaGUsICZpdGVtKTsKIAlpZiAocmV0ID09IC1FTk9FTlQpCiAJCXJldHVybiBzcHJpbnRmKG5hbWUsICIldSIsIGlkKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHByb2MuYyBiL2ZzL25mc2QvbmZzNHByb2MuYwppbmRleCA4NTIyNzI5Li4zYzYyNzEyIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRwcm9jLmMKKysrIGIvZnMvbmZzZC9uZnM0cHJvYy5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyNC5oPgogI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KIAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1BST0MKIApAQCAtMjg2LDggKzI4Nyw3IEBACiAJX19iZTMyIHN0YXR1czsKIAogCWZoX3B1dCgmY3N0YXRlLT5jdXJyZW50X2ZoKTsKLQlzdGF0dXMgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmY3N0YXRlLT5jdXJyZW50X2ZoLAotCQkJICAgICAgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwlzdGF0dXMgPSBleHBfcHNldWRvcm9vdChycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDc0LDggKzQ3NCw4IEBACiAJX19iZTMyIHJldDsKIAogCWZoX2luaXQoJnRtcF9maCwgTkZTNF9GSFNJWkUpOwotCWlmKChyZXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLAotCQkJICAgICAgJnJxc3RwLT5ycV9jaGFuZGxlKSkgIT0gMCkKKwlyZXQgPSBleHBfcHNldWRvcm9vdChycXN0cCwgJnRtcF9maCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAlpZiAodG1wX2ZoLmZoX2RlbnRyeSA9PSBjc3RhdGUtPmN1cnJlbnRfZmguZmhfZGVudHJ5KSB7CiAJCWZoX3B1dCgmdG1wX2ZoKTsKQEAgLTYxMSw2ICs2MTEsMzAgQEAKIH0KIAogc3RhdGljIF9fYmUzMgorbmZzZDRfc2VjaW5mbyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKKwkgICAgICBzdHJ1Y3QgbmZzZDRfc2VjaW5mbyAqc2VjaW5mbykKK3sKKwlzdHJ1Y3Qgc3ZjX2ZoIHJlc2ZoOworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCV9fYmUzMiBlcnI7CisKKwlmaF9pbml0KCZyZXNmaCwgTkZTNF9GSFNJWkUpOworCWVyciA9IG5mc2RfbG9va3VwX2RlbnRyeShycXN0cCwgJmNzdGF0ZS0+Y3VycmVudF9maCwKKwkJCQkgICAgc2VjaW5mby0+c2lfbmFtZSwgc2VjaW5mby0+c2lfbmFtZWxlbiwKKwkJCQkgICAgJmV4cCwgJmRlbnRyeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKKwkJZXhwX3B1dChleHApOworCQllcnIgPSBuZnNlcnJfbm9lbnQ7CisJfSBlbHNlCisJCXNlY2luZm8tPnNpX2V4cCA9IGV4cDsKKwlkcHV0KGRlbnRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIF9fYmUzMgogbmZzZDRfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRfc3RhdGUgKmNzdGF0ZSwKIAkgICAgICBzdHJ1Y3QgbmZzZDRfc2V0YXR0ciAqc2V0YXR0cikKIHsKQEAgLTEwMDksNiArMTAzMyw5IEBACiAJW09QX1NBVkVGSF0gPSB7CiAJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9zYXZlZmgsCiAJfSwKKwlbT1BfU0VDSU5GT10gPSB7CisJCS5vcF9mdW5jID0gKG5mc2Q0b3BfZnVuYyluZnNkNF9zZWNpbmZvLAorCX0sCiAJW09QX1NFVEFUVFJdID0gewogCQkub3BfZnVuYyA9IChuZnNkNG9wX2Z1bmMpbmZzZDRfc2V0YXR0ciwKIAl9LApkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggOGM1MjkxMy4uZTRhNGM4NyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC00OSw4ICs0OSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3hkcjQuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZICAgICAgICAgICAgICAgIE5GU0REQkdfUFJPQwogCkBAIC0xNDksNiArMTUxLDcgQEAKIH0KIAogc3RhdGljIGludCBudW1fZGVsZWdhdGlvbnM7Cit1bnNpZ25lZCBpbnQgbWF4X2RlbGVnYXRpb25zOwogCiAvKgogICogT3BlbiBvd25lciBzdGF0ZSAoc2hhcmUgbG9ja3MpCkBAIC0xOTIsNyArMTk1LDkgQEAKIAlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmc3RwLT5zdF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsX2NhbGxiYWNrOwogCiAJZHByaW50aygiTkZTRCBhbGxvY19pbml0X2RlbGVnXG4iKTsKLQlpZiAobnVtX2RlbGVnYXRpb25zID4gU1RBVEVJRF9IQVNIX1NJWkUgKiA0KQorCWlmIChmcC0+ZmlfaGFkX2NvbmZsaWN0KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAobnVtX2RlbGVnYXRpb25zID4gbWF4X2RlbGVnYXRpb25zKQogCQlyZXR1cm4gTlVMTDsKIAlkcCA9IGttZW1fY2FjaGVfYWxsb2MoZGVsZWdfc2xhYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRwID09IE5VTEwpCkBAIC05OTksNiArMTAwNCw3IEBACiAJCWxpc3RfYWRkKCZmcC0+ZmlfaGFzaCwgJmZpbGVfaGFzaHRibFtoYXNodmFsXSk7CiAJCWZwLT5maV9pbm9kZSA9IGlncmFiKGlubyk7CiAJCWZwLT5maV9pZCA9IGN1cnJlbnRfZmlsZWlkKys7CisJCWZwLT5maV9oYWRfY29uZmxpY3QgPSBmYWxzZTsKIAkJcmV0dXJuIGZwOwogCX0KIAlyZXR1cm4gTlVMTDsKQEAgLTEzMjUsNiArMTMzMSw3IEBACiB7CiAJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBfX2RwOwogCisJZHAtPmRsX2ZpbGUtPmZpX2hhZF9jb25mbGljdCA9IHRydWU7CiAJbmZzZDRfY2JfcmVjYWxsKGRwKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMxOTAsMjAgKzMxOTcsNDkgQEAKIAkJcHJpbnRrKCJORlNEOiBGYWlsdXJlIHJlYWRpbmcgcmVib290IHJlY292ZXJ5IGRhdGFcbiIpOwogfQogCit1bnNpZ25lZCBsb25nCitnZXRfbmZzNF9ncmFjZV9wZXJpb2Qodm9pZCkKK3sKKwlyZXR1cm4gbWF4KHVzZXJfbGVhc2VfdGltZSwgbGVhc2VfdGltZSkgKiBIWjsKK30KKworLyoKKyAqIFNpbmNlIHRoZSBsaWZldGltZSBvZiBhIGRlbGVnYXRpb24gaXNuJ3QgbGltaXRlZCB0byB0aGF0IG9mIGFuIG9wZW4sIGEKKyAqIGNsaWVudCBtYXkgcXVpdGUgcmVhc29uYWJseSBoYW5nIG9uIHRvIGEgZGVsZWdhdGlvbiBhcyBsb25nIGFzIGl0IGhhcworICogdGhlIGlub2RlIGNhY2hlZC4gIFRoaXMgYmVjb21lcyBhbiBvYnZpb3VzIHByb2JsZW0gdGhlIGZpcnN0IHRpbWUgYQorICogY2xpZW50J3MgaW5vZGUgY2FjaGUgYXBwcm9hY2hlcyB0aGUgc2l6ZSBvZiB0aGUgc2VydmVyJ3MgdG90YWwgbWVtb3J5LgorICoKKyAqIEZvciBub3cgd2UgYXZvaWQgdGhpcyBwcm9ibGVtIGJ5IGltcG9zaW5nIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyCisgKiBvZiBkZWxlZ2F0aW9ucywgd2hpY2ggdmFyaWVzIGFjY29yZGluZyB0byB0aGUgc2VydmVyJ3MgbWVtb3J5IHNpemUuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbWF4X2RlbGVnYXRpb25zKHZvaWQpCit7CisJLyoKKwkgKiBBbGxvdyBhdCBtb3N0IDQgZGVsZWdhdGlvbnMgcGVyIG1lZ2FieXRlIG9mIFJBTS4gIFF1aWNrCisJICogZXN0aW1hdGVzIHN1Z2dlc3QgdGhhdCBpbiB0aGUgd29yc3QgY2FzZSAod2hlcmUgZXZlcnkgZGVsZWdhdGlvbgorCSAqIGlzIGZvciBhIGRpZmZlcmVudCBpbm9kZSksIGEgZGVsZWdhdGlvbiBjb3VsZCB0YWtlIGFib3V0IDEuNUssCisJICogZ2l2aW5nIGEgd29yc3QgY2FzZSB1c2FnZSBvZiBhYm91dCA2JSBvZiBtZW1vcnkuCisJICovCisJbWF4X2RlbGVnYXRpb25zID0gbnJfZnJlZV9idWZmZXJfcGFnZXMoKSA+PiAoMjAgLSAyIC0gUEFHRV9TSElGVCk7Cit9CisKIC8qIGluaXRpYWxpemF0aW9uIHRvIHBlcmZvcm0gd2hlbiB0aGUgbmZzZCBzZXJ2aWNlIGlzIHN0YXJ0ZWQ6ICovCiAKIHN0YXRpYyB2b2lkCiBfX25mczRfc3RhdGVfc3RhcnQodm9pZCkKIHsKLQl0aW1lX3QgZ3JhY2VfdGltZTsKKwl1bnNpZ25lZCBsb25nIGdyYWNlX3RpbWU7CiAKIAlib290X3RpbWUgPSBnZXRfc2Vjb25kcygpOwotCWdyYWNlX3RpbWUgPSBtYXgodXNlcl9sZWFzZV90aW1lLCBsZWFzZV90aW1lKTsKKwlncmFjZV90aW1lID0gZ2V0X25mc19ncmFjZV9wZXJpb2QoKTsKIAlsZWFzZV90aW1lID0gdXNlcl9sZWFzZV90aW1lOwogCWluX2dyYWNlID0gMTsKLQlwcmludGsoIk5GU0Q6IHN0YXJ0aW5nICVsZC1zZWNvbmQgZ3JhY2UgcGVyaW9kXG4iLCBncmFjZV90aW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICJORlNEOiBzdGFydGluZyAlbGQtc2Vjb25kIGdyYWNlIHBlcmlvZFxuIiwKKwkgICAgICAgZ3JhY2VfdGltZS9IWik7CiAJbGF1bmRyeV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJuZnNkNCIpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhsYXVuZHJ5X3dxLCAmbGF1bmRyb21hdF93b3JrLCBncmFjZV90aW1lKkhaKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsobGF1bmRyeV93cSwgJmxhdW5kcm9tYXRfd29yaywgZ3JhY2VfdGltZSk7CisJc2V0X21heF9kZWxlZ2F0aW9ucygpOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggMTU4MDlkZi4uYjNkNTVjNiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTU2LDYgKzU2LDggQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkX2lkbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNC5oPgogI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2dzc19hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaD4KIAogI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1hEUgogCkBAIC04MTksNiArODIxLDIzIEBACiB9CiAKIHN0YXRpYyBfX2JlMzIKK25mc2Q0X2RlY29kZV9zZWNpbmZvKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsCisJCSAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm8gKnNlY2luZm8pCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoc2VjaW5mby0+c2lfbmFtZWxlbik7CisJUkVBRF9CVUYoc2VjaW5mby0+c2lfbmFtZWxlbik7CisJU0FWRU1FTShzZWNpbmZvLT5zaV9uYW1lLCBzZWNpbmZvLT5zaV9uYW1lbGVuKTsKKwlzdGF0dXMgPSBjaGVja19maWxlbmFtZShzZWNpbmZvLT5zaV9uYW1lLCBzZWNpbmZvLT5zaV9uYW1lbGVuLAorCQkJCQkJCQluZnNlcnJfbm9lbnQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBfX2JlMzIKIG5mc2Q0X2RlY29kZV9zZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQogewogCURFQ09ERV9IRUFEOwpAQCAtMTEzMSw2ICsxMTUwLDkgQEAKIAkJY2FzZSBPUF9TQVZFRkg6CiAJCQlvcC0+c3RhdHVzID0gbmZzX29rOwogCQkJYnJlYWs7CisJCWNhc2UgT1BfU0VDSU5GTzoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfc2VjaW5mbyhhcmdwLCAmb3AtPnUuc2VjaW5mbyk7CisJCQlicmVhazsKIAkJY2FzZSBPUF9TRVRBVFRSOgogCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zZXRhdHRyKGFyZ3AsICZvcC0+dS5zZXRhdHRyKTsKIAkJCWJyZWFrOwpAQCAtMTI5Niw3ICsxMzE4LDcgQEAKIAljaGFyICpwYXRoLCAqcm9vdHBhdGg7CiAKIAlmaF9pbml0KCZ0bXBfZmgsIE5GUzRfRkhTSVpFKTsKLQkqc3RhdCA9IGV4cF9wc2V1ZG9yb290KHJxc3RwLT5ycV9jbGllbnQsICZ0bXBfZmgsICZycXN0cC0+cnFfY2hhbmRsZSk7CisJKnN0YXQgPSBleHBfcHNldWRvcm9vdChycXN0cCwgJnRtcF9maCk7CiAJaWYgKCpzdGF0KQogCQlyZXR1cm4gTlVMTDsKIAlyb290cGF0aCA9IHRtcF9maC5maF9leHBvcnQtPmV4X3BhdGg7CkBAIC0xODQ3LDExICsxODY5LDE5IEBACiAJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CiAJCWludCBlcnI7CiAKKwkJLyoKKwkJICogV2h5IHRoZSBoZWNrIGFyZW4ndCB3ZSBqdXN0IHVzaW5nIG5mc2RfbG9va3VwPz8KKwkJICogRGlmZmVyZW50ICIuIi8iLi4iIGhhbmRsaW5nPyAgU29tZXRoaW5nIGVsc2U/CisJCSAqIEF0IGxlYXN0LCBhZGQgYSBjb21tZW50IGhlcmUgdG8gZXhwbGFpbi4uLi4KKwkJICovCiAJCWVyciA9IG5mc2RfY3Jvc3NfbW50KGNkLT5yZF9ycXN0cCwgJmRlbnRyeSwgJmV4cCk7CiAJCWlmIChlcnIpIHsKIAkJCW5mc2VyciA9IG5mc2Vycm5vKGVycik7CiAJCQlnb3RvIG91dF9wdXQ7CiAJCX0KKwkJbmZzZXJyID0gY2hlY2tfbmZzZF9hY2Nlc3MoZXhwLCBjZC0+cmRfcnFzdHApOworCQlpZiAobmZzZXJyKQorCQkJZ290byBvdXRfcHV0OwogCiAJfQogCW5mc2VyciA9IG5mc2Q0X2VuY29kZV9mYXR0cihOVUxMLCBleHAsIGRlbnRyeSwgcCwgYnVmbGVuLCBjZC0+cmRfYm12YWwsCkBAIC0yNDE5LDYgKzI0NDksNzIgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfc2VjaW5mbyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsCisJCSAgICAgc3RydWN0IG5mc2Q0X3NlY2luZm8gKnNlY2luZm8pCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSBzZWNpbmZvLT5zaV9leHA7CisJdTMyIG5mbGF2czsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvICpmbGF2czsKKwlzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvIGRlZl9mbGF2c1syXTsKKwlFTkNPREVfSEVBRDsKKworCWlmIChuZnNlcnIpCisJCWdvdG8gb3V0OworCWlmIChleHAtPmV4X25mbGF2b3JzKSB7CisJCWZsYXZzID0gZXhwLT5leF9mbGF2b3JzOworCQluZmxhdnMgPSBleHAtPmV4X25mbGF2b3JzOworCX0gZWxzZSB7IC8qIEhhbmRsaW5nIG9mIHNvbWUgZGVmYXVsdHMgaW4gYWJzZW5jZSBvZiByZWFsIHNlY2luZm86ICovCisJCWZsYXZzID0gZGVmX2ZsYXZzOworCQlpZiAoZXhwLT5leF9jbGllbnQtPmZsYXZvdXItPmZsYXZvdXIgPT0gUlBDX0FVVEhfVU5JWCkgeworCQkJbmZsYXZzID0gMjsKKwkJCWZsYXZzWzBdLnBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7CisJCQlmbGF2c1sxXS5wc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9OVUxMOworCQl9IGVsc2UgaWYgKGV4cC0+ZXhfY2xpZW50LT5mbGF2b3VyLT5mbGF2b3VyID09IFJQQ19BVVRIX0dTUykgeworCQkJbmZsYXZzID0gMTsKKwkJCWZsYXZzWzBdLnBzZXVkb2ZsYXZvcgorCQkJCQk9IHN2Y2F1dGhfZ3NzX2ZsYXZvcihleHAtPmV4X2NsaWVudCk7CisJCX0gZWxzZSB7CisJCQluZmxhdnMgPSAxOworCQkJZmxhdnNbMF0ucHNldWRvZmxhdm9yCisJCQkJCT0gZXhwLT5leF9jbGllbnQtPmZsYXZvdXItPmZsYXZvdXI7CisJCX0KKwl9CisKKwlSRVNFUlZFX1NQQUNFKDQpOworCVdSSVRFMzIobmZsYXZzKTsKKwlBREpVU1RfQVJHUygpOworCWZvciAoaSA9IDA7IGkgPCBuZmxhdnM7IGkrKykgeworCQl1MzIgZmxhdiA9IGZsYXZzW2ldLnBzZXVkb2ZsYXZvcjsKKwkJc3RydWN0IGdzc19hcGlfbWVjaCAqZ20gPSBnc3NfbWVjaF9nZXRfYnlfcHNldWRvZmxhdm9yKGZsYXYpOworCisJCWlmIChnbSkgeworCQkJUkVTRVJWRV9TUEFDRSg0KTsKKwkJCVdSSVRFMzIoUlBDX0FVVEhfR1NTKTsKKwkJCUFESlVTVF9BUkdTKCk7CisJCQlSRVNFUlZFX1NQQUNFKDQgKyBnbS0+Z21fb2lkLmxlbik7CisJCQlXUklURTMyKGdtLT5nbV9vaWQubGVuKTsKKwkJCVdSSVRFTUVNKGdtLT5nbV9vaWQuZGF0YSwgZ20tPmdtX29pZC5sZW4pOworCQkJQURKVVNUX0FSR1MoKTsKKwkJCVJFU0VSVkVfU1BBQ0UoNCk7CisJCQlXUklURTMyKDApOyAvKiBxb3AgKi8KKwkJCUFESlVTVF9BUkdTKCk7CisJCQlSRVNFUlZFX1NQQUNFKDQpOworCQkJV1JJVEUzMihnc3NfcHNldWRvZmxhdm9yX3RvX3NlcnZpY2UoZ20sIGZsYXYpKTsKKwkJCUFESlVTVF9BUkdTKCk7CisJCQlnc3NfbWVjaF9wdXQoZ20pOworCQl9IGVsc2UgeworCQkJUkVTRVJWRV9TUEFDRSg0KTsKKwkJCVdSSVRFMzIoZmxhdik7CisJCQlBREpVU1RfQVJHUygpOworCQl9CisJfQorb3V0OgorCWlmIChleHApCisJCWV4cF9wdXQoZXhwKTsKK30KKwogLyoKICAqIFRoZSBTRVRBVFRSIGVuY29kZSByb3V0aW5lIGlzIHNwZWNpYWwgLS0gaXQgYWx3YXlzIGVuY29kZXMgYSBiaXRtYXAsCiAgKiByZWdhcmRsZXNzIG9mIHRoZSBlcnJvciBzdGF0dXMuCkBAIC0yNTU5LDYgKzI2NTUsOSBAQAogCQlicmVhazsKIAljYXNlIE9QX1NBVkVGSDoKIAkJYnJlYWs7CisJY2FzZSBPUF9TRUNJTkZPOgorCQluZnNkNF9lbmNvZGVfc2VjaW5mbyhyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuc2VjaW5mbyk7CisJCWJyZWFrOwogCWNhc2UgT1BfU0VUQVRUUjoKIAkJbmZzZDRfZW5jb2RlX3NldGF0dHIocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnNldGF0dHIpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzY3RsLmMgYi9mcy9uZnNkL25mc2N0bC5jCmluZGV4IDcxYzY4NmQuLmJhYWM4OWQgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzY3RsLmMKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc2QvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL3hkci5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3lzY2FsbC5oPgotI2luY2x1ZGUgPGxpbnV4L25mc2QvaW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0yNDUsNyArMjQ0LDcgQEAKIAl9CiAJZXhwX3JlYWR1bmxvY2soKTsKIAlpZiAoZXJyID09IDApCi0JCWVyciA9IHJlcy0+Zmhfc2l6ZSArIChpbnQpJigoc3RydWN0IGtuZnNkX2ZoKikwKS0+ZmhfYmFzZTsKKwkJZXJyID0gcmVzLT5maF9zaXplICsgb2Zmc2V0b2Yoc3RydWN0IGtuZnNkX2ZoLCBmaF9iYXNlKTsKICBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzZmguYyBiL2ZzL25mc2QvbmZzZmguYwppbmRleCA2Y2EyZDI0Li4wZWI0NjRhIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc2ZoLmMKKysrIGIvZnMvbmZzZC9uZnNmaC5jCkBAIC0xNSwxMCArMTUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19GSApAQCAtMjcsMTAgKzI5LDYgQEAKIHN0YXRpYyBpbnQgbmZzZF9ucl92ZXJpZmllZDsKIHN0YXRpYyBpbnQgbmZzZF9ucl9wdXQ7CiAKLWV4dGVybiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXhwb3J0X29wX2RlZmF1bHQ7Ci0KLSNkZWZpbmUJQ0FMTChvcHMsZnVuKSAoKG9wcy0+ZnVuKT8ob3BzLT5mdW4pOmV4cG9ydF9vcF9kZWZhdWx0LmZ1bikKLQogLyoKICAqIG91ciBhY2NlcHRhYmlsaXR5IGZ1bmN0aW9uLgogICogaWYgTk9TVUJUUkVFQ0hFQ0ssIGFjY2VwdCBhbnl0aGluZwpAQCAtMTIzLDggKzEyMSw2IEBACiAJCWludCBkYXRhX2xlZnQgPSBmaC0+Zmhfc2l6ZS80OwogCiAJCWVycm9yID0gbmZzZXJyX3N0YWxlOwotCQlpZiAocnFzdHAtPnJxX2NsaWVudCA9PSBOVUxMKQotCQkJZ290byBvdXQ7CiAJCWlmIChycXN0cC0+cnFfdmVycyA+IDIpCiAJCQllcnJvciA9IG5mc2Vycl9iYWRoYW5kbGU7CiAJCWlmIChycXN0cC0+cnFfdmVycyA9PSA0ICYmIGZoLT5maF9zaXplID09IDApCkBAIC0xNDgsNyArMTQ0LDcgQEAKIAkJCQlmaC0+ZmhfZnNpZFsxXSA9IGZoLT5maF9mc2lkWzJdOwogCQkJfQogCQkJaWYgKChkYXRhX2xlZnQgLT0gbGVuKTwwKSBnb3RvIG91dDsKLQkJCWV4cCA9IGV4cF9maW5kKHJxc3RwLT5ycV9jbGllbnQsIGZoLT5maF9mc2lkX3R5cGUsIGRhdGFwLCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCQkJZXhwID0gcnFzdF9leHBfZmluZChycXN0cCwgZmgtPmZoX2ZzaWRfdHlwZSwgZGF0YXApOwogCQkJZGF0YXAgKz0gbGVuOwogCQl9IGVsc2UgewogCQkJZGV2X3QgeGRldjsKQEAgLTE1OSwyMCArMTU1LDE4IEBACiAJCQl4ZGV2ID0gb2xkX2RlY29kZV9kZXYoZmgtPm9maF94ZGV2KTsKIAkJCXhpbm8gPSB1MzJfdG9faW5vX3QoZmgtPm9maF94aW5vKTsKIAkJCW1rX2ZzaWQoRlNJRF9ERVYsIHRmaCwgeGRldiwgeGlubywgMCwgTlVMTCk7Ci0JCQlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCBGU0lEX0RFViwgdGZoLAotCQkJCSAgICAgICAmcnFzdHAtPnJxX2NoYW5kbGUpOworCQkJZXhwID0gcnFzdF9leHBfZmluZChycXN0cCwgRlNJRF9ERVYsIHRmaCk7CiAJCX0KIAotCQlpZiAoSVNfRVJSKGV4cCkgJiYgKFBUUl9FUlIoZXhwKSA9PSAtRUFHQUlOCi0JCQkJfHwgUFRSX0VSUihleHApID09IC1FVElNRURPVVQpKSB7CisJCWVycm9yID0gbmZzZXJyX3N0YWxlOworCQlpZiAoUFRSX0VSUihleHApID09IC1FTk9FTlQpCisJCQlnb3RvIG91dDsKKworCQlpZiAoSVNfRVJSKGV4cCkpIHsKIAkJCWVycm9yID0gbmZzZXJybm8oUFRSX0VSUihleHApKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJZXJyb3IgPSBuZnNlcnJfc3RhbGU7IAotCQlpZiAoIWV4cCB8fCBJU19FUlIoZXhwKSkKLQkJCWdvdG8gb3V0OwotCiAJCS8qIENoZWNrIGlmIHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQgZnJvbSBhIHNlY3VyZSBwb3J0LiAqLwogCQllcnJvciA9IG5mc2Vycl9wZXJtOwogCQlpZiAoIXJxc3RwLT5ycV9zZWN1cmUgJiYgRVhfU0VDVVJFKGV4cCkpIHsKQEAgLTIxMSwxMSArMjA1LDkgQEAKIAkJaWYgKGZpbGVpZF90eXBlID09IDApCiAJCQlkZW50cnkgPSBkZ2V0KGV4cC0+ZXhfZGVudHJ5KTsKIAkJZWxzZSB7Ci0JCQlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IGV4cC0+ZXhfbW50LT5tbnRfc2ItPnNfZXhwb3J0X29wOwotCQkJZGVudHJ5ID0gQ0FMTChub3AsZGVjb2RlX2ZoKShleHAtPmV4X21udC0+bW50X3NiLAotCQkJCQkJICAgICBkYXRhcCwgZGF0YV9sZWZ0LAotCQkJCQkJICAgICBmaWxlaWRfdHlwZSwKLQkJCQkJCSAgICAgbmZzZF9hY2NlcHRhYmxlLCBleHApOworCQkJZGVudHJ5ID0gZXhwb3J0ZnNfZGVjb2RlX2ZoKGV4cC0+ZXhfbW50LCBkYXRhcCwKKwkJCQkJZGF0YV9sZWZ0LCBmaWxlaWRfdHlwZSwKKwkJCQkJbmZzZF9hY2NlcHRhYmxlLCBleHApOwogCQl9CiAJCWlmIChkZW50cnkgPT0gTlVMTCkKIAkJCWdvdG8gb3V0OwpAQCAtMjU3LDggKzI0OSwxOSBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKKwlpZiAoIShhY2Nlc3MgJiBNQVlfTE9DSykpIHsKKwkJLyoKKwkJICogcHNldWRvZmxhdm9yIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIG9uIE5MTSwKKwkJICogd2hpY2ggY2xpZW50cyB2aXJ0dWFsbHkgYWx3YXlzIHVzZSBhdXRoX3N5cyBmb3IsCisJCSAqIGV2ZW4gd2hpbGUgdXNpbmcgUlBDU0VDX0dTUyBmb3IgTkZTLgorCQkgKi8KKwkJZXJyb3IgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIHJxc3RwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCiAJLyogRmluYWxseSwgY2hlY2sgYWNjZXNzIHBlcm1pc3Npb25zLiAqLwotCWVycm9yID0gbmZzZF9wZXJtaXNzaW9uKGV4cCwgZGVudHJ5LCBhY2Nlc3MpOworCWVycm9yID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBleHAsIGRlbnRyeSwgYWNjZXNzKTsKIAogCWlmIChlcnJvcikgewogCQlkcHJpbnRrKCJmaF92ZXJpZnk6ICVzLyVzIHBlcm1pc3Npb24gZmFpbHVyZSwgIgpAQCAtMjg2LDE1ICsyODksMTMgQEAKIHN0YXRpYyBpbmxpbmUgaW50IF9maF91cGRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAogCQkJICAgICBfX3UzMiAqZGF0YXAsIGludCAqbWF4c2l6ZSkKIHsKLQlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IGV4cC0+ZXhfbW50LT5tbnRfc2ItPnNfZXhwb3J0X29wOwotCiAJaWYgKGRlbnRyeSA9PSBleHAtPmV4X2RlbnRyeSkgewogCQkqbWF4c2l6ZSA9IDA7CiAJCXJldHVybiAwOwogCX0KIAotCXJldHVybiBDQUxMKG5vcCxlbmNvZGVfZmgpKGRlbnRyeSwgZGF0YXAsIG1heHNpemUsCi0JCQkgICEoZXhwLT5leF9mbGFncyZORlNFWFBfTk9TVUJUUkVFQ0hFQ0spKTsKKwlyZXR1cm4gZXhwb3J0ZnNfZW5jb2RlX2ZoKGRlbnRyeSwgZGF0YXAsIG1heHNpemUsCisJCQkgICEoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9OT1NVQlRSRUVDSEVDSykpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNwcm9jLmMgYi9mcy9uZnNkL25mc3Byb2MuYwppbmRleCBiMmM3MTQ3Li45NzdhNzFmIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3Byb2MuYworKysgYi9mcy9uZnNkL25mc3Byb2MuYwpAQCAtMjc4LDcgKzI3OCw4IEBACiAJCQkJCSAqICAgZWNobyB0aGluZyA+IGRldmljZS1zcGVjaWFsLWZpbGUtb3ItcGlwZQogCQkJCQkgKiBieSBkb2luZyBhIENSRUFURSB3aXRoIHR5cGU9PTAKIAkJCQkJICovCi0JCQkJCW5mc2VyciA9IG5mc2RfcGVybWlzc2lvbihuZXdmaHAtPmZoX2V4cG9ydCwKKwkJCQkJbmZzZXJyID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLAorCQkJCQkJCQkgbmV3ZmhwLT5maF9leHBvcnQsCiAJCQkJCQkJCSBuZXdmaHAtPmZoX2RlbnRyeSwKIAkJCQkJCQkJIE1BWV9XUklURXxNQVlfTE9DQUxfQUNDRVNTKTsKIAkJCQkJaWYgKG5mc2VyciAmJiBuZnNlcnIgIT0gbmZzZXJyX3JvZnMpCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3N2Yy5jIGIvZnMvbmZzZC9uZnNzdmMuYwppbmRleCBmZjU1OTUwLi5hOGM4OWFlIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3N2Yy5jCisrKyBiL2ZzL25mc2QvbmZzc3ZjLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvdHlwZXMuaD4KQEAgLTQzMiw2ICs0MzMsNyBAQAogCSAqIGRpcnR5IHBhZ2VzLgogCSAqLwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX0xFU1NfVEhST1RUTEU7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJLyoKIAkgKiBUaGUgbWFpbiByZXF1ZXN0IGxvb3AKQEAgLTQ5Miw2ICs0OTQsMTUgQEAKIAltb2R1bGVfcHV0X2FuZF9leGl0KDApOwogfQogCitzdGF0aWMgX19iZTMyIG1hcF9uZXdfZXJyb3JzKHUzMiB2ZXJzLCBfX2JlMzIgbmZzZXJyKQoreworCWlmIChuZnNlcnIgPT0gbmZzZXJyX2p1a2Vib3ggJiYgdmVycyA9PSAyKQorCQlyZXR1cm4gbmZzZXJyX2Ryb3BpdDsKKwlpZiAobmZzZXJyID09IG5mc2Vycl93cm9uZ3NlYyAmJiB2ZXJzIDwgNCkKKwkJcmV0dXJuIG5mc2Vycl9hY2NlczsKKwlyZXR1cm4gbmZzZXJyOworfQorCiBpbnQKIG5mc2RfZGlzcGF0Y2goc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX19iZTMyICpzdGF0cCkKIHsKQEAgLTUzNCw2ICs1NDUsNyBAQAogCiAJLyogTm93IGNhbGwgdGhlIHByb2NlZHVyZSBoYW5kbGVyLCBhbmQgZW5jb2RlIE5GUyBzdGF0dXMuICovCiAJbmZzZXJyID0gcHJvYy0+cGNfZnVuYyhycXN0cCwgcnFzdHAtPnJxX2FyZ3AsIHJxc3RwLT5ycV9yZXNwKTsKKwluZnNlcnIgPSBtYXBfbmV3X2Vycm9ycyhycXN0cC0+cnFfdmVycywgbmZzZXJyKTsKIAlpZiAobmZzZXJyID09IG5mc2Vycl9qdWtlYm94ICYmIHJxc3RwLT5ycV92ZXJzID09IDIpCiAJCW5mc2VyciA9IG5mc2Vycl9kcm9waXQ7CiAJaWYgKG5mc2VyciA9PSBuZnNlcnJfZHJvcGl0KSB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCA5NDViMWNlLi5lOTBmNGE4IDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAJd2hpbGUgKGZvbGxvd19kb3duKCZtbnQsJm1vdW50cykmJmRfbW91bnRwb2ludChtb3VudHMpKTsKIAotCWV4cDIgPSBleHBfZ2V0X2J5X25hbWUoZXhwLT5leF9jbGllbnQsIG1udCwgbW91bnRzLCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCWV4cDIgPSBycXN0X2V4cF9nZXRfYnlfbmFtZShycXN0cCwgbW50LCBtb3VudHMpOwogCWlmIChJU19FUlIoZXhwMikpIHsKIAkJZXJyID0gUFRSX0VSUihleHAyKTsKIAkJZHB1dChtb3VudHMpOwpAQCAtMTM1LDIxICsxMzUsMTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogTG9vayB1cCBvbmUgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUuCi0gKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gZmhwIGFuZCByZXNmaCBuZWVkIGFuIGZoX3B1dAotICoKLSAqIElmIHRoZSBsb29rdXAgd291bGQgY3Jvc3MgYSBtb3VudHBvaW50LCBhbmQgdGhlIG1vdW50ZWQgZmlsZXN5c3RlbQotICogaXMgZXhwb3J0ZWQgdG8gdGhlIGNsaWVudCB3aXRoIE5GU0VYUF9OT0hJREUsIHRoZW4gdGhlIGxvb2t1cCBpcwotICogYWNjZXB0ZWQgYXMgaXQgc3RhbmRzIGFuZCB0aGUgbW91bnRlZCBkaXJlY3RvcnkgaXMKLSAqIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGNvdmVyZWQgZGlyZWN0b3J5IGlzIHJldHVybmVkLgotICogTk9URTogdGhpcyBtb3VudHBvaW50IGNyb3NzaW5nIGlzIG5vdCBzdXBwb3J0ZWQgcHJvcGVybHkgYnkgYWxsCi0gKiAgIGNsaWVudHMgYW5kIGlzIGV4cGxpY2l0bHkgZGlzYWxsb3dlZCBmb3IgTkZTdjMKLSAqICAgICAgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+Ci0gKi8KIF9fYmUzMgotbmZzZF9sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQlpbnQgbGVuLCBzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaCkKK25mc2RfbG9va3VwX2RlbnRyeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgIHN0cnVjdCBzdmNfZXhwb3J0ICoqZXhwX3JldCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeV9yZXQpCiB7CiAJc3RydWN0IHN2Y19leHBvcnQJKmV4cDsKIAlzdHJ1Y3QgZGVudHJ5CQkqZHBhcmVudDsKQEAgLTE2OCw4ICsxNTcsNiBAQAogCWV4cCAgPSBmaHAtPmZoX2V4cG9ydDsKIAlleHBfZ2V0KGV4cCk7CiAKLQllcnIgPSBuZnNlcnJfYWNjZXM7Ci0KIAkvKiBMb29rdXAgdGhlIG5hbWUsIGJ1dCBkb24ndCBmb2xsb3cgbGlua3MgKi8KIAlpZiAoaXNkb3RlbnQobmFtZSwgbGVuKSkgewogCQlpZiAobGVuPT0xKQpAQCAtMTkwLDE3ICsxNzcsMTUgQEAKIAkJCWRwdXQoZGVudHJ5KTsKIAkJCWRlbnRyeSA9IGRwOwogCi0JCQlleHAyID0gZXhwX3BhcmVudChleHAtPmV4X2NsaWVudCwgbW50LCBkZW50cnksCi0JCQkJCSAgJnJxc3RwLT5ycV9jaGFuZGxlKTsKLQkJCWlmIChJU19FUlIoZXhwMikpIHsKKwkJCWV4cDIgPSBycXN0X2V4cF9wYXJlbnQocnFzdHAsIG1udCwgZGVudHJ5KTsKKwkJCWlmIChQVFJfRVJSKGV4cDIpID09IC1FTk9FTlQpIHsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJZGVudHJ5ID0gZGdldChkcGFyZW50KTsKKwkJCX0gZWxzZSBpZiAoSVNfRVJSKGV4cDIpKSB7CiAJCQkJaG9zdF9lcnIgPSBQVFJfRVJSKGV4cDIpOwogCQkJCWRwdXQoZGVudHJ5KTsKIAkJCQltbnRwdXQobW50KTsKIAkJCQlnb3RvIG91dF9uZnNlcnI7Ci0JCQl9Ci0JCQlpZiAoIWV4cDIpIHsKLQkJCQlkcHV0KGRlbnRyeSk7Ci0JCQkJZGVudHJ5ID0gZGdldChkcGFyZW50KTsKIAkJCX0gZWxzZSB7CiAJCQkJZXhwX3B1dChleHApOwogCQkJCWV4cCA9IGV4cDI7CkBAIC0yMjMsNiArMjA4LDQxIEBACiAJCQl9CiAJCX0KIAl9CisJKmRlbnRyeV9yZXQgPSBkZW50cnk7CisJKmV4cF9yZXQgPSBleHA7CisJcmV0dXJuIDA7CisKK291dF9uZnNlcnI6CisJZXhwX3B1dChleHApOworCXJldHVybiBuZnNlcnJubyhob3N0X2Vycik7Cit9CisKKy8qCisgKiBMb29rIHVwIG9uZSBjb21wb25lbnQgb2YgYSBwYXRobmFtZS4KKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmaHAgYW5kIHJlc2ZoIG5lZWQgYW4gZmhfcHV0CisgKgorICogSWYgdGhlIGxvb2t1cCB3b3VsZCBjcm9zcyBhIG1vdW50cG9pbnQsIGFuZCB0aGUgbW91bnRlZCBmaWxlc3lzdGVtCisgKiBpcyBleHBvcnRlZCB0byB0aGUgY2xpZW50IHdpdGggTkZTRVhQX05PSElERSwgdGhlbiB0aGUgbG9va3VwIGlzCisgKiBhY2NlcHRlZCBhcyBpdCBzdGFuZHMgYW5kIHRoZSBtb3VudGVkIGRpcmVjdG9yeSBpcworICogcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgY292ZXJlZCBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCisgKiBOT1RFOiB0aGlzIG1vdW50cG9pbnQgY3Jvc3NpbmcgaXMgbm90IHN1cHBvcnRlZCBwcm9wZXJseSBieSBhbGwKKyAqICAgY2xpZW50cyBhbmQgaXMgZXhwbGljaXRseSBkaXNhbGxvd2VkIGZvciBORlN2MworICogICAgICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKyAqLworX19iZTMyCituZnNkX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCWludCBsZW4sIHN0cnVjdCBzdmNfZmggKnJlc2ZoKQoreworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKKwlfX2JlMzIgZXJyOworCisJZXJyID0gbmZzZF9sb29rdXBfZGVudHJ5KHJxc3RwLCBmaHAsIG5hbWUsIGxlbiwgJmV4cCwgJmRlbnRyeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBjaGVja19uZnNkX2FjY2VzcyhleHAsIHJxc3RwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAkvKgogCSAqIE5vdGU6IHdlIGNvbXBvc2UgdGhlIGZpbGUgaGFuZGxlIG5vdywgYnV0IGFzIHRoZQogCSAqIGRlbnRyeSBtYXkgYmUgbmVnYXRpdmUsIGl0IG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQuCkBAIC0yMzAsMTYgKzI1MCwxMyBAQAogCWVyciA9IGZoX2NvbXBvc2UocmVzZmgsIGV4cCwgZGVudHJ5LCBmaHApOwogCWlmICghZXJyICYmICFkZW50cnktPmRfaW5vZGUpCiAJCWVyciA9IG5mc2Vycl9ub2VudDsKLQlkcHV0KGRlbnRyeSk7CiBvdXQ6CisJZHB1dChkZW50cnkpOwogCWV4cF9wdXQoZXhwKTsKIAlyZXR1cm4gZXJyOwotCi1vdXRfbmZzZXJyOgotCWVyciA9IG5mc2Vycm5vKGhvc3RfZXJyKTsKLQlnb3RvIG91dDsKIH0KIAorCiAvKgogICogU2V0IHZhcmlvdXMgZmlsZSBhdHRyaWJ1dGVzLgogICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dApAQCAtMzExLDcgKzMyOCw3IEBACiAJLyogVGhlIHNpemUgY2FzZSBpcyBzcGVjaWFsLiBJdCBjaGFuZ2VzIHRoZSBmaWxlIGFzIHdlbGwgYXMgdGhlIGF0dHJpYnV0ZXMuICAqLwogCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CiAJCWlmIChpYXAtPmlhX3NpemUgPCBpbm9kZS0+aV9zaXplKSB7Ci0JCQllcnIgPSBuZnNkX3Blcm1pc3Npb24oZmhwLT5maF9leHBvcnQsIGRlbnRyeSwgTUFZX1RSVU5DfE1BWV9PV05FUl9PVkVSUklERSk7CisJCQllcnIgPSBuZnNkX3Blcm1pc3Npb24ocnFzdHAsIGZocC0+ZmhfZXhwb3J0LCBkZW50cnksIE1BWV9UUlVOQ3xNQVlfT1dORVJfT1ZFUlJJREUpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDM1LDcgKzQ1Miw3IEBACiAJLyogR2V0IGlub2RlICovCiAJZXJyb3IgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCAvKiBTX0lGUkVHICovLCBNQVlfU0FUVFIpOwogCWlmIChlcnJvcikKLQkJZ290byBvdXQ7CisJCXJldHVybiBlcnJvcjsKIAogCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OwogCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwpAQCAtNDQ0LDMzICs0NjEsMjUgQEAKIAogCWhvc3RfZXJyb3IgPSBuZnM0X2FjbF9uZnN2NF90b19wb3NpeChhY2wsICZwYWNsLCAmZHBhY2wsIGZsYWdzKTsKIAlpZiAoaG9zdF9lcnJvciA9PSAtRUlOVkFMKSB7Ci0JCWVycm9yID0gbmZzZXJyX2F0dHJub3RzdXBwOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycl9hdHRybm90c3VwcDsKIAl9IGVsc2UgaWYgKGhvc3RfZXJyb3IgPCAwKQogCQlnb3RvIG91dF9uZnNlcnI7CiAKIAlob3N0X2Vycm9yID0gc2V0X25mc3Y0X2FjbF9vbmUoZGVudHJ5LCBwYWNsLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKTsKIAlpZiAoaG9zdF9lcnJvciA8IDApCi0JCWdvdG8gb3V0X25mc2VycjsKKwkJZ290byBvdXRfcmVsZWFzZTsKIAotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCWhvc3RfZXJyb3IgPSBzZXRfbmZzdjRfYWNsX29uZShkZW50cnksIGRwYWNsLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCk7Ci0JCWlmIChob3N0X2Vycm9yIDwgMCkKLQkJCWdvdG8gb3V0X25mc2VycjsKLQl9CiAKLQllcnJvciA9IG5mc19vazsKLQotb3V0Ogorb3V0X3JlbGVhc2U6CiAJcG9zaXhfYWNsX3JlbGVhc2UocGFjbCk7CiAJcG9zaXhfYWNsX3JlbGVhc2UoZHBhY2wpOwotCXJldHVybiAoZXJyb3IpOwogb3V0X25mc2VycjoKIAlpZiAoaG9zdF9lcnJvciA9PSAtRU9QTk9UU1VQUCkKLQkJZXJyb3IgPSBuZnNlcnJfYXR0cm5vdHN1cHA7CisJCXJldHVybiBuZnNlcnJfYXR0cm5vdHN1cHA7CiAJZWxzZQotCQllcnJvciA9IG5mc2Vycm5vKGhvc3RfZXJyb3IpOwotCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJybm8oaG9zdF9lcnJvcik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKQEAgLTYwNyw3ICs2MTYsNyBAQAogCiAJCQlzcmVzdWx0IHw9IG1hcC0+YWNjZXNzOwogCi0JCQllcnIyID0gbmZzZF9wZXJtaXNzaW9uKGV4cG9ydCwgZGVudHJ5LCBtYXAtPmhvdyk7CisJCQllcnIyID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBleHBvcnQsIGRlbnRyeSwgbWFwLT5ob3cpOwogCQkJc3dpdGNoIChlcnIyKSB7CiAJCQljYXNlIG5mc19vazoKIAkJCQlyZXN1bHQgfD0gbWFwLT5hY2Nlc3M7CkBAIC0xMDM0LDcgKzEwNDMsNyBAQAogCV9fYmUzMgkJZXJyOwogCiAJaWYgKGZpbGUpIHsKLQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhwb3J0LCBmaHAtPmZoX2RlbnRyeSwKKwkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCiAJCQkJTUFZX1JFQUR8TUFZX09XTkVSX09WRVJSSURFKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwpAQCAtMTA2Myw3ICsxMDcyLDcgQEAKIAlfX2JlMzIJCQllcnIgPSAwOwogCiAJaWYgKGZpbGUpIHsKLQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhwb3J0LCBmaHAtPmZoX2RlbnRyeSwKKwkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKHJxc3RwLCBmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCiAJCQkJTUFZX1dSSVRFfE1BWV9PV05FUl9PVkVSUklERSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTE3OTIsNyArMTgwMSw4IEBACiAgKiBDaGVjayBmb3IgYSB1c2VyJ3MgYWNjZXNzIHBlcm1pc3Npb25zIHRvIHRoaXMgaW5vZGUuCiAgKi8KIF9fYmUzMgotbmZzZF9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGFjYykKK25mc2RfcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBhY2MpCiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQJCWVycjsKQEAgLTE4MjMsNyArMTgzMyw3IEBACiAJICovCiAJaWYgKCEoYWNjICYgTUFZX0xPQ0FMX0FDQ0VTUykpCiAJCWlmIChhY2MgJiAoTUFZX1dSSVRFIHwgTUFZX1NBVFRSIHwgTUFZX1RSVU5DKSkgewotCQkJaWYgKEVYX1JET05MWShleHApIHx8IElTX1JET05MWShpbm9kZSkpCisJCQlpZiAoRVhfUkRPTkxZKGV4cCwgcnFzdHApIHx8IElTX1JET05MWShpbm9kZSkpCiAJCQkJcmV0dXJuIG5mc2Vycl9yb2ZzOwogCQkJaWYgKC8qIChhY2MgJiBNQVlfV1JJVEUpICYmICovIElTX0lNTVVUQUJMRShpbm9kZSkpCiAJCQkJcmV0dXJuIG5mc2Vycl9wZXJtOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL01ha2VmaWxlIGIvZnMvbmxzL01ha2VmaWxlCmluZGV4IGE3YWRlMTMuLmY0OTlkZDcgMTAwNjQ0Ci0tLSBhL2ZzL25scy9NYWtlZmlsZQorKysgYi9mcy9ubHMvTWFrZWZpbGUKQEAgLTM2LDExICszNiw5IEBACiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfNykJKz0gbmxzX2lzbzg4NTktNy5vCiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfOCkJKz0gbmxzX2NwMTI1NS5vCiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfOSkJKz0gbmxzX2lzbzg4NTktOS5vCi1vYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTApCSs9IG5sc19pc284ODU5LTEwLm8KIG9iai0kKENPTkZJR19OTFNfSVNPODg1OV8xMykJKz0gbmxzX2lzbzg4NTktMTMubwogb2JqLSQoQ09ORklHX05MU19JU084ODU5XzE0KQkrPSBubHNfaXNvODg1OS0xNC5vCiBvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTUpCSs9IG5sc19pc284ODU5LTE1Lm8KIG9iai0kKENPTkZJR19OTFNfS09JOF9SKQkrPSBubHNfa29pOC1yLm8KIG9iai0kKENPTkZJR19OTFNfS09JOF9VKQkrPSBubHNfa29pOC11Lm8gbmxzX2tvaTgtcnUubwotb2JqLSQoQ09ORklHX05MU19BQkMpCQkrPSBubHNfYWJjLm8KIG9iai0kKENPTkZJR19OTFNfVVRGOCkJCSs9IG5sc191dGY4Lm8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbmFtZWkuYyBiL2ZzL250ZnMvbmFtZWkuYwppbmRleCBiZmYwMWE1Li5lOTNjNjE0IDEwMDY0NAotLS0gYS9mcy9udGZzL25hbWVpLmMKKysrIGIvZnMvbnRmcy9uYW1laS5jCkBAIC0yMSw2ICsyMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KIAogI2luY2x1ZGUgImF0dHJpYi5oIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYWxsb2MuYyBiL2ZzL29jZnMyL2FsbG9jLmMKaW5kZXggMTk3MTJhNy4uZjVlMTFmNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWxsb2MuYworKysgYi9mcy9vY2ZzMi9hbGxvYy5jCkBAIC01MCw2ICs1MCw4IEBACiAjaW5jbHVkZSAiYnVmZmVyX2hlYWRfaW8uaCIKIAogc3RhdGljIHZvaWQgb2NmczJfZnJlZV90cnVuY2F0ZV9jb250ZXh0KHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0Yyk7CitzdGF0aWMgaW50IG9jZnMyX2NhY2hlX2V4dGVudF9ibG9ja19mcmVlKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAorCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpOwogCiAvKgogICogU3RydWN0dXJlcyB3aGljaCBkZXNjcmliZSBhIHBhdGggdGhyb3VnaCBhIGJ0cmVlLCBhbmQgZnVuY3Rpb25zIHRvCkBAIC0xMTcsNiArMTE5LDMxIEBACiB9CiAKIC8qCisgKiBBbGwgdGhlIGVsZW1lbnRzIG9mIHNyYyBpbnRvIGRlc3QuIEFmdGVyIHRoaXMgY2FsbCwgc3JjIGNvdWxkIGJlIGZyZWVkCisgKiB3aXRob3V0IGFmZmVjdGluZyBkZXN0LgorICoKKyAqIEJvdGggcGF0aHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcm9vdC4gQW55IG5vbi1yb290IGVsZW1lbnRzIG9mIGRlc3QKKyAqIHdpbGwgYmUgZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkIG9jZnMyX2NwX3BhdGgoc3RydWN0IG9jZnMyX3BhdGggKmRlc3QsIHN0cnVjdCBvY2ZzMl9wYXRoICpzcmMpCit7CisJaW50IGk7CisKKwlCVUdfT04ocGF0aF9yb290X2JoKGRlc3QpICE9IHBhdGhfcm9vdF9iaChzcmMpKTsKKwlCVUdfT04ocGF0aF9yb290X2VsKGRlc3QpICE9IHBhdGhfcm9vdF9lbChzcmMpKTsKKworCW9jZnMyX3JlaW5pdF9wYXRoKGRlc3QsIDEpOworCisJZm9yKGkgPSAxOyBpIDwgT0NGUzJfTUFYX1BBVEhfREVQVEg7IGkrKykgeworCQlkZXN0LT5wX25vZGVbaV0uYmggPSBzcmMtPnBfbm9kZVtpXS5iaDsKKwkJZGVzdC0+cF9ub2RlW2ldLmVsID0gc3JjLT5wX25vZGVbaV0uZWw7CisKKwkJaWYgKGRlc3QtPnBfbm9kZVtpXS5iaCkKKwkJCWdldF9iaChkZXN0LT5wX25vZGVbaV0uYmgpOworCX0KK30KKworLyoKICAqIE1ha2UgdGhlICpkZXN0IHBhdGggdGhlIHNhbWUgYXMgc3JjIGFuZCByZS1pbml0aWFsaXplIHNyYyBwYXRoIHRvCiAgKiBoYXZlIGEgcm9vdCBvbmx5LgogICovCkBAIC0yMTIsMTAgKzIzOSw0MSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBleHRlbnQgcmVjb3JkIHdoaWNoIGNvbnRhaW5zIGNsdXN0ZXIgI3ZfY2x1c3Rlci4KKyAqIC0xIGlzIHJldHVybmVkIGlmIGl0IHdhcyBub3QgZm91bmQuCisgKgorICogU2hvdWxkIHdvcmsgZmluZSBvbiBpbnRlcmlvciBhbmQgZXh0ZXJpb3Igbm9kZXMuCisgKi8KK2ludCBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3Qoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgdTMyIHZfY2x1c3RlcikKK3sKKwlpbnQgcmV0ID0gLTE7CisJaW50IGk7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwl1MzIgcmVjX2VuZCwgcmVjX3N0YXJ0LCBjbHVzdGVyczsKKworCWZvcihpID0gMDsgaSA8IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspIHsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaV07CisKKwkJcmVjX3N0YXJ0ID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOworCQljbHVzdGVycyA9IG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKworCQlyZWNfZW5kID0gcmVjX3N0YXJ0ICsgY2x1c3RlcnM7CisKKwkJaWYgKHZfY2x1c3RlciA+PSByZWNfc3RhcnQgJiYgdl9jbHVzdGVyIDwgcmVjX2VuZCkgeworCQkJcmV0ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogZW51bSBvY2ZzMl9jb250aWdfdHlwZSB7CiAJQ09OVElHX05PTkUgPSAwLAogCUNPTlRJR19MRUZULAotCUNPTlRJR19SSUdIVAorCUNPTlRJR19SSUdIVCwKKwlDT05USUdfTEVGVFJJR0hULAogfTsKIAogCkBAIC0yNTMsNiArMzExLDE0IEBACiB7CiAJdTY0IGJsa25vID0gbGU2NF90b19jcHUoaW5zZXJ0X3JlYy0+ZV9ibGtubyk7CiAKKwkvKgorCSAqIFJlZnVzZSB0byBjb2FsZXNjZSBleHRlbnQgcmVjb3JkcyB3aXRoIGRpZmZlcmVudCBmbGFnCisJICogZmllbGRzIC0gd2UgZG9uJ3Qgd2FudCB0byBtaXggdW53cml0dGVuIGV4dGVudHMgd2l0aCB1c2VyCisJICogZGF0YS4KKwkgKi8KKwlpZiAoZXh0LT5lX2ZsYWdzICE9IGluc2VydF9yZWMtPmVfZmxhZ3MpCisJCXJldHVybiBDT05USUdfTk9ORTsKKwogCWlmIChvY2ZzMl9leHRlbnRzX2FkamFjZW50KGV4dCwgaW5zZXJ0X3JlYykgJiYKIAkgICAgb2NmczJfYmxvY2tfZXh0ZW50X2NvbnRpZyhpbm9kZS0+aV9zYiwgZXh0LCBibGtubykpCiAJCQlyZXR1cm4gQ09OVElHX1JJR0hUOwpAQCAtMjc3LDcgKzM0MywxNCBAQAogCUFQUEVORF9UQUlMLAogfTsKIAorZW51bSBvY2ZzMl9zcGxpdF90eXBlIHsKKwlTUExJVF9OT05FID0gMCwKKwlTUExJVF9MRUZULAorCVNQTElUX1JJR0hULAorfTsKKwogc3RydWN0IG9jZnMyX2luc2VydF90eXBlIHsKKwllbnVtIG9jZnMyX3NwbGl0X3R5cGUJaW5zX3NwbGl0OwogCWVudW0gb2NmczJfYXBwZW5kX3R5cGUJaW5zX2FwcGVuZGluZzsKIAllbnVtIG9jZnMyX2NvbnRpZ190eXBlCWluc19jb250aWc7CiAJaW50CQkJaW5zX2NvbnRpZ19pbmRleDsKQEAgLTI4NSw2ICszNTgsMTMgQEAKIAlpbnQJCQlpbnNfdHJlZV9kZXB0aDsKIH07CiAKK3N0cnVjdCBvY2ZzMl9tZXJnZV9jdHh0IHsKKwllbnVtIG9jZnMyX2NvbnRpZ190eXBlCWNfY29udGlnX3R5cGU7CisJaW50CQkJY19oYXNfZW1wdHlfZXh0ZW50OworCWludAkJCWNfc3BsaXRfY292ZXJzX3JlYzsKKwlpbnQJCQljX3VzZWRfdGFpbF9yZWNzOworfTsKKwogLyoKICAqIEhvdyBtYW55IGZyZWUgZXh0ZW50cyBoYXZlIHdlIGdvdCBiZWZvcmUgd2UgbmVlZCBtb3JlIG1ldGEgZGF0YT8KICAqLwpAQCAtMzg0LDEzICs0NjQsNyBAQAogCQkJc3RyY3B5KGViLT5oX3NpZ25hdHVyZSwgT0NGUzJfRVhURU5UX0JMT0NLX1NJR05BVFVSRSk7CiAJCQllYi0+aF9ibGtubyA9IGNwdV90b19sZTY0KGZpcnN0X2Jsa25vKTsKIAkJCWViLT5oX2ZzX2dlbmVyYXRpb24gPSBjcHVfdG9fbGUzMihvc2ItPmZzX2dlbmVyYXRpb24pOwotCi0jaWZuZGVmIE9DRlMyX1VTRV9BTExfTUVUQURBVEFfU1VCQUxMT0NBVE9SUwotCQkJLyogd2UgYWx3YXlzIHVzZSBzbG90IHplcm8ncyBzdWJhbGxvY2F0b3IgKi8KLQkJCWViLT5oX3N1YmFsbG9jX3Nsb3QgPSAwOwotI2Vsc2UKIAkJCWViLT5oX3N1YmFsbG9jX3Nsb3QgPSBjcHVfdG9fbGUxNihvc2ItPnNsb3RfbnVtKTsKLSNlbmRpZgogCQkJZWItPmhfc3ViYWxsb2NfYml0ID0gY3B1X3RvX2xlMTYoc3ViYWxsb2NfYml0X3N0YXJ0KTsKIAkJCWViLT5oX2xpc3QubF9jb3VudCA9CiAJCQkJY3B1X3RvX2xlMTYob2NmczJfZXh0ZW50X3JlY3NfcGVyX2ViKG9zYi0+c2IpKTsKQEAgLTQ2MSw3ICs1MzUsNyBAQAogCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmViX2JoLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbGFzdF9lYl9iaCwKKwkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsYXN0X2ViX2JoLAogCQkJICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQogewogCWludCBzdGF0dXMsIG5ld19ibG9ja3MsIGk7CkBAIC00NzYsNyArNTUwLDcgQEAKIAogCW1sb2dfZW50cnlfdm9pZCgpOwogCi0JQlVHX09OKCFsYXN0X2ViX2JoKTsKKwlCVUdfT04oIWxhc3RfZWJfYmggfHwgISpsYXN0X2ViX2JoKTsKIAogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZmVfYmgtPmJfZGF0YTsKIApAQCAtNTA3LDcgKzU4MSw3IEBACiAJCWdvdG8gYmFpbDsKIAl9CiAKLQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopbGFzdF9lYl9iaC0+Yl9kYXRhOworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikoKmxhc3RfZWJfYmgpLT5iX2RhdGE7CiAJbmV3X2Nwb3MgPSBvY2ZzMl9zdW1fcmlnaHRtb3N0X3JlYygmZWItPmhfbGlzdCk7CiAKIAkvKiBOb3RlOiBuZXdfZWJfYmhzW25ld19ibG9ja3MgLSAxXSBpcyB0aGUgZ3V5IHdoaWNoIHdpbGwgYmUKQEAgLTU2OCw3ICs2NDIsNyBAQAogCSAqIGpvdXJuYWxfZGlydHkgZXJyb3JpbmcgYXMgaXQgd29uJ3QgdW5sZXNzIHdlJ3ZlIGFib3J0ZWQgdGhlCiAJICogaGFuZGxlIChpbiB3aGljaCBjYXNlIHdlIHdvdWxkIG5ldmVyIGJlIGhlcmUpIHNvIHJlc2VydmluZwogCSAqIHRoZSB3cml0ZSB3aXRoIGpvdXJuYWxfYWNjZXNzIGlzIGFsbCB3ZSBuZWVkIHRvIGRvLiAqLwotCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGxhc3RfZWJfYmgsCisJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgKmxhc3RfZWJfYmgsCiAJCQkJICAgICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTYwMSwxMCArNjc1LDEwIEBACiAJICogbmV4dF9sZWFmIG9uIHRoZSBwcmV2aW91c2x5IGxhc3QtZXh0ZW50LWJsb2NrLiAqLwogCWZlLT5pX2xhc3RfZWJfYmxrID0gY3B1X3RvX2xlNjQobmV3X2xhc3RfZWJfYmxrKTsKIAotCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgKCpsYXN0X2ViX2JoKS0+Yl9kYXRhOwogCWViLT5oX25leHRfbGVhZl9ibGsgPSBjcHVfdG9fbGU2NChuZXdfbGFzdF9lYl9ibGspOwogCi0Jc3RhdHVzID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGxhc3RfZWJfYmgpOworCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCAqbGFzdF9lYl9iaCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAlzdGF0dXMgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZmVfYmgpOwpAQCAtNjE2LDYgKzY5MCwxNCBAQAogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCX0KIAorCS8qCisJICogU29tZSBjYWxsZXJzIHdhbnQgdG8gdHJhY2sgdGhlIHJpZ2h0bW9zdCBsZWFmIHNvIHBhc3MgaXQKKwkgKiBiYWNrIGhlcmUuCisJICovCisJYnJlbHNlKCpsYXN0X2ViX2JoKTsKKwlnZXRfYmgobmV3X2ViX2Joc1swXSk7CisJKmxhc3RfZWJfYmggPSBuZXdfZWJfYmhzWzBdOworCiAJc3RhdHVzID0gMDsKIGJhaWw6CiAJaWYgKG5ld19lYl9iaHMpIHsKQEAgLTgyOSw2ICs5MTEsODcgQEAKIH0KIAogLyoKKyAqIEdyb3cgYSBiLXRyZWUgc28gdGhhdCBpdCBoYXMgbW9yZSByZWNvcmRzLgorICoKKyAqIFdlIG1pZ2h0IHNoaWZ0IHRoZSB0cmVlIGRlcHRoIGluIHdoaWNoIGNhc2UgZXhpc3RpbmcgcGF0aHMgc2hvdWxkCisgKiBiZSBjb25zaWRlcmVkIGludmFsaWQuCisgKgorICogVHJlZSBkZXB0aCBhZnRlciB0aGUgZ3JvdyBpcyByZXR1cm5lZCB2aWEgKmZpbmFsX2RlcHRoLgorICoKKyAqICpsYXN0X2ViX2JoIHdpbGwgYmUgdXBkYXRlZCBieSBvY2ZzMl9hZGRfYnJhbmNoKCkuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfZ3Jvd190cmVlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLCBpbnQgKmZpbmFsX2RlcHRoLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbGFzdF9lYl9iaCwKKwkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjKQoreworCWludCByZXQsIHNoaWZ0OworCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCWludCBkZXB0aCA9IGxlMTZfdG9fY3B1KGRpLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCk7CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlCVUdfT04obWV0YV9hYyA9PSBOVUxMKTsKKworCXNoaWZ0ID0gb2NmczJfZmluZF9icmFuY2hfdGFyZ2V0KG9zYiwgaW5vZGUsIGRpX2JoLCAmYmgpOworCWlmIChzaGlmdCA8IDApIHsKKwkJcmV0ID0gc2hpZnQ7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogV2UgdHJhdmVsZWQgYWxsIHRoZSB3YXkgdG8gdGhlIGJvdHRvbSBvZiB0aGUgYWxsb2NhdGlvbiB0cmVlCisJICogYW5kIGRpZG4ndCBmaW5kIHJvb20gZm9yIGFueSBtb3JlIGV4dGVudHMgLSB3ZSBuZWVkIHRvIGFkZAorCSAqIGFub3RoZXIgdHJlZSBsZXZlbCAqLworCWlmIChzaGlmdCkgeworCQlCVUdfT04oYmgpOworCQltbG9nKDAsICJuZWVkIHRvIHNoaWZ0IHRyZWUgZGVwdGggKGN1cnJlbnQgPSAlZClcbiIsIGRlcHRoKTsKKworCQkvKiBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoIHdpbGwgcmV0dXJuIHVzIGEgYnVmZmVyIHdpdGgKKwkJICogdGhlIG5ldyBleHRlbnQgYmxvY2sgKHNvIHdlIGNhbiBwYXNzIHRoYXQgdG8KKwkJICogb2NmczJfYWRkX2JyYW5jaCkuICovCisJCXJldCA9IG9jZnMyX3NoaWZ0X3RyZWVfZGVwdGgob3NiLCBoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkJICAgICBtZXRhX2FjLCAmYmgpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZGVwdGgrKzsKKwkJaWYgKGRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBTcGVjaWFsIGNhc2U6IHdlIGhhdmUgcm9vbSBub3cgaWYgd2Ugc2hpZnRlZCBmcm9tCisJCQkgKiB0cmVlX2RlcHRoIDAsIHNvIG5vIG1vcmUgd29yayBuZWVkcyB0byBiZSBkb25lLgorCQkJICoKKwkJCSAqIFdlIHdvbid0IGJlIGNhbGxpbmcgYWRkX2JyYW5jaCwgc28gcGFzcworCQkJICogYmFjayAqbGFzdF9lYl9iaCBhcyB0aGUgbmV3IGxlYWYuIEF0IGRlcHRoCisJCQkgKiB6ZXJvLCBpdCBzaG91bGQgYWx3YXlzIGJlIG51bGwgc28gdGhlcmUncworCQkJICogbm8gcmVhc29uIHRvIGJyZWxzZS4KKwkJCSAqLworCQkJQlVHX09OKCpsYXN0X2ViX2JoKTsKKwkJCWdldF9iaChiaCk7CisJCQkqbGFzdF9lYl9iaCA9IGJoOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBjYWxsIG9jZnMyX2FkZF9icmFuY2ggdG8gYWRkIHRoZSBmaW5hbCBwYXJ0IG9mIHRoZSB0cmVlIHdpdGgKKwkgKiB0aGUgbmV3IGRhdGEuICovCisJbWxvZygwLCAiYWRkIGJyYW5jaC4gYmggPSAlcFxuIiwgYmgpOworCXJldCA9IG9jZnMyX2FkZF9icmFuY2gob3NiLCBoYW5kbGUsIGlub2RlLCBkaV9iaCwgYmgsIGxhc3RfZWJfYmgsCisJCQkgICAgICAgbWV0YV9hYyk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlpZiAoZmluYWxfZGVwdGgpCisJCSpmaW5hbF9kZXB0aCA9IGRlcHRoOworCWJyZWxzZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFRoaXMgaXMgb25seSB2YWxpZCBmb3IgbGVhZiBub2Rlcywgd2hpY2ggYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCBjYW4KICAqIGhhdmUgZW1wdHkgZXh0ZW50cyBhbnl3YXkuCiAgKi8KQEAgLTkzNCw2ICsxMDk3LDIyIEBACiAKIH0KIAorc3RhdGljIHZvaWQgb2NmczJfcmVtb3ZlX2VtcHR5X2V4dGVudChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKQoreworCWludCBzaXplLCBudW1fcmVjcyA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCisJQlVHX09OKG51bV9yZWNzID09IDApOworCisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpIHsKKwkJbnVtX3JlY3MtLTsKKwkJc2l6ZSA9IG51bV9yZWNzICogc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKTsKKwkJbWVtbW92ZSgmZWwtPmxfcmVjc1swXSwgJmVsLT5sX3JlY3NbMV0sIHNpemUpOworCQltZW1zZXQoJmVsLT5sX3JlY3NbbnVtX3JlY3NdLCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisJCWVsLT5sX25leHRfZnJlZV9yZWMgPSBjcHVfdG9fbGUxNihudW1fcmVjcyk7CisJfQorfQorCiAvKgogICogQ3JlYXRlIGFuIGVtcHR5IGV4dGVudCByZWNvcmQgLgogICoKQEAgLTEyMTEsNiArMTM5MCwxMCBAQAogCSAqIGltbWVkaWF0ZWx5IHRvIHRoZWlyIHJpZ2h0LgogCSAqLwogCWxlZnRfY2x1c3RlcnMgPSBsZTMyX3RvX2NwdShyaWdodF9jaGlsZF9lbC0+bF9yZWNzWzBdLmVfY3Bvcyk7CisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmcmlnaHRfY2hpbGRfZWwtPmxfcmVjc1swXSkpIHsKKwkJQlVHX09OKGxlMTZfdG9fY3B1KHJpZ2h0X2NoaWxkX2VsLT5sX25leHRfZnJlZV9yZWMpIDw9IDEpOworCQlsZWZ0X2NsdXN0ZXJzID0gbGUzMl90b19jcHUocmlnaHRfY2hpbGRfZWwtPmxfcmVjc1sxXS5lX2Nwb3MpOworCX0KIAlsZWZ0X2NsdXN0ZXJzIC09IGxlMzJfdG9fY3B1KGxlZnRfcmVjLT5lX2Nwb3MpOwogCWxlZnRfcmVjLT5lX2ludF9jbHVzdGVycyA9IGNwdV90b19sZTMyKGxlZnRfY2x1c3RlcnMpOwogCkBAIC0xNTMxLDEwICsxNzE0LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIEV4dGVuZCB0aGUgdHJhbnNhY3Rpb24gYnkgZW5vdWdoIGNyZWRpdHMgdG8gY29tcGxldGUgdGhlIHJvdGF0aW9uLAorICogYW5kIHN0aWxsIGxlYXZlIGF0IGxlYXN0IHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgY3JlZGl0cyBhbGxvY2F0ZWQKKyAqIHRvIHRoaXMgdHJhbnNhY3Rpb24uCisgKi8KIHN0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBpbnQgc3VidHJlZV9kZXB0aCwKKwkJCQkJICAgaW50IG9wX2NyZWRpdHMsCiAJCQkJCSAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoKQogewotCWludCBjcmVkaXRzID0gKHBhdGgtPnBfdHJlZV9kZXB0aCAtIHN1YnRyZWVfZGVwdGgpICogMiArIDE7CisJaW50IGNyZWRpdHMgPSAocGF0aC0+cF90cmVlX2RlcHRoIC0gc3VidHJlZV9kZXB0aCkgKiAyICsgMSArIG9wX2NyZWRpdHM7CiAKIAlpZiAoaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzIDwgY3JlZGl0cykKIAkJcmV0dXJuIG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIGNyZWRpdHMpOwpAQCAtMTU2OCw2ICsxNzU3LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfbGVmdG1vc3RfcmVjX2NvbnRhaW5zKHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIHUzMiBjcG9zKQoreworCWludCBuZXh0X2ZyZWUgPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwl1bnNpZ25lZCBpbnQgcmFuZ2U7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKworCWlmIChuZXh0X2ZyZWUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZWMgPSAmZWwtPmxfcmVjc1swXTsKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KHJlYykpIHsKKwkJLyogRW1wdHkgbGlzdC4gKi8KKwkJaWYgKG5leHRfZnJlZSA9PSAxKQorCQkJcmV0dXJuIDA7CisJCXJlYyA9ICZlbC0+bF9yZWNzWzFdOworCX0KKworCXJhbmdlID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOworCWlmIChjcG9zID49IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSAmJiBjcG9zIDwgcmFuZ2UpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCiAvKgogICogUm90YXRlIGFsbCB0aGUgcmVjb3JkcyBpbiBhIGJ0cmVlIHJpZ2h0IG9uZSByZWNvcmQsIHN0YXJ0aW5nIGF0IGluc2VydF9jcG9zLgogICoKQEAgLTE1ODYsMTEgKzE3OTgsMTIgQEAKICAqLwogc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfdHJlZV9yaWdodChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgZW51bSBvY2ZzMl9zcGxpdF90eXBlIHNwbGl0LAogCQkJCSAgIHUzMiBpbnNlcnRfY3BvcywKIAkJCQkgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCwKIAkJCQkgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqKnJldF9sZWZ0X3BhdGgpCiB7Ci0JaW50IHJldCwgc3RhcnQ7CisJaW50IHJldCwgc3RhcnQsIG9yaWdfY3JlZGl0cyA9IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKIAl1MzIgY3BvczsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKIApAQCAtMTY1Nyw5ICsxODcwLDkgQEAKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKQogCQkJCXBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLT5iX2Jsb2NrbnIpOwogCi0JCWlmIChvY2ZzMl9yb3RhdGVfcmVxdWlyZXNfcGF0aF9hZGp1c3RtZW50KGxlZnRfcGF0aCwKKwkJaWYgKHNwbGl0ID09IFNQTElUX05PTkUgJiYKKwkJICAgIG9jZnMyX3JvdGF0ZV9yZXF1aXJlc19wYXRoX2FkanVzdG1lbnQobGVmdF9wYXRoLAogCQkJCQkJCSAgaW5zZXJ0X2Nwb3MpKSB7Ci0JCQltbG9nKDAsICJQYXRoIGFkanVzdG1lbnQgcmVxdWlyZWRcbiIpOwogCiAJCQkvKgogCQkJICogV2UndmUgcm90YXRlZCB0aGUgdHJlZSBhcyBtdWNoIGFzIHdlCkBAIC0xNjg3LDcgKzE5MDAsNyBAQAogCQkgICAgIHJpZ2h0X3BhdGgtPnBfdHJlZV9kZXB0aCk7CiAKIAkJcmV0ID0gb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGUsIHN0YXJ0LAotCQkJCQkJICAgICAgcmlnaHRfcGF0aCk7CisJCQkJCQkgICAgICBvcmlnX2NyZWRpdHMsIHJpZ2h0X3BhdGgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTE3MDAsNiArMTkxMywyNCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorCQlpZiAoc3BsaXQgIT0gU1BMSVRfTk9ORSAmJgorCQkgICAgb2NmczJfbGVmdG1vc3RfcmVjX2NvbnRhaW5zKHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKSwKKwkJCQkJCWluc2VydF9jcG9zKSkgeworCQkJLyoKKwkJCSAqIEEgcm90YXRlIG1vdmVzIHRoZSByaWdodG1vc3QgbGVmdCBsZWFmCisJCQkgKiByZWNvcmQgb3ZlciB0byB0aGUgbGVmdG1vc3QgcmlnaHQgbGVhZgorCQkJICogc2xvdC4gSWYgd2UncmUgZG9pbmcgYW4gZXh0ZW50IHNwbGl0CisJCQkgKiBpbnN0ZWFkIG9mIGEgcmVhbCBpbnNlcnQsIHRoZW4gd2UgaGF2ZSB0bworCQkJICogY2hlY2sgdGhhdCB0aGUgZXh0ZW50IHRvIGJlIHNwbGl0IHdhc24ndAorCQkJICoganVzdCBtb3ZlZCBvdmVyLiBJZiBpdCB3YXMsIHRoZW4gd2UgY2FuCisJCQkgKiBleGl0IGhlcmUsIHBhc3NpbmcgbGVmdF9wYXRoIGJhY2sgLQorCQkJICogb2NmczJfc3BsaXRfZXh0ZW50KCkgaXMgc21hcnQgZW5vdWdoIHRvCisJCQkgKiBzZWFyY2ggYm90aCBsZWF2ZXMuCisJCQkgKi8KKwkJCSpyZXRfbGVmdF9wYXRoID0gbGVmdF9wYXRoOworCQkJZ290byBvdXRfcmV0X3BhdGg7CisJCX0KKwogCQkvKgogCQkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlLXJlYWQgdGhlIG5leHQgcmlnaHQgcGF0aAogCQkgKiBhcyB3ZSBrbm93IHRoYXQgaXQnbGwgYmUgb3VyIGN1cnJlbnQgbGVmdApAQCAtMTcyMiw2ICsxOTUzLDEwMzEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl91cGRhdGVfZWRnZV9sZW5ndGhzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgpCit7CisJaW50IGksIGlkeDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJdTMyIHJhbmdlOworCisJLyogUGF0aCBzaG91bGQgYWx3YXlzIGJlIHJpZ2h0bW9zdC4gKi8KKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKHBhdGgpLT5iX2RhdGE7CisJQlVHX09OKGViLT5oX25leHRfbGVhZl9ibGsgIT0gMFVMTCk7CisKKwllbCA9ICZlYi0+aF9saXN0OworCUJVR19PTihsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKTsKKwlpZHggPSBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSAtIDE7CisJcmVjID0gJmVsLT5sX3JlY3NbaWR4XTsKKwlyYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYXRoLT5wX3RyZWVfZGVwdGg7IGkrKykgeworCQllbCA9IHBhdGgtPnBfbm9kZVtpXS5lbDsKKwkJaWR4ID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgLSAxOworCQlyZWMgPSAmZWwtPmxfcmVjc1tpZHhdOworCisJCXJlYy0+ZV9pbnRfY2x1c3RlcnMgPSBjcHVfdG9fbGUzMihyYW5nZSk7CisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2ludF9jbHVzdGVycywgLWxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSk7CisKKwkJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGgtPnBfbm9kZVtpXS5iaCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvY2ZzMl91bmxpbmtfcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwgaW50IHVubGlua19zdGFydCkKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWZvcihpID0gdW5saW5rX3N0YXJ0OyBpIDwgcGF0aF9udW1faXRlbXMocGF0aCk7IGkrKykgeworCQliaCA9IHBhdGgtPnBfbm9kZVtpXS5iaDsKKworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopYmgtPmJfZGF0YTsKKwkJLyoKKwkJICogTm90IGFsbCBub2RlcyBtaWdodCBoYXZlIGhhZCB0aGVpciBmaW5hbCBjb3VudAorCQkgKiBkZWNyZW1lbnRlZCBieSB0aGUgY2FsbGVyIC0gaGFuZGxlIHRoaXMgaGVyZS4KKwkJICovCisJCWVsID0gJmViLT5oX2xpc3Q7CisJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA+IDEpIHsKKwkJCW1sb2coTUxfRVJST1IsCisJCQkgICAgICJJbm9kZSAlbGx1LCBhdHRlbXB0ZWQgdG8gcmVtb3ZlIGV4dGVudCBibG9jayAiCisJCQkgICAgICIlbGx1IHdpdGggJXUgcmVjb3Jkc1xuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoZWItPmhfYmxrbm8pLAorCQkJICAgICBsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CisKKwkJCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJCQlvY2ZzMl9yZW1vdmVfZnJvbV9jYWNoZShpbm9kZSwgYmgpOworCQkJY29udGludWU7CisJCX0KKworCQllbC0+bF9uZXh0X2ZyZWVfcmVjID0gMDsKKwkJbWVtc2V0KCZlbC0+bF9yZWNzWzBdLCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKworCQlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCisJCXJldCA9IG9jZnMyX2NhY2hlX2V4dGVudF9ibG9ja19mcmVlKGRlYWxsb2MsIGViKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKworCQlvY2ZzMl9yZW1vdmVfZnJvbV9jYWNoZShpbm9kZSwgYmgpOworCX0KK30KKworc3RhdGljIHZvaWQgb2NmczJfdW5saW5rX3N1YnRyZWUoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCwKKwkJCQkgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCisJCQkJIGludCBzdWJ0cmVlX2luZGV4LAorCQkJCSBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJvb3RfYmggPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5iaDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJvb3RfZWwgPSBsZWZ0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX2luZGV4XS5lbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCisJZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilyaWdodF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleCArIDFdLmJoLT5iX2RhdGE7CisKKwlmb3IoaSA9IDE7IGkgPCBsZTE2X3RvX2NwdShyb290X2VsLT5sX25leHRfZnJlZV9yZWMpOyBpKyspCisJCWlmIChyb290X2VsLT5sX3JlY3NbaV0uZV9ibGtubyA9PSBlYi0+aF9ibGtubykKKwkJCWJyZWFrOworCisJQlVHX09OKGkgPj0gbGUxNl90b19jcHUocm9vdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CisKKwltZW1zZXQoJnJvb3RfZWwtPmxfcmVjc1tpXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisJbGUxNl9hZGRfY3B1KCZyb290X2VsLT5sX25leHRfZnJlZV9yZWMsIC0xKTsKKworCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilwYXRoX2xlYWZfYmgobGVmdF9wYXRoKS0+Yl9kYXRhOworCWViLT5oX25leHRfbGVhZl9ibGsgPSAwOworCisJb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHJvb3RfYmgpOworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSk7CisKKwlvY2ZzMl91bmxpbmtfcGF0aChpbm9kZSwgaGFuZGxlLCBkZWFsbG9jLCByaWdodF9wYXRoLAorCQkJICBzdWJ0cmVlX2luZGV4ICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcm90YXRlX3N1YnRyZWVfbGVmdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCwKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpyaWdodF9wYXRoLAorCQkJCSAgICAgaW50IHN1YnRyZWVfaW5kZXgsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCQkgICAgIGludCAqZGVsZXRlZCkKK3sKKwlpbnQgcmV0LCBpLCBkZWxfcmlnaHRfc3VidHJlZSA9IDAsIHJpZ2h0X2hhc19lbXB0eSA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyb290X2JoLCAqZGlfYmggPSBwYXRoX3Jvb3RfYmgocmlnaHRfcGF0aCk7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodF9sZWFmX2VsLCAqbGVmdF9sZWFmX2VsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCisJKmRlbGV0ZWQgPSAwOworCisJcmlnaHRfbGVhZl9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKKwlsZWZ0X2xlYWZfZWwgPSBwYXRoX2xlYWZfZWwobGVmdF9wYXRoKTsKKwlyb290X2JoID0gbGVmdF9wYXRoLT5wX25vZGVbc3VidHJlZV9pbmRleF0uYmg7CisJQlVHX09OKHJvb3RfYmggIT0gcmlnaHRfcGF0aC0+cF9ub2RlW3N1YnRyZWVfaW5kZXhdLmJoKTsKKworCWlmICghb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZsZWZ0X2xlYWZfZWwtPmxfcmVjc1swXSkpCisJCXJldHVybiAwOworCisJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChyaWdodF9wYXRoKS0+Yl9kYXRhOworCWlmIChvY2ZzMl9pc19lbXB0eV9leHRlbnQoJnJpZ2h0X2xlYWZfZWwtPmxfcmVjc1swXSkpIHsKKwkJLyoKKwkJICogSXQncyBsZWdhbCBmb3IgdXMgdG8gcHJvY2VlZCBpZiB0aGUgcmlnaHQgbGVhZiBpcworCQkgKiB0aGUgcmlnaHRtb3N0IG9uZSBhbmQgaXQgaGFzIGFuIGVtcHR5IGV4dGVudC4gVGhlcmUKKwkJICogYXJlIHR3byBjYXNlcyB0byBoYW5kbGUgLSB3aGV0aGVyIHRoZSBsZWFmIHdpbGwgYmUKKwkJICogZW1wdHkgYWZ0ZXIgcmVtb3ZhbCBvciBub3QuIElmIHRoZSBsZWFmIGlzbid0IGVtcHR5CisJCSAqIHRoZW4ganVzdCByZW1vdmUgdGhlIGVtcHR5IGV4dGVudCB1cCBmcm9udC4gVGhlCisJCSAqIG5leHQgYmxvY2sgd2lsbCBoYW5kbGUgZW1wdHkgbGVhdmVzIGJ5IGZsYWdnaW5nCisJCSAqIHRoZW0gZm9yIHVubGluay4KKwkJICoKKwkJICogTm9uIHJpZ2h0bW9zdCBsZWF2ZXMgd2lsbCB0aHJvdyAtRUFHQUlOIGFuZCB0aGUKKwkJICogY2FsbGVyIGNhbiBtYW51YWxseSBtb3ZlIHRoZSBzdWJ0cmVlIGFuZCByZXRyeS4KKwkJICovCisKKwkJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgIT0gMFVMTCkKKwkJCXJldHVybiAtRUFHQUlOOworCisJCWlmIChsZTE2X3RvX2NwdShyaWdodF9sZWFmX2VsLT5sX25leHRfZnJlZV9yZWMpID4gMSkgeworCQkJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgIHBhdGhfbGVhZl9iaChyaWdodF9wYXRoKSwKKwkJCQkJCSAgIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCW9jZnMyX3JlbW92ZV9lbXB0eV9leHRlbnQocmlnaHRfbGVhZl9lbCk7CisJCX0gZWxzZQorCQkJcmlnaHRfaGFzX2VtcHR5ID0gMTsKKwl9CisKKwlpZiAoZWItPmhfbmV4dF9sZWFmX2JsayA9PSAwVUxMICYmCisJICAgIGxlMTZfdG9fY3B1KHJpZ2h0X2xlYWZfZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0gMSkgeworCQkvKgorCQkgKiBXZSBoYXZlIHRvIHVwZGF0ZSBpX2xhc3RfZWJfYmxrIGR1cmluZyB0aGUgbWV0YQorCQkgKiBkYXRhIGRlbGV0ZS4KKwkJICovCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGVsX3JpZ2h0X3N1YnRyZWUgPSAxOworCX0KKworCS8qCisJICogR2V0dGluZyBoZXJlIHdpdGggYW4gZW1wdHkgZXh0ZW50IGluIHRoZSByaWdodCBwYXRoIGltcGxpZXMKKwkgKiB0aGF0IGl0J3MgdGhlIHJpZ2h0bW9zdCBwYXRoIGFuZCB3aWxsIGJlIGRlbGV0ZWQuCisJICovCisJQlVHX09OKHJpZ2h0X2hhc19lbXB0eSAmJiAhZGVsX3JpZ2h0X3N1YnRyZWUpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgcm9vdF9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWZvcihpID0gc3VidHJlZV9pbmRleCArIDE7IGkgPCBwYXRoX251bV9pdGVtcyhyaWdodF9wYXRoKTsgaSsrKSB7CisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCSAgIHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5iaCwKKwkJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzKGhhbmRsZSwgaW5vZGUsCisJCQkJCSAgIGxlZnRfcGF0aC0+cF9ub2RlW2ldLmJoLAorCQkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCFyaWdodF9oYXNfZW1wdHkpIHsKKwkJLyoKKwkJICogT25seSBkbyB0aGlzIGlmIHdlJ3JlIG1vdmluZyBhIHJlYWwKKwkJICogcmVjb3JkLiBPdGhlcndpc2UsIHRoZSBhY3Rpb24gaXMgZGVsYXllZCB1bnRpbAorCQkgKiBhZnRlciByZW1vdmFsIG9mIHRoZSByaWdodCBwYXRoIGluIHdoaWNoIGNhc2Ugd2UKKwkJICogY2FuIGRvIGEgc2ltcGxlIHNoaWZ0IHRvIHJlbW92ZSB0aGUgZW1wdHkgZXh0ZW50LgorCQkgKi8KKwkJb2NmczJfcm90YXRlX2xlYWYobGVmdF9sZWFmX2VsLCAmcmlnaHRfbGVhZl9lbC0+bF9yZWNzWzBdKTsKKwkJbWVtc2V0KCZyaWdodF9sZWFmX2VsLT5sX3JlY3NbMF0sIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG9jZnMyX2V4dGVudF9yZWMpKTsKKwl9CisJaWYgKGViLT5oX25leHRfbGVhZl9ibGsgPT0gMFVMTCkgeworCQkvKgorCQkgKiBNb3ZlIHJlY3Mgb3ZlciB0byBnZXQgcmlkIG9mIGVtcHR5IGV4dGVudCwgZGVjcmVhc2UKKwkJICogbmV4dF9mcmVlLiBUaGlzIGlzIGFsbG93ZWQgdG8gcmVtb3ZlIHRoZSBsYXN0CisJCSAqIGV4dGVudCBpbiBvdXIgbGVhZiAoc2V0dGluZyBsX25leHRfZnJlZV9yZWMgdG8KKwkJICogemVybykgLSB0aGUgZGVsZXRlIGNvZGUgYmVsb3cgd29uJ3QgY2FyZS4KKwkJICovCisJCW9jZnMyX3JlbW92ZV9lbXB0eV9leHRlbnQocmlnaHRfbGVhZl9lbCk7CisJfQorCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIHBhdGhfbGVhZl9iaChyaWdodF9wYXRoKSk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCisJaWYgKGRlbF9yaWdodF9zdWJ0cmVlKSB7CisJCW9jZnMyX3VubGlua19zdWJ0cmVlKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgcmlnaHRfcGF0aCwKKwkJCQkgICAgIHN1YnRyZWVfaW5kZXgsIGRlYWxsb2MpOworCQlvY2ZzMl91cGRhdGVfZWRnZV9sZW5ndGhzKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCk7CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLT5iX2RhdGE7CisJCWRpLT5pX2xhc3RfZWJfYmxrID0gZWItPmhfYmxrbm87CisKKwkJLyoKKwkJICogUmVtb3ZhbCBvZiB0aGUgZXh0ZW50IGluIHRoZSBsZWZ0IGxlYWYgd2FzIHNraXBwZWQKKwkJICogYWJvdmUgc28gd2UgY291bGQgZGVsZXRlIHRoZSByaWdodCBwYXRoCisJCSAqIDFzdC4KKwkJICovCisJCWlmIChyaWdodF9oYXNfZW1wdHkpCisJCQlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KGxlZnRfbGVhZl9lbCk7CisKKwkJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKworCQkqZGVsZXRlZCA9IDE7CisJfSBlbHNlCisJCW9jZnMyX2NvbXBsZXRlX2VkZ2VfaW5zZXJ0KGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgcmlnaHRfcGF0aCwKKwkJCQkJICAgc3VidHJlZV9pbmRleCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2l2ZW4gYSBmdWxsIHBhdGgsIGRldGVybWluZSB3aGF0IGNwb3MgdmFsdWUgd291bGQgcmV0dXJuIHVzIGEgcGF0aAorICogY29udGFpbmluZyB0aGUgbGVhZiBpbW1lZGlhdGVseSB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnQgb25lLgorICoKKyAqIFdpbGwgcmV0dXJuIHplcm8gaWYgdGhlIHBhdGggcGFzc2VkIGluIGlzIGFscmVhZHkgdGhlIHJpZ2h0bW9zdCBwYXRoLgorICoKKyAqIFRoaXMgbG9va3Mgc2ltaWxhciwgYnV0IGlzIHN1YnRseSBkaWZmZXJlbnQgdG8KKyAqIG9jZnMyX2ZpbmRfY3Bvc19mb3JfbGVmdF9sZWFmKCkuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfZmluZF9jcG9zX2Zvcl9yaWdodF9sZWFmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsIHUzMiAqY3BvcykKK3sKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwl1NjQgYmxrbm87CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCSpjcG9zID0gMDsKKworCWlmIChwYXRoLT5wX3RyZWVfZGVwdGggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlibGtubyA9IHBhdGhfbGVhZl9iaChwYXRoKS0+Yl9ibG9ja25yOworCisJLyogU3RhcnQgYXQgdGhlIHRyZWUgbm9kZSBqdXN0IGFib3ZlIHRoZSBsZWFmIGFuZCB3b3JrIG91ciB3YXkgdXAuICovCisJaSA9IHBhdGgtPnBfdHJlZV9kZXB0aCAtIDE7CisJd2hpbGUgKGkgPj0gMCkgeworCQlpbnQgbmV4dF9mcmVlOworCisJCWVsID0gcGF0aC0+cF9ub2RlW2ldLmVsOworCisJCS8qCisJCSAqIEZpbmQgdGhlIGV4dGVudCByZWNvcmQganVzdCBhZnRlciB0aGUgb25lIGluIG91cgorCQkgKiBwYXRoLgorCQkgKi8KKwkJbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJCWZvcihqID0gMDsgaiA8IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOyBqKyspIHsKKwkJCWlmIChsZTY0X3RvX2NwdShlbC0+bF9yZWNzW2pdLmVfYmxrbm8pID09IGJsa25vKSB7CisJCQkJaWYgKGogPT0gKG5leHRfZnJlZSAtIDEpKSB7CisJCQkJCWlmIChpID09IDApIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgdGhlCisJCQkJCQkgKiBwYXRoIHNwZWNpZmllZCBpcyBhbHJlYWR5CisJCQkJCQkgKiB0aGUgcmlnaHRtb3N0IG9uZSAtIHJldHVybiBhCisJCQkJCQkgKiBjcG9zIG9mIHplcm8uCisJCQkJCQkgKi8KKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJCS8qCisJCQkJCSAqIFRoZSByaWdodG1vc3QgcmVjb3JkIHBvaW50cyB0byBvdXIKKwkJCQkJICogbGVhZiAtIHdlIG5lZWQgdG8gdHJhdmVsIHVwIHRoZQorCQkJCQkgKiB0cmVlIG9uZSBsZXZlbC4KKwkJCQkJICovCisJCQkJCWdvdG8gbmV4dF9ub2RlOworCQkJCX0KKworCQkJCSpjcG9zID0gbGUzMl90b19jcHUoZWwtPmxfcmVjc1tqICsgMV0uZV9jcG9zKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGdvdCBoZXJlLCB3ZSBuZXZlciBmb3VuZCBhIHZhbGlkIG5vZGUgd2hlcmUKKwkJICogdGhlIHRyZWUgaW5kaWNhdGVkIG9uZSBzaG91bGQgYmUuCisJCSAqLworCQlvY2ZzMl9lcnJvcihzYiwKKwkJCSAgICAiSW52YWxpZCBleHRlbnQgdHJlZSBhdCBleHRlbnQgYmxvY2sgJWxsdVxuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa25vKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKworbmV4dF9ub2RlOgorCQlibGtubyA9IHBhdGgtPnBfbm9kZVtpXS5iaC0+Yl9ibG9ja25yOworCQlpLS07CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9yb3RhdGVfcmlnaHRtb3N0X2xlYWZfbGVmdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsKQoreworCWludCByZXQ7CisKKwlpZiAoIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCisJCXJldHVybiAwOworCisJcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlvY2ZzMl9yZW1vdmVfZW1wdHlfZXh0ZW50KGVsKTsKKworCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7CisJaWYgKHJldCkKKwkJbWxvZ19lcnJubyhyZXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX29jZnMyX3JvdGF0ZV90cmVlX2xlZnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgaGFuZGxlX3QgKmhhbmRsZSwgaW50IG9yaWdfY3JlZGl0cywKKwkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqKmVtcHR5X2V4dGVudF9wYXRoKQoreworCWludCByZXQsIHN1YnRyZWVfcm9vdCwgZGVsZXRlZDsKKwl1MzIgcmlnaHRfY3BvczsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqcmlnaHRfcGF0aCA9IE5VTEw7CisKKwlCVUdfT04oIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmKHBhdGhfbGVhZl9lbChwYXRoKS0+bF9yZWNzWzBdKSkpOworCisJKmVtcHR5X2V4dGVudF9wYXRoID0gTlVMTDsKKworCXJldCA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihpbm9kZS0+aV9zYiwgcGF0aCwKKwkJCQkJICAgICAmcmlnaHRfY3Bvcyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKKwkJCQkgICBwYXRoX3Jvb3RfZWwocGF0aCkpOworCWlmICghbGVmdF9wYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJb2NmczJfY3BfcGF0aChsZWZ0X3BhdGgsIHBhdGgpOworCisJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKKwkJCQkgICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwlpZiAoIXJpZ2h0X3BhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAocmlnaHRfY3BvcykgeworCQlyZXQgPSBvY2ZzMl9maW5kX3BhdGgoaW5vZGUsIHJpZ2h0X3BhdGgsIHJpZ2h0X2Nwb3MpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN1YnRyZWVfcm9vdCA9IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KGlub2RlLCBsZWZ0X3BhdGgsCisJCQkJCQkgICAgICAgcmlnaHRfcGF0aCk7CisKKwkJbWxvZygwLCAiU3VidHJlZSByb290IGF0IGluZGV4ICVkIChibGsgJWxsdSwgZGVwdGggJWQpXG4iLAorCQkgICAgIHN1YnRyZWVfcm9vdCwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKQorCQkgICAgIHJpZ2h0X3BhdGgtPnBfbm9kZVtzdWJ0cmVlX3Jvb3RdLmJoLT5iX2Jsb2NrbnIsCisJCSAgICAgcmlnaHRfcGF0aC0+cF90cmVlX2RlcHRoKTsKKworCQlyZXQgPSBvY2ZzMl9leHRlbmRfcm90YXRlX3RyYW5zYWN0aW9uKGhhbmRsZSwgc3VidHJlZV9yb290LAorCQkJCQkJICAgICAgb3JpZ19jcmVkaXRzLCBsZWZ0X3BhdGgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX3JvdGF0ZV9zdWJ0cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkJcmlnaHRfcGF0aCwgc3VidHJlZV9yb290LAorCQkJCQkJZGVhbGxvYywgJmRlbGV0ZWQpOworCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKKwkJCS8qCisJCQkgKiBUaGUgcm90YXRpb24gaGFzIHRvIHRlbXBvcmFyaWx5IHN0b3AgZHVlIHRvCisJCQkgKiB0aGUgcmlnaHQgc3VidHJlZSBoYXZpbmcgYW4gZW1wdHkKKwkJCSAqIGV4dGVudC4gUGFzcyBpdCBiYWNrIHRvIHRoZSBjYWxsZXIgZm9yIGEKKwkJCSAqIGZpeHVwLgorCQkJICovCisJCQkqZW1wdHlfZXh0ZW50X3BhdGggPSByaWdodF9wYXRoOworCQkJcmlnaHRfcGF0aCA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBzdWJ0cmVlIHJvdGF0ZSBtaWdodCBoYXZlIHJlbW92ZWQgcmVjb3JkcyBvbgorCQkgKiB0aGUgcmlnaHRtb3N0IGVkZ2UuIElmIHNvLCB0aGVuIHJvdGF0aW9uIGlzCisJCSAqIGNvbXBsZXRlLgorCQkgKi8KKwkJaWYgKGRlbGV0ZWQpCisJCQlicmVhazsKKworCQlvY2ZzMl9tdl9wYXRoKGxlZnRfcGF0aCwgcmlnaHRfcGF0aCk7CisKKwkJcmV0ID0gb2NmczJfZmluZF9jcG9zX2Zvcl9yaWdodF9sZWFmKGlub2RlLT5pX3NiLCBsZWZ0X3BhdGgsCisJCQkJCQkgICAgICZyaWdodF9jcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgocmlnaHRfcGF0aCk7CisJb2NmczJfZnJlZV9wYXRoKGxlZnRfcGF0aCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3JlbW92ZV9yaWdodG1vc3RfcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCwgc3VidHJlZV9pbmRleDsKKwl1MzIgY3BvczsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCisJLyoKKwkgKiBYWFg6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHJvb3QgaXMgYW4gaW5vZGUsIHdoaWNoIGlzCisJICogdHJ1ZSBmb3Igbm93IGJ1dCBtYXkgY2hhbmdlIGFzIHRyZWUgY29kZSBnZXRzIGdlbmVyaWMuCisJICovCisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXBhdGhfcm9vdF9iaChwYXRoKS0+Yl9kYXRhOworCWlmICghT0NGUzJfSVNfVkFMSURfRElOT0RFKGRpKSkgeworCQlyZXQgPSAtRUlPOworCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSAgICAiSW5vZGUgJWxsdSBoYXMgaW52YWxpZCBwYXRoIHJvb3QiLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGVyZSdzIHR3byB3YXlzIHdlIGhhbmRsZSB0aGlzIGRlcGVuZGluZyBvbgorCSAqIHdoZXRoZXIgcGF0aCBpcyB0aGUgb25seSBleGlzdGluZyBvbmUuCisJICovCisJcmV0ID0gb2NmczJfZXh0ZW5kX3JvdGF0ZV90cmFuc2FjdGlvbihoYW5kbGUsIDAsCisJCQkJCSAgICAgIGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cywKKwkJCQkJICAgICAgcGF0aCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX3BhdGgoaW5vZGUsIGhhbmRsZSwgcGF0aCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfbGVmdF9sZWFmKGlub2RlLT5pX3NiLCBwYXRoLCAmY3Bvcyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjcG9zKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYSBwYXRoIHRvIHRoZSBsZWZ0IG9mIHRoaXMgb25lIC0gaXQgbmVlZHMKKwkJICogYW4gdXBkYXRlIHRvby4KKwkJICovCisJCWxlZnRfcGF0aCA9IG9jZnMyX25ld19wYXRoKHBhdGhfcm9vdF9iaChwYXRoKSwKKwkJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwkJaWYgKCFsZWZ0X3BhdGgpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgbGVmdF9wYXRoLCBjcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3VidHJlZV9pbmRleCA9IG9jZnMyX2ZpbmRfc3VidHJlZV9yb290KGlub2RlLCBsZWZ0X3BhdGgsIHBhdGgpOworCisJCW9jZnMyX3VubGlua19zdWJ0cmVlKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCwgcGF0aCwKKwkJCQkgICAgIHN1YnRyZWVfaW5kZXgsIGRlYWxsb2MpOworCQlvY2ZzMl91cGRhdGVfZWRnZV9sZW5ndGhzKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCk7CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKXBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLT5iX2RhdGE7CisJCWRpLT5pX2xhc3RfZWJfYmxrID0gZWItPmhfYmxrbm87CisJfSBlbHNlIHsKKwkJLyoKKwkJICogJ3BhdGgnIGlzIGFsc28gdGhlIGxlZnRtb3N0IHBhdGggd2hpY2gKKwkJICogbWVhbnMgaXQgbXVzdCBiZSB0aGUgb25seSBvbmUuIFRoaXMgZ2V0cworCQkgKiBoYW5kbGVkIGRpZmZlcmVudGx5IGJlY2F1c2Ugd2Ugd2FudCB0bworCQkgKiByZXZlcnQgdGhlIGlub2RlIGJhY2sgdG8gaGF2aW5nIGV4dGVudHMKKwkJICogaW4tbGluZS4KKwkJICovCisJCW9jZnMyX3VubGlua19wYXRoKGlub2RlLCBoYW5kbGUsIGRlYWxsb2MsIHBhdGgsIDEpOworCisJCWVsID0gJmRpLT5pZDIuaV9saXN0OworCQllbC0+bF90cmVlX2RlcHRoID0gMDsKKwkJZWwtPmxfbmV4dF9mcmVlX3JlYyA9IDA7CisJCW1lbXNldCgmZWwtPmxfcmVjc1swXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisKKwkJZGktPmlfbGFzdF9lYl9ibGsgPSAwOworCX0KKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBwYXRoX3Jvb3RfYmgocGF0aCkpOworCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKGxlZnRfcGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIExlZnQgcm90YXRpb24gb2YgYnRyZWUgcmVjb3Jkcy4KKyAqCisgKiBJbiBtYW55IHdheXMsIHRoaXMgaXMgKHVuc3VycHJpc2luZ2x5KSB0aGUgb3Bwb3NpdGUgb2YgcmlnaHQKKyAqIHJvdGF0aW9uLiBXZSBzdGFydCBhdCBzb21lIG5vbi1yaWdodG1vc3QgcGF0aCBjb250YWluaW5nIGFuIGVtcHR5CisgKiBleHRlbnQgaW4gdGhlIGxlYWYgYmxvY2suIFRoZSBjb2RlIHdvcmtzIGl0cyB3YXkgdG8gdGhlIHJpZ2h0bW9zdAorICogcGF0aCBieSByb3RhdGluZyByZWNvcmRzIHRvIHRoZSBsZWZ0IGluIGV2ZXJ5IHN1YnRyZWUuCisgKgorICogVGhpcyBpcyB1c2VkIGJ5IGFueSBjb2RlIHdoaWNoIHJlZHVjZXMgdGhlIG51bWJlciBvZiBleHRlbnQgcmVjb3JkcworICogaW4gYSBsZWFmLiBBZnRlciByZW1vdmFsLCBhbiBlbXB0eSByZWNvcmQgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUKKyAqIGxlZnRtb3N0IGxpc3QgcG9zaXRpb24uCisgKgorICogVGhpcyB3b24ndCBoYW5kbGUgYSBsZW5ndGggdXBkYXRlIG9mIHRoZSByaWdodG1vc3QgcGF0aCByZWNvcmRzIGlmCisgKiB0aGUgcmlnaHRtb3N0IHRyZWUgbGVhZiByZWNvcmQgaXMgcmVtb3ZlZCBzbyB0aGUgY2FsbGVyIGlzCisgKiByZXNwb25zaWJsZSBmb3IgZGV0ZWN0aW5nIGFuZCBjb3JyZWN0aW5nIHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcm90YXRlX3RyZWVfbGVmdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0LCBvcmlnX2NyZWRpdHMgPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJc3RydWN0IG9jZnMyX3BhdGggKnRtcF9wYXRoID0gTlVMTCwgKnJlc3RhcnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCWlmICghb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGF0aC0+cF90cmVlX2RlcHRoID09IDApIHsKK3JpZ2h0bW9zdF9ub19kZWxldGU6CisJCS8qCisJCSAqIEluLWlub2RlIGV4dGVudHMuIFRoaXMgaXMgdHJpdmlhbGx5IGhhbmRsZWQsIHNvIGRvCisJCSAqIGl0IHVwIGZyb250LgorCQkgKi8KKwkJcmV0ID0gb2NmczJfcm90YXRlX3JpZ2h0bW9zdF9sZWFmX2xlZnQoaW5vZGUsIGhhbmRsZSwKKwkJCQkJCSAgICAgICBwYXRoX2xlYWZfYmgocGF0aCksCisJCQkJCQkgICAgICAgcGF0aF9sZWFmX2VsKHBhdGgpKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBIYW5kbGUgcmlnaHRtb3N0IGJyYW5jaCBub3cuIFRoZXJlJ3Mgc2V2ZXJhbCBjYXNlczoKKwkgKiAgMSkgc2ltcGxlIHJvdGF0aW9uIGxlYXZpbmcgcmVjb3JkcyBpbiB0aGVyZS4gVGhhdCdzIHRyaXZpYWwuCisJICogIDIpIHJvdGF0aW9uIHJlcXVpcmluZyBhIGJyYW5jaCBkZWxldGUgLSB0aGVyZSdzIG5vIG1vcmUKKwkgKiAgICAgcmVjb3JkcyBsZWZ0LiBUd28gY2FzZXMgb2YgdGhpczoKKwkgKiAgICAgYSkgVGhlcmUgYXJlIGJyYW5jaGVzIHRvIHRoZSBsZWZ0LgorCSAqICAgICBiKSBUaGlzIGlzIGFsc28gdGhlIGxlZnRtb3N0ICh0aGUgb25seSkgYnJhbmNoLgorCSAqCisJICogIDEpIGlzIGhhbmRsZWQgdmlhIG9jZnMyX3JvdGF0ZV9yaWdodG1vc3RfbGVhZl9sZWZ0KCkKKwkgKiAgMmEpIHdlIG5lZWQgdGhlIGxlZnQgYnJhbmNoIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSBpdCB3aXRoIHRoZSB1bmxpbmsKKwkgKiAgMmIpIHdlIG5lZWQgdG8gYnJpbmcgdGhlIGlub2RlIGJhY2sgdG8gaW5saW5lIGV4dGVudHMuCisJICovCisKKwllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKHBhdGgpLT5iX2RhdGE7CisJZWwgPSAmZWItPmhfbGlzdDsKKwlpZiAoZWItPmhfbmV4dF9sZWFmX2JsayA9PSAwKSB7CisJCS8qCisJCSAqIFRoaXMgZ2V0cyBhIGJpdCB0cmlja3kgaWYgd2UncmUgZ29pbmcgdG8gZGVsZXRlIHRoZQorCQkgKiByaWdodG1vc3QgcGF0aC4gR2V0IHRoZSBvdGhlciBjYXNlcyBvdXQgb2YgdGhlIHdheQorCQkgKiAxc3QuCisJCSAqLworCQlpZiAobGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykgPiAxKQorCQkJZ290byByaWdodG1vc3Rfbm9fZGVsZXRlOworCisJCWlmIChsZTE2X3RvX2NwdShlbC0+bF9uZXh0X2ZyZWVfcmVjKSA9PSAwKSB7CisJCQlyZXQgPSAtRUlPOworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbGx1IGhhcyBlbXB0eSBleHRlbnQgYmxvY2sgYXQgJWxsdSIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFhYWDogVGhlIGNhbGxlciBjYW4gbm90IHRydXN0ICJwYXRoIiBhbnkgbW9yZSBhZnRlcgorCQkgKiB0aGlzIGFzIGl0IHdpbGwgaGF2ZSBiZWVuIGRlbGV0ZWQuIFdoYXQgZG8gd2UgZG8/CisJCSAqCisJCSAqIEluIHRoZW9yeSB0aGUgcm90YXRlLWZvci1tZXJnZSBjb2RlIHdpbGwgbmV2ZXIgZ2V0CisJCSAqIGhlcmUgYmVjYXVzZSBpdCdsbCBhbHdheXMgYXNrIGZvciBhIHJvdGF0ZSBpbiBhCisJCSAqIG5vbmVtcHR5IGxpc3QuCisJCSAqLworCisJCXJldCA9IG9jZnMyX3JlbW92ZV9yaWdodG1vc3RfcGF0aChpbm9kZSwgaGFuZGxlLCBwYXRoLAorCQkJCQkJICBkZWFsbG9jKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBOb3cgd2UgY2FuIGxvb3AsIHJlbWVtYmVyaW5nIHRoZSBwYXRoIHdlIGdldCBmcm9tIC1FQUdBSU4KKwkgKiBhbmQgcmVzdGFydGluZyBmcm9tIHRoZXJlLgorCSAqLwordHJ5X3JvdGF0ZToKKwlyZXQgPSBfX29jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgb3JpZ19jcmVkaXRzLCBwYXRoLAorCQkJCSAgICAgICBkZWFsbG9jLCAmcmVzdGFydF9wYXRoKTsKKwlpZiAocmV0ICYmIHJldCAhPSAtRUFHQUlOKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKHJldCA9PSAtRUFHQUlOKSB7CisJCXRtcF9wYXRoID0gcmVzdGFydF9wYXRoOworCQlyZXN0YXJ0X3BhdGggPSBOVUxMOworCisJCXJldCA9IF9fb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBvcmlnX2NyZWRpdHMsCisJCQkJCSAgICAgICB0bXBfcGF0aCwgZGVhbGxvYywKKwkJCQkJICAgICAgICZyZXN0YXJ0X3BhdGgpOworCQlpZiAocmV0ICYmIHJldCAhPSAtRUFHQUlOKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW9jZnMyX2ZyZWVfcGF0aCh0bXBfcGF0aCk7CisJCXRtcF9wYXRoID0gTlVMTDsKKworCQlpZiAocmV0ID09IDApCisJCQlnb3RvIHRyeV9yb3RhdGU7CisJfQorCitvdXQ6CisJb2NmczJfZnJlZV9wYXRoKHRtcF9wYXRoKTsKKwlvY2ZzMl9mcmVlX3BhdGgocmVzdGFydF9wYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvY2ZzMl9jbGVhbnVwX21lcmdlKHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsCisJCQkJaW50IGluZGV4KQoreworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMgPSAmZWwtPmxfcmVjc1tpbmRleF07CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlpZiAocmVjLT5lX2xlYWZfY2x1c3RlcnMgPT0gMCkgeworCQkvKgorCQkgKiBXZSBjb25zdW1lZCBhbGwgb2YgdGhlIG1lcmdlZC1mcm9tIHJlY29yZC4gQW4gZW1wdHkKKwkJICogZXh0ZW50IGNhbm5vdCBleGlzdCBhbnl3aGVyZSBidXQgdGhlIDFzdCBhcnJheQorCQkgKiBwb3NpdGlvbiwgc28gbW92ZSB0aGluZ3Mgb3ZlciBpZiB0aGUgbWVyZ2VkLWZyb20KKwkJICogcmVjb3JkIGRvZXNuJ3Qgb2NjdXB5IHRoYXQgcG9zaXRpb24uCisJCSAqCisJCSAqIFRoaXMgY3JlYXRlcyBhIG5ldyBlbXB0eSBleHRlbnQgc28gdGhlIGNhbGxlcgorCQkgKiBzaG91bGQgYmUgc21hcnQgZW5vdWdoIHRvIGhhdmUgcmVtb3ZlZCBhbnkgZXhpc3RpbmcKKwkJICogb25lcy4KKwkJICovCisJCWlmIChpbmRleCA+IDApIHsKKwkJCUJVR19PTihvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmVsLT5sX3JlY3NbMF0pKTsKKwkJCXNpemUgPSBpbmRleCAqIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyk7CisJCQltZW1tb3ZlKCZlbC0+bF9yZWNzWzFdLCAmZWwtPmxfcmVjc1swXSwgc2l6ZSk7CisJCX0KKworCQkvKgorCQkgKiBBbHdheXMgbWVtc2V0IC0gdGhlIGNhbGxlciBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgaXQKKwkJICogY3JlYXRlZCBhbiBlbXB0eSBleHRlbnQsIHNvIHRoZXJlIGNvdWxkIGJlIGp1bmsgaW4KKwkJICogdGhlIG90aGVyIGZpZWxkcy4KKwkJICovCisJCW1lbXNldCgmZWwtPmxfcmVjc1swXSwgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisJfQorfQorCisvKgorICogUmVtb3ZlIHNwbGl0X3JlYyBjbHVzdGVycyBmcm9tIHRoZSByZWNvcmQgYXQgaW5kZXggYW5kIG1lcmdlIHRoZW0KKyAqIG9udG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVjb3JkIGF0IGluZGV4ICsgMS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9tZXJnZV9yZWNfcmlnaHQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQloYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgaW50IGluZGV4KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHNwbGl0X2NsdXN0ZXJzID0gbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpsZWZ0X3JlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmlnaHRfcmVjOworCisJQlVHX09OKGluZGV4ID49IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKTsKKworCWxlZnRfcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCXJpZ2h0X3JlYyA9ICZlbC0+bF9yZWNzW2luZGV4ICsgMV07CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWxlMTZfYWRkX2NwdSgmbGVmdF9yZWMtPmVfbGVhZl9jbHVzdGVycywgLXNwbGl0X2NsdXN0ZXJzKTsKKworCWxlMzJfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2Nwb3MsIC1zcGxpdF9jbHVzdGVycyk7CisJbGU2NF9hZGRfY3B1KCZyaWdodF9yZWMtPmVfYmxrbm8sCisJCSAgICAgLW9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgc3BsaXRfY2x1c3RlcnMpKTsKKwlsZTE2X2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzLCBzcGxpdF9jbHVzdGVycyk7CisKKwlvY2ZzMl9jbGVhbnVwX21lcmdlKGVsLCBpbmRleCk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCWlmIChyZXQpCisJCW1sb2dfZXJybm8ocmV0KTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZW1vdmUgc3BsaXRfcmVjIGNsdXN0ZXJzIGZyb20gdGhlIHJlY29yZCBhdCBpbmRleCBhbmQgbWVyZ2UgdGhlbQorICogb250byB0aGUgdGFpbCBvZiB0aGUgcmVjb3JkIGF0IGluZGV4IC0gMS4KKyAqLworc3RhdGljIGludCBvY2ZzMl9tZXJnZV9yZWNfbGVmdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCWhhbmRsZV90ICpoYW5kbGUsCisJCQkJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKKwkJCQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLCBpbnQgaW5kZXgpCit7CisJaW50IHJldCwgaGFzX2VtcHR5X2V4dGVudCA9IDA7CisJdW5zaWduZWQgaW50IHNwbGl0X2NsdXN0ZXJzID0gbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpsZWZ0X3JlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmlnaHRfcmVjOworCisJQlVHX09OKGluZGV4IDw9IDApOworCisJbGVmdF9yZWMgPSAmZWwtPmxfcmVjc1tpbmRleCAtIDFdOworCXJpZ2h0X3JlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlpZiAob2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSkKKwkJaGFzX2VtcHR5X2V4dGVudCA9IDE7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChoYXNfZW1wdHlfZXh0ZW50ICYmIGluZGV4ID09IDEpIHsKKwkJLyoKKwkJICogVGhlIGVhc3kgY2FzZSAtIHdlIGNhbiBqdXN0IHBsb3AgdGhlIHJlY29yZCByaWdodCBpbi4KKwkJICovCisJCSpsZWZ0X3JlYyA9ICpzcGxpdF9yZWM7CisKKwkJaGFzX2VtcHR5X2V4dGVudCA9IDA7CisJfSBlbHNlIHsKKwkJbGUxNl9hZGRfY3B1KCZsZWZ0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzLCBzcGxpdF9jbHVzdGVycyk7CisJfQorCisJbGUzMl9hZGRfY3B1KCZyaWdodF9yZWMtPmVfY3Bvcywgc3BsaXRfY2x1c3RlcnMpOworCWxlNjRfYWRkX2NwdSgmcmlnaHRfcmVjLT5lX2Jsa25vLAorCQkgICAgIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgc3BsaXRfY2x1c3RlcnMpKTsKKwlsZTE2X2FkZF9jcHUoJnJpZ2h0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzLCAtc3BsaXRfY2x1c3RlcnMpOworCisJb2NmczJfY2xlYW51cF9tZXJnZShlbCwgaW5kZXgpOworCisJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3RyeV90b19tZXJnZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICBzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoLAorCQkJCSAgICAgaW50IHNwbGl0X2luZGV4LAorCQkJCSAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKKwkJCQkgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX21lcmdlX2N0eHQgKmN0eHQpCisKK3sKKwlpbnQgcmV0ID0gMCwgZGVsZXRlX3RhaWxfcmVjcyA9IDA7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMgPSAmZWwtPmxfcmVjc1tzcGxpdF9pbmRleF07CisKKwlCVUdfT04oY3R4dC0+Y19jb250aWdfdHlwZSA9PSBDT05USUdfTk9ORSk7CisKKwlpZiAoY3R4dC0+Y19zcGxpdF9jb3ZlcnNfcmVjKSB7CisJCWRlbGV0ZV90YWlsX3JlY3MrKzsKKworCQlpZiAoY3R4dC0+Y19jb250aWdfdHlwZSA9PSBDT05USUdfTEVGVFJJR0hUIHx8CisJCSAgICBjdHh0LT5jX2hhc19lbXB0eV9leHRlbnQpCisJCQlkZWxldGVfdGFpbF9yZWNzKys7CisKKwkJaWYgKGN0eHQtPmNfaGFzX2VtcHR5X2V4dGVudCkgeworCQkJLyoKKwkJCSAqIFRoZSBtZXJnZSBjb2RlIHdpbGwgbmVlZCB0byBjcmVhdGUgYW4gZW1wdHkKKwkJCSAqIGV4dGVudCB0byB0YWtlIHRoZSBwbGFjZSBvZiB0aGUgbmV3bHkKKwkJCSAqIGVtcHRpZWQgc2xvdC4gUmVtb3ZlIGFueSBwcmUtZXhpc3RpbmcgZW1wdHkKKwkJCSAqIGV4dGVudHMgLSBoYXZpbmcgbW9yZSB0aGFuIG9uZSBpbiBhIGxlYWYgaXMKKwkJCSAqIGlsbGVnYWwuCisJCQkgKi8KKwkJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkJICAgICBkZWFsbG9jKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzcGxpdF9pbmRleC0tOworCQkJcmVjID0gJmVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOworCQl9CisJfQorCisJaWYgKGN0eHQtPmNfY29udGlnX3R5cGUgPT0gQ09OVElHX0xFRlRSSUdIVCkgeworCQkvKgorCQkgKiBMZWZ0LXJpZ2h0IGNvbnRpZyBpbXBsaWVzIHRoaXMuCisJCSAqLworCQlCVUdfT04oIWN0eHQtPmNfc3BsaXRfY292ZXJzX3JlYyk7CisJCUJVR19PTihzcGxpdF9pbmRleCA9PSAwKTsKKworCQkvKgorCQkgKiBTaW5jZSB0aGUgbGVmdHJpZ2h0IGluc2VydCBhbHdheXMgY292ZXJzIHRoZSBlbnRpcmUKKwkJICogZXh0ZW50LCB0aGlzIGNhbGwgd2lsbCBkZWxldGUgdGhlIGluc2VydCByZWNvcmQKKwkJICogZW50aXJlbHksIHJlc3VsdGluZyBpbiBhbiBlbXB0eSBleHRlbnQgcmVjb3JkIGFkZGVkIHRvCisJCSAqIHRoZSBleHRlbnQgYmxvY2suCisJCSAqCisJCSAqIFNpbmNlIHRoZSBhZGRpbmcgb2YgYW4gZW1wdHkgZXh0ZW50IHNoaWZ0cworCQkgKiBldmVyeXRoaW5nIGJhY2sgdG8gdGhlIHJpZ2h0LCB0aGVyZSdzIG5vIG5lZWQgdG8KKwkJICogdXBkYXRlIHNwbGl0X2luZGV4IGhlcmUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9tZXJnZV9yZWNfbGVmdChpbm9kZSwgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCksCisJCQkJCSAgIGhhbmRsZSwgc3BsaXRfcmVjLCBlbCwgc3BsaXRfaW5kZXgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIFdlIGNhbiBvbmx5IGdldCB0aGlzIGZyb20gbG9naWMgZXJyb3IgYWJvdmUuCisJCSAqLworCQlCVUdfT04oIW9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpOworCisJCS8qCisJCSAqIFRoZSBsZWZ0IG1lcmdlIGxlZnQgdXMgd2l0aCBhbiBlbXB0eSBleHRlbnQsIHJlbW92ZQorCQkgKiBpdC4KKwkJICovCisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLCBkZWFsbG9jKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3BsaXRfaW5kZXgtLTsKKwkJcmVjID0gJmVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOworCisJCS8qCisJCSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBwYXNzIHNwbGl0X3JlYyBoZXJlIG9uIHB1cnBvc2UgLQorCQkgKiB3ZSd2ZSBtZXJnZWQgaXQgaW50byB0aGUgbGVmdCBzaWRlLgorCQkgKi8KKwkJcmV0ID0gb2NmczJfbWVyZ2VfcmVjX3JpZ2h0KGlub2RlLCBwYXRoX2xlYWZfYmgobGVmdF9wYXRoKSwKKwkJCQkJICAgIGhhbmRsZSwgcmVjLCBlbCwgc3BsaXRfaW5kZXgpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCUJVR19PTighb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZlbC0+bF9yZWNzWzBdKSk7CisKKwkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCSAgICAgZGVhbGxvYyk7CisJCS8qCisJCSAqIEVycm9yIGZyb20gdGhpcyBsYXN0IHJvdGF0ZSBpcyBub3QgY3JpdGljYWwsIHNvCisJCSAqIHByaW50IGJ1dCBkb24ndCBidWJibGUgaXQgdXAuCisJCSAqLworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE1lcmdlIGEgcmVjb3JkIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0LgorCQkgKgorCQkgKiAnY29udGlnX3R5cGUnIGlzIHJlbGF0aXZlIHRvIHRoZSBleGlzdGluZyByZWNvcmQsCisJCSAqIHNvIGZvciBleGFtcGxlLCBpZiB3ZSdyZSAicmlnaHQgY29udGlnIiwgaXQncyB0bworCQkgKiB0aGUgcmVjb3JkIG9uIHRoZSBsZWZ0IChoZW5jZSB0aGUgbGVmdCBtZXJnZSkuCisJCSAqLworCQlpZiAoY3R4dC0+Y19jb250aWdfdHlwZSA9PSBDT05USUdfUklHSFQpIHsKKwkJCXJldCA9IG9jZnMyX21lcmdlX3JlY19sZWZ0KGlub2RlLAorCQkJCQkJICAgcGF0aF9sZWFmX2JoKGxlZnRfcGF0aCksCisJCQkJCQkgICBoYW5kbGUsIHNwbGl0X3JlYywgZWwsCisJCQkJCQkgICBzcGxpdF9pbmRleCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0ID0gb2NmczJfbWVyZ2VfcmVjX3JpZ2h0KGlub2RlLAorCQkJCQkJICAgIHBhdGhfbGVhZl9iaChsZWZ0X3BhdGgpLAorCQkJCQkJICAgIGhhbmRsZSwgc3BsaXRfcmVjLCBlbCwKKwkJCQkJCSAgICBzcGxpdF9pbmRleCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisKKwkJaWYgKGN0eHQtPmNfc3BsaXRfY292ZXJzX3JlYykgeworCQkJLyoKKwkJCSAqIFRoZSBtZXJnZSBtYXkgaGF2ZSBsZWZ0IGFuIGVtcHR5IGV4dGVudCBpbgorCQkJICogb3VyIGxlYWYuIFRyeSB0byByb3RhdGUgaXQgYXdheS4KKwkJCSAqLworCQkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfbGVmdChpbm9kZSwgaGFuZGxlLCBsZWZ0X3BhdGgsCisJCQkJCQkgICAgIGRlYWxsb2MpOworCQkJaWYgKHJldCkKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQlyZXQgPSAwOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgb2NmczJfc3VidHJhY3RfZnJvbV9yZWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgZW51bSBvY2ZzMl9zcGxpdF90eXBlIHNwbGl0LAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjLAorCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjKQoreworCXU2NCBsZW5fYmxvY2tzOworCisJbGVuX2Jsb2NrcyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhzYiwKKwkJCQlsZTE2X3RvX2NwdShzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOworCisJaWYgKHNwbGl0ID09IFNQTElUX0xFRlQpIHsKKwkJLyoKKwkJICogUmVnaW9uIGlzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGV4aXN0aW5nCisJCSAqIHJlY29yZC4KKwkJICovCisJCWxlMzJfYWRkX2NwdSgmcmVjLT5lX2Nwb3MsCisJCQkgICAgIGxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJCWxlNjRfYWRkX2NwdSgmcmVjLT5lX2Jsa25vLCBsZW5fYmxvY2tzKTsKKwkJbGUxNl9hZGRfY3B1KCZyZWMtPmVfbGVhZl9jbHVzdGVycywKKwkJCSAgICAgLWxlMTZfdG9fY3B1KHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVnaW9uIGlzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBleGlzdGluZworCQkgKiByZWNvcmQuCisJCSAqLworCQlsZTE2X2FkZF9jcHUoJnJlYy0+ZV9sZWFmX2NsdXN0ZXJzLAorCQkJICAgICAtbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKwl9Cit9CisKIC8qCiAgKiBEbyB0aGUgZmluYWwgYml0cyBvZiBleHRlbnQgcmVjb3JkIGluc2VydGlvbiBhdCB0aGUgdGFyZ2V0IGxlYWYKICAqIGxpc3QuIElmIHRoaXMgbGVhZiBpcyBwYXJ0IG9mIGFuIGFsbG9jYXRpb24gdHJlZSwgaXQgaXMgYXNzdW1lZApAQCAtMTczOCw2ICsyOTk0LDE1IEBACiAKIAlCVUdfT04obGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCkgIT0gMCk7CiAKKwlpZiAoaW5zZXJ0LT5pbnNfc3BsaXQgIT0gU1BMSVRfTk9ORSkgeworCQlpID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBsZTMyX3RvX2NwdShpbnNlcnRfcmVjLT5lX2Nwb3MpKTsKKwkJQlVHX09OKGkgPT0gLTEpOworCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKKwkJb2NmczJfc3VidHJhY3RfZnJvbV9yZWMoaW5vZGUtPmlfc2IsIGluc2VydC0+aW5zX3NwbGl0LCByZWMsCisJCQkJCWluc2VydF9yZWMpOworCQlnb3RvIHJvdGF0ZTsKKwl9CisKIAkvKgogCSAqIENvbnRpZ3VvdXMgaW5zZXJ0IC0gZWl0aGVyIGxlZnQgb3IgcmlnaHQuCiAJICovCkBAIC0xNzkyLDYgKzMwNTcsNyBAQAogCQlyZXR1cm47CiAJfQogCityb3RhdGU6CiAJLyoKIAkgKiBPaywgd2UgaGF2ZSB0byByb3RhdGUuCiAJICoKQEAgLTE4MTUsMTMgKzMwODEsNTMgQEAKIAlzcGluX3VubG9jaygmT0NGUzJfSShpbm9kZSktPmlwX2xvY2spOwogfQogCitzdGF0aWMgdm9pZCBvY2ZzMl9hZGp1c3RfcmlnaHRtb3N0X3JlY29yZHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkJICAgc3RydWN0IG9jZnMyX3BhdGggKnBhdGgsCisJCQkJCSAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICppbnNlcnRfcmVjKQoreworCWludCByZXQsIGksIG5leHRfZnJlZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKworCS8qCisJICogVXBkYXRlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBsZWFmIGJsb2NrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYXRoLT5wX3RyZWVfZGVwdGg7IGkrKykgeworCQliaCA9IHBhdGgtPnBfbm9kZVtpXS5iaDsKKwkJZWwgPSBwYXRoLT5wX25vZGVbaV0uZWw7CisKKwkJbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJCWlmIChuZXh0X2ZyZWUgPT0gMCkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJEaW5vZGUgJWxsdSBoYXMgYSBiYWQgZXh0ZW50IGxpc3QiLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisJCQlyZXQgPSAtRUlPOworCQkJcmV0dXJuOworCQl9CisKKwkJcmVjID0gJmVsLT5sX3JlY3NbbmV4dF9mcmVlIC0gMV07CisKKwkJcmVjLT5lX2ludF9jbHVzdGVycyA9IGluc2VydF9yZWMtPmVfY3BvczsKKwkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLAorCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKwkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfaW50X2NsdXN0ZXJzLAorCQkJICAgICAtbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpKTsKKworCQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgYmgpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCisJfQorfQorCiBzdGF0aWMgaW50IG9jZnMyX2FwcGVuZF9yZWNfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqaW5zZXJ0X3JlYywKIAkJCQkgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCiAJCQkJICAgIHN0cnVjdCBvY2ZzMl9wYXRoICoqcmV0X2xlZnRfcGF0aCkKIHsKLQlpbnQgcmV0LCBpLCBuZXh0X2ZyZWU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgcmV0LCBuZXh0X2ZyZWU7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKIApAQCAtMTg4Nyw0MCArMzE5Myw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWVsID0gcGF0aF9yb290X2VsKHJpZ2h0X3BhdGgpOwotCWJoID0gcGF0aF9yb290X2JoKHJpZ2h0X3BhdGgpOwotCWkgPSAwOwotCXdoaWxlICgxKSB7Ci0JCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7Ci0KLQkJbmV4dF9mcmVlID0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7Ci0JCWlmIChuZXh0X2ZyZWUgPT0gMCkgewotCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCi0JCQkJICAgICJEaW5vZGUgJWxsdSBoYXMgYSBiYWQgZXh0ZW50IGxpc3QiLAotCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlyZWMgPSAmZWwtPmxfcmVjc1tuZXh0X2ZyZWUgLSAxXTsKLQotCQlyZWMtPmVfaW50X2NsdXN0ZXJzID0gaW5zZXJ0X3JlYy0+ZV9jcG9zOwotCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9pbnRfY2x1c3RlcnMsCi0JCQkgICAgIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOwotCQlsZTMyX2FkZF9jcHUoJnJlYy0+ZV9pbnRfY2x1c3RlcnMsCi0JCQkgICAgIC1sZTMyX3RvX2NwdShyZWMtPmVfY3BvcykpOwotCi0JCXJldCA9IG9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBiaCk7Ci0JCWlmIChyZXQpCi0JCQltbG9nX2Vycm5vKHJldCk7Ci0KLQkJLyogRG9uJ3QgdG91Y2ggdGhlIGxlYWYgbm9kZSAqLwotCQlpZiAoKytpID49IHJpZ2h0X3BhdGgtPnBfdHJlZV9kZXB0aCkKLQkJCWJyZWFrOwotCi0JCWJoID0gcmlnaHRfcGF0aC0+cF9ub2RlW2ldLmJoOwotCQllbCA9IHJpZ2h0X3BhdGgtPnBfbm9kZVtpXS5lbDsKLQl9CisJb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKGlub2RlLCBoYW5kbGUsIHJpZ2h0X3BhdGgsIGluc2VydF9yZWMpOwogCiAJKnJldF9sZWZ0X3BhdGggPSBsZWZ0X3BhdGg7CiAJcmV0ID0gMDsKQEAgLTE5MzEsNiArMzIwNCw4MyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG9jZnMyX3NwbGl0X3JlY29yZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpsZWZ0X3BhdGgsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX3BhdGggKnJpZ2h0X3BhdGgsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKKwkJCSAgICAgICBlbnVtIG9jZnMyX3NwbGl0X3R5cGUgc3BsaXQpCit7CisJaW50IGluZGV4OworCXUzMiBjcG9zID0gbGUzMl90b19jcHUoc3BsaXRfcmVjLT5lX2Nwb3MpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqbGVmdF9lbCA9IE5VTEwsICpyaWdodF9lbCwgKmluc2VydF9lbCwgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMsICp0bXByZWM7CisKKwlyaWdodF9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTs7CisJaWYgKGxlZnRfcGF0aCkKKwkJbGVmdF9lbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOworCisJZWwgPSByaWdodF9lbDsKKwlpbnNlcnRfZWwgPSByaWdodF9lbDsKKwlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJaWYgKGluZGV4ICE9IC0xKSB7CisJCWlmIChpbmRleCA9PSAwICYmIGxlZnRfcGF0aCkgeworCQkJQlVHX09OKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpOworCisJCQkvKgorCQkJICogVGhpcyB0eXBpY2FsbHkgbWVhbnMgdGhhdCB0aGUgcmVjb3JkCisJCQkgKiBzdGFydGVkIGluIHRoZSBsZWZ0IHBhdGggYnV0IG1vdmVkIHRvIHRoZQorCQkJICogcmlnaHQgYXMgYSByZXN1bHQgb2Ygcm90YXRpb24uIFdlIGVpdGhlcgorCQkJICogbW92ZSB0aGUgZXhpc3RpbmcgcmVjb3JkIHRvIHRoZSBsZWZ0LCBvciB3ZQorCQkJICogZG8gdGhlIGxhdGVyIGluc2VydCB0aGVyZS4KKwkJCSAqCisJCQkgKiBJbiB0aGlzIGNhc2UsIHRoZSBsZWZ0IHBhdGggc2hvdWxkIGFsd2F5cworCQkJICogZXhpc3QgYXMgdGhlIHJvdGF0ZSBjb2RlIHdpbGwgaGF2ZSBwYXNzZWQKKwkJCSAqIGl0IGJhY2sgZm9yIGEgcG9zdC1pbnNlcnQgdXBkYXRlLgorCQkJICovCisKKwkJCWlmIChzcGxpdCA9PSBTUExJVF9MRUZUKSB7CisJCQkJLyoKKwkJCQkgKiBJdCdzIGEgbGVmdCBzcGxpdC4gU2luY2Ugd2Uga25vdworCQkJCSAqIHRoYXQgdGhlIHJvdGF0ZSBjb2RlIGdhdmUgdXMgYW4KKwkJCQkgKiBlbXB0eSBleHRlbnQgaW4gdGhlIGxlZnQgcGF0aCwgd2UKKwkJCQkgKiBjYW4ganVzdCBkbyB0aGUgaW5zZXJ0IHRoZXJlLgorCQkJCSAqLworCQkJCWluc2VydF9lbCA9IGxlZnRfZWw7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogUmlnaHQgc3BsaXQgLSB3ZSBoYXZlIHRvIG1vdmUgdGhlCisJCQkJICogZXhpc3RpbmcgcmVjb3JkIG92ZXIgdG8gdGhlIGxlZnQKKwkJCQkgKiBsZWFmLiBUaGUgaW5zZXJ0IHdpbGwgYmUgaW50byB0aGUKKwkJCQkgKiBuZXdseSBjcmVhdGVkIGVtcHR5IGV4dGVudCBpbiB0aGUKKwkJCQkgKiByaWdodCBsZWFmLgorCQkJCSAqLworCQkJCXRtcHJlYyA9ICZyaWdodF9lbC0+bF9yZWNzW2luZGV4XTsKKwkJCQlvY2ZzMl9yb3RhdGVfbGVhZihsZWZ0X2VsLCB0bXByZWMpOworCQkJCWVsID0gbGVmdF9lbDsKKworCQkJCW1lbXNldCh0bXByZWMsIDAsIHNpemVvZigqdG1wcmVjKSk7CisJCQkJaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QobGVmdF9lbCwgY3Bvcyk7CisJCQkJQlVHX09OKGluZGV4ID09IC0xKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCUJVR19PTighbGVmdF9wYXRoKTsKKwkJQlVHX09OKCFvY2ZzMl9pc19lbXB0eV9leHRlbnQoJmxlZnRfZWwtPmxfcmVjc1swXSkpOworCQkvKgorCQkgKiBMZWZ0IHBhdGggaXMgZWFzeSAtIHdlIGNhbiBqdXN0IGFsbG93IHRoZSBpbnNlcnQgdG8KKwkJICogaGFwcGVuLgorCQkgKi8KKwkJZWwgPSBsZWZ0X2VsOworCQlpbnNlcnRfZWwgPSBsZWZ0X2VsOworCQlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJCUJVR19PTihpbmRleCA9PSAtMSk7CisJfQorCisJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCW9jZnMyX3N1YnRyYWN0X2Zyb21fcmVjKGlub2RlLT5pX3NiLCBzcGxpdCwgcmVjLCBzcGxpdF9yZWMpOworCW9jZnMyX3JvdGF0ZV9sZWFmKGluc2VydF9lbCwgc3BsaXRfcmVjKTsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gb25seSBkb2VzIGluc2VydHMgb24gYW4gYWxsb2NhdGlvbiBiLXRyZWUuIEZvciBkaW5vZGUKICAqIGxpc3RzLCBvY2ZzMl9pbnNlcnRfYXRfbGVhZigpIGlzIGNhbGxlZCBkaXJlY3RseS4KQEAgLTE5NDgsNyArMzI5OCw2IEBACiB7CiAJaW50IHJldCwgc3VidHJlZV9pbmRleDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxlYWZfYmggPSBwYXRoX2xlYWZfYmgocmlnaHRfcGF0aCk7Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKIAogCS8qCiAJICogUGFzcyBib3RoIHBhdGhzIHRvIHRoZSBqb3VybmFsLiBUaGUgbWFqb3JpdHkgb2YgaW5zZXJ0cwpAQCAtMTk4NCw5ICszMzMzLDE4IEBACiAJCX0KIAl9CiAKLQllbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKKwlpZiAoaW5zZXJ0LT5pbnNfc3BsaXQgIT0gU1BMSVRfTk9ORSkgeworCQkvKgorCQkgKiBXZSBjb3VsZCBjYWxsIG9jZnMyX2luc2VydF9hdF9sZWFmKCkgZm9yIHNvbWUgdHlwZXMKKwkJICogb2Ygc3BsaXRzLCBidXQgaXQncyBlYXNpZXIgdG8ganVzdCBsZXQgb25lIHNlcGVyYXRlCisJCSAqIGZ1bmN0aW9uIHNvcnQgaXQgYWxsIG91dC4KKwkJICovCisJCW9jZnMyX3NwbGl0X3JlY29yZChpbm9kZSwgbGVmdF9wYXRoLCByaWdodF9wYXRoLAorCQkJCSAgIGluc2VydF9yZWMsIGluc2VydC0+aW5zX3NwbGl0KTsKKwl9IGVsc2UKKwkJb2NmczJfaW5zZXJ0X2F0X2xlYWYoaW5zZXJ0X3JlYywgcGF0aF9sZWFmX2VsKHJpZ2h0X3BhdGgpLAorCQkJCSAgICAgaW5zZXJ0LCBpbm9kZSk7CiAKLQlvY2ZzMl9pbnNlcnRfYXRfbGVhZihpbnNlcnRfcmVjLCBlbCwgaW5zZXJ0LCBpbm9kZSk7CiAJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGxlYWZfYmgpOwogCWlmIChyZXQpCiAJCW1sb2dfZXJybm8ocmV0KTsKQEAgLTIwNzUsNyArMzQzMyw3IEBACiAJICogY2FuIHdpbmQgdXAgc2tpcHBpbmcgYm90aCBvZiB0aGVzZSB0d28gc3BlY2lhbCBjYXNlcy4uLgogCSAqLwogCWlmIChyb3RhdGUpIHsKLQkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfcmlnaHQoaW5vZGUsIGhhbmRsZSwKKwkJcmV0ID0gb2NmczJfcm90YXRlX3RyZWVfcmlnaHQoaW5vZGUsIGhhbmRsZSwgdHlwZS0+aW5zX3NwbGl0LAogCQkJCQkgICAgICBsZTMyX3RvX2NwdShpbnNlcnRfcmVjLT5lX2Nwb3MpLAogCQkJCQkgICAgICByaWdodF9wYXRoLCAmbGVmdF9wYXRoKTsKIAkJaWYgKHJldCkgewpAQCAtMjEwMCw4ICszNDU4LDkgQEAKIAl9CiAKIG91dF91cGRhdGVfY2x1c3RlcnM6Ci0Jb2NmczJfdXBkYXRlX2Rpbm9kZV9jbHVzdGVycyhpbm9kZSwgZGksCi0JCQkJICAgICBsZTE2X3RvX2NwdShpbnNlcnRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKTsKKwlpZiAodHlwZS0+aW5zX3NwbGl0ID09IFNQTElUX05PTkUpCisJCW9jZnMyX3VwZGF0ZV9kaW5vZGVfY2x1c3RlcnMoaW5vZGUsIGRpLAorCQkJCQkgICAgIGxlMTZfdG9fY3B1KGluc2VydF9yZWMtPmVfbGVhZl9jbHVzdGVycykpOwogCiAJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGRpX2JoKTsKIAlpZiAocmV0KQpAQCAtMjExNCw2ICszNDczLDQ0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGVudW0gb2NmczJfY29udGlnX3R5cGUKK29jZnMyX2ZpZ3VyZV9tZXJnZV9jb250aWdfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWwsIGludCBpbmRleCwKKwkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqc3BsaXRfcmVjKQoreworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWM7CisJZW51bSBvY2ZzMl9jb250aWdfdHlwZSByZXQgPSBDT05USUdfTk9ORTsKKworCS8qCisJICogV2UncmUgY2FyZWZ1bCB0byBjaGVjayBmb3IgYW4gZW1wdHkgZXh0ZW50IHJlY29yZCBoZXJlIC0KKwkgKiB0aGUgbWVyZ2UgY29kZSB3aWxsIGtub3cgd2hhdCB0byBkbyBpZiBpdCBzZWVzIG9uZS4KKwkgKi8KKworCWlmIChpbmRleCA+IDApIHsKKwkJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXggLSAxXTsKKwkJaWYgKGluZGV4ID09IDEgJiYgb2NmczJfaXNfZW1wdHlfZXh0ZW50KHJlYykpIHsKKwkJCWlmIChzcGxpdF9yZWMtPmVfY3BvcyA9PSBlbC0+bF9yZWNzW2luZGV4XS5lX2Nwb3MpCisJCQkJcmV0ID0gQ09OVElHX1JJR0hUOworCQl9IGVsc2UgeworCQkJcmV0ID0gb2NmczJfZXh0ZW50X2NvbnRpZyhpbm9kZSwgcmVjLCBzcGxpdF9yZWMpOworCQl9CisJfQorCisJaWYgKGluZGV4IDwgKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMSkpIHsKKwkJZW51bSBvY2ZzMl9jb250aWdfdHlwZSBjb250aWdfdHlwZTsKKworCQlyZWMgPSAmZWwtPmxfcmVjc1tpbmRleCArIDFdOworCQljb250aWdfdHlwZSA9IG9jZnMyX2V4dGVudF9jb250aWcoaW5vZGUsIHJlYywgc3BsaXRfcmVjKTsKKworCQlpZiAoY29udGlnX3R5cGUgPT0gQ09OVElHX0xFRlQgJiYgcmV0ID09IENPTlRJR19SSUdIVCkKKwkJCXJldCA9IENPTlRJR19MRUZUUklHSFQ7CisJCWVsc2UgaWYgKHJldCA9PSBDT05USUdfTk9ORSkKKwkJCXJldCA9IGNvbnRpZ190eXBlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIG9jZnMyX2ZpZ3VyZV9jb250aWdfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2luc2VydF90eXBlICppbnNlcnQsCiAJCQkJICAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLApAQCAtMjIwNSw2ICszNjAyLDggQEAKIAlzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAKKwlpbnNlcnQtPmluc19zcGxpdCA9IFNQTElUX05PTkU7CisKIAllbCA9ICZkaS0+aWQyLmlfbGlzdDsKIAlpbnNlcnQtPmluc190cmVlX2RlcHRoID0gbGUxNl90b19jcHUoZWwtPmxfdHJlZV9kZXB0aCk7CiAKQEAgLTIzMjcsOSArMzcyNiwxMCBAQAogCQkJdTMyIGNwb3MsCiAJCQl1NjQgc3RhcnRfYmxrLAogCQkJdTMyIG5ld19jbHVzdGVycywKKwkJCXU4IGZsYWdzLAogCQkJc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCiB7Ci0JaW50IHN0YXR1cywgc2hpZnQ7CisJaW50IHN0YXR1czsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxhc3RfZWJfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSBpbnNlcnQgPSB7MCwgfTsKQEAgLTIzNTAsNiArMzc1MCw3IEBACiAJcmVjLmVfY3BvcyA9IGNwdV90b19sZTMyKGNwb3MpOwogCXJlYy5lX2Jsa25vID0gY3B1X3RvX2xlNjQoc3RhcnRfYmxrKTsKIAlyZWMuZV9sZWFmX2NsdXN0ZXJzID0gY3B1X3RvX2xlMTYobmV3X2NsdXN0ZXJzKTsKKwlyZWMuZV9mbGFncyA9IGZsYWdzOwogCiAJc3RhdHVzID0gb2NmczJfZmlndXJlX2luc2VydF90eXBlKGlub2RlLCBmZV9iaCwgJmxhc3RfZWJfYmgsICZyZWMsCiAJCQkJCSAgJmluc2VydCk7CkBAIC0yMzY0LDU1ICszNzY1LDE2IEBACiAJICAgICBpbnNlcnQuaW5zX2FwcGVuZGluZywgaW5zZXJ0Lmluc19jb250aWcsIGluc2VydC5pbnNfY29udGlnX2luZGV4LAogCSAgICAgaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMsIGluc2VydC5pbnNfdHJlZV9kZXB0aCk7CiAKLQkvKgotCSAqIEF2b2lkIGdyb3dpbmcgdGhlIHRyZWUgdW5sZXNzIHdlJ3JlIG91dCBvZiByZWNvcmRzIGFuZCB0aGUKLQkgKiBpbnNlcnQgdHlwZSByZXF1cmVzIG9uZS4KLQkgKi8KLQlpZiAoaW5zZXJ0Lmluc19jb250aWcgIT0gQ09OVElHX05PTkUgfHwgaW5zZXJ0Lmluc19mcmVlX3JlY29yZHMpCi0JCWdvdG8gb3V0X2FkZDsKLQotCXNoaWZ0ID0gb2NmczJfZmluZF9icmFuY2hfdGFyZ2V0KG9zYiwgaW5vZGUsIGZlX2JoLCAmYmgpOwotCWlmIChzaGlmdCA8IDApIHsKLQkJc3RhdHVzID0gc2hpZnQ7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQotCS8qIFdlIHRyYXZlbGVkIGFsbCB0aGUgd2F5IHRvIHRoZSBib3R0b20gb2YgdGhlIGFsbG9jYXRpb24gdHJlZQotCSAqIGFuZCBkaWRuJ3QgZmluZCByb29tIGZvciBhbnkgbW9yZSBleHRlbnRzIC0gd2UgbmVlZCB0byBhZGQKLQkgKiBhbm90aGVyIHRyZWUgbGV2ZWwgKi8KLQlpZiAoc2hpZnQpIHsKLQkJQlVHX09OKGJoKTsKLQkJbWxvZygwLCAibmVlZCB0byBzaGlmdCB0cmVlIGRlcHRoICIKLQkJICAgICAiKGN1cnJlbnQgPSAlZClcbiIsIGluc2VydC5pbnNfdHJlZV9kZXB0aCk7Ci0KLQkJLyogb2NmczJfc2hpZnRfdHJlZV9kZXB0aCB3aWxsIHJldHVybiB1cyBhIGJ1ZmZlciB3aXRoCi0JCSAqIHRoZSBuZXcgZXh0ZW50IGJsb2NrIChzbyB3ZSBjYW4gcGFzcyB0aGF0IHRvCi0JCSAqIG9jZnMyX2FkZF9icmFuY2gpLiAqLwotCQlzdGF0dXMgPSBvY2ZzMl9zaGlmdF90cmVlX2RlcHRoKG9zYiwgaGFuZGxlLCBpbm9kZSwgZmVfYmgsCi0JCQkJCQltZXRhX2FjLCAmYmgpOwotCQlpZiAoc3RhdHVzIDwgMCkgeworCWlmIChpbnNlcnQuaW5zX2NvbnRpZyA9PSBDT05USUdfTk9ORSAmJiBpbnNlcnQuaW5zX2ZyZWVfcmVjb3JkcyA9PSAwKSB7CisJCXN0YXR1cyA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBmZV9iaCwKKwkJCQkJICZpbnNlcnQuaW5zX3RyZWVfZGVwdGgsICZsYXN0X2ViX2JoLAorCQkJCQkgbWV0YV9hYyk7CisJCWlmIChzdGF0dXMpIHsKIAkJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJCWdvdG8gYmFpbDsKIAkJfQotCQlpbnNlcnQuaW5zX3RyZWVfZGVwdGgrKzsKLQkJLyogU3BlY2lhbCBjYXNlOiB3ZSBoYXZlIHJvb20gbm93IGlmIHdlIHNoaWZ0ZWQgZnJvbQotCQkgKiB0cmVlX2RlcHRoIDAgKi8KLQkJaWYgKGluc2VydC5pbnNfdHJlZV9kZXB0aCA9PSAxKQotCQkJZ290byBvdXRfYWRkOwogCX0KIAotCS8qIGNhbGwgb2NmczJfYWRkX2JyYW5jaCB0byBhZGQgdGhlIGZpbmFsIHBhcnQgb2YgdGhlIHRyZWUgd2l0aAotCSAqIHRoZSBuZXcgZGF0YS4gKi8KLQltbG9nKDAsICJhZGQgYnJhbmNoLiBiaCA9ICVwXG4iLCBiaCk7Ci0Jc3RhdHVzID0gb2NmczJfYWRkX2JyYW5jaChvc2IsIGhhbmRsZSwgaW5vZGUsIGZlX2JoLCBiaCwgbGFzdF9lYl9iaCwKLQkJCQkgIG1ldGFfYWMpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOwotCX0KLQotb3V0X2FkZDoKIAkvKiBGaW5hbGx5LCB3ZSBjYW4gYWRkIGNsdXN0ZXJzLiBUaGlzIG1pZ2h0IHJvdGF0ZSB0aGUgdHJlZSBmb3IgdXMuICovCiAJc3RhdHVzID0gb2NmczJfZG9faW5zZXJ0X2V4dGVudChpbm9kZSwgaGFuZGxlLCBmZV9iaCwgJnJlYywgJmluc2VydCk7CiAJaWYgKHN0YXR1cyA8IDApCkBAIC0yNDMxLDcgKzM3OTMsNzIwIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX25lZWRzX2ZsdXNoKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQorc3RhdGljIHZvaWQgb2NmczJfbWFrZV9yaWdodF9zcGxpdF9yZWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnNwbGl0X3JlYywKKwkJCQkgICAgICAgdTMyIGNwb3MsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpyZWMpCit7CisJdTMyIHJlY19jcG9zID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpOworCXUzMiByZWNfcmFuZ2UgPSByZWNfY3BvcyArIGxlMTZfdG9fY3B1KHJlYy0+ZV9sZWFmX2NsdXN0ZXJzKTsKKworCW1lbXNldChzcGxpdF9yZWMsIDAsIHNpemVvZihzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYykpOworCisJc3BsaXRfcmVjLT5lX2Nwb3MgPSBjcHVfdG9fbGUzMihjcG9zKTsKKwlzcGxpdF9yZWMtPmVfbGVhZl9jbHVzdGVycyA9IGNwdV90b19sZTE2KHJlY19yYW5nZSAtIGNwb3MpOworCisJc3BsaXRfcmVjLT5lX2Jsa25vID0gcmVjLT5lX2Jsa25vOworCWxlNjRfYWRkX2NwdSgmc3BsaXRfcmVjLT5lX2Jsa25vLAorCQkgICAgIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhzYiwgY3BvcyAtIHJlY19jcG9zKSk7CisKKwlzcGxpdF9yZWMtPmVfZmxhZ3MgPSByZWMtPmVfZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfc3BsaXRfYW5kX2luc2VydChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmxhc3RfZWJfYmgsCisJCQkJICBpbnQgc3BsaXRfaW5kZXgsCisJCQkJICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqb3JpZ19zcGxpdF9yZWMsCisJCQkJICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYykKK3sKKwlpbnQgcmV0ID0gMCwgZGVwdGg7CisJdW5zaWduZWQgaW50IGluc2VydF9yYW5nZSwgcmVjX3JhbmdlLCBkb19sZWZ0cmlnaHQgPSAwOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHRtcHJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0bW9zdF9lbDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyByZWM7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgc3BsaXRfcmVjID0gKm9yaWdfc3BsaXRfcmVjOworCXN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSBpbnNlcnQ7CisJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisKK2xlZnRyaWdodDoKKwkvKgorCSAqIFN0b3JlIGEgY29weSBvZiB0aGUgcmVjb3JkIG9uIHRoZSBzdGFjayAtIGl0IG1pZ2h0IG1vdmUKKwkgKiBhcm91bmQgYXMgdGhlIHRyZWUgaXMgbWFuaXB1bGF0ZWQgYmVsb3cuCisJICovCisJcmVjID0gcGF0aF9sZWFmX2VsKHBhdGgpLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOworCisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJcmlnaHRtb3N0X2VsID0gJmRpLT5pZDIuaV9saXN0OworCisJZGVwdGggPSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfdHJlZV9kZXB0aCk7CisJaWYgKGRlcHRoKSB7CisJCUJVR19PTighKCpsYXN0X2ViX2JoKSk7CisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgKCpsYXN0X2ViX2JoKS0+Yl9kYXRhOworCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwl9CisKKwlpZiAobGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX25leHRfZnJlZV9yZWMpID09CisJICAgIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkpIHsKKwkJaW50IG9sZF9kZXB0aCA9IGRlcHRoOworCisJCXJldCA9IG9jZnMyX2dyb3dfdHJlZShpbm9kZSwgaGFuZGxlLCBkaV9iaCwgJmRlcHRoLCBsYXN0X2ViX2JoLAorCQkJCSAgICAgIG1ldGFfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChvbGRfZGVwdGggIT0gZGVwdGgpIHsKKwkJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikoKmxhc3RfZWJfYmgpLT5iX2RhdGE7CisJCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwkJfQorCX0KKworCW1lbXNldCgmaW5zZXJ0LCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2luc2VydF90eXBlKSk7CisJaW5zZXJ0Lmluc19hcHBlbmRpbmcgPSBBUFBFTkRfTk9ORTsKKwlpbnNlcnQuaW5zX2NvbnRpZyA9IENPTlRJR19OT05FOworCWluc2VydC5pbnNfZnJlZV9yZWNvcmRzID0gbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX2NvdW50KQorCQktIGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9uZXh0X2ZyZWVfcmVjKTsKKwlpbnNlcnQuaW5zX3RyZWVfZGVwdGggPSBkZXB0aDsKKworCWluc2VydF9yYW5nZSA9IGxlMzJfdG9fY3B1KHNwbGl0X3JlYy5lX2Nwb3MpICsKKwkJbGUxNl90b19jcHUoc3BsaXRfcmVjLmVfbGVhZl9jbHVzdGVycyk7CisJcmVjX3JhbmdlID0gbGUzMl90b19jcHUocmVjLmVfY3BvcykgKworCQlsZTE2X3RvX2NwdShyZWMuZV9sZWFmX2NsdXN0ZXJzKTsKKworCWlmIChzcGxpdF9yZWMuZV9jcG9zID09IHJlYy5lX2Nwb3MpIHsKKwkJaW5zZXJ0Lmluc19zcGxpdCA9IFNQTElUX0xFRlQ7CisJfSBlbHNlIGlmIChpbnNlcnRfcmFuZ2UgPT0gcmVjX3JhbmdlKSB7CisJCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9SSUdIVDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBMZWZ0L3JpZ2h0IHNwbGl0LiBXZSBmYWtlIHRoaXMgYXMgYSByaWdodCBzcGxpdAorCQkgKiBmaXJzdCBhbmQgdGhlbiBtYWtlIGEgc2Vjb25kIHBhc3MgYXMgYSBsZWZ0IHNwbGl0LgorCQkgKi8KKwkJaW5zZXJ0Lmluc19zcGxpdCA9IFNQTElUX1JJR0hUOworCisJCW9jZnMyX21ha2VfcmlnaHRfc3BsaXRfcmVjKGlub2RlLT5pX3NiLCAmdG1wcmVjLCBpbnNlcnRfcmFuZ2UsCisJCQkJCSAgICZyZWMpOworCisJCXNwbGl0X3JlYyA9IHRtcHJlYzsKKworCQlCVUdfT04oZG9fbGVmdHJpZ2h0KTsKKwkJZG9fbGVmdHJpZ2h0ID0gMTsKKwl9CisKKwlyZXQgPSBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KGlub2RlLCBoYW5kbGUsIGRpX2JoLCAmc3BsaXRfcmVjLAorCQkJCSAgICAgJmluc2VydCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkb19sZWZ0cmlnaHQgPT0gMSkgeworCQl1MzIgY3BvczsKKwkJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbDsKKworCQlkb19sZWZ0cmlnaHQrKzsKKwkJc3BsaXRfcmVjID0gKm9yaWdfc3BsaXRfcmVjOworCisJCW9jZnMyX3JlaW5pdF9wYXRoKHBhdGgsIDEpOworCisJCWNwb3MgPSBsZTMyX3RvX2NwdShzcGxpdF9yZWMuZV9jcG9zKTsKKwkJcmV0ID0gb2NmczJfZmluZF9wYXRoKGlub2RlLCBwYXRoLCBjcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQllbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwkJc3BsaXRfaW5kZXggPSBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3QoZWwsIGNwb3MpOworCQlnb3RvIGxlZnRyaWdodDsKKwl9CitvdXQ6CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWFyayBwYXJ0IG9yIGFsbCBvZiB0aGUgZXh0ZW50IHJlY29yZCBhdCBzcGxpdF9pbmRleCBpbiB0aGUgbGVhZgorICogcG9pbnRlZCB0byBieSBwYXRoIGFzIHdyaXR0ZW4uIFRoaXMgcmVtb3ZlcyB0aGUgdW53cml0dGVuCisgKiBleHRlbnQgZmxhZy4KKyAqCisgKiBDYXJlIGlzIHRha2VuIHRvIGhhbmRsZSBjb250aWd1b3VzbmVzcyBzbyBhcyB0byBub3QgZ3JvdyB0aGUgdHJlZS4KKyAqCisgKiBtZXRhX2FjIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgLSB3ZSBvbmx5IHRydWx5IG5lZWQgaXQgaWYgZ3Jvd3RoCisgKiBvZiB0aGUgdHJlZSBpcyByZXF1aXJlZC4gQWxsIG90aGVyIGNhc2VzIHdpbGwgZGVncmFkZSBpbnRvIGEgbGVzcworICogb3B0aW1hbCB0cmVlIGxheW91dC4KKyAqCisgKiBsYXN0X2ViX2JoIHNob3VsZCBiZSB0aGUgcmlnaHRtb3N0IGxlYWYgYmxvY2sgZm9yIGFueSBpbm9kZSB3aXRoIGEKKyAqIGJ0cmVlLiBTaW5jZSBhIHNwbGl0IG1heSBncm93IHRoZSB0cmVlIG9yIGEgbWVyZ2UgbWlnaHQgc2hyaW5rIGl0LCB0aGUgY2FsbGVyIGNhbm5vdCB0cnVzdCB0aGUgY29udGVudHMgb2YgdGhhdCBidWZmZXIgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIFRoaXMgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIHJlYWRhYmlsaXR5IC0gc2V2ZXJhbCBwYXNzZXMgbWlnaHQgYmUKKyAqIG1hZGUgb3ZlciBjZXJ0YWluIHBvcnRpb25zIG9mIHRoZSB0cmVlLiBBbGwgb2YgdGhvc2UgYmxvY2tzIHdpbGwKKyAqIGhhdmUgYmVlbiBicm91Z2h0IGludG8gY2FjaGUgKGFuZCBwaW5uZWQgdmlhIHRoZSBqb3VybmFsKSwgc28gdGhlCisgKiBleHRyYSBvdmVyaGVhZCBpcyBub3QgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGRpc2sgcmVhZHMuCisgKi8KK3N0YXRpYyBpbnQgX19vY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLAorCQkJCSAgICAgICBpbnQgc3BsaXRfaW5kZXgsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjICpzcGxpdF9yZWMsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYmgsICpsYXN0X2ViX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjID0gJmVsLT5sX3JlY3Nbc3BsaXRfaW5kZXhdOworCXN0cnVjdCBvY2ZzMl9tZXJnZV9jdHh0IGN0eHQ7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICpyaWdodG1vc3RfZWw7CisKKwlpZiAoIXJlYy0+ZV9mbGFncyAmIE9DRlMyX0VYVF9VTldSSVRURU4pIHsKKwkJcmV0ID0gLUVJTzsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID4gbGUzMl90b19jcHUoc3BsaXRfcmVjLT5lX2Nwb3MpIHx8CisJICAgICgobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsgbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpKSA8CisJICAgICAobGUzMl90b19jcHUoc3BsaXRfcmVjLT5lX2Nwb3MpICsgbGUxNl90b19jcHUoc3BsaXRfcmVjLT5lX2xlYWZfY2x1c3RlcnMpKSkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwllYl9iaCA9IHBhdGhfbGVhZl9iaChwYXRoKTsKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBlYl9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWN0eHQuY19jb250aWdfdHlwZSA9IG9jZnMyX2ZpZ3VyZV9tZXJnZV9jb250aWdfdHlwZShpbm9kZSwgZWwsCisJCQkJCQkJICAgIHNwbGl0X2luZGV4LAorCQkJCQkJCSAgICBzcGxpdF9yZWMpOworCisJLyoKKwkgKiBUaGUgY29yZSBtZXJnZSAvIHNwbGl0IGNvZGUgd2FudHMgdG8ga25vdyBob3cgbXVjaCByb29tIGlzCisJICogbGVmdCBpbiB0aGlzIGlub2RlcyBhbGxvY2F0aW9uIHRyZWUsIHNvIHdlIHBhc3MgdGhlCisJICogcmlnaHRtb3N0IGV4dGVudCBsaXN0LgorCSAqLworCWlmIChwYXRoLT5wX3RyZWVfZGVwdGgpIHsKKwkJc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWI7CisJCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJCSAgICAgICBsZTY0X3RvX2NwdShkaS0+aV9sYXN0X2ViX2JsayksCisJCQkJICAgICAgICZsYXN0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19leGl0KHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKikgbGFzdF9lYl9iaC0+Yl9kYXRhOworCQlpZiAoIU9DRlMyX0lTX1ZBTElEX0VYVEVOVF9CTE9DSyhlYikpIHsKKwkJCU9DRlMyX1JPX09OX0lOVkFMSURfRVhURU5UX0JMT0NLKGlub2RlLT5pX3NiLCBlYik7CisJCQlyZXQgPSAtRVJPRlM7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJpZ2h0bW9zdF9lbCA9ICZlYi0+aF9saXN0OworCX0gZWxzZQorCQlyaWdodG1vc3RfZWwgPSBwYXRoX3Jvb3RfZWwocGF0aCk7CisKKwljdHh0LmNfdXNlZF90YWlsX3JlY3MgPSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJaWYgKGN0eHQuY191c2VkX3RhaWxfcmVjcyA+IDAgJiYKKwkgICAgb2NmczJfaXNfZW1wdHlfZXh0ZW50KCZyaWdodG1vc3RfZWwtPmxfcmVjc1swXSkpCisJCWN0eHQuY191c2VkX3RhaWxfcmVjcy0tOworCisJaWYgKHJlYy0+ZV9jcG9zID09IHNwbGl0X3JlYy0+ZV9jcG9zICYmCisJICAgIHJlYy0+ZV9sZWFmX2NsdXN0ZXJzID09IHNwbGl0X3JlYy0+ZV9sZWFmX2NsdXN0ZXJzKQorCQljdHh0LmNfc3BsaXRfY292ZXJzX3JlYyA9IDE7CisJZWxzZQorCQljdHh0LmNfc3BsaXRfY292ZXJzX3JlYyA9IDA7CisKKwljdHh0LmNfaGFzX2VtcHR5X2V4dGVudCA9IG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSk7CisKKwltbG9nKDAsICJpbmRleDogJWQsIGNvbnRpZzogJXUsIHVzZWRfdGFpbF9yZWNzOiAldSwgIgorCSAgICAgImhhc19lbXB0eTogJXUsIHNwbGl0X2NvdmVyczogJXVcbiIsIHNwbGl0X2luZGV4LAorCSAgICAgY3R4dC5jX2NvbnRpZ190eXBlLCBjdHh0LmNfdXNlZF90YWlsX3JlY3MsCisJICAgICBjdHh0LmNfaGFzX2VtcHR5X2V4dGVudCwgY3R4dC5jX3NwbGl0X2NvdmVyc19yZWMpOworCisJaWYgKGN0eHQuY19jb250aWdfdHlwZSA9PSBDT05USUdfTk9ORSkgeworCQlpZiAoY3R4dC5jX3NwbGl0X2NvdmVyc19yZWMpCisJCQllbC0+bF9yZWNzW3NwbGl0X2luZGV4XSA9ICpzcGxpdF9yZWM7CisJCWVsc2UKKwkJCXJldCA9IG9jZnMyX3NwbGl0X2FuZF9pbnNlcnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGlfYmgsCisJCQkJCQkgICAgICZsYXN0X2ViX2JoLCBzcGxpdF9pbmRleCwKKwkJCQkJCSAgICAgc3BsaXRfcmVjLCBtZXRhX2FjKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9IGVsc2UgeworCQlyZXQgPSBvY2ZzMl90cnlfdG9fbWVyZ2VfZXh0ZW50KGlub2RlLCBoYW5kbGUsIHBhdGgsCisJCQkJCQlzcGxpdF9pbmRleCwgc3BsaXRfcmVjLAorCQkJCQkJZGVhbGxvYywgJmN0eHQpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0KKworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCBlYl9iaCk7CisKK291dDoKKwlicmVsc2UobGFzdF9lYl9iaCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE1hcmsgdGhlIGFscmVhZHktZXhpc3RpbmcgZXh0ZW50IGF0IGNwb3MgYXMgd3JpdHRlbiBmb3IgbGVuIGNsdXN0ZXJzLgorICoKKyAqIElmIHRoZSBleGlzdGluZyBleHRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlcXVlc3QsIGluaXRpYXRlIGEKKyAqIHNwbGl0LiBBbiBhdHRlbXB0IHdpbGwgYmUgbWFkZSBhdCBtZXJnaW5nIHdpdGggYWRqYWNlbnQgZXh0ZW50cy4KKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBwYXNzaW5nIGRvd24gbWV0YV9hYyBpZiB3ZSdsbCBuZWVkIGl0LgorICovCitpbnQgb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwgdTMyIGNwb3MsIHUzMiBsZW4sIHUzMiBwaHlzLAorCQkJICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYykKK3sKKwlpbnQgcmV0LCBpbmRleDsKKwl1NjQgc3RhcnRfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIHBoeXMpOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHNwbGl0X3JlYzsKKwlzdHJ1Y3Qgb2NmczJfcGF0aCAqbGVmdF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCisJbWxvZygwLCAiSW5vZGUgJWx1IGNwb3MgJXUsIGxlbiAldSwgcGh5cyAldSAoJWxsdSlcbiIsCisJICAgICBpbm9kZS0+aV9pbm8sIGNwb3MsIGxlbiwgcGh5cywgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydF9ibGtubyk7CisKKwlpZiAoIW9jZnMyX3dyaXRlc191bndyaXR0ZW5fZXh0ZW50cyhPQ0ZTMl9TQihpbm9kZS0+aV9zYikpKSB7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLCAiSW5vZGUgJWxsdSBoYXMgdW53cml0dGVuIGV4dGVudHMgIgorCQkJICAgICJ0aGF0IGFyZSBiZWluZyB3cml0dGVuIHRvLCBidXQgdGhlIGZlYXR1cmUgYml0ICIKKwkJCSAgICAiaXMgbm90IHNldCBpbiB0aGUgc3VwZXIgYmxvY2suIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubyk7CisJCXJldCA9IC1FUk9GUzsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBYWFg6IFRoaXMgc2hvdWxkIGJlIGZpeGVkIHVwIHNvIHRoYXQgd2UganVzdCByZS1pbnNlcnQgdGhlCisJICogbmV4dCBleHRlbnQgcmVjb3Jkcy4KKwkgKi8KKwlvY2ZzMl9leHRlbnRfbWFwX3RydW5jKGlub2RlLCAwKTsKKworCWxlZnRfcGF0aCA9IG9jZnMyX25ld19pbm9kZV9wYXRoKGRpX2JoKTsKKwlpZiAoIWxlZnRfcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgbGVmdF9wYXRoLCBjcG9zKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWVsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CisKKwlpbmRleCA9IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChlbCwgY3Bvcyk7CisJaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID49IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKSB7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJICAgICJJbm9kZSAlbGx1IGhhcyBhbiBleHRlbnQgYXQgY3BvcyAldSB3aGljaCBjYW4gbm8gIgorCQkJICAgICJsb25nZXIgYmUgZm91bmQuXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBjcG9zKTsKKwkJcmV0ID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJnNwbGl0X3JlYywgMCwgc2l6ZW9mKHN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjKSk7CisJc3BsaXRfcmVjLmVfY3BvcyA9IGNwdV90b19sZTMyKGNwb3MpOworCXNwbGl0X3JlYy5lX2xlYWZfY2x1c3RlcnMgPSBjcHVfdG9fbGUxNihsZW4pOworCXNwbGl0X3JlYy5lX2Jsa25vID0gY3B1X3RvX2xlNjQoc3RhcnRfYmxrbm8pOworCXNwbGl0X3JlYy5lX2ZsYWdzID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCktPmxfcmVjc1tpbmRleF0uZV9mbGFnczsKKwlzcGxpdF9yZWMuZV9mbGFncyAmPSB+T0NGUzJfRVhUX1VOV1JJVFRFTjsKKworCXJldCA9IF9fb2NmczJfbWFya19leHRlbnRfd3JpdHRlbihpbm9kZSwgZGlfYmgsIGhhbmRsZSwgbGVmdF9wYXRoLAorCQkJCQkgIGluZGV4LCAmc3BsaXRfcmVjLCBtZXRhX2FjLCBkZWFsbG9jKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3NwbGl0X3RyZWUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwKKwkJCSAgICBoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgb2NmczJfcGF0aCAqcGF0aCwKKwkJCSAgICBpbnQgaW5kZXgsIHUzMiBuZXdfcmFuZ2UsCisJCQkgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMpCit7CisJaW50IHJldCwgZGVwdGgsIGNyZWRpdHMgPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYjsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKnJpZ2h0bW9zdF9lbCwgKmVsOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfcmVjIHNwbGl0X3JlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXN0cnVjdCBvY2ZzMl9pbnNlcnRfdHlwZSBpbnNlcnQ7CisKKwkvKgorCSAqIFNldHVwIHRoZSByZWNvcmQgdG8gc3BsaXQgYmVmb3JlIHdlIGdyb3cgdGhlIHRyZWUuCisJICovCisJZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCW9jZnMyX21ha2VfcmlnaHRfc3BsaXRfcmVjKGlub2RlLT5pX3NiLCAmc3BsaXRfcmVjLCBuZXdfcmFuZ2UsIHJlYyk7CisKKwlkZXB0aCA9IHBhdGgtPnBfdHJlZV9kZXB0aDsKKwlpZiAoZGVwdGggPiAwKSB7CisJCXJldCA9IG9jZnMyX3JlYWRfYmxvY2soT0NGUzJfU0IoaW5vZGUtPmlfc2IpLAorCQkJCSAgICAgICBsZTY0X3RvX2NwdShkaS0+aV9sYXN0X2ViX2JsayksCisJCQkJICAgICAgICZsYXN0X2ViX2JoLCBPQ0ZTMl9CSF9DQUNIRUQsIGlub2RlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWIgPSAoc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqKSBsYXN0X2ViX2JoLT5iX2RhdGE7CisJCXJpZ2h0bW9zdF9lbCA9ICZlYi0+aF9saXN0OworCX0gZWxzZQorCQlyaWdodG1vc3RfZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisKKwljcmVkaXRzICs9IHBhdGgtPnBfdHJlZV9kZXB0aCArIG9jZnMyX2V4dGVuZF9tZXRhX25lZWRlZChkaSk7CisJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgY3JlZGl0cyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfbmV4dF9mcmVlX3JlYykgPT0KKwkgICAgbGUxNl90b19jcHUocmlnaHRtb3N0X2VsLT5sX2NvdW50KSkgeworCQlpbnQgb2xkX2RlcHRoID0gZGVwdGg7CisKKwkJcmV0ID0gb2NmczJfZ3Jvd190cmVlKGlub2RlLCBoYW5kbGUsIGRpX2JoLCAmZGVwdGgsICZsYXN0X2ViX2JoLAorCQkJCSAgICAgIG1ldGFfYWMpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChvbGRfZGVwdGggIT0gZGVwdGgpIHsKKwkJCWViID0gKHN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKilsYXN0X2ViX2JoLT5iX2RhdGE7CisJCQlyaWdodG1vc3RfZWwgPSAmZWItPmhfbGlzdDsKKwkJfQorCX0KKworCW1lbXNldCgmaW5zZXJ0LCAwLCBzaXplb2Yoc3RydWN0IG9jZnMyX2luc2VydF90eXBlKSk7CisJaW5zZXJ0Lmluc19hcHBlbmRpbmcgPSBBUFBFTkRfTk9ORTsKKwlpbnNlcnQuaW5zX2NvbnRpZyA9IENPTlRJR19OT05FOworCWluc2VydC5pbnNfc3BsaXQgPSBTUExJVF9SSUdIVDsKKwlpbnNlcnQuaW5zX2ZyZWVfcmVjb3JkcyA9IGxlMTZfdG9fY3B1KHJpZ2h0bW9zdF9lbC0+bF9jb3VudCkKKwkJLSBsZTE2X3RvX2NwdShyaWdodG1vc3RfZWwtPmxfbmV4dF9mcmVlX3JlYyk7CisJaW5zZXJ0Lmluc190cmVlX2RlcHRoID0gZGVwdGg7CisKKwlyZXQgPSBvY2ZzMl9kb19pbnNlcnRfZXh0ZW50KGlub2RlLCBoYW5kbGUsIGRpX2JoLCAmc3BsaXRfcmVjLCAmaW5zZXJ0KTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dDoKKwlicmVsc2UobGFzdF9lYl9iaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl90cnVuY2F0ZV9yZWMoc3RydWN0IGlub2RlICppbm9kZSwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoLCBpbnQgaW5kZXgsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqZGVhbGxvYywKKwkJCSAgICAgIHUzMiBjcG9zLCB1MzIgbGVuKQoreworCWludCByZXQ7CisJdTMyIGxlZnRfY3BvcywgcmVjX3JhbmdlLCB0cnVuY19yYW5nZTsKKwlpbnQgd2FudHNfcm90YXRlID0gMCwgaXNfcmlnaHRtb3N0X3RyZWVfcmVjID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG9jZnMyX3BhdGggKmxlZnRfcGF0aCA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCA9IHBhdGhfbGVhZl9lbChwYXRoKTsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOworCisJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkgJiYgaW5kZXggPiAwKSB7CisJCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGVhbGxvYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaW5kZXgtLTsKKwl9CisKKwlpZiAoaW5kZXggPT0gKGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpIC0gMSkgJiYKKwkgICAgcGF0aC0+cF90cmVlX2RlcHRoKSB7CisJCS8qCisJCSAqIENoZWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgcmlnaHRtb3N0IHRyZWUgcmVjb3JkLiBJZgorCQkgKiB3ZSByZW1vdmUgYWxsIG9mIHRoaXMgcmVjb3JkIG9yIHBhcnQgb2YgaXRzIHJpZ2h0CisJCSAqIGVkZ2UgdGhlbiBhbiB1cGRhdGUgb2YgdGhlIHJlY29yZCBsZW5ndGhzIGFib3ZlIGl0CisJCSAqIHdpbGwgYmUgcmVxdWlyZWQuCisJCSAqLworCQllYiA9IChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICopcGF0aF9sZWFmX2JoKHBhdGgpLT5iX2RhdGE7CisJCWlmIChlYi0+aF9uZXh0X2xlYWZfYmxrID09IDApCisJCQlpc19yaWdodG1vc3RfdHJlZV9yZWMgPSAxOworCX0KKworCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwlpZiAoaW5kZXggPT0gMCAmJiBwYXRoLT5wX3RyZWVfZGVwdGggJiYKKwkgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID09IGNwb3MpIHsKKwkJLyoKKwkJICogQ2hhbmdpbmcgdGhlIGxlZnRtb3N0IG9mZnNldCAodmlhIHBhcnRpYWwgb3Igd2hvbGUKKwkJICogcmVjb3JkIHRydW5jYXRlKSBvZiBhbiBpbnRlcmlvciAob3IgcmlnaHRtb3N0KSBwYXRoCisJCSAqIG1lYW5zIHdlIGhhdmUgdG8gdXBkYXRlIHRoZSBzdWJ0cmVlIHRoYXQgaXMgZm9ybWVkCisJCSAqIGJ5IHRoaXMgbGVhZiBhbmQgdGhlIG9uZSB0byBpdCdzIGxlZnQuCisJCSAqCisJCSAqIFRoZXJlIGFyZSB0d28gY2FzZXMgd2UgY2FuIHNraXA6CisJCSAqICAgMSkgUGF0aCBpcyB0aGUgbGVmdG1vc3Qgb25lIGluIG91ciBpbm9kZSB0cmVlLgorCQkgKiAgIDIpIFRoZSBsZWFmIGlzIHJpZ2h0bW9zdCBhbmQgd2lsbCBiZSBlbXB0eSBhZnRlcgorCQkgKiAgICAgIHdlIHJlbW92ZSB0aGUgZXh0ZW50IHJlY29yZCAtIHRoZSByb3RhdGUgY29kZQorCQkgKiAgICAgIGtub3dzIGhvdyB0byB1cGRhdGUgdGhlIG5ld2x5IGZvcm1lZCBlZGdlLgorCQkgKi8KKworCQlyZXQgPSBvY2ZzMl9maW5kX2Nwb3NfZm9yX2xlZnRfbGVhZihpbm9kZS0+aV9zYiwgcGF0aCwKKwkJCQkJCSAgICAmbGVmdF9jcG9zKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAobGVmdF9jcG9zICYmIGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpID4gMSkgeworCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGgocGF0aF9yb290X2JoKHBhdGgpLAorCQkJCQkJICAgcGF0aF9yb290X2VsKHBhdGgpKTsKKwkJCWlmICghbGVmdF9wYXRoKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgbGVmdF9wYXRoLCBsZWZ0X2Nwb3MpOworCQkJaWYgKHJldCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCXJldCA9IG9jZnMyX2V4dGVuZF9yb3RhdGVfdHJhbnNhY3Rpb24oaGFuZGxlLCAwLAorCQkJCQkgICAgICBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMsCisJCQkJCSAgICAgIHBhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIHBhdGgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2Vzc19wYXRoKGlub2RlLCBoYW5kbGUsIGxlZnRfcGF0aCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJlY19yYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKwl0cnVuY19yYW5nZSA9IGNwb3MgKyBsZW47CisKKwlpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID09IGNwb3MgJiYgcmVjX3JhbmdlID09IHRydW5jX3JhbmdlKSB7CisJCWludCBuZXh0X2ZyZWU7CisKKwkJbWVtc2V0KHJlYywgMCwgc2l6ZW9mKCpyZWMpKTsKKwkJb2NmczJfY2xlYW51cF9tZXJnZShlbCwgaW5kZXgpOworCQl3YW50c19yb3RhdGUgPSAxOworCisJCW5leHRfZnJlZSA9IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpOworCQlpZiAoaXNfcmlnaHRtb3N0X3RyZWVfcmVjICYmIG5leHRfZnJlZSA+IDEpIHsKKwkJCS8qCisJCQkgKiBXZSBza2lwIHRoZSBlZGdlIHVwZGF0ZSBpZiB0aGlzIHBhdGggd2lsbAorCQkJICogYmUgZGVsZXRlZCBieSB0aGUgcm90YXRlIGNvZGUuCisJCQkgKi8KKwkJCXJlYyA9ICZlbC0+bF9yZWNzW25leHRfZnJlZSAtIDFdOworCQkJb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKGlub2RlLCBoYW5kbGUsIHBhdGgsCisJCQkJCQkgICAgICAgcmVjKTsKKwkJfQorCX0gZWxzZSBpZiAobGUzMl90b19jcHUocmVjLT5lX2Nwb3MpID09IGNwb3MpIHsKKwkJLyogUmVtb3ZlIGxlZnRtb3N0IHBvcnRpb24gb2YgdGhlIHJlY29yZC4gKi8KKwkJbGUzMl9hZGRfY3B1KCZyZWMtPmVfY3BvcywgbGVuKTsKKwkJbGU2NF9hZGRfY3B1KCZyZWMtPmVfYmxrbm8sIG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2NrcyhzYiwgbGVuKSk7CisJCWxlMTZfYWRkX2NwdSgmcmVjLT5lX2xlYWZfY2x1c3RlcnMsIC1sZW4pOworCX0gZWxzZSBpZiAocmVjX3JhbmdlID09IHRydW5jX3JhbmdlKSB7CisJCS8qIFJlbW92ZSByaWdodG1vc3QgcG9ydGlvbiBvZiB0aGUgcmVjb3JkICovCisJCWxlMTZfYWRkX2NwdSgmcmVjLT5lX2xlYWZfY2x1c3RlcnMsIC1sZW4pOworCQlpZiAoaXNfcmlnaHRtb3N0X3RyZWVfcmVjKQorCQkJb2NmczJfYWRqdXN0X3JpZ2h0bW9zdF9yZWNvcmRzKGlub2RlLCBoYW5kbGUsIHBhdGgsIHJlYyk7CisJfSBlbHNlIHsKKwkJLyogQ2FsbGVyIHNob3VsZCBoYXZlIHRyYXBwZWQgdGhpcy4gKi8KKwkJbWxvZyhNTF9FUlJPUiwgIklub2RlICVsbHU6IEludmFsaWQgcmVjb3JkIHRydW5jYXRlOiAoJXUsICV1KSAiCisJCSAgICAgIigldSwgJXUpXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJICAgICBsZTMyX3RvX2NwdShyZWMtPmVfY3BvcyksCisJCSAgICAgbGUxNl90b19jcHUocmVjLT5lX2xlYWZfY2x1c3RlcnMpLCBjcG9zLCBsZW4pOworCQlCVUcoKTsKKwl9CisKKwlpZiAobGVmdF9wYXRoKSB7CisJCWludCBzdWJ0cmVlX2luZGV4OworCisJCXN1YnRyZWVfaW5kZXggPSBvY2ZzMl9maW5kX3N1YnRyZWVfcm9vdChpbm9kZSwgbGVmdF9wYXRoLCBwYXRoKTsKKwkJb2NmczJfY29tcGxldGVfZWRnZV9pbnNlcnQoaW5vZGUsIGhhbmRsZSwgbGVmdF9wYXRoLCBwYXRoLAorCQkJCQkgICBzdWJ0cmVlX2luZGV4KTsKKwl9CisKKwlvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgcGF0aF9sZWFmX2JoKHBhdGgpKTsKKworCXJldCA9IG9jZnMyX3JvdGF0ZV90cmVlX2xlZnQoaW5vZGUsIGhhbmRsZSwgcGF0aCwgZGVhbGxvYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl9yZW1vdmVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQl1MzIgY3BvcywgdTMyIGxlbiwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldCwgaW5kZXg7CisJdTMyIHJlY19yYW5nZSwgdHJ1bmNfcmFuZ2U7CisJc3RydWN0IG9jZnMyX2V4dGVudF9yZWMgKnJlYzsKKwlzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsOworCXN0cnVjdCBvY2ZzMl9wYXRoICpwYXRoOworCisJb2NmczJfZXh0ZW50X21hcF90cnVuYyhpbm9kZSwgMCk7CisKKwlwYXRoID0gb2NmczJfbmV3X2lub2RlX3BhdGgoZGlfYmgpOworCWlmICghcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcGF0aCwgY3Bvcyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWVsID0gcGF0aF9sZWFmX2VsKHBhdGgpOworCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPj0gbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYykpIHsKKwkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkgICAgIklub2RlICVsbHUgaGFzIGFuIGV4dGVudCBhdCBjcG9zICV1IHdoaWNoIGNhbiBubyAiCisJCQkgICAgImxvbmdlciBiZSBmb3VuZC5cbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGNwb3MpOworCQlyZXQgPSAtRVJPRlM7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2UgaGF2ZSAzIGNhc2VzIG9mIGV4dGVudCByZW1vdmFsOgorCSAqICAgMSkgUmFuZ2UgY292ZXJzIHRoZSBlbnRpcmUgZXh0ZW50IHJlYworCSAqICAgMikgUmFuZ2UgYmVnaW5zIG9yIGVuZHMgb24gb25lIGVkZ2Ugb2YgdGhlIGV4dGVudCByZWMKKwkgKiAgIDMpIFJhbmdlIGlzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGV4dGVudCByZWMgKG5vIHNoYXJlZCBlZGdlcykKKwkgKgorCSAqIEZvciBjYXNlIDEgd2UgcmVtb3ZlIHRoZSBleHRlbnQgcmVjIGFuZCBsZWZ0IHJvdGF0ZSB0bworCSAqIGZpbGwgdGhlIGhvbGUuCisJICoKKwkgKiBGb3IgY2FzZSAyIHdlIGp1c3Qgc2hyaW5rIHRoZSBleGlzdGluZyBleHRlbnQgcmVjLCB3aXRoIGEKKwkgKiB0cmVlIHVwZGF0ZSBpZiB0aGUgc2hyaW5raW5nIGVkZ2UgaXMgYWxzbyB0aGUgZWRnZSBvZiBhbgorCSAqIGV4dGVudCBibG9jay4KKwkgKgorCSAqIEZvciBjYXNlIDMgd2UgZG8gYSByaWdodCBzcGxpdCB0byB0dXJuIHRoZSBleHRlbnQgcmVjIGludG8KKwkgKiBzb21ldGhpbmcgY2FzZSAyIGNhbiBoYW5kbGUuCisJICovCisJcmVjID0gJmVsLT5sX3JlY3NbaW5kZXhdOworCXJlY19yYW5nZSA9IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSArIG9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKwl0cnVuY19yYW5nZSA9IGNwb3MgKyBsZW47CisKKwlCVUdfT04oY3BvcyA8IGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSB8fCB0cnVuY19yYW5nZSA+IHJlY19yYW5nZSk7CisKKwltbG9nKDAsICJJbm9kZSAlbGx1LCByZW1vdmUgKGNwb3MgJXUsIGxlbiAldSkuIEV4aXN0aW5nIGluZGV4ICVkICIKKwkgICAgICIoY3BvcyAldSwgbGVuICV1KVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLCBjcG9zLCBsZW4sIGluZGV4LAorCSAgICAgbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpLCBvY2ZzMl9yZWNfY2x1c3RlcnMoZWwsIHJlYykpOworCisJaWYgKGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSA9PSBjcG9zIHx8IHJlY19yYW5nZSA9PSB0cnVuY19yYW5nZSkgeworCQlyZXQgPSBvY2ZzMl90cnVuY2F0ZV9yZWMoaW5vZGUsIGhhbmRsZSwgcGF0aCwgaW5kZXgsIGRlYWxsb2MsCisJCQkJCSBjcG9zLCBsZW4pOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IG9jZnMyX3NwbGl0X3RyZWUoaW5vZGUsIGRpX2JoLCBoYW5kbGUsIHBhdGgsIGluZGV4LAorCQkJCSAgICAgICB0cnVuY19yYW5nZSwgbWV0YV9hYyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogVGhlIHNwbGl0IGNvdWxkIGhhdmUgbWFuaXB1bGF0ZWQgdGhlIHRyZWUgZW5vdWdoIHRvCisJCSAqIG1vdmUgdGhlIHJlY29yZCBsb2NhdGlvbiwgc28gd2UgaGF2ZSB0byBsb29rIGZvciBpdCBhZ2Fpbi4KKwkJICovCisJCW9jZnMyX3JlaW5pdF9wYXRoKHBhdGgsIDEpOworCisJCXJldCA9IG9jZnMyX2ZpbmRfcGF0aChpbm9kZSwgcGF0aCwgY3Bvcyk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZWwgPSBwYXRoX2xlYWZfZWwocGF0aCk7CisJCWluZGV4ID0gb2NmczJfc2VhcmNoX2V4dGVudF9saXN0KGVsLCBjcG9zKTsKKwkJaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID49IGxlMTZfdG9fY3B1KGVsLT5sX25leHRfZnJlZV9yZWMpKSB7CisJCQlvY2ZzMl9lcnJvcihpbm9kZS0+aV9zYiwKKwkJCQkgICAgIklub2RlICVsbHU6IHNwbGl0IGF0IGNwb3MgJXUgbG9zdCByZWNvcmQuIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJCQkJICAgIGNwb3MpOworCQkJcmV0ID0gLUVST0ZTOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBEb3VibGUgY2hlY2sgb3VyIHZhbHVlcyBoZXJlLiBJZiBhbnl0aGluZyBpcyBmaXNoeSwKKwkJICogaXQncyBlYXNpZXIgdG8gY2F0Y2ggaXQgYXQgdGhlIHRvcCBsZXZlbC4KKwkJICovCisJCXJlYyA9ICZlbC0+bF9yZWNzW2luZGV4XTsKKwkJcmVjX3JhbmdlID0gbGUzMl90b19jcHUocmVjLT5lX2Nwb3MpICsKKwkJCW9jZnMyX3JlY19jbHVzdGVycyhlbCwgcmVjKTsKKwkJaWYgKHJlY19yYW5nZSAhPSB0cnVuY19yYW5nZSkgeworCQkJb2NmczJfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJICAgICJJbm9kZSAlbGx1OiBlcnJvciBhZnRlciBzcGxpdCBhdCBjcG9zICV1IgorCQkJCSAgICAidHJ1bmMgbGVuICV1LCBleGlzdGluZyByZWNvcmQgaXMgKCV1LCV1KSIsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vLAorCQkJCSAgICBjcG9zLCBsZW4sIGxlMzJfdG9fY3B1KHJlYy0+ZV9jcG9zKSwKKwkJCQkgICAgb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpKTsKKwkJCXJldCA9IC1FUk9GUzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gb2NmczJfdHJ1bmNhdGVfcmVjKGlub2RlLCBoYW5kbGUsIHBhdGgsIGluZGV4LCBkZWFsbG9jLAorCQkJCQkgY3BvcywgbGVuKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlvY2ZzMl9mcmVlX3BhdGgocGF0aCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRsX2JoID0gb3NiLT5vc2JfdGxfYmg7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CkBAIC0yNDY0LDEwICs0NTM5LDEwIEBACiAJcmV0dXJuIGN1cnJlbnRfdGFpbCA9PSBuZXdfc3RhcnQ7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkgICAgIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJICAgICB1NjQgc3RhcnRfYmxrLAotCQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9jbHVzdGVycykKK2ludCBvY2ZzMl90cnVuY2F0ZV9sb2dfYXBwZW5kKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgIHU2NCBzdGFydF9ibGssCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzKQogewogCWludCBzdGF0dXMsIGluZGV4OwogCXVuc2lnbmVkIGludCBzdGFydF9jbHVzdGVyLCB0bF9jb3VudDsKQEAgLTI2MjMsNyArNDY5OCw3IEBACiB9CiAKIC8qIEV4cGVjdHMgeW91IHRvIGFscmVhZHkgYmUgaG9sZGluZyB0bF9pbm9kZS0+aV9tdXRleCAqLwotc3RhdGljIGludCBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKK2ludCBfX29jZnMyX2ZsdXNoX3RydW5jYXRlX2xvZyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYikKIHsKIAlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBudW1fdG9fZmx1c2g7CkBAIC0yOTU3LDYgKzUwMzIsMjE5IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIERlbGF5ZWQgZGUtYWxsb2NhdGlvbiBvZiBzdWJhbGxvY2F0b3IgYmxvY2tzLgorICoKKyAqIFNvbWUgc2V0cyBvZiBibG9jayBkZS1hbGxvY2F0aW9ucyBtaWdodCBpbnZvbHZlIG11bHRpcGxlIHN1YmFsbG9jYXRvciBpbm9kZXMuCisgKgorICogVGhlIGxvY2tpbmcgZm9yIHRoaXMgY2FuIGdldCBleHRyZW1lbHkgY29tcGxpY2F0ZWQsIGVzcGVjaWFsbHkgd2hlbgorICogdGhlIHN1YmFsbG9jYXRvciBpbm9kZXMgdG8gZGVsZXRlIGZyb20gYXJlbid0IGtub3duIHVudGlsIGRlZXAKKyAqIHdpdGhpbiBhbiB1bnJlbGF0ZWQgY29kZXBhdGguCisgKgorICogb2NmczJfZXh0ZW50X2Jsb2NrIHN0cnVjdHVyZXMgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMgLSBhbiBpbm9kZQorICogYnRyZWUgY291bGQgaGF2ZSBiZWVuIGdyb3duIGJ5IGFueSBudW1iZXIgb2Ygbm9kZXMgZWFjaCBhbGxvY2F0aW5nCisgKiBvdXQgb2YgdGhlaXIgb3duIHN1YmFsbG9jIGlub2RlLgorICoKKyAqIFRoZXNlIHN0cnVjdHVyZXMgYWxsb3cgdGhlIGRlbGF5IG9mIGJsb2NrIGRlLWFsbG9jYXRpb24gdW50aWwgYQorICogbGF0ZXIgdGltZSwgd2hlbiBsb2NraW5nIG9mIG11bHRpcGxlIGNsdXN0ZXIgaW5vZGVzIHdvbid0IGNhdXNlCisgKiBkZWFkbG9jay4KKyAqLworCisvKgorICogRGVzY3JpYmVzIGEgc2luZ2xlIGJsb2NrIGZyZWUgZnJvbSBhIHN1YmFsbG9jYXRvcgorICovCitzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgeworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZQkJKmZyZWVfbmV4dDsKKwl1NjQJCQkJCWZyZWVfYmxrOworCXVuc2lnbmVkIGludAkJCQlmcmVlX2JpdDsKK307CisKK3N0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QgeworCXN0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QJCSpmX25leHRfc3ViYWxsb2NhdG9yOworCWludAkJCQkJZl9pbm9kZV90eXBlOworCWludAkJCQkJZl9zbG90OworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfYmxvY2tfZnJlZQkJKmZfZmlyc3Q7Cit9OworCitzdGF0aWMgaW50IG9jZnMyX2ZyZWVfY2FjaGVkX2l0ZW1zKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAorCQkJCSAgIGludCBzeXNmaWxlX3R5cGUsCisJCQkJICAgaW50IHNsb3QsCisJCQkJICAgc3RydWN0IG9jZnMyX2NhY2hlZF9ibG9ja19mcmVlICpoZWFkKQoreworCWludCByZXQ7CisJdTY0IGJnX2Jsa25vOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKnRtcDsKKworCWlub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwgc3lzZmlsZV90eXBlLCBzbG90KTsKKwlpZiAoIWlub2RlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9tdXRleDsKKwl9CisKKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1NVQkFMTE9DX0ZSRUUpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXdoaWxlIChoZWFkKSB7CisJCWJnX2Jsa25vID0gb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAoaGVhZC0+ZnJlZV9ibGssCisJCQkJCQkgICAgICBoZWFkLT5mcmVlX2JpdCk7CisJCW1sb2coMCwgIkZyZWUgYml0OiAoYml0ICV1LCBibGtubyAlbGx1KVxuIiwKKwkJICAgICBoZWFkLT5mcmVlX2JpdCwgKHVuc2lnbmVkIGxvbmcgbG9uZyloZWFkLT5mcmVlX2Jsayk7CisKKwkJcmV0ID0gb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZSwgaW5vZGUsIGRpX2JoLAorCQkJCQkgICAgICAgaGVhZC0+ZnJlZV9iaXQsIGJnX2Jsa25vLCAxKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfam91cm5hbDsKKwkJfQorCisJCXJldCA9IG9jZnMyX2V4dGVuZF90cmFucyhoYW5kbGUsIE9DRlMyX1NVQkFMTE9DX0ZSRUUpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF9qb3VybmFsOworCQl9CisKKwkJdG1wID0gaGVhZDsKKwkJaGVhZCA9IGhlYWQtPmZyZWVfbmV4dDsKKwkJa2ZyZWUodG1wKTsKKwl9CisKK291dF9qb3VybmFsOgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKK291dF91bmxvY2s6CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCWJyZWxzZShkaV9iaCk7CitvdXRfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJaXB1dChpbm9kZSk7CitvdXQ6CisJd2hpbGUoaGVhZCkgeworCQkvKiBQcmVtYXR1cmUgZXhpdCBtYXkgaGF2ZSBsZWZ0IHNvbWUgZGFuZ2xpbmcgaXRlbXMuICovCisJCXRtcCA9IGhlYWQ7CisJCWhlYWQgPSBoZWFkLT5mcmVlX25leHQ7CisJCWtmcmVlKHRtcCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX3J1bl9kZWFsbG9jcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJICAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0KQoreworCWludCByZXQgPSAwLCByZXQyOworCXN0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QgKmZsOworCisJaWYgKCFjdHh0KQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChjdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvcikgeworCQlmbCA9IGN0eHQtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yOworCisJCWlmIChmbC0+Zl9maXJzdCkgeworCQkJbWxvZygwLCAiRnJlZSBpdGVtczogKHR5cGUgJXUsIHNsb3QgJWQpXG4iLAorCQkJICAgICBmbC0+Zl9pbm9kZV90eXBlLCBmbC0+Zl9zbG90KTsKKwkJCXJldDIgPSBvY2ZzMl9mcmVlX2NhY2hlZF9pdGVtcyhvc2IsIGZsLT5mX2lub2RlX3R5cGUsCisJCQkJCQkgICAgICAgZmwtPmZfc2xvdCwgZmwtPmZfZmlyc3QpOworCQkJaWYgKHJldDIpCisJCQkJbWxvZ19lcnJubyhyZXQyKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IHJldDI7CisJCX0KKworCQljdHh0LT5jX2ZpcnN0X3N1YmFsbG9jYXRvciA9IGZsLT5mX25leHRfc3ViYWxsb2NhdG9yOworCQlrZnJlZShmbCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QgKgorb2NmczJfZmluZF9wZXJfc2xvdF9mcmVlX2xpc3QoaW50IHR5cGUsCisJCQkgICAgICBpbnQgc2xvdCwKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0KQoreworCXN0cnVjdCBvY2ZzMl9wZXJfc2xvdF9mcmVlX2xpc3QgKmZsID0gY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3I7CisKKwl3aGlsZSAoZmwpIHsKKwkJaWYgKGZsLT5mX2lub2RlX3R5cGUgPT0gdHlwZSAmJiBmbC0+Zl9zbG90ID09IHNsb3QpCisJCQlyZXR1cm4gZmw7CisKKwkJZmwgPSBmbC0+Zl9uZXh0X3N1YmFsbG9jYXRvcjsKKwl9CisKKwlmbCA9IGttYWxsb2Moc2l6ZW9mKCpmbCksIEdGUF9OT0ZTKTsKKwlpZiAoZmwpIHsKKwkJZmwtPmZfaW5vZGVfdHlwZSA9IHR5cGU7CisJCWZsLT5mX3Nsb3QgPSBzbG90OworCQlmbC0+Zl9maXJzdCA9IE5VTEw7CisJCWZsLT5mX25leHRfc3ViYWxsb2NhdG9yID0gY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3I7CisKKwkJY3R4dC0+Y19maXJzdF9zdWJhbGxvY2F0b3IgPSBmbDsKKwl9CisJcmV0dXJuIGZsOworfQorCitzdGF0aWMgaW50IG9jZnMyX2NhY2hlX2Jsb2NrX2RlYWxsb2Moc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmN0eHQsCisJCQkJICAgICBpbnQgdHlwZSwgaW50IHNsb3QsIHU2NCBibGtubywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBiaXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0ICpmbDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2Jsb2NrX2ZyZWUgKml0ZW07CisKKwlmbCA9IG9jZnMyX2ZpbmRfcGVyX3Nsb3RfZnJlZV9saXN0KHR5cGUsIHNsb3QsIGN0eHQpOworCWlmIChmbCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaXRlbSA9IGttYWxsb2Moc2l6ZW9mKCppdGVtKSwgR0ZQX05PRlMpOworCWlmIChpdGVtID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwltbG9nKDAsICJJbnNlcnQ6ICh0eXBlICVkLCBzbG90ICV1LCBiaXQgJXUsIGJsayAlbGx1KVxuIiwKKwkgICAgIHR5cGUsIHNsb3QsIGJpdCwgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtubyk7CisKKwlpdGVtLT5mcmVlX2JsayA9IGJsa25vOworCWl0ZW0tPmZyZWVfYml0ID0gYml0OworCWl0ZW0tPmZyZWVfbmV4dCA9IGZsLT5mX2ZpcnN0OworCisJZmwtPmZfZmlyc3QgPSBpdGVtOworCisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX2NhY2hlX2V4dGVudF9ibG9ja19mcmVlKHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjdHh0LAorCQkJCQkgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpCit7CisJcmV0dXJuIG9jZnMyX2NhY2hlX2Jsb2NrX2RlYWxsb2MoY3R4dCwgRVhURU5UX0FMTE9DX1NZU1RFTV9JTk9ERSwKKwkJCQkJIGxlMTZfdG9fY3B1KGViLT5oX3N1YmFsbG9jX3Nsb3QpLAorCQkJCQkgbGU2NF90b19jcHUoZWItPmhfYmxrbm8pLAorCQkJCQkgbGUxNl90b19jcHUoZWItPmhfc3ViYWxsb2NfYml0KSk7Cit9CisKIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIGN1cnJlbnRseSBsYXN0IGV4dGVudAogICogYmxvY2sgd2lsbCBiZSBkZWxldGVkLCBhbmQgaWYgaXQgd2lsbCwgd2hhdCB0aGUgbmV3IGxhc3QgZXh0ZW50CiAgKiBibG9jayB3aWxsIGJlIHNvIHdlIGNhbiB1cGRhdGUgaGlzIGhfbmV4dF9sZWFmX2JsayBmaWVsZCwgYXMgd2VsbApAQCAtMzIzOCwyNyArNTUyNiwxMCBAQAogCQkJQlVHX09OKGxlMzJfdG9fY3B1KGVsLT5sX3JlY3NbMF0uZV9jcG9zKSk7CiAJCQlCVUdfT04obGU2NF90b19jcHUoZWwtPmxfcmVjc1swXS5lX2Jsa25vKSk7CiAKLQkJCWlmIChsZTE2X3RvX2NwdShlYi0+aF9zdWJhbGxvY19zbG90KSA9PSAwKSB7Ci0JCQkJLyoKLQkJCQkgKiBUaGlzIGNvZGUgb25seSB1bmRlcnN0YW5kcyBob3cgdG8KLQkJCQkgKiBsb2NrIHRoZSBzdWJhbGxvY2F0b3IgaW4gc2xvdCAwLAotCQkJCSAqIHdoaWNoIGlzIGZpbmUgYmVjYXVzZSBhbGxvY2F0aW9uIGlzCi0JCQkJICogb25seSBldmVyIGRvbmUgb3V0IG9mIHRoYXQKLQkJCQkgKiBzdWJhbGxvY2F0b3IgdG9vLiBBIGZ1dHVyZSB2ZXJzaW9uCi0JCQkJICogbWlnaHQgY2hhbmdlIHRoYXQgaG93ZXZlciwgc28gYXZvaWQKLQkJCQkgKiBhIGZyZWUgaWYgd2UgZG9uJ3Qga25vdyBob3cgdG8KLQkJCQkgKiBoYW5kbGUgaXQuIFRoaXMgd2F5IGFuIGZzIGluY29tcGF0Ci0JCQkJICogYml0IHdpbGwgbm90IGJlIG5lY2Vzc2FyeS4KLQkJCQkgKi8KLQkJCQlyZXQgPSBvY2ZzMl9mcmVlX2V4dGVudF9ibG9jayhoYW5kbGUsCi0JCQkJCQkJICAgICAgdGMtPnRjX2V4dF9hbGxvY19pbm9kZSwKLQkJCQkJCQkgICAgICB0Yy0+dGNfZXh0X2FsbG9jX2JoLAotCQkJCQkJCSAgICAgIGViKTsKLQotCQkJCS8qIEFuIGVycm9yIGhlcmUgaXMgbm90IGZhdGFsLiAqLwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQl9CisJCQlyZXQgPSBvY2ZzMl9jYWNoZV9leHRlbnRfYmxvY2tfZnJlZSgmdGMtPnRjX2RlYWxsb2MsIGViKTsKKwkJCS8qIEFuIGVycm9yIGhlcmUgaXMgbm90IGZhdGFsLiAqLworCQkJaWYgKHJldCA8IDApCisJCQkJbWxvZ19lcnJubyhyZXQpOwogCQl9IGVsc2UgewogCQkJZGVsZXRlZF9lYiA9IDA7CiAJCX0KQEAgLTMzOTcsOSArNTY2OCw5IEBACiAJcmV0dXJuIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGUsIGJoKTsKIH0KIAotc3RhdGljIHZvaWQgb2NmczJfemVyb19jbHVzdGVyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBpc2l6ZSwKLQkJCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBudW1wYWdlcywKLQkJCQkgICAgIHU2NCBwaHlzLCBoYW5kbGVfdCAqaGFuZGxlKQorc3RhdGljIHZvaWQgb2NmczJfemVyb19jbHVzdGVyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwKKwkJCQkgICAgIGxvZmZfdCBlbmQsIHN0cnVjdCBwYWdlICoqcGFnZXMsCisJCQkJICAgICBpbnQgbnVtcGFnZXMsIHU2NCBwaHlzLCBoYW5kbGVfdCAqaGFuZGxlKQogewogCWludCBpLCByZXQsIHBhcnRpYWwgPSAwOwogCXZvaWQgKmthZGRyOwpAQCAtMzQxMiwyNiArNTY4MywxNCBAQAogCWlmIChudW1wYWdlcyA9PSAwKQogCQlnb3RvIG91dDsKIAotCWZyb20gPSBpc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsgLyogMXN0IHBhZ2Ugb2Zmc2V0ICovCi0JaWYgKFBBR0VfQ0FDSEVfU0hJRlQgPiBPQ0ZTMl9TQihzYiktPnNfY2x1c3RlcnNpemVfYml0cykgewotCQkvKgotCQkgKiBTaW5jZSAnZnJvbScgaGFzIGJlZW4gY2FwcGVkIHRvIGEgdmFsdWUgYmVsb3cgcGFnZQotCQkgKiBzaXplLCB0aGlzIGNhbGN1bGF0aW9uIHdvbid0IGJlIGFibGUgdG8gb3ZlcmZsb3cKLQkJICogJ3RvJwotCQkgKi8KLQkJdG8gPSBvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhzYiwgZnJvbSk7Ci0KLQkJLyoKLQkJICogVGhlIHRydW5jYXRlIHRhaWwgaW4gdGhpcyBjYXNlIHNob3VsZCBuZXZlciBjb250YWluCi0JCSAqIG1vcmUgdGhhbiBvbmUgcGFnZSBhdCBtYXhpbXVtLiBUaGUgbG9vcCBiZWxvdyBhbHNvCi0JCSAqIGFzc3VtZXMgdGhpcy4KLQkJICovCi0JCUJVR19PTihudW1wYWdlcyAhPSAxKTsKLQl9Ci0KKwl0byA9IFBBR0VfQ0FDSEVfU0laRTsKIAlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7CiAJCXBhZ2UgPSBwYWdlc1tpXTsKIAorCQlmcm9tID0gc3RhcnQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCWlmICgoZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpID09IHBhZ2UtPmluZGV4KQorCQkJdG8gPSBlbmQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisKIAkJQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOwogCQlCVUdfT04odG8gPiBQQUdFX0NBQ0hFX1NJWkUpOwogCkBAIC0zNDY4LDEwICs1NzI3LDcgQEAKIAogCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAotCQkvKgotCQkgKiBFdmVyeSBwYWdlIGFmdGVyIHRoZSAxc3Qgb25lIHNob3VsZCBiZSBjb21wbGV0ZWx5IHplcm8nZC4KLQkJICovCi0JCWZyb20gPSAwOworCQlzdGFydCA9IChwYWdlLT5pbmRleCArIDEpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJfQogb3V0OgogCWlmIChwYWdlcykgewpAQCAtMzQ4NCwyNCArNTc0MCwyNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBvY2ZzMl9ncmFiX2VvZl9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgaXNpemUsIHN0cnVjdCBwYWdlICoqcGFnZXMsCi0JCQkJaW50ICpudW0sIHU2NCAqcGh5cykKK3N0YXRpYyBpbnQgb2NmczJfZ3JhYl9lb2ZfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLAorCQkJCXN0cnVjdCBwYWdlICoqcGFnZXMsIGludCAqbnVtLCB1NjQgKnBoeXMpCiB7CiAJaW50IGksIG51bXBhZ2VzID0gMCwgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgY3NpemUgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYiktPnNfY2x1c3RlcnNpemU7CiAJdW5zaWduZWQgaW50IGV4dF9mbGFnczsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwogCXVuc2lnbmVkIGxvbmcgaW5kZXg7Ci0JdTY0IG5leHRfY2x1c3Rlcl9ieXRlczsKKwlsb2ZmX3QgbGFzdF9wYWdlX2J5dGVzOwogCiAJQlVHX09OKCFvY2ZzMl9zcGFyc2VfYWxsb2MoT0NGUzJfU0Ioc2IpKSk7CisJQlVHX09OKHN0YXJ0ID4gZW5kKTsKIAotCS8qIENsdXN0ZXIgYm91bmRhcnksIHNvIHdlIGRvbid0IG5lZWQgdG8gZ3JhYiBhbnkgcGFnZXMuICovCi0JaWYgKChpc2l6ZSAmIChjc2l6ZSAtIDEpKSA9PSAwKQorCWlmIChzdGFydCA9PSBlbmQpCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gb2NmczJfZXh0ZW50X21hcF9nZXRfYmxvY2tzKGlub2RlLCBpc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0cywKKwlCVUdfT04oc3RhcnQgPj4gT0NGUzJfU0Ioc2IpLT5zX2NsdXN0ZXJzaXplX2JpdHMgIT0KKwkgICAgICAgKGVuZCAtIDEpID4+IE9DRlMyX1NCKHNiKS0+c19jbHVzdGVyc2l6ZV9iaXRzKTsKKworCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgc3RhcnQgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMsCiAJCQkJCSAgcGh5cywgTlVMTCwgJmV4dF9mbGFncyk7CiAJaWYgKHJldCkgewogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0zNTE3LDggKzU3NzUsOCBAQAogCWlmIChleHRfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKQogCQlnb3RvIG91dDsKIAotCW5leHRfY2x1c3Rlcl9ieXRlcyA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLCBpc2l6ZSk7Ci0JaW5kZXggPSBpc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWxhc3RfcGFnZV9ieXRlcyA9IFBBR0VfQUxJR04oZW5kKTsKKwlpbmRleCA9IHN0YXJ0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJZG8gewogCQlwYWdlc1tudW1wYWdlc10gPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgpOwogCQlpZiAoIXBhZ2VzW251bXBhZ2VzXSkgewpAQCAtMzUyOSw3ICs1Nzg3LDcgQEAKIAogCQludW1wYWdlcysrOwogCQlpbmRleCsrOwotCX0gd2hpbGUgKGluZGV4IDwgKG5leHRfY2x1c3Rlcl9ieXRlcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSk7CisJfSB3aGlsZSAoaW5kZXggPCAobGFzdF9wYWdlX2J5dGVzID4+IFBBR0VfQ0FDSEVfU0hJRlQpKTsKIAogb3V0OgogCWlmIChyZXQgIT0gMCkgewpAQCAtMzU1OCwxMSArNTgxNiwxMCBAQAogICogb3RoZXJ3aXNlIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHdpbGwgc2tpcCB3cml0ZW91dCBvZiBwYWdlcyBwYXN0CiAgKiBpX3NpemUuIFRoZSBuZXdfaV9zaXplIHBhcmFtZXRlciBpcyBwYXNzZWQgZm9yIHRoaXMgcmVhc29uLgogICovCi1pbnQgb2NmczJfemVyb190YWlsX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSB1NjQgbmV3X2lfc2l6ZSkKK2ludCBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgdTY0IHJhbmdlX3N0YXJ0LCB1NjQgcmFuZ2VfZW5kKQogewogCWludCByZXQsIG51bXBhZ2VzOwotCWxvZmZfdCBlbmRieXRlOwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwogCXU2NCBwaHlzOwogCkBAIC0zNTgxLDcgKzU4MzgsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBvY2ZzMl9ncmFiX2VvZl9wYWdlcyhpbm9kZSwgbmV3X2lfc2l6ZSwgcGFnZXMsICZudW1wYWdlcywgJnBoeXMpOworCXJldCA9IG9jZnMyX2dyYWJfZW9mX3BhZ2VzKGlub2RlLCByYW5nZV9zdGFydCwgcmFuZ2VfZW5kLCBwYWdlcywKKwkJCQkgICAmbnVtcGFnZXMsICZwaHlzKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zNTkwLDE3ICs1ODQ4LDE2IEBACiAJaWYgKG51bXBhZ2VzID09IDApCiAJCWdvdG8gb3V0OwogCi0Jb2NmczJfemVyb19jbHVzdGVyX3BhZ2VzKGlub2RlLCBuZXdfaV9zaXplLCBwYWdlcywgbnVtcGFnZXMsIHBoeXMsCi0JCQkJIGhhbmRsZSk7CisJb2NmczJfemVyb19jbHVzdGVyX3BhZ2VzKGlub2RlLCByYW5nZV9zdGFydCwgcmFuZ2VfZW5kLCBwYWdlcywKKwkJCQkgbnVtcGFnZXMsIHBoeXMsIGhhbmRsZSk7CiAKIAkvKgogCSAqIEluaXRpYXRlIHdyaXRlb3V0IG9mIHRoZSBwYWdlcyB3ZSB6ZXJvJ2QgaGVyZS4gV2UgZG9uJ3QKIAkgKiB3YWl0IG9uIHRoZW0gLSB0aGUgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoKSBjYWxsIGxhdGVyIHdpbGwKIAkgKiBkbyB0aGF0IGZvciB1cy4KIAkgKi8KLQllbmRieXRlID0gb2NmczJfYWxpZ25fYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIG5ld19pX3NpemUpOwotCXJldCA9IGRvX3N5bmNfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplLAotCQkJCSAgICBlbmRieXRlIC0gMSwgU1lOQ19GSUxFX1JBTkdFX1dSSVRFKTsKKwlyZXQgPSBkb19zeW5jX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgcmFuZ2Vfc3RhcnQsCisJCQkJICAgIHJhbmdlX2VuZCAtIDEsIFNZTkNfRklMRV9SQU5HRV9XUklURSk7CiAJaWYgKHJldCkKIAkJbWxvZ19lcnJubyhyZXQpOwogCkBAIC0zNjMxLDggKzU4ODgsNiBAQAogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKLQlkb3duX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKLQogCW5ld19oaWdoZXN0X2Nwb3MgPSBvY2ZzMl9jbHVzdGVyc19mb3JfYnl0ZXMob3NiLT5zYiwKIAkJCQkJCSAgICAgaV9zaXplX3JlYWQoaW5vZGUpKTsKIApAQCAtMzc1NCw3ICs2MDA5LDYgQEAKIAlnb3RvIHN0YXJ0OwogCiBiYWlsOgotCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKIAogCW9jZnMyX3NjaGVkdWxlX3RydW5jYXRlX2xvZ19mbHVzaChvc2IsIDEpOwogCkBAIC0zNzY0LDYgKzYwMTgsOCBAQAogCWlmIChoYW5kbGUpCiAJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAKKwlvY2ZzMl9ydW5fZGVhbGxvY3Mob3NiLCAmdGMtPnRjX2RlYWxsb2MpOworCiAJb2NmczJfZnJlZV9wYXRoKHBhdGgpOwogCiAJLyogVGhpcyB3aWxsIGRyb3AgdGhlIGV4dF9hbGxvYyBjbHVzdGVyIGxvY2sgZm9yIHVzICovCkBAIC0zNzc0LDIzICs2MDMwLDE4IEBACiB9CiAKIC8qCi0gKiBFeHBlY3RzIHRoZSBpbm9kZSB0byBhbHJlYWR5IGJlIGxvY2tlZC4gVGhpcyB3aWxsIGZpZ3VyZSBvdXQgd2hpY2gKLSAqIGlub2RlcyBuZWVkIHRvIGJlIGxvY2tlZCBhbmQgd2lsbCBwdXQgdGhlbSBvbiB0aGUgcmV0dXJuZWQgdHJ1bmNhdGUKLSAqIGNvbnRleHQuCisgKiBFeHBlY3RzIHRoZSBpbm9kZSB0byBhbHJlYWR5IGJlIGxvY2tlZC4KICAqLwogaW50IG9jZnMyX3ByZXBhcmVfdHJ1bmNhdGUoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpmZV9iaCwKIAkJCSAgIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICoqdGMpCiB7Ci0JaW50IHN0YXR1cywgbWV0YWRhdGFfZGVsZXRlLCBpOworCWludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IG5ld19pX2NsdXN0ZXJzOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmZlOwogCXN0cnVjdCBvY2ZzMl9leHRlbnRfYmxvY2sgKmViOwotCXN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqZWw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpsYXN0X2ViX2JoID0gTlVMTDsKLQlzdHJ1Y3QgaW5vZGUgKmV4dF9hbGxvY19pbm9kZSA9IE5VTEw7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpleHRfYWxsb2NfYmggPSBOVUxMOwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKQEAgLTM4MTAsMTIgKzYwNjEsOSBAQAogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CisJb2NmczJfaW5pdF9kZWFsbG9jX2N0eHQoJigqdGMpLT50Y19kZWFsbG9jKTsKIAotCW1ldGFkYXRhX2RlbGV0ZSA9IDA7CiAJaWYgKGZlLT5pZDIuaV9saXN0LmxfdHJlZV9kZXB0aCkgewotCQkvKiBJZiB3ZSBoYXZlIGEgdHJlZSwgdGhlbiB0aGUgdHJ1bmNhdGUgbWF5IHJlc3VsdCBpbgotCQkgKiBtZXRhZGF0YSBkZWxldGVzLiBGaWd1cmUgdGhpcyBvdXQgZnJvbSB0aGUKLQkJICogcmlnaHRtb3N0IGxlYWYgYmxvY2suKi8KIAkJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIGxlNjRfdG9fY3B1KGZlLT5pX2xhc3RfZWJfYmxrKSwKIAkJCQkJICAmbGFzdF9lYl9iaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CkBAIC0zODMwLDQzICs2MDc4LDEwIEBACiAJCQlzdGF0dXMgPSAtRUlPOwogCQkJZ290byBiYWlsOwogCQl9Ci0JCWVsID0gJihlYi0+aF9saXN0KTsKLQotCQlpID0gMDsKLQkJaWYgKG9jZnMyX2lzX2VtcHR5X2V4dGVudCgmZWwtPmxfcmVjc1swXSkpCi0JCQlpID0gMTsKLQkJLyoKLQkJICogWFhYOiBTaG91bGQgd2UgY2hlY2sgdGhhdCBuZXh0X2ZyZWVfcmVjIGNvbnRhaW5zCi0JCSAqIHRoZSBleHRlbnQ/Ci0JCSAqLwotCQlpZiAobGUzMl90b19jcHUoZWwtPmxfcmVjc1tpXS5lX2Nwb3MpID49IG5ld19pX2NsdXN0ZXJzKQotCQkJbWV0YWRhdGFfZGVsZXRlID0gMTsKIAl9CiAKIAkoKnRjKS0+dGNfbGFzdF9lYl9iaCA9IGxhc3RfZWJfYmg7CiAKLQlpZiAobWV0YWRhdGFfZGVsZXRlKSB7Ci0JCW1sb2coMCwgIldpbGwgaGF2ZSB0byBkZWxldGUgbWV0YWRhdGEgZm9yIHRoaXMgdHJ1bmMuICIKLQkJICAgICAibG9ja2luZyBhbGxvY2F0b3IuXG4iKTsKLQkJZXh0X2FsbG9jX2lub2RlID0gb2NmczJfZ2V0X3N5c3RlbV9maWxlX2lub2RlKG9zYiwgRVhURU5UX0FMTE9DX1NZU1RFTV9JTk9ERSwgMCk7Ci0JCWlmICghZXh0X2FsbG9jX2lub2RlKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQkJZ290byBiYWlsOwotCQl9Ci0KLQkJbXV0ZXhfbG9jaygmZXh0X2FsbG9jX2lub2RlLT5pX211dGV4KTsKLQkJKCp0YyktPnRjX2V4dF9hbGxvY19pbm9kZSA9IGV4dF9hbGxvY19pbm9kZTsKLQotCQlzdGF0dXMgPSBvY2ZzMl9tZXRhX2xvY2soZXh0X2FsbG9jX2lub2RlLCAmZXh0X2FsbG9jX2JoLCAxKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQotCQkoKnRjKS0+dGNfZXh0X2FsbG9jX2JoID0gZXh0X2FsbG9jX2JoOwotCQkoKnRjKS0+dGNfZXh0X2FsbG9jX2xvY2tlZCA9IDE7Ci0JfQotCiAJc3RhdHVzID0gMDsKIGJhaWw6CiAJaWYgKHN0YXR1cyA8IDApIHsKQEAgLTM4ODAsMTYgKzYwOTUsMTMgQEAKIAogc3RhdGljIHZvaWQgb2NmczJfZnJlZV90cnVuY2F0ZV9jb250ZXh0KHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0ICp0YykKIHsKLQlpZiAodGMtPnRjX2V4dF9hbGxvY19pbm9kZSkgewotCQlpZiAodGMtPnRjX2V4dF9hbGxvY19sb2NrZWQpCi0JCQlvY2ZzMl9tZXRhX3VubG9jayh0Yy0+dGNfZXh0X2FsbG9jX2lub2RlLCAxKTsKLQotCQltdXRleF91bmxvY2soJnRjLT50Y19leHRfYWxsb2NfaW5vZGUtPmlfbXV0ZXgpOwotCQlpcHV0KHRjLT50Y19leHRfYWxsb2NfaW5vZGUpOwotCX0KLQotCWlmICh0Yy0+dGNfZXh0X2FsbG9jX2JoKQotCQlicmVsc2UodGMtPnRjX2V4dF9hbGxvY19iaCk7CisJLyoKKwkgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb21wbGV0aW5nIGRlYWxsb2NhdGlvbgorCSAqIGJlZm9yZSBmcmVlaW5nIHRoZSBjb250ZXh0LgorCSAqLworCWlmICh0Yy0+dGNfZGVhbGxvYy5jX2ZpcnN0X3N1YmFsbG9jYXRvciAhPSBOVUxMKQorCQltbG9nKE1MX05PVElDRSwKKwkJICAgICAiVHJ1bmNhdGUgY29tcGxldGlvbiBoYXMgbm9uLWVtcHR5IGRlYWxsb2MgY29udGV4dFxuIik7CiAKIAlpZiAodGMtPnRjX2xhc3RfZWJfYmgpCiAJCWJyZWxzZSh0Yy0+dGNfbGFzdF9lYl9iaCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5oIGIvZnMvb2NmczIvYWxsb2MuaAppbmRleCBmYmNiNTkzLi45OTBkZjQ4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5oCisrKyBiL2ZzL29jZnMyL2FsbG9jLmgKQEAgLTM0LDcgKzM0LDE3IEBACiAJCQl1MzIgY3BvcywKIAkJCXU2NCBzdGFydF9ibGssCiAJCQl1MzIgbmV3X2NsdXN0ZXJzLAorCQkJdTggZmxhZ3MsCiAJCQlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyk7CitzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dDsKK2ludCBvY2ZzMl9tYXJrX2V4dGVudF93cml0dGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkgICAgICBoYW5kbGVfdCAqaGFuZGxlLCB1MzIgY3BvcywgdTMyIGxlbiwgdTMyIHBoeXMsCisJCQkgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYywKKwkJCSAgICAgIHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpkZWFsbG9jKTsKK2ludCBvY2ZzMl9yZW1vdmVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQl1MzIgY3BvcywgdTMyIGxlbiwgaGFuZGxlX3QgKmhhbmRsZSwKKwkJCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpOwogaW50IG9jZnMyX251bV9mcmVlX2V4dGVudHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUpOwpAQCAtNjIsMTcgKzcyLDQxIEBACiAJCQkJICAgICAgc3RydWN0IG9jZnMyX2Rpbm9kZSAqKnRsX2NvcHkpOwogaW50IG9jZnMyX2NvbXBsZXRlX3RydW5jYXRlX2xvZ19yZWNvdmVyeShzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkJIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKnRsX2NvcHkpOworaW50IG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CitpbnQgb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCSAgICAgIGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgICB1NjQgc3RhcnRfYmxrLAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyk7CitpbnQgX19vY2ZzMl9mbHVzaF90cnVuY2F0ZV9sb2coc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpOworCisvKgorICogUHJvY2VzcyBsb2NhbCBzdHJ1Y3R1cmUgd2hpY2ggZGVzY3JpYmVzIHRoZSBibG9jayB1bmxpbmtzIGRvbmUKKyAqIGR1cmluZyBhbiBvcGVyYXRpb24uIFRoaXMgaXMgcG9wdWxhdGVkIHZpYQorICogb2NmczJfY2FjaGVfYmxvY2tfZGVhbGxvYygpLgorICoKKyAqIG9jZnMyX3J1bl9kZWFsbG9jcygpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHBvdGVudGlhbGx5CisgKiBkZS1hbGxvY2F0aW5nIHJvdXRpbmVzLiBObyBqb3VybmFsIGhhbmRsZXMgc2hvdWxkIGJlIG9wZW4sIGFuZCBtb3N0CisgKiBsb2NrcyBzaG91bGQgaGF2ZSBiZWVuIGRyb3BwZWQuCisgKi8KK3N0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IHsKKwlzdHJ1Y3Qgb2NmczJfcGVyX3Nsb3RfZnJlZV9saXN0CQkqY19maXJzdF9zdWJhbGxvY2F0b3I7Cit9Oworc3RhdGljIGlubGluZSB2b2lkIG9jZnMyX2luaXRfZGVhbGxvY19jdHh0KHN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0ICpjKQoreworCWMtPmNfZmlyc3Rfc3ViYWxsb2NhdG9yID0gTlVMTDsKK30KK2ludCBvY2ZzMl9ydW5fZGVhbGxvY3Moc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCSAgICAgICBzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCAqY3R4dCk7CiAKIHN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9jb250ZXh0IHsKLQlzdHJ1Y3QgaW5vZGUgKnRjX2V4dF9hbGxvY19pbm9kZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRjX2V4dF9hbGxvY19iaDsKKwlzdHJ1Y3Qgb2NmczJfY2FjaGVkX2RlYWxsb2NfY3R4dCB0Y19kZWFsbG9jOwogCWludCB0Y19leHRfYWxsb2NfbG9ja2VkOyAvKiBpcyBpdCBjbHVzdGVyIGxvY2tlZD8gKi8KIAkvKiB0aGVzZSBnZXQgZGVzdHJveWVkIG9uY2UgaXQncyBwYXNzZWQgdG8gb2NmczJfY29tbWl0X3RydW5jYXRlLiAqLwogCXN0cnVjdCBidWZmZXJfaGVhZCAqdGNfbGFzdF9lYl9iaDsKIH07CiAKLWludCBvY2ZzMl96ZXJvX3RhaWxfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJIHU2NCBuZXdfaV9zaXplKTsKK2ludCBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBoYW5kbGVfdCAqaGFuZGxlLAorCQkJCSAgdTY0IHJhbmdlX3N0YXJ0LCB1NjQgcmFuZ2VfZW5kKTsKIGludCBvY2ZzMl9wcmVwYXJlX3RydW5jYXRlKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLAogCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCkBAIC04NCw2ICsxMTgsNyBAQAogCiBpbnQgb2NmczJfZmluZF9sZWFmKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbGlzdCAqcm9vdF9lbCwKIAkJICAgIHUzMiBjcG9zLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsZWFmX2JoKTsKK2ludCBvY2ZzMl9zZWFyY2hfZXh0ZW50X2xpc3Qoc3RydWN0IG9jZnMyX2V4dGVudF9saXN0ICplbCwgdTMyIHZfY2x1c3Rlcik7CiAKIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gbG9vayBhdCB0aGUgIyBvZiBjbHVzdGVycyBpbiBhbiBleHRlbnQgcmVjb3JkLgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5jIGIvZnMvb2NmczIvYW9wcy5jCmluZGV4IGE0ODBiMDkuLjg0YmY2ZTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuYworKysgYi9mcy9vY2ZzMi9hb3BzLmMKQEAgLTY4NCw2ICs2ODQsOCBAQAogCSAgICAgYmggPSBiaC0+Yl90aGlzX3BhZ2UsIGJsb2NrX3N0YXJ0ICs9IGJzaXplKSB7CiAJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYnNpemU7CiAKKwkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisKIAkJLyoKIAkJICogSWdub3JlIGJsb2NrcyBvdXRzaWRlIG9mIG91ciBpL28gcmFuZ2UgLQogCQkgKiB0aGV5IG1heSBiZWxvbmcgdG8gdW5hbGxvY2F0ZWQgY2x1c3RlcnMuCkBAIC02OTgsOSArNzAwLDggQEAKIAkJICogRm9yIGFuIGFsbG9jYXRpbmcgd3JpdGUgd2l0aCBjbHVzdGVyIHNpemUgPj0gcGFnZQogCQkgKiBzaXplLCB3ZSBhbHdheXMgd3JpdGUgdGhlIGVudGlyZSBwYWdlLgogCQkgKi8KLQotCQlpZiAoYnVmZmVyX25ldyhiaCkpCi0JCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJaWYgKG5ldykKKwkJCXNldF9idWZmZXJfbmV3KGJoKTsKIAogCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CiAJCQltYXBfYmgoYmgsIGlub2RlLT5pX3NiLCAqcF9ibGtubyk7CkBAIC03MTEsNyArNzEyLDggQEAKIAkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJfSBlbHNlIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSAmJiAhYnVmZmVyX2RlbGF5KGJoKSAmJgotCQkgICAgIChibG9ja19zdGFydCA8IGZyb20gfHwgYmxvY2tfZW5kID4gdG8pKSB7CisJCQkgICAhYnVmZmVyX25ldyhiaCkgJiYKKwkJCSAgIChibG9ja19zdGFydCA8IGZyb20gfHwgYmxvY2tfZW5kID4gdG8pKSB7CiAJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOwogCQkJKndhaXRfYmgrKz1iaDsKIAkJfQpAQCAtNzM4LDE4ICs3NDAsMTMgQEAKIAliaCA9IGhlYWQ7CiAJYmxvY2tfc3RhcnQgPSAwOwogCWRvIHsKLQkJdm9pZCAqa2FkZHI7Ci0KIAkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBic2l6ZTsKIAkJaWYgKGJsb2NrX2VuZCA8PSBmcm9tKQogCQkJZ290byBuZXh0X2JoOwogCQlpZiAoYmxvY2tfc3RhcnQgPj0gdG8pCiAJCQlicmVhazsKIAotCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LCAwLCBiaC0+Yl9zaXplKTsKLQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7Ci0JCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJemVyb191c2VyX3BhZ2UocGFnZSwgYmxvY2tfc3RhcnQsIGJoLT5iX3NpemUsIEtNX1VTRVIwKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIApAQCAtNzYxLDIxNyArNzU4LDI0MCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZiAoUEFHRV9DQUNIRV9TSVpFID49IE9DRlMyX01BWF9DTFVTVEVSU0laRSkKKyNkZWZpbmUgT0NGUzJfTUFYX0NUWFRfUEFHRVMJMQorI2Vsc2UKKyNkZWZpbmUgT0NGUzJfTUFYX0NUWFRfUEFHRVMJKE9DRlMyX01BWF9DTFVTVEVSU0laRSAvIFBBR0VfQ0FDSEVfU0laRSkKKyNlbmRpZgorCisjZGVmaW5lIE9DRlMyX01BWF9DTFVTVEVSU19QRVJfUEFHRQkoUEFHRV9DQUNIRV9TSVpFIC8gT0NGUzJfTUlOX0NMVVNURVJTSVpFKQorCiAvKgotICogVGhpcyB3aWxsIGNvcHkgdXNlciBkYXRhIGZyb20gdGhlIGJ1ZmZlciBwYWdlIGluIHRoZSBzcGxpY2UKLSAqIGNvbnRleHQuCi0gKgotICogRm9yIG5vdywgd2UgaWdub3JlIFNQTElDRV9GX01PVkUgYXMgdGhhdCB3b3VsZCByZXF1aXJlIHNvbWUgZXh0cmEKLSAqIGNvbW11bmljYXRpb24gb3V0IGFsbCB0aGUgd2F5IHRvIG9jZnMyX3dyaXRlKCkuCisgKiBEZXNjcmliZSB0aGUgc3RhdGUgb2YgYSBzaW5nbGUgY2x1c3RlciB0byBiZSB3cml0dGVuIHRvLgogICovCi1pbnQgb2NmczJfbWFwX2FuZF93cml0ZV9zcGxpY2VfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCB1NjQgKnBfYmxrbm8sCi0JCQkJICB1bnNpZ25lZCBpbnQgKnJldF9mcm9tLCB1bnNpZ25lZCBpbnQgKnJldF90bykKK3N0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MgeworCXUzMgkJY19jcG9zOworCXUzMgkJY19waHlzOworCS8qCisJICogR2l2ZSB0aGlzIGEgdW5pcXVlIGZpZWxkIGJlY2F1c2UgY19waHlzIGV2ZW50dWFsbHkgZ2V0cworCSAqIGZpbGxlZC4KKwkgKi8KKwl1bnNpZ25lZAljX25ldzsKKwl1bnNpZ25lZAljX3Vud3JpdHRlbjsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IG9jZnMyX3Nob3VsZF96ZXJvX2NsdXN0ZXIoc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYyAqZCkKIHsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCB0bywgZnJvbSwgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQ7Ci0JY2hhciAqc3JjLCAqZHN0OwotCXN0cnVjdCBvY2ZzMl9zcGxpY2Vfd3JpdGVfcHJpdiAqc3AgPSB3Yy0+d19wcml2YXRlOwotCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gc3AtPnNfYnVmOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXMsIHNyY19mcm9tOwotCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCi0Jb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhvc2IsIHdjLT53X2Nwb3MsICZjbHVzdGVyX3N0YXJ0LAotCQkJCQkmY2x1c3Rlcl9lbmQpOwotCi0JZnJvbSA9IHNwLT5zX29mZnNldDsKLQlzcmNfZnJvbSA9IHNwLT5zX2J1Zl9vZmZzZXQ7Ci0JYnl0ZXMgPSB3Yy0+d19jb3VudDsKLQotCWlmICh3Yy0+d19sYXJnZV9wYWdlcykgewotCQkvKgotCQkgKiBGb3IgY2x1c3RlciBzaXplIDwgcGFnZSBzaXplLCB3ZSBoYXZlIHRvCi0JCSAqIGNhbGN1bGF0ZSBwb3Mgd2l0aGluIHRoZSBjbHVzdGVyIGFuZCBvYmV5Ci0JCSAqIHRoZSByaWdodG1vc3QgYm91bmRhcnkuCi0JCSAqLwotCQlieXRlcyA9IG1pbihieXRlcywgKHVuc2lnbmVkIGxvbmcpKG9zYi0+c19jbHVzdGVyc2l6ZQotCQkJCSAgIC0gKHdjLT53X3BvcyAmIChvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSkpKTsKLQl9Ci0JdG8gPSBmcm9tICsgYnl0ZXM7Ci0KLQlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSk7Ci0JQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKLQlCVUdfT04oZnJvbSA8IGNsdXN0ZXJfc3RhcnQpOwotCUJVR19PTih0byA+IGNsdXN0ZXJfZW5kKTsKLQotCWlmICh3Yy0+d190aGlzX3BhZ2VfbmV3KQotCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLCAxKTsKLQllbHNlCi0JCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2Nrcyh3Yy0+d190aGlzX3BhZ2UsIHBfYmxrbm8sIGlub2RlLAotCQkJCQkgICAgZnJvbSwgdG8sIDApOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzcmMgPSBidWYtPm9wcy0+bWFwKHNwLT5zX3BpcGUsIGJ1ZiwgMSk7Ci0JZHN0ID0ga21hcF9hdG9taWMod2MtPndfdGhpc19wYWdlLCBLTV9VU0VSMSk7Ci0JbWVtY3B5KGRzdCArIGZyb20sIHNyYyArIHNyY19mcm9tLCBieXRlcyk7Ci0Ja3VubWFwX2F0b21pYyh3Yy0+d190aGlzX3BhZ2UsIEtNX1VTRVIxKTsKLQlidWYtPm9wcy0+dW5tYXAoc3AtPnNfcGlwZSwgYnVmLCBzcmMpOwotCi0Jd2MtPndfZmluaXNoZWRfY29weSA9IDE7Ci0KLQkqcmV0X2Zyb20gPSBmcm9tOwotCSpyZXRfdG8gPSB0bzsKLW91dDoKLQotCXJldHVybiBieXRlcyA/ICh1bnNpZ25lZCBpbnQpYnl0ZXMgOiByZXQ7CisJcmV0dXJuIGQtPmNfbmV3IHx8IGQtPmNfdW53cml0dGVuOwogfQogCi0vKgotICogVGhpcyB3aWxsIGNvcHkgdXNlciBkYXRhIGZyb20gdGhlIGlvdmVjIGluIHRoZSBidWZmZXJlZCB3cml0ZQotICogY29udGV4dC4KLSAqLwotaW50IG9jZnMyX21hcF9hbmRfd3JpdGVfdXNlcl9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsIHU2NCAqcF9ibGtubywKLQkJCQkgIHVuc2lnbmVkIGludCAqcmV0X2Zyb20sIHVuc2lnbmVkIGludCAqcmV0X3RvKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHRvLCBmcm9tLCBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZDsKLQl1bnNpZ25lZCBsb25nIGJ5dGVzLCBzcmNfZnJvbTsKLQljaGFyICpkc3Q7Ci0Jc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgKmJwID0gd2MtPndfcHJpdmF0ZTsKLQljb25zdCBzdHJ1Y3QgaW92ZWMgKmN1cl9pb3YgPSBicC0+Yl9jdXJfaW92OwotCWNoYXIgX191c2VyICpidWY7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CitzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCB7CisJLyogTG9naWNhbCBjbHVzdGVyIHBvc2l0aW9uIC8gbGVuIG9mIHdyaXRlICovCisJdTMyCQkJCXdfY3BvczsKKwl1MzIJCQkJd19jbGVuOwogCi0Jb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhvc2IsIHdjLT53X2Nwb3MsICZjbHVzdGVyX3N0YXJ0LAotCQkJCQkmY2x1c3Rlcl9lbmQpOwotCi0JYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBicC0+Yl9jdXJfb2ZmOwotCXNyY19mcm9tID0gKHVuc2lnbmVkIGxvbmcpYnVmICYgflBBR0VfQ0FDSEVfTUFTSzsKLQotCWZyb20gPSB3Yy0+d19wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJc3RydWN0IG9jZnMyX3dyaXRlX2NsdXN0ZXJfZGVzYwl3X2Rlc2NbT0NGUzJfTUFYX0NMVVNURVJTX1BFUl9QQUdFXTsKIAogCS8qCi0JICogVGhpcyBpcyBhIGxvdCBvZiBjb21wYXJpc29ucywgYnV0IGl0IHJlYWRzIHF1aXRlCi0JICogZWFzaWx5LCB3aGljaCBpcyBpbXBvcnRhbnQgaGVyZS4KLQkgKi8KLQkvKiBTdGF5IHdpdGhpbiB0aGUgc3JjIHBhZ2UgKi8KLQlieXRlcyA9IFBBR0VfU0laRSAtIHNyY19mcm9tOwotCS8qIFN0YXkgd2l0aGluIHRoZSB2ZWN0b3IgKi8KLQlieXRlcyA9IG1pbihieXRlcywKLQkJICAgICh1bnNpZ25lZCBsb25nKShjdXJfaW92LT5pb3ZfbGVuIC0gYnAtPmJfY3VyX29mZikpOwotCS8qIFN0YXkgd2l0aGluIGNvdW50ICovCi0JYnl0ZXMgPSBtaW4oYnl0ZXMsICh1bnNpZ25lZCBsb25nKXdjLT53X2NvdW50KTsKLQkvKgotCSAqIEZvciBjbHVzdGVyc2l6ZSA+IHBhZ2Ugc2l6ZSwganVzdCBzdGF5IHdpdGhpbgotCSAqIHRhcmdldCBwYWdlLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byBjYWxjdWxhdGUgcG9zCi0JICogd2l0aGluIHRoZSBjbHVzdGVyIGFuZCBvYmV5IHRoZSByaWdodG1vc3QKLQkgKiBib3VuZGFyeS4KLQkgKi8KLQlpZiAod2MtPndfbGFyZ2VfcGFnZXMpIHsKLQkJLyoKLQkJICogRm9yIGNsdXN0ZXIgc2l6ZSA8IHBhZ2Ugc2l6ZSwgd2UgaGF2ZSB0bwotCQkgKiBjYWxjdWxhdGUgcG9zIHdpdGhpbiB0aGUgY2x1c3RlciBhbmQgb2JleQotCQkgKiB0aGUgcmlnaHRtb3N0IGJvdW5kYXJ5LgotCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsICh1bnNpZ25lZCBsb25nKShvc2ItPnNfY2x1c3RlcnNpemUKLQkJCQkgICAtICh3Yy0+d19wb3MgJiAob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSkpKSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogY2x1c3RlciBzaXplID4gcGFnZSBzaXplIGlzIHRoZSBtb3N0IGNvbW1vbgotCQkgKiBjYXNlIC0gd2UganVzdCBzdGF5IHdpdGhpbiB0aGUgdGFyZ2V0IHBhZ2UKLQkJICogYm91bmRhcnkuCi0JCSAqLwotCQlieXRlcyA9IG1pbihieXRlcywgUEFHRV9DQUNIRV9TSVpFIC0gZnJvbSk7Ci0JfQotCi0JdG8gPSBmcm9tICsgYnl0ZXM7Ci0KLQlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSk7Ci0JQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKLQlCVUdfT04oZnJvbSA8IGNsdXN0ZXJfc3RhcnQpOwotCUJVR19PTih0byA+IGNsdXN0ZXJfZW5kKTsKLQotCWlmICh3Yy0+d190aGlzX3BhZ2VfbmV3KQotCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3Mod2MtPndfdGhpc19wYWdlLCBwX2Jsa25vLCBpbm9kZSwKLQkJCQkJICAgIGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kLCAxKTsKLQllbHNlCi0JCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2Nrcyh3Yy0+d190aGlzX3BhZ2UsIHBfYmxrbm8sIGlub2RlLAotCQkJCQkgICAgZnJvbSwgdG8sIDApOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkc3QgPSBrbWFwKHdjLT53X3RoaXNfcGFnZSk7Ci0JbWVtY3B5KGRzdCArIGZyb20sIGJwLT5iX3NyY19idWYgKyBzcmNfZnJvbSwgYnl0ZXMpOwotCWt1bm1hcCh3Yy0+d190aGlzX3BhZ2UpOwotCi0JLyoKLQkgKiBYWFg6IFRoaXMgaXMgc2xvdywgYnV0IHNpbXBsZS4gVGhlIGNhbGxlciBvZgotCSAqIG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoKSBpcyByZXNwb25zaWJsZSBmb3IKLQkgKiBwYXNzaW5nIHRocm91Z2ggdGhlIGlvdmVjcywgc28gaXQncyBkaWZmaWN1bHQgdG8KLQkgKiBwcmVkaWN0IHdoYXQgb3VyIG5leHQgc3RlcCBpcyBpbiBoZXJlIGFmdGVyIG91cgotCSAqIGluaXRpYWwgd3JpdGUuIEEgZnV0dXJlIHZlcnNpb24gc2hvdWxkIGJlIHB1c2hpbmcKLQkgKiB0aGF0IGlvdmVjIG1hbmlwdWxhdGlvbiBmdXJ0aGVyIGRvd24uCisJICogVGhpcyBpcyB0cnVlIGlmIHBhZ2Vfc2l6ZSA+IGNsdXN0ZXJfc2l6ZS4KIAkgKgotCSAqIEJ5IHNldHRpbmcgdGhpcywgd2UgaW5kaWNhdGUgdGhhdCBhIGNvcHkgZnJvbSB1c2VyCi0JICogZGF0YSB3YXMgZG9uZSwgYW5kIHN1YnNlcXVlbnQgY2FsbHMgZm9yIHRoaXMKLQkgKiBjbHVzdGVyIHdpbGwgc2tpcCBjb3B5aW5nIG1vcmUgZGF0YS4KKwkgKiBJdCB0cmlnZ2VycyBhIHNldCBvZiBzcGVjaWFsIGNhc2VzIGR1cmluZyB3cml0ZSB3aGljaCBtaWdodAorCSAqIGhhdmUgdG8gZGVhbCB3aXRoIGFsbG9jYXRpbmcgd3JpdGVzIHRvIHBhcnRpYWwgcGFnZXMuCiAJICovCi0Jd2MtPndfZmluaXNoZWRfY29weSA9IDE7CisJdW5zaWduZWQgaW50CQkJd19sYXJnZV9wYWdlczsKIAotCSpyZXRfZnJvbSA9IGZyb207Ci0JKnJldF90byA9IHRvOwotb3V0OgorCS8qCisJICogUGFnZXMgaW52b2x2ZWQgaW4gdGhpcyB3cml0ZS4KKwkgKgorCSAqIHdfdGFyZ2V0X3BhZ2UgaXMgdGhlIHBhZ2UgYmVpbmcgd3JpdHRlbiB0byBieSB0aGUgdXNlci4KKwkgKgorCSAqIHdfcGFnZXMgaXMgYW4gYXJyYXkgb2YgcGFnZXMgd2hpY2ggYWx3YXlzIGNvbnRhaW5zCisJICogd190YXJnZXRfcGFnZSwgYW5kIGluIHRoZSBjYXNlIG9mIGFuIGFsbG9jYXRpbmcgd3JpdGUgd2l0aAorCSAqIHBhZ2Vfc2l6ZSA8IGNsdXN0ZXIgc2l6ZSwgaXQgd2lsbCBjb250YWluIHplcm8nZCBhbmQgbWFwcGVkCisJICogcGFnZXMgYWRqYWNlbnQgdG8gd190YXJnZXRfcGFnZSB3aGljaCBuZWVkIHRvIGJlIHdyaXR0ZW4KKwkgKiBvdXQgaW4gc28gdGhhdCBmdXR1cmUgcmVhZHMgZnJvbSB0aGF0IHJlZ2lvbiB3aWxsIGdldAorCSAqIHplcm8ncy4KKwkgKi8KKwlzdHJ1Y3QgcGFnZQkJCSp3X3BhZ2VzW09DRlMyX01BWF9DVFhUX1BBR0VTXTsKKwl1bnNpZ25lZCBpbnQJCQl3X251bV9wYWdlczsKKwlzdHJ1Y3QgcGFnZQkJCSp3X3RhcmdldF9wYWdlOwogCi0JcmV0dXJuIGJ5dGVzID8gKHVuc2lnbmVkIGludClieXRlcyA6IHJldDsKKwkvKgorCSAqIG9jZnMyX3dyaXRlX2VuZCgpIHVzZXMgdGhpcyB0byBrbm93IHdoYXQgdGhlIHJlYWwgcmFuZ2UgdG8KKwkgKiB3cml0ZSBpbiB0aGUgdGFyZ2V0IHNob3VsZCBiZS4KKwkgKi8KKwl1bnNpZ25lZCBpbnQJCQl3X3RhcmdldF9mcm9tOworCXVuc2lnbmVkIGludAkJCXdfdGFyZ2V0X3RvOworCisJLyoKKwkgKiBXZSBjb3VsZCB1c2Ugam91cm5hbF9jdXJyZW50X2hhbmRsZSgpIGJ1dCB0aGlzIGlzIGNsZWFuZXIsCisJICogSU1ITyAtTWFyaworCSAqLworCWhhbmRsZV90CQkJKndfaGFuZGxlOworCisJc3RydWN0IGJ1ZmZlcl9oZWFkCQkqd19kaV9iaDsKKworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IHdfZGVhbGxvYzsKK307CisKK3N0YXRpYyB2b2lkIG9jZnMyX2ZyZWVfd3JpdGVfY3R4dChzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MpCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCB3Yy0+d19udW1fcGFnZXM7IGkrKykgeworCQlpZiAod2MtPndfcGFnZXNbaV0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXVubG9ja19wYWdlKHdjLT53X3BhZ2VzW2ldKTsKKwkJbWFya19wYWdlX2FjY2Vzc2VkKHdjLT53X3BhZ2VzW2ldKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHdjLT53X3BhZ2VzW2ldKTsKKwl9CisKKwlicmVsc2Uod2MtPndfZGlfYmgpOworCWtmcmVlKHdjKTsKK30KKworc3RhdGljIGludCBvY2ZzMl9hbGxvY193cml0ZV9jdHh0KHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICoqd2NwLAorCQkJCSAgc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsIGxvZmZfdCBwb3MsCisJCQkJICB1bnNpZ25lZCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgpCit7CisJc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjOworCisJd2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCksIEdGUF9OT0ZTKTsKKwlpZiAoIXdjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdjLT53X2Nwb3MgPSBwb3MgPj4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHM7CisJd2MtPndfY2xlbiA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLCBsZW4pOworCWdldF9iaChkaV9iaCk7CisJd2MtPndfZGlfYmggPSBkaV9iaDsKKworCWlmICh1bmxpa2VseShQQUdFX0NBQ0hFX1NISUZUID4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMpKQorCQl3Yy0+d19sYXJnZV9wYWdlcyA9IDE7CisJZWxzZQorCQl3Yy0+d19sYXJnZV9wYWdlcyA9IDA7CisKKwlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmd2MtPndfZGVhbGxvYyk7CisKKwkqd2NwID0gd2M7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIE1hcCwgZmlsbCBhbmQgd3JpdGUgYSBwYWdlIHRvIGRpc2suCi0gKgotICogVGhlIHdvcmsgb2YgY29weWluZyBkYXRhIGlzIGRvbmUgdmlhIGNhbGxiYWNrLiAgTmV3bHkgYWxsb2NhdGVkCi0gKiBwYWdlcyB3aGljaCBkb24ndCB0YWtlIHVzZXIgZGF0YSB3aWxsIGJlIHplcm8nZCAoc2V0ICduZXcnIHRvCi0gKiBpbmRpY2F0ZSBhbiBhbGxvY2F0aW5nIHdyaXRlKQotICoKLSAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8KLSAqIHRoZSBwYWdlLgorICogSWYgYSBwYWdlIGhhcyBhbnkgbmV3IGJ1ZmZlcnMsIHplcm8gdGhlbSBvdXQgaGVyZSwgYW5kIG1hcmsgdGhlbSB1cHRvZGF0ZQorICogYW5kIGRpcnR5IHNvIHRoZXknbGwgYmUgd3JpdHRlbiBvdXQgKGluIG9yZGVyIHRvIHByZXZlbnQgdW5pbml0aWFsaXNlZAorICogYmxvY2sgZGF0YSBmcm9tIGxlYWtpbmcpLiBBbmQgY2xlYXIgdGhlIG5ldyBiaXQuCiAgKi8KLXN0YXRpYyBpbnQgb2NmczJfd3JpdGVfZGF0YV9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGhhbmRsZV90ICpoYW5kbGUsCi0JCQkJIHU2NCAqcF9ibGtubywgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJIHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywgaW50IG5ldykKK3N0YXRpYyB2b2lkIG9jZnMyX3plcm9fbmV3X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQogewotCWludCByZXQsIGNvcGllZCA9IDA7Ci0JdW5zaWduZWQgaW50IGZyb20gPSAwLCB0byA9IDA7Ci0JdW5zaWduZWQgaW50IGNsdXN0ZXJfc3RhcnQsIGNsdXN0ZXJfZW5kOwotCXVuc2lnbmVkIGludCB6ZXJvX2Zyb20gPSAwLCB6ZXJvX3RvID0gMDsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaDsKIAotCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCB3Yy0+d19jcG9zLAorCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQlyZXR1cm47CisKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmxvY2tfc3RhcnQgPSAwOworCWRvIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBiaC0+Yl9zaXplOworCisJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJaWYgKGJsb2NrX2VuZCA+IGZyb20gJiYgYmxvY2tfc3RhcnQgPCB0bykgeworCQkJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQkJCXVuc2lnbmVkIHN0YXJ0LCBlbmQ7CisKKwkJCQkJc3RhcnQgPSBtYXgoZnJvbSwgYmxvY2tfc3RhcnQpOworCQkJCQllbmQgPSBtaW4odG8sIGJsb2NrX2VuZCk7CisKKwkJCQkJemVyb191c2VyX3BhZ2UocGFnZSwgc3RhcnQsIGVuZCAtIHN0YXJ0LCBLTV9VU0VSMCk7CisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJCX0KKworCQkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCX0KKwkJfQorCisJCWJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKK30KKworLyoKKyAqIE9ubHkgY2FsbGVkIHdoZW4gd2UgaGF2ZSBhIGZhaWx1cmUgZHVyaW5nIGFsbG9jYXRpbmcgd3JpdGUgdG8gd3JpdGUKKyAqIHplcm8ncyB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHJlZ2lvbi4KKyAqLworc3RhdGljIHZvaWQgb2NmczJfd3JpdGVfZmFpbHVyZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQlsb2ZmX3QgdXNlcl9wb3MsIHVuc2lnbmVkIHVzZXJfbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIGZyb20sIHRvOworCXN0cnVjdCBwYWdlICp0bXBwYWdlOworCisJb2NmczJfemVyb19uZXdfYnVmZmVycyh3Yy0+d190YXJnZXRfcGFnZSwgdXNlcl9wb3MsIHVzZXJfbGVuKTsKKworCWlmICh3Yy0+d19sYXJnZV9wYWdlcykgeworCQlmcm9tID0gd2MtPndfdGFyZ2V0X2Zyb207CisJCXRvID0gd2MtPndfdGFyZ2V0X3RvOworCX0gZWxzZSB7CisJCWZyb20gPSAwOworCQl0byA9IFBBR0VfQ0FDSEVfU0laRTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCB3Yy0+d19udW1fcGFnZXM7IGkrKykgeworCQl0bXBwYWdlID0gd2MtPndfcGFnZXNbaV07CisKKwkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKKwkJCXdhbGtfcGFnZV9idWZmZXJzKHdjLT53X2hhbmRsZSwgcGFnZV9idWZmZXJzKHRtcHBhZ2UpLAorCQkJCQkgIGZyb20sIHRvLCBOVUxMLAorCQkJCQkgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7CisKKwkJYmxvY2tfY29tbWl0X3dyaXRlKHRtcHBhZ2UsIGZyb20sIHRvKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfcHJlcGFyZV9wYWdlX2Zvcl93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1NjQgKnBfYmxrbm8sCisJCQkJCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKKwkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBjcG9zLAorCQkJCQlsb2ZmX3QgdXNlcl9wb3MsIHVuc2lnbmVkIHVzZXJfbGVuLAorCQkJCQlpbnQgbmV3KQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IG1hcF9mcm9tID0gMCwgbWFwX3RvID0gMDsKKwl1bnNpZ25lZCBpbnQgY2x1c3Rlcl9zdGFydCwgY2x1c3Rlcl9lbmQ7CisJdW5zaWduZWQgaW50IHVzZXJfZGF0YV9mcm9tID0gMCwgdXNlcl9kYXRhX3RvID0gMDsKKworCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMoT0NGUzJfU0IoaW5vZGUtPmlfc2IpLCBjcG9zLAogCQkJCQkmY2x1c3Rlcl9zdGFydCwgJmNsdXN0ZXJfZW5kKTsKIAotCWlmICgod2MtPndfcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQpID09IHBhZ2UtPmluZGV4Ci0JICAgICYmICF3Yy0+d19maW5pc2hlZF9jb3B5KSB7CisJaWYgKHBhZ2UgPT0gd2MtPndfdGFyZ2V0X3BhZ2UpIHsKKwkJbWFwX2Zyb20gPSB1c2VyX3BvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJbWFwX3RvID0gbWFwX2Zyb20gKyB1c2VyX2xlbjsKIAotCQl3Yy0+d190aGlzX3BhZ2UgPSBwYWdlOwotCQl3Yy0+d190aGlzX3BhZ2VfbmV3ID0gbmV3OwotCQlyZXQgPSB3Yy0+d193cml0ZV9kYXRhX3BhZ2UoaW5vZGUsIHdjLCBwX2Jsa25vLCAmZnJvbSwgJnRvKTsKLQkJaWYgKHJldCA8IDApIHsKKwkJaWYgKG5ldykKKwkJCXJldCA9IG9jZnMyX21hcF9wYWdlX2Jsb2NrcyhwYWdlLCBwX2Jsa25vLCBpbm9kZSwKKwkJCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwKKwkJCQkJCSAgICBuZXcpOworCQllbHNlCisJCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3MocGFnZSwgcF9ibGtubywgaW5vZGUsCisJCQkJCQkgICAgbWFwX2Zyb20sIG1hcF90bywgbmV3KTsKKwkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQljb3BpZWQgPSByZXQ7Ci0KLQkJemVyb19mcm9tID0gZnJvbTsKLQkJemVyb190byA9IHRvOworCQl1c2VyX2RhdGFfZnJvbSA9IG1hcF9mcm9tOworCQl1c2VyX2RhdGFfdG8gPSBtYXBfdG87CiAJCWlmIChuZXcpIHsKLQkJCWZyb20gPSBjbHVzdGVyX3N0YXJ0OwotCQkJdG8gPSBjbHVzdGVyX2VuZDsKKwkJCW1hcF9mcm9tID0gY2x1c3Rlcl9zdGFydDsKKwkJCW1hcF90byA9IGNsdXN0ZXJfZW5kOwogCQl9CisKKwkJd2MtPndfdGFyZ2V0X2Zyb20gPSBtYXBfZnJvbTsKKwkJd2MtPndfdGFyZ2V0X3RvID0gbWFwX3RvOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIElmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkIHRoZSBuZXcgcGFnZSB5ZXQsIHdlCkBAIC05ODAsMTEgKzEwMDAsMTEgQEAKIAkJICovCiAJCUJVR19PTighbmV3KTsKIAotCQlmcm9tID0gY2x1c3Rlcl9zdGFydDsKLQkJdG8gPSBjbHVzdGVyX2VuZDsKKwkJbWFwX2Zyb20gPSBjbHVzdGVyX3N0YXJ0OworCQltYXBfdG8gPSBjbHVzdGVyX2VuZDsKIAogCQlyZXQgPSBvY2ZzMl9tYXBfcGFnZV9ibG9ja3MocGFnZSwgcF9ibGtubywgaW5vZGUsCi0JCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwgMSk7CisJCQkJCSAgICBjbHVzdGVyX3N0YXJ0LCBjbHVzdGVyX2VuZCwgbmV3KTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwogCQkJZ290byBvdXQ7CkBAIC0xMDAzLDEwOCArMTAyMywxMTMgQEAKIAkgKi8KIAlpZiAobmV3ICYmICFQYWdlVXB0b2RhdGUocGFnZSkpCiAJCW9jZnMyX2NsZWFyX3BhZ2VfcmVnaW9ucyhwYWdlLCBPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCi0JCQkJCSB3Yy0+d19jcG9zLCB6ZXJvX2Zyb20sIHplcm9fdG8pOworCQkJCQkgY3BvcywgdXNlcl9kYXRhX2Zyb20sIHVzZXJfZGF0YV90byk7CiAKIAlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAotCWlmIChvY2ZzMl9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKLQkJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLAotCQkJCQlwYWdlX2J1ZmZlcnMocGFnZSksCi0JCQkJCWZyb20sIHRvLCBOVUxMLAotCQkJCQlvY2ZzMl9qb3VybmFsX2RpcnR5X2RhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQl9Ci0KLQkvKgotCSAqIFdlIGRvbid0IHVzZSBnZW5lcmljX2NvbW1pdF93cml0ZSgpIGJlY2F1c2Ugd2UgbmVlZCB0bwotCSAqIGhhbmRsZSBvdXIgb3duIGlfc2l6ZSB1cGRhdGUuCi0JICovCi0JcmV0ID0gYmxvY2tfY29tbWl0X3dyaXRlKHBhZ2UsIGZyb20sIHRvKTsKLQlpZiAocmV0KQotCQltbG9nX2Vycm5vKHJldCk7CiBvdXQ6Ci0KLQlyZXR1cm4gY29waWVkID8gY29waWVkIDogcmV0OworCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBEbyB0aGUgYWN0dWFsIHdyaXRlIG9mIHNvbWUgZGF0YSBpbnRvIGFuIGlub2RlLiBPcHRpb25hbGx5IGFsbG9jYXRlCi0gKiBpbiBvcmRlciB0byBmdWxmaWxsIHRoZSB3cml0ZS4KLSAqCi0gKiBjcG9zIGlzIHRoZSBsb2dpY2FsIGNsdXN0ZXIgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSB0byB3cml0ZSBhdAotICoKLSAqICdwaHlzJyBpcyB0aGUgcGh5c2ljYWwgbWFwcGluZyBvZiB0aGF0IG9mZnNldC4gYSAncGh5cycgdmFsdWUgb2YKLSAqIHplcm8gaW5kaWNhdGVzIHRoYXQgYWxsb2NhdGlvbiBpcyByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCBkYXRhX2FjCi0gKiBhbmQgbWV0YV9hYyBzaG91bGQgYmUgdmFsaWQgKG1ldGFfYWMgY2FuIGJlIG51bGwgaWYgbWV0YWRhdGEKLSAqIGFsbG9jYXRpb24gaXNuJ3QgcmVxdWlyZWQpLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgZ3JhYiBvbmUgY2x1c3RlcnMgd29ydGggb2YgcGFnZXMuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IG9jZnMyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCB1MzIgcGh5cywgaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCi0JCQkgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKLQkJCSAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAotCQkJICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjKQorc3RhdGljIGludCBvY2ZzMl9ncmFiX3BhZ2VzX2Zvcl93cml0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgICAgICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJICAgICAgdTMyIGNwb3MsIGxvZmZfdCB1c2VyX3BvcywgaW50IG5ldywKKwkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqbW1hcF9wYWdlKQogewotCWludCByZXQsIGksIG51bXBhZ2VzID0gMSwgbmV3OwotCXVuc2lnbmVkIGludCBjb3BpZWQgPSAwOwotCXUzMiB0bXBfcG9zOwotCXU2NCB2X2Jsa25vLCBwX2Jsa25vOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCWludCByZXQgPSAwLCBpOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHRhcmdldF9pbmRleCwgaW5kZXg7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCwgc3RhcnQ7Ci0Jc3RydWN0IHBhZ2UgKipjcGFnZXM7CiAKLQluZXcgPSBwaHlzID09IDAgPyAxIDogMDsKKwl0YXJnZXRfaW5kZXggPSB1c2VyX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCiAJLyoKIAkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGJlIG1hbmlwdWxhdGluZyBoZXJlLiBGb3IKIAkgKiBub24gYWxsb2NhdGluZyB3cml0ZSwgd2UganVzdCBjaGFuZ2UgdGhlIG9uZQogCSAqIHBhZ2UuIE90aGVyd2lzZSwgd2UnbGwgbmVlZCBhIHdob2xlIGNsdXN0ZXJzIHdvcnRoLgogCSAqLwotCWlmIChuZXcpCi0JCW51bXBhZ2VzID0gb2NmczJfcGFnZXNfcGVyX2NsdXN0ZXIoaW5vZGUtPmlfc2IpOwotCi0JY3BhZ2VzID0ga3phbGxvYyhzaXplb2YoKmNwYWdlcykgKiBudW1wYWdlcywgR0ZQX05PRlMpOwotCWlmICghY3BhZ2VzKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKgotCSAqIEZpbGwgb3VyIHBhZ2UgYXJyYXkgZmlyc3QuIFRoYXQgd2F5IHdlJ3ZlIGdyYWJiZWQgZW5vdWdoIHNvCi0JICogdGhhdCB3ZSBjYW4gemVybyBhbmQgZmx1c2ggaWYgd2UgZXJyb3IgYWZ0ZXIgYWRkaW5nIHRoZQotCSAqIGV4dGVudC4KLQkgKi8KIAlpZiAobmV3KSB7Ci0JCXN0YXJ0ID0gb2NmczJfYWxpZ25fY2x1c3RlcnNfdG9fcGFnZV9pbmRleChpbm9kZS0+aV9zYiwKLQkJCQkJCQkgICB3Yy0+d19jcG9zKTsKLQkJdl9ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgd2MtPndfY3Bvcyk7CisJCXdjLT53X251bV9wYWdlcyA9IG9jZnMyX3BhZ2VzX3Blcl9jbHVzdGVyKGlub2RlLT5pX3NiKTsKKwkJc3RhcnQgPSBvY2ZzMl9hbGlnbl9jbHVzdGVyc190b19wYWdlX2luZGV4KGlub2RlLT5pX3NiLCBjcG9zKTsKIAl9IGVsc2UgewotCQlzdGFydCA9IHdjLT53X3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQl2X2Jsa25vID0gd2MtPndfcG9zID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQl3Yy0+d19udW1fcGFnZXMgPSAxOworCQlzdGFydCA9IHRhcmdldF9pbmRleDsKIAl9CiAKLQlmb3IoaSA9IDA7IGkgPCBudW1wYWdlczsgaSsrKSB7CisJZm9yKGkgPSAwOyBpIDwgd2MtPndfbnVtX3BhZ2VzOyBpKyspIHsKIAkJaW5kZXggPSBzdGFydCArIGk7CiAKLQkJY3BhZ2VzW2ldID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBpbmRleCwgR0ZQX05PRlMpOwotCQlpZiAoIWNwYWdlc1tpXSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0OworCQlpZiAoaW5kZXggPT0gdGFyZ2V0X2luZGV4ICYmIG1tYXBfcGFnZSkgeworCQkJLyoKKwkJCSAqIG9jZnMyX3BhZ2Vta3dyaXRlKCkgaXMgYSBsaXR0bGUgZGlmZmVyZW50CisJCQkgKiBhbmQgd2FudHMgdXMgdG8gZGlyZWN0bHkgdXNlIHRoZSBwYWdlCisJCQkgKiBwYXNzZWQgaW4uCisJCQkgKi8KKwkJCWxvY2tfcGFnZShtbWFwX3BhZ2UpOworCisJCQlpZiAobW1hcF9wYWdlLT5tYXBwaW5nICE9IG1hcHBpbmcpIHsKKwkJCQl1bmxvY2tfcGFnZShtbWFwX3BhZ2UpOworCQkJCS8qCisJCQkJICogU2FuaXR5IGNoZWNrIC0gdGhlIGxvY2tpbmcgaW4KKwkJCQkgKiBvY2ZzMl9wYWdlbWt3cml0ZSgpIHNob3VsZCBlbnN1cmUKKwkJCQkgKiB0aGF0IHRoaXMgY29kZSBkb2Vzbid0IHRyaWdnZXIuCisJCQkJICovCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXBhZ2VfY2FjaGVfZ2V0KG1tYXBfcGFnZSk7CisJCQl3Yy0+d19wYWdlc1tpXSA9IG1tYXBfcGFnZTsKKwkJfSBlbHNlIHsKKwkJCXdjLT53X3BhZ2VzW2ldID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBpbmRleCwKKwkJCQkJCQkgICAgIEdGUF9OT0ZTKTsKKwkJCWlmICghd2MtPndfcGFnZXNbaV0pIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQorCisJCWlmIChpbmRleCA9PSB0YXJnZXRfaW5kZXgpCisJCQl3Yy0+d190YXJnZXRfcGFnZSA9IHdjLT53X3BhZ2VzW2ldOwogCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUHJlcGFyZSBhIHNpbmdsZSBjbHVzdGVyIGZvciB3cml0ZSBvbmUgY2x1c3RlciBpbnRvIHRoZSBmaWxlLgorICovCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX2NsdXN0ZXIoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgICAgdTMyIHBoeXMsIHVuc2lnbmVkIGludCB1bndyaXR0ZW4sCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCisJCQkgICAgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLCB1MzIgY3BvcywKKwkJCSAgICAgICBsb2ZmX3QgdXNlcl9wb3MsIHVuc2lnbmVkIHVzZXJfbGVuKQoreworCWludCByZXQsIGksIG5ldywgc2hvdWxkX3plcm8gPSAwOworCXU2NCB2X2Jsa25vLCBwX2Jsa25vOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCisJbmV3ID0gcGh5cyA9PSAwID8gMSA6IDA7CisJaWYgKG5ldyB8fCB1bndyaXR0ZW4pCisJCXNob3VsZF96ZXJvID0gMTsKIAogCWlmIChuZXcpIHsKKwkJdTMyIHRtcF9wb3M7CisKIAkJLyoKIAkJICogVGhpcyBpcyBzYWZlIHRvIGNhbGwgd2l0aCB0aGUgcGFnZSBsb2NrcyAtIGl0IHdvbid0IHRha2UKIAkJICogYW55IGFkZGl0aW9uYWwgc2VtYXBob3JlcyBvciBjbHVzdGVyIGxvY2tzLgogCQkgKi8KLQkJdG1wX3BvcyA9IHdjLT53X2Nwb3M7CisJCXRtcF9wb3MgPSBjcG9zOwogCQlyZXQgPSBvY2ZzMl9kb19leHRlbmRfYWxsb2NhdGlvbihPQ0ZTMl9TQihpbm9kZS0+aV9zYiksIGlub2RlLAotCQkJCQkJICZ0bXBfcG9zLCAxLCBkaV9iaCwgaGFuZGxlLAotCQkJCQkJIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOworCQkJCQkJICZ0bXBfcG9zLCAxLCAwLCB3Yy0+d19kaV9iaCwKKwkJCQkJCSB3Yy0+d19oYW5kbGUsIGRhdGFfYWMsCisJCQkJCQkgbWV0YV9hYywgTlVMTCk7CiAJCS8qCiAJCSAqIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHdlIG11c3QgaGF2ZSBhbHJlYWR5CiAJCSAqIGNhbGN1bGF0ZWQgdGhlIGNvcnJlY3QgbWV0YSBkYXRhIGFsbG9jYXRpb24gcmVxdWlyZWQuIFRoZQpAQCAtMTEyMSwxMDMgKzExNDYsMzQ0IEBACiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQorCX0gZWxzZSBpZiAodW53cml0dGVuKSB7CisJCXJldCA9IG9jZnMyX21hcmtfZXh0ZW50X3dyaXR0ZW4oaW5vZGUsIHdjLT53X2RpX2JoLAorCQkJCQkJd2MtPndfaGFuZGxlLCBjcG9zLCAxLCBwaHlzLAorCQkJCQkJbWV0YV9hYywgJndjLT53X2RlYWxsb2MpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKKwlpZiAoc2hvdWxkX3plcm8pCisJCXZfYmxrbm8gPSBvY2ZzMl9jbHVzdGVyc190b19ibG9ja3MoaW5vZGUtPmlfc2IsIGNwb3MpOworCWVsc2UKKwkJdl9ibGtubyA9IHVzZXJfcG9zID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJLyoKKwkgKiBUaGUgb25seSByZWFzb24gdGhpcyBzaG91bGQgZmFpbCBpcyBkdWUgdG8gYW4gaW5hYmlsaXR5IHRvCisJICogZmluZCB0aGUgZXh0ZW50IGFkZGVkLgorCSAqLwogCXJldCA9IG9jZnMyX2V4dGVudF9tYXBfZ2V0X2Jsb2Nrcyhpbm9kZSwgdl9ibGtubywgJnBfYmxrbm8sIE5VTEwsCiAJCQkJCSAgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKLQotCQkvKgotCQkgKiBYWFg6IFNob3VsZCB3ZSBnbyByZWFkb25seSBoZXJlPwotCQkgKi8KLQotCQltbG9nX2Vycm5vKHJldCk7CisJCW9jZnMyX2Vycm9yKGlub2RlLT5pX3NiLCAiQ29ycnVwdGluZyBleHRlbmQgZm9yIGlub2RlICVsbHUsICIKKwkJCSAgICAiYXQgbG9naWNhbCBibG9jayAlbGx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXZfYmxrbm8pOwogCQlnb3RvIG91dDsKIAl9CiAKIAlCVUdfT04ocF9ibGtubyA9PSAwKTsKIAotCWZvcihpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyspIHsKLQkJcmV0ID0gb2NmczJfd3JpdGVfZGF0YV9wYWdlKGlub2RlLCBoYW5kbGUsICZwX2Jsa25vLCBjcGFnZXNbaV0sCi0JCQkJCSAgICB3YywgbmV3KTsKLQkJaWYgKHJldCA8IDApIHsKKwlmb3IoaSA9IDA7IGkgPCB3Yy0+d19udW1fcGFnZXM7IGkrKykgeworCQlpbnQgdG1wcmV0OworCisJCXRtcHJldCA9IG9jZnMyX3ByZXBhcmVfcGFnZV9mb3Jfd3JpdGUoaW5vZGUsICZwX2Jsa25vLCB3YywKKwkJCQkJCSAgICAgIHdjLT53X3BhZ2VzW2ldLCBjcG9zLAorCQkJCQkJICAgICAgdXNlcl9wb3MsIHVzZXJfbGVuLAorCQkJCQkJICAgICAgc2hvdWxkX3plcm8pOworCQlpZiAodG1wcmV0KSB7CisJCQltbG9nX2Vycm5vKHRtcHJldCk7CisJCQlpZiAocmV0ID09IDApCisJCQkJdG1wcmV0ID0gcmV0OworCQl9CisJfQorCisJLyoKKwkgKiBXZSBvbmx5IGhhdmUgY2xlYW51cCB0byBkbyBpbiBjYXNlIG9mIGFsbG9jYXRpbmcgd3JpdGUuCisJICovCisJaWYgKHJldCAmJiBuZXcpCisJCW9jZnMyX3dyaXRlX2ZhaWx1cmUoaW5vZGUsIHdjLCB1c2VyX3BvcywgdXNlcl9sZW4pOworCitvdXQ6CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3dyaXRlX2NsdXN0ZXJfYnlfZGVzYyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCisJCQkJICAgICAgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICptZXRhX2FjLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCisJCQkJICAgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbikKK3sKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgd2MtPndfY2xlbjsgaSsrKSB7CisJCWRlc2MgPSAmd2MtPndfZGVzY1tpXTsKKworCQlyZXQgPSBvY2ZzMl93cml0ZV9jbHVzdGVyKG1hcHBpbmcsIGRlc2MtPmNfcGh5cywKKwkJCQkJICBkZXNjLT5jX3Vud3JpdHRlbiwgZGF0YV9hYywgbWV0YV9hYywKKwkJCQkJICB3YywgZGVzYy0+Y19jcG9zLCBwb3MsIGxlbik7CisJCWlmIChyZXQpIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0KLQkJY29waWVkICs9IHJldDsKIAl9CiAKKwlyZXQgPSAwOwogb3V0OgotCWZvcihpID0gMDsgaSA8IG51bXBhZ2VzOyBpKyspIHsKLQkJdW5sb2NrX3BhZ2UoY3BhZ2VzW2ldKTsKLQkJbWFya19wYWdlX2FjY2Vzc2VkKGNwYWdlc1tpXSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShjcGFnZXNbaV0pOwotCX0KLQlrZnJlZShjcGFnZXMpOwotCi0JcmV0dXJuIGNvcGllZCA/IGNvcGllZCA6IHJldDsKLX0KLQotc3RhdGljIHZvaWQgb2NmczJfd3JpdGVfY3R4dF9pbml0KHN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YywKLQkJCQkgIHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiLCBsb2ZmX3QgcG9zLAotCQkJCSAgc2l6ZV90IGNvdW50LCBvY2ZzMl9wYWdlX3dyaXRlciAqY2IsCi0JCQkJICB2b2lkICpjYl9wcml2KQotewotCXdjLT53X2NvdW50ID0gY291bnQ7Ci0Jd2MtPndfcG9zID0gcG9zOwotCXdjLT53X2Nwb3MgPSB3Yy0+d19wb3MgPj4gb3NiLT5zX2NsdXN0ZXJzaXplX2JpdHM7Ci0Jd2MtPndfZmluaXNoZWRfY29weSA9IDA7Ci0KLQlpZiAodW5saWtlbHkoUEFHRV9DQUNIRV9TSElGVCA+IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKSkKLQkJd2MtPndfbGFyZ2VfcGFnZXMgPSAxOwotCWVsc2UKLQkJd2MtPndfbGFyZ2VfcGFnZXMgPSAwOwotCi0Jd2MtPndfd3JpdGVfZGF0YV9wYWdlID0gY2I7Ci0Jd2MtPndfcHJpdmF0ZSA9IGNiX3ByaXY7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIFdyaXRlIGEgY2x1c3RlciB0byBhbiBpbm9kZS4gVGhlIGNsdXN0ZXIgbWF5IG5vdCBiZSBhbGxvY2F0ZWQgeWV0LAotICogaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlLiBUaGlzIG9ubHkgZXhpc3RzIGZvciBidWZmZXJlZCB3cml0ZXMgLQotICogT19ESVJFQ1QgdGFrZXMgYSBtb3JlICJ0cmFkaXRpb25hbCIgcGF0aCB0aHJvdWdoIHRoZSBrZXJuZWwuCi0gKgotICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaW5jcmVtZW50aW5nIHBvcywgd3JpdHRlbiBjb3VudHMsIGV0YwotICoKLSAqIEZvciBmaWxlIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHNwYXJzZSBmaWxlcywgcHJlLWFsbG9jYXRpb24KLSAqIGFuZCBwYWdlIHplcm9pbmcgdXAgdW50aWwgY3BvcyBzaG91bGQgYmUgZG9uZSBwcmlvciB0byB0aGlzCi0gKiBmdW5jdGlvbiBjYWxsLgotICoKLSAqIENhbGxlcnMgc2hvdWxkIGJlIGhvbGRpbmcgaV9zZW0sIGFuZCB0aGUgcncgY2x1c3RlciBsb2NrLgotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiB1c2VyIGJ5dGVzIHdyaXR0ZW4sIG9yIGxlc3MgdGhhbiB6ZXJvIGZvcgotICogZXJyb3IuCisgKiBvY2ZzMl93cml0ZV9lbmQoKSB3YW50cyB0byBrbm93IHdoaWNoIHBhcnRzIG9mIHRoZSB0YXJnZXQgcGFnZSBpdAorICogc2hvdWxkIGNvbXBsZXRlIHRoZSB3cml0ZSBvbi4gSXQncyBlYXNpZXN0IHRvIGNvbXB1dGUgdGhlbSBhaGVhZCBvZgorICogdGltZSB3aGVuIGEgbW9yZSBjb21wbGV0ZSB2aWV3IG9mIHRoZSB3cml0ZSBpcyBhdmFpbGFibGUuCiAgKi8KLXNzaXplX3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHBvcywKLQkJCQkgICAgIHNpemVfdCBjb3VudCwgb2NmczJfcGFnZV93cml0ZXIgKmFjdG9yLAotCQkJCSAgICAgdm9pZCAqcHJpdikKK3N0YXRpYyB2b2lkIG9jZnMyX3NldF90YXJnZXRfYm91bmRhcmllcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJCQkJc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCQlsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIGludCBhbGxvYykKK3sKKwlzdHJ1Y3Qgb2NmczJfd3JpdGVfY2x1c3Rlcl9kZXNjICpkZXNjOworCisJd2MtPndfdGFyZ2V0X2Zyb20gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJd2MtPndfdGFyZ2V0X3RvID0gd2MtPndfdGFyZ2V0X2Zyb20gKyBsZW47CisKKwlpZiAoYWxsb2MgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBBbGxvY2F0aW5nIHdyaXRlIC0gd2UgbWF5IGhhdmUgZGlmZmVyZW50IGJvdW5kYXJpZXMgYmFzZWQKKwkgKiBvbiBwYWdlIHNpemUgYW5kIGNsdXN0ZXIgc2l6ZS4KKwkgKgorCSAqIE5PVEU6IFdlIGNhbiBubyBsb25nZXIgY29tcHV0ZSBvbmUgdmFsdWUgZnJvbSB0aGUgb3RoZXIgYXMKKwkgKiB0aGUgYWN0dWFsIHdyaXRlIGxlbmd0aCBhbmQgdXNlciBwcm92aWRlZCBsZW5ndGggbWF5IGJlCisJICogZGlmZmVyZW50LgorCSAqLworCisJaWYgKHdjLT53X2xhcmdlX3BhZ2VzKSB7CisJCS8qCisJCSAqIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgMXN0IGFuZCBsYXN0IGNsdXN0ZXIgd2l0aGluCisJCSAqIG91ciByYW5nZSBhbmQgd2hldGhlciB0aGV5IHNob3VsZCBiZSB6ZXJvJ2Qgb3Igbm90LiBFaXRoZXIKKwkJICogdmFsdWUgbWF5IGJlIGV4dGVuZGVkIG91dCB0byB0aGUgc3RhcnQvZW5kIG9mIGEKKwkJICogbmV3bHkgYWxsb2NhdGVkIGNsdXN0ZXIuCisJCSAqLworCQlkZXNjID0gJndjLT53X2Rlc2NbMF07CisJCWlmIChvY2ZzMl9zaG91bGRfemVyb19jbHVzdGVyKGRlc2MpKQorCQkJb2NmczJfZmlndXJlX2NsdXN0ZXJfYm91bmRhcmllcyhvc2IsCisJCQkJCQkJZGVzYy0+Y19jcG9zLAorCQkJCQkJCSZ3Yy0+d190YXJnZXRfZnJvbSwKKwkJCQkJCQlOVUxMKTsKKworCQlkZXNjID0gJndjLT53X2Rlc2Nbd2MtPndfY2xlbiAtIDFdOworCQlpZiAob2NmczJfc2hvdWxkX3plcm9fY2x1c3RlcihkZXNjKSkKKwkJCW9jZnMyX2ZpZ3VyZV9jbHVzdGVyX2JvdW5kYXJpZXMob3NiLAorCQkJCQkJCWRlc2MtPmNfY3BvcywKKwkJCQkJCQlOVUxMLAorCQkJCQkJCSZ3Yy0+d190YXJnZXRfdG8pOworCX0gZWxzZSB7CisJCXdjLT53X3RhcmdldF9mcm9tID0gMDsKKwkJd2MtPndfdGFyZ2V0X3RvID0gUEFHRV9DQUNIRV9TSVpFOworCX0KK30KKworLyoKKyAqIFBvcHVsYXRlIGVhY2ggc2luZ2xlLWNsdXN0ZXIgd3JpdGUgZGVzY3JpcHRvciBpbiB0aGUgd3JpdGUgY29udGV4dAorICogd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaS9vIHRvIGJlIGRvbmUuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIHRoYXQgd2lsbCBoYXZlIHRvIGJlIGFsbG9jYXRlZCwgYXMKKyAqIHdlbGwgYXMgYSB3b3JzdCBjYXNlIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgZXh0ZW50IHJlY29yZHMgdGhhdAorICogd291bGQgaGF2ZSB0byBiZSBjcmVhdGVkIGR1cmluZyBhIHdyaXRlIHRvIGFuIHVud3JpdHRlbiByZWdpb24uCisgKi8KK3N0YXRpYyBpbnQgb2NmczJfcG9wdWxhdGVfd3JpdGVfZGVzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpjbHVzdGVyc190b19hbGxvYywKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqZXh0ZW50c190b19zcGxpdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvY2ZzMl93cml0ZV9jbHVzdGVyX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyA9IDA7CisJdW5zaWduZWQgaW50IGV4dF9mbGFncyA9IDA7CisJdTMyIHBoeXMgPSAwOworCWludCBpOworCisJKmNsdXN0ZXJzX3RvX2FsbG9jID0gMDsKKwkqZXh0ZW50c190b19zcGxpdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgd2MtPndfY2xlbjsgaSsrKSB7CisJCWRlc2MgPSAmd2MtPndfZGVzY1tpXTsKKwkJZGVzYy0+Y19jcG9zID0gd2MtPndfY3BvcyArIGk7CisKKwkJaWYgKG51bV9jbHVzdGVycyA9PSAwKSB7CisJCQkvKgorCQkJICogTmVlZCB0byBsb29rIHVwIHRoZSBuZXh0IGV4dGVudCByZWNvcmQuCisJCQkgKi8KKwkJCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgZGVzYy0+Y19jcG9zLCAmcGh5cywKKwkJCQkJCSAmbnVtX2NsdXN0ZXJzLCAmZXh0X2ZsYWdzKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBBc3N1bWUgd29yc3QgY2FzZSAtIHRoYXQgd2UncmUgd3JpdGluZyBpbgorCQkJICogdGhlIG1pZGRsZSBvZiB0aGUgZXh0ZW50LgorCQkJICoKKwkJCSAqIFdlIGNhbiBhc3N1bWUgdGhhdCB0aGUgd3JpdGUgcHJvY2VlZHMgZnJvbQorCQkJICogbGVmdCB0byByaWdodCwgaW4gd2hpY2ggY2FzZSB0aGUgZXh0ZW50CisJCQkgKiBpbnNlcnQgY29kZSBpcyBzbWFydCBlbm91Z2ggdG8gY29hbGVzY2UgdGhlCisJCQkgKiBuZXh0IHNwbGl0cyBpbnRvIHRoZSBwcmV2aW91cyByZWNvcmRzIGNyZWF0ZWQuCisJCQkgKi8KKwkJCWlmIChleHRfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKQorCQkJCSpleHRlbnRzX3RvX3NwbGl0ID0gKmV4dGVudHNfdG9fc3BsaXQgKyAyOworCQl9IGVsc2UgaWYgKHBoeXMpIHsKKwkJCS8qCisJCQkgKiBPbmx5IGluY3JlbWVudCBwaHlzIGlmIGl0IGRvZXNuJ3QgZGVzY3JpYmUKKwkJCSAqIGEgaG9sZS4KKwkJCSAqLworCQkJcGh5cysrOworCQl9CisKKwkJZGVzYy0+Y19waHlzID0gcGh5czsKKwkJaWYgKHBoeXMgPT0gMCkgeworCQkJZGVzYy0+Y19uZXcgPSAxOworCQkJKmNsdXN0ZXJzX3RvX2FsbG9jID0gKmNsdXN0ZXJzX3RvX2FsbG9jICsgMTsKKwkJfQorCQlpZiAoZXh0X2ZsYWdzICYgT0NGUzJfRVhUX1VOV1JJVFRFTikKKwkJCWRlc2MtPmNfdW53cml0dGVuID0gMTsKKworCQludW1fY2x1c3RlcnMtLTsKKwl9CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCQkgICAgIHN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsIHN0cnVjdCBwYWdlICptbWFwX3BhZ2UpCiB7CiAJaW50IHJldCwgY3JlZGl0cyA9IE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTOwotCXNzaXplX3Qgd3JpdHRlbiA9IDA7Ci0JdTMyIHBoeXM7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBpbnQgY2x1c3RlcnNfdG9fYWxsb2MsIGV4dGVudHNfdG9fc3BsaXQ7CisJc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOwogCXN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICpkYXRhX2FjID0gTlVMTDsKIAlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CiAJaGFuZGxlX3QgKmhhbmRsZTsKLQlzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCB3YzsKIAotCW9jZnMyX3dyaXRlX2N0eHRfaW5pdCgmd2MsIG9zYiwgcG9zLCBjb3VudCwgYWN0b3IsIHByaXYpOworCXJldCA9IG9jZnMyX2FsbG9jX3dyaXRlX2N0eHQoJndjLCBvc2IsIHBvcywgbGVuLCBkaV9iaCk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQogCi0JcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCXJldCA9IG9jZnMyX3BvcHVsYXRlX3dyaXRlX2Rlc2MoaW5vZGUsIHdjLCAmY2x1c3RlcnNfdG9fYWxsb2MsCisJCQkJCSZleHRlbnRzX3RvX3NwbGl0KTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBvdXQ7CiAJfQotCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKilkaV9iaC0+Yl9kYXRhOworCisJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKXdjLT53X2RpX2JoLT5iX2RhdGE7CisKKwkvKgorCSAqIFdlIHNldCB3X3RhcmdldF9mcm9tLCB3X3RhcmdldF90byBoZXJlIHNvIHRoYXQKKwkgKiBvY2ZzMl93cml0ZV9lbmQoKSBrbm93cyB3aGljaCByYW5nZSBpbiB0aGUgdGFyZ2V0IHBhZ2UgdG8KKwkgKiB3cml0ZSBvdXQuIEFuIGFsbG9jYXRpb24gcmVxdWlyZXMgdGhhdCB3ZSB3cml0ZSB0aGUgZW50aXJlCisJICogY2x1c3RlciByYW5nZS4KKwkgKi8KKwlpZiAoY2x1c3RlcnNfdG9fYWxsb2MgfHwgZXh0ZW50c190b19zcGxpdCkgeworCQkvKgorCQkgKiBYWFg6IFdlIGFyZSBzdHJldGNoaW5nIHRoZSBsaW1pdHMgb2YKKwkJICogb2NmczJfbG9ja19hbGxvY2F0b3JzKCkuIEl0IGdyZWF0bHkgb3Zlci1lc3RpbWF0ZXMKKwkJICogdGhlIHdvcmsgdG8gYmUgZG9uZS4KKwkJICovCisJCXJldCA9IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhpbm9kZSwgZGksIGNsdXN0ZXJzX3RvX2FsbG9jLAorCQkJCQkgICAgZXh0ZW50c190b19zcGxpdCwgJmRhdGFfYWMsICZtZXRhX2FjKTsKKwkJaWYgKHJldCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQljcmVkaXRzID0gb2NmczJfY2FsY19leHRlbmRfY3JlZGl0cyhpbm9kZS0+aV9zYiwgZGksCisJCQkJCQkgICAgY2x1c3RlcnNfdG9fYWxsb2MpOworCisJfQorCisJb2NmczJfc2V0X3RhcmdldF9ib3VuZGFyaWVzKG9zYiwgd2MsIHBvcywgbGVuLAorCQkJCSAgICBjbHVzdGVyc190b19hbGxvYyArIGV4dGVudHNfdG9fc3BsaXQpOworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBjcmVkaXRzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXdjLT53X2hhbmRsZSA9IGhhbmRsZTsKKworCS8qCisJICogV2UgZG9uJ3Qgd2FudCB0aGlzIHRvIGZhaWwgaW4gb2NmczJfd3JpdGVfZW5kKCksIHNvIGRvIGl0CisJICogaGVyZS4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCB3Yy0+d19kaV9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwkvKgorCSAqIEZpbGwgb3VyIHBhZ2UgYXJyYXkgZmlyc3QuIFRoYXQgd2F5IHdlJ3ZlIGdyYWJiZWQgZW5vdWdoIHNvCisJICogdGhhdCB3ZSBjYW4gemVybyBhbmQgZmx1c2ggaWYgd2UgZXJyb3IgYWZ0ZXIgYWRkaW5nIHRoZQorCSAqIGV4dGVudC4KKwkgKi8KKwlyZXQgPSBvY2ZzMl9ncmFiX3BhZ2VzX2Zvcl93cml0ZShtYXBwaW5nLCB3Yywgd2MtPndfY3BvcywgcG9zLAorCQkJCQkgY2x1c3RlcnNfdG9fYWxsb2MgKyBleHRlbnRzX3RvX3NwbGl0LAorCQkJCQkgbW1hcF9wYWdlKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfY29tbWl0OworCX0KKworCXJldCA9IG9jZnMyX3dyaXRlX2NsdXN0ZXJfYnlfZGVzYyhtYXBwaW5nLCBkYXRhX2FjLCBtZXRhX2FjLCB3YywgcG9zLAorCQkJCQkgIGxlbik7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X2NvbW1pdDsKKwl9CisKKwlpZiAoZGF0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwkqcGFnZXAgPSB3Yy0+d190YXJnZXRfcGFnZTsKKwkqZnNkYXRhID0gd2M7CisJcmV0dXJuIDA7CitvdXRfY29tbWl0OgorCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKK291dDoKKwlvY2ZzMl9mcmVlX3dyaXRlX2N0eHQod2MpOworCisJaWYgKGRhdGFfYWMpCisJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKKwlpZiAobWV0YV9hYykKKwkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KG1ldGFfYWMpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBvY2ZzMl93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKworCXJldCA9IG9jZnMyX21ldGFfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKgogCSAqIFRha2UgYWxsb2Mgc2VtIGhlcmUgdG8gcHJldmVudCBjb25jdXJyZW50IGxvb2t1cHMuIFRoYXQgd2F5CkBAIC0xMjI4LDUyICsxNDk0LDg1IEBACiAJICovCiAJZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CiAKLQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnMoaW5vZGUsIHdjLndfY3BvcywgJnBoeXMsIE5VTEwsIE5VTEwpOwotCWlmIChyZXQpIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9tZXRhOwotCX0KLQotCS8qIHBoeXMgPT0gMCBtZWFucyB0aGF0IGFsbG9jYXRpb24gaXMgcmVxdWlyZWQuICovCi0JaWYgKHBoeXMgPT0gMCkgewotCQlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCAxLCAmZGF0YV9hYywgJm1ldGFfYWMpOwotCQlpZiAocmV0KSB7Ci0JCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9tZXRhOwotCQl9Ci0KLQkJY3JlZGl0cyA9IG9jZnMyX2NhbGNfZXh0ZW5kX2NyZWRpdHMoaW5vZGUtPmlfc2IsIGRpLCAxKTsKLQl9Ci0KIAlyZXQgPSBvY2ZzMl9kYXRhX2xvY2soaW5vZGUsIDEpOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9tZXRhOworCQlnb3RvIG91dF9mYWlsOwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgY3JlZGl0cyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9kYXRhOwotCX0KLQotCXdyaXR0ZW4gPSBvY2ZzMl93cml0ZShmaWxlLCBwaHlzLCBoYW5kbGUsIGRpX2JoLCBkYXRhX2FjLAotCQkJICAgICAgbWV0YV9hYywgJndjKTsKLQlpZiAod3JpdHRlbiA8IDApIHsKLQkJcmV0ID0gd3JpdHRlbjsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9jb21taXQ7Ci0JfQotCi0JcmV0ID0gb2NmczJfam91cm5hbF9hY2Nlc3MoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCi0JCQkJICAgT0NGUzJfSk9VUk5BTF9BQ0NFU1NfV1JJVEUpOworCXJldCA9IG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jayhtYXBwaW5nLCBwb3MsIGxlbiwgZmxhZ3MsIHBhZ2VwLAorCQkJCSAgICAgICBmc2RhdGEsIGRpX2JoLCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfY29tbWl0OworCQlnb3RvIG91dF9mYWlsX2RhdGE7CiAJfQogCi0JcG9zICs9IHdyaXR0ZW47CisJYnJlbHNlKGRpX2JoKTsKKworCXJldHVybiAwOworCitvdXRfZmFpbF9kYXRhOgorCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAxKTsKK291dF9mYWlsOgorCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCWJyZWxzZShkaV9iaCk7CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG9jZnMyX3dyaXRlX2VuZF9ub2xvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpCit7CisJaW50IGk7CisJdW5zaWduZWQgZnJvbSwgdG8sIHN0YXJ0ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0ICp3YyA9IGZzZGF0YTsKKwlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSA9IChzdHJ1Y3Qgb2NmczJfZGlub2RlICopd2MtPndfZGlfYmgtPmJfZGF0YTsKKwloYW5kbGVfdCAqaGFuZGxlID0gd2MtPndfaGFuZGxlOworCXN0cnVjdCBwYWdlICp0bXBwYWdlOworCisJaWYgKHVubGlrZWx5KGNvcGllZCA8IGxlbikpIHsKKwkJaWYgKCFQYWdlVXB0b2RhdGUod2MtPndfdGFyZ2V0X3BhZ2UpKQorCQkJY29waWVkID0gMDsKKworCQlvY2ZzMl96ZXJvX25ld19idWZmZXJzKHdjLT53X3RhcmdldF9wYWdlLCBzdGFydCtjb3BpZWQsCisJCQkJICAgICAgIHN0YXJ0K2xlbik7CisJfQorCWZsdXNoX2RjYWNoZV9wYWdlKHdjLT53X3RhcmdldF9wYWdlKTsKKworCWZvcihpID0gMDsgaSA8IHdjLT53X251bV9wYWdlczsgaSsrKSB7CisJCXRtcHBhZ2UgPSB3Yy0+d19wYWdlc1tpXTsKKworCQlpZiAodG1wcGFnZSA9PSB3Yy0+d190YXJnZXRfcGFnZSkgeworCQkJZnJvbSA9IHdjLT53X3RhcmdldF9mcm9tOworCQkJdG8gPSB3Yy0+d190YXJnZXRfdG87CisKKwkJCUJVR19PTihmcm9tID4gUEFHRV9DQUNIRV9TSVpFIHx8CisJCQkgICAgICAgdG8gPiBQQUdFX0NBQ0hFX1NJWkUgfHwKKwkJCSAgICAgICB0byA8IGZyb20pOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFBhZ2VzIGFkamFjZW50IHRvIHRoZSB0YXJnZXQgKGlmIGFueSkgaW1wbHkKKwkJCSAqIGEgaG9sZS1maWxsaW5nIHdyaXRlIGluIHdoaWNoIGNhc2Ugd2Ugd2FudAorCQkJICogdG8gZmx1c2ggdGhlaXIgZW50aXJlIHJhbmdlLgorCQkJICovCisJCQlmcm9tID0gMDsKKwkJCXRvID0gUEFHRV9DQUNIRV9TSVpFOworCQl9CisKKwkJaWYgKG9jZnMyX3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkKKwkJCXdhbGtfcGFnZV9idWZmZXJzKHdjLT53X2hhbmRsZSwgcGFnZV9idWZmZXJzKHRtcHBhZ2UpLAorCQkJCQkgIGZyb20sIHRvLCBOVUxMLAorCQkJCQkgIG9jZnMyX2pvdXJuYWxfZGlydHlfZGF0YSk7CisKKwkJYmxvY2tfY29tbWl0X3dyaXRlKHRtcHBhZ2UsIGZyb20sIHRvKTsKKwl9CisKKwlwb3MgKz0gY29waWVkOwogCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CkBAIC0xMjgzLDI5ICsxNTgyLDMxIEBACiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlkaS0+aV9tdGltZSA9IGRpLT5pX2N0aW1lID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKIAlkaS0+aV9tdGltZV9uc2VjID0gZGktPmlfY3RpbWVfbnNlYyA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X25zZWMpOworCW9jZnMyX2pvdXJuYWxfZGlydHkoaGFuZGxlLCB3Yy0+d19kaV9iaCk7CiAKLQlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKLQotb3V0X2NvbW1pdDoKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCi1vdXRfZGF0YToKLQlvY2ZzMl9kYXRhX3VubG9jayhpbm9kZSwgMSk7CisJb2NmczJfcnVuX2RlYWxsb2NzKG9zYiwgJndjLT53X2RlYWxsb2MpOwogCi1vdXRfbWV0YToKKwlvY2ZzMl9mcmVlX3dyaXRlX2N0eHQod2MpOworCisJcmV0dXJuIGNvcGllZDsKK30KKworaW50IG9jZnMyX3dyaXRlX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJICAgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKworCXJldCA9IG9jZnMyX3dyaXRlX2VuZF9ub2xvY2sobWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwgcGFnZSwgZnNkYXRhKTsKKworCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAxKTsKIAl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CiAJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOwogCi1vdXQ6Ci0JYnJlbHNlKGRpX2JoKTsKLQlpZiAoZGF0YV9hYykKLQkJb2NmczJfZnJlZV9hbGxvY19jb250ZXh0KGRhdGFfYWMpOwotCWlmIChtZXRhX2FjKQotCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7Ci0KLQlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiByZXQ7CisJcmV0dXJuIHJldDsKIH0KIAogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBvY2ZzMl9hb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5oIGIvZnMvb2NmczIvYW9wcy5oCmluZGV4IDQ1ODIxZDQuLjM4OTU3OWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuaAorKysgYi9mcy9vY2ZzMi9hb3BzLmgKQEAgLTQyLDU3ICs0MiwyMiBAQAogCQkJaW50ICgqZm4pKAloYW5kbGVfdCAqaGFuZGxlLAogCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSk7CiAKLXN0cnVjdCBvY2ZzMl93cml0ZV9jdHh0OwotdHlwZWRlZiBpbnQgKG9jZnMyX3BhZ2Vfd3JpdGVyKShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKiwKLQkJCQl1NjQgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKTsKK2ludCBvY2ZzMl93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgZmxhZ3MsCisJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXAsIHZvaWQgKipmc2RhdGEpOwogCi1zc2l6ZV90IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX2NsdXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwb3MsCi0JCQkJICAgICBzaXplX3QgY291bnQsIG9jZnMyX3BhZ2Vfd3JpdGVyICphY3RvciwKLQkJCQkgICAgIHZvaWQgKnByaXYpOworaW50IG9jZnMyX3dyaXRlX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJICAgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpOwogCi1zdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCB7Ci0Jc2l6ZV90CQkJCXdfY291bnQ7Ci0JbG9mZl90CQkJCXdfcG9zOwotCXUzMgkJCQl3X2Nwb3M7Ci0JdW5zaWduZWQgaW50CQkJd19maW5pc2hlZF9jb3B5OworaW50IG9jZnMyX3dyaXRlX2VuZF9ub2xvY2soc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpOwogCi0JLyogVGhpcyBpcyB0cnVlIGlmIHBhZ2Vfc2l6ZSA+IGNsdXN0ZXJfc2l6ZSAqLwotCXVuc2lnbmVkIGludAkJCXdfbGFyZ2VfcGFnZXM7Ci0KLQkvKiBGaWxsZXIgY2FsbGJhY2sgYW5kIHByaXZhdGUgZGF0YSAqLwotCW9jZnMyX3BhZ2Vfd3JpdGVyCQkqd193cml0ZV9kYXRhX3BhZ2U7Ci0Jdm9pZAkJCQkqd19wcml2YXRlOwotCi0JLyogT25seSB2YWxpZCBmb3IgdGhlIGZpbGxlciBjYWxsYmFjayAqLwotCXN0cnVjdCBwYWdlCQkJKndfdGhpc19wYWdlOwotCXVuc2lnbmVkIGludAkJCXdfdGhpc19wYWdlX25ldzsKLX07Ci0KLXN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2IHsKLQljaGFyCQkJCSpiX3NyY19idWY7Ci0JY29uc3Qgc3RydWN0IGlvdmVjCQkqYl9jdXJfaW92OyAvKiBDdXJyZW50IGlvdmVjICovCi0Jc2l6ZV90CQkJCWJfY3VyX29mZjsgLyogT2Zmc2V0IGluIHRoZQotCQkJCQkJICAgICogY3VycmVudCBpb3ZlYyAqLwotfTsKLWludCBvY2ZzMl9tYXBfYW5kX3dyaXRlX3VzZXJfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgc3RydWN0IG9jZnMyX3dyaXRlX2N0eHQgKndjLAotCQkJCSAgdTY0ICpwX2Jsa25vLAotCQkJCSAgdW5zaWduZWQgaW50ICpyZXRfZnJvbSwKLQkJCQkgIHVuc2lnbmVkIGludCAqcmV0X3RvKTsKLQotc3RydWN0IG9jZnMyX3NwbGljZV93cml0ZV9wcml2IHsKLQlzdHJ1Y3Qgc3BsaWNlX2Rlc2MJCSpzX3NkOwotCXN0cnVjdCBwaXBlX2J1ZmZlcgkJKnNfYnVmOwotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8JCSpzX3BpcGU7Ci0JLyogTmVpdGhlciBvZmZzZXQgdmFsdWUgaXMgZXZlciBsYXJnZXIgdGhhbiBvbmUgcGFnZSAqLwotCXVuc2lnbmVkIGludAkJCXNfb2Zmc2V0OwotCXVuc2lnbmVkIGludAkJCXNfYnVmX29mZnNldDsKLX07Ci1pbnQgb2NmczJfbWFwX2FuZF93cml0ZV9zcGxpY2VfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgICBzdHJ1Y3Qgb2NmczJfd3JpdGVfY3R4dCAqd2MsCi0JCQkJICAgIHU2NCAqcF9ibGtubywKLQkJCQkgICAgdW5zaWduZWQgaW50ICpyZXRfZnJvbSwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpyZXRfdG8pOworaW50IG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jayhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBmbGFncywKKwkJCSAgICAgc3RydWN0IHBhZ2UgKipwYWdlcCwgdm9pZCAqKmZzZGF0YSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwgc3RydWN0IHBhZ2UgKm1tYXBfcGFnZSk7CiAKIC8qIGFsbCBvY2ZzMl9kaW9fZW5kX2lvKCkncyBmYXVsdCAqLwogI2RlZmluZSBvY2ZzMl9pb2NiX2lzX3J3X2xvY2tlZChpb2NiKSBcCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwppbmRleCA5NzkxMTM0Li4yYmQ3Zjc4IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKQEAgLTEzMzUsNiArMTMzNSw3IEBACiAJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG8yaGJfc3RlYWR5X3F1ZXVlLAogCQkJCWF0b21pY19yZWFkKCZyZWctPmhyX3N0ZWFkeV9pdGVyYXRpb25zKSA9PSAwKTsKIAlpZiAocmV0KSB7CisJCS8qIFdlIGdvdCBpbnRlcnJ1cHRlZCAoaGVsbG8gcHRyYWNlISkuICBDbGVhbiB1cCAqLwogCQlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKIAkJaGJfdGFzayA9IHJlZy0+aHJfdGFzazsKIAkJcmVnLT5ocl90YXNrID0gTlVMTDsKQEAgLTEzNDUsNyArMTM0NiwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBjb3VudDsKKwkvKiBPaywgd2Ugd2VyZSB3b2tlbi4gIE1ha2Ugc3VyZSBpdCB3YXNuJ3QgYnkgZHJvcF9pdGVtKCkgKi8KKwlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKwloYl90YXNrID0gcmVnLT5ocl90YXNrOworCXNwaW5fdW5sb2NrKCZvMmhiX2xpdmVfbG9jayk7CisKKwlpZiAoaGJfdGFzaykKKwkJcmV0ID0gY291bnQ7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCiBvdXQ6CiAJaWYgKGZpbHApCiAJCWZwdXQoZmlscCk7CkBAIC0xNTIzLDYgKzE1MzMsMTUgQEAKIAlpZiAoaGJfdGFzaykKIAkJa3RocmVhZF9zdG9wKGhiX3Rhc2spOwogCisJLyoKKwkgKiBJZiB3ZSdyZSByYWNpbmcgYSBkZXZfd3JpdGUoKSwgd2UgbmVlZCB0byB3YWtlIHRoZW0uICBUaGV5IHdpbGwKKwkgKiBjaGVjayByZWctPmhyX3Rhc2sKKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnJlZy0+aHJfc3RlYWR5X2l0ZXJhdGlvbnMpICE9IDApIHsKKwkJYXRvbWljX3NldCgmcmVnLT5ocl9zdGVhZHlfaXRlcmF0aW9ucywgMCk7CisJCXdha2VfdXAoJm8yaGJfc3RlYWR5X3F1ZXVlKTsKKwl9CisKIAljb25maWdfaXRlbV9wdXQoaXRlbSk7CiB9CiAKQEAgLTE2NjUsNyArMTY4NCw2NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobzJoYl9zZXR1cF9jYWxsYmFjayk7CiAKLWludCBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKQorc3RhdGljIHN0cnVjdCBvMmhiX3JlZ2lvbiAqbzJoYl9maW5kX3JlZ2lvbihjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKK3sKKwlzdHJ1Y3QgbzJoYl9yZWdpb24gKnAsICpyZWcgPSBOVUxMOworCisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZvMmhiX2xpdmVfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZvMmhiX2FsbF9yZWdpb25zLCBocl9hbGxfaXRlbSkgeworCQlpZiAoIXN0cmNtcChyZWdpb25fdXVpZCwgY29uZmlnX2l0ZW1fbmFtZSgmcC0+aHJfaXRlbSkpKSB7CisJCQlyZWcgPSBwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW50IG8yaGJfcmVnaW9uX2dldChjb25zdCBjaGFyICpyZWdpb25fdXVpZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbzJoYl9yZWdpb24gKnJlZzsKKworCXNwaW5fbG9jaygmbzJoYl9saXZlX2xvY2spOworCisJcmVnID0gbzJoYl9maW5kX3JlZ2lvbihyZWdpb25fdXVpZCk7CisJaWYgKCFyZWcpCisJCXJldCA9IC1FTk9FTlQ7CisJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gbzJubV9kZXBlbmRfdGhpc19ub2RlKCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvMm5tX2RlcGVuZF9pdGVtKCZyZWctPmhyX2l0ZW0pOworCWlmIChyZXQpCisJCW8ybm1fdW5kZXBlbmRfdGhpc19ub2RlKCk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvMmhiX3JlZ2lvbl9wdXQoY29uc3QgY2hhciAqcmVnaW9uX3V1aWQpCit7CisJc3RydWN0IG8yaGJfcmVnaW9uICpyZWc7CisKKwlzcGluX2xvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCXJlZyA9IG8yaGJfZmluZF9yZWdpb24ocmVnaW9uX3V1aWQpOworCisJc3Bpbl91bmxvY2soJm8yaGJfbGl2ZV9sb2NrKTsKKworCWlmIChyZWcpIHsKKwkJbzJubV91bmRlcGVuZF9pdGVtKCZyZWctPmhyX2l0ZW0pOworCQlvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSgpOworCX0KK30KKworaW50IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soY29uc3QgY2hhciAqcmVnaW9uX3V1aWQsCisJCQkgICBzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYykKIHsKIAlzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKQEAgLTE2ODEsNiArMTc2MCwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAocmVnaW9uX3V1aWQpIHsKKwkJcmV0ID0gbzJoYl9yZWdpb25fZ2V0KHJlZ2lvbl91dWlkKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKwogCWRvd25fd3JpdGUoJm8yaGJfY2FsbGJhY2tfc2VtKTsKIAogCWxpc3RfZm9yX2VhY2goaXRlciwgJmhiY2FsbC0+bGlzdCkgewpAQCAtMTcwMiwxNiArMTc4NywyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobzJoYl9yZWdpc3Rlcl9jYWxsYmFjayk7CiAKLXZvaWQgbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKQordm9pZCBvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soY29uc3QgY2hhciAqcmVnaW9uX3V1aWQsCisJCQkgICAgICBzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYykKIHsKIAlCVUdfT04oaGMtPmhjX21hZ2ljICE9IE8ySEJfQ0JfTUFHSUMpOwogCiAJbWxvZyhNTF9IRUFSVEJFQVQsICJvbiBiZWhhbGYgb2YgJXAgZm9yIGZ1bmNzICVwXG4iLAogCSAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBoYyk7CiAKKwkvKiBYWFggQ2FuIHRoaXMgaGFwcGVuIF93aXRoXyBhIHJlZ2lvbiByZWZlcmVuY2U/ICovCiAJaWYgKGxpc3RfZW1wdHkoJmhjLT5oY19pdGVtKSkKIAkJcmV0dXJuOwogCisJaWYgKHJlZ2lvbl91dWlkKQorCQlvMmhiX3JlZ2lvbl9wdXQocmVnaW9uX3V1aWQpOworCiAJZG93bl93cml0ZSgmbzJoYl9jYWxsYmFja19zZW0pOwogCiAJbGlzdF9kZWxfaW5pdCgmaGMtPmhjX2l0ZW0pOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaCBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmgKaW5kZXggY2M2ZDQwYi4uMzUzOTdkZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5oCkBAIC02OSw4ICs2OSwxMCBAQAogCQkJIG8yaGJfY2JfZnVuYyAqZnVuYywKIAkJCSB2b2lkICpkYXRhLAogCQkJIGludCBwcmlvcml0eSk7Ci1pbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7Ci12b2lkIG8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhzdHJ1Y3QgbzJoYl9jYWxsYmFja19mdW5jICpoYyk7CitpbnQgbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhjb25zdCBjaGFyICpyZWdpb25fdXVpZCwKKwkJCSAgIHN0cnVjdCBvMmhiX2NhbGxiYWNrX2Z1bmMgKmhjKTsKK3ZvaWQgbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKGNvbnN0IGNoYXIgKnJlZ2lvbl91dWlkLAorCQkJICAgICAgc3RydWN0IG8yaGJfY2FsbGJhY2tfZnVuYyAqaGMpOwogdm9pZCBvMmhiX2ZpbGxfbm9kZV9tYXAodW5zaWduZWQgbG9uZyAqbWFwLAogCQkJdW5zaWduZWQgYnl0ZXMpOwogdm9pZCBvMmhiX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKaW5kZXggOWY1YWQwZi4uYWYyMDcwZCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYwpAQCAtOTAwLDYgKzkwMCw0NiBAQAogCX0sCiB9OwogCitpbnQgbzJubV9kZXBlbmRfaXRlbShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCit7CisJcmV0dXJuIGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLCBpdGVtKTsKK30KKwordm9pZCBvMm5tX3VuZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKQoreworCWNvbmZpZ2ZzX3VuZGVwZW5kX2l0ZW0oJm8ybm1fY2x1c3Rlcl9ncm91cC5jc19zdWJzeXMsIGl0ZW0pOworfQorCitpbnQgbzJubV9kZXBlbmRfdGhpc19ub2RlKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG8ybm1fbm9kZSAqbG9jYWxfbm9kZTsKKworCWxvY2FsX25vZGUgPSBvMm5tX2dldF9ub2RlX2J5X251bShvMm5tX3RoaXNfbm9kZSgpKTsKKwlpZiAoIWxvY2FsX25vZGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbzJubV9kZXBlbmRfaXRlbSgmbG9jYWxfbm9kZS0+bmRfaXRlbSk7CisJbzJubV9ub2RlX3B1dChsb2NhbF9ub2RlKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbzJubV91bmRlcGVuZF90aGlzX25vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgbzJubV9ub2RlICpsb2NhbF9ub2RlOworCisJbG9jYWxfbm9kZSA9IG8ybm1fZ2V0X25vZGVfYnlfbnVtKG8ybm1fdGhpc19ub2RlKCkpOworCUJVR19PTighbG9jYWxfbm9kZSk7CisKKwlvMm5tX3VuZGVwZW5kX2l0ZW0oJmxvY2FsX25vZGUtPm5kX2l0ZW0pOworCW8ybm1fbm9kZV9wdXQobG9jYWxfbm9kZSk7Cit9CisKKwogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbzJubSh2b2lkKQogewogCWlmIChvY2ZzMl90YWJsZV9oZWFkZXIpCkBAIC05MzQsNyArOTc0LDcgQEAKIAkJZ290byBvdXRfc3lzY3RsOwogCiAJY29uZmlnX2dyb3VwX2luaXQoJm8ybm1fY2x1c3Rlcl9ncm91cC5jc19zdWJzeXMuc3VfZ3JvdXApOwotCWluaXRfTVVURVgoJm8ybm1fY2x1c3Rlcl9ncm91cC5jc19zdWJzeXMuc3Vfc2VtKTsKKwltdXRleF9pbml0KCZvMm5tX2NsdXN0ZXJfZ3JvdXAuY3Nfc3Vic3lzLnN1X211dGV4KTsKIAlyZXQgPSBjb25maWdmc19yZWdpc3Rlcl9zdWJzeXN0ZW0oJm8ybm1fY2x1c3Rlcl9ncm91cC5jc19zdWJzeXMpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJub2RlbWFuYWdlcjogUmVnaXN0cmF0aW9uIHJldHVybmVkICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5oCmluZGV4IDA3MDUyMjEuLjdjODYwMzYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmgKQEAgLTc3LDQgKzc3LDkgQEAKIHZvaWQgbzJubV9ub2RlX2dldChzdHJ1Y3QgbzJubV9ub2RlICpub2RlKTsKIHZvaWQgbzJubV9ub2RlX3B1dChzdHJ1Y3QgbzJubV9ub2RlICpub2RlKTsKIAoraW50IG8ybm1fZGVwZW5kX2l0ZW0oc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKK3ZvaWQgbzJubV91bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSk7CitpbnQgbzJubV9kZXBlbmRfdGhpc19ub2RlKHZvaWQpOwordm9pZCBvMm5tX3VuZGVwZW5kX3RoaXNfbm9kZSh2b2lkKTsKKwogI2VuZGlmIC8qIE8yQ0xVU1RFUl9OT0RFTUFOQUdFUl9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jIGIvZnMvb2NmczIvY2x1c3Rlci90Y3AuYwppbmRleCAwYjIyOWE5Li5mMGJkZmQ5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL3RjcC5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwLmMKQEAgLTI2MSwxNCArMjYxLDEyIEBACiAKIHN0YXRpYyB2b2lkIG8ybmV0X2NvbXBsZXRlX25vZGVzX25zdyhzdHJ1Y3QgbzJuZXRfbm9kZSAqbm4pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKnRtcDsKKwlzdHJ1Y3QgbzJuZXRfc3RhdHVzX3dhaXQgKm5zdywgKnRtcDsKIAl1bnNpZ25lZCBpbnQgbnVtX2tpbGxzID0gMDsKLQlzdHJ1Y3QgbzJuZXRfc3RhdHVzX3dhaXQgKm5zdzsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmbm4tPm5uX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIHRtcCwgJm5uLT5ubl9zdGF0dXNfbGlzdCkgewotCQluc3cgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBvMm5ldF9zdGF0dXNfd2FpdCwgbnNfbm9kZV9pdGVtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobnN3LCB0bXAsICZubi0+bm5fc3RhdHVzX2xpc3QsIG5zX25vZGVfaXRlbSkgewogCQlvMm5ldF9jb21wbGV0ZV9uc3dfbG9ja2VkKG5uLCBuc3csIE8yTkVUX0VSUl9ESUVELCAwKTsKIAkJbnVtX2tpbGxzKys7CiAJfQpAQCAtNzY0LDEzICs3NjIsMTAgQEAKIAogdm9pZCBvMm5ldF91bnJlZ2lzdGVyX2hhbmRsZXJfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm47Ci0Jc3RydWN0IG8ybmV0X21zZ19oYW5kbGVyICpubWg7CisJc3RydWN0IG8ybmV0X21zZ19oYW5kbGVyICpubWgsICpuOwogCiAJd3JpdGVfbG9jaygmbzJuZXRfaGFuZGxlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCBsaXN0KSB7Ci0JCW5taCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbzJuZXRfbXNnX2hhbmRsZXIsCi0JCQkJIG5oX3VucmVnaXN0ZXJfaXRlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5taCwgbiwgbGlzdCwgbmhfdW5yZWdpc3Rlcl9pdGVtKSB7CiAJCW1sb2coTUxfVENQLCAidW5yZWdpc3RlcmluZyBoYW5kbGVyIGZ1bmMgJXAgdHlwZSAldSBrZXkgJTA4eFxuIiwKIAkJICAgICBubWgtPm5oX2Z1bmMsIG5taC0+bmhfbXNnX3R5cGUsIG5taC0+bmhfa2V5KTsKIAkJcmJfZXJhc2UoJm5taC0+bmhfbm9kZSwgJm8ybmV0X2hhbmRsZXJfdHJlZSk7CkBAIC0xNjM4LDggKzE2MzMsOCBAQAogCiB2b2lkIG8ybmV0X3VucmVnaXN0ZXJfaGJfY2FsbGJhY2tzKHZvaWQpCiB7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvMm5ldF9oYl91cCk7Ci0JbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKCZvMm5ldF9oYl9kb3duKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJm8ybmV0X2hiX3VwKTsKKwlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJm8ybmV0X2hiX2Rvd24pOwogfQogCiBpbnQgbzJuZXRfcmVnaXN0ZXJfaGJfY2FsbGJhY2tzKHZvaWQpCkBAIC0xNjUxLDkgKzE2NDYsOSBAQAogCW8yaGJfc2V0dXBfY2FsbGJhY2soJm8ybmV0X2hiX3VwLCBPMkhCX05PREVfVVBfQ0IsCiAJCQkgICAgbzJuZXRfaGJfbm9kZV91cF9jYiwgTlVMTCwgTzJORVRfSEJfUFJJKTsKIAotCXJldCA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soJm8ybmV0X2hiX3VwKTsKKwlyZXQgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKE5VTEwsICZvMm5ldF9oYl91cCk7CiAJaWYgKHJldCA9PSAwKQotCQlyZXQgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZvMm5ldF9oYl9kb3duKTsKKwkJcmV0ID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmbzJuZXRfaGJfZG93bik7CiAKIAlpZiAocmV0KQogCQlvMm5ldF91bnJlZ2lzdGVyX2hiX2NhbGxiYWNrcygpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGlyLmMgYi9mcy9vY2ZzMi9kaXIuYwppbmRleCBjNDQxZWYxLi4wZDVmZGRlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kaXIuYworKysgYi9mcy9vY2ZzMi9kaXIuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJCXUzMiBvZmZzZXQgPSBPQ0ZTMl9JKGRpciktPmlwX2NsdXN0ZXJzOwogCiAJCXN0YXR1cyA9IG9jZnMyX2RvX2V4dGVuZF9hbGxvY2F0aW9uKE9DRlMyX1NCKHNiKSwgZGlyLCAmb2Zmc2V0LAotCQkJCQkJICAgIDEsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAorCQkJCQkJICAgIDEsIDAsIHBhcmVudF9mZV9iaCwgaGFuZGxlLAogCQkJCQkJICAgIGRhdGFfYWMsIG1ldGFfYWMsIE5VTEwpOwogCQlCVUdfT04oc3RhdHVzID09IC1FQUdBSU4pOwogCQlpZiAoc3RhdHVzIDwgMCkgewpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCmluZGV4IGQ4MzZiOTguLjY5NTQ1NjUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKQEAgLTExMjgsOCArMTEyOCw4IEBACiAKIHN0YXRpYyB2b2lkIGRsbV91bnJlZ2lzdGVyX2RvbWFpbl9oYW5kbGVycyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSkKIHsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX3VwKTsKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX2Rvd24pOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmZGxtLT5kbG1faGJfdXApOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmZGxtLT5kbG1faGJfZG93bik7CiAJbzJuZXRfdW5yZWdpc3Rlcl9oYW5kbGVyX2xpc3QoJmRsbS0+ZGxtX2RvbWFpbl9oYW5kbGVycyk7CiB9CiAKQEAgLTExNDEsMTMgKzExNDEsMTMgQEAKIAogCW8yaGJfc2V0dXBfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX2Rvd24sIE8ySEJfTk9ERV9ET1dOX0NCLAogCQkJICAgIGRsbV9oYl9ub2RlX2Rvd25fY2IsIGRsbSwgRExNX0hCX05PREVfRE9XTl9QUkkpOwotCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX2Rvd24pOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soTlVMTCwgJmRsbS0+ZGxtX2hiX2Rvd24pOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gYmFpbDsKIAogCW8yaGJfc2V0dXBfY2FsbGJhY2soJmRsbS0+ZGxtX2hiX3VwLCBPMkhCX05PREVfVVBfQ0IsCiAJCQkgICAgZGxtX2hiX25vZGVfdXBfY2IsIGRsbSwgRExNX0hCX05PREVfVVBfUFJJKTsKLQlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKCZkbG0tPmRsbV9oYl91cCk7CisJc3RhdHVzID0gbzJoYl9yZWdpc3Rlcl9jYWxsYmFjayhOVUxMLCAmZGxtLT5kbG1faGJfdXApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gYmFpbDsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jIGIvZnMvb2NmczIvZGxtL2RsbW1hc3Rlci5jCmluZGV4IDZlZGZmY2EuLjY1YjJiOWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1tYXN0ZXIuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtbWFzdGVyLmMKQEAgLTE5MiwyNSArMTkyLDIwIEBACiBzdGF0aWMgdm9pZCBkbG1fZHVtcF9tbGVzKHN0cnVjdCBkbG1fY3R4dCAqZGxtKQogewogCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKm1sZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCQogCW1sb2coTUxfTk9USUNFLCAiZHVtcGluZyBhbGwgbWxlcyBmb3IgZG9tYWluICVzOlxuIiwgZGxtLT5uYW1lKTsKIAlzcGluX2xvY2soJmRsbS0+bWFzdGVyX2xvY2spOwotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbS0+bWFzdGVyX2xpc3QpIHsKLQkJbWxlID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1sZSwgJmRsbS0+bWFzdGVyX2xpc3QsIGxpc3QpCiAJCWRsbV9wcmludF9vbmVfbWxlKG1sZSk7Ci0JfQogCXNwaW5fdW5sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKIH0KIAogaW50IGRsbV9kdW1wX2FsbF9tbGVzKGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJc3RydWN0IGRsbV9jdHh0ICpkbG07CiAKIAlzcGluX2xvY2soJmRsbV9kb21haW5fbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChpdGVyLCAmZGxtX2RvbWFpbnMpIHsKLQkJZGxtID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9jdHh0LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRsbSwgJmRsbV9kb21haW5zLCBsaXN0KSB7CiAJCW1sb2coTUxfTk9USUNFLCAiZm91bmQgZGxtOiAlcCwgbmFtZT0lc1xuIiwgZGxtLCBkbG0tPm5hbWUpOwogCQlkbG1fZHVtcF9tbGVzKGRsbSk7CiAJfQpAQCAtNDU0LDEyICs0NDksMTAgQEAKIAkJCWNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBuYW1lbGVuKQogewogCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKnRtcG1sZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZkbG0tPm1hc3Rlcl9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbS0+bWFzdGVyX2xpc3QpIHsKLQkJdG1wbWxlID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcG1sZSwgJmRsbS0+bWFzdGVyX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFkbG1fbWxlX2VxdWFsKGRsbSwgdG1wbWxlLCBuYW1lLCBuYW1lbGVuKSkKIAkJCWNvbnRpbnVlOwogCQlkbG1fZ2V0X21sZSh0bXBtbGUpOwpAQCAtNDcyLDEzICs0NjUsMTAgQEAKIHZvaWQgZGxtX2hiX2V2ZW50X25vdGlmeV9hdHRhY2hlZChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgaW50IGlkeCwgaW50IG5vZGVfdXApCiB7CiAJc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSAqbWxlOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRsbS0+c3BpbmxvY2spOwogCQotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbS0+bWxlX2hiX2V2ZW50cykgewotCQltbGUgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnksIAotCQkJCSBoYl9ldmVudHMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWxlLCAmZGxtLT5tbGVfaGJfZXZlbnRzLCBoYl9ldmVudHMpIHsKIAkJaWYgKG5vZGVfdXApCiAJCQlkbG1fbWxlX25vZGVfdXAoZGxtLCBtbGUsIE5VTEwsIGlkeCk7CiAJCWVsc2UKQEAgLTI0MzQsNyArMjQyNCw3IEBACiAJaW50IHJldDsKIAlpbnQgaTsKIAlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlLCAqaXRlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsKIAlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJnJlcy0+c3BpbmxvY2spOwpAQCAtMjQ1Myw4ICsyNDQzLDcgQEAKIAlyZXQgPSAwOwogCXF1ZXVlID0gJnJlcy0+Z3JhbnRlZDsKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2goaXRlciwgcXVldWUpIHsKLQkJCWxvY2sgPSBsaXN0X2VudHJ5KGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgcXVldWUsIGxpc3QpIHsKIAkJCSsrY291bnQ7CiAJCQlpZiAobG9jay0+bWwubm9kZSA9PSBkbG0tPm5vZGVfbnVtKSB7CiAJCQkJbWxvZygwLCAiZm91bmQgYSBsb2NrIG93bmVkIGJ5IHRoaXMgbm9kZSBzdGlsbCAiCkBAIC0yOTIzLDE4ICsyOTEyLDE2IEBACiBzdGF0aWMgdm9pZCBkbG1fcmVtb3ZlX25vbmxvY2FsX2xvY2tzKHN0cnVjdCBkbG1fY3R4dCAqZGxtLAogCQkJCSAgICAgIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSA9ICZyZXMtPmdyYW50ZWQ7CiAJaW50IGksIGJpdDsKLQlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CisJc3RydWN0IGRsbV9sb2NrICpsb2NrLCAqbmV4dDsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmcmVzLT5zcGlubG9jayk7CiAKIAlCVUdfT04ocmVzLT5vd25lciA9PSBkbG0tPm5vZGVfbnVtKTsKIAogCWZvciAoaT0wOyBpPDM7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2ssIG5leHQsIHF1ZXVlLCBsaXN0KSB7CiAJCQlpZiAobG9jay0+bWwubm9kZSAhPSBkbG0tPm5vZGVfbnVtKSB7CiAJCQkJbWxvZygwLCAicHV0dGluZyBsb2NrIGZvciBub2RlICV1XG4iLAogCQkJCSAgICAgbG9jay0+bWwubm9kZSk7CkBAIC0yOTc2LDcgKzI5NjMsNiBAQAogewogCWludCBpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlID0gJnJlcy0+Z3JhbnRlZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKIAlpbnQgbm9kZW51bTsKIApAQCAtMjk4NCwxMCArMjk3MCw5IEBACiAKIAlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCWZvciAoaT0wOyBpPDM7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHF1ZXVlKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgcXVldWUsIGxpc3QpIHsKIAkJCS8qIHVwIHRvIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHRoaXMgbm9kZQogCQkJICogaXMgYWxpdmUgKi8KLQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOwogCQkJaWYgKGxvY2stPm1sLm5vZGUgIT0gZGxtLT5ub2RlX251bSkgewogCQkJCXNwaW5fdW5sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAkJCQlyZXR1cm4gbG9jay0+bWwubm9kZTsKQEAgLTMyMzQsOCArMzIxOSw3IEBACiAKIHZvaWQgZGxtX2NsZWFuX21hc3Rlcl9saXN0KHN0cnVjdCBkbG1fY3R4dCAqZGxtLCB1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKml0ZXIyOwotCXN0cnVjdCBkbG1fbWFzdGVyX2xpc3RfZW50cnkgKm1sZTsKKwlzdHJ1Y3QgZGxtX21hc3Rlcl9saXN0X2VudHJ5ICptbGUsICpuZXh0OwogCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOwogCXVuc2lnbmVkIGludCBoYXNoOwogCkBAIC0zMjQ1LDkgKzMyMjksNyBAQAogCiAJLyogY2xlYW4gdGhlIG1hc3RlciBsaXN0ICovCiAJc3Bpbl9sb2NrKCZkbG0tPm1hc3Rlcl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZkbG0tPm1hc3Rlcl9saXN0KSB7Ci0JCW1sZSA9IGxpc3RfZW50cnkoaXRlciwgc3RydWN0IGRsbV9tYXN0ZXJfbGlzdF9lbnRyeSwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWxlLCBuZXh0LCAmZGxtLT5tYXN0ZXJfbGlzdCwgbGlzdCkgewogCQlCVUdfT04obWxlLT50eXBlICE9IERMTV9NTEVfQkxPQ0sgJiYKIAkJICAgICAgIG1sZS0+dHlwZSAhPSBETE1fTUxFX01BU1RFUiAmJgogCQkgICAgICAgbWxlLT50eXBlICE9IERMTV9NTEVfTUlHUkFUSU9OKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1yZWNvdmVyeS5jIGIvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMKaW5kZXggNjcxYzRlZC4uYTJjMzMxNiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbXJlY292ZXJ5LmMKQEAgLTE1OCw4ICsxNTgsNyBAQAogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkbG1fY3R4dCwgZGlzcGF0Y2hlZF93b3JrKTsKIAlMSVNUX0hFQUQodG1wX2xpc3QpOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICppdGVyMjsKLQlzdHJ1Y3QgZGxtX3dvcmtfaXRlbSAqaXRlbTsKKwlzdHJ1Y3QgZGxtX3dvcmtfaXRlbSAqaXRlbSwgKm5leHQ7CiAJZGxtX3dvcmtmdW5jX3QgKndvcmtmdW5jOwogCWludCB0b3Q9MDsKIApAQCAtMTY3LDEzICsxNjYsMTIgQEAKIAlsaXN0X3NwbGljZV9pbml0KCZkbG0tPndvcmtfbGlzdCwgJnRtcF9saXN0KTsKIAlzcGluX3VubG9jaygmZGxtLT53b3JrX2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmdG1wX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZW0sICZ0bXBfbGlzdCwgbGlzdCkgewogCQl0b3QrKzsKIAl9CiAJbWxvZygwLCAiJXM6IHdvcmsgdGhyZWFkIGhhcyAlZCB3b3JrIGl0ZW1zXG4iLCBkbG0tPm5hbWUsIHRvdCk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsICZ0bXBfbGlzdCkgewotCQlpdGVtID0gbGlzdF9lbnRyeShpdGVyLCBzdHJ1Y3QgZGxtX3dvcmtfaXRlbSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0ZW0sIG5leHQsICZ0bXBfbGlzdCwgbGlzdCkgewogCQl3b3JrZnVuYyA9IGl0ZW0tPmZ1bmM7CiAJCWxpc3RfZGVsX2luaXQoJml0ZW0tPmxpc3QpOwogCkBAIC01NDksNyArNTQ3LDYgQEAKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhICpuZGF0YTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCWludCBhbGxfbm9kZXNfZG9uZTsKIAlpbnQgZGVzdHJveSA9IDA7CiAJaW50IHBhc3MgPSAwOwpAQCAtNTY3LDggKzU2NCw3IEBACiAKIAkvKiBzYWZlIHRvIGFjY2VzcyB0aGUgbm9kZSBkYXRhIGxpc3Qgd2l0aG91dCBhIGxvY2ssIHNpbmNlIHRoaXMKIAkgKiBwcm9jZXNzIGlzIHRoZSBvbmx5IG9uZSB0byBjaGFuZ2UgdGhlIGxpc3QgKi8KLQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPnJlY28ubm9kZV9kYXRhKSB7Ci0JCW5kYXRhID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZGF0YSwgJmRsbS0+cmVjby5ub2RlX2RhdGEsIGxpc3QpIHsKIAkJQlVHX09OKG5kYXRhLT5zdGF0ZSAhPSBETE1fUkVDT19OT0RFX0RBVEFfSU5JVCk7CiAJCW5kYXRhLT5zdGF0ZSA9IERMTV9SRUNPX05PREVfREFUQV9SRVFVRVNUSU5HOwogCkBAIC02NTUsOSArNjUxLDcgQEAKIAkJICogZG9uZSwgb3IgaWYgYW55b25lIGRpZWQgKi8KIAkJYWxsX25vZGVzX2RvbmUgPSAxOwogCQlzcGluX2xvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsICZkbG0tPnJlY28ubm9kZV9kYXRhKSB7Ci0JCQluZGF0YSA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fcmVjb19ub2RlX2RhdGEsIGxpc3QpOwotCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobmRhdGEsICZkbG0tPnJlY28ubm9kZV9kYXRhLCBsaXN0KSB7CiAJCQltbG9nKDAsICJjaGVja2luZyByZWNvdmVyeSBzdGF0ZSBvZiBub2RlICV1XG4iLAogCQkJICAgICBuZGF0YS0+bm9kZV9udW0pOwogCQkJc3dpdGNoIChuZGF0YS0+c3RhdGUpIHsKQEAgLTc3NCwxNiArNzY4LDE0IEBACiAKIHN0YXRpYyB2b2lkIGRsbV9kZXN0cm95X3JlY292ZXJ5X2FyZWEoc3RydWN0IGRsbV9jdHh0ICpkbG0sIHU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7Ci0Jc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSAqbmRhdGE7CisJc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSAqbmRhdGEsICpuZXh0OwogCUxJU1RfSEVBRCh0bXBsaXN0KTsKIAogCXNwaW5fbG9jaygmZGxtX3JlY29fc3RhdGVfbG9jayk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmZGxtLT5yZWNvLm5vZGVfZGF0YSwgJnRtcGxpc3QpOwogCXNwaW5fdW5sb2NrKCZkbG1fcmVjb19zdGF0ZV9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCBpdGVyMiwgJnRtcGxpc3QpIHsKLQkJbmRhdGEgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmRhdGEsIG5leHQsICZ0bXBsaXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJm5kYXRhLT5saXN0KTsKIAkJa2ZyZWUobmRhdGEpOwogCX0KQEAgLTg3Niw3ICs4NjgsNiBAQAogCXN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtOwogCUxJU1RfSEVBRChyZXNvdXJjZXMpOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJaW50IHJldDsKIAl1OCBkZWFkX25vZGUsIHJlY29fbWFzdGVyOwogCWludCBza2lwX2FsbF9kb25lID0gMDsKQEAgLTkyMCw4ICs5MTEsNyBAQAogCiAJLyogYW55IGVycm9ycyByZXR1cm5lZCB3aWxsIGJlIGR1ZSB0byB0aGUgbmV3X21hc3RlciBkeWluZywKIAkgKiB0aGUgZGxtX3JlY29fdGhyZWFkIHNob3VsZCBkZXRlY3QgdGhpcyAqLwotCWxpc3RfZm9yX2VhY2goaXRlciwgJnJlc291cmNlcykgewotCQlyZXMgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UsIHJlY292ZXJpbmcpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmcmVzb3VyY2VzLCByZWNvdmVyaW5nKSB7CiAJCXJldCA9IGRsbV9zZW5kX29uZV9sb2NrcmVzKGRsbSwgcmVzLCBtcmVzLCByZWNvX21hc3RlciwKIAkJCQkgICAJRExNX01SRVNfUkVDT1ZFUlkpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtOTgzLDcgKzk3Myw2IEBACiB7CiAJc3RydWN0IGRsbV9jdHh0ICpkbG0gPSBkYXRhOwogCXN0cnVjdCBkbG1fcmVjb19kYXRhX2RvbmUgKmRvbmUgPSAoc3RydWN0IGRsbV9yZWNvX2RhdGFfZG9uZSAqKW1zZy0+YnVmOwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CiAJc3RydWN0IGRsbV9yZWNvX25vZGVfZGF0YSAqbmRhdGEgPSBOVUxMOwogCWludCByZXQgPSAtRUlOVkFMOwogCkBAIC0xMDAwLDggKzk4OSw3IEBACiAJCQlkbG0tPnJlY28uZGVhZF9ub2RlLCBkb25lLT5ub2RlX2lkeCwgZGxtLT5ub2RlX251bSk7CiAKIAlzcGluX2xvY2soJmRsbV9yZWNvX3N0YXRlX2xvY2spOwotCWxpc3RfZm9yX2VhY2goaXRlciwgJmRsbS0+cmVjby5ub2RlX2RhdGEpIHsKLQkJbmRhdGEgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX3JlY29fbm9kZV9kYXRhLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kYXRhLCAmZGxtLT5yZWNvLm5vZGVfZGF0YSwgbGlzdCkgewogCQlpZiAobmRhdGEtPm5vZGVfbnVtICE9IGRvbmUtPm5vZGVfaWR4KQogCQkJY29udGludWU7CiAKQEAgLTEwNDksMTMgKzEwMzcsMTEgQEAKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKIAkJCQkgICAgICAgCXU4IGRlYWRfbm9kZSkKIHsKLQlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7CisJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsICpuZXh0OwogCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKIAogCXNwaW5fbG9jaygmZGxtLT5zcGlubG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmZGxtLT5yZWNvLnJlc291cmNlcykgewotCQlyZXMgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UsIHJlY292ZXJpbmcpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIG5leHQsICZkbG0tPnJlY28ucmVzb3VyY2VzLCByZWNvdmVyaW5nKSB7CiAJCS8qIGFsd2F5cyBwcnVuZSBhbnkgJFJFQ09WRVJZIGVudHJpZXMgZm9yIGRlYWQgbm9kZXMsCiAJCSAqIG90aGVyd2lzZSBoYW5ncyBjYW4gb2NjdXIgZHVyaW5nIGxhdGVyIHJlY292ZXJ5ICovCiAJCWlmIChkbG1faXNfcmVjb3ZlcnlfbG9jayhyZXMtPmxvY2tuYW1lLm5hbWUsCkBAIC0xMTY5LDcgKzExNTUsNyBAQAogCQkJCQl1OCBmbGFncywgdTggbWFzdGVyKQogewogCS8qIG1yZXMgaGVyZSBpcyBvbmUgZnVsbCBwYWdlICovCi0JbWVtc2V0KG1yZXMsIDAsIFBBR0VfU0laRSk7CisJY2xlYXJfcGFnZShtcmVzKTsKIAltcmVzLT5sb2NrbmFtZV9sZW4gPSBuYW1lbGVuOwogCW1lbWNweShtcmVzLT5sb2NrbmFtZSwgbG9ja25hbWUsIG5hbWVsZW4pOwogCW1yZXMtPm51bV9sb2NrcyA9IDA7CkBAIC0xMjUyLDcgKzEyMzgsNyBAQAogCQkJIHN0cnVjdCBkbG1fbWlncmF0YWJsZV9sb2NrcmVzICptcmVzLAogCQkJIHU4IHNlbmRfdG8sIHU4IGZsYWdzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlLCAqaXRlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsKIAlpbnQgdG90YWxfbG9ja3MsIGk7CiAJdTY0IG1pZ19jb29raWUgPSAwOwogCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKQEAgLTEyNzgsOSArMTI2NCw3IEBACiAJdG90YWxfbG9ja3MgPSAwOwogCWZvciAoaT1ETE1fR1JBTlRFRF9MSVNUOyBpPD1ETE1fQkxPQ0tFRF9MSVNUOyBpKyspIHsKIAkJcXVldWUgPSBkbG1fbGlzdF9pZHhfdG9fcHRyKHJlcywgaSk7Ci0JCWxpc3RfZm9yX2VhY2goaXRlciwgcXVldWUpIHsKLQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOwotCisJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgcXVldWUsIGxpc3QpIHsKIAkJCS8qIGFkZCBhbm90aGVyIGxvY2suICovCiAJCQl0b3RhbF9sb2NrcysrOwogCQkJaWYgKCFkbG1fYWRkX2xvY2tfdG9fYXJyYXkobG9jaywgbXJlcywgaSkpCkBAIC0xNzE3LDcgKzE3MDEsNiBAQAogCXN0cnVjdCBkbG1fbG9ja3N0YXR1cyAqbGtzYiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAJaW50IGksIGosIGJhZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwogCXN0cnVjdCBkbG1fbG9jayAqbG9jayA9IE5VTEw7CiAJdTggZnJvbSA9IE8yTk1fTUFYX05PREVTOwogCXVuc2lnbmVkIGludCBhZGRlZCA9IDA7CkBAIC0xNzU1LDggKzE3MzgsNyBAQAogCQkJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAkJCWZvciAoaiA9IERMTV9HUkFOVEVEX0xJU1Q7IGogPD0gRExNX0JMT0NLRURfTElTVDsgaisrKSB7CiAJCQkJdG1wcSA9IGRsbV9saXN0X2lkeF90b19wdHIocmVzLCBqKTsKLQkJCQlsaXN0X2Zvcl9lYWNoKGl0ZXIsIHRtcHEpIHsKLQkJCQkJbG9jayA9IGxpc3RfZW50cnkgKGl0ZXIsIHN0cnVjdCBkbG1fbG9jaywgbGlzdCk7CisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCB0bXBxLCBsaXN0KSB7CiAJCQkJCWlmIChsb2NrLT5tbC5jb29raWUgIT0gbWwtPmNvb2tpZSkKIAkJCQkJCWxvY2sgPSBOVUxMOwogCQkJCQllbHNlCkBAIC0xOTMwLDggKzE5MTIsOCBAQAogCQkJCSAgICAgICBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKIAlpbnQgaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZSwgKml0ZXIsICppdGVyMjsKLQlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAqcXVldWU7CisJc3RydWN0IGRsbV9sb2NrICpsb2NrLCAqbmV4dDsKIAogCXJlcy0+c3RhdGUgfD0gRExNX0xPQ0tfUkVTX1JFQ09WRVJJTkc7CiAJaWYgKCFsaXN0X2VtcHR5KCZyZXMtPnJlY292ZXJpbmcpKSB7CkBAIC0xOTQ3LDggKzE5MjksNyBAQAogCS8qIGZpbmQgYW55IHBlbmRpbmcgbG9ja3MgYW5kIHB1dCB0aGVtIGJhY2sgb24gcHJvcGVyIGxpc3QgKi8KIAlmb3IgKGk9RExNX0JMT0NLRURfTElTVDsgaT49RExNX0dSQU5URURfTElTVDsgaS0tKSB7CiAJCXF1ZXVlID0gZGxtX2xpc3RfaWR4X3RvX3B0cihyZXMsIGkpOwotCQlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlciwgaXRlcjIsIHF1ZXVlKSB7Ci0JCQlsb2NrID0gbGlzdF9lbnRyeSAoaXRlciwgc3RydWN0IGRsbV9sb2NrLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2ssIG5leHQsIHF1ZXVlLCBsaXN0KSB7CiAJCQlkbG1fbG9ja19nZXQobG9jayk7CiAJCQlpZiAobG9jay0+Y29udmVydF9wZW5kaW5nKSB7CiAJCQkJLyogbW92ZSBjb252ZXJ0aW5nIGxvY2sgYmFjayB0byBncmFudGVkICovCkBAIC0yMDEzLDE4ICsxOTk0LDE1IEBACiAJCQkJCSAgICAgIHU4IGRlYWRfbm9kZSwgdTggbmV3X21hc3RlcikKIHsKIAlpbnQgaTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyLCAqaXRlcjI7CiAJc3RydWN0IGhsaXN0X25vZGUgKmhhc2hfaXRlcjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqYnVja2V0OwotCi0Jc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXM7CisJc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlICpyZXMsICpuZXh0OwogCiAJbWxvZ19lbnRyeV92b2lkKCk7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRsbS0+c3BpbmxvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZXIsIGl0ZXIyLCAmZGxtLT5yZWNvLnJlc291cmNlcykgewotCQlyZXMgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UsIHJlY292ZXJpbmcpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXMsIG5leHQsICZkbG0tPnJlY28ucmVzb3VyY2VzLCByZWNvdmVyaW5nKSB7CiAJCWlmIChyZXMtPm93bmVyID09IGRlYWRfbm9kZSkgewogCQkJbGlzdF9kZWxfaW5pdCgmcmVzLT5yZWNvdmVyaW5nKTsKIAkJCXNwaW5fbG9jaygmcmVzLT5zcGlubG9jayk7CkBAIC0yMDk5LDcgKzIwNzcsNyBAQAogc3RhdGljIHZvaWQgZGxtX3JldmFsaWRhdGVfbHZiKHN0cnVjdCBkbG1fY3R4dCAqZGxtLAogCQkJICAgICAgIHN0cnVjdCBkbG1fbG9ja19yZXNvdXJjZSAqcmVzLCB1OCBkZWFkX25vZGUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlciwgKnF1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOwogCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKIAlpbnQgYmxhbmtfbHZiID0gMCwgbG9jYWwgPSAwOwogCWludCBpOwpAQCAtMjEyMSw4ICsyMDk5LDcgQEAKIAogCWZvciAoaT1ETE1fR1JBTlRFRF9MSVNUOyBpPD1ETE1fQ09OVkVSVElOR19MSVNUOyBpKyspIHsKIAkJcXVldWUgPSBkbG1fbGlzdF9pZHhfdG9fcHRyKHJlcywgaSk7Ci0JCWxpc3RfZm9yX2VhY2goaXRlciwgcXVldWUpIHsKLQkJCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssIHF1ZXVlLCBsaXN0KSB7CiAJCQlpZiAobG9jay0+bWwubm9kZSA9PSBzZWFyY2hfbm9kZSkgewogCQkJCWlmIChkbG1fbHZiX25lZWRzX2ludmFsaWRhdGlvbihsb2NrLCBsb2NhbCkpIHsKIAkJCQkJLyogemVybyB0aGUgbGtzYiBsdmIgYW5kIGxvY2tyZXMgbHZiICovCkBAIC0yMTQzLDggKzIxMjAsNyBAQAogc3RhdGljIHZvaWQgZGxtX2ZyZWVfZGVhZF9sb2NrcyhzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwKIAkJCQlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgdTggZGVhZF9ub2RlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXIsICp0bXBpdGVyOwotCXN0cnVjdCBkbG1fbG9jayAqbG9jazsKKwlzdHJ1Y3QgZGxtX2xvY2sgKmxvY2ssICpuZXh0OwogCXVuc2lnbmVkIGludCBmcmVlZCA9IDA7CiAKIAkvKiB0aGlzIG5vZGUgaXMgdGhlIGxvY2tyZXMgbWFzdGVyOgpAQCAtMjE1NSwyNCArMjEzMSwyMSBAQAogCWFzc2VydF9zcGluX2xvY2tlZCgmcmVzLT5zcGlubG9jayk7CiAKIAkvKiBUT0RPOiBjaGVjayBwZW5kaW5nX2FzdHMsIHBlbmRpbmdfYmFzdHMgaGVyZSAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCB0bXBpdGVyLCAmcmVzLT5ncmFudGVkKSB7Ci0JCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCAmcmVzLT5ncmFudGVkLCBsaXN0KSB7CiAJCWlmIChsb2NrLT5tbC5ub2RlID09IGRlYWRfbm9kZSkgewogCQkJbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7CiAJCQlkbG1fbG9ja19wdXQobG9jayk7CiAJCQlmcmVlZCsrOwogCQl9CiAJfQotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCB0bXBpdGVyLCAmcmVzLT5jb252ZXJ0aW5nKSB7Ci0JCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCAmcmVzLT5jb252ZXJ0aW5nLCBsaXN0KSB7CiAJCWlmIChsb2NrLT5tbC5ub2RlID09IGRlYWRfbm9kZSkgewogCQkJbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7CiAJCQlkbG1fbG9ja19wdXQobG9jayk7CiAJCQlmcmVlZCsrOwogCQl9CiAJfQotCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVyLCB0bXBpdGVyLCAmcmVzLT5ibG9ja2VkKSB7Ci0JCWxvY2sgPSBsaXN0X2VudHJ5IChpdGVyLCBzdHJ1Y3QgZGxtX2xvY2ssIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsb2NrLCBuZXh0LCAmcmVzLT5ibG9ja2VkLCBsaXN0KSB7CiAJCWlmIChsb2NrLT5tbC5ub2RlID09IGRlYWRfbm9kZSkgewogCQkJbGlzdF9kZWxfaW5pdCgmbG9jay0+bGlzdCk7CiAJCQlkbG1fbG9ja19wdXQobG9jayk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG1nbHVlLmMgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKaW5kZXggZDFiZDMwNS4uZjcxMjUwZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtZ2x1ZS5jCisrKyBiL2ZzL29jZnMyL2RsbWdsdWUuYwpAQCAtNjAwLDE1ICs2MDAsMTMgQEAKIHN0YXRpYyB2b2lkIGxvY2tyZXNfc2V0X2ZsYWdzKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcywKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3ZmxhZ3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOwotCXN0cnVjdCBvY2ZzMl9tYXNrX3dhaXRlciAqbXc7CisJc3RydWN0IG9jZnMyX21hc2tfd2FpdGVyICptdywgKnRtcDsKIAogIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvY2tyZXMtPmxfbG9jayk7CiAKIAlsb2NrcmVzLT5sX2ZsYWdzID0gbmV3ZmxhZ3M7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZsb2NrcmVzLT5sX21hc2tfd2FpdGVycykgewotCQltdyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgb2NmczJfbWFza193YWl0ZXIsIG13X2l0ZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtdywgdG1wLCAmbG9ja3Jlcy0+bF9tYXNrX3dhaXRlcnMsIG13X2l0ZW0pIHsKIAkJaWYgKChsb2NrcmVzLT5sX2ZsYWdzICYgbXctPm13X21hc2spICE9IG13LT5td19nb2FsKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2VuZGlhbi5oIGIvZnMvb2NmczIvZW5kaWFuLmgKaW5kZXggZjIyNmIyMi4uZmYyNTc2MiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZW5kaWFuLmgKKysrIGIvZnMvb2NmczIvZW5kaWFuLmgKQEAgLTMyLDYgKzMyLDExIEBACiAJKnZhciA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KCp2YXIpICsgdmFsKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGxlNjRfYWRkX2NwdShfX2xlNjQgKnZhciwgdTY0IHZhbCkKK3sKKwkqdmFyID0gY3B1X3RvX2xlNjQobGU2NF90b19jcHUoKnZhcikgKyB2YWwpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbGUzMl9hbmRfY3B1KF9fbGUzMiAqdmFyLCB1MzIgdmFsKQogewogCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSAmIHZhbCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9leHBvcnQuaCBiL2ZzL29jZnMyL2V4cG9ydC5oCmluZGV4IDViNzdlZTcuLmUwOGJlZDkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2V4cG9ydC5oCisrKyBiL2ZzL29jZnMyL2V4cG9ydC5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaWZuZGVmIE9DRlMyX0VYUE9SVF9ICiAjZGVmaW5lIE9DRlMyX0VYUE9SVF9ICiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgorCiBleHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIG9jZnMyX2V4cG9ydF9vcHM7CiAKICNlbmRpZiAvKiBPQ0ZTMl9FWFBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZXh0ZW50X21hcC5jIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCmluZGV4IGJhMmIyYWIuLjAzYzFkMzY1IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9leHRlbnRfbWFwLmMKKysrIGIvZnMvb2NmczIvZXh0ZW50X21hcC5jCkBAIC0xMDksMTcgKzEwOSwxNCBAQAogICovCiB2b2lkIG9jZnMyX2V4dGVudF9tYXBfdHJ1bmMoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGNwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47Ci0Jc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSAqZW1pOworCXN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0gKmVtaSwgKm47CiAJc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CiAJc3RydWN0IG9jZnMyX2V4dGVudF9tYXAgKmVtID0gJm9pLT5pcF9leHRlbnRfbWFwOwogCUxJU1RfSEVBRCh0bXBfbGlzdCk7CiAJdW5zaWduZWQgaW50IHJhbmdlOwogCiAJc3Bpbl9sb2NrKCZvaS0+aXBfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZlbS0+ZW1fbGlzdCkgewotCQllbWkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9leHRlbnRfbWFwX2l0ZW0sIGVpX2xpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVtaSwgbiwgJmVtLT5lbV9saXN0LCBlaV9saXN0KSB7CiAJCWlmIChlbWktPmVpX2Nwb3MgPj0gY3BvcykgewogCQkJLyogRnVsbCB0cnVuY2F0ZSBvZiB0aGlzIHJlY29yZC4gKi8KIAkJCWxpc3RfbW92ZSgmZW1pLT5laV9saXN0LCAmdG1wX2xpc3QpOwpAQCAtMTM2LDggKzEzMyw3IEBACiAJfQogCXNwaW5fdW5sb2NrKCZvaS0+aXBfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnRtcF9saXN0KSB7Ci0JCWVtaSA9IGxpc3RfZW50cnkocCwgc3RydWN0IG9jZnMyX2V4dGVudF9tYXBfaXRlbSwgZWlfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVtaSwgbiwgJnRtcF9saXN0LCBlaV9saXN0KSB7CiAJCWxpc3RfZGVsKCZlbWktPmVpX2xpc3QpOwogCQlrZnJlZShlbWkpOwogCX0KQEAgLTM3NywzNyArMzczLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZXh0ZW50IHJlY29yZCB3aGljaCBjb250YWlucyBjbHVzdGVyICN2X2NsdXN0ZXIuCi0gKiAtMSBpcyByZXR1cm5lZCBpZiBpdCB3YXMgbm90IGZvdW5kLgotICoKLSAqIFNob3VsZCB3b3JrIGZpbmUgb24gaW50ZXJpb3IgYW5kIGV4dGVyaW9yIG5vZGVzLgotICovCi1zdGF0aWMgaW50IG9jZnMyX3NlYXJjaF9leHRlbnRfbGlzdChzdHJ1Y3Qgb2NmczJfZXh0ZW50X2xpc3QgKmVsLAotCQkJCSAgICB1MzIgdl9jbHVzdGVyKQotewotCWludCByZXQgPSAtMTsKLQlpbnQgaTsKLQlzdHJ1Y3Qgb2NmczJfZXh0ZW50X3JlYyAqcmVjOwotCXUzMiByZWNfZW5kLCByZWNfc3RhcnQsIGNsdXN0ZXJzOwotCi0JZm9yKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoZWwtPmxfbmV4dF9mcmVlX3JlYyk7IGkrKykgewotCQlyZWMgPSAmZWwtPmxfcmVjc1tpXTsKLQotCQlyZWNfc3RhcnQgPSBsZTMyX3RvX2NwdShyZWMtPmVfY3Bvcyk7Ci0JCWNsdXN0ZXJzID0gb2NmczJfcmVjX2NsdXN0ZXJzKGVsLCByZWMpOwotCi0JCXJlY19lbmQgPSByZWNfc3RhcnQgKyBjbHVzdGVyczsKLQotCQlpZiAodl9jbHVzdGVyID49IHJlY19zdGFydCAmJiB2X2NsdXN0ZXIgPCByZWNfZW5kKSB7Ci0JCQlyZXQgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBpbnQgb2NmczJfZ2V0X2NsdXN0ZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiB2X2NsdXN0ZXIsCiAJCSAgICAgICB1MzIgKnBfY2x1c3RlciwgdTMyICpudW1fY2x1c3RlcnMsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgKmV4dGVudF9mbGFncykKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuYyBiL2ZzL29jZnMyL2ZpbGUuYwppbmRleCA0OTc5YjY2Li5mMDRjN2FhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmMKKysrIGIvZnMvb2NmczIvZmlsZS5jCkBAIC0yNjMsNiArMjYzLDcgQEAKIAlpbnQgc3RhdHVzOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGk7CisJdTY0IGNsdXN0ZXJfYnl0ZXM7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKIApAQCAtMjg2LDcgKzI4Nyw5IEBACiAJLyoKIAkgKiBEbyB0aGlzIGJlZm9yZSBzZXR0aW5nIGlfc2l6ZS4KIAkgKi8KLQlzdGF0dXMgPSBvY2ZzMl96ZXJvX3RhaWxfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIG5ld19pX3NpemUpOworCWNsdXN0ZXJfYnl0ZXMgPSBvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwgbmV3X2lfc2l6ZSk7CisJc3RhdHVzID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgbmV3X2lfc2l6ZSwKKwkJCQkJICAgICAgIGNsdXN0ZXJfYnl0ZXMpOwogCWlmIChzdGF0dXMpIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQlnb3RvIG91dF9jb21taXQ7CkBAIC0zMjYsOSArMzI5LDYgQEAKIAkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCiAJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X2lfc2l6ZSk7CiAKLQl1bm1hcF9tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIG5ld19pX3NpemUgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplKTsKLQogCWZlID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgZGlfYmgtPmJfZGF0YTsKIAlpZiAoIU9DRlMyX0lTX1ZBTElEX0RJTk9ERShmZSkpIHsKIAkJT0NGUzJfUk9fT05fSU5WQUxJRF9ESU5PREUoaW5vZGUtPmlfc2IsIGZlKTsKQEAgLTM2MywxNiArMzYzLDIzIEBACiAJaWYgKG5ld19pX3NpemUgPT0gbGU2NF90b19jcHUoZmUtPmlfc2l6ZSkpCiAJCWdvdG8gYmFpbDsKIAorCWRvd25fd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCiAJLyogVGhpcyBmb3JjZXMgb3RoZXIgbm9kZXMgdG8gc3luYyBhbmQgZHJvcCB0aGVpciBwYWdlcy4gRG8KIAkgKiB0aGlzIGV2ZW4gaWYgd2UgaGF2ZSBhIHRydW5jYXRlIHdpdGhvdXQgYWxsb2NhdGlvbiBjaGFuZ2UgLQogCSAqIG9jZnMyIGNsdXN0ZXIgc2l6ZXMgY2FuIGJlIG11Y2ggZ3JlYXRlciB0aGFuIHBhZ2Ugc2l6ZSwgc28KIAkgKiB3ZSBoYXZlIHRvIHRydW5jYXRlIHRoZW0gYW55d2F5LiAgKi8KIAlzdGF0dXMgPSBvY2ZzMl9kYXRhX2xvY2soaW5vZGUsIDEpOwogCWlmIChzdGF0dXMgPCAwKSB7CisJCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CiAKKwl1bm1hcF9tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIG5ld19pX3NpemUgKyBQQUdFX1NJWkUgLSAxLCAwLCAxKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCBuZXdfaV9zaXplKTsKKwogCS8qIGFscmlnaHQsIHdlJ3JlIGdvaW5nIHRvIG5lZWQgdG8gZG8gYSBmdWxsIGJsb3duIGFsbG9jIHNpemUKIAkgKiBjaGFuZ2UuIE9ycGhhbiB0aGUgaW5vZGUgc28gdGhhdCByZWNvdmVyeSBjYW4gY29tcGxldGUgdGhlCiAJICogdHJ1bmNhdGUgaWYgbmVjZXNzYXJ5LiBUaGlzIGRvZXMgdGhlIHRhc2sgb2YgbWFya2luZwpAQCAtMzk5LDYgKzQwNiw4IEBACiBiYWlsX3VubG9ja19kYXRhOgogCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAxKTsKIAorCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKwogYmFpbDoKIAogCW1sb2dfZXhpdChzdGF0dXMpOwpAQCAtNDE5LDYgKzQyOCw3IEBACiAJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgICB1MzIgKmxvZ2ljYWxfb2Zmc2V0LAogCQkJICAgICAgIHUzMiBjbHVzdGVyc190b19hZGQsCisJCQkgICAgICAgaW50IG1hcmtfdW53cml0dGVuLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZmVfYmgsCiAJCQkgICAgICAgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCSAgICAgICBzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqZGF0YV9hYywKQEAgLTQzMSw5ICs0NDEsMTMgQEAKIAllbnVtIG9jZnMyX2FsbG9jX3Jlc3RhcnRlZCByZWFzb24gPSBSRVNUQVJUX05PTkU7CiAJdTMyIGJpdF9vZmYsIG51bV9iaXRzOwogCXU2NCBibG9jazsKKwl1OCBmbGFncyA9IDA7CiAKIAlCVUdfT04oIWNsdXN0ZXJzX3RvX2FkZCk7CiAKKwlpZiAobWFya191bndyaXR0ZW4pCisJCWZsYWdzID0gT0NGUzJfRVhUX1VOV1JJVFRFTjsKKwogCWZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLCBpbm9kZSwgZmUpOwogCWlmIChmcmVlX2V4dGVudHMgPCAwKSB7CiAJCXN0YXR1cyA9IGZyZWVfZXh0ZW50czsKQEAgLTQ4Myw3ICs0OTcsNyBAQAogCSAgICAgbnVtX2JpdHMsIGJpdF9vZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpT0NGUzJfSShpbm9kZSktPmlwX2Jsa25vKTsKIAlzdGF0dXMgPSBvY2ZzMl9pbnNlcnRfZXh0ZW50KG9zYiwgaGFuZGxlLCBpbm9kZSwgZmVfYmgsCiAJCQkJICAgICAqbG9naWNhbF9vZmZzZXQsIGJsb2NrLCBudW1fYml0cywKLQkJCQkgICAgIG1ldGFfYWMpOworCQkJCSAgICAgZmxhZ3MsIG1ldGFfYWMpOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKQEAgLTUxNiwyNSArNTMwLDMxIEBACiAgKiBGb3IgYSBnaXZlbiBhbGxvY2F0aW9uLCBkZXRlcm1pbmUgd2hpY2ggYWxsb2NhdG9ycyB3aWxsIG5lZWQgdG8gYmUKICAqIGFjY2Vzc2VkLCBhbmQgbG9jayB0aGVtLCByZXNlcnZpbmcgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBiaXRzLgogICoKLSAqIENhbGxlZCBmcm9tIG9jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKCkgZm9yIGZpbGUgc3lzdGVtcyB3aGljaCBkb24ndAotICogc3VwcG9ydCBob2xlcywgYW5kIGZyb20gb2NmczJfd3JpdGUoKSBmb3IgZmlsZSBzeXN0ZW1zIHdoaWNoCi0gKiB1bmRlcnN0YW5kIHNwYXJzZSBpbm9kZXMuCisgKiBTcGFyc2UgZmlsZSBzeXN0ZW1zIGNhbGwgdGhpcyBmcm9tIG9jZnMyX3dyaXRlX2JlZ2luX25vbG9jaygpCisgKiBhbmQgb2NmczJfYWxsb2NhdGVfdW53cml0dGVuX2V4dGVudHMoKS4KKyAqCisgKiBGaWxlIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBob2xlcyBjYWxsIHRoaXMgZnJvbQorICogb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oKS4KICAqLwogaW50IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKLQkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgdTMyIGV4dGVudHNfdG9fc3BsaXQsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqZGF0YV9hYywKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiptZXRhX2FjKQogewotCWludCByZXQsIG51bV9mcmVlX2V4dGVudHM7CisJaW50IHJldCA9IDAsIG51bV9mcmVlX2V4dGVudHM7CisJdW5zaWduZWQgaW50IG1heF9yZWNzX25lZWRlZCA9IGNsdXN0ZXJzX3RvX2FkZCArIDIgKiBleHRlbnRzX3RvX3NwbGl0OwogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCiAJKm1ldGFfYWMgPSBOVUxMOwotCSpkYXRhX2FjID0gTlVMTDsKKwlpZiAoZGF0YV9hYykKKwkJKmRhdGFfYWMgPSBOVUxMOworCisJQlVHX09OKGNsdXN0ZXJzX3RvX2FkZCAhPSAwICYmIGRhdGFfYWMgPT0gTlVMTCk7CiAKIAltbG9nKDAsICJleHRlbmQgaW5vZGUgJWxsdSwgaV9zaXplID0gJWxsZCwgZGktPmlfY2x1c3RlcnMgPSAldSwgIgotCSAgICAgImNsdXN0ZXJzX3RvX2FkZCA9ICV1XG4iLAorCSAgICAgImNsdXN0ZXJzX3RvX2FkZCA9ICV1LCBleHRlbnRzX3RvX3NwbGl0ID0gJXVcbiIsCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgaV9zaXplX3JlYWQoaW5vZGUpLAotCSAgICAgbGUzMl90b19jcHUoZGktPmlfY2x1c3RlcnMpLCBjbHVzdGVyc190b19hZGQpOworCSAgICAgbGUzMl90b19jcHUoZGktPmlfY2x1c3RlcnMpLCBjbHVzdGVyc190b19hZGQsIGV4dGVudHNfdG9fc3BsaXQpOwogCiAJbnVtX2ZyZWVfZXh0ZW50cyA9IG9jZnMyX251bV9mcmVlX2V4dGVudHMob3NiLCBpbm9kZSwgZGkpOwogCWlmIChudW1fZnJlZV9leHRlbnRzIDwgMCkgewpAQCAtNTUyLDkgKzU3MiwxMiBAQAogCSAqCiAJICogTW9zdCBvZiB0aGUgdGltZSB3ZSdsbCBvbmx5IGJlIHNlZWluZyB0aGlzIDEgY2x1c3RlciBhdCBhIHRpbWUKIAkgKiBhbnl3YXkuCisJICoKKwkgKiBBbHdheXMgbG9jayBmb3IgYW55IHVud3JpdHRlbiBleHRlbnRzIC0gd2UgbWlnaHQgd2FudCB0bworCSAqIGFkZCBibG9ja3MgZHVyaW5nIGEgc3BsaXQuCiAJICovCiAJaWYgKCFudW1fZnJlZV9leHRlbnRzIHx8Ci0JICAgIChvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSAmJiBudW1fZnJlZV9leHRlbnRzIDwgY2x1c3RlcnNfdG9fYWRkKSkgeworCSAgICAob2NmczJfc3BhcnNlX2FsbG9jKG9zYikgJiYgbnVtX2ZyZWVfZXh0ZW50cyA8IG1heF9yZWNzX25lZWRlZCkpIHsKIAkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9uZXdfbWV0YWRhdGEob3NiLCBkaSwgbWV0YV9hYyk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlpZiAocmV0ICE9IC1FTk9TUEMpCkBAIC01NjMsNiArNTg2LDkgQEAKIAkJfQogCX0KIAorCWlmIChjbHVzdGVyc190b19hZGQgPT0gMCkKKwkJZ290byBvdXQ7CisKIAlyZXQgPSBvY2ZzMl9yZXNlcnZlX2NsdXN0ZXJzKG9zYiwgY2x1c3RlcnNfdG9fYWRkLCBkYXRhX2FjKTsKIAlpZiAocmV0IDwgMCkgewogCQlpZiAocmV0ICE9IC1FTk9TUEMpCkBAIC01ODUsMTQgKzYxMSwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICB1MzIgY2x1c3RlcnNfdG9fYWRkKQorc3RhdGljIGludCBfX29jZnMyX2V4dGVuZF9hbGxvY2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBsb2dpY2FsX3N0YXJ0LAorCQkJCSAgICAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgaW50IG1hcmtfdW53cml0dGVuKQogewogCWludCBzdGF0dXMgPSAwOwogCWludCByZXN0YXJ0X2Z1bmMgPSAwOwotCWludCBkcm9wX2FsbG9jX3NlbSA9IDA7CiAJaW50IGNyZWRpdHM7Ci0JdTMyIHByZXZfY2x1c3RlcnMsIGxvZ2ljYWxfc3RhcnQ7CisJdTMyIHByZXZfY2x1c3RlcnM7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUgPSBOVUxMOwogCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwpAQCAtNjA3LDcgKzYzMiw3IEBACiAJICogVGhpcyBmdW5jdGlvbiBvbmx5IGV4aXN0cyBmb3IgZmlsZSBzeXN0ZW1zIHdoaWNoIGRvbid0CiAJICogc3VwcG9ydCBob2xlcy4KIAkgKi8KLQlCVUdfT04ob2NmczJfc3BhcnNlX2FsbG9jKG9zYikpOworCUJVR19PTihtYXJrX3Vud3JpdHRlbiAmJiAhb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpOwogCiAJc3RhdHVzID0gb2NmczJfcmVhZF9ibG9jayhvc2IsIE9DRlMyX0koaW5vZGUpLT5pcF9ibGtubywgJmJoLAogCQkJCSAgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7CkBAIC02MjMsMTkgKzY0OCwxMCBAQAogCQlnb3RvIGxlYXZlOwogCX0KIAotCWxvZ2ljYWxfc3RhcnQgPSBPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnM7Ci0KIHJlc3RhcnRfYWxsOgogCUJVR19PTihsZTMyX3RvX2NwdShmZS0+aV9jbHVzdGVycykgIT0gT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzKTsKIAotCS8qIGJsb2NrcyBwZW9wZSBpbiByZWFkL3dyaXRlIGZyb20gcmVhZGluZyBvdXIgYWxsb2NhdGlvbgotCSAqIHVudGlsIHdlJ3JlIGRvbmUgY2hhbmdpbmcgaXQuIFdlIGRlcGVuZCBvbiBpX211dGV4IHRvIGJsb2NrCi0JICogb3RoZXIgZXh0ZW5kL3RydW5jYXRlIGNhbGxzIHdoaWxlIHdlJ3JlIGhlcmUuIE9yZGVyaW5nIHdydAotCSAqIHN0YXJ0X3RyYW5zIGlzIGltcG9ydGFudCBoZXJlIC0tIGFsd2F5cyBkbyBpdCBiZWZvcmUhICovCi0JZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7Ci0JZHJvcF9hbGxvY19zZW0gPSAxOwotCi0Jc3RhdHVzID0gb2NmczJfbG9ja19hbGxvY2F0b3JzKGlub2RlLCBmZSwgY2x1c3RlcnNfdG9fYWRkLCAmZGF0YV9hYywKKwlzdGF0dXMgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGZlLCBjbHVzdGVyc190b19hZGQsIDAsICZkYXRhX2FjLAogCQkJCSAgICAgICAmbWV0YV9hYyk7CiAJaWYgKHN0YXR1cykgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC02NjgsNiArNjg0LDcgQEAKIAkJCQkJICAgIGlub2RlLAogCQkJCQkgICAgJmxvZ2ljYWxfc3RhcnQsCiAJCQkJCSAgICBjbHVzdGVyc190b19hZGQsCisJCQkJCSAgICBtYXJrX3Vud3JpdHRlbiwKIAkJCQkJICAgIGJoLAogCQkJCQkgICAgaGFuZGxlLAogCQkJCQkgICAgZGF0YV9hYywKQEAgLTcyMCwxMCArNzM3LDYgQEAKIAkgICAgIE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycywgaV9zaXplX3JlYWQoaW5vZGUpKTsKIAogbGVhdmU6Ci0JaWYgKGRyb3BfYWxsb2Nfc2VtKSB7Ci0JCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKLQkJZHJvcF9hbGxvY19zZW0gPSAwOwotCX0KIAlpZiAoaGFuZGxlKSB7CiAJCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CiAJCWhhbmRsZSA9IE5VTEw7CkBAIC03NDksNiArNzYyLDI1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbG9naWNhbF9zdGFydCwKKwkJCQkgICB1MzIgY2x1c3RlcnNfdG9fYWRkLCBpbnQgbWFya191bndyaXR0ZW4pCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIGFsbG9jIHNlbSBibG9ja3MgcGVvcGUgaW4gcmVhZC93cml0ZSBmcm9tIHJlYWRpbmcgb3VyCisJICogYWxsb2NhdGlvbiB1bnRpbCB3ZSdyZSBkb25lIGNoYW5naW5nIGl0LiBXZSBkZXBlbmQgb24KKwkgKiBpX211dGV4IHRvIGJsb2NrIG90aGVyIGV4dGVuZC90cnVuY2F0ZSBjYWxscyB3aGlsZSB3ZSdyZQorCSAqIGhlcmUuCisJICovCisJZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJcmV0ID0gX19vY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwgbG9naWNhbF9zdGFydCwgY2x1c3RlcnNfdG9fYWRkLAorCQkJCQltYXJrX3Vud3JpdHRlbik7CisJdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOworCisJcmV0dXJuIHJldDsKK30KKwogLyogU29tZSBwYXJ0cyBvZiB0aGlzIHRha2VuIGZyb20gZ2VuZXJpY19jb250X2V4cGFuZCwgd2hpY2ggdHVybmVkIG91dAogICogdG8gYmUgdG9vIGZyYWdpbGUgdG8gZG8gZXhhY3RseSB3aGF0IHdlIG5lZWQgd2l0aG91dCB1cyBoYXZpbmcgdG8KICAqIHdvcnJ5IGFib3V0IHJlY3Vyc2l2ZSBsb2NraW5nIGluIC0+cHJlcGFyZV93cml0ZSgpIGFuZApAQCAtODkwLDcgKzkyMiw5IEBACiAJfQogCiAJaWYgKGNsdXN0ZXJzX3RvX2FkZCkgewotCQlyZXQgPSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwgY2x1c3RlcnNfdG9fYWRkKTsKKwkJcmV0ID0gb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsCisJCQkJCSAgICAgIE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycywKKwkJCQkJICAgICAgY2x1c3RlcnNfdG9fYWRkLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW1sb2dfZXJybm8ocmV0KTsKIAkJCWdvdG8gb3V0X3VubG9jazsKQEAgLTk5NSw2ICsxMDI5LDEzIEBACiAJCWdvdG8gYmFpbF91bmxvY2s7CiAJfQogCisJLyoKKwkgKiBUaGlzIHdpbGwgaW50ZW50aW9uYWxseSBub3Qgd2luZCB1cCBjYWxsaW5nIHZtdHJ1bmNhdGUoKSwKKwkgKiBzaW5jZSBhbGwgdGhlIHdvcmsgZm9yIGEgc2l6ZSBjaGFuZ2UgaGFzIGJlZW4gZG9uZSBhYm92ZS4KKwkgKiBPdGhlcndpc2UsIHdlIGNvdWxkIGdldCBpbnRvIHByb2JsZW1zIHdpdGggdHJ1bmNhdGUgYXMKKwkgKiBpcF9hbGxvY19zZW0gaXMgdXNlZCB0aGVyZSB0byBwcm90ZWN0IGFnYWluc3QgaV9zaXplCisJICogY2hhbmdlcy4KKwkgKi8KIAlzdGF0dXMgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CkBAIC0xMDcwLDE3ICsxMTExLDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBvY2ZzMl93cml0ZV9yZW1vdmVfc3VpZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGludCBfX29jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0Jc3RydWN0IG9jZnMyX2lub2RlX2luZm8gKm9pID0gT0NGUzJfSShpbm9kZSk7CiAJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaTsKIAogCW1sb2dfZW50cnkoIihJbm9kZSAlbGx1LCBtb2RlIDAlbylcbiIsCi0JCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpb2ktPmlwX2Jsa25vLCBpbm9kZS0+aV9tb2RlKTsKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sIGlub2RlLT5pX21vZGUpOwogCiAJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CiAJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CkBAIC0xMDg5LDE3ICsxMTI5LDExIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IG9jZnMyX3JlYWRfYmxvY2sob3NiLCBvaS0+aXBfYmxrbm8sICZiaCwgT0NGUzJfQkhfQ0FDSEVELCBpbm9kZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF90cmFuczsKLQl9Ci0KIAlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBiaCwKIAkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwotCQlnb3RvIG91dF9iaDsKKwkJZ290byBvdXRfdHJhbnM7CiAJfQogCiAJaW5vZGUtPmlfbW9kZSAmPSB+U19JU1VJRDsKQEAgLTExMTIsOCArMTE0Niw3IEBACiAJcmV0ID0gb2NmczJfam91cm5hbF9kaXJ0eShoYW5kbGUsIGJoKTsKIAlpZiAocmV0IDwgMCkKIAkJbWxvZ19lcnJubyhyZXQpOwotb3V0X2JoOgotCWJyZWxzZShiaCk7CisKIG91dF90cmFuczoKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogb3V0OgpAQCAtMTE1OSw2ICsxMTkyLDQ2MCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBvY2ZzMl9pbm9kZV9pbmZvICpvaSA9IE9DRlMyX0koaW5vZGUpOworCisJcmV0ID0gb2NmczJfcmVhZF9ibG9jayhPQ0ZTMl9TQihpbm9kZS0+aV9zYiksCisJCQkgICAgICAgb2ktPmlwX2Jsa25vLCAmYmgsIE9DRlMyX0JIX0NBQ0hFRCwgaW5vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gIF9fb2NmczJfd3JpdGVfcmVtb3ZlX3N1aWQoaW5vZGUsIGJoKTsKK291dDoKKwlicmVsc2UoYmgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBlbm91Z2ggZXh0ZW50cyB0byBjb3ZlciB0aGUgcmVnaW9uIHN0YXJ0aW5nIGF0IGJ5dGUgb2Zmc2V0CisgKiBzdGFydCBmb3IgbGVuIGJ5dGVzLiBFeGlzdGluZyBleHRlbnRzIGFyZSBza2lwcGVkLCBhbnkgZXh0ZW50cworICogYWRkZWQgYXJlIG1hcmtlZCBhcyAidW53cml0dGVuIi4KKyAqLworc3RhdGljIGludCBvY2ZzMl9hbGxvY2F0ZV91bndyaXR0ZW5fZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCWludCByZXQ7CisJdTMyIGNwb3MsIHBoeXNfY3BvcywgY2x1c3RlcnMsIGFsbG9jX3NpemU7CisKKwkvKgorCSAqIFdlIGNvbnNpZGVyIGJvdGggc3RhcnQgYW5kIGxlbiB0byBiZSBpbmNsdXNpdmUuCisJICovCisJY3BvcyA9IHN0YXJ0ID4+IE9DRlMyX1NCKGlub2RlLT5pX3NiKS0+c19jbHVzdGVyc2l6ZV9iaXRzOworCWNsdXN0ZXJzID0gb2NmczJfY2x1c3RlcnNfZm9yX2J5dGVzKGlub2RlLT5pX3NiLCBzdGFydCArIGxlbik7CisJY2x1c3RlcnMgLT0gY3BvczsKKworCXdoaWxlIChjbHVzdGVycykgeworCQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnMoaW5vZGUsIGNwb3MsICZwaHlzX2Nwb3MsCisJCQkJCSAmYWxsb2Nfc2l6ZSwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogSG9sZSBvciBleGlzdGluZyBleHRlbnQgbGVuIGNhbiBiZSBhcmJpdHJhcnksIHNvCisJCSAqIGNhcCBpdCB0byBvdXIgb3duIGFsbG9jYXRpb24gcmVxdWVzdC4KKwkJICovCisJCWlmIChhbGxvY19zaXplID4gY2x1c3RlcnMpCisJCQlhbGxvY19zaXplID0gY2x1c3RlcnM7CisKKwkJaWYgKHBoeXNfY3BvcykgeworCQkJLyoKKwkJCSAqIFdlIGFscmVhZHkgaGF2ZSBhbiBhbGxvY2F0aW9uIGF0IHRoaXMKKwkJCSAqIHJlZ2lvbiBzbyB3ZSBjYW4gc2FmZWx5IHNraXAgaXQuCisJCQkgKi8KKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCXJldCA9IF9fb2NmczJfZXh0ZW5kX2FsbG9jYXRpb24oaW5vZGUsIGNwb3MsIGFsbG9jX3NpemUsIDEpOworCQlpZiAocmV0KSB7CisJCQlpZiAocmV0ICE9IC1FTk9TUEMpCisJCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworbmV4dDoKKwkJY3BvcyArPSBhbGxvY19zaXplOworCQljbHVzdGVycyAtPSBhbGxvY19zaXplOworCX0KKworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX29jZnMyX3JlbW92ZV9pbm9kZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmgsCisJCQkJICAgICAgdTMyIGNwb3MsIHUzMiBwaHlzX2Nwb3MsIHUzMiBsZW4sCisJCQkJICAgICAgc3RydWN0IG9jZnMyX2NhY2hlZF9kZWFsbG9jX2N0eHQgKmRlYWxsb2MpCit7CisJaW50IHJldDsKKwl1NjQgcGh5c19ibGtubyA9IG9jZnMyX2NsdXN0ZXJzX3RvX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgcGh5c19jcG9zKTsKKwlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3Qgb2NmczJfYWxsb2NfY29udGV4dCAqbWV0YV9hYyA9IE5VTEw7CisJc3RydWN0IG9jZnMyX2Rpbm9kZSAqZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKWRpX2JoLT5iX2RhdGE7CisKKwlyZXQgPSBvY2ZzMl9sb2NrX2FsbG9jYXRvcnMoaW5vZGUsIGRpLCAwLCAxLCBOVUxMLCAmbWV0YV9hYyk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmdGxfaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKG9jZnMyX3RydW5jYXRlX2xvZ19uZWVkc19mbHVzaChvc2IpKSB7CisJCXJldCA9IF9fb2NmczJfZmx1c2hfdHJ1bmNhdGVfbG9nKG9zYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfUkVNT1ZFX0VYVEVOVF9DUkVESVRTKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2FjY2VzcyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKKwkJCQkgICBPQ0ZTMl9KT1VSTkFMX0FDQ0VTU19XUklURSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9jZnMyX3JlbW92ZV9leHRlbnQoaW5vZGUsIGRpX2JoLCBjcG9zLCBsZW4sIGhhbmRsZSwgbWV0YV9hYywKKwkJCQkgIGRlYWxsb2MpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJT0NGUzJfSShpbm9kZSktPmlwX2NsdXN0ZXJzIC09IGxlbjsKKwlkaS0+aV9jbHVzdGVycyA9IGNwdV90b19sZTMyKE9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyk7CisKKwlyZXQgPSBvY2ZzMl9qb3VybmFsX2RpcnR5KGhhbmRsZSwgZGlfYmgpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9jb21taXQ7CisJfQorCisJcmV0ID0gb2NmczJfdHJ1bmNhdGVfbG9nX2FwcGVuZChvc2IsIGhhbmRsZSwgcGh5c19ibGtubywgbGVuKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKK291dF9jb21taXQ6CisJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKK291dDoKKwltdXRleF91bmxvY2soJnRsX2lub2RlLT5pX211dGV4KTsKKworCWlmIChtZXRhX2FjKQorCQlvY2ZzMl9mcmVlX2FsbG9jX2NvbnRleHQobWV0YV9hYyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVHJ1bmNhdGUgYSBieXRlIHJhbmdlLCBhdm9pZGluZyBwYWdlcyB3aXRoaW4gcGFydGlhbCBjbHVzdGVycy4gVGhpcworICogcHJlc2VydmVzIHRob3NlIHBhZ2VzIGZvciB0aGUgemVyb2luZyBjb2RlIHRvIHdyaXRlIHRvLgorICovCitzdGF0aWMgdm9pZCBvY2ZzMl90cnVuY2F0ZV9jbHVzdGVyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHU2NCBieXRlX3N0YXJ0LAorCQkJCQkgdTY0IGJ5dGVfbGVuKQoreworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCWxvZmZfdCBzdGFydCwgZW5kOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKworCXN0YXJ0ID0gKGxvZmZfdClvY2ZzMl9hbGlnbl9ieXRlc190b19jbHVzdGVycyhpbm9kZS0+aV9zYiwgYnl0ZV9zdGFydCk7CisJZW5kID0gYnl0ZV9zdGFydCArIGJ5dGVfbGVuOworCWVuZCA9IGVuZCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSk7CisKKwlpZiAoc3RhcnQgPCBlbmQpIHsKKwkJdW5tYXBfbWFwcGluZ19yYW5nZShtYXBwaW5nLCBzdGFydCwgZW5kIC0gc3RhcnQsIDApOworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShtYXBwaW5nLCBzdGFydCwgZW5kIC0gMSk7CisJfQorfQorCitzdGF0aWMgaW50IG9jZnMyX3plcm9fcGFydGlhbF9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaW50IHJldCA9IDA7CisJdTY0IHRtcGVuZCwgZW5kID0gc3RhcnQgKyBsZW47CisJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CisJdW5zaWduZWQgaW50IGNzaXplID0gb3NiLT5zX2NsdXN0ZXJzaXplOworCWhhbmRsZV90ICpoYW5kbGU7CisKKwkvKgorCSAqIFRoZSAic3RhcnQiIGFuZCAiZW5kIiB2YWx1ZXMgYXJlIE5PVCBuZWNlc3NhcmlseSBwYXJ0IG9mCisJICogdGhlIHJhbmdlIHdob3NlIGFsbG9jYXRpb24gaXMgYmVpbmcgZGVsZXRlZC4gUmF0aGVyLCB0aGlzCisJICogaXMgd2hhdCB0aGUgdXNlciBwYXNzZWQgaW4gd2l0aCB0aGUgcmVxdWVzdC4gV2UgbXVzdCB6ZXJvCisJICogcGFydGlhbCBjbHVzdGVycyBoZXJlLiBUaGVyZSdzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQKKwkgKiBwaHlzaWNhbCBhbGxvY2F0aW9uIC0gdGhlIHplcm9pbmcgY29kZSBrbm93cyB0byBza2lwIGhvbGVzLgorCSAqLworCW1sb2coMCwgImJ5dGUgc3RhcnQ6ICVsbHUsIGVuZDogJWxsdVxuIiwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kKTsKKworCS8qCisJICogSWYgYm90aCBlZGdlcyBhcmUgb24gYSBjbHVzdGVyIGJvdW5kYXJ5IHRoZW4gdGhlcmUncyBubworCSAqIHplcm9pbmcgcmVxdWlyZWQgYXMgdGhlIHJlZ2lvbiBpcyBwYXJ0IG9mIHRoZSBhbGxvY2F0aW9uIHRvCisJICogYmUgdHJ1bmNhdGVkLgorCSAqLworCWlmICgoc3RhcnQgJiAoY3NpemUgLSAxKSkgPT0gMCAmJiAoZW5kICYgKGNzaXplIC0gMSkpID09IDApCisJCWdvdG8gb3V0OworCisJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9JTk9ERV9VUERBVEVfQ1JFRElUUyk7CisJaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBXZSB3YW50IHRvIGdldCB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgMXN0IGNsdXN0ZXIuCisJICovCisJdG1wZW5kID0gKHU2NClvc2ItPnNfY2x1c3RlcnNpemUgKyAoc3RhcnQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKTsKKwlpZiAodG1wZW5kID4gZW5kKQorCQl0bXBlbmQgPSBlbmQ7CisKKwltbG9nKDAsICIxc3QgcmFuZ2U6IHN0YXJ0OiAlbGx1LCB0bXBlbmQ6ICVsbHVcbiIsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LCAodW5zaWduZWQgbG9uZyBsb25nKXRtcGVuZCk7CisKKwlyZXQgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBzdGFydCwgdG1wZW5kKTsKKwlpZiAocmV0KQorCQltbG9nX2Vycm5vKHJldCk7CisKKwlpZiAodG1wZW5kIDwgZW5kKSB7CisJCS8qCisJCSAqIFRoaXMgbWF5IG1ha2Ugc3RhcnQgYW5kIGVuZCBlcXVhbCwgYnV0IHRoZSB6ZXJvaW5nCisJCSAqIGNvZGUgd2lsbCBza2lwIGFueSB3b3JrIGluIHRoYXQgY2FzZSBzbyB0aGVyZSdzIG5vCisJCSAqIG5lZWQgdG8gY2F0Y2ggaXQgdXAgaGVyZS4KKwkJICovCisJCXN0YXJ0ID0gZW5kICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKTsKKworCQltbG9nKDAsICIybmQgcmFuZ2U6IHN0YXJ0OiAlbGx1LCBlbmQ6ICVsbHVcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyllbmQpOworCisJCXJldCA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIHN0YXJ0LCBlbmQpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0KKworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCwgdTY0IGJ5dGVfc3RhcnQsCisJCQkJICAgIHU2NCBieXRlX2xlbikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgdHJ1bmNfc3RhcnQsIHRydW5jX2xlbiwgY3BvcywgcGh5c19jcG9zLCBhbGxvY19zaXplOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBvY2ZzMl9jYWNoZWRfZGVhbGxvY19jdHh0IGRlYWxsb2M7CisKKwlvY2ZzMl9pbml0X2RlYWxsb2NfY3R4dCgmZGVhbGxvYyk7CisKKwlpZiAoYnl0ZV9sZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl0cnVuY19zdGFydCA9IG9jZnMyX2NsdXN0ZXJzX2Zvcl9ieXRlcyhvc2ItPnNiLCBieXRlX3N0YXJ0KTsKKwl0cnVuY19sZW4gPSAoYnl0ZV9zdGFydCArIGJ5dGVfbGVuKSA+PiBvc2ItPnNfY2x1c3RlcnNpemVfYml0czsKKwlpZiAodHJ1bmNfbGVuID49IHRydW5jX3N0YXJ0KQorCQl0cnVuY19sZW4gLT0gdHJ1bmNfc3RhcnQ7CisJZWxzZQorCQl0cnVuY19sZW4gPSAwOworCisJbWxvZygwLCAiSW5vZGU6ICVsbHUsIHN0YXJ0OiAlbGx1LCBsZW46ICVsbHUsIGNzdGFydDogJXUsIGNsZW46ICV1XG4iLAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ5dGVfc3RhcnQsCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ5dGVfbGVuLCB0cnVuY19zdGFydCwgdHJ1bmNfbGVuKTsKKworCXJldCA9IG9jZnMyX3plcm9fcGFydGlhbF9jbHVzdGVycyhpbm9kZSwgYnl0ZV9zdGFydCwgYnl0ZV9sZW4pOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwljcG9zID0gdHJ1bmNfc3RhcnQ7CisJd2hpbGUgKHRydW5jX2xlbikgeworCQlyZXQgPSBvY2ZzMl9nZXRfY2x1c3RlcnMoaW5vZGUsIGNwb3MsICZwaHlzX2Nwb3MsCisJCQkJCSAmYWxsb2Nfc2l6ZSwgTlVMTCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGFsbG9jX3NpemUgPiB0cnVuY19sZW4pCisJCQlhbGxvY19zaXplID0gdHJ1bmNfbGVuOworCisJCS8qIE9ubHkgZG8gd29yayBmb3Igbm9uLWhvbGVzICovCisJCWlmIChwaHlzX2Nwb3MgIT0gMCkgeworCQkJcmV0ID0gX19vY2ZzMl9yZW1vdmVfaW5vZGVfcmFuZ2UoaW5vZGUsIGRpX2JoLCBjcG9zLAorCQkJCQkJCSBwaHlzX2Nwb3MsIGFsbG9jX3NpemUsCisJCQkJCQkJICZkZWFsbG9jKTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQljcG9zICs9IGFsbG9jX3NpemU7CisJCXRydW5jX2xlbiAtPSBhbGxvY19zaXplOworCX0KKworCW9jZnMyX3RydW5jYXRlX2NsdXN0ZXJfcGFnZXMoaW5vZGUsIGJ5dGVfc3RhcnQsIGJ5dGVfbGVuKTsKKworb3V0OgorCW9jZnMyX3NjaGVkdWxlX3RydW5jYXRlX2xvZ19mbHVzaChvc2IsIDEpOworCW9jZnMyX3J1bl9kZWFsbG9jcyhvc2IsICZkZWFsbG9jKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQYXJ0cyBvZiB0aGlzIGZ1bmN0aW9uIHRha2VuIGZyb20geGZzX2NoYW5nZV9maWxlX3NwYWNlKCkKKyAqLworaW50IG9jZnMyX2NoYW5nZV9maWxlX3NwYWNlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2ICpzcikKK3sKKwlpbnQgcmV0OworCXM2NCBsbGVuOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlfYmggPSBOVUxMOworCWhhbmRsZV90ICpoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBsb25nIG1heF9vZmYgPSBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCisJaWYgKChjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUDY0KSAmJgorCSAgICAhb2NmczJfd3JpdGVzX3Vud3JpdHRlbl9leHRlbnRzKG9zYikpCisJCXJldHVybiAtRU5PVFRZOworCWVsc2UgaWYgKChjbWQgPT0gT0NGUzJfSU9DX1VOUkVTVlNQIHx8IGNtZCA9PSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NCkgJiYKKwkJICFvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gLUVCQURGOworCisJaWYgKG9jZnMyX2lzX2hhcmRfcmVhZG9ubHkob3NiKSB8fCBvY2ZzMl9pc19zb2Z0X3JlYWRvbmx5KG9zYikpCisJCXJldHVybiAtRVJPRlM7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKKwkvKgorCSAqIFRoaXMgcHJldmVudHMgY29uY3VycmVudCB3cml0ZXMgb24gb3RoZXIgbm9kZXMKKwkgKi8KKwlyZXQgPSBvY2ZzMl9yd19sb2NrKGlub2RlLCAxKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCWlmIChyZXQpIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dF9yd191bmxvY2s7CisJfQorCisJaWYgKGlub2RlLT5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkgeworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCXN3aXRjaCAoc3ItPmxfd2hlbmNlKSB7CisJY2FzZSAwOiAvKlNFRUtfU0VUKi8KKwkJYnJlYWs7CisJY2FzZSAxOiAvKlNFRUtfQ1VSKi8KKwkJc3ItPmxfc3RhcnQgKz0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMjogLypTRUVLX0VORCovCisJCXNyLT5sX3N0YXJ0ICs9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJfQorCXNyLT5sX3doZW5jZSA9IDA7CisKKwlsbGVuID0gc3ItPmxfbGVuID4gMCA/IHNyLT5sX2xlbiAtIDEgOiBzci0+bF9sZW47CisKKwlpZiAoc3ItPmxfc3RhcnQgPCAwCisJICAgIHx8IHNyLT5sX3N0YXJ0ID4gbWF4X29mZgorCSAgICB8fCAoc3ItPmxfc3RhcnQgKyBsbGVuKSA8IDAKKwkgICAgfHwgKHNyLT5sX3N0YXJ0ICsgbGxlbikgPiBtYXhfb2ZmKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCWlmIChjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUCB8fCBjbWQgPT0gT0NGUzJfSU9DX1JFU1ZTUDY0KSB7CisJCWlmIChzci0+bF9sZW4gPD0gMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCQl9CisJfQorCisJaWYgKHNob3VsZF9yZW1vdmVfc3VpZChmaWxlLT5mX3BhdGguZGVudHJ5KSkgeworCQlyZXQgPSBfX29jZnMyX3dyaXRlX3JlbW92ZV9zdWlkKGlub2RlLCBkaV9iaCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCQl9CisJfQorCisJZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A6CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQNjQ6CisJCS8qCisJCSAqIFRoaXMgdGFrZXMgdW5zaWduZWQgb2Zmc2V0cywgYnV0IHRoZSBzaWduZWQgb25lcyB3ZQorCQkgKiBwYXNzIGhhdmUgYmVlbiBjaGVja2VkIGFnYWluc3Qgb3ZlcmZsb3cgYWJvdmUuCisJCSAqLworCQlyZXQgPSBvY2ZzMl9hbGxvY2F0ZV91bndyaXR0ZW5fZXh0ZW50cyhpbm9kZSwgc3ItPmxfc3RhcnQsCisJCQkJCQkgICAgICAgc3ItPmxfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBPQ0ZTMl9JT0NfVU5SRVNWU1A6CisJY2FzZSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NDoKKwkJcmV0ID0gb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKGlub2RlLCBkaV9iaCwgc3ItPmxfc3RhcnQsCisJCQkJCSAgICAgICBzci0+bF9sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwl1cF93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisJaWYgKHJldCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCS8qCisJICogV2UgdXBkYXRlIGMvbXRpbWUgZm9yIHRoZXNlIGNoYW5nZXMKKwkgKi8KKwloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0X21ldGFfdW5sb2NrOworCX0KKworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJcmV0ID0gb2NmczJfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlLCBkaV9iaCk7CisJaWYgKHJldCA8IDApCisJCW1sb2dfZXJybm8ocmV0KTsKKworCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7CisKK291dF9tZXRhX3VubG9jazoKKwlicmVsc2UoZGlfYmgpOworCW9jZnMyX21ldGFfdW5sb2NrKGlub2RlLCAxKTsKK291dF9yd191bmxvY2s6CisJb2NmczJfcndfdW5sb2NrKGlub2RlLCAxKTsKKworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCQkgbG9mZl90ICpwcG9zLAogCQkJCQkgc2l6ZV90IGNvdW50LApAQCAtMTMyOSwxNSArMTgxNiwxNiBAQAogCSpiYXNlcCA9IGJhc2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqIG9jZnMyX2dldF93cml0ZV9zb3VyY2Uoc3RydWN0IG9jZnMyX2J1ZmZlcmVkX3dyaXRlX3ByaXYgKmJwLAorc3RhdGljIHN0cnVjdCBwYWdlICogb2NmczJfZ2V0X3dyaXRlX3NvdXJjZShjaGFyICoqcmV0X3NyY19idWYsCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmN1cl9pb3YsCiAJCQkJCSAgICBzaXplX3QgaW92X29mZnNldCkKIHsKIAlpbnQgcmV0OwotCWNoYXIgKmJ1ZjsKKwljaGFyICpidWYgPSBjdXJfaW92LT5pb3ZfYmFzZSArIGlvdl9vZmZzZXQ7CiAJc3RydWN0IHBhZ2UgKnNyY19wYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG9mZjsKIAotCWJ1ZiA9IGN1cl9pb3YtPmlvdl9iYXNlICsgaW92X29mZnNldDsKKwlvZmYgPSAodW5zaWduZWQgbG9uZykoYnVmKSAmIH5QQUdFX0NBQ0hFX01BU0s7CiAKIAlpZiAoIXNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpIHsKIAkJLyoKQEAgLTEzNDksMTggKzE4MzcsMTcgQEAKIAkJCQkgICAgICh1bnNpZ25lZCBsb25nKWJ1ZiAmIFBBR0VfQ0FDSEVfTUFTSywgMSwKIAkJCQkgICAgIDAsIDAsICZzcmNfcGFnZSwgTlVMTCk7CiAJCWlmIChyZXQgPT0gMSkKLQkJCWJwLT5iX3NyY19idWYgPSBrbWFwKHNyY19wYWdlKTsKKwkJCSpyZXRfc3JjX2J1ZiA9IGttYXAoc3JjX3BhZ2UpICsgb2ZmOwogCQllbHNlCiAJCQlzcmNfcGFnZSA9IEVSUl9QVFIoLUVGQVVMVCk7CiAJfSBlbHNlIHsKLQkJYnAtPmJfc3JjX2J1ZiA9IGJ1ZjsKKwkJKnJldF9zcmNfYnVmID0gYnVmOwogCX0KIAogCXJldHVybiBzcmNfcGFnZTsKIH0KIAotc3RhdGljIHZvaWQgb2NmczJfcHV0X3dyaXRlX3NvdXJjZShzdHJ1Y3Qgb2NmczJfYnVmZmVyZWRfd3JpdGVfcHJpdiAqYnAsCi0JCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBvY2ZzMl9wdXRfd3JpdGVfc291cmNlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWlmIChwYWdlKSB7CiAJCWt1bm1hcChwYWdlKTsKQEAgLTEzNzYsMTAgKzE4NjMsMTIgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzc2l6ZV90IGNvcGllZCwgdG90YWwgPSAwOwotCXNpemVfdCBpb3Zfb2Zmc2V0ID0gMDsKKwlzaXplX3QgaW92X29mZnNldCA9IDAsIGJ5dGVzOworCWxvZmZfdCBwb3M7CiAJY29uc3Qgc3RydWN0IGlvdmVjICpjdXJfaW92ID0gaW92OwotCXN0cnVjdCBvY2ZzMl9idWZmZXJlZF93cml0ZV9wcml2IGJwOwotCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBwYWdlICp1c2VyX3BhZ2UsICpwYWdlOworCWNoYXIgKmJ1ZiwgKmRzdDsKKwl2b2lkICpmc2RhdGE7CiAKIAkvKgogCSAqIGhhbmRsZSBwYXJ0aWFsIERJTyB3cml0ZS4gIEFkanVzdCBjdXJfaW92IGlmIG5lZWRlZC4KQEAgLTEzODcsMjEgKzE4NzYsMzggQEAKIAlvY2ZzMl9zZXRfbmV4dF9pb3ZlYygmY3VyX2lvdiwgJmlvdl9vZmZzZXQsIG9fZGlyZWN0X3dyaXR0ZW4pOwogCiAJZG8gewotCQlicC5iX2N1cl9vZmYgPSBpb3Zfb2Zmc2V0OwotCQlicC5iX2N1cl9pb3YgPSBjdXJfaW92OworCQlwb3MgPSAqcHBvczsKIAotCQlwYWdlID0gb2NmczJfZ2V0X3dyaXRlX3NvdXJjZSgmYnAsIGN1cl9pb3YsIGlvdl9vZmZzZXQpOwotCQlpZiAoSVNfRVJSKHBhZ2UpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOworCQl1c2VyX3BhZ2UgPSBvY2ZzMl9nZXRfd3JpdGVfc291cmNlKCZidWYsIGN1cl9pb3YsIGlvdl9vZmZzZXQpOworCQlpZiAoSVNfRVJSKHVzZXJfcGFnZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIodXNlcl9wYWdlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJY29waWVkID0gb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihmaWxlLCAqcHBvcywgY291bnQsCi0JCQkJCQkgICAgICBvY2ZzMl9tYXBfYW5kX3dyaXRlX3VzZXJfZGF0YSwKLQkJCQkJCSAgICAgICZicCk7CisJCS8qIFN0YXkgd2l0aGluIG91ciBwYWdlIGJvdW5kYXJpZXMgKi8KKwkJYnl0ZXMgPSBtaW4oKFBBR0VfQ0FDSEVfU0laRSAtICgodW5zaWduZWQgbG9uZylwb3MgJiB+UEFHRV9DQUNIRV9NQVNLKSksCisJCQkgICAgKFBBR0VfQ0FDSEVfU0laRSAtICgodW5zaWduZWQgbG9uZylidWYgJiB+UEFHRV9DQUNIRV9NQVNLKSkpOworCQkvKiBTdGF5IHdpdGhpbiB0aGUgdmVjdG9yIGJvdW5kYXJ5ICovCisJCWJ5dGVzID0gbWluX3Qoc2l6ZV90LCBieXRlcywgY3VyX2lvdi0+aW92X2xlbiAtIGlvdl9vZmZzZXQpOworCQkvKiBTdGF5IHdpdGhpbiBjb3VudCAqLworCQlieXRlcyA9IG1pbihieXRlcywgY291bnQpOwogCi0JCW9jZnMyX3B1dF93cml0ZV9zb3VyY2UoJmJwLCBwYWdlKTsKKwkJcGFnZSA9IE5VTEw7CisJCXJldCA9IG9jZnMyX3dyaXRlX2JlZ2luKGZpbGUsIGZpbGUtPmZfbWFwcGluZywgcG9zLCBieXRlcywgMCwKKwkJCQkJJnBhZ2UsICZmc2RhdGEpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQogCisJCWRzdCA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtY3B5KGRzdCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpLCBidWYsIGJ5dGVzKTsKKwkJa3VubWFwX2F0b21pYyhkc3QsIEtNX1VTRVIwKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCW9jZnMyX3B1dF93cml0ZV9zb3VyY2UodXNlcl9wYWdlKTsKKworCQljb3BpZWQgPSBvY2ZzMl93cml0ZV9lbmQoZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBwb3MsIGJ5dGVzLAorCQkJCQkgYnl0ZXMsIHBhZ2UsIGZzZGF0YSk7CiAJCWlmIChjb3BpZWQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKGNvcGllZCk7CiAJCQlyZXQgPSBjb3BpZWQ7CkBAIC0xNDA5LDcgKzE5MTUsNyBAQAogCQl9CiAKIAkJdG90YWwgKz0gY29waWVkOwotCQkqcHBvcyA9ICpwcG9zICsgY29waWVkOworCQkqcHBvcyA9IHBvcyArIGNvcGllZDsKIAkJY291bnQgLT0gY29waWVkOwogCiAJCW9jZnMyX3NldF9uZXh0X2lvdmVjKCZjdXJfaW92LCAmaW92X29mZnNldCwgY29waWVkKTsKQEAgLTE1NzksNTIgKzIwODUsNDYgQEAKIAkJCQkgICAgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCiAJCQkJICAgIHN0cnVjdCBzcGxpY2VfZGVzYyAqc2QpCiB7Ci0JaW50IHJldCwgY291bnQsIHRvdGFsID0gMDsKKwlpbnQgcmV0LCBjb3VudDsKIAlzc2l6ZV90IGNvcGllZCA9IDA7Ci0Jc3RydWN0IG9jZnMyX3NwbGljZV93cml0ZV9wcml2IHNwOworCXN0cnVjdCBmaWxlICpmaWxlID0gc2QtPnUuZmlsZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl2b2lkICpmc2RhdGE7CisJY2hhciAqc3JjLCAqZHN0OwogCiAJcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCXNwLnNfc2QgPSBzZDsKLQlzcC5zX2J1ZiA9IGJ1ZjsKLQlzcC5zX3BpcGUgPSBwaXBlOwotCXNwLnNfb2Zmc2V0ID0gc2QtPnBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7Ci0Jc3Auc19idWZfb2Zmc2V0ID0gYnVmLT5vZmZzZXQ7Ci0KKwlvZmZzZXQgPSBzZC0+cG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKIAljb3VudCA9IHNkLT5sZW47Ci0JaWYgKGNvdW50ICsgc3Auc19vZmZzZXQgPiBQQUdFX0NBQ0hFX1NJWkUpCi0JCWNvdW50ID0gUEFHRV9DQUNIRV9TSVpFIC0gc3Auc19vZmZzZXQ7CisJaWYgKGNvdW50ICsgb2Zmc2V0ID4gUEFHRV9DQUNIRV9TSVpFKQorCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKIAotCWRvIHsKLQkJLyoKLQkJICogc3BsaWNlIHdhbnRzIHVzIHRvIGNvcHkgdXAgdG8gb25lIHBhZ2UgYXQgYQotCQkgKiB0aW1lLiBGb3IgcGFnZXNpemUgPiBjbHVzdGVyIHNpemUsIHRoaXMgbWVhbnMgd2UKLQkJICogbWlnaHQgZW50ZXIgb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcigpIG1vcmUKLQkJICogdGhhbiBvbmNlLCBzbyBrZWVwIHRyYWNrIG9mIG91ciBwcm9ncmVzcyBoZXJlLgotCQkgKi8KLQkJY29waWVkID0gb2NmczJfYnVmZmVyZWRfd3JpdGVfY2x1c3RlcihzZC0+dS5maWxlLAotCQkJCQkJICAgICAgKGxvZmZfdClzZC0+cG9zICsgdG90YWwsCi0JCQkJCQkgICAgICBjb3VudCwKLQkJCQkJCSAgICAgIG9jZnMyX21hcF9hbmRfd3JpdGVfc3BsaWNlX2RhdGEsCi0JCQkJCQkgICAgICAmc3ApOwotCQlpZiAoY29waWVkIDwgMCkgewotCQkJbWxvZ19lcnJubyhjb3BpZWQpOwotCQkJcmV0ID0gY29waWVkOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbihmaWxlLCBmaWxlLT5mX21hcHBpbmcsIHNkLT5wb3MsIGNvdW50LCAwLAorCQkJCSZwYWdlLCAmZnNkYXRhKTsKKwlpZiAocmV0KSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQogCi0JCWNvdW50IC09IGNvcGllZDsKLQkJc3Auc19vZmZzZXQgKz0gY29waWVkOwotCQlzcC5zX2J1Zl9vZmZzZXQgKz0gY29waWVkOwotCQl0b3RhbCArPSBjb3BpZWQ7Ci0JfSB3aGlsZSAoY291bnQpOworCXNyYyA9IGJ1Zi0+b3BzLT5tYXAocGlwZSwgYnVmLCAxKTsKKwlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJbWVtY3B5KGRzdCArIG9mZnNldCwgc3JjICsgYnVmLT5vZmZzZXQsIGNvdW50KTsKKwlrdW5tYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwlidWYtPm9wcy0+dW5tYXAocGlwZSwgYnVmLCBzcmMpOwogCi0JcmV0ID0gMDsKKwljb3BpZWQgPSBvY2ZzMl93cml0ZV9lbmQoZmlsZSwgZmlsZS0+Zl9tYXBwaW5nLCBzZC0+cG9zLCBjb3VudCwgY291bnQsCisJCQkJIHBhZ2UsIGZzZGF0YSk7CisJaWYgKGNvcGllZCA8IDApIHsKKwkJbWxvZ19lcnJubyhjb3BpZWQpOworCQlyZXQgPSBjb3BpZWQ7CisJCWdvdG8gb3V0OworCX0KIG91dDoKIAotCXJldHVybiB0b3RhbCA/IHRvdGFsIDogcmV0OworCXJldHVybiBjb3BpZWQgPyBjb3BpZWQgOiByZXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IF9fb2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2ZpbGUuaCBiL2ZzL29jZnMyL2ZpbGUuaAppbmRleCBhNGRkMWZhLi4zNmZlMjdmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9maWxlLmgKKysrIGIvZnMvb2NmczIvZmlsZS5oCkBAIC0zOSwxNSArMzksMTYgQEAKIH07CiBpbnQgb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24oc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCiAJCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICB1MzIgKmNsdXN0ZXJfc3RhcnQsCisJCQkgICAgICAgdTMyICpsb2dpY2FsX29mZnNldCwKIAkJCSAgICAgICB1MzIgY2x1c3RlcnNfdG9fYWRkLAorCQkJICAgICAgIGludCBtYXJrX3Vud3JpdHRlbiwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZlX2JoLAogCQkJICAgICAgIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKmRhdGFfYWMsCiAJCQkgICAgICAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKm1ldGFfYWMsCi0JCQkgICAgICAgZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgKnJlYXNvbik7CisJCQkgICAgICAgZW51bSBvY2ZzMl9hbGxvY19yZXN0YXJ0ZWQgKnJlYXNvbl9yZXQpOwogaW50IG9jZnMyX2xvY2tfYWxsb2NhdG9ycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb2NmczJfZGlub2RlICpkaSwKLQkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwKKwkJCSAgdTMyIGNsdXN0ZXJzX3RvX2FkZCwgdTMyIGV4dGVudHNfdG9fc3BsaXQsCiAJCQkgIHN0cnVjdCBvY2ZzMl9hbGxvY19jb250ZXh0ICoqZGF0YV9hYywKIAkJCSAgc3RydWN0IG9jZnMyX2FsbG9jX2NvbnRleHQgKiptZXRhX2FjKTsKIGludCBvY2ZzMl9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKQEAgLTYxLDQgKzYyLDcgQEAKIGludCBvY2ZzMl91cGRhdGVfaW5vZGVfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiAKK2ludCBvY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiAqc3IpOworCiAjZW5kaWYgLyogT0NGUzJfRklMRV9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9oZWFydGJlYXQuYyBiL2ZzL29jZnMyL2hlYXJ0YmVhdC5jCmluZGV4IGIyNWVmNjMuLjM1MmViNGEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2hlYXJ0YmVhdC5jCisrKyBiL2ZzL29jZnMyL2hlYXJ0YmVhdC5jCkBAIC0xNTcsMTYgKzE1NywxNiBAQAogCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQogCQlyZXR1cm4gMDsKIAotCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX2Rvd24pOworCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX2Rvd24pOwogCWlmIChzdGF0dXMgPCAwKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KIAotCXN0YXR1cyA9IG8yaGJfcmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX3VwKTsKKwlzdGF0dXMgPSBvMmhiX3JlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl91cCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX2Rvd24pOworCQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2sob3NiLT51dWlkX3N0ciwgJm9zYi0+b3NiX2hiX2Rvd24pOwogCX0KIAogYmFpbDoKQEAgLTE3OCw4ICsxNzgsOCBAQAogCWlmIChvY2ZzMl9tb3VudF9sb2NhbChvc2IpKQogCQlyZXR1cm47CiAKLQlvMmhiX3VucmVnaXN0ZXJfY2FsbGJhY2soJm9zYi0+b3NiX2hiX2Rvd24pOwotCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjaygmb3NiLT5vc2JfaGJfdXApOworCW8yaGJfdW5yZWdpc3Rlcl9jYWxsYmFjayhvc2ItPnV1aWRfc3RyLCAmb3NiLT5vc2JfaGJfZG93bik7CisJbzJoYl91bnJlZ2lzdGVyX2NhbGxiYWNrKG9zYi0+dXVpZF9zdHIsICZvc2ItPm9zYl9oYl91cCk7CiB9CiAKIHZvaWQgb2NmczJfc3RvcF9oZWFydGJlYXQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IpCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pb2N0bC5jIGIvZnMvb2NmczIvaW9jdGwuYwppbmRleCBmM2FkMjFhLi5iZDY4YzNmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pb2N0bC5jCisrKyBiL2ZzL29jZnMyL2lvY3RsLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJvY2ZzMi5oIgogI2luY2x1ZGUgImFsbG9jLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgorI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgImpvdXJuYWwuaCIKIApAQCAtMTE1LDYgKzExNiw3IEBACiB7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCWludCBzdGF0dXM7CisJc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3Ygc3I7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgT0NGUzJfSU9DX0dFVEZMQUdTOgpAQCAtMTMwLDYgKzEzMiwxNCBAQAogCiAJCXJldHVybiBvY2ZzMl9zZXRfaW5vZGVfYXR0cihpbm9kZSwgZmxhZ3MsCiAJCQlPQ0ZTMl9GTF9NT0RJRklBQkxFKTsKKwljYXNlIE9DRlMyX0lPQ19SRVNWU1A6CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQNjQ6CisJY2FzZSBPQ0ZTMl9JT0NfVU5SRVNWU1A6CisJY2FzZSBPQ0ZTMl9JT0NfVU5SRVNWU1A2NDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzciwgKGludCBfX3VzZXIgKikgYXJnLCBzaXplb2Yoc3IpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBvY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShmaWxwLCBjbWQsICZzcik7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CiAJfQpAQCAtMTQ4LDYgKzE1OCwxMSBAQAogCWNhc2UgT0NGUzJfSU9DMzJfU0VURkxBR1M6CiAJCWNtZCA9IE9DRlMyX0lPQ19TRVRGTEFHUzsKIAkJYnJlYWs7CisJY2FzZSBPQ0ZTMl9JT0NfUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1JFU1ZTUDY0OgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQOgorCWNhc2UgT0NGUzJfSU9DX1VOUkVTVlNQNjQ6CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvam91cm5hbC5jIGIvZnMvb2NmczIvam91cm5hbC5jCmluZGV4IGRjMTE4ODAuLmRiZmIyMGIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2pvdXJuYWwuYworKysgYi9mcy9vY2ZzMi9qb3VybmFsLmMKQEAgLTcyMiw4ICs3MjIsNyBAQAogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG9jZnMyX2pvdXJuYWwsIGpfcmVjb3Zlcnlfd29yayk7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBqb3VybmFsLT5qX29zYjsKIAlzdHJ1Y3Qgb2NmczJfZGlub2RlICpsYV9kaW5vZGUsICp0bF9kaW5vZGU7Ci0Jc3RydWN0IG9jZnMyX2xhX3JlY292ZXJ5X2l0ZW0gKml0ZW07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisJc3RydWN0IG9jZnMyX2xhX3JlY292ZXJ5X2l0ZW0gKml0ZW0sICpuOwogCUxJU1RfSEVBRCh0bXBfbGFfbGlzdCk7CiAKIAltbG9nX2VudHJ5X3ZvaWQoKTsKQEAgLTczNCw4ICs3MzMsNyBAQAogCWxpc3Rfc3BsaWNlX2luaXQoJmpvdXJuYWwtPmpfbGFfY2xlYW51cHMsICZ0bXBfbGFfbGlzdCk7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJnRtcF9sYV9saXN0KSB7Ci0JCWl0ZW0gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBvY2ZzMl9sYV9yZWNvdmVyeV9pdGVtLCBscmlfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0ZW0sIG4sICZ0bXBfbGFfbGlzdCwgbHJpX2xpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmaXRlbS0+bHJpX2xpc3QpOwogCiAJCW1sb2coMCwgIkNvbXBsZXRlIHJlY292ZXJ5IGZvciBzbG90ICVkXG4iLCBpdGVtLT5scmlfc2xvdCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9qb3VybmFsLmggYi9mcy9vY2ZzMi9qb3VybmFsLmgKaW5kZXggM2RiNWRlNC4uY2U2MGFhYiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvam91cm5hbC5oCisrKyBiL2ZzL29jZnMyL2pvdXJuYWwuaApAQCAtMjg5LDYgKzI4OSw4IEBACiAjZGVmaW5lIE9DRlMyX1RSVU5DQVRFX0xPR19GTFVTSF9PTkVfUkVDIChPQ0ZTMl9TVUJBTExPQ19GUkVFIAkJICAgICAgXAogCQkJCQkgKyBPQ0ZTMl9UUlVOQ0FURV9MT0dfVVBEQVRFKQogCisjZGVmaW5lIE9DRlMyX1JFTU9WRV9FWFRFTlRfQ1JFRElUUyAoT0NGUzJfVFJVTkNBVEVfTE9HX1VQREFURSArIE9DRlMyX0lOT0RFX1VQREFURV9DUkVESVRTKQorCiAvKiBkYXRhIGJsb2NrIGZvciBuZXcgZGlyL3N5bWxpbmssIDIgZm9yIGJpdG1hcCB1cGRhdGVzIChiaXRtYXAgZmUgKwogICogYml0bWFwIGJsb2NrIGZvciB0aGUgbmV3IGJpdCkgKi8KICNkZWZpbmUgT0NGUzJfRElSX0xJTktfQURESVRJT05BTF9DUkVESVRTICgxICsgMikKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL21tYXAuYyBiL2ZzL29jZnMyL21tYXAuYwppbmRleCBhZjAxMTU4Li5kNzlhYTEyIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9tbWFwLmMKKysrIGIvZnMvb2NmczIvbW1hcC5jCkBAIC0zNywxMSArMzcsMjkgQEAKIAogI2luY2x1ZGUgIm9jZnMyLmgiCiAKKyNpbmNsdWRlICJhb3BzLmgiCiAjaW5jbHVkZSAiZGxtZ2x1ZS5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUgIm1tYXAuaCIKIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfdm1fb3BfYmxvY2tfc2lncyhzaWdzZXRfdCAqYmxvY2tlZCwgc2lnc2V0X3QgKm9sZHNldCkKK3sKKwkvKiBUaGUgYmVzdCB3YXkgdG8gZGVhbCB3aXRoIHNpZ25hbHMgaW4gdGhlIHZtIHBhdGggaXMKKwkgKiB0byBibG9jayB0aGVtIHVwZnJvbnQsIHJhdGhlciB0aGFuIGFsbG93aW5nIHRoZQorCSAqIGxvY2tpbmcgcGF0aHMgdG8gcmV0dXJuIC1FUkVTVEFSVFNZUy4gKi8KKwlzaWdmaWxsc2V0KGJsb2NrZWQpOworCisJLyogV2Ugc2hvdWxkIHRlY2huaWNhbGx5IG5ldmVyIGdldCBhIGJhZCByZXR1cm4gdmFsdWUKKwkgKiBmcm9tIHNpZ3Byb2NtYXNrICovCisJcmV0dXJuIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgYmxvY2tlZCwgb2xkc2V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2NmczJfdm1fb3BfdW5ibG9ja19zaWdzKHNpZ3NldF90ICpvbGRzZXQpCit7CisJcmV0dXJuIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBvbGRzZXQsIE5VTEwpOworfQorCiBzdGF0aWMgc3RydWN0IHBhZ2UgKm9jZnMyX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiBhcmVhLAogCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJIGludCAqdHlwZSkKQEAgLTUzLDE0ICs3MSw3IEBACiAJbWxvZ19lbnRyeSgiKGFyZWE9JXAsIGFkZHJlc3M9JWx1LCB0eXBlPSVwKVxuIiwgYXJlYSwgYWRkcmVzcywKIAkJICAgdHlwZSk7CiAKLQkvKiBUaGUgYmVzdCB3YXkgdG8gZGVhbCB3aXRoIHNpZ25hbHMgaW4gdGhpcyBwYXRoIGlzCi0JICogdG8gYmxvY2sgdGhlbSB1cGZyb250LCByYXRoZXIgdGhhbiBhbGxvd2luZyB0aGUKLQkgKiBsb2NraW5nIHBhdGhzIHRvIHJldHVybiAtRVJFU1RBUlRTWVMuICovCi0Jc2lnZmlsbHNldCgmYmxvY2tlZCk7Ci0KLQkvKiBXZSBzaG91bGQgdGVjaG5pY2FsbHkgbmV2ZXIgZ2V0IGEgYmFkIHJldCByZXR1cm4KLQkgKiBmcm9tIHNpZ3Byb2NtYXNrICovCi0JcmV0ID0gc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYmxvY2tlZCwgJm9sZHNldCk7CisJcmV0ID0gb2NmczJfdm1fb3BfYmxvY2tfc2lncygmYmxvY2tlZCwgJm9sZHNldCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIG91dDsKQEAgLTY4LDcgKzc5LDcgQEAKIAogCXBhZ2UgPSBmaWxlbWFwX25vcGFnZShhcmVhLCBhZGRyZXNzLCB0eXBlKTsKIAotCXJldCA9IHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkc2V0LCBOVUxMKTsKKwlyZXQgPSBvY2ZzMl92bV9vcF91bmJsb2NrX3NpZ3MoJm9sZHNldCk7CiAJaWYgKHJldCA8IDApCiAJCW1sb2dfZXJybm8ocmV0KTsKIG91dDoKQEAgLTc2LDI3ICs4NywxMzUgQEAKIAlyZXR1cm4gcGFnZTsKIH0KIAorc3RhdGljIGludCBfX29jZnMyX3BhZ2VfbWt3cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoLAorCQkJCXN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWxvZmZfdCBwb3MgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGludCBsZW4gPSBQQUdFX0NBQ0hFX1NJWkU7CisJcGdvZmZfdCBsYXN0X2luZGV4OworCXN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSA9IE5VTEw7CisJdm9pZCAqZnNkYXRhOworCWxvZmZfdCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCisJLyoKKwkgKiBBbm90aGVyIG5vZGUgbWlnaHQgaGF2ZSB0cnVuY2F0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIG9uCisJICogY2x1c3RlciBsb2Nrcy4KKwkgKi8KKwlsYXN0X2luZGV4ID0gc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWlmIChwYWdlLT5pbmRleCA+IGxhc3RfaW5kZXgpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgaV9zaXplIGNoZWNrIGFib3ZlIGRvZXNuJ3QgY2F0Y2ggdGhlIGNhc2Ugd2hlcmUgbm9kZXMKKwkgKiB0cnVuY2F0ZWQgYW5kIHRoZW4gcmUtZXh0ZW5kZWQgdGhlIGZpbGUuIFdlJ2xsIHJlLWNoZWNrIHRoZQorCSAqIHBhZ2UgbWFwcGluZyBhZnRlciB0YWtpbmcgdGhlIHBhZ2UgbG9jayBpbnNpZGUgb2YKKwkgKiBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2soKS4KKwkgKi8KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBwYWdlLT5tYXBwaW5nICE9IGlub2RlLT5pX21hcHBpbmcpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBDYWxsIG9jZnMyX3dyaXRlX2JlZ2luKCkgYW5kIG9jZnMyX3dyaXRlX2VuZCgpIHRvIHRha2UKKwkgKiBhZHZhbnRhZ2Ugb2YgdGhlIGFsbG9jYXRpb24gY29kZSB0aGVyZS4gV2UgcGFzcyBhIHdyaXRlCisJICogbGVuZ3RoIG9mIHRoZSB3aG9sZSBwYWdlIChjaG9wcGVkIHRvIGlfc2l6ZSkgdG8gbWFrZSBzdXJlCisJICogdGhlIHdob2xlIHRoaW5nIGlzIGFsbG9jYXRlZC4KKwkgKgorCSAqIFNpbmNlIHdlIGtub3cgdGhlIHBhZ2UgaXMgdXAgdG8gZGF0ZSwgd2UgZG9uJ3QgaGF2ZSB0bworCSAqIHdvcnJ5IGFib3V0IG9jZnMyX3dyaXRlX2JlZ2luKCkgc2tpcHBpbmcgc29tZSBidWZmZXIgcmVhZHMKKwkgKiBiZWNhdXNlIHRoZSAid3JpdGUiIHdvdWxkIGludmFsaWRhdGUgdGhlaXIgZGF0YS4KKwkgKi8KKwlpZiAocGFnZS0+aW5kZXggPT0gbGFzdF9pbmRleCkKKwkJbGVuID0gc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisKKwlyZXQgPSBvY2ZzMl93cml0ZV9iZWdpbl9ub2xvY2sobWFwcGluZywgcG9zLCBsZW4sIDAsICZsb2NrZWRfcGFnZSwKKwkJCQkgICAgICAgJmZzZGF0YSwgZGlfYmgsIHBhZ2UpOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCAhPSAtRU5PU1BDKQorCQkJbWxvZ19lcnJubyhyZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBvY2ZzMl93cml0ZV9lbmRfbm9sb2NrKG1hcHBpbmcsIHBvcywgbGVuLCBsZW4sIGxvY2tlZF9wYWdlLAorCQkJCSAgICAgZnNkYXRhKTsKKwlpZiAocmV0IDwgMCkgeworCQltbG9nX2Vycm5vKHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlCVUdfT04ocmV0ICE9IGxlbik7CisJcmV0ID0gMDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9jZnMyX3BhZ2VfbWt3cml0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpX2JoID0gTlVMTDsKKwlzaWdzZXRfdCBibG9ja2VkLCBvbGRzZXQ7CisJaW50IHJldCwgcmV0MjsKKworCXJldCA9IG9jZnMyX3ZtX29wX2Jsb2NrX3NpZ3MoJmJsb2NrZWQsICZvbGRzZXQpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFRoZSBjbHVzdGVyIGxvY2tzIHRha2VuIHdpbGwgYmxvY2sgYSB0cnVuY2F0ZSBmcm9tIGFub3RoZXIKKwkgKiBub2RlLiBUYWtpbmcgdGhlIGRhdGEgbG9jayB3aWxsIGFsc28gZW5zdXJlIHRoYXQgd2UgZG9uJ3QKKwkgKiBhdHRlbXB0IHBhZ2UgdHJ1bmNhdGlvbiBhcyBwYXJ0IG9mIGEgZG93bmNvbnZlcnQuCisJICovCisJcmV0ID0gb2NmczJfbWV0YV9sb2NrKGlub2RlLCAmZGlfYmgsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgYWxsb2Mgc2VtIHNob3VsZCBiZSBlbm91Z2ggdG8gc2VyaWFsaXplIHdpdGgKKwkgKiBvY2ZzMl90cnVuY2F0ZV9maWxlKCkgY2hhbmdpbmcgaV9zaXplIGFzIHdlbGwgYXMgYW55IHRocmVhZAorCSAqIG1vZGlmeWluZyB0aGUgaW5vZGUgYnRyZWUuCisJICovCisJZG93bl93cml0ZSgmT0NGUzJfSShpbm9kZSktPmlwX2FsbG9jX3NlbSk7CisKKwlyZXQgPSBvY2ZzMl9kYXRhX2xvY2soaW5vZGUsIDEpOworCWlmIChyZXQgPCAwKSB7CisJCW1sb2dfZXJybm8ocmV0KTsKKwkJZ290byBvdXRfbWV0YV91bmxvY2s7CisJfQorCisJcmV0ID0gX19vY2ZzMl9wYWdlX21rd3JpdGUoaW5vZGUsIGRpX2JoLCBwYWdlKTsKKworCW9jZnMyX2RhdGFfdW5sb2NrKGlub2RlLCAxKTsKKworb3V0X21ldGFfdW5sb2NrOgorCXVwX3dyaXRlKCZPQ0ZTMl9JKGlub2RlKS0+aXBfYWxsb2Nfc2VtKTsKKworCWJyZWxzZShkaV9iaCk7CisJb2NmczJfbWV0YV91bmxvY2soaW5vZGUsIDEpOworCitvdXQ6CisJcmV0MiA9IG9jZnMyX3ZtX29wX3VuYmxvY2tfc2lncygmb2xkc2V0KTsKKwlpZiAocmV0MiA8IDApCisJCW1sb2dfZXJybm8ocmV0Mik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG9jZnMyX2ZpbGVfdm1fb3BzID0gewotCS5ub3BhZ2UgPSBvY2ZzMl9ub3BhZ2UsCisJLm5vcGFnZQkJPSBvY2ZzMl9ub3BhZ2UsCisJLnBhZ2VfbWt3cml0ZQk9IG9jZnMyX3BhZ2VfbWt3cml0ZSwKIH07CiAKIGludCBvY2ZzMl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlpbnQgcmV0ID0gMCwgbG9ja19sZXZlbCA9IDA7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYik7Ci0KLQkvKgotCSAqIE9ubHkgc3VwcG9ydCBzaGFyZWQgd3JpdGVhYmxlIG1tYXAgZm9yIGxvY2FsIG1vdW50cyB3aGljaAotCSAqIGRvbid0IGtub3cgYWJvdXQgaG9sZXMuCi0JICovCi0JaWYgKCghb2NmczJfbW91bnRfbG9jYWwob3NiKSB8fCBvY2ZzMl9zcGFyc2VfYWxsb2Mob3NiKSkgJiYKLQkgICAgKCh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSkgJiYKLQkgICAgKCh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8ICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZV1JJVEUpKSkgewotCQltbG9nKDAsICJkaXNhbGxvdyBzaGFyZWQgd3JpdGFibGUgbW1hcHMgJWx4XG4iLCB2bWEtPnZtX2ZsYWdzKTsKLQkJLyogVGhpcyBpcyAtRUlOVkFMIGJlY2F1c2UgZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAKLQkJICogcmV0dXJucyBpdCBpbiBhIHNpbWlsYXIgc2l0dWF0aW9uLiAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlyZXQgPSBvY2ZzMl9tZXRhX2xvY2tfYXRpbWUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCiAJCQkJICAgIGZpbGUtPmZfdmZzbW50LCAmbG9ja19sZXZlbCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCAzNjI4OWU2Li5kNDMwZmRhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTE2NzQsNyArMTY3NCw3IEBACiAJCXUzMiBvZmZzZXQgPSAwOwogCiAJCWlub2RlLT5pX29wID0gJm9jZnMyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJc3RhdHVzID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24ob3NiLCBpbm9kZSwgJm9mZnNldCwgMSwKKwkJc3RhdHVzID0gb2NmczJfZG9fZXh0ZW5kX2FsbG9jYXRpb24ob3NiLCBpbm9kZSwgJm9mZnNldCwgMSwgMCwKIAkJCQkJCSAgICBuZXdfZmVfYmgsCiAJCQkJCQkgICAgaGFuZGxlLCBkYXRhX2FjLCBOVUxMLAogCQkJCQkJICAgIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczIuaCBiL2ZzL29jZnMyL29jZnMyLmgKaW5kZXggYTg2MDYzMy4uNWNjOTBhNCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczIuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMi5oCkBAIC0yMTksNiArMjE5LDcgQEAKIAl1MTYgbWF4X3Nsb3RzOwogCXMxNiBub2RlX251bTsKIAlzMTYgc2xvdF9udW07CisJczE2IHByZWZlcnJlZF9zbG90OwogCWludCBzX3NlY3RzaXplX2JpdHM7CiAJaW50IHNfY2x1c3RlcnNpemU7CiAJaW50IHNfY2x1c3RlcnNpemVfYml0czsKQEAgLTMwNSw2ICszMDYsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2NmczJfd3JpdGVzX3Vud3JpdHRlbl9leHRlbnRzKHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiKQoreworCS8qCisJICogU3VwcG9ydCBmb3Igc3BhcnNlIGZpbGVzIGlzIGEgcHJlLXJlcXVpc2l0ZQorCSAqLworCWlmICghb2NmczJfc3BhcnNlX2FsbG9jKG9zYikpCisJCXJldHVybiAwOworCisJaWYgKG9zYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKIC8qIHNldCAvIGNsZWFyIGZ1bmN0aW9ucyBiZWNhdXNlIGNsdXN0ZXIgZXZlbnRzIGNhbiBtYWtlIHRoZXNlIGhhcHBlbgogICogaW4gcGFyYWxsZWwgc28gd2Ugd2FudCB0aGUgdHJhbnNpdGlvbnMgdG8gYmUgYXRvbWljLiB0aGlzIGFsc28KICAqIG1lYW5zIHRoYXQgYW55IGZ1dHVyZSBmbGFncyBvc2JfZmxhZ3MgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgc3BpbmxvY2sKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyX2ZzLmggYi9mcy9vY2ZzMi9vY2ZzMl9mcy5oCmluZGV4IGYwZDllYjAuLjgyZjhhNzUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyX2ZzLmgKKysrIGIvZnMvb2NmczIvb2NmczJfZnMuaApAQCAtODgsNyArODgsNyBAQAogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0NPTVBBVF9TVVBQCU9DRlMyX0ZFQVRVUkVfQ09NUEFUX0JBQ0tVUF9TQgogI2RlZmluZSBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKE9DRlMyX0ZFQVRVUkVfSU5DT01QQVRfTE9DQUxfTU9VTlQgXAogCQkJCQkgfCBPQ0ZTMl9GRUFUVVJFX0lOQ09NUEFUX1NQQVJTRV9BTExPQykKLSNkZWZpbmUgT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkwCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFAJT0NGUzJfRkVBVFVSRV9ST19DT01QQVRfVU5XUklUVEVOCiAKIC8qCiAgKiBIZWFydGJlYXQtb25seSBkZXZpY2VzIGFyZSBtaXNzaW5nIGpvdXJuYWxzIGFuZCBvdGhlciBmaWxlcy4gIFRoZQpAQCAtMTE2LDYgKzExNiwxMSBAQAogICovCiAjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfQ09NUEFUX0JBQ0tVUF9TQgkJMHgwMDAxCiAKKy8qCisgKiBVbndyaXR0ZW4gZXh0ZW50cyBzdXBwb3J0LgorICovCisjZGVmaW5lIE9DRlMyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOV1JJVFRFTgkweDAwMDEKKwogLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBiYWNrdXAgYmxvY2sgd2lsbCBiZSAxRy4KICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBiZSA0RywgMTZHLCA2NEcsIDI1NkcgYW5kIDFULgogICovCkBAIC0xNzAsNiArMTc1LDMyIEBACiAjZGVmaW5lIE9DRlMyX0lPQzMyX1NFVEZMQUdTCV9JT1coJ2YnLCAyLCBpbnQpCiAKIC8qCisgKiBTcGFjZSByZXNlcnZhdGlvbiAvIGFsbG9jYXRpb24gLyBmcmVlIGlvY3RscyBhbmQgYXJndW1lbnQgc3RydWN0dXJlCisgKiBhcmUgZGVzaWduZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFhGUy4KKyAqCisgKiBBTExPQ1NQKiBhbmQgRlJFRVNQKiBhcmUgbm90IGFuZCB3aWxsIG5ldmVyIGJlIHN1cHBvcnRlZCwgYnV0IGFyZQorICogaW5jbHVkZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLgorICovCitzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdiB7CisJX19zMTYJCWxfdHlwZTsKKwlfX3MxNgkJbF93aGVuY2U7CisJX19zNjQJCWxfc3RhcnQ7CisJX19zNjQJCWxfbGVuOwkJLyogbGVuID09IDAgbWVhbnMgdW50aWwgZW5kIG9mIGZpbGUgKi8KKwlfX3MzMgkJbF9zeXNpZDsKKwlfX3UzMgkJbF9waWQ7CisJX19zMzIJCWxfcGFkWzRdOwkvKiByZXNlcnZlIGFyZWEJCQkgICAgKi8KK307CisKKyNkZWZpbmUgT0NGUzJfSU9DX0FMTE9DU1AJCV9JT1cgKCdYJywgMTAsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfRlJFRVNQCQlfSU9XICgnWCcsIDExLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX1JFU1ZTUAkJX0lPVyAoJ1gnLCA0MCwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19VTlJFU1ZTUAlfSU9XICgnWCcsIDQxLCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX0FMTE9DU1A2NAlfSU9XICgnWCcsIDM2LCBzdHJ1Y3Qgb2NmczJfc3BhY2VfcmVzdikKKyNkZWZpbmUgT0NGUzJfSU9DX0ZSRUVTUDY0CV9JT1cgKCdYJywgMzcsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorI2RlZmluZSBPQ0ZTMl9JT0NfUkVTVlNQNjQJX0lPVyAoJ1gnLCA0Miwgc3RydWN0IG9jZnMyX3NwYWNlX3Jlc3YpCisjZGVmaW5lIE9DRlMyX0lPQ19VTlJFU1ZTUDY0CV9JT1cgKCdYJywgNDMsIHN0cnVjdCBvY2ZzMl9zcGFjZV9yZXN2KQorCisvKgogICogSm91cm5hbCBGbGFncyAob2NmczJfZGlub2RlLmlkMS5qb3VybmFsMS5pX2ZsYWdzKQogICovCiAjZGVmaW5lIE9DRlMyX0pPVVJOQUxfRElSVFlfRkwJKDB4MDAwMDAwMDEpCS8qIEpvdXJuYWwgbmVlZHMgcmVjb3ZlcnkgKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3Nsb3RfbWFwLmMgYi9mcy9vY2ZzMi9zbG90X21hcC5jCmluZGV4IGQ4Yjc5MDYuLmFmNDg4MmIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3Nsb3RfbWFwLmMKKysrIGIvZnMvb2NmczIvc2xvdF9tYXAuYwpAQCAtMTIxLDE3ICsxMjEsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgczE2IF9fb2NmczJfZmluZF9lbXB0eV9zbG90KHN0cnVjdCBvY2ZzMl9zbG90X2luZm8gKnNpKQorc3RhdGljIHMxNiBfX29jZnMyX2ZpbmRfZW1wdHlfc2xvdChzdHJ1Y3Qgb2NmczJfc2xvdF9pbmZvICpzaSwgczE2IHByZWZlcnJlZCkKIHsKIAlpbnQgaTsKIAlzMTYgcmV0ID0gT0NGUzJfSU5WQUxJRF9TTE9UOwogCisJaWYgKHByZWZlcnJlZCA+PSAwICYmIHByZWZlcnJlZCA8IHNpLT5zaV9udW1fc2xvdHMpIHsKKwkJaWYgKE9DRlMyX0lOVkFMSURfU0xPVCA9PSBzaS0+c2lfZ2xvYmFsX25vZGVfbnVtc1twcmVmZXJyZWRdKSB7CisJCQlyZXQgPSBwcmVmZXJyZWQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwogCWZvcihpID0gMDsgaSA8IHNpLT5zaV9udW1fc2xvdHM7IGkrKykgewogCQlpZiAoT0NGUzJfSU5WQUxJRF9TTE9UID09IHNpLT5zaV9nbG9iYWxfbm9kZV9udW1zW2ldKSB7CiAJCQlyZXQgPSAoczE2KSBpOwogCQkJYnJlYWs7CiAJCX0KIAl9CitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjQ4LDcgKzI1Niw3IEBACiAJaWYgKHNsb3QgPT0gT0NGUzJfSU5WQUxJRF9TTE9UKSB7CiAJCS8qIGlmIG5vIHNsb3QgeWV0LCB0aGVuIGp1c3QgdGFrZSAxc3QgYXZhaWxhYmxlCiAJCSAqIG9uZS4gKi8KLQkJc2xvdCA9IF9fb2NmczJfZmluZF9lbXB0eV9zbG90KHNpKTsKKwkJc2xvdCA9IF9fb2NmczJfZmluZF9lbXB0eV9zbG90KHNpLCBvc2ItPnByZWZlcnJlZF9zbG90KTsKIAkJaWYgKHNsb3QgPT0gT0NGUzJfSU5WQUxJRF9TTE9UKSB7CiAJCQlzcGluX3VubG9jaygmc2ktPnNpX2xvY2spOwogCQkJbWxvZyhNTF9FUlJPUiwgIm5vIGZyZWUgc2xvdHMgYXZhaWxhYmxlIVxuIik7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5jIGIvZnMvb2NmczIvc3ViYWxsb2MuYwppbmRleCBlMzQzNzYyLi5kOWM1YzlmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5jCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKQEAgLTk4LDE0ICs5OCw2IEBACiAJCQkJICAgIHUxNiBjaGFpbik7CiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9ibG9ja19ncm91cF9yZWFzb25hYmx5X2VtcHR5KHN0cnVjdCBvY2ZzMl9ncm91cF9kZXNjICpiZywKIAkJCQkJCSAgICAgdTMyIHdhbnRlZCk7Ci1zdGF0aWMgaW50IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGVfdCAqaGFuZGxlLAotCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsbG9jX2JoLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0LAotCQkJCSAgICB1NjQgYmdfYmxrbm8sCi0JCQkJICAgIHVuc2lnbmVkIGludCBjb3VudCk7Ci1zdGF0aWMgaW5saW5lIHU2NCBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cCh1NjQgYmxvY2ssCi0JCQkJCSAgICAgdW5zaWduZWQgaW50IGJpdCk7CiBzdGF0aWMgaW5saW5lIHUzMiBvY2ZzMl9kZXNjX2JpdG1hcF90b19jbHVzdGVyX29mZihzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkJICAgdTY0IGJnX2Jsa25vLAogCQkJCQkJICAgdTE2IGJnX2JpdF9vZmYpOwpAQCAtNDk2LDEzICs0ODgsNyBAQAogCiAJKCphYyktPmFjX2JpdHNfd2FudGVkID0gb2NmczJfZXh0ZW5kX21ldGFfbmVlZGVkKGZlKTsKIAkoKmFjKS0+YWNfd2hpY2ggPSBPQ0ZTMl9BQ19VU0VfTUVUQTsKLQotI2lmbmRlZiBPQ0ZTMl9VU0VfQUxMX01FVEFEQVRBX1NVQkFMTE9DQVRPUlMKLQlzbG90ID0gMDsKLSNlbHNlCiAJc2xvdCA9IG9zYi0+c2xvdF9udW07Ci0jZW5kaWYKLQogCSgqYWMpLT5hY19ncm91cF9zZWFyY2ggPSBvY2ZzMl9ibG9ja19ncm91cF9zZWFyY2g7CiAKIAlzdGF0dXMgPSBvY2ZzMl9yZXNlcnZlX3N1YmFsbG9jX2JpdHMob3NiLCAoKmFjKSwKQEAgLTE2MjYsMTIgKzE2MTIsMTIgQEAKIC8qCiAgKiBleHBlY3RzIHRoZSBzdWJhbGxvYyBpbm9kZSB0byBhbHJlYWR5IGJlIGxvY2tlZC4KICAqLwotc3RhdGljIGludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKLQkJCQkgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKLQkJCQkgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKLQkJCQkgICAgdTY0IGJnX2Jsa25vLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgY291bnQpCitpbnQgb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZV90ICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqYWxsb2NfaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYWxsb2NfYmgsCisJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydF9iaXQsCisJCQkgICAgIHU2NCBiZ19ibGtubywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KQogewogCWludCBzdGF0dXMgPSAwOwogCXUzMiB0bXBfdXNlZDsKQEAgLTE3MDMsMTMgKzE2ODksNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKHU2NCBibG9jaywgdW5zaWduZWQgaW50IGJpdCkKLXsKLQl1NjQgZ3JvdXAgPSBibG9jayAtICh1NjQpIGJpdDsKLQotCXJldHVybiBncm91cDsKLX0KLQogaW50IG9jZnMyX2ZyZWVfZGlub2RlKGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGVfYWxsb2NfaW5vZGUsCiAJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYWxsb2NfYmgsCkBAIC0xNzIzLDE5ICsxNzAyLDYgQEAKIAkJCQkJaW5vZGVfYWxsb2NfYmgsIGJpdCwgYmdfYmxrbm8sIDEpOwogfQogCi1pbnQgb2NmczJfZnJlZV9leHRlbnRfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmViX2FsbG9jX2lub2RlLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZWJfYWxsb2NfYmgsCi0JCQkgICAgc3RydWN0IG9jZnMyX2V4dGVudF9ibG9jayAqZWIpCi17Ci0JdTY0IGJsayA9IGxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKTsKLQl1MTYgYml0ID0gbGUxNl90b19jcHUoZWItPmhfc3ViYWxsb2NfYml0KTsKLQl1NjQgYmdfYmxrbm8gPSBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cChibGssIGJpdCk7Ci0KLQlyZXR1cm4gb2NmczJfZnJlZV9zdWJhbGxvY19iaXRzKGhhbmRsZSwgZWJfYWxsb2NfaW5vZGUsIGViX2FsbG9jX2JoLAotCQkJCQliaXQsIGJnX2Jsa25vLCAxKTsKLX0KLQogaW50IG9jZnMyX2ZyZWVfY2x1c3RlcnMoaGFuZGxlX3QgKmhhbmRsZSwKIAkJICAgICAgIHN0cnVjdCBpbm9kZSAqYml0bWFwX2lub2RlLAogCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdWJhbGxvYy5oIGIvZnMvb2NmczIvc3ViYWxsb2MuaAppbmRleCAxYTNjOTRjLi5mMjEyZGMwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdWJhbGxvYy5oCisrKyBiL2ZzL29jZnMyL3N1YmFsbG9jLmgKQEAgLTg2LDIwICs4NiwyOSBAQAogCQkJIHUzMiAqY2x1c3Rlcl9zdGFydCwKIAkJCSB1MzIgKm51bV9jbHVzdGVycyk7CiAKK2ludCBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCSAgICAgc3RydWN0IGlub2RlICphbGxvY19pbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19iaCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCwKKwkJCSAgICAgdTY0IGJnX2Jsa25vLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQpOwogaW50IG9jZnMyX2ZyZWVfZGlub2RlKGhhbmRsZV90ICpoYW5kbGUsCiAJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGVfYWxsb2NfaW5vZGUsCiAJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYWxsb2NfYmgsCiAJCSAgICAgIHN0cnVjdCBvY2ZzMl9kaW5vZGUgKmRpKTsKLWludCBvY2ZzMl9mcmVlX2V4dGVudF9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLAotCQkJICAgIHN0cnVjdCBpbm9kZSAqZWJfYWxsb2NfaW5vZGUsCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICplYl9hbGxvY19iaCwKLQkJCSAgICBzdHJ1Y3Qgb2NmczJfZXh0ZW50X2Jsb2NrICplYik7CiBpbnQgb2NmczJfZnJlZV9jbHVzdGVycyhoYW5kbGVfdCAqaGFuZGxlLAogCQkJc3RydWN0IGlub2RlICpiaXRtYXBfaW5vZGUsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCwKIAkJCXU2NCBzdGFydF9ibGssCiAJCQl1bnNpZ25lZCBpbnQgbnVtX2NsdXN0ZXJzKTsKIAorc3RhdGljIGlubGluZSB1NjQgb2NmczJfd2hpY2hfc3ViYWxsb2NfZ3JvdXAodTY0IGJsb2NrLCB1bnNpZ25lZCBpbnQgYml0KQoreworCXU2NCBncm91cCA9IGJsb2NrIC0gKHU2NCkgYml0OworCisJcmV0dXJuIGdyb3VwOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBvY2ZzMl9jbHVzdGVyX2Zyb21fZGVzYyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKIAkJCQkJICB1NjQgYmdfYmxrbm8pCiB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCA4NmI1NTljLi4zYTVhMWVkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTgyLDcgKzgyLDggQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGludCBvY2ZzMl9wYXJzZV9vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKm9wdGlvbnMsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbW91bnRfb3B0LCBpbnQgaXNfcmVtb3VudCk7CisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbW91bnRfb3B0LCBzMTYgKnNsb3QsCisJCQkgICAgICAgaW50IGlzX3JlbW91bnQpOwogc3RhdGljIHZvaWQgb2NmczJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIGludCBvY2ZzMl9tb3VudF92b2x1bWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgaW50IG9jZnMyX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CkBAIC0xMTQsOCArMTE1LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKm9jZnMyX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHZvaWQgb2NmczJfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50IGJsb2Nrc2hpZnQpOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgb2NmczJfc29wcyA9IHsKIAkuc3RhdGZzCQk9IG9jZnMyX3N0YXRmcywKIAkuYWxsb2NfaW5vZGUJPSBvY2ZzMl9hbGxvY19pbm9kZSwKQEAgLTE0MCw2ICsxMzksNyBAQAogCU9wdF9kYXRhX29yZGVyZWQsCiAJT3B0X2RhdGFfd3JpdGViYWNrLAogCU9wdF9hdGltZV9xdWFudHVtLAorCU9wdF9zbG90LAogCU9wdF9lcnIsCiB9OwogCkBAIC0xNTQsNiArMTU0LDcgQEAKIAl7T3B0X2RhdGFfb3JkZXJlZCwgImRhdGE9b3JkZXJlZCJ9LAogCXtPcHRfZGF0YV93cml0ZWJhY2ssICJkYXRhPXdyaXRlYmFjayJ9LAogCXtPcHRfYXRpbWVfcXVhbnR1bSwgImF0aW1lX3F1YW50dW09JXUifSwKKwl7T3B0X3Nsb3QsICJwcmVmZXJyZWRfc2xvdD0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfQogfTsKIApAQCAtMzE4LDcgKzMxOSw3IEBACiAvKiBGcm9tIHhmc19zdXBlci5jOnhmc19tYXhfZmlsZV9vZmZzZXQKICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBvY2ZzMl9tYXhfZmlsZV9vZmZzZXQodW5zaWduZWQgaW50IGJsb2Nrc2hpZnQpCit1bnNpZ25lZCBsb25nIGxvbmcgb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KHVuc2lnbmVkIGludCBibG9ja3NoaWZ0KQogewogCXVuc2lnbmVkIGludCBwYWdlZmFjdG9yID0gMTsKIAl1bnNpZ25lZCBpbnQgYml0c2hpZnQgPSBCSVRTX1BFUl9MT05HIC0gMTsKQEAgLTM1NSw5ICszNTYsMTAgQEAKIAlpbnQgaW5jb21wYXRfZmVhdHVyZXM7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBwYXJzZWRfb3B0aW9uczsKKwlzMTYgc2xvdDsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKHNiKTsKIAotCWlmICghb2NmczJfcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSwgJnBhcnNlZF9vcHRpb25zLCAxKSkgeworCWlmICghb2NmczJfcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSwgJnBhcnNlZF9vcHRpb25zLCAmc2xvdCwgMSkpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNTM0LDYgKzUzNiw3IEBACiAJc3RydWN0IGRlbnRyeSAqcm9vdDsKIAlpbnQgc3RhdHVzLCBzZWN0b3Jfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHBhcnNlZF9vcHQ7CisJczE2IHNsb3Q7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwpAQCAtNTQxLDcgKzU0NCw3IEBACiAKIAltbG9nX2VudHJ5KCIlcCwgJXAsICVpIiwgc2IsIGRhdGEsIHNpbGVudCk7CiAKLQlpZiAoIW9jZnMyX3BhcnNlX29wdGlvbnMoc2IsIGRhdGEsICZwYXJzZWRfb3B0LCAwKSkgeworCWlmICghb2NmczJfcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSwgJnBhcnNlZF9vcHQsICZzbG90LCAwKSkgewogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQlnb3RvIHJlYWRfc3VwZXJfZXJyb3I7CiAJfQpAQCAtNTcxLDYgKzU3NCw3IEBACiAJYnJlbHNlKGJoKTsKIAliaCA9IE5VTEw7CiAJb3NiLT5zX21vdW50X29wdCA9IHBhcnNlZF9vcHQ7CisJb3NiLT5wcmVmZXJyZWRfc2xvdCA9IHNsb3Q7CiAKIAlzYi0+c19tYWdpYyA9IE9DRlMyX1NVUEVSX01BR0lDOwogCkBAIC03MTMsNiArNzE3LDcgQEAKIHN0YXRpYyBpbnQgb2NmczJfcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgIGNoYXIgKm9wdGlvbnMsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbW91bnRfb3B0LAorCQkJICAgICAgIHMxNiAqc2xvdCwKIAkJCSAgICAgICBpbnQgaXNfcmVtb3VudCkKIHsKIAlpbnQgc3RhdHVzOwpAQCAtNzIyLDYgKzcyNyw3IEBACiAJCSAgIG9wdGlvbnMgPyBvcHRpb25zIDogIihub25lKSIpOwogCiAJKm1vdW50X29wdCA9IDA7CisJKnNsb3QgPSBPQ0ZTMl9JTlZBTElEX1NMT1Q7CiAKIAlpZiAoIW9wdGlvbnMpIHsKIAkJc3RhdHVzID0gMTsKQEAgLTc4Miw2ICs3ODgsMTUgQEAKIAkJCWVsc2UKIAkJCQlvc2ItPnNfYXRpbWVfcXVhbnR1bSA9IE9DRlMyX0RFRkFVTFRfQVRJTUVfUVVBTlRVTTsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9zbG90OgorCQkJb3B0aW9uID0gMDsKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKSB7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAob3B0aW9uKQorCQkJCSpzbG90ID0gKHMxNilvcHRpb247CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCW1sb2coTUxfRVJST1IsCiAJCQkgICAgICJVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5oIGIvZnMvb2NmczIvc3VwZXIuaAppbmRleCA3ODNmNTI3Li4zYjljYjNkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5oCisrKyBiL2ZzL29jZnMyL3N1cGVyLmgKQEAgLTQ1LDQgKzQ1LDYgQEAKIAogI2RlZmluZSBvY2ZzMl9hYm9ydChzYiwgZm10LCBhcmdzLi4uKSBfX29jZnMyX2Fib3J0KHNiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmbXQsICMjYXJncykKIAordW5zaWduZWQgbG9uZyBsb25nIG9jZnMyX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQgYmxvY2tzaGlmdCk7CisKICNlbmRpZiAvKiBPQ0ZTMl9TVVBFUl9IICovCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggMGQ1MTVkMS4uYmU2YTQ1NyAxMDA2NDQKLS0tIGEvZnMvb3Blbi5jCisrKyBiL2ZzL29wZW4uYwpAQCAtODU1LDcgKzg1NSw3IEBACiAvKgogICogRmluZCBhbiBlbXB0eSBmaWxlIGRlc2NyaXB0b3IgZW50cnksIGFuZCBtYXJrIGl0IGJ1c3kuCiAgKi8KLWludCBnZXRfdW51c2VkX2ZkKHZvaWQpCitpbnQgZ2V0X3VudXNlZF9mZF9mbGFncyhpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gY3VycmVudC0+ZmlsZXM7CiAJaW50IGZkLCBlcnJvcjsKQEAgLTg5MSw3ICs4OTEsMTAgQEAKIAl9CiAKIAlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOwotCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKKwlpZiAoZmxhZ3MgJiBPX0NMT0VYRUMpCisJCUZEX1NFVChmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKKwllbHNlCisJCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKIAlmaWxlcy0+bmV4dF9mZCA9IGZkICsgMTsKICNpZiAxCiAJLyogU2FuaXR5IGNoZWNrICovCkBAIC05MDcsNiArOTEwLDExIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitpbnQgZ2V0X3VudXNlZF9mZCh2b2lkKQoreworCXJldHVybiBnZXRfdW51c2VkX2ZkX2ZsYWdzKDApOworfQorCiBFWFBPUlRfU1lNQk9MKGdldF91bnVzZWRfZmQpOwogCiBzdGF0aWMgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKQEAgLTk1OSw3ICs5NjcsNyBAQAogCWludCBmZCA9IFBUUl9FUlIodG1wKTsKIAogCWlmICghSVNfRVJSKHRtcCkpIHsKLQkJZmQgPSBnZXRfdW51c2VkX2ZkKCk7CisJCWZkID0gZ2V0X3VudXNlZF9mZF9mbGFncyhmbGFncyk7CiAJCWlmIChmZCA+PSAwKSB7CiAJCQlzdHJ1Y3QgZmlsZSAqZiA9IGRvX2ZpbHBfb3BlbihkZmQsIHRtcCwgZmxhZ3MsIG1vZGUpOwogCQkJaWYgKElTX0VSUihmKSkgewpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hY29ybi5jIGIvZnMvcGFydGl0aW9ucy9hY29ybi5jCmluZGV4IGUzNDkxMzIuLjNkM2UxNjYgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYworKysgYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKQEAgLTI1LDYgKzI1LDggQEAKICNkZWZpbmUgUEFSVElUSU9OX1JJU0NJWF9TQ1NJCTIKICNkZWZpbmUgUEFSVElUSU9OX0xJTlVYCQk5CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0FERlMpCiBzdGF0aWMgc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqCiBhZGZzX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBjaGFyICpuYW1lLCBjaGFyICpkYXRhLAogCSAgICAgICB1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3RvciwgaW50IHNsb3QpCkBAIC00OCw2ICs1MCw3IEBACiAJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCwgZmlyc3Rfc2VjdG9yLCBucl9zZWN0cyk7CiAJcmV0dXJuIGRyOwogfQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX1JJU0NJWAogCkBAIC02NSw2ICs2OCw4IEBACiAJc3RydWN0IHJpc2NpeF9wYXJ0IHBhcnRbOF07CiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTKQogc3RhdGljIGludAogcmlzY2l4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3QsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIG5yX3NlY3RzKQpAQCAtMTA1LDYgKzExMCw3IEBACiAJcmV0dXJuIHNsb3Q7CiB9CiAjZW5kaWYKKyNlbmRpZgogCiAjZGVmaW5lIExJTlVYX05BVElWRV9NQUdJQyAweGRlYWZhMWRlCiAjZGVmaW5lIExJTlVYX1NXQVBfTUFHSUMgICAweGRlYWZhYjFlCkBAIC0xMTUsNiArMTIxLDggQEAKIAlfX2xlMzIgbnJfc2VjdHM7CiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfQUNPUk5fUEFSVElUSU9OX0NVTUFOQSkgfHwgXAorCWRlZmluZWQoQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTKQogc3RhdGljIGludAogbGludXhfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCXVuc2lnbmVkIGxvbmcgZmlyc3Rfc2VjdCwgaW50IHNsb3QsIHVuc2lnbmVkIGxvbmcgbnJfc2VjdHMpCkBAIC0xNDYsNiArMTU0LDcgQEAKIAlwdXRfZGV2X3NlY3RvcihzZWN0KTsKIAlyZXR1cm4gc2xvdDsKIH0KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9DVU1BTkEKIGludApkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9sZG0uYyBiL2ZzL3BhcnRpdGlvbnMvbGRtLmMKaW5kZXggOTk4NzNhMi4uZTdkZDFkNCAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9sZG0uYworKysgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCkBAIC02NzcsMTUgKzY3NywyNCBAQAogICogUmV0dXJuOiAgLTEgRXJyb3IsIHRoZSBjYWxjdWxhdGVkIG9mZnNldCBleGNlZWRlZCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgKiAgICAgICAgICAgbiBPSywgYSByYW5nZS1jaGVja2VkIG9mZnNldCBpbnRvIGJ1ZmZlcgogICovCi1zdGF0aWMgaW50IGxkbV9yZWxhdGl2ZSAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgaW50IGJhc2UsIGludCBvZmZzZXQpCitzdGF0aWMgaW50IGxkbV9yZWxhdGl2ZShjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgYmFzZSwgaW50IG9mZnNldCkKIHsKIAogCWJhc2UgKz0gb2Zmc2V0OwotCWlmICgoIWJ1ZmZlcikgfHwgKG9mZnNldCA8IDApIHx8IChiYXNlID4gYnVmbGVuKSkKKwlpZiAoIWJ1ZmZlciB8fCBvZmZzZXQgPCAwIHx8IGJhc2UgPiBidWZsZW4pIHsKKwkJaWYgKCFidWZmZXIpCisJCQlsZG1fZXJyb3IoIiFidWZmZXIiKTsKKwkJaWYgKG9mZnNldCA8IDApCisJCQlsZG1fZXJyb3IoIm9mZnNldCAoJWQpIDwgMCIsIG9mZnNldCk7CisJCWlmIChiYXNlID4gYnVmbGVuKQorCQkJbGRtX2Vycm9yKCJiYXNlICglZCkgPiBidWZsZW4gKCVkKSIsIGJhc2UsIGJ1Zmxlbik7CiAJCXJldHVybiAtMTsKLQlpZiAoKGJhc2UgKyBidWZmZXJbYmFzZV0pID49IGJ1ZmxlbikKKwl9CisJaWYgKGJhc2UgKyBidWZmZXJbYmFzZV0gPj0gYnVmbGVuKSB7CisJCWxkbV9lcnJvcigiYmFzZSAoJWQpICsgYnVmZmVyW2Jhc2VdICglZCkgPj0gYnVmbGVuICglZCkiLCBiYXNlLAorCQkJCWJ1ZmZlcltiYXNlXSwgYnVmbGVuKTsKIAkJcmV0dXJuIC0xOwotCisJfQogCXJldHVybiBidWZmZXJbYmFzZV0gKyBvZmZzZXQgKyAxOwogfQogCkBAIC0xMDU0LDYwICsxMDYzLDk4IEBACiAgKiBSZXR1cm46ICAndHJ1ZScgICBAdmIgY29udGFpbnMgYSBWb2x1bWUgVkJMSwogICogICAgICAgICAgJ2ZhbHNlJyAgQHZiIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAogICovCi1zdGF0aWMgYm9vbCBsZG1fcGFyc2Vfdm9sNSAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQorc3RhdGljIGJvb2wgbGRtX3BhcnNlX3ZvbDUoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQogewotCWludCByX29iamlkLCByX25hbWUsIHJfdnR5cGUsIHJfY2hpbGQsIHJfc2l6ZSwgcl9pZDEsIHJfaWQyLCByX3NpemUyOwotCWludCByX2RyaXZlLCBsZW47CisJaW50IHJfb2JqaWQsIHJfbmFtZSwgcl92dHlwZSwgcl9kaXNhYmxlX2RyaXZlX2xldHRlciwgcl9jaGlsZCwgcl9zaXplOworCWludCByX2lkMSwgcl9pZDIsIHJfc2l6ZTIsIHJfZHJpdmUsIGxlbjsKIAlzdHJ1Y3QgdmJsa192b2x1ICp2b2x1OwogCi0JQlVHX09OICghYnVmZmVyIHx8ICF2Yik7Ci0KLQlyX29iamlkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOwotCXJfbmFtZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7Ci0Jcl92dHlwZSAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX25hbWUpOwotCXJfY2hpbGQgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgyRSwgcl92dHlwZSk7Ci0Jcl9zaXplICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDNFLCByX2NoaWxkKTsKLQotCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDEpCi0JCXJfaWQxID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9zaXplKTsKLQllbHNlCisJQlVHX09OKCFidWZmZXIgfHwgIXZiKTsKKwlyX29iamlkID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlpZiAocl9vYmppZCA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX29iamlkICVkIDwgMCIsIHJfb2JqaWQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfbmFtZSA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisJaWYgKHJfbmFtZSA8IDApIHsKKwkJbGRtX2Vycm9yKCJyX25hbWUgJWQgPCAwIiwgcl9uYW1lKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyX3Z0eXBlID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX25hbWUpOworCWlmIChyX3Z0eXBlIDwgMCkgeworCQlsZG1fZXJyb3IoInJfdnR5cGUgJWQgPCAwIiwgcl92dHlwZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl9kaXNhYmxlX2RyaXZlX2xldHRlciA9IGxkbV9yZWxhdGl2ZShidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl92dHlwZSk7CisJaWYgKHJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIgPCAwKSB7CisJCWxkbV9lcnJvcigicl9kaXNhYmxlX2RyaXZlX2xldHRlciAlZCA8IDAiLAorCQkJCXJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJfY2hpbGQgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4MkQsIHJfZGlzYWJsZV9kcml2ZV9sZXR0ZXIpOworCWlmIChyX2NoaWxkIDwgMCkgeworCQlsZG1fZXJyb3IoInJfY2hpbGQgJWQgPCAwIiwgcl9jaGlsZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcl9zaXplID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDNELCByX2NoaWxkKTsKKwlpZiAocl9zaXplIDwgMCkgeworCQlsZG1fZXJyb3IoInJfc2l6ZSAlZCA8IDAiLCByX3NpemUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDEpIHsKKwkJcl9pZDEgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4NTIsIHJfc2l6ZSk7CisJCWlmIChyX2lkMSA8IDApIHsKKwkJCWxkbV9lcnJvcigicl9pZDEgJWQgPCAwIiwgcl9pZDEpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCiAJCXJfaWQxID0gcl9zaXplOwotCi0JaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0lEMikKLQkJcl9pZDIgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDUzLCByX2lkMSk7Ci0JZWxzZQorCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDIpIHsKKwkJcl9pZDIgPSBsZG1fcmVsYXRpdmUoYnVmZmVyLCBidWZsZW4sIDB4NTIsIHJfaWQxKTsKKwkJaWYgKHJfaWQyIDwgMCkgeworCQkJbGRtX2Vycm9yKCJyX2lkMiAlZCA8IDAiLCByX2lkMik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UKIAkJcl9pZDIgPSByX2lkMTsKLQotCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9TSVpFKQotCQlyX3NpemUyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9pZDIpOwotCWVsc2UKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfU0laRSkgeworCQlyX3NpemUyID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX2lkMik7CisJCWlmIChyX3NpemUyIDwgMCkgeworCQkJbGRtX2Vycm9yKCJyX3NpemUyICVkIDwgMCIsIHJfc2l6ZTIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfSBlbHNlCiAJCXJfc2l6ZTIgPSByX2lkMjsKLQotCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9EUklWRSkKLQkJcl9kcml2ZSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfc2l6ZTIpOwotCWVsc2UKLQkJcl9kcml2ZSA9IHJfc2l6ZTI7Ci0KLQlsZW4gPSByX2RyaXZlOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlsZW4gKz0gVkJMS19TSVpFX1ZPTDU7Ci0JaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jdm9sdSA9ICZ2Yi0+dmJsay52b2x1OwotCi0JbGRtX2dldF92c3RyIChidWZmZXIgKyAweDE4ICsgcl9uYW1lLCAgdm9sdS0+dm9sdW1lX3R5cGUsCi0JCXNpemVvZiAodm9sdS0+dm9sdW1lX3R5cGUpKTsKLQltZW1jcHkgKHZvbHUtPnZvbHVtZV9zdGF0ZSwgYnVmZmVyICsgMHgxOSArIHJfdnR5cGUsCi0JCQlzaXplb2YgKHZvbHUtPnZvbHVtZV9zdGF0ZSkpOwotCXZvbHUtPnNpemUgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4M0UgKyByX2NoaWxkKTsKLQl2b2x1LT5wYXJ0aXRpb25fdHlwZSA9IGJ1ZmZlclsweDQyICsgcl9zaXplXTsKLQltZW1jcHkgKHZvbHUtPmd1aWQsIGJ1ZmZlciArIDB4NDMgKyByX3NpemUsICBzaXplb2YgKHZvbHUtPmd1aWQpKTsKIAlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfRFJJVkUpIHsKLQkJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDUzICsgcl9zaXplLCAgdm9sdS0+ZHJpdmVfaGludCwKLQkJCXNpemVvZiAodm9sdS0+ZHJpdmVfaGludCkpOworCQlyX2RyaXZlID0gbGRtX3JlbGF0aXZlKGJ1ZmZlciwgYnVmbGVuLCAweDUyLCByX3NpemUyKTsKKwkJaWYgKHJfZHJpdmUgPCAwKSB7CisJCQlsZG1fZXJyb3IoInJfZHJpdmUgJWQgPCAwIiwgcl9kcml2ZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UKKwkJcl9kcml2ZSA9IHJfc2l6ZTI7CisJbGVuID0gcl9kcml2ZTsKKwlpZiAobGVuIDwgMCkgeworCQlsZG1fZXJyb3IoImxlbiAlZCA8IDAiLCBsZW4pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWxlbiArPSBWQkxLX1NJWkVfVk9MNTsKKwlpZiAobGVuID4gQkUzMihidWZmZXIgKyAweDE0KSkgeworCQlsZG1fZXJyb3IoImxlbiAlZCA+IEJFMzIoYnVmZmVyICsgMHgxNCkgJWQiLCBsZW4sCisJCQkJQkUzMihidWZmZXIgKyAweDE0KSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdm9sdSA9ICZ2Yi0+dmJsay52b2x1OworCWxkbV9nZXRfdnN0cihidWZmZXIgKyAweDE4ICsgcl9uYW1lLCB2b2x1LT52b2x1bWVfdHlwZSwKKwkJCXNpemVvZih2b2x1LT52b2x1bWVfdHlwZSkpOworCW1lbWNweSh2b2x1LT52b2x1bWVfc3RhdGUsIGJ1ZmZlciArIDB4MTggKyByX2Rpc2FibGVfZHJpdmVfbGV0dGVyLAorCQkJc2l6ZW9mKHZvbHUtPnZvbHVtZV9zdGF0ZSkpOworCXZvbHUtPnNpemUgPSBsZG1fZ2V0X3ZudW0oYnVmZmVyICsgMHgzRCArIHJfY2hpbGQpOworCXZvbHUtPnBhcnRpdGlvbl90eXBlID0gYnVmZmVyWzB4NDEgKyByX3NpemVdOworCW1lbWNweSh2b2x1LT5ndWlkLCBidWZmZXIgKyAweDQyICsgcl9zaXplLCBzaXplb2Yodm9sdS0+Z3VpZCkpOworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9EUklWRSkgeworCQlsZG1fZ2V0X3ZzdHIoYnVmZmVyICsgMHg1MiArIHJfc2l6ZSwgdm9sdS0+ZHJpdmVfaGludCwKKwkJCQlzaXplb2Yodm9sdS0+ZHJpdmVfaGludCkpOwogCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmggYi9mcy9wYXJ0aXRpb25zL2xkbS5oCmluZGV4IGQyZTZhMzAuLjgwZjYzYjUgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbGRtLmgKKysrIGIvZnMvcGFydGl0aW9ucy9sZG0uaApAQCAtNjgsNyArNjgsNyBAQAogI2RlZmluZSBWQkxLX1NJWkVfRFNLMwkJMTIKICNkZWZpbmUgVkJMS19TSVpFX0RTSzQJCTQ1CiAjZGVmaW5lIFZCTEtfU0laRV9QUlQzCQkyOAotI2RlZmluZSBWQkxLX1NJWkVfVk9MNQkJNTkKKyNkZWZpbmUgVkJMS19TSVpFX1ZPTDUJCTU4CiAKIC8qIGNvbXBvbmVudCB0eXBlcyAqLwogI2RlZmluZSBDT01QX1NUUklQRQkJMHgwMQkJLyogU3RyaXBlLXNldCAqLwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCmluZGV4IDk4ZTc4ZTIuLjk2NTYyNWEgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYXJyYXkuYworKysgYi9mcy9wcm9jL2FycmF5LmMKQEAgLTYyLDYgKzYyLDggQEAKICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KQEAgLTc2LDkgKzc4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC04NywxMCArODcsMTAgQEAKIGRvIHsgbWVtY3B5KGJ1ZmZlciwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7IFwKICAgICAgYnVmZmVyICs9IHN0cmxlbihzdHJpbmcpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX25hbWUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICogYnVmKQorc3RhdGljIGlubGluZSBjaGFyICp0YXNrX25hbWUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWYpCiB7CiAJaW50IGk7Ci0JY2hhciAqIG5hbWU7CisJY2hhciAqbmFtZTsKIAljaGFyIHRjb21tW3NpemVvZihwLT5jb21tKV07CiAKIAlnZXRfdGFza19jb21tKHRjb21tLCBwKTsKQEAgLTEzOCw3ICsxMzgsNyBAQAogCSJYIChkZWFkKSIJCS8qIDMyICovCiB9OwogCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKiBnZXRfdGFza19zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZ2V0X3Rhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJdW5zaWduZWQgaW50IHN0YXRlID0gKHRzay0+c3RhdGUgJiAoVEFTS19SVU5OSU5HIHwKIAkJCQkJICAgIFRBU0tfSU5URVJSVVBUSUJMRSB8CkBAIC0xNTYsNyArMTU2LDcgQEAKIAlyZXR1cm4gKnA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqIHRhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCitzdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCiB7CiAJc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm87CiAJaW50IGc7CkBAIC0xNzIsOCArMTcyLDggQEAKIAkJIlVpZDpcdCVkXHQlZFx0JWRcdCVkXG4iCiAJCSJHaWQ6XHQlZFx0JWRcdCVkXHQlZFxuIiwKIAkJZ2V0X3Rhc2tfc3RhdGUocCksCi0JICAgICAgIAlwLT50Z2lkLCBwLT5waWQsCi0JICAgICAgIAlwaWRfYWxpdmUocCkgPyByY3VfZGVyZWZlcmVuY2UocC0+cmVhbF9wYXJlbnQpLT50Z2lkIDogMCwKKwkJcC0+dGdpZCwgcC0+cGlkLAorCQlwaWRfYWxpdmUocCkgPyByY3VfZGVyZWZlcmVuY2UocC0+cmVhbF9wYXJlbnQpLT50Z2lkIDogMCwKIAkJcGlkX2FsaXZlKHApICYmIHAtPnB0cmFjZSA/IHJjdV9kZXJlZmVyZW5jZShwLT5wYXJlbnQpLT5waWQgOiAwLAogCQlwLT51aWQsIHAtPmV1aWQsIHAtPnN1aWQsIHAtPmZzdWlkLAogCQlwLT5naWQsIHAtPmVnaWQsIHAtPnNnaWQsIHAtPmZzZ2lkKTsKQEAgLTE5MSwxNSArMTkxLDE1IEBACiAJZ2V0X2dyb3VwX2luZm8oZ3JvdXBfaW5mbyk7CiAJdGFza191bmxvY2socCk7CiAKLQlmb3IgKGcgPSAwOyBnIDwgbWluKGdyb3VwX2luZm8tPm5ncm91cHMsTkdST1VQU19TTUFMTCk7IGcrKykKLQkJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiJWQgIiwgR1JPVVBfQVQoZ3JvdXBfaW5mbyxnKSk7CisJZm9yIChnID0gMDsgZyA8IG1pbihncm91cF9pbmZvLT5uZ3JvdXBzLCBOR1JPVVBTX1NNQUxMKTsgZysrKQorCQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIlZCAiLCBHUk9VUF9BVChncm91cF9pbmZvLCBnKSk7CiAJcHV0X2dyb3VwX2luZm8oZ3JvdXBfaW5mbyk7CiAKIAlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICJcbiIpOwogCXJldHVybiBidWZmZXI7CiB9CiAKLXN0YXRpYyBjaGFyICogcmVuZGVyX3NpZ3NldF90KGNvbnN0IGNoYXIgKmhlYWRlciwgc2lnc2V0X3QgKnNldCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGNoYXIgKnJlbmRlcl9zaWdzZXRfdChjb25zdCBjaGFyICpoZWFkZXIsIHNpZ3NldF90ICpzZXQsIGNoYXIgKmJ1ZmZlcikKIHsKIAlpbnQgaSwgbGVuOwogCkBAIC0yMzksNyArMjM5LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqIHRhc2tfc2lnKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSBjaGFyICp0YXNrX3NpZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNpZ3NldF90IHBlbmRpbmcsIHNocGVuZGluZywgYmxvY2tlZCwgaWdub3JlZCwgY2F1Z2h0OwpAQCAtMjg5LDE0ICsyODksMjMgQEAKIAkJCSAgICBjYXBfdChwLT5jYXBfZWZmZWN0aXZlKSk7CiB9CiAKLWludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQorc3RhdGljIGlubGluZSBjaGFyICp0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJCQljaGFyICpidWZmZXIpCiB7Ci0JY2hhciAqIG9yaWcgPSBidWZmZXI7CisJcmV0dXJuIGJ1ZmZlciArIHNwcmludGYoYnVmZmVyLCAidm9sdW50YXJ5X2N0eHRfc3dpdGNoZXM6XHQlbHVcbiIKKwkJCSAgICAibm9udm9sdW50YXJ5X2N0eHRfc3dpdGNoZXM6XHQlbHVcbiIsCisJCQkgICAgcC0+bnZjc3csCisJCQkgICAgcC0+bml2Y3N3KTsKK30KKworaW50IHByb2NfcGlkX3N0YXR1cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICpvcmlnID0gYnVmZmVyOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CiAKIAlidWZmZXIgPSB0YXNrX25hbWUodGFzaywgYnVmZmVyKTsKIAlidWZmZXIgPSB0YXNrX3N0YXRlKHRhc2ssIGJ1ZmZlcik7Ci0gCisKIAlpZiAobW0pIHsKIAkJYnVmZmVyID0gdGFza19tZW0obW0sIGJ1ZmZlcik7CiAJCW1tcHV0KG1tKTsKQEAgLTMwNyw2ICszMTYsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1MzOTApCiAJYnVmZmVyID0gdGFza19zaG93X3JlZ3ModGFzaywgYnVmZmVyKTsKICNlbmRpZgorCWJ1ZmZlciA9IHRhc2tfY29udGV4dF9zd2l0Y2hfY291bnRzKHRhc2ssIGJ1ZmZlcik7CiAJcmV0dXJuIGJ1ZmZlciAtIG9yaWc7CiB9CiAKQEAgLTMzMiw3ICszNDIsNyBAQAogCiBzdGF0aWMgY2xvY2tfdCB0YXNrX3N0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQljbG9ja190IHN0aW1lID0gY3B1dGltZV90b19jbG9ja190KHAtPnN0aW1lKTsKKwljbG9ja190IHN0aW1lOwogCiAJLyoKIAkgKiBVc2UgQ0ZTJ3MgcHJlY2lzZSBhY2NvdW50aW5nLiAod2Ugc3VidHJhY3QgdXRpbWUgZnJvbQpAQCAtMzQ0LDggKzM1NCw3IEBACiAJcmV0dXJuIHN0aW1lOwogfQogCi0KLXN0YXRpYyBpbnQgZG9fdGFza19zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlciwgaW50IHdob2xlKQorc3RhdGljIGludCBkb190YXNrX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIsIGludCB3aG9sZSkKIHsKIAl1bnNpZ25lZCBsb25nIHZzaXplLCBlaXAsIGVzcCwgd2NoYW4gPSB+MFVMOwogCWxvbmcgcHJpb3JpdHksIG5pY2U7CkBAIC0zNTMsNyArMzYyLDcgQEAKIAlzaWdzZXRfdCBzaWdpZ24sIHNpZ2NhdGNoOwogCWNoYXIgc3RhdGU7CiAJaW50IHJlczsKLSAJcGlkX3QgcHBpZCA9IDAsIHBnaWQgPSAtMSwgc2lkID0gLTE7CisJcGlkX3QgcHBpZCA9IDAsIHBnaWQgPSAtMSwgc2lkID0gLTE7CiAJaW50IG51bV90aHJlYWRzID0gMDsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfdGltZTsKQEAgLTQyNCw3ICs0MzMsNyBAQAogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmICghd2hvbGUgfHwgbnVtX3RocmVhZHM8MikKKwlpZiAoIXdob2xlIHx8IG51bV90aHJlYWRzIDwgMikKIAkJd2NoYW4gPSBnZXRfd2NoYW4odGFzayk7CiAJaWYgKCF3aG9sZSkgewogCQltaW5fZmx0ID0gdGFzay0+bWluX2ZsdDsKQEAgLTQ0MCwxMiArNDQ5LDEzIEBACiAKIAkvKiBUZW1wb3JhcnkgdmFyaWFibGUgbmVlZGVkIGZvciBnY2MtMi45NiAqLwogCS8qIGNvbnZlcnQgdGltZXNwZWMgLT4gbnNlYyovCi0Jc3RhcnRfdGltZSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+c3RhcnRfdGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUMKLQkJCQkrIHRhc2stPnN0YXJ0X3RpbWUudHZfbnNlYzsKKwlzdGFydF90aW1lID0KKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0YXNrLT5yZWFsX3N0YXJ0X3RpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDCisJCQkJKyB0YXNrLT5yZWFsX3N0YXJ0X3RpbWUudHZfbnNlYzsKIAkvKiBjb252ZXJ0IG5zZWMgLT4gdGlja3MgKi8KIAlzdGFydF90aW1lID0gbnNlY190b19jbG9ja190KHN0YXJ0X3RpbWUpOwogCi0JcmVzID0gc3ByaW50ZihidWZmZXIsIiVkICglcykgJWMgJWQgJWQgJWQgJWQgJWQgJXUgJWx1IFwKKwlyZXMgPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICglcykgJWMgJWQgJWQgJWQgJWQgJWQgJXUgJWx1IFwKICVsdSAlbHUgJWx1ICVsdSAlbHUgJWxkICVsZCAlbGQgJWxkICVkIDAgJWxsdSAlbHUgJWxkICVsdSAlbHUgJWx1ICVsdSAlbHUgXAogJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlZCAlZCAldSAldSAlbGx1XG4iLAogCQl0YXNrLT5waWQsCkBAIC00NzEsNyArNDgxLDcgQEAKIAkJc3RhcnRfdGltZSwKIAkJdnNpemUsCiAJCW1tID8gZ2V0X21tX3JzcyhtbSkgOiAwLAotCSAgICAgICAgcnNzbGltLAorCQlyc3NsaW0sCiAJCW1tID8gbW0tPnN0YXJ0X2NvZGUgOiAwLAogCQltbSA/IG1tLT5lbmRfY29kZSA6IDAsCiAJCW1tID8gbW0tPnN0YXJ0X3N0YWNrIDogMCwKQEAgLTQ5MywxNyArNTAzLDE3IEBACiAJCXRhc2stPnJ0X3ByaW9yaXR5LAogCQl0YXNrLT5wb2xpY3ksCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsYXlhY2N0X2Jsa2lvX3RpY2tzKHRhc2spKTsKLQlpZihtbSkKKwlpZiAobW0pCiAJCW1tcHV0KG1tKTsKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgcHJvY190aWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCitpbnQgcHJvY190aWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKIHsKIAlyZXR1cm4gZG9fdGFza19zdGF0KHRhc2ssIGJ1ZmZlciwgMCk7CiB9CiAKLWludCBwcm9jX3RnaWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCitpbnQgcHJvY190Z2lkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCiB7CiAJcmV0dXJuIGRvX3Rhc2tfc3RhdCh0YXNrLCBidWZmZXIsIDEpOwogfQpAQCAtNTEyLDEyICs1MjIsMTIgQEAKIHsKIAlpbnQgc2l6ZSA9IDAsIHJlc2lkZW50ID0gMCwgc2hhcmVkID0gMCwgdGV4dCA9IDAsIGxpYiA9IDAsIGRhdGEgPSAwOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7Ci0JCisKIAlpZiAobW0pIHsKIAkJc2l6ZSA9IHRhc2tfc3RhdG0obW0sICZzaGFyZWQsICZ0ZXh0LCAmZGF0YSwgJnJlc2lkZW50KTsKIAkJbW1wdXQobW0pOwogCX0KIAotCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwiJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCiAJCSAgICAgICBzaXplLCByZXNpZGVudCwgc2hhcmVkLCB0ZXh0LCBsaWIsIGRhdGEsIDApOwogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA0NmVhNWQ1Li40MmNiNGY1IDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtNjcsNyArNjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CkBAIC0yMDQsMTIgKzIwMywxNyBAQAogCWludCByZXMgPSAwOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CiAJaWYgKG1tKSB7Ci0JCXVuc2lnbmVkIGludCBsZW4gPSBtbS0+ZW52X2VuZCAtIG1tLT5lbnZfc3RhcnQ7CisJCXVuc2lnbmVkIGludCBsZW47CisKKwkJcmVzID0gLUVTUkNIOworCQlpZiAoIXB0cmFjZV9tYXlfYXR0YWNoKHRhc2spKQorCQkJZ290byBvdXQ7CisKKwkJbGVuICA9IG1tLT5lbnZfZW5kIC0gbW0tPmVudl9zdGFydDsKIAkJaWYgKGxlbiA+IFBBR0VfU0laRSkKIAkJCWxlbiA9IFBBR0VfU0laRTsKIAkJcmVzID0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgbW0tPmVudl9zdGFydCwgYnVmZmVyLCBsZW4sIDApOwotCQlpZiAoIXB0cmFjZV9tYXlfYXR0YWNoKHRhc2spKQotCQkJcmVzID0gLUVTUkNIOworb3V0OgogCQltbXB1dChtbSk7CiAJfQogCXJldHVybiByZXM7CkBAIC0yNzksNyArMjgzLDcgQEAKIHN0YXRpYyBpbnQgcHJvY19waWRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCiB7CiAJdW5zaWduZWQgbG9uZyB3Y2hhbjsKLQljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTisxXTsKKwljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTl07CiAKIAl3Y2hhbiA9IGdldF93Y2hhbih0YXNrKTsKIApAQCAtODEyLDcxICs4MTYsNiBAQAogfTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NFQ0NPTVAKLXN0YXRpYyBzc2l6ZV90IHNlY2NvbXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGdldF9wcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOwotCWNoYXIgX19idWZbMjBdOwotCXNpemVfdCBsZW47Ci0KLQlpZiAoIXRzaykKLQkJcmV0dXJuIC1FU1JDSDsKLQkvKiBubyBuZWVkIHRvIHByaW50IHRoZSB0cmFpbGluZyB6ZXJvLCBzbyB1c2Ugb25seSBsZW4gKi8KLQlsZW4gPSBzcHJpbnRmKF9fYnVmLCAiJXVcbiIsIHRzay0+c2VjY29tcC5tb2RlKTsKLQlwdXRfdGFza19zdHJ1Y3QodHNrKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBfX2J1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2VjY29tcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBnZXRfcHJvY190YXNrKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQljaGFyIF9fYnVmWzIwXSwgKmVuZDsKLQl1bnNpZ25lZCBpbnQgc2VjY29tcF9tb2RlOwotCXNzaXplX3QgcmVzdWx0OwotCi0JcmVzdWx0ID0gLUVTUkNIOwotCWlmICghdHNrKQotCQlnb3RvIG91dF9ub190YXNrOwotCi0JLyogY2FuIHNldCBpdCBvbmx5IG9uY2UgdG8gYmUgZXZlbiBtb3JlIHNlY3VyZSAqLwotCXJlc3VsdCA9IC1FUEVSTTsKLQlpZiAodW5saWtlbHkodHNrLT5zZWNjb21wLm1vZGUpKQotCQlnb3RvIG91dDsKLQotCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JbWVtc2V0KF9fYnVmLCAwLCBzaXplb2YoX19idWYpKTsKLQljb3VudCA9IG1pbihjb3VudCwgc2l6ZW9mKF9fYnVmKSAtIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihfX2J1ZiwgYnVmLCBjb3VudCkpCi0JCWdvdG8gb3V0OwotCi0Jc2VjY29tcF9tb2RlID0gc2ltcGxlX3N0cnRvdWwoX19idWYsICZlbmQsIDApOwotCWlmICgqZW5kID09ICdcbicpCi0JCWVuZCsrOwotCXJlc3VsdCA9IC1FSU5WQUw7Ci0JaWYgKHNlY2NvbXBfbW9kZSAmJiBzZWNjb21wX21vZGUgPD0gTlJfU0VDQ09NUF9NT0RFUykgewotCQl0c2stPnNlY2NvbXAubW9kZSA9IHNlY2NvbXBfbW9kZTsKLQkJc2V0X3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9TRUNDT01QKTsKLQl9IGVsc2UKLQkJZ290byBvdXQ7Ci0JcmVzdWx0ID0gLUVJTzsKLQlpZiAodW5saWtlbHkoIShlbmQgLSBfX2J1ZikpKQotCQlnb3RvIG91dDsKLQlyZXN1bHQgPSBlbmQgLSBfX2J1ZjsKLW91dDoKLQlwdXRfdGFza19zdHJ1Y3QodHNrKTsKLW91dF9ub190YXNrOgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc2VjY29tcF9vcGVyYXRpb25zID0gewotCS5yZWFkCQk9IHNlY2NvbXBfcmVhZCwKLQkud3JpdGUJCT0gc2VjY29tcF93cml0ZSwKLX07Ci0jZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KLQogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT04KIHN0YXRpYyBzc2l6ZV90IHByb2NfZmF1bHRfaW5qZWN0X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKIAkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTIwMzcsOSArMTk3Niw2IEBACiAJUkVHKCJudW1hX21hcHMiLCAgU19JUlVHTywgbnVtYV9tYXBzKSwKICNlbmRpZgogCVJFRygibWVtIiwgICAgICAgIFNfSVJVU1J8U19JV1VTUiwgbWVtKSwKLSNpZmRlZiBDT05GSUdfU0VDQ09NUAotCVJFRygic2VjY29tcCIsICAgIFNfSVJVU1J8U19JV1VTUiwgc2VjY29tcCksCi0jZW5kaWYKIAlMTksoImN3ZCIsICAgICAgICBjd2QpLAogCUxOSygicm9vdCIsICAgICAgIHJvb3QpLAogCUxOSygiZXhlIiwgICAgICAgIGV4ZSksCkBAIC0yMzI0LDkgKzIyNjAsNiBAQAogCVJFRygibnVtYV9tYXBzIiwgU19JUlVHTywgbnVtYV9tYXBzKSwKICNlbmRpZgogCVJFRygibWVtIiwgICAgICAgU19JUlVTUnxTX0lXVVNSLCBtZW0pLAotI2lmZGVmIENPTkZJR19TRUNDT01QCi0JUkVHKCJzZWNjb21wIiwgICBTX0lSVVNSfFNfSVdVU1IsIHNlY2NvbXApLAotI2VuZGlmCiAJTE5LKCJjd2QiLCAgICAgICBjd2QpLAogCUxOSygicm9vdCIsICAgICAgcm9vdCksCiAJTE5LKCJleGUiLCAgICAgICBleGUpLApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9nZW5lcmljLmMgYi9mcy9wcm9jL2dlbmVyaWMuYwppbmRleCA4YTQwZTE1Li5iNWU3MTU1IDEwMDY0NAotLS0gYS9mcy9wcm9jL2dlbmVyaWMuYworKysgYi9mcy9wcm9jL2dlbmVyaWMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC01MjksMTIgKzUzMCw2IEBACiAJCXJldHVybiAtRUFHQUlOOwogCWRwLT5sb3dfaW5vID0gaTsKIAotCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7Ci0JZHAtPm5leHQgPSBkaXItPnN1YmRpcjsKLQlkcC0+cGFyZW50ID0gZGlyOwotCWRpci0+c3ViZGlyID0gZHA7Ci0Jc3Bpbl91bmxvY2soJnByb2Nfc3ViZGlyX2xvY2spOwotCiAJaWYgKFNfSVNESVIoZHAtPm1vZGUpKSB7CiAJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpIHsKIAkJCWRwLT5wcm9jX2ZvcHMgPSAmcHJvY19kaXJfb3BlcmF0aW9uczsKQEAgLTU1MCw2ICs1NDUsMTMgQEAKIAkJaWYgKGRwLT5wcm9jX2lvcHMgPT0gTlVMTCkKIAkJCWRwLT5wcm9jX2lvcHMgPSAmcHJvY19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJfQorCisJc3Bpbl9sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKKwlkcC0+bmV4dCA9IGRpci0+c3ViZGlyOworCWRwLT5wYXJlbnQgPSBkaXI7CisJZGlyLT5zdWJkaXIgPSBkcDsKKwlzcGluX3VubG9jaygmcHJvY19zdWJkaXJfbG9jayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjEzLDYgKzYxNSw5IEBACiAJZW50LT5uYW1lbGVuID0gbGVuOwogCWVudC0+bW9kZSA9IG1vZGU7CiAJZW50LT5ubGluayA9IG5saW5rOworCWVudC0+cGRlX3VzZXJzID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmZW50LT5wZGVfdW5sb2FkX2xvY2spOworCWVudC0+cGRlX3VubG9hZF9jb21wbGV0aW9uID0gTlVMTDsKICBvdXQ6CiAJcmV0dXJuIGVudDsKIH0KQEAgLTY0OSw5ICs2NTQsNiBAQAogCiAJZW50ID0gcHJvY19jcmVhdGUoJnBhcmVudCwgbmFtZSwgU19JRkRJUiB8IG1vZGUsIDIpOwogCWlmIChlbnQpIHsKLQkJZW50LT5wcm9jX2ZvcHMgPSAmcHJvY19kaXJfb3BlcmF0aW9uczsKLQkJZW50LT5wcm9jX2lvcHMgPSAmcHJvY19kaXJfaW5vZGVfb3BlcmF0aW9uczsKLQogCQlpZiAocHJvY19yZWdpc3RlcihwYXJlbnQsIGVudCkgPCAwKSB7CiAJCQlrZnJlZShlbnQpOwogCQkJZW50ID0gTlVMTDsKQEAgLTY4NiwxMCArNjg4LDYgQEAKIAogCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsbmFtZSxtb2RlLG5saW5rKTsKIAlpZiAoZW50KSB7Ci0JCWlmIChTX0lTRElSKG1vZGUpKSB7Ci0JCQllbnQtPnByb2NfZm9wcyA9ICZwcm9jX2Rpcl9vcGVyYXRpb25zOwotCQkJZW50LT5wcm9jX2lvcHMgPSAmcHJvY19kaXJfaW5vZGVfb3BlcmF0aW9uczsKLQkJfQogCQlpZiAocHJvY19yZWdpc3RlcihwYXJlbnQsIGVudCkgPCAwKSB7CiAJCQlrZnJlZShlbnQpOwogCQkJZW50ID0gTlVMTDsKQEAgLTczNCw5ICs3MzIsMzUgQEAKIAkJZGUgPSAqcDsKIAkJKnAgPSBkZS0+bmV4dDsKIAkJZGUtPm5leHQgPSBOVUxMOworCisJCXNwaW5fbG9jaygmZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCS8qCisJCSAqIFN0b3AgYWNjZXB0aW5nIG5ldyBjYWxsZXJzIGludG8gbW9kdWxlLiBJZiB5b3UncmUKKwkJICogZHluYW1pY2FsbHkgYWxsb2NhdGluZyAtPnByb2NfZm9wcywgc2F2ZSBhIHBvaW50ZXIgc29tZXdoZXJlLgorCQkgKi8KKwkJZGUtPnByb2NfZm9wcyA9IE5VTEw7CisJCS8qIFdhaXQgdW50aWwgYWxsIGV4aXN0aW5nIGNhbGxlcnMgaW50byBtb2R1bGUgYXJlIGRvbmUuICovCisJCWlmIChkZS0+cGRlX3VzZXJzID4gMCkgeworCQkJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soYyk7CisKKwkJCWlmICghZGUtPnBkZV91bmxvYWRfY29tcGxldGlvbikKKwkJCQlkZS0+cGRlX3VubG9hZF9jb21wbGV0aW9uID0gJmM7CisKKwkJCXNwaW5fdW5sb2NrKCZkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKKworCQkJd2FpdF9mb3JfY29tcGxldGlvbihkZS0+cGRlX3VubG9hZF9jb21wbGV0aW9uKTsKKworCQkJc3Bpbl9sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKKwkJCWdvdG8gY29udGludWVfcmVtb3Zpbmc7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRlLT5wZGVfdW5sb2FkX2xvY2spOworCitjb250aW51ZV9yZW1vdmluZzoKIAkJaWYgKFNfSVNESVIoZGUtPm1vZGUpKQogCQkJcGFyZW50LT5ubGluay0tOwotCQlwcm9jX2tpbGxfaW5vZGVzKGRlKTsKKwkJaWYgKCFTX0lTUkVHKGRlLT5tb2RlKSkKKwkJCXByb2Nfa2lsbF9pbm9kZXMoZGUpOwogCQlkZS0+bmxpbmsgPSAwOwogCQlXQVJOX09OKGRlLT5zdWJkaXIpOwogCQlpZiAoIWF0b21pY19yZWFkKCZkZS0+Y291bnQpKQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCmluZGV4IGQ1Y2U2NWMuLmRkMjhlODYgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW5vZGUuYworKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTE0MCw2ICsxNDEsMjUxIEBACiAJLnJlbW91bnRfZnMJPSBwcm9jX3JlbW91bnQsCiB9OwogCitzdGF0aWMgdm9pZCBwZGVfdXNlcnNfZGVjKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlKQoreworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCXBkZS0+cGRlX3VzZXJzLS07CisJaWYgKHBkZS0+cGRlX3VubG9hZF9jb21wbGV0aW9uICYmIHBkZS0+cGRlX3VzZXJzID09IDApCisJCWNvbXBsZXRlKHBkZS0+cGRlX3VubG9hZF9jb21wbGV0aW9uKTsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworfQorCitzdGF0aWMgbG9mZl90IHByb2NfcmVnX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlsb2ZmX3QgcnYgPSAtRUlOVkFMOworCWxvZmZfdCAoKmxsc2Vlaykoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJLyoKKwkgKiByZW1vdmVfcHJvY19lbnRyeSgpIGlzIGdvaW5nIHRvIGRlbGV0ZSBQREUgKGFzIHBhcnQgb2YgbW9kdWxlCisJICogY2xlYW51cCBzZXF1ZW5jZSkuIE5vIG5ldyBjYWxsZXJzIGludG8gbW9kdWxlIGFsbG93ZWQuCisJICovCisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCS8qCisJICogQnVtcCByZWZjb3VudCBzbyB0aGF0IHJlbW92ZV9wcm9jX2VudHJ5IHdpbGwgd2FpbCBmb3IgLT5sbHNlZWsgdG8KKwkgKiBjb21wbGV0ZS4KKwkgKi8KKwlwZGUtPnBkZV91c2VycysrOworCS8qCisJICogU2F2ZSBmdW5jdGlvbiBwb2ludGVyIHVuZGVyIGxvY2ssIHRvIHByb3RlY3QgYWdhaW5zdCAtPnByb2NfZm9wcworCSAqIE5VTEwnaWZ5aW5nIHJpZ2h0IGFmdGVyIC0+cGRlX3VubG9hZF9sb2NrIGlzIGRyb3BwZWQuCisJICovCisJbGxzZWVrID0gcGRlLT5wcm9jX2ZvcHMtPmxsc2VlazsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKCFsbHNlZWspCisJCWxsc2VlayA9IGRlZmF1bHRfbGxzZWVrOworCXJ2ID0gbGxzZWVrKGZpbGUsIG9mZnNldCwgd2hlbmNlKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCXNzaXplX3QgcnYgPSAtRUlPOworCXNzaXplX3QgKCpyZWFkKShzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCXJlYWQgPSBwZGUtPnByb2NfZm9wcy0+cmVhZDsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKHJlYWQpCisJCXJ2ID0gcmVhZChmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVnX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlzc2l6ZV90IHJ2ID0gLUVJTzsKKwlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJd3JpdGUgPSBwZGUtPnByb2NfZm9wcy0+d3JpdGU7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmICh3cml0ZSkKKwkJcnYgPSB3cml0ZShmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHJvY19yZWdfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwdHMpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJdW5zaWduZWQgaW50IHJ2ID0gMDsKKwl1bnNpZ25lZCBpbnQgKCpwb2xsKShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CisKKwlzcGluX2xvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwlpZiAoIXBkZS0+cHJvY19mb3BzKSB7CisJCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJCXJldHVybiBydjsKKwl9CisJcGRlLT5wZGVfdXNlcnMrKzsKKwlwb2xsID0gcGRlLT5wcm9jX2ZvcHMtPnBvbGw7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChwb2xsKQorCQlydiA9IHBvbGwoZmlsZSwgcHRzKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBsb25nIHByb2NfcmVnX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlsb25nIHJ2ID0gLUVOT1RUWTsKKwlsb25nICgqdW5sb2NrZWRfaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisJaW50ICgqaW9jdGwpKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJdW5sb2NrZWRfaW9jdGwgPSBwZGUtPnByb2NfZm9wcy0+dW5sb2NrZWRfaW9jdGw7CisJaW9jdGwgPSBwZGUtPnByb2NfZm9wcy0+aW9jdGw7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmICh1bmxvY2tlZF9pb2N0bCkgeworCQlydiA9IHVubG9ja2VkX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwkJaWYgKHJ2ID09IC1FTk9JT0NUTENNRCkKKwkJCXJ2ID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKGlvY3RsKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJ2ID0gaW9jdGwoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgZmlsZSwgY21kLCBhcmcpOworCQl1bmxvY2tfa2VybmVsKCk7CisJfQorCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIHByb2NfcmVnX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJbG9uZyBydiA9IC1FTk9UVFk7CisJbG9uZyAoKmNvbXBhdF9pb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCWNvbXBhdF9pb2N0bCA9IHBkZS0+cHJvY19mb3BzLT5jb21wYXRfaW9jdGw7CisJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKworCWlmIChjb21wYXRfaW9jdGwpCisJCXJ2ID0gY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwcm9jX3JlZ19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgcnYgPSAtRUlPOworCWludCAoKm1tYXApKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCW1tYXAgPSBwZGUtPnByb2NfZm9wcy0+bW1hcDsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKG1tYXApCisJCXJ2ID0gbW1hcChmaWxlLCB2bWEpOworCisJcGRlX3VzZXJzX2RlYyhwZGUpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBwcm9jX3JlZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlID0gUERFKGlub2RlKTsKKwlpbnQgcnYgPSAwOworCWludCAoKm9wZW4pKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworCXNwaW5fbG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCWlmICghcGRlLT5wcm9jX2ZvcHMpIHsKKwkJc3Bpbl91bmxvY2soJnBkZS0+cGRlX3VubG9hZF9sb2NrKTsKKwkJcmV0dXJuIHJ2OworCX0KKwlwZGUtPnBkZV91c2VycysrOworCW9wZW4gPSBwZGUtPnByb2NfZm9wcy0+b3BlbjsKKwlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCisJaWYgKG9wZW4pCisJCXJ2ID0gb3Blbihpbm9kZSwgZmlsZSk7CisKKwlwZGVfdXNlcnNfZGVjKHBkZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHByb2NfcmVnX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBQREUoaW5vZGUpOworCWludCBydiA9IDA7CisJaW50ICgqcmVsZWFzZSkoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworCisJc3Bpbl9sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisJaWYgKCFwZGUtPnByb2NfZm9wcykgeworCQlzcGluX3VubG9jaygmcGRlLT5wZGVfdW5sb2FkX2xvY2spOworCQlyZXR1cm4gcnY7CisJfQorCXBkZS0+cGRlX3VzZXJzKys7CisJcmVsZWFzZSA9IHBkZS0+cHJvY19mb3BzLT5yZWxlYXNlOworCXNwaW5fdW5sb2NrKCZwZGUtPnBkZV91bmxvYWRfbG9jayk7CisKKwlpZiAocmVsZWFzZSkKKwkJcnYgPSByZWxlYXNlKGlub2RlLCBmaWxlKTsKKworCXBkZV91c2Vyc19kZWMocGRlKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfcmVnX2ZpbGVfb3BzID0geworCS5sbHNlZWsJCT0gcHJvY19yZWdfbGxzZWVrLAorCS5yZWFkCQk9IHByb2NfcmVnX3JlYWQsCisJLndyaXRlCQk9IHByb2NfcmVnX3dyaXRlLAorCS5wb2xsCQk9IHByb2NfcmVnX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsCT0gcHJvY19yZWdfdW5sb2NrZWRfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBwcm9jX3JlZ19jb21wYXRfaW9jdGwsCisjZW5kaWYKKwkubW1hcAkJPSBwcm9jX3JlZ19tbWFwLAorCS5vcGVuCQk9IHByb2NfcmVnX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX3JlZ19yZWxlYXNlLAorfTsKKwogc3RydWN0IGlub2RlICpwcm9jX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaW5vLAogCQkJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCiB7CkBAIC0xNjYsOCArNDEyLDEyIEBACiAJCQlpbm9kZS0+aV9ubGluayA9IGRlLT5ubGluazsKIAkJaWYgKGRlLT5wcm9jX2lvcHMpCiAJCQlpbm9kZS0+aV9vcCA9IGRlLT5wcm9jX2lvcHM7Ci0JCWlmIChkZS0+cHJvY19mb3BzKQotCQkJaW5vZGUtPmlfZm9wID0gZGUtPnByb2NfZm9wczsKKwkJaWYgKGRlLT5wcm9jX2ZvcHMpIHsKKwkJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3JlZ19maWxlX29wczsKKwkJCWVsc2UKKwkJCQlpbm9kZS0+aV9mb3AgPSBkZS0+cHJvY19mb3BzOworCQl9CiAJfQogCiAJcmV0dXJuIGlub2RlOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX21pc2MuYyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKaW5kZXggNWZkNDllNC4uZDI0YjhkNCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX21pc2MuYworKysgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCkBAIC0xMDUsNiArMTA1LDcgQEAKIAljcHV0aW1lX3QgaWRsZXRpbWUgPSBjcHV0aW1lX2FkZChpbml0X3Rhc2sudXRpbWUsIGluaXRfdGFzay5zdGltZSk7CiAKIAlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmdXB0aW1lKTsKKwltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZ1cHRpbWUpOwogCWNwdXRpbWVfdG9fdGltZXNwZWMoaWRsZXRpbWUsICZpZGxlKTsKIAlsZW4gPSBzcHJpbnRmKHBhZ2UsIiVsdS4lMDJsdSAlbHUuJTAybHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZykgdXB0aW1lLnR2X3NlYywKQEAgLTQ0MywxMiArNDQ0LDEyIEBACiAJdW5zaWduZWQgbG9uZyBqaWY7CiAJY3B1dGltZTY0X3QgdXNlciwgbmljZSwgc3lzdGVtLCBpZGxlLCBpb3dhaXQsIGlycSwgc29mdGlycSwgc3RlYWw7CiAJdTY0IHN1bSA9IDA7CisJc3RydWN0IHRpbWVzcGVjIGJvb3R0aW1lOwogCiAJdXNlciA9IG5pY2UgPSBzeXN0ZW0gPSBpZGxlID0gaW93YWl0ID0KIAkJaXJxID0gc29mdGlycSA9IHN0ZWFsID0gY3B1dGltZTY0X3plcm87Ci0JamlmID0gLSB3YWxsX3RvX21vbm90b25pYy50dl9zZWM7Ci0JaWYgKHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMpCi0JCS0tamlmOworCWdldGJvb3R0aW1lKCZib290dGltZSk7CisJamlmID0gYm9vdHRpbWUudHZfc2VjOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJaW50IGo7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfdHR5LmMgYi9mcy9wcm9jL3Byb2NfdHR5LmMKaW5kZXggYjNhNDczYi4uMjI4NDYyMiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX3R0eS5jCisrKyBiL2ZzL3Byb2MvcHJvY190dHkuYwpAQCAtNjksNyArNjksNyBAQAogCiBzdGF0aWMgaW50IHNob3dfdHR5X2RyaXZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKnAgPSB2OworCXN0cnVjdCB0dHlfZHJpdmVyICpwID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgdHR5X2RyaXZlciwgdHR5X2RyaXZlcnMpOwogCWRldl90IGZyb20gPSBNS0RFVihwLT5tYWpvciwgcC0+bWlub3Jfc3RhcnQpOwogCWRldl90IHRvID0gZnJvbSArIHAtPm51bTsKIApAQCAtMTA2LDIyICsxMDYsMTMgQEAKIC8qIGl0ZXJhdG9yICovCiBzdGF0aWMgdm9pZCAqdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0JbG9mZl90IGwgPSAqcG9zOwotCiAJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZ0dHlfZHJpdmVycykKLQkJaWYgKCFsLS0pCi0JCQlyZXR1cm4gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgdHR5X2RyaXZlciwgdHR5X2RyaXZlcnMpOwotCXJldHVybiBOVUxMOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmdHR5X2RyaXZlcnMsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqdF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCA9ICgoc3RydWN0IHR0eV9kcml2ZXIgKil2KS0+dHR5X2RyaXZlcnMubmV4dDsKLQkoKnBvcykrKzsKLQlyZXR1cm4gcD09JnR0eV9kcml2ZXJzID8gTlVMTCA6Ci0JCQlsaXN0X2VudHJ5KHAsIHN0cnVjdCB0dHlfZHJpdmVyLCB0dHlfZHJpdmVycyk7CisJcmV0dXJuIHNlcV9saXN0X25leHQodiwgJnR0eV9kcml2ZXJzLCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCB0X3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEuYyBiL2ZzL3F1b3RhLmMKaW5kZXggOWYyMzdkNi4uZTY1NzdhYyAxMDA2NDQKLS0tIGEvZnMvcXVvdGEuYworKysgYi9mcy9xdW90YS5jCkBAIC0xMCwxMiArMTAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIENoZWNrIHZhbGlkaXR5IG9mIGdlbmVyaWMgcXVvdGFjdGwgY29tbWFuZHMgKi8KIHN0YXRpYyBpbnQgZ2VuZXJpY19xdW90YWN0bF92YWxpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGNtZCwgcWlkX3QgaWQpCkBAIC0zODQsMyArMzg2LDExOSBAQAogCiAJcmV0dXJuIHJldDsKIH0KKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkKKy8qCisgKiBUaGlzIGNvZGUgd29ya3Mgb25seSBmb3IgMzIgYml0IHF1b3RhIHRvb2xzIG92ZXIgNjQgYml0IE9TICh4ODZfNjQsIGlhNjQpCisgKiBhbmQgaXMgbmVjZXNzYXJ5IGR1ZSB0byBhbGlnbm1lbnQgcHJvYmxlbXMuCisgKi8KK3N0cnVjdCBjb21wYXRfaWZfZHFibGsgeworCWNvbXBhdF91NjQgZHFiX2JoYXJkbGltaXQ7CisJY29tcGF0X3U2NCBkcWJfYnNvZnRsaW1pdDsKKwljb21wYXRfdTY0IGRxYl9jdXJzcGFjZTsKKwljb21wYXRfdTY0IGRxYl9paGFyZGxpbWl0OworCWNvbXBhdF91NjQgZHFiX2lzb2Z0bGltaXQ7CisJY29tcGF0X3U2NCBkcWJfY3VyaW5vZGVzOworCWNvbXBhdF91NjQgZHFiX2J0aW1lOworCWNvbXBhdF91NjQgZHFiX2l0aW1lOworCWNvbXBhdF91aW50X3QgZHFiX3ZhbGlkOworfTsKKworLyogWEZTIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBjb21wYXRfZnNfcWZpbGVzdGF0IHsKKwljb21wYXRfdTY0IGRxYl9iaGFyZGxpbWl0OworCWNvbXBhdF91NjQgcWZzX25ibGtzOworCWNvbXBhdF91aW50X3QgcWZzX25leHRlbnRzOworfTsKKworc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0IHsKKwlfX3M4CQlxc192ZXJzaW9uOworCV9fdTE2CQlxc19mbGFnczsKKwlfX3M4CQlxc19wYWQ7CisJc3RydWN0IGNvbXBhdF9mc19xZmlsZXN0YXQJcXNfdXF1b3RhOworCXN0cnVjdCBjb21wYXRfZnNfcWZpbGVzdGF0CXFzX2dxdW90YTsKKwljb21wYXRfdWludF90CXFzX2luY29yZWRxczsKKwljb21wYXRfaW50X3QJcXNfYnRpbWVsaW1pdDsKKwljb21wYXRfaW50X3QJcXNfaXRpbWVsaW1pdDsKKwljb21wYXRfaW50X3QJcXNfcnRidGltZWxpbWl0OworCV9fdTE2CQlxc19id2FybmxpbWl0OworCV9fdTE2CQlxc19pd2FybmxpbWl0OworfTsKKworYXNtbGlua2FnZSBsb25nIHN5czMyX3F1b3RhY3RsKHVuc2lnbmVkIGludCBjbWQsIGNvbnN0IGNoYXIgX191c2VyICpzcGVjaWFsLAorCQkJCQkJcWlkX3QgaWQsIHZvaWQgX191c2VyICphZGRyKQoreworCXVuc2lnbmVkIGludCBjbWRzOworCXN0cnVjdCBpZl9kcWJsayBfX3VzZXIgKmRxYmxrOworCXN0cnVjdCBjb21wYXRfaWZfZHFibGsgX191c2VyICpjb21wYXRfZHFibGs7CisJc3RydWN0IGZzX3F1b3RhX3N0YXQgX191c2VyICpmc3FzdGF0OworCXN0cnVjdCBjb21wYXRfZnNfcXVvdGFfc3RhdCBfX3VzZXIgKmNvbXBhdF9mc3FzdGF0OworCWNvbXBhdF91aW50X3QgZGF0YTsKKwl1MTYgeGRhdGE7CisJbG9uZyByZXQ7CisKKwljbWRzID0gY21kID4+IFNVQkNNRFNISUZUOworCisJc3dpdGNoIChjbWRzKSB7CisJY2FzZSBRX0dFVFFVT1RBOgorCQlkcWJsayA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgaWZfZHFibGspKTsKKwkJY29tcGF0X2RxYmxrID0gYWRkcjsKKwkJcmV0ID0gc3lzX3F1b3RhY3RsKGNtZCwgc3BlY2lhbCwgaWQsIGRxYmxrKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlpZiAoY29weV9pbl91c2VyKGNvbXBhdF9kcWJsaywgZHFibGssIHNpemVvZigqY29tcGF0X2RxYmxrKSkgfHwKKwkJCWdldF91c2VyKGRhdGEsICZkcWJsay0+ZHFiX3ZhbGlkKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmNvbXBhdF9kcWJsay0+ZHFiX3ZhbGlkKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgUV9TRVRRVU9UQToKKwkJZHFibGsgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmX2RxYmxrKSk7CisJCWNvbXBhdF9kcWJsayA9IGFkZHI7CisJCXJldCA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2luX3VzZXIoZHFibGssIGNvbXBhdF9kcWJsaywgc2l6ZW9mKCpjb21wYXRfZHFibGspKSB8fAorCQkJZ2V0X3VzZXIoZGF0YSwgJmNvbXBhdF9kcWJsay0+ZHFiX3ZhbGlkKSB8fAorCQkJcHV0X3VzZXIoZGF0YSwgJmRxYmxrLT5kcWJfdmFsaWQpKQorCQkJYnJlYWs7CisJCXJldCA9IHN5c19xdW90YWN0bChjbWQsIHNwZWNpYWwsIGlkLCBkcWJsayk7CisJCWJyZWFrOworCWNhc2UgUV9YR0VUUVNUQVQ6CisJCWZzcXN0YXQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGZzX3F1b3RhX3N0YXQpKTsKKwkJY29tcGF0X2ZzcXN0YXQgPSBhZGRyOworCQlyZXQgPSBzeXNfcXVvdGFjdGwoY21kLCBzcGVjaWFsLCBpZCwgZnNxc3RhdCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJLyogQ29weWluZyBxc192ZXJzaW9uLCBxc19mbGFncywgcXNfcGFkICovCisJCWlmIChjb3B5X2luX3VzZXIoY29tcGF0X2ZzcXN0YXQsIGZzcXN0YXQsCisJCQlvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQsIHFzX3VxdW90YSkpKQorCQkJYnJlYWs7CisJCS8qIENvcHlpbmcgcXNfdXF1b3RhICovCisJCWlmIChjb3B5X2luX3VzZXIoJmNvbXBhdF9mc3FzdGF0LT5xc191cXVvdGEsCisJCQkmZnNxc3RhdC0+cXNfdXF1b3RhLAorCQkJc2l6ZW9mKGNvbXBhdF9mc3FzdGF0LT5xc191cXVvdGEpKSB8fAorCQkJZ2V0X3VzZXIoZGF0YSwgJmZzcXN0YXQtPnFzX3VxdW90YS5xZnNfbmV4dGVudHMpIHx8CisJCQlwdXRfdXNlcihkYXRhLCAmY29tcGF0X2ZzcXN0YXQtPnFzX3VxdW90YS5xZnNfbmV4dGVudHMpKQorCQkJYnJlYWs7CisJCS8qIENvcHlpbmcgcXNfZ3F1b3RhICovCisJCWlmIChjb3B5X2luX3VzZXIoJmNvbXBhdF9mc3FzdGF0LT5xc19ncXVvdGEsCisJCQkmZnNxc3RhdC0+cXNfZ3F1b3RhLAorCQkJc2l6ZW9mKGNvbXBhdF9mc3FzdGF0LT5xc19ncXVvdGEpKSB8fAorCQkJZ2V0X3VzZXIoZGF0YSwgJmZzcXN0YXQtPnFzX2dxdW90YS5xZnNfbmV4dGVudHMpIHx8CisJCQlwdXRfdXNlcihkYXRhLCAmY29tcGF0X2ZzcXN0YXQtPnFzX2dxdW90YS5xZnNfbmV4dGVudHMpKQorCQkJYnJlYWs7CisJCS8qIENvcHlpbmcgdGhlIHJlc3QgKi8KKwkJaWYgKGNvcHlfaW5fdXNlcigmY29tcGF0X2ZzcXN0YXQtPnFzX2luY29yZWRxcywKKwkJCSZmc3FzdGF0LT5xc19pbmNvcmVkcXMsCisJCQlzaXplb2Yoc3RydWN0IGNvbXBhdF9mc19xdW90YV9zdGF0KSAtCisJCQlvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X2ZzX3F1b3RhX3N0YXQsIHFzX2luY29yZWRxcykpIHx8CisJCQlnZXRfdXNlcih4ZGF0YSwgJmZzcXN0YXQtPnFzX2l3YXJubGltaXQpIHx8CisJCQlwdXRfdXNlcih4ZGF0YSwgJmNvbXBhdF9mc3FzdGF0LT5xc19pd2FybmxpbWl0KSkKKwkJCWJyZWFrOworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSBzeXNfcXVvdGFjdGwoY21kLCBzcGVjaWFsLCBpZCwgYWRkcik7CisJfQorCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3JhbWZzL2lub2RlLmMgYi9mcy9yYW1mcy9pbm9kZS5jCmluZGV4IGQ0MGQyMmIuLmVmMmI0NmQgMTAwNjQ0Ci0tLSBhL2ZzL3JhbWZzL2lub2RlLmMKKysrIGIvZnMvcmFtZnMvaW5vZGUuYwpAQCAtNjAsNiArNjAsNyBAQAogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyYW1mc19hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJhbWZzX2JhY2tpbmdfZGV2X2luZm87CisJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcsIEdGUF9ISUdIVVNFUik7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maWxlLmMgYi9mcy9yZWlzZXJmcy9maWxlLmMKaW5kZXggMzBlZWJmYi4uMjA3MGFlZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZmlsZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwpAQCAtMTMwNSw3ICsxMzA1LDYgQEAKIAlpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNSAmJgogCSAgICAqcHBvcyArIGNvdW50ID4gTUFYX05PTl9MRlMpIHsKIAkJaWYgKCpwcG9zID49IE1BWF9OT05fTEZTKSB7Ci0JCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKIAkJCXJldHVybiAtRUZCSUc7CiAJCX0KIAkJaWYgKGNvdW50ID4gTUFYX05PTl9MRlMgLSAodW5zaWduZWQgbG9uZykqcHBvcykKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCmluZGV4IDEyNzJkMTEuLmRkZGU0ODkgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lub2RlLmMKKysrIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2FjbC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCBiNGFjOTExLi41YTkzY2ZlIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21udF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgpkaWZmIC0tZ2l0IGEvZnMvc2VxX2ZpbGUuYyBiL2ZzL3NlcV9maWxlLmMKaW5kZXggNDkxOTRhNC4uYmJiMTliZSAxMDA2NDQKLS0tIGEvZnMvc2VxX2ZpbGUuYworKysgYi9mcy9zZXFfZmlsZS5jCkBAIC0xNzcsMjEgKzE3NywyMyBAQAogCiBzdGF0aWMgaW50IHRyYXZlcnNlKHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90IG9mZnNldCkKIHsKLQlsb2ZmX3QgcG9zID0gMDsKKwlsb2ZmX3QgcG9zID0gMCwgaW5kZXg7CiAJaW50IGVycm9yID0gMDsKIAl2b2lkICpwOwogCiAJbS0+dmVyc2lvbiA9IDA7Ci0JbS0+aW5kZXggPSAwOworCWluZGV4ID0gMDsKIAltLT5jb3VudCA9IG0tPmZyb20gPSAwOwotCWlmICghb2Zmc2V0KQorCWlmICghb2Zmc2V0KSB7CisJCW0tPmluZGV4ID0gaW5kZXg7CiAJCXJldHVybiAwOworCX0KIAlpZiAoIW0tPmJ1ZikgewogCQltLT5idWYgPSBrbWFsbG9jKG0tPnNpemUgPSBQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCQlpZiAoIW0tPmJ1ZikKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwID0gbS0+b3AtPnN0YXJ0KG0sICZtLT5pbmRleCk7CisJcCA9IG0tPm9wLT5zdGFydChtLCAmaW5kZXgpOwogCXdoaWxlIChwKSB7CiAJCWVycm9yID0gUFRSX0VSUihwKTsKIAkJaWYgKElTX0VSUihwKSkKQEAgLTIwNCwxNSArMjA2LDE3IEBACiAJCWlmIChwb3MgKyBtLT5jb3VudCA+IG9mZnNldCkgewogCQkJbS0+ZnJvbSA9IG9mZnNldCAtIHBvczsKIAkJCW0tPmNvdW50IC09IG0tPmZyb207CisJCQltLT5pbmRleCA9IGluZGV4OwogCQkJYnJlYWs7CiAJCX0KIAkJcG9zICs9IG0tPmNvdW50OwogCQltLT5jb3VudCA9IDA7CiAJCWlmIChwb3MgPT0gb2Zmc2V0KSB7Ci0JCQltLT5pbmRleCsrOworCQkJaW5kZXgrKzsKKwkJCW0tPmluZGV4ID0gaW5kZXg7CiAJCQlicmVhazsKIAkJfQotCQlwID0gbS0+b3AtPm5leHQobSwgcCwgJm0tPmluZGV4KTsKKwkJcCA9IG0tPm9wLT5uZXh0KG0sIHAsICZpbmRleCk7CiAJfQogCW0tPm9wLT5zdG9wKG0sIHApOwogCXJldHVybiBlcnJvcjsKQEAgLTI2MCw4ICsyNjQsOCBAQAogCQkJCX0KIAkJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZtLT5sb2NrKTsKIAlmaWxlLT5mX3ZlcnNpb24gPSBtLT52ZXJzaW9uOworCW11dGV4X3VubG9jaygmbS0+bG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIEVYUE9SVF9TWU1CT0woc2VxX2xzZWVrKTsKZGlmZiAtLWdpdCBhL2ZzL3NwbGljZS5jIGIvZnMvc3BsaWNlLmMKaW5kZXggNmM5ODI4Ni4uNTNmYzIwOCAxMDA2NDQKLS0tIGEvZnMvc3BsaWNlLmMKKysrIGIvZnMvc3BsaWNlLmMKQEAgLTEwNjEsOCArMTA2MSw5IEBACiAKIAl3aGlsZSAobGVuKSB7CiAJCXNpemVfdCByZWFkX2xlbjsKKwkJbG9mZl90IHBvcyA9IHNkLT5wb3M7CiAKLQkJcmV0ID0gZG9fc3BsaWNlX3RvKGluLCAmc2QtPnBvcywgcGlwZSwgbGVuLCBmbGFncyk7CisJCXJldCA9IGRvX3NwbGljZV90byhpbiwgJnBvcywgcGlwZSwgbGVuLCBmbGFncyk7CiAJCWlmICh1bmxpa2VseShyZXQgPD0gMCkpCiAJCQlnb3RvIG91dF9yZWxlYXNlOwogCkBAIC0xMDgwLDYgKzEwODEsNyBAQAogCiAJCWJ5dGVzICs9IHJldDsKIAkJbGVuIC09IHJldDsKKwkJc2QtPnBvcyA9IHBvczsKIAogCQlpZiAocmV0IDwgcmVhZF9sZW4pCiAJCQlnb3RvIG91dF9yZWxlYXNlOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggNTI2MGQ2Mi4uZmM4ZWJlZCAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC04ODQsNiArODg0LDcgQEAKIAllcnJvciA9IHR5cGUtPmdldF9zYih0eXBlLCBmbGFncywgbmFtZSwgZGF0YSwgbW50KTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dF9mcmVlX3NlY2RhdGE7CisJQlVHX09OKCFtbnQtPm1udF9zYik7CiAKICAJZXJyb3IgPSBzZWN1cml0eV9zYl9rZXJuX21vdW50KG1udC0+bW50X3NiLCBzZWNkYXRhKTsKICAJaWYgKGVycm9yKQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2NyYy5jIGIvZnMvdWRmL2NyYy5jCmluZGV4IDFiODJhNGEuLmVmMmJmYWEgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9jcmMuYworKysgYi9mcy91ZGYvY3JjLmMKQEAgLTEwNiw4ICsxMDYsOCBAQAogewogCXVuc2lnbmVkIHNob3J0IHg7CiAKLQl4ID0gdWRmX2NyYzE2KGJ5dGVzLCBzaXplb2YgYnl0ZXMpOwotCXByaW50ZigidWRmX2NyYzE2OiBjYWxjdWxhdGVkID0gJTQuNHgsIGNvcnJlY3QgPSAlNC40eFxuIiwgeCwgMHgzMjk5VSk7CisJeCA9IHVkZl9jcmMoYnl0ZXMsIHNpemVvZiBieXRlcyk7CisJcHJpbnRmKCJ1ZGZfY3JjOiBjYWxjdWxhdGVkID0gJTQuNHgsIGNvcnJlY3QgPSAlNC40eFxuIiwgeCwgMHgzMjk5VSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3VkZi9pYWxsb2MuYyBiL2ZzL3VkZi9pYWxsb2MuYwppbmRleCA4MjA2OTgzLi4xMGYzMTg4IDEwMDY0NAotLS0gYS9mcy91ZGYvaWFsbG9jLmMKKysrIGIvZnMvdWRmL2lhbGxvYy5jCkBAIC01MCw3ICs1MCw3IEBACiAJCWVsc2UKIAkJCVVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcyA9CiAJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bUZpbGVzKSAtIDEpOwotCQkKKwogCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfbHZpZGJoKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwpAQCAtMTM2LDYgKzEzNiwxMyBAQAogCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKIAkJVURGX0lfREFUQShpbm9kZSkgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJfQorCWlmICghVURGX0lfREFUQShpbm9kZSkpCisJeworCQlpcHV0KGlub2RlKTsKKwkJKmVyciA9IC1FTk9NRU07CisJCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQikpCiAJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0I7CiAJZWxzZSBpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9TSE9SVF9BRCkpCmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IGJmN2RlMGIuLjViODJlNDggMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC00OSw2ICs0OSw3IEBACiBzdGF0aWMgbW9kZV90IHVkZl9jb252ZXJ0X3Blcm1pc3Npb25zKHN0cnVjdCBmaWxlRW50cnkgKik7CiBzdGF0aWMgaW50IHVkZl91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICosIGludCk7CiBzdGF0aWMgdm9pZCB1ZGZfZmlsbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc3RhdGljIGludCB1ZGZfYWxsb2NfaV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2dldGJsayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIGludCAqLAogCWxvbmcgKiwgaW50ICopOwogc3RhdGljIGludDhfdCB1ZGZfaW5zZXJ0X2FleHQoc3RydWN0IGlub2RlICosIHN0cnVjdCBleHRlbnRfcG9zaXRpb24sCkBAIC03MzQsNyArNzM1LDcgQEAKIAkJCSgqYykgKys7CiAJCQkoKmVuZG51bSkgKys7CiAJCX0KLQkJCisKIAkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gbmV3YmxvY2tudW07CiAJCWlmIChldHlwZSA9PSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkKIAkJCWxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CkBAIC04MzYsNyArODM3LDcgQEAKIAkJCQl7CiAJCQkJCW51bWFsbG9jIC09IGVsZW47CiAJCQkJCWlmICgqZW5kbnVtID4gKGkrMSkpCi0JCQkJCQltZW1tb3ZlKCZsYWFycltpXSwgJmxhYXJyW2krMV0sIAorCQkJCQkJbWVtbW92ZSgmbGFhcnJbaV0sICZsYWFycltpKzFdLAogCQkJCQkJCXNpemVvZihsb25nX2FkKSAqICgqZW5kbnVtIC0gKGkrMSkpKTsKIAkJCQkJaSAtLTsKIAkJCQkJKCplbmRudW0pIC0tOwpAQCAtMTAyNCw3ICsxMDI1LDcgQEAKIAl7CiAJCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgdWRmX2dldF9ibG9jayk7CiAJCXVkZl90cnVuY2F0ZV9leHRlbnRzKGlub2RlKTsKLQl9CQorCX0KIAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCWlmIChJU19TWU5DKGlub2RlKSkKQEAgLTEwODcsMTAgKzEwODgsMTAgQEAKIAkJCXsKIAkJCQlrZXJuZWxfbGJfYWRkciBsb2M7CiAJCQkJaWUgPSAoc3RydWN0IGluZGlyZWN0RW50cnkgKilpYmgtPmJfZGF0YTsKLQkKKwogCQkJCWxvYyA9IGxlbGJfdG9fY3B1KGllLT5pbmRpcmVjdElDQi5leHRMb2NhdGlvbik7Ci0JCi0JCQkJaWYgKGllLT5pbmRpcmVjdElDQi5leHRMZW5ndGggJiYgCisKKwkJCQlpZiAoaWUtPmluZGlyZWN0SUNCLmV4dExlbmd0aCAmJgogCQkJCQkobmJoID0gdWRmX3JlYWRfcHRhZ2dlZChpbm9kZS0+aV9zYiwgbG9jLCAwLCAmaWRlbnQpKSkKIAkJCQl7CiAJCQkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfRkUgfHwKQEAgLTExNTYsMTQgKzExNTcsMjIgQEAKIAl7CiAJCVVERl9JX0VGRShpbm9kZSkgPSAxOwogCQlVREZfSV9VU0UoaW5vZGUpID0gMDsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKSkKKwkJeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CiAJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSk7CiAJfQogCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfRkUpCiAJewogCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKIAkJVURGX0lfVVNFKGlub2RlKSA9IDA7Ci0JCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIEdGUF9LRVJORUwpOworCQlpZiAodWRmX2FsbG9jX2lfZGF0YShpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKSkKKwkJeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CiAJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKTsKIAl9CiAJZWxzZSBpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9VU0UpCkBAIC0xMTczLDcgKzExODIsMTEgQEAKIAkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0KIAkJCWxlMzJfdG9fY3B1KAogCQkJCSgoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5ICopYmgtPmJfZGF0YSktPmxlbmd0aEFsbG9jRGVzY3MpOwotCQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSksIEdGUF9LRVJORUwpOworCQlpZiAodWRmX2FsbG9jX2lfZGF0YShpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkpKQorCQl7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQlyZXR1cm47CisJCX0KIAkJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpLCBiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTExOTEsNyArMTIwNCw3IEBACiAJaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShmZS0+ZmlsZUxpbmtDb3VudCk7CiAJaWYgKCFpbm9kZS0+aV9ubGluaykKIAkJaW5vZGUtPmlfbmxpbmsgPSAxOwotCQorCiAJaW5vZGUtPmlfc2l6ZSA9IGxlNjRfdG9fY3B1KGZlLT5pbmZvcm1hdGlvbkxlbmd0aCk7CiAJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSBpbm9kZS0+aV9zaXplOwogCkBAIC0xMjQzLDcgKzEyNTYsNyBAQAogCX0KIAllbHNlCiAJewotCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShlZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwgCisJCWlub2RlLT5pX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KGVmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkKSA8PAogCQkJKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CiAKIAkJaWYgKCB1ZGZfc3RhbXBfdG9fdGltZSgmY29udnRpbWUsICZjb252dGltZV91c2VjLApAQCAtMTM3NCw2ICsxMzg3LDIwIEBACiAJfQogfQogCitzdGF0aWMgaW50IHVkZl9hbGxvY19pX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgc2l6ZV90IHNpemUpCit7CisJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisJaWYgKCFVREZfSV9EQVRBKGlub2RlKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOnVkZl9hbGxvY19pX2RhdGEgKGlubyAlbGQpIG5vIGZyZWUgbWVtb3J5XG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBtb2RlX3QKIHVkZl9jb252ZXJ0X3Blcm1pc3Npb25zKHN0cnVjdCBmaWxlRW50cnkgKmZlKQogewpAQCAtMjA3Miw3ICsyMDk5LDcgQEAKIAkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKG9lcG9zLmJoLCBpbm9kZSk7CiAJCX0KIAl9Ci0JCisKIAlicmVsc2UoZXBvcy5iaCk7CiAJYnJlbHNlKG9lcG9zLmJoKTsKIAlyZXR1cm4gKGVsZW4gPj4gMzApOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwppbmRleCAyMmZmNmVkLi4yYjMwMTE2IDEwMDY0NAotLS0gYS9mcy91ZnMvc3VwZXIuYworKysgYi9mcy91ZnMvc3VwZXIuYwpAQCAtODcsNiArODcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgpAQCAtODU0LDcgKzg1NSw3IEBACiAJdXNwaS0+c19mbWFzayA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mbWFzayk7CiAJdXNwaS0+c19mc2hpZnQgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KTsKIAotCWlmICh1c3BpLT5zX2ZzaXplICYgKHVzcGktPnNfZnNpemUgLSAxKSkgeworCWlmICghaXNfcG93ZXJfb2ZfMih1c3BpLT5zX2ZzaXplKSkgewogCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiBmcmFnbWVudCBzaXplICV1IGlzIG5vdCBhIHBvd2VyIG9mIDJcbiIsCiAJCQl1c3BpLT5zX2ZzaXplKTsKIAkJCWdvdG8gZmFpbGVkOwpAQCAtODY5LDcgKzg3MCw3IEBACiAJCQl1c3BpLT5zX2ZzaXplKTsKIAkJZ290byBmYWlsZWQ7CiAJfQotCWlmICh1c3BpLT5zX2JzaXplICYgKHVzcGktPnNfYnNpemUgLSAxKSkgeworCWlmICghaXNfcG93ZXJfb2ZfMih1c3BpLT5zX2JzaXplKSkgewogCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiBibG9jayBzaXplICV1IGlzIG5vdCBhIHBvd2VyIG9mIDJcbiIsCiAJCQl1c3BpLT5zX2JzaXplKTsKIAkJZ290byBmYWlsZWQ7CmRpZmYgLS1naXQgYS9mcy91dGltZXMuYyBiL2ZzL3V0aW1lcy5jCmluZGV4IGIzYzg4OTUuLjgzYTdlNjkgMTAwNjQ0Ci0tLSBhL2ZzL3V0aW1lcy5jCisrKyBiL2ZzL3V0aW1lcy5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZHB1dF9hbmRfb3V0OwogCi0JCWlmIChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpIHsKKwkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKSB7CiAJCQlpZiAoZikgewogCQkJCWlmICghKGYtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJCQkJZ290byBkcHV0X2FuZF9vdXQ7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCmluZGV4IDJkZjYzNjIuLmIwZjBlNTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCkBAIC0zNSwxMCArMzUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAKIHN0YXRpYyBrbWVtX3pvbmVfdCAqeGZzX2J1Zl96b25lOwotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqeGZzX2J1Zl9zaGFrZTsKIFNUQVRJQyBpbnQgeGZzYnVmZCh2b2lkICopOwogU1RBVElDIGludCB4ZnNidWZkX3dha2V1cChpbnQsIGdmcF90KTsKIFNUQVRJQyB2b2lkIHhmc19idWZfZGVsd3JpX3F1ZXVlKHhmc19idWZfdCAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBzaHJpbmtlciB4ZnNfYnVmX3NoYWtlID0geworCS5zaHJpbmsgPSB4ZnNidWZkX3dha2V1cCwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNsb2dkX3dvcmtxdWV1ZTsKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp4ZnNkYXRhZF93b3JrcXVldWU7CkBAIC0xODMyLDE0ICsxODM1LDkgQEAKIAlpZiAoIXhmc2RhdGFkX3dvcmtxdWV1ZSkKIAkJZ290byBvdXRfZGVzdHJveV94ZnNsb2dkX3dvcmtxdWV1ZTsKIAotCXhmc19idWZfc2hha2UgPSBzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgeGZzYnVmZF93YWtldXApOwotCWlmICgheGZzX2J1Zl9zaGFrZSkKLQkJZ290byBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU7Ci0KKwlyZWdpc3Rlcl9zaHJpbmtlcigmeGZzX2J1Zl9zaGFrZSk7CiAJcmV0dXJuIDA7CiAKLSBvdXRfZGVzdHJveV94ZnNkYXRhZF93b3JrcXVldWU6Ci0JZGVzdHJveV93b3JrcXVldWUoeGZzZGF0YWRfd29ya3F1ZXVlKTsKICBvdXRfZGVzdHJveV94ZnNsb2dkX3dvcmtxdWV1ZToKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAgb3V0X2ZyZWVfYnVmX3pvbmU6CkBAIC0xODU0LDcgKzE4NTIsNyBAQAogdm9pZAogeGZzX2J1Zl90ZXJtaW5hdGUodm9pZCkKIHsKLQlyZW1vdmVfc2hyaW5rZXIoeGZzX2J1Zl9zaGFrZSk7CisJdW5yZWdpc3Rlcl9zaHJpbmtlcigmeGZzX2J1Zl9zaGFrZSk7CiAJZGVzdHJveV93b3JrcXVldWUoeGZzZGF0YWRfd29ya3F1ZXVlKTsKIAlkZXN0cm95X3dvcmtxdWV1ZSh4ZnNsb2dkX3dvcmtxdWV1ZSk7CiAJa21lbV96b25lX2Rlc3Ryb3koeGZzX2J1Zl96b25lKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCmluZGV4IDA2ODk0Y2YuLjQ1MjhmOWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwpAQCAtNTYyLDYgKzU2Miw3IEBACiAJYmh2X3Zmc19zeW5jX3dvcmtfdAkqd29yaywgKm47CiAJTElTVF9IRUFECQkodG1wKTsKIAorCXNldF9mcmVlemFibGUoKTsKIAl0aW1lbGVmdCA9IHhmc19zeW5jZF9jZW50aXNlY3MgKiBtc2Vjc190b19qaWZmaWVzKDEwKTsKIAlmb3IgKDs7KSB7CiAJCXRpbWVsZWZ0ID0gc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKHRpbWVsZWZ0KTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5oCmluZGV4IDMzZGQxY2EuLjIwMWNjMzIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaApAQCAtMTgsNiArMTgsOCBAQAogI2lmbmRlZiBfX1hGU19TVVBFUl9IX18KICNkZWZpbmUgX19YRlNfU1VQRVJfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgorCiAjaWZkZWYgQ09ORklHX1hGU19ETUFQSQogIyBkZWZpbmUgdmZzX2luc2VydGRtYXBpKHZmcykJdmZzX2luc2VydG9wcyh2ZnNwLCAmeGZzX2Rtb3BzKQogIyBkZWZpbmUgdmZzX2luaXRkbWFwaSgpCWRtYXBpX2luaXQoKQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbS5jIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCmluZGV4IDdkZWY0YzYuLjJkMjc0YjIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYworKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKQEAgLTYyLDcgKzYyLDYgQEAKIAoga21lbV96b25lX3QJKnFtX2Rxem9uZTsKIGttZW1fem9uZV90CSpxbV9kcXRyeHpvbmU7Ci1zdGF0aWMgc3RydWN0IHNocmlua2VyICp4ZnNfcW1fc2hha2VyOwogCiBzdGF0aWMgY3JlZF90CXhmc196ZXJvY3I7CiAKQEAgLTc4LDYgKzc3LDExIEBACiBTVEFUSUMgaW50CXhmc19xbV9pbml0X3F1b3RhaW5mbyh4ZnNfbW91bnRfdCAqKTsKIFNUQVRJQyBpbnQJeGZzX3FtX3NoYWtlKGludCwgZ2ZwX3QpOwogCitzdGF0aWMgc3RydWN0IHNocmlua2VyIHhmc19xbV9zaGFrZXIgPSB7CisJLnNocmluayA9IHhmc19xbV9zaGFrZSwKKwkuc2Vla3MgPSBERUZBVUxUX1NFRUtTLAorfTsKKwogI2lmZGVmIERFQlVHCiBleHRlcm4gbXV0ZXhfdAlxY2hlY2tfbG9jazsKICNlbmRpZgpAQCAtMTQ5LDcgKzE1Myw3IEBACiAJfSBlbHNlCiAJCXhxbS0+cW1fZHF6b25lID0gcW1fZHF6b25lOwogCi0JeGZzX3FtX3NoYWtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCB4ZnNfcW1fc2hha2UpOworCXJlZ2lzdGVyX3Nocmlua2VyKCZ4ZnNfcW1fc2hha2VyKTsKIAogCS8qCiAJICogVGhlIHRfZHFpbmZvIHBvcnRpb24gb2YgdHJhbnNhY3Rpb25zLgpAQCAtMTgxLDcgKzE4NSw3IEBACiAKIAlBU1NFUlQoeHFtICE9IE5VTEwpOwogCUFTU0VSVCh4cW0tPnFtX25yZWZzID09IDApOwotCXJlbW92ZV9zaHJpbmtlcih4ZnNfcW1fc2hha2VyKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZ4ZnNfcW1fc2hha2VyKTsKIAloc2l6ZSA9IHhxbS0+cW1fZHFoYXNobWFzayArIDE7CiAJZm9yIChpID0gMDsgaSA8IGhzaXplOyBpKyspIHsKIAkJeGZzX3FtX2xpc3RfZGVzdHJveSgmKHhxbS0+cW1fdXNyX2RxaHRhYmxlW2ldKSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9mYi5oIGIvaW5jbHVkZS9hc20tYWxwaGEvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTliYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvZmIuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisvKiBDYWNoaW5nIGlzIG9mZiBpbiB0aGUgSS9PIHNwYWNlIHF1YWRyYW50IGJ5IGRlc2lnbi4gICovCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2lvLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9pby5oCmluZGV4IDIxYTg2ZjEuLmFiNWI2MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvaW8uaApAQCAtNCw2ICs0LDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGFzbS9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtOTAsNiArOTEsMTEgQEAKIAogI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJcGFnZV90b19wYShwYWdlKQogCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgX19kZXByZWNhdGVkIGlzYV9wYWdlX3RvX2J1cyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gcGFnZV90b19waHlzKHBhZ2UpOworfQorCiAvKiBUaGlzIGRlcGVuZHMgb24gd29ya2luZyBpb21tdS4gICovCiAjZGVmaW5lIEJJT19WTUVSR0VfQk9VTkRBUlkJKGFscGhhX212Lm12X3BjaV90YmkgPyBQQUdFX1NJWkUgOiAwKQogCkBAIC0xMDIsMTIgKzEwOCwxMiBAQAogICoKICAqIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3MgZm9yIGEgbGltaXRlZCByYW5nZSBvZiBrZXJuZWwgYWRkcmVzc2VzLAogICogYW5kIHZlcnkgd2VsbCBtYXkgbm90IHNwYW4gYWxsIG1lbW9yeS4gIENvbnNpZGVyIHRoaXMgaW50ZXJmYWNlIAotICogZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIG1hcHBpbmcgZnVuY3Rpb25zIGluIDxhc20vcGNpLmg+LgorICogZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIERNQS1tYXBwaW5nIEFQSS4KICAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19kaXJlY3RfbWFwX2Jhc2U7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX2RpcmVjdF9tYXBfc2l6ZTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHZpcnRfdG9fYnVzKHZvaWQgKmFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19kZXByZWNhdGVkIHZpcnRfdG9fYnVzKHZvaWQgKmFkZHJlc3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwaHlzID0gdmlydF90b19waHlzKGFkZHJlc3MpOwogCXVuc2lnbmVkIGxvbmcgYnVzID0gcGh5cyArIF9fZGlyZWN0X21hcF9iYXNlOwpAQCAtMTE1LDcgKzEyMSw3IEBACiB9CiAjZGVmaW5lIGlzYV92aXJ0X3RvX2J1cyB2aXJ0X3RvX2J1cwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmJ1c190b192aXJ0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdm9pZCAqIF9fZGVwcmVjYXRlZCBidXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJdm9pZCAqdmlydDsKIApAQCAtMTI2LDYgKzEzMiw3IEBACiAJdmlydCA9IHBoeXNfdG9fdmlydChhZGRyZXNzKTsKIAlyZXR1cm4gKGxvbmcpYWRkcmVzcyA8PSAwID8gTlVMTCA6IHZpcnQ7CiB9CisjZGVmaW5lIGlzYV9idXNfdG9fdmlydCBidXNfdG9fdmlydAogCiAvKgogICogVGhlcmUgYXJlIGRpZmZlcmVudCBjaGlwc2V0cyB0byBpbnRlcmZhY2UgdGhlIEFscGhhIENQVXMgdG8gdGhlIHdvcmxkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCmluZGV4IGQyYmVkM2MuLmJhZTdmMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKQEAgLTE3LDcgKzE3LDggQEAKIGV4dGVybiB2b2lkIGNsZWFyX3BhZ2Uodm9pZCAqcGFnZSk7CiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZtYWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZtYWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogZXh0ZXJuIHZvaWQgY29weV9wYWdlKHZvaWQgKiBfdG8sIHZvaWQgKiBfZnJvbSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKaW5kZXggNjE2ZDIwNi4uOTkwMzdiMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaApAQCAtMjY0LDIxICsyNjQsMTUgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotZXh0ZXJuIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GT1IpOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GT1cpOyB9Ci1leHRlcm4gaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCQl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZPRSk7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiAKIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0ZPVzsgcmV0dXJuIHB0ZTsgfQotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRk9SOyByZXR1cm4gcHRlOyB9Ci1leHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9GT0U7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+KF9fRElSVFlfQklUUyk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfihfX0FDQ0VTU19CSVRTKTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9GT1c7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9GT1I7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9GT0U7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfX0RJUlRZX0JJVFM7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfX0FDQ0VTU19CSVRTOyByZXR1cm4gcHRlOyB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3Rlcm1pb3MuaAppbmRleCAzOWU0OTJjLi5mYTEzNzE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvdGVybWlvcy5oCkBAIC04MSw3ICs4MSw3IEBACiAKICNkZWZpbmUgdXNlcl90ZXJtaW9fdG9fa2VybmVsX3Rlcm1pb3MoYV90ZXJtaW9zLCB1X3Rlcm1pbykJCQlcCiAoewkJCQkJCQkJCQlcCi0Jc3RydWN0IHRlcm1pb3MgKmtfdGVybWlvcyA9IChhX3Rlcm1pb3MpOwkJCQlcCisJc3RydWN0IGt0ZXJtaW9zICprX3Rlcm1pb3MgPSAoYV90ZXJtaW9zKTsJCQkJXAogCXN0cnVjdCB0ZXJtaW8ga190ZXJtaW87CQkJCQkJCVwKIAlpbnQgY2Fub24sIHJldDsJCQkJCQkJCVwKIAkJCQkJCQkJCQlcCkBAIC0xMTMsNyArMTEzLDcgQEAKICAqLwogI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh1X3Rlcm1pbywgYV90ZXJtaW9zKQkJXAogKHsJCQkJCQkJCQlcCi0Jc3RydWN0IHRlcm1pb3MgKmtfdGVybWlvcyA9IChhX3Rlcm1pb3MpOwkJCVwKKwlzdHJ1Y3Qga3Rlcm1pb3MgKmtfdGVybWlvcyA9IChhX3Rlcm1pb3MpOwkJCVwKIAlzdHJ1Y3QgdGVybWlvIGtfdGVybWlvOwkJCQkJCVwKIAlpbnQgY2Fub247CQkJCQkJCVwKIAkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTEvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWF0OTEvYm9hcmQuaAppbmRleCAwY2U2ZWU5Li5kOTZiMTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hdDkxL2JvYXJkLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYXQ5MS9ib2FyZC5oCkBAIC02NCw2ICs2NCw3IEBACiAKICAvKiBFdGhlcm5ldCAoRU1BQyAmIE1BQ0IpICovCiBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSB7CisJdTMyCQlwaHlfbWFzazsKIAl1OAkJcGh5X2lycV9waW47CS8qIFBIWSBJUlEgKi8KIAl1OAkJaXNfcm1paTsJLyogdXNpbmcgUk1JSSBpbnRlcmZhY2U/ICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2ZiLmggYi9pbmNsdWRlL2FzbS1hcm0vZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJlOTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1hcm0vcGd0YWJsZS5oCmluZGV4IDIxZGVjOWYuLmQyZTgxNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3BndGFibGUuaApAQCAtODMsMTQgKzgzLDE0IEBACiAgKiBtZWFucyB0aGF0IGEgd3JpdGUgdG8gYSBjbGVhbiBwYWdlIHdpbGwgY2F1c2UgYSBwZXJtaXNzaW9uIGZhdWx0LCBhbmQKICAqIHRoZSBMaW51eCBNTSBsYXllciB3aWxsIG1hcmsgdGhlIHBhZ2UgZGlydHkgdmlhIGhhbmRsZV9wdGVfZmF1bHQoKS4KICAqIEZvciB0aGUgaGFyZHdhcmUgdG8gbm90aWNlIHRoZSBwZXJtaXNzaW9uIGNoYW5nZSwgdGhlIFRMQiBlbnRyeSBtdXN0Ci0gKiBiZSBmbHVzaGVkLCBhbmQgcHRlcF9lc3RhYmxpc2goKSBkb2VzIHRoYXQgZm9yIHVzLgorICogYmUgZmx1c2hlZCwgYW5kIHB0ZXBfc2V0X2FjY2Vzc19mbGFncygpIGRvZXMgdGhhdCBmb3IgdXMuCiAgKgogICogVGhlICJhY2Nlc3NlZCIgb3IgInlvdW5nIiBiaXQgaXMgZW11bGF0ZWQgYnkgYSBzaW1pbGFyIG1ldGhvZDsgd2Ugb25seQogICogYWxsb3cgYWNjZXNzZXMgdG8gdGhlIHBhZ2UgaWYgdGhlICJ5b3VuZyIgYml0IGlzIHNldC4gIEFjY2Vzc2VzIHRvIHRoZQogICogcGFnZSB3aWxsIGNhdXNlIGEgZmF1bHQsIGFuZCBoYW5kbGVfcHRlX2ZhdWx0KCkgd2lsbCBzZXQgdGhlIHlvdW5nIGJpdAogICogZm9yIHVzIGFzIGxvbmcgYXMgdGhlIHBhZ2UgaXMgbWFya2VkIHByZXNlbnQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgTGludXgKLSAqIFBURSBlbnRyeS4gIEFnYWluLCBwdGVwX2VzdGFibGlzaCgpIHdpbGwgZW5zdXJlIHRoYXQgdGhlIFRMQiBpcyB1cCB0bwotICogZGF0ZS4KKyAqIFBURSBlbnRyeS4gIEFnYWluLCBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoKSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBUTEIgaXMKKyAqIHVwIHRvIGRhdGUuCiAgKgogICogSG93ZXZlciwgd2hlbiB0aGUgInlvdW5nIiBiaXQgaXMgY2xlYXJlZCwgd2UgZGVueSBhY2Nlc3MgdG8gdGhlIHBhZ2UKICAqIGJ5IGNsZWFyaW5nIHRoZSBoYXJkd2FyZSBQVEUuICBDdXJyZW50bHkgTGludXggZG9lcyBub3QgZmx1c2ggdGhlIFRMQgpAQCAtMjU3LDkgKzI1Nyw3IEBACiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KICNkZWZpbmUgcHRlX3ByZXNlbnQocHRlKQkocHRlX3ZhbChwdGUpICYgTF9QVEVfUFJFU0VOVCkKLSNkZWZpbmUgcHRlX3JlYWQocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1VTRVIpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkocHRlX3ZhbChwdGUpICYgTF9QVEVfV1JJVEUpCi0jZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCShwdGVfdmFsKHB0ZSkgJiBMX1BURV9FWEVDKQogI2RlZmluZSBwdGVfZGlydHkocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX0RJUlRZKQogI2RlZmluZSBwdGVfeW91bmcocHRlKQkJKHB0ZV92YWwocHRlKSAmIExfUFRFX1lPVU5HKQogCkBAIC0yNzUsMTIgKzI3Myw4IEBACiAjZGVmaW5lIFBURV9CSVRfRlVOQyhmbixvcCkgXAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfIyNmbihwdGVfdCBwdGUpIHsgcHRlX3ZhbChwdGUpIG9wOyByZXR1cm4gcHRlOyB9CiAKLS8qUFRFX0JJVF9GVU5DKHJkcHJvdGVjdCwgJj0gfkxfUFRFX1VTRVIpOyovCi0vKlBURV9CSVRfRlVOQyhta3JlYWQsICAgIHw9IExfUFRFX1VTRVIpOyovCiBQVEVfQklUX0ZVTkMod3Jwcm90ZWN0LCAmPSB+TF9QVEVfV1JJVEUpOwogUFRFX0JJVF9GVU5DKG1rd3JpdGUsICAgfD0gTF9QVEVfV1JJVEUpOwotUFRFX0JJVF9GVU5DKGV4cHJvdGVjdCwgJj0gfkxfUFRFX0VYRUMpOwotUFRFX0JJVF9GVU5DKG1rZXhlYywgICAgfD0gTF9QVEVfRVhFQyk7CiBQVEVfQklUX0ZVTkMobWtjbGVhbiwgICAmPSB+TF9QVEVfRElSVFkpOwogUFRFX0JJVF9GVU5DKG1rZGlydHksICAgfD0gTF9QVEVfRElSVFkpOwogUFRFX0JJVF9GVU5DKG1rb2xkLCAgICAgJj0gfkxfUFRFX1lPVU5HKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9kbWEtbWFwcGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTVlYWUwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2RtYS1tYXBwaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvZmIuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvaW9jdGxzLmgKaW5kZXggYmE5YzdkOC4uOGEzMjk2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvaW9jdGxzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvaW9jdGxzLmgKQEAgLTQ3LDYgKzQ3LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9wZ3RhYmxlLmgKaW5kZXggMmIyMGU5Zi4uNTVhMWE2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3BndGFibGUuaApAQCAtMjE4LDkgKzIxOCw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLSNkZWZpbmUgcHRlX3JlYWQocHRlKSAgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OT1RfVVNFUikpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRE9OTFkpKQotI2RlZmluZSBwdGVfZXhlYyhwdGUpICAgICAgICAgICAgICAgICAgICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX05PVF9VU0VSKSkKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkgICAgICAgICAgICAgICAgICAoIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9DTEVBTikpCiAjZGVmaW5lIHB0ZV95b3VuZyhwdGUpICAgICAgICAgICAgICAgICAgKCEocHRlX3ZhbChwdGUpICYgX1BBR0VfT0xEKSkKIC8vT05MWSB3aGVuICFwdGVfcHJlc2VudCgpIEkgdGhpbmsuIG5pY2tlZCBmcm9tIGFybTMyIChGSVhNRSEpCkBAIC0yMzEsOCArMjI5LDYgQEAKIAogUFRFX0JJVF9GVU5DKHdycHJvdGVjdCwgfD0gIF9QQUdFX1JFQURPTkxZKTsKIFBURV9CSVRfRlVOQyhta3dyaXRlLCAgICY9IH5fUEFHRV9SRUFET05MWSk7Ci1QVEVfQklUX0ZVTkMoZXhwcm90ZWN0LCB8PSAgX1BBR0VfTk9UX1VTRVIpOwotUFRFX0JJVF9GVU5DKG1rZXhlYywgICAgJj0gfl9QQUdFX05PVF9VU0VSKTsKIFBURV9CSVRfRlVOQyhta2NsZWFuLCAgIHw9ICBfUEFHRV9DTEVBTik7CiBQVEVfQklUX0ZVTkMobWtkaXJ0eSwgICAmPSB+X1BBR0VfQ0xFQU4pOwogUFRFX0JJVF9GVU5DKG1rb2xkLCAgICAgfD0gIF9QQUdFX09MRCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tYXJtMjYvdGVybWJpdHMuaAppbmRleCBmNjZiNTE4Li40OGQyZjVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1iaXRzLmgKQEAgLTEzOCw2ICsxMzgsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgIEJPVEhFUiAgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTUzLDEwICsxNTQsMTIgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyogaW5wdXQgYmF1ZCByYXRlICovCiAjZGVmaW5lIENNU1BBUiAgICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUgSUJTSElGVAkgIDE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1hcm0yNi90ZXJtaW9zLmgKaW5kZXggMzI5YzMyNC4uMjkzZTNmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3Rlcm1pb3MuaApAQCAtODIsOCArODIsMTAgQEAKIAljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAogfSkKIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAppbmRleCA5ZmQyZTMyLi45NzQ0ODA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKQEAgLTIxLDYgKzIxLDcgQEAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmF0MzJfYWRkX2RldmljZV91c2FydCh1bnNpZ25lZCBpbnQgaWQpOwogCiBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgeworCXUzMglwaHlfbWFzazsKIAl1OAlpc19ybWlpOwogfTsKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvZmIuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiYWY4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2ZiLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KChwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KQorCQkJCSAgICAgICYgfl9QQUdFX0NBQ0hBQkxFKQorCQkJCSAgICAgfCAoX1BBR0VfQlVGRkVSIHwgX1BBR0VfRElSVFkpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9wZ3RhYmxlLmgKaW5kZXggZjZjYzJiMC4uYzA3YmRkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3BndGFibGUuaApAQCAtMjAxLDE4ICsyMDEsMTAgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOwotfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkKIHsKIAlyZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUNVVEU7Ci19CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQogewogCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsKQEAgLTIzMSwyMSArMjIzLDExIEBACiB9CiAKIC8qIE11dGF0b3IgZnVuY3Rpb25zIGZvciBQVEUgYml0cyAqLwotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7Ci0JcmV0dXJuIHB0ZTsKLX0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCiB7CiAJc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfUlcpKTsKIAlyZXR1cm4gcHRlOwogfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLQlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9FWEVDVVRFKSk7Ci0JcmV0dXJuIHB0ZTsKLX0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0RJUlRZKSk7CkBAIC0yNTYsMjEgKzIzOCwxMSBAQAogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0FDQ0VTU0VEKSk7CiAJcmV0dXJuIHB0ZTsKIH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0Jc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9VU0VSKSk7Ci0JcmV0dXJuIHB0ZTsKLX0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQogewogCXNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfUlcpKTsKIAlyZXR1cm4gcHRlOwogfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKLXsKLQlzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0VYRUNVVEUpKTsKLQlyZXR1cm4gcHRlOwotfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAJc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9ESVJUWSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vZmIuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZmIuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9pb2N0bHMuaAppbmRleCA5Nzc4N2MzLi40ZjRlNTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvaW9jdGxzLmgKQEAgLTQ4LDYgKzQ4LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWNyaXMvcGFnZS5oCmluZGV4IDlmMTNjMzIuLjA2NDhlMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvcGFnZS5oCkBAIC0yMCw3ICsyMCw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpICAgIGNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykgY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmgKaW5kZXggYzk0YTcxMC4uNDE3ZjcxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmgKQEAgLTExMSw5ICsxMTEsNyBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1dSSVRFOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpICAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKSAgICAgICAgICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9NT0RJRklFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkgICAgICAgICAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgICAgICAgICAgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KQEAgLTEyNCwxOCArMTIyLDYgQEAKICAgICAgICAgcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsKLSAgICAgICAgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlyZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQotewotICAgICAgICBwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SRUFEIHwgX1BBR0VfU0lMRU5UX1JFQUQpOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX01PRElGSUVEIHwgX1BBR0VfU0lMRU5UX1dSSVRFKTsgCkBAIC0xNTYsMjIgKzE0Miw2IEBACiAgICAgICAgIHJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0gICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOwotICAgICAgICBpZiAocHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQpCi0gICAgICAgICAgICAgICAgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1NJTEVOVF9SRUFEOwotICAgICAgICByZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQotewotICAgICAgICBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUkVBRDsKLSAgICAgICAgaWYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEKQotICAgICAgICAgICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9TSUxFTlRfUkVBRDsKLSAgICAgICAgcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCiB7CiAgICAgICAgIHB0ZV92YWwocHRlKSB8PSBfUEFHRV9NT0RJRklFRDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvdGVybWJpdHMuaAppbmRleCA2Y2MyZTI3Li43MWMxYjM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtYml0cy5oCkBAIC0xNjYsNiArMTY2LDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgIEJPVEhFUiAgMDAxMDAwMAogI2RlZmluZSAgQjU3NjAwICAwMDEwMDAxCiAjZGVmaW5lICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgIEIyMzA0MDAgMDAxMDAwMwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1jcmlzL3Rlcm1pb3MuaAppbmRleCBjOWRiZDRkLi5iMDEyNGU2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy90ZXJtaW9zLmgKQEAgLTgxLDggKzgxLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2ZiLmggYi9pbmNsdWRlL2FzbS1mcnYvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1mcnYvcGd0YWJsZS5oCmluZGV4IDExNGFlZmEuLjE0N2U5OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3BndGFibGUuaApAQCAtMzc3LDMwICszNzcsMTcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gISgocHRlKS5wdGUgJiBfUEFHRV9TVVBFUik7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEoKHB0ZSkucHRlICYgX1BBR0VfU1VQRVIpOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gKHB0ZSkucHRlICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGUgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEoKHB0ZSkucHRlICYgX1BBR0VfV1ApOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX1NVUEVSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSB8PSBfUEFHRV9TVVBFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgKHB0ZSkucHRlICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX1dQOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfU1VQRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlICY9IH5fUEFHRV9TVVBFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgKHB0ZSkucHRlIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGUgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IChwdGUpLnB0ZSAmPSB+X1BBR0VfV1A7IHJldHVybiBwdGU7IH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlpbnQgaSA9IHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfRElSVFksIHB0ZXApOwotCWFzbSB2b2xhdGlsZSgiZGNmICVNMCIgOjogIlUiKCpwdGVwKSk7Ci0JcmV0dXJuIGk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CiAJaW50IGkgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0FDQ0VTU0VELCBwdGVwKTsKQEAgLTUxMCw3ICs0OTcsNiBAQAogCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKaW5kZXggZDBlYTY3OC4uNzMwNmM3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaApAQCAtMzI2LDEwICszMjYsMTQgQEAKICNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkzMTcKICNkZWZpbmUgX19OUl9nZXRjcHUJCTMxOAogI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTMxOQorI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJMzIwCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTMyMQorI2RlZmluZSBfX05SX3RpbWVyZmQJCTMyMgorI2RlZmluZSBfX05SX2V2ZW50ZmQJCTMyMwogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jZGVmaW5lIE5SX3N5c2NhbGxzIDMyMAorI2RlZmluZSBOUl9zeXNjYWxscyAzMjQKIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogLyogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKaW5kZXggN2YzMGNjZS4uMzQ0ZTMwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBIQVZFX0FSQ0hfQlVHX09OCi0jZGVmaW5lIEJVR19PTihjb25kaXRpb24pIGRvIHsgaWYgKHVubGlrZWx5KChjb25kaXRpb24pIT0wKSkgQlVHKCk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAodW5saWtlbHkoY29uZGl0aW9uKSkgQlVHKCk7IH0gd2hpbGUoMCkKICNlbmRpZgogCiAjaWZuZGVmIEhBVkVfQVJDSF9XQVJOX09OCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaAppbmRleCAyOTQxM2QzLi5lMjQ2OGY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmgKQEAgLTEsMjQgKzEsODIgQEAKICNpZm5kZWYgX0FTTV9HRU5FUklDX0RNQV9NQVBQSU5HX0gKICNkZWZpbmUgX0FTTV9HRU5FUklDX0RNQV9NQVBQSU5HX0gKIAotLyogVGhpcyBpcyB1c2VkIGZvciBhcmNocyB0aGF0IGRvIG5vdCBzdXBwb3J0IERNQSAqLworLyogZGVmaW5lIHRoZSBkbWEgYXBpIHRvIGFsbG93IGNvbXBpbGF0aW9uIGJ1dCBub3QgbGlua2luZyBvZgorICogZG1hIGRlcGVuZGVudCBjb2RlLiAgQ29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIGRtYS1tYXBwaW5nCisgKiBBUEkgbmVlZHMgdG8gc2V0ICdkZXBlbmRzIG9uIEhBU19ETUEnIGluIGl0cyBLY29uZmlnCisgKi8KIAotc3RhdGljIGlubGluZSB2b2lkICoKK3N0cnVjdCBzY2F0dGVybGlzdDsKKworZXh0ZXJuIHZvaWQgKgogZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsCi0JCSAgIGdmcF90IGZsYWcpCi17Ci0JQlVHKCk7Ci0JcmV0dXJuIE5VTEw7Ci19CisJCSAgIGdmcF90IGZsYWcpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQKK2V4dGVybiB2b2lkCiBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICpjcHVfYWRkciwKLQkJICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKLXsKLQlCVUcoKTsKLX0KKwkJICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CiAKICNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQogI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQogCitleHRlcm4gZG1hX2FkZHJfdAorZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIGludAorZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5od2VudHJpZXMsCisJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gZG1hX2FkZHJfdAorZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbik7CisKK2V4dGVybiB2b2lkCitkbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHJlc3MsIHNpemVfdCBzaXplLAorCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCitleHRlcm4gdm9pZAorZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQKK2RtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAorCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworI2RlZmluZSBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSBkbWFfc3luY19zaW5nbGVfZm9yX2NwdQorI2RlZmluZSBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZSBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdQorI2RlZmluZSBkbWFfc3luY19zZ19mb3JfZGV2aWNlIGRtYV9zeW5jX3NnX2Zvcl9jcHUKKworZXh0ZXJuIGludAorZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHJfdCBkbWFfYWRkcik7CisKK2V4dGVybiBpbnQKK2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzayk7CisKK2V4dGVybiBpbnQKK2RtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKTsKKworZXh0ZXJuIGludAorZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCk7CisKK2V4dGVybiBpbnQKK2RtYV9pc19jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKTsKKworZXh0ZXJuIHZvaWQKK2RtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAorCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOworCiAjZW5kaWYgLyogX0FTTV9HRU5FUklDX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvZmNudGwuaAppbmRleCBjMTU0YjlkLi5iODQ3NzQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2ZjbnRsLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9mY250bC5oCkBAIC00OCw2ICs0OCw5IEBACiAjaWZuZGVmIE9fTk9BVElNRQogI2RlZmluZSBPX05PQVRJTUUJMDEwMDAwMDAKICNlbmRpZgorI2lmbmRlZiBPX0NMT0VYRUMKKyNkZWZpbmUgT19DTE9FWEVDCTAyMDAwMDAwCS8qIHNldCBjbG9zZV9vbl9leGVjICovCisjZW5kaWYKICNpZm5kZWYgT19OREVMQVkKICNkZWZpbmUgT19OREVMQVkJT19OT05CTE9DSwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCmluZGV4IDdkN2JjZjkuLmY2MDVlOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oCkBAIC0zLDI1ICszLDYgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX0VTVEFCTElTSAotLyoKLSAqIEVzdGFibGlzaCBhIG5ldyBtYXBwaW5nOgotICogIC0gZmx1c2ggdGhlIG9sZCBvbmUKLSAqICAtIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZXMKLSAqICAtIGluZm9ybSB0aGUgVExCIGFib3V0IHRoZSBuZXcgb25lCi0gKgotICogV2UgaG9sZCB0aGUgbW0gc2VtYXBob3JlIGZvciByZWFkaW5nLCBhbmQgdGhlIHB0ZSBsb2NrLgotICoKLSAqIE5vdGU6IHRoZSBvbGQgcHRlIGlzIGtub3duIHRvIG5vdCBiZSB3cml0YWJsZSwgc28gd2UgZG9uJ3QgbmVlZCB0bwotICogd29ycnkgYWJvdXQgZGlydHkgYml0cyBldGMgZ2V0dGluZyBsb3N0LgotICovCi0jZGVmaW5lIHB0ZXBfZXN0YWJsaXNoKF9fdm1hLCBfX2FkZHJlc3MsIF9fcHRlcCwgX19lbnRyeSkJCVwKLWRvIHsJCQkJICAJCQkJCVwKLQlzZXRfcHRlX2F0KChfX3ZtYSktPnZtX21tLCAoX19hZGRyZXNzKSwgX19wdGVwLCBfX2VudHJ5KTsJXAotCWZsdXNoX3RsYl9wYWdlKF9fdm1hLCBfX2FkZHJlc3MpOwkJCQlcCi19IHdoaWxlICgwKQotI2VuZGlmCi0KICNpZm5kZWYgX19IQVZFX0FSQ0hfUFRFUF9TRVRfQUNDRVNTX0ZMQUdTCiAvKgogICogTGFyZ2VseSBzYW1lIGFzIGFib3ZlLCBidXQgb25seSBzZXRzIHRoZSBhY2Nlc3MgZmxhZ3MgKGRpcnR5LApAQCAtNjgsMzEgKzQ5LDYgQEAKIH0pCiAjZW5kaWYKIAotI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKQkJXAotKHsJCQkJCQkJCQlcCi0JcHRlX3QgX19wdGUgPSAqX19wdGVwOwkJCQkJCVwKLQlpbnQgciA9IDE7CQkJCQkJCVwKLQlpZiAoIXB0ZV9kaXJ0eShfX3B0ZSkpCQkJCQkJXAotCQlyID0gMDsJCQkJCQkJXAotCWVsc2UJCQkJCQkJCVwKLQkJc2V0X3B0ZV9hdCgoX192bWEpLT52bV9tbSwgKF9fYWRkcmVzcyksIChfX3B0ZXApLAlcCi0JCQkgICBwdGVfbWtjbGVhbihfX3B0ZSkpOwkJCQlcCi0JcjsJCQkJCQkJCVwKLX0pCi0jZW5kaWYKLQotI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX0RJUlRZX0ZMVVNICi0jZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfZGlydHkoX192bWEsIF9fYWRkcmVzcywgX19wdGVwKQkJXAotKHsJCQkJCQkJCQlcCi0JaW50IF9fZGlydHk7CQkJCQkJCVwKLQlfX2RpcnR5ID0gcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXApOwlcCi0JaWYgKF9fZGlydHkpCQkJCQkJCVwKLQkJZmx1c2hfdGxiX3BhZ2UoX192bWEsIF9fYWRkcmVzcyk7CQkJXAotCV9fZGlydHk7CQkJCQkJCVwKLX0pCi0jZW5kaWYKLQogI2lmbmRlZiBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgcHRlcF9nZXRfYW5kX2NsZWFyKF9fbW0sIF9fYWRkcmVzcywgX19wdGVwKQkJCVwKICh7CQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdW5hbGlnbmVkLmgKaW5kZXggMDllYzQ0Ny4uMTZhNDY2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmFsaWduZWQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuYWxpZ25lZC5oCkBAIC0xOCw3ICsxOCw4IEBACiAjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSBcCiAJX19nZXRfdW5hbGlnbmVkKChwdHIpLCBzaXplb2YoKihwdHIpKSkKICNkZWZpbmUgcHV0X3VuYWxpZ25lZCh4LHB0cikgXAotCV9fcHV0X3VuYWxpZ25lZCgoX191NjQpKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpCisJKCh2b2lkKXNpemVvZigqKHB0cik9KHgpKSxcCisJX19wdXRfdW5hbGlnbmVkKChfX2ZvcmNlIF9fdTY0KSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKSkKIAogLyoKICAqIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBhY3R1YWxseSBleGlzdC4gIFRoZSBpZGVhIGlzIHRoYXQgd2hlbgpAQCAtOTUsMjEgKzk2LDIxIEBACiAJZGVmYXVsdDoJCQkJXAogCQliYWRfdW5hbGlnbmVkX2FjY2Vzc19sZW5ndGgoKTsJXAogCX07CQkJCQlcCi0JKF9fdHlwZW9mX18oKihwdHIpKSl2YWw7CQlcCisJKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpKXZhbDsJXAogfSkKIAogI2RlZmluZSBfX3B1dF91bmFsaWduZWQodmFsLCBwdHIsIHNpemUpCQlcCi1kbyB7CQkJCQkJXAorKHsJCQkJCQlcCiAJdm9pZCAqX19ndV9wID0gcHRyOwkJCVwKIAlzd2l0Y2ggKHNpemUpIHsJCQkJXAogCWNhc2UgMToJCQkJCVwKLQkJKihfX3U4ICopX19ndV9wID0gdmFsOwkJXAorCQkqKF9fdTggKilfX2d1X3AgPSAoX19mb3JjZSBfX3U4KXZhbDsJCVwKIAkgICAgICAgIGJyZWFrOwkJCQlcCiAJY2FzZSAyOgkJCQkJXAotCQlfX3VzdHcodmFsLCBfX2d1X3ApOwkJXAorCQlfX3VzdHcoKF9fZm9yY2UgX191MTYpdmFsLCBfX2d1X3ApOwkJXAogCQlicmVhazsJCQkJXAogCWNhc2UgNDoJCQkJCVwKLQkJX191c3RsKHZhbCwgX19ndV9wKTsJCVwKKwkJX191c3RsKChfX2ZvcmNlIF9fdTMyKXZhbCwgX19ndV9wKTsJCVwKIAkJYnJlYWs7CQkJCVwKIAljYXNlIDg6CQkJCQlcCiAJCV9fdXN0cSh2YWwsIF9fZ3VfcCk7CQlcCkBAIC0xMTcsNiArMTE4LDcgQEAKIAlkZWZhdWx0OgkJCQlcCiAJICAgIAliYWRfdW5hbGlnbmVkX2FjY2Vzc19sZW5ndGgoKTsJXAogCX07CQkJCQlcCi19IHdoaWxlKDApCisJKHZvaWQpMDsJCQkJXAorfSkKIAogI2VuZGlmIC8qIF9BU01fR0VORVJJQ19VTkFMSUdORURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2RtYS1tYXBwaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMGU0MDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvZG1hLW1hcHBpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kbWEtbWFwcGluZy1icm9rZW4uaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2ZiLmggYi9pbmNsdWRlL2FzbS1oODMwMC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGYzODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL2lvY3Rscy5oCmluZGV4IGFjMjA0NTcuLjk4YTUzZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2lvY3Rscy5oCkBAIC00Nyw2ICs0NywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oIGIvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCmluZGV4IDNiNGYyOTAuLmM4Y2M4MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKQEAgLTIyLDcgKzIyLDggQEAKICNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKHBhZ2UsIHZhZGRyLCBwZykJY2xlYXJfcGFnZShwYWdlKQogI2RlZmluZSBjb3B5X3VzZXJfcGFnZSh0bywgZnJvbSwgdmFkZHIsIHBnKQljb3B5X3BhZ2UodG8sIGZyb20pCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTywgdm1hLCB2YWRkcikKKyNkZWZpbmUgX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpIFwKKwlhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQogI2RlZmluZSBfX0hBVkVfQVJDSF9BTExPQ19aRVJPRURfVVNFUl9ISUdIUEFHRQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1iaXRzLmgKaW5kZXggZTg3N2I0MC4uMzFlY2E4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtYml0cy5oCkBAIC0xNDEsNiArMTQxLDcgQEAKICNkZWZpbmUgSFVQQ0wJMDAwMjAwMAogI2RlZmluZSBDTE9DQUwJMDAwNDAwMAogI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICAgQk9USEVSIDAwMTAwMDAKICNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKICNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKICNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKQEAgLTE1NiwxMCArMTU3LDEyIEBACiAjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CiAjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CiAjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3Ci0jZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUgSUJTSElGVAkgIDE2CQkJLyogc2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KKwogLyogY19sZmxhZyBiaXRzICovCiAjZGVmaW5lIElTSUcJMDAwMDAwMQogI2RlZmluZSBJQ0FOT04JMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20taDgzMDAvdGVybWlvcy5oCmluZGV4IGZiMjkyNWQuLjcwZWVhNjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC90ZXJtaW9zLmgKQEAgLTgyLDggKzgyLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3RocmVhZF9pbmZvLmgKaW5kZXggNDVmMDlkYy4uYWVlNDAwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC90aHJlYWRfaW5mby5oCkBAIC05Miw2ICs5Miw3IEBACiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwk0CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZwogCQkJCQkgICBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTUKKyNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk2CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KIAogLyogYXMgYWJvdmUsIGJ1dCBhcyBiaXQgdmFsdWVzICovCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCkBAIC05OSw2ICsxMDAsNyBAQAogI2RlZmluZSBfVElGX1NJR1BFTkRJTkcJCSgxPDxUSUZfU0lHUEVORElORykKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDE8PFRJRl9ORUVEX1JFU0NIRUQpCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKKyNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCiAKICNkZWZpbmUgX1RJRl9XT1JLX01BU0sJCTB4MDAwMEZGRkUJLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2ZiLmggYi9pbmNsdWRlL2FzbS1pMzg2L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNjI5NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZmIuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK2V4dGVybiBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pOworCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oIGIvaW5jbHVkZS9hc20taTM4Ni9maXhtYXAuaAppbmRleCA4MGVhMDUyLi4yNDllNzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2ZpeG1hcC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZml4bWFwLmgKQEAgLTU0LDYgKzU0LDggQEAKIGVudW0gZml4ZWRfYWRkcmVzc2VzIHsKIAlGSVhfSE9MRSwKIAlGSVhfVkRTTywKKwlGSVhfREJHUF9CQVNFLAorCUZJWF9FQVJMWUNPTl9NRU1fQkFTRSwKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAlGSVhfQVBJQ19CQVNFLAkvKiBsb2NhbCAoQ1BVKSBBUElDKSAtLSByZXF1aXJlZCBmb3IgU01QIG9yIG5vdCAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9pZGUuaAppbmRleCAwZmMyNDBjLi5lNzgxN2EzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKQEAgLTQwLDE0ICs0MCwxMyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGlkZV9kZWZhdWx0X2lvX2Jhc2UoaW50IGluZGV4KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCS8qCiAJICoJSWYgUENJIGlzIHByZXNlbnQgdGhlbiBpdCBpcyBub3Qgc2FmZSB0byBwb2tlIGFyb3VuZAogCSAqCXRoZSBvdGhlciBsZWdhY3kgSURFIHBvcnRzLiBPbmx5IDB4MWYwIGFuZCAweDE3MCBhcmUKIAkgKglkZWZpbmVkIGNvbXBhdGliaWxpdHkgbW9kZSBwb3J0cyBmb3IgUENJLiBBIHVzZXIgY2FuIAogCSAqCW92ZXJyaWRlIHRoaXMgdXNpbmcgaWRlPSBidXQgd2UgbXVzdCBkZWZhdWx0IHNhZmUuCiAJICovCi0JaWYgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgTlVMTCkpID09IE5VTEwpIHsKKwlpZiAobm9fcGNpX2RldmljZXMoKSkgewogCQlzd2l0Y2goaW5kZXgpIHsKIAkJCWNhc2UgMjogcmV0dXJuIDB4MWU4OwogCQkJY2FzZSAzOiByZXR1cm4gMHgxNjg7CkBAIC01NSw3ICs1NCw2IEBACiAJCQljYXNlIDU6IHJldHVybiAweDE2MDsKIAkJfQogCX0KLQlwY2lfZGV2X3B1dChwZGV2KTsKIAlzd2l0Y2ggKGluZGV4KSB7CiAJCWNhc2UgMDoJcmV0dXJuIDB4MWYwOwogCQljYXNlIDE6CXJldHVybiAweDE3MDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaW8uaCBiL2luY2x1ZGUvYXNtLWkzODYvaW8uaAppbmRleCBlNzk3NTg2Li43YjY1YjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2lvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pby5oCkBAIC0xMjksNiArMTI5LDcgQEAKICAqLwogZXh0ZXJuIHZvaWQgKmJ0X2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBidF9pb3VubWFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gdm9pZCBfX2lvbWVtICpmaXhfaW9yZW1hcCh1bnNpZ25lZCBpZHgsIHVuc2lnbmVkIGxvbmcgcGh5cyk7CiAKIC8qIFVzZSBlYXJseSBJTyBtYXBwaW5ncyBmb3IgRE1JIGJlY2F1c2UgaXQncyBpbml0aWFsaXplZCBlYXJseSAqLwogI2RlZmluZSBkbWlfaW9yZW1hcCBidF9pb3JlbWFwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGFnZS5oCmluZGV4IDgxOGFjOGIuLjk5Y2Y1ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGFnZS5oCkBAIC0zNCw3ICszNCw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0ybGV2ZWwuaAppbmRleCBhNTBmZDE3Li44NGIwM2NmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtMmxldmVsLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTJsZXZlbC5oCkBAIC01NywxNCArNTcsNiBAQAogI2RlZmluZSBwZm5fcG1kKHBmbiwgcHJvdCkJX19wbWQoKChwZm4pIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwcm90KSkKIAogLyoKLSAqIEFsbCBwcmVzZW50IHVzZXIgcGFnZXMgYXJlIHVzZXItZXhlY3V0YWJsZToKLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdXNlcihwdGUpOwotfQotCi0vKgogICogQWxsIHByZXNlbnQgcGFnZXMgYXJlIGtlcm5lbC1leGVjdXRhYmxlOgogICovCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZXhlY19rZXJuZWwocHRlX3QgcHRlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLTNsZXZlbC5oCmluZGV4IGViMGYxZDcuLjk0OGEzMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS0zbGV2ZWwuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUtM2xldmVsLmgKQEAgLTIwLDI2ICsyMCwxMSBAQAogI2RlZmluZSBwdWRfcHJlc2VudChwdWQpCQkJMQogCiAvKgotICogSXMgdGhlIHB0ZSBleGVjdXRhYmxlPwotICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfeChwdGVfdCBwdGUpCi17Ci0JcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfTlgpOwotfQotCi0vKgotICogQWxsIHByZXNlbnQgdXNlci1wYWdlcyB3aXRoICFOWCBiaXQgYXJlIHVzZXItZXhlY3V0YWJsZToKLSAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdXNlcihwdGUpICYmIHB0ZV94KHB0ZSk7Ci19Ci0vKgogICogQWxsIHByZXNlbnQgcGFnZXMgd2l0aCAhTlggYml0IGFyZSBrZXJuZWwtZXhlY3V0YWJsZToKICAqLwogc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWNfa2VybmVsKHB0ZV90IHB0ZSkKIHsKLQlyZXR1cm4gcHRlX3gocHRlKTsKKwlyZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OWCk7CiB9CiAKIC8qIFJ1bGVzIGZvciB1c2luZyBzZXRfcHRlOiB0aGUgcHRlIGJlaW5nIGFzc2lnbmVkICptdXN0KiBiZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaAppbmRleCA2MjhmYTc3Li5jN2ZlZmE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3BndGFibGUuaApAQCAtNzksNyArNzksNyBAQAogICogYXJlYSBmb3IgdGhlIHNhbWUgcmVhc29uLiA7KQogICovCiAjZGVmaW5lIFZNQUxMT0NfT0ZGU0VUCSg4KjEwMjQqMTAyNCkKLSNkZWZpbmUgVk1BTExPQ19TVEFSVAkoKCh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSArIHZtYWxsb2NfZWFybHlyZXNlcnZlICsgXAorI2RlZmluZSBWTUFMTE9DX1NUQVJUCSgoKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5ICsgXAogCQkJMipWTUFMTE9DX09GRlNFVC0xKSAmIH4oVk1BTExPQ19PRkZTRVQtMSkpCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KICMgZGVmaW5lIFZNQUxMT0NfRU5ECShQS01BUF9CQVNFLTIqUEFHRV9TSVpFKQpAQCAtMjE4LDggKzIxOCw2IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZV9sb3cgJiBfUEFHRV9VU0VSOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfVVNFUjsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZV9sb3cgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZV9sb3cgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIChwdGUpLnB0ZV9sb3cgJiBfUEFHRV9SVzsgfQpAQCAtMjMwLDEzICsyMjgsOSBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiAocHRlKS5wdGVfbG93ICYgX1BBR0VfRklMRTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IChwdGUpLnB0ZV9sb3cgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93ICY9IH5fUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93IHw9IF9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZXhlYyhwdGVfdCBwdGUpCXsgKHB0ZSkucHRlX2xvdyB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93IHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93IHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyAocHRlKS5wdGVfbG93IHw9IF9QQUdFX1JXOyByZXR1cm4gcHRlOyB9CkBAIC0yOTUsMTcgKzI4OSw2IEBACiAJX19jaGFuZ2VkOwkJCQkJCQlcCiB9KQogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLSNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSh2bWEsIGFkZHIsIHB0ZXApICh7CQkJXAotCWludCBfX3JldCA9IDA7CQkJCQkJCVwKLQlpZiAocHRlX2RpcnR5KCoocHRlcCkpKQkJCQkJCVwKLQkJX19yZXQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLAkJXAotCQkJCQkJJihwdGVwKS0+cHRlX2xvdyk7CVwKLQlpZiAoX19yZXQpCQkJCQkJCVwKLQkJcHRlX3VwZGF0ZSgodm1hKS0+dm1fbW0sIGFkZHIsIHB0ZXApOwkJCVwKLQlfX3JldDsJCQkJCQkJCVwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwogI2RlZmluZSBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkciwgcHRlcCkgKHsJCQlcCiAJaW50IF9fcmV0ID0gMDsJCQkJCQkJXApAQCAtMzE3LDI3ICszMDAsNiBAQAogCV9fcmV0OwkJCQkJCQkJXAogfSkKIAotLyoKLSAqIFJ1bGVzIGZvciB1c2luZyBwdGVwX2VzdGFibGlzaDogdGhlIHB0ZSBNVVNUIGJlIGEgdXNlciBwdGUsIGFuZAotICogbXVzdCBiZSBhIHByZXNlbnQtPnByZXNlbnQgdHJhbnNpdGlvbi4KLSAqLwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0VTVEFCTElTSAotI2RlZmluZSBwdGVwX2VzdGFibGlzaCh2bWEsIGFkZHJlc3MsIHB0ZXAsIHB0ZXZhbCkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXNldF9wdGVfcHJlc2VudCgodm1hKS0+dm1fbW0sIGFkZHJlc3MsIHB0ZXAsIHB0ZXZhbCk7CQlcCi0JZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ESVJUWV9GTFVTSAotI2RlZmluZSBwdGVwX2NsZWFyX2ZsdXNoX2RpcnR5KHZtYSwgYWRkcmVzcywgcHRlcCkJCQlcCi0oewkJCQkJCQkJCVwKLQlpbnQgX19kaXJ0eTsJCQkJCQkJXAotCV9fZGlydHkgPSBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KCh2bWEpLCAoYWRkcmVzcyksIChwdGVwKSk7CVwKLQlpZiAoX19kaXJ0eSkJCQkJCQkJXAotCQlmbHVzaF90bGJfcGFnZSh2bWEsIGFkZHJlc3MpOwkJCQlcCi0JX19kaXJ0eTsJCQkJCQkJXAotfSkKLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0NMRUFSX1lPVU5HX0ZMVVNICiAjZGVmaW5lIHB0ZXBfY2xlYXJfZmx1c2hfeW91bmcodm1hLCBhZGRyZXNzLCBwdGVwKQkJCVwKICh7CQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKaW5kZXggOTRlMGMxNC4uNDIyY2ZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCkBAIC0yMjgsNiArMjI4LDEwIEBACiAKICNkZWZpbmUgSEFWRV9BUkNIX1BJQ0tfTU1BUF9MQVlPVVQKIAorZXh0ZXJuIHZvaWQgaGFyZF9kaXNhYmxlX1RTQyh2b2lkKTsKK2V4dGVybiB2b2lkIGRpc2FibGVfVFNDKHZvaWQpOworZXh0ZXJuIHZvaWQgaGFyZF9lbmFibGVfVFNDKHZvaWQpOworCiAvKgogICogU2l6ZSBvZiBpb19iaXRtYXAuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLWkzODYvdGhyZWFkX2luZm8uaAppbmRleCA0Y2IwZjkxLi41NDQyNGUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aHJlYWRfaW5mby5oCkBAIC0xMzcsNiArMTM3LDcgQEAKICNkZWZpbmUgVElGX0RFQlVHCQkxNwkvKiB1c2VzIGRlYnVnIHJlZ2lzdGVycyAqLwogI2RlZmluZSBUSUZfSU9fQklUTUFQCQkxOAkvKiB1c2VzIEkvTyBiaXRtYXAgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJMTkJLyogaXMgZnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KKyNkZWZpbmUgVElGX05PVFNDCQkyMAkvKiBUU0MgaXMgbm90IGFjY2Vzc2libGUgaW4gdXNlcmxhbmQgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQogI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDE8PFRJRl9OT1RJRllfUkVTVU1FKQpAQCAtMTUxLDYgKzE1Miw3IEBACiAjZGVmaW5lIF9USUZfREVCVUcJCSgxPDxUSUZfREVCVUcpCiAjZGVmaW5lIF9USUZfSU9fQklUTUFQCQkoMTw8VElGX0lPX0JJVE1BUCkKICNkZWZpbmUgX1RJRl9GUkVFWkUJCSgxPDxUSUZfRlJFRVpFKQorI2RlZmluZSBfVElGX05PVFNDCQkoMTw8VElGX05PVFNDKQogCiAvKiB3b3JrIHRvIGRvIG9uIGludGVycnVwdC9leGNlcHRpb24gcmV0dXJuICovCiAjZGVmaW5lIF9USUZfV09SS19NQVNLIFwKQEAgLTE2MCw3ICsxNjIsOCBAQAogI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSwkoMHgwMDAwRkZGRiAmIH5fVElGX1NFQ0NPTVApCiAKIC8qIGZsYWdzIHRvIGNoZWNrIGluIF9fc3dpdGNoX3RvKCkgKi8KLSNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXIChfVElGX0RFQlVHfF9USUZfSU9fQklUTUFQKQorI2RlZmluZSBfVElGX1dPUktfQ1RYU1dfTkVYVCAoX1RJRl9JT19CSVRNQVAgfCBfVElGX05PVFNDIHwgX1RJRl9ERUJVRykKKyNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXX1BSRVYgKF9USUZfSU9fQklUTUFQIHwgX1RJRl9OT1RTQykKIAogLyoKICAqIFRocmVhZC1zeW5jaHJvbm91cyBzdGF0dXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20taWE2NC9jb21wYXQuaAppbmRleCA0MGQwMWQ4Li4wZjZlNTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvY29tcGF0LmgKQEAgLTMxLDggKzMxLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKSBjb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2ZiLmggYi9pbmNsdWRlL2FzbS1pYTY0L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhMzk3YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvZmIuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWlmIChlZmlfcmFuZ2VfaXNfd2Modm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSkKKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKKwllbHNlCisJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvaW9jdGxzLmgKaW5kZXggMzFlZTUyMS4uZjQxYjYzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pb2N0bHMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2lvY3Rscy5oCkBAIC01Myw2ICs1MywxMCBAQAogI2RlZmluZSBUSU9DU0JSSwkweDU0MjcgIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIFRJT0NDQlJLCTB4NTQyOCAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0dTSUQJMHg1NDI5ICAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQgKi8KKyNkZWZpbmUgVENHRVRTMgkJX0lPUignVCcsMHgyQSwgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFMyCQlfSU9XKCdUJywweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLDB4MkMsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTRjIJX0lPVygnVCcsMHgyRCwgc3RydWN0IHRlcm1pb3MyKQogI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KICNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wYWdlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BhZ2UuaAppbmRleCA0ODU3NTliLi5kNjM0NTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BhZ2UuaApAQCAtODcsMTIgKzg3LDEzIEBACiB9IHdoaWxlICgwKQogCiAKLSNkZWZpbmUgYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCB2YWRkcikgXAotKHsJCQkJCQlcCi0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKTsgXAotCWlmIChwYWdlKQkJCQlcCi0gCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsJXAotCXBhZ2U7CQkJCQlcCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKQkJXAorKHsJCQkJCQkJCQlcCisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlX3ZtYSgJCQkJXAorCQlHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPIHwgbW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKTsJXAorCWlmIChwYWdlKQkJCQkJCQlcCisgCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsJCQkJXAorCXBhZ2U7CQkJCQkJCQlcCiB9KQogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGd0YWJsZS5oCmluZGV4IDY1ODBmMzEuLmRlNmQwMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGd0YWJsZS5oCkBAIC0yOTcsOCArMjk3LDYgQEAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGhhdmUgZGVmaW5lZCBiZWhhdmlvciBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICovCi0jZGVmaW5lIHB0ZV91c2VyKHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgX1BBR0VfUExfTUFTSykgPT0gX1BBR0VfUExfMykKLSNkZWZpbmUgcHRlX3JlYWQocHRlKQkJKCgocHRlX3ZhbChwdGUpICYgX1BBR0VfQVJfTUFTSykgPj4gX1BBR0VfQVJfU0hJRlQpIDwgNikKICNkZWZpbmUgcHRlX3dyaXRlKHB0ZSkJKCh1bnNpZ25lZCkgKCgocHRlX3ZhbChwdGUpICYgX1BBR0VfQVJfTUFTSykgPj4gX1BBR0VfQVJfU0hJRlQpIC0gMikgPD0gNCkKICNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BUl9SWCkgIT0gMCkKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgX1BBR0VfRCkgIT0gMCkKQEAgLTMxMCw3ICszMDgsNiBAQAogICovCiAjZGVmaW5lIHB0ZV93cnByb3RlY3QocHRlKQkoX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0FSX1JXKSkKICNkZWZpbmUgcHRlX21rd3JpdGUocHRlKQkoX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQVJfUlcpKQotI2RlZmluZSBwdGVfbWtleGVjKHB0ZSkJCShfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BUl9SWCkpCiAjZGVmaW5lIHB0ZV9ta29sZChwdGUpCQkoX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0EpKQogI2RlZmluZSBwdGVfbWt5b3VuZyhwdGUpCShfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BKSkKICNkZWZpbmUgcHRlX21rY2xlYW4ocHRlKQkoX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0QpKQpAQCAtMzk4LDIyICszOTUsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1wdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5IChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKCFwdGVfZGlydHkoKnB0ZXApKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0RfQklULCBwdGVwKTsKLSNlbHNlCi0JcHRlX3QgcHRlID0gKnB0ZXA7Ci0JaWYgKCFwdGVfZGlydHkocHRlKSkKLQkJcmV0dXJuIDA7Ci0Jc2V0X3B0ZV9hdCh2bWEtPnZtX21tLCBhZGRyLCBwdGVwLCBwdGVfbWtjbGVhbihwdGUpKTsKLQlyZXR1cm4gMTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90CiBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CkBAIC01NDYsOCArNTI3LDEwIEBACiAjIGRlZmluZSBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoX192bWEsIF9fYWRkciwgX19wdGVwLCBfX2VudHJ5LCBfX3NhZmVseV93cml0YWJsZSkgXAogKHsJCQkJCQkJCQlcCiAJaW50IF9fY2hhbmdlZCA9ICFwdGVfc2FtZSgqKF9fcHRlcCksIF9fZW50cnkpOwkJCVwKLQlpZiAoX19jaGFuZ2VkKQkJCQkJCQlcCi0JCXB0ZXBfZXN0YWJsaXNoKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCwgX19lbnRyeSk7CQlcCisJaWYgKF9fY2hhbmdlZCkgewkJCQkJCVwKKwkJc2V0X3B0ZV9hdCgoX192bWEpLT52bV9tbSwgKF9fYWRkciksIF9fcHRlcCwgX19lbnRyeSk7CVwKKwkJZmx1c2hfdGxiX3BhZ2UoX192bWEsIF9fYWRkcik7CQkJCVwKKwl9CQkJCQkJCQlcCiAJX19jaGFuZ2VkOwkJCQkJCQlcCiB9KQogI2VuZGlmCkBAIC01OTEsNyArNTc0LDYgQEAKICNlbmRpZgogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURV9TQU1FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3Rlcm1iaXRzLmgKaW5kZXggN2ZhZTMxMC4uOWYxNjJlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGVybWJpdHMuaApAQCAtMTQ5LDYgKzE0OSw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNjQsMTAgKzE2NSwxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lIElCU0hJRlQJMTYJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtaW9zLmgKaW5kZXggMDg3NTBjMi4uNjg5ZDIxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC90ZXJtaW9zLmgKQEAgLTg3LDggKzg3LDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7CVwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogIyBlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLW0zMnIvZG1hLW1hcHBpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliNThlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2RtYS1tYXBwaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9NMzJSX0RNQV9NQVBQSU5HX0gKLSNkZWZpbmUgX0FTTV9NMzJSX0RNQV9NQVBQSU5HX0gKLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oPgotCi0jZW5kaWYgLyogX0FTTV9NMzJSX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvZmIuaCBiL2luY2x1ZGUvYXNtLW0zMnIvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJlOTljCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTMyci9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tbTMyci9pb2N0bHMuaAppbmRleCBkMjNjZmM0Li5iOWY1NGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvaW9jdGxzLmgKQEAgLTQ3LDYgKzQ3LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcGFnZS5oCmluZGV4IDZmNmVjZjcuLjA0ZmQxODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvcGFnZS5oCkBAIC0xNSw3ICsxNSw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmgKaW5kZXggNjYwNDMwMy4uOTJkNzI2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmgKQEAgLTE5MSwxNiArMTkxLDYgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQotewotCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCi17Ci0JcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCiB7CiAJcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOwpAQCAtMjI0LDE4ICsyMTQsNiBAQAogCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfUkVBRDsKLQlyZXR1cm4gcHRlOwotfQotCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRVhFQzsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOwpAQCAtMjU0LDE4ICsyMzIsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCi17Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7Ci0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKLXsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRVhFQzsKLQlyZXR1cm4gcHRlOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkKIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfRElSVFk7CkBAIC0yODQsMTEgKzI1MCw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSAgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChfUEFHRV9CSVRfRElSVFksIHB0ZXApOwotfQotCiBzdGF0aWMgaW5saW5lICBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9BQ0NFU1NFRCwgcHRlcCk7CkBAIC0zODIsNyArMzQzLDYgQEAKIAkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tbTMyci90ZXJtYml0cy5oCmluZGV4IDZiZTNiOGEuLmJjMTA0MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1iaXRzLmgKQEAgLTE0MCw2ICsxNDAsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgICBCT1RIRVIgMDAxMDAwMAogI2RlZmluZSAgICBCNTc2MDAgMDAxMDAwMQogI2RlZmluZSAgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgIEIyMzA0MDAgMDAxMDAwMwpAQCAtMTU1LDExICsxNTYsMTMgQEAKICNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKICNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKICNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKLSNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkJLyoqIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDVFZCCSAgMDA0MDAwMDAwMDAwCQkvKiBWaXNpb0JyYWlsbGUgVGVybWluYWwgZmxvdyBjb250cm9sICovCiAjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLwogI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KIAorI2RlZmluZQlJQlNISUZUCTE2CQkJLyogU2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KKwogLyogY19sZmxhZyBiaXRzICovCiAjZGVmaW5lIElTSUcJMDAwMDAwMQogI2RlZmluZSBJQ0FOT04JMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1pb3MuaAppbmRleCA0OTQzZGQ4Li45M2NlNzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3Rlcm1pb3MuaApAQCAtODEsOCArODEsMTAgQEAKIAljb3B5X3RvX3VzZXIoKHRlcm1pbyktPmNfY2MsICh0ZXJtaW9zKS0+Y19jYywgTkNDKTsgXAogfSkKIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MoaywgdSkgY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX1NMTS5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9TTE0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmNGZjZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX1NMTS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotCi0jaWZuZGVmIF9BVEFSSV9TTE1fSAotI2RlZmluZSBfQVRBUklfU0xNX0gKLQotLyogQXRhcmkgU0xNIGxhc2VyIHByaW50ZXIgc3BlY2lmaWMgaW9jdGxzICovCi0KLSNkZWZpbmUJU0xNSU9HU1RBVAkweGExMDAKLSNkZWZpbmUJU0xNSU9HUFNJWkUJMHhhMTAxCi0jZGVmaW5lCVNMTUlPR01GRUVECTB4YTEwMgotCi0jZGVmaW5lCVNMTUlPUkVTRVQJMHhhMTQwCi0KLSNkZWZpbmUJU0xNSU9TUFNJWkUJMHhhMTgxCi0jZGVmaW5lCVNMTUlPU01GRUVECTB4YTE4MgotCi0vKiBTdGF0dXMgcmV0dXJuaW5nIHN0cnVjdHVyZSAoU0xNSU9HU1RBVCkgKi8KLXN0cnVjdCBTTE1fc3RhdHVzIHsKLQlpbnQJCXN0YXQ7CQkvKiBudW1lcmljIHN0YXR1cyBjb2RlICovCi0JY2hhcglzdHJbNDBdOwkvKiBzdGF0dXMgc3RyaW5nICovCi19OwotCi0vKiBQYXBlciBzaXplIHN0cnVjdHVyZSAoU0xNSU9bR1NdUFNJWkUpICovCi1zdHJ1Y3QgU0xNX3BhcGVyX3NpemUgewotCWludAkJd2lkdGg7Ci0JaW50CQloZWlnaHQ7Ci19OwotCi0jZW5kaWYgLyogX0FUQVJJX1NMTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX2Fjc2kuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfYWNzaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGZlYTY4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfYWNzaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI2lmbmRlZiBfQVNNX0FUQVJJX0FDU0lfSAotI2RlZmluZSBfQVNNX0FUQVJJX0FDU0lfSAotCi0vKiBGdW5jdGlvbnMgZXhwb3J0ZWQgYnkgZHJpdmVycy9ibG9jay9hY3NpLmMgKi8KLQotdm9pZCBhY3NpX2RlbGF5X3N0YXJ0KCB2b2lkICk7Ci12b2lkIGFjc2lfZGVsYXlfZW5kKCBsb25nIHVzZWMgKTsKLWludCBhY3NpX3dhaXRfZm9yX0lSUSggdW5zaWduZWQgdGltZW91dCApOwotaW50IGFjc2lfd2FpdF9mb3Jfbm9JUlEoIHVuc2lnbmVkIHRpbWVvdXQgKTsKLWludCBhY3NpY21kX25vZG1hKCBjb25zdCBjaGFyICpjbWQsIGludCBlbmFibGUpOwotaW50IGFjc2lfZ2V0c3RhdHVzKCB2b2lkICk7Ci1pbnQgYWNzaV9leHRzdGF0dXMoIGNoYXIgKmJ1ZmZlciwgaW50IGNudCApOwotdm9pZCBhY3NpX2VuZF9leHRzdGF0dXMoIHZvaWQgKTsKLWludCBhY3NpX2V4dGNtZCggdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgY250ICk7Ci0KLS8qIFRoZSBBQ1NJIGJ1ZmZlciBpcyBndWFyYW50dWVlZCB0byByZXNpZGUgaW4gU1QtUkFNIGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcgotICogZHJpdmVycyB0aGF0IHdvcmsgb24gdGhlIEFDU0kgYnVzLCB0b28uIEl0J3MgZGF0YSBhcmUgdmFsaWQgb25seSBhcyBsb25nIGFzCi0gKiB0aGUgU1QtRE1BIGlzIGxvY2tlZC4gKi8KLWV4dGVybiBjaGFyICphY3NpX2J1ZmZlcjsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBoeXNfYWNzaV9idWZmZXI7Ci0KLS8qIFV0aWxpdHkgbWFjcm9zICovCi0KLS8qIFNlbmQgb25lIGRhdGEgYnl0ZSBvdmVyIHRoZSBidXMgYW5kIHNldCBtb2RlIGZvciBuZXh0IG9wZXJhdGlvbgotICogd2l0aCBvbmUgbW92ZS5sIC0tIEF0YXJpIHJlY29tbWVuZHMgdGhpcy4uLgotICovCi0KLSNkZWZpbmUgRE1BX0xPTkdfV1JJVEUoZGF0YSxtb2RlKQkJCQkJCQlcCi0gICAgZG8gewkJCQkJCQkJCQkJCQlcCi0JCSooKHVuc2lnbmVkIGxvbmcgKikmZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCkgPQlcCi0JCQkoKGRhdGEpPDwxNikgfCAobW9kZSk7CQkJCQkJCVwKLQl9IHdoaWxlKDApCi0KLSNkZWZpbmUgRU5BQkxFX0lSUSgpCWF0YXJpX3R1cm5vbl9pcnEoIElSUV9NRlBfQUNTSSApCi0jZGVmaW5lIERJU0FCTEVfSVJRKCkJYXRhcmlfdHVybm9mZl9pcnEoIElSUV9NRlBfQUNTSSApCi0KLSNlbmRpZiAvKiBfQVNNX0FUQVJJX0FDU0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9mYi5oIGIvaW5jbHVkZS9hc20tbTY4ay9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGI5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2ZiLmgKQEAgLTAsMCArMSwzNCBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaWZkZWYgQ09ORklHX1NVTjMKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IFNVTjNfUEFHRV9OT0NBQ0hFOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCWlmIChDUFVfSVNfMDIwX09SXzAzMCkKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9DQUNIRTAzMDsKKwlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgJj0gX0NBQ0hFTUFTSzA0MDsKKwkJLyogVXNlIG5vLWNhY2hlIG1vZGUsIHNlcmlhbGl6ZWQgKi8KKwkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gX1BBR0VfTk9DQUNIRV9TOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfU1VOMyAqLworCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmgKaW5kZXggYjViNzhjMC4uZDAyOWI3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmgKQEAgLTE2NCwyMSArMTY0LDE1IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX1JPTkxZKTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KIAogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUk9OTFk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ST05MWTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta25vY2FjaGUocHRlX3QgcHRlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ3RhYmxlLmgKaW5kZXggYjllNjJjMS4uYjc2NmZjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGd0YWJsZS5oCkBAIC0xNjUsMjEgKzE2NSwxNSBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLi4KICAqIFt3ZSBoYXZlIHRoZSBmdWxsIHNldCBoZXJlIGV2ZW4gaWYgdGhleSBkb24ndCBjaGFuZ2UgZnJvbSBtNjhrXQogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgU1VOM19QQUdFX1dSSVRFQUJMRTsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIFNVTjNfUEFHRV9NT0RJRklFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIFNVTjNfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgU1VOM19QQUdFX0FDQ0VTU0VEOyB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5TVU4zX1BBR0VfV1JJVEVBQkxFOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5TVU4zX1BBR0VfTU9ESUZJRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gflNVTjNfUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IFNVTjNfUEFHRV9XUklURUFCTEU7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gU1VOM19QQUdFX01PRElGSUVEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gU1VOM19QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta25vY2FjaGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBTVU4zX1BBR0VfTk9DQUNIRTsgcmV0dXJuIHB0ZTsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2ZiLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2ZiLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisjZGVmaW5lIGZiX3BncHJvdGVjdCguLi4pIGRvIHt9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCmluZGV4IDJhMWI4YmQuLjllZmEwYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaApAQCAtMjIsNyArMjIsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaAppbmRleCA2N2MzZjhlLi41NjhjNzZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKQEAgLTM3LDggKzM3LDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CQljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAkJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZiLmggYi9pbmNsdWRlL2FzbS1taXBzL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzZjY4YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYl9wZ3Byb3RlY3Qoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXVuc2lnbmVkIGxvbmcgb2ZmKQoreworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaAppbmRleCAyN2Q3N2Q5Li4yZTJkNzBkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BndGFibGUuaApAQCAtMTc4LDkgKzE3OCw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkJeyBCVUcoKTsgcmV0dXJuIDA7IH0KICNpZiBkZWZpbmVkKENPTkZJR182NEJJVF9QSFlTX0FERFIpICYmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTMzJfUjEpCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZS5wdGVfbG93ICYgX1BBR0VfUkVBRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlLnB0ZV9sb3cgJiBfUEFHRV9XUklURTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlLnB0ZV9sb3cgJiBfUEFHRV9NT0RJRklFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlLnB0ZV9sb3cgJiBfUEFHRV9BQ0NFU1NFRDsgfQpAQCAtMTkzLDEzICsxOTEsNiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCi17Ci0JcHRlLnB0ZV9sb3cgICY9IH4oX1BBR0VfUkVBRCB8IF9QQUdFX1NJTEVOVF9SRUFEKTsKLQlwdGUucHRlX2hpZ2ggJj0gfl9QQUdFX1NJTEVOVF9SRUFEOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQogewogCXB0ZS5wdGVfbG93ICAmPSB+KF9QQUdFX01PRElGSUVEIHwgX1BBR0VfU0lMRU5UX1dSSVRFKTsKQEAgLTIyNCwxNiArMjE1LDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXB0ZS5wdGVfbG93IHw9IF9QQUdFX1JFQUQ7Ci0JaWYgKHB0ZS5wdGVfbG93ICYgX1BBR0VfQUNDRVNTRUQpIHsKLQkJcHRlLnB0ZV9sb3cgIHw9IF9QQUdFX1NJTEVOVF9SRUFEOwotCQlwdGUucHRlX2hpZ2ggfD0gX1BBR0VfU0lMRU5UX1JFQUQ7Ci0JfQotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogCXB0ZS5wdGVfbG93IHw9IF9QQUdFX01PRElGSUVEOwpAQCAtMjUzLDcgKzIzNCw2IEBACiAJcmV0dXJuIHB0ZTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JFQUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1dSSVRFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9NT0RJRklFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KQEAgLTI2NSwxMiArMjQ1LDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX1JFQUQgfCBfUEFHRV9TSUxFTlRfUkVBRCk7Ci0JcmV0dXJuIHB0ZTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfTU9ESUZJRUR8X1BBR0VfU0lMRU5UX1dSSVRFKTsKQEAgLTI5MSwxNCArMjY1LDYgQEAKIAlyZXR1cm4gcHRlOwogfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQotewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SRUFEOwotCWlmIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRCkKLQkJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1NJTEVOVF9SRUFEOwotCXJldHVybiBwdGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9NT0RJRklFRDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL2JjbTE0ODBfcmVncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKaW5kZXggYmRhMzkxZC4uMjczOGMxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvYmNtMTQ4MF9yZWdzLmgKQEAgLTIyMCwxNyArMjIwLDI1IEBACiAjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVChjaGFuKSAgICAgICAgICAgICAgICgoKChjaGFuKSYyKSA9PSAwKT8gQV9CQ00xNDgwX0RVQVJUMCA6IEFfQkNNMTQ4MF9EVUFSVDEpCiAKICNkZWZpbmUgQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcgICAgICAgMHgxMDAKLSNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0NIQU5SRUcoY2hhbixyZWcpICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBCQ00xNDgwX0RVQVJUX0NIQU5SRUdfU1BBQ0lORyooKGNoYW4pJjEpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChyZWcpKQotI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfQ0hBTlJFRyhjaGFuLHJlZykgICAoQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcqKChjaGFuKSYxKSArIChyZWcpKQorI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfQ0hBTlJFRyhjaGFuLCByZWcpCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsJCQkJCVwKKwkgQkNNMTQ4MF9EVUFSVF9DSEFOUkVHX1NQQUNJTkcgKiAoKChjaGFuKSAmIDEpICsgMSkgKyAocmVnKSkKKyNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoY2hhbiwgcmVnKQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArCQkJCQlcCisJIEJDTTE0ODBfRFVBUlRfQ0hBTlJFR19TUEFDSU5HICogMyArIChyZWcpKQogCi0jZGVmaW5lIFJfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikJICAgIChSX0RVQVJUX0lNUl9BICsgKChjaGFuKSYxKSpEVUFSVF9JTVJJU1JfU1BBQ0lORykKLSNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKFJfRFVBUlRfSVNSX0EgKyAoKGNoYW4pJjEpKkRVQVJUX0lNUklTUl9TUEFDSU5HKQorI2RlZmluZSBSX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCQkJCQlcCisJKFJfRFVBUlRfSU1SX0EgKyAoKGNoYW4pICYgMSkgKiBEVUFSVF9JTVJJU1JfU1BBQ0lORykKKyNkZWZpbmUgUl9CQ00xNDgwX0RVQVJUX0lTUlJFRyhjaGFuKQkJCQkJXAorCShSX0RVQVJUX0lTUl9BICsgKChjaGFuKSAmIDEpICogRFVBUlRfSU1SSVNSX1NQQUNJTkcpCiAKLSNkZWZpbmUgQV9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKQkgICAgKEFfQkNNMTQ4MF9EVUFSVChjaGFuKSArIFJfQkNNMTQ4MF9EVUFSVF9JTVJSRUcoY2hhbikpCi0jZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikJICAgIChBX0JDTTE0ODBfRFVBUlQoY2hhbikgKyBSX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pKQotI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSU5fUE9SVChjaGFuKSAgICAgICAoQV9CQ00xNDgwX0RVQVJUKGNoYW4pICsgUl9EVUFSVF9JTlBfT1JUKQorI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSU1SUkVHKGNoYW4pCQkJCQlcCisJKEFfQkNNMTQ4MF9EVUFSVF9DVFJMUkVHKChjaGFuKSwgUl9CQ00xNDgwX0RVQVJUX0lNUlJFRyhjaGFuKSkpCisjZGVmaW5lIEFfQkNNMTQ4MF9EVUFSVF9JU1JSRUcoY2hhbikJCQkJCVwKKwkoQV9CQ00xNDgwX0RVQVJUX0NUUkxSRUcoKGNoYW4pLCBSX0JDTTE0ODBfRFVBUlRfSVNSUkVHKGNoYW4pKSkKKworI2RlZmluZSBBX0JDTTE0ODBfRFVBUlRfSU5fUE9SVChjaGFuKQkJCQkJXAorCShBX0JDTTE0ODBfRFVBUlRfQ1RSTFJFRygoY2hhbiksIFJfRFVBUlRfSU5fUE9SVCkpCiAKIC8qCiAgKiBUaGVzZSBjb25zdGFudHMgYXJlIHRoZSBhYnNvbHV0ZSBhZGRyZXNzZXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3JlZ3MuaAppbmRleCBkYTdjMTg4Li4yMjBiN2U5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9yZWdzLmgKQEAgLTI3Miw1OSArMjcyLDY5IEBACiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCiAKIAotI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMngJCS8qIFRoaXMgTUMgb25seSBvbiAxMjUwICYgMTEyeCAqLworI2lmIFNJQllURV9IRFJfRkVBVFVSRV8xMjUwXzExMnggICAgLyogVGhpcyBNQyBvbmx5IG9uIDEyNTAgJiAxMTJ4ICovCiAjZGVmaW5lIFJfRFVBUlRfTlVNX1BPUlRTICAgICAgICAgICAyCiAKICNkZWZpbmUgQV9EVUFSVCAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDA2MDAwMAogCiAjZGVmaW5lIERVQVJUX0NIQU5SRUdfU1BBQ0lORyAgICAgICAweDEwMAotI2RlZmluZSBBX0RVQVJUX0NIQU5SRUcoY2hhbixyZWcpICAgKEFfRFVBUlQgKyBEVUFSVF9DSEFOUkVHX1NQQUNJTkcqKGNoYW4pICsgKHJlZykpCi0jZGVmaW5lIFJfRFVBUlRfQ0hBTlJFRyhjaGFuLHJlZykgICAoRFVBUlRfQ0hBTlJFR19TUEFDSU5HKihjaGFuKSArIChyZWcpKQorCisjZGVmaW5lIEFfRFVBUlRfQ0hBTlJFRyhjaGFuLCByZWcpCQkJCQlcCisJKEFfRFVBUlQgKyBEVUFSVF9DSEFOUkVHX1NQQUNJTkcgKiAoKGNoYW4pICsgMSkgKyAocmVnKSkKICNlbmRpZgkvKiAxMjUwICYgMTEyeCAqLwogCi0jZGVmaW5lIFJfRFVBUlRfTU9ERV9SRUdfMQkgICAgMHgxMDAKLSNkZWZpbmUgUl9EVUFSVF9NT0RFX1JFR18yCSAgICAweDExMAotI2RlZmluZSBSX0RVQVJUX1NUQVRVUyAgICAgICAgICAgICAgMHgxMjAKLSNkZWZpbmUgUl9EVUFSVF9DTEtfU0VMICAgICAgICAgICAgIDB4MTMwCi0jZGVmaW5lIFJfRFVBUlRfQ01EICAgICAgICAgICAgICAgICAweDE1MAotI2RlZmluZSBSX0RVQVJUX1JYX0hPTEQgICAgICAgICAgICAgMHgxNjAKLSNkZWZpbmUgUl9EVUFSVF9UWF9IT0xEICAgICAgICAgICAgIDB4MTcwCisjZGVmaW5lIFJfRFVBUlRfTU9ERV9SRUdfMQkgICAgMHgwMDAKKyNkZWZpbmUgUl9EVUFSVF9NT0RFX1JFR18yCSAgICAweDAxMAorI2RlZmluZSBSX0RVQVJUX1NUQVRVUwkJICAgIDB4MDIwCisjZGVmaW5lIFJfRFVBUlRfQ0xLX1NFTAkJICAgIDB4MDMwCisjZGVmaW5lIFJfRFVBUlRfQ01ECQkgICAgMHgwNTAKKyNkZWZpbmUgUl9EVUFSVF9SWF9IT0xECQkgICAgMHgwNjAKKyNkZWZpbmUgUl9EVUFSVF9UWF9IT0xECQkgICAgMHgwNzAKIAogI2lmIFNJQllURV9IRFJfRkVBVFVSRSgxMjUwLCBQQVNTMikgfHwgU0lCWVRFX0hEUl9GRUFUVVJFKDExMngsIFBBU1MxKSB8fCBTSUJZVEVfSERSX0ZFQVRVUkVfQ0hJUCgxNDgwKQotI2RlZmluZSBSX0RVQVJUX0ZVTExfQ1RMCSAgICAweDE0MAotI2RlZmluZSBSX0RVQVJUX09QQ1JfWAkJICAgIDB4MTgwCi0jZGVmaW5lIFJfRFVBUlRfQVVYQ1RMX1gJICAgIDB4MTkwCi0jZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAqLworI2RlZmluZSBSX0RVQVJUX0ZVTExfQ1RMCSAgICAweDA0MAorI2RlZmluZSBSX0RVQVJUX09QQ1JfWAkJICAgIDB4MDgwCisjZGVmaW5lIFJfRFVBUlRfQVVYQ1RMX1gJICAgIDB4MDkwCisjZW5kaWYgLyogMTI1MCBQQVNTMiB8fCAxMTJ4IFBBU1MxIHx8IDE0ODAgKi8KIAogCiAvKgogICogVGhlIElNUiBhbmQgSVNSIGNhbid0IGJlIGFkZHJlc3NlZCB3aXRoIEFfRFVBUlRfQ0hBTlJFRywKLSAqIHNvIHVzZSB0aGlzIG1hY3JvIGluc3RlYWQuCisgKiBzbyB1c2UgdGhlc2UgbWFjcm9zIGluc3RlYWQuCiAgKi8KIAotI2RlZmluZSBSX0RVQVJUX0FVWF9DVFJMICAgICAgICAgICAgMHgzMTAKLSNkZWZpbmUgUl9EVUFSVF9JU1JfQSAgICAgICAgICAgICAgIDB4MzIwCi0jZGVmaW5lIFJfRFVBUlRfSU1SX0EgICAgICAgICAgICAgICAweDMzMAotI2RlZmluZSBSX0RVQVJUX0lTUl9CICAgICAgICAgICAgICAgMHgzNDAKLSNkZWZpbmUgUl9EVUFSVF9JTVJfQiAgICAgICAgICAgICAgIDB4MzUwCi0jZGVmaW5lIFJfRFVBUlRfT1VUX1BPUlQgICAgICAgICAgICAweDM2MAotI2RlZmluZSBSX0RVQVJUX09QQ1IgICAgICAgICAgICAgICAgMHgzNzAKLSNkZWZpbmUgUl9EVUFSVF9JTl9QT1JUICAgICAgICAgICAgIDB4MzgwCisjaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeCAgICAvKiBUaGlzIE1DIG9ubHkgb24gMTI1MCAmIDExMnggKi8KKyNkZWZpbmUgRFVBUlRfSU1SSVNSX1NQQUNJTkcJICAgIDB4MjAKKyNkZWZpbmUgRFVBUlRfSU5DSE5HX1NQQUNJTkcJICAgIDB4MTAKIAotI2RlZmluZSBSX0RVQVJUX1NFVF9PUFIJCSAgICAweDNCMAotI2RlZmluZSBSX0RVQVJUX0NMRUFSX09QUgkgICAgMHgzQzAKKyNkZWZpbmUgQV9EVUFSVF9DVFJMUkVHKHJlZykJCQkJCQlcCisJKEFfRFVBUlQgKyBEVUFSVF9DSEFOUkVHX1NQQUNJTkcgKiAzICsgKHJlZykpCiAKLSNkZWZpbmUgRFVBUlRfSU1SSVNSX1NQQUNJTkcgICAgICAgIDB4MjAKKyNkZWZpbmUgUl9EVUFSVF9JTVJSRUcoY2hhbikJCQkJCQlcCisJKFJfRFVBUlRfSU1SX0EgKyAoY2hhbikgKiBEVUFSVF9JTVJJU1JfU1BBQ0lORykKKyNkZWZpbmUgUl9EVUFSVF9JU1JSRUcoY2hhbikJCQkJCQlcCisJKFJfRFVBUlRfSVNSX0EgKyAoY2hhbikgKiBEVUFSVF9JTVJJU1JfU1BBQ0lORykKKyNkZWZpbmUgUl9EVUFSVF9JTkNIUkVHKGNoYW4pCQkJCQkJXAorCShSX0RVQVJUX0lOX0NITkdfQSArIChjaGFuKSAqIERVQVJUX0lOQ0hOR19TUEFDSU5HKQogCi0jaWYgU0lCWVRFX0hEUl9GRUFUVVJFXzEyNTBfMTEyeAkJLyogVGhpcyBNQyBvbmx5IG9uIDEyNTAgJiAxMTJ4ICovCi0jZGVmaW5lIFJfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoUl9EVUFSVF9JTVJfQSArIChjaGFuKSpEVUFSVF9JTVJJU1JfU1BBQ0lORykKLSNkZWZpbmUgUl9EVUFSVF9JU1JSRUcoY2hhbikJICAgIChSX0RVQVJUX0lTUl9BICsgKGNoYW4pKkRVQVJUX0lNUklTUl9TUEFDSU5HKQotCi0jZGVmaW5lIEFfRFVBUlRfSU1SUkVHKGNoYW4pCSAgICAoQV9EVUFSVCArIFJfRFVBUlRfSU1SUkVHKGNoYW4pKQotI2RlZmluZSBBX0RVQVJUX0lTUlJFRyhjaGFuKQkgICAgKEFfRFVBUlQgKyBSX0RVQVJUX0lTUlJFRyhjaGFuKSkKKyNkZWZpbmUgQV9EVUFSVF9JTVJSRUcoY2hhbikJICAgIEFfRFVBUlRfQ1RSTFJFRyhSX0RVQVJUX0lNUlJFRyhjaGFuKSkKKyNkZWZpbmUgQV9EVUFSVF9JU1JSRUcoY2hhbikJICAgIEFfRFVBUlRfQ1RSTFJFRyhSX0RVQVJUX0lTUlJFRyhjaGFuKSkKKyNkZWZpbmUgQV9EVUFSVF9JTkNIUkVHKGNoYW4pCSAgICBBX0RVQVJUX0NUUkxSRUcoUl9EVUFSVF9JTkNIUkVHKGNoYW4pKQogI2VuZGlmCS8qIDEyNTAgJiAxMTJ4ICovCiAKKyNkZWZpbmUgUl9EVUFSVF9BVVhfQ1RSTAkgICAgMHgwMTAKKyNkZWZpbmUgUl9EVUFSVF9JU1JfQQkJICAgIDB4MDIwCisjZGVmaW5lIFJfRFVBUlRfSU1SX0EJCSAgICAweDAzMAorI2RlZmluZSBSX0RVQVJUX0lTUl9CCQkgICAgMHgwNDAKKyNkZWZpbmUgUl9EVUFSVF9JTVJfQgkJICAgIDB4MDUwCisjZGVmaW5lIFJfRFVBUlRfT1VUX1BPUlQJICAgIDB4MDYwCisjZGVmaW5lIFJfRFVBUlRfT1BDUgkJICAgIDB4MDcwCisjZGVmaW5lIFJfRFVBUlRfSU5fUE9SVAkJICAgIDB4MDgwCiAKKyNkZWZpbmUgUl9EVUFSVF9TRVRfT1BSCQkgICAgMHgwQjAKKyNkZWZpbmUgUl9EVUFSVF9DTEVBUl9PUFIJICAgIDB4MEMwCisjZGVmaW5lIFJfRFVBUlRfSU5fQ0hOR19BCSAgICAweDBEMAorI2RlZmluZSBSX0RVQVJUX0lOX0NITkdfQgkgICAgMHgwRTAKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF91YXJ0LmgKaW5kZXggZTg3MDQ1ZS4uY2Y3NGZlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3VhcnQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfdWFydC5oCkBAIC03NSw3ICs3NSw4IEBACiAjZGVmaW5lIFZfRFVBUlRfUEFSSVRZX01PREVfQUREX0ZJWEVEIFZfRFVBUlRfUEFSSVRZX01PREUoS19EVUFSVF9QQVJJVFlfTU9ERV9BRERfRklYRUQpCiAjZGVmaW5lIFZfRFVBUlRfUEFSSVRZX01PREVfTk9ORSAgICAgIFZfRFVBUlRfUEFSSVRZX01PREUoS19EVUFSVF9QQVJJVFlfTU9ERV9OT05FKQogCi0jZGVmaW5lIE1fRFVBUlRfRVJSX01PREUgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDUpICAgIC8qIG11c3QgYmUgemVybyAqLworI2RlZmluZSBNX0RVQVJUX1RYX0lSUV9TRUxfVFhSRFkgICAgMAorI2RlZmluZSBNX0RVQVJUX1RYX0lSUV9TRUxfVFhFTVBUICAgX1NCX01BS0VNQVNLMSg1KQogCiAjZGVmaW5lIE1fRFVBUlRfUlhfSVJRX1NFTF9SWFJEWSAgICAwCiAjZGVmaW5lIE1fRFVBUlRfUlhfSVJRX1NFTF9SWEZVTEwgICBfU0JfTUFLRU1BU0sxKDYpCkBAIC0yNDYsMTAgKzI0NywxMyBAQAogCiAjZGVmaW5lIE1fRFVBUlRfSVNSX0JSS19BICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDIpCiAjZGVmaW5lIE1fRFVBUlRfSVNSX0lOX0EgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDMpCisjZGVmaW5lIE1fRFVBUlRfSVNSX0FMTF9BCSAgICBfU0JfTUFLRU1BU0soNCwwKQorCiAjZGVmaW5lIE1fRFVBUlRfSVNSX1RYX0IgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDQpCiAjZGVmaW5lIE1fRFVBUlRfSVNSX1JYX0IgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDUpCiAjZGVmaW5lIE1fRFVBUlRfSVNSX0JSS19CICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDYpCiAjZGVmaW5lIE1fRFVBUlRfSVNSX0lOX0IgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDcpCisjZGVmaW5lIE1fRFVBUlRfSVNSX0FMTF9CCSAgICBfU0JfTUFLRU1BU0soNCw0KQogCiAvKgogICogRFVBUlQgQ2hhbm5lbCBBIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKFRhYmxlIDEwLTE3KQpAQCAtMjYyLDYgKzI2Niw3IEBACiAjZGVmaW5lIE1fRFVBUlRfSVNSX1JYICAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDEpCiAjZGVmaW5lIE1fRFVBUlRfSVNSX0JSSyAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDIpCiAjZGVmaW5lIE1fRFVBUlRfSVNSX0lOICAgICAgICAgICAgICBfU0JfTUFLRU1BU0sxKDMpCisjZGVmaW5lIE1fRFVBUlRfSVNSX0FMTAkJICAgIF9TQl9NQUtFTUFTSyg0LDApCiAjZGVmaW5lIE1fRFVBUlRfSVNSX1JFU0VSVkVEICAgICAgICBfU0JfTUFLRU1BU0soNCw0KQogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2NvbXBhdC5oCmluZGV4IDExZjQyMjIuLjVhODVkMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvY29tcGF0LmgKQEAgLTMxLDggKzMxLDEwIEBACiAKIHR5cGVkZWYgczMyCWNvbXBhdF9pbnRfdDsKIHR5cGVkZWYgczMyCWNvbXBhdF9sb25nX3Q7Cit0eXBlZGVmIHM2NAljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJY29tcGF0X3VpbnRfdDsKIHR5cGVkZWYgdTMyCWNvbXBhdF91bG9uZ190OwordHlwZWRlZiB1NjQJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAkJdHZfc2VjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2ZiLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDUwM2EwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9OT19DQUNIRTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oCmluZGV4IDMxNzg1MWYuLjFlMWM4MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mY250bC5oCkBAIC0zLDIxICszLDIyIEBACiAKIC8qIG9wZW4vZmNudGwgLSBPX1NZTkMgaXMgb25seSBpbXBsZW1lbnRlZCBvbiBibG9ja3MgZGV2aWNlcyBhbmQgb24gZmlsZXMKICAgIGxvY2F0ZWQgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBPX0FQUEVORAkwMDAwMDAxMAotI2RlZmluZSBPX0JMS1NFRUsJMDAwMDAxMDAgLyogSFBVWCBvbmx5ICovCi0jZGVmaW5lIE9fQ1JFQVQJCTAwMDAwNDAwIC8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0VYQ0wJCTAwMDAyMDAwIC8qIG5vdCBmY250bCAqLwotI2RlZmluZSBPX0xBUkdFRklMRQkwMDAwNDAwMAotI2RlZmluZSBPX1NZTkMJCTAwMTAwMDAwCi0jZGVmaW5lIE9fTk9OQkxPQ0sJMDAyMDAwMDQgLyogSFBVWCBoYXMgc2VwYXJhdGUgTkRFTEFZICYgTk9OQkxPQ0sgKi8KLSNkZWZpbmUgT19OT0NUVFkJMDA0MDAwMDAgLyogbm90IGZjbnRsICovCi0jZGVmaW5lIE9fRFNZTkMJCTAxMDAwMDAwIC8qIEhQVVggb25seSAqLwotI2RlZmluZSBPX1JTWU5DCQkwMjAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KLSNkZWZpbmUgT19OT0FUSU1FCTA0MDAwMDAwCisjZGVmaW5lIE9fQVBQRU5ECTAwMDAwMDAxMAorI2RlZmluZSBPX0JMS1NFRUsJMDAwMDAwMTAwIC8qIEhQVVggb25seSAqLworI2RlZmluZSBPX0NSRUFUCQkwMDAwMDA0MDAgLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fRVhDTAkJMDAwMDAyMDAwIC8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0xBUkdFRklMRQkwMDAwMDQwMDAKKyNkZWZpbmUgT19TWU5DCQkwMDAxMDAwMDAKKyNkZWZpbmUgT19OT05CTE9DSwkwMDAyMDAwMDQgLyogSFBVWCBoYXMgc2VwYXJhdGUgTkRFTEFZICYgTk9OQkxPQ0sgKi8KKyNkZWZpbmUgT19OT0NUVFkJMDAwNDAwMDAwIC8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX0RTWU5DCQkwMDEwMDAwMDAgLyogSFBVWCBvbmx5ICovCisjZGVmaW5lIE9fUlNZTkMJCTAwMjAwMDAwMCAvKiBIUFVYIG9ubHkgKi8KKyNkZWZpbmUgT19OT0FUSU1FCTAwNDAwMDAwMAorI2RlZmluZSBPX0NMT0VYRUMJMDEwMDAwMDAwIC8qIHNldCBjbG9zZV9vbl9leGVjICovCiAKLSNkZWZpbmUgT19ESVJFQ1RPUlkJMDAwMTAwMDAgLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwotI2RlZmluZSBPX05PRk9MTE9XCTAwMDAwMjAwIC8qIGRvbid0IGZvbGxvdyBsaW5rcyAqLwotI2RlZmluZSBPX0lOVklTSUJMRQkwNDAwMDAwMCAvKiBpbnZpc2libGUgSS9PLCBmb3IgRE1BUEkvWERTTSAqLworI2RlZmluZSBPX0RJUkVDVE9SWQkwMDAwMTAwMDAgLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBPX05PRk9MTE9XCTAwMDAwMDIwMCAvKiBkb24ndCBmb2xsb3cgbGlua3MgKi8KKyNkZWZpbmUgT19JTlZJU0lCTEUJMDA0MDAwMDAwIC8qIGludmlzaWJsZSBJL08sIGZvciBETUFQSS9YRFNNICovCiAKICNkZWZpbmUgRl9HRVRMSzY0CTgKICNkZWZpbmUgRl9TRVRMSzY0CTkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGd0YWJsZS5oCmluZGV4IGJlYjJhZGIuLmU4OGNhY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BndGFibGUuaApAQCAtMzM1LDE4ICszMzUsMTQgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotZXh0ZXJuIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUkVBRDsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBleHRlcm4gaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIGV4dGVybiBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQogZXh0ZXJuIGlubGluZSBpbnQgcHRlX2ZpbGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQotZXh0ZXJuIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKSAJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KIAotZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1JFQUQ7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRElSVFk7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfV1JJVEU7IHJldHVybiBwdGU7IH0KLWV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1JFQUQ7IHJldHVybiBwdGU7IH0KIGV4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQogZXh0ZXJuIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiBleHRlcm4gaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfV1JJVEU7IHJldHVybiBwdGU7IH0KQEAgLTQ1MSwyMSArNDQ3LDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoIXB0ZV9kaXJ0eSgqcHRlcCkpCi0JCXJldHVybiAwOwotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoeGxhdGVfcGFiaXQoX1BBR0VfRElSVFlfQklUKSwgJnB0ZV92YWwoKnB0ZXApKTsKLSNlbHNlCi0JcHRlX3QgcHRlID0gKnB0ZXA7Ci0JaWYgKCFwdGVfZGlydHkocHRlKSkKLQkJcmV0dXJuIDA7Ci0Jc2V0X3B0ZV9hdCh2bWEtPnZtX21tLCBhZGRyLCBwdGVwLCBwdGVfbWtjbGVhbihwdGUpKTsKLQlyZXR1cm4gMTsKLSNlbmRpZgotfQotCiBleHRlcm4gc3BpbmxvY2tfdCBwYV9kYml0X2xvY2s7CiAKIHN0cnVjdCBtbV9zdHJ1Y3Q7CkBAIC01MzMsNyArNTE0LDYgQEAKICNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jYWNoZS5oCmluZGV4IDY0MmJlNjIuLjUzNTA3MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NhY2hlLmgKQEAgLTM0LDUgKzM0LDkgQEAKIGV4dGVybiBzdHJ1Y3QgcHBjNjRfY2FjaGVzIHBwYzY0X2NhY2hlczsKICNlbmRpZiAvKiBfX3Bvd2VycGM2NF9fICYmICEgX19BU1NFTUJMWV9fICovCiAKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCisjZGVmaW5lIF9fcmVhZF9tb3N0bHkgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLnJlYWRfbW9zdGx5IikpKQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NvbXBhdC5oCmluZGV4IGFhY2FhYmQuLjY0YWIxZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jb21wYXQuaApAQCAtMzMsOCArMzMsMTAgQEAKIAogdHlwZWRlZiBzMzIJCWNvbXBhdF9pbnRfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQJCWNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3VpbnRfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0CQljb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAppbmRleCA4MmQ1OTVhLi4zZGM4ZTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCkBAIC0xMTEsNyArMTExLDcgQEAKIC8qIENQVSBrZXJuZWwgZmVhdHVyZXMgKi8KIAogLyogUmV0YWluIHRoZSAzMmIgZGVmaW5pdGlvbnMgYWxsIHVzZSBib3R0b20gaGFsZiBvZiB3b3JkICovCi0jZGVmaW5lIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCisjZGVmaW5lIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQogI2RlZmluZSBDUFVfRlRSX0wyQ1IJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAyKQogI2RlZmluZSBDUFVfRlRSX1NQRUM3NDUwCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA0KQogI2RlZmluZSBDUFVfRlRSX0FMVElWRUMJCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA4KQpAQCAtMTM1LDYgKzEzNSw3IEBACiAjZGVmaW5lIENQVV9GVFJfUFBDX0xFCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDIwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9SRUFMX0xFCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDQwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9GUFVfVU5BVkFJTEFCTEUJCUFTTV9DT05TVCgweDAwMDAwMDAwMDA4MDAwMDApCisjZGVmaW5lIENQVV9GVFJfVU5JRklFRF9JRF9DQUNIRQlBU01fQ09OU1QoMHgwMDAwMDAwMDAxMDAwMDAwKQogCiAvKgogICogQWRkIHRoZSA2NC1iaXQgcHJvY2Vzc29yIHVuaXF1ZSBmZWF0dXJlcyBpbiB0aGUgdG9wIGhhbGYgb2YgdGhlIHdvcmQ7CkBAIC0xNTQsNyArMTU1LDYgQEAKICNkZWZpbmUgQ1BVX0ZUUl9NTUNSQQkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAwNDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9DVFJMCQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDA4MDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1NNVAkJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAxMDAwMDAwMDAwMCkKLSNkZWZpbmUgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDAyMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRQkJTE9OR19BU01fQ09OU1QoMHgwMDAwMDQwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NJX0xBUkdFX1BBR0UJCUxPTkdfQVNNX0NPTlNUKDB4MDAwMDEwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9QQVVTRV9aRVJPCQlMT05HX0FTTV9DT05TVCgweDAwMDAyMDAwMDAwMDAwMDApCkBAIC0yMDYsMTY0ICsyMDYsMTQ5IEBACiAJCSAgICAgIWRlZmluZWQoQ09ORklHX1BPV0VSMykgJiYgIWRlZmluZWQoQ09ORklHX1BPV0VSNCkgJiYgXAogCQkgICAgICFkZWZpbmVkKENPTkZJR19CT09LRSkpCiAKLSNkZWZpbmUgQ1BVX0ZUUlNfUFBDNjAxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfNjAxIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFKQotI2RlZmluZSBDUFVfRlRSU182MDMJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUFBDNjAxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfNjAxIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgXAorCUNQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKQorI2RlZmluZSBDUFVfRlRSU182MDMJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU182MDQJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNjA0CShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSXzYwNF9QRVJGX01PTiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKIAkgICAgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0MF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKIAkgICAgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NTAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAogCSAgICBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwQ0wJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEZYMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9OT19EUE0gfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwRlgyCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfTk9fRFBNIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc1MEZYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCi0JICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKLQkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzUwR1gJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAotCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDAwX05PVEFVCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc1MENMCShDUFVfRlRSU183NTAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMpCisjZGVmaW5lIENQVV9GVFJTXzc1MEZYMQkoQ1BVX0ZUUlNfNzUwIHwgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IENQVV9GVFJfTk9fRFBNKQorI2RlZmluZSBDUFVfRlRSU183NTBGWDIJKENQVV9GVFJTXzc1MCB8IENQVV9GVFJfTk9fRFBNKQorI2RlZmluZSBDUFVfRlRSU183NTBGWAkoQ1BVX0ZUUlNfNzUwIHwgQ1BVX0ZUUl9EVUFMX1BMTF83NTBGWCB8IFwKKwkJQ1BVX0ZUUl9IQVNfSElHSF9CQVRTKQorI2RlZmluZSBDUFVfRlRSU183NTBHWAkoQ1BVX0ZUUlNfNzUwRlgpCisjZGVmaW5lIENQVV9GVFJTXzc0MDBfTk9UQVUJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQwMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDAwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDUwXzIwCShDUFVfRlRSX0NPTU1PTiB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTBfMjEJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfTDNfRElTQUJMRV9OQVAgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDUwXzIzCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTBfMjMJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NV8xCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTVfMQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTDNDUiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NTVfMjAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NV8yMAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfTDNfRElTQUJMRV9OQVAgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDU1CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NTUJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDQ3XzEwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NDdfMTAJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfTk9fQlRJQyB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDQ3CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCisjZGVmaW5lIENQVV9GVFJTXzc0NDcJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQotI2RlZmluZSBDUFVfRlRSU183NDQ3QQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU183NDQ3QQkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzc0NDgJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfNzQ0OAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9QUENfTEUpCi0jZGVmaW5lIENQVV9GVFJTXzgyWFgJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfODJYWAkoQ1BVX0ZUUl9DT01NT04gfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQikKLSNkZWZpbmUgQ1BVX0ZUUlNfRzJfTEUJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAorI2RlZmluZSBDUFVfRlRSU19HMl9MRQkoQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMpCi0jZGVmaW5lIENQVV9GVFJTX0UzMDAJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAorI2RlZmluZSBDUFVfRlRSU19FMzAwCShDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKIAkgICAgQ1BVX0ZUUl9DT01NT04pCi0jZGVmaW5lIENQVV9GVFJTX0UzMDBDMgkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBcCisjZGVmaW5lIENQVV9GVFJTX0UzMDBDMgkoQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCiAJICAgIENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9GUFVfVU5BVkFJTEFCTEUpCi0jZGVmaW5lIENQVV9GVFJTX0NMQVNTSUMzMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAorI2RlZmluZSBDUFVfRlRSU19DTEFTU0lDMzIJKENQVV9GVFJfQ09NTU9OIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfOFhYCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIpCi0jZGVmaW5lIENQVV9GVFJTXzQwWAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX05PRFNJU1JBTElHTikKLSNkZWZpbmUgQ1BVX0ZUUlNfNDRYCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCi0JICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOKQotI2RlZmluZSBDUFVfRlRSU19FMjAwCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQotI2RlZmluZSBDUFVfRlRSU19FNTAwCShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCi0JICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOKQotI2RlZmluZSBDUFVfRlRSU19FNTAwXzIJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfOFhYCShDUFVfRlRSX1VTRV9UQikKKyNkZWZpbmUgQ1BVX0ZUUlNfNDBYCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQorI2RlZmluZSBDUFVfRlRSU180NFgJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCisjZGVmaW5lIENQVV9GVFJTX0UyMDAJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04gfCBcCisJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9VTklGSUVEX0lEX0NBQ0hFKQorI2RlZmluZSBDUFVfRlRSU19FNTAwCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQorI2RlZmluZSBDUFVfRlRSU19FNTAwXzIJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0JJR19QSFlTIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCiAjZGVmaW5lIENQVV9GVFJTX0dFTkVSSUNfMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCiAKIC8qIDY0LWJpdCBDUFVzICovCi0jZGVmaW5lIENQVV9GVFJTX1BPV0VSMwkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QT1dFUjMJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BQQ19MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfUlM2NAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19SUzY0CShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMKQotI2RlZmluZSBDUFVfRlRSU19QT1dFUjQJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUE9XRVI0CShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBKQotI2RlZmluZSBDUFVfRlRSU19QUEM5NzAJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUFBDOTcwCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9DVFJMIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfTU1DUkEpCi0jZGVmaW5lIENQVV9GVFJTX1BPV0VSNQkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QT1dFUjUJKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKIAkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwgXAogCSAgICBDUFVfRlRSX1BVUlIpCi0jZGVmaW5lIENQVV9GVFJTX1BPV0VSNiAoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19QT1dFUjYgKENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKIAkgICAgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwgXAogCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX1NQVVJSIHwgQ1BVX0ZUUl9SRUFMX0xFIHwgXAogCSAgICBDUFVfRlRSX0RTQ1IpCi0jZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfQ0VMTAkoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfUEFVU0VfWkVSTyB8IENQVV9GVFJfQ0lfTEFSR0VfUEFHRSB8IENQVV9GVFJfQ0VMTF9UQl9CVUcpCi0jZGVmaW5lIENQVV9GVFJTX1BBNlQgKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKKyNkZWZpbmUgQ1BVX0ZUUlNfUEE2VCAoQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBcCiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfUkVBTF9MRSkKLSNkZWZpbmUgQ1BVX0ZUUlNfQ09NUEFUSUJMRQkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAorI2RlZmluZSBDUFVfRlRSU19DT01QQVRJQkxFCShDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyKQogCiAjaWZkZWYgX19wb3dlcnBjNjRfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mYi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMWFmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2ZiLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBoeXNfbWVtX2FjY2Vzc19wcm90KGZpbGUsIG9mZiA+PiBQQUdFX1NISUZULAorCQkJCQkJIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKaW5kZXggYWZhNzAwZC4uMzQxNDZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lIGZkX2ZyZWVfaXJxKCkgICAgICAgICAgIGZyZWVfaXJxKEZMT1BQWV9JUlEsIE5VTEwpOwogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4JLyogZm9yIHBwYzY0X2lzYWJyaWRnZV9kZXYgKi8KKyNpbmNsdWRlIDxhc20vcHBjLXBjaS5oPgkvKiBmb3IgaXNhX2JyaWRnZV9wY2lkZXYgKi8KIAogI2RlZmluZSBmZF9kbWFfc2V0dXAoYWRkcixzaXplLG1vZGUsaW8pIGZkX29wcy0+X2RtYV9zZXR1cChhZGRyLHNpemUsbW9kZSxpbykKIApAQCAtMTM5LDEyICsxMzksMTIgQEAKIAlpZiAoYnVzX2FkZHIgCiAJICAgICYmIChhZGRyICE9IHByZXZfYWRkciB8fCBzaXplICE9IHByZXZfc2l6ZSB8fCBkaXIgIT0gcHJldl9kaXIpKSB7CiAJCS8qIGRpZmZlcmVudCBmcm9tIGxhc3QgdGltZSAtLSB1bm1hcCBwcmV2ICovCi0JCXBjaV91bm1hcF9zaW5nbGUocHBjNjRfaXNhYnJpZGdlX2RldiwgYnVzX2FkZHIsIHByZXZfc2l6ZSwgcHJldl9kaXIpOworCQlwY2lfdW5tYXBfc2luZ2xlKGlzYV9icmlkZ2VfcGNpZGV2LCBidXNfYWRkciwgcHJldl9zaXplLCBwcmV2X2Rpcik7CiAJCWJ1c19hZGRyID0gMDsKIAl9CiAKIAlpZiAoIWJ1c19hZGRyKQkvKiBuZWVkIHRvIG1hcCBpdCAqLwotCQlidXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBwYzY0X2lzYWJyaWRnZV9kZXYsIGFkZHIsIHNpemUsIGRpcik7CisJCWJ1c19hZGRyID0gcGNpX21hcF9zaW5nbGUoaXNhX2JyaWRnZV9wY2lkZXYsIGFkZHIsIHNpemUsIGRpcik7CiAKIAkvKiByZW1lbWJlciB0aGlzIG9uZSBhcyBwcmV2ICovCiAJcHJldl9hZGRyID0gYWRkcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCmluZGV4IDYyZWZkOWQuLmJmNmNkN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaApAQCAtMjA2LDYgKzIwNiw3IEBACiAjZGVmaW5lIEhfRlJFRV9MT0dJQ0FMX0xBTl9CVUZGRVIgMHgxRDQKICNkZWZpbmUgSF9RVUVSWV9JTlRfU1RBVEUgICAgICAgMHgxRTQKICNkZWZpbmUgSF9QT0xMX1BFTkRJTkcJCTB4MUQ4CisjZGVmaW5lIEhfSUxMQU5fQVRUUklCVVRFUwkweDI0NAogI2RlZmluZSBIX0pPSU4JCQkweDI5OAogI2RlZmluZSBIX1ZBU0lfU1RBVEUgICAgICAgICAgICAweDJBNAogI2RlZmluZSBIX0VOQUJMRV9DUlEJCTB4MkIwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKaW5kZXggMzUwYzliZC4uYmI4ZDk2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaApAQCAtNjA3LDkgKzYwNyw5IEBACiAgKgogICogKiBpb3VubWFwIHVuZG9lcyBzdWNoIGEgbWFwcGluZyBhbmQgY2FuIGJlIGhvb2tlZAogICoKLSAqICogX19pb3JlbWFwX2V4cGxpY2l0IChhbmQgdGhlIHBlbmRpbmcgX19pb3VubWFwX2V4cGxpY2l0KSBhcmUgbG93IGxldmVsCi0gKiAgIGZ1bmN0aW9ucyB0byBjcmVhdGUgaGFuZC1tYWRlIG1hcHBpbmdzIGZvciB1c2Ugb25seSBieSB0aGUgUENJIGNvZGUKLSAqICAgYW5kIGNhbm5vdCBjdXJyZW50bHkgYmUgaG9va2VkLgorICogKiBfX2lvcmVtYXBfYXQgKGFuZCB0aGUgcGVuZGluZyBfX2lvdW5tYXBfYXQpIGFyZSBsb3cgbGV2ZWwgZnVuY3Rpb25zIHRvCisgKiAgIGNyZWF0ZSBoYW5kLW1hZGUgbWFwcGluZ3MgZm9yIHVzZSBvbmx5IGJ5IHRoZSBQQ0kgY29kZSBhbmQgY2Fubm90CisgKiAgIGN1cnJlbnRseSBiZSBob29rZWQuIE11c3QgYmUgcGFnZSBhbGlnbmVkLgogICoKICAqICogX19pb3JlbWFwIGlzIHRoZSBsb3cgbGV2ZWwgaW1wbGVtZW50YXRpb24gdXNlZCBieSBpb3JlbWFwIGFuZAogICogICBpb3JlbWFwX2ZsYWdzIGFuZCBjYW5ub3QgYmUgaG9va2VkIChidXQgY2FuIGJlIHVzZWQgYnkgYSBob29rIG9uIG9uZQpAQCAtNjI5LDE5ICs2MjksOSBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgX19pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CiAKLWV4dGVybiBpbnQgX19pb3JlbWFwX2V4cGxpY2l0KHBoeXNfYWRkcl90IHBfYWRkciwgdW5zaWduZWQgbG9uZyB2X2FkZHIsCi0JCSAgICAgCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1leHRlcm4gaW50IF9faW91bm1hcF9leHBsaWNpdCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKnN0YXJ0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKLQotZXh0ZXJuIHZvaWQgX19pb21lbSAqIHJlc2VydmVfcGhiX2lvc3BhY2UodW5zaWduZWQgbG9uZyBzaXplKTsKLQotLyogVGhvc2UgYXJlIG1vcmUgMzIgYml0cyBvbmx5IGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9wYSh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW1fcHRvdih1bnNpZ25lZCBsb25nIGFkZHIpIF9fYXR0cmlidXRlX2NvbnN0X187Ci1leHRlcm4gdm9pZCBpb19ibG9ja19tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdmlydCwgcGh5c19hZGRyX3QgcGh5cywKLQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBmbGFncyk7Ci0KK2V4dGVybiB2b2lkIF9faW9tZW0gKiBfX2lvcmVtYXBfYXQocGh5c19hZGRyX3QgcGEsIHZvaWQgKmVhLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCBfX2lvdW5tYXBfYXQodm9pZCAqZWEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKIC8qCiAgKiBXaGVuIENPTkZJR19QUENfSU5ESVJFQ1RfSU8gaXMgc2V0LCB3ZSB1c2UgdGhlIGdlbmVyaWMgaW9tYXAgaW1wbGVtZW50YXRpb24KQEAgLTY1MSw4ICs2NDEsOCBAQAogICovCiAjZGVmaW5lIEhBVkVfQVJDSF9QSU9fU0laRQkJMQogI2RlZmluZSBQSU9fT0ZGU0VUCQkJMHgwMDAwMDAwMFVMCi0jZGVmaW5lIFBJT19NQVNLCQkJMHgzZmZmZmZmZlVMCi0jZGVmaW5lIFBJT19SRVNFUlZFRAkJCTB4NDAwMDAwMDBVTAorI2RlZmluZSBQSU9fTUFTSwkJCShGVUxMX0lPX1NJWkUgLSAxKQorI2RlZmluZSBQSU9fUkVTRVJWRUQJCQkoRlVMTF9JT19TSVpFKQogCiAjZGVmaW5lIG1taW9fcmVhZDE2YmUoYWRkcikJCXJlYWR3X2JlKGFkZHIpCiAjZGVmaW5lIG1taW9fcmVhZDMyYmUoYWRkcikJCXJlYWRsX2JlKGFkZHIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaAppbmRleCAwNWRkNWEzLi4wNDg1YzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKQEAgLTIyMyw2ICsyMjMsMTUgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXJxX2ZpbmRfbWFwcGluZyhzdHJ1Y3QgaXJxX2hvc3QgKmhvc3QsCiAJCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpOwogCisvKioKKyAqIGlycV9jcmVhdGVfZGlyZWN0X21hcHBpbmcgLSBBbGxvY2F0ZSBhIHZpcnEgZm9yIGRpcmVjdCBtYXBwaW5nCisgKiBAaG9zdDogaG9zdCB0byBhbGxvY2F0ZSB0aGUgdmlycSBmb3Igb3IgTlVMTCBmb3IgZGVmYXVsdCBob3N0CisgKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIGlycSBjb250cm9sbGVycyB3aGljaCBjYW4gY2hvb3NlIHRoZSBoYXJkd2FyZQorICogaW50ZXJydXB0IG51bWJlcnMgdGhleSBnZW5lcmF0ZS4gSW4gc3VjaCBhIGNhc2UgaXQncyBzaW1wbGVzdCB0byB1c2UKKyAqIHRoZSBsaW51eCB2aXJxIGFzIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQgbnVtYmVyLgorICovCitleHRlcm4gdW5zaWduZWQgaW50IGlycV9jcmVhdGVfZGlyZWN0X21hcHBpbmcoc3RydWN0IGlycV9ob3N0ICpob3N0KTsKIAogLyoqCiAgKiBpcnFfcmFkaXhfcmV2bWFwIC0gRmluZCBhIGxpbnV4IHZpcnEgZnJvbSBhIGh3IGlycSBudW1iZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oCmluZGV4IGIwZTQwZmYuLjk1MzdmZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMva3Byb2Jlcy5oCkBAIC02NSwxMCArNjUsMTAgQEAKIAkJfSBlbHNlIGlmIChuYW1lWzBdICE9ICcuJykJCQkJXAogCQkJYWRkciA9ICooa3Byb2JlX29wY29kZV90ICoqKWFkZHI7CQlcCiAJfSBlbHNlIHsJCQkJCQkJXAotCQljaGFyIGRvdF9uYW1lW0tTWU1fTkFNRV9MRU4rMV07CQkJCVwKKwkJY2hhciBkb3RfbmFtZVtLU1lNX05BTUVfTEVOXTsJCQkJXAogCQlkb3RfbmFtZVswXSA9ICcuJzsJCQkJCVwKIAkJZG90X25hbWVbMV0gPSAnXDAnOwkJCQkJXAotCQlzdHJuY2F0KGRvdF9uYW1lLCBuYW1lLCBLU1lNX05BTUVfTEVOKTsJCQlcCisJCXN0cm5jYXQoZG90X25hbWUsIG5hbWUsIEtTWU1fTkFNRV9MRU4gLSAyKTsJCVwKIAkJYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKilrYWxsc3ltc19sb29rdXBfbmFtZShkb3RfbmFtZSk7IFwKIAl9CQkJCQkJCQlcCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9scHBhY2EuaAppbmRleCA4MjFlYTBjLi41NjdlZDkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2xwcGFjYS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbHBwYWNhLmgKQEAgLTk4LDcgKzk4LDcgQEAKIAl1NjQJc2F2ZWRfZ3ByNTsJCS8vIFNhdmVkIEdQUjUgICAgICAgICAgICAgICAgICAgeDMwLXgzNwogCiAJdTgJcmVzZXJ2ZWQ0OwkJLy8gUmVzZXJ2ZWQJCQl4MzgteDM4Ci0JdTgJY3B1Y3Rsc190YXNrX2F0dHJzOwkvLyBUYXNrIGF0dHJpYnV0ZXMgZm9yIGNwdWN0bHMgIHgzOS14MzkKKwl1OAlkb25hdGVfZGVkaWNhdGVkX2NwdTsJLy8gRG9uYXRlIGRlZGljYXRlZCBDUFUgY3ljbGVzICB4MzkteDM5CiAJdTgJZnByZWdzX2luX3VzZTsJCS8vIEZQIHJlZ3MgaW4gdXNlICAgICAgICAgICAgICAgeDNBLXgzQQogCXU4CXBtY3JlZ3NfaW5fdXNlOwkJLy8gUE1DIHJlZ3MgaW4gdXNlICAgICAgICAgICAgICB4M0IteDNCCiAJdm9sYXRpbGUgdTMyIHNhdmVkX2RlY3I7CS8vIFNhdmVkIERlY3IgVmFsdWUgICAgICAgICAgICAgeDNDLXgzRgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9sdjFjYWxsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2x2MWNhbGwuaAppbmRleCBmNzMzYmVlLi44MTcxM2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2x2MWNhbGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2x2MWNhbGwuaApAQCAtMjM4LDYgKzIzOCw3IEBACiBMVjFfQ0FMTChjb25maWd1cmVfaXJxX3N0YXRlX2JpdG1hcCwgICAgICAgICAgICAgICAgICAgIDMsIDAsICAxMSApCiBMVjFfQ0FMTChjb25uZWN0X2lycV9wbHVnX2V4dCwgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsICAxMiApCiBMVjFfQ0FMTChyZWxlYXNlX21lbW9yeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICAxMyApCitMVjFfQ0FMTChwdXRfaW9wdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDAsICAxNSApCiBMVjFfQ0FMTChkaXNjb25uZWN0X2lycV9wbHVnX2V4dCwgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsICAxNyApCiBMVjFfQ0FMTChjb25zdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0LCAgICAgICAgICAgICAgICAgIDAsIDEsICAxOCApCiBMVjFfQ0FMTChkZXN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQsICAgICAgICAgICAgICAgICAgIDEsIDAsICAxOSApCkBAIC0yNjgsNiArMjY5LDggQEAKIExWMV9DQUxMKHJlYWRfaHRhYl9lbnRyaWVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgNSwgIDk1ICkKIExWMV9DQUxMKHNldF9kYWJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgIDk2ICkKIExWMV9DQUxMKGdldF90b3RhbF9leGVjdXRpb25fdGltZSwgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMTAzICkKK0xWMV9DQUxMKGFsbG9jYXRlX2lvX3NlZ21lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTE2ICkKK0xWMV9DQUxMKHJlbGVhc2VfaW9fc2VnbWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgMTE3ICkKIExWMV9DQUxMKGNvbnN0cnVjdF9pb19pcnFfb3V0bGV0LCAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTIwICkKIExWMV9DQUxMKGRlc3RydWN0X2lvX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTIxICkKIExWMV9DQUxMKG1hcF9odGFiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTIyICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmgKaW5kZXggNmNmMWE4My4uNzFjNmU3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tYWNoZGVwLmgKQEAgLTIxOCw3ICsyMTgsNyBAQAogCWludCAgKCpwY2liaW9zX2VuYWJsZV9kZXZpY2VfaG9vaykoc3RydWN0IHBjaV9kZXYgKiwgaW50IGluaXRpYWwpOwogCiAJLyogQ2FsbGVkIGluIGluZGlyZWN0XyogdG8gYXZvaWQgdG91Y2hpbmcgZGV2aWNlcyAqLwotCWludCAoKnBjaV9leGNsdWRlX2RldmljZSkodW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcik7CisJaW50ICgqcGNpX2V4Y2x1ZGVfZGV2aWNlKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiwgdW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhcik7CiAKIAkvKiBDYWxsZWQgYXQgdGhlbiB2ZXJ5IGVuZCBvZiBwY2liaW9zX2luaXQoKSAqLwogCXZvaWQgKCpwY2liaW9zX2FmdGVyX2luaXQpKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtOHh4LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS04eHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJiZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtOHh4LmgKQEAgLTAsMCArMSwxNDcgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX01NVV84WFhfSF8KKyNkZWZpbmUgX0FTTV9QT1dFUlBDX01NVV84WFhfSF8KKy8qCisgKiBQUEM4eHggc3VwcG9ydAorICovCisKKy8qIENvbnRyb2wvc3RhdHVzIHJlZ2lzdGVycyBmb3IgdGhlIE1QQzh4eC4KKyAqIEEgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZXNlIHJlZ2lzdGVycyBjYXVzZXMgc2VyaWFsaXplZCBhY2Nlc3MuCisgKiBEdXJpbmcgc29mdHdhcmUgdGFibGV3YWxrLCB0aGUgcmVnaXN0ZXJzIHVzZWQgcGVyZm9ybSBtYXNrL3NoaWZ0LWFkZAorICogb3BlcmF0aW9ucyB3aGVuIHdyaXR0ZW4vcmVhZC4gIEEgVExCIGVudHJ5IGlzIGNyZWF0ZWQgd2hlbiB0aGUgTXhfUlBOCisgKiBpcyB3cml0dGVuLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHNldmVyYWwgcmVnaXN0ZXJzIGFyZSB1c2VkIHRvCisgKiBjcmVhdGUgdGhlIGVudHJ5LgorICovCisjZGVmaW5lIFNQUk5fTUlfQ1RSCTc4NAkvKiBJbnN0cnVjdGlvbiBUTEIgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSV9HUE0JCTB4ODAwMDAwMDAJLyogU2V0IGRvbWFpbiBtYW5hZ2VyIG1vZGUgKi8KKyNkZWZpbmUgTUlfUFBNCQkweDQwMDAwMDAwCS8qIFNldCBzdWJwYWdlIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTUlfQ0lERUYJMHgyMDAwMDAwMAkvKiBTZXQgY2FjaGUgaW5oaWJpdCB3aGVuIE1NVSBkaXMgKi8KKyNkZWZpbmUgTUlfUlNWNEkJMHgwODAwMDAwMAkvKiBSZXNlcnZlIDQgVExCIGVudHJpZXMgKi8KKyNkZWZpbmUgTUlfUFBDUwkJMHgwMjAwMDAwMAkvKiBVc2UgTUlfUlBOIHByb2IvcHJpdiBzdGF0ZSAqLworI2RlZmluZSBNSV9JRFhNQVNLCTB4MDAwMDFmMDAJLyogVExCIGluZGV4IHRvIGJlIGxvYWRlZCAqLworI2RlZmluZSBNSV9SRVNFVFZBTAkweDAwMDAwMDAwCS8qIFZhbHVlIG9mIHJlZ2lzdGVyIGF0IHJlc2V0ICovCisKKy8qIFRoZXNlIGFyZSB0aGUgS3MgYW5kIEtwIGZyb20gdGhlIFBvd2VyUEMgYm9va3MuICBGb3IgcHJvcGVyIG9wZXJhdGlvbiwKKyAqIEtzID0gMCwgS3AgPSAxLgorICovCisjZGVmaW5lIFNQUk5fTUlfQVAJNzg2CisjZGVmaW5lIE1JX0tzCQkweDgwMDAwMDAwCS8qIFNob3VsZCBub3QgYmUgc2V0ICovCisjZGVmaW5lIE1JX0twCQkweDQwMDAwMDAwCS8qIFNob3VsZCBhbHdheXMgYmUgc2V0ICovCisKKy8qIFRoZSBlZmZlY3RpdmUgcGFnZSBudW1iZXIgcmVnaXN0ZXIuICBXaGVuIHJlYWQsIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgorICogYWJvdXQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gVExCIG1pc3MuICBXaGVuIE1JX1JQTiBpcyB3cml0dGVuLCBiaXRzIGluCisgKiB0aGlzIHJlZ2lzdGVyIGFyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgVExCIGVudHJ5LgorICovCisjZGVmaW5lIFNQUk5fTUlfRVBOCTc4NworI2RlZmluZSBNSV9FUE5NQVNLCTB4ZmZmZmYwMDAJLyogRWZmZWN0aXZlIHBhZ2UgbnVtYmVyIGZvciBlbnRyeSAqLworI2RlZmluZSBNSV9FVkFMSUQJMHgwMDAwMDIwMAkvKiBFbnRyeSBpcyB2YWxpZCAqLworI2RlZmluZSBNSV9BU0lETUFTSwkweDAwMDAwMDBmCS8qIEFTSUQgbWF0Y2ggdmFsdWUgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKy8qIEEgImxldmVsIDEiIG9yICJzZWdtZW50IiBvciB3aGF0ZXZlciB5b3Ugd2FudCB0byBjYWxsIGl0IHJlZ2lzdGVyLgorICogRm9yIHRoZSBpbnN0cnVjdGlvbiBUTEIsIGl0IGNvbnRhaW5zIGJpdHMgdGhhdCBnZXQgbG9hZGVkIGludG8gdGhlCisgKiBUTEIgZW50cnkgd2hlbiB0aGUgTUlfUlBOIGlzIHdyaXR0ZW4uCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9UV0MJNzg5CisjZGVmaW5lIE1JX0FQRwkJMHgwMDAwMDFlMAkvKiBBY2Nlc3MgcHJvdGVjdGlvbiBncm91cCAoMCkgKi8KKyNkZWZpbmUgTUlfR1VBUkRFRAkweDAwMDAwMDEwCS8qIEd1YXJkZWQgc3RvcmFnZSAqLworI2RlZmluZSBNSV9QU01BU0sJMHgwMDAwMDAwYwkvKiBNYXNrIG9mIHBhZ2Ugc2l6ZSBiaXRzICovCisjZGVmaW5lIE1JX1BTOE1FRwkweDAwMDAwMDBjCS8qIDhNIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNSV9QUzUxMksJMHgwMDAwMDAwNAkvKiA1MTJLIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNSV9QUzRLXzE2SwkweDAwMDAwMDAwCS8qIDRLIG9yIDE2SyBwYWdlIHNpemUgKi8KKyNkZWZpbmUgTUlfU1ZBTElECTB4MDAwMDAwMDEJLyogU2VnbWVudCBlbnRyeSBpcyB2YWxpZCAqLworCQkJCQkvKiBSZXNldCB2YWx1ZSBpcyB1bmRlZmluZWQgKi8KKworLyogUmVhbCBwYWdlIG51bWJlci4gIERlZmluZWQgYnkgdGhlIHB0ZS4gIFdyaXRpbmcgdGhpcyByZWdpc3RlcgorICogY2F1c2VzIGEgVExCIGVudHJ5IHRvIGJlIGNyZWF0ZWQgZm9yIHRoZSBpbnN0cnVjdGlvbiBUTEIsIHVzaW5nCisgKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIE1JX0VQTiwgYW5kIE1JX1RXQyByZWdpc3RlcnMuCisgKi8KKyNkZWZpbmUgU1BSTl9NSV9SUE4JNzkwCisKKy8qIERlZmluZSBhbiBSUE4gdmFsdWUgZm9yIG1hcHBpbmcga2VybmVsIG1lbW9yeSB0byBsYXJnZSB2aXJ0dWFsCisgKiBwYWdlcyBmb3IgYm9vdCBpbml0aWFsaXphdGlvbi4gIFRoaXMgaGFzIHJlYWwgcGFnZSBudW1iZXIgb2YgMCwKKyAqIGxhcmdlIHBhZ2Ugc2l6ZSwgc2hhcmVkIHBhZ2UsIGNhY2hlIGVuYWJsZWQsIGFuZCB2YWxpZC4KKyAqIEFsc28gbWFyayBhbGwgc3VicGFnZXMgdmFsaWQgYW5kIHdyaXRlIGFjY2Vzcy4KKyAqLworI2RlZmluZSBNSV9CT09USU5JVAkweDAwMDAwMWZkCisKKyNkZWZpbmUgU1BSTl9NRF9DVFIJNzkyCS8qIERhdGEgVExCIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTURfR1BNCQkweDgwMDAwMDAwCS8qIFNldCBkb21haW4gbWFuYWdlciBtb2RlICovCisjZGVmaW5lIE1EX1BQTQkJMHg0MDAwMDAwMAkvKiBTZXQgc3VicGFnZSBwcm90ZWN0aW9uICovCisjZGVmaW5lIE1EX0NJREVGCTB4MjAwMDAwMDAJLyogU2V0IGNhY2hlIGluaGliaXQgd2hlbiBNTVUgZGlzICovCisjZGVmaW5lIE1EX1dUREVGCTB4MTAwMDAwMDAJLyogU2V0IHdyaXRldGhyb3VnaCB3aGVuIE1NVSBkaXMgKi8KKyNkZWZpbmUgTURfUlNWNEkJMHgwODAwMDAwMAkvKiBSZXNlcnZlIDQgVExCIGVudHJpZXMgKi8KKyNkZWZpbmUgTURfVFdBTQkJMHgwNDAwMDAwMAkvKiBVc2UgNEsgcGFnZSBoYXJkd2FyZSBhc3Npc3QgKi8KKyNkZWZpbmUgTURfUFBDUwkJMHgwMjAwMDAwMAkvKiBVc2UgTUlfUlBOIHByb2IvcHJpdiBzdGF0ZSAqLworI2RlZmluZSBNRF9JRFhNQVNLCTB4MDAwMDFmMDAJLyogVExCIGluZGV4IHRvIGJlIGxvYWRlZCAqLworI2RlZmluZSBNRF9SRVNFVFZBTAkweDA0MDAwMDAwCS8qIFZhbHVlIG9mIHJlZ2lzdGVyIGF0IHJlc2V0ICovCisKKyNkZWZpbmUgU1BSTl9NX0NBU0lECTc5MwkvKiBBZGRyZXNzIHNwYWNlIElEIChjb250ZXh0KSB0byBtYXRjaCAqLworI2RlZmluZSBNQ19BU0lETUFTSwkweDAwMDAwMDBmCS8qIEJpdHMgdXNlZCBmb3IgQVNJRCB2YWx1ZSAqLworCisKKy8qIFRoZXNlIGFyZSB0aGUgS3MgYW5kIEtwIGZyb20gdGhlIFBvd2VyUEMgYm9va3MuICBGb3IgcHJvcGVyIG9wZXJhdGlvbiwKKyAqIEtzID0gMCwgS3AgPSAxLgorICovCisjZGVmaW5lIFNQUk5fTURfQVAJNzk0CisjZGVmaW5lIE1EX0tzCQkweDgwMDAwMDAwCS8qIFNob3VsZCBub3QgYmUgc2V0ICovCisjZGVmaW5lIE1EX0twCQkweDQwMDAwMDAwCS8qIFNob3VsZCBhbHdheXMgYmUgc2V0ICovCisKKy8qIFRoZSBlZmZlY3RpdmUgcGFnZSBudW1iZXIgcmVnaXN0ZXIuICBXaGVuIHJlYWQsIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgorICogYWJvdXQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gVExCIG1pc3MuICBXaGVuIE1EX1JQTiBpcyB3cml0dGVuLCBiaXRzIGluCisgKiB0aGlzIHJlZ2lzdGVyIGFyZSB1c2VkIHRvIGNyZWF0ZSB0aGUgVExCIGVudHJ5LgorICovCisjZGVmaW5lIFNQUk5fTURfRVBOCTc5NQorI2RlZmluZSBNRF9FUE5NQVNLCTB4ZmZmZmYwMDAJLyogRWZmZWN0aXZlIHBhZ2UgbnVtYmVyIGZvciBlbnRyeSAqLworI2RlZmluZSBNRF9FVkFMSUQJMHgwMDAwMDIwMAkvKiBFbnRyeSBpcyB2YWxpZCAqLworI2RlZmluZSBNRF9BU0lETUFTSwkweDAwMDAwMDBmCS8qIEFTSUQgbWF0Y2ggdmFsdWUgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKy8qIFRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGxldmVsIHBhZ2UgdGFibGUuCisgKiBEdXJpbmcgYSBzb2Z0d2FyZSB0YWJsZXdhbGssIHJlYWRpbmcgdGhpcyByZWdpc3RlciBwcm92aWRlcyB0aGUgYWRkcmVzcworICogb2YgdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBNRF9FUE4uCisgKi8KKyNkZWZpbmUgU1BSTl9NX1RXQgk3OTYKKyNkZWZpbmUJTV9MMVRCCQkweGZmZmZmMDAwCS8qIExldmVsIDEgdGFibGUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1fTDFJTkRYCTB4MDAwMDBmZmMJLyogTGV2ZWwgMSBpbmRleCwgd2hlbiByZWFkICovCisJCQkJCS8qIFJlc2V0IHZhbHVlIGlzIHVuZGVmaW5lZCAqLworCisvKiBBICJsZXZlbCAxIiBvciAic2VnbWVudCIgb3Igd2hhdGV2ZXIgeW91IHdhbnQgdG8gY2FsbCBpdCByZWdpc3Rlci4KKyAqIEZvciB0aGUgZGF0YSBUTEIsIGl0IGNvbnRhaW5zIGJpdHMgdGhhdCBnZXQgbG9hZGVkIGludG8gdGhlIFRMQiBlbnRyeQorICogd2hlbiB0aGUgTURfUlBOIGlzIHdyaXR0ZW4uICBJdCBpcyBhbHNvIHByb3ZpZGVzIHRoZSBoYXJkd2FyZSBhc3Npc3QKKyAqIGZvciBmaW5kaW5nIHRoZSBQVEUgYWRkcmVzcyBkdXJpbmcgc29mdHdhcmUgdGFibGV3YWxrLgorICovCisjZGVmaW5lIFNQUk5fTURfVFdDCTc5NworI2RlZmluZSBNRF9MMlRCCQkweGZmZmZmMDAwCS8qIExldmVsIDIgdGFibGUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1EX0wySU5EWAkweGZmZmZmZTAwCS8qIExldmVsIDIgaW5kZXggKCpwdGUpLCB3aGVuIHJlYWQgKi8KKyNkZWZpbmUgTURfQVBHCQkweDAwMDAwMWUwCS8qIEFjY2VzcyBwcm90ZWN0aW9uIGdyb3VwICgwKSAqLworI2RlZmluZSBNRF9HVUFSREVECTB4MDAwMDAwMTAJLyogR3VhcmRlZCBzdG9yYWdlICovCisjZGVmaW5lIE1EX1BTTUFTSwkweDAwMDAwMDBjCS8qIE1hc2sgb2YgcGFnZSBzaXplIGJpdHMgKi8KKyNkZWZpbmUgTURfUFM4TUVHCTB4MDAwMDAwMGMJLyogOE0gcGFnZSBzaXplICovCisjZGVmaW5lIE1EX1BTNTEySwkweDAwMDAwMDA0CS8qIDUxMksgcGFnZSBzaXplICovCisjZGVmaW5lIE1EX1BTNEtfMTZLCTB4MDAwMDAwMDAJLyogNEsgb3IgMTZLIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBNRF9XVAkJMHgwMDAwMDAwMgkvKiBVc2Ugd3JpdGV0aHJvdWdoIHBhZ2UgYXR0cmlidXRlICovCisjZGVmaW5lIE1EX1NWQUxJRAkweDAwMDAwMDAxCS8qIFNlZ21lbnQgZW50cnkgaXMgdmFsaWQgKi8KKwkJCQkJLyogUmVzZXQgdmFsdWUgaXMgdW5kZWZpbmVkICovCisKKworLyogUmVhbCBwYWdlIG51bWJlci4gIERlZmluZWQgYnkgdGhlIHB0ZS4gIFdyaXRpbmcgdGhpcyByZWdpc3RlcgorICogY2F1c2VzIGEgVExCIGVudHJ5IHRvIGJlIGNyZWF0ZWQgZm9yIHRoZSBkYXRhIFRMQiwgdXNpbmcKKyAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJvbSB0aGUgTURfRVBOLCBhbmQgTURfVFdDIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBTUFJOX01EX1JQTgk3OTgKKworLyogVGhpcyBpcyBhIHRlbXBvcmFyeSBzdG9yYWdlIHJlZ2lzdGVyIHRoYXQgY291bGQgYmUgdXNlZCB0byBzYXZlCisgKiBhIHByb2Nlc3NvciB3b3JraW5nIHJlZ2lzdGVyIGR1cmluZyBhIHRhYmxld2Fsay4KKyAqLworI2RlZmluZSBTUFJOX01fVFcJNzk5CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGlkOworCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOworfSBtbV9jb250ZXh0X3Q7CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01NVV84WFhfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWZzbC1ib29rZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtZnNsLWJvb2tlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1ODAwMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWZzbC1ib29rZS5oCkBAIC0wLDAgKzEsODggQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX01NVV9GU0xfQk9PS0VfSF8KKyNkZWZpbmUgX0FTTV9QT1dFUlBDX01NVV9GU0xfQk9PS0VfSF8KKy8qCisgKiBGcmVlc2NhbGUgQm9vay1FIE1NVSBzdXBwb3J0CisgKi8KKworLyogQm9vay1FIGRlZmluZWQgcGFnZSBzaXplcyAqLworI2RlZmluZSBCT09LRV9QQUdFU1pfMUsJCTAKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzRLCQkxCisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xNksJMgorI2RlZmluZSBCT09LRV9QQUdFU1pfNjRLCTMKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzI1NksJNAorI2RlZmluZSBCT09LRV9QQUdFU1pfMU0JCTUKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzRNCQk2CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xNk0JNworI2RlZmluZSBCT09LRV9QQUdFU1pfNjRNCTgKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzI1Nk0JOQorI2RlZmluZSBCT09LRV9QQUdFU1pfMUdCCTEwCisjZGVmaW5lIEJPT0tFX1BBR0VTWl80R0IJMTEKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzE2R0IJMTIKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzY0R0IJMTMKKyNkZWZpbmUgQk9PS0VfUEFHRVNaXzI1NkdCCTE0CisjZGVmaW5lIEJPT0tFX1BBR0VTWl8xVEIJMTUKKworI2RlZmluZSBNQVMwX1RMQlNFTCh4KQkoKHggPDwgMjgpICYgMHgzMDAwMDAwMCkKKyNkZWZpbmUgTUFTMF9FU0VMKHgpCSgoeCA8PCAxNikgJiAweDBGRkYwMDAwKQorI2RlZmluZSBNQVMwX05WKHgpCSgoeCkgJiAweDAwMDAwRkZGKQorCisjZGVmaW5lIE1BUzFfVkFMSUQgCTB4ODAwMDAwMDAKKyNkZWZpbmUgTUFTMV9JUFJPVAkweDQwMDAwMDAwCisjZGVmaW5lIE1BUzFfVElEKHgpCSgoeCA8PCAxNikgJiAweDNGRkYwMDAwKQorI2RlZmluZSBNQVMxX1RTCQkweDAwMDAxMDAwCisjZGVmaW5lIE1BUzFfVFNJWkUoeCkJKCh4IDw8IDgpICYgMHgwMDAwMEYwMCkKKworI2RlZmluZSBNQVMyX0VQTgkweEZGRkZGMDAwCisjZGVmaW5lIE1BUzJfWDAJCTB4MDAwMDAwNDAKKyNkZWZpbmUgTUFTMl9YMQkJMHgwMDAwMDAyMAorI2RlZmluZSBNQVMyX1cJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFTMl9JCQkweDAwMDAwMDA4CisjZGVmaW5lIE1BUzJfTQkJMHgwMDAwMDAwNAorI2RlZmluZSBNQVMyX0cJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFTMl9FCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTUFTM19SUE4JMHhGRkZGRjAwMAorI2RlZmluZSBNQVMzX1UwCQkweDAwMDAwMjAwCisjZGVmaW5lIE1BUzNfVTEJCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUFTM19VMgkJMHgwMDAwMDA4MAorI2RlZmluZSBNQVMzX1UzCQkweDAwMDAwMDQwCisjZGVmaW5lIE1BUzNfVVgJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUFTM19TWAkJMHgwMDAwMDAxMAorI2RlZmluZSBNQVMzX1VXCQkweDAwMDAwMDA4CisjZGVmaW5lIE1BUzNfU1cJCTB4MDAwMDAwMDQKKyNkZWZpbmUgTUFTM19VUgkJMHgwMDAwMDAwMgorI2RlZmluZSBNQVMzX1NSCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgTUFTNF9UTEJTRUxEKHgpIE1BUzBfVExCU0VMKHgpCisjZGVmaW5lIE1BUzRfVElERFNFTAkweDAwMEYwMDAwCisjZGVmaW5lIE1BUzRfVFNJWkVEKHgpCU1BUzFfVFNJWkUoeCkKKyNkZWZpbmUgTUFTNF9YMEQJMHgwMDAwMDA0MAorI2RlZmluZSBNQVM0X1gxRAkweDAwMDAwMDIwCisjZGVmaW5lIE1BUzRfV0QJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUFTNF9JRAkJMHgwMDAwMDAwOAorI2RlZmluZSBNQVM0X01ECQkweDAwMDAwMDA0CisjZGVmaW5lIE1BUzRfR0QJCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFTNF9FRAkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1BUzZfU1BJRDAJMHgzRkZGMDAwMAorI2RlZmluZSBNQVM2X1NQSUQxCTB4MDAwMDdGRkUKKyNkZWZpbmUgTUFTNl9TQVMJMHgwMDAwMDAwMQorI2RlZmluZSBNQVM2X1NQSUQJTUFTNl9TUElEMAorCisjZGVmaW5lIE1BUzdfUlBOCTB4RkZGRkZGRkYKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2lmbmRlZiBDT05GSUdfUEhZU182NEJJVAordHlwZWRlZiB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcl90OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHBoeXNfYWRkcl90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGlkOworCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOworfSBtbV9jb250ZXh0X3Q7CisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX01NVV9GU0xfQk9PS0VfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2gzMi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNzM1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LWhhc2gzMi5oCkBAIC0wLDAgKzEsOTEgQEAKKyNpZm5kZWYgX0FTTV9QT1dFUlBDX01NVV9IQVNIMzJfSF8KKyNkZWZpbmUgX0FTTV9QT1dFUlBDX01NVV9IQVNIMzJfSF8KKy8qCisgKiAzMi1iaXQgaGFzaCB0YWJsZSBNTVUgc3VwcG9ydAorICovCisKKy8qCisgKiBCQVRzCisgKi8KKworLyogQmxvY2sgc2l6ZSBtYXNrcyAqLworI2RlZmluZSBCTF8xMjhLCTB4MDAwCisjZGVmaW5lIEJMXzI1NksgMHgwMDEKKyNkZWZpbmUgQkxfNTEySyAweDAwMworI2RlZmluZSBCTF8xTSAgIDB4MDA3CisjZGVmaW5lIEJMXzJNICAgMHgwMEYKKyNkZWZpbmUgQkxfNE0gICAweDAxRgorI2RlZmluZSBCTF84TSAgIDB4MDNGCisjZGVmaW5lIEJMXzE2TSAgMHgwN0YKKyNkZWZpbmUgQkxfMzJNICAweDBGRgorI2RlZmluZSBCTF82NE0gIDB4MUZGCisjZGVmaW5lIEJMXzEyOE0gMHgzRkYKKyNkZWZpbmUgQkxfMjU2TSAweDdGRgorCisvKiBCQVQgQWNjZXNzIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQlBQX1hYCTB4MDAJCS8qIE5vIGFjY2VzcyAqLworI2RlZmluZSBCUFBfUlgJMHgwMQkJLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIEJQUF9SVwkweDAyCQkvKiBSZWFkL3dyaXRlICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitzdHJ1Y3QgcHBjX2JhdCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBiZXBpOjE1OwkvKiBFZmZlY3RpdmUgcGFnZSBpbmRleCAodmlydHVhbCBhZGRyZXNzKSAqLworCQl1bnNpZ25lZCBsb25nIDo0OwkvKiBVbnVzZWQgKi8KKwkJdW5zaWduZWQgbG9uZyBibDoxMTsJLyogQmxvY2sgc2l6ZSBtYXNrICovCisJCXVuc2lnbmVkIGxvbmcgdnM6MTsJLyogU3VwZXJ2aXNvciB2YWxpZCAqLworCQl1bnNpZ25lZCBsb25nIHZwOjE7CS8qIFVzZXIgdmFsaWQgKi8KKwl9IGJhdHU7IAkJLyogVXBwZXIgcmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIGJycG46MTU7CS8qIFJlYWwgcGFnZSBpbmRleCAocGh5c2ljYWwgYWRkcmVzcykgKi8KKwkJdW5zaWduZWQgbG9uZyA6MTA7CS8qIFVudXNlZCAqLworCQl1bnNpZ25lZCBsb25nIHc6MTsJLyogV3JpdGUtdGhydSBjYWNoZSAqLworCQl1bnNpZ25lZCBsb25nIGk6MTsJLyogQ2FjaGUgaW5oaWJpdCAqLworCQl1bnNpZ25lZCBsb25nIG06MTsJLyogTWVtb3J5IGNvaGVyZW5jZSAqLworCQl1bnNpZ25lZCBsb25nIGc6MTsJLyogR3VhcmRlZCAoTUJaIGluIElCQVQpICovCisJCXVuc2lnbmVkIGxvbmcgOjE7CS8qIFVudXNlZCAqLworCQl1bnNpZ25lZCBsb25nIHBwOjI7CS8qIFBhZ2UgYWNjZXNzIHByb3RlY3Rpb25zICovCisJfSBiYXRsOwkJCS8qIExvd2VyIHJlZ2lzdGVyICovCit9OworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIEhhc2ggdGFibGUKKyAqLworCisvKiBWYWx1ZXMgZm9yIFBQIChhc3N1bWVzIEtzPTAsIEtwPTEpICovCisjZGVmaW5lIFBQX1JXWFgJMAkvKiBTdXBlcnZpc29yIHJlYWQvd3JpdGUsIFVzZXIgbm9uZSAqLworI2RlZmluZSBQUF9SV1JYIDEJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIHJlYWQgKi8KKyNkZWZpbmUgUFBfUldSVyAyCS8qIFN1cGVydmlzb3IgcmVhZC93cml0ZSwgVXNlciByZWFkL3dyaXRlICovCisjZGVmaW5lIFBQX1JYUlggMwkvKiBTdXBlcnZpc29yIHJlYWQsICAgICAgIFVzZXIgcmVhZCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKiBIYXJkd2FyZSBQYWdlIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgaGFzaF9wdGUgeworCXVuc2lnbmVkIGxvbmcgdjoxOwkvKiBFbnRyeSBpcyB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgdnNpZDoyNDsJLyogVmlydHVhbCBzZWdtZW50IGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBsb25nIGg6MTsJLyogSGFzaCBhbGdvcml0aG0gaW5kaWNhdG9yICovCisJdW5zaWduZWQgbG9uZyBhcGk6NjsJLyogQWJicmV2aWF0ZWQgcGFnZSBpbmRleCAqLworCXVuc2lnbmVkIGxvbmcgcnBuOjIwOwkvKiBSZWFsIChwaHlzaWNhbCkgcGFnZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nICAgIDozOwkvKiBVbnVzZWQgKi8KKwl1bnNpZ25lZCBsb25nIHI6MTsJLyogUmVmZXJlbmNlZCAqLworCXVuc2lnbmVkIGxvbmcgYzoxOwkvKiBDaGFuZ2VkICovCisJdW5zaWduZWQgbG9uZyB3OjE7CS8qIFdyaXRlLXRocnUgY2FjaGUgbW9kZSAqLworCXVuc2lnbmVkIGxvbmcgaToxOwkvKiBDYWNoZSBpbmhpYml0ZWQgKi8KKwl1bnNpZ25lZCBsb25nIG06MTsJLyogTWVtb3J5IGNvaGVyZW5jZSAqLworCXVuc2lnbmVkIGxvbmcgZzoxOwkvKiBHdWFyZGVkICovCisJdW5zaWduZWQgbG9uZyAgOjE7CS8qIFVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgcHA6MjsJLyogUGFnZSBwcm90ZWN0aW9uICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKK30gbW1fY29udGV4dF90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyX3Q7CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BPV0VSUENfTU1VX0hBU0gzMl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUtaGFzaDY0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoNjQuaAppbmRleCBiOGRjYTMwLi42OTU5NjJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoNjQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS1oYXNoNjQuaApAQCAtOTQsNiArOTQsOSBAQAogI2RlZmluZSBIUFRFX1JfQwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDA4MCkKICNkZWZpbmUgSFBURV9SX1IJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAxMDApCiAKKyNkZWZpbmUgSFBURV9WXzFUQl9TRUcJCUFTTV9DT05TVCgweDQwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIEhQVEVfVl9WUk1BX01BU0sJQVNNX0NPTlNUKDB4NDAwMWZmZmZmZjAwMDAwMCkKKwogLyogVmFsdWVzIGZvciBQUCAoYXNzdW1lcyBLcz0wLCBLcD0xKSAqLwogLyogcHAwIHdpbGwgYWx3YXlzIGJlIDAgZm9yIGxpbnV4ICAgICAqLwogI2RlZmluZSBQUF9SV1hYCTAJLyogU3VwZXJ2aXNvciByZWFkL3dyaXRlLCBVc2VyIG5vbmUgKi8KQEAgLTEwMywxMiArMTA2LDEyIEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBoYXNoX3B0ZSB7CiAJdW5zaWduZWQgbG9uZyB2OwogCXVuc2lnbmVkIGxvbmcgcjsKLX0gaHB0ZV90OworfTsKIAotZXh0ZXJuIGhwdGVfdCAqaHRhYl9hZGRyZXNzOworZXh0ZXJuIHN0cnVjdCBoYXNoX3B0ZSAqaHRhYl9hZGRyZXNzOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHRhYl9zaXplX2J5dGVzOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHRhYl9oYXNoX21hc2s7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCmluZGV4IGZlNTEwZmYuLmQ0NGQyMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaApAQCAtNSwxMyArNSwxOCBAQAogI2lmZGVmIENPTkZJR19QUEM2NAogLyogNjQtYml0IGNsYXNzaWMgaGFzaCB0YWJsZSBNTVUgKi8KICMgIGluY2x1ZGUgPGFzbS9tbXUtaGFzaDY0Lmg+CisjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfU1REX01NVSkKKy8qIDMyLWJpdCBjbGFzc2ljIGhhc2ggdGFibGUgTU1VICovCisjICBpbmNsdWRlIDxhc20vbW11LWhhc2gzMi5oPgogI2VsaWYgZGVmaW5lZChDT05GSUdfNDR4KQogLyogNDR4LXN0eWxlIHNvZnR3YXJlIGxvYWRlZCBUTEIgKi8KICMgIGluY2x1ZGUgPGFzbS9tbXUtNDR4Lmg+Ci0jZWxzZQotLyogT3RoZXIgMzItYml0LiAgRklYTUU6IHNwbGl0IHVwIHRoZSBvdGhlciAzMi1iaXQgTU1VIHR5cGVzLCBhbmQKLSAqIHJldmlzZSBmb3IgYXJjaC9wb3dlcnBjICovCi0jICBpbmNsdWRlIDxhc20tcHBjL21tdS5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfRlNMX0JPT0tFKQorLyogRnJlZXNjYWxlIEJvb2stRSBzb2Z0d2FyZSBsb2FkZWQgVExCICovCisjICBpbmNsdWRlIDxhc20vbW11LWZzbC1ib29rZS5oPgorI2VsaWYgZGVmaW5lZCAoQ09ORklHX1BQQ184eHgpCisvKiBNb3Rvcm9sYS9GcmVlc2NhbGUgOHh4IHNvZnR3YXJlIGxvYWRlZCBUTEIgKi8KKyMgIGluY2x1ZGUgPGFzbS9tbXUtOHh4Lmg+CiAjZW5kaWYKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaAppbmRleCA0MGM5ZTVhLi5mODYzYWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXVfY29udGV4dC5oCkBAIC0yLDE2ICsyLDIxMCBAQAogI2RlZmluZSBfX0FTTV9QT1dFUlBDX01NVV9DT05URVhUX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxhc20vbW11Lmg+CQorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tX2hvb2tzLmg+CisKICNpZm5kZWYgQ09ORklHX1BQQzY0Ci0jaW5jbHVkZSA8YXNtLXBwYy9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisKKy8qCisgKiBPbiAzMi1iaXQgUG93ZXJQQyA2eHgvN3h4Lzd4eHggQ1BVcywgd2UgdXNlIGEgc2V0IG9mIDE2IFZTSURzCisgKiAodmlydHVhbCBzZWdtZW50IGlkZW50aWZpZXJzKSBmb3IgZWFjaCBjb250ZXh0LiAgQWx0aG91Z2ggdGhlCisgKiBoYXJkd2FyZSBzdXBwb3J0cyAyNC1iaXQgVlNJRHMsIGFuZCB0aHVzID4xIG1pbGxpb24gY29udGV4dHMsCisgKiB3ZSBvbmx5IHVzZSAzMiw3Njggb2YgdGhlbS4gIFRoYXQgaXMgYW1wbGUsIHNpbmNlIHRoZXJlIGNhbiBiZQorICogYXQgbW9zdCBhcm91bmQgMzAsMDAwIHRhc2tzIGluIHRoZSBzeXN0ZW0gYW55d2F5LCBhbmQgaXQgbWVhbnMKKyAqIHRoYXQgd2UgY2FuIHVzZSBhIGJpdG1hcCB0byBpbmRpY2F0ZSB3aGljaCBjb250ZXh0cyBhcmUgaW4gdXNlLgorICogVXNpbmcgYSBiaXRtYXAgbWVhbnMgdGhhdCB3ZSBlbnRpcmVseSBhdm9pZCBhbGwgb2YgdGhlIHByb2JsZW1zCisgKiB0aGF0IHdlIHVzZWQgdG8gaGF2ZSB3aGVuIHRoZSBjb250ZXh0IG51bWJlciBvdmVyZmxvd2VkLAorICogcGFydGljdWxhcmx5IG9uIFNNUCBzeXN0ZW1zLgorICogIC0tIHBhdWx1cy4KKyAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBkZWZpbmVzIHRoZSBtYXBwaW5nIGZyb20gY29udGV4dHMgdG8gVlNJRHMgKHZpcnR1YWwKKyAqIHNlZ21lbnQgSURzKS4gIFdlIHVzZSBhIHNrZXcgb24gYm90aCB0aGUgY29udGV4dCBhbmQgdGhlIGhpZ2ggNCBiaXRzCisgKiBvZiB0aGUgMzItYml0IHZpcnR1YWwgYWRkcmVzcyAodGhlICJlZmZlY3RpdmUgc2VnbWVudCBJRCIpIGluIG9yZGVyCisgKiB0byBzcHJlYWQgb3V0IHRoZSBlbnRyaWVzIGluIHRoZSBNTVUgaGFzaCB0YWJsZS4gIE5vdGUsIGlmIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIGNoYW5nZWQgdGhlbiBhcmNoL3BwYy9tbS9oYXNodGFibGUuUyB3aWxsIGhhdmUgdG8gYmUKKyAqIGNoYW5nZWQgdG8gY29ycmVzcG9uZC4KKyAqLworI2RlZmluZSBDVFhfVE9fVlNJRChjdHgsIHZhKQkoKChjdHgpICogKDg5NyAqIDE2KSArICgodmEpID4+IDI4KSAqIDB4MTExKSBcCisJCQkJICYgMHhmZmZmZmYpCisKKy8qCisgICBUaGUgTVBDOHh4IGhhcyBvbmx5IDE2IGNvbnRleHRzLiAgV2Ugcm90YXRlIHRocm91Z2ggdGhlbSBvbiBlYWNoCisgICB0YXNrIHN3aXRjaC4gIEEgYmV0dGVyIHdheSB3b3VsZCBiZSB0byBrZWVwIHRyYWNrIG9mIHRhc2tzIHRoYXQKKyAgIG93biBjb250ZXh0cywgYW5kIGltcGxlbWVudCBhbiBMUlUgdXNhZ2UuICBUaGF0IHdheSB2ZXJ5IGFjdGl2ZQorICAgdGFza3MgZG9uJ3QgYWx3YXlzIGhhdmUgdG8gcGF5IHRoZSBUTEIgcmVsb2FkIG92ZXJoZWFkLiAgVGhlCisgICBrZXJuZWwgcGFnZXMgYXJlIG1hcHBlZCBzaGFyZWQsIHNvIHRoZSBrZXJuZWwgY2FuIHJ1biBvbiBiZWhhbGYKKyAgIG9mIGFueSB0YXNrIHRoYXQgbWFrZXMgYSBrZXJuZWwgZW50cnkuICBTaGFyZWQgZG9lcyBub3QgbWVhbiB0aGV5CisgICBhcmUgbm90IHByb3RlY3RlZCwganVzdCB0aGF0IHRoZSBBU0lEIGNvbXBhcmlzb24gaXMgbm90IHBlcmZvcm1lZC4KKyAgICAgICAgLS0gRGFuCisKKyAgIFRoZSBJQk00eHggaGFzIDI1NiBjb250ZXh0cywgc28gd2UgY2FuIGp1c3Qgcm90YXRlIHRocm91Z2ggdGhlc2UKKyAgIGFzIGEgd2F5IG9mICJzd2l0Y2hpbmciIGNvbnRleHRzLiAgSWYgdGhlIFRJRCBvZiB0aGUgVExCIGlzIHplcm8sCisgICB0aGUgUElEL1RJRCBjb21wYXJpc29uIGlzIGRpc2FibGVkLCBzbyB3ZSBjYW4gdXNlIGEgVElEIG9mIHplcm8KKyAgIHRvIHJlcHJlc2VudCBhbGwga2VybmVsIHBhZ2VzIGFzIHNoYXJlZCBhbW9uZyBhbGwgY29udGV4dHMuCisgICAJLS0gRGFuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGVudGVyX2xhenlfdGxiKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKK30KKworI2lmZGVmIENPTkZJR184eHgKKyNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkxNgorI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTE1CisjZGVmaW5lIEZJUlNUX0NPTlRFWFQgICAgCTAKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNHh4KQorI2RlZmluZSBOT19DT05URVhUICAgICAgCTI1NgorI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTI1NQorI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0UyMDApIHx8IGRlZmluZWQoQ09ORklHX0U1MDApCisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJMjU2CisjZGVmaW5lIExBU1RfQ09OVEVYVCAgICAJMjU1CisjZGVmaW5lIEZJUlNUX0NPTlRFWFQgICAgCTEKKworI2Vsc2UKKworLyogUFBDIDZ4eCwgN3h4IENQVXMgKi8KKyNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkoKHVuc2lnbmVkIGxvbmcpIC0xKQorI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTMyNzY3CisjZGVmaW5lIEZJUlNUX0NPTlRFWFQgICAgCTEKKyNlbmRpZgorCisvKgorICogU2V0IHRoZSBjdXJyZW50IE1NVSBjb250ZXh0LgorICogT24gMzItYml0IFBvd2VyUENzIChvdGhlciB0aGFuIHRoZSA4eHggZW1iZWRkZWQgY2hpcHMpLCB0aGlzIGlzIGRvbmUgYnkKKyAqIGxvYWRpbmcgdXAgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGZvciB0aGUgdXNlciBwYXJ0IG9mIHRoZSBhZGRyZXNzIHNwYWNlLgorICoKKyAqIFNpbmNlIHRoZSBQR0QgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCBpdCBpcyBtdWNoIGZhc3RlciB0byBzaW1wbHkKKyAqIHBhc3MgdGhpcyBhbG9uZyBhcyBhIHNlY29uZCBwYXJhbWV0ZXIsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciA4eHggYW5kCisgKiBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nIG9uIGFsbCBwcm9jZXNzb3JzIChpZiB5b3UgaGFwcGVuIHRvIGhhdmUKKyAqIGFuIEFiYXRyb24pLgorICovCitleHRlcm4gdm9pZCBzZXRfY29udGV4dCh1bnNpZ25lZCBsb25nIGNvbnRleHRpZCwgcGdkX3QgKnBnZCk7CisKKy8qCisgKiBCaXRtYXAgb2YgY29udGV4dHMgaW4gdXNlLgorICogVGhlIHNpemUgb2YgdGhpcyBiaXRtYXAgaXMgTEFTVF9DT05URVhUICsgMSBiaXRzLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBjb250ZXh0X21hcFtdOworCisvKgorICogVGhpcyBjYWNoZXMgdGhlIG5leHQgY29udGV4dCBudW1iZXIgdGhhdCB3ZSBleHBlY3QgdG8gYmUgZnJlZS4KKyAqIEl0cyB1c2UgaXMgYW4gb3B0aW1pemF0aW9uIG9ubHksIHdlIGNhbid0IHJlbHkgb24gdGhpcyBjb250ZXh0CisgKiBudW1iZXIgdG8gYmUgZnJlZSwgYnV0IGl0IHVzdWFsbHkgd2lsbCBiZS4KKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmV4dF9tbXVfY29udGV4dDsKKworLyoKKyAqIElmIHdlIGRvbid0IGhhdmUgc3VmZmljaWVudCBjb250ZXh0cyB0byBnaXZlIG9uZSB0byBldmVyeSB0YXNrCisgKiB0aGF0IGNvdWxkIGJlIGluIHRoZSBzeXN0ZW0sIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzdGVhbCBjb250ZXh0cy4KKyAqIFRoZXNlIHZhcmlhYmxlcyBzdXBwb3J0IHRoYXQuCisgKi8KKyNpZiBMQVNUX0NPTlRFWFQgPCAzMDAwMAorI2RlZmluZSBGRVdfQ09OVEVYVFMJMQorZXh0ZXJuIGF0b21pY190IG5yX2ZyZWVfY29udGV4dHM7CitleHRlcm4gc3RydWN0IG1tX3N0cnVjdCAqY29udGV4dF9tbVtMQVNUX0NPTlRFWFQrMV07CitleHRlcm4gdm9pZCBzdGVhbF9jb250ZXh0KHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBHZXQgYSBuZXcgbW11IGNvbnRleHQgZm9yIHRoZSBhZGRyZXNzIHNwYWNlIGRlc2NyaWJlZCBieSBgbW0nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGxvbmcgY3R4OworCisJaWYgKG1tLT5jb250ZXh0LmlkICE9IE5PX0NPTlRFWFQpCisJCXJldHVybjsKKyNpZmRlZiBGRVdfQ09OVEVYVFMKKwl3aGlsZSAoYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmbnJfZnJlZV9jb250ZXh0cykgPCAwKQorCQlzdGVhbF9jb250ZXh0KCk7CisjZW5kaWYKKwljdHggPSBuZXh0X21tdV9jb250ZXh0OworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KGN0eCwgY29udGV4dF9tYXApKSB7CisJCWN0eCA9IGZpbmRfbmV4dF96ZXJvX2JpdChjb250ZXh0X21hcCwgTEFTVF9DT05URVhUKzEsIGN0eCk7CisJCWlmIChjdHggPiBMQVNUX0NPTlRFWFQpCisJCQljdHggPSAwOworCX0KKwluZXh0X21tdV9jb250ZXh0ID0gKGN0eCArIDEpICYgTEFTVF9DT05URVhUOworCW1tLT5jb250ZXh0LmlkID0gY3R4OworI2lmZGVmIEZFV19DT05URVhUUworCWNvbnRleHRfbW1bY3R4XSA9IG1tOworI2VuZGlmCit9CisKKy8qCisgKiBTZXQgdXAgdGhlIGNvbnRleHQgZm9yIGEgbmV3IGFkZHJlc3Mgc3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0LCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwltbS0+Y29udGV4dC5pZCA9IE5PX0NPTlRFWFQ7CisJbW0tPmNvbnRleHQudmRzb19iYXNlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlJ3JlIGZpbmlzaGVkIHVzaW5nIHRoZSBjb250ZXh0IGZvciBhbiBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKSB7CisJCWNsZWFyX2JpdChtbS0+Y29udGV4dC5pZCwgY29udGV4dF9tYXApOworCQltbS0+Y29udGV4dC5pZCA9IE5PX0NPTlRFWFQ7CisjaWZkZWYgRkVXX0NPTlRFWFRTCisJCWF0b21pY19pbmMoJm5yX2ZyZWVfY29udGV4dHMpOworI2VuZGlmCisJfQorCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKKwkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisjaWZkZWYgQ09ORklHX0FMVElWRUMKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQUxUSVZFQykpCisJYXNtIHZvbGF0aWxlICgiZHNzYWxsO1xuIgorI2lmbmRlZiBDT05GSUdfUE9XRVI0CisJICJzeW5jO1xuIiAvKiBHNCBuZWVkcyBhIHN5bmMgaGVyZSwgRzUgYXBwYXJlbnRseSBub3QgKi8KKyNlbmRpZgorCSA6IDogKTsKKyNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLworCisJdHNrLT50aHJlYWQucGdkaXIgPSBuZXh0LT5wZ2Q7CisKKwkvKiBObyBuZWVkIHRvIGZsdXNoIHVzZXJzcGFjZSBzZWdtZW50cyBpZiB0aGUgbW0gZG9lc250IGNoYW5nZSAqLworCWlmIChwcmV2ID09IG5leHQpCisJCXJldHVybjsKKworCS8qIFNldHVwIG5ldyB1c2Vyc3BhY2UgY29udGV4dCAqLworCWdldF9tbXVfY29udGV4dChuZXh0KTsKKwlzZXRfY29udGV4dChuZXh0LT5jb250ZXh0LmlkLCBuZXh0LT5wZ2QpOworfQorCisjZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLG1tKQlkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKKyAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgorICovCisjZGVmaW5lIGFjdGl2YXRlX21tKGFjdGl2ZV9tbSwgbW0pICAgc3dpdGNoX21tKGFjdGl2ZV9tbSwgbW0sIGN1cnJlbnQpCisKK2V4dGVybiB2b2lkIG1tdV9jb250ZXh0X2luaXQodm9pZCk7CisKKwogI2Vsc2UKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkKICNpbmNsdWRlIDxsaW51eC9tbS5oPgkKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9tbXUuaD4JCi0jaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KIAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBQUEMgNjQgVGVhbSwgSUJNIENvcnAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4Nnh4LmgKaW5kZXggYjg1ZGY0NS4uMTVmNjUwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4Nnh4LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4Nnh4LmgKQEAgLTE5LDEyICsxOSw2IEBACiAKICNpZmRlZiBDT05GSUdfUFBDXzg2eHgKIAotI2RlZmluZSBfSU9fQkFTRSAgICAgICAgaXNhX2lvX2Jhc2UKLSNkZWZpbmUgX0lTQV9NRU1fQkFTRSAgIGlzYV9tZW1fYmFzZQotI2lmZGVmIENPTkZJR19QQ0kKLSNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUIHBjaV9kcmFtX29mZnNldAotI2VuZGlmCi0KICNkZWZpbmUgQ1BVMF9CT09UX1JFTEVBU0UgMHgwMTAwMDAwMAogI2RlZmluZSBDUFUxX0JPT1RfUkVMRUFTRSAweDAyMDAwMDAwCiAjZGVmaW5lIENQVV9BTExfUkVMRUFTRUQgKENQVTBfQk9PVF9SRUxFQVNFIHwgQ1BVMV9CT09UX1JFTEVBU0UpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzh4eC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM4eHguaAppbmRleCA1ODAzNzExLi4yYmUwMTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzh4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjOHh4LmgKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSA8cGxhdGZvcm1zLzh4eC9tcGM4ODVhZHMuaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDTUNJQV9NOFhYCitleHRlcm4gc3RydWN0IG1wYzh4eF9wY21jaWFfb3BzIG04eHhfcGNtY2lhX29wczsKKyNlbmRpZgorCiAjZW5kaWYgLyogQ09ORklHXzh4eCAqLwogI2VuZGlmIC8qIF9fQ09ORklHXzh4eF9ERUZTICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2ktYnJpZGdlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaAppbmRleCBkOWJmNWFiLi5lNzJjMmE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaApAQCAtMiwxMiArMiw5MSBAQAogI2RlZmluZSBfQVNNX1BPV0VSUENfUENJX0JSSURHRV9ICiAjaWZkZWYgX19LRVJORUxfXwogCi0jaWZuZGVmIENPTkZJR19QUEM2NAotI2luY2x1ZGUgPGFzbS1wcGMvcGNpLWJyaWRnZS5oPgotI2Vsc2UKLQogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2lmbmRlZiBDT05GSUdfUFBDNjQKKworc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IHBjaV9jb250cm9sbGVyOworCisvKgorICogU3RydWN0dXJlIG9mIGEgUENJIGNvbnRyb2xsZXIgKGhvc3QgYnJpZGdlKQorICovCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgeworCXN0cnVjdCBwY2lfYnVzICpidXM7CisJY2hhciBpc19keW5hbWljOworCXZvaWQgKmFyY2hfZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Rfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CisKKwlpbnQgZmlyc3RfYnVzbm87CisJaW50IGxhc3RfYnVzbm87CisJaW50IHNlbGZfYnVzbm87CisKKwl2b2lkIF9faW9tZW0gKmlvX2Jhc2VfdmlydDsKKwlyZXNvdXJjZV9zaXplX3QgaW9fYmFzZV9waHlzOworCisJLyogU29tZSBtYWNoaW5lcyAoUFJlUCkgaGF2ZSBhIG5vbiAxOjEgbWFwcGluZyBvZgorCSAqIHRoZSBQQ0kgbWVtb3J5IHNwYWNlIGluIHRoZSBDUFUgYnVzIHNwYWNlCisJICovCisJcmVzb3VyY2Vfc2l6ZV90IHBjaV9tZW1fb2Zmc2V0OworCisJc3RydWN0IHBjaV9vcHMgKm9wczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgX19pb21lbSAqY2ZnX2FkZHI7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpjZmdfZGF0YTsKKworCS8qCisJICogVXNlZCBmb3IgdmFyaWFudHMgb2YgUENJIGluZGlyZWN0IGhhbmRsaW5nIGFuZCBwb3NzaWJsZSBxdWlya3M6CisJICogIFNFVF9DRkdfVFlQRSAtIHVzZWQgb24gNHh4IG9yIGFueSBQSEIgdGhhdCBkb2VzIGV4cGxpY2l0IHR5cGUwLzEKKwkgKiAgRVhUX1JFRyAtIHByb3ZpZGVzIGFjY2VzcyB0byBQQ0ktZSBleHRlbmRlZCByZWdpc3RlcnMKKwkgKiAgU1VSUFJFU1NfUFJJTUFSWV9CVVMgLSB3ZSBzdXJwcmVzcyB0aGUgc2V0dGluZyBvZiBQQ0lfUFJJTUFSWV9CVVMKKwkgKiAgIG9uIEZyZWVzY2FsZSBQQ0ktZSBjb250cm9sbGVycyBzaW5jZSB0aGV5IHVzZWQgdGhlIFBDSV9QUklNQVJZX0JVUworCSAqICAgdG8gZGV0ZXJtaW5lIHdoaWNoIGJ1cyBudW1iZXIgdG8gbWF0Y2ggb24gd2hlbiBnZW5lcmF0aW5nIHR5cGUwCisJICogICBjb25maWcgY3ljbGVzCisJICovCisjZGVmaW5lIFBQQ19JTkRJUkVDVF9UWVBFX1NFVF9DRkdfVFlQRQkJKDB4MDAwMDAwMDEpCisjZGVmaW5lIFBQQ19JTkRJUkVDVF9UWVBFX0VYVF9SRUcJCSgweDAwMDAwMDAyKQorI2RlZmluZSBQUENfSU5ESVJFQ1RfVFlQRV9TVVJQUkVTU19QUklNQVJZX0JVUwkoMHgwMDAwMDAwNCkKKwl1MzIgaW5kaXJlY3RfdHlwZTsKKworCS8qIEN1cnJlbnRseSwgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIDEgSU8gcmFuZ2UgYW5kIDMgbWVtCisJICogcmFuZ2VzIHNpbmNlIHRoZSBjb21tb24gcGNpX2J1cyBzdHJ1Y3R1cmUgY2FuJ3QgaGFuZGxlIG1vcmUKKwkgKi8KKwlzdHJ1Y3QgcmVzb3VyY2UJaW9fcmVzb3VyY2U7CisJc3RydWN0IHJlc291cmNlIG1lbV9yZXNvdXJjZXNbM107CisJaW50IGdsb2JhbF9udW1iZXI7CQkvKiBQQ0kgZG9tYWluIG51bWJlciAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9idXNfdG9faG9zdChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXJldHVybiBidXMtPnN5c2RhdGE7Cit9CisKKy8qIFRoZXNlIGFyZSB1c2VkIGZvciBjb25maWcgYWNjZXNzIGJlZm9yZSBhbGwgdGhlIFBDSSBwcm9iaW5nCisgICBoYXMgYmVlbiBkb25lLiAqLworaW50IGVhcmx5X3JlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBpbnQgYnVzLCBpbnQgZGV2X2ZuLAorCQkJICAgaW50IHdoZXJlLCB1OCAqdmFsKTsKK2ludCBlYXJseV9yZWFkX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgIGludCB3aGVyZSwgdTE2ICp2YWwpOworaW50IGVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgICBpbnQgd2hlcmUsIHUzMiAqdmFsKTsKK2ludCBlYXJseV93cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICAgaW50IHdoZXJlLCB1OCB2YWwpOworaW50IGVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IGJ1cywgaW50IGRldl9mbiwKKwkJCSAgICBpbnQgd2hlcmUsIHUxNiB2YWwpOworaW50IGVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBidXMsIGludCBkZXZfZm4sCisJCQkgICAgIGludCB3aGVyZSwgdTMyIHZhbCk7CisKK2V4dGVybiB2b2lkIHNldHVwX2luZGlyZWN0X3BjaV9ub21hcChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsCisJCQkgICAgICAgdm9pZCBfX2lvbWVtICpjZmdfYWRkciwgdm9pZCBfX2lvbWVtICpjZmdfZGF0YSk7CitleHRlcm4gdm9pZCBzZXR1cF9pbmRpcmVjdF9wY2koc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLAorCQkJICAgICAgIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKTsKK2V4dGVybiB2b2lkIHNldHVwX2dyYWNrbGUoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKworI2Vsc2UKKwogCiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMzEsNiArMTEwLDcgQEAKIAlpbnQgbGFzdF9idXNubzsKIAogCXZvaWQgX19pb21lbSAqaW9fYmFzZV92aXJ0OworCXZvaWQgKmlvX2Jhc2VfYWxsb2M7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvX2Jhc2VfcGh5czsKIAogCS8qIFNvbWUgbWFjaGluZXMgaGF2ZSBhIG5vbiAxOjEgbWFwcGluZyBvZgpAQCAtNDgsOCArMTI4LDcgQEAKIAkgKi8KIAlzdHJ1Y3QgcmVzb3VyY2UgaW9fcmVzb3VyY2U7CiAJc3RydWN0IHJlc291cmNlIG1lbV9yZXNvdXJjZXNbM107Ci0JaW50IGdsb2JhbF9udW1iZXI7CQkKLQlpbnQgbG9jYWxfbnVtYmVyOwkJCisJaW50IGdsb2JhbF9udW1iZXI7CiAJdW5zaWduZWQgbG9uZyBidWlkOwogCXVuc2lnbmVkIGxvbmcgZG1hX3dpbmRvd19iYXNlX2N1cjsKIAl1bnNpZ25lZCBsb25nIGRtYV93aW5kb3dfc2l6ZTsKQEAgLTcwLDE5ICsxNDksMjIgQEAKIAlpbnQJZGV2Zm47CQkJLyogcGNpIGRldmljZSBhbmQgZnVuY3Rpb24gbnVtYmVyICovCiAJaW50CWNsYXNzX2NvZGU7CQkvKiBwY2kgZGV2aWNlIGNsYXNzICovCiAKLSNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKwlzdHJ1Y3QgIHBjaV9jb250cm9sbGVyICpwaGI7CS8qIGZvciBwY2kgZGV2aWNlcyAqLworCXN0cnVjdAlpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7CS8qIGZvciBwaGIncyBvciBicmlkZ2VzICovCisJc3RydWN0CXBjaV9kZXYgKnBjaWRldjsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBwY2kgZGV2aWNlICovCisJc3RydWN0CWRldmljZV9ub2RlICpub2RlOwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGRldmljZV9ub2RlICovCisKKwlpbnQJcGNpX2V4dF9jb25maWdfc3BhY2U7CS8qIGZvciBwY2kgZGV2aWNlcyAqLworCisjaWZkZWYgQ09ORklHX0VFSAogCWludAllZWhfbW9kZTsJCS8qIFNlZSBlZWguaCBmb3IgcG9zc2libGUgRUVIX01PREVzICovCiAJaW50CWVlaF9jb25maWdfYWRkcjsKIAlpbnQJZWVoX3BlX2NvbmZpZ19hZGRyOyAvKiBuZXctc3R5bGUgcGFydGl0aW9uIGVuZHBvaW50IGFkZHJlc3MgKi8KIAlpbnQgCWVlaF9jaGVja19jb3VudDsJLyogIyB0aW1lcyBkcml2ZXIgaWdub3JlZCBlcnJvciAqLwogCWludCAJZWVoX2ZyZWV6ZV9jb3VudDsJLyogIyB0aW1lcyB0aGlzIGRldmljZSBmcm96ZSB1cC4gKi8KLSNlbmRpZgotCWludAlwY2lfZXh0X2NvbmZpZ19zcGFjZTsJLyogZm9yIHBjaSBkZXZpY2VzICovCi0Jc3RydWN0ICBwY2lfY29udHJvbGxlciAqcGhiOwkvKiBmb3IgcGNpIGRldmljZXMgKi8KLQlzdHJ1Y3QJaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOwkvKiBmb3IgcGhiJ3Mgb3IgYnJpZGdlcyAqLwotCXN0cnVjdAlwY2lfZGV2ICpwY2lkZXY7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgcGNpIGRldmljZSAqLwotCXN0cnVjdAlkZXZpY2Vfbm9kZSAqbm9kZTsJLyogYmFjay1wb2ludGVyIHRvIHRoZSBkZXZpY2Vfbm9kZSAqLworCWludCAJZWVoX2ZhbHNlX3Bvc2l0aXZlczsJLyogIyB0aW1lcyB0aGlzIGRldmljZSByZXBvcnRlZCAjZmYncyAqLwogCXUzMgljb25maWdfc3BhY2VbMTZdOwkvKiBzYXZlZCBQQ0kgY29uZmlnIHNwYWNlICovCisjZW5kaWYKIH07CiAKIC8qIEdldCB0aGUgcG9pbnRlciB0byBhIGRldmljZV9ub2RlJ3MgcGNpX2RuICovCkBAIC0xMjgsOSArMjEwLDYgQEAKIC8qKiBGaW5kIHRoZSBidXMgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kaWNhdGVkIGRldmljZSBub2RlICovCiBzdHJ1Y3QgcGNpX2J1cyAqIHBjaWJpb3NfZmluZF9wY2lfYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pOwogCi1leHRlcm4gdm9pZCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKLQkJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbWFyeSk7Ci0KIC8qKiBSZW1vdmUgYWxsIG9mIHRoZSBQQ0kgZGV2aWNlcyB1bmRlciB0aGlzIGJ1cyAqLwogdm9pZCBwY2liaW9zX3JlbW92ZV9wY2lfZGV2aWNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIApAQCAtMTQ4LDIxICsyMjcsMTIgQEAKIAlyZXR1cm4gUENJX0ROKGJ1c2RuKS0+cGhiOwogfQogCi1leHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyKgotcGNpX2ZpbmRfaG9zZV9mb3JfT0ZfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSogbm9kZSk7Ci0KLWV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKgotcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGNpX2FkZHJlc3NfdG9fcGlvKHBoeXNfYWRkcl90IGFkZHJlc3MpCi17Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwotfQotI2VuZGlmCitleHRlcm4gdm9pZCBpc2FfYnJpZGdlX2ZpbmRfZWFybHkoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKTsKKworZXh0ZXJuIGludCBwY2liaW9zX3VubWFwX2lvX3NwYWNlKHN0cnVjdCBwY2lfYnVzICpidXMpOworZXh0ZXJuIGludCBwY2liaW9zX21hcF9pb19zcGFjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgcHBjX21kLnBjaV9wcm9iZV9tb2RlIGZ1bmN0aW9uICovCiAjZGVmaW5lIFBDSV9QUk9CRV9OT05FCQktMQkvKiBEb24ndCBsb29rIGF0IHRoaXMgYnVzIGF0IGFsbCAqLwpAQCAtMTc2LDUgKzI0NiwyOSBAQAogI2VuZGlmCiAKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KKworLyogR2V0IHRoZSBQQ0kgaG9zdCBjb250cm9sbGVyIGZvciBhbiBPRiBkZXZpY2UgKi8KK2V4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqCitwY2lfZmluZF9ob3NlX2Zvcl9PRl9kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlKiBub2RlKTsKKworLyogRmlsbCB1cCBob3N0IGNvbnRyb2xsZXIgcmVzb3VyY2VzIGZyb20gdGhlIE9GIG5vZGUgKi8KK2V4dGVybiB2b2lkCitwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgcHJpbWFyeSk7CisKKy8qIEFsbG9jYXRlIGEgbmV3IFBDSSBob3N0IGJyaWRnZSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKgorcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfUENJCitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfYWRkcmVzc190b19waW8ocGh5c19hZGRyX3QgYWRkcmVzcyk7CisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9hZGRyZXNzX3RvX3BpbyhwaHlzX2FkZHJfdCBhZGRyZXNzKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKK30KKyNlbmRpZgorCisKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLmgKaW5kZXggZTE2ZTdiYy4uN2IxMTc2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS5oCkBAIC05NSw4ICs5NSw2IEBACiAjZGVmaW5lIGdldF9wY2lfZG1hX29wcygpCU5VTEwKICNlbmRpZgogCi1leHRlcm4gaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci0KIC8qIERlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIGRvbWFpbiBudW1iZXIgaW4gL3Byb2MgKi8KIGV4dGVybiBpbnQgcGNpX3Byb2NfZG9tYWluKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCkBAIC0xMTIsOSArMTEwLDYgQEAKIH0KICNlbmRpZgogCi0vKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBQQ0kgY29udHJvbGxlciBmb3IgZGV2aWNlIFBERVYuICovCi0jZGVmaW5lIHBjaV9kb21haW5fbnIoYnVzKSAoKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKShidXMpLT5zeXNkYXRhKS0+aW5kZXgKLQogLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBidXMgYXMgaXQgYXBwZWFycyBpbiAvcHJvYy9idXMvcGNpICovCiBzdGF0aWMgaW5saW5lIGludCBwY2lfcHJvY19kb21haW4oc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKQEAgLTEyMyw2ICsxMTgsOCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKK2V4dGVybiBpbnQgcGNpX2RvbWFpbl9ucihzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKKwogc3RydWN0IHZtX2FyZWFfc3RydWN0OwogLyogTWFwIGEgcmFuZ2Ugb2YgUENJIG1lbW9yeSBvciBJL08gc3BhY2UgZm9yIGEgZGV2aWNlIGludG8gdXNlciBzcGFjZSAqLwogaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLApAQCAtMjAyLDEwICsxOTksNiBAQAogCXJldHVybiByb290OwogfQogCi1leHRlcm4gaW50IHVubWFwX2J1c19yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKLQotZXh0ZXJuIGludCByZW1hcF9idXNfcmFuZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci0KIGV4dGVybiB2b2lkIHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGMzMi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLXBwYzMyLmgKaW5kZXggN2ZiNzMwYy4uODZhNTRhNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGMzMi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGMzMi5oCkBAIC02LDExICs2LDcgQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogRm9yIFRBU0tfU0laRSAqLwotI2luY2x1ZGUgPGFzbS9tbXUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgkJCS8qIEZvciBzdWItYXJjaCBzcGVjaWZpYyBQUENfUElOX1NJWkUgKi8KLXN0cnVjdCBtbV9zdHJ1Y3Q7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHZhX3RvX3BoeXModW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIGV4dGVybiBwdGVfdCAqdmFfdG9fcHRlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CkBAIC00ODgsMTQgKzQ4NCw2IEBACiAjZGVmaW5lIHBmbl9wdGUocGZuLCBwcm90KQlfX3B0ZSgoKHB0ZV9iYXNpY190KShwZm4pIDw8IFBGTl9TSElGVF9PRkZTRVQpIHxcCiAJCQkJCXBncHJvdF92YWwocHJvdCkpCiAjZGVmaW5lIG1rX3B0ZShwYWdlLCBwcm90KQlwZm5fcHRlKHBhZ2VfdG9fcGZuKHBhZ2UpLCBwcm90KQotCi0vKgotICogWkVST19QQUdFIGlzIGEgZ2xvYmFsIHNoYXJlZCBwYWdlIHRoYXQgaXMgYWx3YXlzIHplcm86IHVzZWQKLSAqIGZvciB6ZXJvLW1hcHBlZCBtZW1vcnkgYXJlYXMgZXRjLi4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlWzEwMjRdOwotI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZGVmaW5lIHB0ZV9ub25lKHB0ZSkJCSgocHRlX3ZhbChwdGUpICYgfl9QVEVfTk9ORV9NQVNLKSA9PSAwKQpAQCAtNTEyLDkgKzUwMCw3IEBACiAgKiBUaGUgZm9sbG93aW5nIG9ubHkgd29yayBpZiBwdGVfcHJlc2VudCgpIGlzIHRydWUuCiAgKiBVbmRlZmluZWQgYmVoYXZpb3VyIGlmIG5vdC4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRVhFQzsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX2RpcnR5KHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KQEAgLTUyMiwyMSArNTA4LDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX3VuY2FjaGUocHRlX3QgcHRlKSAgICAgICB7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9OT19DQUNIRTsgfQogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9jYWNoZShwdGVfdCBwdGUpICAgICAgICAgeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX05PX0NBQ0hFOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX1VTRVI7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9SVyB8IF9QQUdFX0hXV1JJVEUpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX0RJUlRZIHwgX1BBR0VfSFdXUklURSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rb2xkKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVIgfCBfUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpIHsKQEAgLTY0MywxMyArNjIxLDYgQEAKICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXApIFwKIAlfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoKF9fdm1hKS0+dm1fbW0tPmNvbnRleHQuaWQsIF9fYWRkciwgX19wdGVwKQogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXJldHVybiAocHRlX3VwZGF0ZShwdGVwLCAoX1BBR0VfRElSVFkgfCBfUEFHRV9IV1dSSVRFKSwgMCkgJiBfUEFHRV9ESVJUWSkgIT0gMDsKLX0KLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICAgIHB0ZV90ICpwdGVwKQpAQCAtNzM0LDEwICs3MDUsNiBAQAogI2RlZmluZSBwdGVfdW5tYXAocHRlKQkJa3VubWFwX2F0b21pYyhwdGUsIEtNX1BURTApCiAjZGVmaW5lIHB0ZV91bm1hcF9uZXN0ZWQocHRlKQlrdW5tYXBfYXRvbWljKHB0ZSwgS01fUFRFMSkKIAotZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07Ci0KLWV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwotCiAvKgogICogRW5jb2RlIGFuZCBkZWNvZGUgYSBzd2FwIGVudHJ5LgogICogTm90ZSB0aGF0IHRoZSBiaXRzIHdlIHVzZSBpbiBhIFBURSBmb3IgcmVwcmVzZW50aW5nIGEgc3dhcCBlbnRyeQpAQCAtNzU1LDQwICs3MjIsNiBAQAogI2RlZmluZSBwdGVfdG9fcGdvZmYocHRlKQkocHRlX3ZhbChwdGUpID4+IDMpCiAjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpCSgocHRlX3QpIHsgKChvZmYpIDw8IDMpIHwgX1BBR0VfRklMRSB9KQogCi0vKiBDT05GSUdfQVBVUyAqLwotLyogRm9yIHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzIGNvbnZlcnNpb24gKi8KLWV4dGVybiB2b2lkIGNhY2hlX2NsZWFyKF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOwotZXh0ZXJuIHZvaWQgY2FjaGVfcHVzaChfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKLWV4dGVybiBpbnQgbW1fZW5kX29mX2NodW5rICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9wYSh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW1fcHRvdih1bnNpZ25lZCBsb25nIGFkZHIpIF9fYXR0cmlidXRlX2NvbnN0X187Ci0KLS8qIFZhbHVlcyBmb3Igbm9jYWNoZWZsYWcgYW5kIGNtb2RlICovCi0vKiBUaGVzZSBhcmUgbm90IHVzZWQgYnkgdGhlIEFQVVMga2VybmVsX21hcCwgYnV0IHByZXZlbnRzCi0gICBjb21waWxhdGlvbiBlcnJvcnMuICovCi0jZGVmaW5lCUtFUk5FTE1BUF9GVUxMX0NBQ0hJTkcJCTAKLSNkZWZpbmUJS0VSTkVMTUFQX05PQ0FDSEVfU0VSCQkxCi0jZGVmaW5lCUtFUk5FTE1BUF9OT0NBQ0hFX05PTlNFUgkyCi0jZGVmaW5lCUtFUk5FTE1BUF9OT19DT1BZQkFDSwkJMwotCi0vKgotICogTWFwIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyByYW5nZSBpbnRvIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcga2VybmVsX21hcCh1bnNpZ25lZCBsb25nIHBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJaW50IG5vY2FjaGVmbGFnLCB1bnNpZ25lZCBsb25nICptZW1hdmFpbHAgKTsKLQotLyoKLSAqIFNldCBjYWNoZSBtb2RlIG9mIChrZXJuZWwgc3BhY2UpIGFkZHJlc3MgcmFuZ2UuCi0gKi8KLWV4dGVybiB2b2lkIGtlcm5lbF9zZXRfY2FjaGVtb2RlICh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbW9kZSk7Ci0KLS8qIE5lZWRzIHRvIGJlIGRlZmluZWQgaGVyZSBhbmQgbm90IGluIGxpbnV4L21tLmgsIGFzIGl0IGlzIGFyY2ggZGVwZW5kZW50ICovCi0jZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQkoMSkKLQotI2RlZmluZSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQkJXAotCQlyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQotCiAvKgogICogTm8gcGFnZSB0YWJsZSBjYWNoZXMgdG8gaW5pdGlhbGlzZQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtcHBjNjQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGM2NC5oCmluZGV4IDNjZmQ5OGYuLjMwMGY5YTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGM2NC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS1wcGM2NC5oCkBAIC03LDExICs3LDcgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBGb3IgVEFTS19TSVpFICovCi0jaW5jbHVkZSA8YXNtL21tdS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci1zdHJ1Y3QgbW1fc3RydWN0OwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKQEAgLTI3LDcgKzIzLDcgQEAKICAqLwogI2RlZmluZSBQR1RBQkxFX0VBRERSX1NJWkUgKFBURV9JTkRFWF9TSVpFICsgUE1EX0lOREVYX1NJWkUgKyBcCiAgICAgICAgICAgICAgICAgCSAgICBQVURfSU5ERVhfU0laRSArIFBHRF9JTkRFWF9TSVpFICsgUEFHRV9TSElGVCkKLSNkZWZpbmUgUEdUQUJMRV9SQU5HRSAoMVVMIDw8IFBHVEFCTEVfRUFERFJfU0laRSkKKyNkZWZpbmUgUEdUQUJMRV9SQU5HRSAoQVNNX0NPTlNUKDEpIDw8IFBHVEFCTEVfRUFERFJfU0laRSkKIAogI2lmIFRBU0tfU0laRV9VU0VSNjQgPiBQR1RBQkxFX1JBTkdFCiAjZXJyb3IgVEFTS19TSVpFX1VTRVI2NCBleGNlZWRzIHBhZ2V0YWJsZSByYW5nZQpAQCAtMzcsMTkgKzMzLDI4IEBACiAjZXJyb3IgVEFTS19TSVpFX1VTRVI2NCBleGNlZWRzIHVzZXIgVlNJRCByYW5nZQogI2VuZGlmCiAKKwogLyoKICAqIERlZmluZSB0aGUgYWRkcmVzcyByYW5nZSBvZiB0aGUgdm1hbGxvYyBWTSBhcmVhLgogICovCiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQgQVNNX0NPTlNUKDB4RDAwMDAwMDAwMDAwMDAwMCkKLSNkZWZpbmUgVk1BTExPQ19TSVpFICBBU01fQ09OU1QoMHg4MDAwMDAwMDAwMCkKKyNkZWZpbmUgVk1BTExPQ19TSVpFICAoUEdUQUJMRV9SQU5HRSA+PiAxKQogI2RlZmluZSBWTUFMTE9DX0VORCAgIChWTUFMTE9DX1NUQVJUICsgVk1BTExPQ19TSVpFKQogCiAvKgotICogRGVmaW5lIHRoZSBhZGRyZXNzIHJhbmdlIG9mIHRoZSBpbWFsbG9jIFZNIGFyZWEuCisgKiBEZWZpbmUgdGhlIGFkZHJlc3MgcmFuZ2VzIGZvciBNTUlPIGFuZCBJTyBzcGFjZSA6CisgKgorICogIElTQV9JT19CQVNFID0gVk1BTExPQ19FTkQsIDY0SyByZXNlcnZlZCBhcmVhCisgKiAgUEhCX0lPX0JBU0UgPSBJU0FfSU9fQkFTRSArIDY0SyB0byBJU0FfSU9fQkFTRSArIDJHLCBQSEIgSU8gc3BhY2VzCisgKiBJT1JFTUFQX0JBU0UgPSBJU0FfSU9fQkFTRSArIDJHIHRvIFZNQUxMT0NfU1RBUlQgKyBQR1RBQkxFX1JBTkdFCiAgKi8KLSNkZWZpbmUgUEhCU19JT19CQVNFCVZNQUxMT0NfRU5ECi0jZGVmaW5lIElNQUxMT0NfQkFTRQkoUEhCU19JT19CQVNFICsgMHg4MDAwMDAwMHVsKQkvKiBSZXNlcnZlIDIgZ2lncyBmb3IgUEhCcyAqLwotI2RlZmluZSBJTUFMTE9DX0VORAkoVk1BTExPQ19TVEFSVCArIFBHVEFCTEVfUkFOR0UpCisjZGVmaW5lIEZVTExfSU9fU0laRQkweDgwMDAwMDAwdWwKKyNkZWZpbmUgIElTQV9JT19CQVNFCShWTUFMTE9DX0VORCkKKyNkZWZpbmUgIElTQV9JT19FTkQJKFZNQUxMT0NfRU5EICsgMHgxMDAwMHVsKQorI2RlZmluZSAgUEhCX0lPX0JBU0UJKElTQV9JT19FTkQpCisjZGVmaW5lICBQSEJfSU9fRU5ECShWTUFMTE9DX0VORCArIEZVTExfSU9fU0laRSkKKyNkZWZpbmUgSU9SRU1BUF9CQVNFCShQSEJfSU9fRU5EKQorI2RlZmluZSBJT1JFTUFQX0VORAkoVk1BTExPQ19TVEFSVCArIFBHVEFCTEVfUkFOR0UpCiAKIC8qCiAgKiBSZWdpb24gSURzCkBAIC0xMzQsMTYgKzEzOSw2IEBACiAjZGVmaW5lIF9fUzExMAlQQUdFX1NIQVJFRF9YCiAjZGVmaW5lIF9fUzExMQlQQUdFX1NIQVJFRF9YCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KLS8qCi0gKiBaRVJPX1BBR0UgaXMgYSBnbG9iYWwgc2hhcmVkIHBhZ2UgdGhhdCBpcyBhbHdheXMgemVybzogdXNlZAotICogZm9yIHplcm8tbWFwcGVkIG1lbW9yeSBhcmVhcyBldGMuLgotICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbUEFHRV9TSVpFL3NpemVvZih1bnNpZ25lZCBsb25nKV07Ci0jZGVmaW5lIFpFUk9fUEFHRSh2YWRkcikgKHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpKQotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCiAjZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBCkBAIC0yMzIsOSArMjI3LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKSAgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjt9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SVzt9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpICB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9FWEVDO30KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZO30KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEO30KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTt9CkBAIC0yNDIsMjAgKzIzNSwxMiBAQAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV91bmNhY2hlKHB0ZV90IHB0ZSkgeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTk9fQ0FDSEU7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2FjaGUocHRlX3QgcHRlKSAgIHsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9OT19DQUNIRTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSAmPSB+KF9QQUdFX0RJUlRZKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpIHw9IF9QQUdFX1VTRVIgfCBfUEFHRV9FWEVDOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkgewogCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpIHsKQEAgLTMwNywyOSArMjkyLDYgQEAKIAlfX3I7CQkJCQkJCQkgICBcCiB9KQogCi0vKgotICogT24gUlcvRElSVFkgYml0IHRyYW5zaXRpb25zIHdlIGNhbiBhdm9pZCBmbHVzaGluZyB0aGUgaHB0ZS4gRm9yIHRoZQotICogbW9tZW50IHdlIGFsd2F5cyBmbHVzaCBidXQgd2UgbmVlZCB0byBmaXggaHB0ZV91cGRhdGUgYW5kIHRlc3QgaWYgdGhlCi0gKiBvcHRpbWlzYXRpb24gaXMgd29ydGggaXQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQl1bnNpZ25lZCBsb25nIG9sZDsKLQotICAgICAgIAlpZiAoKHB0ZV92YWwoKnB0ZXApICYgX1BBR0VfRElSVFkpID09IDApCi0JCXJldHVybiAwOwotCW9sZCA9IHB0ZV91cGRhdGUobW0sIGFkZHIsIHB0ZXAsIF9QQUdFX0RJUlRZLCAwKTsKLQlyZXR1cm4gKG9sZCAmIF9QQUdFX0RJUlRZKSAhPSAwOwotfQotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoX192bWEsIF9fYWRkciwgX19wdGVwKQkJICAgXAotKHsJCQkJCQkJCQkgICBcCi0JaW50IF9fcjsJCQkJCQkJICAgXAotCV9fciA9IF9fcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSgoX192bWEpLT52bV9tbSwgX19hZGRyLCBfX3B0ZXApOyBcCi0JX19yOwkJCQkJCQkJICAgXAotfSkKLQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX3NldF93cnByb3RlY3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCQkgICAgICBwdGVfdCAqcHRlcCkKQEAgLTM1NywxNCArMzE5LDYgQEAKIAlfX3lvdW5nOwkJCQkJCQlcCiB9KQogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRElSVFlfRkxVU0gKLSNkZWZpbmUgcHRlcF9jbGVhcl9mbHVzaF9kaXJ0eShfX3ZtYSwgX19hZGRyZXNzLCBfX3B0ZXApCQlcCi0oewkJCQkJCQkJCVwKLQlpbnQgX19kaXJ0eSA9IF9fcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eSgoX192bWEpLT52bV9tbSwgX19hZGRyZXNzLCBcCi0JCQkJCQkgIF9fcHRlcCk7IAkJXAotCV9fZGlydHk7CQkJCQkJCVwKLX0pCi0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKQEAgLTQ0MiwxMCArMzk2LDYgQEAKICNkZWZpbmUgcGdkX0VSUk9SKGUpIFwKIAlwcmludGsoIiVzOiVkOiBiYWQgcGdkICUwOGx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBwZ2RfdmFsKGUpKQogCi1leHRlcm4gcGdkX3Qgc3dhcHBlcl9wZ19kaXJbXTsKLQotZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7Ci0KIC8qIEVuY29kZSBhbmQgZGUtY29kZSBhIHN3YXAgZW50cnkgKi8KICNkZWZpbmUgX19zd3BfdHlwZShlbnRyeSkJKCgoZW50cnkpLnZhbCA+PiAxKSAmIDB4M2YpCiAjZGVmaW5lIF9fc3dwX29mZnNldChlbnRyeSkJKChlbnRyeSkudmFsID4+IDgpCkBAIC00NTYsMTcgKzQwNiw2IEBACiAjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpCSgocHRlX3QpIHsoKG9mZikgPDwgUFRFX1JQTl9TSElGVCl8X1BBR0VfRklMRX0pCiAjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTCShCSVRTX1BFUl9MT05HIC0gUFRFX1JQTl9TSElGVCkKIAotLyoKLSAqIGtlcm5fYWRkcl92YWxpZCBpcyBpbnRlbmRlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGFuIGFkZHJlc3MgaXMgYSB2YWxpZAotICoga2VybmVsIGFkZHJlc3MuICBNb3N0IDMyLWJpdCBhcmNocyBkZWZpbmUgaXQgYXMgYWx3YXlzIHRydWUgKGxpa2UgdGhpcykKLSAqIGJ1dCBtb3N0IDY0LWJpdCBhcmNocyBhY3R1YWxseSBwZXJmb3JtIGEgdGVzdC4gIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/Ci0gKiBUaGUgb25seSB1c2UgaXMgaW4gZnMvbmNwZnMvZGlyLmMKLSAqLwotI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikJKDEpCi0KLSNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkJCVwKLQkJcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkKLQogdm9pZCBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCk7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oCmluZGV4IDc4YmY0YWUuLmQxOGZmZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS5oCkBAIC0yLDYgKzIsMTMgQEAKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BHVEFCTEVfSAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBGb3IgVEFTS19TSVpFICovCisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CitzdHJ1Y3QgbW1fc3RydWN0OworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKwogI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KQogIyAgaW5jbHVkZSA8YXNtL3BndGFibGUtcHBjNjQuaD4KICNlbHNlCkBAIC05LDYgKzE2LDI3IEBACiAjZW5kaWYKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qCisgKiBaRVJPX1BBR0UgaXMgYSBnbG9iYWwgc2hhcmVkIHBhZ2UgdGhhdCBpcyBhbHdheXMgemVybzogdXNlZAorICogZm9yIHplcm8tbWFwcGVkIG1lbW9yeSBhcmVhcyBldGMuLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbXTsKKyNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCisKK2V4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltdOworCitleHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKKworLyoKKyAqIGtlcm5fYWRkcl92YWxpZCBpcyBpbnRlbmRlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGFuIGFkZHJlc3MgaXMgYSB2YWxpZAorICoga2VybmVsIGFkZHJlc3MuICBNb3N0IDMyLWJpdCBhcmNocyBkZWZpbmUgaXQgYXMgYWx3YXlzIHRydWUgKGxpa2UgdGhpcykKKyAqIGJ1dCBtb3N0IDY0LWJpdCBhcmNocyBhY3R1YWxseSBwZXJmb3JtIGEgdGVzdC4gIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/CisgKi8KKyNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgxKQorCisjZGVmaW5lIGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCQlcCisJCXJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZhZGRyLCBwZm4sIHNpemUsIHByb3QpCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHBjLXBjaS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmgKaW5kZXggOGUyMDA1MS4uYjg0N2FhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcGMtcGNpLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogZXh0ZXJuIHZvaWQgZmluZF9hbmRfaW5pdF9waGJzKHZvaWQpOwogCi1leHRlcm4gc3RydWN0IHBjaV9kZXYgKnBwYzY0X2lzYWJyaWRnZV9kZXY7CS8qIG1heSBiZSBOVUxMIGlmIG5vIElTQSBidXMgKi8KK2V4dGVybiBzdHJ1Y3QgcGNpX2RldiAqaXNhX2JyaWRnZV9wY2lkZXY7CS8qIG1heSBiZSBOVUxMIGlmIG5vIElTQSBidXMgKi8KIAogLyoqIEJ1cyBVbml0IElEIG1hY3JvczsgZ2V0IGxvdyBhbmQgaGkgMzItYml0cyBvZiB0aGUgNjQtYml0IEJVSUQgKi8KICNkZWZpbmUgQlVJRF9ISShidWlkKSAoKGJ1aWQpID4+IDMyKQpAQCAtNDcsOCArNDcsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3BoYl9idWlkIChzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CiBleHRlcm4gaW50IHJ0YXNfc2V0dXBfcGhiKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKIAotLyogRnJvbSBwU2VyaWVzX3BjaS5oICovCi1leHRlcm4gdm9pZCBwU2VyaWVzX2ZpbmFsX2ZpeHVwKHZvaWQpOworLyogRnJvbSBpU2VyaWVzIFBDSSAqLworZXh0ZXJuIHZvaWQgaVNlcmllc19wY2liaW9zX2luaXQodm9pZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9wcm9iZV9vbmx5OwogCkBAIC0xMzksNiArMTM5LDkgQEAKICAqLwogc3RydWN0IGRldmljZV9ub2RlICogZmluZF9kZXZpY2VfcGUoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKK3ZvaWQgZWVoX3N5c2ZzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwordm9pZCBlZWhfc3lzZnNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKICNlbmRpZiAvKiBDT05GSUdfRUVIICovCiAKICNlbHNlIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCmluZGV4IGQ5NDdiMTYuLmUyOGIxMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaApAQCAtNDMsMTQgKzQzLDYgQEAKIC8qIHdoYXQga2luZCBvZiBwcmVwIHdvcmtzdGF0aW9uIHdlIGFyZSAqLwogZXh0ZXJuIGludCBfcHJlcF90eXBlOwogCi0vKgotICogVGhpcyBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBib2FyZCB0eXBlIGZyb20gYSBnaXZlbiBQUmVQIGJvYXJkCi0gKiB2ZW5kb3IuIEJvYXJkIHJldmlzaW9uIGlzIGFsc28gbWFkZSBhdmFpbGFibGUuIFRoaXMgd2lsbCBiZSBtb3ZlZAotICogZWxzZXdoZXJlIHNvb24KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgdWNCb2FyZFJldjsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHVjQm9hcmRSZXZNYWosIHVjQm9hcmRSZXZNaW47Ci0KICNlbmRpZiAvKiBDT05GSUdfUFBDX1BSRVAgKi8KIAogI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChDT05GSUdfUFBDMzIpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCmluZGV4IDY4NDVhZjkuLjE2MzJiYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvbS5oCkBAIC05OCwxMCArOTgsMTkgQEAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2Nob3NlbjsKIAogLyogZmxhZyBkZXNjcmlwdGlvbnMgKi8KLSNkZWZpbmUgT0ZfRFlOQU1JQyAxIC8qIG5vZGUgYW5kIHByb3BlcnRpZXMgd2VyZSBhbGxvY2F0ZWQgdmlhIGttYWxsb2MgKi8KKyNkZWZpbmUgT0ZfRFlOQU1JQwkxIC8qIG5vZGUgYW5kIHByb3BlcnRpZXMgd2VyZSBhbGxvY2F0ZWQgdmlhIGttYWxsb2MgKi8KKyNkZWZpbmUgT0ZfREVUQUNIRUQJMiAvKiBub2RlIGhhcyBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGRldmljZSB0cmVlICovCiAKLSNkZWZpbmUgT0ZfSVNfRFlOQU1JQyh4KSB0ZXN0X2JpdChPRl9EWU5BTUlDLCAmeC0+X2ZsYWdzKQotI2RlZmluZSBPRl9NQVJLX0RZTkFNSUMoeCkgc2V0X2JpdChPRl9EWU5BTUlDLCAmeC0+X2ZsYWdzKQorc3RhdGljIGlubGluZSBpbnQgb2Zfbm9kZV9jaGVja19mbGFnKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbiwgdW5zaWduZWQgbG9uZyBmbGFnKQoreworCXJldHVybiB0ZXN0X2JpdChmbGFnLCAmbi0+X2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9mX25vZGVfc2V0X2ZsYWcoc3RydWN0IGRldmljZV9ub2RlICpuLCB1bnNpZ25lZCBsb25nIGZsYWcpCit7CisJc2V0X2JpdChmbGFnLCAmbi0+X2ZsYWdzKTsKK30KKwogCiAjZGVmaW5lIEhBVkVfQVJDSF9ERVZUUkVFX0ZJWFVQUwogCkBAIC0xMjQsNiArMTMzLDkgQEAKIAkgICAgIGRuID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoZG4sIHR5cGUpKQogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAogCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdCk7CisjZGVmaW5lIGZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShkbiwgdHlwZSwgY29tcGF0aWJsZSkgXAorCWZvciAoZG4gPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCB0eXBlLCBjb21wYXRpYmxlKTsgZG47IFwKKwkgICAgIGRuID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoZG4sIHR5cGUsIGNvbXBhdGlibGUpKQogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9ub2RlX2J5X3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlIGhhbmRsZSk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX2FsbF9ub2RlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzLmgKaW5kZXggMWUwNDY1MS4uYTZmM2Y1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczMuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzMy5oCkBAIC0zNSw3ICszNSw4IEBACiAJfTsKIH07CiAKLWludCBwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24odW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gKnYpOwordm9pZCBwczNfZ2V0X2Zpcm13YXJlX3ZlcnNpb24odW5pb24gcHMzX2Zpcm13YXJlX3ZlcnNpb24gKnYpOworaW50IHBzM19jb21wYXJlX2Zpcm13YXJlX3ZlcnNpb24odTE2IG1ham9yLCB1MTYgbWlub3IsIHUxNiByZXYpOwogCiAvKiAnT3RoZXIgT1MnIGFyZWEgKi8KIApAQCAtNDgsMTggKzQ5LDYgQEAKIAogZW51bSBwczNfcGFyYW1fYXZfbXVsdGlfb3V0IHBzM19vc19hcmVhX2dldF9hdl9tdWx0aV9vdXQodm9pZCk7CiAKLS8qKgotICogc3RydWN0IHBzM19kZXZpY2VfaWQgLSBIViBidXMgZGV2aWNlIGlkZW50aWZpZXIgZnJvbSB0aGUgc3lzdGVtIHJlcG9zaXRvcnkKLSAqIEBidXNfaWQ6IEhWIGJ1cyBpZCwgezEuLn0gKHplcm8gaW52YWxpZCkKLSAqIEBkZXZfaWQ6IEhWIGRldmljZSBpZCwgezAuLn0KLSAqLwotCi1zdHJ1Y3QgcHMzX2RldmljZV9pZCB7Ci0JdW5zaWduZWQgaW50IGJ1c19pZDsKLQl1bnNpZ25lZCBpbnQgZGV2X2lkOwotfTsKLQotCiAvKiBkbWEgcm91dGluZXMgKi8KIAogZW51bSBwczNfZG1hX3BhZ2Vfc2l6ZSB7CkBAIC03NCw2ICs2Myw4IEBACiAJUFMzX0RNQV9JTlRFUk5BTCA9IDIsCiB9OwogCitzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzOworCiAvKioKICAqIHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAtIEEgcGVyIGRldmljZSBkbWEgc3RhdGUgdmFyaWFibGVzIHN0cnVjdHVyZQogICogQGRpZDogVGhlIEhWIGRldmljZSBpZC4KQEAgLTgxLDIxICs3Miw0MiBAQAogICogQHJlZ2lvbl90eXBlOiBUaGUgSFYgcmVnaW9uIHR5cGUuCiAgKiBAYnVzX2FkZHI6IFRoZSAndHJhbnNsYXRlZCcgYnVzIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbi4KICAqIEBsZW46IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHJlZ2lvbi4KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgbWVtb3J5IG9mIHRoZSByZWdpb24uCisgKiBAaW9pZDogVGhlIElPSUQgb2YgdGhlIGRldmljZSB3aG8gb3ducyB0aGlzIHJlZ2lvbgogICogQGNodW5rX2xpc3Q6IE9wYXF1ZSB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBpb2MgcGFnZSBtYW5hZ2VyLgorICogQHJlZ2lvbl9vcHM6IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgLSBkbWEgcmVnaW9uIG9wZXJhdGlvbnMKICAqLwogCiBzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gewotCXN0cnVjdCBwczNfZGV2aWNlX2lkIGRpZDsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXY7CisJLyogZGV2aWNlIHZhcmlhYmxlcyAqLworCWNvbnN0IHN0cnVjdCBwczNfZG1hX3JlZ2lvbl9vcHMgKnJlZ2lvbl9vcHM7CisJdW5zaWduZWQgY2hhciBpb2lkOwogCWVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplOwogCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZTsKLQl1bnNpZ25lZCBsb25nIGJ1c19hZGRyOwogCXVuc2lnbmVkIGxvbmcgbGVuOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCisJLyogZHJpdmVyIHZhcmlhYmxlcyAgKHNldCBieSBwczNfZG1hX3JlZ2lvbl9jcmVhdGUpICovCisJdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKIAlzdHJ1Y3QgewogCQlzcGlubG9ja190IGxvY2s7CiAJCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAl9IGNodW5rX2xpc3Q7CiB9OwogCitzdHJ1Y3QgcHMzX2RtYV9yZWdpb25fb3BzIHsKKwlpbnQgKCpjcmVhdGUpKHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqKTsKKwlpbnQgKCpmcmVlKShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKik7CisJaW50ICgqbWFwKShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKiwKKwkJICAgdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsCisJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkgICB1bnNpZ25lZCBsb25nICpidXNfYWRkciwKKwkJICAgdTY0IGlvcHRlX3BwKTsKKwlpbnQgKCp1bm1hcCkoc3RydWN0IHBzM19kbWFfcmVnaW9uICosCisJCSAgICAgdW5zaWduZWQgbG9uZyBidXNfYWRkciwKKwkJICAgICB1bnNpZ25lZCBsb25nIGxlbik7Cit9OwogLyoqCiAgKiBzdHJ1Y3QgcHMzX2RtYV9yZWdpb25faW5pdCAtIEhlbHBlciB0byBpbml0aWFsaXplIHN0cnVjdHVyZSB2YXJpYWJsZXMKICAqCkBAIC0xMDMsMTggKzExNSwxNiBAQAogICogcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNfZG1hX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqciwKLQljb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCogZGlkLCBlbnVtIHBzM19kbWFfcGFnZV9zaXplIHBhZ2Vfc2l6ZSwKLQllbnVtIHBzM19kbWFfcmVnaW9uX3R5cGUgcmVnaW9uX3R5cGUpCi17Ci0Jci0+ZGlkID0gKmRpZDsKLQlyLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7Ci0Jci0+cmVnaW9uX3R5cGUgPSByZWdpb25fdHlwZTsKLX0KK3N0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2U7CisKK2ludCBwczNfZG1hX3JlZ2lvbl9pbml0KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIGVudW0gcHMzX2RtYV9wYWdlX3NpemUgcGFnZV9zaXplLAorCWVudW0gcHMzX2RtYV9yZWdpb25fdHlwZSByZWdpb25fdHlwZSwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwogaW50IHBzM19kbWFfcmVnaW9uX2NyZWF0ZShzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIpOwogaW50IHBzM19kbWFfcmVnaW9uX2ZyZWUoc3RydWN0IHBzM19kbWFfcmVnaW9uICpyKTsKIGludCBwczNfZG1hX21hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLAotCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nICpidXNfYWRkcik7CisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgKmJ1c19hZGRyLAorCXU2NCBpb3B0ZV9wcCk7CiBpbnQgcHMzX2RtYV91bm1hcChzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gKnIsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCiAJdW5zaWduZWQgbG9uZyBsZW4pOwogCkBAIC0xMjUsNiArMTM1LDcgQEAKIAlQUzNfTU1JT182NEsgPSAxNlUKIH07CiAKK3N0cnVjdCBwczNfbW1pb19yZWdpb25fb3BzOwogLyoqCiAgKiBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uIC0gYSBwZXIgZGV2aWNlIG1taW8gc3RhdGUgdmFyaWFibGVzIHN0cnVjdHVyZQogICoKQEAgLTEzMiwxMyArMTQzLDE4IEBACiAgKi8KIAogc3RydWN0IHBzM19tbWlvX3JlZ2lvbiB7Ci0Jc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOworCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldjsKKwljb25zdCBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX29wcyAqbW1pb19vcHM7CiAJdW5zaWduZWQgbG9uZyBidXNfYWRkcjsKIAl1bnNpZ25lZCBsb25nIGxlbjsKIAllbnVtIHBzM19tbWlvX3BhZ2Vfc2l6ZSBwYWdlX3NpemU7CiAJdW5zaWduZWQgbG9uZyBscGFyX2FkZHI7CiB9OwogCitzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX29wcyB7CisJaW50ICgqY3JlYXRlKShzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICopOworCWludCAoKmZyZWUpKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKik7Cit9OwogLyoqCiAgKiBzdHJ1Y3QgcHMzX21taW9fcmVnaW9uX2luaXQgLSBIZWxwZXIgdG8gaW5pdGlhbGl6ZSBzdHJ1Y3R1cmUgdmFyaWFibGVzCiAgKgpAQCAtMTQ2LDE1ICsxNjIsOSBAQAogICogcHMzX3N5c3RlbV9idXNfZGV2aWNlX3JlZ2lzdGVyLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNfbW1pb19yZWdpb25faW5pdChzdHJ1Y3QgcHMzX21taW9fcmVnaW9uICpyLAotCWNvbnN0IHN0cnVjdCBwczNfZGV2aWNlX2lkKiBkaWQsIHVuc2lnbmVkIGxvbmcgYnVzX2FkZHIsCi0JdW5zaWduZWQgbG9uZyBsZW4sIGVudW0gcHMzX21taW9fcGFnZV9zaXplIHBhZ2Vfc2l6ZSkKLXsKLQlyLT5kaWQgPSAqZGlkOwotCXItPmJ1c19hZGRyID0gYnVzX2FkZHI7Ci0Jci0+bGVuID0gbGVuOwotCXItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKLX0KK2ludCBwczNfbW1pb19yZWdpb25faW5pdChzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYsCisJc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqciwgdW5zaWduZWQgbG9uZyBidXNfYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJZW51bSBwczNfbW1pb19wYWdlX3NpemUgcGFnZV9zaXplKTsKIGludCBwczNfbW1pb19yZWdpb25fY3JlYXRlKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpOwogaW50IHBzM19mcmVlX21taW9fcmVnaW9uKHN0cnVjdCBwczNfbW1pb19yZWdpb24gKnIpOwogdW5zaWduZWQgbG9uZyBwczNfbW1fcGh5c190b19scGFyKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKTsKQEAgLTE4NywxMSArMTk3LDEwIEBACiAJdW5zaWduZWQgaW50IGNsYXNzLCB1bnNpZ25lZCBpbnQgKnZpcnEpOwogaW50IHBzM19zcGVfaXJxX2Rlc3Ryb3kodW5zaWduZWQgaW50IHZpcnEpOwogCi1pbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9zZXR1cChlbnVtIHBzM19jcHVfYmluZGluZyBjcHUsCi0JY29uc3Qgc3RydWN0IHBzM19kZXZpY2VfaWQgKmRpZCwgdW5zaWduZWQgaW50IGludGVycnVwdF9pZCwKLQl1bnNpZ25lZCBpbnQgKnZpcnEpOwotaW50IHBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShjb25zdCBzdHJ1Y3QgcHMzX2RldmljZV9pZCAqZGlkLAotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQsIHVuc2lnbmVkIGludCB2aXJxKTsKK2ludCBwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X3NldHVwKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwllbnVtIHBzM19jcHVfYmluZGluZyBjcHUsIHVuc2lnbmVkIGludCAqdmlycSk7CitpbnQgcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgdmlycSk7CiAKIC8qIGx2MSByZXN1bHQgY29kZXMgKi8KIApAQCAtMjg5LDExICsyOTgsMzMgQEAKIC8qIHN5c3RlbSBidXMgcm91dGluZXMgKi8KIAogZW51bSBwczNfbWF0Y2hfaWQgewotCVBTM19NQVRDSF9JRF9FSENJID0gMSwKLQlQUzNfTUFUQ0hfSURfT0hDSSwKLQlQUzNfTUFUQ0hfSURfR0VMSUMsCi0JUFMzX01BVENIX0lEX0FWX1NFVFRJTkdTLAotCVBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiwKKwlQUzNfTUFUQ0hfSURfRUhDSSAgICAgICAgICAgPSAxLAorCVBTM19NQVRDSF9JRF9PSENJICAgICAgICAgICA9IDIsCisJUFMzX01BVENIX0lEX0dFTElDICAgICAgICAgID0gMywKKwlQUzNfTUFUQ0hfSURfQVZfU0VUVElOR1MgICAgPSA0LAorCVBTM19NQVRDSF9JRF9TWVNURU1fTUFOQUdFUiA9IDUsCisJUFMzX01BVENIX0lEX1NUT1JfRElTSyAgICAgID0gNiwKKwlQUzNfTUFUQ0hfSURfU1RPUl9ST00gICAgICAgPSA3LAorCVBTM19NQVRDSF9JRF9TVE9SX0ZMQVNIICAgICA9IDgsCisJUFMzX01BVENIX0lEX1NPVU5EICAgICAgICAgID0gOSwKKwlQUzNfTUFUQ0hfSURfR1JBUEhJQ1MgICAgICAgPSAxMCwKK307CisKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19FSENJICAgICAgICAgICAicHMzOjEiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfT0hDSSAgICAgICAgICAgInBzMzoyIgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX0dFTElDICAgICAgICAgICJwczM6MyIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19BVl9TRVRUSU5HUyAgICAicHMzOjQiCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1lTVEVNX01BTkFHRVIgInBzMzo1IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX1NUT1JfRElTSyAgICAgICJwczM6NiIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19TVE9SX1JPTSAgICAgICAicHMzOjciCisjZGVmaW5lIFBTM19NT0RVTEVfQUxJQVNfU1RPUl9GTEFTSCAgICAgInBzMzo4IgorI2RlZmluZSBQUzNfTU9EVUxFX0FMSUFTX1NPVU5EICAgICAgICAgICJwczM6OSIKKyNkZWZpbmUgUFMzX01PRFVMRV9BTElBU19HUkFQSElDUyAgICAgICAicHMzOjEwIgorCitlbnVtIHBzM19zeXN0ZW1fYnVzX2RldmljZV90eXBlIHsKKwlQUzNfREVWSUNFX1RZUEVfSU9DMCA9IDEsCisJUFMzX0RFVklDRV9UWVBFX1NCLAorCVBTM19ERVZJQ0VfVFlQRV9WVUFSVCwKIH07CiAKIC8qKgpAQCAtMzAyLDE0ICszMzMsMjMgQEAKIAogc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSB7CiAJZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQ7Ci0Jc3RydWN0IHBzM19kZXZpY2VfaWQgZGlkOwotCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7Ci0vKglzdHJ1Y3QgaW9tbXVfdGFibGUgKmlvbW11X3RhYmxlOyAtLSB3YWl0aW5nIGZvciBCZW4ncyBjbGVhbnVwcyAqLwotCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqZF9yZWdpb247Ci0Jc3RydWN0IHBzM19tbWlvX3JlZ2lvbiAqbV9yZWdpb247CisJZW51bSBwczNfc3lzdGVtX2J1c19kZXZpY2VfdHlwZSBkZXZfdHlwZTsKKworCXVuc2lnbmVkIGludCBidXNfaWQ7ICAgICAgICAgICAgICAvKiBTQiAqLworCXVuc2lnbmVkIGludCBkZXZfaWQ7ICAgICAgICAgICAgICAvKiBTQiAqLworCXVuc2lnbmVkIGludCBpbnRlcnJ1cHRfaWQ7ICAgICAgICAvKiBTQiAqLworCXN0cnVjdCBwczNfZG1hX3JlZ2lvbiAqZF9yZWdpb247ICAvKiBTQiwgSU9DMCAqLworCXN0cnVjdCBwczNfbW1pb19yZWdpb24gKm1fcmVnaW9uOyAvKiBTQiwgSU9DMCovCisJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOyAgICAgICAgIC8qIFZVQVJUICovCisKKy8qCXN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfdGFibGU7IC0tIHdhaXRpbmcgZm9yIEJlbkgncyBjbGVhbnVwcyAqLwogCXN0cnVjdCBkZXZpY2UgY29yZTsKKwl2b2lkICpkcml2ZXJfcHJpdjsgLyogcHJpdmF0ZSBkcml2ZXIgdmFyaWFibGVzICovCiB9OwogCitpbnQgcHMzX29wZW5faHZfZGV2aWNlKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldik7CitpbnQgcHMzX2Nsb3NlX2h2X2RldmljZShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYpOworCiAvKioKICAqIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgLSBhIGRyaXZlciBmb3IgYSBkZXZpY2Ugb24gdGhlIHN5c3RlbSBidXMKICAqLwpAQCAtMzE5LDYgKzM1OSw3IEBACiAJc3RydWN0IGRldmljZV9kcml2ZXIgY29yZTsKIAlpbnQgKCpwcm9iZSkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqKTsKIAlpbnQgKCpyZW1vdmUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CisJaW50ICgqc2h1dGRvd24pKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7CiAvKglpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7ICovCiAvKglpbnQgKCpyZXN1bWUpKHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKik7ICovCiB9OwpAQCAtMzI2LDE2ICszNjcsMjQgQEAKIGludCBwczNfc3lzdGVtX2J1c19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKIGludCBwczNfc3lzdGVtX2J1c19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2KTsKIHZvaWQgcHMzX3N5c3RlbV9idXNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqZHJ2KTsKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqdG9fcHMzX3N5c3RlbV9idXNfZHJpdmVyKAorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwczNfc3lzdGVtX2J1c19kcml2ZXIgKnBzM19kcnZfdG9fc3lzdGVtX2J1c19kcnYoCiAJc3RydWN0IGRldmljZV9kcml2ZXIgKl9kcnYpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihfZHJ2LCBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZHJpdmVyLCBjb3JlKTsKIH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqdG9fcHMzX3N5c3RlbV9idXNfZGV2aWNlKAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpwczNfZGV2X3RvX3N5c3RlbV9idXNfZGV2KAogCXN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlLCBjb3JlKTsKIH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RyaXZlciAqCisJcHMzX3N5c3RlbV9idXNfZGV2X3RvX3N5c3RlbV9idXNfZHJ2KHN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKl9kZXYpCit7CisJQlVHX09OKCFfZGV2KTsKKwlCVUdfT04oIV9kZXYtPmNvcmUuZHJpdmVyKTsKKwlyZXR1cm4gcHMzX2Rydl90b19zeXN0ZW1fYnVzX2RydihfZGV2LT5jb3JlLmRyaXZlcik7Cit9CiAKIC8qKgogICogcHMzX3N5c3RlbV9idXNfc2V0X2RydmRhdGEgLQpAQCAtMzU4LDMyICs0MDcsMTcgQEAKIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwczNfc3lzdGVtX2J1c190eXBlOwogCi0vKiB2dWFydCByb3V0aW5lcyAqLwotCi1zdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfcHJpdjsKLQotLyoqCi0gKiBzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlIC0gYSBkZXZpY2Ugb24gYSB2dWFydCBwb3J0Ci0gKi8KLQotc3RydWN0IHBzM192dWFydF9wb3J0X2RldmljZSB7Ci0JZW51bSBwczNfbWF0Y2hfaWQgbWF0Y2hfaWQ7Ci0Jc3RydWN0IGRldmljZSBjb3JlOwotCXN0cnVjdCBwczNfdnVhcnRfcG9ydF9wcml2KiBwcml2OyAvKiBwcml2YXRlIGRyaXZlciB2YXJpYWJsZXMgKi8KLQotfTsKLQotaW50IHBzM192dWFydF9wb3J0X2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYpOwotCiAvKiBzeXN0ZW0gbWFuYWdlciAqLwogCi0jaWZkZWYgQ09ORklHX1BTM19TWVNfTUFOQUdFUgotdm9pZCBwczNfc3lzX21hbmFnZXJfcmVzdGFydCh2b2lkKTsKK3N0cnVjdCBwczNfc3lzX21hbmFnZXJfb3BzIHsKKwlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXY7CisJdm9pZCAoKnBvd2VyX29mZikoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmVzdGFydCkoc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSAqZGV2KTsKK307CisKK3ZvaWQgcHMzX3N5c19tYW5hZ2VyX3JlZ2lzdGVyX29wcyhjb25zdCBzdHJ1Y3QgcHMzX3N5c19tYW5hZ2VyX29wcyAqb3BzKTsKIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3Bvd2VyX29mZih2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcHMzX3N5c19tYW5hZ2VyX3Jlc3RhcnQodm9pZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNfc3lzX21hbmFnZXJfcG93ZXJfb2ZmKHZvaWQpIHt9Ci0jZW5kaWYKK3ZvaWQgcHMzX3N5c19tYW5hZ2VyX3Jlc3RhcnQodm9pZCk7CiAKIHN0cnVjdCBwczNfcHJlYWxsb2MgewogICAgIGNvbnN0IGNoYXIgKm5hbWU7CkBAIC0zOTMsNSArNDI3LDcgQEAKIH07CiAKIGV4dGVybiBzdHJ1Y3QgcHMzX3ByZWFsbG9jIHBzM2ZiX3ZpZGVvbWVtb3J5OworZXh0ZXJuIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmxhc2hfYm91bmNlX2J1ZmZlcjsKKwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzYXYuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzYXYuaAppbmRleCA5ZWZjNDBmLi43ZGY0MjUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2F2LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNhdi5oCkBAIC0xLDIwICsxLDIzIEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFNvbnkgQ29tcHV0ZXIgRW50ZXJ0YWlubWVudCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwNiwgMjAwNyBTb255IENvcnBvcmF0aW9uCisgKiAgUFMzIEFWIGJhY2tlbmQgc3VwcG9ydC4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKLSAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqICBDb3B5cmlnaHQgMjAwNyBTb255IENvcnAuCiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgogICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCisKICNpZm5kZWYgX0FTTV9QT1dFUlBDX1BTM0FWX0hfCiAjZGVmaW5lIF9BU01fUE9XRVJQQ19QUzNBVl9IXwogCkBAIC0xNTksNiArMTYyLDkgQEAKICNkZWZpbmUgUFMzQVZfQ01EX1ZJREVPX0ZNVF9YOFI4RzhCOAkJCTB4MDAwMAogLyogdmlkZW9fb3V0X2Zvcm1hdCAqLwogI2RlZmluZSBQUzNBVl9DTURfVklERU9fT1VUX0ZPUk1BVF9SR0JfMTJCSVQJCTB4MDAwMAorLyogdmlkZW9fY2xfY252ICovCisjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19DTF9DTlZfRU5BQkxFX0xVVAkJMHgwMDAwCisjZGVmaW5lIFBTM0FWX0NNRF9WSURFT19DTF9DTlZfRElTQUJMRV9MVVQJCTB4MDAxMAogLyogdmlkZW9fc3luYyAqLwogI2RlZmluZSBQUzNBVl9DTURfVklERU9fU1lOQ19WU1lOQwkJCTB4MDAwMQogI2RlZmluZSBQUzNBVl9DTURfVklERU9fU1lOQ19DU1lOQwkJCTB4MDAwNApAQCAtMzExLDYgKzMxNyw4IEBACiAjZGVmaW5lIFBTM0FWX01PREVfTUFTSwkJCQkweDAwMEYKICNkZWZpbmUgUFMzQVZfTU9ERV9IRENQX09GRgkJCTB4MTAwMAkvKiBSZXRhaWwgUFMzIHByb2R1Y3QgZG9lc24ndCBzdXBwb3J0IHRoaXMgKi8KICNkZWZpbmUgUFMzQVZfTU9ERV9ESVRIRVIJCQkweDA4MDAKKyNkZWZpbmUgUFMzQVZfTU9ERV9DT0xPUgkJCTB4MDQwMAorI2RlZmluZSBQUzNBVl9NT0RFX1dISVRFCQkJMHgwMjAwCiAjZGVmaW5lIFBTM0FWX01PREVfRlVMTAkJCQkweDAwODAKICNkZWZpbmUgUFMzQVZfTU9ERV9EVkkJCQkJMHgwMDQwCiAjZGVmaW5lIFBTM0FWX01PREVfUkdCCQkJCTB4MDAyMApAQCAtNTI5LDkgKzUzNyw5IEBACiAJdTMyIHZpZGVvX291dF9mb3JtYXQ7CS8qIGluOiBvdXQgZm9ybWF0ICovCiAJdTMyIHZpZGVvX2Zvcm1hdDsJLyogaW46IGlucHV0IGZyYW1lIGJ1ZmZlciBmb3JtYXQgKi8KIAl1OCByZXNlcnZlZDM7Ci0JdTggcmVzZXJ2ZWQ0OworCXU4IHZpZGVvX2NsX2NudjsJLyogaW46IGNvbG9yIGNvbnZlcnNpb24gKi8KIAl1MTYgdmlkZW9fb3JkZXI7CS8qIGluOiBpbnB1dCBSR0Igb3JkZXIgKi8KLQl1MzIgcmVzZXJ2ZWQ1OworCXUzMiByZXNlcnZlZDQ7CiB9OwogCiAvKiB2aWRlbzogZm9ybWF0ICovCkBAIC01MzksNyArNTQ3LDggQEAKIAlzdHJ1Y3QgcHMzYXZfc2VuZF9oZHIgc2VuZF9oZHI7CiAJdTMyIHZpZGVvX2hlYWQ7CQkvKiBpbjogaGVhZCAqLwogCXUzMiB2aWRlb19mb3JtYXQ7CS8qIGluOiBmcmFtZSBidWZmZXIgZm9ybWF0ICovCi0JdTE2IHJlc2VydmVkOworCXU4IHJlc2VydmVkOworCXU4IHZpZGVvX2NsX2NudjsJLyogaW46IGNvbG9yIGNvbnZlcnNpb24gKi8KIAl1MTYgdmlkZW9fb3JkZXI7CS8qIGluOiBpbnB1dCBSR0Igb3JkZXIgKi8KIH07CiAKQEAgLTY5OCwxMiArNzA3LDYgQEAKIGV4dGVybiBpbnQgcHMzYXZfY21kX3ZpZGVvX2dldF9tb25pdG9yX2luZm8oc3RydWN0IHBzM2F2X3BrdF9hdl9nZXRfbW9uaXRvcl9pbmZvICosCiAJCQkJCSAgICB1MzIpOwogCi1zdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlOwotZXh0ZXJuIGludCBwczNhdl92dWFydF93cml0ZShzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsCi0JCQkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiBpbnQgcHMzYXZfdnVhcnRfcmVhZChzdHJ1Y3QgcHMzX3Z1YXJ0X3BvcnRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1ZiwKLQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCB0aW1lb3V0KTsKLQogZXh0ZXJuIGludCBwczNhdl9zZXRfdmlkZW9fbW9kZSh1MzIsIGludCk7CiBleHRlcm4gaW50IHBzM2F2X3NldF9hdWRpb19tb2RlKHUzMiwgdTMyLCB1MzIsIHUzMiwgdTMyKTsKIGV4dGVybiBpbnQgcHMzYXZfZ2V0X2F1dG9fbW9kZShpbnQpOwpAQCAtNzE2LDUgKzcxOSw4IEBACiBleHRlcm4gaW50IHBzM2F2X2F1ZGlvX211dGUoaW50KTsKIGV4dGVybiBpbnQgcHMzYXZfZGV2X29wZW4odm9pZCk7CiBleHRlcm4gaW50IHBzM2F2X2Rldl9jbG9zZSh2b2lkKTsKK2V4dGVybiB2b2lkIHBzM2F2X3JlZ2lzdGVyX2ZsaXBfY3RsKHZvaWQgKCpmbGlwX2N0bCkoaW50IG9uLCB2b2lkICpkYXRhKSwKKwkJCQkgICAgdm9pZCAqZmxpcF9kYXRhKTsKK2V4dGVybiB2b2lkIHBzM2F2X2ZsaXBfY3RsKGludCBvbik7CiAKICNlbmRpZgkvKiBfQVNNX1BPV0VSUENfUFMzQVZfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzZmIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHMzZmIuaAppbmRleCBhZDgxY2Y0Li4zZjEyMWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM2ZiLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNmYi5oCkBAIC00MSwxNiArNDEsNCBAQAogCV9fdTMyIG51bV9mcmFtZXM7IC8qIG51bSBvZiBmcmFtZSBidWZmZXJzICovCiB9OwogCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaWZkZWYgQ09ORklHX0ZCX1BTMwotZXh0ZXJuIHZvaWQgcHMzZmJfZmxpcF9jdGwoaW50IG9uKTsKLWV4dGVybiB2b2lkIHBzM2ZiX2NsZWFudXAodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHBzM2ZiX2ZsaXBfY3RsKGludCBvbikge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBwczNmYl9jbGVhbnVwKHZvaWQpIHt9Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19QUzNGQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNzdG9yLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BzM3N0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmNhZjcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wczNzdG9yLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIFBTMyBTdG9yYWdlIERldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgU29ueSBDb21wdXRlciBFbnRlcnRhaW5tZW50IEluYy4KKyAqIENvcHlyaWdodCAyMDA3IFNvbnkgQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaWZuZGVmIF9BU01fUE9XRVJQQ19QUzNTVE9SX0hfCisjZGVmaW5lIF9BU01fUE9XRVJQQ19QUzNTVE9SX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9wczMuaD4KKworCitzdHJ1Y3QgcHMzX3N0b3JhZ2VfcmVnaW9uIHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdTY0IHN0YXJ0OworCXU2NCBzaXplOworfTsKKworc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSB7CisJc3RydWN0IHBzM19zeXN0ZW1fYnVzX2RldmljZSBzYmQ7CisKKwlzdHJ1Y3QgcHMzX2RtYV9yZWdpb24gZG1hX3JlZ2lvbjsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXU2NCBibGtfc2l6ZTsKKworCXU2NCB0YWc7CisJdTY0IGx2MV9zdGF0dXM7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKworCXVuc2lnbmVkIGxvbmcgYm91bmNlX3NpemU7CisJdm9pZCAqYm91bmNlX2J1ZjsKKwl1NjQgYm91bmNlX2xwYXI7CisJZG1hX2FkZHJfdCBib3VuY2VfZG1hOworCisJdW5zaWduZWQgaW50IG51bV9yZWdpb25zOworCXVuc2lnbmVkIGxvbmcgYWNjZXNzaWJsZV9yZWdpb25zOworCXVuc2lnbmVkIGludCByZWdpb25faWR4OwkJLyogZmlyc3QgYWNjZXNzaWJsZSByZWdpb24gKi8KKwlzdHJ1Y3QgcHMzX3N0b3JhZ2VfcmVnaW9uIHJlZ2lvbnNbMF07CS8qIE11c3QgYmUgbGFzdCAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICp0b19wczNfc3RvcmFnZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlLCBzYmQuY29yZSk7Cit9CisKK2V4dGVybiBpbnQgcHMzc3Rvcl9zZXR1cChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsCisJCQkgaXJxX2hhbmRsZXJfdCBoYW5kbGVyKTsKK2V4dGVybiB2b2lkIHBzM3N0b3JfdGVhcmRvd24oc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2KTsKK2V4dGVybiB1NjQgcHMzc3Rvcl9yZWFkX3dyaXRlX3NlY3RvcnMoc3RydWN0IHBzM19zdG9yYWdlX2RldmljZSAqZGV2LCB1NjQgbHBhciwKKwkJCQkgICAgICB1NjQgc3RhcnRfc2VjdG9yLCB1NjQgc2VjdG9ycywKKwkJCQkgICAgICBpbnQgd3JpdGUpOworZXh0ZXJuIHU2NCBwczNzdG9yX3NlbmRfY29tbWFuZChzdHJ1Y3QgcHMzX3N0b3JhZ2VfZGV2aWNlICpkZXYsIHU2NCBjbWQsCisJCQkJdTY0IGFyZzEsIHU2NCBhcmcyLCB1NjQgYXJnMywgdTY0IGFyZzQpOworCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BTM1NUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCmluZGV4IDRhZDc3YTEuLjEzZmNjYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaApAQCAtOTIsNiArOTIsMTEgQEAKIAkJc2V0X3RocmVhZF9mbGFnKFRJRl9OT0VSUk9SKTsgXAogCX0gd2hpbGUoMCkKIAorc3RydWN0IHRhc2tfc3RydWN0OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcHRyYWNlX2dldF9yZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgcmVnbm8pOworZXh0ZXJuIGludCBwdHJhY2VfcHV0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubywKKwkJCSAgdW5zaWduZWQgbG9uZyBkYXRhKTsKKwogLyoKICAqIFdlIHVzZSB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSB0cmFwIGZpZWxkIHRvIGluZGljYXRlCiAgKiB3aGV0aGVyIHdlIGhhdmUgc2F2ZWQgdGhlIGZ1bGwgc2V0IG9mIHJlZ2lzdGVycywgb3Igb25seSBhCkBAIC0xNTgsOSArMTYzLDcgQEAKIAogI2RlZmluZSBQVF9OSVAJMzIKICNkZWZpbmUgUFRfTVNSCTMzCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBQVF9PUklHX1IzIDM0Ci0jZW5kaWYKICNkZWZpbmUgUFRfQ1RSCTM1CiAjZGVmaW5lIFBUX0xOSwkzNgogI2RlZmluZSBQVF9YRVIJMzcKQEAgLTE2OSwxMSArMTcyLDEyIEBACiAjZGVmaW5lIFBUX01RCTM5CiAjZWxzZQogI2RlZmluZSBQVF9TT0ZURSAzOQorI2VuZGlmCiAjZGVmaW5lIFBUX1RSQVAJNDAKICNkZWZpbmUgUFRfREFSCTQxCiAjZGVmaW5lIFBUX0RTSVNSIDQyCiAjZGVmaW5lIFBUX1JFU1VMVCA0MwotI2VuZGlmCisjZGVmaW5lIFBUX1JFR1NfQ09VTlQgNDQKIAogI2RlZmluZSBQVF9GUFIwCTQ4CS8qIGVhY2ggRlAgcmVnIG9jY3VwaWVzIDIgc2xvdHMgaW4gdGhpcyBzcGFjZSAqLwogCkBAIC0yMjksNyArMjMzLDE3IEBACiAjZGVmaW5lIFBUUkFDRV9HRVRfREVCVUdSRUcJMjUKICNkZWZpbmUgUFRSQUNFX1NFVF9ERUJVR1JFRwkyNgogCi0vKiBBZGRpdGlvbmFsIFBUUkFDRSByZXF1ZXN0cyBpbXBsZW1lbnRlZCBvbiBQb3dlclBDLiAqLworLyogKG5ldykgUFRSQUNFIHJlcXVlc3RzIHVzaW5nIHRoZSBzYW1lIG51bWJlcnMgYXMgeDg2IGFuZCB0aGUgc2FtZQorICogYXJndW1lbnQgb3JkZXJpbmcuIEFkZGl0aW9uYWxseSwgdGhleSBzdXBwb3J0IG1vcmUgcmVnaXN0ZXJzIHRvbworICovCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTICAgICAgICAgICAgMTIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1MgICAgICAgICAgICAxMworI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTICAgICAgICAgIDE0CisjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgICAgICAgICAgMTUKKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1M2NAkgIDIyCisjZGVmaW5lIFBUUkFDRV9TRVRSRUdTNjQJICAyMworCisvKiAob2xkKSBQVFJBQ0UgcmVxdWVzdHMgd2l0aCBpbnZlcnRlZCBhcmd1bWVudHMgKi8KICNkZWZpbmUgUFBDX1BUUkFDRV9HRVRSRUdTCTB4OTkJLyogR2V0IEdQUnMgMCAtIDMxICovCiAjZGVmaW5lIFBQQ19QVFJBQ0VfU0VUUkVHUwkweDk4CS8qIFNldCBHUFJzIDAgLSAzMSAqLwogI2RlZmluZSBQUENfUFRSQUNFX0dFVEZQUkVHUwkweDk3CS8qIEdldCBGUFJzIDAgLSAzMSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKaW5kZXggNzQ5YzdmOS4uMjgxMDExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCkBAIC00NTMsNiArNDUzLDggQEAKICNkZWZpbmUgU1BSTl9NTUNSQQkweDMxMgogI2RlZmluZSAgIE1NQ1JBX1NJSFYJMHgxMDAwMDAwMFVMIC8qIHN0YXRlIG9mIE1TUiBIViB3aGVuIFNJQVIgc2V0ICovCiAjZGVmaW5lICAgTU1DUkFfU0lQUgkweDA4MDAwMDAwVUwgLyogc3RhdGUgb2YgTVNSIFBSIHdoZW4gU0lBUiBzZXQgKi8KKyNkZWZpbmUgICBNTUNSQV9TTE9UCTB4MDcwMDAwMDBVTCAvKiBTTE9UIGJpdHMgKDM3LTM5KSAqLworI2RlZmluZSAgIE1NQ1JBX1NMT1RfU0hJRlQJMjQKICNkZWZpbmUgICBNTUNSQV9TQU1QTEVfRU5BQkxFIDB4MDAwMDAwMDFVTCAvKiBlbmFibGUgc2FtcGxpbmcgKi8KICNkZWZpbmUgICBQT1dFUjZfTU1DUkFfU0lIViAgIDB4MDAwMDA0MDAwMDAwMDAwMFVMTAogI2RlZmluZSAgIFBPV0VSNl9NTUNSQV9TSVBSICAgMHgwMDAwMDIwMDAwMDAwMDAwVUxMCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaAppbmRleCAzMWQ1MDU0Li5lZWRjODI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKQEAgLTEwNiw2ICsxMDYsMTQgQEAKIHN0cnVjdCBzcHVfcnVucXVldWU7CiBzdHJ1Y3QgZGV2aWNlX25vZGU7CiAKK2VudW0gc3B1X3V0aWxpemF0aW9uX3N0YXRlIHsKKwlTUFVfVVRJTF9TWVNURU0sCisJU1BVX1VUSUxfVVNFUiwKKwlTUFVfVVRJTF9JT1dBSVQsCisJU1BVX1VUSUxfSURMRSwKKwlTUFVfVVRJTF9NQVgKK307CisKIHN0cnVjdCBzcHUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdW5zaWduZWQgbG9uZyBsb2NhbF9zdG9yZV9waHlzOwpAQCAtMTU2LDYgKzE2NCwyMSBAQAogCXU2NCBzaGFkb3dfaW50X21hc2tfUldbM107CiAKIAlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7CisKKwlzdHJ1Y3QgeworCQkvKiBwcm90ZWN0ZWQgYnkgaW50ZXJydXB0IHJlZW50cmFuY3kgKi8KKwkJZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgdXRpbGl6YXRpb25fc3RhdGU7CisJCXVuc2lnbmVkIGxvbmcgdHN0YW1wOwkJLyogdGltZSBvZiBsYXN0IGN0eCBzd2l0Y2ggKi8KKwkJdW5zaWduZWQgbG9uZyB0aW1lc1tTUFVfVVRJTF9NQVhdOworCQl1bnNpZ25lZCBsb25nIGxvbmcgdm9sX2N0eF9zd2l0Y2g7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnZvbF9jdHhfc3dpdGNoOworCQl1bnNpZ25lZCBsb25nIGxvbmcgbWluX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG1hal9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBoYXNoX2ZsdDsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHNsYl9mbHQ7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBjbGFzczJfaW50cjsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGxpYmFzc2lzdDsKKwl9IHN0YXRzOwogfTsKIAogc3RydWN0IHNwdSAqc3B1X2FsbG9jKHZvaWQpOwpAQCAtNDQ4LDYgKzQ3MSw3IEBACiAjZGVmaW5lIE1GQ19TVEFURTFfUFJPQkxFTV9TVEFURV9NQVNLCQkweDA4dWxsCiAjZGVmaW5lIE1GQ19TVEFURTFfUkVMT0NBVEVfTUFTSwkJMHgxMHVsbAogI2RlZmluZSBNRkNfU1RBVEUxX01BU1RFUl9SVU5fQ09OVFJPTF9NQVNLCTB4MjB1bGwKKyNkZWZpbmUgTUZDX1NUQVRFMV9UQUJMRV9TRUFSQ0hfTUFTSwkJMHg0MHVsbAogCXU2NCBtZmNfbHBpZF9SVzsJCQkJCS8qIDB4MDA4ICovCiAJdTY0IHNwdV9pZHJfUlc7CQkJCQkJLyogMHgwMTAgKi8KIAl1NjQgbWZjX3ZyX1JPOwkJCQkJCS8qIDB4MDE4ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c2NhbGxzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c2NhbGxzLmgKaW5kZXggYzJmZTc5ZC4uYjNjYTQxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzY2FsbHMuaApAQCAtNDMsMTYgKzQzLDkgQEAKIAogYXNtbGlua2FnZSBsb25nIHN5c19ydF9zaWdzdXNwZW5kKHNpZ3NldF90IF9fdXNlciAqdW5ld3NldCwKIAkJc2l6ZV90IHNpZ3NldHNpemUpOwotCi0jaWZuZGVmIF9fcG93ZXJwYzY0X18KLWFzbWxpbmthZ2UgbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywKLQkJc3RhY2tfdCBfX3VzZXIgKnVvc3MsIGludCByNSwgaW50IHI2LCBpbnQgcjcsIGludCByOCwKLQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotI2Vsc2UgLyogX19wb3dlcnBjNjRfXyAqLwogYXNtbGlua2FnZSBsb25nIHN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqdXNzLAogCQlzdGFja190IF9fdXNlciAqdW9zcywgdW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyByNiwKIAkJdW5zaWduZWQgbG9uZyByNywgdW5zaWduZWQgbG9uZyByOCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9QT1dFUlBDX1NZU0NBTExTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCmluZGV4IDA5NjIxZjYuLjMyYWE0MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaApAQCAtNDMsNyArNDMsNyBAQAogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgc21wX21iKCkJbWIoKQogI2RlZmluZSBzbXBfcm1iKCkJcm1iKCkKLSNkZWZpbmUgc21wX3dtYigpCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBzbXBfd21iKCkJZWllaW8oKQogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCiAjZWxzZQogI2RlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKQEAgLTU1OSw1ICs1NTksNyBAQAogZXh0ZXJuIHZvaWQgYWNjb3VudF9zeXN0ZW1fdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICopOwogI2VuZGlmCiAKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpwb3dlcnBjX2RlYnVnZnNfcm9vdDsKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGVybWJpdHMuaAppbmRleCA1ZTc5MTk4Li42Njk4MTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Rlcm1iaXRzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90ZXJtYml0cy5oCkBAIC0xNTIsNiArMTUyLDEwIEBACiAjZGVmaW5lIEIzMDAwMDAwICAwMDAzNAogI2RlZmluZSBCMzUwMDAwMCAgMDAwMzUKICNkZWZpbmUgQjQwMDAwMDAgIDAwMDM2CisjZGVmaW5lICAgQk9USEVSICAwMDAzNworCisjZGVmaW5lIENJQkFVRAkwNzc2MDAwMDAKKyNkZWZpbmUgSUJTSElGVAkxNgkJLyogU2hpZnQgZnJvbSBDQkFVRCB0byBDSUJBVUQgKi8KIAogI2RlZmluZSBDU0laRQkwMDAwMTQwMAogI2RlZmluZSAgIENTNQkwMDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90aHJlYWRfaW5mby5oCmluZGV4IDNmMzJjYTguLjlkOWFlY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RocmVhZF9pbmZvLmgKQEAgLTExMyw4ICsxMTMsOCBAQAogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJNAkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcKIAkJCQkJICAgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfMzJCSVQJCTUJLyogMzIgYml0IGJpbmFyeSAqLwotI2RlZmluZSBUSUZfUlVOTEFUQ0gJCTYJLyogSXMgdGhlIHJ1bmxhdGNoIGVuYWJsZWQ/ICovCi0jZGVmaW5lIFRJRl9BQklfUEVORElORwkJNwkvKiAzMi82NCBiaXQgc3dpdGNoIG5lZWRlZCAqLworI2RlZmluZSBUSUZfUEVSRk1PTl9XT1JLCTYJLyogd29yayBmb3IgcGZtX2hhbmRsZV93b3JrKCkgKi8KKyNkZWZpbmUgVElGX1BFUkZNT05fQ1RYU1cJNwkvKiBwZXJmbW9uIG5lZWRzIGN0eHN3IGNhbGxzICovCiAjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTgJLyogc3lzY2FsbCBhdWRpdGluZyBhY3RpdmUgKi8KICNkZWZpbmUgVElGX1NJTkdMRVNURVAJCTkJLyogc2luZ2xlc3RlcHBpbmcgYWN0aXZlICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTEwCkBAIC0xMjMsNiArMTIzLDggQEAKICNkZWZpbmUgVElGX05PRVJST1IJCTE0CS8qIEZvcmNlIHN1Y2Nlc3NmdWwgc3lzY2FsbCByZXR1cm4gKi8KICNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwkxNQkvKiBSZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCAqLwogI2RlZmluZSBUSUZfRlJFRVpFCQkxNgkvKiBGcmVlemluZyBmb3Igc3VzcGVuZCAqLworI2RlZmluZSBUSUZfUlVOTEFUQ0gJCTE3CS8qIElzIHRoZSBydW5sYXRjaCBlbmFibGVkPyAqLworI2RlZmluZSBUSUZfQUJJX1BFTkRJTkcJCTE4CS8qIDMyLzY0IGJpdCBzd2l0Y2ggbmVlZGVkICovCiAKIC8qIGFzIGFib3ZlLCBidXQgYXMgYml0IHZhbHVlcyAqLwogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDE8PFRJRl9TWVNDQUxMX1RSQUNFKQpAQCAtMTMxLDggKzEzMyw4IEBACiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfMzJCSVQJCSgxPDxUSUZfMzJCSVQpCi0jZGVmaW5lIF9USUZfUlVOTEFUQ0gJCSgxPDxUSUZfUlVOTEFUQ0gpCi0jZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKKyNkZWZpbmUgX1RJRl9QRVJGTU9OX1dPUksJKDE8PFRJRl9QRVJGTU9OX1dPUkspCisjZGVmaW5lIF9USUZfUEVSRk1PTl9DVFhTVwkoMTw8VElGX1BFUkZNT05fQ1RYU1cpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU0lOR0xFU1RFUAkJKDE8PFRJRl9TSU5HTEVTVEVQKQogI2RlZmluZSBfVElGX1NFQ0NPTVAJCSgxPDxUSUZfU0VDQ09NUCkKQEAgLTE0MCw2ICsxNDIsOCBAQAogI2RlZmluZSBfVElGX05PRVJST1IJCSgxPDxUSUZfTk9FUlJPUikKICNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMTw8VElGX0ZSRUVaRSkKKyNkZWZpbmUgX1RJRl9SVU5MQVRDSAkJKDE8PFRJRl9SVU5MQVRDSCkKKyNkZWZpbmUgX1RJRl9BQklfUEVORElORwkoMTw8VElGX0FCSV9QRU5ESU5HKQogI2RlZmluZSBfVElGX1NZU0NBTExfVF9PUl9BCShfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TWVNDQUxMX0FVRElUfF9USUZfU0VDQ09NUCkKIAogI2RlZmluZSBfVElGX1VTRVJfV09SS19NQVNLCShfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcgfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RpbWUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCmluZGV4IDNmZDU3YzAuLmQ3ZjVkZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGltZS5oCkBAIC0yMzIsNyArMjMyLDcgQEAKICNkZWZpbmUgYWNjb3VudF9wcm9jZXNzX3Z0aW1lKHRzaykJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORykgJiYgZGVmaW5lZChDT05GSUdfUFBDX1NQTFBBUikKKyNpZiBkZWZpbmVkKENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HKQogZXh0ZXJuIHZvaWQgY2FsY3VsYXRlX3N0ZWFsX3RpbWUodm9pZCk7CiBleHRlcm4gdm9pZCBzbmFwc2hvdF90aW1lYmFzZXModm9pZCk7CiAjZWxzZQpAQCAtMjQwLDUgKzI0MCw3IEBACiAjZGVmaW5lIHNuYXBzaG90X3RpbWViYXNlcygpCQkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKK2V4dGVybiB2b2lkIGlTZXJpZXNfdGltZV9pbml0X2Vhcmx5KHZvaWQpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fUE9XRVJQQ19USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdGxiZmx1c2guaAppbmRleCA4NmU2MjY2Li45OWEwNDM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90bGJmbHVzaC5oCkBAIC0xNTUsNiArMTU1LDExIEBACiB7CiB9CiAKKy8qIFByaXZhdGUgZnVuY3Rpb24gZm9yIHVzZSBieSBQQ0kgSU8gbWFwcGluZyBjb2RlICovCitleHRlcm4gdm9pZCBfX2ZsdXNoX2hhc2hfdGFibGVfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZCk7CisKKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tcHBjL3BndGFibGUuaAppbmRleCA5ZDBjZTlmLi5jMTU5MzE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmgKQEAgLTUzMyw5ICs1MzMsNyBAQAogICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9VU0VSOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUM7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CkBAIC01NDMsMjEgKzU0MSwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV91bmNhY2hlKHB0ZV90IHB0ZSkgICAgICAgeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfTk9fQ0FDSEU7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfY2FjaGUocHRlX3QgcHRlKSAgICAgICAgIHsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9OT19DQUNIRTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKSB7Ci0JcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKSB7CiAJcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcgfCBfUEFHRV9IV1dSSVRFKTsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSAmPSB+X1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfihfUEFHRV9ESVJUWSB8IF9QQUdFX0hXV1JJVEUpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpIHsKLQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkgewotCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9VU0VSIHwgX1BBR0VfRVhFQzsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpIHsKIAlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUlc7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKSB7CkBAIC02NjQsMTMgKzY1NCw2IEBACiAjZGVmaW5lIHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoX192bWEsIF9fYWRkciwgX19wdGVwKSBcCiAJX19wdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKChfX3ZtYSktPnZtX21tLT5jb250ZXh0LmlkLCBfX2FkZHIsIF9fcHRlcCkKIAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi1zdGF0aWMgaW5saW5lIGludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlyZXR1cm4gKHB0ZV91cGRhdGUocHRlcCwgKF9QQUdFX0RJUlRZIHwgX1BBR0VfSFdXUklURSksIDApICYgX1BBR0VfRElSVFkpICE9IDA7Ci19Ci0KICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCSAgICAgICBwdGVfdCAqcHRlcCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmggYi9pbmNsdWRlL2FzbS1zMzkwL2NvbXBhdC5oCmluZGV4IDI5NmY0ZjEuLjdmNGFkNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9jb21wYXQuaApAQCAtNjAsOCArNjAsMTAgQEAKIAogdHlwZWRlZiBzMzIJCWNvbXBhdF9pbnRfdDsKIHR5cGVkZWYgczMyCQljb21wYXRfbG9uZ190OwordHlwZWRlZiBzNjQJCWNvbXBhdF9zNjQ7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3VpbnRfdDsKIHR5cGVkZWYgdTMyCQljb21wYXRfdWxvbmdfdDsKK3R5cGVkZWYgdTY0CQljb21wYXRfdTY0OwogCiBzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHsKIAljb21wYXRfdGltZV90CXR2X3NlYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZG1hLW1hcHBpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YzEyZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2RtYS1tYXBwaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKgotICogIGluY2x1ZGUvYXNtLXMzOTAvZG1hLW1hcHBpbmcuaAotICoKLSAqICBTMzkwIHZlcnNpb24KLSAqCi0gKiAgVGhpcyBmaWxlIGV4aXN0cyBzbyB0aGF0ICNpbmNsdWRlIDxkbWEtbWFwcGluZy5oPiBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLgotICovCi0KLSNpZm5kZWYgX0FTTV9ETUFfTUFQUElOR19ICi0jZGVmaW5lIF9BU01fRE1BX01BUFBJTkdfSAotCi0jZW5kaWYgLyogX0FTTV9ETUFfTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2ZiLmggYi9pbmNsdWRlL2FzbS1zMzkwL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wYWdlLmggYi9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaAppbmRleCAwNWVhNmYxLi5mMzI2NDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3BhZ2UuaApAQCAtNjQsNyArNjQsOCBAQAogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKIAotI2RlZmluZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIHZhZGRyKSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIgfCBfX0dGUF9aRVJPLCB2bWEsIHZhZGRyKQorI2RlZmluZSBfX2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikgXAorCWFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBtb3ZhYmxlZmxhZ3MsIHZtYSwgdmFkZHIpCiAjZGVmaW5lIF9fSEFWRV9BUkNIX0FMTE9DX1pFUk9FRF9VU0VSX0hJR0hQQUdFCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGd0YWJsZS5oCmluZGV4IDBhMzA3YmIyLi4zMjA4ZGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3BndGFibGUuaApAQCAtNTMwLDE0ICs1MzAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JLyogQWxsIHBhZ2VzIGFyZSByZWFkYWJsZSBzaW5jZSB3ZSBkb24ndCB1c2UgdGhlIGZldGNoCi0JICogcHJvdGVjdGlvbiBiaXQgaW4gdGhlIHN0b3JhZ2Uga2V5LgotCSAqLwotCXJldHVybiAxOwotfQotCiAvKgogICogcGdkL3BtZC9wdGUgbW9kaWZpY2F0aW9uIGZ1bmN0aW9ucwogICovCkBAIC02NzcsMTkgKzY2OSw2IEBACiAJcmV0dXJuIHB0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcodm1hLCBhZGRyZXNzLCBwdGVwKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXB0ZXBfY2xlYXJfZmx1c2hfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQotewotCS8qIE5vIG5lZWQgdG8gZmx1c2ggVExCOyBiaXRzIGFyZSBpbiBzdG9yYWdlIGtleSAqLwotCXJldHVybiBwdGVwX3Rlc3RfYW5kX2NsZWFyX2RpcnR5KHZtYSwgYWRkcmVzcywgcHRlcCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQogewogCXB0ZV90IHB0ZSA9ICpwdGVwOwpAQCAtNzE1LDE2ICs2OTQsMTkgQEAKIAlwdGVfdmFsKCpwdGVwKSA9IF9QQUdFX1RZUEVfRU1QVFk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgcHRlX3QKLXB0ZXBfY2xlYXJfZmx1c2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIHB0ZXBfaW52YWxpZGF0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQoreworCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOworCXB0ZXAgPSBnZXRfc2hhZG93X3B0ZShwdGVwKTsKKwlpZiAocHRlcCkKKwkJX19wdGVwX2lwdGUoYWRkcmVzcywgcHRlcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApCiB7CiAJcHRlX3QgcHRlID0gKnB0ZXA7Ci0JcHRlX3QgKnNoYWRvd19wdGUgPSBnZXRfc2hhZG93X3B0ZShwdGVwKTsKLQotCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZXApOwotCWlmIChzaGFkb3dfcHRlKQotCQlfX3B0ZXBfaXB0ZShhZGRyZXNzLCBzaGFkb3dfcHRlKTsKKwlwdGVwX2ludmFsaWRhdGUoYWRkcmVzcywgcHRlcCk7CiAJcmV0dXJuIHB0ZTsKIH0KIApAQCAtNzM0LDIxICs3MTYsMTQgQEAKIAlzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGVwLCBwdGVfd3Jwcm90ZWN0KG9sZF9wdGUpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1wdGVwX2VzdGFibGlzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsCi0JICAgICAgIHB0ZV90IGVudHJ5KQotewotCXB0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyZXNzLCBwdGVwKTsKLQlzZXRfcHRlKHB0ZXAsIGVudHJ5KTsKLX0KLQotI2RlZmluZSBwdGVwX3NldF9hY2Nlc3NfZmxhZ3MoX192bWEsIF9fYWRkcmVzcywgX19wdGVwLCBfX2VudHJ5LCBfX2RpcnR5KSBcCi0oewkJCQkJCQkJCSAgXAotCWludCBfX2NoYW5nZWQgPSAhcHRlX3NhbWUoKihfX3B0ZXApLCBfX2VudHJ5KTsJCQkgIFwKLQlpZiAoX19jaGFuZ2VkKQkJCQkJCQkgIFwKLQkJcHRlcF9lc3RhYmxpc2goX192bWEsIF9fYWRkcmVzcywgX19wdGVwLCBfX2VudHJ5KTsJICBcCi0JX19jaGFuZ2VkOwkJCQkJCQkgIFwKKyNkZWZpbmUgcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKF9fdm1hLCBfX2FkZHIsIF9fcHRlcCwgX19lbnRyeSwgX19kaXJ0eSkJXAorKHsJCQkJCQkJCQlcCisJaW50IF9fY2hhbmdlZCA9ICFwdGVfc2FtZSgqKF9fcHRlcCksIF9fZW50cnkpOwkJCVwKKwlpZiAoX19jaGFuZ2VkKSB7CQkJCQkJXAorCQlwdGVwX2ludmFsaWRhdGUoX19hZGRyLCBfX3B0ZXApOwkJCVwKKwkJc2V0X3B0ZV9hdCgoX192bWEpLT52bV9tbSwgX19hZGRyLCBfX3B0ZXAsIF9fZW50cnkpOwlcCisJfQkJCQkJCQkJXAorCV9fY2hhbmdlZDsJCQkJCQkJXAogfSkKIAogLyoKQEAgLTk0OCwxMiArOTIzLDkgQEAKICNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNTUFQX0lOSVQKIGV4dGVybiB2b2lkIG1lbW1hcF9pbml0KHVuc2lnbmVkIGxvbmcsIGludCwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9FU1RBQkxJU0gKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfQUNDRVNTX0ZMQUdTCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9DTEVBUl9ZT1VOR19GTFVTSAotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRElSVFlfRkxVU0gKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfQ0xFQVJfRkxVU0gKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9idWdzLmggYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKaW5kZXggNWExMTdlYy4uYWVlZThkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYnVncy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaApAQCAtMjIsNyArMjIsNyBAQAogCWN1cnJlbnRfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5ID0gbG9vcHNfcGVyX2ppZmZ5OwogCiAJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLnR5cGUpIHsKLQljYXNlIENQVV9TSDc2MDQgLi4uIENQVV9TSDc2MTk6CisJY2FzZSBDUFVfU0g3NjE5OgogCQkqcCsrID0gJzInOwogCQlicmVhazsKIAljYXNlIENQVV9TSDcyMDY6CkBAIC0zNSw3ICszNSw3IEBACiAJY2FzZSBDUFVfU0g3NzUwIC4uLiBDUFVfU0g0XzUwMToKIAkJKnArKyA9ICc0JzsKIAkJYnJlYWs7Ci0JY2FzZSBDUFVfU0g3NzcwIC4uLiBDUFVfU0g3Nzg1OgorCWNhc2UgQ1BVX1NINzc3MCAuLi4gQ1BVX1NIWDM6CiAJCSpwKysgPSAnNCc7CiAJCSpwKysgPSAnYSc7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmgKaW5kZXggOWEzY2I2Yi4uN2ExODY0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBfX0FTTV9TSF9DQUNIRV9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9jcHUvY2FjaGUuaD4KIAogI2RlZmluZSBTSF9DQUNIRV9WQUxJRAkJMQpAQCAtNDgsNiArNDksOSBAQAogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIH07CisKK2ludCBfX2luaXQgZGV0ZWN0X2NwdV9hbmRfY2FjaGVfc3lzdGVtKHZvaWQpOworCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvY2FjaGUuaAppbmRleCAyMGI5Nzk2Li5mMDJiYTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gyL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9jYWNoZS5oCkBAIC0xMiwyMyArMTIsNyBAQAogCiAjZGVmaW5lIEwxX0NBQ0hFX1NISUZUCTQKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCkKLSNkZWZpbmUgQ0NSCQkweGZmZmZmZTkyCS8qIEFkZHJlc3Mgb2YgQ2FjaGUgQ29udHJvbCBSZWdpc3RlciAqLwotCi0jZGVmaW5lIENDUl9DQUNIRV9DRQkweDAxCS8qIENhY2hlIGVuYWJsZSAqLwotI2RlZmluZSBDQ1JfQ0FDSEVfSUQJMHgwMgkvKiBJbnN0cnVjdGlvbiBSZXBsYWNlbWVudCBkaXNhYmxlICovCi0jZGVmaW5lIENDUl9DQUNIRV9PRAkweDA0CS8qIERhdGEgUmVwbGFjZW1lbnQgZGlzYWJsZSAqLwotI2RlZmluZSBDQ1JfQ0FDSEVfVFcJMHgwOAkvKiBUd28td2F5IG1vZGUgKi8KLSNkZWZpbmUgQ0NSX0NBQ0hFX0NQCTB4MTAJLyogQ2FjaGUgcHVyZ2UgKi8KLQotI2RlZmluZSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZCTB4NjAwMDAwMDAKLQotI2RlZmluZSBDQ1JfQ0FDSEVfRU5BQkxFCUNDUl9DQUNIRV9DRQotI2RlZmluZSBDQ1JfQ0FDSEVfSU5WQUxJREFURQlDQ1JfQ0FDSEVfQ1AKLSNkZWZpbmUgQ0NSX0NBQ0hFX09SQQkJQ0NSX0NBQ0hFX1RXCi0jZGVmaW5lIENDUl9DQUNIRV9XVAkJMHgwMAkvKiBTSC0yIGlzIF9hbHdheXNfIHdyaXRlLXRocm91Z2ggKi8KLQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSkKICNkZWZpbmUgQ0NSMQkJMHhmZmZmZmZlYwogI2RlZmluZSBDQ1IJCUNDUjEKIApAQCAtNDksNSArMzMsNSBAQAogI2RlZmluZSBDQ1JfQ0FDSEVfRU5BQkxFCUNDUl9DQUNIRV9DRQogI2RlZmluZSBDQ1JfQ0FDSEVfSU5WQUxJREFURQlDQ1JfQ0FDSEVfQ0YKICNlbmRpZgotI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDJfQ0FDSEVfSCAqLwogCisjZW5kaWYgLyogX19BU01fQ1BVX1NIMl9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmgKaW5kZXggYjIzOTRjZi4uNDkyOGIwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvdGltZXIuaApAQCAtMjksNyArMjksNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKLSNkZWZpbmUgVE1VX1RTVFIJMHhhNDEyZmU5MgkvKiBCeXRlIGFjY2VzcyAqLworI2RlZmluZSBUTVVfMDEyX1RTVFIJMHhhNDEyZmU5MgkvKiBCeXRlIGFjY2VzcyAqLwogCiAjZGVmaW5lIFRNVTBfVENPUgkweGE0MTJmZTk0CS8qIExvbmcgYWNjZXNzICovCiAjZGVmaW5lIFRNVTBfVENOVAkweGE0MTJmZTk4CS8qIExvbmcgYWNjZXNzICovCkBAIC00NCw3ICs0NCw3IEBACiAjZGVmaW5lIFRNVTJfVENSCTB4YTQxMmZlYjQJLyogV29yZCBhY2Nlc3MgKi8KIAogI2Vsc2UKLSNkZWZpbmUgVE1VX1RTVFIJMHhmZmZmZmU5MgkvKiBCeXRlIGFjY2VzcyAqLworI2RlZmluZSBUTVVfMDEyX1RTVFIJMHhmZmZmZmU5MgkvKiBCeXRlIGFjY2VzcyAqLwogCiAjZGVmaW5lIFRNVTBfVENPUgkweGZmZmZmZTk0CS8qIExvbmcgYWNjZXNzICovCiAjZGVmaW5lIFRNVTBfVENOVAkweGZmZmZmZTk4CS8qIExvbmcgYWNjZXNzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2ZyZXEuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZnJlcS5oCmluZGV4IDM5ZjQxZmMuLjAyNjAyNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZnJlcS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZnJlcS5oCkBAIC0yMiw2ICsyMiw4IEBACiAjZGVmaW5lIEZSUUNSMAkJCTB4ZmZjODAwMDAKICNkZWZpbmUgRlJRQ1IxCQkJMHhmZmM4MDAwNAogI2RlZmluZSBGUlFNUjEJCQkweGZmYzgwMDE0CisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQorI2RlZmluZSBGUlFDUgkJCTB4ZmZjMDAwMTQKICNlbHNlCiAjZGVmaW5lIEZSUUNSCQkJMHhmZmMwMDAwMAogI2RlZmluZSBGUlFDUl9QU1RCWQkJMHgwMjAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3RpbWVyLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3RpbWVyLmgKaW5kZXggOGE0YWYxMi4uZDFlNzk2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC90aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvdGltZXIuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBpbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3RpbWVyLmgKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgTGluZW8gU29sdXRpb25zLCBJbmMuIAorICogQ29weXJpZ2h0IChDKSAyMDA0IExpbmVvIFNvbHV0aW9ucywgSW5jLgogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xNiwzNiArMTYsNDUgQEAKICAqCVNINzc1MFMvU0g3NzUwUgogICoJU0g3NzUxL1NINzc1MVIKICAqCVNINzc2MAorICoJU0gtWDMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQotI2RlZmluZSBUTVVfVE9DUiAgICAgICAgMHhmZmQ4MDAwMCAgICAgIC8qIEJ5dGUgYWNjZXNzICovCisjaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMKKyNkZWZpbmUgVE1VXzAxMl9CQVNFCTB4ZmZjMTAwMDAKKyNkZWZpbmUgVE1VXzM0NV9CQVNFCTB4ZmZjMjAwMDAKKyNlbHNlCisjZGVmaW5lIFRNVV8wMTJfQkFTRQkweGZmZDgwMDAwCisjZGVmaW5lIFRNVV8zNDVfQkFTRQkweGZlMTAwMDAwCiAjZW5kaWYKLSNkZWZpbmUgVE1VX1RTVFIgICAgICAgIDB4ZmZkODAwMDQgICAgICAvKiBCeXRlIGFjY2VzcyAqLwogCi0jZGVmaW5lIFRNVTBfVENPUiAgICAgICAweGZmZDgwMDA4ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMF9UQ05UICAgICAgIDB4ZmZkODAwMGMgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUwX1RDUiAgICAgICAgMHhmZmQ4MDAxMCAgICAgIC8qIFdvcmQgYWNjZXNzICovCisjZGVmaW5lIFRNVV9UT0NSCVRNVV8wMTJfQkFTRQkvKiBOb3Qgc3VwcG9ydGVkIG9uIGFsbCBDUFVzICovCiAKLSNkZWZpbmUgVE1VMV9UQ09SICAgICAgIDB4ZmZkODAwMTQgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDTlQgICAgICAgMHhmZmQ4MDAxOCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTFfVENSICAgICAgICAweGZmZDgwMDFjICAgICAgLyogV29yZCBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VXzAxMl9UU1RSCShUTVVfMDEyX0JBU0UgKyAweDA0KQorI2RlZmluZSBUTVVfMzQ1X1RTVFIJKFRNVV8zNDVfQkFTRSArIDB4MDQpCiAKLSNkZWZpbmUgVE1VMl9UQ09SICAgICAgIDB4ZmZkODAwMjAgICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUyX1RDTlQgICAgICAgMHhmZmQ4MDAyNCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTJfVENSICAgICAgICAweGZmZDgwMDI4ICAgICAgLyogV29yZCBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ1BSCTB4ZmZkODAwMmMJLyogTG9uZyBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VMF9UQ09SCShUTVVfMDEyX0JBU0UgKyAweDA4KQorI2RlZmluZSBUTVUwX1RDTlQJKFRNVV8wMTJfQkFTRSArIDB4MGMpCisjZGVmaW5lIFRNVTBfVENSCShUTVVfMDEyX0JBU0UgKyAweDEwKQogCi0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLSNkZWZpbmUgVE1VM19UQ09SICAgICAgIDB4ZmUxMDAwMDggICAgICAvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUzX1RDTlQgICAgICAgMHhmZTEwMDAwYyAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTNfVENSICAgICAgICAweGZlMTAwMDEwICAgICAgLyogV29yZCBhY2Nlc3MgKi8KKyNkZWZpbmUgVE1VMV9UQ09SICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDE0KQorI2RlZmluZSBUTVUxX1RDTlQgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MTgpCisjZGVmaW5lIFRNVTFfVENSICAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgxYykKIAotI2RlZmluZSBUTVU0X1RDT1IgICAgICAgMHhmZTEwMDAxNCAgICAgIC8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTRfVENOVCAgICAgICAweGZlMTAwMDE4ICAgICAgLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VNF9UQ1IgICAgICAgIDB4ZmUxMDAwMWMgICAgICAvKiBXb3JkIGFjY2VzcyAqLwotI2VuZGlmCisjZGVmaW5lIFRNVTJfVENPUiAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgyMCkKKyNkZWZpbmUgVE1VMl9UQ05UICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDI0KQorI2RlZmluZSBUTVUyX1RDUgkoVE1VXzAxMl9CQVNFICsgMHgyOCkKKyNkZWZpbmUgVE1VMl9UQ1BSCShUTVVfMDEyX0JBU0UgKyAweDJjKQorCisjZGVmaW5lIFRNVTNfVENPUgkoVE1VXzM0NV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgVE1VM19UQ05UCShUTVVfMzQ1X0JBU0UgKyAweDBjKQorI2RlZmluZSBUTVUzX1RDUgkoVE1VXzM0NV9CQVNFICsgMHgxMCkKKworI2RlZmluZSBUTVU0X1RDT1IJKFRNVV8zNDVfQkFTRSArIDB4MTQpCisjZGVmaW5lIFRNVTRfVENOVAkoVE1VXzM0NV9CQVNFICsgMHgxOCkKKyNkZWZpbmUgVE1VNF9UQ1IJKFRNVV8zNDVfQkFTRSArIDB4MWMpCisKKyNkZWZpbmUgVE1VNV9UQ09SCShUTVVfMzQ1X0JBU0UgKyAweDIwKQorI2RlZmluZSBUTVU1X1RDTlQJKFRNVV8zNDVfQkFTRSArIDB4MjQpCisjZGVmaW5lIFRNVTVfVENSCShUTVVfMzQ1X0JBU0UgKyAweDI4KQogCiAjZW5kaWYgLyogX19BU01fQ1BVX1NINF9USU1FUl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2ZiLmggYi9pbmNsdWRlL2FzbS1zaC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9mYi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGZiX3BncHJvdGVjdChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJdW5zaWduZWQgbG9uZyBvZmYpCit7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfd3JpdGVjb21iaW5lKHZtYS0+dm1fcGFnZV9wcm90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9mdXRleC1pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LWlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjE2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9mdXRleC1pcnEuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBfX0FTTV9TSF9GVVRFWF9JUlFfSAorI2RlZmluZSBfX0FTTV9TSF9GVVRFWF9JUlFfSAorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ19zZXQoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICAgaW50ICpvbGR2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIoKm9sZHZhbCwgdWFkZHIpOworCWlmICghcmV0KQorCQlyZXQgPSBwdXRfdXNlcihvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX3hjaGdfYWRkKGludCBvcGFyZywgaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCSAgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKm9sZHZhbCArIG9wYXJnLCB1YWRkcik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ19vcihpbnQgb3BhcmcsIGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkgIGludCAqb2xkdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKCpvbGR2YWwsIHVhZGRyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKm9sZHZhbCB8IG9wYXJnLCB1YWRkcik7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZnV0ZXhfb3BfeGNoZ19hbmQoaW50IG9wYXJnLCBpbnQgX191c2VyICp1YWRkciwKKwkJCQkJICAgaW50ICpvbGR2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJcmV0ID0gZ2V0X3VzZXIoKm9sZHZhbCwgdWFkZHIpOworCWlmICghcmV0KQorCQlyZXQgPSBwdXRfdXNlcigqb2xkdmFsICYgb3BhcmcsIHVhZGRyKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19mdXRleF9vcF94Y2hnX3hvcihpbnQgb3BhcmcsIGludCBfX3VzZXIgKnVhZGRyLAorCQkJCQkgICBpbnQgKm9sZHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcigqb2xkdmFsLCB1YWRkcik7CisJaWYgKCFyZXQpCisJCXJldCA9IHB1dF91c2VyKCpvbGR2YWwgXiBvcGFyZywgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2Z1dGV4X29wX2NtcHhjaGdfaW5hdG9taWMoaW50IF9fdXNlciAqdWFkZHIsCisJCQkJCQkgICBpbnQgb2xkdmFsLCBpbnQgbmV3dmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCwgcHJldiA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcihwcmV2LCB1YWRkcik7CisJaWYgKCFyZXQgJiYgb2xkdmFsID09IHByZXYpCisJCXJldCA9IHB1dF91c2VyKG5ld3ZhbCwgdWFkZHIpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBwcmV2OworfQorCisjZW5kaWYgLyogX19BU01fU0hfRlVURVhfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmggYi9pbmNsdWRlL2FzbS1zaC9mdXRleC5oCmluZGV4IDZhMzMyYTkuLjc0ZWQzNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZnV0ZXguaApAQCAtMSw2ICsxLDc3IEBACi0jaWZuZGVmIF9BU01fRlVURVhfSAotI2RlZmluZSBfQVNNX0ZVVEVYX0gKKyNpZm5kZWYgX19BU01fU0hfRlVURVhfSAorI2RlZmluZSBfX0FTTV9TSF9GVVRFWF9ICiAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgorI2lmZGVmIF9fS0VSTkVMX18KIAotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBYWFg6IFVQIHZhcmlhbnRzLCBmaXggZm9yIFNILTRBIGFuZCBTTVAuLiAqLworI2luY2x1ZGUgPGFzbS9mdXRleC1pcnEuaD4KKworc3RhdGljIGlubGluZSBpbnQgZnV0ZXhfYXRvbWljX29wX2ludXNlcihpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0OworCisJaWYgKGVuY29kZWRfb3AgJiAoRlVURVhfT1BfT1BBUkdfU0hJRlQgPDwgMjgpKQorCQlvcGFyZyA9IDEgPDwgb3Bhcmc7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfc2V0KG9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfQUREOgorCQlyZXQgPSBhdG9taWNfZnV0ZXhfb3BfeGNoZ19hZGQob3BhcmcsIHVhZGRyLCAmb2xkdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9PUjoKKwkJcmV0ID0gYXRvbWljX2Z1dGV4X29wX3hjaGdfb3Iob3BhcmcsIHVhZGRyLCAmb2xkdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCQlyZXQgPSBhdG9taWNfZnV0ZXhfb3BfeGNoZ19hbmQofm9wYXJnLCB1YWRkciwgJm9sZHZhbCk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfWE9SOgorCQlyZXQgPSBhdG9taWNfZnV0ZXhfb3BfeGNoZ194b3Iob3BhcmcsIHVhZGRyLCAmb2xkdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfQorCisJcGFnZWZhdWx0X2VuYWJsZSgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWMoaW50IF9fdXNlciAqdWFkZHIsIGludCBvbGR2YWwsIGludCBuZXd2YWwpCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBhdG9taWNfZnV0ZXhfb3BfY21weGNoZ19pbmF0b21pYyh1YWRkciwgb2xkdmFsLCBuZXd2YWwpOworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fQVNNX1NIX0ZVVEVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEuaCBiL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEuaAppbmRleCAyN2U1YzM0Li40ZGQ4NTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS5oCkBAIC0xLDIwMCArMSwyNDEgQEAKICNpZm5kZWYgX19BU01fU0hfSEQ2NDQ2MQogI2RlZmluZSBfX0FTTV9TSF9IRDY0NDYxCiAvKgotICoJJElkOiBoZDY0NDYxLmgsdiAxLjUgMjAwNC8wMy8xNiAwMDowNzo1MSBsZXRoYWwgRXhwICQKKyAqCUNvcHlyaWdodCAoQykgMjAwNyBLcmlzdG9mZmVyIEVyaWNzb24gPEtyaXN0b2ZmZXIuRXJpY3NvbkBnbWFpbC5jb20+CisgKglDb3B5cmlnaHQgKEMpIDIwMDQgUGF1bCBNdW5kdAogICoJQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKLSAqCUhpdGFjaGkgSEQ2NDQ2MSBjb21wYW5pb24gY2hpcCBzdXBwb3J0CisgKgorICoJCUhpdGFjaGkgSEQ2NDQ2MSBjb21wYW5pb24gY2hpcCBzdXBwb3J0CisgKgkocGxlYXNlIG5vdGUgbWFudWFsIHJlZmVyZW5jZSAweDEwMDAwMDAwID0gMHhiMDAwMDAwMCkKICAqLwogCiAvKiBDb25zdGFudHMgZm9yIFBDTUNJQSBtYXBwaW5ncyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ19XSU5ET1cJMHgwMTAwMDAwMAorI2RlZmluZQlIRDY0NDYxX1BDQ19XSU5ET1cJMHgwMTAwMDAwMAogCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9CQVNFCTB4YjgwMDAwMDAJLyogYXJlYSA2ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMF9BVFRSCShIRDY0NDYxX1BDQzBfQkFTRSkKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwX0NPTU0JKEhENjQ0NjFfUENDMF9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwX0lPCQkoSEQ2NDQ2MV9QQ0MwX0JBU0UrMipIRDY0NDYxX1BDQ19XSU5ET1cpCisvKiBBcmVhIDYgLSBTbG90IDAgLSBtZW1vcnkgYW5kL29yIElPIGNhcmQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0JBU0UJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4ODAwMDAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0FUVFIJKEhENjQ0NjFfUENDMF9CQVNFKQkJCQkvKiAweGI4MDAwMDAwMCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBfQ09NTQkoSEQ2NDQ2MV9QQ0MwX0JBU0UrSEQ2NDQ2MV9QQ0NfV0lORE9XKQkJLyogMHhiOTAwMDAwMDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0lPCQkoSEQ2NDQ2MV9QQ0MwX0JBU0UrMipIRDY0NDYxX1BDQ19XSU5ET1cpCS8qIDB4YmEwMDAwMDAwICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxX0JBU0UJMHhiNDAwMDAwMAkvKiBhcmVhIDUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MxX0FUVFIJKEhENjQ0NjFfUENDMV9CQVNFKQotI2RlZmluZSBIRDY0NDYxX1BDQzFfQ09NTQkoSEQ2NDQ2MV9QQ0MxX0JBU0UrSEQ2NDQ2MV9QQ0NfV0lORE9XKQorLyogQXJlYSA1IC0gU2xvdCAxIC0gbWVtb3J5IGNhcmQgb25seSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFfQkFTRQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDAwMDAwKQorI2RlZmluZQlIRDY0NDYxX1BDQzFfQVRUUgkoSEQ2NDQ2MV9QQ0MxX0JBU0UpCQkJCS8qIDB4YjQwMDAwMDAgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxX0NPTU0JKEhENjQ0NjFfUENDMV9CQVNFK0hENjQ0NjFfUENDX1dJTkRPVykJCS8qIDB4YjUwMDAwMDAgKi8KIAotI2RlZmluZSBIRDY0NDYxX1NUQkNSCTB4MTAwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9DS0lPX1NUQlkJCQkweDIwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9TVEJDUl9TQUZFQ0tFX0lTVAkJMHgxMDAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfU0xDS0VfSVNUCQkJMHgwODAwCi0jZGVmaW5lIEhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QJCTB4MDQwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NMQ0tFX09TVAkJCTB4MDIwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NNSUFTVAkJCTB4MDEwMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NMQ0RTVAkJCTB4MDA4MAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NQQzBTVAkJCTB4MDA0MAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NQQzFTVAkJCTB4MDAyMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NBRkVTVAkJCTB4MDAxMAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NUTTBTVAkJCTB4MDAwOAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NUTTFTVAkJCTB4MDAwNAotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NJUlNUCQkJCTB4MDAwMgotI2RlZmluZSBIRDY0NDYxX1NUQkNSX1NVUlRTVAkJCTB4MDAwMQorLyogU3RhbmRieSBDb250cm9sIFJlZ2lzdGVyIGZvciBIRDY0NDYxICovCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1IJCQlDT05GSUdfSEQ2NDQ2MV9JT0JBU0UKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9DS0lPX1NUQlkJCTB4MjAwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVDS0VfSVNUCTB4MTAwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0tFX0lTVAkJMHgwODAwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU0FGRUNLRV9PU1QJMHgwNDAwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU0xDS0VfT1NUCQkweDAyMDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TTUlBU1QJCTB4MDEwMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0RTVAkJMHgwMDgwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1BDMFNUCQkweDAwNDAKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TUEMxU1QJCTB4MDAyMAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVTVAkJMHgwMDEwCisjZGVmaW5lCUhENjQ0NjFfU1RCQ1JfU1RNMFNUCQkweDAwMDgKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TVE0xU1QJCTB4MDAwNAorI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NJUlNUCQkweDAwMDIKKyNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TVVJUU1QJCTB4MDAwMQogCi0jZGVmaW5lIEhENjQ0NjFfU1lTQ1IJMHgxMDAwMgotI2RlZmluZSBIRDY0NDYxX1NDUFVDUgkweDEwMDA0CisvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1NZU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgwMikKIAotI2RlZmluZSBIRDY0NDYxX0xDRENCQVIJCTB4MTEwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDTE9SCQkweDExMDAyCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSCQkweDExMDA0Ci0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NUQkFDSwkweDA0MDAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQ1JfU1RSRVEJMHgwMTAwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX01PRkYJMHgwMDgwCi0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1JFRlNFTAkweDAwNDAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQ1JfRVBPTgkweDAwMjAKLSNkZWZpbmUgSEQ2NDQ2MV9MQ0RDQ1JfU1BPTgkweDAwMTAKKy8qIENQVSBEYXRhIEJ1cyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfU0NQVUNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgwNCkKIAotI2RlZmluZQlIRDY0NDYxX0xEUjEJCTB4MTEwMTAKLSNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RPTgkweDAxCi0jZGVmaW5lCUhENjQ0NjFfTERSMV9ESU5WCTB4ODAKKy8qIEJhc2UgQWRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0JBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwMCkKIAotI2RlZmluZQlIRDY0NDYxX0xEUjIJCTB4MTEwMTIKLSNkZWZpbmUJSEQ2NDQ2MV9MREhOQ1IJCTB4MTEwMTQKLSNkZWZpbmUJSEQ2NDQ2MV9MREhOU1IJCTB4MTEwMTYKLSNkZWZpbmUgSEQ2NDQ2MV9MRFZOVFIJCTB4MTEwMTgKLSNkZWZpbmUgSEQ2NDQ2MV9MRFZORFIJCTB4MTEwMWEKLSNkZWZpbmUgSEQ2NDQ2MV9MRFZTUFIJCTB4MTEwMWMKLSNkZWZpbmUgSEQ2NDQ2MV9MRFIzCQkweDExMDFlCisvKiBMaW5lIGluY3JlbWVudCBhZHJlc3MgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDTE9SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDAyKQogCi0jZGVmaW5lIEhENjQ0NjFfQ1BUV0FSCQkweDExMDMwCi0jZGVmaW5lIEhENjQ0NjFfQ1BUV0RSCQkweDExMDMyCi0jZGVmaW5lIEhENjQ0NjFfQ1BUUkFSCQkweDExMDM0Ci0jZGVmaW5lIEhENjQ0NjFfQ1BUUkRSCQkweDExMDM2CisvKiBDb250cm9scyBMQ0QgY29udHJvbGxlciAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwNCkKIAotI2RlZmluZSBIRDY0NDYxX0dSRE9SCQkweDExMDQwCi0jZGVmaW5lIEhENjQ0NjFfR1JTQ1IJCTB4MTEwNDIKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1IJCTB4MTEwNDQKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBVFVTCQkweDEwCi0jZGVmaW5lIEhENjQ0NjFfR1JDRkdSX0FDQ1JFU0VUCQkJMHgwOAotI2RlZmluZSBIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFSVF9CSVRCTFQJMHgwNgotI2RlZmluZSBIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFSVF9MSU5FCTB4MDQKLSNkZWZpbmUgSEQ2NDQ2MV9HUkNGR1JfQ09MT1JERVBUSDE2CQkweDAxCisvKiBMQ0NEUiBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfU1RCQUNLCTB4MDQwMAkvKiBTdGFuZGJ5IEJhY2sgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfU1RSRVEJMHgwMTAwCS8qIFN0YW5kYnkgUmVxdWVzdCAqLworI2RlZmluZQlIRDY0NDYxX0xDRENDUl9NT0ZGCTB4MDA4MAkvKiBNZW1vcnkgT2ZmICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1JFRlNFTAkweDAwNDAJLyogUmVmcmVzaCBTZWxlY3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1JfRVBPTgkweDAwMjAJLyogRW5kIFBvd2VyIE9uICovCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NQT04JMHgwMDEwCS8qIFN0YXJ0IFBvd2VyIE9uICovCiAKLSNkZWZpbmUgSEQ2NDQ2MV9MTlNBUkgJCTB4MTEwNDYKLSNkZWZpbmUgSEQ2NDQ2MV9MTlNBUkwJCTB4MTEwNDgKLSNkZWZpbmUgSEQ2NDQ2MV9MTkFYTFIJCTB4MTEwNGEKLSNkZWZpbmUgSEQ2NDQ2MV9MTkRHUgkJMHgxMTA0YwotI2RlZmluZSBIRDY0NDYxX0xOQVhSCQkweDExMDRlCi0jZGVmaW5lIEhENjQ0NjFfTE5FUlRSCQkweDExMDUwCi0jZGVmaW5lIEhENjQ0NjFfTE5NRFIJCTB4MTEwNTIKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRTU0FSSAkweDExMDU0Ci0jZGVmaW5lIEhENjQ0NjFfQkJUU1NBUkwJMHgxMTA1NgotI2RlZmluZSBIRDY0NDYxX0JCVERTQVJICTB4MTEwNTgKLSNkZWZpbmUgSEQ2NDQ2MV9CQlREU0FSTAkweDExMDVhCi0jZGVmaW5lIEhENjQ0NjFfQkJURFdSCQkweDExMDVjCi0jZGVmaW5lIEhENjQ0NjFfQkJUREhSCQkweDExMDVlCi0jZGVmaW5lIEhENjQ0NjFfQkJUUEFSSAkJMHgxMTA2MAotI2RlZmluZSBIRDY0NDYxX0JCVFBBUkwJCTB4MTEwNjIKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRNQVJICQkweDExMDY0Ci0jZGVmaW5lIEhENjQ0NjFfQkJUTUFSTAkJMHgxMTA2NgotI2RlZmluZSBIRDY0NDYxX0JCVFJPUFIJCTB4MTEwNjgKLSNkZWZpbmUgSEQ2NDQ2MV9CQlRNRFIJCTB4MTEwNmEKKy8qIENvbnRyb2xzIExDRCAoMSkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIxCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDEwKQorI2RlZmluZQlIRDY0NDYxX0xEUjFfRE9OCTB4MDEJLyogRGlzcGxheSBPbiAqLworI2RlZmluZQlIRDY0NDYxX0xEUjFfRElOVgkweDgwCS8qIERpc3BsYXkgSW52ZXJ0ICovCisKKy8qIENvbnRyb2xzIExDRCAoMikgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFIyCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDEyKQorI2RlZmluZQlIRDY0NDYxX0xESE5DUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxNCkJLyogTnVtYmVyIG9mIGhvcml6b250YWwgY2hhcmFjdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0xESE5TUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxNikJLyogU3BlY2lmeSBvdXRwdXQgc3RhcnQgcG9zaXRpb24gKyB3aWR0aCBvZiBDTDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZOVFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTgpCS8qIFNwZWNpZnkgdG90YWwgdmVydGljYWwgbGluZXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZORFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMWEpCS8qIHNwZWNpZnkgbnVtYmVyIG9mIGRpc3BsYXkgdmVydGljYWwgbGluZXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZTUFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMWMpCS8qIHNwZWNpZnkgdmVydGljYWwgc3luY2hyb25pemF0aW9uIHBvcyBhbmQgQUMgbnIgKi8KKworLyogQ29udHJvbHMgTENEICgzKSAqLworI2RlZmluZQlIRDY0NDYxX0xEUjMJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMWUpCisKKy8qIFBhbGV0dGUgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUV0FSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDMwKQkvKiBDb2xvciBQYWxldHRlIFdyaXRlIEFkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFdEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzMikJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUUkFSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDM0KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgQWRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUUkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDM2KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lCUhENjQ0NjFfR1JET1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDApCS8qIERpc3BsYXkgUmVzb2x1dGlvbiBPZmZzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUlNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0MikJLyogU29saWQgQ29sb3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDQpCS8qIEFjY2VsZXJhdG9yIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKworI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9BQ0NTVEFUVVMJMHgxMAkvKiBBY2NlbGVyYXRvciBTdGF0dXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQUNDUkVTRVQJCTB4MDgJLyogQWNjZWxlcmF0b3IgUmVzZXQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQUNDU1RBUlRfQklUQkxUCTB4MDYJLyogQWNjZWxlcmF0b3IgU3RhcnQgQklUQkxUICovCisjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1NUQVJUX0xJTkUJMHgwNAkvKiBBY2NlbGVyYXRvciBTdGFydCBMaW5lIERyYXdpbmcgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1JfQ09MT1JERVBUSDE2CTB4MDEJLyogU2V0cyBDb2xvcmRlcHRoIDE2IGZvciBBY2NlbGVyYXRvciAqLworI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9DT0xPUkRFUFRIOAkweDAxCS8qIFNldHMgQ29sb3JkZXB0aCA4IGZvciBBY2NlbGVyYXRvciAqLworCisvKiBMaW5lIERyYXdpbmcgUmVnaXN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfTE5TQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDQ2KQkvKiBMaW5lIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTlNBUkwJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDgpCS8qIExpbmUgU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChMKSAqLworI2RlZmluZQlIRDY0NDYxX0xOQVhMUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0YSkJLyogQXhpcyBQaXhlbCBMZW5ndGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkRHUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0YykJLyogRGlhZ29uYWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkFYUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0ZSkJLyogQXhpYWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkVSVFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTApCS8qIFN0YXJ0IEVycm9yIFRlcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTk1EUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1MikJLyogTGluZSBNb2RlIFJlZ2lzdGVyICovCisKKy8qIEJpdEJMVCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRTU0FSSAkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDU0KQkvKiBTb3VyY2UgU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChIKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVFNTQVJMCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTYpCS8qIFNvdXJjZSBTdGFydCBBZHJlc3MgUmVnaXN0ZXIgKEwpICovCisjZGVmaW5lCUhENjQ0NjFfQkJURFNBUkgJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1OCkJLyogRGVzdGluYXRpb24gU3RhcnQgQWRyZXNzIFJlZ2lzdGVyIChIKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVERTQVJMCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNWEpCS8qIERlc3RpbmF0aW9uIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlREV1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNWMpCS8qIERlc3RpbmF0aW9uIEJsb2NrIFdpZHRoIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQkJUREhSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVlKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBIZWlnaHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDYwKQkvKiBQYXR0ZXJuIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDYyKQkvKiBQYXR0ZXJuIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY0KQkvKiBNYXNrIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY2KQkvKiBNYXNrIFN0YXJ0IEFkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRST1BSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY4KQkvKiBST1AgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNmEpCS8qIEJpdEJMVCBNb2RlIFJlZ2lzdGVyICovCiAKIC8qIFBDIENhcmQgQ29udHJvbGxlciBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwSVNSICAgICAgICAgMHgxMjAwMCAvKiBzb2NrZXQgMCBpbnRlcmZhY2Ugc3RhdHVzICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMEdDUiAgICAgICAgIDB4MTIwMDIgLyogc29ja2V0IDAgZ2VuZXJhbCBjb250cm9sICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMENTQ1IgICAgICAgIDB4MTIwMDQgLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMENTQ0lFUiAgICAgIDB4MTIwMDYgLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0MwU0NSICAgICAgICAgMHgxMjAwOCAvKiBzb2NrZXQgMCBzb2Z0d2FyZSBjb250cm9sICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMUlTUiAgICAgICAgIDB4MTIwMTAgLyogc29ja2V0IDEgaW50ZXJmYWNlIHN0YXR1cyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFHQ1IgICAgICAgICAweDEyMDEyIC8qIHNvY2tldCAxIGdlbmVyYWwgY29udHJvbCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFDU0NSICAgICAgICAweDEyMDE0IC8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQzFDU0NJRVIgICAgICAweDEyMDE2IC8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDMVNDUiAgICAgICAgIDB4MTIwMTggLyogc29ja2V0IDEgc29mdHdhcmUgY29udHJvbCAqLworLyogTWFwcyB0byBQaHlzaWNhbCBBcmVhIDYgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwSVNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDAwKQkvKiBzb2NrZXQgMCBpbnRlcmZhY2Ugc3RhdHVzICovCisjZGVmaW5lCUhENjQ0NjFfUENDMEdDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwMikJLyogc29ja2V0IDAgZ2VuZXJhbCBjb250cm9sICovCisjZGVmaW5lCUhENjQ0NjFfUENDMENTQ1IJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwNCkJLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lCUhENjQ0NjFfUENDMENTQ0lFUgkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDA2KQkvKiBzb2NrZXQgMCBjYXJkIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBTQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDgpCS8qIHNvY2tldCAwIHNvZnR3YXJlIGNvbnRyb2wgKi8KKy8qIE1hcHMgdG8gUGh5c2ljYWwgQXJlYSA1ICovCisjZGVmaW5lCUhENjQ0NjFfUENDMUlTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxMCkJLyogc29ja2V0IDEgaW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTIpCS8qIHNvY2tldCAxIGdlbmVyYWwgY29udHJvbCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTQpCS8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NJRVIJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxNikJLyogc29ja2V0IDEgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDE4KQkvKiBzb2NrZXQgMSBzb2Z0d2FyZSBjb250cm9sICovCiAKIC8qIFBDQyBJbnRlcmZhY2UgU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX1JFQURZCQkweDgwCS8qIGNhcmQgcmVhZHkgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfTVdQCQkweDQwCS8qIGNhcmQgd3JpdGUtcHJvdGVjdGVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX1ZTMgkJMHgyMAkvKiB2b2x0YWdlIHNlbGVjdCBwaW4gMiAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9WUzEJCTB4MTAJLyogdm9sdGFnZSBzZWxlY3QgcGluIDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQ0QyCQkweDA4CS8qIGNhcmQgZGV0ZWN0IDIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQ0QxCQkweDA0CS8qIGNhcmQgZGV0ZWN0IDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEMgkJMHgwMgkvKiBiYXR0ZXJ5IDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEMQkJMHgwMQkvKiBiYXR0ZXJ5IDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfUkVBRFkJCTB4ODAJLyogY2FyZCByZWFkeSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9NV1AJCTB4NDAJLyogY2FyZCB3cml0ZS1wcm90ZWN0ZWQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfVlMyCQkweDIwCS8qIHZvbHRhZ2Ugc2VsZWN0IHBpbiAyICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX1ZTMQkJMHgxMAkvKiB2b2x0YWdlIHNlbGVjdCBwaW4gMSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9DRDIJCTB4MDgJLyogY2FyZCBkZXRlY3QgMiAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9DRDEJCTB4MDQJLyogY2FyZCBkZXRlY3QgMSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkQyCQkweDAyCS8qIGJhdHRlcnkgMSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkQxCQkweDAxCS8qIGJhdHRlcnkgMSAqLwogCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX1BDRF9NQVNLCQkweDBjICAgIC8qIGNhcmQgZGV0ZWN0ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9NQVNLCQkweDAzICAgIC8qIGJhdHRlcnkgdm9sdGFnZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUR09PRAkweDAzICAgIC8qIGJhdHRlcnkgZ29vZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUV0FSTgkweDAxICAgIC8qIGJhdHRlcnkgbG93IHdhcm5pbmcgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVERFQUQxCTB4MDIgICAgLyogYmF0dGVyeSBkZWFkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9CQVRERUFEMgkweDAwICAgIC8qIGJhdHRlcnkgZGVhZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9QQ0RfTUFTSwkJMHgwYwkvKiBjYXJkIGRldGVjdCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkRfTUFTSwkJMHgwMwkvKiBiYXR0ZXJ5IHZvbHRhZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVEdPT0QJMHgwMwkvKiBiYXR0ZXJ5IGdvb2QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NJU1JfQlZEX0JBVFdBUk4JMHgwMQkvKiBiYXR0ZXJ5IGxvdyB3YXJuaW5nICovCisjZGVmaW5lCUhENjQ0NjFfUENDSVNSX0JWRF9CQVRERUFEMQkweDAyCS8qIGJhdHRlcnkgZGVhZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDIJMHgwMAkvKiBiYXR0ZXJ5IGRlYWQgKi8KIAogLyogUENDIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9EUlZFCQkweDgwICAgIC8qIG91dHB1dCBkcml2ZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9QQ0NSCQkweDQwICAgIC8qIFBDIGNhcmQgcmVzZXQgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUENDVAkJMHgyMCAgICAvKiBQQyBjYXJkIHR5cGUsIDE9SU8mbWVtLCAwPW1lbSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9WQ0MwCQkweDEwICAgIC8qIHZvbHRhZ2UgY29udHJvbCBwaW4gVkNDMFNFTDAgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUE1NT0QJCTB4MDggICAgLyogbWVtb3J5IG1vZGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NHQ1JfUEEyNQkJMHgwNCAgICAvKiBwaW4gQTI1ICovCi0jZGVmaW5lIEhENjQ0NjFfUENDR0NSX1BBMjQJCTB4MDIgICAgLyogcGluIEEyNCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0dDUl9SRUcJCTB4MDEgICAgLyogcGluIFBDQzBSRUcjICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX0RSVkUJCTB4ODAJLyogb3V0cHV0IGRyaXZlICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1BDQ1IJCTB4NDAJLyogUEMgY2FyZCByZXNldCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QQ0NUCQkweDIwCS8qIFBDIGNhcmQgdHlwZSwgMT1JTyZtZW0sIDA9bWVtICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1ZDQzAJCTB4MTAJLyogdm9sdGFnZSBjb250cm9sIHBpbiBWQ0MwU0VMMCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QTU1PRAkJMHgwOAkvKiBtZW1vcnkgbW9kZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0dDUl9QQTI1CQkweDA0CS8qIHBpbiBBMjUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NHQ1JfUEEyNAkJMHgwMgkvKiBwaW4gQTI0ICovCisjZGVmaW5lCUhENjQ0NjFfUENDR0NSX1JFRwkJMHgwMQkvKiBwaW4gUENDMFJFRyMgKi8KIAogLyogUENDIENhcmQgU3RhdHVzIENoYW5nZSBSZWdpc3RlciAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfU0NESQkJMHg4MCAgICAvKiBzdyBjYXJkIGRldGVjdCBpbnRyICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9TUlYxCQkweDQwICAgIC8qIHJlc2VydmVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9JUkVRCQkweDIwICAgIC8qIElSRVEgaW50ciByZXEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX1NDCQkweDEwICAgIC8qIFNUU0NIRyAoc3RhdHVzIGNoYW5nZSkgcGluICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDUl9DREMJCTB4MDggICAgLyogQ0QgKGNhcmQgZGV0ZWN0KSBjaGFuZ2UgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NSX1JDCQkweDA0ICAgIC8qIFJFQURZIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfQlcJCTB4MDIgICAgLyogYmF0dGVyeSB3YXJuaW5nIGNoYW5nZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ1JfQkQJCTB4MDEgICAgLyogYmF0dGVyeSBkZWFkIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfU0NESQkJMHg4MAkvKiBzdyBjYXJkIGRldGVjdCBpbnRyICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9TUlYxCQkweDQwCS8qIHJlc2VydmVkICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9JUkVRCQkweDIwCS8qIElSRVEgaW50ciByZXEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX1NDCQkweDEwCS8qIFNUU0NIRyAoc3RhdHVzIGNoYW5nZSkgcGluICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDUl9DREMJCTB4MDgJLyogQ0QgKGNhcmQgZGV0ZWN0KSBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NSX1JDCQkweDA0CS8qIFJFQURZIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfQlcJCTB4MDIJLyogYmF0dGVyeSB3YXJuaW5nIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ1JfQkQJCTB4MDEJLyogYmF0dGVyeSBkZWFkIGNoYW5nZSAqLwogCiAvKiBQQ0MgQ2FyZCBTdGF0dXMgQ2hhbmdlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQ1JFCQkweDgwICAgIC8qIGNoYW5nZSByZXNldCBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTUFTSwkweDYwICAgLyogSVJFUSBlbmFibGUgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfRElTQUJMRUQJMHgwMCAgIC8qIElSRVEgZGlzYWJsZWQgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTEVWRUwJMHgyMCAgIC8qIElSRVEgbGV2ZWwtdHJpZ2dlcmVkICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0ZBTExJTkcJMHg0MCAgIC8qIElSRVEgZmFsbGluZy1lZGdlLXRyaWcgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfUklTSU5HCTB4NjAgICAvKiBJUkVRIHJpc2luZy1lZGdlLXRyaWcgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQ1JFCQkweDgwCS8qIGNoYW5nZSByZXNldCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfTUFTSwkweDYwCS8qIElSRVEgZW5hYmxlICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0RJU0FCTEVEIDB4MDAJLyogSVJFUSBkaXNhYmxlZCAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9MRVZFTAkweDIwCS8qIElSRVEgbGV2ZWwtdHJpZ2dlcmVkICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX0ZBTExJTkcJMHg0MAkvKiBJUkVRIGZhbGxpbmctZWRnZS10cmlnICovCisjZGVmaW5lCUhENjQ0NjFfUENDQ1NDSUVSX0lSRVFFX1JJU0lORwkweDYwCS8qIElSRVEgcmlzaW5nLWVkZ2UtdHJpZyAqLwogCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX1NDRQkJMHgxMCAgICAvKiBzdGF0dXMgY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9DREUJCTB4MDggICAgLyogY2FyZCBkZXRlY3QgY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9SRQkJMHgwNCAgICAvKiByZWFkeSBjaGFuZ2UgZW5hYmxlICovCi0jZGVmaW5lIEhENjQ0NjFfUENDQ1NDSUVSX0JXRQkJMHgwMiAgICAvKiBiYXR0ZXJ5IHdhcm4gY2hhbmdlIGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9CREUJCTB4MDEgICAgLyogYmF0dGVyeSBkZWFkIGNoYW5nZSBlbmFibGUqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9TQ0UJCTB4MTAJLyogc3RhdHVzIGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQ0RFCQkweDA4CS8qIGNhcmQgZGV0ZWN0IGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfUkUJCTB4MDQJLyogcmVhZHkgY2hhbmdlIGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQ0NTQ0lFUl9CV0UJCTB4MDIJLyogYmF0dGVyeSB3YXJuIGNoYW5nZSBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NDU0NJRVJfQkRFCQkweDAxCS8qIGJhdHRlcnkgZGVhZCBjaGFuZ2UgZW5hYmxlKi8KIAogLyogUENDIFNvZnR3YXJlIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NTQ1JfVkNDMQkJMHgwMgkvKiB2b2x0YWdlIGNvbnRyb2wgcGluIDEgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NTQ1JfU1dQCQkweDAxICAgIC8qIHdyaXRlIHByb3RlY3QgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NTQ1JfVkNDMQkJMHgwMgkvKiB2b2x0YWdlIGNvbnRyb2wgcGluIDEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0NTQ1JfU1dQCQkweDAxCS8qIHdyaXRlIHByb3RlY3QgKi8KIAotI2RlZmluZSBIRDY0NDYxX1AwT0NSICAgICAgICAgICAweDEyMDJhCi0jZGVmaW5lIEhENjQ0NjFfUDFPQ1IgICAgICAgICAgIDB4MTIwMmMKLSNkZWZpbmUgSEQ2NDQ2MV9QR0NSICAgICAgICAgICAgMHgxMjAyZQorLyogUENDMCBPdXRwdXQgUGlucyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfUDBPQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmEpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9HUEFDUgkJMHgxNDAwMAotI2RlZmluZSBIRDY0NDYxX0dQQkNSCQkweDE0MDAyCi0jZGVmaW5lIEhENjQ0NjFfR1BDQ1IJCTB4MTQwMDQKLSNkZWZpbmUgSEQ2NDQ2MV9HUERDUgkJMHgxNDAwNgotI2RlZmluZSBIRDY0NDYxX0dQQURSCQkweDE0MDEwCi0jZGVmaW5lIEhENjQ0NjFfR1BCRFIJCTB4MTQwMTIKLSNkZWZpbmUgSEQ2NDQ2MV9HUENEUgkJMHgxNDAxNAotI2RlZmluZSBIRDY0NDYxX0dQRERSCQkweDE0MDE2Ci0jZGVmaW5lIEhENjQ0NjFfR1BBSUNSCQkweDE0MDIwCi0jZGVmaW5lIEhENjQ0NjFfR1BCSUNSCQkweDE0MDIyCi0jZGVmaW5lIEhENjQ0NjFfR1BDSUNSCQkweDE0MDI0Ci0jZGVmaW5lIEhENjQ0NjFfR1BESUNSCQkweDE0MDI2Ci0jZGVmaW5lIEhENjQ0NjFfR1BBSVNSCQkweDE0MDQwCi0jZGVmaW5lIEhENjQ0NjFfR1BCSVNSCQkweDE0MDQyCi0jZGVmaW5lIEhENjQ0NjFfR1BDSVNSCQkweDE0MDQ0Ci0jZGVmaW5lIEhENjQ0NjFfR1BESVNSCQkweDE0MDQ2CisvKiBQQ0MxIE91dHB1dCBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QMU9DUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAyYykKIAotI2RlZmluZSBIRDY0NDYxX05JUlIJCTB4MTUwMDAKLSNkZWZpbmUgSEQ2NDQ2MV9OSU1SCQkweDE1MDAyCisvKiBQQyBDYXJkIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX1BHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmUpCiAKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFCQVNFCQlPRkZDSElQX0lSUV9CQVNFCi0jZGVmaW5lIEhENjQ0NjFfSVJRX05VTQkJMTYKKy8qIFBvcnQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwMCkJLyogUG9ydCBBIC0gSGFuZGxlcyBJUkRBL1RJTUVSICovCisjZGVmaW5lCUhENjQ0NjFfR1BCQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDIpCS8qIFBvcnQgQiAtIEhhbmRsZXMgVUFSVCAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDA0KQkvKiBQb3J0IEMgLSBIYW5kbGVzIFBDTUNJQSAxICovCisjZGVmaW5lCUhENjQ0NjFfR1BEQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDYpCS8qIFBvcnQgRCAtIEhhbmRsZXMgUENNQ0lBIDEgKi8KIAotI2RlZmluZSBIRDY0NDYxX0lSUV9VQVJUCShIRDY0NDYxX0lSUUJBU0UrNSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfSVJEQQkoSEQ2NDQ2MV9JUlFCQVNFKzYpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX1RNVTEJKEhENjQ0NjFfSVJRQkFTRSs5KQotI2RlZmluZSBIRDY0NDYxX0lSUV9UTVUwCShIRDY0NDYxX0lSUUJBU0UrMTApCi0jZGVmaW5lIEhENjQ0NjFfSVJRX0dQSU8JKEhENjQ0NjFfSVJRQkFTRSsxMSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfQUZFCQkoSEQ2NDQ2MV9JUlFCQVNFKzEyKQotI2RlZmluZSBIRDY0NDYxX0lSUV9QQ0MxCShIRDY0NDYxX0lSUUJBU0UrMTMpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX1BDQzAJKEhENjQ0NjFfSVJRQkFTRSsxNCkKKy8qIFBvcnQgQ29udHJvbCBEYXRhIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0dQQURSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDEwKQkvKiBBICovCisjZGVmaW5lCUhENjQ0NjFfR1BCRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMTIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxNCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRERSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDE2KQkvKiBEICovCisKKy8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0dQQUlDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyMCkJLyogQSAqLworI2RlZmluZQlIRDY0NDYxX0dQQklDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyMikJLyogQiAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0lDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyNCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRElDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyNikJLyogRCAqLworCisvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVycyAqLworI2RlZmluZQlIRDY0NDYxX0dQQUlTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0MCkJLyogQSAqLworI2RlZmluZQlIRDY0NDYxX0dQQklTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0MikJLyogQiAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0lTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0NCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRElTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDA0NikJLyogRCAqLworCisvKiBJbnRlcnJ1cHQgUmVxdWVzdCBSZWdpc3RlciAmIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTklSUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NTAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9OSU1SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg1MDAyKQorCisjZGVmaW5lCUhENjQ0NjFfSVJRQkFTRQkJT0ZGQ0hJUF9JUlFfQkFTRQorI2RlZmluZQlIRDY0NDYxX0lSUV9OVU0JCTE2CisKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfVUFSVAkoSEQ2NDQ2MV9JUlFCQVNFKzUpCisjZGVmaW5lCUhENjQ0NjFfSVJRX0lSREEJKEhENjQ0NjFfSVJRQkFTRSs2KQorI2RlZmluZQlIRDY0NDYxX0lSUV9UTVUxCShIRDY0NDYxX0lSUUJBU0UrOSkKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfVE1VMAkoSEQ2NDQ2MV9JUlFCQVNFKzEwKQorI2RlZmluZQlIRDY0NDYxX0lSUV9HUElPCShIRDY0NDYxX0lSUUJBU0UrMTEpCisjZGVmaW5lCUhENjQ0NjFfSVJRX0FGRQkJKEhENjQ0NjFfSVJRQkFTRSsxMikKKyNkZWZpbmUJSEQ2NDQ2MV9JUlFfUENDMQkoSEQ2NDQ2MV9JUlFCQVNFKzEzKQorI2RlZmluZQlIRDY0NDYxX0lSUV9QQ0MwCShIRDY0NDYxX0lSUUJBU0UrMTQpCiAKICNkZWZpbmUgX19JT19QUkVGSVgJaGQ2NDQ2MQogI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9od19pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCmluZGV4IDgwZWUxY2QuLjRjYTNmNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2h3X2lycS5oCkBAIC01LDQgKzUsNDYgQEAKIAogZXh0ZXJuIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAKK3N0cnVjdCBpbnRjMl9kYXRhIHsKKwl1bnNpZ25lZCBzaG9ydCBpcnE7CisJdW5zaWduZWQgY2hhciBpcHJfb2Zmc2V0LCBpcHJfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBtc2tfb2Zmc2V0LCBtc2tfc2hpZnQ7CisJdW5zaWduZWQgY2hhciBwcmlvcml0eTsKK307CisKK3N0cnVjdCBpbnRjMl9kZXNjIHsKKwl1bnNpZ25lZCBsb25nIHByaW9fYmFzZTsKKwl1bnNpZ25lZCBsb25nIG1za19iYXNlOworCXVuc2lnbmVkIGxvbmcgbXNrY2xyX2Jhc2U7CisJc3RydWN0IGludGMyX2RhdGEgKmludGMyX2RhdGE7CisJdW5zaWduZWQgaW50IG5yX2lycXM7CisJc3RydWN0IGlycV9jaGlwIGNoaXA7Cit9OworCit2b2lkIHJlZ2lzdGVyX2ludGMyX2NvbnRyb2xsZXIoc3RydWN0IGludGMyX2Rlc2MgKik7Cit2b2lkIGluaXRfSVJRX2ludGMyKHZvaWQpOworCitzdHJ1Y3QgaXByX2RhdGEgeworCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgaXByX2lkeDsJCS8qIEluZGV4IGZvciB0aGUgSVBSIHJlZ2lzdGVyZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNoaWZ0OwkJLyogTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgdGhlIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyIHByaW9yaXR5OwkJLyogVGhlIHByaW9yaXR5ICovCit9OworCitzdHJ1Y3QgaXByX2Rlc2MgeworCXVuc2lnbmVkIGxvbmcgKmlwcl9vZmZzZXRzOworCXVuc2lnbmVkIGludCBucl9vZmZzZXRzOworCXN0cnVjdCBpcHJfZGF0YSAqaXByX2RhdGE7CisJdW5zaWduZWQgaW50IG5yX2lycXM7CisJc3RydWN0IGlycV9jaGlwIGNoaXA7Cit9OworCit2b2lkIHJlZ2lzdGVyX2lwcl9jb250cm9sbGVyKHN0cnVjdCBpcHJfZGVzYyAqKTsKK3ZvaWQgaW5pdF9JUlFfaXByKHZvaWQpOworCisvKgorICogRW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFsIElQUiBJUlFzLgorICovCit2b2lkIGlwcl9pcnFfZW5hYmxlX2lybG0odm9pZCk7CisKICNlbmRpZiAvKiBfX0FTTV9TSF9IV19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEuaAppbmRleCBlODFiZjIxLi5jNjFkOTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEuaApAQCAtMzEsNDcgKzMxLDcgQEAKICAqIFBJTlQgSVJRcwogICovCiB2b2lkIGluaXRfSVJRX3BpbnQodm9pZCk7Ci0KLS8qCi0gKiBUaGUgc2hpZnQgdmFsdWUgaXMgbm93IHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCwgbm90IHRoZSBudW1iZXIgb2YKLSAqIGJpdHMvNC4gVGhpcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZQotICogZGF0YXNoZWV0cy4gVGhlIElQUiBhZGRyZXNzLCBhZGRyLCB3aWxsIGJlIHNldCBmcm9tIGlwcl9pZHggdmlhIHRoZQotICogbWFwX2lwcmlkeF90b19hZGRyIGZ1bmN0aW9uLgotICovCi1zdHJ1Y3QgaXByX2RhdGEgewotCXVuc2lnbmVkIGludCBpcnE7Ci0JaW50IGlwcl9pZHg7CQkvKiBJbmRleCBmb3IgdGhlIElQUiByZWdpc3RlcmVkICovCi0JaW50IHNoaWZ0OwkJLyogTnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgdGhlIGRhdGEgKi8KLQlpbnQgcHJpb3JpdHk7CQkvKiBUaGUgcHJpb3JpdHkgKi8KLQl1bnNpZ25lZCBpbnQgYWRkcjsJLyogQWRkcmVzcyBvZiBJbnRlcnJ1cHQgUHJpb3JpdHkgUmVnaXN0ZXIgKi8KLX07Ci0KLS8qCi0gKiBHaXZlbiBhbiBJUFIgSURYLCBtYXAgdGhlIHZhbHVlIHRvIGFuIElQUiByZWdpc3RlciBhZGRyZXNzLgotICovCi11bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpOwotCi0vKgotICogRW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFsIElQUiBJUlFzLgotICovCi12b2lkIGlwcl9pcnFfZW5hYmxlX2lybG0odm9pZCk7Ci0KLS8qCi0gKiBGdW5jdGlvbiBmb3IgIm9uIGNoaXAgc3VwcG9ydCBtb2R1bGVzIi4KLSAqLwotdm9pZCBtYWtlX2lwcl9pcnEoc3RydWN0IGlwcl9kYXRhICp0YWJsZSwgdW5zaWduZWQgaW50IG5yX2lycXMpOwogdm9pZCBtYWtlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXZvaWQgaW5pdF9JUlFfaXByKHZvaWQpOwotCi1zdHJ1Y3QgaW50YzJfZGF0YSB7Ci0JdW5zaWduZWQgc2hvcnQgaXJxOwotCXVuc2lnbmVkIGNoYXIgaXByX29mZnNldCwgaXByX3NoaWZ0OwotCXVuc2lnbmVkIGNoYXIgbXNrX29mZnNldCwgbXNrX3NoaWZ0OwotCXVuc2lnbmVkIGNoYXIgcHJpb3JpdHk7Ci19OwotCi12b2lkIG1ha2VfaW50YzJfaXJxKHN0cnVjdCBpbnRjMl9kYXRhICosIHVuc2lnbmVkIGludCBucl9pcnFzKTsKLXZvaWQgaW5pdF9JUlFfaW50YzIodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdlbmVyaWNfaXJxX2RlbXV4KGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmggYi9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmgKaW5kZXggNzAzODliNy4uMDg4Njk4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaApAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNodHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+CiAKIHN0cnVjdCBkZXZpY2U7CiAKQEAgLTY4LDQgKzY3LDcgQEAKIAogI2RlZmluZSBnZXRfc3lzdGVtX3R5cGUoKQlzaF9tdi5tdl9uYW1lCiAKKyNkZWZpbmUgX19pbml0bXYgXAorCV9fYXR0cmlidXRlX3VzZWRfXyBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXyAoIi5tYWNodmVjLmluaXQiKSkpCisKICNlbmRpZiAvKiBfQVNNX1NIX01BQ0hWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbWFjaHZlY19pbml0LmggYi9pbmNsdWRlL2FzbS1zaC9tYWNodmVjX2luaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5Nzc5OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tYWNodmVjX2luaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9tYWNodmVjX2luaXQuaAotICoKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgaGFzIGdvb2RpZXMgdG8gaGVscCBzaW1wbGlmeSBpbnN0YW50aWF0aW9uIG9mIG1hY2hpbmUgdmVjdG9ycy4KLSAqLwotCi0jaWZuZGVmIF9fU0hfTUFDSFZFQ19JTklUX0gKLSNkZWZpbmUgX19TSF9NQUNIVkVDX0lOSVRfSAotCi0KLS8qCi0gKiBJbiBhIEdFTkVSSUMga2VybmVsLCB3ZSBoYXZlIGxvdHMgb2YgdGhlc2UgdmVjdG9ycyBmbG9hdGluZyBhYm91dCwKLSAqIGFsbCBidXQgb25lIG9mIHdoaWNoIHdlIHdhbnQgdG8gZ28gYXdheS4gIEluIGEgbm9uLUdFTkVSSUMga2VybmVsLAotICogd2Ugd2FudCBvbmx5IG9uZSwgZXZlci4KLSAqCi0gKiBBY2NvbXBsaXNoIHRoaXMgaW4gdGhlIEdFTkVSSUMga2VybmVsIGJ5IHB1dGluZyBhbGwgb2YgdGhlIHZlY3RvcnMKLSAqIGluIHRoZSAuaW5pdC5kYXRhIHNlY3Rpb24gd2hlcmUgdGhleSdsbCBnbyBhd2F5LiAgV2UnbGwgY29weSB0aGUKLSAqIG9uZSB3ZSB3YW50IHRvIHRoZSByZWFsIGFscGhhX212IHZlY3RvciBpbiBzZXR1cF9hcmNoLgotICoKLSAqIEFjY29tcGxpc2ggdGhpcyBpbiBhIG5vbi1HRU5FUklDIGtlcm5lbCBieSBpZmRlZidpbmcgb3V0IGFsbCBidXQKLSAqIG9uZSBvZiB0aGUgdmVjdG9ycywgd2hpY2ggd2lsbCBub3QgcmVzaWRlIGluIC5pbml0LmRhdGEuICBXZSB0aGVuCi0gKiBhbGlhcyB0aGlzIG9uZSB2ZWN0b3IgdG8gYWxwaGFfbXYsIHNvIG5vIGNvcHkgaXMgbmVlZGVkLgotICoKLSAqIFVwc2hvdDogc2V0IF9faW5pdGRhdGEgdG8gbm90aGluZyBmb3Igbm9uLUdFTkVSSUMga2VybmVscy4KLSAqCi0gKiBOb3RlIHdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgVU5LTk9XTiBrZXJuZWwsIGFzIHdlIG5lZWQgdG8gd3JpdGUKLSAqIHRvIHRoZSBtYWNoaW5lIHZlY3RvciB3aGlsZSBzZXR0aW5nIGl0IHVwLgotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19TSF9VTktOT1dOKQotI2RlZmluZSBfX2luaXRtdiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQsX19zZWN0aW9uX18gKCIubWFjaHZlYy5pbml0IikpKQotI2RlZmluZSBBTElBU19NVih4KQotI2Vsc2UKLSNkZWZpbmUgX19pbml0bXYKLQotLyogR0NDIGFjdHVhbGx5IGhhcyBhIHN5bnRheCBmb3IgZGVmaW5pbmcgYWxpYXNlcywgYnV0IGlzIHVuZGVyIHNvbWUKLSAgIGRlbHVzaW9uIHRoYXQgeW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGRlY2xhcmUgaXQgZXh0ZXJuIHNvbWV3aGVyZQotICAgZWxzZSBiZWZvcmVoYW5kLiAgRmluZS4gIFdlJ2xsIGRvIGl0IG91cnNlbHZlcy4gICovCi0jaWYgMAotI2RlZmluZSBBTElBU19NVihzeXN0ZW0pIFwKLSAgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212IF9fYXR0cmlidXRlX18oKGFsaWFzKCJtdl8iI3N5c3RlbSkpKTsKLSNlbHNlCi0jZGVmaW5lIEFMSUFTX01WKHN5c3RlbSkgXAotICBhc20oIi5nbG9iYWwgc2hfbXZcbnNoX212ID0gbXZfIiNzeXN0ZW0gKTsKLSNlbmRpZgotI2VuZGlmIC8qIEdFTkVSSUMgKi8KLQotI2VuZGlmIC8qIF9fU0hfTUFDSFZFQ19JTklUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21tem9uZS5oIGIvaW5jbHVkZS9hc20tc2gvbW16b25lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2OWYzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL21tem9uZS5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgX19BU01fU0hfTU1aT05FX0gKKyNkZWZpbmUgX19BU01fU0hfTU1aT05FX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCitleHRlcm4gc3RydWN0IHBnbGlzdF9kYXRhICpub2RlX2RhdGFbXTsKKyNkZWZpbmUgTk9ERV9EQVRBKG5pZCkJCShub2RlX2RhdGFbbmlkXSkKKworI2RlZmluZSBub2RlX3N0YXJ0X3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4pCisjZGVmaW5lIG5vZGVfZW5kX3BmbihuaWQpCShOT0RFX0RBVEEobmlkKS0+bm9kZV9zdGFydF9wZm4gKyBcCisJCQkJIE5PREVfREFUQShuaWQpLT5ub2RlX3NwYW5uZWRfcGFnZXMpCisKK3N0YXRpYyBpbmxpbmUgaW50IHBmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJaW50IG5pZDsKKworCWZvciAobmlkID0gMDsgbmlkIDwgTUFYX05VTU5PREVTOyBuaWQrKykKKwkJaWYgKHBmbiA+PSBub2RlX3N0YXJ0X3BmbihuaWQpICYmIHBmbiA8PSBub2RlX2VuZF9wZm4obmlkKSkKKwkJCWJyZWFrOworCisJcmV0dXJuIG5pZDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBmbl90b19wZ2RhdCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlyZXR1cm4gTk9ERV9EQVRBKHBmbl90b19uaWQocGZuKSk7Cit9CisKKy8qIGFyY2gvc2gvbW0vbnVtYS5jICovCit2b2lkIF9faW5pdCBzZXR1cF9ib290bWVtX25vZGUoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0dXBfYm9vdG1lbV9ub2RlKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworfQorI2VuZGlmIC8qIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTICovCisKKy8qIFBsYXRmb3JtIHNwZWNpZmljIG1lbSBpbml0ICovCit2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKTsKKworLyogYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyAqLwordm9pZCBfX2luaXQgc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3IodW5zaWduZWQgbG9uZyBzdGFydF9wZm4pOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fQVNNX1NIX01NWk9ORV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmggYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKaW5kZXggNzQ2NGRlNC4uNmJjOWJiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaApAQCAtNjAsNiArNjAsNyBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzaG1fYWxpZ25fbWFzazsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuLCBtaW5fbG93X3BmbjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZDsKIAogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiB2b2lkIGNsZWFyX3BhZ2Vfc2xvdyh2b2lkICp0byk7CkBAIC0xMzQsNyArMTM1LDkgQEAKICNkZWZpbmUgUEZOX1NUQVJUCQkoX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUgQVJDSF9QRk5fT0ZGU0VUCQkoUEZOX1NUQVJUKQogI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpCXBmbl90b19wYWdlKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCisjaWZkZWYgQ09ORklHX0ZMQVRNRU0KICNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCSgocGZuKSA+PSBtaW5fbG93X3BmbiAmJiAocGZuKSA8IG1heF9sb3dfcGZuKQorI2VuZGlmCiAjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCiAKICNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTCShWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDIHwgXApAQCAtMTQ4LDUgKzE1MSwxMiBAQAogI2RlZmluZSBfX0hBVkVfQVJDSF9HQVRFX0FSRUEKICNlbmRpZgogCisvKgorICogU2x1YiBkZWZhdWx0cyB0byA4LWJ5dGUgYWxpZ25tZW50LCB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gNC4KKyAqIFNsYWIgZGVmYXVsdHMgdG8gQllURVNfUEVSX1dPUkQsIHdoaWNoIGVuZHMgdXAgYmVpbmcgdGhlIHNhbWUgYW55d2F5cy4KKyAqLworI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04JNAorI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04JNAorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGFycG9ydC5oIGIvaW5jbHVkZS9hc20tc2gvcGFycG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2JhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9wYXJwb3J0LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCAgVGltIFdhdWdoIDx0aW1AY3liZXJlbGsuZGVtb24uY28udWs+CisgKgorICogVGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGJ5IGRyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMuCisgKi8KKyNpZm5kZWYgX19BU01fU0hfUEFSUE9SVF9ICisjZGVmaW5lIF9fQVNNX1NIX1BBUlBPUlRfSAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X3BjX2ZpbmRfaXNhX3BvcnRzKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBhcnBvcnRfcGNfZmluZF9ub25wY2lfcG9ydHMoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKQoreworCXJldHVybiBwYXJwb3J0X3BjX2ZpbmRfaXNhX3BvcnRzKGF1dG9pcnEsIGF1dG9kbWEpOworfQorCisjZW5kaWYgLyogX19BU01fU0hfUEFSUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKaW5kZXggNWI1MjNjNy4uMjJlZmZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaApAQCAtNDAyLDEyICs0MDIsOCBAQAogI2RlZmluZSBwdGVfZmlsZShwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRSkKIAogI2lmZGVmIENPTkZJR19YMlRMQgotI2RlZmluZSBwdGVfcmVhZChwdGUpCQkoKHB0ZSkucHRlX2hpZ2ggJiBfUEFHRV9FWFRfVVNFUl9SRUFEKQotI2RlZmluZSBwdGVfZXhlYyhwdGUpCQkoKHB0ZSkucHRlX2hpZ2ggJiBfUEFHRV9FWFRfVVNFUl9FWEVDKQogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKChwdGUpLnB0ZV9oaWdoICYgX1BBR0VfRVhUX1VTRVJfV1JJVEUpCiAjZWxzZQotI2RlZmluZSBwdGVfcmVhZChwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUikKLSNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVIpCiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkocHRlX3ZhbChwdGUpICYgX1BBR0VfUlcpCiAjZW5kaWYKIApAQCAtNDIwLDIwICs0MTYsMTIgQEAKICAqIGluZGl2aWR1YWxseSB0b2dnbGVkIChhbmQgdXNlciBwZXJtaXNzaW9ucyBhcmUgZW50aXJlbHkgZGVjb3VwbGVkIGZyb20KICAqIGtlcm5lbCBwZXJtaXNzaW9ucyksIHdlIGF0dGVtcHQgdG8gY291cGxlIHRoZW0gYSBiaXQgbW9yZSBzYW5lbHkgaGVyZS4KICAqLwotUFRFX0JJVF9GVU5DKGhpZ2gsIHJkcHJvdGVjdCwgJj0gfl9QQUdFX0VYVF9VU0VSX1JFQUQpOwotUFRFX0JJVF9GVU5DKGhpZ2gsIG1rcmVhZCwgfD0gX1BBR0VfRVhUX1VTRVJfUkVBRCB8IF9QQUdFX0VYVF9LRVJOX1JFQUQpOwogUFRFX0JJVF9GVU5DKGhpZ2gsIHdycHJvdGVjdCwgJj0gfl9QQUdFX0VYVF9VU0VSX1dSSVRFKTsKIFBURV9CSVRfRlVOQyhoaWdoLCBta3dyaXRlLCB8PSBfUEFHRV9FWFRfVVNFUl9XUklURSB8IF9QQUdFX0VYVF9LRVJOX1dSSVRFKTsKLVBURV9CSVRfRlVOQyhoaWdoLCBleHByb3RlY3QsICY9IH5fUEFHRV9FWFRfVVNFUl9FWEVDKTsKLVBURV9CSVRfRlVOQyhoaWdoLCBta2V4ZWMsIHw9IF9QQUdFX0VYVF9VU0VSX0VYRUMgfCBfUEFHRV9FWFRfS0VSTl9FWEVDKTsKIFBURV9CSVRfRlVOQyhoaWdoLCBta2h1Z2UsIHw9IF9QQUdFX1NaSFVHRSk7CiAjZWxzZQotUFRFX0JJVF9GVU5DKGxvdywgcmRwcm90ZWN0LCAmPSB+X1BBR0VfVVNFUik7Ci1QVEVfQklUX0ZVTkMobG93LCBta3JlYWQsIHw9IF9QQUdFX1VTRVIpOwogUFRFX0JJVF9GVU5DKGxvdywgd3Jwcm90ZWN0LCAmPSB+X1BBR0VfUlcpOwogUFRFX0JJVF9GVU5DKGxvdywgbWt3cml0ZSwgfD0gX1BBR0VfUlcpOwotUFRFX0JJVF9GVU5DKGxvdywgZXhwcm90ZWN0LCAmPSB+X1BBR0VfVVNFUik7Ci1QVEVfQklUX0ZVTkMobG93LCBta2V4ZWMsIHw9IF9QQUdFX1VTRVIpOwogUFRFX0JJVF9GVU5DKGxvdywgbWtodWdlLCB8PSBfUEFHRV9TWkhVR0UpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKaW5kZXggZDQyZjY4ZS4uMjI1MmU3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKQEAgLTM2LDcgKzM2LDcgQEAKICAqLwogZW51bSBjcHVfdHlwZSB7CiAJLyogU0gtMiB0eXBlcyAqLwotCUNQVV9TSDc2MDQsIENQVV9TSDc2MTksCisJQ1BVX1NINzYxOSwKIAogCS8qIFNILTJBIHR5cGVzICovCiAJQ1BVX1NINzIwNiwKQEAgLTUyLDcgKzUyLDcgQEAKIAlDUFVfU0g3NzYwLCBDUFVfU1Q0MFJBLCBDUFVfU1Q0MEdYMSwgQ1BVX1NINF8yMDIsIENQVV9TSDRfNTAxLAogCiAJLyogU0gtNEEgdHlwZXMgKi8KLQlDUFVfU0g3NzcwLCBDUFVfU0g3NzgwLCBDUFVfU0g3NzgxLCBDUFVfU0g3Nzg1LAorCUNQVV9TSDc3NzAsIENQVV9TSDc3ODAsIENQVV9TSDc3ODEsIENQVV9TSDc3ODUsIENQVV9TSFgzLAogCiAJLyogU0g0QUwtRFNQIHR5cGVzICovCiAJQ1BVX1NINzMxODAsIENQVV9TSDczNDMsIENQVV9TSDc3MjIsCkBAIC0yMjgsMTEgKzIyOCw3IEBACiAJcmVncy0+c3IgJj0gflNSX0ZEOwogfQogCi0jaWZkZWYgQ09ORklHX0NQVV9TSDQKIGV4dGVybiB2b2lkIHNhdmVfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqX190c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLSNlbHNlCi0jZGVmaW5lIHNhdmVfZnB1KHRzaykJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCiAKICNkZWZpbmUgdW5sYXp5X2ZwdSh0c2ssIHJlZ3MpIGRvIHsJCQlcCiAJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpKSB7CVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmggYi9pbmNsdWRlL2FzbS1zaC9yd3NlbS5oCmluZGV4IDQ5MzFiYTguLjE5ODdmM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3J3c2VtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcndzZW0uaApAQCAtMSwxMSArMSwxNSBAQAogLyoKLSAqIGluY2x1ZGUvYXNtLXBwYy9yd3NlbS5oOiBSL1cgc2VtYXBob3JlcyBmb3IgU0ggdXNpbmcgdGhlIHN0dWZmCisgKiBpbmNsdWRlL2FzbS1zaC9yd3NlbS5oOiBSL1cgc2VtYXBob3JlcyBmb3IgU0ggdXNpbmcgdGhlIHN0dWZmCiAgKiBpbiBsaWIvcndzZW0uYy4KICAqLwogCiAjaWZuZGVmIF9BU01fU0hfUldTRU1fSAogI2RlZmluZSBfQVNNX1NIX1JXU0VNX0gKIAorI2lmbmRlZiBfTElOVVhfUldTRU1fSAorI2Vycm9yICJwbGVhc2UgZG9uJ3QgaW5jbHVkZSBhc20vcndzZW0uaCBkaXJlY3RseSwgdXNlIGxpbnV4L3J3c2VtLmggaW5zdGVhZCIKKyNlbmRpZgorCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2F0dXJuL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiOWI1ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9zYXR1cm4vaW8uaAotICoKLSAqIEkvTyBmdW5jdGlvbnMgZm9yIHVzZSBvbiB0aGUgU2VnYSBTYXR1cm4uCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKLSAqCi0gKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KLSAqLwotI2lmbmRlZiBfX0FTTV9TSF9TQVRVUk5fSU9fSAotI2RlZmluZSBfX0FTTV9TSF9TQVRVUk5fSU9fSAotCi0vKiBhcmNoL3NoL2JvYXJkcy9zYXR1cm4vaW8uYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2F0dXJuX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpOwotZXh0ZXJuIHZvaWQgKnNhdHVybl9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgc2F0dXJuX2lvdW5tYXAodm9pZCAqYWRkcik7Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9TQVRVUk5fSU9fSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vc21wYy5oIGIvaW5jbHVkZS9hc20tc2gvc2F0dXJuL3NtcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlNWMxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zYXR1cm4vc21wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXNoL3NhdHVybi9zbXBjLmgKLSAqCi0gKiBTeXN0ZW0gTWFuYWdlciAvIFBlcmlwaGVyYWwgQ29udHJvbCBkZWZpbml0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgUGF1bCBNdW5kdAotICoKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgotICovCi0jaWZuZGVmIF9fQVNNX1NIX1NBVFVSTl9TTVBDX0gKLSNkZWZpbmUgX19BU01fU0hfU0FUVVJOX1NNUENfSAotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNkZWZpbmUgU01QQ19DT01NQU5ECTB4MjAxMDAwMWYJLyogU01QQyBjb21tYW5kIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNNUENfUkVTVUxUCTB4MjAxMDAwNWYJLyogU01QQyByZXN1bHQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU01QQ19TVEFUVVMJMHgyMDEwMDA2MwkvKiBTTVBDIHN0YXR1cyByZWdpc3RlciAqLwotCi0jZGVmaW5lIFNNUENfQ01EX01TSE9OCTB4MDAwMQkJLyogTWFzdGVyIFNIIE9uICovCi0jZGVmaW5lIFNNUENfQ01EX1NTSE9OCTB4MDAwMgkJLyogU2xhdmUgU0ggT24gKi8KLSNkZWZpbmUgU01QQ19DTURfU1NIT0ZGCTB4MDAwMwkJLyogU2xhdmUgU0ggT2ZmICovCi0jZGVmaW5lIFNNUENfQ01EX1NORE9OCTB4MDAwNAkJLyogU291bmQgT24gKi8KLSNkZWZpbmUgU01QQ19DTURfU05ET0ZGCTB4MDAwNQkJLyogU291bmQgT2ZmICovCi0jZGVmaW5lIFNNUENfQ01EX0NET04JMHgwMDA2CQkvKiBDRCBPbiAqLwotI2RlZmluZSBTTVBDX0NNRF9DRE9GRgkweDAwMDcJCS8qIENEIE9mZiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wY19iYXJyaWVyKHZvaWQpCi17Ci0Jd2hpbGUgKChjdHJsX2luYihTTVBDX1NUQVRVUykgJiAweDAwMDEpID09IDB4MDAwMSkKLQkJOwotfQotCi0jZW5kaWYgLyogX19BU01fU0hfU0FUVVJOX1NNUENfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZWN0aW9ucy5oIGIvaW5jbHVkZS9hc20tc2gvc2VjdGlvbnMuaAppbmRleCA1N2FiZDcwLi4yYTY5NmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZWN0aW9ucy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NlY3Rpb25zLmgKQEAgLTMsNyArMyw3IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgogCi1leHRlcm4gY2hhciBfZW5kW107CitleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7CiAKICNlbmRpZiAvKiBfX0FTTV9TSF9TRUNUSU9OU19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmggYi9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oCmluZGV4IDE1ODNjNmIuLjU4NmE5NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2V0dXAuaApAQCAtNiw2ICs2LDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIGludCBzZXR1cF9lYXJseV9wcmludGsoY2hhciAqKTsKK3ZvaWQgc2hfbXZfc2V0dXAodm9pZCk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaAppbmRleCBkZjNiMTg3Li40ZmYxZWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2gwMy9pby5oCkBAIC0xNCwyMiArMTQsMTggQEAKICNkZWZpbmUgSU5UQ19JUFJECTB4ZmZkMDAwMTBVTAogCiAjZGVmaW5lIElSTDBfSVJRCTIKLSNkZWZpbmUgSVJMMF9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMF9JUFJfUE9TCTMKICNkZWZpbmUgSVJMMF9QUklPUklUWQkxMwogCiAjZGVmaW5lIElSTDFfSVJRCTUKLSNkZWZpbmUgSVJMMV9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMV9JUFJfUE9TCTIKICNkZWZpbmUgSVJMMV9QUklPUklUWQkxMAogCiAjZGVmaW5lIElSTDJfSVJRCTgKLSNkZWZpbmUgSVJMMl9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMl9JUFJfUE9TCTEKICNkZWZpbmUgSVJMMl9QUklPUklUWQk3CiAKICNkZWZpbmUgSVJMM19JUlEJMTEKLSNkZWZpbmUgSVJMM19JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMM19JUFJfUE9TCTAKICNkZWZpbmUgSVJMM19QUklPUklUWQk0CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NtcC5oIGIvaW5jbHVkZS9hc20tc2gvc21wLmgKaW5kZXggY2FhN2I5My4uYjk5Y2E3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc21wLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc21wLmgKQEAgLTM5LDQgKzM5LDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAorI2RlZmluZSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKQkoMCkKKwogI2VuZGlmIC8qIF9fQVNNX1NIX1NNUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oIGIvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIuaAppbmRleCAyZDcxMmU3Li4zNTU0ZTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NuYXBnZWFyLmgKQEAgLTIwLDIyICsyMCwxOCBAQAogICovCiAKICNkZWZpbmUgSVJMMF9JUlEJCTIKLSNkZWZpbmUgSVJMMF9JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMMF9JUFJfUE9TCTMKICNkZWZpbmUgSVJMMF9QUklPUklUWQkxMwogCiAjZGVmaW5lIElSTDFfSVJRCQk1Ci0jZGVmaW5lIElSTDFfSVBSX0FERFIJSU5UQ19JUFJECiAjZGVmaW5lIElSTDFfSVBSX1BPUwkyCiAjZGVmaW5lIElSTDFfUFJJT1JJVFkJMTAKIAogI2RlZmluZSBJUkwyX0lSUQkJOAotI2RlZmluZSBJUkwyX0lQUl9BRERSCUlOVENfSVBSRAogI2RlZmluZSBJUkwyX0lQUl9QT1MJMQogI2RlZmluZSBJUkwyX1BSSU9SSVRZCTcKIAogI2RlZmluZSBJUkwzX0lSUQkJMTEKLSNkZWZpbmUgSVJMM19JUFJfQUREUglJTlRDX0lQUkQKICNkZWZpbmUgSVJMM19JUFJfUE9TCTAKICNkZWZpbmUgSVJMM19QUklPUklUWQk0CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NwYXJzZW1lbS5oIGIvaW5jbHVkZS9hc20tc2gvc3BhcnNlbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3YTU0MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NwYXJzZW1lbS5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX19BU01fU0hfU1BBUlNFTUVNX0gKKyNkZWZpbmUgX19BU01fU0hfU1BBUlNFTUVNX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBTRUNUSU9OX1NJWkVfQklUUwkJMl5OOiBob3cgYmlnIGVhY2ggc2VjdGlvbiB3aWxsIGJlCisgKiBNQVhfUEhZU0FERFJfQklUUwkJMl5OOiBob3cgbXVjaCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIHdlIGhhdmUKKyAqIE1BWF9QSFlTTUVNX0JJVFMJCTJeTjogaG93IG11Y2ggbWVtb3J5IHdlIGNhbiBoYXZlIGluIHRoYXQgc3BhY2UKKyAqLworI2RlZmluZSBTRUNUSU9OX1NJWkVfQklUUwkyNgorI2RlZmluZSBNQVhfUEhZU0FERFJfQklUUwkzMgorI2RlZmluZSBNQVhfUEhZU01FTV9CSVRTCTMyCisKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fU0hfU1BBUlNFTUVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKaW5kZXggODJmM2UyMi4uN2M3NTA0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtLmgKQEAgLTgsOSArOCwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAKK3N0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CisKIC8qCiAgKglzd2l0Y2hfdG8oKSBzaG91bGQgc3dpdGNoIHRhc2tzIHRvIHRhc2sgbnIgbiwgZmlyc3QKICAqLwpAQCAtMTIyLDcgKzEyNiw3IEBACiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCWRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKLSNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIGRvIHsgeGNoZygmdmFyLCB2YWx1ZSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQogCiAvKgogICogSnVtcCB0byBQMiBhcmVhLgpAQCAtMjcxLDYgKzI3NSwxNiBAQAogdm9pZCBkaXNhYmxlX2hsdCh2b2lkKTsKIHZvaWQgZW5hYmxlX2hsdCh2b2lkKTsKIAordm9pZCBkZWZhdWx0X2lkbGUodm9pZCk7CisKK2FzbWxpbmthZ2Ugdm9pZCBicmVha19wb2ludF90cmFwKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIGRlYnVnX3RyYXBfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJICAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKTsKK2FzbWxpbmthZ2Ugdm9pZCBidWdfdHJhcF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJIHN0cnVjdCBwdF9yZWdzIF9fcmVncyk7CisKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tc2gvdG9wb2xvZ3kuaAppbmRleCBjZmYwMDFjLi5mNDAyYTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3RvcG9sb2d5LmgKQEAgLTEsNiArMSwzNiBAQAogI2lmbmRlZiBfQVNNX1NIX1RPUE9MT0dZX0gKICNkZWZpbmUgX0FTTV9TSF9UT1BPTE9HWV9ICiAKKyNpZmRlZiBDT05GSUdfTlVNQQorCisvKiBzY2hlZF9kb21haW5zIFNEX05PREVfSU5JVCBmb3Igc2ggbWFjaGluZXMgKi8KKyNkZWZpbmUgU0RfTk9ERV9JTklUIChzdHJ1Y3Qgc2NoZWRfZG9tYWluKSB7CQlcCisJLnNwYW4JCQk9IENQVV9NQVNLX05PTkUsCVwKKwkucGFyZW50CQkJPSBOVUxMLAkJCVwKKwkuY2hpbGQJCQk9IE5VTEwsCQkJXAorCS5ncm91cHMJCQk9IE5VTEwsCQkJXAorCS5taW5faW50ZXJ2YWwJCT0gOCwJCQlcCisJLm1heF9pbnRlcnZhbAkJPSAzMiwJCQlcCisJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKKwkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAorCS5jYWNoZV9uaWNlX3RyaWVzCT0gMiwJCQlcCisJLmJ1c3lfaWR4CQk9IDMsCQkJXAorCS5pZGxlX2lkeAkJPSAyLAkJCVwKKwkubmV3aWRsZV9pZHgJCT0gMCwJCQlcCisJLndha2VfaWR4CQk9IDEsCQkJXAorCS5mb3JrZXhlY19pZHgJCT0gMSwJCQlcCisJLmZsYWdzCQkJPSBTRF9MT0FEX0JBTEFOQ0UJXAorCQkJCXwgU0RfQkFMQU5DRV9GT1JLCVwKKwkJCQl8IFNEX0JBTEFOQ0VfRVhFQwlcCisJCQkJfCBTRF9TRVJJQUxJWkUJCVwKKwkJCQl8IFNEX1dBS0VfQkFMQU5DRSwJXAorCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKKwkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJXAorCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXAorfQorCisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CiAKICNlbmRpZiAvKiBfQVNNX1NIX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaAppbmRleCA1YzQ5ZWQ2Li5mMThhMWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdWFjY2Vzcy5oCkBAIC02MSw4ICs2MSw2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IF9fYWNjZXNzX29rKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWV4dGVybiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZDsKLQogCXJldHVybiAoKGFkZHIgPj0gbWVtb3J5X3N0YXJ0KSAmJiAoKGFkZHIgKyBzaXplKSA8IG1lbW9yeV9lbmQpKTsKIH0KICNlbHNlIC8qIENPTkZJR19NTVUgKi8KQEAgLTc2LDcgKzc0LDcgQEAKICAqIF9fYWNjZXNzX29rOiBDaGVjayBpZiBhZGRyZXNzIHdpdGggc2l6ZSBpcyBPSyBvciBub3QuCiAgKgogICogV2UgZG8gdGhyZWUgY2hlY2tzOgotICogKDEpIGlzIGl0IHVzZXIgc3BhY2U/IAorICogKDEpIGlzIGl0IHVzZXIgc3BhY2U/CiAgKiAoMikgYWRkciArIHNpemUgLS0+IGNhcnJ5PwogICogKDMpIGFkZHIgKyBzaXplID49IDB4ODAwMDAwMDAgIChQQUdFX09GRlNFVCkKICAqCkBAIC0xNDIsMTEgKzE0MCwxMiBAQAogICBfX2dldF91c2VyX25vY2hlY2soKHgpLChwdHIpLHNpemVvZigqKHB0cikpKQogCiBzdHJ1Y3QgX19sYXJnZV9zdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIGJ1ZlsxMDBdOyB9OwotI2RlZmluZSBfX20oeCkgKCooc3RydWN0IF9fbGFyZ2Vfc3RydWN0ICopKHgpKQorI2RlZmluZSBfX20oeCkgKCooc3RydWN0IF9fbGFyZ2Vfc3RydWN0IF9fdXNlciAqKSh4KSkKIAogI2RlZmluZSBfX2dldF91c2VyX3NpemUoeCxwdHIsc2l6ZSxyZXR2YWwpCQkJXAogZG8gewkJCQkJCQkJXAogCXJldHZhbCA9IDA7CQkJCQkJXAorCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJXAogCWNhc2UgMToJCQkJCQkJXAogCQlfX2dldF91c2VyX2FzbSh4LCBwdHIsIHJldHZhbCwgImIiKTsJCVwKQEAgLTE3NSw2ICsxNzQsNyBAQAogI2RlZmluZSBfX2dldF91c2VyX2NoZWNrKHgscHRyLHNpemUpCQkJCVwKICh7CQkJCQkJCQlcCiAJbG9uZyBfX2d1X2VyciwgX19ndV92YWw7CQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAogCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKIAljYXNlIDE6CQkJCQkJCVwKIAkJX19nZXRfdXNlcl8xKF9fZ3VfdmFsLCAocHRyKSwgX19ndV9lcnIpOwlcCkBAIC0zMDAsNiArMzAwLDcgQEAKICNkZWZpbmUgX19wdXRfdXNlcl9zaXplKHgscHRyLHNpemUscmV0dmFsKQkJXAogZG8gewkJCQkJCQlcCiAJcmV0dmFsID0gMDsJCQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQlcCiAJY2FzZSAxOgkJCQkJCVwKIAkJX19wdXRfdXNlcl9hc20oeCwgcHRyLCByZXR2YWwsICJiIik7CVwKQEAgLTMyOCw3ICszMjksNyBAQAogI2RlZmluZSBfX3B1dF91c2VyX2NoZWNrKHgscHRyLHNpemUpCQkJCVwKICh7CQkJCQkJCQlcCiAJbG9uZyBfX3B1X2VyciA9IC1FRkFVTFQ7CQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgKl9fcHVfYWRkciA9IChwdHIpOwkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX191c2VyICpfX3B1X2FkZHIgPSAocHRyKTsJCVwKIAkJCQkJCQkJXAogCWlmIChfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZylfX3B1X2FkZHIsc2l6ZSkpCQlcCiAJCV9fcHV0X3VzZXJfc2l6ZSgoeCksX19wdV9hZGRyLChzaXplKSxfX3B1X2Vycik7CVwKQEAgLTQwNiwxMCArNDA3LDEwIEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgX19wdXRfdXNlcl91bmtub3duKHZvaWQpOwotDAorCiAvKiBHZW5lcmljIGFyYml0cmFyeSBzaXplZCBjb3B5LiAgKi8KIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIE5PVCBjb3BpZWQgKi8KLWV4dGVybiBfX2tlcm5lbF9zaXplX3QgX19jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIF9fa2VybmVsX3NpemVfdCBuKTsKK19fa2VybmVsX3NpemVfdCBfX2NvcHlfdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgX19rZXJuZWxfc2l6ZV90IG4pOwogCiAjZGVmaW5lIGNvcHlfdG9fdXNlcih0byxmcm9tLG4pICh7IFwKIHZvaWQgKl9fY29weV90byA9ICh2b2lkICopICh0byk7IFwKQEAgLTQyMCwxNCArNDIxLDYgQEAKIH0gZWxzZSBfX2NvcHlfcmVzID0gX19jb3B5X3NpemU7IFwKIF9fY29weV9yZXM7IH0pCiAKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sZnJvbSxuKQkJXAotCV9fY29weV91c2VyKCh2b2lkICopKHRvKSwJCVwKLQkJICAgICh2b2lkICopKGZyb20pLCBuKQotCi0jZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljIF9fY29weV90b191c2VyCi0jZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMgX19jb3B5X2Zyb21fdXNlcgotCi0KICNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sZnJvbSxuKSAoeyBcCiB2b2lkICpfX2NvcHlfdG8gPSAodm9pZCAqKSAodG8pOyBcCiB2b2lkICpfX2NvcHlfZnJvbSA9ICh2b2lkICopIChmcm9tKTsgXApAQCAtNDM4LDkgKzQzMSwyMCBAQAogfSBlbHNlIF9fY29weV9yZXMgPSBfX2NvcHlfc2l6ZTsgXAogX19jb3B5X3JlczsgfSkKIAotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLGZyb20sbikJCVwKLQlfX2NvcHlfdXNlcigodm9pZCAqKSh0byksCQlcCi0JCSAgICAodm9pZCAqKShmcm9tKSwgbikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZworX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgKilmcm9tLCBuKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJcmV0dXJuIF9fY29weV91c2VyKChfX2ZvcmNlIHZvaWQgKil0bywgZnJvbSwgbik7Cit9CisKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCiAKIC8qCiAgKiBDbGVhciB0aGUgYXJlYSBhbmQgcmV0dXJuIHJlbWFpbmluZyBudW1iZXIgb2YgYnl0ZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3ViYy5oIGIvaW5jbHVkZS9hc20tc2gvdWJjLmgKaW5kZXggYWU5YmJkZS4uMzhkNDZlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdWJjLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdWJjLmgKQEAgLTUxLDkgKzUxLDE0IEBACiAjZGVmaW5lIEJSQ1JfVUJERQkJKDEgPDwgMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLS8qIGFyY2gvc2gva2VybmVsL3ViYy5TICovCi1leHRlcm4gdm9pZCB1YmNfd2FrZXVwKHZvaWQpOworLyogYXJjaC9zaC9rZXJuZWwvY3B1L3ViYy5TICovCiBleHRlcm4gdm9pZCB1YmNfc2xlZXAodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfVUJDX1dBS0VVUAorZXh0ZXJuIHZvaWQgdWJjX3dha2V1cCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHViY193YWtldXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKICNlbmRpZgogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9mYi5oIGIvaW5jbHVkZS9hc20tc2g2NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L2ZiLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfQVNNX0ZCX0hfCisjZGVmaW5lIF9BU01fRkJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF93cml0ZWNvbWJpbmUodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc2g2NC9wZ3RhYmxlLmgKaW5kZXggYjg3NTQ4Mi4uMzQ4OGZlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9wZ3RhYmxlLmgKQEAgLTQxNSwyMiArNDE1LDE1IEBACiAvKgogICogVGhlIGZvbGxvd2luZyBoYXZlIGRlZmluZWQgYmVoYXZpb3Igb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9SRUFEOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0VYRUNVVEU7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRklMRTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURTsgfQogCi1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX1JFQUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9XUklURSkpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0VYRUNVVEUpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0FDQ0VTU0VEKSk7IHJldHVybiBwdGU7IH0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JFQUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9XUklURSkpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRVhFQ1VURSkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2RpcnR5KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0RJUlRZKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtodWdlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1NaSFVHRSkpOyByZXR1cm4gcHRlOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9mYi5oIGIvaW5jbHVkZS9hc20tc3BhcmMvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvZmIuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisKKyNkZWZpbmUgZmJfcGdwcm90ZWN0KC4uLikgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcGd0YWJsZS5oCmluZGV4IDU5MjI5YWUuLmE1NWY0YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9wZ3RhYmxlLmgKQEAgLTE1MSw3ICsxNTEsNiBAQAogQlRGSVhVUERFRl9TRVRISShub25lX21hc2spCiBCVEZJWFVQREVGX0NBTExfQ09OU1QoaW50LCBwdGVfcHJlc2VudCwgcHRlX3QpCiBCVEZJWFVQREVGX0NBTEwodm9pZCwgcHRlX2NsZWFyLCBwdGVfdCAqKQotQlRGSVhVUERFRl9DQUxMKGludCwgcHRlX3JlYWQsIHB0ZV90KQogCiBzdGF0aWMgaW5saW5lIGludCBwdGVfbm9uZShwdGVfdCBwdGUpCiB7CkBAIC0xNjAsNyArMTU5LDYgQEAKIAogI2RlZmluZSBwdGVfcHJlc2VudChwdGUpIEJURklYVVBfQ0FMTChwdGVfcHJlc2VudCkocHRlKQogI2RlZmluZSBwdGVfY2xlYXIobW0sYWRkcixwdGUpIEJURklYVVBfQ0FMTChwdGVfY2xlYXIpKHB0ZSkKLSNkZWZpbmUgcHRlX3JlYWQocHRlKSBCVEZJWFVQX0NBTEwocHRlX3JlYWQpKHB0ZSkKIAogQlRGSVhVUERFRl9DQUxMX0NPTlNUKGludCwgcG1kX2JhZCwgcG1kX3QpCiBCVEZJWFVQREVGX0NBTExfQ09OU1QoaW50LCBwbWRfcHJlc2VudCwgcG1kX3QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2J1Z3MuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYnVncy5oCmluZGV4IGJmMzlkODYuLjExYWRlNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYnVncy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYnVncy5oCkBAIC00LDEyICs0LDcgQEAKICAqLwogI2luY2x1ZGUgPGFzbS9zc3RhdGUuaD4KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwotCiBzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfYnVncyh2b2lkKQogewotI2lmbmRlZiBDT05GSUdfU01QCi0JY3B1X2RhdGEoMCkudWRlbGF5X3ZhbCA9IGxvb3BzX3Blcl9qaWZmeTsKLSNlbmRpZgogCXNzdGF0ZV9ydW5uaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9jb21wYXQuaAppbmRleCAzNjUxMWNhLi4wMWZlNjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY29tcGF0LmgKQEAgLTMxLDggKzMxLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0CQljb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NAkJY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2NwdWRhdGEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCmluZGV4IDQ0NTAyNmYuLjk4YTZlNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvY3B1ZGF0YS5oCkBAIC0xOSw3ICsxOSw3IEBACiAJdW5zaWduZWQgaW50CV9fc29mdGlycV9wZW5kaW5nOyAvKiBtdXN0IGJlIDFzdCwgc2VlIHJ0cmFwLlMgKi8KIAl1bnNpZ25lZCBpbnQJX19wYWQwOwogCXVuc2lnbmVkIGxvbmcJY2xvY2tfdGljazsJLyogJXRpY2sncyBwZXIgc2Vjb25kICovCi0JdW5zaWduZWQgbG9uZwl1ZGVsYXlfdmFsOworCXVuc2lnbmVkIGxvbmcJX19wYWQ7CiAJdW5zaWduZWQgaW50CV9fcGFkMTsKIAl1bnNpZ25lZCBpbnQJX19wYWQyOwogCkBAIC04MCw3ICs4MCw4IEBACiAJdW5zaWduZWQgaW50CQlkZXZfbW9uZG9fcW1hc2s7CiAJdW5zaWduZWQgaW50CQlyZXN1bV9xbWFzazsKIAl1bnNpZ25lZCBpbnQJCW5vbnJlc3VtX3FtYXNrOwotCXVuc2lnbmVkIGludAkJX19wYWQyWzNdOworCXVuc2lnbmVkIGludAkJX19wYWQyWzFdOworCXZvaWQJCQkqaGRlc2M7CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNjQpKSk7CiBleHRlcm4gc3RydWN0IHRyYXBfcGVyX2NwdSB0cmFwX2Jsb2NrW05SX0NQVVNdOwogZXh0ZXJuIHZvaWQgaW5pdF9jdXJfY3B1X3RyYXAoc3RydWN0IHRocmVhZF9pbmZvICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9kZWxheS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9kZWxheS5oCmluZGV4IGE0YWFlNmYuLmE3N2FhNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZGVsYXkuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2RlbGF5LmgKQEAgLTEsMzcgKzEsMTcgQEAKIC8qIGRlbGF5Lmg6IExpbnV4IGRlbGF5IHJvdXRpbmVzIG9uIHNwYXJjNjQuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA0IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkuCi0gKgotICogQmFzZWQgaGVhdmlseSB1cG9uIHg4NiB2YXJpYW50IHdoaWNoIGlzOgotICogQ29weXJpZ2h0IChDKSAxOTkzIExpbnVzIFRvcnZhbGRzCi0gKgotICogRGVsYXkgcm91dGluZXMgY2FsbGluZyBmdW5jdGlvbnMgaW4gYXJjaC9zcGFyYzY0L2xpYi9kZWxheS5jCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDQsIDIwMDcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KS4KICAqLwogCi0jaWZuZGVmIF9fU1BBUkM2NF9ERUxBWV9ICi0jZGVmaW5lIF9fU1BBUkM2NF9ERUxBWV9ICi0KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CisjaWZuZGVmIF9TUEFSQzY0X0RFTEFZX0gKKyNkZWZpbmUgX1NQQVJDNjRfREVMQVlfSAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1leHRlcm4gdm9pZCBfX2JhZF91ZGVsYXkodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2JhZF9uZGVsYXkodm9pZCk7Ci0KLWV4dGVybiB2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpOwotZXh0ZXJuIHZvaWQgX19uZGVsYXkodW5zaWduZWQgbG9uZyBuc2Vjcyk7Ci1leHRlcm4gdm9pZCBfX2NvbnN0X3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKIGV4dGVybiB2b2lkIF9fZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcyk7Ci0KLSNkZWZpbmUgdWRlbGF5KG4pIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/IFwKLQkoKG4pID4gMjAwMDAgPyBfX2JhZF91ZGVsYXkoKSA6IF9fY29uc3RfdWRlbGF5KChuKSAqIDB4MTBjN3VsKSkgOiBcCi0JX191ZGVsYXkobikpCi0JCi0jZGVmaW5lIG5kZWxheShuKSAoX19idWlsdGluX2NvbnN0YW50X3AobikgPyBcCi0JKChuKSA+IDIwMDAwID8gX19iYWRfbmRlbGF5KCkgOiBfX2NvbnN0X3VkZWxheSgobikgKiA1dWwpKSA6IFwKLQlfX25kZWxheShuKSkKK2V4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKKyNkZWZpbmUgbWRlbGF5KG4pCXVkZWxheSgobikgKiAxMDAwKQogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCi0jZW5kaWYgLyogZGVmaW5lZChfX1NQQVJDNjRfREVMQVlfSCkgKi8KKyNlbmRpZiAvKiBfU1BBUkM2NF9ERUxBWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjZDNhMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmIuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYl9pc19wcmltYXJ5X2RldmljZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9BU01fRkJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHZ0cmFtcC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9odnRyYW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZDZhZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHZ0cmFtcC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX1NQQVJDNjRfSFZUUkFQX0gKKyNkZWZpbmUgX1NQQVJDNjRfSFZUUkFQX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBodnRyYW1wX21hcHBpbmcgeworCV9fdTY0CQl2YWRkcjsKKwlfX3U2NAkJdHRlOworfTsKKworc3RydWN0IGh2dHJhbXBfZGVzY3IgeworCV9fdTMyCQkJY3B1OworCV9fdTMyCQkJbnVtX21hcHBpbmdzOworCV9fdTY0CQkJZmF1bHRfaW5mb192YTsKKwlfX3U2NAkJCWZhdWx0X2luZm9fcGE7CisJX191NjQJCQl0aHJlYWRfcmVnOworCXN0cnVjdCBodnRyYW1wX21hcHBpbmcJbWFwc1syXTsKK307CisKK2V4dGVybiB2b2lkIGh2X2NwdV9zdGFydHVwKHVuc2lnbmVkIGxvbmcgaHZkZXNjcl9wYSk7CisKKyNlbmRpZgorCisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfQ1BVCQkweDAwCisjZGVmaW5lIEhWVFJBTVBfREVTQ1JfTlVNX01BUFBJTkdTCTB4MDQKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9GQVVMVF9JTkZPX1ZBCTB4MDgKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9GQVVMVF9JTkZPX1BBCTB4MTAKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9USFJFQURfUkVHCTB4MTgKKyNkZWZpbmUgSFZUUkFNUF9ERVNDUl9NQVBTCQkweDIwCisKKyNkZWZpbmUgSFZUUkFNUF9NQVBQSU5HX1ZBRERSCQkweDAwCisjZGVmaW5lIEhWVFJBTVBfTUFQUElOR19UVEUJCTB4MDgKKyNkZWZpbmUgSFZUUkFNUF9NQVBQSU5HX1NJWkUJCTB4MTAKKworI2VuZGlmIC8qIF9TUEFSQzY0X0hWVFJBUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2h5cGVydmlzb3IuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHlwZXJ2aXNvci5oCmluZGV4IGRiMjEzMGEuLjUyNGQ0OTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHlwZXJ2aXNvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaHlwZXJ2aXNvci5oCkBAIC05OCw3ICs5OCw3IEBACiAjZGVmaW5lIEhWX0ZBU1RfTUFDSF9FWElUCQkweDAwCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi1leHRlcm4gdm9pZCBzdW40dl9tYWNoX2V4aXQodW5zaWduZWQgbG9uZyBleGl0X2NvcmUpOworZXh0ZXJuIHZvaWQgc3VuNHZfbWFjaF9leGl0KHVuc2lnbmVkIGxvbmcgZXhpdF9jb2RlKTsKICNlbmRpZgogCiAvKiBEb21haW4gc2VydmljZXMuICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKaW5kZXggOTA3ODFlMy4uZTZjNDM2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCkBAIC01Myw2ICs1Myw4IEBACiBleHRlcm4gdm9pZCBzdW40dl9kZXN0cm95X21zaSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBzYnVzX2J1aWxkX2lycSh2b2lkICpzYnVzLCB1bnNpZ25lZCBpbnQgaW5vKTsKIAorZXh0ZXJuIHZvaWQgZml4dXBfaXJxcyh2b2lkKTsKKwogc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfc29mdGludCh1bnNpZ25lZCBsb25nIGJpdHMpCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndyCSUwLCAweDAsICUlc2V0X3NvZnRpbnQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2xkYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9sZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGI1MjRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9sZGMuaApAQCAtMCwwICsxLDEzOCBAQAorI2lmbmRlZiBfU1BBUkM2NF9MRENfSAorI2RlZmluZSBfU1BBUkM2NF9MRENfSAorCisjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKworZXh0ZXJuIGludCBsZG9tX2RvbWFpbmluZ19lbmFibGVkOworZXh0ZXJuIHZvaWQgbGRvbV9zZXRfdmFyKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpOworZXh0ZXJuIHZvaWQgbGRvbV9yZWJvb3QoY29uc3QgY2hhciAqYm9vdF9jb21tYW5kKTsKK2V4dGVybiB2b2lkIGxkb21fcG93ZXJfb2ZmKHZvaWQpOworCisvKiBUaGUgZXZlbnQgaGFuZGxlciB3aWxsIGJlIGV2b2tlZCB3aGVuIGxpbmsgc3RhdGUgY2hhbmdlcworICogb3IgZGF0YSBiZWNvbWVzIGF2YWlsYWJsZSBvbiB0aGUgcmVjZWl2ZSBzaWRlLgorICoKKyAqIEZvciBub24tUkFXIGxpbmtzLCBpZiB0aGUgTERDX0VWRU5UX1JFU0VUIGV2ZW50IGFycml2ZXMgdGhlCisgKiBkcml2ZXIgc2hvdWxkIHJlc2V0IGFsbCBvZiBpdCdzIGludGVybmFsIHN0YXRlIGFuZCByZWludm9rZQorICogbGRjX2Nvbm5lY3QoKSB0byB0cnkgYW5kIGJyaW5nIHRoZSBsaW5rIHVwIGFnYWluLgorICoKKyAqIEZvciBSQVcgbGlua3MsIGxkY19jb25uZWN0KCkgaXMgbm90IHVzZWQuICBJbnN0ZWFkIHRoZSBkcml2ZXIKKyAqIGp1c3Qgd2FpdHMgZm9yIHRoZSBMRENfRVZFTlRfVVAgZXZlbnQuCisgKi8KK3N0cnVjdCBsZGNfY2hhbm5lbF9jb25maWcgeworCXZvaWQgKCpldmVudCkodm9pZCAqYXJnLCBpbnQgZXZlbnQpOworCisJdTMyCQkJbXR1OworCXVuc2lnbmVkIGludAkJcnhfaXJxOworCXVuc2lnbmVkIGludAkJdHhfaXJxOworCXU4CQkJbW9kZTsKKyNkZWZpbmUgTERDX01PREVfUkFXCQkweDAwCisjZGVmaW5lIExEQ19NT0RFX1VOUkVMSUFCTEUJMHgwMQorI2RlZmluZSBMRENfTU9ERV9SRVNFUlZFRAkweDAyCisjZGVmaW5lIExEQ19NT0RFX1NUUkVBTQkJMHgwMworCisJdTgJCQlkZWJ1ZzsKKyNkZWZpbmUgTERDX0RFQlVHX0hTCQkweDAxCisjZGVmaW5lIExEQ19ERUJVR19TVEFURQkJMHgwMgorI2RlZmluZSBMRENfREVCVUdfUlgJCTB4MDQKKyNkZWZpbmUgTERDX0RFQlVHX1RYCQkweDA4CisjZGVmaW5lIExEQ19ERUJVR19EQVRBCQkweDEwCit9OworCisjZGVmaW5lIExEQ19FVkVOVF9SRVNFVAkJMHgwMQorI2RlZmluZSBMRENfRVZFTlRfVVAJCTB4MDIKKyNkZWZpbmUgTERDX0VWRU5UX0RBVEFfUkVBRFkJMHgwNAorCisjZGVmaW5lIExEQ19TVEFURV9JTlZBTElECTB4MDAKKyNkZWZpbmUgTERDX1NUQVRFX0lOSVQJCTB4MDEKKyNkZWZpbmUgTERDX1NUQVRFX0JPVU5ECQkweDAyCisjZGVmaW5lIExEQ19TVEFURV9SRUFEWQkJMHgwMworI2RlZmluZSBMRENfU1RBVEVfQ09OTkVDVEVECTB4MDQKKworc3RydWN0IGxkY19jaGFubmVsOworCisvKiBBbGxvY2F0ZSBzdGF0ZSBmb3IgYSBjaGFubmVsLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxkY19hbGxvYyh1bnNpZ25lZCBsb25nIGlkLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGxkY19jaGFubmVsX2NvbmZpZyAqY2ZncCwKKwkJCQkgICAgIHZvaWQgKmV2ZW50X2FyZyk7CisKKy8qIFNodXQgZG93biBhbmQgZnJlZSBzdGF0ZSBmb3IgYSBjaGFubmVsLiAgKi8KK2V4dGVybiB2b2lkIGxkY19mcmVlKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApOworCisvKiBSZWdpc3RlciBUWCBhbmQgUlggcXVldWVzIG9mIHRoZSBsaW5rIHdpdGggdGhlIGh5cGVydmlzb3IuICAqLworZXh0ZXJuIGludCBsZGNfYmluZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyogRm9yIG5vbi1SQVcgcHJvdG9jb2xzIHdlIG5lZWQgdG8gY29tcGxldGUgYSBoYW5kc2hha2UgYmVmb3JlCisgKiBjb21tdW5pY2F0aW9uIGNhbiBwcm9jZWVkLiAgbGRjX2Nvbm5lY3QoKSBkb2VzIHRoYXQsIGlmIHRoZQorICogaGFuZHNoYWtlIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIGFuIExEQ19FVkVOVF9VUCBldmVudCB3aWxsCisgKiBiZSBzZW50IHVwIHRvIHRoZSBkcml2ZXIuCisgKi8KK2V4dGVybiBpbnQgbGRjX2Nvbm5lY3Qoc3RydWN0IGxkY19jaGFubmVsICpscCk7CitleHRlcm4gaW50IGxkY19kaXNjb25uZWN0KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHApOworCitleHRlcm4gaW50IGxkY19zdGF0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwKTsKKworLyogUmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucy4gIE9ubHkgdmFsaWQgd2hlbiB0aGUgbGluayBpcyB1cC4gICovCitleHRlcm4gaW50IGxkY193cml0ZShzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCBjb25zdCB2b2lkICpidWYsCisJCSAgICAgdW5zaWduZWQgaW50IHNpemUpOworZXh0ZXJuIGludCBsZGNfcmVhZChzdHJ1Y3QgbGRjX2NoYW5uZWwgKmxwLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBzaXplKTsKKworI2RlZmluZSBMRENfTUFQX1NIQURPVwkweDAxCisjZGVmaW5lIExEQ19NQVBfRElSRUNUCTB4MDIKKyNkZWZpbmUgTERDX01BUF9JTwkweDA0CisjZGVmaW5lIExEQ19NQVBfUgkweDA4CisjZGVmaW5lIExEQ19NQVBfVwkweDEwCisjZGVmaW5lIExEQ19NQVBfWAkweDIwCisjZGVmaW5lIExEQ19NQVBfUlcJKExEQ19NQVBfUiB8IExEQ19NQVBfVykKKyNkZWZpbmUgTERDX01BUF9SV1gJKExEQ19NQVBfUiB8IExEQ19NQVBfVyB8IExEQ19NQVBfWCkKKyNkZWZpbmUgTERDX01BUF9BTEwJMHgwM2YKKworc3RydWN0IGxkY190cmFuc19jb29raWUgeworCXU2NAkJCWNvb2tpZV9hZGRyOworCXU2NAkJCWNvb2tpZV9zaXplOworfTsKKworc3RydWN0IHNjYXR0ZXJsaXN0OworZXh0ZXJuIGludCBsZGNfbWFwX3NnKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fc2csCisJCSAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMsCisJCSAgICAgIHVuc2lnbmVkIGludCBtYXBfcGVybSk7CisKK2V4dGVybiBpbnQgbGRjX21hcF9zaW5nbGUoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCSAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICBzdHJ1Y3QgbGRjX3RyYW5zX2Nvb2tpZSAqY29va2llcywgaW50IG5jb29raWVzLAorCQkJICB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pOworCitleHRlcm4gdm9pZCBsZGNfdW5tYXAoc3RydWN0IGxkY19jaGFubmVsICpscCwgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsCisJCSAgICAgIGludCBuY29va2llcyk7CisKK2V4dGVybiBpbnQgbGRjX2NvcHkoc3RydWN0IGxkY19jaGFubmVsICpscCwgaW50IGNvcHlfZGlyLAorCQkgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLCBpbnQgbmNvb2tpZXMpOworCitzdGF0aWMgaW5saW5lIGludCBsZGNfZ2V0X2RyaW5nX2VudHJ5KHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsCisJCQkJICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkJCSAgICAgIGludCBuY29va2llcykKK3sKKwlyZXR1cm4gbGRjX2NvcHkobHAsIExEQ19DT1BZX0lOLCBidWYsIGxlbiwgb2Zmc2V0LCBjb29raWVzLCBuY29va2llcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxkY19wdXRfZHJpbmdfZW50cnkoc3RydWN0IGxkY19jaGFubmVsICpscCwKKwkJCQkgICAgICB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsCisJCQkJICAgICAgaW50IG5jb29raWVzKQoreworCXJldHVybiBsZGNfY29weShscCwgTERDX0NPUFlfT1VULCBidWYsIGxlbiwgb2Zmc2V0LCBjb29raWVzLCBuY29va2llcyk7Cit9CisKK2V4dGVybiB2b2lkICpsZGNfYWxsb2NfZXhwX2RyaW5nKHN0cnVjdCBsZGNfY2hhbm5lbCAqbHAsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHN0cnVjdCBsZGNfdHJhbnNfY29va2llICpjb29raWVzLAorCQkJCSBpbnQgKm5jb29raWVzLCB1bnNpZ25lZCBpbnQgbWFwX3Blcm0pOworCitleHRlcm4gdm9pZCBsZGNfZnJlZV9leHBfZHJpbmcoc3RydWN0IGxkY19jaGFubmVsICpscCwgdm9pZCAqYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sCisJCQkgICAgICAgc3RydWN0IGxkY190cmFuc19jb29raWUgKmNvb2tpZXMsIGludCBuY29va2llcyk7CisKKyNlbmRpZiAvKiBfU1BBUkM2NF9MRENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tZGVzYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9tZGVzYy5oCmluZGV4IGM2MzgzOTguLmU5N2M0MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvbWRlc2MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21kZXNjLmgKQEAgLTIsMzggKzIsNjYgQEAKICNkZWZpbmUgX1NQQVJDNjRfTURFU0NfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAotc3RydWN0IG1kZXNjX25vZGU7Ci1zdHJ1Y3QgbWRlc2NfYXJjIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZQkqYXJjOwotfTsKK3N0cnVjdCBtZGVzY19oYW5kbGU7CiAKLXN0cnVjdCBtZGVzY19ub2RlIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQl1NjQJCQlub2RlOwotCXVuc2lnbmVkIGludAkJdW5pcXVlX2lkOwotCXVuc2lnbmVkIGludAkJbnVtX2FyY3M7Ci0JdW5zaWduZWQgaW50CQlpcnFzWzJdOwotCXN0cnVjdCBwcm9wZXJ0eQkJKnByb3BlcnRpZXM7Ci0Jc3RydWN0IG1kZXNjX25vZGUJKmhhc2hfbmV4dDsKLQlzdHJ1Y3QgbWRlc2Nfbm9kZQkqYWxsbm9kZXNfbmV4dDsKLQlzdHJ1Y3QgbWRlc2NfYXJjCWFyY3NbMF07Ci19OworLyogTWFjaGluZSBkZXNjcmlwdGlvbiBvcGVyYXRpb25zIGFyZSB0byBiZSBzdXJyb3VuZGVkIGJ5IGdyYWIgYW5kCisgKiByZWxlYXNlIGNhbGxzLiAgVGhlIG1kZXNjX2hhbmRsZSByZXR1cm5lZCBmcm9tIHRoZSBncmFiIGlzCisgKiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYWxsIG9mIHRoZSBvcGVyYXRpb25hbCBjYWxscyB0aGF0IHdvcmsKKyAqIG9uIG1kZXNjcy4KKyAqLworZXh0ZXJuIHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kZXNjX2dyYWIodm9pZCk7CitleHRlcm4gdm9pZCBtZGVzY19yZWxlYXNlKHN0cnVjdCBtZGVzY19oYW5kbGUgKik7CiAKLWV4dGVybiBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbWRfZmluZF9ub2RlX2J5X25hbWUoc3RydWN0IG1kZXNjX25vZGUgKmZyb20sCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKLSNkZWZpbmUgbWRfZm9yX2VhY2hfbm9kZV9ieV9uYW1lKF9fbW4sIF9fbmFtZSkgXAotCWZvciAoX19tbiA9IG1kX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsIF9fbmFtZSk7IF9fbW47IFwKLQkgICAgIF9fbW4gPSBtZF9maW5kX25vZGVfYnlfbmFtZShfX21uLCBfX25hbWUpKQorI2RlZmluZSBNREVTQ19OT0RFX05VTEwJCSh+KHU2NCkwKQogCi1leHRlcm4gc3RydWN0IHByb3BlcnR5ICptZF9maW5kX3Byb3BlcnR5KGNvbnN0IHN0cnVjdCBtZGVzY19ub2RlICptcCwKLQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSBpbnQgKmxlbnApOwotZXh0ZXJuIGNvbnN0IHZvaWQgKm1kX2dldF9wcm9wZXJ0eShjb25zdCBzdHJ1Y3QgbWRlc2Nfbm9kZSAqbXAsCi0JCQkJICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICBpbnQgKmxlbnApOworZXh0ZXJuIHU2NCBtZGVzY19ub2RlX2J5X25hbWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICAgdTY0IGZyb21fbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CisjZGVmaW5lIG1kZXNjX2Zvcl9lYWNoX25vZGVfYnlfbmFtZShfX2hkbCwgX19ub2RlLCBfX25hbWUpIFwKKwlmb3IgKF9fbm9kZSA9IG1kZXNjX25vZGVfYnlfbmFtZShfX2hkbCwgTURFU0NfTk9ERV9OVUxMLCBfX25hbWUpOyBcCisJICAgICAoX19ub2RlKSAhPSBNREVTQ19OT0RFX05VTEw7IFwKKwkgICAgIF9fbm9kZSA9IG1kZXNjX25vZGVfYnlfbmFtZShfX2hkbCwgX19ub2RlLCBfX25hbWUpKQorCisvKiBBY2Nlc3MgdG8gcHJvcGVydHkgdmFsdWVzIHJldHVybmVkIGZyb20gbWRlc2NfZ2V0X3Byb3BlcnR5KCkgYXJlCisgKiBvbmx5IHZhbGlkIGluc2lkZSBvZiBhIG1kZXNjX2dyYWIoKS9tZGVzY19yZWxlYXNlKCkgc2VxdWVuY2UuCisgKiBPbmNlIG1kZXNjX3JlbGVhc2UoKSBpcyBjYWxsZWQsIHRoZSBtZW1vcnkgYmFja2VkIHVwIGJ5IHRoZXNlCisgKiBwb2ludGVycyBtYXkgcmVmZXJlbmNlIGZyZWVkIHVwIG1lbW9yeS4KKyAqCisgKiBUaGVyZWZvcmUgY2FsbGVycyBtdXN0IG1ha2UgY29waWVzIG9mIGFueSBwcm9wZXJ0eSB2YWx1ZXMKKyAqIHRoZXkgbmVlZC4KKyAqCisgKiBUaGVzZSBzYW1lIHJ1bGVzIGFwcGx5IHRvIG1kZXNjX25vZGVfbmFtZSgpLgorICovCitleHRlcm4gY29uc3Qgdm9pZCAqbWRlc2NfZ2V0X3Byb3BlcnR5KHN0cnVjdCBtZGVzY19oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICAgICB1NjQgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKTsKK2V4dGVybiBjb25zdCBjaGFyICptZGVzY19ub2RlX25hbWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBub2RlKTsKKworLyogTUQgYXJjIGl0ZXJhdGlvbiwgdGhlIHN0YW5kYXJkIHNlcXVlbmNlIGlzOgorICoKKyAqCXVuc2lnbmVkIGxvbmcgYXJjOworICoJbWRlc2NfZm9yX2VhY2hfYXJjKGFyYywgaGFuZGxlLCBub2RlLCBNREVTQ19BUkNfVFlQRV97RldELEJBQ0t9KSB7CisgKgkJdW5zaWduZWQgbG9uZyB0YXJnZXQgPSBtZGVzY19hcmNfdGFyZ2V0KGhhbmRsZSwgYXJjKTsKKyAqCQkuLi4KKyAqCX0KKyAqLworCisjZGVmaW5lIE1ERVNDX0FSQ19UWVBFX0ZXRAkiZndkIgorI2RlZmluZSBNREVTQ19BUkNfVFlQRV9CQUNLCSJiYWNrIgorCitleHRlcm4gdTY0IG1kZXNjX25leHRfYXJjKHN0cnVjdCBtZGVzY19oYW5kbGUgKmhhbmRsZSwgdTY0IGZyb20sCisJCQkgIGNvbnN0IGNoYXIgKmFyY190eXBlKTsKKyNkZWZpbmUgbWRlc2NfZm9yX2VhY2hfYXJjKF9fYXJjLCBfX2hkbCwgX19ub2RlLCBfX3R5cGUpIFwKKwlmb3IgKF9fYXJjID0gbWRlc2NfbmV4dF9hcmMoX19oZGwsIF9fbm9kZSwgX190eXBlKTsgXAorCSAgICAgKF9fYXJjKSAhPSBNREVTQ19OT0RFX05VTEw7IFwKKwkgICAgIF9fYXJjID0gbWRlc2NfbmV4dF9hcmMoX19oZGwsIF9fYXJjLCBfX3R5cGUpKQorCitleHRlcm4gdTY0IG1kZXNjX2FyY190YXJnZXQoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHAsIHU2NCBhcmMpOworCitleHRlcm4gdm9pZCBtZGVzY191cGRhdGUodm9pZCk7CisKK2V4dGVybiB2b2lkIG1kZXNjX2ZpbGxfaW5fY3B1X2RhdGEoY3B1bWFza190IG1hc2spOwogCiBleHRlcm4gdm9pZCBzdW40dl9tZGVzY19pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L21tdV9jb250ZXh0LmgKaW5kZXggOGQxMjkwMy4uOWZjMjI1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvbW11X2NvbnRleHQuaApAQCAtNzYsNiArNzYsOSBAQAogCXVuc2lnbmVkIGxvbmcgY3R4X3ZhbGlkLCBmbGFnczsKIAlpbnQgY3B1OwogCisJaWYgKHVubGlrZWx5KG1tID09ICZpbml0X21tKSkKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1tLT5jb250ZXh0LmxvY2ssIGZsYWdzKTsKIAljdHhfdmFsaWQgPSBDVFhfVkFMSUQobW0tPmNvbnRleHQpOwogCWlmICghY3R4X3ZhbGlkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAppbmRleCA5ZTgwYWQ0Li4wMzkzMzgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaApAQCAtNTczLDI0ICs1NzMsNiBAQAogCXJldHVybiAocHRlX3ZhbChwdGUpICYgbWFzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfcmVhZChwdGVfdCBwdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JIlxuNjYxOgltb3YJCSUxLCAlMFxuIgotCSIJbm9wXG4iCi0JIgkuc2VjdGlvbgkuc3VuNHZfMmluc25fcGF0Y2gsIFwiYXhcIlxuIgotCSIJLndvcmQJCTY2MWJcbiIKLQkiCXNldGhpCQklJXVoaSglMiksICUwXG4iCi0JIglzbGx4CQklMCwgMzIsICUwXG4iCi0JIgkucHJldmlvdXNcbiIKLQk6ICI9ciIgKG1hc2spCi0JOiAiaSIgKF9QQUdFX1JFQURfNFUpLCAiaSIgKF9QQUdFX1JFQURfNFYpKTsKLQotCXJldHVybiAocHRlX3ZhbChwdGUpICYgbWFzayk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdGVfZmlsZShwdGVfdCBwdGUpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwgPSBwdGVfdmFsKHB0ZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvd2VyLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvd2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0OTVjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG93ZXIuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX1NQQVJDNjRfUE9XRVJfSAorI2RlZmluZSBfU1BBUkM2NF9QT1dFUl9ICisKK2V4dGVybiB2b2lkIHdha2VfdXBfcG93ZXJkKHZvaWQpOworZXh0ZXJuIGludCBzdGFydF9wb3dlcmQodm9pZCk7CisKKyNlbmRpZiAvKiAhKF9TUEFSQzY0X1BPV0VSX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zbXAuaAppbmRleCA0ZmI4YzRiLi5lOGE5NmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc21wLmgKQEAgLTI5LDkgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCi1leHRlcm4gY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwOwotI2RlZmluZSBjcHVfcG9zc2libGVfbWFwIHBoeXNfY3B1X3ByZXNlbnRfbWFwCi0KIGV4dGVybiBjcHVtYXNrX3QgY3B1X3NpYmxpbmdfbWFwW05SX0NQVVNdOwogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfY29yZV9tYXBbTlJfQ1BVU107CiBleHRlcm4gaW50IHNwYXJjNjRfbXVsdGlfY29yZTsKQEAgLTQ0LDcgKzQxLDEyIEBACiAjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KQogCiBleHRlcm4gdm9pZCBzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYm9vdF9jcHVfaWQ7CitleHRlcm4gdm9pZCBjcHVfcGxheV9kZWFkKHZvaWQpOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitleHRlcm4gaW50IF9fY3B1X2Rpc2FibGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CisjZW5kaWYKIAogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCkBAIC01Miw3ICs1NCw2IEBACiAKICNkZWZpbmUgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkJCTAKICNkZWZpbmUgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcygpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgYm9vdF9jcHVfaWQJKDApCiAKICNlbmRpZiAvKiAhKENPTkZJR19TTVApICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdmlvLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Zpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzk2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Zpby5oCkBAIC0wLDAgKzEsNDA0IEBACisjaWZuZGVmIF9TUEFSQzY0X1ZJT19ICisjZGVmaW5lIF9TUEFSQzY0X1ZJT19ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9sZGMuaD4KKyNpbmNsdWRlIDxhc20vbWRlc2MuaD4KKworc3RydWN0IHZpb19tc2dfdGFnIHsKKwl1OAkJCXR5cGU7CisjZGVmaW5lIFZJT19UWVBFX0NUUkwJCTB4MDEKKyNkZWZpbmUgVklPX1RZUEVfREFUQQkJMHgwMgorI2RlZmluZSBWSU9fVFlQRV9FUlIJCTB4MDQKKworCXU4CQkJc3R5cGU7CisjZGVmaW5lIFZJT19TVUJUWVBFX0lORk8JMHgwMQorI2RlZmluZSBWSU9fU1VCVFlQRV9BQ0sJCTB4MDIKKyNkZWZpbmUgVklPX1NVQlRZUEVfTkFDSwkweDA0CisKKwl1MTYJCQlzdHlwZV9lbnY7CisjZGVmaW5lIFZJT19WRVJfSU5GTwkJMHgwMDAxCisjZGVmaW5lIFZJT19BVFRSX0lORk8JCTB4MDAwMgorI2RlZmluZSBWSU9fRFJJTkdfUkVHCQkweDAwMDMKKyNkZWZpbmUgVklPX0RSSU5HX1VOUkVHCQkweDAwMDQKKyNkZWZpbmUgVklPX1JEWAkJCTB4MDAwNQorI2RlZmluZSBWSU9fUEtUX0RBVEEJCTB4MDA0MAorI2RlZmluZSBWSU9fREVTQ19EQVRBCQkweDAwNDEKKyNkZWZpbmUgVklPX0RSSU5HX0RBVEEJCTB4MDA0MgorI2RlZmluZSBWTkVUX01DQVNUX0lORk8JCTB4MDEwMQorCisJdTMyCQlzaWQ7Cit9OworCitzdHJ1Y3QgdmlvX3JkeCB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlyZXN2WzZdOworfTsKKworc3RydWN0IHZpb192ZXJfaW5mbyB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1MTYJCQltYWpvcjsKKwl1MTYJCQltaW5vcjsKKwl1OAkJCWRldl9jbGFzczsKKyNkZWZpbmUgVkRFVl9ORVRXT1JLCQkweDAxCisjZGVmaW5lIFZERVZfTkVUV09SS19TV0lUQ0gJMHgwMgorI2RlZmluZSBWREVWX0RJU0sJCTB4MDMKKyNkZWZpbmUgVkRFVl9ESVNLX1NFUlZFUgkweDA0CisKKwl1OAkJCXJlc3YxWzNdOworCXU2NAkJCXJlc3YyWzVdOworfTsKKworc3RydWN0IHZpb19kcmluZ19yZWdpc3RlciB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlkcmluZ19pZGVudDsKKwl1MzIJCQludW1fZGVzY3I7CisJdTMyCQkJZGVzY3Jfc2l6ZTsKKwl1MTYJCQlvcHRpb25zOworI2RlZmluZSBWSU9fVFhfRFJJTkcJCTB4MDAwMQorI2RlZmluZSBWSU9fUlhfRFJJTkcJCTB4MDAwMgorCXUxNgkJCXJlc3Y7CisJdTMyCQkJbnVtX2Nvb2tpZXM7CisJc3RydWN0IGxkY190cmFuc19jb29raWUJY29va2llc1swXTsKK307CisKK3N0cnVjdCB2aW9fZHJpbmdfdW5yZWdpc3RlciB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlkcmluZ19pZGVudDsKKwl1NjQJCQlyZXN2WzVdOworfTsKKworLyogRGF0YSB0cmFuc2ZlciBtb2RlcyAqLworI2RlZmluZSBWSU9fUEtUX01PREUJCTB4MDEgLyogUGFja2V0IGJhc2VkIHRyYW5zZmVyCSovCisjZGVmaW5lIFZJT19ERVNDX01PREUJCTB4MDIgLyogSW4tYmFuZCBkZXNjcmlwdG9ycwkqLworI2RlZmluZSBWSU9fRFJJTkdfTU9ERQkJMHgwMyAvKiBEZXNjcmlwdG9yIHJpbmdzCSovCisKK3N0cnVjdCB2aW9fZHJpbmdfZGF0YSB7CisJc3RydWN0IHZpb19tc2dfdGFnCXRhZzsKKwl1NjQJCQlzZXE7CisJdTY0CQkJZHJpbmdfaWRlbnQ7CisJdTMyCQkJc3RhcnRfaWR4OworCXUzMgkJCWVuZF9pZHg7CisJdTgJCQlzdGF0ZTsKKyNkZWZpbmUgVklPX0RSSU5HX0FDVElWRQkweDAxCisjZGVmaW5lIFZJT19EUklOR19TVE9QUEVECTB4MDIKKworCXU4CQkJX19wYWQxOworCXUxNgkJCV9fcGFkMjsKKwl1MzIJCQlfX3BhZDM7CisJdTY0CQkJX19wYXI0WzJdOworfTsKKworc3RydWN0IHZpb19kcmluZ19oZHIgeworCXU4CQkJc3RhdGU7CisjZGVmaW5lIFZJT19ERVNDX0ZSRUUJCTB4MDEKKyNkZWZpbmUgVklPX0RFU0NfUkVBRFkJCTB4MDIKKyNkZWZpbmUgVklPX0RFU0NfQUNDRVBURUQJMHgwMworI2RlZmluZSBWSU9fREVTQ19ET05FCQkweDA0CisJdTgJCQlhY2s7CisjZGVmaW5lIFZJT19BQ0tfRU5BQkxFCQkweDAxCisjZGVmaW5lIFZJT19BQ0tfRElTQUJMRQkJMHgwMAorCisJdTE2CQkJX19wYWQxOworCXUzMgkJCV9fcGFkMjsKK307CisKKy8qIFZJTyBkaXNrIHNwZWNpZmljIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgKi8KK3N0cnVjdCB2aW9fZGlza19hdHRyX2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTgJCQl4ZmVyX21vZGU7CisJdTgJCQl2ZGlza190eXBlOworI2RlZmluZSBWRF9ESVNLX1RZUEVfU0xJQ0UJMHgwMSAvKiBTbGljZSBpbiBibG9jayBkZXZpY2UJKi8KKyNkZWZpbmUgVkRfRElTS19UWVBFX0RJU0sJMHgwMiAvKiBFbnRpcmUgYmxvY2sgZGV2aWNlCSovCisJdTE2CQkJcmVzdjE7CisJdTMyCQkJdmRpc2tfYmxvY2tfc2l6ZTsKKwl1NjQJCQlvcGVyYXRpb25zOworCXU2NAkJCXZkaXNrX3NpemU7CisJdTY0CQkJbWF4X3hmZXJfc2l6ZTsKKwl1NjQJCQlyZXN2MlsyXTsKK307CisKK3N0cnVjdCB2aW9fZGlza19kZXNjIHsKKwlzdHJ1Y3QgdmlvX2RyaW5nX2hkcgloZHI7CisJdTY0CQkJcmVxX2lkOworCXU4CQkJb3BlcmF0aW9uOworI2RlZmluZSBWRF9PUF9CUkVBRAkJMHgwMSAvKiBCbG9jayByZWFkCQkJKi8KKyNkZWZpbmUgVkRfT1BfQldSSVRFCQkweDAyIC8qIEJsb2NrIHdyaXRlCQkJKi8KKyNkZWZpbmUgVkRfT1BfRkxVU0gJCTB4MDMgLyogRmx1c2ggZGlzayBjb250ZW50cwkJKi8KKyNkZWZpbmUgVkRfT1BfR0VUX1dDRQkJMHgwNCAvKiBHZXQgd3JpdGUtY2FjaGUgc3RhdHVzCQkqLworI2RlZmluZSBWRF9PUF9TRVRfV0NFCQkweDA1IC8qIEVuYWJsZS9kaXNhYmxlIHdyaXRlLWNhY2hlCSovCisjZGVmaW5lIFZEX09QX0dFVF9WVE9DCQkweDA2IC8qIEdldCBWVE9DCQkJKi8KKyNkZWZpbmUgVkRfT1BfU0VUX1ZUT0MJCTB4MDcgLyogU2V0IFZUT0MJCQkqLworI2RlZmluZSBWRF9PUF9HRVRfRElTS0dFT00JMHgwOCAvKiBHZXQgZGlzayBnZW9tZXRyeQkJKi8KKyNkZWZpbmUgVkRfT1BfU0VUX0RJU0tHRU9NCTB4MDkgLyogU2V0IGRpc2sgZ2VvbWV0cnkJCSovCisjZGVmaW5lIFZEX09QX1NDU0lDTUQJCTB4MGEgLyogU0NTSSBjb250cm9sIGNvbW1hbmQJCSovCisjZGVmaW5lIFZEX09QX0dFVF9ERVZJRAkJMHgwYiAvKiBHZXQgZGV2aWNlIElECQkJKi8KKyNkZWZpbmUgVkRfT1BfR0VUX0VGSQkJMHgwYyAvKiBHZXQgRUZJCQkJCSovCisjZGVmaW5lIFZEX09QX1NFVF9FRkkJCTB4MGQgLyogU2V0IEVGSQkJCQkqLworCXU4CQkJc2xpY2U7CisJdTE2CQkJcmVzdjE7CisJdTMyCQkJc3RhdHVzOworCXU2NAkJCW9mZnNldDsKKwl1NjQJCQlzaXplOworCXUzMgkJCW5jb29raWVzOworCXUzMgkJCXJlc3YyOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbMF07Cit9OworCisjZGVmaW5lIFZJT19ESVNLX1ZOQU1FX0xFTgk4CisjZGVmaW5lIFZJT19ESVNLX0FMQUJFTF9MRU4JMTI4CisjZGVmaW5lIFZJT19ESVNLX05VTV9QQVJUCTgKKworc3RydWN0IHZpb19kaXNrX3Z0b2MgeworCXU4CQkJdm9sdW1lX25hbWVbVklPX0RJU0tfVk5BTUVfTEVOXTsKKwl1MTYJCQlzZWN0b3Jfc2l6ZTsKKwl1MTYJCQludW1fcGFydGl0aW9uczsKKwl1OAkJCWFzY2lpX2xhYmVsW1ZJT19ESVNLX0FMQUJFTF9MRU5dOworCXN0cnVjdCB7CisJCXUxNgkJaWQ7CisJCXUxNgkJcGVybV9mbGFnczsKKwkJdTMyCQlyZXN2OworCQl1NjQJCXN0YXJ0X2Jsb2NrOworCQl1NjQJCW51bV9ibG9ja3M7CisJfSBwYXJ0aXRpb25zW1ZJT19ESVNLX05VTV9QQVJUXTsKK307CisKK3N0cnVjdCB2aW9fZGlza19nZW9tIHsKKwl1MTYJCQludW1fY3lsOyAvKiBOdW0gZGF0YSBjeWxpbmRlcnMJCSovCisJdTE2CQkJYWx0X2N5bDsgLyogTnVtIGFsdGVybmF0ZSBjeWxpbmRlcnMJKi8KKwl1MTYJCQliZWdfY3lsOyAvKiBDeWwgb2ZmIG9mIGZpeGVkIGhlYWQgYXJlYQkqLworCXUxNgkJCW51bV9oZDsgIC8qIE51bSBoZWFkcwkJCSovCisJdTE2CQkJbnVtX3NlYzsgLyogTnVtIHNlY3RvcnMJCQkqLworCXUxNgkJCWlmYWN0OyAgIC8qIEludGVybGVhdmUgZmFjdG9yCQkqLworCXUxNgkJCWFwYzsgICAgIC8qIEFsdHMgcGVyIGN5bGluZGVyIChTQ1NJKQkqLworCXUxNgkJCXJwbTsJIC8qIFJldm9sdXRpb25zIHBlciBtaW51dGUJKi8KKwl1MTYJCQlwaHlfY3lsOyAvKiBOdW0gcGh5c2ljYWwgY3lsaW5kZXJzCSovCisJdTE2CQkJd3Jfc2tpcDsgLyogTnVtIHNlY3RzIHRvIHNraXAsIHdyaXRlcwkqLworCXUxNgkJCXJkX3NraXA7IC8qIE51bSBzZWN0cyB0byBza2lwLCB3cml0ZXMJKi8KK307CisKK3N0cnVjdCB2aW9fZGlza19kZXZpZCB7CisJdTE2CQkJcmVzdjsKKwl1MTYJCQl0eXBlOworCXUzMgkJCWxlbjsKKwljaGFyCQkJaWRbMF07Cit9OworCitzdHJ1Y3QgdmlvX2Rpc2tfZWZpIHsKKwl1NjQJCQlsYmE7CisJdTY0CQkJbGVuOworCWNoYXIJCQlkYXRhWzBdOworfTsKKworLyogVklPIG5ldCBzcGVjaWZpYyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzICovCitzdHJ1Y3QgdmlvX25ldF9hdHRyX2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTgJCQl4ZmVyX21vZGU7CisJdTgJCQlhZGRyX3R5cGU7CisjZGVmaW5lIFZORVRfQUREUl9FVEhFUk1BQwkweDAxCisJdTE2CQkJYWNrX2ZyZXE7CisJdTMyCQkJcmVzdjE7CisJdTY0CQkJYWRkcjsKKwl1NjQJCQltdHU7CisJdTY0CQkJcmVzdjJbM107Cit9OworCisjZGVmaW5lIFZORVRfTlVNX01DQVNUCQk3CisKK3N0cnVjdCB2aW9fbmV0X21jYXN0X2luZm8geworCXN0cnVjdCB2aW9fbXNnX3RhZwl0YWc7CisJdTgJCQlzZXQ7CisJdTgJCQljb3VudDsKKwl1OAkJCW1jYXN0X2FkZHJbVk5FVF9OVU1fTUNBU1QgKiA2XTsKKwl1MzIJCQlyZXN2OworfTsKKworc3RydWN0IHZpb19uZXRfZGVzYyB7CisJc3RydWN0IHZpb19kcmluZ19oZHIJaGRyOworCXUzMgkJCXNpemU7CisJdTMyCQkJbmNvb2tpZXM7CisJc3RydWN0IGxkY190cmFuc19jb29raWUJY29va2llc1swXTsKK307CisKKyNkZWZpbmUgVklPX01BWF9SSU5HX0NPT0tJRVMJMjQKKworc3RydWN0IHZpb19kcmluZ19zdGF0ZSB7CisJdTY0CQkJaWRlbnQ7CisJdm9pZAkJCSpiYXNlOworCXU2NAkJCXNuZF9ueHQ7CisJdTY0CQkJcmN2X254dDsKKwl1MzIJCQllbnRyeV9zaXplOworCXUzMgkJCW51bV9lbnRyaWVzOworCXUzMgkJCXByb2Q7CisJdTMyCQkJY29uczsKKwl1MzIJCQlwZW5kaW5nOworCWludAkJCW5jb29raWVzOworCXN0cnVjdCBsZGNfdHJhbnNfY29va2llCWNvb2tpZXNbVklPX01BWF9SSU5HX0NPT0tJRVNdOworfTsKKworc3RhdGljIGlubGluZSB2b2lkICp2aW9fZHJpbmdfY3VyKHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyKQoreworCXJldHVybiBkci0+YmFzZSArIChkci0+ZW50cnlfc2l6ZSAqIGRyLT5wcm9kKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp2aW9fZHJpbmdfZW50cnkoc3RydWN0IHZpb19kcmluZ19zdGF0ZSAqZHIsCisJCQkJICAgIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlyZXR1cm4gZHItPmJhc2UgKyAoZHItPmVudHJ5X3NpemUgKiBpbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZpb19kcmluZ19hdmFpbChzdHJ1Y3QgdmlvX2RyaW5nX3N0YXRlICpkciwKKwkJCQkgIHVuc2lnbmVkIGludCByaW5nX3NpemUpCit7CisJLyogRW5zdXJlIGJ1aWxkLXRpbWUgcG93ZXItb2YtMi4gICovCisJQlVJTERfQlVHX09OKHJpbmdfc2l6ZSAmIChyaW5nX3NpemUgLSAxKSk7CisKKwlyZXR1cm4gKGRyLT5wZW5kaW5nIC0KKwkJKChkci0+cHJvZCAtIGRyLT5jb25zKSAmIChyaW5nX3NpemUgLSAxKSkpOworfQorCisjZGVmaW5lIFZJT19NQVhfVFlQRV9MRU4JNjQKKyNkZWZpbmUgVklPX01BWF9DT01QQVRfTEVOCTY0CisKK3N0cnVjdCB2aW9fZGV2IHsKKwl1NjQJCQltcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKmRwOworCisJY2hhcgkJCXR5cGVbVklPX01BWF9UWVBFX0xFTl07CisJY2hhcgkJCWNvbXBhdFtWSU9fTUFYX0NPTVBBVF9MRU5dOworCWludAkJCWNvbXBhdF9sZW47CisKKwl1bnNpZ25lZCBsb25nCQljaGFubmVsX2lkOworCisJdW5zaWduZWQgaW50CQl0eF9pcnE7CisJdW5zaWduZWQgaW50CQlyeF9pcnE7CisKKwlzdHJ1Y3QgZGV2aWNlCQlkZXY7Cit9OworCitzdHJ1Y3QgdmlvX2RyaXZlciB7CisJc3RydWN0IGxpc3RfaGVhZAkJbm9kZTsKKwljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZAkqaWRfdGFibGU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCB2aW9fZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCk7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgdmlvX2RldiAqZGV2KTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCB2aW9fZGV2ICpkZXYpOworCXVuc2lnbmVkIGxvbmcJCQlkcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlcgkJZHJpdmVyOworfTsKKworc3RydWN0IHZpb192ZXJzaW9uIHsKKwl1MTYJCW1ham9yOworCXUxNgkJbWlub3I7Cit9OworCitzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZTsKK3N0cnVjdCB2aW9fZHJpdmVyX29wcyB7CisJaW50CSgqc2VuZF9hdHRyKShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKTsKKwlpbnQJKCpoYW5kbGVfYXR0cikoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqcGt0KTsKKwl2b2lkCSgqaGFuZHNoYWtlX2NvbXBsZXRlKShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKTsKK307CisKK3N0cnVjdCB2aW9fY29tcGxldGlvbiB7CisJc3RydWN0IGNvbXBsZXRpb24JY29tOworCWludAkJCWVycjsKKwlpbnQJCQl3YWl0aW5nX2ZvcjsKK307CisKK3N0cnVjdCB2aW9fZHJpdmVyX3N0YXRlIHsKKwkvKiBQcm90ZWN0cyBWSU8gaGFuZHNoYWtlIGFuZCwgb3B0aW9uYWxseSwgZHJpdmVyIHByaXZhdGUgc3RhdGUuICAqLworCXNwaW5sb2NrX3QJCWxvY2s7CisKKwlzdHJ1Y3QgbGRjX2NoYW5uZWwJKmxwOworCisJdTMyCQkJX3BlZXJfc2lkOworCXUzMgkJCV9sb2NhbF9zaWQ7CisJc3RydWN0IHZpb19kcmluZ19zdGF0ZQlkcmluZ3NbMl07CisjZGVmaW5lIFZJT19EUklWRVJfVFhfUklORwkwCisjZGVmaW5lIFZJT19EUklWRVJfUlhfUklORwkxCisKKwl1OAkJCWhzX3N0YXRlOworI2RlZmluZSBWSU9fSFNfSU5WQUxJRAkJMHgwMAorI2RlZmluZSBWSU9fSFNfR09UVkVSUwkJMHgwMQorI2RlZmluZSBWSU9fSFNfR09UX0FUVFIJCTB4MDQKKyNkZWZpbmUgVklPX0hTX1NFTlRfRFJFRwkweDA4CisjZGVmaW5lIFZJT19IU19TRU5UX1JEWAkJMHgxMAorI2RlZmluZSBWSU9fSFNfR09UX1JEWF9BQ0sJMHgyMAorI2RlZmluZSBWSU9fSFNfR09UX1JEWAkJMHg0MAorI2RlZmluZSBWSU9fSFNfU0VOVF9SRFhfQUNLCTB4ODAKKyNkZWZpbmUgVklPX0hTX0NPTVBMRVRFCQkoVklPX0hTX0dPVF9SRFhfQUNLIHwgVklPX0hTX1NFTlRfUkRYX0FDSykKKworCXU4CQkJZGV2X2NsYXNzOworCisJdTgJCQlkcl9zdGF0ZTsKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1RYUkVHCTB4MDEKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1JYUkVHCTB4MDIKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1RYUkVRCTB4MTAKKyNkZWZpbmUgVklPX0RSX1NUQVRFX1JYUkVRCTB4MjAKKworCXU4CQkJZGVidWc7CisjZGVmaW5lIFZJT19ERUJVR19IUwkJMHgwMQorI2RlZmluZSBWSU9fREVCVUdfREFUQQkJMHgwMgorCisJdm9pZAkJCSpkZXNjX2J1ZjsKKwl1bnNpZ25lZCBpbnQJCWRlc2NfYnVmX2xlbjsKKworCXN0cnVjdCB2aW9fY29tcGxldGlvbgkqY21wOworCisJc3RydWN0IHZpb19kZXYJCSp2ZGV2OworCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisKKwlzdHJ1Y3QgdmlvX3ZlcnNpb24JdmVyOworCisJc3RydWN0IHZpb192ZXJzaW9uCSp2ZXJfdGFibGU7CisJaW50CQkJdmVyX3RhYmxlX2VudHJpZXM7CisKKwljaGFyCQkJKm5hbWU7CisKKwlzdHJ1Y3QgdmlvX2RyaXZlcl9vcHMJKm9wczsKK307CisKKyNkZWZpbmUgdmlvZGJnKFRZUEUsIGYsIGEuLi4pIFwKK2RvIHsJaWYgKHZpby0+ZGVidWcgJiBWSU9fREVCVUdfIyNUWVBFKSBcCisJCXByaW50ayhLRVJOX0lORk8gInZpbzogSURbJWx1XSAiIGYsIFwKKwkJICAgICAgIHZpby0+dmRldi0+Y2hhbm5lbF9pZCwgIyMgYSk7IFwKK30gd2hpbGUgKDApCisKK2V4dGVybiBpbnQgdmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2KTsKK2V4dGVybiB2b2lkIHZpb191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdmlvX2RyaXZlciAqZHJ2KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlvX2RyaXZlciAqdG9fdmlvX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgdmlvX2RyaXZlciwgZHJpdmVyKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlvX2RldiAqdG9fdmlvX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB2aW9fZGV2LCBkZXYpOworfQorCitleHRlcm4gaW50IHZpb19sZGNfc2VuZChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIHZpb19saW5rX3N0YXRlX2NoYW5nZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLCBpbnQgZXZlbnQpOworZXh0ZXJuIHZvaWQgdmlvX2Nvbm5fcmVzZXQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CitleHRlcm4gaW50IHZpb19jb250cm9sX3BrdF9lbmdpbmUoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywgdm9pZCAqcGt0KTsKK2V4dGVybiBpbnQgdmlvX3ZhbGlkYXRlX3NpZChzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvLAorCQkJICAgIHN0cnVjdCB2aW9fbXNnX3RhZyAqdHApOworZXh0ZXJuIHUzMiB2aW9fc2VuZF9zaWQoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CitleHRlcm4gaW50IHZpb19sZGNfYWxsb2Moc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbywKKwkJCSBzdHJ1Y3QgbGRjX2NoYW5uZWxfY29uZmlnICpiYXNlX2NmZywgdm9pZCAqZXZlbnRfYXJnKTsKK2V4dGVybiB2b2lkIHZpb19sZGNfZnJlZShzdHJ1Y3QgdmlvX2RyaXZlcl9zdGF0ZSAqdmlvKTsKK2V4dGVybiBpbnQgdmlvX2RyaXZlcl9pbml0KHN0cnVjdCB2aW9fZHJpdmVyX3N0YXRlICp2aW8sIHN0cnVjdCB2aW9fZGV2ICp2ZGV2LAorCQkJICAgdTggZGV2X2NsYXNzLCBzdHJ1Y3QgdmlvX3ZlcnNpb24gKnZlcl90YWJsZSwKKwkJCSAgIGludCB2ZXJfdGFibGVfc2l6ZSwgc3RydWN0IHZpb19kcml2ZXJfb3BzICpvcHMsCisJCQkgICBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgdmlvX3BvcnRfdXAoc3RydWN0IHZpb19kcml2ZXJfc3RhdGUgKnZpbyk7CisKKyNlbmRpZiAvKiBfU1BBUkM2NF9WSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tdW0vcGd0YWJsZS5oCmluZGV4IDFiMTA5MGEuLjgzMGZjNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS11bS9wZ3RhYmxlLmgKQEAgLTE3NSwxMiArMTc1LDYgQEAKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KICAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQotewotCXJldHVybigocHRlX2dldF9iaXRzKHB0ZSwgX1BBR0VfVVNFUikpICYmCi0JICAgICAgICEocHRlX2dldF9iaXRzKHB0ZSwgX1BBR0VfUFJPVE5PTkUpKSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkKIHsgCiAJcmV0dXJuKChwdGVfZ2V0X2JpdHMocHRlLCBfUEFHRV9VU0VSKSkgJiYKQEAgLTIzOCwxOCArMjMyLDYgQEAKIAlyZXR1cm4ocHRlKTsKIH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKLXsgCi0JcHRlX2NsZWFyX2JpdHMocHRlLCBfUEFHRV9VU0VSKTsKLQlyZXR1cm4ocHRlX21rbmV3cHJvdChwdGUpKTsKLX0KLQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfZXhwcm90ZWN0KHB0ZV90IHB0ZSkKLXsgCi0JcHRlX2NsZWFyX2JpdHMocHRlLCBfUEFHRV9VU0VSKTsKLQlyZXR1cm4ocHRlX21rbmV3cHJvdChwdGUpKTsKLX0KLQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCiB7CiAJcHRlX2NsZWFyX2JpdHMocHRlLCBfUEFHRV9ESVJUWSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAppbmRleCAxOGExM2JhLi42ZTVmZDVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKQEAgLTUyLDEwICs1MiwyMSBAQAogCXJldHVybiB0aTsKIH0KIAorI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS19VU0FHRQorCisjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAorCSgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIFwKKwkJCQkJCSBDT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSkKKyNlbHNlCisKIC8qIHRocmVhZCBpbmZvcm1hdGlvbiBhbGxvY2F0aW9uICovCiAjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykgXAotCSgoc3RydWN0IHRocmVhZF9pbmZvICopIGttYWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpKQotI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBrZnJlZSh0aSkKKwkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIFwKKwkJCQkJCSBDT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSkKKyNlbmRpZgorCisjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIFwKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSh0aSksQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvZmIuaCBiL2luY2x1ZGUvYXNtLXY4NTAvZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tdjg1MC9pb2N0bHMuaAppbmRleCAwNWMwZGM5Li41MzEzYWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvaW9jdGxzLmgKQEAgLTQ2LDYgKzQ2LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS12ODUwL3Rlcm1iaXRzLmgKaW5kZXggMzU0MTJmNy4uMjk1ZDdiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtYml0cy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvdGVybWJpdHMuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAjZGVmaW5lIEhVUENMCTAwMDIwMDAKICNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKICNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgIEJPVEhFUiAwMDEwMDAwCiAjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCiAjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCiAjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNTYsMTAgKzE1NywxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCQkvKiBpbnB1dCBiYXVkIHJhdGUgKi8KICNkZWZpbmUgQ01TUEFSCSAgMDEwMDAwMDAwMDAwCQkvKiBtYXJrIG9yIHNwYWNlIChzdGljaykgcGFyaXR5ICovCiAjZGVmaW5lIENSVFNDVFMJICAwMjAwMDAwMDAwMDAJCS8qIGZsb3cgY29udHJvbCAqLwogCisjZGVmaW5lCUlCU0hJRlQJMTYJCS8qIFNoaWZyIGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKIC8qIGNfbGZsYWcgYml0cyAqLwogI2RlZmluZSBJU0lHCTAwMDAwMDEKICNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tdjg1MC90ZXJtaW9zLmgKaW5kZXggYzJjMmIxZC4uZmNkMTcxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC90ZXJtaW9zLmgKQEAgLTgwLDggKzgwLDEwIEBACiAJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIH0pCiAKLSNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCi0jZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NvbXBhdC5oCmluZGV4IGIzN2FiODIuLjUzY2I5NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvY29tcGF0LmgKQEAgLTMzLDggKzMzLDEwIEBACiAKIHR5cGVkZWYgczMyCQljb21wYXRfaW50X3Q7CiB0eXBlZGVmIHMzMgkJY29tcGF0X2xvbmdfdDsKK3R5cGVkZWYgczY0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKSBjb21wYXRfczY0OwogdHlwZWRlZiB1MzIJCWNvbXBhdF91aW50X3Q7CiB0eXBlZGVmIHUzMgkJY29tcGF0X3Vsb25nX3Q7Cit0eXBlZGVmIHU2NCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSkgY29tcGF0X3U2NDsKIAogc3RydWN0IGNvbXBhdF90aW1lc3BlYyB7CiAJY29tcGF0X3RpbWVfdAl0dl9zZWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZmIuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZmIuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9BU01fRkJfSF8KKyNkZWZpbmUgX0FTTV9GQl9IXworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmJfcGdwcm90ZWN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQl1bnNpZ25lZCBsb25nIG9mZikKK3sKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQorCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBfUEFHRV9QQ0Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZiX2lzX3ByaW1hcnlfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogX0FTTV9GQl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCmluZGV4IGU5MGUxNjcuLjJhY2I5YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKQEAgLTM1LDYgKzM1LDggQEAKIAlWU1lTQ0FMTF9MQVNUX1BBR0UsCiAJVlNZU0NBTExfRklSU1RfUEFHRSA9IFZTWVNDQUxMX0xBU1RfUEFHRSArICgoVlNZU0NBTExfRU5ELVZTWVNDQUxMX1NUQVJUKSA+PiBQQUdFX1NISUZUKSAtIDEsCiAJVlNZU0NBTExfSFBFVCwKKwlGSVhfREJHUF9CQVNFLAorCUZJWF9FQVJMWUNPTl9NRU1fQkFTRSwKIAlGSVhfSFBFVF9CQVNFLAogCUZJWF9BUElDX0JBU0UsCS8qIGxvY2FsIChDUFUpIEFQSUMpIC0tIHJlcXVpcmVkIGZvciBTTVAgb3Igbm90ICovCiAJRklYX0lPX0FQSUNfQkFTRV8wLApAQCAtODQsNyArODYsNyBAQAogCWlmIChpZHggPj0gX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzKQogCQlfX3RoaXNfZml4bWFwX2RvZXNfbm90X2V4aXN0KCk7CiAKLSAgICAgICAgcmV0dXJuIF9fZml4X3RvX3ZpcnQoaWR4KTsKKwlyZXR1cm4gX19maXhfdG9fdmlydChpZHgpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKaW5kZXggZGUyY2Q5YS4uNzQ3NTA5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvLmgKQEAgLTE0NCw2ICsxNDQsNyBAQAogICovCiBleHRlcm4gdm9pZCBfX2lvbWVtICogaW9yZW1hcF9ub2NhY2hlICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKK2V4dGVybiB2b2lkIF9faW9tZW0gKmZpeF9pb3JlbWFwKHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgbG9uZyBwaHlzKTsKIAogLyoKICAqIElTQSBJL08gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIDE6MSB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKaW5kZXggZTMyN2M4My4uODhhZGYxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCkBAIC00OCw3ICs0OCw4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXJfcGFnZShwYWdlLCB2YWRkciwgcGcpCWNsZWFyX3BhZ2UocGFnZSkKICNkZWZpbmUgY29weV91c2VyX3BhZ2UodG8sIGZyb20sIHZhZGRyLCBwZykJY29weV9wYWdlKHRvLCBmcm9tKQogCi0jZGVmaW5lIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHZtYSwgdmFkZHIpIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8sIHZtYSwgdmFkZHIpCisjZGVmaW5lIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UobW92YWJsZWZsYWdzLCB2bWEsIHZhZGRyKSBcCisJYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IG1vdmFibGVmbGFncywgdm1hLCB2YWRkcikKICNkZWZpbmUgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHVzZSBvZiBDIHR5cGUtY2hlY2tpbmcuLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKaW5kZXggMGE3MWUwYi4uM2JhNTMwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCkBAIC0yNjYsMjEgKzI2NiwxNSBAQAogICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLgogICovCiAjZGVmaW5lIF9fTEFSR0VfUFRFIChfUEFHRV9QU0V8X1BBR0VfUFJFU0VOVCkKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV91c2VyKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkJCXsgcmV0dXJuICEocHRlX3ZhbChwdGUpICYgX1BBR0VfTlgpOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfRElSVFk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV95b3VuZyhwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9GSUxFOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfaHVnZShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9QU0U7IH0KIAotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9VU0VSKSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9ESVJUWSkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SVykpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX05YKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9CkBAIC0yOTAsMTMgKzI4NCw2IEBACiAKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKIAotc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlpZiAoIXB0ZV9kaXJ0eSgqcHRlcCkpCi0JCXJldHVybiAwOwotCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0RJUlRZLCAmcHRlcC0+cHRlKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKIHsKIAlpZiAoIXB0ZV95b3VuZygqcHRlcCkpCkBAIC00MzMsNyArNDIwLDYgQEAKICAgICgoKG8pICYgKDFVTCA8PCAoX19WSVJUVUFMX01BU0tfU0hJRlQtMSkpKSA/ICgobykgfCAofl9fVklSVFVBTF9NQVNLKSkgOiAobykpCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ZT1VORwotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX0RJUlRZCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVJfRlVMTAogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1NFVF9XUlBST1RFQ1QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2ZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkZjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mYi5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX0FTTV9GQl9IXworI2RlZmluZSBfQVNNX0ZCX0hfCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BndGFibGUuaAppbmRleCAyZDRiNWRiLi4wNjg1MGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmgKQEAgLTE5NywxNiArMTk3LDEzIEBACiAKIC8qIE5vdGU6IFdlIHVzZSB0aGUgX1BBR0VfVVNFUiBiaXQgdG8gaW5kaWNhdGUgd3JpdGUtcHJvdGVjdCBrZXJuZWwgbWVtb3J5ICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcgfCBfUEFHRV9XUkVOQUJMRSk7IHJldHVybiBwdGU7IH0KLXN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQotc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQpAQCAtMjcwLDE3ICsyNjcsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludAotcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAotICAgCQkJICBwdGVfdCAqcHRlcCkKLXsKLQlwdGVfdCBwdGUgPSAqcHRlcDsKLQlpZiAoIXB0ZV9kaXJ0eShwdGUpKQotCQlyZXR1cm4gMDsKLQl1cGRhdGVfcHRlKHB0ZXAsIHB0ZV9ta2NsZWFuKHB0ZSkpOwotCXJldHVybiAxOwotfQotCiBzdGF0aWMgaW5saW5lIHB0ZV90CiBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCiB7CkBAIC00MjEsNyArNDA3LDYgQEAKICNlbmRpZiAvKiAhZGVmaW5lZCAoX19BU1NFTUJMWV9fKSAqLwogCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKLSNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfTUtESVJUWQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCAxMjdkMmQxLi5iY2Y4NzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMjQ3LDcgKzI0Nyw2IEBACiB1bmlmZGVmLXkgKz0gaXNkbmlmLmgKIHVuaWZkZWYteSArPSBpc2RuX2RpdmVydGlmLmgKIHVuaWZkZWYteSArPSBpc2RuX3BwcC5oCi11bmlmZGVmLXkgKz0gaXNpY29tLmgKIHVuaWZkZWYteSArPSBqYmQuaAogdW5pZmRlZi15ICs9IGpveXN0aWNrLmgKIHVuaWZkZWYteSArPSBrZGV2X3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdHRyaWJ1dGVfY29udGFpbmVyLmggYi9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaAppbmRleCA5M2JmYjBiLi44ZmYyNzQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0dHJpYnV0ZV9jb250YWluZXIuaApAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0cnVjdCBhdHRyaWJ1dGVfY29udGFpbmVyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKaW5kZXggZmNjYzZlNS4uOGNhN2NhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdWRpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXVkaXQuaApAQCAtNjMsOSArNjMsMTIgQEAKICNkZWZpbmUgQVVESVRfQUREX1JVTEUJCTEwMTEJLyogQWRkIHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGUgKi8KICNkZWZpbmUgQVVESVRfREVMX1JVTEUJCTEwMTIJLyogRGVsZXRlIHN5c2NhbGwgZmlsdGVyaW5nIHJ1bGUgKi8KICNkZWZpbmUgQVVESVRfTElTVF9SVUxFUwkxMDEzCS8qIExpc3Qgc3lzY2FsbCBmaWx0ZXJpbmcgcnVsZXMgKi8KKyNkZWZpbmUgQVVESVRfVFRZX0dFVAkJMTAxNAkvKiBHZXQgVFRZIGF1ZGl0aW5nIHN0YXR1cyAqLworI2RlZmluZSBBVURJVF9UVFlfU0VUCQkxMDE1CS8qIFNldCBUVFkgYXVkaXRpbmcgc3RhdHVzICovCiAKICNkZWZpbmUgQVVESVRfRklSU1RfVVNFUl9NU0cJMTEwMAkvKiBVc2Vyc3BhY2UgbWVzc2FnZXMgbW9zdGx5IHVuaW50ZXJlc3RpbmcgdG8ga2VybmVsICovCiAjZGVmaW5lIEFVRElUX1VTRVJfQVZDCQkxMTA3CS8qIFdlIGZpbHRlciB0aGlzIGRpZmZlcmVudGx5ICovCisjZGVmaW5lIEFVRElUX1VTRVJfVFRZCQkxMTI0CS8qIE5vbi1JQ0FOT04gVFRZIGlucHV0IG1lYW5pbmcgKi8KICNkZWZpbmUgQVVESVRfTEFTVF9VU0VSX01TRwkxMTk5CiAjZGVmaW5lIEFVRElUX0ZJUlNUX1VTRVJfTVNHMgkyMTAwCS8qIE1vcmUgdXNlciBzcGFjZSBtZXNzYWdlcyAqLwogI2RlZmluZSBBVURJVF9MQVNUX1VTRVJfTVNHMgkyOTk5CkBAIC05Miw2ICs5NSw3IEBACiAjZGVmaW5lIEFVRElUX0tFUk5FTF9PVEhFUgkxMzE2CS8qIEZvciB1c2UgYnkgM3JkIHBhcnR5IG1vZHVsZXMgKi8KICNkZWZpbmUgQVVESVRfRkRfUEFJUgkJMTMxNyAgICAvKiBhdWRpdCByZWNvcmQgZm9yIHBpcGUvc29ja2V0cGFpciAqLwogI2RlZmluZSBBVURJVF9PQkpfUElECQkxMzE4CS8qIHB0cmFjZSB0YXJnZXQgKi8KKyNkZWZpbmUgQVVESVRfVFRZCQkxMzE5CS8qIElucHV0IG9uIGFuIGFkbWluaXN0cmF0aXZlIFRUWSAqLwogCiAjZGVmaW5lIEFVRElUX0FWQwkJMTQwMAkvKiBTRSBMaW51eCBhdmMgZGVuaWFsIG9yIGdyYW50ICovCiAjZGVmaW5lIEFVRElUX1NFTElOVVhfRVJSCTE0MDEJLyogSW50ZXJuYWwgU0UgTGludXggRXJyb3JzICovCkBAIC0yODksNiArMjkzLDEwIEBACiAJX191MzIJCWJhY2tsb2c7CS8qIG1lc3NhZ2VzIHdhaXRpbmcgaW4gcXVldWUgKi8KIH07CiAKK3N0cnVjdCBhdWRpdF90dHlfc3RhdHVzIHsKKwlfX3UzMgkJZW5hYmxlZDsgLyogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworfTsKKwogLyogYXVkaXRfcnVsZV9kYXRhIHN1cHBvcnRzIGZpbHRlciBydWxlcyB3aXRoIGJvdGggaW50ZWdlciBhbmQgc3RyaW5nCiAgKiBmaWVsZHMuICBJdCBjb3JyZXNwb25kcyB3aXRoIEFVRElUX0FERF9SVUxFLCBBVURJVF9ERUxfUlVMRSBhbmQKICAqIEFVRElUX0xJU1RfUlVMRVMgcmVxdWVzdHMuCkBAIC01MTUsMTEgKzUyMywxMyBAQAogCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKIAkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJCSAgICAgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQpOworZXh0ZXJuIHZvaWQJCSAgICBhdWRpdF9sb2dfbG9zdChjb25zdCBjaGFyICptZXNzYWdlKTsKIAkJCQkvKiBQcml2YXRlIEFQSSAoZm9yIGF1ZGl0LmMgb25seSkgKi8KIGV4dGVybiBpbnQgYXVkaXRfZmlsdGVyX3VzZXIoc3RydWN0IG5ldGxpbmtfc2tiX3Bhcm1zICpjYiwgaW50IHR5cGUpOwogZXh0ZXJuIGludCBhdWRpdF9maWx0ZXJfdHlwZShpbnQgdHlwZSk7CiBleHRlcm4gaW50ICBhdWRpdF9yZWNlaXZlX2ZpbHRlcihpbnQgdHlwZSwgaW50IHBpZCwgaW50IHVpZCwgaW50IHNlcSwKIAkJCSB2b2lkICpkYXRhLCBzaXplX3QgZGF0YXN6LCB1aWRfdCBsb2dpbnVpZCwgdTMyIHNpZCk7CitleHRlcm4gaW50IGF1ZGl0X2VuYWJsZWQ7CiAjZWxzZQogI2RlZmluZSBhdWRpdF9sb2coYyxnLHQsZiwuLi4pIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9sb2dfc3RhcnQoYyxnLHQpICh7IE5VTEw7IH0pCkBAIC01MzAsNiArNTQwLDcgQEAKICNkZWZpbmUgYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhLHMpIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoYSxuLHMpIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9sb2dfZF9wYXRoKGIscCxkLHYpIGRvIHsgOyB9IHdoaWxlICgwKQorI2RlZmluZSBhdWRpdF9lbmFibGVkIDAKICNlbmRpZgogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaCBiL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAppbmRleCBmMjU0MmMyLi43MDExZDYyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaApAQCAtOTMsNyArOTMsNiBAQAogdm9pZCBjbGVhcl9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydyk7CiB2b2lkIHNldF9iZGlfY29uZ2VzdGVkKHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGksIGludCBydyk7CiBsb25nIGNvbmdlc3Rpb25fd2FpdChpbnQgcncsIGxvbmcgdGltZW91dCk7Ci1sb25nIGNvbmdlc3Rpb25fd2FpdF9pbnRlcnJ1cHRpYmxlKGludCBydywgbG9uZyB0aW1lb3V0KTsKIHZvaWQgY29uZ2VzdGlvbl9lbmQoaW50IHJ3KTsKIAogI2RlZmluZSBiZGlfY2FwX3dyaXRlYmFja19kaXJ0eShiZGkpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IGZhZTEzOGIuLmY3ODk2NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2JzZy5oPgogCiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAKQEAgLTQxLDYgKzQyLDggQEAKIHR5cGVkZWYgc3RydWN0IGVsZXZhdG9yX3F1ZXVlIGVsZXZhdG9yX3Q7CiBzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZTsKIHN0cnVjdCBibGtfdHJhY2U7CitzdHJ1Y3QgcmVxdWVzdDsKK3N0cnVjdCBzZ19pb19oZHI7CiAKICNkZWZpbmUgQkxLREVWX01JTl9SUQk0CiAjZGVmaW5lIEJMS0RFVl9NQVhfUlEJMTI4CS8qIERlZmF1bHQgbWF4aW11bSAqLwpAQCAtMzE0LDYgKzMxNyw5IEBACiAJICovCiAJcnFfZW5kX2lvX2ZuICplbmRfaW87CiAJdm9pZCAqZW5kX2lvX2RhdGE7CisKKwkvKiBmb3IgYmlkaSAqLworCXN0cnVjdCByZXF1ZXN0ICpuZXh0X3JxOwogfTsKIAogLyoKQEAgLTQ2OCw2ICs0NzQsMTAgQEAKIAl1bnNpZ25lZCBpbnQJCWJpX3NpemU7CiAKIAlzdHJ1Y3QgbXV0ZXgJCXN5c2ZzX2xvY2s7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0JTRykKKwlzdHJ1Y3QgYnNnX2NsYXNzX2RldmljZSBic2dfZGV2OworI2VuZGlmCiB9OwogCiAjZGVmaW5lIFFVRVVFX0ZMQUdfQ0xVU1RFUgkwCS8qIGNsdXN0ZXIgc2V2ZXJhbCBzZWdtZW50cyBpbnRvIDEgKi8KQEAgLTQ3OSw2ICs0ODksNyBAQAogI2RlZmluZSBRVUVVRV9GTEFHX1JFRU5URVIJNgkvKiBSZS1lbnRyYW5jeSBhdm9pZGFuY2UgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19QTFVHR0VECTcJLyogcXVldWUgaXMgcGx1Z2dlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0VMVlNXSVRDSAk4CS8qIGRvbid0IHVzZSBlbGV2YXRvciwganVzdCBkbyBGSUZPICovCisjZGVmaW5lIFFVRVVFX0ZMQUdfQklESQkJOQkvKiBxdWV1ZSBzdXBwb3J0cyBiaWRpIHJlcXVlc3RzICovCiAKIGVudW0gewogCS8qCkBAIC01NDMsNiArNTU0LDcgQEAKICNkZWZpbmUgYmxrX3NvcnRlZF9ycShycSkJKChycSktPmNtZF9mbGFncyAmIFJFUV9TT1JURUQpCiAjZGVmaW5lIGJsa19iYXJyaWVyX3JxKHJxKQkoKHJxKS0+Y21kX2ZsYWdzICYgUkVRX0hBUkRCQVJSSUVSKQogI2RlZmluZSBibGtfZnVhX3JxKHJxKQkJKChycSktPmNtZF9mbGFncyAmIFJFUV9GVUEpCisjZGVmaW5lIGJsa19iaWRpX3JxKHJxKQkJKChycSktPm5leHRfcnEgIT0gTlVMTCkKIAogI2RlZmluZSBsaXN0X2VudHJ5X3JxKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkKIApAQCAtNjA3LDcgKzYxOSwxMiBAQAogI2RlZmluZSBCTEtfQk9VTkNFX0FOWQkJKCh1NjQpYmxrX21heF9wZm4gPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgQkxLX0JPVU5DRV9JU0EJCShJU0FfRE1BX1RIUkVTSE9MRCkKIAotI2lmZGVmIENPTkZJR19NTVUKKy8qCisgKiBkZWZhdWx0IHRpbWVvdXQgZm9yIFNHX0lPIGlmIG5vbmUgc3BlY2lmaWVkCisgKi8KKyNkZWZpbmUgQkxLX0RFRkFVTFRfU0dfVElNRU9VVAkoNjAgKiBIWikKKworI2lmZGVmIENPTkZJR19CT1VOQ0UKIGV4dGVybiBpbnQgaW5pdF9lbWVyZ2VuY3lfaXNhX3Bvb2wodm9pZCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfYm91bmNlKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqKmJpbyk7CiAjZWxzZQpAQCAtNjM3LDcgKzY1NCw4IEBACiBleHRlcm4gdm9pZCBibGtfcGx1Z19kZXZpY2UocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIGludCBibGtfcmVtb3ZlX3BsdWcocmVxdWVzdF9xdWV1ZV90ICopOwogZXh0ZXJuIHZvaWQgYmxrX3JlY291bnRfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBiaW8gKik7Ci1leHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CitleHRlcm4gaW50IHNjc2lfY21kX2lvY3RsKHN0cnVjdCBmaWxlICosIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosCisJCQkgIHN0cnVjdCBnZW5kaXNrICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7CiBleHRlcm4gaW50IHNnX3Njc2lfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKIAkJc3RydWN0IGdlbmRpc2sgKiwgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKik7CiAKQEAgLTY4MCw2ICs2OTgsMTIgQEAKIAkJCSAgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJsa19leGVjdXRlX3JxX25vd2FpdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwKIAkJCQkgIHN0cnVjdCByZXF1ZXN0ICosIGludCwgcnFfZW5kX2lvX2ZuICopOworZXh0ZXJuIGludCBibGtfZmlsbF9zZ2hkcl9ycShyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwKKwkJICAgICAgc3RydWN0IHNnX2lvX2hkciAqLCBpbnQpOworZXh0ZXJuIGludCBibGtfdW5tYXBfc2doZHJfcnEoc3RydWN0IHJlcXVlc3QgKiwgc3RydWN0IHNnX2lvX2hkciAqKTsKK2V4dGVybiBpbnQgYmxrX2NvbXBsZXRlX3NnaGRyX3JxKHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBzZ19pb19oZHIgKiwKKwkJCSAgc3RydWN0IGJpbyAqKTsKK2V4dGVybiBpbnQgYmxrX3ZlcmlmeV9jb21tYW5kKHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIAogc3RhdGljIGlubGluZSByZXF1ZXN0X3F1ZXVlX3QgKmJkZXZfZ2V0X3F1ZXVlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JzZy5oIGIvaW5jbHVkZS9saW51eC9ic2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDk5OGNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9ic2cuaApAQCAtMCwwICsxLDcwIEBACisjaWZuZGVmIEJTR19ICisjZGVmaW5lIEJTR19ICisKKyNkZWZpbmUgQlNHX1BST1RPQ09MX1NDU0kJCTAKKworI2RlZmluZSBCU0dfU1VCX1BST1RPQ09MX1NDU0lfQ01ECTAKKyNkZWZpbmUgQlNHX1NVQl9QUk9UT0NPTF9TQ1NJX1RNRgkxCisjZGVmaW5lIEJTR19TVUJfUFJPVE9DT0xfU0NTSV9UUkFOU1BPUlQJMgorCitzdHJ1Y3Qgc2dfaW9fdjQgeworCV9fczMyIGd1YXJkOwkJLyogW2ldICdRJyB0byBkaWZmZXJlbnRpYXRlIGZyb20gdjMgKi8KKwlfX3UzMiBwcm90b2NvbDsJCS8qIFtpXSAwIC0+IFNDU0kgLCAuLi4uICovCisJX191MzIgc3VicHJvdG9jb2w7CS8qIFtpXSAwIC0+IFNDU0kgY29tbWFuZCwgMSAtPiBTQ1NJIHRhc2sKKwkJCQkgICBtYW5hZ2VtZW50IGZ1bmN0aW9uLCAuLi4uICovCisKKwlfX3UzMiByZXF1ZXN0X2xlbjsJLyogW2ldIGluIGJ5dGVzICovCisJX191NjQgcmVxdWVzdDsJCS8qIFtpXSwgWyppXSB7U0NTSTogY2RifSAqLworCV9fdTMyIHJlcXVlc3RfYXR0cjsJLyogW2ldIHtTQ1NJOiB0YXNrIGF0dHJpYnV0ZX0gKi8KKwlfX3UzMiByZXF1ZXN0X3RhZzsJLyogW2ldIHtTQ1NJOiB0YXNrIHRhZyAob25seSBpZiBmbGFnZ2VkKX0gKi8KKwlfX3UzMiByZXF1ZXN0X3ByaW9yaXR5OwkvKiBbaV0ge1NDU0k6IHRhc2sgcHJpb3JpdHl9ICovCisJX191MzIgbWF4X3Jlc3BvbnNlX2xlbjsJLyogW2ldIGluIGJ5dGVzICovCisJX191NjQgcmVzcG9uc2U7CQkvKiBbaV0sIFsqb10ge1NDU0k6IChhdXRvKXNlbnNlIGRhdGF9ICovCisKKwkvKiAiZGluXyIgZm9yIGRhdGEgaW4gKGZyb20gZGV2aWNlKTsgImRvdXRfIiBmb3IgZGF0YSBvdXQgKHRvIGRldmljZSkgKi8KKwlfX3UzMiBkb3V0X3hmZXJfbGVuOwkvKiBbaV0gYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQgdG8gZGV2aWNlICovCisJX191MzIgZGluX3hmZXJfbGVuOwkvKiBbaV0gYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBkZXZpY2UgKi8KKwlfX3U2NCBkb3V0X3hmZXJwOwkvKiBbaV0sIFsqaV0gKi8KKwlfX3U2NCBkaW5feGZlcnA7CS8qIFtpXSwgWypvXSAqLworCisJX191MzIgdGltZW91dDsJCS8qIFtpXSB1bml0czogbWlsbGlzZWNvbmQgKi8KKwlfX3UzMiBmbGFnczsJCS8qIFtpXSBiaXQgbWFzayAqLworCV9fdTY0IHVzcl9wdHI7CQkvKiBbaS0+b10gdW51c2VkIGludGVybmFsbHkgKi8KKwlfX3UzMiBzcGFyZV9pbjsJCS8qIFtpXSAqLworCisJX191MzIgZHJpdmVyX3N0YXR1czsJLyogW29dIDAgLT4gb2sgKi8KKwlfX3UzMiB0cmFuc3BvcnRfc3RhdHVzOwkvKiBbb10gMCAtPiBvayAqLworCV9fdTMyIGRldmljZV9zdGF0dXM7CS8qIFtvXSB7U0NTSTogY29tbWFuZCBjb21wbGV0aW9uIHN0YXR1c30gKi8KKwlfX3UzMiByZXRyeV9kZWxheTsJLyogW29dIHtTQ1NJOiBzdGF0dXMgYXV4aWxpYXJ5IGluZm9ybWF0aW9ufSAqLworCV9fdTMyIGluZm87CQkvKiBbb10gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLworCV9fdTMyIGR1cmF0aW9uOwkJLyogW29dIHRpbWUgdG8gY29tcGxldGUsIGluIG1pbGxpc2Vjb25kcyAqLworCV9fdTMyIHJlc3BvbnNlX2xlbjsJLyogW29dIGJ5dGVzIG9mIHJlc3BvbnNlIGFjdHVhbGx5IHdyaXR0ZW4gKi8KKwlfX3MzMiBkaW5fcmVzaWQ7CS8qIFtvXSBhY3R1YWxfZGluX3hmZXJfbGVuIC0gZGluX3hmZXJfbGVuICovCisJX191MzIgZ2VuZXJhdGVkX3RhZzsJLyogW29dIHtTQ1NJOiB0YXNrIHRhZyB0aGF0IHRyYW5zcG9ydCBjaG9zZX0gKi8KKwlfX3UzMiBzcGFyZV9vdXQ7CS8qIFtvXSAqLworCisJX191MzIgcGFkZGluZzsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0JTRykKK3N0cnVjdCBic2dfY2xhc3NfZGV2aWNlIHsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBtaW5vcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOworfTsKKworZXh0ZXJuIGludCBic2dfcmVnaXN0ZXJfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGJzZ191bnJlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICopOworI2Vsc2UKK3N0cnVjdCBic2dfY2xhc3NfZGV2aWNlIHsgfTsKKyNkZWZpbmUgYnNnX3JlZ2lzdGVyX3F1ZXVlKGRpc2ssIG5hbWUpCQkoMCkKKyNkZWZpbmUgYnNnX3VucmVnaXN0ZXJfcXVldWUoZGlzaykJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9idWcuaCBiL2luY2x1ZGUvbGludXgvYnVnLmgKaW5kZXggNDJhYTBhNS4uNTQzOThkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9idWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J1Zy5oCkBAIC0xMCw2ICsxMCw4IEBACiAJQlVHX1RSQVBfVFlQRV9CVUcgPSAyLAogfTsKIAorc3RydWN0IHB0X3JlZ3M7CisKICNpZmRlZiBDT05GSUdfR0VORVJJQ19CVUcKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KIApAQCAtMjAsNyArMjIsNyBAQAogCiBjb25zdCBzdHJ1Y3QgYnVnX2VudHJ5ICpmaW5kX2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z2FkZHIpOwogCi1lbnVtIGJ1Z190cmFwX3R5cGUgcmVwb3J0X2J1Zyh1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKTsKK2VudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogaW50ICBtb2R1bGVfYnVnX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICosIGNvbnN0IEVsZl9TaGRyICosCiAJCQkgc3RydWN0IG1vZHVsZSAqKTsKQEAgLTMxLDcgKzMzLDggQEAKIAogI2Vsc2UJLyogIUNPTkZJR19HRU5FUklDX0JVRyAqLwogCi1zdGF0aWMgaW5saW5lIGVudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIpCitzdGF0aWMgaW5saW5lIGVudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnX2FkZHIsCisJCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlyZXR1cm4gQlVHX1RSQVBfVFlQRV9CVUc7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaCBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCmluZGV4IGJiZjhkZjcuLjJkZmE1ODUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FwYWJpbGl0eS5oCkBAIC00NCw3ICs0NCw2IEBACiAgIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KIAogLyogI2RlZmluZSBTVFJJQ1RfQ0FQX1RfVFlQRUNIRUNLUyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZHJvbS5oIGIvaW5jbHVkZS9saW51eC9jZHJvbS5oCmluZGV4IGY1MGYwNGIuLjJiNjQxYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2Ryb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nkcm9tLmgKQEAgLTQxNCw4ICs0MTQsOCBAQAogI2RlZmluZSBDRE9fQ0hFQ0tfVFlQRQkJMHgxMCAgICAvKiBjaGVjayB0eXBlIG9uIG9wZW4gZm9yIGRhdGEgKi8KIAogLyogU3BlY2lhbCBjb2RlcyB1c2VkIHdoZW4gc3BlY2lmeWluZyBjaGFuZ2VyIHNsb3RzLiAqLwotI2RlZmluZSBDRFNMX05PTkUgICAgICAgCSgoaW50KSAofjBVPj4xKS0xKQotI2RlZmluZSBDRFNMX0NVUlJFTlQgICAgCSgoaW50KSAofjBVPj4xKSkKKyNkZWZpbmUgQ0RTTF9OT05FICAgICAgIAkoSU5UX01BWC0xKQorI2RlZmluZSBDRFNMX0NVUlJFTlQgICAgCUlOVF9NQVgKIAogLyogRm9yIHBhcnRpdGlvbiBiYXNlZCBtdWx0aXNlc3Npb24gYWNjZXNzLiBJREUgY2FuIGhhbmRsZSA2NCBwYXJ0aXRpb25zCiAgKiBwZXIgZHJpdmUgLSBTQ1NJIENELVJPTSdzIHVzZSBtaW5vcnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb2JhbHQtbnZyYW0uaCBiL2luY2x1ZGUvbGludXgvY29iYWx0LW52cmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDI5NTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9jb2JhbHQtbnZyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogJElkOiBjb2JhbHQtbnZyYW0uaCx2IDEuMjAgMjAwMS8xMC8xNyAyMzoxNjo1NSB0aG9ja2luIEV4cCAkCi0gKiBjb2JhbHQtbnZyYW0uaCA6IGRlZmluZXMgZm9yIHRoZSB2YXJpb3VzIGZpZWxkcyBpbiB0aGUgY29iYWx0IE5WUkFNCi0gKgotICogQ29weXJpZ2h0IDIwMDEsMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKi8KLQotI2lmbmRlZiBDT0JBTFRfTlZSQU1fSAotI2RlZmluZSBDT0JBTFRfTlZSQU1fSAotCi0jaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KLQotI2RlZmluZSBDT0JUX0NNT1NfSU5GT19NQVgJCTB4N2YJLyogdG9wIGFkZHJlc3MgYWxsb3dlZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfQklPU19EUklWRV9JTkZPCTB4MTIJLyogZHJpdmUgaW5mbyB3b3VsZCBnbyBoZXJlICovCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0NLU19TVEFSVAkJTlZSQU1fT0ZGU0VUKDB4MGUpCi0jZGVmaW5lIENPQlRfQ01PU19DS1NfRU5ECQlOVlJBTV9PRkZTRVQoMHg3ZikKLQotLyogZmxhZyBieXRlcyAtIDE2IGZsYWdzIGZvciBub3csIGxlYXZlIHJvb20gZm9yIG1vcmUgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0ZMQUdfQllURV8wCQlOVlJBTV9PRkZTRVQoMHgxMCkKLSNkZWZpbmUgQ09CVF9DTU9TX0ZMQUdfQllURV8xCQlOVlJBTV9PRkZTRVQoMHgxMSkKLQotLyogZmxhZ3MgaW4gZmxhZyBieXRlcyAtIHVwIHRvIDE2ICovCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX01JTgkJMHgwMDAxCi0jZGVmaW5lIENPQlRfQ01PU19DT05TT0xFX0ZMQUcJCTB4MDAwMSAvKiBjb25zb2xlIG9uL29mZiAqLwotI2RlZmluZSBDT0JUX0NNT1NfREVCVUdfRkxBRwkJMHgwMDAyIC8qIFJPTSBkZWJ1ZyBtZXNzYWdlcyAqLwotI2RlZmluZSBDT0JUX0NNT1NfQVVUT19QUk9NUFRfRkxBRwkweDAwMDQgLyogYm9vdCB0byBST00gcHJvbXB0PyAqLwotI2RlZmluZSBDT0JUX0NNT1NfQ0xFQU5fQk9PVF9GTEFHCTB4MDAwOCAvKiBzZXQgYnkgYSBjbGVhbiBzaHV0ZG93biAqLwotI2RlZmluZSBDT0JUX0NNT1NfSFdfTk9QUk9CRV9GTEFHCTB4MDAxMCAvKiBnbyBlYXN5IG9uIHRoZSBwcm9iaW5nICovCi0jZGVmaW5lIENPQlRfQ01PU19TWVNGQVVMVF9GTEFHCQkweDAwMjAgLyogc3lzdGVtIGZhdWx0IGRldGVjdGVkICovCi0jZGVmaW5lIENPQlRfQ01PU19PT1BTUEFOSUNfRkxBRwkweDAwNDAgLyogcGFuaWMgb24gb29wcyAqLwotI2RlZmluZSBDT0JUX0NNT1NfREVMQVlfQ0FDSEVfRkxBRwkweDAwODAgLyogZGVsYXkgY2FjaGUgaW5pdGlhbGl6YXRpb24gKi8KLSNkZWZpbmUgQ09CVF9DTU9TX05PTE9HT19GTEFHCQkweDAxMDAgLyogaGlkZSAiQyIgbG9nbyBAIGJvb3QgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRwkJMHgwMjAwIC8qIHRoZSB2ZXJzaW9uIGZpZWxkIGlzIHZhbGlkICovCi0jZGVmaW5lIENPQlRfQ01PU19GTEFHX01BWAkJMHgwMjAwCi0KLS8qIGxlYXZlIGJ5dGUgMHgxMiBibGFuayAtIExpbnV4IGxvb2tzIGZvciBkcml2ZSBpbmZvIGhlcmUgKi8KLQotLyogQ01PUyBzdHJ1Y3R1cmUgdmVyc2lvbiwgdmFsaWQgaWYgQ09CVF9DTU9TX1ZFUlNJT05fRkxBRyBpcyB0cnVlICovCi0jZGVmaW5lIENPQlRfQ01PU19WRVJTSU9OCQlOVlJBTV9PRkZTRVQoMHgxMykKLSNkZWZpbmUgQ09CVF9DTU9TX1ZFUl9CVE9DT0RFCQkxIC8qIG1pbi4gdmVyc2lvbiBuZWVkZWQgZm9yIGJ0b2NvZGUgKi8KLQotLyogaW5kZXggb2YgZGVmYXVsdCBib290IG1ldGhvZCAqLwotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0QJCU5WUkFNX09GRlNFVCgweDIwKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfRElTSwkwCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX01FVEhPRF9ST00JMQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9NRVRIT0RfTkVUCTIKLQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVZfTUlOCQlOVlJBTV9PRkZTRVQoMHgyMSkKLS8qIG1ham9yICMsIG1pbm9yICMgb2YgZmlyc3QgdGhyb3VnaCBmb3VydGggYm9vdCBkZXZpY2UgKi8KLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMF9NQUoJCU5WUkFNX09GRlNFVCgweDIxKQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYwX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjIpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjFfTUFKCQlOVlJBTV9PRkZTRVQoMHgyMykKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWMV9NSU4JCU5WUkFNX09GRlNFVCgweDI0KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYyX01BSgkJTlZSQU1fT0ZGU0VUKDB4MjUpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVjJfTUlOCQlOVlJBTV9PRkZTRVQoMHgyNikKLSNkZWZpbmUgQ09CVF9DTU9TX0JPT1RfREVWM19NQUoJCU5WUkFNX09GRlNFVCgweDI3KQotI2RlZmluZSBDT0JUX0NNT1NfQk9PVF9ERVYzX01JTgkJTlZSQU1fT0ZGU0VUKDB4MjgpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UX0RFVl9NQVgJCU5WUkFNX09GRlNFVCgweDI4KQotCi0vKiBjaGVja3N1bSBvZiBieXRlcyAweGUtMHg3ZiAqLwotI2RlZmluZSBDT0JUX0NNT1NfQ0hFQ0tTVU0JCU5WUkFNX09GRlNFVCgweDJlKQotCi0vKiBydW5uaW5nIHVwdGltZSBjb3VudGVyLCB1bml0cyBvZiA1IG1pbnV0ZXMgKDMyIGJpdHMgPX4gNDEwMDAgeWVhcnMpICovCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMAkJTlZSQU1fT0ZGU0VUKDB4MzApCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMQkJTlZSQU1fT0ZGU0VUKDB4MzEpCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMgkJTlZSQU1fT0ZGU0VUKDB4MzIpCi0jZGVmaW5lIENPQlRfQ01PU19VUFRJTUVfMwkJTlZSQU1fT0ZGU0VUKDB4MzMpCi0KLS8qIGNvdW50IG9mIHN1Y2Nlc3NmdWwgYm9vdHMgKDMyIGJpdHMpICovCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMAkJTlZSQU1fT0ZGU0VUKDB4MzgpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMQkJTlZSQU1fT0ZGU0VUKDB4MzkpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMgkJTlZSQU1fT0ZGU0VUKDB4M2EpCi0jZGVmaW5lIENPQlRfQ01PU19CT09UQ09VTlRfMwkJTlZSQU1fT0ZGU0VUKDB4M2IpCi0KLS8qIDEzIGJ5dGVzOiBzeXN0ZW0gc2VyaWFsIG51bWJlciwgc2FtZSBhcyBvbiB0aGUgYmFjayBvZiB0aGUgc3lzdGVtICovCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNX0xFTgkxMwotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8wCQlOVlJBTV9PRkZTRVQoMHg0MCkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMQkJTlZSQU1fT0ZGU0VUKDB4NDEpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzIJCU5WUkFNX09GRlNFVCgweDQyKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8zCQlOVlJBTV9PRkZTRVQoMHg0MykKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNAkJTlZSQU1fT0ZGU0VUKDB4NDQpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzUJCU5WUkFNX09GRlNFVCgweDQ1KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV82CQlOVlJBTV9PRkZTRVQoMHg0NikKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fNwkJTlZSQU1fT0ZGU0VUKDB4NDcpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzgJCU5WUkFNX09GRlNFVCgweDQ4KQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV85CQlOVlJBTV9PRkZTRVQoMHg0OSkKLSNkZWZpbmUgQ09CVF9DTU9TX1NZU19TRVJOVU1fMTAJCU5WUkFNX09GRlNFVCgweDRhKQotI2RlZmluZSBDT0JUX0NNT1NfU1lTX1NFUk5VTV8xMQkJTlZSQU1fT0ZGU0VUKDB4NGIpCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNXzEyCQlOVlJBTV9PRkZTRVQoMHg0YykKLS8qIGNoZWNrc3VtIGZvciBzZXJpYWwgbnVtIC0gMSBieXRlICovCi0jZGVmaW5lIENPQlRfQ01PU19TWVNfU0VSTlVNX0NTVU0JTlZSQU1fT0ZGU0VUKDB4NGYpCi0KLSNkZWZpbmUgQ09CVF9DTU9TX1JPTV9SRVZfTUFKCQlOVlJBTV9PRkZTRVQoMHg1MCkKLSNkZWZpbmUgQ09CVF9DTU9TX1JPTV9SRVZfTUlOCQlOVlJBTV9PRkZTRVQoMHg1MSkKLSNkZWZpbmUgQ09CVF9DTU9TX1JPTV9SRVZfUkVWCQlOVlJBTV9PRkZTRVQoMHg1MikKLQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMAkJTlZSQU1fT0ZGU0VUKDB4NTMpCi0jZGVmaW5lIENPQlRfQ01PU19CVE9fQ09ERV8xCQlOVlJBTV9PRkZTRVQoMHg1NCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19DT0RFXzIJCU5WUkFNX09GRlNFVCgweDU1KQotI2RlZmluZSBDT0JUX0NNT1NfQlRPX0NPREVfMwkJTlZSQU1fT0ZGU0VUKDB4NTYpCi0KLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF9DU1VNCQlOVlJBTV9PRkZTRVQoMHg1NykKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8wCQlOVlJBTV9PRkZTRVQoMHg1OCkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8xCQlOVlJBTV9PRkZTRVQoMHg1OSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8yCQlOVlJBTV9PRkZTRVQoMHg1YSkKLSNkZWZpbmUgQ09CVF9DTU9TX0JUT19JUF8zCQlOVlJBTV9PRkZTRVQoMHg1YikKLQotI2VuZGlmIC8qIENPQkFMVF9OVlJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmggYi9pbmNsdWRlL2xpbnV4L2NvbmZpZ2ZzLmgKaW5kZXggZmVmNmYzZC4uOGM2OTY3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb25maWdmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvY29uZmlnZnMuaApAQCAtNDAsOSArNDAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2RlZmluZSBDT05GSUdGU19JVEVNX05BTUVfTEVOCTIwCiAKQEAgLTc1LDcgKzc1LDYgQEAKIGV4dGVybiB2b2lkIGNvbmZpZ19pdGVtX2luaXRfdHlwZV9uYW1lKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICAgc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKnR5cGUpOwotZXh0ZXJuIHZvaWQgY29uZmlnX2l0ZW1fY2xlYW51cChzdHJ1Y3QgY29uZmlnX2l0ZW0gKik7CiAKIGV4dGVybiBzdHJ1Y3QgY29uZmlnX2l0ZW0gKiBjb25maWdfaXRlbV9nZXQoc3RydWN0IGNvbmZpZ19pdGVtICopOwogZXh0ZXJuIHZvaWQgY29uZmlnX2l0ZW1fcHV0KHN0cnVjdCBjb25maWdfaXRlbSAqKTsKQEAgLTg3LDEyICs4NiwxMCBAQAogCXN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUJCSoqY3RfYXR0cnM7CiB9OwogCi0KIC8qKgogICoJZ3JvdXAgLSBhIGdyb3VwIG9mIGNvbmZpZ19pdGVtcyBvZiBhIHNwZWNpZmljIHR5cGUsIGJlbG9uZ2luZwogICoJdG8gYSBzcGVjaWZpYyBzdWJzeXN0ZW0uCiAgKi8KLQogc3RydWN0IGNvbmZpZ19ncm91cCB7CiAJc3RydWN0IGNvbmZpZ19pdGVtCQljZ19pdGVtOwogCXN0cnVjdCBsaXN0X2hlYWQJCWNnX2NoaWxkcmVuOwpAQCAtMTAwLDEzICs5NywxMSBAQAogCXN0cnVjdCBjb25maWdfZ3JvdXAJCSoqZGVmYXVsdF9ncm91cHM7CiB9OwogCi0KIGV4dGVybiB2b2lkIGNvbmZpZ19ncm91cF9pbml0KHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwKTsKIGV4dGVybiB2b2lkIGNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZShzdHJ1Y3QgY29uZmlnX2dyb3VwICpncm91cCwKIAkJCQkJY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKnR5cGUpOwogCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbmZpZ19ncm91cCAqdG9fY29uZmlnX2dyb3VwKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKIHsKIAlyZXR1cm4gaXRlbSA/IGNvbnRhaW5lcl9vZihpdGVtLHN0cnVjdCBjb25maWdfZ3JvdXAsY2dfaXRlbSkgOiBOVUxMOwpAQCAtMTIyLDcgKzExNyw4IEBACiAJY29uZmlnX2l0ZW1fcHV0KCZncm91cC0+Y2dfaXRlbSk7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgY29uZmlnX2l0ZW0gKmNvbmZpZ19ncm91cF9maW5kX29iaihzdHJ1Y3QgY29uZmlnX2dyb3VwICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gc3RydWN0IGNvbmZpZ19pdGVtICpjb25maWdfZ3JvdXBfZmluZF9pdGVtKHN0cnVjdCBjb25maWdfZ3JvdXAgKiwKKwkJCQkJCSAgY29uc3QgY2hhciAqKTsKIAogCiBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlIHsKQEAgLTEzMSw2ICsxMjcsMjIgQEAKIAltb2RlX3QJCQljYV9tb2RlOwogfTsKIAorLyoKKyAqIFVzZXJzIG9mdGVuIG5lZWQgdG8gY3JlYXRlIGF0dHJpYnV0ZSBzdHJ1Y3R1cmVzIGZvciB0aGVpciBjb25maWd1cmFibGUKKyAqIGF0dHJpYnV0ZXMsIGNvbnRhaW5pbmcgYSBjb25maWdmc19hdHRyaWJ1dGUgbWVtYmVyIGFuZCBmdW5jdGlvbiBwb2ludGVycworICogZm9yIHRoZSBzaG93KCkgYW5kIHN0b3JlKCkgb3BlcmF0aW9ucyBvbiB0aGF0IGF0dHJpYnV0ZS4gVGhleSBjYW4gdXNlCisgKiB0aGlzIG1hY3JvIChzaW1pbGFyIHRvIHN5c2ZzJyBfX0FUVFIpIHRvIG1ha2UgZGVmaW5pbmcgYXR0cmlidXRlcyBlYXNpZXIuCisgKi8KKyNkZWZpbmUgX19DT05GSUdGU19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkJCQlcCit7CQkJCQkJCQkJXAorCS5hdHRyCT0gewkJCQkJCQlcCisJCQkuY2FfbmFtZSA9IF9fc3RyaW5naWZ5KF9uYW1lKSwJCQlcCisJCQkuY2FfbW9kZSA9IF9tb2RlLAkJCQlcCisJCQkuY2Ffb3duZXIgPSBUSElTX01PRFVMRSwJCQlcCisJfSwJCQkJCQkJCVwKKwkuc2hvdwk9IF9zaG93LAkJCQkJCVwKKwkuc3RvcmUJPSBfc3RvcmUsCQkJCQkJXAorfQogCiAvKgogICogSWYgYWxsb3dfbGluaygpIGV4aXN0cywgdGhlIGl0ZW0gY2FuIHN5bWxpbmsoMikgb3V0IHRvIG90aGVyCkBAIC0xNTcsMTIgKzE2OSwxMyBAQAogCXN0cnVjdCBjb25maWdfaXRlbSAqKCptYWtlX2l0ZW0pKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBjb25zdCBjaGFyICpuYW1lKTsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwICooKm1ha2VfZ3JvdXApKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBjb25zdCBjaGFyICpuYW1lKTsKIAlpbnQgKCpjb21taXRfaXRlbSkoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtKTsKKwl2b2lkICgqZGlzY29ubmVjdF9ub3RpZnkpKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogCXZvaWQgKCpkcm9wX2l0ZW0pKHN0cnVjdCBjb25maWdfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pOwogfTsKIAogc3RydWN0IGNvbmZpZ2ZzX3N1YnN5c3RlbSB7CiAJc3RydWN0IGNvbmZpZ19ncm91cAlzdV9ncm91cDsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXN1X3NlbTsKKwlzdHJ1Y3QgbXV0ZXgJCXN1X211dGV4OwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY29uZmlnZnNfc3Vic3lzdGVtICp0b19jb25maWdmc19zdWJzeXN0ZW0oc3RydWN0IGNvbmZpZ19ncm91cCAqZ3JvdXApCkBAIC0xNzUsNiArMTg4LDExIEBACiBpbnQgY29uZmlnZnNfcmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiB2b2lkIGNvbmZpZ2ZzX3VucmVnaXN0ZXJfc3Vic3lzdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cyk7CiAKKy8qIFRoZXNlIGZ1bmN0aW9ucyBjYW4gc2xlZXAgYW5kIGNhbiBhbGxvYyB3aXRoIEdGUF9LRVJORUwgKi8KKy8qIFdBUk5JTkc6IFRoZXNlIGNhbm5vdCBiZSBjYWxsZWQgdW5kZXJuZWF0aCBjb25maWdmcyBjYWxsYmFja3MhISAqLworaW50IGNvbmZpZ2ZzX2RlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywgc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpOwordm9pZCBjb25maWdmc191bmRlcGVuZF9pdGVtKHN0cnVjdCBjb25maWdmc19zdWJzeXN0ZW0gKnN1YnN5cywgc3RydWN0IGNvbmZpZ19pdGVtICp0YXJnZXQpOworCiAjZW5kaWYgIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmIC8qIF9DT05GSUdGU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAppbmRleCA2MmVmNmUxLi41NmE3YmNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaApAQCAtMTUsNyArMTUsNiBAQAogI2RlZmluZSBfTElOVVhfQ09OU09MRV9IXyAxCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0cnVjdCB2Y19kYXRhOwogc3RydWN0IGNvbnNvbGVfZm9udF9vcDsKQEAgLTk5LDYgKzk4LDcgQEAKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqKCpkZXZpY2UpKHN0cnVjdCBjb25zb2xlICosIGludCAqKTsKIAl2b2lkCSgqdW5ibGFuaykodm9pZCk7CiAJaW50CSgqc2V0dXApKHN0cnVjdCBjb25zb2xlICosIGNoYXIgKik7CisJaW50CSgqZWFybHlfc2V0dXApKHZvaWQpOwogCXNob3J0CWZsYWdzOwogCXNob3J0CWluZGV4OwogCWludAljZmxhZzsKQEAgLTEwNyw2ICsxMDcsNyBAQAogfTsKIAogZXh0ZXJuIGludCBhZGRfcHJlZmVycmVkX2NvbnNvbGUoY2hhciAqbmFtZSwgaW50IGlkeCwgY2hhciAqb3B0aW9ucyk7CitleHRlcm4gaW50IHVwZGF0ZV9jb25zb2xlX2NtZGxpbmUoY2hhciAqbmFtZSwgaW50IGlkeCwgY2hhciAqbmFtZV9uZXcsIGludCBpZHhfbmV3LCBjaGFyICpvcHRpb25zKTsKIGV4dGVybiB2b2lkIHJlZ2lzdGVyX2NvbnNvbGUoc3RydWN0IGNvbnNvbGUgKik7CiBleHRlcm4gaW50IHVucmVnaXN0ZXJfY29uc29sZShzdHJ1Y3QgY29uc29sZSAqKTsKIGV4dGVybiBzdHJ1Y3QgY29uc29sZSAqY29uc29sZV9kcml2ZXJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlbWFwLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaAppbmRleCA4MmM5YTFmLi4wNmIyNzY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGVtYXAuaApAQCAtOCw5ICs4LDEyIEBACiAjZGVmaW5lIElCTVBDX01BUCAyCiAjZGVmaW5lIFVTRVJfTUFQIDMKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIHN0cnVjdCB2Y19kYXRhOwogCi1leHRlcm4gdW5zaWduZWQgY2hhciBpbnZlcnNlX3RyYW5zbGF0ZShzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgaW50IGdseXBoKTsKK2V4dGVybiB1MTYgaW52ZXJzZV90cmFuc2xhdGUoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGludCBnbHlwaCwgaW50IHVzZV91bmljb2RlKTsKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCAqc2V0X3RyYW5zbGF0ZShpbnQgbSwgc3RydWN0IHZjX2RhdGEgKnZjKTsKIGV4dGVybiBpbnQgY29udl91bmlfdG9fcGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIGxvbmcgdWNzKTsKK2V4dGVybiB1MzIgY29udl84Yml0X3RvX3VuaSh1bnNpZ25lZCBjaGFyIGMpOwogdm9pZCBjb25zb2xlX21hcF9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggM2IyZGYyNS4uYzIyMzZiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC0xMjAsNyArMTIwLDYgQEAKIAogI2RlZmluZSBsb2NrX2NwdV9ob3RwbHVnKCkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSB1bmxvY2tfY3B1X2hvdHBsdWcoKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGxvY2tfY3B1X2hvdHBsdWdfaW50ZXJydXB0aWJsZSgpIDAKICNkZWZpbmUgaG90Y3B1X25vdGlmaWVyKGZuLCBwcmkpCWRvIHsgKHZvaWQpKGZuKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKG5iKQlkbyB7ICh2b2lkKShuYik7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKG5iKQlkbyB7ICh2b2lkKShuYik7IH0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyYzcuaCBiL2luY2x1ZGUvbGludXgvY3JjNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODZlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2NyYzcuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIF9MSU5VWF9DUkM3X0gKKyNkZWZpbmUgX0xJTlVYX0NSQzdfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK2V4dGVybiBjb25zdCB1OCBjcmM3X3N5bmRyb21lX3RhYmxlWzI1Nl07CisKK3N0YXRpYyBpbmxpbmUgdTggY3JjN19ieXRlKHU4IGNyYywgdTggZGF0YSkKK3sKKwlyZXR1cm4gY3JjN19zeW5kcm9tZV90YWJsZVsoY3JjIDw8IDEpIF4gZGF0YV07Cit9CisKK2V4dGVybiB1OCBjcmM3KHU4IGNyYywgY29uc3QgdTggKmJ1ZmZlciwgc2l6ZV90IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCmluZGV4IDlhNjYzYzYuLjJkYzIxY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKQEAgLTMxLDcgKzMxLDExIEBACiAJCShkbWFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkpOwogfQogCisjaWZkZWYgQ09ORklHX0hBU19ETUEKICNpbmNsdWRlIDxhc20vZG1hLW1hcHBpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZG1hLW1hcHBpbmctYnJva2VuLmg+CisjZW5kaWYKIAogLyogQmFja3dhcmRzIGNvbXBhdCwgcmVtb3ZlIGluIDIuNy54ICovCiAjZGVmaW5lIGRtYV9zeW5jX3NpbmdsZQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHMxNzI4N3J0Yy5oIGIvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmgKaW5kZXggYzI4MWJhNC4uZDg1ZDNmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9kczE3Mjg3cnRjLmgKQEAgLTExLDcgKzExLDYgQEAKICNkZWZpbmUgX19MSU5VWF9EUzE3Mjg3UlRDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgkJCS8qIGdldCB0aGUgdXNlci1sZXZlbCBBUEkgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgkJLyogc3BpbmxvY2tfdCAqLwogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CiAKIC8qIFJlZ2lzdGVyIEEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oCmluZGV4IGRmZWQ4MDAuLjE2Y2IyNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZnNfZnMuaApAQCAtNDUsNiArNDUsNyBAQAogZXh0ZXJuIGludCBlZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICplZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqZWZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApOwogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmVmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IGVmc19ibWFwKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4cG9ydGZzLmggYi9pbmNsdWRlL2xpbnV4L2V4cG9ydGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3MmZlOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZXhwb3J0ZnMuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBMSU5VWF9FWFBPUlRGU19ICisjZGVmaW5lIExJTlVYX0VYUE9SVEZTX0ggMQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGRlbnRyeTsKK3N0cnVjdCBzdXBlcl9ibG9jazsKK3N0cnVjdCB2ZnNtb3VudDsKKworCisvKioKKyAqIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAtIGZvciBuZnNkIHRvIGNvbW11bmljYXRlIHdpdGggZmlsZSBzeXN0ZW1zCisgKiBAZGVjb2RlX2ZoOiAgICAgIGRlY29kZSBhIGZpbGUgaGFuZGxlIGZyYWdtZW50IGFuZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeQorICogQGVuY29kZV9maDogICAgICBlbmNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBmcm9tIGEgZGVudHJ5CisgKiBAZ2V0X25hbWU6ICAgICAgIGZpbmQgdGhlIG5hbWUgZm9yIGEgZ2l2ZW4gaW5vZGUgaW4gYSBnaXZlbiBkaXJlY3RvcnkKKyAqIEBnZXRfcGFyZW50OiAgICAgZmluZCB0aGUgcGFyZW50IG9mIGEgZ2l2ZW4gZGlyZWN0b3J5CisgKiBAZ2V0X2RlbnRyeTogICAgIGZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbiBhIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudAorICogQGZpbmRfZXhwb3J0ZWRfZGVudHJ5OgorICoJc2V0IGJ5IHRoZSBleHBvcnRpbmcgbW9kdWxlIHRvIGEgc3RhbmRhcmQgaGVscGVyIGZ1bmN0aW9uLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgVGhlIGV4cG9ydF9vcGVyYXRpb25zIHN0cnVjdHVyZSBwcm92aWRlcyBhIG1lYW5zIGZvciBuZnNkIHRvIGNvbW11bmljYXRlCisgKiAgICB3aXRoIGEgcGFydGljdWxhciBleHBvcnRlZCBmaWxlIHN5c3RlbSAgLSBwYXJ0aWN1bGFybHkgZW5hYmxpbmcgbmZzZCBhbmQKKyAqICAgIHRoZSBmaWxlc3lzdGVtIHRvIGNvLW9wZXJhdGUgd2hlbiBkZWFsaW5nIHdpdGggZmlsZSBoYW5kbGVzLgorICoKKyAqICAgIGV4cG9ydF9vcGVyYXRpb25zIGNvbnRhaW5zIHR3byBiYXNpYyBvcGVyYXRpb24gZm9yIGRlYWxpbmcgd2l0aCBmaWxlCisgKiAgICBoYW5kbGVzLCBkZWNvZGVfZmgoKSBhbmQgZW5jb2RlX2ZoKCksIGFuZCBhbGxvd3MgZm9yIHNvbWUgb3RoZXIKKyAqICAgIG9wZXJhdGlvbnMgdG8gYmUgZGVmaW5lZCB3aGljaCBzdGFuZGFyZCBoZWxwZXIgcm91dGluZXMgdXNlIHRvIGdldAorICogICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZXN5c3RlbS4KKyAqCisgKiAgICBuZnNkIGVuY29kZXMgaW5mb3JtYXRpb24gdXNlIHRvIGRldGVybWluZSB3aGljaCBmaWxlc3lzdGVtIGEgZmlsZWhhbmRsZQorICogICAgYXBwbGllcyB0byBpbiB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBmaWxlIGhhbmRsZS4gIFRoZSByZW1haW5kZXIsIHRlcm1lZAorICogICAgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCwgaXMgY29udHJvbGxlZCBjb21wbGV0ZWx5IGJ5IHRoZSBmaWxlc3lzdGVtLiAgVGhlCisgKiAgICBzdGFuZGFyZCBoZWxwZXIgcm91dGluZXMgYXNzdW1lIHRoYXQgdGhpcyBmcmFnbWVudCB3aWxsIGNvbnRhaW4gb25lIG9yCisgKiAgICB0d28gc3ViLWZyYWdtZW50cywgb25lIHdoaWNoIGlkZW50aWZpZXMgdGhlIGZpbGUsIGFuZCBvbmUgd2hpY2ggbWF5IGJlCisgKiAgICB1c2VkIHRvIGlkZW50aWZ5IHRoZSAoYSkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGUuCisgKgorICogICAgSW4gc29tZSBzaXR1YXRpb25zLCBuZnNkIG5lZWRzIHRvIGdldCBhIGRlbnRyeSB3aGljaCBpcyBjb25uZWN0ZWQgaW50byBhCisgKiAgICBzcGVjaWZpYyBwYXJ0IG9mIHRoZSBmaWxlIHRyZWUuICBUbyBhbGxvdyBmb3IgdGhpcywgaXQgcGFzc2VzIHRoZQorICogICAgZnVuY3Rpb24gYWNjZXB0YWJsZSgpIHRvZ2V0aGVyIHdpdGggYSBAY29udGV4dCB3aGljaCBjYW4gYmUgdXNlZCB0byBzZWUKKyAqICAgIGlmIHRoZSBkZW50cnkgaXMgYWNjZXB0YWJsZS4gIEFzIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBkZW50cnlzIGZvciBhCisgKiAgICBnaXZlbiBmaWxlLCB0aGUgZmlsZXN5c3RlbSBzaG91bGQgY2hlY2sgZWFjaCBvbmUgZm9yIGFjY2VwdGFiaWxpdHkgYmVmb3JlCisgKiAgICBsb29raW5nIGZvciB0aGUgbmV4dC4gIEFzIHNvb24gYXMgYW4gYWNjZXB0YWJsZSBvbmUgaXMgZm91bmQsIGl0IHNob3VsZAorICogICAgYmUgcmV0dXJuZWQuCisgKgorICogZGVjb2RlX2ZoOgorICogICAgQGRlY29kZV9maCBpcyBnaXZlbiBhICZzdHJ1Y3Qgc3VwZXJfYmxvY2sgKEBzYiksIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQKKyAqICAgIChAZmgsIEBmaF9sZW4pIGFuZCBhbiBhY2NlcHRhYmlsaXR5IHRlc3RpbmcgZnVuY3Rpb24gKEBhY2NlcHRhYmxlLAorICogICAgQGNvbnRleHQpLiAgSXQgc2hvdWxkIHJldHVybiBhICZzdHJ1Y3QgZGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc2FtZQorICogICAgZmlsZSB0aGF0IHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudCByZWZlcnMgdG8sICBhbmQgd2hpY2ggcGFzc2VzIHRoZQorICogICAgYWNjZXB0YWJpbGl0eSB0ZXN0LiAgSWYgaXQgY2Fubm90LCBpdCBzaG91bGQgcmV0dXJuIGEgJU5VTEwgcG9pbnRlciBpZgorICogICAgdGhlIGZpbGUgd2FzIGZvdW5kIGJ1dCBubyBhY2NlcHRhYmxlICZkZW50cmllcyB3ZXJlIGF2YWlsYWJsZSwgb3IgYQorICogICAgJUVSUl9QVFIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHdoeSBpdCBjb3VsZG4ndCBiZSBmb3VuZCAoZS5nLiAlRU5PRU5UIG9yCisgKiAgICAlRU5PTUVNKS4KKyAqCisgKiBlbmNvZGVfZmg6CisgKiAgICBAZW5jb2RlX2ZoIHNob3VsZCBzdG9yZSBpbiB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgQGZoICh1c2luZyBhdCBtb3N0CisgKiAgICBAbWF4X2xlbiBieXRlcykgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBAZGVjb2RlX2ZoIHRvIHJlY292ZXIgdGhlCisgKiAgICBmaWxlIHJlZmVyZWQgdG8gYnkgdGhlICZzdHJ1Y3QgZGVudHJ5IEBkZS4gIElmIHRoZSBAY29ubmVjdGFibGUgZmxhZyBpcworICogICAgc2V0LCB0aGUgZW5jb2RlX2ZoKCkgc2hvdWxkIHN0b3JlIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gc28gdGhhdCBhIGdvb2QKKyAqICAgIGF0dGVtcHQgY2FuIGJlIG1hZGUgdG8gZmluZCBub3Qgb25seSB0aGUgZmlsZSBidXQgYWxzbyBpdCdzIHBsYWNlIGluIHRoZQorICogICAgZmlsZXN5c3RlbS4gICBUaGlzIHR5cGljYWxseSBtZWFucyBzdG9yaW5nIGEgcmVmZXJlbmNlIHRvIGRlLT5kX3BhcmVudCBpbgorICogICAgdGhlIGZpbGVoYW5kbGUgZnJhZ21lbnQuICBlbmNvZGVfZmgoKSBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqICAgIHN0b3JlZCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgc3VjaCBhcyAlLUVOT1NQQworICoKKyAqIGdldF9uYW1lOgorICogICAgQGdldF9uYW1lIHNob3VsZCBmaW5kIGEgbmFtZSBmb3IgdGhlIGdpdmVuIEBjaGlsZCBpbiB0aGUgZ2l2ZW4gQHBhcmVudAorICogICAgZGlyZWN0b3J5LiAgVGhlIG5hbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgQG5hbWUgKHdpdGggdGhlCisgKiAgICB1bmRlcnN0YW5kaW5nIHRoYXQgaXQgaXMgYWxyZWFkeSBwb2ludGluZyB0byBhIGEgJU5BTUVfTUFYKzEgc2l6ZWQKKyAqICAgIGJ1ZmZlci4gICBnZXRfbmFtZSgpIHNob3VsZCByZXR1cm4gJTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKiAgICBvciBlcnJvci4gIEBnZXRfbmFtZSB3aWxsIGJlIGNhbGxlZCB3aXRob3V0IEBwYXJlbnQtPmlfbXV0ZXggaGVsZC4KKyAqCisgKiBnZXRfcGFyZW50OgorICogICAgQGdldF9wYXJlbnQgc2hvdWxkIGZpbmQgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBAY2hpbGQgd2hpY2gKKyAqICAgIGlzIGFsc28gYSBkaXJlY3RvcnkuICBJbiB0aGUgZXZlbnQgdGhhdCBpdCBjYW5ub3QgYmUgZm91bmQsIG9yIHN0b3JhZ2UKKyAqICAgIHNwYWNlIGNhbm5vdCBiZSBhbGxvY2F0ZWQsIGEgJUVSUl9QVFIgc2hvdWxkIGJlIHJldHVybmVkLgorICoKKyAqIGdldF9kZW50cnk6CisgKiAgICBHaXZlbiBhICZzdXBlcl9ibG9jayAoQHNiKSBhbmQgYSBwb2ludGVyIHRvIGEgZmlsZS1zeXN0ZW0gc3BlY2lmaWMgaW5vZGUKKyAqICAgIGlkZW50aWZpZXIsIHBvc3NpYmx5IGFuIGlub2RlIG51bWJlciwgKEBpbnVtcCkgZ2V0X2RlbnRyeSgpIHNob3VsZCBmaW5kCisgKiAgICB0aGUgaWRlbnRpZmllZCBpbm9kZSBhbmQgcmV0dXJuIGEgZGVudHJ5IGZvciB0aGF0IGlub2RlLiAgQW55IHN1aXRhYmxlCisgKiAgICBkZW50cnkgY2FuIGJlIHJldHVybmVkIGluY2x1ZGluZywgaWYgbmVjZXNzYXJ5LCBhIG5ldyBkZW50cnkgY3JlYXRlZCB3aXRoCisgKiAgICBkX2FsbG9jX3Jvb3QuICBUaGUgY2FsbGVyIGNhbiB0aGVuIGZpbmQgYW55IG90aGVyIGV4dGFudCBkZW50cnlzIGJ5CisgKiAgICBmb2xsb3dpbmcgdGhlIGRfYWxpYXMgbGlua3MuICBJZiBhIG5ldyBkZW50cnkgd2FzIGNyZWF0ZWQgdXNpbmcKKyAqICAgIGRfYWxsb2Nfcm9vdCwgRENBQ0hFX05GU0RfRElTQ09OTkVDVEVEIHNob3VsZCBiZSBzZXQsIGFuZCB0aGUgZGVudHJ5CisgKiAgICBzaG91bGQgYmUgZF9yZWhhc2goKWVkLgorICoKKyAqICAgIElmIHRoZSBpbm9kZSBjYW5ub3QgYmUgZm91bmQsIGVpdGhlciBhICVOVUxMIHBvaW50ZXIgb3IgYW4gJUVSUl9QVFIgY29kZQorICogICAgY2FuIGJlIHJldHVybmVkLiAgVGhlIEBpbnVtcCB3aWxsIGJlIHdoYXRldmVyIHdhcyBwYXNzZWQgdG8KKyAqICAgIG5mc2RfZmluZF9maF9kZW50cnkoKSBpbiBlaXRoZXIgdGhlIEBvYmogb3IgQHBhcmVudCBwYXJhbWV0ZXJzLgorICoKKyAqIExvY2tpbmcgcnVsZXM6CisgKiAgICBnZXRfcGFyZW50IGlzIGNhbGxlZCB3aXRoIGNoaWxkLT5kX2lub2RlLT5pX211dGV4IGRvd24KKyAqICAgIGdldF9uYW1lIGlzIG5vdCAod2hpY2ggaXMgcG9zc2libHkgaW5jb25zaXN0ZW50KQorICovCisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyB7CisJc3RydWN0IGRlbnRyeSAqKCpkZWNvZGVfZmgpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwKKwkJCWludCBmaF9sZW4sIGludCBmaF90eXBlLAorCQkJaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAorCQkJdm9pZCAqY29udGV4dCk7CisJaW50ICgqZW5jb2RlX2ZoKShzdHJ1Y3QgZGVudHJ5ICpkZSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCisJCQlpbnQgY29ubmVjdGFibGUpOworCWludCAoKmdldF9uYW1lKShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CisJc3RydWN0IGRlbnRyeSAqICgqZ2V0X3BhcmVudCkoc3RydWN0IGRlbnRyeSAqY2hpbGQpOworCXN0cnVjdCBkZW50cnkgKiAoKmdldF9kZW50cnkpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmludW1wKTsKKworCS8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBleHBvcnRpbmcgbW9kdWxlIHRvIGEgc3RhbmRhcmQgaGVscGVyICovCisJc3RydWN0IGRlbnRyeSAqICgqZmluZF9leHBvcnRlZF9kZW50cnkpKAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLCB2b2lkICpwYXJlbnQsCisJCQlpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCQl2b2lkICpjb250ZXh0KTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpmaW5kX2V4cG9ydGVkX2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvYmosCisJdm9pZCAqcGFyZW50LCBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJdm9pZCAqY29udGV4dCk7CisKK2V4dGVybiBpbnQgZXhwb3J0ZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmZoLCBpbnQgKm1heF9sZW4sCisJaW50IGNvbm5lY3RhYmxlKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRmc19kZWNvZGVfZmgoc3RydWN0IHZmc21vdW50ICptbnQsIF9fdTMyICpmaCwKKwlpbnQgZmhfbGVuLCBpbnQgZmlsZWlkX3R5cGUsIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKiwgc3RydWN0IGRlbnRyeSAqKSwKKwl2b2lkICpjb250ZXh0KTsKKworI2VuZGlmIC8qIExJTlVYX0VYUE9SVEZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Ml9mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmgKaW5kZXggNGVkYTBlZC4uZDE0OWYyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzX3NiLmgKQEAgLTMzLDYgKzMzLDggQEAKIAl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCiAJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKaW5kZXggZjYxMzA5Yy4uZDNjMDgzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX3NiLmgKQEAgLTM4LDYgKzM4LDggQEAKIAl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0NF9mc19zYi5oIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmgKaW5kZXggNjkxYTcxMy4uMjM0NzU1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzX3NiLmgKQEAgLTM5LDYgKzM5LDggQEAKIAl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KIAl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKiBzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfZ3JvdXBfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmIuaCBiL2luY2x1ZGUvbGludXgvZmIuaAppbmRleCA2NjIyNjgyLi5jZWM1NDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZiLmgKKysrIGIvaW5jbHVkZS9saW51eC9mYi5oCkBAIC0xMTksNiArMTE5LDcgQEAKICNkZWZpbmUgRkJfQUNDRUxfTlZfNDAgICAgICAgICAgNDYgICAgICAvKiBuVmlkaWEgQXJjaCA0MCAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfVgk0NwkvKiBYR0kgVm9sYXJpIFYzWFQsIFY1LCBWOCAgICAgICovCiAjZGVmaW5lIEZCX0FDQ0VMX1hHSV9WT0xBUklfWgk0OAkvKiBYR0kgVm9sYXJpIFo3ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZCX0FDQ0VMX09NQVAxNjEwCTQ5CS8qIFRJIE9NQVAxNnh4ICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDcwIDkwCS8qIE5lb01hZ2ljIE5NMjA3MCAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDkwIDkxCS8qIE5lb01hZ2ljIE5NMjA5MCAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRkJfQUNDRUxfTkVPTUFHSUNfTk0yMDkzIDkyCS8qIE5lb01hZ2ljIE5NMjA5MyAgICAgICAgICAgICAgKi8KQEAgLTUyOSw2ICs1MzAsOCBAQAogI2RlZmluZSBGQl9FVkVOVF9DT05CTEFOSyAgICAgICAgICAgICAgIDB4MEMKIC8qICAgICAgR2V0IGRyYXdpbmcgcmVxdWlyZW1lbnRzICAgICAgICAqLwogI2RlZmluZSBGQl9FVkVOVF9HRVRfUkVRICAgICAgICAgICAgICAgIDB4MEQKKy8qICAgICAgVW5iaW5kIGZyb20gdGhlIGNvbnNvbGUgaWYgcG9zc2libGUgKi8KKyNkZWZpbmUgRkJfRVZFTlRfRkJfVU5CSU5EICAgICAgICAgICAgICAweDBFCiAKIHN0cnVjdCBmYl9ldmVudCB7CiAJc3RydWN0IGZiX2luZm8gKmluZm87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbGUuaCBiL2luY2x1ZGUvbGludXgvZmlsZS5oCmluZGV4IGE1OTAwMWUuLjAxMTRmYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsZS5oCkBAIC03Myw2ICs3Myw3IEBACiBleHRlcm4gdm9pZCBGQVNUQ0FMTChzZXRfY2xvc2Vfb25fZXhlYyh1bnNpZ25lZCBpbnQgZmQsIGludCBmbGFnKSk7CiBleHRlcm4gdm9pZCBwdXRfZmlscChzdHJ1Y3QgZmlsZSAqKTsKIGV4dGVybiBpbnQgZ2V0X3VudXNlZF9mZCh2b2lkKTsKK2V4dGVybiBpbnQgZ2V0X3VudXNlZF9mZF9mbGFncyhpbnQgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgRkFTVENBTEwocHV0X3VudXNlZF9mZCh1bnNpZ25lZCBpbnQgZmQpKTsKIHN0cnVjdCBrbWVtX2NhY2hlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZyZWV6ZXIuaCBiL2luY2x1ZGUvbGludXgvZnJlZXplci5oCmluZGV4IDQ2MzEwODYuLjJkMzhiMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnJlZXplci5oCisrKyBiL2luY2x1ZGUvbGludXgvZnJlZXplci5oCkBAIC0xLDUgKzEsOCBAQAogLyogRnJlZXplciBkZWNsYXJhdGlvbnMgKi8KIAorI2lmbmRlZiBGUkVFWkVSX0hfSU5DTFVERUQKKyNkZWZpbmUgRlJFRVpFUl9IX0lOQ0xVREVECisKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0xMTUsNiArMTE4LDE0IEBACiAJcmV0dXJuICEhKHAtPmZsYWdzICYgUEZfRlJFRVpFUl9TS0lQKTsKIH0KIAorLyoKKyAqIFRlbGwgdGhlIGZyZWV6ZXIgdGhhdCB0aGUgY3VycmVudCB0YXNrIHNob3VsZCBiZSBmcm96ZW4gYnkgaXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9mcmVlemFibGUodm9pZCkKK3sKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfTk9GUkVFWkU7Cit9CisKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBmcm96ZW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBmcmVlemluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KQEAgLTEzMCw0ICsxNDEsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZXJfZG9fbm90X2NvdW50KHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplcl9jb3VudCh2b2lkKSB7fQogc3RhdGljIGlubGluZSBpbnQgZnJlZXplcl9zaG91bGRfc2tpcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnJlZXphYmxlKHZvaWQpIHt9CiAjZW5kaWYKKworI2VuZGlmCS8qIEZSRUVaRVJfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDRmMGIzYmYuLjU4Y2UzMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKIHN0cnVjdCBpbm9kZXNfc3RhdF90IHsKIAlpbnQgbnJfaW5vZGVzOwogCWludCBucl91bnVzZWQ7Ci0JaW50IGR1bW15WzVdOworCWludCBkdW1teVs1XTsJCS8qIHBhZGRpbmcgZm9yIHN5c2N0bCBBQkkgY29tcGF0aWJpbGl0eSAqLwogfTsKIGV4dGVybiBzdHJ1Y3QgaW5vZGVzX3N0YXRfdCBpbm9kZXNfc3RhdDsKIApAQCAtMjgzLDExICsyODMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCitzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnM7CiBzdHJ1Y3QgaGRfZ2VvbWV0cnk7CiBzdHJ1Y3QgaW92ZWM7CiBzdHJ1Y3QgbmFtZWlkYXRhOwpAQCAtODIwLDYgKzgyMiwxMCBAQAogCXVuaW9uIHsKIAkJc3RydWN0IG5mc19sb2NrX2luZm8JbmZzX2ZsOwogCQlzdHJ1Y3QgbmZzNF9sb2NrX2luZm8JbmZzNF9mbDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgbGluazsJLyogbGluayBpbiBBRlMgdm5vZGUncyBwZW5kaW5nX2xvY2tzIGxpc3QgKi8KKwkJCWludCBzdGF0ZTsJCS8qIHN0YXRlIG9mIGdyYW50IG9yIGVycm9yIGlmIC12ZSAqLworCQl9IGFmczsKIAl9IGZsX3U7CiB9OwogCkBAIC0xMjczLDExOSArMTI3OSw2IEBACiAKIGludCBzeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKIAotLyoqCi0gKiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgLSBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZSB3aXRoIGZpbGUgc3lzdGVtcwotICogQGRlY29kZV9maDogICAgICBkZWNvZGUgYSBmaWxlIGhhbmRsZSBmcmFnbWVudCBhbmQgcmV0dXJuIGEgJnN0cnVjdCBkZW50cnkKLSAqIEBlbmNvZGVfZmg6ICAgICAgZW5jb2RlIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQgZnJvbSBhIGRlbnRyeQotICogQGdldF9uYW1lOiAgICAgICBmaW5kIHRoZSBuYW1lIGZvciBhIGdpdmVuIGlub2RlIGluIGEgZ2l2ZW4gZGlyZWN0b3J5Ci0gKiBAZ2V0X3BhcmVudDogICAgIGZpbmQgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeQotICogQGdldF9kZW50cnk6ICAgICBmaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUgZ2l2ZW4gYSBmaWxlIGhhbmRsZSBzdWItZnJhZ21lbnQKLSAqIEBmaW5kX2V4cG9ydGVkX2RlbnRyeToKLSAqCXNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciBmdW5jdGlvbi4KLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgIFRoZSBleHBvcnRfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBtZWFucyBmb3IgbmZzZCB0byBjb21tdW5pY2F0ZQotICogICAgd2l0aCBhIHBhcnRpY3VsYXIgZXhwb3J0ZWQgZmlsZSBzeXN0ZW0gIC0gcGFydGljdWxhcmx5IGVuYWJsaW5nIG5mc2QgYW5kCi0gKiAgICB0aGUgZmlsZXN5c3RlbSB0byBjby1vcGVyYXRlIHdoZW4gZGVhbGluZyB3aXRoIGZpbGUgaGFuZGxlcy4KLSAqCi0gKiAgICBleHBvcnRfb3BlcmF0aW9ucyBjb250YWlucyB0d28gYmFzaWMgb3BlcmF0aW9uIGZvciBkZWFsaW5nIHdpdGggZmlsZQotICogICAgaGFuZGxlcywgZGVjb2RlX2ZoKCkgYW5kIGVuY29kZV9maCgpLCBhbmQgYWxsb3dzIGZvciBzb21lIG90aGVyCi0gKiAgICBvcGVyYXRpb25zIHRvIGJlIGRlZmluZWQgd2hpY2ggc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIHVzZSB0byBnZXQKLSAqICAgIHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0gKgotICogICAgbmZzZCBlbmNvZGVzIGluZm9ybWF0aW9uIHVzZSB0byBkZXRlcm1pbmUgd2hpY2ggZmlsZXN5c3RlbSBhIGZpbGVoYW5kbGUKLSAqICAgIGFwcGxpZXMgdG8gaW4gdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgZmlsZSBoYW5kbGUuICBUaGUgcmVtYWluZGVyLCB0ZXJtZWQKLSAqICAgIGEgZmlsZSBoYW5kbGUgZnJhZ21lbnQsIGlzIGNvbnRyb2xsZWQgY29tcGxldGVseSBieSB0aGUgZmlsZXN5c3RlbS4gIFRoZQotICogICAgc3RhbmRhcmQgaGVscGVyIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoaXMgZnJhZ21lbnQgd2lsbCBjb250YWluIG9uZSBvcgotICogICAgdHdvIHN1Yi1mcmFnbWVudHMsIG9uZSB3aGljaCBpZGVudGlmaWVzIHRoZSBmaWxlLCBhbmQgb25lIHdoaWNoIG1heSBiZQotICogICAgdXNlZCB0byBpZGVudGlmeSB0aGUgKGEpIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlLgotICoKLSAqICAgIEluIHNvbWUgc2l0dWF0aW9ucywgbmZzZCBuZWVkcyB0byBnZXQgYSBkZW50cnkgd2hpY2ggaXMgY29ubmVjdGVkIGludG8gYQotICogICAgc3BlY2lmaWMgcGFydCBvZiB0aGUgZmlsZSB0cmVlLiAgVG8gYWxsb3cgZm9yIHRoaXMsIGl0IHBhc3NlcyB0aGUKLSAqICAgIGZ1bmN0aW9uIGFjY2VwdGFibGUoKSB0b2dldGhlciB3aXRoIGEgQGNvbnRleHQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VlCi0gKiAgICBpZiB0aGUgZGVudHJ5IGlzIGFjY2VwdGFibGUuICBBcyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgZGVudHJ5cyBmb3IgYQotICogICAgZ2l2ZW4gZmlsZSwgdGhlIGZpbGVzeXN0ZW0gc2hvdWxkIGNoZWNrIGVhY2ggb25lIGZvciBhY2NlcHRhYmlsaXR5IGJlZm9yZQotICogICAgbG9va2luZyBmb3IgdGhlIG5leHQuICBBcyBzb29uIGFzIGFuIGFjY2VwdGFibGUgb25lIGlzIGZvdW5kLCBpdCBzaG91bGQKLSAqICAgIGJlIHJldHVybmVkLgotICoKLSAqIGRlY29kZV9maDoKLSAqICAgIEBkZWNvZGVfZmggaXMgZ2l2ZW4gYSAmc3RydWN0IHN1cGVyX2Jsb2NrIChAc2IpLCBhIGZpbGUgaGFuZGxlIGZyYWdtZW50Ci0gKiAgICAoQGZoLCBAZmhfbGVuKSBhbmQgYW4gYWNjZXB0YWJpbGl0eSB0ZXN0aW5nIGZ1bmN0aW9uIChAYWNjZXB0YWJsZSwKLSAqICAgIEBjb250ZXh0KS4gIEl0IHNob3VsZCByZXR1cm4gYSAmc3RydWN0IGRlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHNhbWUKLSAqICAgIGZpbGUgdGhhdCB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQgcmVmZXJzIHRvLCAgYW5kIHdoaWNoIHBhc3NlcyB0aGUKLSAqICAgIGFjY2VwdGFiaWxpdHkgdGVzdC4gIElmIGl0IGNhbm5vdCwgaXQgc2hvdWxkIHJldHVybiBhICVOVUxMIHBvaW50ZXIgaWYKLSAqICAgIHRoZSBmaWxlIHdhcyBmb3VuZCBidXQgbm8gYWNjZXB0YWJsZSAmZGVudHJpZXMgd2VyZSBhdmFpbGFibGUsIG9yIGEKLSAqICAgICVFUlJfUFRSIGVycm9yIGNvZGUgaW5kaWNhdGluZyB3aHkgaXQgY291bGRuJ3QgYmUgZm91bmQgKGUuZy4gJUVOT0VOVCBvcgotICogICAgJUVOT01FTSkuCi0gKgotICogZW5jb2RlX2ZoOgotICogICAgQGVuY29kZV9maCBzaG91bGQgc3RvcmUgaW4gdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50IEBmaCAodXNpbmcgYXQgbW9zdAotICogICAgQG1heF9sZW4gYnl0ZXMpIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgQGRlY29kZV9maCB0byByZWNvdmVyIHRoZQotICogICAgZmlsZSByZWZlcmVkIHRvIGJ5IHRoZSAmc3RydWN0IGRlbnRyeSBAZGUuICBJZiB0aGUgQGNvbm5lY3RhYmxlIGZsYWcgaXMKLSAqICAgIHNldCwgdGhlIGVuY29kZV9maCgpIHNob3VsZCBzdG9yZSBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHNvIHRoYXQgYSBnb29kCi0gKiAgICBhdHRlbXB0IGNhbiBiZSBtYWRlIHRvIGZpbmQgbm90IG9ubHkgdGhlIGZpbGUgYnV0IGFsc28gaXQncyBwbGFjZSBpbiB0aGUKLSAqICAgIGZpbGVzeXN0ZW0uICAgVGhpcyB0eXBpY2FsbHkgbWVhbnMgc3RvcmluZyBhIHJlZmVyZW5jZSB0byBkZS0+ZF9wYXJlbnQgaW4KLSAqICAgIHRoZSBmaWxlaGFuZGxlIGZyYWdtZW50LiAgZW5jb2RlX2ZoKCkgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gKiAgICBzdG9yZWQgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHN1Y2ggYXMgJS1FTk9TUEMKLSAqCi0gKiBnZXRfbmFtZToKLSAqICAgIEBnZXRfbmFtZSBzaG91bGQgZmluZCBhIG5hbWUgZm9yIHRoZSBnaXZlbiBAY2hpbGQgaW4gdGhlIGdpdmVuIEBwYXJlbnQKLSAqICAgIGRpcmVjdG9yeS4gIFRoZSBuYW1lIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEBuYW1lICh3aXRoIHRoZQotICogICAgdW5kZXJzdGFuZGluZyB0aGF0IGl0IGlzIGFscmVhZHkgcG9pbnRpbmcgdG8gYSBhICVOQU1FX01BWCsxIHNpemVkCi0gKiAgICBidWZmZXIuICAgZ2V0X25hbWUoKSBzaG91bGQgcmV0dXJuICUwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZQotICogICAgb3IgZXJyb3IuICBAZ2V0X25hbWUgd2lsbCBiZSBjYWxsZWQgd2l0aG91dCBAcGFyZW50LT5pX211dGV4IGhlbGQuCi0gKgotICogZ2V0X3BhcmVudDoKLSAqICAgIEBnZXRfcGFyZW50IHNob3VsZCBmaW5kIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciB0aGUgZ2l2ZW4gQGNoaWxkIHdoaWNoCi0gKiAgICBpcyBhbHNvIGEgZGlyZWN0b3J5LiAgSW4gdGhlIGV2ZW50IHRoYXQgaXQgY2Fubm90IGJlIGZvdW5kLCBvciBzdG9yYWdlCi0gKiAgICBzcGFjZSBjYW5ub3QgYmUgYWxsb2NhdGVkLCBhICVFUlJfUFRSIHNob3VsZCBiZSByZXR1cm5lZC4KLSAqCi0gKiBnZXRfZGVudHJ5OgotICogICAgR2l2ZW4gYSAmc3VwZXJfYmxvY2sgKEBzYikgYW5kIGEgcG9pbnRlciB0byBhIGZpbGUtc3lzdGVtIHNwZWNpZmljIGlub2RlCi0gKiAgICBpZGVudGlmaWVyLCBwb3NzaWJseSBhbiBpbm9kZSBudW1iZXIsIChAaW51bXApIGdldF9kZW50cnkoKSBzaG91bGQgZmluZAotICogICAgdGhlIGlkZW50aWZpZWQgaW5vZGUgYW5kIHJldHVybiBhIGRlbnRyeSBmb3IgdGhhdCBpbm9kZS4gIEFueSBzdWl0YWJsZQotICogICAgZGVudHJ5IGNhbiBiZSByZXR1cm5lZCBpbmNsdWRpbmcsIGlmIG5lY2Vzc2FyeSwgYSBuZXcgZGVudHJ5IGNyZWF0ZWQgd2l0aAotICogICAgZF9hbGxvY19yb290LiAgVGhlIGNhbGxlciBjYW4gdGhlbiBmaW5kIGFueSBvdGhlciBleHRhbnQgZGVudHJ5cyBieQotICogICAgZm9sbG93aW5nIHRoZSBkX2FsaWFzIGxpbmtzLiAgSWYgYSBuZXcgZGVudHJ5IHdhcyBjcmVhdGVkIHVzaW5nCi0gKiAgICBkX2FsbG9jX3Jvb3QsIERDQUNIRV9ORlNEX0RJU0NPTk5FQ1RFRCBzaG91bGQgYmUgc2V0LCBhbmQgdGhlIGRlbnRyeQotICogICAgc2hvdWxkIGJlIGRfcmVoYXNoKCllZC4KLSAqCi0gKiAgICBJZiB0aGUgaW5vZGUgY2Fubm90IGJlIGZvdW5kLCBlaXRoZXIgYSAlTlVMTCBwb2ludGVyIG9yIGFuICVFUlJfUFRSIGNvZGUKLSAqICAgIGNhbiBiZSByZXR1cm5lZC4gIFRoZSBAaW51bXAgd2lsbCBiZSB3aGF0ZXZlciB3YXMgcGFzc2VkIHRvCi0gKiAgICBuZnNkX2ZpbmRfZmhfZGVudHJ5KCkgaW4gZWl0aGVyIHRoZSBAb2JqIG9yIEBwYXJlbnQgcGFyYW1ldGVycy4KLSAqCi0gKiBMb2NraW5nIHJ1bGVzOgotICogICAgZ2V0X3BhcmVudCBpcyBjYWxsZWQgd2l0aCBjaGlsZC0+ZF9pbm9kZS0+aV9tdXRleCBkb3duCi0gKiAgICBnZXRfbmFtZSBpcyBub3QgKHdoaWNoIGlzIHBvc3NpYmx5IGluY29uc2lzdGVudCkKLSAqLwotCi1zdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgewotCXN0cnVjdCBkZW50cnkgKigqZGVjb2RlX2ZoKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBfX3UzMiAqZmgsIGludCBmaF9sZW4sIGludCBmaF90eXBlLAotCQkJIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJCSB2b2lkICpjb250ZXh0KTsKLQlpbnQgKCplbmNvZGVfZmgpKHN0cnVjdCBkZW50cnkgKmRlLCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKLQkJCSBpbnQgY29ubmVjdGFibGUpOwotCi0JLyogdGhlIGZvbGxvd2luZyBhcmUgb25seSBjYWxsZWQgZnJvbSB0aGUgZmlsZXN5c3RlbSBpdHNlbGYgKi8KLQlpbnQgKCpnZXRfbmFtZSkoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjaGFyICpuYW1lLAotCQkJc3RydWN0IGRlbnRyeSAqY2hpbGQpOwotCXN0cnVjdCBkZW50cnkgKiAoKmdldF9wYXJlbnQpKHN0cnVjdCBkZW50cnkgKmNoaWxkKTsKLQlzdHJ1Y3QgZGVudHJ5ICogKCpnZXRfZGVudHJ5KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICppbnVtcCk7Ci0KLQkvKiBUaGlzIGlzIHNldCBieSB0aGUgZXhwb3J0aW5nIG1vZHVsZSB0byBhIHN0YW5kYXJkIGhlbHBlciAqLwotCXN0cnVjdCBkZW50cnkgKiAoKmZpbmRfZXhwb3J0ZWRfZGVudHJ5KSgKLQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLCB2b2lkICpwYXJlbnQsCi0JCWludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKLQkJdm9pZCAqY29udGV4dCk7Ci0KLQotfTsKLQotZXh0ZXJuIHN0cnVjdCBkZW50cnkgKgotZmluZF9leHBvcnRlZF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqb2JqLCB2b2lkICpwYXJlbnQsCi0JCSAgICAgaW50ICgqYWNjZXB0YWJsZSkodm9pZCAqY29udGV4dCwgc3RydWN0IGRlbnRyeSAqZGUpLAotCQkgICAgIHZvaWQgKmNvbnRleHQpOwotCiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgZnNfZmxhZ3M7CkBAIC0xNTIyLDcgKzE0MTUsNyBAQAogCiAjaWZkZWYgQ09ORklHX0JMT0NLCiBleHRlcm4gaW50IHJlZ2lzdGVyX2Jsa2Rldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gaW50IHVucmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfYmxrZGV2KHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKTsKIGV4dGVybiBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGdldChkZXZfdCk7CiBleHRlcm4gdm9pZCBiZF9zZXRfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGxvZmZfdCBzaXplKTsKIGV4dGVybiB2b2lkIGJkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTE2MTAsNiArMTUwMyw5IEBACiBleHRlcm4gaW50IGludmFsaWRhdGVfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICosIGludCk7CiAjZW5kaWYKIGV4dGVybiBpbnQgaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwordW5zaWduZWQgbG9uZyBfX2ludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQsCisJCQkJCWJvb2wgYmVfYXRvbWljKTsKIHVuc2lnbmVkIGxvbmcgaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCk7CiAKQEAgLTIwNDMsNSArMTkzOSw5IEBACiB7IH0KICNlbmRpZgkvKiBDT05GSUdfU0VDVVJJVFkgKi8KIAoraW50IHByb2NfbnJfZmlsZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CisKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oIGIvaW5jbHVkZS9saW51eC9mc2xfZGV2aWNlcy5oCmluZGV4IDczNzEwZDYuLjY5NTc0MWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnNsX2RldmljZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzbF9kZXZpY2VzLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSB7CiAJdTMyIAlpbml0aWFsX3NwbW9kZTsJLyogaW5pdGlhbCBTUE1PREUgdmFsdWUgKi8KIAl1MTYJYnVzX251bTsKLQorCWJvb2wJcWVfbW9kZTsKIAkvKiBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogCXUxNgltYXhfY2hpcHNlbGVjdDsKIAl2b2lkCSgqYWN0aXZhdGVfY3MpKHU4IGNzLCB1OCBwb2xhcml0eSk7CkBAIC0xMjAsNSArMTIwLDEwIEBACiAJdTMyCXN5c2NsazsKIH07CiAKK3N0cnVjdCBtcGM4eHhfcGNtY2lhX29wcyB7CisJdm9pZCgqaHdfY3RybCkoaW50IHNsb3QsIGludCBlbmFibGUpOworCWludCgqdm9sdGFnZV9zZXQpKGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKTsKK307CisKICNlbmRpZiAvKiBfRlNMX0RFVklDRV9IXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggNTM0NzQ0ZS4uOWZiZTlkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTMzOSw3ICszMzksNyBAQAogCWNoYXIgbmFtZVswXTsKIH07CiAKLSNkZWZpbmUgRlVTRV9OQU1FX09GRlNFVCAoKHVuc2lnbmVkKSAoKHN0cnVjdCBmdXNlX2RpcmVudCAqKSAwKS0+bmFtZSkKKyNkZWZpbmUgRlVTRV9OQU1FX09GRlNFVCBvZmZzZXRvZihzdHJ1Y3QgZnVzZV9kaXJlbnQsIG5hbWUpCiAjZGVmaW5lIEZVU0VfRElSRU5UX0FMSUdOKHgpICgoKHgpICsgc2l6ZW9mKF9fdTY0KSAtIDEpICYgfihzaXplb2YoX191NjQpIC0gMSkpCiAjZGVmaW5lIEZVU0VfRElSRU5UX1NJWkUoZCkgXAogCUZVU0VfRElSRU5UX0FMSUdOKEZVU0VfTkFNRV9PRkZTRVQgKyAoZCktPm5hbWVsZW4pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCAwZDJlZjBiLi5iYzY4ZGQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTMwLDYgKzMwLDkgQEAKICAqIGNhbm5vdCBoYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlcy4KICAqCiAgKiBfX0dGUF9OT1JFVFJZOiBUaGUgVk0gaW1wbGVtZW50YXRpb24gbXVzdCBub3QgcmV0cnkgaW5kZWZpbml0ZWx5LgorICoKKyAqIF9fR0ZQX01PVkFCTEU6IEZsYWcgdGhhdCB0aGlzIHBhZ2Ugd2lsbCBiZSBtb3ZhYmxlIGJ5IHRoZSBwYWdlIG1pZ3JhdGlvbgorICogbWVjaGFuaXNtIG9yIHJlY2xhaW1lZAogICovCiAjZGVmaW5lIF9fR0ZQX1dBSVQJKChfX2ZvcmNlIGdmcF90KTB4MTB1KQkvKiBDYW4gd2FpdCBhbmQgcmVzY2hlZHVsZT8gKi8KICNkZWZpbmUgX19HRlBfSElHSAkoKF9fZm9yY2UgZ2ZwX3QpMHgyMHUpCS8qIFNob3VsZCBhY2Nlc3MgZW1lcmdlbmN5IHBvb2xzPyAqLwpAQCAtNDUsNiArNDgsNyBAQAogI2RlZmluZSBfX0dGUF9OT01FTUFMTE9DICgoX19mb3JjZSBnZnBfdCkweDEwMDAwdSkgLyogRG9uJ3QgdXNlIGVtZXJnZW5jeSByZXNlcnZlcyAqLwogI2RlZmluZSBfX0dGUF9IQVJEV0FMTCAgICgoX19mb3JjZSBnZnBfdCkweDIwMDAwdSkgLyogRW5mb3JjZSBoYXJkd2FsbCBjcHVzZXQgbWVtb3J5IGFsbG9jcyAqLwogI2RlZmluZSBfX0dGUF9USElTTk9ERQkoKF9fZm9yY2UgZ2ZwX3QpMHg0MDAwMHUpLyogTm8gZmFsbGJhY2ssIG5vIHBvbGljaWVzICovCisjZGVmaW5lIF9fR0ZQX01PVkFCTEUJKChfX2ZvcmNlIGdmcF90KTB4ODAwMDB1KSAvKiBQYWdlIGlzIG1vdmFibGUgKi8KIAogI2RlZmluZSBfX0dGUF9CSVRTX1NISUZUIDIwCS8qIFJvb20gZm9yIDIwIF9fR0ZQX0ZPTyBiaXRzICovCiAjZGVmaW5lIF9fR0ZQX0JJVFNfTUFTSyAoKF9fZm9yY2UgZ2ZwX3QpKCgxIDw8IF9fR0ZQX0JJVFNfU0hJRlQpIC0gMSkpCkBAIC01Myw3ICs1Nyw4IEBACiAjZGVmaW5lIEdGUF9MRVZFTF9NQVNLIChfX0dGUF9XQUlUfF9fR0ZQX0hJR0h8X19HRlBfSU98X19HRlBfRlN8IFwKIAkJCV9fR0ZQX0NPTER8X19HRlBfTk9XQVJOfF9fR0ZQX1JFUEVBVHwgXAogCQkJX19HRlBfTk9GQUlMfF9fR0ZQX05PUkVUUll8X19HRlBfQ09NUHwgXAotCQkJX19HRlBfTk9NRU1BTExPQ3xfX0dGUF9IQVJEV0FMTHxfX0dGUF9USElTTk9ERSkKKwkJCV9fR0ZQX05PTUVNQUxMT0N8X19HRlBfSEFSRFdBTEx8X19HRlBfVEhJU05PREV8IFwKKwkJCV9fR0ZQX01PVkFCTEUpCiAKIC8qIFRoaXMgZXF1YWxzIDAsIGJ1dCB1c2UgY29uc3RhbnRzIGluIGNhc2UgdGhleSBldmVyIGNoYW5nZSAqLwogI2RlZmluZSBHRlBfTk9XQUlUCShHRlBfQVRPTUlDICYgfl9fR0ZQX0hJR0gpCkBAIC02NSw2ICs3MCwxNSBAQAogI2RlZmluZSBHRlBfVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9IQVJEV0FMTCkKICNkZWZpbmUgR0ZQX0hJR0hVU0VSCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IF9fR0ZQX0hBUkRXQUxMIHwgXAogCQkJIF9fR0ZQX0hJR0hNRU0pCisjZGVmaW5lIEdGUF9ISUdIVVNFUl9NT1ZBQkxFCShfX0dGUF9XQUlUIHwgX19HRlBfSU8gfCBfX0dGUF9GUyB8IFwKKwkJCQkgX19HRlBfSEFSRFdBTEwgfCBfX0dGUF9ISUdITUVNIHwgXAorCQkJCSBfX0dGUF9NT1ZBQkxFKQorI2RlZmluZSBHRlBfTk9GU19QQUdFQ0FDSEUJKF9fR0ZQX1dBSVQgfCBfX0dGUF9JTyB8IF9fR0ZQX01PVkFCTEUpCisjZGVmaW5lIEdGUF9VU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCisJCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfTU9WQUJMRSkKKyNkZWZpbmUgR0ZQX0hJR0hVU0VSX1BBR0VDQUNIRQkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBcCisJCQkJIF9fR0ZQX0hBUkRXQUxMIHwgX19HRlBfSElHSE1FTSB8IFwKKwkJCQkgX19HRlBfTU9WQUJMRSkKIAogI2lmZGVmIENPTkZJR19OVU1BCiAjZGVmaW5lIEdGUF9USElTTk9ERQkoX19HRlBfVEhJU05PREUgfCBfX0dGUF9OT1dBUk4gfCBfX0dGUF9OT1JFVFJZKQpAQCAtOTIsNiArMTA2LDkgQEAKIAlpZiAoZmxhZ3MgJiBfX0dGUF9ETUEzMikKIAkJcmV0dXJuIFpPTkVfRE1BMzI7CiAjZW5kaWYKKwlpZiAoKGZsYWdzICYgKF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9NT1ZBQkxFKSkgPT0KKwkJCShfX0dGUF9ISUdITUVNIHwgX19HRlBfTU9WQUJMRSkpCisJCXJldHVybiBaT05FX01PVkFCTEU7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAlpZiAoZmxhZ3MgJiBfX0dGUF9ISUdITUVNKQogCQlyZXR1cm4gWk9ORV9ISUdITUVNOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWdobWVtLmggYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAppbmRleCA5OGUyY2NlLi4xMmM1ZTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaApAQCAtNzMsMTAgKzczLDI3IEBACiB9CiAKICNpZm5kZWYgX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UKKy8qKgorICogX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSAtIEFsbG9jYXRlIGEgemVyb2VkIEhJR0hNRU0gcGFnZSBmb3IgYSBWTUEgd2l0aCBjYWxsZXItc3BlY2lmaWVkIG1vdmFibGUgR0ZQIGZsYWdzCisgKiBAbW92YWJsZWZsYWdzOiBUaGUgR0ZQIGZsYWdzIHJlbGF0ZWQgdG8gdGhlIHBhZ2VzIGZ1dHVyZSBhYmlsaXR5IHRvIG1vdmUgbGlrZSBfX0dGUF9NT1ZBQkxFCisgKiBAdm1hOiBUaGUgVk1BIHRoZSBwYWdlIGlzIHRvIGJlIGFsbG9jYXRlZCBmb3IKKyAqIEB2YWRkcjogVGhlIHZpcnR1YWwgYWRkcmVzcyB0aGUgcGFnZSB3aWxsIGJlIGluc2VydGVkIGludG8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYSBwYWdlIGZvciBhIFZNQSBidXQgdGhlIGNhbGxlciBpcyBleHBlY3RlZAorICogdG8gc3BlY2lmeSB2aWEgbW92YWJsZWZsYWdzIHdoZXRoZXIgdGhlIHBhZ2Ugd2lsbCBiZSBtb3ZhYmxlIGluIHRoZQorICogZnV0dXJlIG9yIG5vdAorICoKKyAqIEFuIGFyY2hpdGVjdHVyZSBtYXkgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBieSBkZWZpbmluZworICogX19IQVZFX0FSQ0hfQUxMT0NfWkVST0VEX1VTRVJfSElHSFBBR0UgYW5kIHByb3ZpZGluZyB0aGVpciBvd24KKyAqIGltcGxlbWVudGF0aW9uLgorICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKLWFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHZhZGRyKQorX19hbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZShnZnBfdCBtb3ZhYmxlZmxhZ3MsCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCXVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgdmFkZHIpOworCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSIHwgbW92YWJsZWZsYWdzLAorCQkJdm1hLCB2YWRkcik7CiAKIAlpZiAocGFnZSkKIAkJY2xlYXJfdXNlcl9oaWdocGFnZShwYWdlLCB2YWRkcik7CkBAIC04NSw2ICsxMDIsMzYgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlIC0gQWxsb2NhdGUgYSB6ZXJvZWQgSElHSE1FTSBwYWdlIGZvciBhIFZNQQorICogQHZtYTogVGhlIFZNQSB0aGUgcGFnZSBpcyB0byBiZSBhbGxvY2F0ZWQgZm9yCisgKiBAdmFkZHI6IFRoZSB2aXJ0dWFsIGFkZHJlc3MgdGhlIHBhZ2Ugd2lsbCBiZSBpbnNlcnRlZCBpbnRvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgcGFnZSBmb3IgYSBWTUEgdGhhdCB0aGUgY2FsbGVyIGtub3dzIHdpbGwKKyAqIG5vdCBiZSBhYmxlIHRvIG1vdmUgaW4gdGhlIGZ1dHVyZSB1c2luZyBtb3ZlX3BhZ2VzKCkgb3IgcmVjbGFpbS4gSWYgaXQKKyAqIGlzIGtub3duIHRoYXQgdGhlIHBhZ2UgY2FuIG1vdmUsIHVzZSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZV9tb3ZhYmxlCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgorYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJcmV0dXJuIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UoMCwgdm1hLCB2YWRkcik7Cit9CisKKy8qKgorICogYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2VfbW92YWJsZSAtIEFsbG9jYXRlIGEgemVyb2VkIEhJR0hNRU0gcGFnZSBmb3IgYSBWTUEgdGhhdCB0aGUgY2FsbGVyIGtub3dzIGNhbiBtb3ZlCisgKiBAdm1hOiBUaGUgVk1BIHRoZSBwYWdlIGlzIHRvIGJlIGFsbG9jYXRlZCBmb3IKKyAqIEB2YWRkcjogVGhlIHZpcnR1YWwgYWRkcmVzcyB0aGUgcGFnZSB3aWxsIGJlIGluc2VydGVkIGludG8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgYSBwYWdlIGZvciBhIFZNQSB0aGF0IHRoZSBjYWxsZXIga25vd3Mgd2lsbAorICogYmUgYWJsZSB0byBtaWdyYXRlIGluIHRoZSBmdXR1cmUgdXNpbmcgbW92ZV9wYWdlcygpIG9yIHJlY2xhaW1lZAorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKK2FsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJCXVuc2lnbmVkIGxvbmcgdmFkZHIpCit7CisJcmV0dXJuIF9fYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2UoX19HRlBfTU9WQUJMRSwgdm1hLCB2YWRkcik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9oaWdocGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggMTdjMjlkYy4uNTQwNzk5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTMyOSwxMiArMzI5LDEzIEBACiAjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCiAKIGV4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCi0JCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKKwkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHRpbWVyLCB0aW1lci0+c3RhcnRfcGlkLCB0aW1lci0+c3RhcnRfc2l0ZSwKLQkJCQkgdGltZXItPmZ1bmN0aW9uLCB0aW1lci0+c3RhcnRfY29tbSk7CisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0sIDApOwogfQogCiBleHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCAyYzEzNzE1Li40OWI3MDUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMTUsNiArMTUsNyBAQAogfQogCiBpbnQgaHVnZXRsYl9zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKK2ludCBodWdldGxiX3RyZWF0X21vdmFibGVfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGludCBjb3B5X2h1Z2V0bGJfcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogaW50IGZvbGxvd19odWdldGxiX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgc3RydWN0IHBhZ2UgKiosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKiwgdW5zaWduZWQgbG9uZyAqLCBpbnQgKiwgaW50KTsKIHZvaWQgdW5tYXBfaHVnZXBhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwpAQCAtMjksNiArMzAsNyBAQAogdm9pZCBodWdldGxiX3VucmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIG9mZnNldCwgbG9uZyBmcmVlZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9odWdlX3BhZ2VzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGU7CiBleHRlcm4gY29uc3QgdW5zaWduZWQgbG9uZyBodWdldGxiX3plcm8sIGh1Z2V0bGJfaW5maW5pdHk7CiBleHRlcm4gaW50IHN5c2N0bF9odWdldGxiX3NobV9ncm91cDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMm8uaCBiL2luY2x1ZGUvbGludXgvaTJvLmgKaW5kZXggNTJmNTNlMi4uMzMzYTM3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMm8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyby5oCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgkvKiB3b3JrX3N0cnVjdCAqLwogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgkvKiBOZWVkZWQgZm9yIE1VVEVYIGluaXQgbWFjcm9zICovCkBAIC00MjUsNyArNDI2LDcgQEAKIAogCXN0cnVjdCBkZXZpY2UgZGV2aWNlOwogCi0Jc3RydWN0IHNlbWFwaG9yZSBsb2NrOwkvKiBkZXZpY2UgbG9jayAqLworCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBkZXZpY2UgbG9jayAqLwogfTsKIAogLyoKQEAgLTU0NCw3ICs1NDUsNyBAQAogCXN0cnVjdCBpMm9fZG1hIGhydDsJLyogSFcgUmVzb3VyY2UgVGFibGUgKi8KIAlpMm9fbGN0ICpsY3Q7CQkvKiBMb2dpY2FsIENvbmZpZyBUYWJsZSAqLwogCXN0cnVjdCBpMm9fZG1hIGRsY3Q7CS8qIFRlbXAgTENUICovCi0Jc3RydWN0IHNlbWFwaG9yZSBsY3RfbG9jazsJLyogTG9jayBmb3IgTENUIHVwZGF0ZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggbGN0X2xvY2s7CS8qIExvY2sgZm9yIExDVCB1cGRhdGVzICovCiAJc3RydWN0IGkyb19kbWEgc3RhdHVzX2Jsb2NrOwkvKiBJT1Agc3RhdHVzIGJsb2NrICovCiAKIAlzdHJ1Y3QgaTJvX2lvIGJhc2U7CS8qIGNvbnRyb2xsZXIgbWVzc2FnaW5nIHVuaXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRyLmggYi9pbmNsdWRlL2xpbnV4L2lkci5oCmluZGV4IDkxNTU3MmYuLjBlZGRhNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZHIuaApAQCAtNzgsOCArNzgsMTEgQEAKIGludCBpZHJfcHJlX2dldChzdHJ1Y3QgaWRyICppZHAsIGdmcF90IGdmcF9tYXNrKTsKIGludCBpZHJfZ2V0X25ldyhzdHJ1Y3QgaWRyICppZHAsIHZvaWQgKnB0ciwgaW50ICppZCk7CiBpbnQgaWRyX2dldF9uZXdfYWJvdmUoc3RydWN0IGlkciAqaWRwLCB2b2lkICpwdHIsIGludCBzdGFydGluZ19pZCwgaW50ICppZCk7CitpbnQgaWRyX2Zvcl9lYWNoKHN0cnVjdCBpZHIgKmlkcCwKKwkJIGludCAoKmZuKShpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKTsKIHZvaWQgKmlkcl9yZXBsYWNlKHN0cnVjdCBpZHIgKmlkcCwgdm9pZCAqcHRyLCBpbnQgaWQpOwogdm9pZCBpZHJfcmVtb3ZlKHN0cnVjdCBpZHIgKmlkcCwgaW50IGlkKTsKK3ZvaWQgaWRyX3JlbW92ZV9hbGwoc3RydWN0IGlkciAqaWRwKTsKIHZvaWQgaWRyX2Rlc3Ryb3koc3RydWN0IGlkciAqaWRwKTsKIHZvaWQgaWRyX2luaXQoc3RydWN0IGlkciAqaWRwKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCA1NmVjNGM2Li41YjUyODUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtMTcxLDkgKzE3MSw2IEBACiAjZGVmaW5lIF9fc2V0dXAoc3RyLCBmbikJCQkJCVwKIAlfX3NldHVwX3BhcmFtKHN0ciwgZm4sIGZuLCAwKQogCi0jZGVmaW5lIF9fb2Jzb2xldGVfc2V0dXAoc3RyKQkJCQkJXAotCV9fc2V0dXBfbnVsbF9wYXJhbShzdHIsIF9fTElORV9fKQotCiAvKiBOT1RFOiBmbiBpcyBhcyBwZXIgbW9kdWxlX3BhcmFtLCBub3QgX19zZXR1cCEgIEVtaXRzIHdhcm5pbmcgaWYgZm4KICAqIHJldHVybnMgbm9uLXplcm8uICovCiAjZGVmaW5lIGVhcmx5X3BhcmFtKHN0ciwgZm4pCQkJCQlcCkBAIC0yMzksNyArMjM2LDYgQEAKICNkZWZpbmUgX19zZXR1cF9wYXJhbShzdHIsIHVuaXF1ZV9pZCwgZm4pCS8qIG5vdGhpbmcgKi8KICNkZWZpbmUgX19zZXR1cF9udWxsX3BhcmFtKHN0ciwgdW5pcXVlX2lkKSAJLyogbm90aGluZyAqLwogI2RlZmluZSBfX3NldHVwKHN0ciwgZnVuYykgCQkJLyogbm90aGluZyAqLwotI2RlZmluZSBfX29ic29sZXRlX3NldHVwKHN0cikgCQkJLyogbm90aGluZyAqLwogI2VuZGlmCiAKIC8qIERhdGEgbWFya2VkIG5vdCB0byBiZSBzYXZlZCBieSBzb2Z0d2FyZSBzdXNwZW5kICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAppbmRleCAyNzZjY2FhLi5jYWI3NDFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogCiAjZGVmaW5lIElOSVRfRkRUQUJMRSBcCiB7CQkJCQkJCVwKQEAgLTc4LDYgKzc5LDcgQEAKIAkudXRzX25zCQk9ICZpbml0X3V0c19ucywJCQkJCVwKIAkubW50X25zCQk9IE5VTEwsCQkJCQkJXAogCUlOSVRfSVBDX05TKGlwY19ucykJCQkJCQlcCisJLnVzZXJfbnMJPSAmaW5pdF91c2VyX25zLAkJCQlcCiB9CiAKICNkZWZpbmUgSU5JVF9TSUdIQU5EKHNpZ2hhbmQpIHsJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvLmggYi9pbmNsdWRlL2xpbnV4L2lvLmgKaW5kZXggODQyM2RkMy4uZTNiMmRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pby5oCisrKyBiL2luY2x1ZGUvbGludXgvaW8uaApAQCAtNjMsMzIgKzYzLDcgQEAKIHZvaWQgX19pb21lbSAqIGRldm1faW9yZW1hcF9ub2NhY2hlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiB2b2lkIGRldm1faW91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcik7Ci0KLS8qKgotICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCi0gKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrCi0gKglAc2lnbmF0dXJlOiAgc2lnbmF0dXJlIGJsb2NrCi0gKglAbGVuZ3RoOiBsZW5ndGggb2Ygc2lnbmF0dXJlCi0gKgotICoJUGVyZm9ybSBhIHNpZ25hdHVyZSBjb21wYXJpc29uIHdpdGggdGhlIG1taW8gYWRkcmVzcyBpb19hZGRyLiBUaGlzCi0gKglhZGRyZXNzIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgaW9yZW1hcC4KLSAqCVJldHVybnMgMSBvbiBhIG1hdGNoLgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NpZ25hdHVyZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmlvX2FkZHIsCi0JY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQotewotCWludCByZXR2YWwgPSAwOwotCWRvIHsKLQkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCi0JCQlnb3RvIG91dDsKLQkJaW9fYWRkcisrOwotCQlzaWduYXR1cmUrKzsKLQkJbGVuZ3RoLS07Ci0JfSB3aGlsZSAobGVuZ3RoKTsKLQlyZXR2YWwgPSAxOwotb3V0OgotCXJldHVybiByZXR2YWw7Ci19CitpbnQgY2hlY2tfc2lnbmF0dXJlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkciwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCk7CiAKICNlbmRpZiAvKiBfTElOVVhfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcGMuaCBiL2luY2x1ZGUvbGludXgvaXBjLmgKaW5kZXggMTk4MDg2Ny4uM2ZkM2RkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwYy5oCkBAIC01Miw2ICs1Miw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNkZWZpbmUgSVBDTU5JIDMyNzY4ICAvKiA8PSBNQVhfSU5UIGxpbWl0IGZvciBpcGMgYXJyYXlzIChpbmNsdWRpbmcgc3lzY3RsIGNoYW5nZXMpICovCiAKQEAgLTkyLDYgKzkzLDcgQEAKIAogI2lmZGVmIENPTkZJR19TWVNWSVBDCiAjZGVmaW5lIElOSVRfSVBDX05TKG5zKQkJLm5zCQk9ICZpbml0X2lwY19ucywKK2V4dGVybiB2b2lkIGZyZWVfaXBjX25zKHN0cnVjdCBrcmVmICprcmVmKTsKIGV4dGVybiBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY29weV9pcGNzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJCQlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOwogI2Vsc2UKQEAgLTEwMywxMyArMTA1LDkgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0lQQ19OUwotZXh0ZXJuIHZvaWQgZnJlZV9pcGNfbnMoc3RydWN0IGtyZWYgKmtyZWYpOwotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlwY19uYW1lc3BhY2UgKmdldF9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewotI2lmZGVmIENPTkZJR19JUENfTlMKKyNpZmRlZiBDT05GSUdfU1lTVklQQwogCWlmIChucykKIAkJa3JlZl9nZXQoJm5zLT5rcmVmKTsKICNlbmRpZgpAQCAtMTE4LDcgKzExNiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKLSNpZmRlZiBDT05GSUdfSVBDX05TCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKIAlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfaXBjX25zKTsKICNlbmRpZgogfQpAQCAtMTI2LDUgKzEyNCwzIEBACiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0lQQ19IICovCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggMTY5NTA1NC4uNDQ2NTcxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0xNjEsNiArMTYxLDcgQEAKIAl1bnNpZ25lZCBpbnQJCXdha2VfZGVwdGg7CS8qIG5lc3RlZCB3YWtlIGVuYWJsZXMgKi8KIAl1bnNpZ25lZCBpbnQJCWlycV9jb3VudDsJLyogRm9yIGRldGVjdGluZyBicm9rZW4gSVJRcyAqLwogCXVuc2lnbmVkIGludAkJaXJxc191bmhhbmRsZWQ7CisJdW5zaWduZWQgbG9uZwkJbGFzdF91bmhhbmRsZWQ7CS8qIEFnaW5nIHRpbWVyIGZvciB1bmhhbmRsZWQgY291bnQgKi8KIAlzcGlubG9ja190CQlsb2NrOwogI2lmZGVmIENPTkZJR19TTVAKIAljcHVtYXNrX3QJCWFmZmluaXR5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oIGIvaW5jbHVkZS9saW51eC9rYWxsc3ltcy5oCmluZGV4IDVmMDY1MjcuLmY3M2RlNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2FsbHN5bXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2thbGxzeW1zLmgKQEAgLTcsOSArNyw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCi0jZGVmaW5lIEtTWU1fTkFNRV9MRU4gMTI3Ci0jZGVmaW5lIEtTWU1fU1lNQk9MX0xFTiAoc2l6ZW9mKCIlcyslI2x4LyUjbHggWyVzXSIpICsgS1NZTV9OQU1FX0xFTiArCVwKLQkJCSAyKihCSVRTX1BFUl9MT05HKjMvMTApICsgTU9EVUxFX05BTUVfTEVOICsgMSkKKyNkZWZpbmUgS1NZTV9OQU1FX0xFTiAxMjgKKyNkZWZpbmUgS1NZTV9TWU1CT0xfTEVOIChzaXplb2YoIiVzKyUjbHgvJSNseCBbJXNdIikgKyAoS1NZTV9OQU1FX0xFTiAtIDEpICsgXAorCQkJIDIqKEJJVFNfUEVSX0xPTkcqMy8xMCkgKyAoTU9EVUxFX05BTUVfTEVOIC0gMSkgKyAxKQogCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAvKiBMb29rdXAgdGhlIGFkZHJlc3MgZm9yIGEgc3ltYm9sLiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggN2E0ODUyNS4uMWViOWNkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0yMTAsNiArMjEwLDcgQEAKICNkZWZpbmUgVEFJTlRfTUFDSElORV9DSEVDSwkJKDE8PDQpCiAjZGVmaW5lIFRBSU5UX0JBRF9QQUdFCQkJKDE8PDUpCiAjZGVmaW5lIFRBSU5UX1VTRVIJCQkoMTw8NikKKyNkZWZpbmUgVEFJTlRfRElFCQkJKDE8PDcpCiAKIGV4dGVybiB2b2lkIGR1bXBfc3RhY2sodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxjYXBpLmgKaW5kZXggYWVhMzRlNzQuLjhjNDM1MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsY2FwaS5oCkBAIC02NCw3ICs2NCw3IEBACiAJdW5zaWduZWQgbG9uZyBucmVjdmRhdGFwa3Q7CiAJdW5zaWduZWQgbG9uZyBuc2VudGN0bHBrdDsKIAl1bnNpZ25lZCBsb25nIG5zZW50ZGF0YXBrdDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHJlY3Zfc2VtOworCXN0cnVjdCBtdXRleCByZWN2X210eDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJlY3ZfcXVldWU7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlY3Zfd29yazsKIAlpbnQgcmVsZWFzZV9pbl9wcm9ncmVzczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGVkcy5oIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKaW5kZXggODhhZmNlZi4uNDk0YmVkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNkZWZpbmUgX19MSU5VWF9MRURTX0hfSU5DTFVERUQKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiBzdHJ1Y3QgZGV2aWNlOwogc3RydWN0IGNsYXNzX2RldmljZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGltaXRzLmggYi9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oCmluZGV4IGVhZjJlMDkuLjJkMGY5NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGltaXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9saW1pdHMuaApAQCAtNSw4ICs1LDYgQEAKIAogI2RlZmluZSBOR1JPVVBTX01BWCAgICA2NTUzNgkvKiBzdXBwbGVtZW50YWwgZ3JvdXAgSURzIGFyZSBhdmFpbGFibGUgKi8KICNkZWZpbmUgQVJHX01BWCAgICAgICAxMzEwNzIJLyogIyBieXRlcyBvZiBhcmdzICsgZW52aXJvbiBmb3IgZXhlYygpICovCi0jZGVmaW5lIENISUxEX01BWCAgICAgICAgOTk5ICAgIC8qIG5vIGxpbWl0IDotKSAqLwotI2RlZmluZSBPUEVOX01BWCAgICAgICAgIDI1NgkvKiAjIG9wZW4gZmlsZXMgYSBwcm9jZXNzIG1heSBoYXZlICovCiAjZGVmaW5lIExJTktfTUFYICAgICAgICAgMTI3CS8qICMgbGlua3MgYSBmaWxlIG1heSBoYXZlICovCiAjZGVmaW5lIE1BWF9DQU5PTiAgICAgICAgMjU1CS8qIHNpemUgb2YgdGhlIGNhbm9uaWNhbCBpbnB1dCBxdWV1ZSAqLwogI2RlZmluZSBNQVhfSU5QVVQgICAgICAgIDI1NQkvKiBzaXplIG9mIHRoZSB0eXBlLWFoZWFkIGJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saW51eF9sb2dvLmggYi9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaAppbmRleCA5YzAxYmRlLi4wOGE5Mjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpbnV4X2xvZ28uaApAQCAtMzMsNSArMzMsMTMgQEAKIH07CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyAqZmJfZmluZF9sb2dvKGludCBkZXB0aCk7CisjaWZkZWYgQ09ORklHX0ZCX0xPR09fRVhUUkEKK2V4dGVybiB2b2lkIGZiX2FwcGVuZF9leHRyYV9sb2dvKGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLAorCQkJCSB1bnNpZ25lZCBpbnQgbik7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZiX2FwcGVuZF9leHRyYV9sb2dvKGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvICpsb2dvLAorCQkJCQl1bnNpZ25lZCBpbnQgbikKK3t9CisjZW5kaWYKIAogI2VuZGlmIC8qIF9MSU5VWF9MSU5VWF9MT0dPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvYmluZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKaW5kZXggMjQ2ZGUxZC4uNmYxNjM3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9iaW5kLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAkJCQkJCXN0cnVjdCBuZnNfZmggKiwKIAkJCQkJCXN0cnVjdCBmaWxlICoqKTsKIAl2b2lkCQkJKCpmY2xvc2UpKHN0cnVjdCBmaWxlICopOworCXVuc2lnbmVkIGxvbmcJCSgqZ2V0X2dyYWNlX3BlcmlvZCkodm9pZCk7CiB9OwogCiBleHRlcm4gc3RydWN0IG5sbXN2Y19iaW5kaW5nICoJbmxtc3ZjX29wczsKQEAgLTM4LDQgKzM5LDEyIEBACiBleHRlcm4gaW50CWxvY2tkX3VwKGludCBwcm90byk7CiBleHRlcm4gdm9pZAlsb2NrZF9kb3duKHZvaWQpOwogCit1bnNpZ25lZCBsb25nIGdldF9uZnNfZ3JhY2VfcGVyaW9kKHZvaWQpOworCisjaWZkZWYgQ09ORklHX05GU0RfVjQKK3Vuc2lnbmVkIGxvbmcgZ2V0X25mczRfZ3JhY2VfcGVyaW9kKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfbmZzNF9ncmFjZV9wZXJpb2Qodm9pZCkge3JldHVybiAwO30KKyNlbmRpZgorCiAjZW5kaWYgLyogTElOVVhfTE9DS0RfQklORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2x6by5oIGIvaW5jbHVkZS9saW51eC9sem8uaAppbmRleCA1ODJkOGI3Li5kNzkzNDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2x6by5oCisrKyBiL2luY2x1ZGUvbGludXgvbHpvLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNkZWZpbmUgTFpPMVhfTUVNX0NPTVBSRVNTCSgxNjM4NCAqIHNpemVvZih1bnNpZ25lZCBjaGFyICopKQogI2RlZmluZSBMWk8xWF8xX01FTV9DT01QUkVTUwlMWk8xWF9NRU1fQ09NUFJFU1MKIAotI2RlZmluZSBsem8xeF93b3JzdF9jb21wcmVzcyh4KSAoeCArICh4IC8gNjQpICsgMTYgKyAzKQorI2RlZmluZSBsem8xeF93b3JzdF9jb21wcmVzcyh4KSAoKHgpICsgKCh4KSAvIDE2KSArIDY0ICsgMykKIAogLyogVGhpcyByZXF1aXJlcyAnd29ya21lbScgb2Ygc2l6ZSBMWk8xWF8xX01FTV9DT01QUkVTUyAqLwogaW50IGx6bzF4XzFfY29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjX2xlbiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IGRhYWJiM2EuLmUxNDdjZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTU5LDcgKzE1OSw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgbWVtcG9saWN5IGRlZmF1bHRfcG9saWN5OwogZXh0ZXJuIHN0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyKTsKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCBnZnBfdCBnZnBfZmxhZ3MpOwogZXh0ZXJuIHVuc2lnbmVkIHNsYWJfbm9kZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpOwogCiBleHRlcm4gZW51bSB6b25lX3R5cGUgcG9saWN5X3pvbmU7CkBAIC0yNTYsOSArMjU2LDkgQEAKICNkZWZpbmUgc2V0X2NwdXNldF9iZWluZ19yZWJvdW5kKHgpIGRvIHt9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB6b25lbGlzdCAqaHVnZV96b25lbGlzdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyKQorCQl1bnNpZ25lZCBsb25nIGFkZHIsIGdmcF90IGdmcF9mbGFncykKIHsKLQlyZXR1cm4gTk9ERV9EQVRBKDApLT5ub2RlX3pvbmVsaXN0cyArIGdmcF96b25lKEdGUF9ISUdIVVNFUik7CisJcmV0dXJuIE5PREVfREFUQSgwKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShnZnBfZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBkb19taWdyYXRlX3BhZ2VzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDFjMTIwNzQuLmE1YzQ1MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9MSU5VWF9NTV9ICiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMjcsNyArMjYsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBudW1fcGh5c3BhZ2VzOwogZXh0ZXJuIHZvaWQgKiBoaWdoX21lbW9yeTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHZtYWxsb2NfZWFybHlyZXNlcnZlOwogZXh0ZXJuIGludCBwYWdlX2NsdXN0ZXI7CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCkBAIC02MDEsNiArNTk5LDcgQEAKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CiAKKwlWTV9CVUdfT04oUGFnZVNsYWIocGFnZSkpOwogCWlmICh1bmxpa2VseShQYWdlU3dhcENhY2hlKHBhZ2UpKSkKIAkJbWFwcGluZyA9ICZzd2FwcGVyX3NwYWNlOwogI2lmZGVmIENPTkZJR19TTFVCCkBAIC04MTIsMjcgKzgxMSwzMSBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpOwogCiAvKgotICogUHJvdG90eXBlIHRvIGFkZCBhIHNocmlua2VyIGNhbGxiYWNrIGZvciBhZ2VhYmxlIGNhY2hlcy4KLSAqIAotICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwYXNzZWQgYSBjb3VudCBgbnJfdG9fc2NhbicgYW5kIGEgZ2ZwbWFzay4gIFRoZXkgc2hvdWxkCi0gKiBzY2FuIGBucl90b19zY2FuJyBvYmplY3RzLCBhdHRlbXB0aW5nIHRvIGZyZWUgdGhlbS4KKyAqIEEgY2FsbGJhY2sgeW91IGNhbiByZWdpc3RlciB0byBhcHBseSBwcmVzc3VyZSB0byBhZ2VhYmxlIGNhY2hlcy4KICAqCi0gKiBUaGUgY2FsbGJhY2sgbXVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIHdoaWNoIHJlbWFpbiBpbiB0aGUgY2FjaGUuCisgKiAnc2hyaW5rJyBpcyBwYXNzZWQgYSBjb3VudCAnbnJfdG9fc2NhbicgYW5kIGEgJ2dmcG1hc2snLiAgSXQgc2hvdWxkCisgKiBsb29rIHRocm91Z2ggdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgJ25yX3RvX3NjYW4nIGVudHJpZXMgYW5kCisgKiBhdHRlbXB0IHRvIGZyZWUgdGhlbSB1cC4gIEl0IHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzCisgKiB3aGljaCByZW1haW4gaW4gdGhlIGNhY2hlLiAgSWYgaXQgcmV0dXJucyAtMSwgaXQgbWVhbnMgaXQgY2Fubm90IGRvCisgKiBhbnkgc2Nhbm5pbmcgYXQgdGhpcyB0aW1lIChlZy4gdGhlcmUgaXMgYSByaXNrIG9mIGRlYWRsb2NrKS4KICAqCi0gKiBUaGUgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgbnJfdG9fc2NhbiA9PSAwIHdoZW4gdGhlIFZNIGlzIHF1ZXJ5aW5nIHRoZQotICogY2FjaGUgc2l6ZSwgc28gYSBmYXN0cGF0aCBmb3IgdGhhdCBjYXNlIGlzIGFwcHJvcHJpYXRlLgorICogVGhlICdnZnBtYXNrJyByZWZlcnMgdG8gdGhlIGFsbG9jYXRpb24gd2UgYXJlIGN1cnJlbnRseSB0cnlpbmcgdG8KKyAqIGZ1bGZpbC4KKyAqCisgKiBOb3RlIHRoYXQgJ3Nocmluaycgd2lsbCBiZSBwYXNzZWQgbnJfdG9fc2NhbiA9PSAwIHdoZW4gdGhlIFZNIGlzCisgKiBxdWVyeWluZyB0aGUgY2FjaGUgc2l6ZSwgc28gYSBmYXN0cGF0aCBmb3IgdGhhdCBjYXNlIGlzIGFwcHJvcHJpYXRlLgogICovCi10eXBlZGVmIGludCAoKnNocmlua2VyX3QpKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzayk7CitzdHJ1Y3Qgc2hyaW5rZXIgeworCWludCAoKnNocmluaykoaW50IG5yX3RvX3NjYW4sIGdmcF90IGdmcF9tYXNrKTsKKwlpbnQgc2Vla3M7CS8qIHNlZWtzIHRvIHJlY3JlYXRlIGFuIG9iaiAqLwogCi0vKgotICogQWRkIGFuIGFnaW5nIGNhbGxiYWNrLiAgVGhlIGludCBpcyB0aGUgbnVtYmVyIG9mICdzZWVrcycgaXQgdGFrZXMKLSAqIHRvIHJlY3JlYXRlIG9uZSBvZiB0aGUgb2JqZWN0cyB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhZ2UuCi0gKi8KLQotI2RlZmluZSBERUZBVUxUX1NFRUtTIDIKLXN0cnVjdCBzaHJpbmtlcjsKLWV4dGVybiBzdHJ1Y3Qgc2hyaW5rZXIgKnNldF9zaHJpbmtlcihpbnQsIHNocmlua2VyX3QpOwotZXh0ZXJuIHZvaWQgcmVtb3ZlX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIpOworCS8qIFRoZXNlIGFyZSBmb3IgaW50ZXJuYWwgdXNlICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWxvbmcgbnI7CS8qIG9ianMgcGVuZGluZyBkZWxldGUgKi8KK307CisjZGVmaW5lIERFRkFVTFRfU0VFS1MgMiAvKiBBIGdvb2QgbnVtYmVyIGlmIHlvdSBkb24ndCBrbm93IGJldHRlci4gKi8KK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3Nocmlua2VyKHN0cnVjdCBzaHJpbmtlciAqKTsKK2V4dGVybiB2b2lkIHVucmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICopOwogCiAvKgogICogU29tZSBzaGFyZWQgbWFwcGlnbnMgd2lsbCB3YW50IHRoZSBwYWdlcyBtYXJrZWQgcmVhZC1vbmx5CkBAIC0xMDcyLDYgKzEwNzUsMTAgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRvX21tYXBfcGdvZmYoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LAogCXVuc2lnbmVkIGxvbmcgZmxhZywgdW5zaWduZWQgbG9uZyBwZ29mZik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtbWFwX3JlZ2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCXVuc2lnbmVkIGludCB2bV9mbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwlpbnQgYWNjb3VudGFibGUpOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZG9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCBkMDliMTM0Li5kYThlYjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTI0LDYgKzI0LDE0IEBACiAjZW5kaWYKICNkZWZpbmUgTUFYX09SREVSX05SX1BBR0VTICgxIDw8IChNQVhfT1JERVIgLSAxKSkKIAorLyoKKyAqIFBBR0VfQUxMT0NfQ09TVExZX09SREVSIGlzIHRoZSBvcmRlciBhdCB3aGljaCBhbGxvY2F0aW9ucyBhcmUgZGVlbWVkCisgKiBjb3N0bHkgdG8gc2VydmljZS4gIFRoYXQgaXMgYmV0d2VlbiBhbGxvY2F0aW9uIG9yZGVycyB3aGljaCBzaG91bGQKKyAqIGNvZWxlc2NlIG5hdHVyYWxseSB1bmRlciByZWFzb25hYmxlIHJlY2xhaW0gcHJlc3N1cmUgYW5kIHRob3NlIHdoaWNoCisgKiB3aWxsIG5vdC4KKyAqLworI2RlZmluZSBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUiAzCisKIHN0cnVjdCBmcmVlX2FyZWEgewogCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9saXN0OwogCXVuc2lnbmVkIGxvbmcJCW5yX2ZyZWU7CkBAIC0xNDYsNiArMTU0LDcgQEAKIAkgKi8KIAlaT05FX0hJR0hNRU0sCiAjZW5kaWYKKwlaT05FX01PVkFCTEUsCiAJTUFYX05SX1pPTkVTCiB9OwogCkBAIC0xNjcsNiArMTc2LDcgQEAKIAkrIGRlZmluZWQoQ09ORklHX1pPTkVfRE1BMzIpCVwKIAkrIDEJCQkJXAogCSsgZGVmaW5lZChDT05GSUdfSElHSE1FTSkJXAorCSsgMQkJCQlcCiApCiAjaWYgX19aT05FX0NPVU5UIDwgMgogI2RlZmluZSBaT05FU19TSElGVCAwCkBAIC00OTksMTAgKzUwOSwyMiBAQAogCXJldHVybiAoISF6b25lLT5wcmVzZW50X3BhZ2VzKTsKIH0KIAorZXh0ZXJuIGludCBtb3ZhYmxlX3pvbmU7CisKK3N0YXRpYyBpbmxpbmUgaW50IHpvbmVfbW92YWJsZV9pc19oaWdobWVtKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSElHSE1FTSkgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVApCisJcmV0dXJuIG1vdmFibGVfem9uZSA9PSBaT05FX0hJR0hNRU07CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2hpZ2htZW1faWR4KGVudW0gem9uZV90eXBlIGlkeCkKIHsKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCXJldHVybiAoaWR4ID09IFpPTkVfSElHSE1FTSk7CisJcmV0dXJuIChpZHggPT0gWk9ORV9ISUdITUVNIHx8CisJCShpZHggPT0gWk9ORV9NT1ZBQkxFICYmIHpvbmVfbW92YWJsZV9pc19oaWdobWVtKCkpKTsKICNlbHNlCiAJcmV0dXJuIDA7CiAjZW5kaWYKQEAgLTUyMiw3ICs1NDQsOSBAQAogc3RhdGljIGlubGluZSBpbnQgaXNfaGlnaG1lbShzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCXJldHVybiB6b25lID09IHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfem9uZXMgKyBaT05FX0hJR0hNRU07CisJaW50IHpvbmVfaWR4ID0gem9uZSAtIHpvbmUtPnpvbmVfcGdkYXQtPm5vZGVfem9uZXM7CisJcmV0dXJuIHpvbmVfaWR4ID09IFpPTkVfSElHSE1FTSB8fAorCQkoem9uZV9pZHggPT0gWk9ORV9NT1ZBQkxFICYmIHpvbmVfbW92YWJsZV9pc19oaWdobWVtKCkpOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgpAQCAtNTY2LDYgKzU5MCwxMSBAQAogaW50IHN5c2N0bF9taW5fc2xhYl9yYXRpb19zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCXN0cnVjdCBmaWxlICosIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CiAKK2V4dGVybiBpbnQgbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LAorCQkJc3RydWN0IGZpbGUgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKK2V4dGVybiBjaGFyIG51bWFfem9uZWxpc3Rfb3JkZXJbXTsKKyNkZWZpbmUgTlVNQV9aT05FTElTVF9PUkRFUl9MRU4gMTYJLyogc3RyaW5nIGJ1ZmZlciBzaXplICovCisKICNpbmNsdWRlIDxsaW51eC90b3BvbG9neS5oPgogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IE5vZGUuICovCiAjaWZuZGVmIG51bWFfbm9kZV9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbnRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaAppbmRleCAxZmE0ZDk4Li44ZWVkNDRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21udF9uYW1lc3BhY2UuaApAQCAtMTQsNyArMTQsNyBAQAogCWludCBldmVudDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqY29weV9tbnRfbnMoaW50LCBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqLAorZXh0ZXJuIHN0cnVjdCBtbnRfbmFtZXNwYWNlICpjb3B5X21udF9ucyh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqLAogCQlzdHJ1Y3QgZnNfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgX19wdXRfbW50X25zKHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmggYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCmluZGV4IGU2ZTBmODYuLmI2YTY0NmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaApAQCAtNiw3ICs2LDYgQEAKICAqIFJld3JpdHRlbiBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PiBEZWMgMTk5NgogICogUmV3cml0dGVuIGFnYWluIGJ5IFJ1c3R5IFJ1c3NlbGwsIDIwMDIKICAqLwotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oIGIvaW5jbHVkZS9saW51eC9tc2Rvc19mcy5oCmluZGV4IDBlMDljMDAuLmY5NTA5MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXNkb3NfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21zZG9zX2ZzLmgKQEAgLTE0Niw3ICsxNDYsNyBAQAogfTsKIAogc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSB7Ci0JX191OAluYW1lWzhdLGV4dFszXTsJLyogbmFtZSBhbmQgZXh0ZW5zaW9uICovCisJX191OAluYW1lW01TRE9TX05BTUVdOy8qIG5hbWUgYW5kIGV4dGVuc2lvbiAqLwogCV9fdTgJYXR0cjsJCS8qIGF0dHJpYnV0ZSBiaXRzICovCiAJX191OCAgICBsY2FzZTsJCS8qIENhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLwogCV9fdTgJY3RpbWVfY3M7CS8qIENyZWF0aW9uIHRpbWUsIGNlbnRpc2Vjb25kcyAoMC0xOTkpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25jcF9mcy5oIGIvaW5jbHVkZS9saW51eC9uY3BfZnMuaAppbmRleCA4M2UzOWViLi44ODc2NmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25jcF9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmNwX2ZzLmgKQEAgLTE0OCw4ICsxNDgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25jcF9mc19pLmg+CiAjaW5jbHVkZSA8bGludXgvbmNwX2ZzX3NiLmg+CiAKLS8qIHVuZGVmIGJlY2F1c2UgcHVibGljIGRlZmluZSBpbiB1bXNkb3NfZnMuaCAobmNwX2ZzLmggaXNuJ3QgcHVibGljKSAqLwotI3VuZGVmIFBSSU5USwogLyogZGVmaW5lIGJlY2F1c2UgaXQgaXMgZWFzeSB0byBjaGFuZ2UgUFJJTlRLIHRvIHsqfVBSSU5USyAqLwogI2RlZmluZSBQUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQgLCAjIyBhcmdzKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCAzMjJiNWVhLi5kYTdhMTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTI2Miw4ICsyNjIsNiBAQAogCV9fTElOS19TVEFURV9MSU5LV0FUQ0hfUEVORElORywKIAlfX0xJTktfU1RBVEVfRE9STUFOVCwKIAlfX0xJTktfU1RBVEVfUURJU0NfUlVOTklORywKLQkvKiBTZXQgYnkgdGhlIG5ldHBvbGwgTkFQSSBjb2RlICovCi0JX19MSU5LX1NUQVRFX1BPTExfTElTVF9GUk9aRU4sCiB9OwogCiAKQEAgLTEwMjIsMTQgKzEwMjAsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSNpZmRlZiBDT05GSUdfTkVUUE9MTAotCS8qIFByZXZlbnQgcmFjZSB3aXRoIG5ldHBvbGwgLSB5ZXMsIHRoaXMgaXMgYSBrbHVkZ2UuCi0JICogQnV0IGF0IGxlYXN0IGl0IGRvZXNuJ3QgcGVuYWxpemUgdGhlIG5vbi1uZXRwb2xsCi0JICogY29kZSBwYXRoLiAqLwotCWlmICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUE9MTF9MSVNUX0ZST1pFTiwgJmRldi0+c3RhdGUpKQotCQlyZXR1cm47Ci0jZW5kaWYKLQogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL2V4cG9ydC5oCmluZGV4IDlmNjJkNjEuLjc4ZmViN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzZC9leHBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvZXhwb3J0LmgKQEAgLTQyLDYgKzQyLDkgQEAKICNkZWZpbmUJTkZTRVhQX05PQUNMCQkweDgwMDAJLyogcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIEFDTCByZWxhdGVkIHVzZSAqLwogI2RlZmluZSBORlNFWFBfQUxMRkxBR1MJCTB4RkUzRgogCisvKiBUaGUgZmxhZ3MgdGhhdCBtYXkgdmFyeSBkZXBlbmRpbmcgb24gc2VjdXJpdHkgZmxhdm9yOiAqLworI2RlZmluZSBORlNFWFBfU0VDSU5GT19GTEFHUwkoTkZTRVhQX1JFQURPTkxZIHwgTkZTRVhQX1JPT1RTUVVBU0ggXAorCQkJCQl8IE5GU0VYUF9BTExTUVVBU0gpCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTY0LDYgKzY3LDE5IEBACiAJaW50IG1pZ3JhdGVkOwogfTsKIAorLyoKKyAqIFdlIGtlZXAgYW4gYXJyYXkgb2YgcHNldWRvZmxhdm9ycyB3aXRoIHRoZSBleHBvcnQsIGluIG9yZGVyIGZyb20gbW9zdAorICogdG8gbGVhc3QgcHJlZmVycmVkLiAgRm9yIHRoZSBmb3JzZWVhYmxlIGZ1dHVyZSwgd2UgZG9uJ3QgZXhwZWN0IG1vcmUKKyAqIHRoYW4gdGhlIGVpZ2h0IHBzZXVkb2ZsYXZvcnMgbnVsbCwgdW5peCwga3JiNSwga3JiNWksIGtyYjVwLCBza3BtMywKKyAqIHNwa20zaSwgYW5kIHNwa20zcCAoYW5kIHVzaW5nIGFsbCA4IGF0IG9uY2Ugc2hvdWxkIGJlIHJhcmUpLgorICovCisjZGVmaW5lIE1BWF9TRUNJTkZPX0xJU1QJOAorCitzdHJ1Y3QgZXhwX2ZsYXZvcl9pbmZvIHsKKwl1MzIJcHNldWRvZmxhdm9yOworCXUzMglmbGFnczsKK307CisKIHN0cnVjdCBzdmNfZXhwb3J0IHsKIAlzdHJ1Y3QgY2FjaGVfaGVhZAloOwogCXN0cnVjdCBhdXRoX2RvbWFpbiAqCWV4X2NsaWVudDsKQEAgLTc2LDYgKzkyLDggQEAKIAlpbnQJCQlleF9mc2lkOwogCXVuc2lnbmVkIGNoYXIgKgkJZXhfdXVpZDsgLyogMTYgYnl0ZSBmc2lkICovCiAJc3RydWN0IG5mc2Q0X2ZzX2xvY2F0aW9ucyBleF9mc2xvY3M7CisJaW50CQkJZXhfbmZsYXZvcnM7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbwlleF9mbGF2b3JzW01BWF9TRUNJTkZPX0xJU1RdOwogfTsKIAogLyogYW4gImV4cG9ydCBrZXkiIChleHBrZXkpIG1hcHMgYSBmaWxlaGFuZGxlZnJhZ2VtZW50IHRvIGFuCkBAIC05NSwxMCArMTEzLDIyIEBACiAKICNkZWZpbmUgRVhfU0VDVVJFKGV4cCkJCSghKChleHApLT5leF9mbGFncyAmIE5GU0VYUF9JTlNFQ1VSRV9QT1JUKSkKICNkZWZpbmUgRVhfSVNTWU5DKGV4cCkJCSghKChleHApLT5leF9mbGFncyAmIE5GU0VYUF9BU1lOQykpCi0jZGVmaW5lIEVYX1JET05MWShleHApCQkoKGV4cCktPmV4X2ZsYWdzICYgTkZTRVhQX1JFQURPTkxZKQogI2RlZmluZSBFWF9OT0hJREUoZXhwKQkJKChleHApLT5leF9mbGFncyAmIE5GU0VYUF9OT0hJREUpCiAjZGVmaW5lIEVYX1dHQVRIRVIoZXhwKQkJKChleHApLT5leF9mbGFncyAmIE5GU0VYUF9HQVRIRVJFRF9XUklURVMpCiAKK3N0YXRpYyBpbmxpbmUgaW50IEVYX1JET05MWShzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXN0cnVjdCBleHBfZmxhdm9yX2luZm8gKmY7CisJc3RydWN0IGV4cF9mbGF2b3JfaW5mbyAqZW5kID0gZXhwLT5leF9mbGF2b3JzICsgZXhwLT5leF9uZmxhdm9yczsKKworCWZvciAoZiA9IGV4cC0+ZXhfZmxhdm9yczsgZiA8IGVuZDsgZisrKSB7CisJCWlmIChmLT5wc2V1ZG9mbGF2b3IgPT0gcnFzdHAtPnJxX2ZsYXZvcikKKwkJCXJldHVybiBmLT5mbGFncyAmIE5GU0VYUF9SRUFET05MWTsKKwl9CisJcmV0dXJuIGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfUkVBRE9OTFk7Cit9CisKK19fYmUzMiBjaGVja19uZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKTsKIAogLyoKICAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucwpAQCAtMTEyLDEzICsxNDIsMTkgQEAKIAkJCQkJc3RydWN0IHZmc21vdW50ICptbnQsCiAJCQkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkJc3RydWN0IGNhY2hlX3JlcSAqcmVxcCk7CitzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCXJxc3RfZXhwX2dldF9ieV9uYW1lKHN0cnVjdCBzdmNfcnFzdCAqLAorCQkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqLAorCQkJCQkgICAgIHN0cnVjdCBkZW50cnkgKik7CiBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqCWV4cF9wYXJlbnQoc3RydWN0IGF1dGhfZG9tYWluICpjbHAsCiAJCQkJICAgc3RydWN0IHZmc21vdW50ICptbnQsCiAJCQkJICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgIHN0cnVjdCBjYWNoZV9yZXEgKnJlcXApOworc3RydWN0IHN2Y19leHBvcnQgKglycXN0X2V4cF9wYXJlbnQoc3RydWN0IHN2Y19ycXN0ICosCisJCQkJCXN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogaW50CQkJZXhwX3Jvb3RmaChzdHJ1Y3QgYXV0aF9kb21haW4gKiwgCiAJCQkJCWNoYXIgKnBhdGgsIHN0cnVjdCBrbmZzZF9maCAqLCBpbnQgbWF4c2l6ZSk7Ci1fX2JlMzIJCQlleHBfcHNldWRvcm9vdChzdHJ1Y3QgYXV0aF9kb21haW4gKiwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgY2FjaGVfcmVxICpjcmVxKTsKK19fYmUzMgkJCWV4cF9wc2V1ZG9yb290KHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICopOwogX19iZTMyCQkJbmZzZXJybm8oaW50IGVycm5vKTsKIAogZXh0ZXJuIHN0cnVjdCBjYWNoZV9kZXRhaWwgc3ZjX2V4cG9ydF9jYWNoZTsKQEAgLTEzNSw2ICsxNzEsNyBAQAogZXh0ZXJuIHN0cnVjdCBzdmNfZXhwb3J0ICoKIGV4cF9maW5kKHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLCBpbnQgZnNpZF90eXBlLCB1MzIgKmZzaWR2LAogCSBzdHJ1Y3QgY2FjaGVfcmVxICpyZXFwKTsKK3N0cnVjdCBzdmNfZXhwb3J0ICogcnFzdF9leHBfZmluZChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgaW50LCB1MzIgKik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9pbnRlcmZhY2UuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwOTc5Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvaW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKgotICogaW5jbHVkZS9saW51eC9uZnNkL2ludGVyZmFjZS5oCi0gKgotICogZGVmaW5lcyBpbnRlcmZhY2UgYmV0d2VlbiBuZnNkIGFuZCBvdGhlciBiaXRzIG9mCi0gKiB0aGUga2VybmVsLiAgUGFydGljdWxhcmx5IGZpbGVzeXN0ZW1zIChldmVudHVhbGx5KS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgotICovCi0KLSNpZm5kZWYgTElOVVhfTkZTRF9JTlRFUkZBQ0VfSAotI2RlZmluZSBMSU5VWF9ORlNEX0lOVEVSRkFDRV9ICi0KLSNlbmRpZiAvKiBMSU5VWF9ORlNEX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAppbmRleCA3MmZlYWM1Li5lNDUyMjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QvYXV0aC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdHMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL2ludGVyZmFjZS5oPgogLyoKICAqIG5mc2QgdmVyc2lvbgogICovCkBAIC03Miw2ICs3MSw5IEBACiAJCSAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqKmV4cHApOwogX19iZTMyCQluZnNkX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHN2Y19maCAqLAogCQkJCWNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc3ZjX2ZoICopOworX19iZTMyCQkgbmZzZF9sb29rdXBfZGVudHJ5KHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2ZoICosCisJCQkJY29uc3QgY2hhciAqLCBpbnQsCisJCQkJc3RydWN0IHN2Y19leHBvcnQgKiosIHN0cnVjdCBkZW50cnkgKiopOwogX19iZTMyCQluZnNkX3NldGF0dHIoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCBzdmNfZmggKiwKIAkJCQlzdHJ1Y3QgaWF0dHIgKiwgaW50LCB0aW1lX3QpOwogI2lmZGVmIENPTkZJR19ORlNEX1Y0CkBAIC0xMjAsNyArMTIyLDggQEAKIAkJCQlzdHJ1Y3Qga3N0YXRmcyAqKTsKIAogaW50CQluZnNkX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBpYXR0ciAqKTsKLV9fYmUzMgkJbmZzZF9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfZXhwb3J0ICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK19fYmUzMgkJbmZzZF9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfcnFzdCAqLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLAorCQkJCXN0cnVjdCBkZW50cnkgKiwgaW50KTsKIGludAkJbmZzZF9zeW5jX2RpcihzdHJ1Y3QgZGVudHJ5ICpkcCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNEX1YyX0FDTCkgfHwgZGVmaW5lZChDT05GSUdfTkZTRF9WM19BQ0wpCkBAIC0xNDksNiArMTUyLDcgQEAKICAqIE5GU3Y0IFN0YXRlCiAgKi8KICNpZmRlZiBDT05GSUdfTkZTRF9WNAorZXh0ZXJuIHVuc2lnbmVkIGludCBtYXhfZGVsZWdhdGlvbnM7CiB2b2lkIG5mczRfc3RhdGVfaW5pdCh2b2lkKTsKIGludCBuZnM0X3N0YXRlX3N0YXJ0KHZvaWQpOwogdm9pZCBuZnM0X3N0YXRlX3NodXRkb3duKHZvaWQpOwpAQCAtMjM2LDYgKzI0MCw3IEBACiAjZGVmaW5lCW5mc2Vycl9iYWRuYW1lCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9CQUROQU1FKQogI2RlZmluZQluZnNlcnJfY2JfcGF0aF9kb3duCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0NCX1BBVEhfRE9XTikKICNkZWZpbmUJbmZzZXJyX2xvY2tlZAkJX19jb25zdGFudF9odG9ubChORlNFUlJfTE9DS0VEKQorI2RlZmluZQluZnNlcnJfd3JvbmdzZWMJCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX1dST05HU0VDKQogI2RlZmluZQluZnNlcnJfcmVwbGF5X21lCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX1JFUExBWV9NRSkKIAogLyogZXJyb3IgY29kZXMgZm9yIGludGVybmFsIHVzZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmggYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAppbmRleCBhYjVjMjM2Li5kYjM0OGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaApAQCAtNjcsNyArNjcsNyBAQAogCWludAkJCWNicl90cnVuYzsKIAlzdGF0ZWlkX3QJCWNicl9zdGF0ZWlkOwogCXUzMgkJCWNicl9maGxlbjsKLQl1MzIJCQljYnJfZmh2YWxbTkZTNF9GSFNJWkVdOworCWNoYXIJCQljYnJfZmh2YWxbTkZTNF9GSFNJWkVdOwogCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24JKmNicl9kcDsKIH07CiAKQEAgLTIyNCw2ICsyMjQsNyBAQAogCXN0cnVjdCBpbm9kZQkJKmZpX2lub2RlOwogCXUzMiAgICAgICAgICAgICAgICAgICAgIGZpX2lkOyAgICAgIC8qIHVzZWQgd2l0aCBzdGF0ZW93bmVyLT5zb19pZCAKIAkJCQkJICAgICAqIGZvciBzdGF0ZWlkX2hhc2h0YmwgaGFzaCAqLworCWJvb2wJCQlmaV9oYWRfY29uZmxpY3Q7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKaW5kZXggMDk3OTliYy4uMWI2NTMyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCkBAIC0yOTMsNiArMjkzLDEyIEBACiAJc3RydWN0IG5mc2Q0X2NoYW5nZV9pbmZvICBybl90aW5mbzsgLyogcmVzcG9uc2UgKi8KIH07CiAKK3N0cnVjdCBuZnNkNF9zZWNpbmZvIHsKKwl1MzIgc2lfbmFtZWxlbjsJCQkJCS8qIHJlcXVlc3QgKi8KKwljaGFyICpzaV9uYW1lOwkJCQkJLyogcmVxdWVzdCAqLworCXN0cnVjdCBzdmNfZXhwb3J0ICpzaV9leHA7CQkJLyogcmVzcG9uc2UgKi8KK307CisKIHN0cnVjdCBuZnNkNF9zZXRhdHRyIHsKIAlzdGF0ZWlkX3QJc2Ffc3RhdGVpZDsgICAgICAgICAvKiByZXF1ZXN0ICovCiAJdTMyCQlzYV9ibXZhbFsyXTsgICAgICAgIC8qIHJlcXVlc3QgKi8KQEAgLTM2NSw2ICszNzEsNyBAQAogCQlzdHJ1Y3QgbmZzZDRfcmVtb3ZlCQlyZW1vdmU7CiAJCXN0cnVjdCBuZnNkNF9yZW5hbWUJCXJlbmFtZTsKIAkJY2xpZW50aWRfdAkJCXJlbmV3OworCQlzdHJ1Y3QgbmZzZDRfc2VjaW5mbwkJc2VjaW5mbzsKIAkJc3RydWN0IG5mc2Q0X3NldGF0dHIJCXNldGF0dHI7CiAJCXN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZAlzZXRjbGllbnRpZDsKIAkJc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkX2NvbmZpcm0gc2V0Y2xpZW50aWRfY29uZmlybTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnNwcm94eS5oIGIvaW5jbHVkZS9saW51eC9uc3Byb3h5LmgKaW5kZXggMTg5ZTBkYy4uY2UwNjE4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uc3Byb3h5LmgKKysrIGIvaW5jbHVkZS9saW51eC9uc3Byb3h5LmgKQEAgLTI4LDEwICsyOCwxMSBAQAogCXN0cnVjdCBpcGNfbmFtZXNwYWNlICppcGNfbnM7CiAJc3RydWN0IG1udF9uYW1lc3BhY2UgKm1udF9uczsKIAlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zOworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9uczsKIH07CiBleHRlcm4gc3RydWN0IG5zcHJveHkgaW5pdF9uc3Byb3h5OwogCi1pbnQgY29weV9uYW1lc3BhY2VzKGludCBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworaW50IGNvcHlfbmFtZXNwYWNlcyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiB2b2lkIGdldF90YXNrX25hbWVzcGFjZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogdm9pZCBmcmVlX25zcHJveHkoc3RydWN0IG5zcHJveHkgKm5zKTsKIGludCB1bnNoYXJlX25zcHJveHlfbmFtZXNwYWNlcyh1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgbnNwcm94eSAqKiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDM3YTcxNTguLjVlODRmMmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtNDMyLDYgKzQzMiw4IEBACiAgKiBjb2RlLCBvciBwY2kgY29yZSBjb2RlLiAqLwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcGNpX3Jvb3RfYnVzZXM7CS8qIGxpc3Qgb2YgYWxsIGtub3duIFBDSSBidXNlcyAqLwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcGNpX2RldmljZXM7CS8qIGxpc3Qgb2YgYWxsIGRldmljZXMgKi8KKy8qIFNvbWUgZGV2aWNlIGRyaXZlcnMgbmVlZCBrbm93IGlmIHBjaSBpcyBpbml0aWF0ZWQgKi8KK2V4dGVybiBpbnQgbm9fcGNpX2RldmljZXModm9pZCk7CiAKIHZvaWQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKik7CiBpbnQgX19tdXN0X2NoZWNrIHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqLCBpbnQgbWFzayk7CkBAIC03MjQsNiArNzI2LDcgQEAKIHsgcmV0dXJuIE5VTEw7IH0KIAogI2RlZmluZSBwY2lfZGV2X3ByZXNlbnQoaWRzKQkoMCkKKyNkZWZpbmUgbm9fcGNpX2RldmljZXMoKQkoMSkKICNkZWZpbmUgcGNpX2ZpbmRfcHJlc2VudChpZHMpCShOVUxMKQogI2RlZmluZSBwY2lfZGV2X3B1dChkZXYpCWRvIHsgfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKaW5kZXggYjcyYmUyZi4uOTI2YWRhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0xJTlVYX1BFUkNQVV9ICiAjZGVmaW5lIF9fTElOVVhfUEVSQ1BVX0gKIAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+IC8qIEZvciBwcmVlbXB0X2Rpc2FibGUoKSAqLworI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8qIEZvciBrbWFsbG9jKCkgKi8KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogRm9yIG1lbXNldCgpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKaW5kZXggZjVhYTU5My4uM2Q5ZjcwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTcsNiArMTgsOSBAQAogc3RydWN0IHBlcmNwdV9jb3VudGVyIHsKIAlzcGlubG9ja190IGxvY2s7CiAJczY0IGNvdW50OworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogQWxsIHBlcmNwdV9jb3VudGVycyBhcmUgb24gYSBsaXN0ICovCisjZW5kaWYKIAlzMzIgKmNvdW50ZXJzOwogfTsKIApAQCAtMjYsMTggKzMwLDggQEAKICNkZWZpbmUgRkJDX0JBVENICShOUl9DUFVTKjQpCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmZiYy0+bG9jayk7Ci0JZmJjLT5jb3VudCA9IGFtb3VudDsKLQlmYmMtPmNvdW50ZXJzID0gYWxsb2NfcGVyY3B1KHMzMik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQotewotCWZyZWVfcGVyY3B1KGZiYy0+Y291bnRlcnMpOwotfQotCit2b2lkIHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQpOwordm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKTsKIHZvaWQgcGVyY3B1X2NvdW50ZXJfbW9kKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzMzIgYW1vdW50KTsKIHM2NCBwZXJjcHVfY291bnRlcl9zdW0oc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCmluZGV4IDE2OWM2YzIuLmI5YTE3ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oCkBAIC0yOSw3ICsyOSw3IEBACiAJa3JlZl9nZXQoJm5zLT5rcmVmKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyhpbnQgZmxhZ3MsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucyk7CitleHRlcm4gc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucyk7CiBleHRlcm4gdm9pZCBmcmVlX3BpZF9ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGlkX25zKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJjdGwuaCBiL2luY2x1ZGUvbGludXgvcHJjdGwuaAppbmRleCA1MmE5YmU0Li5lMmVmZjkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCkBAIC01OSw0ICs1OSw4IEBACiAjIGRlZmluZSBQUl9FTkRJQU5fTElUVExFCTEJLyogVHJ1ZSBsaXR0bGUgZW5kaWFuIG1vZGUgKi8KICMgZGVmaW5lIFBSX0VORElBTl9QUENfTElUVExFCTIJLyogIlBvd2VyUEMiIHBzZXVkbyBsaXR0bGUgZW5kaWFuICovCiAKKy8qIEdldC9zZXQgcHJvY2VzcyBzZWNjb21wIG1vZGUgKi8KKyNkZWZpbmUgUFJfR0VUX1NFQ0NPTVAJMjEKKyNkZWZpbmUgUFJfU0VUX1NFQ0NPTVAJMjIKKwogI2VuZGlmIC8qIF9MSU5VWF9QUkNUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmggYi9pbmNsdWRlL2xpbnV4L3ByZWZldGNoLmgKaW5kZXggZmM4NmYyNy4uMWFkZmU2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcmVmZXRjaC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJlZmV0Y2guaApAQCAtMjcsNyArMjcsNyBAQAogCQogCXByZWZldGNoKHgpICAJLSBwcmVmZXRjaGVzIHRoZSBjYWNoZWxpbmUgYXQgIngiIGZvciByZWFkCiAJcHJlZmV0Y2h3KHgpCS0gcHJlZmV0Y2hlcyB0aGUgY2FjaGVsaW5lIGF0ICJ4IiBmb3Igd3JpdGUKLQlzcGluX2xvY2tfcHJlZmV0Y2goeCkgLSBwcmVmZWN0Y2hlcyB0aGUgc3BpbmxvY2sgKnggZm9yIHRha2luZworCXNwaW5fbG9ja19wcmVmZXRjaCh4KSAtIHByZWZldGNoZXMgdGhlIHNwaW5sb2NrICp4IGZvciB0YWtpbmcKIAkKIAl0aGVyZSBpcyBhbHNvIFBSRUZFVENIX1NUUklERSB3aGljaCBpcyB0aGUgYXJjaGl0ZWN1cmUtcHJlZmVyZWQgCiAJImxvb2thaGVhZCIgc2l6ZSBmb3IgcHJlZmV0Y2hpbmcgc3RyZWFtZWQgb3BlcmF0aW9ucy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKaW5kZXggMzQ2OWY5Ni4uMjhlMzY2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKQEAgLTcsNiArNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKK3N0cnVjdCBjb21wbGV0aW9uOworCiAvKgogICogVGhlIHByb2MgZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcwogICovCkBAIC01Niw2ICs1OCwxNCBAQAogCWdpZF90IGdpZDsKIAlsb2ZmX3Qgc2l6ZTsKIAljb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyAqcHJvY19pb3BzOworCS8qCisJICogTlVMTCAtPnByb2NfZm9wcyBtZWFucyAiUERFIGlzIGdvaW5nIGF3YXkgUlNOIiBvcgorCSAqICJQREUgaXMganVzdCBjcmVhdGVkIi4gSW4gZWl0aGVyIGNhc2UsIGUuZy4gLT5yZWFkX3Byb2Mgd29uJ3QgYmUKKwkgKiBjYWxsZWQgYmVjYXVzZSBpdCdzIHRvbyBsYXRlIG9yIHRvbyBlYXJseSwgcmVzcGVjdGl2ZWx5LgorCSAqCisJICogSWYgeW91J3JlIGFsbG9jYXRpbmcgLT5wcm9jX2ZvcHMgZHluYW1pY2FsbHksIHNhdmUgYSBwb2ludGVyCisJICogc29tZXdoZXJlLgorCSAqLwogCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnByb2NfZm9wczsKIAlnZXRfaW5mb190ICpnZXRfaW5mbzsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKQEAgLTY2LDYgKzc2LDkgQEAKIAlhdG9taWNfdCBjb3VudDsJCS8qIHVzZSBjb3VudCAqLwogCWludCBkZWxldGVkOwkJLyogZGVsZXRlIGZsYWcgKi8KIAl2b2lkICpzZXQ7CisJaW50IHBkZV91c2VyczsJLyogbnVtYmVyIG9mIGNhbGxlcnMgaW50byBtb2R1bGUgaW4gcHJvZ3Jlc3MgKi8KKwlzcGlubG9ja190IHBkZV91bmxvYWRfbG9jazsgLyogcHJvY19mb3BzIGNoZWNrcyBhbmQgcGRlX3VzZXJzIGJ1bXBzICovCisJc3RydWN0IGNvbXBsZXRpb24gKnBkZV91bmxvYWRfY29tcGxldGlvbjsKIH07CiAKIHN0cnVjdCBrY29yZV9saXN0IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCmluZGV4IGVlYjE5NzYuLmFlODE0NmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaApAQCAtMTEwLDYgKzExMCw4IEBACiAJCV9fcHRyYWNlX3VubGluayhjaGlsZCk7CiB9CiAKK2ludCBnZW5lcmljX3B0cmFjZV9wZWVrZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgbG9uZyBhZGRyLCBsb25nIGRhdGEpOworaW50IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSk7CiAKICNpZm5kZWYgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybgogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9iaXRtYXAuaAppbmRleCBkZDVhMDVkLi43NWUxN2EwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL2JpdG1hcC5oCkBAIC0yNjIsNyArMjYyLDcgQEAKIAogY2hhciAqZmlsZV9wYXRoKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIGludCBjb3VudCk7CiB2b2lkIGJpdG1hcF9wcmludF9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwotaW50IGJpdG1hcF91cGRhdGVfc2Ioc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKK3ZvaWQgYml0bWFwX3VwZGF0ZV9zYihzdHJ1Y3QgYml0bWFwICpiaXRtYXApOwogCiBpbnQgIGJpdG1hcF9zZXRhbGxiaXRzKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiB2b2lkIGJpdG1hcF93cml0ZV9hbGwoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKQEAgLTI3OCw4ICsyNzgsOCBAQAogdm9pZCBiaXRtYXBfZW5kX3N5bmMoc3RydWN0IGJpdG1hcCAqYml0bWFwLCBzZWN0b3JfdCBvZmZzZXQsIGludCAqYmxvY2tzLCBpbnQgYWJvcnRlZCk7CiB2b2lkIGJpdG1hcF9jbG9zZV9zeW5jKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAKLWludCBiaXRtYXBfdW5wbHVnKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Ci1pbnQgYml0bWFwX2RhZW1vbl93b3JrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7Cit2b2lkIGJpdG1hcF91bnBsdWcoc3RydWN0IGJpdG1hcCAqYml0bWFwKTsKK3ZvaWQgYml0bWFwX2RhZW1vbl93b3JrKHN0cnVjdCBiaXRtYXAgKmJpdG1hcCk7CiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oIGIvaW5jbHVkZS9saW51eC9yYWlkL21kX2suaAppbmRleCBkZTcyYzQ5Li4yOGFjNjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhaWQvbWRfay5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9tZF9rLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAogCXNlY3Rvcl90IHNpemU7CQkJLyogRGV2aWNlIHNpemUgKGluIGJsb2NrcykgKi8KIAltZGRldl90ICptZGRldjsJCQkvKiBSQUlEIGFycmF5IGlmIHJ1bm5pbmcgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfZXZlbnRzOwkvKiBJTyBldmVudCB0aW1lc3RhbXAgKi8KKwlsb25nIGxhc3RfZXZlbnRzOwkJLyogSU8gZXZlbnQgdGltZXN0YW1wICovCiAKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwkvKiBibG9jayBkZXZpY2UgaGFuZGxlICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oIGIvaW5jbHVkZS9saW51eC9ydGMvbTQ4dDU5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjN2MyMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcnRjL200OHQ1OS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L3J0Yy9tNDh0NTkuaAorICoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgcGxhdGZvcm0gZGF0YSBvZiBtNDh0NTkgUlRDIGNoaXAgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBXaW5kIFJpdmVyIFN5c3RlbXMsIEluYy4KKyAqCisgKiBNYXJrIFpoYW4gPHJvbmdrYWkuemhhbkB3aW5kcml2ZXIuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfUlRDX000OFQ1OV9IXworI2RlZmluZSBfTElOVVhfUlRDX000OFQ1OV9IXworCisvKgorICogTTQ4VDU5IFJlZ2lzdGVyIE9mZnNldAorICovCisjZGVmaW5lIE00OFQ1OV9ZRUFSCQkweDFmZmYKKyNkZWZpbmUgTTQ4VDU5X01PTlRICQkweDFmZmUKKyNkZWZpbmUgTTQ4VDU5X01EQVkJCTB4MWZmZAkvKiBEYXkgb2YgTW9udGggKi8KKyNkZWZpbmUgTTQ4VDU5X1dEQVkJCTB4MWZmYwkvKiBEYXkgb2YgV2VlayAqLworI2RlZmluZSBNNDhUNTlfV0RBWV9DQgkJCTB4MjAJLyogQ2VudHVyeSBCaXQgKi8KKyNkZWZpbmUgTTQ4VDU5X1dEQVlfQ0VCCQkJMHgxMAkvKiBDZW50dXJ5IEVuYWJsZSBCaXQgKi8KKyNkZWZpbmUgTTQ4VDU5X0hPVVIJCTB4MWZmYgorI2RlZmluZSBNNDhUNTlfTUlOCQkweDFmZmEKKyNkZWZpbmUgTTQ4VDU5X1NFQwkJMHgxZmY5CisjZGVmaW5lIE00OFQ1OV9DTlRMCQkweDFmZjgKKyNkZWZpbmUgTTQ4VDU5X0NOVExfUkVBRAkJMHg0MAorI2RlZmluZSBNNDhUNTlfQ05UTF9XUklURQkJMHg4MAorI2RlZmluZSBNNDhUNTlfV0FUQ0hET0cJCTB4MWZmNworI2RlZmluZSBNNDhUNTlfSU5UUgkJMHgxZmY2CisjZGVmaW5lIE00OFQ1OV9JTlRSX0FGRQkJCTB4ODAJLyogQWxhcm0gSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBNNDhUNTlfSU5UUl9BQkUJCQkweDIwCisjZGVmaW5lIE00OFQ1OV9BTEFSTV9EQVRFCTB4MWZmNQorI2RlZmluZSBNNDhUNTlfQUxBUk1fSE9VUgkweDFmZjQKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX01JTgkweDFmZjMKKyNkZWZpbmUgTTQ4VDU5X0FMQVJNX1NFQwkweDFmZjIKKyNkZWZpbmUgTTQ4VDU5X1VOVVNFRAkJMHgxZmYxCisjZGVmaW5lIE00OFQ1OV9GTEFHUwkJMHgxZmYwCisjZGVmaW5lIE00OFQ1OV9GTEFHU19XRFQJCTB4ODAJLyogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNNDhUNTlfRkxBR1NfQUYJCQkweDQwCS8qIGFsYXJtICovCisjZGVmaW5lIE00OFQ1OV9GTEFHU19CRgkJCTB4MTAJLyogbG93IGJhdHRlcnkgKi8KKworI2RlZmluZSBNNDhUNTlfTlZSQU1fU0laRQkweDFmZjAKKworc3RydWN0IG00OHQ1OV9wbGF0X2RhdGEgeworCS8qIFRoZSBtZXRob2QgdG8gYWNjZXNzIE00OFQ1OSByZWdpc3RlcnMsCisJICogTk9URTogVGhlICdvZnMnIHNob3VsZCBiZSAweDAwfjB4MWZmZgorCSAqLworCXZvaWQgKCp3cml0ZV9ieXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZnMsIHU4IHZhbCk7CisJdW5zaWduZWQgY2hhciAoKnJlYWRfYnl0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZzKTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfUlRDX000OFQ1OV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IGNmYjY4MDUuLjczMWVkYWNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0yNiw2ICsyNiw3IEBACiAjZGVmaW5lIENMT05FX1NUT1BQRUQJCTB4MDIwMDAwMDAJLyogU3RhcnQgaW4gc3RvcHBlZCBzdGF0ZSAqLwogI2RlZmluZSBDTE9ORV9ORVdVVFMJCTB4MDQwMDAwMDAJLyogTmV3IHV0c25hbWUgZ3JvdXA/ICovCiAjZGVmaW5lIENMT05FX05FV0lQQwkJMHgwODAwMDAwMAkvKiBOZXcgaXBjcyAqLworI2RlZmluZSBDTE9ORV9ORVdVU0VSCQkweDEwMDAwMDAwCS8qIE5ldyB1c2VyIG5hbWVzcGFjZSAqLwogCiAvKgogICogU2NoZWR1bGluZyBwb2xpY2llcwpAQCAtMjg3LDYgKzI4OCw3IEBACiBhc21saW5rYWdlIHZvaWQgc2NoZWR1bGUodm9pZCk7CiAKIHN0cnVjdCBuc3Byb3h5Oworc3RydWN0IHVzZXJfbmFtZXNwYWNlOwogCiAvKiBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgbWFwIGFyZWFzLi4gVGhpcyBpcyBhIHJhbmRvbSAobGFyZ2UpIG51bWJlciAqLwogI2RlZmluZSBERUZBVUxUX01BWF9NQVBfQ09VTlQJNjU1MzYKQEAgLTUyOSw2ICs1MzEsMTAgQEAKICNpZmRlZiBDT05GSUdfVEFTS1NUQVRTCiAJc3RydWN0IHRhc2tzdGF0cyAqc3RhdHM7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVESVQKKwl1bnNpZ25lZCBhdWRpdF90dHk7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKnR0eV9hdWRpdF9idWY7CisjZW5kaWYKIH07CiAKIC8qIENvbnRleHQgc3dpdGNoIG11c3QgYmUgdW5sb2NrZWQgaWYgaW50ZXJydXB0cyBhcmUgdG8gYmUgZW5hYmxlZCAqLwpAQCAtOTcyLDcgKzk3OCw4IEBACiAJdW5zaWduZWQgaW50IHJ0X3ByaW9yaXR5OwogCWNwdXRpbWVfdCB1dGltZSwgc3RpbWU7CiAJdW5zaWduZWQgbG9uZyBudmNzdywgbml2Y3N3OyAvKiBjb250ZXh0IHN3aXRjaCBjb3VudHMgKi8KLQlzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfdGltZTsgCQkvKiBtb25vdG9uaWMgdGltZSAqLworCXN0cnVjdCB0aW1lc3BlYyByZWFsX3N0YXJ0X3RpbWU7CS8qIGJvb3QgYmFzZWQgdGltZSAqLwogLyogbW0gZmF1bHQgYW5kIHN3YXAgaW5mbzogdGhpcyBjYW4gYXJndWFibHkgYmUgc2VlbiBhcyBlaXRoZXIgbW0tc3BlY2lmaWMgb3IgdGhyZWFkLXNwZWNpZmljICovCiAJdW5zaWduZWQgbG9uZyBtaW5fZmx0LCBtYWpfZmx0OwogCkBAIC0xNDAzLDcgKzE0MTAsNyBAQAogZXh0ZXJuIHZvaWQgX19zZXRfc3BlY2lhbF9waWRzKHBpZF90IHNlc3Npb24sIHBpZF90IHBncnApOwogCiAvKiBwZXItVUlEIHByb2Nlc3MgY2hhcmdpbmcuICovCi1leHRlcm4gc3RydWN0IHVzZXJfc3RydWN0ICogYWxsb2NfdWlkKHVpZF90KTsKK2V4dGVybiBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKiBhbGxvY191aWQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICosIHVpZF90KTsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfc3RydWN0ICpnZXRfdWlkKHN0cnVjdCB1c2VyX3N0cnVjdCAqdSkKIHsKIAlhdG9taWNfaW5jKCZ1LT5fX2NvdW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2N4MjAwX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvc2N4MjAwX2dwaW8uaAppbmRleCAxYTgyZDMwLi5kMmIwNTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjeDIwMF9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY3gyMDBfZ3Bpby5oCkBAIC0xLDUgKzEsMyBAQAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KIHUzMiBzY3gyMDBfZ3Bpb19jb25maWd1cmUodW5zaWduZWQgaW5kZXgsIHUzMiBzZXQsIHUzMiBjbGVhcik7CiAKIGV4dGVybiB1bnNpZ25lZCBzY3gyMDBfZ3Bpb19iYXNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmggYi9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaAppbmRleCAzZThiMWNmLi4yNjJhOGRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaApAQCAtNCw4ICs0LDYgQEAKIAogI2lmZGVmIENPTkZJR19TRUNDT01QCiAKLSNkZWZpbmUgTlJfU0VDQ09NUF9NT0RFUyAxCi0KICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9zZWNjb21wLmg+CiAKQEAgLTE4LDIwICsxNiwyMyBAQAogCQlfX3NlY3VyZV9jb21wdXRpbmcodGhpc19zeXNjYWxsKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaGFzX3NlY3VyZV9jb21wdXRpbmcoc3RydWN0IHRocmVhZF9pbmZvICp0aSkKLXsKLQlyZXR1cm4gdW5saWtlbHkodGVzdF90aV90aHJlYWRfZmxhZyh0aSwgVElGX1NFQ0NPTVApKTsKLX0KK2V4dGVybiBsb25nIHByY3RsX2dldF9zZWNjb21wKHZvaWQpOworZXh0ZXJuIGxvbmcgcHJjdGxfc2V0X3NlY2NvbXAodW5zaWduZWQgbG9uZyk7CiAKICNlbHNlIC8qIENPTkZJR19TRUNDT01QICovCiAKIHR5cGVkZWYgc3RydWN0IHsgfSBzZWNjb21wX3Q7CiAKICNkZWZpbmUgc2VjdXJlX2NvbXB1dGluZyh4KSBkbyB7IH0gd2hpbGUgKDApCi0vKiBzdGF0aWMgaW5saW5lIHRvIHByZXNlcnZlIHR5cGVjaGVja2luZyAqLwotc3RhdGljIGlubGluZSBpbnQgaGFzX3NlY3VyZV9jb21wdXRpbmcoc3RydWN0IHRocmVhZF9pbmZvICp0aSkKKworc3RhdGljIGlubGluZSBsb25nIHByY3RsX2dldF9zZWNjb21wKHZvaWQpCiB7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBwcmN0bF9zZXRfc2VjY29tcCh1bnNpZ25lZCBsb25nIGFyZzIpCit7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKaW5kZXggMzNmYzhjYi4uZGViNzE0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCkBAIC0xNzcsMTEgKzE3Nyw1IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKLS8qIEFsbG93IGFyY2hpdGVjdHVyZXMgdG8gb3ZlcnJpZGUgZW50cmllcyBpbiBzZXJpYWw4MjUwX3BvcnRzW10gYXQgcnVuIHRpbWU6ICovCi1zdHJ1Y3QgdWFydF9wb3J0OwkvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi1leHRlcm4gaW50IGVhcmx5X3NlcmlhbF9zZXR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLWV4dGVybiBpbnQgZWFybHlfc2VyaWFsX2NvbnNvbGVfaW5pdChjaGFyICpvcHRpb25zKTsKLWV4dGVybiBpbnQgc2VyaWFsODI1MF9zdGFydF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGNoYXIgKm9wdGlvbnMpOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCmluZGV4IDcxMzEwZDguLjcwNmVlOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKQEAgLTYwLDQgKzYwLDggQEAKIHZvaWQgc2VyaWFsODI1MF9zdXNwZW5kX3BvcnQoaW50IGxpbmUpOwogdm9pZCBzZXJpYWw4MjUwX3Jlc3VtZV9wb3J0KGludCBsaW5lKTsKIAorZXh0ZXJuIGludCBzZXJpYWw4MjUwX2ZpbmRfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwKTsKK2V4dGVybiBpbnQgc2VyaWFsODI1MF9maW5kX3BvcnRfZm9yX2Vhcmx5Y29uKHZvaWQpOworZXh0ZXJuIGludCBzZXR1cF9lYXJseV9zZXJpYWw4MjUwX2NvbnNvbGUoY2hhciAqY21kbGluZSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCmluZGV4IDdmMmM5OWQuLjljNzIxY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKQEAgLTE0Miw2ICsxNDIsOSBAQAogLyogTWljcmVsIEtTODY5NSAqLwogI2RlZmluZSBQT1JUX0tTODY5NQk3NgogCisvKiBCcm9hZGNvbSBTQjEyNTAsIGV0Yy4gU09DICovCisjZGVmaW5lIFBPUlRfU0IxMjUwX0RVQVJUCTc3CisKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaWduYWwuaCBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKaW5kZXggOWE1ZWFjNS4uZWE5MWFiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaWduYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCkBAIC02LDcgKzYsNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAvKgogICogUmVhbCBUaW1lIHNpZ25hbHMgbWF5IGJlIHF1ZXVlZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggY2ViY2QzOC4uMGUxZDBkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTE0LDggKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi10eXBlZGVmIHN0cnVjdCBrbWVtX2NhY2hlIGttZW1fY2FjaGVfdCBfX2RlcHJlY2F0ZWQ7Ci0KIC8qCiAgKiBGbGFncyB0byBwYXNzIHRvIGttZW1fY2FjaGVfY3JlYXRlKCkuCiAgKiBUaGUgb25lcyBtYXJrZWQgREVCVUcgYXJlIG9ubHkgdmFsaWQgaWYgQ09ORklHX1NMQUJfREVCVUcgaXMgc2V0LgpAQCAtMzMsNiArMzEsMTkgQEAKICNkZWZpbmUgU0xBQl9UUkFDRQkJMHgwMDIwMDAwMFVMCS8qIFRyYWNlIGFsbG9jYXRpb25zIGFuZCBmcmVlcyAqLwogCiAvKgorICogWkVST19TSVpFX1BUUiB3aWxsIGJlIHJldHVybmVkIGZvciB6ZXJvIHNpemVkIGttYWxsb2MgcmVxdWVzdHMuCisgKgorICogRGVyZWZlcmVuY2luZyBaRVJPX1NJWkVfUFRSIHdpbGwgbGVhZCB0byBhIGRpc3RpbmN0IGFjY2VzcyBmYXVsdC4KKyAqCisgKiBaRVJPX1NJWkVfUFRSIGNhbiBiZSBwYXNzZWQgdG8ga2ZyZWUgdGhvdWdoIGluIHRoZSBzYW1lIHdheSB0aGF0IE5VTEwgY2FuLgorICogQm90aCBtYWtlIGtmcmVlIGEgbm8tb3AuCisgKi8KKyNkZWZpbmUgWkVST19TSVpFX1BUUiAoKHZvaWQgKikxNikKKworI2RlZmluZSBaRVJPX09SX05VTExfUFRSKHgpICgodW5zaWduZWQgbG9uZykoeCkgPCBcCisJCQkJKHVuc2lnbmVkIGxvbmcpWkVST19TSVpFX1BUUikKKworLyoKICAqIHN0cnVjdCBrbWVtX2NhY2hlIHJlbGF0ZWQgcHJvdG90eXBlcwogICovCiB2b2lkIF9faW5pdCBrbWVtX2NhY2hlX2luaXQodm9pZCk7CkBAIC00NCw4ICs1NSw2IEBACiAJCQl2b2lkICgqKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpKTsKIHZvaWQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICopOwogaW50IGttZW1fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICopOwotdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7Ci12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiB2b2lkIGttZW1fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCB2b2lkICopOwogdW5zaWduZWQgaW50IGttZW1fY2FjaGVfc2l6ZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKIGNvbnN0IGNoYXIgKmttZW1fY2FjaGVfbmFtZShzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKQEAgLTYzLDE2ICs3Miw2IEBACiAJCXNpemVvZihzdHJ1Y3QgX19zdHJ1Y3QpLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgX19zdHJ1Y3QpLFwKIAkJKF9fZmxhZ3MpLCBOVUxMLCBOVUxMKQogCi0jaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAotCQkJCQlnZnBfdCBmbGFncywgaW50IG5vZGUpCi17Ci0JcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFRoZSBsYXJnZXN0IGttYWxsb2Mgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIHNsYWIgYWxsb2NhdG9ycyBpcwogICogMzIgbWVnYWJ5dGUgKDJeMjUpIG9yIHRoZSBtYXhpbXVtIGFsbG9jYXRhYmxlIHBhZ2Ugb3JkZXIgaWYgdGhhdCBpcwpAQCAtOTEsNTEgKzkwLDQyIEBACiAvKgogICogQ29tbW9uIGttYWxsb2MgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGFsbCBhbGxvY2F0b3JzCiAgKi8KLXZvaWQgKl9fa21hbGxvYyhzaXplX3QsIGdmcF90KTsKLXZvaWQgKl9fa3phbGxvYyhzaXplX3QsIGdmcF90KTsKIHZvaWQgKiBfX211c3RfY2hlY2sga3JlYWxsb2MoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGdmcF90KTsKIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqKTsKIHNpemVfdCBrc2l6ZShjb25zdCB2b2lkICopOwogCisvKgorICogQWxsb2NhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgbWFpbmx5IHVzZWQgdG8gZXN0YWJsaXNoIG9wdGltaXplZAorICogd2F5cyB0byBjb252ZXJ0IGttYWxsb2MoKSBjYWxscyB0byBrbWVtX2NhY2hlX2FsbG9jKCkgaW52b2NhdGlvbnMgYnkKKyAqIHNlbGVjdGluZyB0aGUgYXBwcm9wcmlhdGUgZ2VuZXJhbCBjYWNoZSBhdCBjb21waWxlIHRpbWUuCisgKgorICogQWxsb2NhdG9ycyBtdXN0IGRlZmluZSBhdCBsZWFzdDoKKyAqCisgKglrbWVtX2NhY2hlX2FsbG9jKCkKKyAqCV9fa21hbGxvYygpCisgKglrbWFsbG9jKCkKKyAqCisgKiBUaG9zZSB3aXNoaW5nIHRvIHN1cHBvcnQgTlVNQSBtdXN0IGFsc28gZGVmaW5lOgorICoKKyAqCWttZW1fY2FjaGVfYWxsb2Nfbm9kZSgpCisgKglrbWFsbG9jX25vZGUoKQorICoKKyAqIFNlZSBlYWNoIGFsbG9jYXRvciBkZWZpbml0aW9uIGZpbGUgZm9yIGFkZGl0aW9uYWwgY29tbWVudHMgYW5kCisgKiBpbXBsZW1lbnRhdGlvbiBub3Rlcy4KKyAqLworI2lmZGVmIENPTkZJR19TTFVCCisjaW5jbHVkZSA8bGludXgvc2x1Yl9kZWYuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX1NMT0IpCisjaW5jbHVkZSA8bGludXgvc2xvYl9kZWYuaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc2xhYl9kZWYuaD4KKyNlbmRpZgorCiAvKioKICAqIGtjYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFuIGFycmF5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgogICogQG46IG51bWJlciBvZiBlbGVtZW50cy4KICAqIEBzaXplOiBlbGVtZW50IHNpemUuCiAgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0JaWYgKG4gIT0gMCAmJiBzaXplID4gVUxPTkdfTUFYIC8gbikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIF9fa3phbGxvYyhuICogc2l6ZSwgZmxhZ3MpOwotfQotCi0vKgotICogQWxsb2NhdG9yIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGVzZSBhcmUgbWFpbmx5IHVzZWQgdG8gZXN0YWJsaXNoIG9wdGltaXplZAotICogd2F5cyB0byBjb252ZXJ0IGttYWxsb2MoKSBjYWxscyB0byBrbWVtX2NhY2hlX2FsbG9jKCkgaW52b2NhdGlvbnMgYnkgc2VsZWN0aW5nCi0gKiB0aGUgYXBwcm9wcmlhdGUgZ2VuZXJhbCBjYWNoZSBhdCBjb21waWxlIHRpbWUuCi0gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1NMQUIpIHx8IGRlZmluZWQoQ09ORklHX1NMVUIpCi0jaWZkZWYgQ09ORklHX1NMVUIKLSNpbmNsdWRlIDxsaW51eC9zbHViX2RlZi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxsaW51eC9zbGFiX2RlZi5oPgotI2VuZGlmIC8qICFDT05GSUdfU0xVQiAqLwotI2Vsc2UKLQotLyoKLSAqIEZhbGxiYWNrIGRlZmluaXRpb25zIGZvciBhbiBhbGxvY2F0b3Igbm90IHdhbnRpbmcgdG8gcHJvdmlkZQotICogaXRzIG93biBvcHRpbWl6ZWQga21hbGxvYyBkZWZpbml0aW9ucyAobGlrZSBTTE9CKS4KLSAqLwotCi0vKioKLSAqIGttYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkKLSAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKgotICoga21hbGxvYyBpcyB0aGUgbm9ybWFsIG1ldGhvZCBvZiBhbGxvY2F0aW5nIG1lbW9yeQotICogaW4gdGhlIGtlcm5lbC4KICAqCiAgKiBUaGUgQGZsYWdzIGFyZ3VtZW50IG1heSBiZSBvbmUgb2Y6CiAgKgpAQCAtMTQzLDcgKzEzMyw3IEBACiAgKgogICogJUdGUF9LRVJORUwgLSBBbGxvY2F0ZSBub3JtYWwga2VybmVsIHJhbS4gIE1heSBzbGVlcC4KICAqCi0gKiAlR0ZQX0FUT01JQyAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuCisgKiAlR0ZQX0FUT01JQyAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuICBNYXkgdXNlIGVtZXJnZW5jeSBwb29scy4KICAqICAgRm9yIGV4YW1wbGUsIHVzZSB0aGlzIGluc2lkZSBpbnRlcnJ1cHQgaGFuZGxlcnMuCiAgKgogICogJUdGUF9ISUdIVVNFUiAtIEFsbG9jYXRlIHBhZ2VzIGZyb20gaGlnaCBtZW1vcnkuCkBAIC0xNTIsMTggKzE0MiwyMiBAQAogICoKICAqICVHRlBfTk9GUyAtIERvIG5vdCBtYWtlIGFueSBmcyBjYWxscyB3aGlsZSB0cnlpbmcgdG8gZ2V0IG1lbW9yeS4KICAqCisgKiAlR0ZQX05PV0FJVCAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuCisgKgorICogJUdGUF9USElTTk9ERSAtIEFsbG9jYXRlIG5vZGUtbG9jYWwgbWVtb3J5IG9ubHkuCisgKgorICogJUdGUF9ETUEgLSBBbGxvY2F0aW9uIHN1aXRhYmxlIGZvciBETUEuCisgKiAgIFNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGttYWxsb2MoKSBjYWNoZXMuIE90aGVyd2lzZSwgdXNlIGEKKyAqICAgc2xhYiBjcmVhdGVkIHdpdGggU0xBQl9ETUEuCisgKgogICogQWxzbyBpdCBpcyBwb3NzaWJsZSB0byBzZXQgZGlmZmVyZW50IGZsYWdzIGJ5IE9SJ2luZwogICogaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIEBmbGFnczoKICAqCiAgKiAlX19HRlBfQ09MRCAtIFJlcXVlc3QgY2FjaGUtY29sZCBwYWdlcyBpbnN0ZWFkIG9mCiAgKiAgIHRyeWluZyB0byByZXR1cm4gY2FjaGUtd2FybSBwYWdlcy4KICAqCi0gKiAlX19HRlBfRE1BIC0gUmVxdWVzdCBtZW1vcnkgZnJvbSB0aGUgRE1BLWNhcGFibGUgem9uZS4KLSAqCiAgKiAlX19HRlBfSElHSCAtIFRoaXMgYWxsb2NhdGlvbiBoYXMgaGlnaCBwcmlvcml0eSBhbmQgbWF5IHVzZSBlbWVyZ2VuY3kgcG9vbHMuCiAgKgotICogJV9fR0ZQX0hJR0hNRU0gLSBBbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBmcm9tIGhpZ2htZW0uCi0gKgogICogJV9fR0ZQX05PRkFJTCAtIEluZGljYXRlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGlzIGluIG5vIHdheSBhbGxvd2VkIHRvIGZhaWwKICAqICAgKHRoaW5rIHR3aWNlIGJlZm9yZSB1c2luZykuCiAgKgpAQCAtMTczLDI0ICsxNjcsMjkgQEAKICAqICVfX0dGUF9OT1dBUk4gLSBJZiBhbGxvY2F0aW9uIGZhaWxzLCBkb24ndCBpc3N1ZSBhbnkgd2FybmluZ3MuCiAgKgogICogJV9fR0ZQX1JFUEVBVCAtIElmIGFsbG9jYXRpb24gZmFpbHMgaW5pdGlhbGx5LCB0cnkgb25jZSBtb3JlIGJlZm9yZSBmYWlsaW5nLgorICoKKyAqIFRoZXJlIGFyZSBvdGhlciBmbGFncyBhdmFpbGFibGUgYXMgd2VsbCwgYnV0IHRoZXNlIGFyZSBub3QgaW50ZW5kZWQKKyAqIGZvciBnZW5lcmFsIHVzZSwgYW5kIHNvIGFyZSBub3QgZG9jdW1lbnRlZCBoZXJlLiBGb3IgYSBmdWxsIGxpc3Qgb2YKKyAqIHBvdGVudGlhbCBmbGFncywgYWx3YXlzIHJlZmVyIHRvIGxpbnV4L2dmcC5oLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQorc3RhdGljIGlubGluZSB2b2lkICprY2FsbG9jKHNpemVfdCBuLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7Ci0JcmV0dXJuIF9fa21hbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKG4gIT0gMCAmJiBzaXplID4gVUxPTkdfTUFYIC8gbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIF9fa21hbGxvYyhuICogc2l6ZSwgZmxhZ3MgfCBfX0dGUF9aRVJPKTsKIH0KIAorI2lmICFkZWZpbmVkKENPTkZJR19OVU1BKSAmJiAhZGVmaW5lZChDT05GSUdfU0xPQikKIC8qKgotICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIGttYWxsb2Nfbm9kZSAtIGFsbG9jYXRlIG1lbW9yeSBmcm9tIGEgc3BlY2lmaWMgbm9kZQogICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGttYWxsb2MpLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrY2FsbG9jKS4KKyAqIEBub2RlOiBub2RlIHRvIGFsbG9jYXRlIGZyb20uCisgKgorICoga21hbGxvYygpIGZvciBub24tbG9jYWwgbm9kZXMsIHVzZWQgdG8gYWxsb2NhdGUgZnJvbSBhIHNwZWNpZmljIG5vZGUKKyAqIGlmIGF2YWlsYWJsZS4gRXF1aXZhbGVudCB0byBrbWFsbG9jKCkgaW4gdGhlIG5vbi1OVU1BIHNpbmdsZS1ub2RlCisgKiBjYXNlLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgQ09ORklHX05VTUEKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOwpAQCAtMjAwLDcgKzE5OSwxNSBAQAogewogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQotI2VuZGlmIC8qICFDT05GSUdfTlVNQSAqLworCit2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKKworc3RhdGljIGlubGluZSB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCQkJZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOworfQorI2VuZGlmIC8qICFDT05GSUdfTlVNQSAmJiAhQ09ORklHX1NMT0IgKi8KIAogLyoKICAqIGttYWxsb2NfdHJhY2tfY2FsbGVyIGlzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGttYWxsb2MgdGhhdCByZWNvcmRzIHRoZQpAQCAtMjQ1LDYgKzI1MiwyMyBAQAogCiAjZW5kaWYgLyogREVCVUdfU0xBQiAqLwogCisvKgorICogU2hvcnRjdXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmssIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGssIGZsYWdzIHwgX19HRlBfWkVSTyk7Cit9CisKKy8qKgorICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrbWFsbG9jKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyB8IF9fR0ZQX1pFUk8pOworfQorCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9MSU5VWF9TTEFCX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDhkODFhNjAuLjMyYmRjMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTI1LDEwICsyNSwxNyBAQAogfTsKIGV4dGVybiBzdHJ1Y3QgY2FjaGVfc2l6ZXMgbWFsbG9jX3NpemVzW107CiAKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwordm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CiAJCWludCBpID0gMDsKKworCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwogI2RlZmluZSBDQUNIRSh4KSBcCiAJCWlmIChzaXplIDw9IHgpIFwKIAkJCWdvdG8gZm91bmQ7IFwKQEAgLTUxLDM5ICs1OCwxOCBAQAogCXJldHVybiBfX2ttYWxsb2Moc2l6ZSwgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewotCQlpbnQgaSA9IDA7Ci0jZGVmaW5lIENBQ0hFKHgpIFwKLQkJaWYgKHNpemUgPD0geCkgXAotCQkJZ290byBmb3VuZDsgXAotCQllbHNlIFwKLQkJCWkrKzsKLSNpbmNsdWRlICJrbWFsbG9jX3NpemVzLmgiCi0jdW5kZWYgQ0FDSEUKLQkJewotCQkJZXh0ZXJuIHZvaWQgX195b3VfY2Fubm90X2t6YWxsb2NfdGhhdF9tdWNoKHZvaWQpOwotCQkJX195b3VfY2Fubm90X2t6YWxsb2NfdGhhdF9tdWNoKCk7Ci0JCX0KLWZvdW5kOgotI2lmZGVmIENPTkZJR19aT05FX0RNQQotCQlpZiAoZmxhZ3MgJiBHRlBfRE1BKQotCQkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKG1hbGxvY19zaXplc1tpXS5jc19kbWFjYWNoZXAsCi0JCQkJCQlmbGFncyk7Ci0jZW5kaWYKLQkJcmV0dXJuIGttZW1fY2FjaGVfemFsbG9jKG1hbGxvY19zaXplc1tpXS5jc19jYWNoZXAsIGZsYWdzKTsKLQl9Ci0JcmV0dXJuIF9fa3phbGxvYyhzaXplLCBmbGFncyk7Ci19Ci0KICNpZmRlZiBDT05GSUdfTlVNQQogZXh0ZXJuIHZvaWQgKl9fa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOworZXh0ZXJuIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewogCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkgewogCQlpbnQgaSA9IDA7CisKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisKICNkZWZpbmUgQ0FDSEUoeCkgXAogCQlpZiAoc2l6ZSA8PSB4KSBcCiAJCQlnb3RvIGZvdW5kOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3Nsb2JfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkYWYyZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc2xvYl9kZWYuaApAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIF9fTElOVVhfU0xPQl9ERUZfSAorI2RlZmluZSBfX0xJTlVYX1NMT0JfREVGX0gKKwordm9pZCAqa21lbV9jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlcCwgZmxhZ3MsIC0xKTsKK30KKwordm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJcmV0dXJuIF9fa21hbGxvY19ub2RlKHNpemUsIGZsYWdzLCBub2RlKTsKK30KKworLyoqCisgKiBrbWFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5CisgKiBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga2NhbGxvYykuCisgKgorICoga21hbGxvYyBpcyB0aGUgbm9ybWFsIG1ldGhvZCBvZiBhbGxvY2F0aW5nIG1lbW9yeQorICogaW4gdGhlIGtlcm5lbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICprbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwlyZXR1cm4gX19rbWFsbG9jX25vZGUoc2l6ZSwgZmxhZ3MsIC0xKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpfX2ttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworLyoqCisgKiBremFsbG9jIC0gYWxsb2NhdGUgbWVtb3J5LiBUaGUgbWVtb3J5IGlzIHNldCB0byB6ZXJvLgorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZSAoc2VlIGtjYWxsb2MpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmt6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBfX2t6YWxsb2Moc2l6ZSwgZmxhZ3MpOworfQorCisjZW5kaWYgLyogX19MSU5VWF9TTE9CX0RFRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKaW5kZXggNjIwN2EzZC4uMDdmN2U0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaApAQCAtMTYsNyArMTYsOSBAQAogCXVuc2lnbmVkIGxvbmcgbnJfcGFydGlhbDsKIAlhdG9taWNfbG9uZ190IG5yX3NsYWJzOwogCXN0cnVjdCBsaXN0X2hlYWQgcGFydGlhbDsKKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCXN0cnVjdCBsaXN0X2hlYWQgZnVsbDsKKyNlbmRpZgogfTsKIAogLyoKQEAgLTQ0LDcgKzQ2LDkgQEAKIAlpbnQgYWxpZ247CQkvKiBBbGlnbm1lbnQgKi8KIAljb25zdCBjaGFyICpuYW1lOwkvKiBOYW1lIChvbmx5IGZvciBkaXNwbGF5ISkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIExpc3Qgb2Ygc2xhYiBjYWNoZXMgKi8KKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CS8qIEZvciBzeXNmcyAqLworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTlVNQQogCWludCBkZWZyYWdfcmF0aW87CkBAIC0xNTksMTcgKzE2Myw4IEBACiAjZGVmaW5lIFNMVUJfRE1BIDAKICNlbmRpZgogCi0KLS8qCi0gKiBaRVJPX1NJWkVfUFRSIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHplcm8gc2l6ZWQga21hbGxvYyByZXF1ZXN0cy4KLSAqCi0gKiBEZXJlZmVyZW5jaW5nIFpFUk9fU0laRV9QVFIgd2lsbCBsZWFkIHRvIGEgZGlzdGluY3QgYWNjZXNzIGZhdWx0LgotICoKLSAqIFpFUk9fU0laRV9QVFIgY2FuIGJlIHBhc3NlZCB0byBrZnJlZSB0aG91Z2ggaW4gdGhlIHNhbWUgd2F5IHRoYXQgTlVMTCBjYW4uCi0gKiBCb3RoIG1ha2Uga2ZyZWUgYSBuby1vcC4KLSAqLwotI2RlZmluZSBaRVJPX1NJWkVfUFRSICgodm9pZCAqKTE2KQotCit2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90KTsKK3ZvaWQgKl9fa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewpAQCAtMTg0LDIxICsxNzksOSBAQAogCQlyZXR1cm4gX19rbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKLXsKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkgJiYgIShmbGFncyAmIFNMVUJfRE1BKSkgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGttYWxsb2Nfc2xhYihzaXplKTsKLQotCQlpZiAoIXMpCi0JCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKLQotCQlyZXR1cm4ga21lbV9jYWNoZV96YWxsb2MocywgZmxhZ3MpOwotCX0gZWxzZQotCQlyZXR1cm4gX19remFsbG9jKHNpemUsIGZsYWdzKTsKLX0KLQogI2lmZGVmIENPTkZJR19OVU1BCi1leHRlcm4gdm9pZCAqX19rbWFsbG9jX25vZGUoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7Cit2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKK3ZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCBmbGFncywgaW50IG5vZGUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oIGIvaW5jbHVkZS9saW51eC9zbXBfbG9jay5oCmluZGV4IGNmNzE1YTQuLjU4OTYyYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wX2xvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcF9sb2NrLmgKQEAgLTMsNyArMyw2IEBACiAKICNpZmRlZiBDT05GSUdfTE9DS19LRVJORUwKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKICNkZWZpbmUga2VybmVsX2xvY2tlZCgpCQkoY3VycmVudC0+bG9ja19kZXB0aCA+PSAwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCBmZTE5NWM5Li5mODUyZTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTI1Myw2ICsyNTMsOSBAQAogCiAjZGVmaW5lIE1TR19FT0YgICAgICAgICBNU0dfRklOCiAKKyNkZWZpbmUgTVNHX0NNU0dfQ0xPRVhFQyAweDQwMDAwMDAwCS8qIFNldCBjbG9zZV9vbl9leGl0IGZvciBmaWxlCisJCQkJCSAgIGRlc2NyaXB0b3IgcmVjZWl2ZWQgdGhyb3VnaAorCQkJCQkgICBTQ01fUklHSFRTICovCiAjaWYgZGVmaW5lZChDT05GSUdfQ09NUEFUKQogI2RlZmluZSBNU0dfQ01TR19DT01QQVQJMHg4MDAwMDAwMAkvKiBUaGlzIG1lc3NhZ2UgbmVlZHMgMzIgYml0IGZpeHVwcyAqLwogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ueXBpLmggYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCmluZGV4IDM0ZDRiMDcuLjQwYzdiNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ueXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zb255cGkuaApAQCAtMTUzLDggKzE1Myw2IEBACiAjZGVmaW5lIFNPTllQSV9DT01NQU5EX0dFVENBTUVSQVJPTVZFUlNJT04JMTgJLyogb2Jzb2xldGUgKi8KICNkZWZpbmUgU09OWVBJX0NPTU1BTkRfR0VUQ0FNRVJBUkVWSVNJT04JMTkJLyogb2Jzb2xldGUgKi8KIAotaW50IHNvbnlwaV9jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpOwotCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJCQkJLyogX1NPTllQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAppbmRleCAxYmU1ZWEwLi4zMDJiODFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaApAQCAtNzYsNiArNzYsNyBAQAogI2RlZmluZQlTUElfTU9ERV8zCShTUElfQ1BPTHxTUElfQ1BIQSkKICNkZWZpbmUJU1BJX0NTX0hJR0gJMHgwNAkJCS8qIGNoaXBzZWxlY3QgYWN0aXZlIGhpZ2g/ICovCiAjZGVmaW5lCVNQSV9MU0JfRklSU1QJMHgwOAkJCS8qIHBlci13b3JkIGJpdHMtb24td2lyZSAqLworI2RlZmluZQlTUElfM1dJUkUJMHgxMAkJCS8qIFNJL1NPIHNpZ25hbHMgc2hhcmVkICovCiAJdTgJCQliaXRzX3Blcl93b3JkOwogCWludAkJCWlycTsKIAl2b2lkCQkJKmNvbnRyb2xsZXJfc3RhdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpX2JpdGJhbmcuaAppbmRleCA5ZGJjYTYyLi5iOGRiMzJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGlfYml0YmFuZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaV9iaXRiYW5nLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXF1ZXVlOwogCXU4CQkJYnVzeTsKIAl1OAkJCXVzZV9kbWE7CisJdTgJCQlmbGFnczsJCS8qIGV4dHJhIHNwaS0+bW9kZSBzdXBwb3J0ICovCiAKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS90bGU2MngwLmggYi9pbmNsdWRlL2xpbnV4L3NwaS90bGU2MngwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiNTkxOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3RsZTYyeDAuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogdGxlNjJ4MC5oIC0gcGxhdGZvcm0gZ2x1ZSB0byBJbmZpbmVvbiBUTEU2MngwIGRyaXZlciBjaGlwcworICoKKyAqIENvcHlyaWdodCAyMDA3IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKK3N0cnVjdCB0bGU2MngwX3BkYXRhIHsKKwl1bnNpZ25lZCBpbnQJCWluaXRfc3RhdGU7CisJdW5zaWduZWQgaW50CQlncGlvX2NvdW50OworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAppbmRleCBhOTQ2MTc2Li5jMzc2ZjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCkBAIC0yODIsNiArMjgyLDEzIEBACiAJMSA6ICh7IGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsgMDsgfSk7IFwKIH0pCiAKKyNkZWZpbmUgd3JpdGVfdHJ5bG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKSBcCisoeyBcCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOyBcCisJd3JpdGVfdHJ5bG9jayhsb2NrKSA/IFwKKwkxIDogKHsgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyAwOyB9KTsgXAorfSkKKwogLyoKICAqIExvY2tzIHR3byBzcGlubG9ja3MgbDEgYW5kIGwyLgogICogbDFfZmlyc3QgaW5kaWNhdGVzIGlmIHNwaW5sb2NrIGwxIHNob3VsZCBiZSB0YWtlbiBmaXJzdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2dzc19hcGkuaAppbmRleCBiYmFjMTAxLi40NTljNWZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9nc3NfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZ3NzX2FwaS5oCkBAIC01OCw2ICs1OCw3IEBACiB1MzIgZ3NzX2RlbGV0ZV9zZWNfY29udGV4dCgKIAkJc3RydWN0IGdzc19jdHgJCSoqY3R4X2lkKTsKIAordTMyIGdzc19zdmNfdG9fcHNldWRvZmxhdm9yKHN0cnVjdCBnc3NfYXBpX21lY2ggKiwgdTMyIHNlcnZpY2UpOwogdTMyIGdzc19wc2V1ZG9mbGF2b3JfdG9fc2VydmljZShzdHJ1Y3QgZ3NzX2FwaV9tZWNoICosIHUzMiBwc2V1ZG9mbGF2b3IpOwogY2hhciAqZ3NzX3NlcnZpY2VfdG9fYXV0aF9kb21haW5fbmFtZShzdHJ1Y3QgZ3NzX2FwaV9tZWNoICosIHUzMiBzZXJ2aWNlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAppbmRleCAxMjlkNTBmLi44NTMxYTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmMuaApAQCAtMjEyLDYgKzIxMiw3IEBACiAJc3RydWN0IHN2Y19wb29sICoJcnFfcG9vbDsJLyogdGhyZWFkIHBvb2wgKi8KIAlzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZSAqCXJxX3Byb2NpbmZvOwkvKiBwcm9jZWR1cmUgaW5mbyAqLwogCXN0cnVjdCBhdXRoX29wcyAqCXJxX2F1dGhvcDsJLyogYXV0aGVudGljYXRpb24gZmxhdm91ciAqLworCXUzMgkJCXJxX2ZsYXZvcjsJLyogcHNldWRvZmxhdm9yICovCiAJc3RydWN0IHN2Y19jcmVkCQlycV9jcmVkOwkvKiBhdXRoIGluZm8gKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAqCXJxX3NrYnVmZjsJLyogZmFzdCByZWN2IGluZXQgYnVmZmVyICovCiAJc3RydWN0IHN2Y19kZWZlcnJlZF9yZXEqcnFfZGVmZXJyZWQ7CS8qIGRlZmVycmVkIHJlcXVlc3Qgd2UgYXJlIHJlcGxheWluZyAqLwpAQCAtMjQ4LDYgKzI0OSw3IEBACiAJCQkJCQkgKi8KIAkvKiBDYXRlcmluZyB0byBuZnNkICovCiAJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfY2xpZW50OwkvKiBSUEMgcGVlciBpbmZvICovCisJc3RydWN0IGF1dGhfZG9tYWluICoJcnFfZ3NzY2xpZW50OwkvKiAiZ3NzLyItc3R5bGUgcGVlciBpbmZvICovCiAJc3RydWN0IHN2Y19jYWNoZXJlcCAqCXJxX2NhY2hlcmVwOwkvKiBjYWNoZSBpbmZvICovCiAJc3RydWN0IGtuZnNkX2ZoICoJcnFfcmVmZmg7CS8qIFJlZmVycmVuY2UgZmlsZWhhbmRsZSwgdXNlZCB0bwogCQkJCQkJICogZGV0ZXJtaW5lIHdoYXQgZGV2aWNlIG51bWJlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aC5oCmluZGV4IGRlOTI2MTkuLjIyZTFlZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGguaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoLmgKQEAgLTEyNyw2ICsxMjcsNyBAQAogZXh0ZXJuIGludCBhdXRoX3VuaXhfZm9yZ2V0X29sZChzdHJ1Y3QgYXV0aF9kb21haW4gKmRvbSk7CiBleHRlcm4gdm9pZCBzdmNhdXRoX3VuaXhfcHVyZ2Uodm9pZCk7CiBleHRlcm4gdm9pZCBzdmNhdXRoX3VuaXhfaW5mb19yZWxlYXNlKHZvaWQgKik7CitleHRlcm4gaW50IHN2Y2F1dGhfdW5peF9zZXRfY2xpZW50KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaGFzaF9zdHIoY2hhciAqbmFtZSwgaW50IGJpdHMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc3ZjYXV0aF9nc3MuaAppbmRleCA1YTVkYjE2Li40MTdhMWRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9zdmNhdXRoX2dzcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3N2Y2F1dGhfZ3NzLmgKQEAgLTIyLDYgKzIyLDcgQEAKIGludCBnc3Nfc3ZjX2luaXQodm9pZCk7CiB2b2lkIGdzc19zdmNfc2h1dGRvd24odm9pZCk7CiBpbnQgc3ZjYXV0aF9nc3NfcmVnaXN0ZXJfcHNldWRvZmxhdm9yKHUzMiBwc2V1ZG9mbGF2b3IsIGNoYXIgKiBuYW1lKTsKK3UzMiBzdmNhdXRoX2dzc19mbGF2b3Ioc3RydWN0IGF1dGhfZG9tYWluICpkb20pOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9TVU5SUENfU1ZDQVVUSF9HU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCAwMDY4Njg4Li42NjVmODVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMTg4LDcgKzE4OCw4IEBACiBleHRlcm4gdm9pZCBzd2FwX3NldHVwKHZvaWQpOwogCiAvKiBsaW51eC9tbS92bXNjYW4uYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKiosIGdmcF90KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqem9uZXMsIGludCBvcmRlciwKKwkJCQkJZ2ZwX3QgZ2ZwX21hc2spOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF9tZW1vcnkodW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IHZtX3N3YXBwaW5lc3M7CiBleHRlcm4gaW50IHJlbW92ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Rhc2tzdGF0cy5oIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaAppbmRleCBhNDYxMDRhLi5kY2UxZWQyMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGFza3N0YXRzLmgKKysrIGIvaW5jbHVkZS9saW51eC90YXNrc3RhdHMuaApAQCAtMzEsNyArMzEsNyBAQAogICovCiAKIAotI2RlZmluZSBUQVNLU1RBVFNfVkVSU0lPTgk0CisjZGVmaW5lIFRBU0tTVEFUU19WRVJTSU9OCTUKICNkZWZpbmUgVFNfQ09NTV9MRU4JCTMyCS8qIHNob3VsZCBiZSA+PSBUQVNLX0NPTU1fTEVOCiAJCQkJCSAqIGluIGxpbnV4L3NjaGVkLmggKi8KIApAQCAtMTQ5LDYgKzE0OSw5IEBACiAJX191NjQJcmVhZF9ieXRlczsJCS8qIGJ5dGVzIG9mIHJlYWQgSS9PICovCiAJX191NjQJd3JpdGVfYnl0ZXM7CQkvKiBieXRlcyBvZiB3cml0ZSBJL08gKi8KIAlfX3U2NAljYW5jZWxsZWRfd3JpdGVfYnl0ZXM7CS8qIGJ5dGVzIG9mIGNhbmNlbGxlZCB3cml0ZSBJL08gKi8KKworCV9fdTY0ICBudmNzdzsJCQkvKiB2b2x1bnRhcnlfY3R4dF9zd2l0Y2hlcyAqLworCV9fdTY0ICBuaXZjc3c7CQkJLyogbm9udm9sdW50YXJ5X2N0eHRfc3dpdGNoZXMgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCBkZGE5YmU2Li5lYzNiMGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMzYsNyArMzYsOCBAQAogI2RlZmluZSBOU0VDX1BFUl9TRUMJMTAwMDAwMDAwMEwKICNkZWZpbmUgRlNFQ19QRVJfU0VDCTEwMDAwMDAwMDAwMDAwMDBMCiAKLXN0YXRpYyBpbmxpbmUgaW50IHRpbWVzcGVjX2VxdWFsKHN0cnVjdCB0aW1lc3BlYyAqYSwgc3RydWN0IHRpbWVzcGVjICpiKQorc3RhdGljIGlubGluZSBpbnQgdGltZXNwZWNfZXF1YWwoY29uc3Qgc3RydWN0IHRpbWVzcGVjICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpiKQogewogCXJldHVybiAoYS0+dHZfc2VjID09IGItPnR2X3NlYykgJiYgKGEtPnR2X25zZWMgPT0gYi0+dHZfbnNlYyk7CiB9CkBAIC0xMTYsNiArMTE3LDggQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgYWxhcm1fc2V0aXRpbWVyKHVuc2lnbmVkIGludCBzZWNvbmRzKTsKIGV4dGVybiBpbnQgZG9fZ2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUpOwogZXh0ZXJuIHZvaWQgZ2V0bnN0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dik7CitleHRlcm4gdm9pZCBnZXRib290dGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2V4dGVybiB2b2lkIG1vbm90b25pY190b19ib290YmFzZWQoc3RydWN0IHRpbWVzcGVjICp0cyk7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgdGltZXNwZWNfdHJ1bmMoc3RydWN0IHRpbWVzcGVjIHQsIHVuc2lnbmVkIGdyYW4pOwogZXh0ZXJuIGludCB0aW1la2VlcGluZ19pc19jb250aW51b3VzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lci5oIGIvaW5jbHVkZS9saW51eC90aW1lci5oCmluZGV4IGM2NjE3MTAuLjc4Y2Y4OTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKQEAgLTMsNyArMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogCiBzdHJ1Y3QgdHZlY190X2Jhc2VfczsKQEAgLTkxLDE2ICs5MCwxMyBAQAogICovCiAjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCiAKKyNkZWZpbmUgVElNRVJfU1RBVFNfRkxBR19ERUZFUlJBQkxFCTB4MQorCiBleHRlcm4gdm9pZCBpbml0X3RpbWVyX3N0YXRzKHZvaWQpOwogCiBleHRlcm4gdm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAotCQkJCSAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKLXsKLQl0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModGltZXIsIHRpbWVyLT5zdGFydF9waWQsIHRpbWVyLT5zdGFydF9zaXRlLAotCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tKTsKLX0KKwkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqY29tbSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lcl9mbGFnKTsKIAogZXh0ZXJuIHZvaWQgX190aW1lcl9zdGF0c190aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsCiAJCQkJCSAgICAgICB2b2lkICphZGRyKTsKQEAgLTExOSwxMCArMTE1LDYgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggYmI0NTc2MC4uNjkxYTE3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R0eS5oCkBAIC0xNzgsNiArMTc4LDcgQEAKICNkZWZpbmUgTF9JRVhURU4odHR5KQlfTF9GTEFHKCh0dHkpLElFWFRFTikKIAogc3RydWN0IGRldmljZTsKK3N0cnVjdCBzaWduYWxfc3RydWN0OwogLyoKICAqIFdoZXJlIGFsbCBvZiB0aGUgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGEgdHR5IGlzIGtlcHQgd2hpbGUgdGhlIHR0eQogICogaXMgb3Blbi4gIFNpbmNlIHRoZSB0ZXJtaW9zIHN0YXRlIHNob3VsZCBiZSBrZXB0IGV2ZW4gaWYgdGhlIHR0eQpAQCAtMzEwLDYgKzMxMSw3IEBACiBleHRlcm4gdm9pZCB0dHlfdmhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CiBleHRlcm4gdm9pZCB0dHlfdW5oYW5ndXAoc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCB0dHlfaHVuZ191cF9wKHN0cnVjdCBmaWxlICogZmlscCk7CitleHRlcm4gaW50IGlzX3R0eShzdHJ1Y3QgZmlsZSAqZmlscCk7CiBleHRlcm4gdm9pZCBkb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gdm9pZCBfX2RvX1NBSyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiB2b2lkIGRpc2Fzc29jaWF0ZV9jdHR5KGludCBwcml2KTsKQEAgLTMzOCw5ICszNDAsNDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBtdXRleCB0dHlfbXV0ZXg7CiAKK2V4dGVybiB2b2lkIHR0eV93cml0ZV91bmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gaW50IHR0eV93cml0ZV9sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBuZGVsYXkpOworI2RlZmluZSB0dHlfaXNfd3JpdGVsb2NrZWQodHR5KSAgKG11dGV4X2lzX2xvY2tlZCgmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpCisKKworCiAvKiBuX3R0eS5jICovCiBleHRlcm4gc3RydWN0IHR0eV9sZGlzYyB0dHlfbGRpc2NfTl9UVFk7CiAKKy8qIHR0eV9hdWRpdC5jICovCisjaWZkZWYgQ09ORklHX0FVRElUCitleHRlcm4gdm9pZCB0dHlfYXVkaXRfYWRkX2RhdGEoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIHR0eV9hdWRpdF9mb3JrKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpOworZXh0ZXJuIHZvaWQgdHR5X2F1ZGl0X3B1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfcHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1aWRfdCBsb2dpbnVpZCk7CitleHRlcm4gdm9pZCB0dHlfYXVkaXRfb3BlbmluZyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X2FkZF9kYXRhKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X2V4aXQodm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0dHlfYXVkaXRfZm9yayhzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHR0eV9hdWRpdF9wdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X3B1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdWlkX3QgbG9naW51aWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdHR5X2F1ZGl0X29wZW5pbmcodm9pZCkKK3sKK30KKyNlbmRpZgorCiAvKiB0dHlfaW9jdGwuYyAqLwogZXh0ZXJuIGludCBuX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91aW8uaCBiL2luY2x1ZGUvbGludXgvdWlvLmgKaW5kZXggOWFmOGJiYy4uYjdmZTEzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91aW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vpby5oCkBAIC0xMywxMCArMTMsNiBAQAogICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotCi0vKiBBIHdvcmQgb2Ygd2FybmluZzogT3VyIHVpbyBzdHJ1Y3R1cmUgd2lsbCBjbGFzaCB3aXRoIHRoZSBDIGxpYnJhcnkgb25lICh3aGljaCBpcyBub3cgb2Jzb2xldGUpLiBSZW1vdmUgdGhlIEMKLSAgIGxpYnJhcnkgb25lIGZyb20gc3lzL3Vpby5oIGlmIHlvdSBoYXZlIGEgdmVyeSBvbGQgbGlicmFyeSBzZXQgKi8KLQogc3RydWN0IGlvdmVjCiB7CiAJdm9pZCBfX3VzZXIgKmlvdl9iYXNlOwkvKiBCU0QgdXNlcyBjYWRkcl90ICgxMDAzLjFnIHJlcXVpcmVzIHZvaWQgKikgKi8KQEAgLTM4LDExICszNCw2IEBACiAgCiAjZGVmaW5lIFVJT19GQVNUSU9WCTgKICNkZWZpbmUgVUlPX01BWElPVgkxMDI0Ci0jaWYgMAotI2RlZmluZSBVSU9fTUFYSU9WCTE2CS8qIE1heGltdW0gaW92ZWMncyBpbiBvbmUgb3BlcmF0aW9uIAotCQkJCSAgIDE2IG1hdGNoZXMgQlNEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJlZyBwYXJkb246IEJTRCBoYXMgMTAyNCAtLUFOSyAqLwotI2VuZGlmCiAKIC8qCiAgKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgY292ZXJlZCBieSBhbiBpb3ZlYy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMyMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCkBAIC0wLDAgKzEsNjEgQEAKKyNpZm5kZWYgX0xJTlVYX1VTRVJfTkFNRVNQQUNFX0gKKyNkZWZpbmUgX0xJTlVYX1VTRVJfTkFNRVNQQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2RlZmluZSBVSURIQVNIX0JJVFMJKENPTkZJR19CQVNFX1NNQUxMID8gMyA6IDgpCisjZGVmaW5lIFVJREhBU0hfU1oJKDEgPDwgVUlESEFTSF9CSVRTKQorCitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgeworCXN0cnVjdCBrcmVmCQlrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQJdWlkaGFzaF90YWJsZVtVSURIQVNIX1NaXTsKKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJKnJvb3RfdXNlcjsKK307CisKK2V4dGVybiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgaW5pdF91c2VyX25zOworCisjaWZkZWYgQ09ORklHX1VTRVJfTlMKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmdldF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJaWYgKG5zKQorCQlrcmVmX2dldCgmbnMtPmtyZWYpOworCXJldHVybiBuczsKK30KKworZXh0ZXJuIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY29weV91c2VyX25zKGludCBmbGFncywKKwkJCQkJICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpOworZXh0ZXJuIHZvaWQgZnJlZV91c2VyX25zKHN0cnVjdCBrcmVmICprcmVmKTsKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJaWYgKG5zKQorCQlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfdXNlcl9ucyk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpnZXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiAmaW5pdF91c2VyX25zOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY29weV91c2VyX25zKGludCBmbGFncywKKwkJCQkJCSAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpCit7CisJaWYgKGZsYWdzICYgQ0xPTkVfTkVXVVNFUikKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAppbmRleCBmOGQzYjMyLi45MjNkYjk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtNDgsMjYgKzQ4LDE0IEBACiAJa3JlZl9nZXQoJm5zLT5rcmVmKTsKIH0KIAotI2lmZGVmIENPTkZJR19VVFNfTlMKLWV4dGVybiBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKGludCBmbGFncywgc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKTsKK2V4dGVybiBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpucyk7CiBleHRlcm4gdm9pZCBmcmVlX3V0c19ucyhzdHJ1Y3Qga3JlZiAqa3JlZik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXRzX25zKHN0cnVjdCB1dHNfbmFtZXNwYWNlICpucykKIHsKIAlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfdXRzX25zKTsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpjb3B5X3V0c25hbWUoaW50IGZsYWdzLAotCQkJCQkJc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKQotewotCXJldHVybiBuczsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF91dHNfbnMoc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKQotewotfQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ld191dHNuYW1lICp1dHNuYW1lKHZvaWQpCiB7CiAJcmV0dXJuICZjdXJyZW50LT5uc3Byb3h5LT51dHNfbnMtPm5hbWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IDRiN2VlODMuLjEzMmIyNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCkBAIC02NSw5ICs2NSwxMCBAQAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBub2RlLAogCQkJCQkgIGdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiBzdHJ1Y3Qgdm1fc3RydWN0ICpyZW1vdmVfdm1fYXJlYSh2b2lkICphZGRyKTsKKwogZXh0ZXJuIGludCBtYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhLCBwZ3Byb3RfdCBwcm90LAogCQkJc3RydWN0IHBhZ2UgKioqcGFnZXMpOwotZXh0ZXJuIHZvaWQgdW5tYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKTsKK2V4dGVybiB2b2lkIHVubWFwX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKIC8qCiAgKglJbnRlcm5hbHMuICBEb250J3QgdXNlLi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1zdGF0LmggYi9pbmNsdWRlL2xpbnV4L3Ztc3RhdC5oCmluZGV4IGQ5MzI1Y2YuLjc1MzcwZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1zdGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC92bXN0YXQuaApAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBISUdITUVNX1pPTkUoeHgpCiAjZW5kaWYKIAotI2RlZmluZSBGT1JfQUxMX1pPTkVTKHh4KSBETUFfWk9ORSh4eCkgRE1BMzJfWk9ORSh4eCkgeHgjI19OT1JNQUwgSElHSE1FTV9aT05FKHh4KQorI2RlZmluZSBGT1JfQUxMX1pPTkVTKHh4KSBETUFfWk9ORSh4eCkgRE1BMzJfWk9ORSh4eCkgeHgjI19OT1JNQUwgSElHSE1FTV9aT05FKHh4KSAsIHh4IyNfTU9WQUJMRQogCiBlbnVtIHZtX2V2ZW50X2l0ZW0geyBQR1BHSU4sIFBHUEdPVVQsIFBTV1BJTiwgUFNXUE9VVCwKIAkJRk9SX0FMTF9aT05FUyhQR0FMTE9DKSwKQEAgLTE3MCw3ICsxNzAsOCBAQAogI2lmZGVmIENPTkZJR19ISUdITUVNCiAJCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9ISUdITUVNXSwgaXRlbSkgKwogI2VuZGlmCi0JCXpvbmVfcGFnZV9zdGF0ZSgmem9uZXNbWk9ORV9OT1JNQUxdLCBpdGVtKTsKKwkJem9uZV9wYWdlX3N0YXRlKCZ6b25lc1taT05FX05PUk1BTF0sIGl0ZW0pICsKKwkJem9uZV9wYWdlX3N0YXRlKCZ6b25lc1taT05FX01PVkFCTEVdLCBpdGVtKTsKIH0KIAogZXh0ZXJuIHZvaWQgem9uZV9zdGF0aXN0aWNzKHN0cnVjdCB6b25lbGlzdCAqLCBzdHJ1Y3Qgem9uZSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdnRfa2Vybi5oIGIvaW5jbHVkZS9saW51eC92dF9rZXJuLmgKaW5kZXggZDk2MTYzNS4uNjk5YjdlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92dF9rZXJuLmgKKysrIGIvaW5jbHVkZS9saW51eC92dF9rZXJuLmgKQEAgLTc1LDYgKzc1LDggQEAKIGludCB2dF93YWl0YWN0aXZlKGludCB2dCk7CiB2b2lkIGNoYW5nZV9jb25zb2xlKHN0cnVjdCB2Y19kYXRhICpuZXdfdmMpOwogdm9pZCByZXNldF92YyhzdHJ1Y3QgdmNfZGF0YSAqdmMpOworZXh0ZXJuIGludCB1bmJpbmRfY29uX2RyaXZlcihjb25zdCBzdHJ1Y3QgY29uc3cgKmNzdywgaW50IGZpcnN0LCBpbnQgbGFzdCwKKwkJCSAgICAgaW50IGRlZmx0KTsKIAogLyoKICAqIHZjX3NjcmVlbi5jIHNoYXJlcyB0aGlzIHRlbXBvcmFyeSBidWZmZXIgd2l0aCB0aGUgY29uc29sZSB3cml0ZSBjb2RlIHNvIHRoYXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmggYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCmluZGV4IGNlMDcxOWEuLmNlNmJhZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaApAQCAtMTQ4LDcgKzE0OCw3IEBACiBleHRlcm4gdm9pZCBpbml0X3dvcmtxdWV1ZXModm9pZCk7CiBpbnQgZXhlY3V0ZV9pbl9wcm9jZXNzX2NvbnRleHQod29ya19mdW5jX3QgZm4sIHN0cnVjdCBleGVjdXRlX3dvcmsgKik7CiAKLWV4dGVybiB2b2lkIGNhbmNlbF93b3JrX3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybiBpbnQgY2FuY2VsX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKgogICogS2lsbCBvZmYgYSBwZW5kaW5nIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygpLiAgTm90ZSB0aGF0IHRoZSB3b3JrIGNhbGxiYWNrCkBAIC0xNjYsMTQgKzE2NiwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiB2b2lkIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqd29yayk7CitleHRlcm4gaW50IGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyhzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrKTsKIAotLyogT2Jzb2xldGUuIHVzZSBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKCkgKi8KKy8qIE9ic29sZXRlLiB1c2UgY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKIAkJCQkJc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKIHsKLQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHdvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyh3b3JrKTsKK30KKworLyogT2Jzb2xldGUuIHVzZSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoKSAqLworc3RhdGljIGlubGluZQordm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCit7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKHdvcmspOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjbS5oIGIvaW5jbHVkZS9uZXQvc2NtLmgKaW5kZXggNTYzN2Q1ZS4uNDIzY2IxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NtLmgKKysrIGIvaW5jbHVkZS9uZXQvc2NtLmgKQEAgLTgsNyArOCw3IEBACiAvKiBXZWxsLCB3ZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgZGVzY3JpcHRvciBvcGVuCiAgKiB0byBhY2NlcHQgcGFzc2VkIEZEcyA4KQogICovCi0jZGVmaW5lIFNDTV9NQVhfRkQJKE9QRU5fTUFYLTEpCisjZGVmaW5lIFNDTV9NQVhfRkQJMjU1CiAKIHN0cnVjdCBzY21fZnBfbGlzdAogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby90Z2FmYi5oIGIvaW5jbHVkZS92aWRlby90Z2FmYi5oCmluZGV4IDAzZDBkYmUuLjdiYzVlMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vdGdhZmIuaAorKysgYi9pbmNsdWRlL3ZpZGVvL3RnYWZiLmgKQEAgLTIxNiw2ICsyMTYsNyBAQAogCXUzMiBwbGxfZnJlcTsJCQkvKiBwaXhjbG9jayBpbiBtaHogKi8KIAl1MzIgYml0c19wZXJfcGl4ZWw7CQkvKiBiaXRzIHBlciBwaXhlbCAqLwogCXUzMiBzeW5jX29uX2dyZWVuOwkJLyogc2V0IGlmIHN5bmMgaXMgb24gZ3JlZW4gKi8KKwl1MzIgcGFsZXR0ZVsxNl07CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBkOWQ4NzhhLi5lMjA1NjgyIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0xMjAsMTUgKzEyMCw2IEBACiAJICBzZWN0aW9uIDYuNCBvZiB0aGUgTGludXggUHJvZ3JhbW1lcidzIEd1aWRlLCBhdmFpbGFibGUgZnJvbQogCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZ3VpZGVzLmh0bWw+LgogCi1jb25maWcgSVBDX05TCi0JYm9vbCAiSVBDIE5hbWVzcGFjZXMiCi0JZGVwZW5kcyBvbiBTWVNWSVBDCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU3VwcG9ydCBpcGMgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4gdmlydHVhbAotCSAgZW52aXJvbm1lbnRzLCB0byB1c2UgaXBjIG5hbWVzcGFjZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQgaXBjCi0JICBvYmplY3RzIGZvciBkaWZmZXJlbnQgc2VydmVycy4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBTWVNWSVBDX1NZU0NUTAogCWJvb2wKIAlkZXBlbmRzIG9uIFNZU1ZJUEMKQEAgLTIxOCwxMyArMjA5LDE0IEBACiAKIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotY29uZmlnIFVUU19OUwotCWJvb2wgIlVUUyBOYW1lc3BhY2VzIgorY29uZmlnIFVTRVJfTlMKKwlib29sICJVc2VyIE5hbWVzcGFjZXMgKEVYUEVSSU1FTlRBTCkiCiAJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCi0JICBTdXBwb3J0IHV0cyBuYW1lc3BhY2VzLiAgVGhpcyBhbGxvd3MgY29udGFpbmVycywgaS5lLgotCSAgdnNlcnZlcnMsIHRvIHVzZSB1dHMgbmFtZXNwYWNlcyB0byBwcm92aWRlIGRpZmZlcmVudAotCSAgdXRzIGluZm8gZm9yIGRpZmZlcmVudCBzZXJ2ZXJzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwkgIFN1cHBvcnQgdXNlciBuYW1lc3BhY2VzLiAgVGhpcyBhbGxvd3MgY29udGFpbmVycywgaS5lLgorCSAgdnNlcnZlcnMsIHRvIHVzZSB1c2VyIG5hbWVzcGFjZXMgdG8gcHJvdmlkZSBkaWZmZXJlbnQKKwkgIHVzZXIgaW5mbyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQVVESVQKIAlib29sICJBdWRpdGluZyBzdXBwb3J0IgpAQCAtNTU0LDcgKzU0Niw3IEBACiAKIGNob2ljZQogCXByb21wdCAiQ2hvb3NlIFNMQUIgYWxsb2NhdG9yIgotCWRlZmF1bHQgU0xBQgorCWRlZmF1bHQgU0xVQgogCWhlbHAKIAkgICBUaGlzIG9wdGlvbiBhbGxvd3MgdG8gc2VsZWN0IGEgc2xhYiBhbGxvY2F0b3IuCiAKQEAgLTU3Niw3ICs1NjgsNyBAQAogCSAgIGFuZCBoYXMgZW5oYW5jZWQgZGlhZ25vc3RpY3MuCiAKIGNvbmZpZyBTTE9CCi0JZGVwZW5kcyBvbiBFTUJFRERFRCAmJiAhU1BBUlNFTUVNCisJZGVwZW5kcyBvbiBFTUJFRERFRAogCWJvb2wgIlNMT0IgKFNpbXBsZSBBbGxvY2F0b3IpIgogCWhlbHAKIAkgICBTTE9CIHJlcGxhY2VzIHRoZSBTTEFCIGFsbG9jYXRvciB3aXRoIGEgZHJhc3RpY2FsbHkgc2ltcGxlcgpAQCAtNjAyLDkgKzU5NCw3IEBACiAJZGVmYXVsdCAwIGlmIEJBU0VfRlVMTAogCWRlZmF1bHQgMSBpZiAhQkFTRV9GVUxMCiAKLW1lbnUgIkxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0IgotCi1jb25maWcgTU9EVUxFUworbWVudWNvbmZpZyBNT0RVTEVTCiAJYm9vbCAiRW5hYmxlIGxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0IgogCWhlbHAKIAkgIEtlcm5lbCBtb2R1bGVzIGFyZSBzbWFsbCBwaWVjZXMgb2YgY29tcGlsZWQgY29kZSB3aGljaCBjYW4KQEAgLTY4NCw2ICs2NzQsNSBAQAogCWRlcGVuZHMgb24gKFNNUCAmJiBNT0RVTEVfVU5MT0FEKSB8fCBIT1RQTFVHX0NQVQogCWhlbHAKIAkgIE5lZWQgc3RvcF9tYWNoaW5lKCkgcHJpbWl0aXZlLgotZW5kbWVudQogCiBzb3VyY2UgImJsb2NrL0tjb25maWciCmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCA0NmZlNDA3Li40ZWZhMWU1IDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTI1LDYgKzI1LDcgQEAKIGludCByb290X21vdW50ZmxhZ3MgPSBNU19SRE9OTFkgfCBNU19TSUxFTlQ7CiBjaGFyICogX19pbml0ZGF0YSByb290X2RldmljZV9uYW1lOwogc3RhdGljIGNoYXIgX19pbml0ZGF0YSBzYXZlZF9yb290X25hbWVbNjRdOworc3RhdGljIGludCBfX2luaXRkYXRhIHJvb3Rfd2FpdDsKIAogZGV2X3QgUk9PVF9ERVY7CiAKQEAgLTIxNiw2ICsyMTcsMTYgQEAKIAogX19zZXR1cCgicm9vdD0iLCByb290X2Rldl9zZXR1cCk7CiAKK3N0YXRpYyBpbnQgX19pbml0IHJvb3R3YWl0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoKnN0cikKKwkJcmV0dXJuIDA7CisJcm9vdF93YWl0ID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicm9vdHdhaXQiLCByb290d2FpdF9zZXR1cCk7CisKIHN0YXRpYyBjaGFyICogX19pbml0ZGF0YSByb290X21vdW50X2RhdGE7CiBzdGF0aWMgaW50IF9faW5pdCByb290X2RhdGFfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtNDM4LDExICs0NDksMjAgQEAKIAkJCXJvb3RfZGV2aWNlX25hbWUgKz0gNTsKIAl9CiAKLQlpc19mbG9wcHkgPSBNQUpPUihST09UX0RFVikgPT0gRkxPUFBZX01BSk9SOwotCiAJaWYgKGluaXRyZF9sb2FkKCkpCiAJCWdvdG8gb3V0OwogCisJLyogd2FpdCBmb3IgYW55IGFzeW5jaHJvbm91cyBzY2FubmluZyB0byBjb21wbGV0ZSAqLworCWlmICgoUk9PVF9ERVYgPT0gMCkgJiYgcm9vdF93YWl0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIldhaXRpbmcgZm9yIHJvb3QgZGV2aWNlICVzLi4uXG4iLAorCQkJc2F2ZWRfcm9vdF9uYW1lKTsKKwkJd2hpbGUgKGRyaXZlcl9wcm9iZV9kb25lKCkgIT0gMCB8fAorCQkJKFJPT1RfREVWID0gbmFtZV90b19kZXZfdChzYXZlZF9yb290X25hbWUpKSA9PSAwKQorCQkJbXNsZWVwKDEwMCk7CisJfQorCisJaXNfZmxvcHB5ID0gTUFKT1IoUk9PVF9ERVYpID09IEZMT1BQWV9NQUpPUjsKKwogCWlmIChpc19mbG9wcHkgJiYgcmRfZG9sb2FkICYmIHJkX2xvYWRfZGlzaygwKSkKIAkJUk9PVF9ERVYgPSBSb290X1JBTTA7CiAKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKaW5kZXggYjIyMmNlOS4uYTZiNGMwYyAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKKysrIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKQEAgLTU2LDEyICs1Niw5IEBACiAJc3lzX2Nocm9vdCgiLiIpOwogCiAJcGlkID0ga2VybmVsX3RocmVhZChkb19saW51eHJjLCAiL2xpbnV4cmMiLCBTSUdDSExEKTsKLQlpZiAocGlkID4gMCkgewotCQl3aGlsZSAocGlkICE9IHN5c193YWl0NCgtMSwgTlVMTCwgMCwgTlVMTCkpIHsKLQkJCXRyeV90b19mcmVlemUoKTsKKwlpZiAocGlkID4gMCkKKwkJd2hpbGUgKHBpZCAhPSBzeXNfd2FpdDQoLTEsIE5VTEwsIDAsIE5VTEwpKQogCQkJeWllbGQoKTsKLQkJfQotCX0KIAogCS8qIG1vdmUgaW5pdHJkIHRvIHJvb3RmcycgL29sZCAqLwogCXN5c19mY2hkaXIob2xkX2ZkKTsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggMGViMWM3NC4uZDNiY2IzYiAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTEzMiwyMCArMTMyLDkgQEAKIHN0YXRpYyBjaGFyICpleGVjdXRlX2NvbW1hbmQ7CiBzdGF0aWMgY2hhciAqcmFtZGlza19leGVjdXRlX2NvbW1hbmQ7CiAKKyNpZmRlZiBDT05GSUdfU01QCiAvKiBTZXR1cCBjb25maWd1cmVkIG1heGltdW0gbnVtYmVyIG9mIENQVXMgdG8gYWN0aXZhdGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2NwdXMgPSBOUl9DUFVTOwotCi0vKgotICogSWYgc2V0LCB0aGlzIGlzIGFuIGluZGljYXRpb24gdG8gdGhlIGRyaXZlcnMgdGhhdCByZXNldCB0aGUgdW5kZXJseWluZwotICogZGV2aWNlIGJlZm9yZSBnb2luZyBhaGVhZCB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZHJpdmVyIG1pZ2h0Ci0gKiByZWx5IG9uIHRoZSBCSU9TIGFuZCBza2lwIHRoZSByZXNldCBvcGVyYXRpb24uCi0gKgotICogVGhpcyBpcyB1c2VmdWwgaWYga2VybmVsIGlzIGJvb3RpbmcgaW4gYW4gdW5yZWxpYWJsZSBlbnZpcm9ubWVudC4KLSAqIEZvciBleC4ga2R1bXAgc2l0dWFpdG9uIHdoZXJlIHByZXZpb3VzIGtlcm5lbCBoYXMgY3Jhc2hlZCwgQklPUyBoYXMgYmVlbgotICogc2tpcHBlZCBhbmQgZGV2aWNlcyB3aWxsIGJlIGluIHVua25vd24gc3RhdGUuCi0gKi8KLXVuc2lnbmVkIGludCByZXNldF9kZXZpY2VzOwotRVhQT1JUX1NZTUJPTChyZXNldF9kZXZpY2VzKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBtYXhfY3B1cyA9IE5SX0NQVVM7CiAKIC8qCiAgKiBTZXR1cCByb3V0aW5lIGZvciBjb250cm9sbGluZyBTTVAgYWN0aXZhdGlvbgpAQCAtMTYwLDEwICsxNDksMTAgQEAKIHN0YXRpYyBpbnQgX19pbml0IG5vc21wKGNoYXIgKnN0cikKIHsKIAltYXhfY3B1cyA9IDA7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKLV9fc2V0dXAoIm5vc21wIiwgbm9zbXApOworZWFybHlfcGFyYW0oIm5vc21wIiwgbm9zbXApOwogCiBzdGF0aWMgaW50IF9faW5pdCBtYXhjcHVzKGNoYXIgKnN0cikKIHsKQEAgLTE3Miw2ICsxNjEsMjEgQEAKIH0KIAogX19zZXR1cCgibWF4Y3B1cz0iLCBtYXhjcHVzKTsKKyNlbHNlCisjZGVmaW5lIG1heF9jcHVzIE5SX0NQVVMKKyNlbmRpZgorCisvKgorICogSWYgc2V0LCB0aGlzIGlzIGFuIGluZGljYXRpb24gdG8gdGhlIGRyaXZlcnMgdGhhdCByZXNldCB0aGUgdW5kZXJseWluZworICogZGV2aWNlIGJlZm9yZSBnb2luZyBhaGVhZCB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBvdGhlcndpc2UgZHJpdmVyIG1pZ2h0CisgKiByZWx5IG9uIHRoZSBCSU9TIGFuZCBza2lwIHRoZSByZXNldCBvcGVyYXRpb24uCisgKgorICogVGhpcyBpcyB1c2VmdWwgaWYga2VybmVsIGlzIGJvb3RpbmcgaW4gYW4gdW5yZWxpYWJsZSBlbnZpcm9ubWVudC4KKyAqIEZvciBleC4ga2R1bXAgc2l0dWFpdG9uIHdoZXJlIHByZXZpb3VzIGtlcm5lbCBoYXMgY3Jhc2hlZCwgQklPUyBoYXMgYmVlbgorICogc2tpcHBlZCBhbmQgZGV2aWNlcyB3aWxsIGJlIGluIHVua25vd24gc3RhdGUuCisgKi8KK3Vuc2lnbmVkIGludCByZXNldF9kZXZpY2VzOworRVhQT1JUX1NZTUJPTChyZXNldF9kZXZpY2VzKTsKIAogc3RhdGljIGludCBfX2luaXQgc2V0X3Jlc2V0X2RldmljZXMoY2hhciAqc3RyKQogewpAQCAtMzg1LDYgKzM4OSwxMCBAQAogewogCXVuc2lnbmVkIGludCBjcHU7CiAKKyNpZm5kZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJY3B1X3Bvc3NpYmxlX21hcCA9IGNwdV9wcmVzZW50X21hcDsKKyNlbmRpZgorCiAJLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gdXNlcnNwYWNlIC0tUlIgKi8KIAlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKIAkJaWYgKG51bV9vbmxpbmVfY3B1cygpID49IG1heF9jcHVzKQpAQCAtNDUzLDcgKzQ2MSwxMCBAQAogCXN0cnVjdCBvYnNfa2VybmVsX3BhcmFtICpwOwogCiAJZm9yIChwID0gX19zZXR1cF9zdGFydDsgcCA8IF9fc2V0dXBfZW5kOyBwKyspIHsKLQkJaWYgKHAtPmVhcmx5ICYmIHN0cmNtcChwYXJhbSwgcC0+c3RyKSA9PSAwKSB7CisJCWlmICgocC0+ZWFybHkgJiYgc3RyY21wKHBhcmFtLCBwLT5zdHIpID09IDApIHx8CisJCSAgICAoc3RyY21wKHBhcmFtLCAiY29uc29sZSIpID09IDAgJiYKKwkJICAgICBzdHJjbXAocC0+c3RyLCAiZWFybHljb24iKSA9PSAwKQorCQkpIHsKIAkJCWlmIChwLT5zZXR1cF9mdW5jKHZhbCkgIT0gMCkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJICAgICAgICJNYWxmb3JtZWQgZWFybHkgb3B0aW9uICclcydcbiIsIHBhcmFtKTsKQEAgLTUyNiw2ICs1MzcsMTAgQEAKIAlzZXR1cF9hcmNoKCZjb21tYW5kX2xpbmUpOwogCXNldHVwX2NvbW1hbmRfbGluZShjb21tYW5kX2xpbmUpOwogCXVud2luZF9zZXR1cCgpOworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlpZiAobWF4X2NwdXMgPCAyKQorCQljcHVfcG9zc2libGVfbWFwID0gY3B1X29ubGluZV9tYXA7CisjZW5kaWYKIAlzZXR1cF9wZXJfY3B1X2FyZWFzKCk7CiAJc21wX3ByZXBhcmVfYm9vdF9jcHUoKTsJLyogYXJjaC1zcGVjaWZpYyBib290LWNwdSBob29rcyAqLwogCkBAIC03MjUsNiArNzQwLDE1IEBACiAJZG9faW5pdGNhbGxzKCk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBub3NvZnRsb2NrdXA7CisKK3N0YXRpYyBpbnQgX19pbml0IG5vc29mdGxvY2t1cF9zZXR1cChjaGFyICpzdHIpCit7CisJbm9zb2Z0bG9ja3VwID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoIm5vc29mdGxvY2t1cCIsIG5vc29mdGxvY2t1cF9zZXR1cCk7CisKIHN0YXRpYyB2b2lkIF9faW5pdCBkb19wcmVfc21wX2luaXRjYWxscyh2b2lkKQogewogCWV4dGVybiBpbnQgc3Bhd25fa3NvZnRpcnFkKHZvaWQpOwpAQCAtNzM0LDcgKzc1OCw4IEBACiAJbWlncmF0aW9uX2luaXQoKTsKICNlbmRpZgogCXNwYXduX2tzb2Z0aXJxZCgpOwotCXNwYXduX3NvZnRsb2NrdXBfdGFzaygpOworCWlmICghbm9zb2Z0bG9ja3VwKQorCQlzcGF3bl9zb2Z0bG9ja3VwX3Rhc2soKTsKIH0KIAogc3RhdGljIHZvaWQgcnVuX2luaXRfcHJvY2VzcyhjaGFyICppbml0X2ZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvaXBjL21zZy5jIGIvaXBjL21zZy5jCmluZGV4IGEzODg4MjQuLmNiZDI3ZTUgMTAwNjQ0Ci0tLSBhL2lwYy9tc2cuYworKysgYi9pcGMvbXNnLmMKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbnQgc3lzdmlwY19tc2dfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faXBjX2luaXQgX19tc2dfaW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCitzdGF0aWMgdm9pZCBfX21zZ19pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKIHsKIAlucy0+aWRzW0lQQ19NU0dfSURTXSA9IGlkczsKIAlucy0+bXNnX2N0bG1heCA9IE1TR01BWDsKQEAgLTk2LDcgKzk2LDYgQEAKIAlpcGNfaW5pdF9pZHMoaWRzLCBucy0+bXNnX2N0bG1uaSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfSVBDX05TCiBpbnQgbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBpcGNfaWRzICppZHM7CkBAIC0xMjgsNyArMTI3LDYgQEAKIAlrZnJlZShucy0+aWRzW0lQQ19NU0dfSURTXSk7CiAJbnMtPmlkc1tJUENfTVNHX0lEU10gPSBOVUxMOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IG1zZ19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggOTk2NGIyMi4uODliZmRmZiAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAjZGVmaW5lIHNjX3NlbW9wbQlzZW1fY3Rsc1syXQogI2RlZmluZSBzY19zZW1tbmkJc2VtX2N0bHNbM10KIAotc3RhdGljIHZvaWQgX19pcGNfaW5pdCBfX3NlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKK3N0YXRpYyB2b2lkIF9fc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQogewogCW5zLT5pZHNbSVBDX1NFTV9JRFNdID0gaWRzOwogCW5zLT5zY19zZW1tc2wgPSBTRU1NU0w7CkBAIC0xMzIsNyArMTMyLDYgQEAKIAlpcGNfaW5pdF9pZHMoaWRzLCBucy0+c2Nfc2VtbW5pKTsKIH0KIAotI2lmZGVmIENPTkZJR19JUENfTlMKIGludCBzZW1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7CiAJc3RydWN0IGlwY19pZHMgKmlkczsKQEAgLTE2NCw3ICsxNjMsNiBAQAogCWtmcmVlKG5zLT5pZHNbSVBDX1NFTV9JRFNdKTsKIAlucy0+aWRzW0lQQ19TRU1fSURTXSA9IE5VTEw7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgc2VtX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggMDg1MmYyMC4uMjQyYzNmNiAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtNzcsNyArNzcsNyBAQAogc3RhdGljIGludCBzeXN2aXBjX3NobV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCk7CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgX19pcGNfaW5pdCBfX3NobV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcykKK3N0YXRpYyB2b2lkIF9fc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQogewogCW5zLT5pZHNbSVBDX1NITV9JRFNdID0gaWRzOwogCW5zLT5zaG1fY3RsbWF4ID0gU0hNTUFYOwpAQCAtOTgsNyArOTgsNiBAQAogCQlzaG1fZGVzdHJveShucywgc2hwKTsKIH0KIAotI2lmZGVmIENPTkZJR19JUENfTlMKIGludCBzaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7CiAJc3RydWN0IGlwY19pZHMgKmlkczsKQEAgLTEzMCw3ICsxMjksNiBAQAogCWtmcmVlKG5zLT5pZHNbSVBDX1NITV9JRFNdKTsKIAlucy0+aWRzW0lQQ19TSE1fSURTXSA9IE5VTEw7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgc2htX2luaXQgKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCA3NTM2YTcyLi40NGU1MTM1IDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTUwLDcgKzUwLDYgQEAKIAl9LAogfTsKIAotI2lmZGVmIENPTkZJR19JUENfTlMKIHN0YXRpYyBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY2xvbmVfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpvbGRfbnMpCiB7CiAJaW50IGVycjsKQEAgLTExMCwxNCArMTA5LDYgQEAKIAlzaG1fZXhpdF9ucyhucyk7CiAJa2ZyZWUobnMpOwogfQotI2Vsc2UKLXN0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQotewotCWlmIChmbGFncyAmIENMT05FX05FV0lQQykKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JcmV0dXJuIG5zOwotfQotI2VuZGlmCiAKIC8qKgogICoJaXBjX2luaXQJLQlpbml0aWFsaXNlIElQQyBzdWJzeXN0ZW0KQEAgLTE0NSw3ICsxMzYsNyBAQAogICoJYXJyYXkgaXRzZWxmLiAKICAqLwogIAotdm9pZCBfX2lwY19pbml0IGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyogaWRzLCBpbnQgc2l6ZSkKK3ZvaWQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzKiBpZHMsIGludCBzaXplKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5oIGIvaXBjL3V0aWwuaAppbmRleCBlM2FhMmM1Li4zMzNlODkxIDEwMDY0NAotLS0gYS9pcGMvdXRpbC5oCisrKyBiL2lwYy91dGlsLmgKQEAgLTQxLDEyICs0MSw4IEBACiB9OwogCiBzdHJ1Y3Qgc2VxX2ZpbGU7Ci0jaWZkZWYgQ09ORklHX0lQQ19OUwotI2RlZmluZSBfX2lwY19pbml0Ci0jZWxzZQotI2RlZmluZSBfX2lwY19pbml0CV9faW5pdAotI2VuZGlmCi12b2lkIF9faXBjX2luaXQgaXBjX2luaXRfaWRzKHN0cnVjdCBpcGNfaWRzICppZHMsIGludCBzaXplKTsKKwordm9pZCBpcGNfaW5pdF9pZHMoc3RydWN0IGlwY19pZHMgKmlkcywgaW50IHNpemUpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiB2b2lkIF9faW5pdCBpcGNfaW5pdF9wcm9jX2ludGVyZmFjZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpoZWFkZXIsCiAJCWludCBpZHMsIGludCAoKnNob3cpKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCA2NDJkNDI3Li4yYTk5OTgzIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC00LDExICs0LDEyIEBACiAKIG9iai15ICAgICA9IHNjaGVkLm8gZm9yay5vIGV4ZWNfZG9tYWluLm8gcGFuaWMubyBwcmludGsubyBwcm9maWxlLm8gXAogCSAgICBleGl0Lm8gaXRpbWVyLm8gdGltZS5vIHNvZnRpcnEubyByZXNvdXJjZS5vIFwKLQkgICAgc3lzY3RsLm8gY2FwYWJpbGl0eS5vIHB0cmFjZS5vIHRpbWVyLm8gdXNlci5vIFwKKwkgICAgc3lzY3RsLm8gY2FwYWJpbGl0eS5vIHB0cmFjZS5vIHRpbWVyLm8gdXNlci5vIHVzZXJfbmFtZXNwYWNlLm8gXAogCSAgICBzaWduYWwubyBzeXMubyBrbW9kLm8gd29ya3F1ZXVlLm8gcGlkLm8gXAogCSAgICByY3VwZGF0ZS5vIGV4dGFibGUubyBwYXJhbXMubyBwb3NpeC10aW1lcnMubyBcCiAJICAgIGt0aHJlYWQubyB3YWl0Lm8ga2ZpZm8ubyBzeXNfbmkubyBwb3NpeC1jcHUtdGltZXJzLm8gbXV0ZXgubyBcCi0JICAgIGhydGltZXIubyByd3NlbS5vIGxhdGVuY3kubyBuc3Byb3h5Lm8gc3JjdS5vIGRpZV9ub3RpZmllci5vCisJICAgIGhydGltZXIubyByd3NlbS5vIGxhdGVuY3kubyBuc3Byb3h5Lm8gc3JjdS5vIGRpZV9ub3RpZmllci5vIFwKKwkgICAgdXRzbmFtZS5vCiAKIG9iai0kKENPTkZJR19TVEFDS1RSQUNFKSArPSBzdGFja3RyYWNlLm8KIG9iai15ICs9IHRpbWUvCkBAIC00OCw3ICs0OSw2IEBACiBvYmotJChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCkgKz0gcmN1dG9ydHVyZS5vCiBvYmotJChDT05GSUdfUkVMQVkpICs9IHJlbGF5Lm8KIG9iai0kKENPTkZJR19TWVNDVEwpICs9IHV0c25hbWVfc3lzY3RsLm8KLW9iai0kKENPTkZJR19VVFNfTlMpICs9IHV0c25hbWUubwogb2JqLSQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkgKz0gZGVsYXlhY2N0Lm8KIG9iai0kKENPTkZJR19UQVNLU1RBVFMpICs9IHRhc2tzdGF0cy5vIHRzYWNjdC5vCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5jIGIva2VybmVsL2F1ZGl0LmMKaW5kZXggZDEzMjc2ZC4uZWIwZjkxNiAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmMKKysrIGIva2VybmVsL2F1ZGl0LmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWxpbnV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgImF1ZGl0LmgiCiAKQEAgLTM5MSw2ICszOTIsNyBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKKwlzZXRfZnJlZXphYmxlKCk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJc2tiID0gc2tiX2RlcXVldWUoJmF1ZGl0X3NrYl9xdWV1ZSk7CiAJCXdha2VfdXAoJmF1ZGl0X2JhY2tsb2dfd2FpdCk7CkBAIC00MjMsNiArNDI1LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXVkaXRfcHJlcGFyZV91c2VyX3R0eShwaWRfdCBwaWQsIHVpZF90IGxvZ2ludWlkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBlcnI7CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwllcnIgPSAtRVNSQ0g7CisJaWYgKCF0c2spCisJCWdvdG8gb3V0OworCWVyciA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghdHNrLT5zaWduYWwtPmF1ZGl0X3R0eSkKKwkJZXJyID0gLUVQRVJNOworCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXR0eV9hdWRpdF9wdXNoX3Rhc2sodHNrLCBsb2dpbnVpZCk7CitvdXQ6CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJldHVybiBlcnI7Cit9CisKIGludCBhdWRpdF9zZW5kX2xpc3Qodm9pZCAqX2Rlc3QpCiB7CiAJc3RydWN0IGF1ZGl0X25ldGxpbmtfbGlzdCAqZGVzdCA9IF9kZXN0OwpAQCAtNTExLDYgKzUzOCw4IEBACiAJY2FzZSBBVURJVF9ERUw6CiAJY2FzZSBBVURJVF9ERUxfUlVMRToKIAljYXNlIEFVRElUX1NJR05BTF9JTkZPOgorCWNhc2UgQVVESVRfVFRZX0dFVDoKKwljYXNlIEFVRElUX1RUWV9TRVQ6CiAJCWlmIChzZWN1cml0eV9uZXRsaW5rX3JlY3Yoc2tiLCBDQVBfQVVESVRfQ09OVFJPTCkpCiAJCQllcnIgPSAtRVBFUk07CiAJCWJyZWFrOwpAQCAtNjIyLDYgKzY1MSwxMSBAQAogCQllcnIgPSBhdWRpdF9maWx0ZXJfdXNlcigmTkVUTElOS19DQihza2IpLCBtc2dfdHlwZSk7CiAJCWlmIChlcnIgPT0gMSkgewogCQkJZXJyID0gMDsKKwkJCWlmIChtc2dfdHlwZSA9PSBBVURJVF9VU0VSX1RUWSkgeworCQkJCWVyciA9IGF1ZGl0X3ByZXBhcmVfdXNlcl90dHkocGlkLCBsb2dpbnVpZCk7CisJCQkJaWYgKGVycikKKwkJCQkJYnJlYWs7CisJCQl9CiAJCQlhYiA9IGF1ZGl0X2xvZ19zdGFydChOVUxMLCBHRlBfS0VSTkVMLCBtc2dfdHlwZSk7CiAJCQlpZiAoYWIpIHsKIAkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLApAQCAtNjM4LDggKzY3MiwxNyBAQAogCQkJCQkJCSIgc3Viaj0lcyIsIGN0eCk7CiAJCQkJCWtmcmVlKGN0eCk7CiAJCQkJfQotCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbXNnPSclLjEwMjRzJyIsCi0JCQkJCSAoY2hhciAqKWRhdGEpOworCQkJCWlmIChtc2dfdHlwZSAhPSBBVURJVF9VU0VSX1RUWSkKKwkJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBtc2c9JyUuMTAyNHMnIiwKKwkJCQkJCQkgKGNoYXIgKilkYXRhKTsKKwkJCQllbHNlIHsKKwkJCQkJaW50IHNpemU7CisKKwkJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBtc2c9Iik7CisJCQkJCXNpemUgPSBubG1zZ19sZW4obmxoKTsKKwkJCQkJYXVkaXRfbG9nX25fdW50cnVzdGVkc3RyaW5nKGFiLCBzaXplLAorCQkJCQkJCQkgICAgZGF0YSk7CisJCQkJfQogCQkJCWF1ZGl0X3NldF9waWQoYWIsIHBpZCk7CiAJCQkJYXVkaXRfbG9nX2VuZChhYik7CiAJCQl9CkBAIC03MzAsNiArNzczLDQ1IEBACiAJCQkJMCwgMCwgc2lnX2RhdGEsIHNpemVvZigqc2lnX2RhdGEpICsgbGVuKTsKIAkJa2ZyZWUoc2lnX2RhdGEpOwogCQlicmVhazsKKwljYXNlIEFVRElUX1RUWV9HRVQ6IHsKKwkJc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMgczsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJdHNrID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCQlpZiAoIXRzaykKKwkJCWVyciA9IC1FU1JDSDsKKwkJZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQkJcy5lbmFibGVkID0gdHNrLT5zaWduYWwtPmF1ZGl0X3R0eSAhPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJYXVkaXRfc2VuZF9yZXBseShORVRMSU5LX0NCKHNrYikucGlkLCBzZXEsIEFVRElUX1RUWV9HRVQsIDAsIDAsCisJCQkJICZzLCBzaXplb2YocykpOworCQlicmVhazsKKwl9CisJY2FzZSBBVURJVF9UVFlfU0VUOiB7CisJCXN0cnVjdCBhdWRpdF90dHlfc3RhdHVzICpzOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKworCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBzaXplb2Yoc3RydWN0IGF1ZGl0X3R0eV9zdGF0dXMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXMgPSBkYXRhOworCQlpZiAocy0+ZW5hYmxlZCAhPSAwICYmIHMtPmVuYWJsZWQgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQl0c2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJCWlmICghdHNrKQorCQkJZXJyID0gLUVTUkNIOworCQllbHNlIHsKKwkJCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQl0c2stPnNpZ25hbC0+YXVkaXRfdHR5ID0gcy0+ZW5hYmxlZCAhPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQl9CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7CiAJCWJyZWFrOwpAQCAtMTE4NSw3ICsxMjY3LDcgQEAKIH0KIAogLyoqCi0gKiBhdWRpdF9sb2dfbl91bnN0cnVzdGVkc3RyaW5nIC0gbG9nIGEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gcmFuZG9tIGNoYXJhY3RlcnMKKyAqIGF1ZGl0X2xvZ19uX3VudHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCiAgKiBAYWI6IGF1ZGl0X2J1ZmZlcgogICogQGxlbjogbGVudGggb2Ygc3RyaW5nIChub3QgaW5jbHVkaW5nIHRyYWlsaW5nIG51bGwpCiAgKiBAc3RyaW5nOiBzdHJpbmcgdG8gYmUgbG9nZ2VkCkBAIC0xMjAxLDI1ICsxMjgzLDI0IEBACiBjb25zdCBjaGFyICphdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHNpemVfdCBsZW4sCiAJCQkJCWNvbnN0IGNoYXIgKnN0cmluZykKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gc3RyaW5nOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAKLQl3aGlsZSAoKnApIHsKKwlmb3IgKHAgPSBzdHJpbmc7IHAgPCAoY29uc3QgdW5zaWduZWQgY2hhciAqKXN0cmluZyArIGxlbiAmJiAqcDsgcCsrKSB7CiAJCWlmICgqcCA9PSAnIicgfHwgKnAgPCAweDIxIHx8ICpwID4gMHg3ZikgewogCQkJYXVkaXRfbG9nX2hleChhYiwgc3RyaW5nLCBsZW4pOwogCQkJcmV0dXJuIHN0cmluZyArIGxlbiArIDE7CiAJCX0KLQkJcCsrOwogCX0KIAlhdWRpdF9sb2dfbl9zdHJpbmcoYWIsIGxlbiwgc3RyaW5nKTsKIAlyZXR1cm4gcCArIDE7CiB9CiAKIC8qKgotICogYXVkaXRfbG9nX3Vuc3RydXN0ZWRzdHJpbmcgLSBsb2cgYSBzdHJpbmcgdGhhdCBtYXkgY29udGFpbiByYW5kb20gY2hhcmFjdGVycworICogYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyAtIGxvZyBhIHN0cmluZyB0aGF0IG1heSBjb250YWluIHJhbmRvbSBjaGFyYWN0ZXJzCiAgKiBAYWI6IGF1ZGl0X2J1ZmZlcgogICogQHN0cmluZzogc3RyaW5nIHRvIGJlIGxvZ2dlZAogICoKLSAqIFNhbWUgYXMgYXVkaXRfbG9nX25fdW5zdHJ1c3RlZHN0cmluZygpLCBleGNlcHQgdGhhdCBzdHJsZW4gaXMgdXNlZCB0bworICogU2FtZSBhcyBhdWRpdF9sb2dfbl91bnRydXN0ZWRzdHJpbmcoKSwgZXhjZXB0IHRoYXQgc3RybGVuIGlzIHVzZWQgdG8KICAqIGRldGVybWluZSBzdHJpbmcgbGVuZ3RoLgogICovCiBjb25zdCBjaGFyICphdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBjb25zdCBjaGFyICpzdHJpbmcpCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXQuaCBiL2tlcm5lbC9hdWRpdC5oCmluZGV4IDgxNWQ2ZjUuLjk1ODc3NDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdC5oCisrKyBiL2tlcm5lbC9hdWRpdC5oCkBAIC0xMTUsNyArMTE1LDYgQEAKIGV4dGVybiB2b2lkCQkgICAgYXVkaXRfc2VuZF9yZXBseShpbnQgcGlkLCBpbnQgc2VxLCBpbnQgdHlwZSwKIAkJCQkJICAgICBpbnQgZG9uZSwgaW50IG11bHRpLAogCQkJCQkgICAgIHZvaWQgKnBheWxvYWQsIGludCBzaXplKTsKLWV4dGVybiB2b2lkCQkgICAgYXVkaXRfbG9nX2xvc3QoY29uc3QgY2hhciAqbWVzc2FnZSk7CiBleHRlcm4gdm9pZAkJICAgIGF1ZGl0X3BhbmljKGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwogCiBzdHJ1Y3QgYXVkaXRfbmV0bGlua19saXN0IHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdHNjLmMgYi9rZXJuZWwvYXVkaXRzYy5jCmluZGV4IGUzNjQ4MWUuLmI3NjQwYTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtNzEsOSArNzEsNiBAQAogCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhdWRpdF9maWx0ZXJfbGlzdFtdOwogCi0vKiBObyBzeXNjYWxsIGF1ZGl0aW5nIHdpbGwgdGFrZSBwbGFjZSB1bmxlc3MgYXVkaXRfZW5hYmxlZCAhPSAwLiAqLwotZXh0ZXJuIGludCBhdWRpdF9lbmFibGVkOwotCiAvKiBBVURJVF9OQU1FUyBpcyB0aGUgbnVtYmVyIG9mIHNsb3RzIHdlIHJlc2VydmUgaW4gdGhlIGF1ZGl0X2NvbnRleHQKICAqIGZvciBzYXZpbmcgbmFtZXMgZnJvbSBnZXRuYW1lKCkuICovCiAjZGVmaW5lIEFVRElUX05BTUVTICAgIDIwCkBAIC0yMDQwLDcgKzIwMzcsNyBAQAogCiAvKioKICAqIGF1ZGl0X2NvcmVfZHVtcHMgLSByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQgcHJvY2Vzc2VzIHRoYXQgZW5kIGFibm9ybWFsbHkKLSAqIEBzaWc6IHNpZ25hbCB2YWx1ZQorICogQHNpZ25yOiBzaWduYWwgdmFsdWUKICAqCiAgKiBJZiBhIHByb2Nlc3MgZW5kcyB3aXRoIGEgY29yZSBkdW1wLCBzb21ldGhpbmcgZmlzaHkgaXMgZ29pbmcgb24gYW5kIHdlCiAgKiBzaG91bGQgcmVjb3JkIHRoZSBldmVudCBmb3IgaW52ZXN0aWdhdGlvbi4KZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCBjNGQxMjNmLi5iNDc5NmQ4IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC05ODEsMTAgKzk4MSwxMCBAQAogCQltbWFycmF5ID0ga21hbGxvYyhudGFza3MgKiBzaXplb2YoKm1tYXJyYXkpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtbWFycmF5KQogCQkJZ290byBkb25lOwotCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CQkvKiBibG9jayBmb3JrICovCisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CQkvKiBibG9jayBmb3JrICovCiAJCWlmIChhdG9taWNfcmVhZCgmY3MtPmNvdW50KSA8PSBudGFza3MpCiAJCQlicmVhazsJCQkJLyogZ290IGVub3VnaCAqLwotCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsJLyogdHJ5IGFnYWluICovCisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsJCS8qIHRyeSBhZ2FpbiAqLwogCQlrZnJlZShtbWFycmF5KTsKIAl9CiAKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAJCQljb250aW51ZTsKIAkJbW1hcnJheVtuKytdID0gbW07CiAJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKLQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlJ3ZlIGRyb3BwZWQgdGhlIHRhc2tsaXN0IHNwaW5sb2NrLCB3ZSBjYW4KZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGNhNmExMWIuLmU4YWY4ZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CkBAIC0zODcsNiArMzg4LDExIEBACiAJICogdGhleSB3b3VsZCBiZSBsb2NrZWQgaW50byBtZW1vcnkuCiAJICovCiAJZXhpdF9tbShjdXJyZW50KTsKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSBUSUZfRlJFRVpFIHNldCBpZiB0aGUgc3lzdGVtLXdpZGUgaGliZXJuYXRpb24KKwkgKiBvciBzdXNwZW5kIHRyYW5zaXRpb24gYmVnaW5zIHJpZ2h0IG5vdy4KKwkgKi8KKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCXNldF9zcGVjaWFsX3BpZHMoMSwgMSk7CiAJcHJvY19jbGVhcl90dHkoY3VycmVudCk7CkBAIC04NTgsNiArODY0LDM0IEBACiAJCXJlbGVhc2VfdGFzayh0c2spOwogfQogCisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCitzdGF0aWMgdm9pZCBjaGVja19zdGFja191c2FnZSh2b2lkKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG93X3dhdGVyX2xvY2spOworCXN0YXRpYyBpbnQgbG93ZXN0X3RvX2RhdGUgPSBUSFJFQURfU0laRTsKKwl1bnNpZ25lZCBsb25nICpuID0gZW5kX29mX3N0YWNrKGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZnJlZTsKKworCXdoaWxlICgqbiA9PSAwKQorCQluKys7CisJZnJlZSA9ICh1bnNpZ25lZCBsb25nKW4gLSAodW5zaWduZWQgbG9uZyllbmRfb2Zfc3RhY2soY3VycmVudCk7CisKKwlpZiAoZnJlZSA+PSBsb3dlc3RfdG9fZGF0ZSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZsb3dfd2F0ZXJfbG9jayk7CisJaWYgKGZyZWUgPCBsb3dlc3RfdG9fZGF0ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyB1c2VkIGdyZWF0ZXN0IHN0YWNrIGRlcHRoOiAlbHUgYnl0ZXMgIgorCQkJCSJsZWZ0XG4iLAorCQkJCWN1cnJlbnQtPmNvbW0sIGZyZWUpOworCQlsb3dlc3RfdG9fZGF0ZSA9IGZyZWU7CisJfQorCXNwaW5fdW5sb2NrKCZsb3dfd2F0ZXJfbG9jayk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3N0YWNrX3VzYWdlKHZvaWQpIHt9CisjZW5kaWYKKwogZmFzdGNhbGwgTk9SRVRfVFlQRSB2b2lkIGRvX2V4aXQobG9uZyBjb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKQEAgLTkzNyw2ICs5NzEsOCBAQAogCWlmICh1bmxpa2VseSh0c2stPmNvbXBhdF9yb2J1c3RfbGlzdCkpCiAJCWNvbXBhdF9leGl0X3JvYnVzdF9saXN0KHRzayk7CiAjZW5kaWYKKwlpZiAoZ3JvdXBfZGVhZCkKKwkJdHR5X2F1ZGl0X2V4aXQoKTsKIAlpZiAodW5saWtlbHkodHNrLT5hdWRpdF9jb250ZXh0KSkKIAkJYXVkaXRfZnJlZSh0c2spOwogCkBAIC05NDksNiArOTg1LDcgQEAKIAlleGl0X3NlbSh0c2spOwogCV9fZXhpdF9maWxlcyh0c2spOwogCV9fZXhpdF9mcyh0c2spOworCWNoZWNrX3N0YWNrX3VzYWdlKCk7CiAJZXhpdF90aHJlYWQoKTsKIAljcHVzZXRfZXhpdCh0c2spOwogCWV4aXRfa2V5cyh0c2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggZGEzYTE1NS4uYmEzOWJkYiAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGFza3N0YXRzX2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KQEAgLTg5Nyw2ICs4OTgsOCBAQAogCX0KIAlhY2N0X2luaXRfcGFjY3QoJnNpZy0+cGFjY3QpOwogCisJdHR5X2F1ZGl0X2Zvcmsoc2lnKTsKKwogCXJldHVybiAwOwogfQogCkBAIC05MjAsNyArOTIzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG5ld19mbGFncyA9IHAtPmZsYWdzOwogCi0JbmV3X2ZsYWdzICY9IH4oUEZfU1VQRVJQUklWIHwgUEZfTk9GUkVFWkUpOworCW5ld19mbGFncyAmPSB+UEZfU1VQRVJQUklWOwogCW5ld19mbGFncyB8PSBQRl9GT1JLTk9FWEVDOwogCWlmICghKGNsb25lX2ZsYWdzICYgQ0xPTkVfUFRSQUNFKSkKIAkJcC0+cHRyYWNlID0gMDsKQEAgLTk5OSw3ICsxMDAyLDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJnAtPnVzZXItPnByb2Nlc3NlcykgPj0KIAkJCXAtPnNpZ25hbC0+cmxpbVtSTElNSVRfTlBST0NdLnJsaW1fY3VyKSB7CiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSAmJiAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSAmJgotCQkJCXAtPnVzZXIgIT0gJnJvb3RfdXNlcikKKwkJICAgIHAtPnVzZXIgIT0gY3VycmVudC0+bnNwcm94eS0+dXNlcl9ucy0+cm9vdF91c2VyKQogCQkJZ290byBiYWRfZm9ya19mcmVlOwogCX0KIApAQCAtMTA1OSw2ICsxMDYyLDggQEAKIAogCXAtPmxvY2tfZGVwdGggPSAtMTsJCS8qIC0xID0gbm8gbG9jayAqLwogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZwLT5zdGFydF90aW1lKTsKKwlwLT5yZWFsX3N0YXJ0X3RpbWUgPSBwLT5zdGFydF90aW1lOworCW1vbm90b25pY190b19ib290YmFzZWQoJnAtPnJlYWxfc3RhcnRfdGltZSk7CiAJcC0+c2VjdXJpdHkgPSBOVUxMOwogCXAtPmlvX2NvbnRleHQgPSBOVUxMOwogCXAtPmlvX3dhaXQgPSBOVUxMOwpAQCAtMTYwMSw3ICsxNjA2LDcgQEAKIAllcnIgPSAtRUlOVkFMOwogCWlmICh1bnNoYXJlX2ZsYWdzICYgfihDTE9ORV9USFJFQUR8Q0xPTkVfRlN8Q0xPTkVfTkVXTlN8Q0xPTkVfU0lHSEFORHwKIAkJCQlDTE9ORV9WTXxDTE9ORV9GSUxFU3xDTE9ORV9TWVNWU0VNfAotCQkJCUNMT05FX05FV1VUU3xDTE9ORV9ORVdJUEMpKQorCQkJCUNMT05FX05FV1VUU3xDTE9ORV9ORVdJUEN8Q0xPTkVfTkVXVVNFUikpCiAJCWdvdG8gYmFkX3Vuc2hhcmVfb3V0OwogCiAJaWYgKChlcnIgPSB1bnNoYXJlX3RocmVhZCh1bnNoYXJlX2ZsYWdzKSkpCmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDQ1NDkwYmUuLjVjM2Y0NWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xMjEsNiArMTIxLDI0IEBACiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpmdXRleF9tbnQ7CiAKIC8qCisgKiBUYWtlIG1tLT5tbWFwX3NlbSwgd2hlbiBmdXRleCBpcyBzaGFyZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X2xvY2tfbW0oc3RydWN0IHJ3X3NlbWFwaG9yZSAqZnNoYXJlZCkKK3sKKwlpZiAoZnNoYXJlZCkKKwkJZG93bl9yZWFkKGZzaGFyZWQpOworfQorCisvKgorICogUmVsZWFzZSBtbS0+bW1hcF9zZW0sIHdoZW4gdGhlIGZ1dGV4IGlzIHNoYXJlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnV0ZXhfdW5sb2NrX21tKHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQpCit7CisJaWYgKGZzaGFyZWQpCisJCXVwX3JlYWQoZnNoYXJlZCk7Cit9CisKKy8qCiAgKiBXZSBoYXNoIG9uIHRoZSBrZXlzIHJldHVybmVkIGZyb20gZ2V0X2Z1dGV4X2tleSAoc2VlIGJlbG93KS4KICAqLwogc3RhdGljIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGFzaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleSkKQEAgLTI4Nyw3ICszMDUsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRyb3BfZnV0ZXhfa2V5X3JlZnMpOwogCi1zdGF0aWMgaW5saW5lIGludCBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiAqZGVzdCwgdTMyIF9fdXNlciAqZnJvbSkKK3N0YXRpYyB1MzIgY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodTMyIF9fdXNlciAqdWFkZHIsIHUzMiB1dmFsLCB1MzIgbmV3dmFsKQoreworCXUzMiBjdXJ2YWw7CisKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOworCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKKworCXJldHVybiBjdXJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Z1dGV4X3ZhbHVlX2xvY2tlZCh1MzIgKmRlc3QsIHUzMiBfX3VzZXIgKmZyb20pCiB7CiAJaW50IHJldDsKIApAQCAtNjIwLDkgKzY0OSw3IEBACiAKIAkJbmV3dmFsID0gRlVURVhfV0FJVEVSUyB8IG5ld19vd25lci0+cGlkOwogCi0JCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwotCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwogCiAJCWlmIChjdXJ2YWwgPT0gLUVGQVVMVCkKIAkJCXJldCA9IC1FRkFVTFQ7CkBAIC02NTksOSArNjg2LDcgQEAKIAkgKiBUaGVyZSBpcyBubyB3YWl0ZXIsIHNvIHdlIHVubG9jayB0aGUgZnV0ZXguIFRoZSBvd25lciBkaWVkCiAJICogYml0IGhhcyBub3QgdG8gYmUgcHJlc2VydmVkIGhlcmUuIFdlIGFyZSB0aGUgb3duZXI6CiAJICovCi0JcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQlvbGR2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwgdXZhbCwgMCk7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOworCW9sZHZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCAwKTsKIAogCWlmIChvbGR2YWwgPT0gLUVGQVVMVCkKIAkJcmV0dXJuIG9sZHZhbDsKQEAgLTcwMCw4ICs3MjUsNyBAQAogCXVuaW9uIGZ1dGV4X2tleSBrZXk7CiAJaW50IHJldDsKIAotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZrZXkpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC03MjUsOCArNzQ5LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZoYi0+bG9jayk7CiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc0Niw4ICs3NjksNyBAQAogCWludCByZXQsIG9wX3JldCwgYXR0ZW1wdCA9IDA7CiAKIHJldHJ5ZnVsbDoKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZnNoYXJlZCwgJmtleTEpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC03OTMsNyArODE1LDcgQEAKIAkJICovCiAJCWlmIChhdHRlbXB0KyspIHsKIAkJCXJldCA9IGZ1dGV4X2hhbmRsZV9mYXVsdCgodW5zaWduZWQgbG9uZyl1YWRkcjIsCi0JCQkJCQlmc2hhcmVkLCBhdHRlbXB0KTsKKwkJCQkJCSBmc2hhcmVkLCBhdHRlbXB0KTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CiAJCQlnb3RvIHJldHJ5OwpAQCAtODAzLDggKzgyNSw3IEBACiAJCSAqIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwKIAkJICogZmF1bHQgaXQgaW4gYW5kIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgogCQkgKi8KLQkJaWYgKGZzaGFyZWQpCi0JCQl1cF9yZWFkKGZzaGFyZWQpOworCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkJcmV0ID0gZ2V0X3VzZXIoZHVtbXksIHVhZGRyMik7CiAJCWlmIChyZXQpCkBAIC04NDEsOCArODYyLDggQEAKIAlpZiAoaGIxICE9IGhiMikKIAkJc3Bpbl91bmxvY2soJmhiMi0+bG9jayk7CiBvdXQ6Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODYxLDggKzg4Miw3IEBACiAJaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CiAKICByZXRyeToKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZnNoYXJlZCwgJmtleTEpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC04OTAsOCArOTEwLDcgQEAKIAkJCSAqIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwgZmF1bHQKIAkJCSAqIGl0IGluIGFuZCBzdGFydCBhbGwgb3ZlciBhZ2Fpbi4KIAkJCSAqLwotCQkJaWYgKGZzaGFyZWQpCi0JCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCQkJcmV0ID0gZ2V0X3VzZXIoY3VydmFsLCB1YWRkcjEpOwogCkBAIC05NDQsOCArOTYzLDcgQEAKIAkJZHJvcF9mdXRleF9rZXlfcmVmcygma2V5MSk7CiAKIG91dDoKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTExMywxMCArMTEzMSw3IEBACiAJd2hpbGUgKCFyZXQpIHsKIAkJbmV3dmFsID0gKHV2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSB8IG5ld3RpZDsKIAotCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCQljdXJ2YWwgPSBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1YWRkciwKLQkJCQkJCSAgICAgICB1dmFsLCBuZXd2YWwpOwotCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwogCiAJCWlmIChjdXJ2YWwgPT0gLUVGQVVMVCkKIAkJCXJldCA9IC1FRkFVTFQ7CkBAIC0xMTM0LDYgKzExNDksNyBAQAogI2RlZmluZSBBUkczX1NIQVJFRCAgMQogCiBzdGF0aWMgbG9uZyBmdXRleF93YWl0X3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpOworCiBzdGF0aWMgaW50IGZ1dGV4X3dhaXQodTMyIF9fdXNlciAqdWFkZHIsIHN0cnVjdCByd19zZW1hcGhvcmUgKmZzaGFyZWQsCiAJCSAgICAgIHUzMiB2YWwsIGt0aW1lX3QgKmFic190aW1lKQogewpAQCAtMTE0OCw4ICsxMTY0LDcgQEAKIAogCXEucGlfc3RhdGUgPSBOVUxMOwogIHJldHJ5OgotCWlmIChmc2hhcmVkKQotCQlkb3duX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfbG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTExODYsOCArMTIwMSw3IEBACiAJCSAqIElmIHdlIHdvdWxkIGhhdmUgZmF1bHRlZCwgcmVsZWFzZSBtbWFwX3NlbSwgZmF1bHQgaXQgaW4gYW5kCiAJCSAqIHN0YXJ0IGFsbCBvdmVyIGFnYWluLgogCQkgKi8KLQkJaWYgKGZzaGFyZWQpCi0JCQl1cF9yZWFkKGZzaGFyZWQpOworCQlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAkJcmV0ID0gZ2V0X3VzZXIodXZhbCwgdWFkZHIpOwogCkBAIC0xMjA2LDggKzEyMjAsNyBAQAogCSAqIE5vdyB0aGUgZnV0ZXggaXMgcXVldWVkIGFuZCB3ZSBoYXZlIGNoZWNrZWQgdGhlIGRhdGEsIHdlCiAJICogZG9uJ3Qgd2FudCB0byBob2xkIG1tYXBfc2VtIHdoaWxlIHdlIHNsZWVwLgogCSAqLwotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCS8qCiAJICogVGhlcmUgbWlnaHQgaGF2ZSBiZWVuIHNjaGVkdWxpbmcgc2luY2UgdGhlIHF1ZXVlX21lKCksIGFzIHdlCkBAIC0xMjg1LDggKzEyOTgsNyBAQAogCXF1ZXVlX3VubG9jaygmcSwgaGIpOwogCiAgb3V0X3JlbGVhc2Vfc2VtOgotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzMzLDggKzEzNDUsNyBAQAogCiAJcS5waV9zdGF0ZSA9IE5VTEw7CiAgcmV0cnk6Ci0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJnEua2V5KTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQpAQCAtMTM1Myw5ICsxMzY0LDcgQEAKIAkgKi8KIAluZXd2YWwgPSBjdXJyZW50LT5waWQ7CiAKLQlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCWN1cnZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCAwLCBuZXd2YWwpOwotCXBhZ2VmYXVsdF9lbmFibGUoKTsKKwljdXJ2YWwgPSBjbXB4Y2hnX2Z1dGV4X3ZhbHVlX2xvY2tlZCh1YWRkciwgMCwgbmV3dmFsKTsKIAogCWlmICh1bmxpa2VseShjdXJ2YWwgPT0gLUVGQVVMVCkpCiAJCWdvdG8gdWFkZHJfZmF1bHRlZDsKQEAgLTEzOTgsOSArMTQwNyw3IEBACiAJCWxvY2tfdGFrZW4gPSAxOwogCX0KIAotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JY3VydmFsID0gZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModWFkZHIsIHV2YWwsIG5ld3ZhbCk7Ci0JcGFnZWZhdWx0X2VuYWJsZSgpOworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOwogCiAJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byB1YWRkcl9mYXVsdGVkOwpAQCAtMTQyOCw4ICsxNDM1LDcgQEAKIAkJCSAqIGV4aXQgdG8gY29tcGxldGUuCiAJCQkgKi8KIAkJCXF1ZXVlX3VubG9jaygmcSwgaGIpOwotCQkJaWYgKGZzaGFyZWQpCi0JCQkJdXBfcmVhZChmc2hhcmVkKTsKKwkJCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQkJZ290byByZXRyeTsKIApAQCAtMTQ2NSw4ICsxNDcxLDcgQEAKIAkgKiBOb3cgdGhlIGZ1dGV4IGlzIHF1ZXVlZCBhbmQgd2UgaGF2ZSBjaGVja2VkIHRoZSBkYXRhLCB3ZQogCSAqIGRvbid0IHdhbnQgdG8gaG9sZCBtbWFwX3NlbSB3aGlsZSB3ZSBzbGVlcC4KIAkgKi8KLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlXQVJOX09OKCFxLnBpX3N0YXRlKTsKIAkvKgpAQCAtMTQ4MCw4ICsxNDg1LDcgQEAKIAkJcmV0ID0gcmV0ID8gMCA6IC1FV09VTERCTE9DSzsKIAl9CiAKLQlpZiAoZnNoYXJlZCkKLQkJZG93bl9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X2xvY2tfbW0oZnNoYXJlZCk7CiAJc3Bpbl9sb2NrKHEubG9ja19wdHIpOwogCiAJaWYgKCFyZXQpIHsKQEAgLTE1MTgsOCArMTUyMiw3IEBACiAKIAkvKiBVbnF1ZXVlIGFuZCBkcm9wIHRoZSBsb2NrICovCiAJdW5xdWV1ZV9tZV9waSgmcSk7Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0dXJuIHJldCAhPSAtRUlOVFIgPyByZXQgOiAtRVJFU1RBUlROT0lOVFI7CiAKQEAgLTE1MjcsOCArMTUzMCw3IEBACiAJcXVldWVfdW5sb2NrKCZxLCBoYik7CiAKICBvdXRfcmVsZWFzZV9zZW06Ci0JaWYgKGZzaGFyZWQpCi0JCXVwX3JlYWQoZnNoYXJlZCk7CisJZnV0ZXhfdW5sb2NrX21tKGZzaGFyZWQpOwogCXJldHVybiByZXQ7CiAKICB1YWRkcl9mYXVsdGVkOgpAQCAtMTU1MCw4ICsxNTUyLDcgQEAKIAkJZ290byByZXRyeV91bmxvY2tlZDsKIAl9CiAKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXQgPSBnZXRfdXNlcih1dmFsLCB1YWRkcik7CiAJaWYgKCFyZXQgJiYgKHV2YWwgIT0gLUVGQVVMVCkpCkBAIC0xNTg1LDggKzE1ODYsNyBAQAogCS8qCiAJICogRmlyc3QgdGFrZSBhbGwgdGhlIGZ1dGV4IHJlbGF0ZWQgbG9ja3M6CiAJICovCi0JaWYgKGZzaGFyZWQpCi0JCWRvd25fcmVhZChmc2hhcmVkKTsKKwlmdXRleF9sb2NrX21tKGZzaGFyZWQpOwogCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJmtleSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKQEAgLTE2MDEsMTEgKzE2MDEsOSBAQAogCSAqIGFnYWluLiBJZiBpdCBzdWNjZWVkcyB0aGVuIHdlIGNhbiByZXR1cm4gd2l0aG91dCB3YWtpbmcKIAkgKiBhbnlvbmUgZWxzZSB1cDoKIAkgKi8KLQlpZiAoISh1dmFsICYgRlVURVhfT1dORVJfRElFRCkpIHsKLQkJcGFnZWZhdWx0X2Rpc2FibGUoKTsKLQkJdXZhbCA9IGZ1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKHVhZGRyLCBjdXJyZW50LT5waWQsIDApOwotCQlwYWdlZmF1bHRfZW5hYmxlKCk7Ci0JfQorCWlmICghKHV2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSkKKwkJdXZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCBjdXJyZW50LT5waWQsIDApOworCiAKIAlpZiAodW5saWtlbHkodXZhbCA9PSAtRUZBVUxUKSkKIAkJZ290byBwaV9mYXVsdGVkOwpAQCAtMTY0Nyw4ICsxNjQ1LDcgQEAKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKIG91dDoKLQlpZiAoZnNoYXJlZCkKLQkJdXBfcmVhZChmc2hhcmVkKTsKKwlmdXRleF91bmxvY2tfbW0oZnNoYXJlZCk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0xNjcxLDggKzE2NjgsNyBAQAogCQlnb3RvIHJldHJ5X3VubG9ja2VkOwogCX0KIAotCWlmIChmc2hhcmVkKQotCQl1cF9yZWFkKGZzaGFyZWQpOworCWZ1dGV4X3VubG9ja19tbShmc2hhcmVkKTsKIAogCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIAlpZiAoIXJldCAmJiAodXZhbCAhPSAtRUZBVUxUKSkKQEAgLTE3MjksOCArMTcyNSw4IEBACiAKIAlpZiAocHJpbnRrX3RpbWVkX3JhdGVsaW1pdCgmcHJpbnRrX2ludGVydmFsLCA2MCAqIDYwICogMTAwMCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiUHJvY2VzcyBgJXMnIHVzZWQgRlVURVhfRkQsIHdoaWNoICIKLQkJICAgIAkid2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBpbiBKdW5lIDIwMDdcbiIsCi0JCQljdXJyZW50LT5jb21tKTsKKwkJICAgICAgICJ3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsIGluIEp1bmUgMjAwN1xuIiwKKwkJICAgICAgIGN1cnJlbnQtPmNvbW0pOwogCX0KIAogCXJldCA9IC1FSU5WQUw7CkBAIC0xOTA4LDEwICsxOTA0LDggQEAKIAkJICogV2FrZSByb2J1c3Qgbm9uLVBJIGZ1dGV4ZXMgaGVyZS4gVGhlIHdha2V1cCBvZgogCQkgKiBQSSBmdXRleGVzIGhhcHBlbnMgaW4gZXhpdF9waV9zdGF0ZSgpOgogCQkgKi8KLQkJaWYgKCFwaSkgewotCQkJaWYgKHV2YWwgJiBGVVRFWF9XQUlURVJTKQorCQlpZiAoIXBpICYmICh1dmFsICYgRlVURVhfV0FJVEVSUykpCiAJCQkJZnV0ZXhfd2FrZSh1YWRkciwgJmN1cnItPm1tLT5tbWFwX3NlbSwgMSk7Ci0JCX0KIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAyM2MwM2Y0Li43MmQwMzQyIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTE0MDYsNyArMTQwNiw3IEBACiBzdGF0aWMgaW50IF9fY3B1aW5pdCBocnRpbWVyX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7CisJdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKaW5kZXggYmQ5ZTI3Mi4uMzJiMTYxOSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9zcHVyaW91cy5jCisrKyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwpAQCAtMTcyLDcgKzE3MiwxNyBAQAogCQkgICAgaXJxcmV0dXJuX3QgYWN0aW9uX3JldCkKIHsKIAlpZiAodW5saWtlbHkoYWN0aW9uX3JldCAhPSBJUlFfSEFORExFRCkpIHsKLQkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKKwkJLyoKKwkJICogSWYgd2UgYXJlIHNlZWluZyBvbmx5IHRoZSBvZGQgc3B1cmlvdXMgSVJRIGNhdXNlZCBieQorCQkgKiBidXMgYXN5bmNocm9uaWNpdHkgdGhlbiBkb24ndCBldmVudHVhbGx5IHRyaWdnZXIgYW4gZXJyb3IsCisJCSAqIG90aGVyd2lzZSB0aGUgY291dGVyIGJlY29tZXMgYSBkb29tc2RheSB0aW1lciBmb3Igb3RoZXJ3aXNlCisJCSAqIHdvcmtpbmcgc3lzdGVtcworCQkgKi8KKwkJaWYgKGppZmZpZXMgLSBkZXNjLT5sYXN0X3VuaGFuZGxlZCA+IEhaLzEwKQorCQkJZGVzYy0+aXJxc191bmhhbmRsZWQgPSAxOworCQllbHNlCisJCQlkZXNjLT5pcnFzX3VuaGFuZGxlZCsrOworCQlkZXNjLT5sYXN0X3VuaGFuZGxlZCA9IGppZmZpZXM7CiAJCWlmICh1bmxpa2VseShhY3Rpb25fcmV0ICE9IElSUV9OT05FKSkKIAkJCXJlcG9ydF9iYWRfaXJxKGlycSwgZGVzYywgYWN0aW9uX3JldCk7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2thbGxzeW1zLmMgYi9rZXJuZWwva2FsbHN5bXMuYwppbmRleCBmZWQ1NDQxLi40NzQyMTlhIDEwMDY0NAotLS0gYS9rZXJuZWwva2FsbHN5bXMuYworKysgYi9rZXJuZWwva2FsbHN5bXMuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAvKiBMb29rdXAgdGhlIGFkZHJlc3MgZm9yIHRoaXMgc3ltYm9sLiBSZXR1cm5zIDAgaWYgbm90IGZvdW5kLiAqLwogdW5zaWduZWQgbG9uZyBrYWxsc3ltc19sb29rdXBfbmFtZShjb25zdCBjaGFyICpuYW1lKQogewotCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOXTsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgaW50IG9mZjsKIApAQCAtMjQ4LDcgKzI0OCw3IEBACiB7CiAJY29uc3QgY2hhciAqbXN5bTsKIAotCW5hbWVidWZbS1NZTV9OQU1FX0xFTl0gPSAwOworCW5hbWVidWZbS1NZTV9OQU1FX0xFTiAtIDFdID0gMDsKIAluYW1lYnVmWzBdID0gMDsKIAogCWlmIChpc19rc3ltX2FkZHIoYWRkcikpIHsKQEAgLTI2NSw3ICsyNjUsNyBAQAogCS8qIHNlZSBpZiBpdCdzIGluIGEgbW9kdWxlICovCiAJbXN5bSA9IG1vZHVsZV9hZGRyZXNzX2xvb2t1cChhZGRyLCBzeW1ib2xzaXplLCBvZmZzZXQsIG1vZG5hbWUpOwogCWlmIChtc3ltKQotCQlyZXR1cm4gc3RybmNweShuYW1lYnVmLCBtc3ltLCBLU1lNX05BTUVfTEVOKTsKKwkJcmV0dXJuIHN0cm5jcHkobmFtZWJ1ZiwgbXN5bSwgS1NZTV9OQU1FX0xFTiAtIDEpOwogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0yNzMsNyArMjczLDcgQEAKIGludCBsb29rdXBfc3ltYm9sX25hbWUodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpzeW1uYW1lKQogewogCXN5bW5hbWVbMF0gPSAnXDAnOwotCXN5bW5hbWVbS1NZTV9OQU1FX0xFTl0gPSAnXDAnOworCXN5bW5hbWVbS1NZTV9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKIAogCWlmIChpc19rc3ltX2FkZHIoYWRkcikpIHsKIAkJdW5zaWduZWQgbG9uZyBwb3M7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgKm9mZnNldCwgY2hhciAqbW9kbmFtZSwgY2hhciAqbmFtZSkKIHsKIAluYW1lWzBdID0gJ1wwJzsKLQluYW1lW0tTWU1fTkFNRV9MRU5dID0gJ1wwJzsKKwluYW1lW0tTWU1fTkFNRV9MRU4gLSAxXSA9ICdcMCc7CiAKIAlpZiAoaXNfa3N5bV9hZGRyKGFkZHIpKSB7CiAJCXVuc2lnbmVkIGxvbmcgcG9zOwpAQCAtMzEyLDE4ICszMTIsMTcgQEAKIAljaGFyICptb2RuYW1lOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemU7Ci0JY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU5dOwogCiAJbmFtZSA9IGthbGxzeW1zX2xvb2t1cChhZGRyZXNzLCAmc2l6ZSwgJm9mZnNldCwgJm1vZG5hbWUsIG5hbWVidWYpOwogCWlmICghbmFtZSkKIAkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiMHglbHgiLCBhZGRyZXNzKTsKLQllbHNlIHsKLQkJaWYgKG1vZG5hbWUpCi0JCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHggWyVzXSIsIG5hbWUsIG9mZnNldCwKKworCWlmIChtb2RuYW1lKQorCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHggWyVzXSIsIG5hbWUsIG9mZnNldCwKIAkJCQlzaXplLCBtb2RuYW1lKTsKLQkJZWxzZQotCQkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXMrJSNseC8lI2x4IiwgbmFtZSwgb2Zmc2V0LCBzaXplKTsKLQl9CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyslI2x4LyUjbHgiLCBuYW1lLCBvZmZzZXQsIHNpemUpOwogfQogCiAvKiBMb29rIHVwIGEga2VybmVsIHN5bWJvbCBhbmQgcHJpbnQgaXQgdG8gdGhlIGtlcm5lbCBtZXNzYWdlcy4gKi8KQEAgLTM0Myw4ICszNDIsOCBAQAogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJdW5zaWduZWQgaW50IG5hbWVvZmY7IC8qIElmIGl0ZXJhdGluZyBpbiBjb3JlIGtlcm5lbCBzeW1ib2xzICovCiAJY2hhciB0eXBlOwotCWNoYXIgbmFtZVtLU1lNX05BTUVfTEVOKzFdOwotCWNoYXIgbW9kdWxlX25hbWVbTU9EVUxFX05BTUVfTEVOICsgMV07CisJY2hhciBuYW1lW0tTWU1fTkFNRV9MRU5dOworCWNoYXIgbW9kdWxlX25hbWVbTU9EVUxFX05BTUVfTEVOXTsKIAlpbnQgZXhwb3J0ZWQ7CiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwva2ZpZm8uYyBiL2tlcm5lbC9rZmlmby5jCmluZGV4IGNlZTQxOTEuLmJjNDFhZDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rZmlmby5jCisrKyBiL2tlcm5lbC9rZmlmby5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAvKioKICAqIGtmaWZvX2luaXQgLSBhbGxvY2F0ZXMgYSBuZXcgRklGTyB1c2luZyBhIHByZWFsbG9jYXRlZCBidWZmZXIKQEAgLTQxLDcgKzQyLDcgQEAKIAlzdHJ1Y3Qga2ZpZm8gKmZpZm87CiAKIAkvKiBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyICovCi0JQlVHX09OKHNpemUgJiAoc2l6ZSAtIDEpKTsKKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIoc2l6ZSkpOwogCiAJZmlmbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrZmlmbyksIGdmcF9tYXNrKTsKIAlpZiAoIWZpZm8pCmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCBiYmQ1MWI4Li5hNDA0ZjdlIDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogRVhQT1JUX1NZTUJPTChrdGhyZWFkX3N0b3ApOwogCiAKLXN0YXRpYyBfX2luaXQgdm9pZCBrdGhyZWFkZF9zZXR1cCh2b2lkKQorc3RhdGljIG5vaW5saW5lIF9faW5pdF9yZWZvayB2b2lkIGt0aHJlYWRkX3NldHVwKHZvaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCAxYTVmZjIyLi5lZGJhMmZmIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTM3OSw3ICszNzksNyBAQAogCiBzdGF0aWMgdm9pZCBwcmludF9sb2NrX25hbWUoc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzKQogewotCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU4gKyAxXSwgYzEsIGMyLCBjMywgYzQ7CisJY2hhciBzdHJbS1NZTV9OQU1FX0xFTl0sIGMxLCBjMiwgYzMsIGM0OwogCWNvbnN0IGNoYXIgKm5hbWU7CiAKIAlnZXRfdXNhZ2VfY2hhcnMoY2xhc3MsICZjMSwgJmMyLCAmYzMsICZjNCk7CkBAIC00MDEsNyArNDAxLDcgQEAKIHN0YXRpYyB2b2lkIHByaW50X2xvY2tkZXBfY2FjaGUoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrKQogewogCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY2hhciBzdHJbS1NZTV9OQU1FX0xFTiArIDFdOworCWNoYXIgc3RyW0tTWU1fTkFNRV9MRU5dOwogCiAJbmFtZSA9IGxvY2stPm5hbWU7CiAJaWYgKCFuYW1lKQpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IDAxNWQ2MGMuLjMzYzA0YWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTYxLDEwICs2MSw4IEBACiAvKiBJZiB0aGlzIGlzIHNldCwgdGhlIHNlY3Rpb24gYmVsb25ncyBpbiB0aGUgaW5pdCBwYXJ0IG9mIHRoZSBtb2R1bGUgKi8KICNkZWZpbmUgSU5JVF9PRkZTRVRfTUFTSyAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKQogCi0vKiBQcm90ZWN0cyBtb2R1bGUgbGlzdCAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhtb2RsaXN0X2xvY2spOwotCi0vKiBMaXN0IG9mIG1vZHVsZXMsIHByb3RlY3RlZCBieSBtb2R1bGVfbXV0ZXggQU5EIG1vZGxpc3RfbG9jayAqLworLyogTGlzdCBvZiBtb2R1bGVzLCBwcm90ZWN0ZWQgYnkgbW9kdWxlX211dGV4IG9yIHByZWVtcHRfZGlzYWJsZQorICogKGFkZC9kZWxldGUgdXNlcyBzdG9wX21hY2hpbmUpLiAqLwogc3RhdGljIERFRklORV9NVVRFWChtb2R1bGVfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChtb2R1bGVzKTsKIApAQCAtNzYwLDE0ICs3NTgsMTMgQEAKIHZvaWQgX19zeW1ib2xfcHV0KGNvbnN0IGNoYXIgKnN5bWJvbCkKIHsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmNyYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAlpZiAoIV9fZmluZF9zeW1ib2woc3ltYm9sLCAmb3duZXIsICZjcmMsIDEpKQogCQlCVUcoKTsKIAltb2R1bGVfcHV0KG93bmVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogfQogRVhQT1JUX1NZTUJPTChfX3N5bWJvbF9wdXQpOwogCkBAIC0xMjI4LDE0ICsxMjI1LDE0IEBACiB2b2lkICpfX3N5bWJvbF9nZXQoY29uc3QgY2hhciAqc3ltYm9sKQogewogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwotCXVuc2lnbmVkIGxvbmcgdmFsdWUsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJY29uc3QgdW5zaWduZWQgbG9uZyAqY3JjOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCXZhbHVlID0gX19maW5kX3N5bWJvbChzeW1ib2wsICZvd25lciwgJmNyYywgMSk7CiAJaWYgKHZhbHVlICYmICFzdHJvbmdfdHJ5X21vZHVsZV9nZXQob3duZXIpKQogCQl2YWx1ZSA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJcHJlZW1wdF9lbmFibGUoKTsKIAogCXJldHVybiAodm9pZCAqKXZhbHVlOwogfQpAQCAtMjEzNiw3ICsyMTMzLDcgQEAKIAkJCXN5bSA9IGdldF9rc3ltYm9sKG1vZCwgYWRkciwgTlVMTCwgTlVMTCk7CiAJCQlpZiAoIXN5bSkKIAkJCQlnb3RvIG91dDsKLQkJCXN0cmxjcHkoc3ltbmFtZSwgc3ltLCBLU1lNX05BTUVfTEVOICsgMSk7CisJCQlzdHJsY3B5KHN5bW5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTik7CiAJCQltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjE2MSw5ICsyMTU4LDkgQEAKIAkJCWlmICghc3ltKQogCQkJCWdvdG8gb3V0OwogCQkJaWYgKG1vZG5hbWUpCi0JCQkJc3RybGNweShtb2RuYW1lLCBtb2QtPm5hbWUsIE1PRFVMRV9OQU1FX0xFTiArIDEpOworCQkJCXN0cmxjcHkobW9kbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4pOwogCQkJaWYgKG5hbWUpCi0JCQkJc3RybGNweShuYW1lLCBzeW0sIEtTWU1fTkFNRV9MRU4gKyAxKTsKKwkJCQlzdHJsY3B5KG5hbWUsIHN5bSwgS1NZTV9OQU1FX0xFTik7CiAJCQltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjE4NCw4ICsyMTgxLDggQEAKIAkJCSp2YWx1ZSA9IG1vZC0+c3ltdGFiW3N5bW51bV0uc3RfdmFsdWU7CiAJCQkqdHlwZSA9IG1vZC0+c3ltdGFiW3N5bW51bV0uc3RfaW5mbzsKIAkJCXN0cmxjcHkobmFtZSwgbW9kLT5zdHJ0YWIgKyBtb2QtPnN5bXRhYltzeW1udW1dLnN0X25hbWUsCi0JCQkJS1NZTV9OQU1FX0xFTiArIDEpOwotCQkJc3RybGNweShtb2R1bGVfbmFtZSwgbW9kLT5uYW1lLCBNT0RVTEVfTkFNRV9MRU4gKyAxKTsKKwkJCQlLU1lNX05BTUVfTEVOKTsKKwkJCXN0cmxjcHkobW9kdWxlX25hbWUsIG1vZC0+bmFtZSwgTU9EVUxFX05BTUVfTEVOKTsKIAkJCSpleHBvcnRlZCA9IGlzX2V4cG9ydGVkKG5hbWUsIG1vZCk7CiAJCQltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiAJCQlyZXR1cm4gMDsKQEAgLTIyMzIsMjYgKzIyMjksMTMgQEAKIC8qIENhbGxlZCBieSB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0gdG8gcmV0dXJuIGEgbGlzdCBvZiBtb2R1bGVzLiAqLwogc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppOwotCWxvZmZfdCBuID0gMDsKLQogCW11dGV4X2xvY2soJm1vZHVsZV9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaChpLCAmbW9kdWxlcykgewotCQlpZiAobisrID09ICpwb3MpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gJm1vZHVsZXMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpOworCXJldHVybiBzZXFfbGlzdF9zdGFydCgmbW9kdWxlcywgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppID0gcDsKLQkoKnBvcykrKzsKLQlpZiAoaS0+bmV4dCA9PSAmbW9kdWxlcykKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGktPm5leHQ7CisJcmV0dXJuIHNlcV9saXN0X25leHQocCwgJm1vZHVsZXMsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCkBAIC0yMzIxLDExICsyMzA1LDEwIEBACiAvKiBHaXZlbiBhbiBhZGRyZXNzLCBsb29rIGZvciBpdCBpbiB0aGUgbW9kdWxlIGV4Y2VwdGlvbiB0YWJsZXMuICovCiBjb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpzZWFyY2hfbW9kdWxlX2V4dGFibGVzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmUgPSBOVUxMOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZCwgJm1vZHVsZXMsIGxpc3QpIHsKIAkJaWYgKG1vZC0+bnVtX2V4ZW50cmllcyA9PSAwKQogCQkJY29udGludWU7CkBAIC0yMzM2LDcgKzIzMTksNyBAQAogCQlpZiAoZSkKIAkJCWJyZWFrOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJLyogTm93LCBpZiB3ZSBmb3VuZCBvbmUsIHdlIGFyZSBydW5uaW5nIGluc2lkZSBpdCBub3csIGhlbmNlCiAgICAgICAgICAgIHdlIGNhbm5vdCB1bmxvYWQgdGhlIG1vZHVsZSwgaGVuY2Ugbm8gcmVmY250IG5lZWRlZC4gKi8KQEAgLTIzNDgsMjUgKzIzMzEsMjQgQEAKICAqLwogaW50IGlzX21vZHVsZV9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kLCAmbW9kdWxlcywgbGlzdCkgewogCQlpZiAod2l0aGluKGFkZHIsIG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW9kbGlzdF9sb2NrLCBmbGFncyk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIDA7CiB9CiAKIAotLyogSXMgdGhpcyBhIHZhbGlkIGtlcm5lbCBhZGRyZXNzPyAgV2UgZG9uJ3QgZ3JhYiB0aGUgbG9jazogd2UgYXJlIG9vcHNpbmcuICovCisvKiBJcyB0aGlzIGEgdmFsaWQga2VybmVsIGFkZHJlc3M/ICovCiBzdHJ1Y3QgbW9kdWxlICpfX21vZHVsZV90ZXh0X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZDsKQEAgLTIzODEsMTEgKzIzNjMsMTAgQEAKIHN0cnVjdCBtb2R1bGUgKm1vZHVsZV90ZXh0X2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBtb2R1bGUgKm1vZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1vZGxpc3RfbG9jaywgZmxhZ3MpOworCXByZWVtcHRfZGlzYWJsZSgpOwogCW1vZCA9IF9fbW9kdWxlX3RleHRfYWRkcmVzcyhhZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtb2RsaXN0X2xvY2ssIGZsYWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIG1vZDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3Byb3h5LmMgYi9rZXJuZWwvbnNwcm94eS5jCmluZGV4IDllODNiNTguLjEwZjBiYmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9uc3Byb3h5LmMKKysrIGIva2VybmVsL25zcHJveHkuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbnNwcm94eV9jYWNoZXA7CisKIHN0cnVjdCBuc3Byb3h5IGluaXRfbnNwcm94eSA9IElOSVRfTlNQUk9YWShpbml0X25zcHJveHkpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X25zcHJveHkoc3RydWN0IG5zcHJveHkgKm5zKQpAQCAtNDMsOSArNDUsMTEgQEAKIHsKIAlzdHJ1Y3QgbnNwcm94eSAqbnM7CiAKLQlucyA9IGttZW1kdXAob3JpZywgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5zKQorCW5zID0ga21lbV9jYWNoZV9hbGxvYyhuc3Byb3h5X2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKG5zKSB7CisJCW1lbWNweShucywgb3JpZywgc2l6ZW9mKHN0cnVjdCBuc3Byb3h5KSk7CiAJCWF0b21pY19zZXQoJm5zLT5jb3VudCwgMSk7CisJfQogCXJldHVybiBuczsKIH0KIApAQCAtNTQsMzMgKzU4LDUxIEBACiAgKiBSZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgbnNwcm94eS4gIERvIG5vdCBhdHRhY2ggdGhpcyB0byB0aGUgdGFzaywKICAqIGxlYXZlIGl0IHRvIHRoZSBjYWxsZXIgdG8gZG8gcHJvcGVyIGxvY2tpbmcgYW5kIGF0dGFjaCBpdCB0byB0YXNrLgogICovCi1zdGF0aWMgc3RydWN0IG5zcHJveHkgKmNyZWF0ZV9uZXdfbmFtZXNwYWNlcyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJc3RydWN0IGZzX3N0cnVjdCAqbmV3X2ZzKQorc3RhdGljIHN0cnVjdCBuc3Byb3h5ICpjcmVhdGVfbmV3X25hbWVzcGFjZXModW5zaWduZWQgbG9uZyBmbGFncywKKwkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgZnNfc3RydWN0ICpuZXdfZnMpCiB7CiAJc3RydWN0IG5zcHJveHkgKm5ld19uc3A7CisJaW50IGVycjsKIAogCW5ld19uc3AgPSBjbG9uZV9uc3Byb3h5KHRzay0+bnNwcm94eSk7CiAJaWYgKCFuZXdfbnNwKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCW5ld19uc3AtPm1udF9ucyA9IGNvcHlfbW50X25zKGZsYWdzLCB0c2stPm5zcHJveHktPm1udF9ucywgbmV3X2ZzKTsKLQlpZiAoSVNfRVJSKG5ld19uc3AtPm1udF9ucykpCisJaWYgKElTX0VSUihuZXdfbnNwLT5tbnRfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+bW50X25zKTsKIAkJZ290byBvdXRfbnM7CisJfQogCiAJbmV3X25zcC0+dXRzX25zID0gY29weV91dHNuYW1lKGZsYWdzLCB0c2stPm5zcHJveHktPnV0c19ucyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT51dHNfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+dXRzX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPnV0c19ucyk7CiAJCWdvdG8gb3V0X3V0czsKKwl9CiAKIAluZXdfbnNwLT5pcGNfbnMgPSBjb3B5X2lwY3MoZmxhZ3MsIHRzay0+bnNwcm94eS0+aXBjX25zKTsKLQlpZiAoSVNfRVJSKG5ld19uc3AtPmlwY19ucykpCisJaWYgKElTX0VSUihuZXdfbnNwLT5pcGNfbnMpKSB7CisJCWVyciA9IFBUUl9FUlIobmV3X25zcC0+aXBjX25zKTsKIAkJZ290byBvdXRfaXBjOworCX0KIAogCW5ld19uc3AtPnBpZF9ucyA9IGNvcHlfcGlkX25zKGZsYWdzLCB0c2stPm5zcHJveHktPnBpZF9ucyk7Ci0JaWYgKElTX0VSUihuZXdfbnNwLT5waWRfbnMpKQorCWlmIChJU19FUlIobmV3X25zcC0+cGlkX25zKSkgeworCQllcnIgPSBQVFJfRVJSKG5ld19uc3AtPnBpZF9ucyk7CiAJCWdvdG8gb3V0X3BpZDsKKwl9CisKKwluZXdfbnNwLT51c2VyX25zID0gY29weV91c2VyX25zKGZsYWdzLCB0c2stPm5zcHJveHktPnVzZXJfbnMpOworCWlmIChJU19FUlIobmV3X25zcC0+dXNlcl9ucykpIHsKKwkJZXJyID0gUFRSX0VSUihuZXdfbnNwLT51c2VyX25zKTsKKwkJZ290byBvdXRfdXNlcjsKKwl9CiAKIAlyZXR1cm4gbmV3X25zcDsKIAorb3V0X3VzZXI6CisJaWYgKG5ld19uc3AtPnBpZF9ucykKKwkJcHV0X3BpZF9ucyhuZXdfbnNwLT5waWRfbnMpOwogb3V0X3BpZDoKIAlpZiAobmV3X25zcC0+aXBjX25zKQogCQlwdXRfaXBjX25zKG5ld19uc3AtPmlwY19ucyk7CkBAIC05MSwxNSArMTEzLDE1IEBACiAJaWYgKG5ld19uc3AtPm1udF9ucykKIAkJcHV0X21udF9ucyhuZXdfbnNwLT5tbnRfbnMpOwogb3V0X25zOgotCWtmcmVlKG5ld19uc3ApOwotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWttZW1fY2FjaGVfZnJlZShuc3Byb3h5X2NhY2hlcCwgbmV3X25zcCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogLyoKICAqIGNhbGxlZCBmcm9tIGNsb25lLiAgVGhpcyBub3cgaGFuZGxlcyBjb3B5IGZvciBuc3Byb3h5IGFuZCBhbGwKICAqIG5hbWVzcGFjZXMgdGhlcmVpbi4KICAqLwotaW50IGNvcHlfbmFtZXNwYWNlcyhpbnQgZmxhZ3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoraW50IGNvcHlfbmFtZXNwYWNlcyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlzdHJ1Y3QgbnNwcm94eSAqb2xkX25zID0gdHNrLT5uc3Byb3h5OwogCXN0cnVjdCBuc3Byb3h5ICpuZXdfbnM7CkBAIC0xMTAsNyArMTMyLDcgQEAKIAogCWdldF9uc3Byb3h5KG9sZF9ucyk7CiAKLQlpZiAoIShmbGFncyAmIChDTE9ORV9ORVdOUyB8IENMT05FX05FV1VUUyB8IENMT05FX05FV0lQQykpKQorCWlmICghKGZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDIHwgQ0xPTkVfTkVXVVNFUikpKQogCQlyZXR1cm4gMDsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewpAQCAtMTQwLDcgKzE2Miw5IEBACiAJCXB1dF9pcGNfbnMobnMtPmlwY19ucyk7CiAJaWYgKG5zLT5waWRfbnMpCiAJCXB1dF9waWRfbnMobnMtPnBpZF9ucyk7Ci0Ja2ZyZWUobnMpOworCWlmIChucy0+dXNlcl9ucykKKwkJcHV0X3VzZXJfbnMobnMtPnVzZXJfbnMpOworCWttZW1fY2FjaGVfZnJlZShuc3Byb3h5X2NhY2hlcCwgbnMpOwogfQogCiAvKgpAQCAtMTUyLDE5ICsxNzYsMTAgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAotCWlmICghKHVuc2hhcmVfZmxhZ3MgJiAoQ0xPTkVfTkVXTlMgfCBDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdJUEMpKSkKKwlpZiAoISh1bnNoYXJlX2ZsYWdzICYgKENMT05FX05FV05TIHwgQ0xPTkVfTkVXVVRTIHwgQ0xPTkVfTkVXSVBDIHwKKwkJCSAgICAgICBDTE9ORV9ORVdVU0VSKSkpCiAJCXJldHVybiAwOwogCi0jaWZuZGVmIENPTkZJR19JUENfTlMKLQlpZiAodW5zaGFyZV9mbGFncyAmIENMT05FX05FV0lQQykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfVVRTX05TCi0JaWYgKHVuc2hhcmVfZmxhZ3MgJiBDTE9ORV9ORVdVVFMpCi0JCXJldHVybiAtRUlOVkFMOwotI2VuZGlmCi0KIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKQEAgLTE3NCwzICsxODksMTIgQEAKIAkJZXJyID0gUFRSX0VSUigqbmV3X25zcCk7CiAJcmV0dXJuIGVycjsKIH0KKworc3RhdGljIGludCBfX2luaXQgbnNwcm94eV9jYWNoZV9pbml0KHZvaWQpCit7CisJbnNwcm94eV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibnNwcm94eSIsIHNpemVvZihzdHJ1Y3QgbnNwcm94eSksCisJCQkJCSAgIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChuc3Byb3h5X2NhY2hlX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCA2MjNkMTgyLi5mNjRmNGMxIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTU5LDE0ICsxNTksMTUgQEAKIHsKIAlzdGF0aWMgY2hhciBidWZbMjBdOwogCWlmICh0YWludGVkKSB7Ci0JCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUYWludGVkOiAlYyVjJWMlYyVjJWMlYyIsCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUYWludGVkOiAlYyVjJWMlYyVjJWMlYyVjIiwKIAkJCXRhaW50ZWQgJiBUQUlOVF9QUk9QUklFVEFSWV9NT0RVTEUgPyAnUCcgOiAnRycsCiAJCQl0YWludGVkICYgVEFJTlRfRk9SQ0VEX01PRFVMRSA/ICdGJyA6ICcgJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9VTlNBRkVfU01QID8gJ1MnIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX0ZPUkNFRF9STU1PRCA/ICdSJyA6ICcgJywKICAJCQl0YWludGVkICYgVEFJTlRfTUFDSElORV9DSEVDSyA/ICdNJyA6ICcgJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9CQURfUEFHRSA/ICdCJyA6ICcgJywKLQkJCXRhaW50ZWQgJiBUQUlOVF9VU0VSID8gJ1UnIDogJyAnKTsKKwkJCXRhaW50ZWQgJiBUQUlOVF9VU0VSID8gJ1UnIDogJyAnLAorCQkJdGFpbnRlZCAmIFRBSU5UX0RJRSA/ICdEJyA6ICcgJyk7CiAJfQogCWVsc2UKIAkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIk5vdCB0YWludGVkIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkLmMgYi9rZXJuZWwvcGlkLmMKaW5kZXggZWI2NmJkMi4uYzZlM2Y5ZiAxMDA2NDQKLS0tIGEva2VybmVsL3BpZC5jCisrKyBiL2tlcm5lbC9waWQuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmaW5kX2dldF9waWQpOwogCi1zdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnMoaW50IGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqb2xkX25zKQorc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNvcHlfcGlkX25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpvbGRfbnMpCiB7CiAJQlVHX09OKCFvbGRfbnMpOwogCWdldF9waWRfbnMob2xkX25zKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCAwYmJkZWFjLi4wNTFkMjdlIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC00NDksMTMgKzQ0OSwxNiBAQAogI2Vsc2UKIHN0YXRpYyBpbnQgcHJpbnRrX3RpbWUgPSAwOwogI2VuZGlmCi1tb2R1bGVfcGFyYW0ocHJpbnRrX3RpbWUsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtX25hbWVkKHRpbWUsIHByaW50a190aW1lLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHByaW50a190aW1lX3NldHVwKGNoYXIgKnN0cikKIHsKIAlpZiAoKnN0cikKIAkJcmV0dXJuIDA7CiAJcHJpbnRrX3RpbWUgPSAxOworCXByaW50ayhLRVJOX05PVElDRSAiVGhlICd0aW1lJyBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgIgorCQkiaXMgc2NoZWR1bGVkIGZvciByZW1vdmFsIGluIGVhcmx5IDIwMDhcbiIpOworCXByaW50ayhLRVJOX05PVElDRSAiVXNlICdwcmludGsudGltZT08dmFsdWU+JyBpbnN0ZWFkXG4iKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNDgzLDYgKzQ4Niw5IEBACiAgKiBAZm10OiBmb3JtYXQgc3RyaW5nCiAgKgogICogVGhpcyBpcyBwcmludGsoKS4gIEl0IGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4gIFdlIHdhbnQgaXQgdG8gd29yay4KKyAqIEJlIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgaWYgb29wc19pbl9wcm9ncmVzcyBpcyBub3Qgc2V0LCB3ZSBtaWdodCB0cnkgdG8KKyAqIHdha2Uga2xvZ2QgdXAgd2hpY2ggY291bGQgZGVhZGxvY2sgb24gcnVucXVldWUgbG9jayBpZiBwcmludGsoKSBpcyBjYWxsZWQKKyAqIGZyb20gc2NoZWR1bGVyIGNvZGUuCiAgKgogICogV2UgdHJ5IHRvIGdyYWIgdGhlIGNvbnNvbGVfc2VtLiAgSWYgd2Ugc3VjY2VlZCwgaXQncyBlYXN5IC0gd2UgbG9nIHRoZSBvdXRwdXQgYW5kCiAgKiBjYWxsIHRoZSBjb25zb2xlIGRyaXZlcnMuICBJZiB3ZSBmYWlsIHRvIGdldCB0aGUgc2VtYXBob3JlIHdlIHBsYWNlIHRoZSBvdXRwdXQKQEAgLTY1NCw3ICs2NjAsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBjb25zb2xlX3NldHVwKGNoYXIgKnN0cikKIHsKLQljaGFyIG5hbWVbc2l6ZW9mKGNvbnNvbGVfY21kbGluZVswXS5uYW1lKV07CisJY2hhciBidWZbc2l6ZW9mKGNvbnNvbGVfY21kbGluZVswXS5uYW1lKSArIDRdOyAvKiA0IGZvciBpbmRleCAqLwogCWNoYXIgKnMsICpvcHRpb25zOwogCWludCBpZHg7CiAKQEAgLTY2MiwyNyArNjY4LDI3IEBACiAJICogRGVjb2RlIHN0ciBpbnRvIG5hbWUsIGluZGV4LCBvcHRpb25zLgogCSAqLwogCWlmIChzdHJbMF0gPj0gJzAnICYmIHN0clswXSA8PSAnOScpIHsKLQkJc3RyY3B5KG5hbWUsICJ0dHlTIik7Ci0JCXN0cm5jcHkobmFtZSArIDQsIHN0ciwgc2l6ZW9mKG5hbWUpIC0gNSk7CisJCXN0cmNweShidWYsICJ0dHlTIik7CisJCXN0cm5jcHkoYnVmICsgNCwgc3RyLCBzaXplb2YoYnVmKSAtIDUpOwogCX0gZWxzZSB7Ci0JCXN0cm5jcHkobmFtZSwgc3RyLCBzaXplb2YobmFtZSkgLSAxKTsKKwkJc3RybmNweShidWYsIHN0ciwgc2l6ZW9mKGJ1ZikgLSAxKTsKIAl9Ci0JbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9IDA7CisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogCWlmICgob3B0aW9ucyA9IHN0cmNocihzdHIsICcsJykpICE9IE5VTEwpCiAJCSoob3B0aW9ucysrKSA9IDA7CiAjaWZkZWYgX19zcGFyY19fCiAJaWYgKCFzdHJjbXAoc3RyLCAidHR5YSIpKQotCQlzdHJjcHkobmFtZSwgInR0eVMwIik7CisJCXN0cmNweShidWYsICJ0dHlTMCIpOwogCWlmICghc3RyY21wKHN0ciwgInR0eWIiKSkKLQkJc3RyY3B5KG5hbWUsICJ0dHlTMSIpOworCQlzdHJjcHkoYnVmLCAidHR5UzEiKTsKICNlbmRpZgotCWZvciAocyA9IG5hbWU7ICpzOyBzKyspCisJZm9yIChzID0gYnVmOyAqczsgcysrKQogCQlpZiAoKCpzID49ICcwJyAmJiAqcyA8PSAnOScpIHx8ICpzID09ICcsJykKIAkJCWJyZWFrOwogCWlkeCA9IHNpbXBsZV9zdHJ0b3VsKHMsIE5VTEwsIDEwKTsKIAkqcyA9IDA7CiAKLQlhZGRfcHJlZmVycmVkX2NvbnNvbGUobmFtZSwgaWR4LCBvcHRpb25zKTsKKwlhZGRfcHJlZmVycmVkX2NvbnNvbGUoYnVmLCBpZHgsIG9wdGlvbnMpOwogCXJldHVybiAxOwogfQogX19zZXR1cCgiY29uc29sZT0iLCBjb25zb2xlX3NldHVwKTsKQEAgLTcwOSw3ICs3MTUsNyBAQAogCSAqCVNlZSBpZiB0aGlzIHR0eSBpcyBub3QgeWV0IHJlZ2lzdGVyZWQsIGFuZAogCSAqCWlmIHdlIGhhdmUgYSBzbG90IGZyZWUuCiAJICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQ01ETElORUNPTlNPTEVTICYmIGNvbnNvbGVfY21kbGluZVtpXS5uYW1lWzBdOyBpKyspCiAJCWlmIChzdHJjbXAoY29uc29sZV9jbWRsaW5lW2ldLm5hbWUsIG5hbWUpID09IDAgJiYKIAkJCSAgY29uc29sZV9jbWRsaW5lW2ldLmluZGV4ID09IGlkeCkgewogCQkJCXNlbGVjdGVkX2NvbnNvbGUgPSBpOwpAQCAtNzI2LDYgKzczMiwyNSBAQAogCXJldHVybiAwOwogfQogCitpbnQgX19pbml0IHVwZGF0ZV9jb25zb2xlX2NtZGxpbmUoY2hhciAqbmFtZSwgaW50IGlkeCwgY2hhciAqbmFtZV9uZXcsIGludCBpZHhfbmV3LCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCBjb25zb2xlX2NtZGxpbmUgKmM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NNRExJTkVDT05TT0xFUyAmJiBjb25zb2xlX2NtZGxpbmVbaV0ubmFtZVswXTsgaSsrKQorCQlpZiAoc3RyY21wKGNvbnNvbGVfY21kbGluZVtpXS5uYW1lLCBuYW1lKSA9PSAwICYmCisJCQkgIGNvbnNvbGVfY21kbGluZVtpXS5pbmRleCA9PSBpZHgpIHsKKwkJCQljID0gJmNvbnNvbGVfY21kbGluZVtpXTsKKwkJCQltZW1jcHkoYy0+bmFtZSwgbmFtZV9uZXcsIHNpemVvZihjLT5uYW1lKSk7CisJCQkJYy0+bmFtZVtzaXplb2YoYy0+bmFtZSkgLSAxXSA9IDA7CisJCQkJYy0+b3B0aW9ucyA9IG9wdGlvbnM7CisJCQkJYy0+aW5kZXggPSBpZHhfbmV3OworCQkJCXJldHVybiBpOworCQl9CisJLyogbm90IGZvdW5kICovCisJcmV0dXJuIC0xOworfQorCiAjaWZuZGVmIENPTkZJR19ESVNBQkxFX0NPTlNPTEVfU1VTUEVORAogLyoqCiAgKiBzdXNwZW5kX2NvbnNvbGUgLSBzdXNwZW5kIHRoZSBjb25zb2xlIHN1YnN5c3RlbQpAQCAtOTQyLDYgKzk2Nyw5IEBACiAJaWYgKHByZWZlcnJlZF9jb25zb2xlIDwgMCB8fCBib290Y29uc29sZSB8fCAhY29uc29sZV9kcml2ZXJzKQogCQlwcmVmZXJyZWRfY29uc29sZSA9IHNlbGVjdGVkX2NvbnNvbGU7CiAKKwlpZiAoY29uc29sZS0+ZWFybHlfc2V0dXApCisJCWNvbnNvbGUtPmVhcmx5X3NldHVwKCk7CisKIAkvKgogCSAqCVNlZSBpZiB3ZSB3YW50IHRvIHVzZSB0aGlzIGNvbnNvbGUgZHJpdmVyLiBJZiB3ZQogCSAqCWRpZG4ndCBzZWxlY3QgYSBjb25zb2xlIHdlIHRha2UgdGhlIGZpcnN0IG9uZQpAQCAtOTg1LDEyICsxMDEzLDE1IEBACiAJaWYgKCEoY29uc29sZS0+ZmxhZ3MgJiBDT05fRU5BQkxFRCkpCiAJCXJldHVybjsKIAotCWlmIChib290Y29uc29sZSkgeworCWlmIChib290Y29uc29sZSAmJiAoY29uc29sZS0+ZmxhZ3MgJiBDT05fQ09OU0RFVikpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiY29uc29sZSBoYW5kb3ZlcjogYm9vdCBbJXMlZF0gLT4gcmVhbCBbJXMlZF1cbiIsCiAJCSAgICAgICBib290Y29uc29sZS0+bmFtZSwgYm9vdGNvbnNvbGUtPmluZGV4LAogCQkgICAgICAgY29uc29sZS0+bmFtZSwgY29uc29sZS0+aW5kZXgpOwogCQl1bnJlZ2lzdGVyX2NvbnNvbGUoYm9vdGNvbnNvbGUpOwogCQljb25zb2xlLT5mbGFncyAmPSB+Q09OX1BSSU5UQlVGRkVSOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gImNvbnNvbGUgWyVzJWRdIGVuYWJsZWRcbiIsCisJCSAgICAgICBjb25zb2xlLT5uYW1lLCBjb25zb2xlLT5pbmRleCk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCBhZDc5NDlhLi40YTE3NDVmMSAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTYxLDYgKzE2MSw3IEBACiBpbnQgcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJYXVkaXRfcHRyYWNlKHRhc2spOwogCkBAIC0xODEsOSArMTgyLDcgQEAKIAkgKiBjcHUncyB0aGF0IG1heSBoYXZlIHRhc2tfbG9jaykuCiAJICovCiAJdGFza19sb2NrKHRhc2spOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKCF3cml0ZV90cnlsb2NrKCZ0YXNrbGlzdF9sb2NrKSkgewotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKCF3cml0ZV90cnlsb2NrX2lycXNhdmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKSkgewogCQl0YXNrX3VubG9jayh0YXNrKTsKIAkJZG8gewogCQkJY3B1X3JlbGF4KCk7CkBAIC0yMTEsNyArMjEwLDcgQEAKIAlmb3JjZV9zaWdfc3BlY2lmaWMoU0lHU1RPUCwgdGFzayk7CiAKIGJhZDoKLQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdGFza2xpc3RfbG9jaywgZmxhZ3MpOwogCXRhc2tfdW5sb2NrKHRhc2spOwogb3V0OgogCXJldHVybiByZXR2YWw7CkBAIC00OTEsMyArNDkwLDIyIEBACiAJcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBfX0FSQ0hfU1lTX1BUUkFDRSAqLworCitpbnQgZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGxvbmcgYWRkciwgbG9uZyBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBjb3BpZWQ7CisKKwljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bSh0c2ssIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhKTsKK30KKworaW50IGdlbmVyaWNfcHRyYWNlX3Bva2VkYXRhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwlpbnQgY29waWVkOworCisJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0odHNrLCBhZGRyLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAxKTsKKwlyZXR1cm4gKGNvcGllZCA9PSBzaXplb2YoZGF0YSkpID8gMCA6IC1FSU87Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dG9ydHVyZS5jIGIva2VybmVsL3JjdXRvcnR1cmUuYwppbmRleCA1NWJhODJhLi5kZGZmMzMyIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dG9ydHVyZS5jCisrKyBiL2tlcm5lbC9yY3V0b3J0dXJlLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01MTgsNyArNTE5LDYgQEAKIAogCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfd3JpdGVyIHRhc2sgc3RhcnRlZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJZG8gewogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKQEAgLTU1OCw3ICs1NTgsNiBAQAogCiAJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9mYWtld3JpdGVyIHRhc2sgc3RhcnRlZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgMTkpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJZG8gewogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxICsgcmN1X3JhbmRvbSgmcmFuZCklMTApOwpAQCAtNTg5LDcgKzU4OCw2IEBACiAKIAlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3JlYWRlciB0YXNrIHN0YXJ0ZWQiKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDE5KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCWRvIHsKIAkJaWR4ID0gY3VyX29wcy0+cmVhZGxvY2soKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCmluZGV4IGRhOGQ2YmYuLjVhZWRiZWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwpAQCAtMjksMTIgKzI5LDYgQEAKIAogI2luY2x1ZGUgInJ0bXV0ZXhfY29tbW9uLmgiCiAKLSNpZmRlZiBDT05GSUdfREVCVUdfUlRfTVVURVhFUwotIyBpbmNsdWRlICJydG11dGV4LWRlYnVnLmgiCi0jZWxzZQotIyBpbmNsdWRlICJydG11dGV4LmgiCi0jZW5kaWYKLQogIyBkZWZpbmUgVFJBQ0VfV0FSTl9PTih4KQkJCVdBUk5fT04oeCkKICMgZGVmaW5lIFRSQUNFX0JVR19PTih4KQkJCUJVR19PTih4KQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC10ZXN0ZXIuYyBiL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCmluZGV4IDAxNWZjNjMuLmUzMDU1YmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCisrKyBiL2tlcm5lbC9ydG11dGV4LXRlc3Rlci5jCkBAIC0yNjAsNiArMjYwLDcgQEAKIAlpbnQgcmV0OwogCiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTVVURVhfVEVTVEVSOworCXNldF9mcmVlemFibGUoKTsKIAlhbGxvd19zaWduYWwoU0lHSFVQKTsKIAogCWZvcig7OykgewpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggMTdkMjhjZS4uOGNkOWJkMiAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC0xNywxMiArMTcsNiBAQAogCiAjaW5jbHVkZSAicnRtdXRleF9jb21tb24uaCIKIAotI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCi0jIGluY2x1ZGUgInJ0bXV0ZXgtZGVidWcuaCIKLSNlbHNlCi0jIGluY2x1ZGUgInJ0bXV0ZXguaCIKLSNlbmRpZgotCiAvKgogICogbG9jay0+b3duZXIgc3RhdGUgdHJhY2tpbmc6CiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXhfY29tbW9uLmggYi9rZXJuZWwvcnRtdXRleF9jb21tb24uaAppbmRleCA5Yzc1ODU2Li4yZDNiODM1IDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleF9jb21tb24uaAorKysgYi9rZXJuZWwvcnRtdXRleF9jb21tb24uaApAQCAtMTAzLDcgKzEwMyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpydF9tdXRleF9yZWFsX293bmVyKHN0cnVjdCBydF9tdXRleCAqbG9jaykKIHsKLSAJcmV0dXJuIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikKKwlyZXR1cm4gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKQogCQkoKHVuc2lnbmVkIGxvbmcpbG9jay0+b3duZXIgJiB+UlRfTVVURVhfSEFTX1dBSVRFUlMpOwogfQogCkBAIC0xMjAsNCArMTIwLDExIEBACiAJCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJveHlfb3duZXIpOwogZXh0ZXJuIHZvaWQgcnRfbXV0ZXhfcHJveHlfdW5sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJveHlfb3duZXIpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKKyMgaW5jbHVkZSAicnRtdXRleC1kZWJ1Zy5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicnRtdXRleC5oIgorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCAzMzMyYmJiLi5jYjMxZmI0IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtNzM2LDcgKzczNiw5IEBACiAgKgogICogVGhlICIxMCUgZWZmZWN0IiBpcyByZWxhdGl2ZSBhbmQgY3VtdWxhdGl2ZTogZnJvbSBfYW55XyBuaWNlIGxldmVsLAogICogaWYgeW91IGdvIHVwIDEgbGV2ZWwsIGl0J3MgLTEwJSBDUFUgdXNhZ2UsIGlmIHlvdSBnbyBkb3duIDEgbGV2ZWwKLSAqIGl0J3MgKzEwJSBDUFUgdXNhZ2UuCisgKiBpdCdzICsxMCUgQ1BVIHVzYWdlLiAodG8gYWNoaWV2ZSB0aGF0IHdlIHVzZSBhIG11bHRpcGxpZXIgb2YgMS4yNS4KKyAqIElmIGEgdGFzayBnb2VzIHVwIGJ5IH4xMCUgYW5kIGFub3RoZXIgdGFzayBnb2VzIGRvd24gYnkgfjEwJSB0aGVuCisgKiB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgYmV0d2VlbiB0aGVtIGlzIH4yNSUuKQogICovCiBzdGF0aWMgY29uc3QgaW50IHByaW9fdG9fd2VpZ2h0WzQwXSA9IHsKIC8qIC0yMCAqLyA4ODgxOCwgNzEwNTQsIDU2ODQzLCA0NTQ3NSwgMzYzODAsIDI5MTA0LCAyMzI4MywgMTg2MjYsIDE0OTAxLCAxMTkyMSwKQEAgLTc0NiwxNSArNzQ4LDIyIEBACiAvKiAgMTAgKi8gICAxMTAsICAgIDg3LCAgICA3MCwgICAgNTYsICAgIDQ1LCAgICAzNiwgICAgMjksICAgIDIzLCAgICAxOCwgICAgMTUsCiB9OwogCisvKgorICogSW52ZXJzZSAoMl4zMi94KSB2YWx1ZXMgb2YgdGhlIHByaW9fdG9fd2VpZ2h0W10gYXJyYXksIHByZWNhbGN1bGF0ZWQuCisgKgorICogSW4gY2FzZXMgd2hlcmUgdGhlIHdlaWdodCBkb2VzIG5vdCBjaGFuZ2Ugb2Z0ZW4sIHdlIGNhbiB1c2UgdGhlCisgKiBwcmVjYWxjdWxhdGVkIGludmVyc2UgdG8gc3BlZWQgdXAgYXJpdGhtZXRpY3MgYnkgdHVybmluZyBkaXZpc2lvbnMKKyAqIGludG8gbXVsdGlwbGljYXRpb25zOgorICovCiBzdGF0aWMgY29uc3QgdTMyIHByaW9fdG9fd211bHRbNDBdID0gewotCTQ4MzU2LCAgIDYwNDQ2LCAgIDc1NTU4LCAgIDk0NDQ2LCAgMTE4MDU4LCAgMTQ3NTczLAotCTE4NDQ2NywgIDIzMDU4OSwgIDI4ODIzMywgIDM2MDI4NSwgIDQ1MDM0NywKLQk1NjI5NzksICA3MDM3NDYsICA4Nzk1NzUsIDEwOTk1ODIsIDEzNzQzODksCi0JMTcxNzk4NiwgMjE0NzQ4MywgMjY4NDM1NCwgMzM1NTQ0MywgNDE5NDMwNCwKLQk1MjQ0MTYwLCA2NTU3MjAxLCA4MTk2NTAyLCAxMDI1MDUxOCwgMTI3ODI2NDAsCi0JMTYwMjU5OTcsIDE5OTc2NTkyLCAyNDk3MDc0MCwgMzEzNTAxMjYsIDM5MDQ1MTU3LAotCTQ5MzY3NDQwLCA2MTM1NjY3NSwgNzY2OTU4NDQsIDk1NDQzNzE3LCAxMTkzMDQ2NDcsCi0JMTQ4MTAyMzIwLCAxODY3Mzc3MDgsIDIzODYwOTI5NCwgMjg2MzMxMTUzLAorLyogLTIwICovICAgICA0ODM1NiwgICAgIDYwNDQ2LCAgICAgNzU1NTgsICAgICA5NDQ0NiwgICAgMTE4MDU4LAorLyogLTE1ICovICAgIDE0NzU3MywgICAgMTg0NDY3LCAgICAyMzA1ODksICAgIDI4ODIzMywgICAgMzYwMjg1LAorLyogLTEwICovICAgIDQ1MDM0NywgICAgNTYyOTc5LCAgICA3MDM3NDYsICAgIDg3OTU3NSwgICAxMDk5NTgyLAorLyogIC01ICovICAgMTM3NDM4OSwgICAxNzE3OTg2LCAgIDIxNDc0ODMsICAgMjY4NDM1NCwgICAzMzU1NDQzLAorLyogICAwICovICAgNDE5NDMwNCwgICA1MjQ0MTYwLCAgIDY1NTcyMDEsICAgODE5NjUwMiwgIDEwMjUwNTE4LAorLyogICA1ICovICAxMjc4MjY0MCwgIDE2MDI1OTk3LCAgMTk5NzY1OTIsICAyNDk3MDc0MCwgIDMxMzUwMTI2LAorLyogIDEwICovICAzOTA0NTE1NywgIDQ5MzY3NDQwLCAgNjEzNTY2NzUsICA3NjY5NTg0NCwgIDk1NDQzNzE3LAorLyogIDE1ICovIDExOTMwNDY0NywgMTQ4MTAyMzIwLCAxODY3Mzc3MDgsIDIzODYwOTI5NCwgMjg2MzMxMTUzLAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC00OTAzLDggKzQ5MTIsNiBAQAogCQlzdHJ1Y3QgbWlncmF0aW9uX3JlcSAqcmVxOwogCQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwogCi0JCXRyeV90b19mcmVlemUoKTsKLQogCQlzcGluX2xvY2tfaXJxKCZycS0+bG9jayk7CiAKIAkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpIHsKQEAgLTUxMzgsNyArNTE0NSw2IEBACiAJCXAgPSBrdGhyZWFkX2NyZWF0ZShtaWdyYXRpb25fdGhyZWFkLCBoY3B1LCAibWlncmF0aW9uLyVkIiwgY3B1KTsKIAkJaWYgKElTX0VSUihwKSkKIAkJCXJldHVybiBOT1RJRllfQkFEOwotCQlwLT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAkJa3RocmVhZF9iaW5kKHAsIGNwdSk7CiAJCS8qIE11c3QgYmUgaGlnaCBwcmlvOiBzdG9wX21hY2hpbmUgZXhwZWN0cyB0byB5aWVsZCB0byBpdC4gKi8KIAkJcnEgPSB0YXNrX3JxX2xvY2socCwgJmZsYWdzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zZWNjb21wLmMgYi9rZXJuZWwvc2VjY29tcC5jCmluZGV4IGMzMzkxYjYuLmFkNjRmY2IgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zZWNjb21wLmMKKysrIGIva2VybmVsL3NlY2NvbXAuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKIC8qICNkZWZpbmUgU0VDQ09NUF9ERUJVRyAxICovCisjZGVmaW5lIE5SX1NFQ0NPTVBfTU9ERVMgMQogCiAvKgogICogU2VjdXJlIGNvbXB1dGluZyBtb2RlIDEgYWxsb3dzIG9ubHkgcmVhZC93cml0ZS9leGl0L3NpZ3JldHVybi4KQEAgLTU0LDMgKzU1LDMxIEBACiAjZW5kaWYKIAlkb19leGl0KFNJR0tJTEwpOwogfQorCitsb25nIHByY3RsX2dldF9zZWNjb21wKHZvaWQpCit7CisJcmV0dXJuIGN1cnJlbnQtPnNlY2NvbXAubW9kZTsKK30KKworbG9uZyBwcmN0bF9zZXRfc2VjY29tcCh1bnNpZ25lZCBsb25nIHNlY2NvbXBfbW9kZSkKK3sKKwlsb25nIHJldDsKKworCS8qIGNhbiBzZXQgaXQgb25seSBvbmNlIHRvIGJlIGV2ZW4gbW9yZSBzZWN1cmUgKi8KKwlyZXQgPSAtRVBFUk07CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnNlY2NvbXAubW9kZSkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoc2VjY29tcF9tb2RlICYmIHNlY2NvbXBfbW9kZSA8PSBOUl9TRUNDT01QX01PREVTKSB7CisJCWN1cnJlbnQtPnNlY2NvbXAubW9kZSA9IHNlY2NvbXBfbW9kZTsKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl9TRUNDT01QKTsKKyNpZmRlZiBUSUZfTk9UU0MKKwkJZGlzYWJsZV9UU0MoKTsKKyNlbmRpZgorCQlyZXQgPSAwOworCX0KKworIG91dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NpZ25hbC5jIGIva2VybmVsL3NpZ25hbC5jCmluZGV4IGY5NDA1NjAuLjM5ZDEyMjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTcxOCw2ICs3MTgsMzcgQEAKICNkZWZpbmUgTEVHQUNZX1FVRVVFKHNpZ3B0ciwgc2lnKSBcCiAJKCgoc2lnKSA8IFNJR1JUTUlOKSAmJiBzaWdpc21lbWJlcigmKHNpZ3B0ciktPnNpZ25hbCwgKHNpZykpKQogCitpbnQgcHJpbnRfZmF0YWxfc2lnbmFsczsKKworc3RhdGljIHZvaWQgcHJpbnRfZmF0YWxfc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2lnbnIpCit7CisJcHJpbnRrKCIlcy8lZDogcG90ZW50aWFsbHkgdW5leHBlY3RlZCBmYXRhbCBzaWduYWwgJWQuXG4iLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNpZ25yKTsKKworI2lmZGVmIF9faTM4Nl9fCisJcHJpbnRrKCJjb2RlIGF0ICUwOGx4OiAiLCByZWdzLT5laXApOworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQl1bnNpZ25lZCBjaGFyIGluc247CisKKwkJCV9fZ2V0X3VzZXIoaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikocmVncy0+ZWlwICsgaSkpOworCQkJcHJpbnRrKCIlMDJ4ICIsIGluc24pOworCQl9CisJfQorI2VuZGlmCisJcHJpbnRrKCJcbiIpOworCXNob3dfcmVncyhyZWdzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfcHJpbnRfZmF0YWxfc2lnbmFscyhjaGFyICpzdHIpCit7CisJZ2V0X29wdGlvbiAoJnN0ciwgJnByaW50X2ZhdGFsX3NpZ25hbHMpOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInByaW50LWZhdGFsLXNpZ25hbHM9Iiwgc2V0dXBfcHJpbnRfZmF0YWxfc2lnbmFscyk7CiAKIHN0YXRpYyBpbnQKIHNwZWNpZmljX3NlbmRfc2lnX2luZm8oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKQEAgLTE4NTUsNiArMTg4Niw4IEBACiAJCSAqIEFueXRoaW5nIGVsc2UgaXMgZmF0YWwsIG1heWJlIHdpdGggYSBjb3JlIGR1bXAuCiAJCSAqLwogCQljdXJyZW50LT5mbGFncyB8PSBQRl9TSUdOQUxFRDsKKwkJaWYgKChzaWduciAhPSBTSUdLSUxMKSAmJiBwcmludF9mYXRhbF9zaWduYWxzKQorCQkJcHJpbnRfZmF0YWxfc2lnbmFsKHJlZ3MsIHNpZ25yKTsKIAkJaWYgKHNpZ19rZXJuZWxfY29yZWR1bXAoc2lnbnIpKSB7CiAJCQkvKgogCQkJICogSWYgaXQgd2FzIGFibGUgdG8gZHVtcCBjb3JlLCB0aGlzIGtpbGxzIGFsbApkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggNzMyMTdhOS4uMGY1NDZkZCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CkBAIC00ODgsOCArNDg5LDYgQEAKIAogc3RhdGljIGludCBrc29mdGlycWQodm9pZCAqIF9fYmluZF9jcHUpCiB7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7Ci0KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKQEAgLTYxNCwxMiArNjEzLDE2IEBACiAJCWt0aHJlYWRfYmluZChwZXJfY3B1KGtzb2Z0aXJxZCwgaG90Y3B1KSwKIAkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKIAljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgorCWNhc2UgQ1BVX0RFQURfRlJPWkVOOiB7CisJCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OworCiAJCXAgPSBwZXJfY3B1KGtzb2Z0aXJxZCwgaG90Y3B1KTsKIAkJcGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSkgPSBOVUxMOworCQlzY2hlZF9zZXRzY2hlZHVsZXIocCwgU0NIRURfRklGTywgJnBhcmFtKTsKIAkJa3RocmVhZF9zdG9wKHApOwogCQl0YWtlb3Zlcl90YXNrbGV0cyhob3RjcHUpOwogCQlicmVhazsKKwl9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAgCX0KIAlyZXR1cm4gTk9USUZZX09LOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRsb2NrdXAuYyBiL2tlcm5lbC9zb2Z0bG9ja3VwLmMKaW5kZXggMDEzMWUyOS4uNzA4ZDQ4OCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRsb2NrdXAuYworKysgYi9rZXJuZWwvc29mdGxvY2t1cC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTE2LDcgKzExNyw2IEBACiAJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CiAKIAlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCS8qIGluaXRpYWxpemUgdGltZXN0YW1wICovCiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N0b3BfbWFjaGluZS5jIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCmluZGV4IGZjZWUyYTguLjMxOTgyMWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYworKysgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKQEAgLTkzLDEwICs5Myw2IEBACiBzdGF0aWMgaW50IHN0b3BfbWFjaGluZSh2b2lkKQogewogCWludCBpLCByZXQgPSAwOwotCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OwotCi0JLyogT25lIGhpZ2gtcHJpbyB0aHJlYWQgcGVyIGNwdS4gIFdlJ2xsIGRvIHRoaXMgb25lLiAqLwotCXNjaGVkX3NldHNjaGVkdWxlcihjdXJyZW50LCBTQ0hFRF9GSUZPLCAmcGFyYW0pOwogCiAJYXRvbWljX3NldCgmc3RvcG1hY2hpbmVfdGhyZWFkX2FjaywgMCk7CiAJc3RvcG1hY2hpbmVfbnVtX3RocmVhZHMgPSAwOwpAQCAtMTg5LDYgKzE4NSwxMCBAQAogCiAJcCA9IGt0aHJlYWRfY3JlYXRlKGRvX3N0b3AsICZzbWRhdGEsICJrc3RvcG1hY2hpbmUiKTsKIAlpZiAoIUlTX0VSUihwKSkgeworCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKKworCQkvKiBPbmUgaGlnaC1wcmlvIHRocmVhZCBwZXIgY3B1LiAgV2UnbGwgZG8gdGhpcyBvbmUuICovCisJCXNjaGVkX3NldHNjaGVkdWxlcihwLCBTQ0hFRF9GSUZPLCAmcGFyYW0pOwogCQlrdGhyZWFkX2JpbmQocCwgY3B1KTsKIAkJd2FrZV91cF9wcm9jZXNzKHApOwogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzbWRhdGEuZG9uZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggODcyMjcxYy4uNGQxNDFhZSAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMzEsMTAgKzMxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvY25fcHJvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTEwNzgsMTMgKzEwODAsMTMgQEAKIHsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKm5ld191c2VyOwogCi0JbmV3X3VzZXIgPSBhbGxvY191aWQobmV3X3J1aWQpOworCW5ld191c2VyID0gYWxsb2NfdWlkKGN1cnJlbnQtPm5zcHJveHktPnVzZXJfbnMsIG5ld19ydWlkKTsKIAlpZiAoIW5ld191c2VyKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmIChhdG9taWNfcmVhZCgmbmV3X3VzZXItPnByb2Nlc3NlcykgPj0KIAkJCQljdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX05QUk9DXS5ybGltX2N1ciAmJgotCQkJbmV3X3VzZXIgIT0gJnJvb3RfdXNlcikgeworCQkJbmV3X3VzZXIgIT0gY3VycmVudC0+bnNwcm94eS0+dXNlcl9ucy0+cm9vdF91c2VyKSB7CiAJCWZyZWVfdWlkKG5ld191c2VyKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtMjI0MSw2ICsyMjQzLDEzIEBACiAJCQllcnJvciA9IFNFVF9FTkRJQU4oY3VycmVudCwgYXJnMik7CiAJCQlicmVhazsKIAorCQljYXNlIFBSX0dFVF9TRUNDT01QOgorCQkJZXJyb3IgPSBwcmN0bF9nZXRfc2VjY29tcCgpOworCQkJYnJlYWs7CisJCWNhc2UgUFJfU0VUX1NFQ0NPTVA6CisJCQllcnJvciA9IHByY3RsX3NldF9zZWNjb21wKGFyZzIpOworCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IDdlMTFlMmMuLmIwZWM0OTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNfbmkuYworKysgYi9rZXJuZWwvc3lzX25pLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogY29uZF9zeXNjYWxsKHN5c19uZnNzZXJ2Y3RsKTsKIGNvbmRfc3lzY2FsbChzeXNfcXVvdGFjdGwpOworY29uZF9zeXNjYWxsKHN5czMyX3F1b3RhY3RsKTsKIGNvbmRfc3lzY2FsbChzeXNfYWNjdCk7CiBjb25kX3N5c2NhbGwoc3lzX2xvb2t1cF9kY29va2llKTsKIGNvbmRfc3lzY2FsbChzeXNfc3dhcG9uKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBkOTNlMTNkLi43MDYzZWJjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KQEAgLTQ5LDkgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAotZXh0ZXJuIGludCBwcm9jX25yX2ZpbGVzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7Ci0KICNpZmRlZiBDT05GSUdfWDg2CiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CkBAIC02MSw2ICs1OSw3IEBACiAKIC8qIEV4dGVybmFsIHZhcmlhYmxlcyBub3QgaW4gYSBoZWFkZXIgZmlsZS4gKi8KIGV4dGVybiBpbnQgQ19BX0Q7CitleHRlcm4gaW50IHByaW50X2ZhdGFsX3NpZ25hbHM7CiBleHRlcm4gaW50IHN5c2N0bF9vdmVyY29tbWl0X21lbW9yeTsKIGV4dGVybiBpbnQgc3lzY3RsX292ZXJjb21taXRfcmF0aW87CiBleHRlcm4gaW50IHN5c2N0bF9wYW5pY19vbl9vb207CkBAIC0yMDIsNyArMjAxLDEwIEBACiAJCS5tb2RlCQk9IDA1NTUsCiAJCS5jaGlsZAkJPSBkZXZfdGFibGUsCiAJfSwKLQorLyoKKyAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAorICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CisgKi8KIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApAQCAtMzQwLDYgKzM0MiwxNCBAQAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJfSwKICNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJwcmludC1mYXRhbC1zaWduYWxzIiwKKwkJLmRhdGEJCT0gJnByaW50X2ZhdGFsX3NpZ25hbHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAogI2lmZGVmIF9fc3BhcmNfXwogCXsKIAkJLmN0bF9uYW1lCT0gS0VSTl9TUEFSQ19SRUJPT1QsCkBAIC04MTQsNiArODI0LDE0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAkgfSwKKwkgeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gImh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlIiwKKwkJLmRhdGEJCT0gJmh1Z2VwYWdlc190cmVhdF9hc19tb3ZhYmxlLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJmh1Z2V0bGJfdHJlYXRfbW92YWJsZV9oYW5kbGVyLAorCX0sCiAjZW5kaWYKIAl7CiAJCS5jdGxfbmFtZQk9IFZNX0xPV01FTV9SRVNFUlZFX1JBVElPLApAQCAtOTU4LDYgKzk3NiwxNyBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19taW5tYXgsCiAJfSwKKyNpZmRlZiBDT05GSUdfTlVNQQorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJudW1hX3pvbmVsaXN0X29yZGVyIiwKKwkJLmRhdGEJCT0gJm51bWFfem9uZWxpc3Rfb3JkZXIsCisJCS5tYXhsZW4JCT0gTlVNQV9aT05FTElTVF9PUkRFUl9MRU4sCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmbnVtYV96b25lbGlzdF9vcmRlcl9oYW5kbGVyLAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX3N0cmluZywKKwl9LAorI2VuZGlmCiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpIHx8IFwKICAgIChkZWZpbmVkKENPTkZJR19TVVBFUkgpICYmIGRlZmluZWQoQ09ORklHX1ZTWVNDQUxMKSkKQEAgLTk3Miw2ICsxMDAxLDEwIEBACiAJCS5leHRyYTEJCT0gJnplcm8sCiAJfSwKICNlbmRpZgorLyoKKyAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAorICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CisgKi8KIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApAQCAtMTExMiw2ICsxMTQ1LDEwIEBACiAJCS5jaGlsZAkJPSBiaW5mbXRfbWlzY190YWJsZSwKIAl9LAogI2VuZGlmCisvKgorICogTk9URTogZG8gbm90IGFkZCBuZXcgZW50cmllcyB0byB0aGlzIHRhYmxlIHVubGVzcyB5b3UgaGF2ZSByZWFkCisgKiBEb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKKyAqLwogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGFza3N0YXRzLmMgYi9rZXJuZWwvdGFza3N0YXRzLmMKaW5kZXggOTA2Y2FlNy4uMDU5NDMxZSAxMDA2NDQKLS0tIGEva2VybmVsL3Rhc2tzdGF0cy5jCisrKyBiL2tlcm5lbC90YXNrc3RhdHMuYwpAQCAtMTk2LDYgKzE5Niw4IEBACiAKIAkvKiBmaWxsIGluIGJhc2ljIGFjY3QgZmllbGRzICovCiAJc3RhdHMtPnZlcnNpb24gPSBUQVNLU1RBVFNfVkVSU0lPTjsKKwlzdGF0cy0+bnZjc3cgPSB0c2stPm52Y3N3OworCXN0YXRzLT5uaXZjc3cgPSB0c2stPm5pdmNzdzsKIAliYWNjdF9hZGRfdHNrKHN0YXRzLCB0c2spOwogCiAJLyogZmlsbCBpbiBleHRlbmRlZCBhY2N0IGZpZWxkcyAqLwpAQCAtMjQyLDYgKzI0NCw4IEBACiAJCSAqLwogCQlkZWxheWFjY3RfYWRkX3RzayhzdGF0cywgdHNrKTsKIAorCQlzdGF0cy0+bnZjc3cgKz0gdHNrLT5udmNzdzsKKwkJc3RhdHMtPm5pdmNzdyArPSB0c2stPm5pdmNzdzsKIAl9IHdoaWxlX2VhY2hfdGhyZWFkKGZpcnN0LCB0c2spOwogCiAJdW5sb2NrX3Rhc2tfc2lnaGFuZChmaXJzdCwgJmZsYWdzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lLmMgYi9rZXJuZWwvdGltZS5jCmluZGV4IGYwNDc5MWYuLmZmZTE5MTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lLmMKKysrIGIva2VybmVsL3RpbWUuYwpAQCAtNTcsMTQgKzU3LDE3IEBACiAgKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfdGltZSh0aW1lX3QgX191c2VyICogdGxvYykKIHsKLQl0aW1lX3QgaTsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkvKgorCSAqIFdlIHJlYWQgeHRpbWUudHZfc2VjIGF0b21pY2FsbHkgLSBpdCdzIHVwZGF0ZWQKKwkgKiBhdG9taWNhbGx5IGJ5IHVwZGF0ZV93YWxsX3RpbWUoKSwgc28gbm8gbmVlZCB0bworCSAqIGV2ZW4gcmVhZC1sb2NrIHRoZSB4dGltZSBzZXFsb2NrOgorCSAqLworCXRpbWVfdCBpID0geHRpbWUudHZfc2VjOwogCi0JZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JaSA9IHR2LnR2X3NlYzsKKwlzbXBfcm1iKCk7IC8qIHN5c190aW1lKCkgcmVzdWx0cyBhcmUgY29oZXJlbnQgKi8KIAogCWlmICh0bG9jKSB7Ci0JCWlmIChwdXRfdXNlcihpLHRsb2MpKQorCQlpZiAocHV0X3VzZXIoaSwgdGxvYykpCiAJCQlpID0gLUVGQVVMVDsKIAl9CiAJcmV0dXJuIGk7CkBAIC0zNzMsMTIgKzM3NiwyNSBAQAogCiAJdHYtPnR2X3NlYyA9IHNlYzsKIAl0di0+dHZfdXNlYyA9IHVzZWM7Ci19CiAKKwkvKgorCSAqIE1ha2Ugc3VyZSB4dGltZS50dl9zZWMgW3JldHVybmVkIGJ5IHN5c190aW1lKCldIGFsd2F5cworCSAqIGZvbGxvd3MgdGhlIGdldHRpbWVvZmRheSgpIHJlc3VsdCBwcmVjaXNlbHkuIFRoaXMKKwkgKiBjb25kaXRpb24gaXMgZXh0cmVtZWx5IHVubGlrZWx5LCBpdCBjYW4gaGl0IGF0IG1vc3QKKwkgKiBvbmNlIHBlciBzZWNvbmQ6CisJICovCisJaWYgKHVubGlrZWx5KHh0aW1lLnR2X3NlYyAhPSB0di0+dHZfc2VjKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCQl1cGRhdGVfd2FsbF90aW1lKCk7CisJCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJfQorfQogRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOwogCisjZWxzZQkvKiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OICovCiAKLSNlbHNlCiAjaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKIC8qCiAgKiBTaW11bGF0ZSBnZXR0aW1lb2ZkYXkgdXNpbmcgZG9fZ2V0dGltZW9mZGF5IHdoaWNoIG9ubHkgYWxsb3dzIGEgdGltZXZhbApAQCAtMzk0LDcgKzQxMCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZXRuc3RpbWVvZmRheSk7CiAjZW5kaWYKLSNlbmRpZgorI2VuZGlmCS8qIENPTkZJR19USU1FX0lOVEVSUE9MQVRJT04gKi8KIAogLyogQ29udmVydHMgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwLgogICogQXNzdW1lcyBpbnB1dCBpbiBub3JtYWwgZGF0ZSBmb3JtYXQsIGkuZS4gMTk4MC0xMi0zMSAyMzo1OTo1OQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKaW5kZXggNzYyMTJiMi4uMmFkMWMzNyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYworKysgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCkBAIC0yMDUsNDcgKzIwNSw2IEBACiB9CiAKIC8qKgotICogY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UKLSAqLwotc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UodW5zaWduZWQgaW50IGZlYXR1cmVzLAotCQkJCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCi17Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY3VyLCAqZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0KLQlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja2V2ZW50X2RldmljZXMpIHsKLQkJY3VyID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOwotCi0JCWlmICgoY3VyLT5mZWF0dXJlcyAmIGZlYXR1cmVzKSA9PSBmZWF0dXJlcyAmJgotCQkgICAgY3B1c19lcXVhbChjcHVtYXNrLCBjdXItPmNwdW1hc2spKSB7Ci0JCQlpZiAoIWRldiB8fCBkZXYtPnJhdGluZyA8IGN1ci0+cmF0aW5nKQotCQkJCWRldiA9IGN1cjsKLQkJfQotCX0KLQotCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShOVUxMLCBkZXYpOwotCi0Jc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOwotCi0JcmV0dXJuIGRldjsKLX0KLQotLyoqCi0gKiBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZQotICovCi12b2lkIGNsb2NrZXZlbnRzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKLXsKLQlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOwotCi0JY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKGRldiwgTlVMTCk7Ci0JY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7Ci0KLQlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Ci19Ci0KLS8qKgogICogY2xvY2tldmVudHNfbm90aWZ5IC0gbm90aWZpY2F0aW9uIGFib3V0IHJlbGV2YW50IGV2ZW50cwogICovCiB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvbnRwLmMgYi9rZXJuZWwvdGltZS9udHAuYwppbmRleCBjZjUzYmI1Li40MzhjNmI3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9udHAuYworKysgYi9rZXJuZWwvdGltZS9udHAuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vdGltZXguaD4KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggM2QxMDQyZi4uNzI4Y2VkZiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCkBAIC0zNiw5ICszNiwxNyBAQAogICogYXQgemVybyBhdCBzeXN0ZW0gYm9vdCB0aW1lLCBzbyB3YWxsX3RvX21vbm90b25pYyB3aWxsIGJlIG5lZ2F0aXZlLAogICogaG93ZXZlciwgd2Ugd2lsbCBBTFdBWVMga2VlcCB0aGUgdHZfbnNlYyBwYXJ0IHBvc2l0aXZlIHNvIHdlIGNhbiB1c2UKICAqIHRoZSB1c3VhbCBub3JtYWxpemF0aW9uLgorICoKKyAqIHdhbGxfdG9fbW9ub3RvbmljIGlzIG1vdmVkIGFmdGVyIHJlc3VtZSBmcm9tIHN1c3BlbmQgZm9yIHRoZSBtb25vdG9uaWMKKyAqIHRpbWUgbm90IHRvIGp1bXAuIFdlIG5lZWQgdG8gYWRkIHRvdGFsX3NsZWVwX3RpbWUgdG8gd2FsbF90b19tb25vdG9uaWMKKyAqIHRvIGdldCB0aGUgcmVhbCBib290IGJhc2VkIHRpbWUgb2Zmc2V0LgorICoKKyAqIC0gd2FsbF90b19tb25vdG9uaWMgaXMgbm8gbG9uZ2VyIHRoZSBib290IHRpbWUsIGdldGJvb3R0aW1lIG11c3QgYmUKKyAqIHVzZWQgaW5zdGVhZC4KICAqLwogc3RydWN0IHRpbWVzcGVjIHh0aW1lIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKTsKIHN0cnVjdCB0aW1lc3BlYyB3YWxsX3RvX21vbm90b25pYyBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTYpKSk7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbF9zbGVlcF90aW1lOwkJLyogc2Vjb25kcyAqLwogCiBFWFBPUlRfU1lNQk9MKHh0aW1lKTsKIApAQCAtMjUxLDYgKzI1OSw3IEBACiAJeHRpbWUudHZfbnNlYyA9IDA7CiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAogCQkteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CisJdG90YWxfc2xlZXBfdGltZSA9IDA7CiAKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogfQpAQCAtMjgyLDYgKzI5MSw3IEBACiAKIAkJeHRpbWUudHZfc2VjICs9IHNsZWVwX2xlbmd0aDsKIAkJd2FsbF90b19tb25vdG9uaWMudHZfc2VjIC09IHNsZWVwX2xlbmd0aDsKKwkJdG90YWxfc2xlZXBfdGltZSArPSBzbGVlcF9sZW5ndGg7CiAJfQogCS8qIHJlLWJhc2UgdGhlIGxhc3QgY3ljbGUgdmFsdWUgKi8KIAljbG9jay0+Y3ljbGVfbGFzdCA9IGNsb2Nrc291cmNlX3JlYWQoY2xvY2spOwpAQCAtNDc2LDMgKzQ4NiwzMCBAQAogCWNoYW5nZV9jbG9ja3NvdXJjZSgpOwogCXVwZGF0ZV92c3lzY2FsbCgmeHRpbWUsIGNsb2NrKTsKIH0KKworLyoqCisgKiBnZXRib290dGltZSAtIFJldHVybiB0aGUgcmVhbCB0aW1lIG9mIHN5c3RlbSBib290LgorICogQHRzOgkJcG9pbnRlciB0byB0aGUgdGltZXNwZWMgdG8gYmUgc2V0CisgKgorICogUmV0dXJucyB0aGUgdGltZSBvZiBkYXkgaW4gYSB0aW1lc3BlYy4KKyAqCisgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSB3YWxsX3RvX21vbm90b25pYyBvZmZzZXQgYW5kIHRoZSB0b3RhbCBzdXNwZW5kCisgKiB0aW1lLiBDYWxscyB0byBzZXR0aW1lb2ZkYXkgd2lsbCBhZmZlY3QgdGhlIHZhbHVlIHJldHVybmVkICh3aGljaAorICogYmFzaWNhbGx5IG1lYW5zIHRoYXQgaG93ZXZlciB3cm9uZyB5b3VyIHJlYWwgdGltZSBjbG9jayBpcyBhdCBib290IHRpbWUsCisgKiB5b3UgZ2V0IHRoZSByaWdodCB0aW1lIGhlcmUpLgorICovCit2b2lkIGdldGJvb3R0aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWModHMsCisJCS0gKHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArIHRvdGFsX3NsZWVwX3RpbWUpLAorCQktIHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMpOworfQorCisvKioKKyAqIG1vbm90b25pY190b19ib290YmFzZWQgLSBDb252ZXJ0IHRoZSBtb25vdG9uaWMgdGltZSB0byBib290IGJhc2VkLgorICogQHRzOgkJcG9pbnRlciB0byB0aGUgdGltZXNwZWMgdG8gYmUgY29udmVydGVkCisgKi8KK3ZvaWQgbW9ub3RvbmljX3RvX2Jvb3RiYXNlZChzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXRzLT50dl9zZWMgKz0gdG90YWxfc2xlZXBfdGltZTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwppbmRleCA4YmJjZmI3Li5lNWVkYzNhIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKKysrIGIva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCkBAIC0zOCw3ICszOCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X25hbWVfb2Zmc2V0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqc3ltKQogewotCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOXTsKIAogCWlmIChsb29rdXBfc3ltYm9sX25hbWUoKHVuc2lnbmVkIGxvbmcpc3ltLCBzeW1uYW1lKSA8IDApCiAJCVNFUV9wcmludGYobSwgIjwlcD4iLCBzeW0pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYyBiL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMKaW5kZXggMzIxNjkzNy4uOGVkNjJmZCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYworKysgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCkBAIC02OCw2ICs2OCw3IEBACiAJICogTnVtYmVyIG9mIHRpbWVvdXQgZXZlbnRzOgogCSAqLwogCXVuc2lnbmVkIGxvbmcJCWNvdW50OworCXVuc2lnbmVkIGludAkJdGltZXJfZmxhZzsKIAogCS8qCiAJICogV2Ugc2F2ZSB0aGUgY29tbWFuZC1saW5lIHN0cmluZyB0byBwcmVzZXJ2ZQpAQCAtMjMxLDcgKzIzMiw4IEBACiAgKiBpbmNyZW1lbnRlZC4gT3RoZXJ3aXNlIHRoZSB0aW1lciBpcyByZWdpc3RlcmVkIGluIGEgZnJlZSBzbG90LgogICovCiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCi0JCQkgICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKQorCQkJICAgICAgdm9pZCAqdGltZXJmLCBjaGFyICpjb21tLAorCQkJICAgICAgdW5zaWduZWQgaW50IHRpbWVyX2ZsYWcpCiB7CiAJLyoKIAkgKiBJdCBkb2VzbnQgbWF0dGVyIHdoaWNoIGxvY2sgd2UgdGFrZToKQEAgLTI0OSw2ICsyNTEsNyBAQAogCWlucHV0LnN0YXJ0X2Z1bmMgPSBzdGFydGY7CiAJaW5wdXQuZXhwaXJlX2Z1bmMgPSB0aW1lcmY7CiAJaW5wdXQucGlkID0gcGlkOworCWlucHV0LnRpbWVyX2ZsYWcgPSB0aW1lcl9mbGFnOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOwogCWlmICghYWN0aXZlKQpAQCAtMjY2LDcgKzI2OSw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X25hbWVfb2Zmc2V0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOKzFdOworCWNoYXIgc3ltbmFtZVtLU1lNX05BTUVfTEVOXTsKIAogCWlmIChsb29rdXBfc3ltYm9sX25hbWUoYWRkciwgc3ltbmFtZSkgPCAwKQogCQlzZXFfcHJpbnRmKG0sICI8JXA+IiwgKHZvaWQgKilhZGRyKTsKQEAgLTI5NSw3ICsyOTgsNyBAQAogCXBlcmlvZCA9IGt0aW1lX3RvX3RpbWVzcGVjKHRpbWUpOwogCW1zID0gcGVyaW9kLnR2X25zZWMgLyAxMDAwMDAwOwogCi0Jc2VxX3B1dHMobSwgIlRpbWVyIFN0YXRzIFZlcnNpb246IHYwLjFcbiIpOworCXNlcV9wdXRzKG0sICJUaW1lciBTdGF0cyBWZXJzaW9uOiB2MC4yXG4iKTsKIAlzZXFfcHJpbnRmKG0sICJTYW1wbGUgcGVyaW9kOiAlbGQuJTAzbGQgc1xuIiwgcGVyaW9kLnR2X3NlYywgbXMpOwogCWlmIChhdG9taWNfcmVhZCgmb3ZlcmZsb3dfY291bnQpKQogCQlzZXFfcHJpbnRmKG0sICJPdmVyZmxvdzogJWQgZW50cmllc1xuIiwKQEAgLTMwMyw4ICszMDYsMTMgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspIHsKIAkJZW50cnkgPSBlbnRyaWVzICsgaTsKLQkJc2VxX3ByaW50ZihtLCAiJTRsdSwgJTVkICUtMTZzICIsCisgCQlpZiAoZW50cnktPnRpbWVyX2ZsYWcgJiBUSU1FUl9TVEFUU19GTEFHX0RFRkVSUkFCTEUpIHsKKwkJCXNlcV9wcmludGYobSwgIiU0bHVELCAlNWQgJS0xNnMgIiwKIAkJCQllbnRyeS0+Y291bnQsIGVudHJ5LT5waWQsIGVudHJ5LT5jb21tKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYobSwgIiAlNGx1LCAlNWQgJS0xNnMgIiwKKwkJCQllbnRyeS0+Y291bnQsIGVudHJ5LT5waWQsIGVudHJ5LT5jb21tKTsKKwkJfQogCiAJCXByaW50X25hbWVfb2Zmc2V0KG0sICh1bnNpZ25lZCBsb25nKWVudHJ5LT5zdGFydF9mdW5jKTsKIAkJc2VxX3B1dHMobSwgIiAoIik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDFhNjk3MDUuLmI3NzkyZmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC0zMDUsNiArMzA1LDIwIEBACiAJbWVtY3B5KHRpbWVyLT5zdGFydF9jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKIAl0aW1lci0+c3RhcnRfcGlkID0gY3VycmVudC0+cGlkOwogfQorCitzdGF0aWMgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZyA9IDA7CisKKwlpZiAodW5saWtlbHkodGJhc2VfZ2V0X2RlZmVycmFibGUodGltZXItPmJhc2UpKSkKKwkJZmxhZyB8PSBUSU1FUl9TVEFUU19GTEFHX0RFRkVSUkFCTEU7CisKKwl0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModGltZXIsIHRpbWVyLT5zdGFydF9waWQsIHRpbWVyLT5zdGFydF9zaXRlLAorCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tLCBmbGFnKTsKK30KKworI2Vsc2UKK3N0YXRpYyB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKSB7fQogI2VuZGlmCiAKIC8qKgpAQCAtMTExNCw2ICsxMTI4LDcgQEAKIAkJZ2V0bnN0aW1lb2ZkYXkoJnRwKTsKIAkJdHAudHZfc2VjICs9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKIAkJdHAudHZfbnNlYyArPSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjOworCQltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZ0cCk7CiAJCWlmICh0cC50dl9uc2VjIC0gTlNFQ19QRVJfU0VDID49IDApIHsKIAkJCXRwLnR2X25zZWMgPSB0cC50dl9uc2VjIC0gTlNFQ19QRVJfU0VDOwogCQkJdHAudHZfc2VjKys7CkBAIC0xMjA2LDcgKzEyMjEsOCBAQAogCQkJLyoKIAkJCSAqIFRoZSBBUHMgdXNlIHRoaXMgcGF0aCBsYXRlciBpbiBib290CiAJCQkgKi8KLQkJCWJhc2UgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpiYXNlKSwgR0ZQX0tFUk5FTCwKKwkJCWJhc2UgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKCpiYXNlKSwKKwkJCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAogCQkJCQkJY3B1X3RvX25vZGUoY3B1KSk7CiAJCQlpZiAoIWJhc2UpCiAJCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMjE3LDcgKzEyMzMsNiBAQAogCQkJCWtmcmVlKGJhc2UpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQkJbWVtc2V0KGJhc2UsIDAsIHNpemVvZigqYmFzZSkpOwogCQkJcGVyX2NwdSh0dmVjX2Jhc2VzLCBjcHUpID0gYmFzZTsKIAkJfSBlbHNlIHsKIAkJCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuYwppbmRleCA0ODY5NTYzLi45OGI4MjUwIDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlci5jCisrKyBiL2tlcm5lbC91c2VyLmMKQEAgLTE0LDIwICsxNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CiAKIC8qCiAgKiBVSUQgdGFzayBjb3VudCBjYWNoZSwgdG8gZ2V0IGZhc3QgdXNlciBsb29rdXAgaW4gImFsbG9jX3VpZCIKICAqIHdoZW4gY2hhbmdpbmcgdXNlciBJRCdzIChpZSBzZXR1aWQoKSBhbmQgZnJpZW5kcykuCiAgKi8KIAotI2RlZmluZSBVSURIQVNIX0JJVFMgKENPTkZJR19CQVNFX1NNQUxMID8gMyA6IDgpCi0jZGVmaW5lIFVJREhBU0hfU1oJCSgxIDw8IFVJREhBU0hfQklUUykKICNkZWZpbmUgVUlESEFTSF9NQVNLCQkoVUlESEFTSF9TWiAtIDEpCiAjZGVmaW5lIF9fdWlkaGFzaGZuKHVpZCkJKCgodWlkID4+IFVJREhBU0hfQklUUykgKyB1aWQpICYgVUlESEFTSF9NQVNLKQotI2RlZmluZSB1aWRoYXNoZW50cnkodWlkKQkodWlkaGFzaF90YWJsZSArIF9fdWlkaGFzaGZuKCh1aWQpKSkKKyNkZWZpbmUgdWlkaGFzaGVudHJ5KG5zLCB1aWQpCSgobnMpLT51aWRoYXNoX3RhYmxlICsgX191aWRoYXNoZm4oKHVpZCkpKQogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnVpZF9jYWNoZXA7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1aWRoYXNoX3RhYmxlW1VJREhBU0hfU1pdOwogCiAvKgogICogVGhlIHVpZGhhc2hfbG9jayBpcyBtb3N0bHkgdGFrZW4gZnJvbSBwcm9jZXNzIGNvbnRleHQsIGJ1dCBpdCBpcwpAQCAtOTQsOSArOTMsMTAgQEAKIHsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMgPSBjdXJyZW50LT5uc3Byb3h5LT51c2VyX25zOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVpZGhhc2hfbG9jaywgZmxhZ3MpOwotCXJldCA9IHVpZF9oYXNoX2ZpbmQodWlkLCB1aWRoYXNoZW50cnkodWlkKSk7CisJcmV0ID0gdWlkX2hhc2hfZmluZCh1aWQsIHVpZGhhc2hlbnRyeShucywgdWlkKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWlkaGFzaF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMCw5ICsxMjAsOSBAQAogCX0KIH0KIAotc3RydWN0IHVzZXJfc3RydWN0ICogYWxsb2NfdWlkKHVpZF90IHVpZCkKK3N0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCB1aWRfdCB1aWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGFzaGVudCA9IHVpZGhhc2hlbnRyeSh1aWQpOworCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hlbnQgPSB1aWRoYXNoZW50cnkobnMsIHVpZCk7CiAJc3RydWN0IHVzZXJfc3RydWN0ICp1cDsKIAogCXNwaW5fbG9ja19pcnEoJnVpZGhhc2hfbG9jayk7CkBAIC0yMTEsMTEgKzIxMSwxMSBAQAogCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwogCiAJZm9yKG4gPSAwOyBuIDwgVUlESEFTSF9TWjsgKytuKQotCQlJTklUX0xJU1RfSEVBRCh1aWRoYXNoX3RhYmxlICsgbik7CisJCUlOSVRfTElTVF9IRUFEKGluaXRfdXNlcl9ucy51aWRoYXNoX3RhYmxlICsgbik7CiAKIAkvKiBJbnNlcnQgdGhlIHJvb3QgdXNlciBpbW1lZGlhdGVseSAoaW5pdCBhbHJlYWR5IHJ1bnMgYXMgcm9vdCkgKi8KIAlzcGluX2xvY2tfaXJxKCZ1aWRoYXNoX2xvY2spOwotCXVpZF9oYXNoX2luc2VydCgmcm9vdF91c2VyLCB1aWRoYXNoZW50cnkoMCkpOworCXVpZF9oYXNoX2luc2VydCgmcm9vdF91c2VyLCB1aWRoYXNoZW50cnkoJmluaXRfdXNlcl9ucywgMCkpOwogCXNwaW5fdW5sb2NrX2lycSgmdWlkaGFzaF9sb2NrKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMgYi9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU1ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZQorICogIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KKworc3RydWN0IHVzZXJfbmFtZXNwYWNlIGluaXRfdXNlcl9ucyA9IHsKKwkua3JlZiA9IHsKKwkJLnJlZmNvdW50CT0gQVRPTUlDX0lOSVQoMiksCisJfSwKKwkucm9vdF91c2VyID0gJnJvb3RfdXNlciwKK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKGluaXRfdXNlcl9ucyk7CisKKyNpZmRlZiBDT05GSUdfVVNFUl9OUworCisvKgorICogQ2xvbmUgYSBuZXcgbnMgY29weWluZyBhbiBvcmlnaW5hbCB1c2VyIG5zLCBzZXR0aW5nIHJlZmNvdW50IHRvIDEKKyAqIEBvbGRfbnM6IG5hbWVzcGFjZSB0byBjbG9uZQorICogUmV0dXJuIE5VTEwgb24gZXJyb3IgKGZhaWx1cmUgdG8ga21hbGxvYyksIG5ldyBucyBvdGhlcndpc2UKKyAqLworc3RhdGljIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY2xvbmVfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm9sZF9ucykKK3sKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zOworCXN0cnVjdCB1c2VyX3N0cnVjdCAqbmV3X3VzZXI7CisJaW50IG47CisKKwlucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2VyX25hbWVzcGFjZSksIEdGUF9LRVJORUwpOworCWlmICghbnMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJa3JlZl9pbml0KCZucy0+a3JlZik7CisKKwlmb3IgKG4gPSAwOyBuIDwgVUlESEFTSF9TWjsgKytuKQorCQlJTklUX0xJU1RfSEVBRChucy0+dWlkaGFzaF90YWJsZSArIG4pOworCisJLyogSW5zZXJ0IG5ldyByb290IHVzZXIuICAqLworCW5zLT5yb290X3VzZXIgPSBhbGxvY191aWQobnMsIDApOworCWlmICghbnMtPnJvb3RfdXNlcikgeworCQlrZnJlZShucyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCS8qIFJlc2V0IGN1cnJlbnQtPnVzZXIgd2l0aCBhIG5ldyBvbmUgKi8KKwluZXdfdXNlciA9IGFsbG9jX3VpZChucywgY3VycmVudC0+dWlkKTsKKwlpZiAoIW5ld191c2VyKSB7CisJCWZyZWVfdWlkKG5zLT5yb290X3VzZXIpOworCQlrZnJlZShucyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCXN3aXRjaF91aWQobmV3X3VzZXIpOworCXJldHVybiBuczsKK30KKworc3RydWN0IHVzZXJfbmFtZXNwYWNlICogY29weV91c2VyX25zKGludCBmbGFncywgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvbGRfbnMpCit7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpuZXdfbnM7CisKKwlCVUdfT04oIW9sZF9ucyk7CisJZ2V0X3VzZXJfbnMob2xkX25zKTsKKworCWlmICghKGZsYWdzICYgQ0xPTkVfTkVXVVNFUikpCisJCXJldHVybiBvbGRfbnM7CisKKwluZXdfbnMgPSBjbG9uZV91c2VyX25zKG9sZF9ucyk7CisKKwlwdXRfdXNlcl9ucyhvbGRfbnMpOworCXJldHVybiBuZXdfbnM7Cit9CisKK3ZvaWQgZnJlZV91c2VyX25zKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnM7CisKKwlucyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UsIGtyZWYpOworCWtmcmVlKG5zKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19VU0VSX05TICovCmRpZmYgLS1naXQgYS9rZXJuZWwvdXRzbmFtZS5jIGIva2VybmVsL3V0c25hbWUuYwppbmRleCAxNjBjOGM1Li45ZDgxODBhIDEwMDY0NAotLS0gYS9rZXJuZWwvdXRzbmFtZS5jCisrKyBiL2tlcm5lbC91dHNuYW1lLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC91dHMuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgogICogQ2xvbmUgYSBuZXcgbnMgY29weWluZyBhbiBvcmlnaW5hbCB1dHNuYW1lLCBzZXR0aW5nIHJlZmNvdW50IHRvIDEKQEAgLTI0LDEwICsyNSwxMSBAQAogCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpuczsKIAogCW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHV0c19uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAobnMpIHsKLQkJbWVtY3B5KCZucy0+bmFtZSwgJm9sZF9ucy0+bmFtZSwgc2l6ZW9mKG5zLT5uYW1lKSk7Ci0JCWtyZWZfaW5pdCgmbnMtPmtyZWYpOwotCX0KKwlpZiAoIW5zKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCW1lbWNweSgmbnMtPm5hbWUsICZvbGRfbnMtPm5hbWUsIHNpemVvZihucy0+bmFtZSkpOworCWtyZWZfaW5pdCgmbnMtPmtyZWYpOwogCXJldHVybiBuczsKIH0KIApAQCAtMzcsNyArMzksNyBAQAogICogdXRzbmFtZSBvZiB0aGlzIHByb2Nlc3Mgd29uJ3QgYmUgc2VlbiBieSBwYXJlbnQsIGFuZCB2aWNlCiAgKiB2ZXJzYS4KICAqLwotc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZShpbnQgZmxhZ3MsIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpvbGRfbnMpCitzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY29weV91dHNuYW1lKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCB1dHNfbmFtZXNwYWNlICpvbGRfbnMpCiB7CiAJc3RydWN0IHV0c19uYW1lc3BhY2UgKm5ld19uczsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3V0c25hbWVfc3lzY3RsLmMgYi9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYwppbmRleCBmMjJiOWRiLi5jNzZjMDY0IDEwMDY0NAotLS0gYS9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYworKysgYi9rZXJuZWwvdXRzbmFtZV9zeXNjdGwuYwpAQCAtMTgsMTAgKzE4LDcgQEAKIHN0YXRpYyB2b2lkICpnZXRfdXRzKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSkKIHsKIAljaGFyICp3aGljaCA9IHRhYmxlLT5kYXRhOwotI2lmZGVmIENPTkZJR19VVFNfTlMKLQlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqdXRzX25zID0gY3VycmVudC0+bnNwcm94eS0+dXRzX25zOwotCXdoaWNoID0gKHdoaWNoIC0gKGNoYXIgKikmaW5pdF91dHNfbnMpICsgKGNoYXIgKil1dHNfbnM7Ci0jZW5kaWYKKwogCWlmICghd3JpdGUpCiAJCWRvd25fcmVhZCgmdXRzX3NlbSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDNiZWJmNzMuLjU4ZTVjMTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTI4Miw4ICsyODIsOCBAQAogCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxID0gX19jd3E7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKLQlpZiAoIWN3cS0+d3EtPmZyZWV6ZWFibGUpCi0JCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCWlmIChjd3EtPndxLT5mcmVlemVhYmxlKQorCQlzZXRfZnJlZXphYmxlKCk7CiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC01KTsKIApAQCAtMzgyLDE2ICszODIsMTYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGZsdXNoX3dvcmtxdWV1ZSk7CiAKIC8qCi0gKiBVcG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBjYWxsZXIgIm93bnMiIFdPUktfU1RSVUNUX1BFTkRJTkcgYml0LAorICogVXBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuICg+PSAwKSwgdGhlIGNhbGxlciAib3ducyIgV09SS19TVFJVQ1RfUEVORElORyBiaXQsCiAgKiBzbyB0aGlzIHdvcmsgY2FuJ3QgYmUgcmUtYXJtZWQgaW4gYW55IHdheS4KICAqLwogc3RhdGljIGludCB0cnlfdG9fZ3JhYl9wZW5kaW5nKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cTsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gLTE7CiAKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoV09SS19TVFJVQ1RfUEVORElORywgd29ya19kYXRhX2JpdHMod29yaykpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CiAKIAkvKgogCSAqIFRoZSBxdWV1ZWluZyBpcyBpbiBwcm9ncmVzcywgb3IgaXQgaXMgYWxyZWFkeSBxdWV1ZWQuIFRyeSB0bwpAQCAtNDU3LDEwICs0NTcsMjggQEAKIAkJd2FpdF9vbl9jcHVfd29yayhwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBjcHUpLCB3b3JrKTsKIH0KIAorc3RhdGljIGludCBfX2NhbmNlbF93b3JrX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywKKwkJCQlzdHJ1Y3QgdGltZXJfbGlzdCogdGltZXIpCit7CisJaW50IHJldDsKKworCWRvIHsKKwkJcmV0ID0gKHRpbWVyICYmIGxpa2VseShkZWxfdGltZXIodGltZXIpKSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gdHJ5X3RvX2dyYWJfcGVuZGluZyh3b3JrKTsKKwkJd2FpdF9vbl93b3JrKHdvcmspOworCX0gd2hpbGUgKHVubGlrZWx5KHJldCA8IDApKTsKKworCXdvcmtfY2xlYXJfcGVuZGluZyh3b3JrKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIGNhbmNlbF93b3JrX3N5bmMgLSBibG9jayB1bnRpbCBhIHdvcmtfc3RydWN0J3MgY2FsbGJhY2sgaGFzIHRlcm1pbmF0ZWQKICAqIEB3b3JrOiB0aGUgd29yayB3aGljaCBpcyB0byBiZSBmbHVzaGVkCiAgKgorICogUmV0dXJucyB0cnVlIGlmIEB3b3JrIHdhcyBwZW5kaW5nLgorICoKICAqIGNhbmNlbF93b3JrX3N5bmMoKSB3aWxsIGNhbmNlbCB0aGUgd29yayBpZiBpdCBpcyBxdWV1ZWQuIElmIHRoZSB3b3JrJ3MKICAqIGNhbGxiYWNrIGFwcGVhcnMgdG8gYmUgcnVubmluZywgY2FuY2VsX3dvcmtfc3luYygpIHdpbGwgYmxvY2sgdW50aWwgaXQKICAqIGhhcyBjb21wbGV0ZWQuCkBAIC00NzYsMzEgKzQ5NCwyNiBAQAogICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHdvcmtxdWV1ZV9zdHJ1Y3Qgb24gd2hpY2ggdGhpcyB3b3JrIHdhcyBsYXN0CiAgKiBxdWV1ZWQgY2FuJ3QgYmUgZGVzdHJveWVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCiAgKi8KLXZvaWQgY2FuY2VsX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitpbnQgY2FuY2VsX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jd2hpbGUgKCF0cnlfdG9fZ3JhYl9wZW5kaW5nKHdvcmspKQotCQljcHVfcmVsYXgoKTsKLQl3YWl0X29uX3dvcmsod29yayk7Ci0Jd29ya19jbGVhcl9wZW5kaW5nKHdvcmspOworCXJldHVybiBfX2NhbmNlbF93b3JrX3RpbWVyKHdvcmssIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2FuY2VsX3dvcmtfc3luYyk7CiAKIC8qKgotICogY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yayAtIHJlbGlhYmx5IGtpbGwgb2ZmIGEgZGVsYXllZCB3b3JrLgorICogY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jIC0gcmVsaWFibHkga2lsbCBvZmYgYSBkZWxheWVkIHdvcmsuCiAgKiBAZHdvcms6IHRoZSBkZWxheWVkIHdvcmsgc3RydWN0CiAgKgorICogUmV0dXJucyB0cnVlIGlmIEBkd29yayB3YXMgcGVuZGluZy4KKyAqCiAgKiBJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhpcyBmdW5jdGlvbiBpZiBAZHdvcmsgcmVhcm1zIGl0c2VsZiB2aWEgcXVldWVfd29yaygpCiAgKiBvciBxdWV1ZV9kZWxheWVkX3dvcmsoKS4gU2VlIGFsc28gdGhlIGNvbW1lbnQgZm9yIGNhbmNlbF93b3JrX3N5bmMoKS4KICAqLwotdm9pZCBjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrKQoraW50IGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYyhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKIHsKLQl3aGlsZSAoIWRlbF90aW1lcigmZHdvcmstPnRpbWVyKSAmJgotCSAgICAgICAhdHJ5X3RvX2dyYWJfcGVuZGluZygmZHdvcmstPndvcmspKQotCQljcHVfcmVsYXgoKTsKLQl3YWl0X29uX3dvcmsoJmR3b3JrLT53b3JrKTsKLQl3b3JrX2NsZWFyX3BlbmRpbmcoJmR3b3JrLT53b3JrKTsKKwlyZXR1cm4gX19jYW5jZWxfd29ya190aW1lcigmZHdvcmstPndvcmssICZkd29yay0+dGltZXIpOwogfQotRVhQT1JUX1NZTUJPTChjYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrKTsKK0VYUE9SVF9TWU1CT0woY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprZXZlbnRkX3dxIF9fcmVhZF9tb3N0bHk7CiAKQEAgLTczOSwxOCArNzUyLDE3IEBACiAJaWYgKGN3cS0+dGhyZWFkID09IE5VTEwpCiAJCXJldHVybjsKIAorCWZsdXNoX2NwdV93b3JrcXVldWUoY3dxKTsKIAkvKgotCSAqIElmIHRoZSBjYWxsZXIgaXMgQ1BVX0RFQUQgdGhlIHNpbmdsZSBmbHVzaF9jcHVfd29ya3F1ZXVlKCkKLQkgKiBpcyBub3QgZW5vdWdoLCBhIGNvbmN1cnJlbnQgZmx1c2hfd29ya3F1ZXVlKCkgY2FuIGluc2VydCBhCi0JICogYmFycmllciBhZnRlciB1cy4KKwkgKiBJZiB0aGUgY2FsbGVyIGlzIENQVV9ERUFEIGFuZCBjd3EtPndvcmtsaXN0IHdhcyBub3QgZW1wdHksCisJICogYSBjb25jdXJyZW50IGZsdXNoX3dvcmtxdWV1ZSgpIGNhbiBpbnNlcnQgYSBiYXJyaWVyIGFmdGVyIHVzLgorCSAqIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSBydW5fd29ya3F1ZXVlKCkgd29uJ3QgcmV0dXJuIGFuZCBjaGVjaworCSAqIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB1bnRpbCBpdCBmbHVzaGVzIGFsbCB3b3JrX3N0cnVjdCdzLgogCSAqIFdoZW4gLT53b3JrbGlzdCBiZWNvbWVzIGVtcHR5IGl0IGlzIHNhZmUgdG8gZXhpdCBiZWNhdXNlIG5vCiAJICogbW9yZSB3b3JrX3N0cnVjdHMgY2FuIGJlIHF1ZXVlZCBvbiB0aGlzIGN3cTogZmx1c2hfd29ya3F1ZXVlCiAJICogY2hlY2tzIGxpc3RfZW1wdHkoKSwgYW5kIGEgIm5vcm1hbCIgcXVldWVfd29yaygpIGNhbid0IHVzZQogCSAqIGEgZGVhZCBDUFUuCiAJICovCi0Jd2hpbGUgKGZsdXNoX2NwdV93b3JrcXVldWUoY3dxKSkKLQkJOwotCiAJa3RocmVhZF9zdG9wKGN3cS0+dGhyZWFkKTsKIAljd3EtPnRocmVhZCA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDNlYjI5ZDUuLmU1YzJjNTEgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC00MSw2ICs0MSwxNCBAQAogCSAga2VybmVsIHRyZWUgZG9lcy4gU3VjaCBtb2R1bGVzIHRoYXQgdXNlIGxpYnJhcnkgQ1JDMzIgZnVuY3Rpb25zCiAJICByZXF1aXJlIE0gaGVyZS4KIAorY29uZmlnIENSQzcKKwl0cmlzdGF0ZSAiQ1JDNyBmdW5jdGlvbnMiCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIGluLWtlcm5lbC10cmVlCisJICBtb2R1bGVzIHJlcXVpcmUgQ1JDNyBmdW5jdGlvbnMsIGJ1dCBhIG1vZHVsZSBidWlsdCBvdXRzaWRlCisJICB0aGUga2VybmVsIHRyZWUgZG9lcy4gU3VjaCBtb2R1bGVzIHRoYXQgdXNlIGxpYnJhcnkgQ1JDNworCSAgZnVuY3Rpb25zIHJlcXVpcmUgTSBoZXJlLgorCiBjb25maWcgTElCQ1JDMzJDCiAJdHJpc3RhdGUgIkNSQzMyYyAoQ2FzdGFnbm9saSwgZXQgYWwpIEN5Y2xpYyBSZWR1bmRhbmN5LUNoZWNrIgogCWhlbHAKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggZmFiMzJhMi4uNjQwODQ0MCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTE1Miw2ICsxNTIsMTkgQEAKIAlib29sICJNZW1vcnkgbGVhayBkZWJ1Z2dpbmciCiAJZGVwZW5kcyBvbiBERUJVR19TTEFCCiAKK2NvbmZpZyBTTFVCX0RFQlVHX09OCisJYm9vbCAiU0xVQiBkZWJ1Z2dpbmcgb24gYnkgZGVmYXVsdCIKKwlkZXBlbmRzIG9uIFNMVUIgJiYgU0xVQl9ERUJVRworCWRlZmF1bHQgbgorCWhlbHAKKwkgIEJvb3Qgd2l0aCBkZWJ1Z2dpbmcgb24gYnkgZGVmYXVsdC4gU0xVQiBib290cyBieSBkZWZhdWx0IHdpdGgKKwkgIHRoZSBydW50aW1lIGRlYnVnIGNhcGFiaWxpdGllcyBzd2l0Y2hlZCBvZmYuIEVuYWJsaW5nIHRoaXMgaXMKKwkgIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgInNsdWJfZGVidWciIHBhcmFtZXRlciBvbiBib290LgorCSAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgbW9yZSBmaW5lIGdyYWluZWQgZGVidWcgY29udHJvbCBsaWtlCisJICBwb3NzaWJsZSB3aXRoIHNsdWJfZGVidWc9eHh4LiBTTFVCIGRlYnVnZ2luZyBtYXkgYmUgc3dpdGNoZWQKKwkgIG9mZiBpbiBhIGtlcm5lbCBidWlsdCB3aXRoIENPTkZJR19TTFVCX0RFQlVHX09OIGJ5IHNwZWNpZnlpbmcKKwkgICJzbHViX2RlYnVnPS0iLgorCiBjb25maWcgREVCVUdfUFJFRU1QVAogCWJvb2wgIkRlYnVnIHByZWVtcHRpYmxlIGtlcm5lbCIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUkVFTVBUICYmIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCBkMWIzNjZiLi5kYTY4YjJjIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0yMSw3ICsyMSw3IEBACiBlbmRpZgogCiBvYmotJChDT05GSUdfR0VORVJJQ19JT01BUCkgKz0gaW9tYXAubwotb2JqLSQoQ09ORklHX0hBU19JT01FTSkgKz0gaW9tYXBfY29weS5vIGRldnJlcy5vCitvYmotJChDT05GSUdfSEFTX0lPTUVNKSArPSBpb21hcF9jb3B5Lm8gZGV2cmVzLm8gY2hlY2tfc2lnbmF0dXJlLm8KIG9iai0kKENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMpICs9IGxvY2tpbmctc2VsZnRlc3Qubwogb2JqLSQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKSArPSBzcGlubG9ja19kZWJ1Zy5vCiBsaWItJChDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSykgKz0gcndzZW0tc3BpbmxvY2subwpAQCAtNDMsNiArNDMsNyBAQAogb2JqLSQoQ09ORklHX0NSQzE2KQkrPSBjcmMxNi5vCiBvYmotJChDT05GSUdfQ1JDX0lUVV9UKQkrPSBjcmMtaXR1LXQubwogb2JqLSQoQ09ORklHX0NSQzMyKQkrPSBjcmMzMi5vCitvYmotJChDT05GSUdfQ1JDNykJKz0gY3JjNy5vCiBvYmotJChDT05GSUdfTElCQ1JDMzJDKQkrPSBsaWJjcmMzMmMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SKSArPSBnZW5hbGxvYy5vCiAKZGlmZiAtLWdpdCBhL2xpYi9idWcuYyBiL2xpYi9idWcuYwppbmRleCAwMTRiNTgyLi41MzBmMzhmIDEwMDY0NAotLS0gYS9saWIvYnVnLmMKKysrIGIvbGliL2J1Zy5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYnVnX2VudHJ5IF9fc3RhcnRfX19idWdfdGFibGVbXSwgX19zdG9wX19fYnVnX3RhYmxlW107CiAKQEAgLTExMiw3ICsxMTMsNyBAQAogCXJldHVybiBtb2R1bGVfZmluZF9idWcoYnVnYWRkcik7CiB9CiAKLWVudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKK2VudW0gYnVnX3RyYXBfdHlwZSByZXBvcnRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJY29uc3Qgc3RydWN0IGJ1Z19lbnRyeSAqYnVnOwogCWNvbnN0IGNoYXIgKmZpbGU7CkBAIC0xNDcsNyArMTQ4LDcgQEAKIAkJCSAgICAgICAiW3ZlcmJvc2UgZGVidWcgaW5mbyB1bmF2YWlsYWJsZV1cbiIsCiAJCQkgICAgICAgKHZvaWQgKilidWdhZGRyKTsKIAotCQlkdW1wX3N0YWNrKCk7CisJCXNob3dfcmVncyhyZWdzKTsKIAkJcmV0dXJuIEJVR19UUkFQX1RZUEVfV0FSTjsKIAl9CiAKZGlmZiAtLWdpdCBhL2xpYi9jaGVja19zaWduYXR1cmUuYyBiL2xpYi9jaGVja19zaWduYXR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDZhZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NoZWNrX3NpZ25hdHVyZS5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKioKKyAqCWNoZWNrX3NpZ25hdHVyZQkJLQlmaW5kIEJJT1Mgc2lnbmF0dXJlcworICoJQGlvX2FkZHI6IG1taW8gYWRkcmVzcyB0byBjaGVjaworICoJQHNpZ25hdHVyZTogIHNpZ25hdHVyZSBibG9jaworICoJQGxlbmd0aDogbGVuZ3RoIG9mIHNpZ25hdHVyZQorICoKKyAqCVBlcmZvcm0gYSBzaWduYXR1cmUgY29tcGFyaXNvbiB3aXRoIHRoZSBtbWlvIGFkZHJlc3MgaW9fYWRkci4gVGhpcworICoJYWRkcmVzcyBzaG91bGQgaGF2ZSBiZWVuIG9idGFpbmVkIGJ5IGlvcmVtYXAuCisgKglSZXR1cm5zIDEgb24gYSBtYXRjaC4KKyAqLworCitpbnQgY2hlY2tfc2lnbmF0dXJlKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqaW9fYWRkciwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwgaW50IGxlbmd0aCkKK3sKKwl3aGlsZSAobGVuZ3RoLS0pIHsKKwkJaWYgKHJlYWRiKGlvX2FkZHIpICE9ICpzaWduYXR1cmUpCisJCQlyZXR1cm4gMDsKKwkJaW9fYWRkcisrOworCQlzaWduYXR1cmUrKzsKKwl9CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGNoZWNrX3NpZ25hdHVyZSk7CmRpZmYgLS1naXQgYS9saWIvY3JjNy5jIGIvbGliL2NyYzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWMzYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NyYzcuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogICAgICBjcmM3LmMKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CisKKworLyogVGFibGUgZm9yIENSQy03IChwb2x5bm9taWFsIHheNyArIHheMyArIDEpICovCitjb25zdCB1OCBjcmM3X3N5bmRyb21lX3RhYmxlWzI1Nl0gPSB7CisJMHgwMCwgMHgwOSwgMHgxMiwgMHgxYiwgMHgyNCwgMHgyZCwgMHgzNiwgMHgzZiwKKwkweDQ4LCAweDQxLCAweDVhLCAweDUzLCAweDZjLCAweDY1LCAweDdlLCAweDc3LAorCTB4MTksIDB4MTAsIDB4MGIsIDB4MDIsIDB4M2QsIDB4MzQsIDB4MmYsIDB4MjYsCisJMHg1MSwgMHg1OCwgMHg0MywgMHg0YSwgMHg3NSwgMHg3YywgMHg2NywgMHg2ZSwKKwkweDMyLCAweDNiLCAweDIwLCAweDI5LCAweDE2LCAweDFmLCAweDA0LCAweDBkLAorCTB4N2EsIDB4NzMsIDB4NjgsIDB4NjEsIDB4NWUsIDB4NTcsIDB4NGMsIDB4NDUsCisJMHgyYiwgMHgyMiwgMHgzOSwgMHgzMCwgMHgwZiwgMHgwNiwgMHgxZCwgMHgxNCwKKwkweDYzLCAweDZhLCAweDcxLCAweDc4LCAweDQ3LCAweDRlLCAweDU1LCAweDVjLAorCTB4NjQsIDB4NmQsIDB4NzYsIDB4N2YsIDB4NDAsIDB4NDksIDB4NTIsIDB4NWIsCisJMHgyYywgMHgyNSwgMHgzZSwgMHgzNywgMHgwOCwgMHgwMSwgMHgxYSwgMHgxMywKKwkweDdkLCAweDc0LCAweDZmLCAweDY2LCAweDU5LCAweDUwLCAweDRiLCAweDQyLAorCTB4MzUsIDB4M2MsIDB4MjcsIDB4MmUsIDB4MTEsIDB4MTgsIDB4MDMsIDB4MGEsCisJMHg1NiwgMHg1ZiwgMHg0NCwgMHg0ZCwgMHg3MiwgMHg3YiwgMHg2MCwgMHg2OSwKKwkweDFlLCAweDE3LCAweDBjLCAweDA1LCAweDNhLCAweDMzLCAweDI4LCAweDIxLAorCTB4NGYsIDB4NDYsIDB4NWQsIDB4NTQsIDB4NmIsIDB4NjIsIDB4NzksIDB4NzAsCisJMHgwNywgMHgwZSwgMHgxNSwgMHgxYywgMHgyMywgMHgyYSwgMHgzMSwgMHgzOCwKKwkweDQxLCAweDQ4LCAweDUzLCAweDVhLCAweDY1LCAweDZjLCAweDc3LCAweDdlLAorCTB4MDksIDB4MDAsIDB4MWIsIDB4MTIsIDB4MmQsIDB4MjQsIDB4M2YsIDB4MzYsCisJMHg1OCwgMHg1MSwgMHg0YSwgMHg0MywgMHg3YywgMHg3NSwgMHg2ZSwgMHg2NywKKwkweDEwLCAweDE5LCAweDAyLCAweDBiLCAweDM0LCAweDNkLCAweDI2LCAweDJmLAorCTB4NzMsIDB4N2EsIDB4NjEsIDB4NjgsIDB4NTcsIDB4NWUsIDB4NDUsIDB4NGMsCisJMHgzYiwgMHgzMiwgMHgyOSwgMHgyMCwgMHgxZiwgMHgxNiwgMHgwZCwgMHgwNCwKKwkweDZhLCAweDYzLCAweDc4LCAweDcxLCAweDRlLCAweDQ3LCAweDVjLCAweDU1LAorCTB4MjIsIDB4MmIsIDB4MzAsIDB4MzksIDB4MDYsIDB4MGYsIDB4MTQsIDB4MWQsCisJMHgyNSwgMHgyYywgMHgzNywgMHgzZSwgMHgwMSwgMHgwOCwgMHgxMywgMHgxYSwKKwkweDZkLCAweDY0LCAweDdmLCAweDc2LCAweDQ5LCAweDQwLCAweDViLCAweDUyLAorCTB4M2MsIDB4MzUsIDB4MmUsIDB4MjcsIDB4MTgsIDB4MTEsIDB4MGEsIDB4MDMsCisJMHg3NCwgMHg3ZCwgMHg2NiwgMHg2ZiwgMHg1MCwgMHg1OSwgMHg0MiwgMHg0YiwKKwkweDE3LCAweDFlLCAweDA1LCAweDBjLCAweDMzLCAweDNhLCAweDIxLCAweDI4LAorCTB4NWYsIDB4NTYsIDB4NGQsIDB4NDQsIDB4N2IsIDB4NzIsIDB4NjksIDB4NjAsCisJMHgwZSwgMHgwNywgMHgxYywgMHgxNSwgMHgyYSwgMHgyMywgMHgzOCwgMHgzMSwKKwkweDQ2LCAweDRmLCAweDU0LCAweDVkLCAweDYyLCAweDZiLCAweDcwLCAweDc5Cit9OworRVhQT1JUX1NZTUJPTChjcmM3X3N5bmRyb21lX3RhYmxlKTsKKworLyoqCisgKiBjcmM3IC0gdXBkYXRlIHRoZSBDUkM3IGZvciB0aGUgZGF0YSBidWZmZXIKKyAqIEBjcmM6ICAgICBwcmV2aW91cyBDUkM3IHZhbHVlCisgKiBAYnVmZmVyOiAgZGF0YSBwb2ludGVyCisgKiBAbGVuOiAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqIENvbnRleHQ6IGFueQorICoKKyAqIFJldHVybnMgdGhlIHVwZGF0ZWQgQ1JDNyB2YWx1ZS4KKyAqLwordTggY3JjNyh1OCBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCQljcmMgPSBjcmM3X2J5dGUoY3JjLCAqYnVmZmVyKyspOworCXJldHVybiBjcmM7Cit9CitFWFBPUlRfU1lNQk9MKGNyYzcpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzcgY2FsY3VsYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9saWIvZ2VuYWxsb2MuYyBiL2xpYi9nZW5hbGxvYy5jCmluZGV4IGViN2MyYmEuLmY2ZDI3NmQgMTAwNjQ0Ci0tLSBhL2xpYi9nZW5hbGxvYy5jCisrKyBiL2xpYi9nZW5hbGxvYy5jCkBAIC01NCwxMSArNTQsMTAgQEAKIAlpbnQgbmJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbF9jaHVuaykgKwogCQkJCShuYml0cyArIEJJVFNfUEVSX0JZVEUgLSAxKSAvIEJJVFNfUEVSX0JZVEU7CiAKLQljaHVuayA9IGttYWxsb2Nfbm9kZShuYnl0ZXMsIEdGUF9LRVJORUwsIG5pZCk7CisJY2h1bmsgPSBrbWFsbG9jX25vZGUobmJ5dGVzLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgbmlkKTsKIAlpZiAodW5saWtlbHkoY2h1bmsgPT0gTlVMTCkpCiAJCXJldHVybiAtMTsKIAotCW1lbXNldChjaHVuaywgMCwgbmJ5dGVzKTsKIAlzcGluX2xvY2tfaW5pdCgmY2h1bmstPmxvY2spOwogCWNodW5rLT5zdGFydF9hZGRyID0gYWRkcjsKIAljaHVuay0+ZW5kX2FkZHIgPSBhZGRyICsgc2l6ZTsKZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCBiOThmMDFhLi41Y2E2N2IzIDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC0zOTEsNiArMzkxLDUzIEBACiBFWFBPUlRfU1lNQk9MKGlkcl9yZW1vdmUpOwogCiAvKioKKyAqIGlkcl9yZW1vdmVfYWxsIC0gcmVtb3ZlIGFsbCBpZHMgZnJvbSB0aGUgZ2l2ZW4gaWRyIHRyZWUKKyAqIEBpZHA6IGlkciBoYW5kbGUKKyAqCisgKiBpZHJfZGVzdHJveSgpIG9ubHkgZnJlZXMgdXAgdW51c2VkLCBjYWNoZWQgaWRwX2xheWVycywgYnV0IHRoaXMKKyAqIGZ1bmN0aW9uIHdpbGwgcmVtb3ZlIGFsbCBpZCBtYXBwaW5ncyBhbmQgbGVhdmUgYWxsIGlkcF9sYXllcnMKKyAqIHVudXNlZC4KKyAqCisgKiBBIHR5cGljYWwgY2xlYW4tdXAgc2VxdWVuY2UgZm9yIG9iamVjdHMgc3RvcmVkIGluIGFuIGlkciB0cmVlLCB3aWxsCisgKiB1c2UgaWRyX2Zvcl9lYWNoKCkgdG8gZnJlZSBhbGwgb2JqZWN0cywgaWYgbmVjZXNzYXksIHRoZW4KKyAqIGlkcl9yZW1vdmVfYWxsKCkgdG8gcmVtb3ZlIGFsbCBpZHMsIGFuZCBpZHJfZGVzdHJveSgpIHRvIGZyZWUKKyAqIHVwIHRoZSBjYWNoZWQgaWRyX2xheWVycy4KKyAqLwordm9pZCBpZHJfcmVtb3ZlX2FsbChzdHJ1Y3QgaWRyICppZHApCit7CisJaW50IG4sIGlkLCBtYXgsIGVycm9yID0gMDsKKwlzdHJ1Y3QgaWRyX2xheWVyICpwOworCXN0cnVjdCBpZHJfbGF5ZXIgKnBhW01BWF9MRVZFTF07CisJc3RydWN0IGlkcl9sYXllciAqKnBhYSA9ICZwYVswXTsKKworCW4gPSBpZHAtPmxheWVycyAqIElEUl9CSVRTOworCXAgPSBpZHAtPnRvcDsKKwltYXggPSAxIDw8IG47CisKKwlpZCA9IDA7CisJd2hpbGUgKGlkIDwgbWF4ICYmICFlcnJvcikgeworCQl3aGlsZSAobiA+IElEUl9CSVRTICYmIHApIHsKKwkJCW4gLT0gSURSX0JJVFM7CisJCQkqcGFhKysgPSBwOworCQkJcCA9IHAtPmFyeVsoaWQgPj4gbikgJiBJRFJfTUFTS107CisJCX0KKworCQlpZCArPSAxIDw8IG47CisJCXdoaWxlIChuIDwgZmxzKGlkKSkgeworCQkJaWYgKHApIHsKKwkJCQltZW1zZXQocCwgMCwgc2l6ZW9mICpwKTsKKwkJCQlmcmVlX2xheWVyKGlkcCwgcCk7CisJCQl9CisJCQluICs9IElEUl9CSVRTOworCQkJcCA9ICotLXBhYTsKKwkJfQorCX0KKwlpZHAtPnRvcCA9IE5VTEw7CisJaWRwLT5sYXllcnMgPSAwOworfQorRVhQT1JUX1NZTUJPTChpZHJfcmVtb3ZlX2FsbCk7CisKKy8qKgogICogaWRyX2Rlc3Ryb3kgLSByZWxlYXNlIGFsbCBjYWNoZWQgbGF5ZXJzIHdpdGhpbiBhbiBpZHIgdHJlZQogICogaWRwOiBpZHIgaGFuZGxlCiAgKi8KQEAgLTQzNyw2ICs0ODQsNjEgQEAKIEVYUE9SVF9TWU1CT0woaWRyX2ZpbmQpOwogCiAvKioKKyAqIGlkcl9mb3JfZWFjaCAtIGl0ZXJhdGUgdGhyb3VnaCBhbGwgc3RvcmVkIHBvaW50ZXJzCisgKiBAaWRwOiBpZHIgaGFuZGxlCisgKiBAZm46IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBwb2ludGVyCisgKiBAZGF0YTogZGF0YSBwYXNzZWQgYmFjayB0byBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIEl0ZXJhdGUgb3ZlciB0aGUgcG9pbnRlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBnaXZlbiBpZHIuICBUaGUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHBvaW50ZXIgY3VycmVudGx5CisgKiByZWdpc3RlcmVkLCBwYXNzaW5nIHRoZSBpZCwgdGhlIHBvaW50ZXIgYW5kIHRoZSBkYXRhIHBvaW50ZXIgcGFzc2VkCisgKiB0byB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMgbm90IHNhZmUgdG8gbW9kaWZ5IHRoZSBpZHIgdHJlZSB3aGlsZSBpbgorICogdGhlIGNhbGxiYWNrLCBzbyBmdW5jdGlvbnMgc3VjaCBhcyBpZHJfZ2V0X25ldyBhbmQgaWRyX3JlbW92ZSBhcmUKKyAqIG5vdCBhbGxvd2VkLgorICoKKyAqIFdlIGNoZWNrIHRoZSByZXR1cm4gb2YgQGZuIGVhY2ggdGltZS4gSWYgaXQgcmV0dXJucyBhbnl0aGluZyBvdGhlcgorICogdGhhbiAwLCB3ZSBicmVhayBvdXQgYW5kIHJldHVybiB0aGF0IHZhbHVlLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBzZXJpYWxpemUgaWRyX2Zvcl9lYWNoKCkgdnMgaWRyX2dldF9uZXcoKSBhbmQgaWRyX3JlbW92ZSgpLgorICovCitpbnQgaWRyX2Zvcl9lYWNoKHN0cnVjdCBpZHIgKmlkcCwKKwkJIGludCAoKmZuKShpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpLCB2b2lkICpkYXRhKQoreworCWludCBuLCBpZCwgbWF4LCBlcnJvciA9IDA7CisJc3RydWN0IGlkcl9sYXllciAqcDsKKwlzdHJ1Y3QgaWRyX2xheWVyICpwYVtNQVhfTEVWRUxdOworCXN0cnVjdCBpZHJfbGF5ZXIgKipwYWEgPSAmcGFbMF07CisKKwluID0gaWRwLT5sYXllcnMgKiBJRFJfQklUUzsKKwlwID0gaWRwLT50b3A7CisJbWF4ID0gMSA8PCBuOworCisJaWQgPSAwOworCXdoaWxlIChpZCA8IG1heCkgeworCQl3aGlsZSAobiA+IDAgJiYgcCkgeworCQkJbiAtPSBJRFJfQklUUzsKKwkJCSpwYWErKyA9IHA7CisJCQlwID0gcC0+YXJ5WyhpZCA+PiBuKSAmIElEUl9NQVNLXTsKKwkJfQorCisJCWlmIChwKSB7CisJCQllcnJvciA9IGZuKGlkLCAodm9pZCAqKXAsIGRhdGEpOworCQkJaWYgKGVycm9yKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWQgKz0gMSA8PCBuOworCQl3aGlsZSAobiA8IGZscyhpZCkpIHsKKwkJCW4gKz0gSURSX0JJVFM7CisJCQlwID0gKi0tcGFhOworCQl9CisJfQorCisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTChpZHJfZm9yX2VhY2gpOworCisvKioKICAqIGlkcl9yZXBsYWNlIC0gcmVwbGFjZSBwb2ludGVyIGZvciBnaXZlbiBpZAogICogQGlkcDogaWRyIGhhbmRsZQogICogQHB0cjogcG9pbnRlciB5b3Ugd2FudCBhc3NvY2lhdGVkIHdpdGggdGhlIGlkCmRpZmYgLS1naXQgYS9saWIvcGVyY3B1X2NvdW50ZXIuYyBiL2xpYi9wZXJjcHVfY291bnRlci5jCmluZGV4IDg1MDQ0OTAuLmNmMjJjNjEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJjcHVfY291bnRlci5jCisrKyBiL2xpYi9wZXJjcHVfY291bnRlci5jCkBAIC0zLDggKzMsMTcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgTElTVF9IRUFEKHBlcmNwdV9jb3VudGVycyk7CitzdGF0aWMgREVGSU5FX01VVEVYKHBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgorCiB2b2lkIHBlcmNwdV9jb3VudGVyX21vZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczMyIGFtb3VudCkKIHsKIAlsb25nIGNvdW50OwpAQCAtMzYsNyArNDUsNyBAQAogCiAJc3Bpbl9sb2NrKCZmYmMtPmxvY2spOwogCXJldCA9IGZiYy0+Y291bnQ7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXMzMiAqcGNvdW50ID0gcGVyX2NwdV9wdHIoZmJjLT5jb3VudGVycywgY3B1KTsKIAkJcmV0ICs9ICpwY291bnQ7CiAJfQpAQCAtNDQsMyArNTMsNjAgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IDAgOiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX3N1bSk7CisKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKK3sKKwlzcGluX2xvY2tfaW5pdCgmZmJjLT5sb2NrKTsKKwlmYmMtPmNvdW50ID0gYW1vdW50OworCWZiYy0+Y291bnRlcnMgPSBhbGxvY19wZXJjcHUoczMyKTsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwltdXRleF9sb2NrKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisJbGlzdF9hZGQoJmZiYy0+bGlzdCwgJnBlcmNwdV9jb3VudGVycyk7CisJbXV0ZXhfdW5sb2NrKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfaW5pdCk7CisKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3sKKwlmcmVlX3BlcmNwdShmYmMtPmNvdW50ZXJzKTsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwltdXRleF9sb2NrKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisJbGlzdF9kZWwoJmZiYy0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfZGVzdHJveSk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBpbnQgX19jcHVpbml0IHBlcmNwdV9jb3VudGVyX2hvdGNwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCXN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjOworCisJaWYgKGFjdGlvbiAhPSBDUFVfREVBRCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCWNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisJbXV0ZXhfbG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmJjLCAmcGVyY3B1X2NvdW50ZXJzLCBsaXN0KSB7CisJCXMzMiAqcGNvdW50OworCisJCXNwaW5fbG9jaygmZmJjLT5sb2NrKTsKKwkJcGNvdW50ID0gcGVyX2NwdV9wdHIoZmJjLT5jb3VudGVycywgY3B1KTsKKwkJZmJjLT5jb3VudCArPSAqcGNvdW50OworCQkqcGNvdW50ID0gMDsKKwkJc3Bpbl91bmxvY2soJmZiYy0+bG9jayk7CisJfQorCW11dGV4X3VubG9jaygmcGVyY3B1X2NvdW50ZXJzX2xvY2spOworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBlcmNwdV9jb3VudGVyX3N0YXJ0dXAodm9pZCkKK3sKKwlob3RjcHVfbm90aWZpZXIocGVyY3B1X2NvdW50ZXJfaG90Y3B1X2NhbGxiYWNrLCAwKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHBlcmNwdV9jb3VudGVyX3N0YXJ0dXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvdnNwcmludGYuYyBiL2xpYi92c3ByaW50Zi5jCmluZGV4IDAxNzI5MDIuLjZiNjczNGQgMTAwNjQ0Ci0tLSBhL2xpYi92c3ByaW50Zi5jCisrKyBiL2xpYi92c3ByaW50Zi5jCkBAIC0xMzUsNiArMTM1LDEwMyBAQAogCXJldHVybiBpOwogfQogCisvKiBEZWNpbWFsIGNvbnZlcnNpb24gaXMgYnkgZmFyIHRoZSBtb3N0IHR5cGljYWwsIGFuZCBpcyB1c2VkCisgKiBmb3IgL3Byb2MgYW5kIC9zeXMgZGF0YS4gVGhpcyBkaXJlY3RseSBpbXBhY3RzIGUuZy4gdG9wIHBlcmZvcm1hbmNlCisgKiB3aXRoIG1hbnkgcHJvY2Vzc2VzIHJ1bm5pbmcuIFdlIG9wdGltaXplIGl0IGZvciBzcGVlZAorICogdXNpbmcgY29kZSBmcm9tCisgKiBodHRwOi8vd3d3LmNzLnVpb3dhLmVkdS9+am9uZXMvYmNkL2RlY2ltYWwuaHRtbAorICogKHdpdGggcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIERvdWdsYXMgVy4gSm9uZXMpLiAqLworCisvKiBGb3JtYXRzIGNvcnJlY3RseSBhbnkgaW50ZWdlciBpbiBbMCw5OTk5OV0uCisgKiBPdXRwdXRzIGZyb20gb25lIHRvIGZpdmUgZGlnaXRzIGRlcGVuZGluZyBvbiBpbnB1dC4KKyAqIE9uIGkzODYgZ2NjIDQuMS4yIC1PMjogfjI1MCBieXRlcyBvZiBjb2RlLiAqLworc3RhdGljIGNoYXIqIHB1dF9kZWNfdHJ1bmMoY2hhciAqYnVmLCB1bnNpZ25lZCBxKQoreworCXVuc2lnbmVkIGQzLCBkMiwgZDEsIGQwOworCWQxID0gKHE+PjQpICYgMHhmOworCWQyID0gKHE+PjgpICYgMHhmOworCWQzID0gKHE+PjEyKTsKKworCWQwID0gNiooZDMgKyBkMiArIGQxKSArIChxICYgMHhmKTsKKwlxID0gKGQwICogMHhjZCkgPj4gMTE7CisJZDAgPSBkMCAtIDEwKnE7CisJKmJ1ZisrID0gZDAgKyAnMCc7IC8qIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0ICovCisJZDEgPSBxICsgOSpkMyArIDUqZDIgKyBkMTsKKwlpZiAoZDEgIT0gMCkgeworCQlxID0gKGQxICogMHhjZCkgPj4gMTE7CisJCWQxID0gZDEgLSAxMCpxOworCQkqYnVmKysgPSBkMSArICcwJzsgLyogbmV4dCBkaWdpdCAqLworCisJCWQyID0gcSArIDIqZDI7CisJCWlmICgoZDIgIT0gMCkgfHwgKGQzICE9IDApKSB7CisJCQlxID0gKGQyICogMHhkKSA+PiA3OworCQkJZDIgPSBkMiAtIDEwKnE7CisJCQkqYnVmKysgPSBkMiArICcwJzsgLyogbmV4dCBkaWdpdCAqLworCisJCQlkMyA9IHEgKyA0KmQzOworCQkJaWYgKGQzICE9IDApIHsKKwkJCQlxID0gKGQzICogMHhjZCkgPj4gMTE7CisJCQkJZDMgPSBkMyAtIDEwKnE7CisJCQkJKmJ1ZisrID0gZDMgKyAnMCc7ICAvKiBuZXh0IGRpZ2l0ICovCisJCQkJaWYgKHEgIT0gMCkKKwkJCQkJKmJ1ZisrID0gcSArICcwJzsgIC8qIG1vc3Qgc2lnbi4gZGlnaXQgKi8KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYnVmOworfQorLyogU2FtZSB3aXRoIGlmJ3MgcmVtb3ZlZC4gQWx3YXlzIGVtaXRzIGZpdmUgZGlnaXRzICovCitzdGF0aWMgY2hhciogcHV0X2RlY19mdWxsKGNoYXIgKmJ1ZiwgdW5zaWduZWQgcSkKK3sKKwkvKiBCVFcsIGlmIHEgaXMgaW4gWzAsOTk5OV0sIDgtYml0IGludHMgd2lsbCBiZSBlbm91Z2gsICovCisJLyogYnV0IGFueXdheSwgZ2NjIHByb2R1Y2VzIGJldHRlciBjb2RlIHdpdGggZnVsbC1zaXplZCBpbnRzICovCisJdW5zaWduZWQgZDMsIGQyLCBkMSwgZDA7CisJZDEgPSAocT4+NCkgJiAweGY7CisJZDIgPSAocT4+OCkgJiAweGY7CisJZDMgPSAocT4+MTIpOworCisJLyogUG9zc2libGUgd2F5cyB0byBhcHByb3guIGRpdmlkZSBieSAxMCAqLworCS8qIGdjYyAtTzIgcmVwbGFjZXMgbXVsdGlwbHkgd2l0aCBzaGlmdHMgYW5kIGFkZHMgKi8KKwkvLyAoeCAqIDB4Y2QpID4+IDExOiAxMTAwMTEwMSAtIHNob3J0ZXIgY29kZSB0aGFuICogMHg2NyAob24gaTM4NikKKwkvLyAoeCAqIDB4NjcpID4+IDEwOiAgMTEwMDExMQorCS8vICh4ICogMHgzNCkgPj4gOTogICAgMTEwMTAwIC0gc2FtZQorCS8vICh4ICogMHgxYSkgPj4gODogICAgIDExMDEwIC0gc2FtZQorCS8vICh4ICogMHgwZCkgPj4gNzogICAgICAxMTAxIC0gc2FtZSwgc2hvcnRlc3QgY29kZSAob24gaTM4NikKKworCWQwID0gNiooZDMgKyBkMiArIGQxKSArIChxICYgMHhmKTsKKwlxID0gKGQwICogMHhjZCkgPj4gMTE7CisJZDAgPSBkMCAtIDEwKnE7CisJKmJ1ZisrID0gZDAgKyAnMCc7CisJZDEgPSBxICsgOSpkMyArIDUqZDIgKyBkMTsKKwkJcSA9IChkMSAqIDB4Y2QpID4+IDExOworCQlkMSA9IGQxIC0gMTAqcTsKKwkJKmJ1ZisrID0gZDEgKyAnMCc7CisKKwkJZDIgPSBxICsgMipkMjsKKwkJCXEgPSAoZDIgKiAweGQpID4+IDc7CisJCQlkMiA9IGQyIC0gMTAqcTsKKwkJCSpidWYrKyA9IGQyICsgJzAnOworCisJCQlkMyA9IHEgKyA0KmQzOworCQkJCXEgPSAoZDMgKiAweGNkKSA+PiAxMTsgLyogLSBzaG9ydGVyIGNvZGUgKi8KKwkJCQkvKiBxID0gKGQzICogMHg2NykgPj4gMTA7IC0gd291bGQgYWxzbyB3b3JrICovCisJCQkJZDMgPSBkMyAtIDEwKnE7CisJCQkJKmJ1ZisrID0gZDMgKyAnMCc7CisJCQkJCSpidWYrKyA9IHEgKyAnMCc7CisJcmV0dXJuIGJ1ZjsKK30KKy8qIE5vIGlubGluaW5nIGhlbHBzIGdjYyB0byB1c2UgcmVnaXN0ZXJzIGJldHRlciAqLworc3RhdGljIG5vaW5saW5lIGNoYXIqIHB1dF9kZWMoY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtKQoreworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHJlbTsKKwkJaWYgKG51bSA8IDEwMDAwMCkKKwkJCXJldHVybiBwdXRfZGVjX3RydW5jKGJ1ZiwgbnVtKTsKKwkJcmVtID0gZG9fZGl2KG51bSwgMTAwMDAwKTsKKwkJYnVmID0gcHV0X2RlY19mdWxsKGJ1ZiwgcmVtKTsKKwl9Cit9CisKICNkZWZpbmUgWkVST1BBRAkxCQkvKiBwYWQgd2l0aCB6ZXJvICovCiAjZGVmaW5lIFNJR04JMgkJLyogdW5zaWduZWQvc2lnbmVkIGxvbmcgKi8KICNkZWZpbmUgUExVUwk0CQkvKiBzaG93IHBsdXMgKi8KQEAgLTE0MywxMiArMjQwLDE0IEBACiAjZGVmaW5lIFNQRUNJQUwJMzIJCS8qIDB4ICovCiAjZGVmaW5lIExBUkdFCTY0CQkvKiB1c2UgJ0FCQ0RFRicgaW5zdGVhZCBvZiAnYWJjZGVmJyAqLwogCi1zdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogYnVmLCBjaGFyICogZW5kLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtLCBpbnQgYmFzZSwgaW50IHNpemUsIGludCBwcmVjaXNpb24sIGludCB0eXBlKQorc3RhdGljIGNoYXIgKm51bWJlcihjaGFyICpidWYsIGNoYXIgKmVuZCwgdW5zaWduZWQgbG9uZyBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uLCBpbnQgdHlwZSkKIHsKLQljaGFyIGMsc2lnbix0bXBbNjZdOworCWNoYXIgc2lnbix0bXBbNjZdOwogCWNvbnN0IGNoYXIgKmRpZ2l0czsKLQlzdGF0aWMgY29uc3QgY2hhciBzbWFsbF9kaWdpdHNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwotCXN0YXRpYyBjb25zdCBjaGFyIGxhcmdlX2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisJLyogd2UgYXJlIGNhbGxlZCB3aXRoIGJhc2UgOCwgMTAgb3IgMTYsIG9ubHksIHRodXMgZG9uJ3QgbmVlZCAiZy4uLiIgICovCisJc3RhdGljIGNvbnN0IGNoYXIgc21hbGxfZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZngiOyAvKiAiZ2hpamtsbW5vcHFyc3R1dnd4eXoiOyAqLworCXN0YXRpYyBjb25zdCBjaGFyIGxhcmdlX2RpZ2l0c1tdID0gIjAxMjM0NTY3ODlBQkNERUZYIjsgLyogIkdISUpLTE1OT1BRUlNUVVZXWFlaIjsgKi8KKwlpbnQgbmVlZF9wZnggPSAoKHR5cGUgJiBTUEVDSUFMKSAmJiBiYXNlICE9IDEwKTsKIAlpbnQgaTsKIAogCWRpZ2l0cyA9ICh0eXBlICYgTEFSR0UpID8gbGFyZ2VfZGlnaXRzIDogc21hbGxfZGlnaXRzOwpAQCAtMTU2LDcgKzI1NSw2IEBACiAJCXR5cGUgJj0gflpFUk9QQUQ7CiAJaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikKIAkJcmV0dXJuIE5VTEw7Ci0JYyA9ICh0eXBlICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CiAJc2lnbiA9IDA7CiAJaWYgKHR5cGUgJiBTSUdOKSB7CiAJCWlmICgoc2lnbmVkIGxvbmcgbG9uZykgbnVtIDwgMCkgewpAQCAtMTcxLDY0ICsyNjksODUgQEAKIAkJCXNpemUtLTsKIAkJfQogCX0KLQlpZiAodHlwZSAmIFNQRUNJQUwpIHsKKwlpZiAobmVlZF9wZngpIHsKKwkJc2l6ZS0tOwogCQlpZiAoYmFzZSA9PSAxNikKLQkJCXNpemUgLT0gMjsKLQkJZWxzZSBpZiAoYmFzZSA9PSA4KQogCQkJc2l6ZS0tOwogCX0KKworCS8qIGdlbmVyYXRlIGZ1bGwgc3RyaW5nIGluIHRtcFtdLCBpbiByZXZlcnNlIG9yZGVyICovCiAJaSA9IDA7CiAJaWYgKG51bSA9PSAwKQotCQl0bXBbaSsrXT0nMCc7Ci0JZWxzZSB3aGlsZSAobnVtICE9IDApCisJCXRtcFtpKytdID0gJzAnOworCS8qIEdlbmVyaWMgY29kZSwgZm9yIGFueSBiYXNlOgorCWVsc2UgZG8gewogCQl0bXBbaSsrXSA9IGRpZ2l0c1tkb19kaXYobnVtLGJhc2UpXTsKKwl9IHdoaWxlIChudW0gIT0gMCk7CisJKi8KKwllbHNlIGlmIChiYXNlICE9IDEwKSB7IC8qIDggb3IgMTYgKi8KKwkJaW50IG1hc2sgPSBiYXNlIC0gMTsKKwkJaW50IHNoaWZ0ID0gMzsKKwkJaWYgKGJhc2UgPT0gMTYpIHNoaWZ0ID0gNDsKKwkJZG8geworCQkJdG1wW2krK10gPSBkaWdpdHNbKCh1bnNpZ25lZCBjaGFyKW51bSkgJiBtYXNrXTsKKwkJCW51bSA+Pj0gc2hpZnQ7CisJCX0gd2hpbGUgKG51bSk7CisJfSBlbHNlIHsgLyogYmFzZSAxMCAqLworCQlpID0gcHV0X2RlYyh0bXAsIG51bSkgLSB0bXA7CisJfQorCisJLyogcHJpbnRpbmcgMTAwIHVzaW5nICUyZCBnaXZlcyAiMTAwIiwgbm90ICIwMCIgKi8KIAlpZiAoaSA+IHByZWNpc2lvbikKIAkJcHJlY2lzaW9uID0gaTsKKwkvKiBsZWFkaW5nIHNwYWNlIHBhZGRpbmcgKi8KIAlzaXplIC09IHByZWNpc2lvbjsKLQlpZiAoISh0eXBlJihaRVJPUEFEK0xFRlQpKSkgewotCQl3aGlsZShzaXplLS0+MCkgeworCWlmICghKHR5cGUgJiAoWkVST1BBRCtMRUZUKSkpIHsKKwkJd2hpbGUoLS1zaXplID49IDApIHsKIAkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9ICcgJzsKIAkJCSsrYnVmOwogCQl9CiAJfQorCS8qIHNpZ24gKi8KIAlpZiAoc2lnbikgewogCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9IHNpZ247CiAJCSsrYnVmOwogCX0KLQlpZiAodHlwZSAmIFNQRUNJQUwpIHsKLQkJaWYgKGJhc2U9PTgpIHsKKwkvKiAiMHgiIC8gIjAiIHByZWZpeCAqLworCWlmIChuZWVkX3BmeCkgeworCQlpZiAoYnVmIDwgZW5kKQorCQkJKmJ1ZiA9ICcwJzsKKwkJKytidWY7CisJCWlmIChiYXNlID09IDE2KSB7CiAJCQlpZiAoYnVmIDwgZW5kKQotCQkJCSpidWYgPSAnMCc7Ci0JCQkrK2J1ZjsKLQkJfSBlbHNlIGlmIChiYXNlPT0xNikgewotCQkJaWYgKGJ1ZiA8IGVuZCkKLQkJCQkqYnVmID0gJzAnOwotCQkJKytidWY7Ci0JCQlpZiAoYnVmIDwgZW5kKQotCQkJCSpidWYgPSBkaWdpdHNbMzNdOworCQkJCSpidWYgPSBkaWdpdHNbMTZdOyAvKiBmb3IgYXJiaXRyYXJ5IGJhc2U6IGRpZ2l0c1szM107ICovCiAJCQkrK2J1ZjsKIAkJfQogCX0KKwkvKiB6ZXJvIG9yIHNwYWNlIHBhZGRpbmcgKi8KIAlpZiAoISh0eXBlICYgTEVGVCkpIHsKLQkJd2hpbGUgKHNpemUtLSA+IDApIHsKKwkJY2hhciBjID0gKHR5cGUgJiBaRVJPUEFEKSA/ICcwJyA6ICcgJzsKKwkJd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CiAJCQlpZiAoYnVmIDwgZW5kKQogCQkJCSpidWYgPSBjOwogCQkJKytidWY7CiAJCX0KIAl9Ci0Jd2hpbGUgKGkgPCBwcmVjaXNpb24tLSkgeworCS8qIGhtbSBldmVuIG1vcmUgemVybyBwYWRkaW5nPyAqLworCXdoaWxlIChpIDw9IC0tcHJlY2lzaW9uKSB7CiAJCWlmIChidWYgPCBlbmQpCiAJCQkqYnVmID0gJzAnOwogCQkrK2J1ZjsKIAl9Ci0Jd2hpbGUgKGktLSA+IDApIHsKKwkvKiBhY3R1YWwgZGlnaXRzIG9mIHJlc3VsdCAqLworCXdoaWxlICgtLWkgPj0gMCkgewogCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9IHRtcFtpXTsKIAkJKytidWY7CiAJfQotCXdoaWxlIChzaXplLS0gPiAwKSB7CisJLyogdHJhaWxpbmcgc3BhY2UgcGFkZGluZyAqLworCXdoaWxlICgtLXNpemUgPj0gMCkgewogCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9ICcgJzsKIAkJKytidWY7CkBAIC0yNzYsNyArMzk1LDcgQEAKIAkgICB1c2VkIGZvciB1bmtub3duIGJ1ZmZlciBzaXplcy4gKi8KIAlpZiAodW5saWtlbHkoKGludCkgc2l6ZSA8IDApKSB7CiAJCS8qIFRoZXJlIGNhbiBiZSBvbmx5IG9uZS4uICovCi0JCXN0YXRpYyBpbnQgd2FybiA9IDE7CisJCXN0YXRpYyBjaGFyIHdhcm4gPSAxOwogCQlXQVJOX09OKHdhcm4pOwogCQl3YXJuID0gMDsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCA4YWM0MTJiLi44NjE4NzIyIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTExNyw3ICsxMTcsNyBAQAogCWJvb2wgIkFsbG93IGZvciBtZW1vcnkgaG90LWFkZCIKIAlkZXBlbmRzIG9uIFNQQVJTRU1FTSB8fCBYODZfNjRfQUNQSV9OVU1BCiAJZGVwZW5kcyBvbiBIT1RQTFVHICYmICFTT0ZUV0FSRV9TVVNQRU5EICYmIEFSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHCi0JZGVwZW5kcyBvbiAoSUE2NCB8fCBYODYgfHwgUFBDNjQpCisJZGVwZW5kcyBvbiAoSUE2NCB8fCBYODYgfHwgUFBDNjQgfHwgU1VQRVJIKQogCiBjb21tZW50ICJNZW1vcnkgaG90cGx1ZyBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZCIKIAlkZXBlbmRzIG9uIFNQQVJTRU1FTSAmJiBIT1RQTFVHICYmIFNPRlRXQVJFX1NVU1BFTkQKQEAgLTE2Myw4ICsxNjMsMTYgQEAKIAlkZWZhdWx0ICIwIiBpZiAhWk9ORV9ETUEKIAlkZWZhdWx0ICIxIgogCitjb25maWcgQk9VTkNFCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gQkxPQ0sgJiYgTU1VICYmIChaT05FX0RNQSB8fCBISUdITUVNKQorCiBjb25maWcgTlJfUVVJQ0sKIAlpbnQKIAlkZXBlbmRzIG9uIFFVSUNLTElTVAogCWRlZmF1bHQgIjIiIGlmIChTVVBFUkggJiYgIVNVUEVSSDY0KQogCWRlZmF1bHQgIjEiCisKK2NvbmZpZyBWSVJUX1RPX0JVUworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uICFBUkNIX05PX1ZJUlRfVE9fQlVTCmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IGE5MTQ4ZWEuLjI0NWUzM2EgMTAwNjQ0Ci0tLSBhL21tL01ha2VmaWxlCisrKyBiL21tL01ha2VmaWxlCkBAIC0xMyw5ICsxMyw3IEBACiAJCQkgICBwcmlvX3RyZWUubyB1dGlsLm8gbW16b25lLm8gdm1zdGF0Lm8gYmFja2luZy1kZXYubyBcCiAJCQkgICAkKG1tdS15KQogCi1pZmVxICgkKENPTkZJR19NTVUpJChDT05GSUdfQkxPQ0spLHl5KQotb2JqLXkJCQkrPSBib3VuY2UubwotZW5kaWYKK29iai0kKENPTkZJR19CT1VOQ0UpCSs9IGJvdW5jZS5vCiBvYmotJChDT05GSUdfU1dBUCkJKz0gcGFnZV9pby5vIHN3YXBfc3RhdGUubyBzd2FwZmlsZS5vIHRocmFzaC5vCiBvYmotJChDT05GSUdfSFVHRVRMQkZTKQkrPSBodWdldGxiLm8KIG9iai0kKENPTkZJR19OVU1BKSAJKz0gbWVtcG9saWN5Lm8KZGlmZiAtLWdpdCBhL21tL2FsbG9jcGVyY3B1LmMgYi9tbS9hbGxvY3BlcmNwdS5jCmluZGV4IGIyNDg2Y2YuLjAwYjAyNjIgMTAwNjQ0Ci0tLSBhL21tL2FsbG9jcGVyY3B1LmMKKysrIGIvbW0vYWxsb2NwZXJjcHUuYwpAQCAtNTMsMTIgKzUzLDkgQEAKIAlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CiAKIAlCVUdfT04ocGRhdGEtPnB0cnNbY3B1XSk7Ci0JaWYgKG5vZGVfb25saW5lKG5vZGUpKSB7Ci0JCS8qIEZJWE1FOiBremFsbG9jX25vZGUoc2l6ZSwgZ2ZwLCBub2RlKSAqLwotCQlwZGF0YS0+cHRyc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsIGdmcCwgbm9kZSk7Ci0JCWlmIChwZGF0YS0+cHRyc1tjcHVdKQotCQkJbWVtc2V0KHBkYXRhLT5wdHJzW2NwdV0sIDAsIHNpemUpOwotCX0gZWxzZQorCWlmIChub2RlX29ubGluZShub2RlKSkKKwkJcGRhdGEtPnB0cnNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLCBnZnB8X19HRlBfWkVSTywgbm9kZSk7CisJZWxzZQogCQlwZGF0YS0+cHRyc1tjcHVdID0ga3phbGxvYyhzaXplLCBnZnApOwogCXJldHVybiBwZGF0YS0+cHRyc1tjcHVdOwogfQpkaWZmIC0tZ2l0IGEvbW0vYmFja2luZy1kZXYuYyBiL21tL2JhY2tpbmctZGV2LmMKaW5kZXggZTVkZTM3OC4uZjUwYTI4MSAxMDA2NDQKLS0tIGEvbW0vYmFja2luZy1kZXYuYworKysgYi9tbS9iYWNraW5nLWRldi5jCkBAIC01NSwyMiArNTUsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjb25nZXN0aW9uX3dhaXQpOwogCi1sb25nIGNvbmdlc3Rpb25fd2FpdF9pbnRlcnJ1cHRpYmxlKGludCBydywgbG9uZyB0aW1lb3V0KQotewotCWxvbmcgcmV0OwotCURFRklORV9XQUlUKHdhaXQpOwotCXdhaXRfcXVldWVfaGVhZF90ICp3cWggPSAmY29uZ2VzdGlvbl93cWhbcnddOwotCi0JcHJlcGFyZV90b193YWl0KHdxaCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JZWxzZQotCQlyZXQgPSBpb19zY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCWZpbmlzaF93YWl0KHdxaCwgJndhaXQpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGNvbmdlc3Rpb25fd2FpdF9pbnRlcnJ1cHRpYmxlKTsKLQogLyoqCiAgKiBjb25nZXN0aW9uX2VuZCAtIHdha2UgdXAgc2xlZXBlcnMgb24gYSBjb25nZXN0ZWQgYmFja2luZ19kZXZfaW5mbwogICogQHJ3OiBSRUFEIG9yIFdSSVRFCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggYzZlYmQ5Zi4uNWQ1NDQ5ZiAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMTIwLDYgKzEyMCw3IEBACiAJcGFnZS0+bWFwcGluZyA9IE5VTEw7CiAJbWFwcGluZy0+bnJwYWdlcy0tOwogCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKKwlCVUdfT04ocGFnZV9tYXBwZWQocGFnZSkpOwogfQogCiB2b2lkIHJlbW92ZV9mcm9tX3BhZ2VfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC04NjYsMTMgKzg2NywxMSBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCXVuc2lnbmVkIGxvbmcgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBlbmRfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4OwogCXVuc2lnbmVkIGxvbmcgbmV4dF9pbmRleDsKIAl1bnNpZ25lZCBsb25nIHByZXZfaW5kZXg7CiAJdW5zaWduZWQgaW50IHByZXZfb2Zmc2V0OwotCWxvZmZfdCBpc2l6ZTsKIAlzdHJ1Y3QgcGFnZSAqY2FjaGVkX3BhZ2U7CiAJaW50IGVycm9yOwogCXN0cnVjdCBmaWxlX3JhX3N0YXRlIHJhID0gKl9yYTsKQEAgLTg4NSwyNyArODg0LDEyIEBACiAJbGFzdF9pbmRleCA9ICgqcHBvcyArIGRlc2MtPmNvdW50ICsgUEFHRV9DQUNIRV9TSVpFLTEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJb2Zmc2V0ID0gKnBwb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwogCi0JaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JaWYgKCFpc2l6ZSkKLQkJZ290byBvdXQ7Ci0KLQllbmRfaW5kZXggPSAoaXNpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWZvciAoOzspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4OworCQlsb2ZmX3QgaXNpemU7CiAJCXVuc2lnbmVkIGxvbmcgbnIsIHJldDsKIAotCQkvKiBuciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHRoaXMgcGFnZSAqLwotCQluciA9IFBBR0VfQ0FDSEVfU0laRTsKLQkJaWYgKGluZGV4ID49IGVuZF9pbmRleCkgewotCQkJaWYgKGluZGV4ID4gZW5kX2luZGV4KQotCQkJCWdvdG8gb3V0OwotCQkJbnIgPSAoKGlzaXplIC0gMSkgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7Ci0JCQlpZiAobnIgPD0gb2Zmc2V0KSB7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJbnIgPSBuciAtIG9mZnNldDsKLQogCQljb25kX3Jlc2NoZWQoKTsKIAkJaWYgKGluZGV4ID09IG5leHRfaW5kZXgpCiAJCQluZXh0X2luZGV4ID0gcGFnZV9jYWNoZV9yZWFkYWhlYWQobWFwcGluZywgJnJhLCBmaWxwLApAQCAtOTIwLDYgKzkwNCwzMiBAQAogCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKIAkJCWdvdG8gcGFnZV9ub3RfdXBfdG9fZGF0ZTsKIHBhZ2Vfb2s6CisJCS8qCisJCSAqIGlfc2l6ZSBtdXN0IGJlIGNoZWNrZWQgYWZ0ZXIgd2Uga25vdyB0aGUgcGFnZSBpcyBVcHRvZGF0ZS4KKwkJICoKKwkJICogQ2hlY2tpbmcgaV9zaXplIGFmdGVyIHRoZSBjaGVjayBhbGxvd3MgdXMgdG8gY2FsY3VsYXRlCisJCSAqIHRoZSBjb3JyZWN0IHZhbHVlIGZvciAibnIiLCB3aGljaCBtZWFucyB0aGUgemVyby1maWxsZWQKKwkJICogcGFydCBvZiB0aGUgcGFnZSBpcyBub3QgY29waWVkIGJhY2sgdG8gdXNlcnNwYWNlICh1bmxlc3MKKwkJICogYW5vdGhlciB0cnVuY2F0ZSBleHRlbmRzIHRoZSBmaWxlIC0gdGhpcyBpcyBkZXNpcmVkIHRob3VnaCkuCisJCSAqLworCisJCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCQllbmRfaW5kZXggPSAoaXNpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAodW5saWtlbHkoIWlzaXplIHx8IGluZGV4ID4gZW5kX2luZGV4KSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBuciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHRoaXMgcGFnZSAqLworCQluciA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJaWYgKGluZGV4ID09IGVuZF9pbmRleCkgeworCQkJbnIgPSAoKGlzaXplIC0gMSkgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7CisJCQlpZiAobnIgPD0gb2Zmc2V0KSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCW5yID0gbnIgLSBvZmZzZXQ7CiAKIAkJLyogSWYgdXNlcnMgY2FuIGJlIHdyaXRpbmcgdG8gdGhpcyBwYWdlIHVzaW5nIGFyYml0cmFyeQogCQkgKiB2aXJ0dWFsIGFkZHJlc3NlcywgdGFrZSBjYXJlIGFib3V0IHBvdGVudGlhbCBhbGlhc2luZwpAQCAtMTAwNiwzMSArMTAxNiw2IEBACiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQogCi0JCS8qCi0JCSAqIGlfc2l6ZSBtdXN0IGJlIGNoZWNrZWQgYWZ0ZXIgd2UgaGF2ZSBkb25lIC0+cmVhZHBhZ2UuCi0JCSAqCi0JCSAqIENoZWNraW5nIGlfc2l6ZSBhZnRlciB0aGUgcmVhZHBhZ2UgYWxsb3dzIHVzIHRvIGNhbGN1bGF0ZQotCQkgKiB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgIm5yIiwgd2hpY2ggbWVhbnMgdGhlIHplcm8tZmlsbGVkCi0JCSAqIHBhcnQgb2YgdGhlIHBhZ2UgaXMgbm90IGNvcGllZCBiYWNrIHRvIHVzZXJzcGFjZSAodW5sZXNzCi0JCSAqIGFub3RoZXIgdHJ1bmNhdGUgZXh0ZW5kcyB0aGUgZmlsZSAtIHRoaXMgaXMgZGVzaXJlZCB0aG91Z2gpLgotCQkgKi8KLQkJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JCWVuZF9pbmRleCA9IChpc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCWlmICh1bmxpa2VseSghaXNpemUgfHwgaW5kZXggPiBlbmRfaW5kZXgpKSB7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qIG5yIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gdGhpcyBwYWdlICovCi0JCW5yID0gUEFHRV9DQUNIRV9TSVpFOwotCQlpZiAoaW5kZXggPT0gZW5kX2luZGV4KSB7Ci0JCQluciA9ICgoaXNpemUgLSAxKSAmIH5QQUdFX0NBQ0hFX01BU0spICsgMTsKLQkJCWlmIChuciA8PSBvZmZzZXQpIHsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJbnIgPSBuciAtIG9mZnNldDsKIAkJZ290byBwYWdlX29rOwogCiByZWFkcGFnZV9lcnJvcjoKQEAgLTEyMTgsNiArMTIwMyw4IEBACiAJCQkJcmV0dmFsID0gcmV0dmFsID86IGRlc2MuZXJyb3I7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQlpZiAoZGVzYy5jb3VudCA+IDApCisJCQkJYnJlYWs7CiAJCX0KIAl9CiBvdXQ6CkBAIC0xOTY0LDcgKzE5NTEsNiBAQAogCWlmICh1bmxpa2VseSgqcG9zICsgKmNvdW50ID4gTUFYX05PTl9MRlMgJiYKIAkJCQkhKGZpbGUtPmZfZmxhZ3MgJiBPX0xBUkdFRklMRSkpKSB7CiAJCWlmICgqcG9zID49IE1BWF9OT05fTEZTKSB7Ci0JCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKIAkJCXJldHVybiAtRUZCSUc7CiAJCX0KIAkJaWYgKCpjb3VudCA+IE1BWF9OT05fTEZTIC0gKHVuc2lnbmVkIGxvbmcpKnBvcykgewpAQCAtMTk4Miw3ICsxOTY4LDYgQEAKIAlpZiAobGlrZWx5KCFpc2JsaykpIHsKIAkJaWYgKHVubGlrZWx5KCpwb3MgPj0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpKSB7CiAJCQlpZiAoKmNvdW50IHx8ICpwb3MgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewotCQkJCXNlbmRfc2lnKFNJR1hGU1osIGN1cnJlbnQsIDApOwogCQkJCXJldHVybiAtRUZCSUc7CiAJCQl9CiAJCQkvKiB6ZXJvLWxlbmd0aCB3cml0ZXMgYXQgLT5zX21heGJ5dGVzIGFyZSBPSyAqLwpkaWZmIC0tZ2l0IGEvbW0vaGlnaG1lbS5jIGIvbW0vaGlnaG1lbS5jCmluZGV4IGJlOGY4ZDMuLjdhOTY3YmMgMTAwNjQ0Ci0tLSBhL21tL2hpZ2htZW0uYworKysgYi9tbS9oaWdobWVtLmMKQEAgLTQ2LDkgKzQ2LDE0IEBACiAJcGdfZGF0YV90ICpwZ2RhdDsKIAl1bnNpZ25lZCBpbnQgcGFnZXMgPSAwOwogCi0JZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KQorCWZvcl9lYWNoX29ubGluZV9wZ2RhdChwZ2RhdCkgewogCQlwYWdlcyArPSB6b25lX3BhZ2Vfc3RhdGUoJnBnZGF0LT5ub2RlX3pvbmVzW1pPTkVfSElHSE1FTV0sCiAJCQlOUl9GUkVFX1BBR0VTKTsKKwkJaWYgKHpvbmVfbW92YWJsZV9pc19oaWdobWVtKCkpCisJCQlwYWdlcyArPSB6b25lX3BhZ2Vfc3RhdGUoCisJCQkJCSZwZ2RhdC0+bm9kZV96b25lc1taT05FX01PVkFCTEVdLAorCQkJCQlOUl9GUkVFX1BBR0VTKTsKKwl9CiAKIAlyZXR1cm4gcGFnZXM7CiB9CmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggYTQ1ZDFmMC4uNjkxMmJiZiAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtMjcsNiArMjcsOSBAQAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaHVnZXBhZ2VfZnJlZWxpc3RzW01BWF9OVU1OT0RFU107CiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX2h1Z2VfcGFnZXNfbm9kZVtNQVhfTlVNTk9ERVNdOwogc3RhdGljIHVuc2lnbmVkIGludCBmcmVlX2h1Z2VfcGFnZXNfbm9kZVtNQVhfTlVNTk9ERVNdOworc3RhdGljIGdmcF90IGh0bGJfYWxsb2NfbWFzayA9IEdGUF9ISUdIVVNFUjsKK3Vuc2lnbmVkIGxvbmcgaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGU7CisKIC8qCiAgKiBQcm90ZWN0cyB1cGRhdGVzIHRvIGh1Z2VwYWdlX2ZyZWVsaXN0cywgbnJfaHVnZV9wYWdlcywgYW5kIGZyZWVfaHVnZV9wYWdlcwogICovCkBAIC02NiwxNCArNjksMTUgQEAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqZGVxdWV1ZV9odWdlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCWludCBuaWQgPSBudW1hX25vZGVfaWQoKTsKKwlpbnQgbmlkOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0ID0gaHVnZV96b25lbGlzdCh2bWEsIGFkZHJlc3MpOworCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBodWdlX3pvbmVsaXN0KHZtYSwgYWRkcmVzcywKKwkJCQkJCWh0bGJfYWxsb2NfbWFzayk7CiAJc3RydWN0IHpvbmUgKip6OwogCiAJZm9yICh6ID0gem9uZWxpc3QtPnpvbmVzOyAqejsgeisrKSB7CiAJCW5pZCA9IHpvbmVfdG9fbmlkKCp6KTsKLQkJaWYgKGNwdXNldF96b25lX2FsbG93ZWRfc29mdHdhbGwoKnosIEdGUF9ISUdIVVNFUikgJiYKKwkJaWYgKGNwdXNldF96b25lX2FsbG93ZWRfc29mdHdhbGwoKnosIGh0bGJfYWxsb2NfbWFzaykgJiYKIAkJICAgICFsaXN0X2VtcHR5KCZodWdlcGFnZV9mcmVlbGlzdHNbbmlkXSkpCiAJCQlicmVhazsKIAl9CkBAIC0xMDEsMTMgKzEwNSwyMCBAQAogCiBzdGF0aWMgaW50IGFsbG9jX2ZyZXNoX2h1Z2VfcGFnZSh2b2lkKQogewotCXN0YXRpYyBpbnQgbmlkID0gMDsKKwlzdGF0aWMgaW50IHByZXZfbmlkOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgR0ZQX0hJR0hVU0VSfF9fR0ZQX0NPTVB8X19HRlBfTk9XQVJOLAotCQkJCQlIVUdFVExCX1BBR0VfT1JERVIpOwotCW5pZCA9IG5leHRfbm9kZShuaWQsIG5vZGVfb25saW5lX21hcCk7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhuaWRfbG9jayk7CisJaW50IG5pZDsKKworCXNwaW5fbG9jaygmbmlkX2xvY2spOworCW5pZCA9IG5leHRfbm9kZShwcmV2X25pZCwgbm9kZV9vbmxpbmVfbWFwKTsKIAlpZiAobmlkID09IE1BWF9OVU1OT0RFUykKIAkJbmlkID0gZmlyc3Rfbm9kZShub2RlX29ubGluZV9tYXApOworCXByZXZfbmlkID0gbmlkOworCXNwaW5fdW5sb2NrKCZuaWRfbG9jayk7CisKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShuaWQsIGh0bGJfYWxsb2NfbWFza3xfX0dGUF9DT01QfF9fR0ZQX05PV0FSTiwKKwkJCQkJSFVHRVRMQl9QQUdFX09SREVSKTsKIAlpZiAocGFnZSkgewogCQlzZXRfY29tcG91bmRfcGFnZV9kdG9yKHBhZ2UsIGZyZWVfaHVnZV9wYWdlKTsKIAkJc3Bpbl9sb2NrKCZodWdldGxiX2xvY2spOwpAQCAtMjU2LDYgKzI2NywxOSBAQAogCW1heF9odWdlX3BhZ2VzID0gc2V0X21heF9odWdlX3BhZ2VzKG1heF9odWdlX3BhZ2VzKTsKIAlyZXR1cm4gMDsKIH0KKworaW50IGh1Z2V0bGJfdHJlYXRfbW92YWJsZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCXNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCit7CisJcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKKwlpZiAoaHVnZXBhZ2VzX3RyZWF0X2FzX21vdmFibGUpCisJCWh0bGJfYWxsb2NfbWFzayA9IEdGUF9ISUdIVVNFUl9NT1ZBQkxFOworCWVsc2UKKwkJaHRsYl9hbGxvY19tYXNrID0gR0ZQX0hJR0hVU0VSOworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCiBpbnQgaHVnZXRsYl9yZXBvcnRfbWVtaW5mbyhjaGFyICpidWYpCkBAIC00NzQsNyArNDk4LDcgQEAKIAlyZXR1cm4gVk1fRkFVTFRfTUlOT1I7CiB9CiAKLWludCBodWdldGxiX25vX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorc3RhdGljIGludCBodWdldGxiX25vX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwgaW50IHdyaXRlX2FjY2VzcykKIHsKIAlpbnQgcmV0ID0gVk1fRkFVTFRfU0lHQlVTOwpkaWZmIC0tZ2l0IGEvbW0vbWFkdmlzZS5jIGIvbW0vbWFkdmlzZS5jCmluZGV4IDYwNTQyZDAuLjkzZWUzNzUgMTAwNjQ0Ci0tLSBhL21tL21hZHZpc2UuYworKysgYi9tbS9tYWR2aXNlLmMKQEAgLTI4Nyw5ICsyODcsMTEgQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsICpwcmV2OwogCWludCB1bm1hcHBlZF9lcnJvciA9IDA7CiAJaW50IGVycm9yID0gLUVJTlZBTDsKKwlpbnQgd3JpdGU7CiAJc2l6ZV90IGxlbjsKIAotCWlmIChtYWR2aXNlX25lZWRfbW1hcF93cml0ZShiZWhhdmlvcikpCisJd3JpdGUgPSBtYWR2aXNlX25lZWRfbW1hcF93cml0ZShiZWhhdmlvcik7CisJaWYgKHdyaXRlKQogCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCWVsc2UKIAkJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwpAQCAtMzU0LDcgKzM1Niw3IEBACiAJCQl2bWEgPSBmaW5kX3ZtYShjdXJyZW50LT5tbSwgc3RhcnQpOwogCX0KIG91dDoKLQlpZiAobWFkdmlzZV9uZWVkX21tYXBfd3JpdGUoYmVoYXZpb3IpKQorCWlmICh3cml0ZSkKIAkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJZWxzZQogCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCBmNjRjYmY5Li45YzZmZjdmIDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtNzgsMTEgKzc4LDkgQEAKICAqIGFuZCBaT05FX0hJR0hNRU0uCiAgKi8KIHZvaWQgKiBoaWdoX21lbW9yeTsKLXVuc2lnbmVkIGxvbmcgdm1hbGxvY19lYXJseXJlc2VydmU7CiAKIEVYUE9SVF9TWU1CT0wobnVtX3BoeXNwYWdlcyk7CiBFWFBPUlRfU1lNQk9MKGhpZ2hfbWVtb3J5KTsKLUVYUE9SVF9TWU1CT0wodm1hbGxvY19lYXJseXJlc2VydmUpOwogCiBpbnQgcmFuZG9taXplX3ZhX3NwYWNlIF9fcmVhZF9tb3N0bHkgPSAxOwogCkBAIC0xMDU1LDYgKzEwNTMsMTQgQEAKIAkJZG8gewogCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKKwkJCS8qCisJCQkgKiBJZiB0c2sgaXMgb29taW5nLCBjdXQgb2ZmIGl0cyBhY2Nlc3MgdG8gbGFyZ2UgbWVtb3J5CisJCQkgKiBhbGxvY2F0aW9ucy4gSXQgaGFzIGEgcGVuZGluZyBTSUdLSUxMLCBidXQgaXQgY2FuJ3QKKwkJCSAqIGJlIHByb2Nlc3NlZCB1bnRpbCByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHRlc3RfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX01FTURJRSkpKQorCQkJCXJldHVybiAtRU5PTUVNOworCiAJCQlpZiAod3JpdGUpCiAJCQkJZm9sbF9mbGFncyB8PSBGT0xMX1dSSVRFOwogCkBAIC0xNzA5LDExICsxNzE1LDExIEBACiAJaWYgKHVubGlrZWx5KGFub25fdm1hX3ByZXBhcmUodm1hKSkpCiAJCWdvdG8gb29tOwogCWlmIChvbGRfcGFnZSA9PSBaRVJPX1BBR0UoYWRkcmVzcykpIHsKLQkJbmV3X3BhZ2UgPSBhbGxvY196ZXJvZWRfdXNlcl9oaWdocGFnZSh2bWEsIGFkZHJlc3MpOworCQluZXdfcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUodm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFuZXdfcGFnZSkKIAkJCWdvdG8gb29tOwogCX0gZWxzZSB7Ci0JCW5ld19wYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsIGFkZHJlc3MpOworCQluZXdfcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUl9NT1ZBQkxFLCB2bWEsIGFkZHJlc3MpOwogCQlpZiAoIW5ld19wYWdlKQogCQkJZ290byBvb207CiAJCWNvd191c2VyX3BhZ2UobmV3X3BhZ2UsIG9sZF9wYWdlLCBhZGRyZXNzLCB2bWEpOwpAQCAtMjIzMSw3ICsyMjM3LDcgQEAKIAogCQlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkKIAkJCWdvdG8gb29tOwotCQlwYWdlID0gYWxsb2NfemVyb2VkX3VzZXJfaGlnaHBhZ2Uodm1hLCBhZGRyZXNzKTsKKwkJcGFnZSA9IGFsbG9jX3plcm9lZF91c2VyX2hpZ2hwYWdlX21vdmFibGUodm1hLCBhZGRyZXNzKTsKIAkJaWYgKCFwYWdlKQogCQkJZ290byBvb207CiAKQEAgLTIzMzQsNyArMjM0MCw4IEBACiAKIAkJCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQogCQkJCWdvdG8gb29tOwotCQkJcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyZXNzKTsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwKKwkJCQkJCXZtYSwgYWRkcmVzcyk7CiAJCQlpZiAoIXBhZ2UpCiAJCQkJZ290byBvb207CiAJCQljb3B5X3VzZXJfaGlnaHBhZ2UocGFnZSwgbmV3X3BhZ2UsIGFkZHJlc3MsIHZtYSk7CkBAIC0yNjczLDcgKzI2ODAsNyBAQAogCXdyaXRlID0gKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgIT0gMDsKIAlCVUdfT04oYWRkciA+PSBlbmQpOwogCUJVR19PTihlbmQgPiB2bWEtPnZtX2VuZCk7Ci0JbGVuID0gKGVuZCtQQUdFX1NJWkUtMSkvUEFHRV9TSVpFLWFkZHIvUEFHRV9TSVpFOworCWxlbiA9IERJVl9ST1VORF9VUChlbmQsIFBBR0VfU0laRSkgLSBhZGRyL1BBR0VfU0laRTsKIAlyZXQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgYWRkciwKIAkJCWxlbiwgd3JpdGUsIDAsIE5VTEwsIE5VTEwpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9saWN5LmMgYi9tbS9tZW1wb2xpY3kuYwppbmRleCBkNzZlOGViLi45ZjRlOWI5IDEwMDY0NAotLS0gYS9tbS9tZW1wb2xpY3kuYworKysgYi9tbS9tZW1wb2xpY3kuYwpAQCAtMTAxLDggKzEwMSw2IEBACiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnBvbGljeV9jYWNoZTsKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc25fY2FjaGU7CiAKLSNkZWZpbmUgUERwcmludGsoZm10Li4uKQotCiAvKiBIaWdoZXN0IHpvbmUuIEFuIHNwZWNpZmljIGFsbG9jYXRpb24gZm9yIGEgem9uZSBiZWxvdyB0aGF0IGlzIG5vdAogICAgcG9saWNpZWQuICovCiBlbnVtIHpvbmVfdHlwZSBwb2xpY3lfem9uZSA9IDA7CkBAIC0xNzUsNyArMTczLDkgQEAKIHsKIAlzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3k7CiAKLQlQRHByaW50aygic2V0dGluZyBtb2RlICVkIG5vZGVzWzBdICVseFxuIiwgbW9kZSwgbm9kZXNfYWRkcigqbm9kZXMpWzBdKTsKKwlwcl9kZWJ1Zygic2V0dGluZyBtb2RlICVkIG5vZGVzWzBdICVseFxuIiwKKwkJIG1vZGUsIG5vZGVzID8gbm9kZXNfYWRkcigqbm9kZXMpWzBdIDogLTEpOworCiAJaWYgKG1vZGUgPT0gTVBPTF9ERUZBVUxUKQogCQlyZXR1cm4gTlVMTDsKIAlwb2xpY3kgPSBrbWVtX2NhY2hlX2FsbG9jKHBvbGljeV9jYWNoZSwgR0ZQX0tFUk5FTCk7CkBAIC0zNzksNyArMzc5LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgbWVtcG9saWN5ICpvbGQgPSB2bWEtPnZtX3BvbGljeTsKIAotCVBEcHJpbnRrKCJ2bWEgJWx4LSVseC8lbHggdm1fb3BzICVwIHZtX2ZpbGUgJXAgc2V0X3BvbGljeSAlcFxuIiwKKwlwcl9kZWJ1Zygidm1hICVseC0lbHgvJWx4IHZtX29wcyAlcCB2bV9maWxlICVwIHNldF9wb2xpY3kgJXBcbiIsCiAJCSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgdm1hLT52bV9wZ29mZiwKIAkJIHZtYS0+dm1fb3BzLCB2bWEtPnZtX2ZpbGUsCiAJCSB2bWEtPnZtX29wcyA/IHZtYS0+dm1fb3BzLT5zZXRfcG9saWN5IDogTlVMTCk7CkBAIC01OTQsNyArNTk0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwYWdlICpuZXdfbm9kZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG5vZGUsIGludCAqKngpCiB7Ci0JcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgR0ZQX0hJR0hVU0VSLCAwKTsKKwlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfSElHSFVTRVJfTU9WQUJMRSwgMCk7CiB9CiAKIC8qCkBAIC03MTAsNyArNzEwLDggQEAKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKilwcml2YXRlOwogCi0JcmV0dXJuIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBwYWdlX2FkZHJlc3NfaW5fdm1hKHBhZ2UsIHZtYSkpOworCXJldHVybiBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwgdm1hLAorCQkJCQlwYWdlX2FkZHJlc3NfaW5fdm1hKHBhZ2UsIHZtYSkpOwogfQogI2Vsc2UKIApAQCAtNzc2LDggKzc3Nyw4IEBACiAJaWYgKCFuZXcpCiAJCWZsYWdzIHw9IE1QT0xfTUZfRElTQ09OVElHX09LOwogCi0JUERwcmludGsoIm1iaW5kICVseC0lbHggbW9kZTolbGQgbm9kZXM6JWx4XG4iLHN0YXJ0LHN0YXJ0K2xlbiwKLQkJCW1vZGUsbm9kZXNfYWRkcihub2RlcylbMF0pOworCXByX2RlYnVnKCJtYmluZCAlbHgtJWx4IG1vZGU6JWxkIG5vZGVzOiVseFxuIixzdGFydCxzdGFydCtsZW4sCisJCSBtb2RlLCBubWFzayA/IG5vZGVzX2FkZHIoKm5tYXNrKVswXSA6IC0xKTsKIAogCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJdm1hID0gY2hlY2tfcmFuZ2UobW0sIHN0YXJ0LCBlbmQsIG5tYXNrLApAQCAtMTIwMiw3ICsxMjAzLDggQEAKIAogI2lmZGVmIENPTkZJR19IVUdFVExCRlMKIC8qIFJldHVybiBhIHpvbmVsaXN0IHN1aXRhYmxlIGZvciBhIGh1Z2UgcGFnZSBhbGxvY2F0aW9uLiAqLwotc3RydWN0IHpvbmVsaXN0ICpodWdlX3pvbmVsaXN0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdHJ1Y3Qgem9uZWxpc3QgKmh1Z2Vfem9uZWxpc3Qoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJCQlnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IG1lbXBvbGljeSAqcG9sID0gZ2V0X3ZtYV9wb2xpY3koY3VycmVudCwgdm1hLCBhZGRyKTsKIApAQCAtMTIxMCw3ICsxMjEyLDcgQEAKIAkJdW5zaWduZWQgbmlkOwogCiAJCW5pZCA9IGludGVybGVhdmVfbmlkKHBvbCwgdm1hLCBhZGRyLCBIUEFHRV9TSElGVCk7Ci0JCXJldHVybiBOT0RFX0RBVEEobmlkKS0+bm9kZV96b25lbGlzdHMgKyBnZnBfem9uZShHRlBfSElHSFVTRVIpOworCQlyZXR1cm4gTk9ERV9EQVRBKG5pZCktPm5vZGVfem9uZWxpc3RzICsgZ2ZwX3pvbmUoZ2ZwX2ZsYWdzKTsKIAl9CiAJcmV0dXJuIHpvbmVsaXN0X3BvbGljeShHRlBfSElHSFVTRVIsIHBvbCk7CiB9CkBAIC0xNDM0LDcgKzE0MzYsNyBAQAogCX0KIAlyYl9saW5rX25vZGUoJm5ldy0+bmQsIHBhcmVudCwgcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZuZXctPm5kLCAmc3AtPnJvb3QpOwotCVBEcHJpbnRrKCJpbnNlcnRpbmcgJWx4LSVseDogJWRcbiIsIG5ldy0+c3RhcnQsIG5ldy0+ZW5kLAorCXByX2RlYnVnKCJpbnNlcnRpbmcgJWx4LSVseDogJWRcbiIsIG5ldy0+c3RhcnQsIG5ldy0+ZW5kLAogCQkgbmV3LT5wb2xpY3kgPyBuZXctPnBvbGljeS0+cG9saWN5IDogMCk7CiB9CiAKQEAgLTE0NTksNyArMTQ2MSw3IEBACiAKIHN0YXRpYyB2b2lkIHNwX2RlbGV0ZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBzcF9ub2RlICpuKQogewotCVBEcHJpbnRrKCJkZWxldGluZyAlbHgtbCV4XG4iLCBuLT5zdGFydCwgbi0+ZW5kKTsKKwlwcl9kZWJ1ZygiZGVsZXRpbmcgJWx4LWwlbHhcbiIsIG4tPnN0YXJ0LCBuLT5lbmQpOwogCXJiX2VyYXNlKCZuLT5uZCwgJnNwLT5yb290KTsKIAltcG9sX2ZyZWUobi0+cG9saWN5KTsKIAlrbWVtX2NhY2hlX2ZyZWUoc25fY2FjaGUsIG4pOwpAQCAtMTU1OCwxMCArMTU2MCwxMCBAQAogCXN0cnVjdCBzcF9ub2RlICpuZXcgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgc3ogPSB2bWFfcGFnZXModm1hKTsKIAotCVBEcHJpbnRrKCJzZXRfc2hhcmVkX3BvbGljeSAlbHggc3ogJWx1ICVkICVseFxuIiwKKwlwcl9kZWJ1Zygic2V0X3NoYXJlZF9wb2xpY3kgJWx4IHN6ICVsdSAlZCAlbHhcbiIsCiAJCSB2bWEtPnZtX3Bnb2ZmLAogCQkgc3osIG5wb2w/IG5wb2wtPnBvbGljeSA6IC0xLAotCQlucG9sID8gbm9kZXNfYWRkcihucG9sLT52Lm5vZGVzKVswXSA6IC0xKTsKKwkJIG5wb2wgPyBub2Rlc19hZGRyKG5wb2wtPnYubm9kZXMpWzBdIDogLTEpOwogCiAJaWYgKG5wb2wpIHsKIAkJbmV3ID0gc3BfYWxsb2Modm1hLT52bV9wZ29mZiwgdm1hLT52bV9wZ29mZiArIHN6LCBucG9sKTsKQEAgLTE1OTcsNiArMTU5OSwxMCBAQAogLyogYXNzdW1lcyBmcyA9PSBLRVJORUxfRFMgKi8KIHZvaWQgX19pbml0IG51bWFfcG9saWN5X2luaXQodm9pZCkKIHsKKwlub2RlbWFza190IGludGVybGVhdmVfbm9kZXM7CisJdW5zaWduZWQgbG9uZyBsYXJnZXN0ID0gMDsKKwlpbnQgbmlkLCBwcmVmZXIgPSAwOworCiAJcG9saWN5X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoIm51bWFfcG9saWN5IiwKIAkJCQkJIHNpemVvZihzdHJ1Y3QgbWVtcG9saWN5KSwKIAkJCQkJIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwpAQCAtMTYwNSwxMCArMTYxMSwzMSBAQAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzcF9ub2RlKSwKIAkJCQkgICAgIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwogCi0JLyogU2V0IGludGVybGVhdmluZyBwb2xpY3kgZm9yIHN5c3RlbSBpbml0LiBUaGlzIHdheSBub3QgYWxsCi0JICAgdGhlIGRhdGEgc3RydWN0dXJlcyBhbGxvY2F0ZWQgYXQgc3lzdGVtIGJvb3QgZW5kIHVwIGluIG5vZGUgemVyby4gKi8KKwkvKgorCSAqIFNldCBpbnRlcmxlYXZpbmcgcG9saWN5IGZvciBzeXN0ZW0gaW5pdC4gSW50ZXJsZWF2aW5nIGlzIG9ubHkKKwkgKiBlbmFibGVkIGFjcm9zcyBzdWl0YWJseSBzaXplZCBub2RlcyAoZGVmYXVsdCBpcyA+PSAxNk1CKSwgb3IKKwkgKiBmYWxsIGJhY2sgdG8gdGhlIGxhcmdlc3Qgbm9kZSBpZiB0aGV5J3JlIGFsbCBzbWFsbGVyLgorCSAqLworCW5vZGVzX2NsZWFyKGludGVybGVhdmVfbm9kZXMpOworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQl1bnNpZ25lZCBsb25nIHRvdGFsX3BhZ2VzID0gbm9kZV9wcmVzZW50X3BhZ2VzKG5pZCk7CiAKLQlpZiAoZG9fc2V0X21lbXBvbGljeShNUE9MX0lOVEVSTEVBVkUsICZub2RlX29ubGluZV9tYXApKQorCQkvKiBQcmVzZXJ2ZSB0aGUgbGFyZ2VzdCBub2RlICovCisJCWlmIChsYXJnZXN0IDwgdG90YWxfcGFnZXMpIHsKKwkJCWxhcmdlc3QgPSB0b3RhbF9wYWdlczsKKwkJCXByZWZlciA9IG5pZDsKKwkJfQorCisJCS8qIEludGVybGVhdmUgdGhpcyBub2RlPyAqLworCQlpZiAoKHRvdGFsX3BhZ2VzIDw8IFBBR0VfU0hJRlQpID49ICgxNiA8PCAyMCkpCisJCQlub2RlX3NldChuaWQsIGludGVybGVhdmVfbm9kZXMpOworCX0KKworCS8qIEFsbCB0b28gc21hbGwsIHVzZSB0aGUgbGFyZ2VzdCAqLworCWlmICh1bmxpa2VseShub2Rlc19lbXB0eShpbnRlcmxlYXZlX25vZGVzKSkpCisJCW5vZGVfc2V0KHByZWZlciwgaW50ZXJsZWF2ZV9ub2Rlcyk7CisKKwlpZiAoZG9fc2V0X21lbXBvbGljeShNUE9MX0lOVEVSTEVBVkUsICZpbnRlcmxlYXZlX25vZGVzKSkKIAkJcHJpbnRrKCJudW1hX3BvbGljeV9pbml0OiBpbnRlcmxlYXZpbmcgZmFpbGVkXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vbWVtcG9vbC5jIGIvbW0vbWVtcG9vbC5jCmluZGV4IGNjMWNhODYuLjAyZDVlYzMgMTAwNjQ0Ci0tLSBhL21tL21lbXBvb2wuYworKysgYi9tbS9tZW1wb29sLmMKQEAgLTYyLDEwICs2Miw5IEBACiAJCQltZW1wb29sX2ZyZWVfdCAqZnJlZV9mbiwgdm9pZCAqcG9vbF9kYXRhLCBpbnQgbm9kZV9pZCkKIHsKIAltZW1wb29sX3QgKnBvb2w7Ci0JcG9vbCA9IGttYWxsb2Nfbm9kZShzaXplb2YoKnBvb2wpLCBHRlBfS0VSTkVMLCBub2RlX2lkKTsKKwlwb29sID0ga21hbGxvY19ub2RlKHNpemVvZigqcG9vbCksIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBub2RlX2lkKTsKIAlpZiAoIXBvb2wpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChwb29sLCAwLCBzaXplb2YoKnBvb2wpKTsKIAlwb29sLT5lbGVtZW50cyA9IGttYWxsb2Nfbm9kZShtaW5fbnIgKiBzaXplb2Yodm9pZCAqKSwKIAkJCQkJR0ZQX0tFUk5FTCwgbm9kZV9pZCk7CiAJaWYgKCFwb29sLT5lbGVtZW50cykgewpAQCAtMjYzLDYgKzI2Miw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICh1bmxpa2VseShlbGVtZW50ID09IE5VTEwpKQorCQlyZXR1cm47CisKIAlzbXBfbWIoKTsKIAlpZiAocG9vbC0+Y3Vycl9uciA8IHBvb2wtPm1pbl9ucikgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IGE5MWNhMDAuLjM0ZDhhZGEgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTc2MSw3ICs3NjEsOCBAQAogCiAJKnJlc3VsdCA9ICZwbS0+c3RhdHVzOwogCi0JcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUocG0tPm5vZGUsIEdGUF9ISUdIVVNFUiB8IEdGUF9USElTTk9ERSwgMCk7CisJcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUocG0tPm5vZGUsCisJCQkJR0ZQX0hJR0hVU0VSX01PVkFCTEUgfCBHRlBfVEhJU05PREUsIDApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbW0vbWxvY2suYyBiL21tL21sb2NrLmMKaW5kZXggNGQzZmVhMi4uN2IyNjU2MCAxMDA2NDQKLS0tIGEvbW0vbWxvY2suYworKysgYi9tbS9tbG9jay5jCkBAIC0yNDQsOSArMjQ0LDEyIEBACiAKIAlsb2NrZWQgPSAoc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAJbG9ja19saW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTUVNTE9DS10ucmxpbV9jdXI7CisJaWYgKGxvY2tfbGltaXQgPT0gUkxJTV9JTkZJTklUWSkKKwkJYWxsb3dlZCA9IDE7CiAJbG9ja19saW1pdCA+Pj0gUEFHRV9TSElGVDsKIAlzcGluX2xvY2soJnNobWxvY2tfdXNlcl9sb2NrKTsKLQlpZiAobG9ja2VkICsgdXNlci0+bG9ja2VkX3NobSA+IGxvY2tfbGltaXQgJiYgIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkKKwlpZiAoIWFsbG93ZWQgJiYKKwkgICAgbG9ja2VkICsgdXNlci0+bG9ja2VkX3NobSA+IGxvY2tfbGltaXQgJiYgIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkKIAkJZ290byBvdXQ7CiAJZ2V0X3VpZCh1c2VyKTsKIAl1c2VyLT5sb2NrZWRfc2htICs9IGxvY2tlZDsKZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCA5ZjcwYzhlLi4xNDRiNGEyIDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC04OTQsMTQgKzg5NCwxMSBAQAogCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBwZ29mZikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICogbW0gPSBjdXJyZW50LT5tbTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsICogcHJldjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXVuc2lnbmVkIGludCB2bV9mbGFnczsKLQlpbnQgY29ycmVjdF93Y291bnQgPSAwOwogCWludCBlcnJvcjsKLQlzdHJ1Y3QgcmJfbm9kZSAqKiByYl9saW5rLCAqIHJiX3BhcmVudDsKIAlpbnQgYWNjb3VudGFibGUgPSAxOwotCXVuc2lnbmVkIGxvbmcgY2hhcmdlZCA9IDAsIHJlcXByb3QgPSBwcm90OworCXVuc2lnbmVkIGxvbmcgcmVxcHJvdCA9IHByb3Q7CiAKIAkvKgogCSAqIERvZXMgdGhlIGFwcGxpY2F0aW9uIGV4cGVjdCBQUk9UX1JFQUQgdG8gaW1wbHkgUFJPVF9FWEVDPwpAQCAtMTAyNyw2ICsxMDI0LDI0IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKKwlyZXR1cm4gbW1hcF9yZWdpb24oZmlsZSwgYWRkciwgbGVuLCBmbGFncywgdm1fZmxhZ3MsIHBnb2ZmLAorCQkJICAgYWNjb3VudGFibGUpOworfQorRVhQT1JUX1NZTUJPTChkb19tbWFwX3Bnb2ZmKTsKKwordW5zaWduZWQgbG9uZyBtbWFwX3JlZ2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCSAgdW5zaWduZWQgaW50IHZtX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCQkJICBpbnQgYWNjb3VudGFibGUpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgKnByZXY7CisJaW50IGNvcnJlY3Rfd2NvdW50ID0gMDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IHJiX25vZGUgKipyYl9saW5rLCAqcmJfcGFyZW50OworCXVuc2lnbmVkIGxvbmcgY2hhcmdlZCA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICBmaWxlID8gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSA6IE5VTEw7CisKIAkvKiBDbGVhciBvbGQgbWFwcyAqLwogCWVycm9yID0gLUVOT01FTTsKIG11bm1hcF9iYWNrOgpAQCAtMTE3NSw4ICsxMTkwLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLUVYUE9SVF9TWU1CT0woZG9fbW1hcF9wZ29mZik7Ci0KIC8qIEdldCBhbiBhZGRyZXNzIHJhbmdlIHdoaWNoIGlzIGN1cnJlbnRseSB1bm1hcHBlZC4KICAqIEZvciBzaG1hdCgpIHdpdGggYWRkcj0wLgogICoKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IDk4OWUyZTkuLjhiYmJmMTQgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMzY3LDYgKzM2NywxMSBAQAogCXJldHVybiBmaW5kX3ZtYShtbSwgYWRkcik7CiB9CiAKK2ludCBleHBhbmRfc3RhY2soc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gLUVOT01FTTsKK30KKwogLyoKICAqIGxvb2sgdXAgdGhlIGZpcnN0IFZNQSBleGFjdGx5IHRoYXQgZXhhY3RseSBtYXRjaGVzIGFkZHIKICAqIC0gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG1tLT5tbWFwX3NlbSBhdCBsZWFzdCBoZWxkIHJlYWRsb2NrZWQKZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IGVlYzE0ODEuLjg4NmVhMGQgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtNDc2LDE1ICs0NzYsMTMgQEAKICAqIHN5c2N0bCBoYW5kbGVyIGZvciAvcHJvYy9zeXMvdm0vZGlydHlfd3JpdGViYWNrX2NlbnRpc2VjcwogICovCiBpbnQgZGlydHlfd3JpdGViYWNrX2NlbnRpc2Vjc19oYW5kbGVyKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCisJc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7CiAJcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKLQlpZiAoZGlydHlfd3JpdGViYWNrX2ludGVydmFsKSB7Ci0JCW1vZF90aW1lcigmd2JfdGltZXIsCi0JCQlqaWZmaWVzICsgZGlydHlfd3JpdGViYWNrX2ludGVydmFsKTsKLQkJfSBlbHNlIHsKKwlpZiAoZGlydHlfd3JpdGViYWNrX2ludGVydmFsKQorCQltb2RfdGltZXIoJndiX3RpbWVyLCBqaWZmaWVzICsgZGlydHlfd3JpdGViYWNrX2ludGVydmFsKTsKKwllbHNlCiAJCWRlbF90aW1lcigmd2JfdGltZXIpOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODI2LDYgKzgyNCw3IEBACiAJCW1hcHBpbmcyID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwogCQlpZiAobWFwcGluZzIpIHsgLyogUmFjZSB3aXRoIHRydW5jYXRlPyAqLwogCQkJQlVHX09OKG1hcHBpbmcyICE9IG1hcHBpbmcpOworCQkJV0FSTl9PTl9PTkNFKCFQYWdlUHJpdmF0ZShwYWdlKSAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKTsKIAkJCWlmIChtYXBwaW5nX2NhcF9hY2NvdW50X2RpcnR5KG1hcHBpbmcpKSB7CiAJCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOwogCQkJCXRhc2tfaW9fYWNjb3VudF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDA1YWNlNDQuLmUyYTEwYjkgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTgwLDggKzgwLDkgQEAKIAkgMjU2LAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkgMzIKKwkgMzIsCiAjZW5kaWYKKwkgMzIsCiB9OwogCiBFWFBPUlRfU1lNQk9MKHRvdGFscmFtX3BhZ2VzKTsKQEAgLTk1LDggKzk2LDkgQEAKICNlbmRpZgogCSAiTm9ybWFsIiwKICNpZmRlZiBDT05GSUdfSElHSE1FTQotCSAiSGlnaE1lbSIKKwkgIkhpZ2hNZW0iLAogI2VuZGlmCisJICJNb3ZhYmxlIiwKIH07CiAKIGludCBtaW5fZnJlZV9rYnl0ZXMgPSAxMDI0OwpAQCAtMTI2LDE0ICsxMjgsMjEgQEAKICAgICAjZW5kaWYKICAgI2VuZGlmCiAKLSAgc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiBfX21lbWluaXRkYXRhIGVhcmx5X25vZGVfbWFwW01BWF9BQ1RJVkVfUkVHSU9OU107Ci0gIGludCBfX21lbWluaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKLSAgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107Ci0gIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKKyAgc3RhdGljIHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gX19tZW1pbml0ZGF0YSBlYXJseV9ub2RlX21hcFtNQVhfQUNUSVZFX1JFR0lPTlNdOworICBzdGF0aWMgaW50IF9fbWVtaW5pdGRhdGEgbnJfbm9kZW1hcF9lbnRyaWVzOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUKLSAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107Ci0gIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X2VuZF9wZm5bTUFYX05VTU5PREVTXTsKKyAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltNQVhfTlVNTk9ERVNdOworICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIG5vZGVfYm91bmRhcnlfZW5kX3BmbltNQVhfTlVNTk9ERVNdOwogI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFICovCisgIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSByZXF1aXJlZF9rZXJuZWxjb3JlOworICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmVxdWlyZWRfbW92YWJsZWNvcmU7CisgIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSB6b25lX21vdmFibGVfcGZuW01BWF9OVU1OT0RFU107CisKKyAgLyogbW92YWJsZV96b25lIGlzIHRoZSAicmVhbCIgem9uZSBwYWdlcyBpbiBaT05FX01PVkFCTEUgYXJlIHRha2VuIGZyb20gKi8KKyAgaW50IG1vdmFibGVfem9uZTsKKyAgRVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpOwogI2VuZGlmIC8qIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCAqLwogCiAjaWYgTUFYX05VTU5PREVTID4gMQpAQCAtOTAwLDExICs5MDksMTMgQEAKIAogCXUzMiBpZ25vcmVfZ2ZwX2hpZ2htZW07CiAJdTMyIGlnbm9yZV9nZnBfd2FpdDsKKwl1MzIgbWluX29yZGVyOwogCiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUwogCiAJc3RydWN0IGRlbnRyeSAqaWdub3JlX2dmcF9oaWdobWVtX2ZpbGU7CiAJc3RydWN0IGRlbnRyeSAqaWdub3JlX2dmcF93YWl0X2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqbWluX29yZGVyX2ZpbGU7CiAKICNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCiAKQEAgLTkxMiw2ICs5MjMsNyBAQAogCS5hdHRyID0gRkFVTFRfQVRUUl9JTklUSUFMSVpFUiwKIAkuaWdub3JlX2dmcF93YWl0ID0gMSwKIAkuaWdub3JlX2dmcF9oaWdobWVtID0gMSwKKwkubWluX29yZGVyID0gMSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX2ZhaWxfcGFnZV9hbGxvYyhjaGFyICpzdHIpCkBAIC05MjIsNiArOTM0LDggQEAKIAogc3RhdGljIGludCBzaG91bGRfZmFpbF9hbGxvY19wYWdlKGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIpCiB7CisJaWYgKG9yZGVyIDwgZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcikKKwkJcmV0dXJuIDA7CiAJaWYgKGdmcF9tYXNrICYgX19HRlBfTk9GQUlMKQogCQlyZXR1cm4gMDsKIAlpZiAoZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbSAmJiAoZ2ZwX21hc2sgJiBfX0dGUF9ISUdITUVNKSkKQEAgLTk1MywxMiArOTY3LDE3IEBACiAJZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfaGlnaG1lbV9maWxlID0KIAkJZGVidWdmc19jcmVhdGVfYm9vbCgiaWdub3JlLWdmcC1oaWdobWVtIiwgbW9kZSwgZGlyLAogCQkJCSAgICAgICZmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtKTsKKwlmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyX2ZpbGUgPQorCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1pbi1vcmRlciIsIG1vZGUsIGRpciwKKwkJCQkgICAmZmFpbF9wYWdlX2FsbG9jLm1pbl9vcmRlcik7CiAKIAlpZiAoIWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX3dhaXRfZmlsZSB8fAotCQkJIWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSkgeworICAgICAgICAgICAgIWZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX2hpZ2htZW1fZmlsZSB8fAorICAgICAgICAgICAgIWZhaWxfcGFnZV9hbGxvYy5taW5fb3JkZXJfZmlsZSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlkZWJ1Z2ZzX3JlbW92ZShmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF93YWl0X2ZpbGUpOwogCQlkZWJ1Z2ZzX3JlbW92ZShmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF9oaWdobWVtX2ZpbGUpOworCQlkZWJ1Z2ZzX3JlbW92ZShmYWlsX3BhZ2VfYWxsb2MubWluX29yZGVyX2ZpbGUpOwogCQljbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfcGFnZV9hbGxvYy5hdHRyKTsKIAl9CiAKQEAgLTEzMTQsNyArMTMzMyw3IEBACiAJcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYiA9IDA7CiAJcC0+cmVjbGFpbV9zdGF0ZSA9ICZyZWNsYWltX3N0YXRlOwogCi0JZGlkX3NvbWVfcHJvZ3Jlc3MgPSB0cnlfdG9fZnJlZV9wYWdlcyh6b25lbGlzdC0+em9uZXMsIGdmcF9tYXNrKTsKKwlkaWRfc29tZV9wcm9ncmVzcyA9IHRyeV90b19mcmVlX3BhZ2VzKHpvbmVsaXN0LT56b25lcywgb3JkZXIsIGdmcF9tYXNrKTsKIAogCXAtPnJlY2xhaW1fc3RhdGUgPSBOVUxMOwogCXAtPmZsYWdzICY9IH5QRl9NRU1BTExPQzsKQEAgLTEzNTEsNyArMTM3MCw4IEBACiAJICovCiAJZG9fcmV0cnkgPSAwOwogCWlmICghKGdmcF9tYXNrICYgX19HRlBfTk9SRVRSWSkpIHsKLQkJaWYgKChvcmRlciA8PSAzKSB8fCAoZ2ZwX21hc2sgJiBfX0dGUF9SRVBFQVQpKQorCQlpZiAoKG9yZGVyIDw9IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKSB8fAorCQkJCQkJKGdmcF9tYXNrICYgX19HRlBfUkVQRUFUKSkKIAkJCWRvX3JldHJ5ID0gMTsKIAkJaWYgKGdmcF9tYXNrICYgX19HRlBfTk9GQUlMKQogCQkJZG9fcmV0cnkgPSAxOwpAQCAtMTQ2NCwxMyArMTQ4NCwxNCBAQAogewogCXJldHVybiBucl9mcmVlX3pvbmVfcGFnZXMoZ2ZwX3pvbmUoR0ZQX1VTRVIpKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKTsKIAogLyoKICAqIEFtb3VudCBvZiBmcmVlIFJBTSBhbGxvY2F0YWJsZSB3aXRoaW4gYWxsIHpvbmVzCiAgKi8KIHVuc2lnbmVkIGludCBucl9mcmVlX3BhZ2VjYWNoZV9wYWdlcyh2b2lkKQogewotCXJldHVybiBucl9mcmVlX3pvbmVfcGFnZXMoZ2ZwX3pvbmUoR0ZQX0hJR0hVU0VSKSk7CisJcmV0dXJuIG5yX2ZyZWVfem9uZV9wYWdlcyhnZnBfem9uZShHRlBfSElHSFVTRVJfTU9WQUJMRSkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2hvd19ub2RlKHN0cnVjdCB6b25lICp6b25lKQpAQCAtMTYyMSw4ICsxNjQyLDggQEAKICAqCiAgKiBBZGQgYWxsIHBvcHVsYXRlZCB6b25lcyBvZiBhIG5vZGUgdG8gdGhlIHpvbmVsaXN0LgogICovCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBidWlsZF96b25lbGlzdHNfbm9kZShwZ19kYXRhX3QgKnBnZGF0LAotCQkJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgaW50IG5yX3pvbmVzLCBlbnVtIHpvbmVfdHlwZSB6b25lX3R5cGUpCitzdGF0aWMgaW50IGJ1aWxkX3pvbmVsaXN0c19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QsCisJCQkJaW50IG5yX3pvbmVzLCBlbnVtIHpvbmVfdHlwZSB6b25lX3R5cGUpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAKQEAgLTE2NDEsOSArMTY2MiwxMDIgQEAKIAlyZXR1cm4gbnJfem9uZXM7CiB9CiAKKworLyoKKyAqICB6b25lbGlzdF9vcmRlcjoKKyAqICAwID0gYXV0b21hdGljIGRldGVjdGlvbiBvZiBiZXR0ZXIgb3JkZXJpbmcuCisgKiAgMSA9IG9yZGVyIGJ5IChbbm9kZV0gZGlzdGFuY2UsIC16b25ldHlwZSkKKyAqICAyID0gb3JkZXIgYnkgKC16b25ldHlwZSwgW25vZGVdIGRpc3RhbmNlKQorICoKKyAqICBJZiBub3QgTlVNQSwgWk9ORUxJU1RfT1JERVJfWk9ORSBhbmQgWk9ORUxJU1RfT1JERVJfTk9ERSB3aWxsIGNyZWF0ZQorICogIHRoZSBzYW1lIHpvbmVsaXN0LiBTbyBvbmx5IE5VTUEgY2FuIGNvbmZpZ3VyZSB0aGlzIHBhcmFtLgorICovCisjZGVmaW5lIFpPTkVMSVNUX09SREVSX0RFRkFVTFQgIDAKKyNkZWZpbmUgWk9ORUxJU1RfT1JERVJfTk9ERSAgICAgMQorI2RlZmluZSBaT05FTElTVF9PUkRFUl9aT05FICAgICAyCisKKy8qIHpvbmVsaXN0IG9yZGVyIGluIHRoZSBrZXJuZWwuCisgKiBzZXRfem9uZWxpc3Rfb3JkZXIoKSB3aWxsIHNldCB0aGlzIHRvIE5PREUgb3IgWk9ORS4KKyAqLworc3RhdGljIGludCBjdXJyZW50X3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfREVGQVVMVDsKK3N0YXRpYyBjaGFyIHpvbmVsaXN0X29yZGVyX25hbWVbM11bOF0gPSB7IkRlZmF1bHQiLCAiTm9kZSIsICJab25lIn07CisKKwogI2lmZGVmIENPTkZJR19OVU1BCisvKiBUaGUgdmFsdWUgdXNlciBzcGVjaWZpZWQgLi4uLmNoYW5nZWQgYnkgY29uZmlnICovCitzdGF0aWMgaW50IHVzZXJfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9ERUZBVUxUOworLyogc3RyaW5nIGZvciBzeXNjdGwgKi8KKyNkZWZpbmUgTlVNQV9aT05FTElTVF9PUkRFUl9MRU4JMTYKK2NoYXIgbnVtYV96b25lbGlzdF9vcmRlclsxNl0gPSAiZGVmYXVsdCI7CisKKy8qCisgKiBpbnRlcmZhY2UgZm9yIGNvbmZpZ3VyZSB6b25lbGlzdCBvcmRlcmluZy4KKyAqIGNvbW1hbmQgbGluZSBvcHRpb24gIm51bWFfem9uZWxpc3Rfb3JkZXIiCisgKgk9ICJbZERdZWZhdWx0CS0gZGVmYXVsdCwgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uCisgKgk9ICJbbk5db2RlIAktIG9yZGVyIGJ5IG5vZGUgbG9jYWxpdHksIHRoZW4gYnkgem9uZSB3aXRoaW4gbm9kZQorICoJPSAiW3paXW9uZSAgICAgIC0gb3JkZXIgYnkgem9uZSwgdGhlbiBieSBsb2NhbGl0eSB3aXRoaW4gem9uZQorICovCisKK3N0YXRpYyBpbnQgX19wYXJzZV9udW1hX3pvbmVsaXN0X29yZGVyKGNoYXIgKnMpCit7CisJaWYgKCpzID09ICdkJyB8fCAqcyA9PSAnRCcpIHsKKwkJdXNlcl96b25lbGlzdF9vcmRlciA9IFpPTkVMSVNUX09SREVSX0RFRkFVTFQ7CisJfSBlbHNlIGlmICgqcyA9PSAnbicgfHwgKnMgPT0gJ04nKSB7CisJCXVzZXJfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9OT0RFOworCX0gZWxzZSBpZiAoKnMgPT0gJ3onIHx8ICpzID09ICdaJykgeworCQl1c2VyX3pvbmVsaXN0X29yZGVyID0gWk9ORUxJU1RfT1JERVJfWk9ORTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiSWdub3JpbmcgaW52YWxpZCBudW1hX3pvbmVsaXN0X29yZGVyIHZhbHVlOiAgIgorCQkJIiVzXG4iLCBzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbml0IGludCBzZXR1cF9udW1hX3pvbmVsaXN0X29yZGVyKGNoYXIgKnMpCit7CisJaWYgKHMpCisJCXJldHVybiBfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIocyk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibnVtYV96b25lbGlzdF9vcmRlciIsIHNldHVwX251bWFfem9uZWxpc3Rfb3JkZXIpOworCisvKgorICogc3lzY3RsIGhhbmRsZXIgZm9yIG51bWFfem9uZWxpc3Rfb3JkZXIKKyAqLworaW50IG51bWFfem9uZWxpc3Rfb3JkZXJfaGFuZGxlcihjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCXN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwKKwkJbG9mZl90ICpwcG9zKQoreworCWNoYXIgc2F2ZWRfc3RyaW5nW05VTUFfWk9ORUxJU1RfT1JERVJfTEVOXTsKKwlpbnQgcmV0OworCisJaWYgKHdyaXRlKQorCQlzdHJuY3B5KHNhdmVkX3N0cmluZywgKGNoYXIqKXRhYmxlLT5kYXRhLAorCQkJTlVNQV9aT05FTElTVF9PUkRFUl9MRU4pOworCXJldCA9IHByb2NfZG9zdHJpbmcodGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAod3JpdGUpIHsKKwkJaW50IG9sZHZhbCA9IHVzZXJfem9uZWxpc3Rfb3JkZXI7CisJCWlmIChfX3BhcnNlX251bWFfem9uZWxpc3Rfb3JkZXIoKGNoYXIqKXRhYmxlLT5kYXRhKSkgeworCQkJLyoKKwkJCSAqIGJvZ3VzIHZhbHVlLiAgcmVzdG9yZSBzYXZlZCBzdHJpbmcKKwkJCSAqLworCQkJc3RybmNweSgoY2hhciopdGFibGUtPmRhdGEsIHNhdmVkX3N0cmluZywKKwkJCQlOVU1BX1pPTkVMSVNUX09SREVSX0xFTik7CisJCQl1c2VyX3pvbmVsaXN0X29yZGVyID0gb2xkdmFsOworCQl9IGVsc2UgaWYgKG9sZHZhbCAhPSB1c2VyX3pvbmVsaXN0X29yZGVyKQorCQkJYnVpbGRfYWxsX3pvbmVsaXN0cygpOworCX0KKwlyZXR1cm4gMDsKK30KKworCiAjZGVmaW5lIE1BWF9OT0RFX0xPQUQgKG51bV9vbmxpbmVfbm9kZXMoKSkKLXN0YXRpYyBpbnQgX19tZW1pbml0ZGF0YSBub2RlX2xvYWRbTUFYX05VTU5PREVTXTsKK3N0YXRpYyBpbnQgbm9kZV9sb2FkW01BWF9OVU1OT0RFU107CisKIC8qKgogICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQgbm9kZSB0aGF0IHNob3VsZCBhcHBlYXIgaW4gYSBnaXZlbiBub2RlJ3MgZmFsbGJhY2sgbGlzdAogICogQG5vZGU6IG5vZGUgd2hvc2UgZmFsbGJhY2sgbGlzdCB3ZSdyZSBhcHBlbmRpbmcKQEAgLTE2NTgsNyArMTc3Miw3IEBACiAgKiBvbiB0aGVtIG90aGVyd2lzZS4KICAqIEl0IHJldHVybnMgLTEgaWYgbm8gbm9kZSBpcyBmb3VuZC4KICAqLwotc3RhdGljIGludCBfX21lbWluaXQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlX21hc2spCitzdGF0aWMgaW50IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKQogewogCWludCBuLCB2YWw7CiAJaW50IG1pbl92YWwgPSBJTlRfTUFYOwpAQCAtMTcwNCwxMyArMTgxOCwxMjkgQEAKIAlyZXR1cm4gYmVzdF9ub2RlOwogfQogCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCisKKy8qCisgKiBCdWlsZCB6b25lbGlzdHMgb3JkZXJlZCBieSBub2RlIGFuZCB6b25lcyB3aXRoaW4gbm9kZS4KKyAqIFRoaXMgcmVzdWx0cyBpbiBtYXhpbXVtIGxvY2FsaXR5LS1ub3JtYWwgem9uZSBvdmVyZmxvd3MgaW50byBsb2NhbAorICogRE1BIHpvbmUsIGlmIGFueS0tYnV0IHJpc2tzIGV4aGF1c3RpbmcgRE1BIHpvbmUuCisgKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl9ub2RlX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCBub2RlKQogewotCWludCBqLCBub2RlLCBsb2NhbF9ub2RlOwogCWVudW0gem9uZV90eXBlIGk7Ci0JaW50IHByZXZfbm9kZSwgbG9hZDsKKwlpbnQgajsKIAlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7CisJCXpvbmVsaXN0ID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzICsgaTsKKwkJZm9yIChqID0gMDsgem9uZWxpc3QtPnpvbmVzW2pdICE9IE5VTEw7IGorKykKKwkJCTsKKyAJCWogPSBidWlsZF96b25lbGlzdHNfbm9kZShOT0RFX0RBVEEobm9kZSksIHpvbmVsaXN0LCBqLCBpKTsKKwkJem9uZWxpc3QtPnpvbmVzW2pdID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBCdWlsZCB6b25lbGlzdHMgb3JkZXJlZCBieSB6b25lIGFuZCBub2RlcyB3aXRoaW4gem9uZXMuCisgKiBUaGlzIHJlc3VsdHMgaW4gY29uc2VydmluZyBETUEgem9uZVtzXSB1bnRpbCBhbGwgTm9ybWFsIG1lbW9yeSBpcworICogZXhoYXVzdGVkLCBidXQgcmVzdWx0cyBpbiBvdmVyZmxvd2luZyB0byByZW1vdGUgbm9kZSB3aGlsZSBtZW1vcnkKKyAqIG1heSBzdGlsbCBleGlzdCBpbiBsb2NhbCBETUEgem9uZS4KKyAqLworc3RhdGljIGludCBub2RlX29yZGVyW01BWF9OVU1OT0RFU107CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0c19pbl96b25lX29yZGVyKHBnX2RhdGFfdCAqcGdkYXQsIGludCBucl9ub2RlcykKK3sKKwllbnVtIHpvbmVfdHlwZSBpOworCWludCBwb3MsIGosIG5vZGU7CisJaW50IHpvbmVfdHlwZTsJCS8qIG5lZWRzIHRvIGJlIHNpZ25lZCAqLworCXN0cnVjdCB6b25lICp6OworCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKKwkJem9uZWxpc3QgPSBwZ2RhdC0+bm9kZV96b25lbGlzdHMgKyBpOworCQlwb3MgPSAwOworCQlmb3IgKHpvbmVfdHlwZSA9IGk7IHpvbmVfdHlwZSA+PSAwOyB6b25lX3R5cGUtLSkgeworCQkJZm9yIChqID0gMDsgaiA8IG5yX25vZGVzOyBqKyspIHsKKwkJCQlub2RlID0gbm9kZV9vcmRlcltqXTsKKwkJCQl6ID0gJk5PREVfREFUQShub2RlKS0+bm9kZV96b25lc1t6b25lX3R5cGVdOworCQkJCWlmIChwb3B1bGF0ZWRfem9uZSh6KSkgeworCQkJCQl6b25lbGlzdC0+em9uZXNbcG9zKytdID0gejsKKwkJCQkJY2hlY2tfaGlnaGVzdF96b25lKHpvbmVfdHlwZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXpvbmVsaXN0LT56b25lc1twb3NdID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF96b25lbGlzdF9vcmRlcih2b2lkKQoreworCWludCBuaWQsIHpvbmVfdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxvd19rbWVtX3NpemUsdG90YWxfc2l6ZTsKKwlzdHJ1Y3Qgem9uZSAqejsKKwlpbnQgYXZlcmFnZV9zaXplOworCS8qCisgICAgICAgICAqIFpPTkVfRE1BIGFuZCBaT05FX0RNQTMyIGNhbiBiZSB2ZXJ5IHNtYWxsIGFyZWEgaW4gdGhlIHN5dGVtLgorCSAqIElmIHRoZXkgYXJlIHJlYWxseSBzbWFsbCBhbmQgdXNlZCBoZWF2aWx5LCB0aGUgc3lzdGVtIGNhbiBmYWxsCisJICogaW50byBPT00gdmVyeSBlYXNpbHkuCisJICogVGhpcyBmdW5jdGlvbiBkZXRlY3QgWk9ORV9ETUEvRE1BMzIgc2l6ZSBhbmQgY29uZmdpZ3VyZXMgem9uZSBvcmRlci4KKwkgKi8KKwkvKiBJcyB0aGVyZSBaT05FX05PUk1BTCA/IChleC4gcHBjIGhhcyBvbmx5IERNQSB6b25lLi4pICovCisJbG93X2ttZW1fc2l6ZSA9IDA7CisJdG90YWxfc2l6ZSA9IDA7CisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCWZvciAoem9uZV90eXBlID0gMDsgem9uZV90eXBlIDwgTUFYX05SX1pPTkVTOyB6b25lX3R5cGUrKykgeworCQkJeiA9ICZOT0RFX0RBVEEobmlkKS0+bm9kZV96b25lc1t6b25lX3R5cGVdOworCQkJaWYgKHBvcHVsYXRlZF96b25lKHopKSB7CisJCQkJaWYgKHpvbmVfdHlwZSA8IFpPTkVfTk9STUFMKQorCQkJCQlsb3dfa21lbV9zaXplICs9IHotPnByZXNlbnRfcGFnZXM7CisJCQkJdG90YWxfc2l6ZSArPSB6LT5wcmVzZW50X3BhZ2VzOworCQkJfQorCQl9CisJfQorCWlmICghbG93X2ttZW1fc2l6ZSB8fCAgLyogdGhlcmUgYXJlIG5vIERNQSBhcmVhLiAqLworCSAgICBsb3dfa21lbV9zaXplID4gdG90YWxfc2l6ZS8yKSAvKiBETUEvRE1BMzIgaXMgYmlnLiAqLworCQlyZXR1cm4gWk9ORUxJU1RfT1JERVJfTk9ERTsKKwkvKgorCSAqIGxvb2sgaW50byBlYWNoIG5vZGUncyBjb25maWcuCisgIAkgKiBJZiB0aGVyZSBpcyBhIG5vZGUgd2hvc2UgRE1BL0RNQTMyIG1lbW9yeSBpcyB2ZXJ5IGJpZyBhcmVhIG9uCisgCSAqIGxvY2FsIG1lbW9yeSwgTk9ERV9PUkRFUiBtYXkgYmUgc3VpdGFibGUuCisgICAgICAgICAqLworCWF2ZXJhZ2Vfc2l6ZSA9IHRvdGFsX3NpemUgLyAobnVtX29ubGluZV9ub2RlcygpICsgMSk7CisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCWxvd19rbWVtX3NpemUgPSAwOworCQl0b3RhbF9zaXplID0gMDsKKwkJZm9yICh6b25lX3R5cGUgPSAwOyB6b25lX3R5cGUgPCBNQVhfTlJfWk9ORVM7IHpvbmVfdHlwZSsrKSB7CisJCQl6ID0gJk5PREVfREFUQShuaWQpLT5ub2RlX3pvbmVzW3pvbmVfdHlwZV07CisJCQlpZiAocG9wdWxhdGVkX3pvbmUoeikpIHsKKwkJCQlpZiAoem9uZV90eXBlIDwgWk9ORV9OT1JNQUwpCisJCQkJCWxvd19rbWVtX3NpemUgKz0gei0+cHJlc2VudF9wYWdlczsKKwkJCQl0b3RhbF9zaXplICs9IHotPnByZXNlbnRfcGFnZXM7CisJCQl9CisJCX0KKwkJaWYgKGxvd19rbWVtX3NpemUgJiYKKwkJICAgIHRvdGFsX3NpemUgPiBhdmVyYWdlX3NpemUgJiYgLyogaWdub3JlIHNtYWxsIG5vZGUgKi8KKwkJICAgIGxvd19rbWVtX3NpemUgPiB0b3RhbF9zaXplICogNzAvMTAwKQorCQkJcmV0dXJuIFpPTkVMSVNUX09SREVSX05PREU7CisJfQorCXJldHVybiBaT05FTElTVF9PUkRFUl9aT05FOworfQorCitzdGF0aWMgdm9pZCBzZXRfem9uZWxpc3Rfb3JkZXIodm9pZCkKK3sKKwlpZiAodXNlcl96b25lbGlzdF9vcmRlciA9PSBaT05FTElTVF9PUkRFUl9ERUZBVUxUKQorCQljdXJyZW50X3pvbmVsaXN0X29yZGVyID0gZGVmYXVsdF96b25lbGlzdF9vcmRlcigpOworCWVsc2UKKwkJY3VycmVudF96b25lbGlzdF9vcmRlciA9IHVzZXJfem9uZWxpc3Rfb3JkZXI7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0cyhwZ19kYXRhX3QgKnBnZGF0KQoreworCWludCBqLCBub2RlLCBsb2FkOworCWVudW0gem9uZV90eXBlIGk7CiAJbm9kZW1hc2tfdCB1c2VkX21hc2s7CisJaW50IGxvY2FsX25vZGUsIHByZXZfbm9kZTsKKwlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0OworCWludCBvcmRlciA9IGN1cnJlbnRfem9uZWxpc3Rfb3JkZXI7CiAKIAkvKiBpbml0aWFsaXplIHpvbmVsaXN0cyAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgewpAQCAtMTcyMyw2ICsxOTUzLDExIEBACiAJbG9hZCA9IG51bV9vbmxpbmVfbm9kZXMoKTsKIAlwcmV2X25vZGUgPSBsb2NhbF9ub2RlOwogCW5vZGVzX2NsZWFyKHVzZWRfbWFzayk7CisKKwltZW1zZXQobm9kZV9sb2FkLCAwLCBzaXplb2Yobm9kZV9sb2FkKSk7CisJbWVtc2V0KG5vZGVfb3JkZXIsIDAsIHNpemVvZihub2RlX29yZGVyKSk7CisJaiA9IDA7CisKIAl3aGlsZSAoKG5vZGUgPSBmaW5kX25leHRfYmVzdF9ub2RlKGxvY2FsX25vZGUsICZ1c2VkX21hc2spKSA+PSAwKSB7CiAJCWludCBkaXN0YW5jZSA9IG5vZGVfZGlzdGFuY2UobG9jYWxfbm9kZSwgbm9kZSk7CiAKQEAgLTE3MzgsMjMgKzE5NzMsMjUgQEAKIAkJICogU28gYWRkaW5nIHBlbmFsdHkgdG8gdGhlIGZpcnN0IG5vZGUgaW4gc2FtZQogCQkgKiBkaXN0YW5jZSBncm91cCB0byBtYWtlIGl0IHJvdW5kLXJvYmluLgogCQkgKi8KLQogCQlpZiAoZGlzdGFuY2UgIT0gbm9kZV9kaXN0YW5jZShsb2NhbF9ub2RlLCBwcmV2X25vZGUpKQotCQkJbm9kZV9sb2FkW25vZGVdICs9IGxvYWQ7CisJCQlub2RlX2xvYWRbbm9kZV0gPSBsb2FkOworCiAJCXByZXZfbm9kZSA9IG5vZGU7CiAJCWxvYWQtLTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKSB7Ci0JCQl6b25lbGlzdCA9IHBnZGF0LT5ub2RlX3pvbmVsaXN0cyArIGk7Ci0JCQlmb3IgKGogPSAwOyB6b25lbGlzdC0+em9uZXNbal0gIT0gTlVMTDsgaisrKTsKKwkJaWYgKG9yZGVyID09IFpPTkVMSVNUX09SREVSX05PREUpCisJCQlidWlsZF96b25lbGlzdHNfaW5fbm9kZV9vcmRlcihwZ2RhdCwgbm9kZSk7CisJCWVsc2UKKwkJCW5vZGVfb3JkZXJbaisrXSA9IG5vZGU7CS8qIHJlbWVtYmVyIG9yZGVyICovCisJfQogCi0JIAkJaiA9IGJ1aWxkX3pvbmVsaXN0c19ub2RlKE5PREVfREFUQShub2RlKSwgem9uZWxpc3QsIGosIGkpOwotCQkJem9uZWxpc3QtPnpvbmVzW2pdID0gTlVMTDsKLQkJfQorCWlmIChvcmRlciA9PSBaT05FTElTVF9PUkRFUl9aT05FKSB7CisJCS8qIGNhbGN1bGF0ZSBub2RlIG9yZGVyIC0tIGkuZS4sIERNQSBsYXN0ISAqLworCQlidWlsZF96b25lbGlzdHNfaW5fem9uZV9vcmRlcihwZ2RhdCwgaik7CiAJfQogfQogCiAvKiBDb25zdHJ1Y3QgdGhlIHpvbmVsaXN0IHBlcmZvcm1hbmNlIGNhY2hlIC0gc2VlIGZ1cnRoZXIgbW16b25lLmggKi8KLXN0YXRpYyB2b2lkIF9fbWVtaW5pdCBidWlsZF96b25lbGlzdF9jYWNoZShwZ19kYXRhX3QgKnBnZGF0KQorc3RhdGljIHZvaWQgYnVpbGRfem9uZWxpc3RfY2FjaGUocGdfZGF0YV90ICpwZ2RhdCkKIHsKIAlpbnQgaTsKIApAQCAtMTc3MSw5ICsyMDA4LDE1IEBACiAJfQogfQogCisKICNlbHNlCS8qIENPTkZJR19OVU1BICovCiAKLXN0YXRpYyB2b2lkIF9fbWVtaW5pdCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKK3N0YXRpYyB2b2lkIHNldF96b25lbGlzdF9vcmRlcih2b2lkKQoreworCWN1cnJlbnRfem9uZWxpc3Rfb3JkZXIgPSBaT05FTElTVF9PUkRFUl9aT05FOworfQorCitzdGF0aWMgdm9pZCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKIHsKIAlpbnQgbm9kZSwgbG9jYWxfbm9kZTsKIAllbnVtIHpvbmVfdHlwZSBpLGo7CkBAIC0xODA5LDcgKzIwNTIsNyBAQAogfQogCiAvKiBub24tTlVNQSB2YXJpYW50IG9mIHpvbmVsaXN0IHBlcmZvcm1hbmNlIGNhY2hlIC0ganVzdCBOVUxMIHpsY2FjaGVfcHRyICovCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RfY2FjaGUocGdfZGF0YV90ICpwZ2RhdCkKK3N0YXRpYyB2b2lkIGJ1aWxkX3pvbmVsaXN0X2NhY2hlKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJaW50IGk7CiAKQEAgLTE4MjAsNyArMjA2Myw3IEBACiAjZW5kaWYJLyogQ09ORklHX05VTUEgKi8KIAogLyogcmV0dXJuIHZhbHVlcyBpbnQgLi4uLmp1c3QgZm9yIHN0b3BfbWFjaGluZV9ydW4oKSAqLwotc3RhdGljIGludCBfX21lbWluaXQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmR1bW15KQorc3RhdGljIGludCBfX2J1aWxkX2FsbF96b25lbGlzdHModm9pZCAqZHVtbXkpCiB7CiAJaW50IG5pZDsKIApAQCAtMTgzMSw4ICsyMDc0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19tZW1pbml0IGJ1aWxkX2FsbF96b25lbGlzdHModm9pZCkKK3ZvaWQgYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkKQogeworCXNldF96b25lbGlzdF9vcmRlcigpOworCiAJaWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykgewogCQlfX2J1aWxkX2FsbF96b25lbGlzdHMoTlVMTCk7CiAJCWNwdXNldF9pbml0X2N1cnJlbnRfbWVtc19hbGxvd2VkKCk7CkBAIC0xODQzLDggKzIwODgsMTMgQEAKIAkJLyogY3B1c2V0IHJlZnJlc2ggcm91dGluZSBzaG91bGQgYmUgaGVyZSAqLwogCX0KIAl2bV90b3RhbF9wYWdlcyA9IG5yX2ZyZWVfcGFnZWNhY2hlX3BhZ2VzKCk7Ci0JcHJpbnRrKCJCdWlsdCAlaSB6b25lbGlzdHMuICBUb3RhbCBwYWdlczogJWxkXG4iLAotCQkJbnVtX29ubGluZV9ub2RlcygpLCB2bV90b3RhbF9wYWdlcyk7CisJcHJpbnRrKCJCdWlsdCAlaSB6b25lbGlzdHMgaW4gJXMgb3JkZXIuICBUb3RhbCBwYWdlczogJWxkXG4iLAorCQkJbnVtX29ubGluZV9ub2RlcygpLAorCQkJem9uZWxpc3Rfb3JkZXJfbmFtZVtjdXJyZW50X3pvbmVsaXN0X29yZGVyXSwKKwkJCXZtX3RvdGFsX3BhZ2VzKTsKKyNpZmRlZiBDT05GSUdfTlVNQQorCXByaW50aygiUG9saWN5IHpvbmU6ICVzXG4iLCB6b25lX25hbWVzW3BvbGljeV96b25lXSk7CisjZW5kaWYKIH0KIAogLyoKQEAgLTE5NTMsOCArMjIwMyw4IEBACiAJfQogfQogCi12b2lkIHpvbmVfaW5pdF9mcmVlX2xpc3RzKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsIHN0cnVjdCB6b25lICp6b25lLAotCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCB6b25lX2luaXRfZnJlZV9saXN0cyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LAorCQkJCXN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaW50IG9yZGVyOwogCWZvciAob3JkZXIgPSAwOyBvcmRlciA8IE1BWF9PUkRFUiA7IG9yZGVyKyspIHsKQEAgLTIzNzAsNyArMjYyMCw3IEBACiB9CiAKIC8qIElmIG5lY2Vzc2FyeSwgcHVzaCB0aGUgbm9kZSBib3VuZGFyeSBvdXQgZm9yIHJlc2VydmUgaG90YWRkICovCi1zdGF0aWMgdm9pZCBfX2luaXQgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KHVuc2lnbmVkIGludCBuaWQsCitzdGF0aWMgdm9pZCBfX21lbWluaXQgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KHVuc2lnbmVkIGludCBuaWQsCiAJCXVuc2lnbmVkIGxvbmcgKnN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyAqZW5kX3BmbikKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAiRW50ZXJpbmcgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KCV1LCAlbHUsICVsdSlcbiIsCkBAIC0yMzkwLDcgKzI2NDAsNyBAQAogdm9pZCBfX2luaXQgcHVzaF9ub2RlX2JvdW5kYXJpZXModW5zaWduZWQgaW50IG5pZCwKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbikge30KIAotc3RhdGljIHZvaWQgX19pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAorc3RhdGljIHZvaWQgX19tZW1pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAogCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pIHt9CiAjZW5kaWYKIApAQCAtMjQyOCwxMCArMjY3OCw2NyBAQAogfQogCiAvKgorICogVGhpcyBmaW5kcyBhIHpvbmUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgWk9ORV9NT1ZBQkxFIHBhZ2VzLiBUaGUKKyAqIGFzc3VtcHRpb24gaXMgbWFkZSB0aGF0IHpvbmVzIHdpdGhpbiBhIG5vZGUgYXJlIG9yZGVyZWQgaW4gbW9ub3RvbmljCisgKiBpbmNyZWFzaW5nIG1lbW9yeSBhZGRyZXNzZXMgc28gdGhhdCB0aGUgImhpZ2hlc3QiIHBvcHVsYXRlZCB6b25lIGlzIHVzZWQKKyAqLwordm9pZCBfX2luaXQgZmluZF91c2FibGVfem9uZV9mb3JfbW92YWJsZSh2b2lkKQoreworCWludCB6b25lX2luZGV4OworCWZvciAoem9uZV9pbmRleCA9IE1BWF9OUl9aT05FUyAtIDE7IHpvbmVfaW5kZXggPj0gMDsgem9uZV9pbmRleC0tKSB7CisJCWlmICh6b25lX2luZGV4ID09IFpPTkVfTU9WQUJMRSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bem9uZV9pbmRleF0gPgorCQkJCWFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW3pvbmVfaW5kZXhdKQorCQkJYnJlYWs7CisJfQorCisJVk1fQlVHX09OKHpvbmVfaW5kZXggPT0gLTEpOworCW1vdmFibGVfem9uZSA9IHpvbmVfaW5kZXg7Cit9CisKKy8qCisgKiBUaGUgem9uZSByYW5nZXMgcHJvdmlkZWQgYnkgdGhlIGFyY2hpdGVjdHVyZSBkbyBub3QgaW5jbHVkZSBaT05FX01PVkFCTEUKKyAqIGJlY2F1c2UgaXQgaXMgc2l6ZWQgaW5kZXBlbmRhbnQgb2YgYXJjaGl0ZWN0dXJlLiBVbmxpa2UgdGhlIG90aGVyIHpvbmVzLAorICogdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBaT05FX01PVkFCTEUgaXMgbm90IGZpeGVkLiBJdCBtYXkgYmUgZGlmZmVyZW50CisgKiBpbiBlYWNoIG5vZGUgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIGVhY2ggbm9kZSBhbmQgaG93IGV2ZW5seSBrZXJuZWxjb3JlCisgKiBpcyBkaXN0cmlidXRlZC4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gYWRqdXN0cyB0aGUgem9uZSByYW5nZXMKKyAqIHByb3ZpZGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgZm9yIGEgZ2l2ZW4gbm9kZSBieSB1c2luZyB0aGUgZW5kIG9mIHRoZQorICogaGlnaGVzdCB1c2FibGUgem9uZSBmb3IgWk9ORV9NT1ZBQkxFLiBUaGlzIHByZXNlcnZlcyB0aGUgYXNzdW1wdGlvbiB0aGF0CisgKiB6b25lcyB3aXRoaW4gYSBub2RlIGFyZSBpbiBvcmRlciBvZiBtb25vdG9uaWMgaW5jcmVhc2VzIG1lbW9yeSBhZGRyZXNzZXMKKyAqLwordm9pZCBfX21lbWluaXQgYWRqdXN0X3pvbmVfcmFuZ2VfZm9yX3pvbmVfbW92YWJsZShpbnQgbmlkLAorCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbiwKKwkJCQkJdW5zaWduZWQgbG9uZyBub2RlX2VuZF9wZm4sCisJCQkJCXVuc2lnbmVkIGxvbmcgKnpvbmVfc3RhcnRfcGZuLAorCQkJCQl1bnNpZ25lZCBsb25nICp6b25lX2VuZF9wZm4pCit7CisJLyogT25seSBhZGp1c3QgaWYgWk9ORV9NT1ZBQkxFIGlzIG9uIHRoaXMgbm9kZSAqLworCWlmICh6b25lX21vdmFibGVfcGZuW25pZF0pIHsKKwkJLyogU2l6ZSBaT05FX01PVkFCTEUgKi8KKwkJaWYgKHpvbmVfdHlwZSA9PSBaT05FX01PVkFCTEUpIHsKKwkJCSp6b25lX3N0YXJ0X3BmbiA9IHpvbmVfbW92YWJsZV9wZm5bbmlkXTsKKwkJCSp6b25lX2VuZF9wZm4gPSBtaW4obm9kZV9lbmRfcGZuLAorCQkJCWFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3Bmblttb3ZhYmxlX3pvbmVdKTsKKworCQkvKiBBZGp1c3QgZm9yIFpPTkVfTU9WQUJMRSBzdGFydGluZyB3aXRoaW4gdGhpcyByYW5nZSAqLworCQl9IGVsc2UgaWYgKCp6b25lX3N0YXJ0X3BmbiA8IHpvbmVfbW92YWJsZV9wZm5bbmlkXSAmJgorCQkJCSp6b25lX2VuZF9wZm4gPiB6b25lX21vdmFibGVfcGZuW25pZF0pIHsKKwkJCSp6b25lX2VuZF9wZm4gPSB6b25lX21vdmFibGVfcGZuW25pZF07CisKKwkJLyogQ2hlY2sgaWYgdGhpcyB3aG9sZSByYW5nZSBpcyB3aXRoaW4gWk9ORV9NT1ZBQkxFICovCisJCX0gZWxzZSBpZiAoKnpvbmVfc3RhcnRfcGZuID49IHpvbmVfbW92YWJsZV9wZm5bbmlkXSkKKwkJCSp6b25lX3N0YXJ0X3BmbiA9ICp6b25lX2VuZF9wZm47CisJfQorfQorCisvKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgYSB6b25lIHNwYW5zIGluIGEgbm9kZSwgaW5jbHVkaW5nIGhvbGVzCiAgKiBwcmVzZW50X3BhZ2VzID0gem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUoKSAtIHpvbmVfYWJzZW50X3BhZ2VzX2luX25vZGUoKQogICovCi11bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKGludCBuaWQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAogCQkJCQl1bnNpZ25lZCBsb25nICppZ25vcmVkKQogewpAQCAtMjQ0Miw2ICsyNzQ5LDkgQEAKIAlnZXRfcGZuX3JhbmdlX2Zvcl9uaWQobmlkLCAmbm9kZV9zdGFydF9wZm4sICZub2RlX2VuZF9wZm4pOwogCXpvbmVfc3RhcnRfcGZuID0gYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXTsKIAl6b25lX2VuZF9wZm4gPSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXTsKKwlhZGp1c3Rfem9uZV9yYW5nZV9mb3Jfem9uZV9tb3ZhYmxlKG5pZCwgem9uZV90eXBlLAorCQkJCW5vZGVfc3RhcnRfcGZuLCBub2RlX2VuZF9wZm4sCisJCQkJJnpvbmVfc3RhcnRfcGZuLCAmem9uZV9lbmRfcGZuKTsKIAogCS8qIENoZWNrIHRoYXQgdGhpcyBub2RlIGhhcyBwYWdlcyB3aXRoaW4gdGhlIHpvbmUncyByZXF1aXJlZCByYW5nZSAqLwogCWlmICh6b25lX2VuZF9wZm4gPCBub2RlX3N0YXJ0X3BmbiB8fCB6b25lX3N0YXJ0X3BmbiA+IG5vZGVfZW5kX3BmbikKQEAgLTI1MTksNyArMjgyOSw3IEBACiB9CiAKIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2UgZnJhbWVzIGluIGhvbGVzIGluIGEgem9uZSBvbiBhIG5vZGUgKi8KLXVuc2lnbmVkIGxvbmcgX19tZW1pbml0IHpvbmVfYWJzZW50X3BhZ2VzX2luX25vZGUoaW50IG5pZCwKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAogCQkJCQl1bnNpZ25lZCBsb25nICppZ25vcmVkKQogewpAQCAtMjUzMiwxOCArMjg0MiwyMSBAQAogCXpvbmVfZW5kX3BmbiA9IG1pbihhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXSwKIAkJCQkJCQlub2RlX2VuZF9wZm4pOwogCisJYWRqdXN0X3pvbmVfcmFuZ2VfZm9yX3pvbmVfbW92YWJsZShuaWQsIHpvbmVfdHlwZSwKKwkJCW5vZGVfc3RhcnRfcGZuLCBub2RlX2VuZF9wZm4sCisJCQkmem9uZV9zdGFydF9wZm4sICZ6b25lX2VuZF9wZm4pOwogCXJldHVybiBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShuaWQsIHpvbmVfc3RhcnRfcGZuLCB6b25lX2VuZF9wZm4pOwogfQogCiAjZWxzZQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKGludCBuaWQsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKGludCBuaWQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAogCQkJCQl1bnNpZ25lZCBsb25nICp6b25lc19zaXplKQogewogCXJldHVybiB6b25lc19zaXplW3pvbmVfdHlwZV07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0IHpvbmVfYWJzZW50X3BhZ2VzX2luX25vZGUoaW50IG5pZCwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAogCQkJCQkJdW5zaWduZWQgbG9uZyAqemhvbGVzX3NpemUpCiB7CkBAIC0yOTA5LDYgKzMyMjIsMTU3IEBACiAJcmV0dXJuIG1heF9wZm47CiB9CiAKK3Vuc2lnbmVkIGxvbmcgX19pbml0IGVhcmx5X2NhbGN1bGF0ZV90b3RhbHBhZ2VzKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB0b3RhbHBhZ2VzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBucl9ub2RlbWFwX2VudHJpZXM7IGkrKykKKwkJdG90YWxwYWdlcyArPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuIC0KKwkJCQkJCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKKworCXJldHVybiB0b3RhbHBhZ2VzOworfQorCisvKgorICogRmluZCB0aGUgUEZOIHRoZSBNb3ZhYmxlIHpvbmUgYmVnaW5zIGluIGVhY2ggbm9kZS4gS2VybmVsIG1lbW9yeQorICogaXMgc3ByZWFkIGV2ZW5seSBiZXR3ZWVuIG5vZGVzIGFzIGxvbmcgYXMgdGhlIG5vZGVzIGhhdmUgZW5vdWdoCisgKiBtZW1vcnkuIFdoZW4gdGhleSBkb24ndCwgc29tZSBub2RlcyB3aWxsIGhhdmUgbW9yZSBrZXJuZWxjb3JlIHRoYW4KKyAqIG90aGVycworICovCit2b2lkIF9faW5pdCBmaW5kX3pvbmVfbW92YWJsZV9wZm5zX2Zvcl9ub2Rlcyh1bnNpZ25lZCBsb25nICptb3ZhYmxlX3BmbikKK3sKKwlpbnQgaSwgbmlkOworCXVuc2lnbmVkIGxvbmcgdXNhYmxlX3N0YXJ0cGZuOworCXVuc2lnbmVkIGxvbmcga2VybmVsY29yZV9ub2RlLCBrZXJuZWxjb3JlX3JlbWFpbmluZzsKKwlpbnQgdXNhYmxlX25vZGVzID0gbnVtX29ubGluZV9ub2RlcygpOworCisJLyoKKwkgKiBJZiBtb3ZhYmxlY29yZSB3YXMgc3BlY2lmaWVkLCBjYWxjdWxhdGUgd2hhdCBzaXplIG9mCisJICoga2VybmVsY29yZSB0aGF0IGNvcnJlc3BvbmRzIHNvIHRoYXQgbWVtb3J5IHVzYWJsZSBmb3IKKwkgKiBhbnkgYWxsb2NhdGlvbiB0eXBlIGlzIGV2ZW5seSBzcHJlYWQuIElmIGJvdGgga2VybmVsY29yZQorCSAqIGFuZCBtb3ZhYmxlY29yZSBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSB2YWx1ZSBvZiBrZXJuZWxjb3JlCisJICogd2lsbCBiZSB1c2VkIGZvciByZXF1aXJlZF9rZXJuZWxjb3JlIGlmIGl0J3MgZ3JlYXRlciB0aGFuCisJICogd2hhdCBtb3ZhYmxlY29yZSB3b3VsZCBoYXZlIGFsbG93ZWQuCisJICovCisJaWYgKHJlcXVpcmVkX21vdmFibGVjb3JlKSB7CisJCXVuc2lnbmVkIGxvbmcgdG90YWxwYWdlcyA9IGVhcmx5X2NhbGN1bGF0ZV90b3RhbHBhZ2VzKCk7CisJCXVuc2lnbmVkIGxvbmcgY29yZXBhZ2VzOworCisJCS8qCisJCSAqIFJvdW5kLXVwIHNvIHRoYXQgWk9ORV9NT1ZBQkxFIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHdoYXQKKwkJICogd2FzIHJlcXVlc3RlZCBieSB0aGUgdXNlcgorCQkgKi8KKwkJcmVxdWlyZWRfbW92YWJsZWNvcmUgPQorCQkJcm91bmR1cChyZXF1aXJlZF9tb3ZhYmxlY29yZSwgTUFYX09SREVSX05SX1BBR0VTKTsKKwkJY29yZXBhZ2VzID0gdG90YWxwYWdlcyAtIHJlcXVpcmVkX21vdmFibGVjb3JlOworCisJCXJlcXVpcmVkX2tlcm5lbGNvcmUgPSBtYXgocmVxdWlyZWRfa2VybmVsY29yZSwgY29yZXBhZ2VzKTsKKwl9CisKKwkvKiBJZiBrZXJuZWxjb3JlIHdhcyBub3Qgc3BlY2lmaWVkLCB0aGVyZSBpcyBubyBaT05FX01PVkFCTEUgKi8KKwlpZiAoIXJlcXVpcmVkX2tlcm5lbGNvcmUpCisJCXJldHVybjsKKworCS8qIHVzYWJsZV9zdGFydHBmbiBpcyB0aGUgbG93ZXN0IHBvc3NpYmxlIHBmbiBaT05FX01PVkFCTEUgY2FuIGJlIGF0ICovCisJZmluZF91c2FibGVfem9uZV9mb3JfbW92YWJsZSgpOworCXVzYWJsZV9zdGFydHBmbiA9IGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW21vdmFibGVfem9uZV07CisKK3Jlc3RhcnQ6CisJLyogU3ByZWFkIGtlcm5lbGNvcmUgbWVtb3J5IGFzIGV2ZW5seSBhcyBwb3NzaWJsZSB0aHJvdWdob3V0IG5vZGVzICovCisJa2VybmVsY29yZV9ub2RlID0gcmVxdWlyZWRfa2VybmVsY29yZSAvIHVzYWJsZV9ub2RlczsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJLyoKKwkJICogUmVjYWxjdWxhdGUga2VybmVsY29yZV9ub2RlIGlmIHRoZSBkaXZpc2lvbiBwZXIgbm9kZQorCQkgKiBub3cgZXhjZWVkcyB3aGF0IGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0ZWQKKwkJICogYW1vdW50IG9mIG1lbW9yeSBmb3IgdGhlIGtlcm5lbAorCQkgKi8KKwkJaWYgKHJlcXVpcmVkX2tlcm5lbGNvcmUgPCBrZXJuZWxjb3JlX25vZGUpCisJCQlrZXJuZWxjb3JlX25vZGUgPSByZXF1aXJlZF9rZXJuZWxjb3JlIC8gdXNhYmxlX25vZGVzOworCisJCS8qCisJCSAqIEFzIHRoZSBtYXAgaXMgd2Fsa2VkLCB3ZSB0cmFjayBob3cgbXVjaCBtZW1vcnkgaXMgdXNhYmxlCisJCSAqIGJ5IHRoZSBrZXJuZWwgdXNpbmcga2VybmVsY29yZV9yZW1haW5pbmcuIFdoZW4gaXQgaXMKKwkJICogMCwgdGhlIHJlc3Qgb2YgdGhlIG5vZGUgaXMgdXNhYmxlIGJ5IFpPTkVfTU9WQUJMRQorCQkgKi8KKwkJa2VybmVsY29yZV9yZW1haW5pbmcgPSBrZXJuZWxjb3JlX25vZGU7CisKKwkJLyogR28gdGhyb3VnaCBlYWNoIHJhbmdlIG9mIFBGTnMgd2l0aGluIHRoaXMgbm9kZSAqLworCQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkgeworCQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisJCQl1bnNpZ25lZCBsb25nIHNpemVfcGFnZXM7CisKKwkJCXN0YXJ0X3BmbiA9IG1heChlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4sCisJCQkJCQl6b25lX21vdmFibGVfcGZuW25pZF0pOworCQkJZW5kX3BmbiA9IGVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm47CisJCQlpZiAoc3RhcnRfcGZuID49IGVuZF9wZm4pCisJCQkJY29udGludWU7CisKKwkJCS8qIEFjY291bnQgZm9yIHdoYXQgaXMgb25seSB1c2FibGUgZm9yIGtlcm5lbGNvcmUgKi8KKwkJCWlmIChzdGFydF9wZm4gPCB1c2FibGVfc3RhcnRwZm4pIHsKKwkJCQl1bnNpZ25lZCBsb25nIGtlcm5lbF9wYWdlczsKKwkJCQlrZXJuZWxfcGFnZXMgPSBtaW4oZW5kX3BmbiwgdXNhYmxlX3N0YXJ0cGZuKQorCQkJCQkJCQktIHN0YXJ0X3BmbjsKKworCQkJCWtlcm5lbGNvcmVfcmVtYWluaW5nIC09IG1pbihrZXJuZWxfcGFnZXMsCisJCQkJCQkJa2VybmVsY29yZV9yZW1haW5pbmcpOworCQkJCXJlcXVpcmVkX2tlcm5lbGNvcmUgLT0gbWluKGtlcm5lbF9wYWdlcywKKwkJCQkJCQlyZXF1aXJlZF9rZXJuZWxjb3JlKTsKKworCQkJCS8qIENvbnRpbnVlIGlmIHJhbmdlIGlzIG5vdyBmdWxseSBhY2NvdW50ZWQgKi8KKwkJCQlpZiAoZW5kX3BmbiA8PSB1c2FibGVfc3RhcnRwZm4pIHsKKworCQkJCQkvKgorCQkJCQkgKiBQdXNoIHpvbmVfbW92YWJsZV9wZm4gdG8gdGhlIGVuZCBzbworCQkJCQkgKiB0aGF0IGlmIHdlIGhhdmUgdG8gcmViYWxhbmNlCisJCQkJCSAqIGtlcm5lbGNvcmUgYWNyb3NzIG5vZGVzLCB3ZSB3aWxsCisJCQkJCSAqIG5vdCBkb3VibGUgYWNjb3VudCBoZXJlCisJCQkJCSAqLworCQkJCQl6b25lX21vdmFibGVfcGZuW25pZF0gPSBlbmRfcGZuOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJc3RhcnRfcGZuID0gdXNhYmxlX3N0YXJ0cGZuOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIHVzYWJsZSBQRk4gcmFuZ2UgZm9yIFpPTkVfTU9WQUJMRSBpcyBmcm9tCisJCQkgKiBzdGFydF9wZm4tPmVuZF9wZm4uIENhbGN1bGF0ZSBzaXplX3BhZ2VzIGFzIHRoZQorCQkJICogbnVtYmVyIG9mIHBhZ2VzIHVzZWQgYXMga2VybmVsY29yZQorCQkJICovCisJCQlzaXplX3BhZ2VzID0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKKwkJCWlmIChzaXplX3BhZ2VzID4ga2VybmVsY29yZV9yZW1haW5pbmcpCisJCQkJc2l6ZV9wYWdlcyA9IGtlcm5lbGNvcmVfcmVtYWluaW5nOworCQkJem9uZV9tb3ZhYmxlX3BmbltuaWRdID0gc3RhcnRfcGZuICsgc2l6ZV9wYWdlczsKKworCQkJLyoKKwkJCSAqIFNvbWUga2VybmVsY29yZSBoYXMgYmVlbiBtZXQsIHVwZGF0ZSBjb3VudHMgYW5kCisJCQkgKiBicmVhayBpZiB0aGUga2VybmVsY29yZSBmb3IgdGhpcyBub2RlIGhhcyBiZWVuCisJCQkgKiBzYXRpc2lmaWVkCisJCQkgKi8KKwkJCXJlcXVpcmVkX2tlcm5lbGNvcmUgLT0gbWluKHJlcXVpcmVkX2tlcm5lbGNvcmUsCisJCQkJCQkJCXNpemVfcGFnZXMpOworCQkJa2VybmVsY29yZV9yZW1haW5pbmcgLT0gc2l6ZV9wYWdlczsKKwkJCWlmICgha2VybmVsY29yZV9yZW1haW5pbmcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIHN0aWxsIHJlcXVpcmVkX2tlcm5lbGNvcmUsIHdlIGRvIGFub3RoZXIgcGFzcyB3aXRoIG9uZQorCSAqIGxlc3Mgbm9kZSBpbiB0aGUgY291bnQuIFRoaXMgd2lsbCBwdXNoIHpvbmVfbW92YWJsZV9wZm5bbmlkXSBmdXJ0aGVyCisJICogYWxvbmcgb24gdGhlIG5vZGVzIHRoYXQgc3RpbGwgaGF2ZSBtZW1vcnkgdW50aWwga2VybmVsY29yZSBpcworCSAqIHNhdGlzaWZpZWQKKwkgKi8KKwl1c2FibGVfbm9kZXMtLTsKKwlpZiAodXNhYmxlX25vZGVzICYmIHJlcXVpcmVkX2tlcm5lbGNvcmUgPiB1c2FibGVfbm9kZXMpCisJCWdvdG8gcmVzdGFydDsKKworCS8qIEFsaWduIHN0YXJ0IG9mIFpPTkVfTU9WQUJMRSBvbiBhbGwgbmlkcyB0byBNQVhfT1JERVJfTlJfUEFHRVMgKi8KKwlmb3IgKG5pZCA9IDA7IG5pZCA8IE1BWF9OVU1OT0RFUzsgbmlkKyspCisJCXpvbmVfbW92YWJsZV9wZm5bbmlkXSA9CisJCQlyb3VuZHVwKHpvbmVfbW92YWJsZV9wZm5bbmlkXSwgTUFYX09SREVSX05SX1BBR0VTKTsKK30KKwogLyoqCiAgKiBmcmVlX2FyZWFfaW5pdF9ub2RlcyAtIEluaXRpYWxpc2UgYWxsIHBnX2RhdGFfdCBhbmQgem9uZSBkYXRhCiAgKiBAbWF4X3pvbmVfcGZuOiBhbiBhcnJheSBvZiBtYXggUEZOcyBmb3IgZWFjaCB6b25lCkBAIC0yOTM4LDE5ICszNDAyLDM3IEBACiAJYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bMF0gPSBmaW5kX21pbl9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucygpOwogCWFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmblswXSA9IG1heF96b25lX3BmblswXTsKIAlmb3IgKGkgPSAxOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKKwkJaWYgKGkgPT0gWk9ORV9NT1ZBQkxFKQorCQkJY29udGludWU7CiAJCWFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW2ldID0KIAkJCWFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltpLTFdOwogCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baV0gPQogCQkJbWF4KG1heF96b25lX3BmbltpXSwgYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5baV0pOwogCX0KKwlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltaT05FX01PVkFCTEVdID0gMDsKKwlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bWk9ORV9NT1ZBQkxFXSA9IDA7CisKKwkvKiBGaW5kIHRoZSBQRk5zIHRoYXQgWk9ORV9NT1ZBQkxFIGJlZ2lucyBhdCBpbiBlYWNoIG5vZGUgKi8KKwltZW1zZXQoem9uZV9tb3ZhYmxlX3BmbiwgMCwgc2l6ZW9mKHpvbmVfbW92YWJsZV9wZm4pKTsKKwlmaW5kX3pvbmVfbW92YWJsZV9wZm5zX2Zvcl9ub2Rlcyh6b25lX21vdmFibGVfcGZuKTsKIAogCS8qIFByaW50IG91dCB0aGUgem9uZSByYW5nZXMgKi8KIAlwcmludGsoIlpvbmUgUEZOIHJhbmdlczpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKKwkJaWYgKGkgPT0gWk9ORV9NT1ZBQkxFKQorCQkJY29udGludWU7CiAJCXByaW50aygiICAlLThzICU4bHUgLT4gJThsdVxuIiwKIAkJCQl6b25lX25hbWVzW2ldLAogCQkJCWFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW2ldLAogCQkJCWFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltpXSk7CisJfQorCisJLyogUHJpbnQgb3V0IHRoZSBQRk5zIFpPTkVfTU9WQUJMRSBiZWdpbnMgYXQgaW4gZWFjaCBub2RlICovCisJcHJpbnRrKCJNb3ZhYmxlIHpvbmUgc3RhcnQgUEZOIGZvciBlYWNoIG5vZGVcbiIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgeworCQlpZiAoem9uZV9tb3ZhYmxlX3BmbltpXSkKKwkJCXByaW50aygiICBOb2RlICVkOiAlbHVcbiIsIGksIHpvbmVfbW92YWJsZV9wZm5baV0pOworCX0KIAogCS8qIFByaW50IG91dCB0aGUgZWFybHlfbm9kZV9tYXBbXSAqLwogCXByaW50aygiZWFybHlfbm9kZV9tYXBbJWRdIGFjdGl2ZSBQRk4gcmFuZ2VzXG4iLCBucl9ub2RlbWFwX2VudHJpZXMpOwpAQCAtMjk2Nyw2ICszNDQ5LDQzIEBACiAJCQkJZmluZF9taW5fcGZuX2Zvcl9ub2RlKG5pZCksIE5VTEwpOwogCX0KIH0KKworc3RhdGljIGludCBfX2luaXQgY21kbGluZV9wYXJzZV9jb3JlKGNoYXIgKnAsIHVuc2lnbmVkIGxvbmcgKmNvcmUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNvcmVtZW07CisJaWYgKCFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvcmVtZW0gPSBtZW1wYXJzZShwLCAmcCk7CisJKmNvcmUgPSBjb3JlbWVtID4+IFBBR0VfU0hJRlQ7CisKKwkvKiBQYXJhbm9pZCBjaGVjayB0aGF0IFVMIGlzIGVub3VnaCBmb3IgdGhlIGNvcmVtZW0gdmFsdWUgKi8KKwlXQVJOX09OKChjb3JlbWVtID4+IFBBR0VfU0hJRlQpID4gVUxPTkdfTUFYKTsKKworCXJldHVybiAwOworfQorCisvKgorICoga2VybmVsY29yZT1zaXplIHNldHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgZm9yIHVzZSBmb3IgYWxsb2NhdGlvbnMgdGhhdAorICogY2Fubm90IGJlIHJlY2xhaW1lZCBvciBtaWdyYXRlZC4KKyAqLworc3RhdGljIGludCBfX2luaXQgY21kbGluZV9wYXJzZV9rZXJuZWxjb3JlKGNoYXIgKnApCit7CisJcmV0dXJuIGNtZGxpbmVfcGFyc2VfY29yZShwLCAmcmVxdWlyZWRfa2VybmVsY29yZSk7Cit9CisKKy8qCisgKiBtb3ZhYmxlY29yZT1zaXplIHNldHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgZm9yIHVzZSBmb3IgYWxsb2NhdGlvbnMgdGhhdAorICogY2FuIGJlIHJlY2xhaW1lZCBvciBtaWdyYXRlZC4KKyAqLworc3RhdGljIGludCBfX2luaXQgY21kbGluZV9wYXJzZV9tb3ZhYmxlY29yZShjaGFyICpwKQoreworCXJldHVybiBjbWRsaW5lX3BhcnNlX2NvcmUocCwgJnJlcXVpcmVkX21vdmFibGVjb3JlKTsKK30KKworZWFybHlfcGFyYW0oImtlcm5lbGNvcmUiLCBjbWRsaW5lX3BhcnNlX2tlcm5lbGNvcmUpOworZWFybHlfcGFyYW0oIm1vdmFibGVjb3JlIiwgY21kbGluZV9wYXJzZV9tb3ZhYmxlY29yZSk7CisKICNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KIAogLyoqCkBAIC0zMzU1LDEzICszODc0LDI4IEBACiAJCQlmb3IgKG9yZGVyID0gMDsgKCgxVUwgPDwgb3JkZXIpIDw8IFBBR0VfU0hJRlQpIDwgc2l6ZTsgb3JkZXIrKykKIAkJCQk7CiAJCQl0YWJsZSA9ICh2b2lkKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlcik7CisJCQkvKgorCQkJICogSWYgYnVja2V0c2l6ZSBpcyBub3QgYSBwb3dlci1vZi10d28sIHdlIG1heSBmcmVlCisJCQkgKiBzb21lIHBhZ2VzIGF0IHRoZSBlbmQgb2YgaGFzaCB0YWJsZS4KKwkJCSAqLworCQkJaWYgKHRhYmxlKSB7CisJCQkJdW5zaWduZWQgbG9uZyBhbGxvY19lbmQgPSAodW5zaWduZWQgbG9uZyl0YWJsZSArCisJCQkJCQkoUEFHRV9TSVpFIDw8IG9yZGVyKTsKKwkJCQl1bnNpZ25lZCBsb25nIHVzZWQgPSAodW5zaWduZWQgbG9uZyl0YWJsZSArCisJCQkJCQlQQUdFX0FMSUdOKHNpemUpOworCQkJCXNwbGl0X3BhZ2UodmlydF90b19wYWdlKHRhYmxlKSwgb3JkZXIpOworCQkJCXdoaWxlICh1c2VkIDwgYWxsb2NfZW5kKSB7CisJCQkJCWZyZWVfcGFnZSh1c2VkKTsKKwkJCQkJdXNlZCArPSBQQUdFX1NJWkU7CisJCQkJfQorCQkJfQogCQl9CiAJfSB3aGlsZSAoIXRhYmxlICYmIHNpemUgPiBQQUdFX1NJWkUgJiYgLS1sb2cycXR5KTsKIAogCWlmICghdGFibGUpCiAJCXBhbmljKCJGYWlsZWQgdG8gYWxsb2NhdGUgJXMgaGFzaCB0YWJsZVxuIiwgdGFibGVuYW1lKTsKIAotCXByaW50aygiJXMgaGFzaCB0YWJsZSBlbnRyaWVzOiAlZCAob3JkZXI6ICVkLCAlbHUgYnl0ZXMpXG4iLAorCXByaW50ayhLRVJOX0lORk8gIiVzIGhhc2ggdGFibGUgZW50cmllczogJWQgKG9yZGVyOiAlZCwgJWx1IGJ5dGVzKVxuIiwKIAkgICAgICAgdGFibGVuYW1lLAogCSAgICAgICAoMVUgPDwgbG9nMnF0eSksCiAJICAgICAgIGlsb2cyKHNpemUpIC0gUEFHRV9TSElGVCwKZGlmZiAtLWdpdCBhL21tL3BkZmx1c2guYyBiL21tL3BkZmx1c2guYwppbmRleCA4Y2UwOTAwLi44ZjZlZTA3IDEwMDY0NAotLS0gYS9tbS9wZGZsdXNoLmMKKysrIGIvbW0vcGRmbHVzaC5jCkBAIC05Miw2ICs5Miw3IEBACiBzdGF0aWMgaW50IF9fcGRmbHVzaChzdHJ1Y3QgcGRmbHVzaF93b3JrICpteV93b3JrKQogewogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX0ZMVVNIRVIgfCBQRl9TV0FQV1JJVEU7CisJc2V0X2ZyZWV6YWJsZSgpOwogCW15X3dvcmstPmZuID0gTlVMTDsKIAlteV93b3JrLT53aG8gPSBjdXJyZW50OwogCUlOSVRfTElTVF9IRUFEKCZteV93b3JrLT5saXN0KTsKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IDA0OTNlNGQuLjk2ZmE3OWYgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5lcmljX2FjbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgpAQCAtOTMsOCArOTQsMTEgQEAKIAkgKiBUaGUgYWJvdmUgZGVmaW5pdGlvbiBvZiBFTlRSSUVTX1BFUl9QQUdFLCBhbmQgdGhlIHVzZSBvZgogCSAqIEJMT0NLU19QRVJfUEFHRSBvbiBpbmRpcmVjdCBwYWdlcywgYXNzdW1lIFBBR0VfQ0FDSEVfU0laRToKIAkgKiBtaWdodCBiZSByZWNvbnNpZGVyZWQgaWYgaXQgZXZlciBkaXZlcmdlcyBmcm9tIFBBR0VfU0laRS4KKwkgKgorCSAqIF9fR0ZQX01PVkFCTEUgaXMgbWFza2VkIG91dCBhcyBzd2FwIHZlY3RvcnMgY2Fubm90IG1vdmUKIAkgKi8KLQlyZXR1cm4gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIFBBR0VfQ0FDSEVfU0hJRlQtUEFHRV9TSElGVCk7CisJcmV0dXJuIGFsbG9jX3BhZ2VzKChnZnBfbWFzayAmIH5fX0dGUF9NT1ZBQkxFKSB8IF9fR0ZQX1pFUk8sCisJCQkJUEFHRV9DQUNIRV9TSElGVC1QQUdFX1NISUZUKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNobWVtX2Rpcl9mcmVlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMzcyLDcgKzM3Niw3IEBACiAJCX0KIAogCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCXBhZ2UgPSBzaG1lbV9kaXJfYWxsb2MobWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSB8IF9fR0ZQX1pFUk8pOworCQlwYWdlID0gc2htZW1fZGlyX2FsbG9jKG1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZykpOwogCQlpZiAocGFnZSkKIAkJCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CiAJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggYjM0NGU2Ny4uOTZkMzBlZSAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtNzc1LDYgKzc3NSw5IEBACiAJICovCiAJQlVHX09OKG1hbGxvY19zaXplc1tJTkRFWF9BQ10uY3NfY2FjaGVwID09IE5VTEwpOwogI2VuZGlmCisJaWYgKCFzaXplKQorCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwogCXdoaWxlIChzaXplID4gY3NpemVwLT5jc19zaXplKQogCQljc2l6ZXArKzsKIApAQCAtOTI5LDcgKzkzMiw3IEBACiAgKiB0aGUgQ1BVcyBnZXR0aW5nIGludG8gbG9ja3N0ZXAgYW5kIGNvbnRlbmRpbmcgZm9yIHRoZSBnbG9iYWwgY2FjaGUgY2hhaW4KICAqIGxvY2suCiAgKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzdGFydF9jcHVfdGltZXIoaW50IGNwdSkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzdGFydF9jcHVfdGltZXIoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpyZWFwX3dvcmsgPSAmcGVyX2NwdShyZWFwX3dvcmssIGNwdSk7CiAKQEAgLTIzNTEsNyArMjM1NCw3IEBACiAJCSAqIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gYXQgYWxsLgogCQkgKiBCdXQgbGVhdmUgYSBCVUdfT04gZm9yIHNvbWUgbHVja3kgZHVkZS4KIAkJICovCi0JCUJVR19PTighY2FjaGVwLT5zbGFicF9jYWNoZSk7CisJCUJVR19PTihaRVJPX09SX05VTExfUFRSKGNhY2hlcC0+c2xhYnBfY2FjaGUpKTsKIAl9CiAJY2FjaGVwLT5jdG9yID0gY3RvcjsKIAljYWNoZXAtPm5hbWUgPSBuYW1lOwpAQCAtMjc0Myw3ICsyNzQ2LDcgQEAKIAkgKiBCZSBsYXp5IGFuZCBvbmx5IGNoZWNrIGZvciB2YWxpZCBmbGFncyBoZXJlLCAga2VlcGluZyBpdCBvdXQgb2YgdGhlCiAJICogY3JpdGljYWwgcGF0aCBpbiBrbWVtX2NhY2hlX2FsbG9jKCkuCiAJICovCi0JQlVHX09OKGZsYWdzICYgfihHRlBfRE1BIHwgR0ZQX0xFVkVMX01BU0spKTsKKwlCVUdfT04oZmxhZ3MgJiB+KEdGUF9ETUEgfCBfX0dGUF9aRVJPIHwgR0ZQX0xFVkVMX01BU0spKTsKIAogCWxvY2FsX2ZsYWdzID0gKGZsYWdzICYgR0ZQX0xFVkVMX01BU0spOwogCS8qIFRha2UgdGhlIGwzIGxpc3QgbG9jayB0byBjaGFuZ2UgdGhlIGNvbG91cl9uZXh0IG9uIHRoaXMgbm9kZSAqLwpAQCAtMzM4OSw2ICszMzkyLDkgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShzYXZlX2ZsYWdzKTsKIAlwdHIgPSBjYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2FmdGVyKGNhY2hlcCwgZmxhZ3MsIHB0ciwgY2FsbGVyKTsKIAorCWlmICh1bmxpa2VseSgoZmxhZ3MgJiBfX0dGUF9aRVJPKSAmJiBwdHIpKQorCQltZW1zZXQocHRyLCAwLCBvYmpfc2l6ZShjYWNoZXApKTsKKwogCXJldHVybiBwdHI7CiB9CiAKQEAgLTM0NDAsNiArMzQ0Niw5IEBACiAJb2JqcCA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBmbGFncywgb2JqcCwgY2FsbGVyKTsKIAlwcmVmZXRjaHcob2JqcCk7CiAKKwlpZiAodW5saWtlbHkoKGZsYWdzICYgX19HRlBfWkVSTykgJiYgb2JqcCkpCisJCW1lbXNldChvYmpwLCAwLCBvYmpfc2l6ZShjYWNoZXApKTsKKwogCXJldHVybiBvYmpwOwogfQogCkBAIC0zNTgxLDIzICszNTkwLDYgQEAKIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7CiAKIC8qKgotICoga21lbV9jYWNoZV96YWxsb2MgLSBBbGxvY2F0ZSBhbiBvYmplY3QuIFRoZSBtZW1vcnkgaXMgc2V0IHRvIHplcm8uCi0gKiBAY2FjaGU6IFRoZSBjYWNoZSB0byBhbGxvY2F0ZSBmcm9tLgotICogQGZsYWdzOiBTZWUga21hbGxvYygpLgotICoKLSAqIEFsbG9jYXRlIGFuIG9iamVjdCBmcm9tIHRoaXMgY2FjaGUgYW5kIHNldCB0aGUgYWxsb2NhdGVkIG1lbW9yeSB0byB6ZXJvLgotICogVGhlIGZsYWdzIGFyZSBvbmx5IHJlbGV2YW50IGlmIHRoZSBjYWNoZSBoYXMgbm8gYXZhaWxhYmxlIG9iamVjdHMuCi0gKi8KLXZvaWQgKmttZW1fY2FjaGVfemFsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqcmV0ID0gX19jYWNoZV9hbGxvYyhjYWNoZSwgZmxhZ3MsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JaWYgKHJldCkKLQkJbWVtc2V0KHJldCwgMCwgb2JqX3NpemUoY2FjaGUpKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3phbGxvYyk7Ci0KLS8qKgogICoga21lbV9wdHJfdmFsaWRhdGUgLSBjaGVjayBpZiBhbiB1bnRydXN0ZWQgcG9pbnRlciBtaWdodAogICoJYmUgYSBzbGFiIGVudHJ5LgogICogQGNhY2hlcDogdGhlIGNhY2hlIHdlJ3JlIGNoZWNraW5nIGFnYWluc3QKQEAgLTM2NTMsOCArMzY0NSw4IEBACiAJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKIAogCWNhY2hlcCA9IGttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplLCBmbGFncyk7Ci0JaWYgKHVubGlrZWx5KGNhY2hlcCA9PSBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7CisJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIoY2FjaGVwKSkpCisJCXJldHVybiBjYWNoZXA7CiAJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBub2RlKTsKIH0KIApAQCAtMzcyNiw1MiArMzcxOCw2IEBACiAjZW5kaWYKIAogLyoqCi0gKiBrcmVhbGxvYyAtIHJlYWxsb2NhdGUgbWVtb3J5LiBUaGUgY29udGVudHMgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgotICogQHA6IG9iamVjdCB0byByZWFsbG9jYXRlIG1lbW9yeSBmb3IuCi0gKiBAbmV3X3NpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBwb2ludGVkIHRvIGFyZSBwcmVzZXJ2ZWQgdXAgdG8gdGhlCi0gKiBsZXNzZXIgb2YgdGhlIG5ldyBhbmQgb2xkIHNpemVzLiAgSWYgQHAgaXMgJU5VTEwsIGtyZWFsbG9jKCkKLSAqIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGttYWxsb2MoKS4gIElmIEBzaXplIGlzIDAgYW5kIEBwIGlzIG5vdCBhCi0gKiAlTlVMTCBwb2ludGVyLCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gaXMgZnJlZWQuCi0gKi8KLXZvaWQgKmtyZWFsbG9jKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBuZXdfc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLCAqbmV3X2NhY2hlOwotCXZvaWQgKnJldDsKLQotCWlmICh1bmxpa2VseSghcCkpCi0JCXJldHVybiBrbWFsbG9jX3RyYWNrX2NhbGxlcihuZXdfc2l6ZSwgZmxhZ3MpOwotCi0JaWYgKHVubGlrZWx5KCFuZXdfc2l6ZSkpIHsKLQkJa2ZyZWUocCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNhY2hlID0gdmlydF90b19jYWNoZShwKTsKLQluZXdfY2FjaGUgPSBfX2ZpbmRfZ2VuZXJhbF9jYWNoZXAobmV3X3NpemUsIGZsYWdzKTsKLQotCS8qCi0gCSAqIElmIG5ldyBzaXplIGZpdHMgaW4gdGhlIGN1cnJlbnQgY2FjaGUsIGJhaWwgb3V0LgotIAkgKi8KLQlpZiAobGlrZWx5KGNhY2hlID09IG5ld19jYWNoZSkpCi0JCXJldHVybiAodm9pZCAqKXA7Ci0KLQkvKgotIAkgKiBXZSBhcmUgb24gdGhlIHNsb3ctcGF0aCBoZXJlIHNvIGRvIG5vdCB1c2UgX19jYWNoZV9hbGxvYwotIAkgKiBiZWNhdXNlIGl0IGJsb2F0cyBrZXJuZWwgdGV4dC4KLSAJICovCi0JcmV0ID0ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKLQlpZiAocmV0KSB7Ci0JCW1lbWNweShyZXQsIHAsIG1pbihuZXdfc2l6ZSwga3NpemUocCkpKTsKLQkJa2ZyZWUocCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGtyZWFsbG9jKTsKLQotLyoqCiAgKiBrbWVtX2NhY2hlX2ZyZWUgLSBEZWFsbG9jYXRlIGFuIG9iamVjdAogICogQGNhY2hlcDogVGhlIGNhY2hlIHRoZSBhbGxvY2F0aW9uIHdhcyBmcm9tLgogICogQG9ianA6IFRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBvYmplY3QuCkBAIC0zODA2LDcgKzM3NTIsNyBAQAogCXN0cnVjdCBrbWVtX2NhY2hlICpjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAodW5saWtlbHkoIW9ianApKQorCWlmICh1bmxpa2VseShaRVJPX09SX05VTExfUFRSKG9ianApKSkKIAkJcmV0dXJuOwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlrZnJlZV9kZWJ1Z2NoZWNrKG9ianApOwpAQCAtNDE1NywyNiArNDEwMywxNyBAQAogc3RhdGljIHZvaWQgKnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKIAlsb2ZmX3QgbiA9ICpwb3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAogCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAlpZiAoIW4pCiAJCXByaW50X3NsYWJpbmZvX2hlYWRlcihtKTsKLQlwID0gY2FjaGVfY2hhaW4ubmV4dDsKLQl3aGlsZSAobi0tKSB7Ci0JCXAgPSBwLT5uZXh0OwotCQlpZiAocCA9PSAmY2FjaGVfY2hhaW4pCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGxpc3RfZW50cnkocCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOworCisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZjYWNoZV9jaGFpbiwgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICpzX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gcDsKLQkrKypwb3M7Ci0JcmV0dXJuIGNhY2hlcC0+bmV4dC5uZXh0ID09ICZjYWNoZV9jaGFpbiA/Ci0JCU5VTEwgOiBsaXN0X2VudHJ5KGNhY2hlcC0+bmV4dC5uZXh0LCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CisJcmV0dXJuIHNlcV9saXN0X25leHQocCwgJmNhY2hlX2NoYWluLCBwb3MpOwogfQogCiBzdGF0aWMgdm9pZCBzX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQpAQCAtNDE4Niw3ICs0MTIzLDcgQEAKIAogc3RhdGljIGludCBzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewotCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBrbWVtX2NhY2hlLCBuZXh0KTsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJdW5zaWduZWQgbG9uZyBhY3RpdmVfb2JqczsKIAl1bnNpZ25lZCBsb25nIG51bV9vYmpzOwpAQCAtNDM1NSwxNyArNDI5Miw4IEBACiAKIHN0YXRpYyB2b2lkICpsZWFrc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewotCWxvZmZfdCBuID0gKnBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCiAJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwotCXAgPSBjYWNoZV9jaGFpbi5uZXh0OwotCXdoaWxlIChuLS0pIHsKLQkJcCA9IHAtPm5leHQ7Ci0JCWlmIChwID09ICZjYWNoZV9jaGFpbikKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CisJcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZjYWNoZV9jaGFpbiwgKnBvcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9jYWxsZXIodW5zaWduZWQgbG9uZyAqbiwgdW5zaWduZWQgbG9uZyB2KQpAQCAtNDQxNiw3ICs0MzQ0LDcgQEAKIHsKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKLQljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOICsgMV0sIG5hbWVbS1NZTV9OQU1FX0xFTiArIDFdOworCWNoYXIgbW9kbmFtZVtNT0RVTEVfTkFNRV9MRU5dLCBuYW1lW0tTWU1fTkFNRV9MRU5dOwogCiAJaWYgKGxvb2t1cF9zeW1ib2xfYXR0cnMoYWRkcmVzcywgJnNpemUsICZvZmZzZXQsIG1vZG5hbWUsIG5hbWUpID09IDApIHsKIAkJc2VxX3ByaW50ZihtLCAiJXMrJSNseC8lI2x4IiwgbmFtZSwgb2Zmc2V0LCBzaXplKTsKQEAgLTQ0MzAsNyArNDM1OCw3IEBACiAKIHN0YXRpYyBpbnQgbGVha3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IHA7CisJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOwogCXN0cnVjdCBzbGFiICpzbGFicDsKIAlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTQ1MTEsNyArNDQzOSw3IEBACiAgKi8KIHNpemVfdCBrc2l6ZShjb25zdCB2b2lkICpvYmpwKQogewotCWlmICh1bmxpa2VseShvYmpwID09IE5VTEwpKQorCWlmICh1bmxpa2VseShaRVJPX09SX05VTExfUFRSKG9ianApKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gb2JqX3NpemUodmlydF90b19jYWNoZShvYmpwKSk7CmRpZmYgLS1naXQgYS9tbS9zbG9iLmMgYi9tbS9zbG9iLmMKaW5kZXggNzE5NzZjNS4uYzg5ZWYxMSAxMDA2NDQKLS0tIGEvbW0vc2xvYi5jCisrKyBiL21tL3Nsb2IuYwpAQCAtMyw1NyArMywxNTkgQEAKICAqCiAgKiBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4gMTIvMzAvMDMKICAqCisgKiBOVU1BIHN1cHBvcnQgYnkgUGF1bCBNdW5kdCwgMjAwNy4KKyAqCiAgKiBIb3cgU0xPQiB3b3JrczoKICAqCiAgKiBUaGUgY29yZSBvZiBTTE9CIGlzIGEgdHJhZGl0aW9uYWwgSyZSIHN0eWxlIGhlYXAgYWxsb2NhdG9yLCB3aXRoCiAgKiBzdXBwb3J0IGZvciByZXR1cm5pbmcgYWxpZ25lZCBvYmplY3RzLiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhpcwotICogYWxsb2NhdG9yIGlzIDggYnl0ZXMgb24geDg2LCB0aG91Z2ggaXQncyBwZXJoYXBzIHBvc3NpYmxlIHRvIHJlZHVjZQotICogdGhpcyB0byA0IGlmIGl0J3MgZGVlbWVkIHdvcnRoIHRoZSBlZmZvcnQuIFRoZSBzbG9iIGhlYXAgaXMgYQotICogc2luZ2x5LWxpbmtlZCBsaXN0IG9mIHBhZ2VzIGZyb20gX19nZXRfZnJlZV9wYWdlLCBncm93biBvbiBkZW1hbmQKLSAqIGFuZCBhbGxvY2F0aW9uIGZyb20gdGhlIGhlYXAgaXMgY3VycmVudGx5IGZpcnN0LWZpdC4KKyAqIGFsbG9jYXRvciBpcyBhcyBsaXR0bGUgYXMgMiBieXRlcywgaG93ZXZlciB0eXBpY2FsbHkgbW9zdCBhcmNoaXRlY3R1cmVzCisgKiB3aWxsIHJlcXVpcmUgNCBieXRlcyBvbiAzMi1iaXQgYW5kIDggYnl0ZXMgb24gNjQtYml0LgorICoKKyAqIFRoZSBzbG9iIGhlYXAgaXMgYSBsaW5rZWQgbGlzdCBvZiBwYWdlcyBmcm9tIGFsbG9jX3BhZ2VzKCksIGFuZAorICogd2l0aGluIGVhY2ggcGFnZSwgdGhlcmUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgb2YgZnJlZSBibG9ja3MgKHNsb2JfdCkuCisgKiBUaGUgaGVhcCBpcyBncm93biBvbiBkZW1hbmQgYW5kIGFsbG9jYXRpb24gZnJvbSB0aGUgaGVhcCBpcyBjdXJyZW50bHkKKyAqIGZpcnN0LWZpdC4KICAqCiAgKiBBYm92ZSB0aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGttYWxsb2Mva2ZyZWUuIEJsb2NrcyByZXR1cm5lZAotICogZnJvbSBrbWFsbG9jIGFyZSA4LWJ5dGUgYWxpZ25lZCBhbmQgcHJlcGVuZGVkIHdpdGggYSA4LWJ5dGUgaGVhZGVyLgorICogZnJvbSBrbWFsbG9jIGFyZSBwcmVwZW5kZWQgd2l0aCBhIDQtYnl0ZSBoZWFkZXIgd2l0aCB0aGUga21hbGxvYyBzaXplLgogICogSWYga21hbGxvYyBpcyBhc2tlZCBmb3Igb2JqZWN0cyBvZiBQQUdFX1NJWkUgb3IgbGFyZ2VyLCBpdCBjYWxscwotICogX19nZXRfZnJlZV9wYWdlcyBkaXJlY3RseSBzbyB0aGF0IGl0IGNhbiByZXR1cm4gcGFnZS1hbGlnbmVkIGJsb2NrcwotICogYW5kIGtlZXBzIGEgbGlua2VkIGxpc3Qgb2Ygc3VjaCBwYWdlcyBhbmQgdGhlaXIgb3JkZXJzLiBUaGVzZQotICogb2JqZWN0cyBhcmUgZGV0ZWN0ZWQgaW4ga2ZyZWUoKSBieSB0aGVpciBwYWdlIGFsaWdubWVudC4KKyAqIGFsbG9jX3BhZ2VzKCkgZGlyZWN0bHksIGFsbG9jYXRpbmcgY29tcG91bmQgcGFnZXMgc28gdGhlIHBhZ2Ugb3JkZXIKKyAqIGRvZXMgbm90IGhhdmUgdG8gYmUgc2VwYXJhdGVseSB0cmFja2VkLCBhbmQgYWxzbyBzdG9yZXMgdGhlIGV4YWN0CisgKiBhbGxvY2F0aW9uIHNpemUgaW4gcGFnZS0+cHJpdmF0ZSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGFjY3VyYXRlbHkKKyAqIHByb3ZpZGUga3NpemUoKS4gVGhlc2Ugb2JqZWN0cyBhcmUgZGV0ZWN0ZWQgaW4ga2ZyZWUoKSBiZWNhdXNlIHNsb2JfcGFnZSgpCisgKiBpcyBmYWxzZSBmb3IgdGhlbS4KICAqCiAgKiBTTEFCIGlzIGVtdWxhdGVkIG9uIHRvcCBvZiBTTE9CIGJ5IHNpbXBseSBjYWxsaW5nIGNvbnN0cnVjdG9ycyBhbmQKLSAqIGRlc3RydWN0b3JzIGZvciBldmVyeSBTTEFCIGFsbG9jYXRpb24uIE9iamVjdHMgYXJlIHJldHVybmVkIHdpdGgKLSAqIHRoZSA4LWJ5dGUgYWxpZ25tZW50IHVubGVzcyB0aGUgU0xBQl9IV0NBQ0hFX0FMSUdOIGZsYWcgaXMKLSAqIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbG93LWxldmVsIGFsbG9jYXRvciB3aWxsIGZyYWdtZW50IGJsb2NrcyB0bwotICogY3JlYXRlIHRoZSBwcm9wZXIgYWxpZ25tZW50LiBBZ2Fpbiwgb2JqZWN0cyBvZiBwYWdlLXNpemUgb3IgZ3JlYXRlcgotICogYXJlIGFsbG9jYXRlZCBieSBjYWxsaW5nIF9fZ2V0X2ZyZWVfcGFnZXMuIEFzIFNMQUIgb2JqZWN0cyBrbm93Ci0gKiB0aGVpciBzaXplLCBubyBzZXBhcmF0ZSBzaXplIGJvb2trZWVwaW5nIGlzIG5lY2Vzc2FyeSBhbmQgdGhlcmUgaXMKLSAqIGVzc2VudGlhbGx5IG5vIGFsbG9jYXRpb24gc3BhY2Ugb3ZlcmhlYWQuCisgKiBkZXN0cnVjdG9ycyBmb3IgZXZlcnkgU0xBQiBhbGxvY2F0aW9uLiBPYmplY3RzIGFyZSByZXR1cm5lZCB3aXRoIHRoZQorICogNC1ieXRlIGFsaWdubWVudCB1bmxlc3MgdGhlIFNMQUJfSFdDQUNIRV9BTElHTiBmbGFnIGlzIHNldCwgaW4gd2hpY2gKKyAqIGNhc2UgdGhlIGxvdy1sZXZlbCBhbGxvY2F0b3Igd2lsbCBmcmFnbWVudCBibG9ja3MgdG8gY3JlYXRlIHRoZSBwcm9wZXIKKyAqIGFsaWdubWVudC4gQWdhaW4sIG9iamVjdHMgb2YgcGFnZS1zaXplIG9yIGdyZWF0ZXIgYXJlIGFsbG9jYXRlZCBieQorICogY2FsbGluZyBhbGxvY19wYWdlcygpLiBBcyBTTEFCIG9iamVjdHMga25vdyB0aGVpciBzaXplLCBubyBzZXBhcmF0ZQorICogc2l6ZSBib29ra2VlcGluZyBpcyBuZWNlc3NhcnkgYW5kIHRoZXJlIGlzIGVzc2VudGlhbGx5IG5vIGFsbG9jYXRpb24KKyAqIHNwYWNlIG92ZXJoZWFkLCBhbmQgY29tcG91bmQgcGFnZXMgYXJlbid0IG5lZWRlZCBmb3IgbXVsdGktcGFnZQorICogYWxsb2NhdGlvbnMuCisgKgorICogTlVNQSBzdXBwb3J0IGluIFNMT0IgaXMgZmFpcmx5IHNpbXBsaXN0aWMsIHB1c2hpbmcgbW9zdCBvZiB0aGUgcmVhbAorICogbG9naWMgZG93biB0byB0aGUgcGFnZSBhbGxvY2F0b3IsIGFuZCBzaW1wbHkgZG9pbmcgdGhlIG5vZGUgYWNjb3VudGluZworICogb24gdGhlIHVwcGVyIGxldmVscy4gSW4gdGhlIGV2ZW50IHRoYXQgYSBub2RlIGlkIGlzIGV4cGxpY2l0bHkKKyAqIHByb3ZpZGVkLCBhbGxvY19wYWdlc19ub2RlKCkgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgaWQgaXMgdXNlZAorICogaW5zdGVhZC4gVGhlIGNvbW1vbiBjYXNlIChvciB3aGVuIHRoZSBub2RlIGlkIGlzbid0IGV4cGxpY2l0bHkgcHJvdmlkZWQpCisgKiB3aWxsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgbm9kZSwgYXMgcGVyIG51bWFfbm9kZV9pZCgpLgorICoKKyAqIE5vZGUgYXdhcmUgcGFnZXMgYXJlIHN0aWxsIGluc2VydGVkIGluIHRvIHRoZSBnbG9iYWwgZnJlZWxpc3QsIGFuZAorICogdGhlc2UgYXJlIHNjYW5uZWQgZm9yIGJ5IG1hdGNoaW5nIGFnYWluc3QgdGhlIG5vZGUgaWQgZW5jb2RlZCBpbiB0aGUKKyAqIHBhZ2UgZmxhZ3MuIEFzIGEgcmVzdWx0LCBibG9jayBhbGxvY2F0aW9ucyB0aGF0IGNhbiBiZSBzYXRpc2ZpZWQgZnJvbQorICogdGhlIGZyZWVsaXN0IHdpbGwgb25seSBiZSBkb25lIHNvIG9uIHBhZ2VzIHJlc2lkaW5nIG9uIHRoZSBzYW1lIG5vZGUsCisgKiBpbiBvcmRlciB0byBwcmV2ZW50IHJhbmRvbSBub2RlIHBsYWNlbWVudC4KICAqLwogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKy8qCisgKiBzbG9iX2Jsb2NrIGhhcyBhIGZpZWxkICd1bml0cycsIHdoaWNoIGluZGljYXRlcyBzaXplIG9mIGJsb2NrIGlmICt2ZSwKKyAqIG9yIG9mZnNldCBvZiBuZXh0IGJsb2NrIGlmIC12ZSAoaW4gU0xPQl9VTklUcykuCisgKgorICogRnJlZSBibG9ja3Mgb2Ygc2l6ZSAxIHVuaXQgc2ltcGx5IGNvbnRhaW4gdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBibG9jay4KKyAqIFRob3NlIHdpdGggbGFyZ2VyIHNpemUgY29udGFpbiB0aGVpciBzaXplIGluIHRoZSBmaXJzdCBTTE9CX1VOSVQgb2YKKyAqIG1lbW9yeSwgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgZnJlZSBibG9jayBpbiB0aGUgc2Vjb25kIFNMT0JfVU5JVC4KKyAqLworI2lmIFBBR0VfU0laRSA8PSAoMzI3NjcgKiAyKQordHlwZWRlZiBzMTYgc2xvYmlkeF90OworI2Vsc2UKK3R5cGVkZWYgczMyIHNsb2JpZHhfdDsKKyNlbmRpZgogCiBzdHJ1Y3Qgc2xvYl9ibG9jayB7Ci0JaW50IHVuaXRzOwotCXN0cnVjdCBzbG9iX2Jsb2NrICpuZXh0OworCXNsb2JpZHhfdCB1bml0czsKIH07CiB0eXBlZGVmIHN0cnVjdCBzbG9iX2Jsb2NrIHNsb2JfdDsKIAorLyoKKyAqIFdlIHVzZSBzdHJ1Y3QgcGFnZSBmaWVsZHMgdG8gbWFuYWdlIHNvbWUgc2xvYiBhbGxvY2F0aW9uIGFzcGVjdHMsCisgKiBob3dldmVyIHRvIGF2b2lkIHRoZSBob3JyaWJsZSBtZXNzIGluIGluY2x1ZGUvbGludXgvbW1fdHlwZXMuaCwgd2UnbGwKKyAqIGp1c3QgZGVmaW5lIG91ciBvd24gc3RydWN0IHBhZ2UgdHlwZSB2YXJpYW50IGhlcmUuCisgKi8KK3N0cnVjdCBzbG9iX3BhZ2UgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIG1hbmRhdG9yeSAqLworCQkJYXRvbWljX3QgX2NvdW50OwkvKiBtYW5kYXRvcnkgKi8KKwkJCXNsb2JpZHhfdCB1bml0czsJLyogZnJlZSB1bml0cyBsZWZ0IGluIHBhZ2UgKi8KKwkJCXVuc2lnbmVkIGxvbmcgcGFkWzJdOworCQkJc2xvYl90ICpmcmVlOwkJLyogZmlyc3QgZnJlZSBzbG9iX3QgaW4gcGFnZSAqLworCQkJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBsaW5rZWQgbGlzdCBvZiBmcmVlIHBhZ2VzICovCisJCX07CisJCXN0cnVjdCBwYWdlIHBhZ2U7CisJfTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgc3RydWN0X3Nsb2JfcGFnZV93cm9uZ19zaXplKHZvaWQpCit7IEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHNsb2JfcGFnZSkgIT0gc2l6ZW9mKHN0cnVjdCBwYWdlKSk7IH0KKworLyoKKyAqIGZyZWVfc2xvYl9wYWdlOiBjYWxsIGJlZm9yZSBhIHNsb2JfcGFnZSBpcyByZXR1cm5lZCB0byB0aGUgcGFnZSBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3Nsb2JfcGFnZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlyZXNldF9wYWdlX21hcGNvdW50KCZzcC0+cGFnZSk7CisJc3AtPnBhZ2UubWFwcGluZyA9IE5VTEw7Cit9CisKKy8qCisgKiBBbGwgKHBhcnRpYWxseSkgZnJlZSBzbG9iIHBhZ2VzIGdvIG9uIHRoaXMgbGlzdC4KKyAqLworc3RhdGljIExJU1RfSEVBRChmcmVlX3Nsb2JfcGFnZXMpOworCisvKgorICogc2xvYl9wYWdlOiBUcnVlIGZvciBhbGwgc2xvYiBwYWdlcyAoZmFsc2UgZm9yIGJpZ2Jsb2NrIHBhZ2VzKQorICovCitzdGF0aWMgaW5saW5lIGludCBzbG9iX3BhZ2Uoc3RydWN0IHNsb2JfcGFnZSAqc3ApCit7CisJcmV0dXJuIHRlc3RfYml0KFBHX2FjdGl2ZSwgJnNwLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2xvYl9wYWdlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCV9fc2V0X2JpdChQR19hY3RpdmUsICZzcC0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc2xvYl9wYWdlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCV9fY2xlYXJfYml0KFBHX2FjdGl2ZSwgJnNwLT5mbGFncyk7Cit9CisKKy8qCisgKiBzbG9iX3BhZ2VfZnJlZTogdHJ1ZSBmb3IgcGFnZXMgb24gZnJlZV9zbG9iX3BhZ2VzIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNsb2JfcGFnZV9mcmVlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCXJldHVybiB0ZXN0X2JpdChQR19wcml2YXRlLCAmc3AtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9zbG9iX3BhZ2VfZnJlZShzdHJ1Y3Qgc2xvYl9wYWdlICpzcCkKK3sKKwlsaXN0X2FkZCgmc3AtPmxpc3QsICZmcmVlX3Nsb2JfcGFnZXMpOworCV9fc2V0X2JpdChQR19wcml2YXRlLCAmc3AtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3Nsb2JfcGFnZV9mcmVlKHN0cnVjdCBzbG9iX3BhZ2UgKnNwKQoreworCWxpc3RfZGVsKCZzcC0+bGlzdCk7CisJX19jbGVhcl9iaXQoUEdfcHJpdmF0ZSwgJnNwLT5mbGFncyk7Cit9CisKICNkZWZpbmUgU0xPQl9VTklUIHNpemVvZihzbG9iX3QpCiAjZGVmaW5lIFNMT0JfVU5JVFMoc2l6ZSkgKCgoc2l6ZSkgKyBTTE9CX1VOSVQgLSAxKS9TTE9CX1VOSVQpCiAjZGVmaW5lIFNMT0JfQUxJR04gTDFfQ0FDSEVfQllURVMKIAotc3RydWN0IGJpZ2Jsb2NrIHsKLQlpbnQgb3JkZXI7Ci0Jdm9pZCAqcGFnZXM7Ci0Jc3RydWN0IGJpZ2Jsb2NrICpuZXh0OwotfTsKLXR5cGVkZWYgc3RydWN0IGJpZ2Jsb2NrIGJpZ2Jsb2NrX3Q7Ci0KIC8qCiAgKiBzdHJ1Y3Qgc2xvYl9yY3UgaXMgaW5zZXJ0ZWQgYXQgdGhlIHRhaWwgb2YgYWxsb2NhdGVkIHNsb2IgYmxvY2tzLCB3aGljaAogICogd2VyZSBjcmVhdGVkIHdpdGggYSBTTEFCX0RFU1RST1lfQllfUkNVIHNsYWIuIHNsb2JfcmN1IGlzIHVzZWQgdG8gZnJlZQpAQCAtNjQsMjE1ICsxNjYsMzIxIEBACiAJaW50IHNpemU7CiB9OwogCi1zdGF0aWMgc2xvYl90IGFyZW5hID0geyAubmV4dCA9ICZhcmVuYSwgLnVuaXRzID0gMSB9Owotc3RhdGljIHNsb2JfdCAqc2xvYmZyZWUgPSAmYXJlbmE7Ci1zdGF0aWMgYmlnYmxvY2tfdCAqYmlnYmxvY2tzOworLyoKKyAqIHNsb2JfbG9jayBwcm90ZWN0cyBhbGwgc2xvYiBhbGxvY2F0b3Igc3RydWN0dXJlcy4KKyAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhzbG9iX2xvY2spOwotc3RhdGljIERFRklORV9TUElOTE9DSyhibG9ja19sb2NrKTsKIAotc3RhdGljIHZvaWQgc2xvYl9mcmVlKHZvaWQgKmIsIGludCBzaXplKTsKLXN0YXRpYyB2b2lkIHNsb2JfdGltZXJfY2JrKHZvaWQpOworLyoKKyAqIEVuY29kZSB0aGUgZ2l2ZW4gc2l6ZSBhbmQgbmV4dCBpbmZvIGludG8gYSBmcmVlIHNsb2IgYmxvY2sgcy4KKyAqLworc3RhdGljIHZvaWQgc2V0X3Nsb2Ioc2xvYl90ICpzLCBzbG9iaWR4X3Qgc2l6ZSwgc2xvYl90ICpuZXh0KQoreworCXNsb2JfdCAqYmFzZSA9IChzbG9iX3QgKikoKHVuc2lnbmVkIGxvbmcpcyAmIFBBR0VfTUFTSyk7CisJc2xvYmlkeF90IG9mZnNldCA9IG5leHQgLSBiYXNlOwogCisJaWYgKHNpemUgPiAxKSB7CisJCXNbMF0udW5pdHMgPSBzaXplOworCQlzWzFdLnVuaXRzID0gb2Zmc2V0OworCX0gZWxzZQorCQlzWzBdLnVuaXRzID0gLW9mZnNldDsKK30KIAotc3RhdGljIHZvaWQgKnNsb2JfYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGdmcCwgaW50IGFsaWduKQorLyoKKyAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIHNsb2IgYmxvY2suCisgKi8KK3N0YXRpYyBzbG9iaWR4X3Qgc2xvYl91bml0cyhzbG9iX3QgKnMpCit7CisJaWYgKHMtPnVuaXRzID4gMCkKKwkJcmV0dXJuIHMtPnVuaXRzOworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJuIHRoZSBuZXh0IGZyZWUgc2xvYiBibG9jayBwb2ludGVyIGFmdGVyIHRoaXMgb25lLgorICovCitzdGF0aWMgc2xvYl90ICpzbG9iX25leHQoc2xvYl90ICpzKQoreworCXNsb2JfdCAqYmFzZSA9IChzbG9iX3QgKikoKHVuc2lnbmVkIGxvbmcpcyAmIFBBR0VfTUFTSyk7CisJc2xvYmlkeF90IG5leHQ7CisKKwlpZiAoc1swXS51bml0cyA8IDApCisJCW5leHQgPSAtc1swXS51bml0czsKKwllbHNlCisJCW5leHQgPSBzWzFdLnVuaXRzOworCXJldHVybiBiYXNlK25leHQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgcyBpcyB0aGUgbGFzdCBmcmVlIGJsb2NrIGluIGl0cyBwYWdlLgorICovCitzdGF0aWMgaW50IHNsb2JfbGFzdChzbG9iX3QgKnMpCit7CisJcmV0dXJuICEoKHVuc2lnbmVkIGxvbmcpc2xvYl9uZXh0KHMpICYgflBBR0VfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkICpzbG9iX25ld19wYWdlKGdmcF90IGdmcCwgaW50IG9yZGVyLCBpbnQgbm9kZSkKK3sKKwl2b2lkICpwYWdlOworCisjaWZkZWYgQ09ORklHX05VTUEKKwlpZiAobm9kZSAhPSAtMSkKKwkJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZ2ZwLCBvcmRlcik7CisJZWxzZQorI2VuZGlmCisJCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnAsIG9yZGVyKTsKKworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOworfQorCisvKgorICogQWxsb2NhdGUgYSBzbG9iIGJsb2NrIHdpdGhpbiBhIGdpdmVuIHNsb2JfcGFnZSBzcC4KKyAqLworc3RhdGljIHZvaWQgKnNsb2JfcGFnZV9hbGxvYyhzdHJ1Y3Qgc2xvYl9wYWdlICpzcCwgc2l6ZV90IHNpemUsIGludCBhbGlnbikKIHsKIAlzbG9iX3QgKnByZXYsICpjdXIsICphbGlnbmVkID0gMDsKIAlpbnQgZGVsdGEgPSAwLCB1bml0cyA9IFNMT0JfVU5JVFMoc2l6ZSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKLQlwcmV2ID0gc2xvYmZyZWU7Ci0JZm9yIChjdXIgPSBwcmV2LT5uZXh0OyA7IHByZXYgPSBjdXIsIGN1ciA9IGN1ci0+bmV4dCkgeworCWZvciAocHJldiA9IE5VTEwsIGN1ciA9IHNwLT5mcmVlOyA7IHByZXYgPSBjdXIsIGN1ciA9IHNsb2JfbmV4dChjdXIpKSB7CisJCXNsb2JpZHhfdCBhdmFpbCA9IHNsb2JfdW5pdHMoY3VyKTsKKwogCQlpZiAoYWxpZ24pIHsKIAkJCWFsaWduZWQgPSAoc2xvYl90ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpY3VyLCBhbGlnbik7CiAJCQlkZWx0YSA9IGFsaWduZWQgLSBjdXI7CiAJCX0KLQkJaWYgKGN1ci0+dW5pdHMgPj0gdW5pdHMgKyBkZWx0YSkgeyAvKiByb29tIGVub3VnaD8gKi8KKwkJaWYgKGF2YWlsID49IHVuaXRzICsgZGVsdGEpIHsgLyogcm9vbSBlbm91Z2g/ICovCisJCQlzbG9iX3QgKm5leHQ7CisKIAkJCWlmIChkZWx0YSkgeyAvKiBuZWVkIHRvIGZyYWdtZW50IGhlYWQgdG8gYWxpZ24/ICovCi0JCQkJYWxpZ25lZC0+dW5pdHMgPSBjdXItPnVuaXRzIC0gZGVsdGE7Ci0JCQkJYWxpZ25lZC0+bmV4dCA9IGN1ci0+bmV4dDsKLQkJCQljdXItPm5leHQgPSBhbGlnbmVkOwotCQkJCWN1ci0+dW5pdHMgPSBkZWx0YTsKKwkJCQluZXh0ID0gc2xvYl9uZXh0KGN1cik7CisJCQkJc2V0X3Nsb2IoYWxpZ25lZCwgYXZhaWwgLSBkZWx0YSwgbmV4dCk7CisJCQkJc2V0X3Nsb2IoY3VyLCBkZWx0YSwgYWxpZ25lZCk7CiAJCQkJcHJldiA9IGN1cjsKIAkJCQljdXIgPSBhbGlnbmVkOworCQkJCWF2YWlsID0gc2xvYl91bml0cyhjdXIpOwogCQkJfQogCi0JCQlpZiAoY3VyLT51bml0cyA9PSB1bml0cykgLyogZXhhY3QgZml0PyAqLwotCQkJCXByZXYtPm5leHQgPSBjdXItPm5leHQ7IC8qIHVubGluayAqLwotCQkJZWxzZSB7IC8qIGZyYWdtZW50ICovCi0JCQkJcHJldi0+bmV4dCA9IGN1ciArIHVuaXRzOwotCQkJCXByZXYtPm5leHQtPnVuaXRzID0gY3VyLT51bml0cyAtIHVuaXRzOwotCQkJCXByZXYtPm5leHQtPm5leHQgPSBjdXItPm5leHQ7Ci0JCQkJY3VyLT51bml0cyA9IHVuaXRzOworCQkJbmV4dCA9IHNsb2JfbmV4dChjdXIpOworCQkJaWYgKGF2YWlsID09IHVuaXRzKSB7IC8qIGV4YWN0IGZpdD8gdW5saW5rLiAqLworCQkJCWlmIChwcmV2KQorCQkJCQlzZXRfc2xvYihwcmV2LCBzbG9iX3VuaXRzKHByZXYpLCBuZXh0KTsKKwkJCQllbHNlCisJCQkJCXNwLT5mcmVlID0gbmV4dDsKKwkJCX0gZWxzZSB7IC8qIGZyYWdtZW50ICovCisJCQkJaWYgKHByZXYpCisJCQkJCXNldF9zbG9iKHByZXYsIHNsb2JfdW5pdHMocHJldiksIGN1ciArIHVuaXRzKTsKKwkJCQllbHNlCisJCQkJCXNwLT5mcmVlID0gY3VyICsgdW5pdHM7CisJCQkJc2V0X3Nsb2IoY3VyICsgdW5pdHMsIGF2YWlsIC0gdW5pdHMsIG5leHQpOwogCQkJfQogCi0JCQlzbG9iZnJlZSA9IHByZXY7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG9iX2xvY2ssIGZsYWdzKTsKKwkJCXNwLT51bml0cyAtPSB1bml0czsKKwkJCWlmICghc3AtPnVuaXRzKQorCQkJCWNsZWFyX3Nsb2JfcGFnZV9mcmVlKHNwKTsKIAkJCXJldHVybiBjdXI7CiAJCX0KLQkJaWYgKGN1ciA9PSBzbG9iZnJlZSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChzaXplID09IFBBR0VfU0laRSkgLyogdHJ5aW5nIHRvIHNocmluayBhcmVuYT8gKi8KLQkJCQlyZXR1cm4gMDsKLQotCQkJY3VyID0gKHNsb2JfdCAqKV9fZ2V0X2ZyZWVfcGFnZShnZnApOwotCQkJaWYgKCFjdXIpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCXNsb2JfZnJlZShjdXIsIFBBR0VfU0laRSk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2xvYl9sb2NrLCBmbGFncyk7Ci0JCQljdXIgPSBzbG9iZnJlZTsKLQkJfQorCQlpZiAoc2xvYl9sYXN0KGN1cikpCisJCQlyZXR1cm4gTlVMTDsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNsb2JfZnJlZSh2b2lkICpibG9jaywgaW50IHNpemUpCisvKgorICogc2xvYl9hbGxvYzogZW50cnkgcG9pbnQgaW50byB0aGUgc2xvYiBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyB2b2lkICpzbG9iX2FsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBnZnAsIGludCBhbGlnbiwgaW50IG5vZGUpCiB7Ci0Jc2xvYl90ICpjdXIsICpiID0gKHNsb2JfdCAqKWJsb2NrOworCXN0cnVjdCBzbG9iX3BhZ2UgKnNwOworCXNsb2JfdCAqYiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghYmxvY2spCi0JCXJldHVybjsKLQotCWlmIChzaXplKQotCQliLT51bml0cyA9IFNMT0JfVU5JVFMoc2l6ZSk7Ci0KLQkvKiBGaW5kIHJlaW5zZXJ0aW9uIHBvaW50ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOwotCWZvciAoY3VyID0gc2xvYmZyZWU7ICEoYiA+IGN1ciAmJiBiIDwgY3VyLT5uZXh0KTsgY3VyID0gY3VyLT5uZXh0KQotCQlpZiAoY3VyID49IGN1ci0+bmV4dCAmJiAoYiA+IGN1ciB8fCBiIDwgY3VyLT5uZXh0KSkKLQkJCWJyZWFrOworCS8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHBhcnRpYWxseSBmcmVlIHBhZ2UsIHRyeSB0byBmaW5kIHJvb20gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwLCAmZnJlZV9zbG9iX3BhZ2VzLCBsaXN0KSB7CisjaWZkZWYgQ09ORklHX05VTUEKKwkJLyoKKwkJICogSWYgdGhlcmUncyBhIG5vZGUgc3BlY2lmaWNhdGlvbiwgc2VhcmNoIGZvciBhIHBhcnRpYWwKKwkJICogcGFnZSB3aXRoIGEgbWF0Y2hpbmcgbm9kZSBpZCBpbiB0aGUgZnJlZWxpc3QuCisJCSAqLworCQlpZiAobm9kZSAhPSAtMSAmJiBwYWdlX3RvX25pZCgmc3AtPnBhZ2UpICE9IG5vZGUpCisJCQljb250aW51ZTsKKyNlbmRpZgogCi0JaWYgKGIgKyBiLT51bml0cyA9PSBjdXItPm5leHQpIHsKLQkJYi0+dW5pdHMgKz0gY3VyLT5uZXh0LT51bml0czsKLQkJYi0+bmV4dCA9IGN1ci0+bmV4dC0+bmV4dDsKLQl9IGVsc2UKLQkJYi0+bmV4dCA9IGN1ci0+bmV4dDsKKwkJaWYgKHNwLT51bml0cyA+PSBTTE9CX1VOSVRTKHNpemUpKSB7CisJCQliID0gc2xvYl9wYWdlX2FsbG9jKHNwLCBzaXplLCBhbGlnbik7CisJCQlpZiAoYikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG9iX2xvY2ssIGZsYWdzKTsKIAotCWlmIChjdXIgKyBjdXItPnVuaXRzID09IGIpIHsKLQkJY3VyLT51bml0cyArPSBiLT51bml0czsKLQkJY3VyLT5uZXh0ID0gYi0+bmV4dDsKLQl9IGVsc2UKLQkJY3VyLT5uZXh0ID0gYjsKKwkvKiBOb3QgZW5vdWdoIHNwYWNlOiBtdXN0IGFsbG9jYXRlIGEgbmV3IHBhZ2UgKi8KKwlpZiAoIWIpIHsKKwkJYiA9IHNsb2JfbmV3X3BhZ2UoZ2ZwLCAwLCBub2RlKTsKKwkJaWYgKCFiKQorCQkJcmV0dXJuIDA7CisJCXNwID0gKHN0cnVjdCBzbG9iX3BhZ2UgKil2aXJ0X3RvX3BhZ2UoYik7CisJCXNldF9zbG9iX3BhZ2Uoc3ApOwogCi0Jc2xvYmZyZWUgPSBjdXI7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzbG9iX2xvY2ssIGZsYWdzKTsKKwkJc3AtPnVuaXRzID0gU0xPQl9VTklUUyhQQUdFX1NJWkUpOworCQlzcC0+ZnJlZSA9IGI7CisJCUlOSVRfTElTVF9IRUFEKCZzcC0+bGlzdCk7CisJCXNldF9zbG9iKGIsIFNMT0JfVU5JVFMoUEFHRV9TSVpFKSwgYiArIFNMT0JfVU5JVFMoUEFHRV9TSVpFKSk7CisJCXNldF9zbG9iX3BhZ2VfZnJlZShzcCk7CisJCWIgPSBzbG9iX3BhZ2VfYWxsb2Moc3AsIHNpemUsIGFsaWduKTsKKwkJQlVHX09OKCFiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2xvYl9sb2NrLCBmbGFncyk7CisJfQorCWlmICh1bmxpa2VseSgoZ2ZwICYgX19HRlBfWkVSTykgJiYgYikpCisJCW1lbXNldChiLCAwLCBzaXplKTsKKwlyZXR1cm4gYjsKK30KIAorLyoKKyAqIHNsb2JfZnJlZTogZW50cnkgcG9pbnQgaW50byB0aGUgc2xvYiBhbGxvY2F0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHNsb2JfZnJlZSh2b2lkICpibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IHNsb2JfcGFnZSAqc3A7CisJc2xvYl90ICpwcmV2LCAqbmV4dCwgKmIgPSAoc2xvYl90ICopYmxvY2s7CisJc2xvYmlkeF90IHVuaXRzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoWkVST19PUl9OVUxMX1BUUihibG9jaykpCisJCXJldHVybjsKKwlCVUdfT04oIXNpemUpOworCisJc3AgPSAoc3RydWN0IHNsb2JfcGFnZSAqKXZpcnRfdG9fcGFnZShibG9jayk7CisJdW5pdHMgPSBTTE9CX1VOSVRTKHNpemUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNsb2JfbG9jaywgZmxhZ3MpOworCisJaWYgKHNwLT51bml0cyArIHVuaXRzID09IFNMT0JfVU5JVFMoUEFHRV9TSVpFKSkgeworCQkvKiBHbyBkaXJlY3RseSB0byBwYWdlIGFsbG9jYXRvci4gRG8gbm90IHBhc3Mgc2xvYiBhbGxvY2F0b3IgKi8KKwkJaWYgKHNsb2JfcGFnZV9mcmVlKHNwKSkKKwkJCWNsZWFyX3Nsb2JfcGFnZV9mcmVlKHNwKTsKKwkJY2xlYXJfc2xvYl9wYWdlKHNwKTsKKwkJZnJlZV9zbG9iX3BhZ2Uoc3ApOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc2xvYl9wYWdlX2ZyZWUoc3ApKSB7CisJCS8qIFRoaXMgc2xvYiBwYWdlIGlzIGFib3V0IHRvIGJlY29tZSBwYXJ0aWFsbHkgZnJlZS4gRWFzeSEgKi8KKwkJc3AtPnVuaXRzID0gdW5pdHM7CisJCXNwLT5mcmVlID0gYjsKKwkJc2V0X3Nsb2IoYiwgdW5pdHMsCisJCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYiArCisJCQkJCVNMT0JfVU5JVFMoUEFHRV9TSVpFKSkgJiBQQUdFX01BU0spKTsKKwkJc2V0X3Nsb2JfcGFnZV9mcmVlKHNwKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBPdGhlcndpc2UgdGhlIHBhZ2UgaXMgYWxyZWFkeSBwYXJ0aWFsbHkgZnJlZSwgc28gZmluZCByZWluc2VydGlvbgorCSAqIHBvaW50LgorCSAqLworCXNwLT51bml0cyArPSB1bml0czsKKworCWlmIChiIDwgc3AtPmZyZWUpIHsKKwkJc2V0X3Nsb2IoYiwgdW5pdHMsIHNwLT5mcmVlKTsKKwkJc3AtPmZyZWUgPSBiOworCX0gZWxzZSB7CisJCXByZXYgPSBzcC0+ZnJlZTsKKwkJbmV4dCA9IHNsb2JfbmV4dChwcmV2KTsKKwkJd2hpbGUgKGIgPiBuZXh0KSB7CisJCQlwcmV2ID0gbmV4dDsKKwkJCW5leHQgPSBzbG9iX25leHQocHJldik7CisJCX0KKworCQlpZiAoIXNsb2JfbGFzdChwcmV2KSAmJiBiICsgdW5pdHMgPT0gbmV4dCkgeworCQkJdW5pdHMgKz0gc2xvYl91bml0cyhuZXh0KTsKKwkJCXNldF9zbG9iKGIsIHVuaXRzLCBzbG9iX25leHQobmV4dCkpOworCQl9IGVsc2UKKwkJCXNldF9zbG9iKGIsIHVuaXRzLCBuZXh0KTsKKworCQlpZiAocHJldiArIHNsb2JfdW5pdHMocHJldikgPT0gYikgeworCQkJdW5pdHMgPSBzbG9iX3VuaXRzKGIpICsgc2xvYl91bml0cyhwcmV2KTsKKwkJCXNldF9zbG9iKHByZXYsIHVuaXRzLCBzbG9iX25leHQoYikpOworCQl9IGVsc2UKKwkJCXNldF9zbG9iKHByZXYsIHNsb2JfdW5pdHMocHJldiksIGIpOworCX0KK291dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG9iX2xvY2ssIGZsYWdzKTsKIH0KIAotdm9pZCAqX19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBnZnApCi17Ci0Jc2xvYl90ICptOwotCWJpZ2Jsb2NrX3QgKmJiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoc2l6ZSA8IFBBR0VfU0laRSAtIFNMT0JfVU5JVCkgewotCQltID0gc2xvYl9hbGxvYyhzaXplICsgU0xPQl9VTklULCBnZnAsIDApOwotCQlyZXR1cm4gbSA/ICh2b2lkICopKG0gKyAxKSA6IDA7Ci0JfQotCi0JYmIgPSBzbG9iX2FsbG9jKHNpemVvZihiaWdibG9ja190KSwgZ2ZwLCAwKTsKLQlpZiAoIWJiKQotCQlyZXR1cm4gMDsKLQotCWJiLT5vcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQliYi0+cGFnZXMgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBiYi0+b3JkZXIpOwotCi0JaWYgKGJiLT5wYWdlcykgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCQliYi0+bmV4dCA9IGJpZ2Jsb2NrczsKLQkJYmlnYmxvY2tzID0gYmI7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIGJiLT5wYWdlczsKLQl9Ci0KLQlzbG9iX2ZyZWUoYmIsIHNpemVvZihiaWdibG9ja190KSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fa21hbGxvYyk7Ci0KLS8qKgotICoga3JlYWxsb2MgLSByZWFsbG9jYXRlIG1lbW9yeS4gVGhlIGNvbnRlbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KLSAqCi0gKiBAcDogb2JqZWN0IHRvIHJlYWxsb2NhdGUgbWVtb3J5IGZvci4KLSAqIEBuZXdfc2l6ZTogaG93IG1hbnkgYnl0ZXMgb2YgbWVtb3J5IGFyZSByZXF1aXJlZC4KLSAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlLgotICoKLSAqIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYXJlIHByZXNlcnZlZCB1cCB0byB0aGUKLSAqIGxlc3NlciBvZiB0aGUgbmV3IGFuZCBvbGQgc2l6ZXMuICBJZiBAcCBpcyAlTlVMTCwga3JlYWxsb2MoKQotICogYmVoYXZlcyBleGFjdGx5IGxpa2Uga21hbGxvYygpLiAgSWYgQHNpemUgaXMgMCBhbmQgQHAgaXMgbm90IGEKLSAqICVOVUxMIHBvaW50ZXIsIHRoZSBvYmplY3QgcG9pbnRlZCB0byBpcyBmcmVlZC4KKy8qCisgKiBFbmQgb2Ygc2xvYiBhbGxvY2F0b3IgcHJvcGVyLiBCZWdpbiBrbWVtX2NhY2hlX2FsbG9jIGFuZCBrbWFsbG9jIGZyb250ZW5kLgogICovCi12b2lkICprcmVhbGxvYyhjb25zdCB2b2lkICpwLCBzaXplX3QgbmV3X3NpemUsIGdmcF90IGZsYWdzKQorCisjaWZuZGVmIEFSQ0hfS01BTExPQ19NSU5BTElHTgorI2RlZmluZSBBUkNIX0tNQUxMT0NfTUlOQUxJR04gX19hbGlnbm9mX18odW5zaWduZWQgbG9uZykKKyNlbmRpZgorCisjaWZuZGVmIEFSQ0hfU0xBQl9NSU5BTElHTgorI2RlZmluZSBBUkNIX1NMQUJfTUlOQUxJR04gX19hbGlnbm9mX18odW5zaWduZWQgbG9uZykKKyNlbmRpZgorCit2b2lkICpfX2ttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwLCBpbnQgbm9kZSkKIHsKLQl2b2lkICpyZXQ7CisJdW5zaWduZWQgaW50ICptOworCWludCBhbGlnbiA9IG1heChBUkNIX0tNQUxMT0NfTUlOQUxJR04sIEFSQ0hfU0xBQl9NSU5BTElHTik7CiAKLQlpZiAodW5saWtlbHkoIXApKQotCQlyZXR1cm4ga21hbGxvY190cmFja19jYWxsZXIobmV3X3NpemUsIGZsYWdzKTsKKwlpZiAoc2l6ZSA8IFBBR0VfU0laRSAtIGFsaWduKSB7CisJCWlmICghc2l6ZSkKKwkJCXJldHVybiBaRVJPX1NJWkVfUFRSOwogCi0JaWYgKHVubGlrZWx5KCFuZXdfc2l6ZSkpIHsKLQkJa2ZyZWUocCk7Ci0JCXJldHVybiBOVUxMOworCQltID0gc2xvYl9hbGxvYyhzaXplICsgYWxpZ24sIGdmcCwgYWxpZ24sIG5vZGUpOworCQlpZiAobSkKKwkJCSptID0gc2l6ZTsKKwkJcmV0dXJuICh2b2lkICopbSArIGFsaWduOworCX0gZWxzZSB7CisJCXZvaWQgKnJldDsKKworCQlyZXQgPSBzbG9iX25ld19wYWdlKGdmcCB8IF9fR0ZQX0NPTVAsIGdldF9vcmRlcihzaXplKSwgbm9kZSk7CisJCWlmIChyZXQpIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShyZXQpOworCQkJcGFnZS0+cHJpdmF0ZSA9IHNpemU7CisJCX0KKwkJcmV0dXJuIHJldDsKIAl9Ci0KLQlyZXQgPSBrbWFsbG9jX3RyYWNrX2NhbGxlcihuZXdfc2l6ZSwgZmxhZ3MpOwotCWlmIChyZXQpIHsKLQkJbWVtY3B5KHJldCwgcCwgbWluKG5ld19zaXplLCBrc2l6ZShwKSkpOwotCQlrZnJlZShwKTsKLQl9Ci0JcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woa3JlYWxsb2MpOworRVhQT1JUX1NZTUJPTChfX2ttYWxsb2Nfbm9kZSk7CiAKIHZvaWQga2ZyZWUoY29uc3Qgdm9pZCAqYmxvY2spCiB7Ci0JYmlnYmxvY2tfdCAqYmIsICoqbGFzdCA9ICZiaWdibG9ja3M7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2xvYl9wYWdlICpzcDsKIAotCWlmICghYmxvY2spCisJaWYgKFpFUk9fT1JfTlVMTF9QVFIoYmxvY2spKQogCQlyZXR1cm47CiAKLQlpZiAoISgodW5zaWduZWQgbG9uZylibG9jayAmIChQQUdFX1NJWkUtMSkpKSB7Ci0JCS8qIG1pZ2h0IGJlIG9uIHRoZSBiaWcgYmxvY2sgbGlzdCAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCQlmb3IgKGJiID0gYmlnYmxvY2tzOyBiYjsgbGFzdCA9ICZiYi0+bmV4dCwgYmIgPSBiYi0+bmV4dCkgewotCQkJaWYgKGJiLT5wYWdlcyA9PSBibG9jaykgewotCQkJCSpsYXN0ID0gYmItPm5leHQ7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYmxvY2ssIGJiLT5vcmRlcik7Ci0JCQkJc2xvYl9mcmVlKGJiLCBzaXplb2YoYmlnYmxvY2tfdCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibG9ja19sb2NrLCBmbGFncyk7Ci0JfQotCi0Jc2xvYl9mcmVlKChzbG9iX3QgKilibG9jayAtIDEsIDApOwotCXJldHVybjsKKwlzcCA9IChzdHJ1Y3Qgc2xvYl9wYWdlICopdmlydF90b19wYWdlKGJsb2NrKTsKKwlpZiAoc2xvYl9wYWdlKHNwKSkgeworCQlpbnQgYWxpZ24gPSBtYXgoQVJDSF9LTUFMTE9DX01JTkFMSUdOLCBBUkNIX1NMQUJfTUlOQUxJR04pOworCQl1bnNpZ25lZCBpbnQgKm0gPSAodW5zaWduZWQgaW50ICopKGJsb2NrIC0gYWxpZ24pOworCQlzbG9iX2ZyZWUobSwgKm0gKyBhbGlnbik7CisJfSBlbHNlCisJCXB1dF9wYWdlKCZzcC0+cGFnZSk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woa2ZyZWUpOwogCisvKiBjYW4ndCB1c2Uga3NpemUgZm9yIGttZW1fY2FjaGVfYWxsb2MgbWVtb3J5LCBvbmx5IGttYWxsb2MgKi8KIHNpemVfdCBrc2l6ZShjb25zdCB2b2lkICpibG9jaykKIHsKLQliaWdibG9ja190ICpiYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzbG9iX3BhZ2UgKnNwOwogCi0JaWYgKCFibG9jaykKKwlpZiAoWkVST19PUl9OVUxMX1BUUihibG9jaykpCiAJCXJldHVybiAwOwogCi0JaWYgKCEoKHVuc2lnbmVkIGxvbmcpYmxvY2sgJiAoUEFHRV9TSVpFLTEpKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCQlmb3IgKGJiID0gYmlnYmxvY2tzOyBiYjsgYmIgPSBiYi0+bmV4dCkKLQkJCWlmIChiYi0+cGFnZXMgPT0gYmxvY2spIHsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbG9iX2xvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gUEFHRV9TSVpFIDw8IGJiLT5vcmRlcjsKLQkJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxvY2tfbG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiAoKHNsb2JfdCAqKWJsb2NrIC0gMSktPnVuaXRzICogU0xPQl9VTklUOworCXNwID0gKHN0cnVjdCBzbG9iX3BhZ2UgKil2aXJ0X3RvX3BhZ2UoYmxvY2spOworCWlmIChzbG9iX3BhZ2Uoc3ApKQorCQlyZXR1cm4gKChzbG9iX3QgKilibG9jayAtIDEpLT51bml0cyArIFNMT0JfVU5JVDsKKwllbHNlCisJCXJldHVybiBzcC0+cGFnZS5wcml2YXRlOwogfQogCiBzdHJ1Y3Qga21lbV9jYWNoZSB7CkBAIC0yODksNyArNDk3LDcgQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqYzsKIAotCWMgPSBzbG9iX2FsbG9jKHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZSksIGZsYWdzLCAwKTsKKwljID0gc2xvYl9hbGxvYyhzaXplb2Yoc3RydWN0IGttZW1fY2FjaGUpLCBmbGFncywgMCwgLTEpOwogCiAJaWYgKGMpIHsKIAkJYy0+bmFtZSA9IG5hbWU7CkBAIC0zMDIsNiArNTEwLDggQEAKIAkJYy0+Y3RvciA9IGN0b3I7CiAJCS8qIGlnbm9yZSBhbGlnbm1lbnQgdW5sZXNzIGl0J3MgZm9yY2VkICovCiAJCWMtPmFsaWduID0gKGZsYWdzICYgU0xBQl9IV0NBQ0hFX0FMSUdOKSA/IFNMT0JfQUxJR04gOiAwOworCQlpZiAoYy0+YWxpZ24gPCBBUkNIX1NMQUJfTUlOQUxJR04pCisJCQljLT5hbGlnbiA9IEFSQ0hfU0xBQl9NSU5BTElHTjsKIAkJaWYgKGMtPmFsaWduIDwgYWxpZ24pCiAJCQljLT5hbGlnbiA9IGFsaWduOwogCX0gZWxzZSBpZiAoZmxhZ3MgJiBTTEFCX1BBTklDKQpAQCAtMzE3LDMxICs1MjcsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9kZXN0cm95KTsKIAotdm9pZCAqa21lbV9jYWNoZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqYywgZ2ZwX3QgZmxhZ3MpCit2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmMsIGdmcF90IGZsYWdzLCBpbnQgbm9kZSkKIHsKIAl2b2lkICpiOwogCiAJaWYgKGMtPnNpemUgPCBQQUdFX1NJWkUpCi0JCWIgPSBzbG9iX2FsbG9jKGMtPnNpemUsIGZsYWdzLCBjLT5hbGlnbik7CisJCWIgPSBzbG9iX2FsbG9jKGMtPnNpemUsIGZsYWdzLCBjLT5hbGlnbiwgbm9kZSk7CiAJZWxzZQotCQliID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWdzLCBnZXRfb3JkZXIoYy0+c2l6ZSkpOworCQliID0gc2xvYl9uZXdfcGFnZShmbGFncywgZ2V0X29yZGVyKGMtPnNpemUpLCBub2RlKTsKIAogCWlmIChjLT5jdG9yKQogCQljLT5jdG9yKGIsIGMsIDApOwogCiAJcmV0dXJuIGI7CiB9Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOwotCi12b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqYywgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhjLCBmbGFncyk7Ci0JaWYgKHJldCkKLQkJbWVtc2V0KHJldCwgMCwgYy0+c2l6ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX3phbGxvYyk7CitFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2Nfbm9kZSk7CiAKIHN0YXRpYyB2b2lkIF9fa21lbV9jYWNoZV9mcmVlKHZvaWQgKmIsIGludCBzaXplKQogewpAQCAtMzg1LDkgKzU4NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfbmFtZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzbG9iX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoCi0JKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKXNsb2JfdGltZXJfY2JrLCAwLCAwKTsKLQogaW50IGttZW1fY2FjaGVfc2hyaW5rKHN0cnVjdCBrbWVtX2NhY2hlICpkKQogewogCXJldHVybiAwOwpAQCAtMzk5LDE3ICs1OTYsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfX2luaXQga21lbV9jYWNoZV9pbml0KHZvaWQpCitzdGF0aWMgdW5zaWduZWQgaW50IHNsb2JfcmVhZHkgX19yZWFkX21vc3RseTsKKworaW50IHNsYWJfaXNfYXZhaWxhYmxlKHZvaWQpCiB7Ci0Jc2xvYl90aW1lcl9jYmsoKTsKKwlyZXR1cm4gc2xvYl9yZWFkeTsKIH0KIAotc3RhdGljIHZvaWQgc2xvYl90aW1lcl9jYmsodm9pZCkKK3ZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdCh2b2lkKQogewotCXZvaWQgKnAgPSBzbG9iX2FsbG9jKFBBR0VfU0laRSwgMCwgUEFHRV9TSVpFLTEpOwotCi0JaWYgKHApCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwKTsKLQotCW1vZF90aW1lcigmc2xvYl90aW1lciwgamlmZmllcyArIEhaKTsKKwlzbG9iX3JlYWR5ID0gMTsKIH0KZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCBlMGNmNjIxLi41MmE0ZjQ0IDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0yMDUsNiArMjA1LDExIEBACiAjZGVmaW5lIEFSQ0hfU0xBQl9NSU5BTElHTiBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nIGxvbmcpCiAjZW5kaWYKIAorLyoKKyAqIFRoZSBwYWdlLT5pbnVzZSBmaWVsZCBpcyAxNiBiaXQgdGh1cyB3ZSBoYXZlIHRoaXMgbGltaXRhdGlvbgorICovCisjZGVmaW5lIE1BWF9PQkpFQ1RTX1BFUl9TTEFCIDY1NTM1CisKIC8qIEludGVybmFsIFNMVUIgZmxhZ3MgKi8KICNkZWZpbmUgX19PQkpFQ1RfUE9JU09OIDB4ODAwMDAwMDAJLyogUG9pc29uIG9iamVjdCAqLwogCkBAIC0yMjgsNyArMjMzLDcgQEAKIAogLyogQSBsaXN0IG9mIGFsbCBzbGFiIGNhY2hlcyBvbiB0aGUgc3lzdGVtICovCiBzdGF0aWMgREVDTEFSRV9SV1NFTShzbHViX2xvY2spOwotTElTVF9IRUFEKHNsYWJfY2FjaGVzKTsKK3N0YXRpYyBMSVNUX0hFQUQoc2xhYl9jYWNoZXMpOwogCiAvKgogICogVHJhY2tpbmcgdXNlciBvZiBhIHNsYWIuCkBAIC0yNDcsOSArMjUyLDEwIEBACiBzdGF0aWMgaW50IHN5c2ZzX3NsYWJfYWxpYXMoc3RydWN0IGttZW1fY2FjaGUgKiwgY29uc3QgY2hhciAqKTsKIHN0YXRpYyB2b2lkIHN5c2ZzX3NsYWJfcmVtb3ZlKHN0cnVjdCBrbWVtX2NhY2hlICopOwogI2Vsc2UKLXN0YXRpYyBpbnQgc3lzZnNfc2xhYl9hZGQoc3RydWN0IGttZW1fY2FjaGUgKnMpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY29uc3QgY2hhciAqcCkgeyByZXR1cm4gMDsgfQotc3RhdGljIHZvaWQgc3lzZnNfc2xhYl9yZW1vdmUoc3RydWN0IGttZW1fY2FjaGUgKnMpIHt9CitzdGF0aWMgaW5saW5lIGludCBzeXNmc19zbGFiX2FkZChzdHJ1Y3Qga21lbV9jYWNoZSAqcykgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY29uc3QgY2hhciAqcCkKKwkJCQkJCQl7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfc2xhYl9yZW1vdmUoc3RydWN0IGttZW1fY2FjaGUgKnMpIHt9CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMjMsNyArMzI5LDExIEBACiAvKgogICogRGVidWcgc2V0dGluZ3M6CiAgKi8KKyNpZmRlZiBDT05GSUdfU0xVQl9ERUJVR19PTgorc3RhdGljIGludCBzbHViX2RlYnVnID0gREVCVUdfREVGQVVMVF9GTEFHUzsKKyNlbHNlCiBzdGF0aWMgaW50IHNsdWJfZGVidWc7CisjZW5kaWYKIAogc3RhdGljIGNoYXIgKnNsdWJfZGVidWdfc2xhYnM7CiAKQEAgLTM0MCw3ICszNTAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCWlmIChuZXdsaW5lKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiUxMHMgMHglcDogIiwgdGV4dCwgYWRkciArIGkpOworCQkJcHJpbnRrKEtFUk5fRVJSICIlOHMgMHglcDogIiwgdGV4dCwgYWRkciArIGkpOwogCQkJbmV3bGluZSA9IDA7CiAJCX0KIAkJcHJpbnRrKCIgJTAyeCIsIGFkZHJbaV0pOwpAQCAtMzk3LDEwICs0MDcsMTEgQEAKIAogc3RhdGljIHZvaWQgaW5pdF90cmFja2luZyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgdm9pZCAqb2JqZWN0KQogewotCWlmIChzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikgewotCQlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19GUkVFLCBOVUxMKTsKLQkJc2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfQUxMT0MsIE5VTEwpOwotCX0KKwlpZiAoIShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCisJCXJldHVybjsKKworCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0ZSRUUsIE5VTEwpOworCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0FMTE9DLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgcHJpbnRfdHJhY2soY29uc3QgY2hhciAqcywgc3RydWN0IHRyYWNrICp0KQpAQCAtNDA4LDY1ICs0MTksMTA2IEBACiAJaWYgKCF0LT5hZGRyKQogCQlyZXR1cm47CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiAiLCBzKTsKKwlwcmludGsoS0VSTl9FUlIgIklORk86ICVzIGluICIsIHMpOwogCV9fcHJpbnRfc3ltYm9sKCIlcyIsICh1bnNpZ25lZCBsb25nKXQtPmFkZHIpOwotCXByaW50aygiIGppZmZpZXNfYWdvPSVsdSBjcHU9JXUgcGlkPSVkXG4iLCBqaWZmaWVzIC0gdC0+d2hlbiwgdC0+Y3B1LCB0LT5waWQpOworCXByaW50aygiIGFnZT0lbHUgY3B1PSV1IHBpZD0lZFxuIiwgamlmZmllcyAtIHQtPndoZW4sIHQtPmNwdSwgdC0+cGlkKTsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfdHJhaWxlcihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgdTggKnApCitzdGF0aWMgdm9pZCBwcmludF90cmFja2luZyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgdm9pZCAqb2JqZWN0KQoreworCWlmICghKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKKwkJcmV0dXJuOworCisJcHJpbnRfdHJhY2soIkFsbG9jYXRlZCIsIGdldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0FMTE9DKSk7CisJcHJpbnRfdHJhY2soIkZyZWVkIiwgZ2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfRlJFRSkpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wYWdlX2luZm8oc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiBTbGFiIDB4JXAgdXNlZD0ldSBmcD0weCVwIGZsYWdzPTB4JTA0bHhcbiIsCisJCXBhZ2UsIHBhZ2UtPmludXNlLCBwYWdlLT5mcmVlbGlzdCwgcGFnZS0+ZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIHNsYWJfYnVnKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbMTAwXTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50ayhLRVJOX0VSUiAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIkJVRyAlczogJXNcbiIsIHMtPm5hbWUsIGJ1Zik7CisJcHJpbnRrKEtFUk5fRVJSICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNsYWJfZml4KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciBidWZbMTAwXTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50ayhLRVJOX0VSUiAiRklYICVzOiAlc1xuIiwgcy0+bmFtZSwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdHJhaWxlcihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIHU4ICpwKQogewogCXVuc2lnbmVkIGludCBvZmY7CS8qIE9mZnNldCBvZiBsYXN0IGJ5dGUgKi8KKwl1OCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCXByaW50X3RyYWNraW5nKHMsIHApOworCisJcHJpbnRfcGFnZV9pbmZvKHBhZ2UpOworCisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiBPYmplY3QgMHglcCBAb2Zmc2V0PSV0dSBmcD0weCVwXG5cbiIsCisJCQlwLCBwIC0gYWRkciwgZ2V0X2ZyZWVwb2ludGVyKHMsIHApKTsKKworCWlmIChwID4gYWRkciArIDE2KQorCQlwcmludF9zZWN0aW9uKCJCeXRlcyBiNCIsIHAgLSAxNiwgMTYpOworCisJcHJpbnRfc2VjdGlvbigiT2JqZWN0IiwgcCwgbWluKHMtPm9ianNpemUsIDEyOCkpOwogCiAJaWYgKHMtPmZsYWdzICYgU0xBQl9SRURfWk9ORSkKIAkJcHJpbnRfc2VjdGlvbigiUmVkem9uZSIsIHAgKyBzLT5vYmpzaXplLAogCQkJcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKIAotCXByaW50ayhLRVJOX0VSUiAiRnJlZVBvaW50ZXIgMHglcCAtPiAweCVwXG4iLAotCQkJcCArIHMtPm9mZnNldCwKLQkJCWdldF9mcmVlcG9pbnRlcihzLCBwKSk7Ci0KIAlpZiAocy0+b2Zmc2V0KQogCQlvZmYgPSBzLT5vZmZzZXQgKyBzaXplb2Yodm9pZCAqKTsKIAllbHNlCiAJCW9mZiA9IHMtPmludXNlOwogCi0JaWYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSB7Ci0JCXByaW50X3RyYWNrKCJMYXN0IGFsbG9jIiwgZ2V0X3RyYWNrKHMsIHAsIFRSQUNLX0FMTE9DKSk7Ci0JCXByaW50X3RyYWNrKCJMYXN0IGZyZWUgIiwgZ2V0X3RyYWNrKHMsIHAsIFRSQUNLX0ZSRUUpKTsKKwlpZiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpCiAJCW9mZiArPSAyICogc2l6ZW9mKHN0cnVjdCB0cmFjayk7Ci0JfQogCiAJaWYgKG9mZiAhPSBzLT5zaXplKQogCQkvKiBCZWdpbm5pbmcgb2YgdGhlIGZpbGxlciBpcyB0aGUgZnJlZSBwb2ludGVyICovCi0JCXByaW50X3NlY3Rpb24oIkZpbGxlciIsIHAgKyBvZmYsIHMtPnNpemUgLSBvZmYpOworCQlwcmludF9zZWN0aW9uKCJQYWRkaW5nIiwgcCArIG9mZiwgcy0+c2l6ZSAtIG9mZik7CisKKwlkdW1wX3N0YWNrKCk7CiB9CiAKIHN0YXRpYyB2b2lkIG9iamVjdF9lcnIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJdTggKm9iamVjdCwgY2hhciAqcmVhc29uKQogewotCXU4ICphZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCi0JcHJpbnRrKEtFUk5fRVJSICIqKiogU0xVQiAlczogJXNAMHglcCBzbGFiIDB4JXBcbiIsCi0JCQlzLT5uYW1lLCByZWFzb24sIG9iamVjdCwgcGFnZSk7Ci0JcHJpbnRrKEtFUk5fRVJSICIgICAgb2Zmc2V0PSV0dSBmbGFncz0weCUwNGx4IGludXNlPSV1IGZyZWVsaXN0PTB4JXBcbiIsCi0JCW9iamVjdCAtIGFkZHIsIHBhZ2UtPmZsYWdzLCBwYWdlLT5pbnVzZSwgcGFnZS0+ZnJlZWxpc3QpOwotCWlmIChvYmplY3QgPiBhZGRyICsgMTYpCi0JCXByaW50X3NlY3Rpb24oIkJ5dGVzIGI0Iiwgb2JqZWN0IC0gMTYsIDE2KTsKLQlwcmludF9zZWN0aW9uKCJPYmplY3QiLCBvYmplY3QsIG1pbihzLT5vYmpzaXplLCAxMjgpKTsKLQlwcmludF90cmFpbGVyKHMsIG9iamVjdCk7Ci0JZHVtcF9zdGFjaygpOworCXNsYWJfYnVnKHMsIHJlYXNvbik7CisJcHJpbnRfdHJhaWxlcihzLCBwYWdlLCBvYmplY3QpOwogfQogCi1zdGF0aWMgdm9pZCBzbGFiX2VycihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIGNoYXIgKnJlYXNvbiwgLi4uKQorc3RhdGljIHZvaWQgc2xhYl9lcnIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJY2hhciBidWZbMTAwXTsKIAotCXZhX3N0YXJ0KGFyZ3MsIHJlYXNvbik7Ci0JdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHJlYXNvbiwgYXJncyk7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7Ci0JcHJpbnRrKEtFUk5fRVJSICIqKiogU0xVQiAlczogJXMgaW4gc2xhYiBAMHglcFxuIiwgcy0+bmFtZSwgYnVmLAotCQlwYWdlKTsKKwlzbGFiX2J1ZyhzLCBmbXQpOworCXByaW50X3BhZ2VfaW5mbyhwYWdlKTsKIAlkdW1wX3N0YWNrKCk7CiB9CiAKQEAgLTQ4NSwxNSArNTM3LDQ2IEBACiAJCQlzLT5pbnVzZSAtIHMtPm9ianNpemUpOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX2J5dGVzKHU4ICpzdGFydCwgdW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCitzdGF0aWMgdTggKmNoZWNrX2J5dGVzKHU4ICpzdGFydCwgdW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgYnl0ZXMpCiB7CiAJd2hpbGUgKGJ5dGVzKSB7CiAJCWlmICgqc3RhcnQgIT0gKHU4KXZhbHVlKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gc3RhcnQ7CiAJCXN0YXJ0Kys7CiAJCWJ5dGVzLS07CiAJfQotCXJldHVybiAxOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX2J5dGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICptZXNzYWdlLCB1OCBkYXRhLAorCQkJCQkJdm9pZCAqZnJvbSwgdm9pZCAqdG8pCit7CisJc2xhYl9maXgocywgIlJlc3RvcmluZyAweCVwLTB4JXA9MHgleFxuIiwgZnJvbSwgdG8gLSAxLCBkYXRhKTsKKwltZW1zZXQoZnJvbSwgZGF0YSwgdG8gLSBmcm9tKTsKK30KKworc3RhdGljIGludCBjaGVja19ieXRlc19hbmRfcmVwb3J0KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXU4ICpvYmplY3QsIGNoYXIgKndoYXQsCisJCQl1OCogc3RhcnQsIHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXU4ICpmYXVsdDsKKwl1OCAqZW5kOworCisJZmF1bHQgPSBjaGVja19ieXRlcyhzdGFydCwgdmFsdWUsIGJ5dGVzKTsKKwlpZiAoIWZhdWx0KQorCQlyZXR1cm4gMTsKKworCWVuZCA9IHN0YXJ0ICsgYnl0ZXM7CisJd2hpbGUgKGVuZCA+IGZhdWx0ICYmIGVuZFstMV0gPT0gdmFsdWUpCisJCWVuZC0tOworCisJc2xhYl9idWcocywgIiVzIG92ZXJ3cml0dGVuIiwgd2hhdCk7CisJcHJpbnRrKEtFUk5fRVJSICJJTkZPOiAweCVwLTB4JXAuIEZpcnN0IGJ5dGUgMHgleCBpbnN0ZWFkIG9mIDB4JXhcbiIsCisJCQkJCWZhdWx0LCBlbmQgLSAxLCBmYXVsdFswXSwgdmFsdWUpOworCXByaW50X3RyYWlsZXIocywgcGFnZSwgb2JqZWN0KTsKKworCXJlc3RvcmVfYnl0ZXMocywgd2hhdCwgdmFsdWUsIGZhdWx0LCBlbmQpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNTM0LDE0ICs2MTcsNiBAQAogICogbWF5IGJlIHVzZWQgd2l0aCBtZXJnZWQgc2xhYmNhY2hlcy4KICAqLwogCi1zdGF0aWMgdm9pZCByZXN0b3JlX2J5dGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICptZXNzYWdlLCB1OCBkYXRhLAotCQkJCQkJdm9pZCAqZnJvbSwgdm9pZCAqdG8pCi17Ci0JcHJpbnRrKEtFUk5fRVJSICJAQEAgU0xVQiAlczogUmVzdG9yaW5nICVzICgweCV4KSBmcm9tIDB4JXAtMHglcFxuIiwKLQkJcy0+bmFtZSwgbWVzc2FnZSwgZGF0YSwgZnJvbSwgdG8gLSAxKTsKLQltZW1zZXQoZnJvbSwgZGF0YSwgdG8gLSBmcm9tKTsKLX0KLQogc3RhdGljIGludCBjaGVja19wYWRfYnl0ZXMoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCB1OCAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIG9mZiA9IHMtPmludXNlOwkvKiBUaGUgZW5kIG9mIGluZm8gKi8KQEAgLTU1NywzOSArNjMyLDM5IEBACiAJaWYgKHMtPnNpemUgPT0gb2ZmKQogCQlyZXR1cm4gMTsKIAotCWlmIChjaGVja19ieXRlcyhwICsgb2ZmLCBQT0lTT05fSU5VU0UsIHMtPnNpemUgLSBvZmYpKQotCQlyZXR1cm4gMTsKLQotCW9iamVjdF9lcnIocywgcGFnZSwgcCwgIk9iamVjdCBwYWRkaW5nIGNoZWNrIGZhaWxzIik7Ci0KLQkvKgotCSAqIFJlc3RvcmUgcGFkZGluZwotCSAqLwotCXJlc3RvcmVfYnl0ZXMocywgIm9iamVjdCBwYWRkaW5nIiwgUE9JU09OX0lOVVNFLCBwICsgb2ZmLCBwICsgcy0+c2l6ZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgcCwgIk9iamVjdCBwYWRkaW5nIiwKKwkJCQlwICsgb2ZmLCBQT0lTT05fSU5VU0UsIHMtPnNpemUgLSBvZmYpOwogfQogCiBzdGF0aWMgaW50IHNsYWJfcGFkX2NoZWNrKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQl1OCAqcDsKLQlpbnQgbGVuZ3RoLCByZW1haW5kZXI7CisJdTggKnN0YXJ0OworCXU4ICpmYXVsdDsKKwl1OCAqZW5kOworCWludCBsZW5ndGg7CisJaW50IHJlbWFpbmRlcjsKIAogCWlmICghKHMtPmZsYWdzICYgU0xBQl9QT0lTT04pKQogCQlyZXR1cm4gMTsKIAotCXAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJc3RhcnQgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJZW5kID0gc3RhcnQgKyAoUEFHRV9TSVpFIDw8IHMtPm9yZGVyKTsKIAlsZW5ndGggPSBzLT5vYmplY3RzICogcy0+c2l6ZTsKLQlyZW1haW5kZXIgPSAoUEFHRV9TSVpFIDw8IHMtPm9yZGVyKSAtIGxlbmd0aDsKKwlyZW1haW5kZXIgPSBlbmQgLSAoc3RhcnQgKyBsZW5ndGgpOwogCWlmICghcmVtYWluZGVyKQogCQlyZXR1cm4gMTsKIAotCWlmICghY2hlY2tfYnl0ZXMocCArIGxlbmd0aCwgUE9JU09OX0lOVVNFLCByZW1haW5kZXIpKSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJQYWRkaW5nIGNoZWNrIGZhaWxlZCIpOwotCQlyZXN0b3JlX2J5dGVzKHMsICJzbGFiIHBhZGRpbmciLCBQT0lTT05fSU5VU0UsIHAgKyBsZW5ndGgsCi0JCQlwICsgbGVuZ3RoICsgcmVtYWluZGVyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworCWZhdWx0ID0gY2hlY2tfYnl0ZXMoc3RhcnQgKyBsZW5ndGgsIFBPSVNPTl9JTlVTRSwgcmVtYWluZGVyKTsKKwlpZiAoIWZhdWx0KQorCQlyZXR1cm4gMTsKKwl3aGlsZSAoZW5kID4gZmF1bHQgJiYgZW5kWy0xXSA9PSBQT0lTT05fSU5VU0UpCisJCWVuZC0tOworCisJc2xhYl9lcnIocywgcGFnZSwgIlBhZGRpbmcgb3ZlcndyaXR0ZW4uIDB4JXAtMHglcCIsIGZhdWx0LCBlbmQgLSAxKTsKKwlwcmludF9zZWN0aW9uKCJQYWRkaW5nIiwgc3RhcnQsIGxlbmd0aCk7CisKKwlyZXN0b3JlX2J5dGVzKHMsICJzbGFiIHBhZGRpbmciLCBQT0lTT05fSU5VU0UsIHN0YXJ0LCBlbmQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNoZWNrX29iamVjdChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC02MDIsNDEgKzY3NywyMiBAQAogCQl1bnNpZ25lZCBpbnQgcmVkID0KIAkJCWFjdGl2ZSA/IFNMVUJfUkVEX0FDVElWRSA6IFNMVUJfUkVEX0lOQUNUSVZFOwogCi0JCWlmICghY2hlY2tfYnl0ZXMoZW5kb2JqZWN0LCByZWQsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSkpIHsKLQkJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LAotCQkJYWN0aXZlID8gIlJlZHpvbmUgQWN0aXZlIiA6ICJSZWR6b25lIEluYWN0aXZlIik7Ci0JCQlyZXN0b3JlX2J5dGVzKHMsICJyZWR6b25lIiwgcmVkLAotCQkJCWVuZG9iamVjdCwgb2JqZWN0ICsgcy0+aW51c2UpOworCQlpZiAoIWNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgb2JqZWN0LCAiUmVkem9uZSIsCisJCQllbmRvYmplY3QsIHJlZCwgcy0+aW51c2UgLSBzLT5vYmpzaXplKSkKIAkJCXJldHVybiAwOwotCQl9CiAJfSBlbHNlIHsKLQkJaWYgKChzLT5mbGFncyAmIFNMQUJfUE9JU09OKSAmJiBzLT5vYmpzaXplIDwgcy0+aW51c2UgJiYKLQkJCSFjaGVja19ieXRlcyhlbmRvYmplY3QsIFBPSVNPTl9JTlVTRSwKLQkJCQkJcy0+aW51c2UgLSBzLT5vYmpzaXplKSkgewotCQlvYmplY3RfZXJyKHMsIHBhZ2UsIHAsICJBbGlnbm1lbnQgcGFkZGluZyBjaGVjayBmYWlscyIpOwotCQkvKgotCQkgKiBGaXggaXQgc28gdGhhdCB0aGVyZSB3aWxsIG5vdCBiZSBhbm90aGVyIHJlcG9ydC4KLQkJICoKLQkJICogSG1tbS4uLiBXZSBtYXkgYmUgY29ycnVwdGluZyBhbiBvYmplY3QgdGhhdCBub3cgZXhwZWN0cwotCQkgKiB0byBiZSBsb25nZXIgdGhhbiBhbGxvd2VkLgotCQkgKi8KLQkJcmVzdG9yZV9ieXRlcyhzLCAiYWxpZ25tZW50IHBhZGRpbmciLCBQT0lTT05fSU5VU0UsCi0JCQllbmRvYmplY3QsIG9iamVjdCArIHMtPmludXNlKTsKLQkJfQorCQlpZiAoKHMtPmZsYWdzICYgU0xBQl9QT0lTT04pICYmIHMtPm9ianNpemUgPCBzLT5pbnVzZSkKKwkJCWNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgcCwgIkFsaWdubWVudCBwYWRkaW5nIiwgZW5kb2JqZWN0LAorCQkJCVBPSVNPTl9JTlVTRSwgcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKIAl9CiAKIAlpZiAocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikgewogCQlpZiAoIWFjdGl2ZSAmJiAocy0+ZmxhZ3MgJiBfX09CSkVDVF9QT0lTT04pICYmCi0JCQkoIWNoZWNrX2J5dGVzKHAsIFBPSVNPTl9GUkVFLCBzLT5vYmpzaXplIC0gMSkgfHwKLQkJCQlwW3MtPm9ianNpemUgLSAxXSAhPSBQT0lTT05fRU5EKSkgewotCi0JCQlvYmplY3RfZXJyKHMsIHBhZ2UsIHAsICJQb2lzb24gY2hlY2sgZmFpbGVkIik7Ci0JCQlyZXN0b3JlX2J5dGVzKHMsICJQb2lzb24iLCBQT0lTT05fRlJFRSwKLQkJCQkJCXAsIHAgKyBzLT5vYmpzaXplIC0xKTsKLQkJCXJlc3RvcmVfYnl0ZXMocywgIlBvaXNvbiIsIFBPSVNPTl9FTkQsCi0JCQkJCXAgKyBzLT5vYmpzaXplIC0gMSwgcCArIHMtPm9ianNpemUpOworCQkJKCFjaGVja19ieXRlc19hbmRfcmVwb3J0KHMsIHBhZ2UsIHAsICJQb2lzb24iLCBwLAorCQkJCQlQT0lTT05fRlJFRSwgcy0+b2Jqc2l6ZSAtIDEpIHx8CisJCQkgIWNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgcCwgIlBvaXNvbiIsCisJCQkgCXAgKyBzLT5vYmpzaXplIC0xLCBQT0lTT05fRU5ELCAxKSkpCiAJCQlyZXR1cm4gMDsKLQkJfQogCQkvKgogCQkgKiBjaGVja19wYWRfYnl0ZXMgY2xlYW5zIHVwIG9uIGl0cyBvd24uCiAJCSAqLwpAQCAtNjY5LDI1ICs3MjUsMTcgQEAKIAlWTV9CVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKIAlpZiAoIVBhZ2VTbGFiKHBhZ2UpKSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJOb3QgYSB2YWxpZCBzbGFiIHBhZ2UgZmxhZ3M9JWx4ICIKLQkJCSJtYXBwaW5nPTB4JXAgY291bnQ9JWQiLCBwYWdlLT5mbGFncywgcGFnZS0+bWFwcGluZywKLQkJCXBhZ2VfY291bnQocGFnZSkpOworCQlzbGFiX2VycihzLCBwYWdlLCAiTm90IGEgdmFsaWQgc2xhYiBwYWdlIik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAocGFnZS0+b2Zmc2V0ICogc2l6ZW9mKHZvaWQgKikgIT0gcy0+b2Zmc2V0KSB7Ci0JCXNsYWJfZXJyKHMsIHBhZ2UsICJDb3JydXB0ZWQgb2Zmc2V0ICVsdSBmbGFncz0weCVseCAiCi0JCQkibWFwcGluZz0weCVwIGNvdW50PSVkIiwKLQkJCSh1bnNpZ25lZCBsb25nKShwYWdlLT5vZmZzZXQgKiBzaXplb2Yodm9pZCAqKSksCi0JCQlwYWdlLT5mbGFncywKLQkJCXBhZ2UtPm1hcHBpbmcsCi0JCQlwYWdlX2NvdW50KHBhZ2UpKTsKKwkJc2xhYl9lcnIocywgcGFnZSwgIkNvcnJ1cHRlZCBvZmZzZXQgJWx1IiwKKwkJCSh1bnNpZ25lZCBsb25nKShwYWdlLT5vZmZzZXQgKiBzaXplb2Yodm9pZCAqKSkpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHBhZ2UtPmludXNlID4gcy0+b2JqZWN0cykgewotCQlzbGFiX2VycihzLCBwYWdlLCAiaW51c2UgJXUgPiBtYXggJXUgQDB4JXAgZmxhZ3M9JWx4ICIKLQkJCSJtYXBwaW5nPTB4JXAgY291bnQ9JWQiLAotCQkJcy0+bmFtZSwgcGFnZS0+aW51c2UsIHMtPm9iamVjdHMsIHBhZ2UtPmZsYWdzLAotCQkJcGFnZS0+bWFwcGluZywgcGFnZV9jb3VudChwYWdlKSk7CisJCXNsYWJfZXJyKHMsIHBhZ2UsICJpbnVzZSAldSA+IG1heCAldSIsCisJCQlzLT5uYW1lLCBwYWdlLT5pbnVzZSwgcy0+b2JqZWN0cyk7CiAJCXJldHVybiAwOwogCX0KIAkvKiBTbGFiX3BhZF9jaGVjayBmaXhlcyB0aGluZ3MgdXAgYWZ0ZXIgaXRzZWxmICovCkBAIC03MTUsMTMgKzc2MywxMCBAQAogCQkJCXNldF9mcmVlcG9pbnRlcihzLCBvYmplY3QsIE5VTEwpOwogCQkJCWJyZWFrOwogCQkJfSBlbHNlIHsKLQkJCQlzbGFiX2VycihzLCBwYWdlLCAiRnJlZXBvaW50ZXIgMHglcCBjb3JydXB0IiwKLQkJCQkJCQkJCWZwKTsKKwkJCQlzbGFiX2VycihzLCBwYWdlLCAiRnJlZXBvaW50ZXIgY29ycnVwdCIpOwogCQkJCXBhZ2UtPmZyZWVsaXN0ID0gTlVMTDsKIAkJCQlwYWdlLT5pbnVzZSA9IHMtPm9iamVjdHM7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJAQEAgU0xVQiAlczogRnJlZWxpc3QgIgotCQkJCQkiY2xlYXJlZC4gU2xhYiAweCVwXG4iLAotCQkJCQlzLT5uYW1lLCBwYWdlKTsKKwkJCQlzbGFiX2ZpeChzLCAiRnJlZWxpc3QgY2xlYXJlZCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJYnJlYWs7CkBAIC03MzMsMTEgKzc3OCw5IEBACiAKIAlpZiAocGFnZS0+aW51c2UgIT0gcy0+b2JqZWN0cyAtIG5yKSB7CiAJCXNsYWJfZXJyKHMsIHBhZ2UsICJXcm9uZyBvYmplY3QgY291bnQuIENvdW50ZXIgaXMgJWQgYnV0ICIKLQkJCSJjb3VudGVkIHdlcmUgJWQiLCBzLCBwYWdlLCBwYWdlLT5pbnVzZSwKLQkJCQkJCQlzLT5vYmplY3RzIC0gbnIpOworCQkJImNvdW50ZWQgd2VyZSAlZCIsIHBhZ2UtPmludXNlLCBzLT5vYmplY3RzIC0gbnIpOwogCQlwYWdlLT5pbnVzZSA9IHMtPm9iamVjdHMgLSBucjsKLQkJcHJpbnRrKEtFUk5fRVJSICJAQEAgU0xVQiAlczogT2JqZWN0IGNvdW50IGFkanVzdGVkLiAiCi0JCQkiU2xhYiBAMHglcFxuIiwgcy0+bmFtZSwgcGFnZSk7CisJCXNsYWJfZml4KHMsICJPYmplY3QgY291bnQgYWRqdXN0ZWQuIik7CiAJfQogCXJldHVybiBzZWFyY2ggPT0gTlVMTDsKIH0KQEAgLTc5OSw3ICs4NDIsNyBAQAogCQlnb3RvIGJhZDsKIAogCWlmIChvYmplY3QgJiYgIW9uX2ZyZWVsaXN0KHMsIHBhZ2UsIG9iamVjdCkpIHsKLQkJc2xhYl9lcnIocywgcGFnZSwgIk9iamVjdCAweCVwIGFscmVhZHkgYWxsb2NhdGVkIiwgb2JqZWN0KTsKKwkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsICJPYmplY3QgYWxyZWFkeSBhbGxvY2F0ZWQiKTsKIAkJZ290byBiYWQ7CiAJfQogCkBAIC04MjUsOCArODY4LDcgQEAKIAkJICogdG8gYXZvaWQgaXNzdWVzIGluIHRoZSBmdXR1cmUuIE1hcmtpbmcgYWxsIG9iamVjdHMKIAkJICogYXMgdXNlZCBhdm9pZHMgdG91Y2hpbmcgdGhlIHJlbWFpbmluZyBvYmplY3RzLgogCQkgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJAQEAgU0xVQjogJXMgc2xhYiAweCVwLiBNYXJraW5nIGFsbCBvYmplY3RzIHVzZWQuXG4iLAotCQkJcy0+bmFtZSwgcGFnZSk7CisJCXNsYWJfZml4KHMsICJNYXJraW5nIGFsbCBvYmplY3RzIHVzZWQiKTsKIAkJcGFnZS0+aW51c2UgPSBzLT5vYmplY3RzOwogCQlwYWdlLT5mcmVlbGlzdCA9IE5VTEw7CiAJCS8qIEZpeCB1cCBmaWVsZHMgdGhhdCBtYXkgYmUgY29ycnVwdGVkICovCkBAIC04NDcsNyArODg5LDcgQEAKIAl9CiAKIAlpZiAob25fZnJlZWxpc3QocywgcGFnZSwgb2JqZWN0KSkgewotCQlzbGFiX2VycihzLCBwYWdlLCAiT2JqZWN0IDB4JXAgYWxyZWFkeSBmcmVlIiwgb2JqZWN0KTsKKwkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsICJPYmplY3QgYWxyZWFkeSBmcmVlIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTg2Niw4ICs5MDgsOCBAQAogCQkJZHVtcF9zdGFjaygpOwogCQl9CiAJCWVsc2UKLQkJCXNsYWJfZXJyKHMsIHBhZ2UsICJvYmplY3QgYXQgMHglcCBiZWxvbmdzICIKLQkJCQkidG8gc2xhYiAlcyIsIG9iamVjdCwgcGFnZS0+c2xhYi0+bmFtZSk7CisJCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwKKwkJCQkJInBhZ2Ugc2xhYiBwb2ludGVyIGNvcnJ1cHQuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTg4MSw0NSArOTIzLDYzIEBACiAJcmV0dXJuIDE7CiAKIGZhaWw6Ci0JcHJpbnRrKEtFUk5fRVJSICJAQEAgU0xVQjogJXMgc2xhYiAweCVwIG9iamVjdCBhdCAweCVwIG5vdCBmcmVlZC5cbiIsCi0JCXMtPm5hbWUsIHBhZ2UsIG9iamVjdCk7CisJc2xhYl9maXgocywgIk9iamVjdCBhdCAweCVwIG5vdCBmcmVlZCIsIG9iamVjdCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX3NsdWJfZGVidWcoY2hhciAqc3RyKQogewotCWlmICghc3RyIHx8ICpzdHIgIT0gJz0nKQotCQlzbHViX2RlYnVnID0gREVCVUdfREVGQVVMVF9GTEFHUzsKLQllbHNlIHsKLQkJc3RyKys7Ci0JCWlmICgqc3RyID09IDAgfHwgKnN0ciA9PSAnLCcpCi0JCQlzbHViX2RlYnVnID0gREVCVUdfREVGQVVMVF9GTEFHUzsKLQkJZWxzZQotCQlmb3IoIDsqc3RyICYmICpzdHIgIT0gJywnOyBzdHIrKykKLQkJCXN3aXRjaCAoKnN0cikgewotCQkJY2FzZSAnZicgOiBjYXNlICdGJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX0RFQlVHX0ZSRUU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd6JyA6IGNhc2UgJ1onIDoKLQkJCQlzbHViX2RlYnVnIHw9IFNMQUJfUkVEX1pPTkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdwJyA6IGNhc2UgJ1AnIDoKLQkJCQlzbHViX2RlYnVnIHw9IFNMQUJfUE9JU09OOwotCQkJCWJyZWFrOwotCQkJY2FzZSAndScgOiBjYXNlICdVJyA6Ci0JCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1NUT1JFX1VTRVI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd0JyA6IGNhc2UgJ1QnIDoKLQkJCQlzbHViX2RlYnVnIHw9IFNMQUJfVFJBQ0U7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX0VSUiAic2x1Yl9kZWJ1ZyBvcHRpb24gJyVjJyAiCi0JCQkJCSJ1bmtub3duLiBza2lwcGVkXG4iLCpzdHIpOwotCQkJfQotCX0KKwlzbHViX2RlYnVnID0gREVCVUdfREVGQVVMVF9GTEFHUzsKKwlpZiAoKnN0cisrICE9ICc9JyB8fCAhKnN0cikKKwkJLyoKKwkJICogTm8gb3B0aW9ucyBzcGVjaWZpZWQuIFN3aXRjaCBvbiBmdWxsIGRlYnVnZ2luZy4KKwkJICovCisJCWdvdG8gb3V0OwogCiAJaWYgKCpzdHIgPT0gJywnKQorCQkvKgorCQkgKiBObyBvcHRpb25zIGJ1dCByZXN0cmljdGlvbiBvbiBzbGFicy4gVGhpcyBtZWFucyBmdWxsCisJCSAqIGRlYnVnZ2luZyBmb3Igc2xhYnMgbWF0Y2hpbmcgYSBwYXR0ZXJuLgorCQkgKi8KKwkJZ290byBjaGVja19zbGFiczsKKworCXNsdWJfZGVidWcgPSAwOworCWlmICgqc3RyID09ICctJykKKwkJLyoKKwkJICogU3dpdGNoIG9mZiBhbGwgZGVidWdnaW5nIG1lYXN1cmVzLgorCQkgKi8KKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIERldGVybWluZSB3aGljaCBkZWJ1ZyBmZWF0dXJlcyBzaG91bGQgYmUgc3dpdGNoZWQgb24KKwkgKi8KKwlmb3IgKCA7KnN0ciAmJiAqc3RyICE9ICcsJzsgc3RyKyspIHsKKwkJc3dpdGNoICh0b2xvd2VyKCpzdHIpKSB7CisJCWNhc2UgJ2YnOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX0RFQlVHX0ZSRUU7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlzbHViX2RlYnVnIHw9IFNMQUJfUkVEX1pPTkU7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlzbHViX2RlYnVnIHw9IFNMQUJfUE9JU09OOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX1NUT1JFX1VTRVI7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlzbHViX2RlYnVnIHw9IFNMQUJfVFJBQ0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAic2x1Yl9kZWJ1ZyBvcHRpb24gJyVjJyAiCisJCQkJInVua25vd24uIHNraXBwZWRcbiIsKnN0cik7CisJCX0KKwl9CisKK2NoZWNrX3NsYWJzOgorCWlmICgqc3RyID09ICcsJykKIAkJc2x1Yl9kZWJ1Z19zbGFicyA9IHN0ciArIDE7CitvdXQ6CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTEwMTgsNyArMTA3OCw3IEBACiAJdm9pZCAqbGFzdDsKIAl2b2lkICpwOwogCi0JQlVHX09OKGZsYWdzICYgfihHRlBfRE1BIHwgR0ZQX0xFVkVMX01BU0spKTsKKwlCVUdfT04oZmxhZ3MgJiB+KEdGUF9ETUEgfCBfX0dGUF9aRVJPIHwgR0ZQX0xFVkVMX01BU0spKTsKIAogCWlmIChmbGFncyAmIF9fR0ZQX1dBSVQpCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKQEAgLTEzMzYsNyArMTM5Niw3IEBACiAJdW5mcmVlemVfc2xhYihzLCBwYWdlKTsKIH0KIAotc3RhdGljIHZvaWQgZmx1c2hfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBjcHUpCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBjcHUpCiB7CiAJc2xhYl9sb2NrKHBhZ2UpOwogCWRlYWN0aXZhdGVfc2xhYihzLCBwYWdlLCBjcHUpOwpAQCAtMTM0Niw3ICsxNDA2LDcgQEAKICAqIEZsdXNoIGNwdSBzbGFiLgogICogQ2FsbGVkIGZyb20gSVBJIGhhbmRsZXIgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgogICovCi1zdGF0aWMgdm9pZCBfX2ZsdXNoX2NwdV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBpbnQgY3B1KQorc3RhdGljIGlubGluZSB2b2lkIF9fZmx1c2hfY3B1X3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIGludCBjcHUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzLT5jcHVfc2xhYltjcHVdOwogCkBAIC0xNDgxLDcgKzE1NDEsNyBAQAogICogT3RoZXJ3aXNlIHdlIGNhbiBzaW1wbHkgcGljayB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgbG9ja2xlc3MgZnJlZSBsaXN0LgogICovCiBzdGF0aWMgdm9pZCBfX2Fsd2F5c19pbmxpbmUgKnNsYWJfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnMsCi0JCQkJZ2ZwX3QgZ2ZwZmxhZ3MsIGludCBub2RlLCB2b2lkICphZGRyKQorCQlnZnBfdCBnZnBmbGFncywgaW50IG5vZGUsIHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdm9pZCAqKm9iamVjdDsKQEAgLTE0OTksNiArMTU1OSwxMCBAQAogCQlwYWdlLT5sb2NrbGVzc19mcmVlbGlzdCA9IG9iamVjdFtwYWdlLT5vZmZzZXRdOwogCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiAodW5saWtlbHkoKGdmcGZsYWdzICYgX19HRlBfWkVSTykgJiYgb2JqZWN0KSkKKwkJbWVtc2V0KG9iamVjdCwgMCwgcy0+b2Jqc2l6ZSk7CisKIAlyZXR1cm4gb2JqZWN0OwogfQogCkBAIC0xNjgyLDggKzE3NDYsMTcgQEAKIHsKIAlpbnQgb3JkZXI7CiAJaW50IHJlbTsKKwlpbnQgbWluX29yZGVyID0gc2x1Yl9taW5fb3JkZXI7CiAKLQlmb3IgKG9yZGVyID0gbWF4KHNsdWJfbWluX29yZGVyLAorCS8qCisJICogSWYgd2Ugd291bGQgY3JlYXRlIHRvbyBtYW55IG9iamVjdCBwZXIgc2xhYiB0aGVuIHJlZHVjZQorCSAqIHRoZSBzbGFiIG9yZGVyIGV2ZW4gaWYgaXQgZ29lcyBiZWxvdyBzbHViX21pbl9vcmRlci4KKwkgKi8KKwl3aGlsZSAobWluX29yZGVyID4gMCAmJgorCQkoUEFHRV9TSVpFIDw8IG1pbl9vcmRlcikgPj0gTUFYX09CSkVDVFNfUEVSX1NMQUIgKiBzaXplKQorCQkJbWluX29yZGVyLS07CisKKwlmb3IgKG9yZGVyID0gbWF4KG1pbl9vcmRlciwKIAkJCQlmbHMobWluX29iamVjdHMgKiBzaXplIC0gMSkgLSBQQUdFX1NISUZUKTsKIAkJCW9yZGVyIDw9IG1heF9vcmRlcjsgb3JkZXIrKykgewogCkBAIC0xNjk3LDYgKzE3NzAsOSBAQAogCQlpZiAocmVtIDw9IHNsYWJfc2l6ZSAvIGZyYWN0X2xlZnRvdmVyKQogCQkJYnJlYWs7CiAKKwkJLyogSWYgdGhlIG5leHQgc2l6ZSBpcyB0b28gaGlnaCB0aGVuIGV4aXQgbm93ICovCisJCWlmIChzbGFiX3NpemUgKiAyID49IE1BWF9PQkpFQ1RTX1BFUl9TTEFCICogc2l6ZSkKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybiBvcmRlcjsKQEAgLTE3NzcsNyArMTg1Myw5IEBACiAJYXRvbWljX2xvbmdfc2V0KCZuLT5ucl9zbGFicywgMCk7CiAJc3Bpbl9sb2NrX2luaXQoJm4tPmxpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm4tPnBhcnRpYWwpOworI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCiAJSU5JVF9MSVNUX0hFQUQoJm4tPmZ1bGwpOworI2VuZGlmCiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQQpAQCAtMTgwNSw3ICsxODgzLDEwIEBACiAJcGFnZS0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIoa21hbGxvY19jYWNoZXMsIG4pOwogCXBhZ2UtPmludXNlKys7CiAJa21hbGxvY19jYWNoZXMtPm5vZGVbbm9kZV0gPSBuOwotCXNldHVwX29iamVjdF9kZWJ1ZyhrbWFsbG9jX2NhY2hlcywgcGFnZSwgbik7CisjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKKwlpbml0X29iamVjdChrbWFsbG9jX2NhY2hlcywgbiwgMSk7CisJaW5pdF90cmFja2luZyhrbWFsbG9jX2NhY2hlcywgbik7CisjZW5kaWYKIAlpbml0X2ttZW1fY2FjaGVfbm9kZShuKTsKIAlhdG9taWNfbG9uZ19pbmMoJm4tPm5yX3NsYWJzKTsKIAlhZGRfcGFydGlhbChuLCBwYWdlKTsKQEAgLTE5ODMsNyArMjA2NCw3IEBACiAJICogVGhlIHBhZ2UtPmludXNlIGZpZWxkIGlzIG9ubHkgMTYgYml0IHdpZGUhIFNvIHdlIGNhbm5vdCBoYXZlCiAJICogbW9yZSB0aGFuIDY0ayBvYmplY3RzIHBlciBzbGFiLgogCSAqLwotCWlmICghcy0+b2JqZWN0cyB8fCBzLT5vYmplY3RzID4gNjU1MzUpCisJaWYgKCFzLT5vYmplY3RzIHx8IHMtPm9iamVjdHMgPiBNQVhfT0JKRUNUU19QRVJfU0xBQikKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiAKQEAgLTIwODcsNyArMjE2OCw3IEBACiAvKgogICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgYSBzbGFiIGNhY2hlLgogICovCi1zdGF0aWMgaW50IGttZW1fY2FjaGVfY2xvc2Uoc3RydWN0IGttZW1fY2FjaGUgKnMpCitzdGF0aWMgaW5saW5lIGludCBrbWVtX2NhY2hlX2Nsb3NlKHN0cnVjdCBrbWVtX2NhY2hlICpzKQogewogCWludCBub2RlOwogCkBAIC0yMTE1LDEyICsyMTk2LDEzIEBACiAJcy0+cmVmY291bnQtLTsKIAlpZiAoIXMtPnJlZmNvdW50KSB7CiAJCWxpc3RfZGVsKCZzLT5saXN0KTsKKwkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCWlmIChrbWVtX2NhY2hlX2Nsb3NlKHMpKQogCQkJV0FSTl9PTigxKTsKIAkJc3lzZnNfc2xhYl9yZW1vdmUocyk7CiAJCWtmcmVlKHMpOwotCX0KLQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKKwl9IGVsc2UKKwkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfZGVzdHJveSk7CiAKQEAgLTIxOTMsNDcgKzIyNzUsOTIgQEAKIAlwYW5pYygiQ3JlYXRpb24gb2Yga21hbGxvYyBzbGFiICVzIHNpemU9JWQgZmFpbGVkLlxuIiwgbmFtZSwgc2l6ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZ2V0X3NsYWIoc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQotewotCWludCBpbmRleCA9IGttYWxsb2NfaW5kZXgoc2l6ZSk7Ci0KLQlpZiAoIWluZGV4KQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIEFsbG9jYXRpb24gdG9vIGxhcmdlPyAqLwotCUJVR19PTihpbmRleCA8IDApOwotCiAjaWZkZWYgQ09ORklHX1pPTkVfRE1BCi0JaWYgKChmbGFncyAmIFNMVUJfRE1BKSkgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKLQkJc3RydWN0IGttZW1fY2FjaGUgKng7Ci0JCWNoYXIgKnRleHQ7Ci0JCXNpemVfdCByZWFsc2l6ZTsKK3N0YXRpYyBub2lubGluZSBzdHJ1Y3Qga21lbV9jYWNoZSAqZG1hX2ttYWxsb2NfY2FjaGUoaW50IGluZGV4LCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqeDsKKwljaGFyICp0ZXh0OworCXNpemVfdCByZWFsc2l6ZTsKIAotCQlzID0ga21hbGxvY19jYWNoZXNfZG1hW2luZGV4XTsKLQkJaWYgKHMpCi0JCQlyZXR1cm4gczsKKwlzID0ga21hbGxvY19jYWNoZXNfZG1hW2luZGV4XTsKKwlpZiAocykKKwkJcmV0dXJuIHM7CiAKLQkJLyogRHluYW1pY2FsbHkgY3JlYXRlIGRtYSBjYWNoZSAqLwotCQl4ID0ga21hbGxvYyhrbWVtX3NpemUsIGZsYWdzICYgflNMVUJfRE1BKTsKLQkJaWYgKCF4KQotCQkJcGFuaWMoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRtYSBjYWNoZVxuIik7CisJLyogRHluYW1pY2FsbHkgY3JlYXRlIGRtYSBjYWNoZSAqLworCXggPSBrbWFsbG9jKGttZW1fc2l6ZSwgZmxhZ3MgJiB+U0xVQl9ETUEpOworCWlmICgheCkKKwkJcGFuaWMoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRtYSBjYWNoZVxuIik7CiAKLQkJaWYgKGluZGV4IDw9IEtNQUxMT0NfU0hJRlRfSElHSCkKLQkJCXJlYWxzaXplID0gMSA8PCBpbmRleDsKLQkJZWxzZSB7Ci0JCQlpZiAoaW5kZXggPT0gMSkKLQkJCQlyZWFsc2l6ZSA9IDk2OwotCQkJZWxzZQotCQkJCXJlYWxzaXplID0gMTkyOwotCQl9Ci0KLQkJdGV4dCA9IGthc3ByaW50ZihmbGFncyAmIH5TTFVCX0RNQSwgImttYWxsb2NfZG1hLSVkIiwKLQkJCQkodW5zaWduZWQgaW50KXJlYWxzaXplKTsKLQkJcyA9IGNyZWF0ZV9rbWFsbG9jX2NhY2hlKHgsIHRleHQsIHJlYWxzaXplLCBmbGFncyk7CisJcmVhbHNpemUgPSBrbWFsbG9jX2NhY2hlc1tpbmRleF0ub2Jqc2l6ZTsKKwl0ZXh0ID0ga2FzcHJpbnRmKGZsYWdzICYgflNMVUJfRE1BLCAia21hbGxvY19kbWEtJWQiLAorCQkJKHVuc2lnbmVkIGludClyZWFsc2l6ZSk7CisJcyA9IGNyZWF0ZV9rbWFsbG9jX2NhY2hlKHgsIHRleHQsIHJlYWxzaXplLCBmbGFncyk7CisJZG93bl93cml0ZSgmc2x1Yl9sb2NrKTsKKwlpZiAoIWttYWxsb2NfY2FjaGVzX2RtYVtpbmRleF0pIHsKIAkJa21hbGxvY19jYWNoZXNfZG1hW2luZGV4XSA9IHM7CisJCXVwX3dyaXRlKCZzbHViX2xvY2spOwogCQlyZXR1cm4gczsKIAl9CisJdXBfd3JpdGUoJnNsdWJfbG9jayk7CisJa21lbV9jYWNoZV9kZXN0cm95KHMpOworCXJldHVybiBrbWFsbG9jX2NhY2hlc19kbWFbaW5kZXhdOworfQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJzaW9uIHRhYmxlIGZvciBzbWFsbCBzbGFicyBzaXplcyAvIDggdG8gdGhlIGluZGV4IGluIHRoZQorICoga21hbGxvYyBhcnJheS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHNsYWJzIDwgMTkyIHNpbmNlIHdlIGhhdmUgbm9uIHBvd2VyCisgKiBvZiB0d28gY2FjaGUgc2l6ZXMgdGhlcmUuIFRoZSBzaXplIG9mIGxhcmdlciBzbGFicyBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZworICogZmxzLgorICovCitzdGF0aWMgczggc2l6ZV9pbmRleFsyNF0gPSB7CisJMywJLyogOCAqLworCTQsCS8qIDE2ICovCisJNSwJLyogMjQgKi8KKwk1LAkvKiAzMiAqLworCTYsCS8qIDQwICovCisJNiwJLyogNDggKi8KKwk2LAkvKiA1NiAqLworCTYsCS8qIDY0ICovCisJMSwJLyogNzIgKi8KKwkxLAkvKiA4MCAqLworCTEsCS8qIDg4ICovCisJMSwJLyogOTYgKi8KKwk3LAkvKiAxMDQgKi8KKwk3LAkvKiAxMTIgKi8KKwk3LAkvKiAxMjAgKi8KKwk3LAkvKiAxMjggKi8KKwkyLAkvKiAxMzYgKi8KKwkyLAkvKiAxNDQgKi8KKwkyLAkvKiAxNTIgKi8KKwkyLAkvKiAxNjAgKi8KKwkyLAkvKiAxNjggKi8KKwkyLAkvKiAxNzYgKi8KKwkyLAkvKiAxODQgKi8KKwkyCS8qIDE5MiAqLworfTsKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpnZXRfc2xhYihzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJaW50IGluZGV4OworCisJaWYgKHNpemUgPD0gMTkyKSB7CisJCWlmICghc2l6ZSkKKwkJCXJldHVybiBaRVJPX1NJWkVfUFRSOworCisJCWluZGV4ID0gc2l6ZV9pbmRleFsoc2l6ZSAtIDEpIC8gOF07CisJfSBlbHNlIHsKKwkJaWYgKHNpemUgPiBLTUFMTE9DX01BWF9TSVpFKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaW5kZXggPSBmbHMoc2l6ZSAtIDEpOworCX0KKworI2lmZGVmIENPTkZJR19aT05FX0RNQQorCWlmICh1bmxpa2VseSgoZmxhZ3MgJiBTTFVCX0RNQSkpKQorCQlyZXR1cm4gZG1hX2ttYWxsb2NfY2FjaGUoaW5kZXgsIGZsYWdzKTsKKwogI2VuZGlmCiAJcmV0dXJuICZrbWFsbG9jX2NhY2hlc1tpbmRleF07CiB9CkBAIC0yMjQyLDkgKzIzNjksMTAgQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGdldF9zbGFiKHNpemUsIGZsYWdzKTsKIAotCWlmIChzKQotCQlyZXR1cm4gc2xhYl9hbGxvYyhzLCBmbGFncywgLTEsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Ci0JcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJaWYgKFpFUk9fT1JfTlVMTF9QVFIocykpCisJCXJldHVybiBzOworCisJcmV0dXJuIHNsYWJfYWxsb2MocywgZmxhZ3MsIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTChfX2ttYWxsb2MpOwogCkBAIC0yMjUzLDkgKzIzODEsMTAgQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGdldF9zbGFiKHNpemUsIGZsYWdzKTsKIAotCWlmIChzKQotCQlyZXR1cm4gc2xhYl9hbGxvYyhzLCBmbGFncywgbm9kZSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwlpZiAoWkVST19PUl9OVUxMX1BUUihzKSkKKwkJcmV0dXJuIHM7CisKKwlyZXR1cm4gc2xhYl9hbGxvYyhzLCBmbGFncywgbm9kZSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIEVYUE9SVF9TWU1CT0woX19rbWFsbG9jX25vZGUpOwogI2VuZGlmCkBAIC0yMzA2LDcgKzI0MzUsNyBAQAogCSAqIHRoaXMgY29tcGFyaXNvbiB3b3VsZCBiZSB0cnVlIGZvciBhbGwgIm5lZ2F0aXZlIiBwb2ludGVycwogCSAqICh3aGljaCB3b3VsZCBjb3ZlciB0aGUgd2hvbGUgdXBwZXIgaGFsZiBvZiB0aGUgYWRkcmVzcyBzcGFjZSkuCiAJICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKXggPD0gKHVuc2lnbmVkIGxvbmcpWkVST19TSVpFX1BUUikKKwlpZiAoWkVST19PUl9OVUxMX1BUUih4KSkKIAkJcmV0dXJuOwogCiAJcGFnZSA9IHZpcnRfdG9faGVhZF9wYWdlKHgpOwpAQCAtMjM5NSw0MyArMjUyNCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfc2hyaW5rKTsKIAotLyoqCi0gKiBrcmVhbGxvYyAtIHJlYWxsb2NhdGUgbWVtb3J5LiBUaGUgY29udGVudHMgd2lsbCByZW1haW4gdW5jaGFuZ2VkLgotICogQHA6IG9iamVjdCB0byByZWFsbG9jYXRlIG1lbW9yeSBmb3IuCi0gKiBAbmV3X3NpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KLSAqCi0gKiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCBwb2ludGVkIHRvIGFyZSBwcmVzZXJ2ZWQgdXAgdG8gdGhlCi0gKiBsZXNzZXIgb2YgdGhlIG5ldyBhbmQgb2xkIHNpemVzLiAgSWYgQHAgaXMgJU5VTEwsIGtyZWFsbG9jKCkKLSAqIGJlaGF2ZXMgZXhhY3RseSBsaWtlIGttYWxsb2MoKS4gIElmIEBzaXplIGlzIDAgYW5kIEBwIGlzIG5vdCBhCi0gKiAlTlVMTCBwb2ludGVyLCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gaXMgZnJlZWQuCi0gKi8KLXZvaWQgKmtyZWFsbG9jKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBuZXdfc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqcmV0OwotCXNpemVfdCBrczsKLQotCWlmICh1bmxpa2VseSghcCB8fCBwID09IFpFUk9fU0laRV9QVFIpKQotCQlyZXR1cm4ga21hbGxvYyhuZXdfc2l6ZSwgZmxhZ3MpOwotCi0JaWYgKHVubGlrZWx5KCFuZXdfc2l6ZSkpIHsKLQkJa2ZyZWUocCk7Ci0JCXJldHVybiBaRVJPX1NJWkVfUFRSOwotCX0KLQotCWtzID0ga3NpemUocCk7Ci0JaWYgKGtzID49IG5ld19zaXplKQotCQlyZXR1cm4gKHZvaWQgKilwOwotCi0JcmV0ID0ga21hbGxvYyhuZXdfc2l6ZSwgZmxhZ3MpOwotCWlmIChyZXQpIHsKLQkJbWVtY3B5KHJldCwgcCwgbWluKG5ld19zaXplLCBrcykpOwotCQlrZnJlZShwKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woa3JlYWxsb2MpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJQmFzaWMgc2V0dXAgb2Ygc2xhYnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ3NCw2ICsyNTY2LDI0IEBACiAJCWNhY2hlcysrOwogCX0KIAorCisJLyoKKwkgKiBQYXRjaCB1cCB0aGUgc2l6ZV9pbmRleCB0YWJsZSBpZiB3ZSBoYXZlIHN0cmFuZ2UgbGFyZ2UgYWxpZ25tZW50CisJICogcmVxdWlyZW1lbnRzIGZvciB0aGUga21hbGxvYyBhcnJheS4gVGhpcyBpcyBvbmx5IHRoZSBjYXNlIGZvcgorCSAqIG1pcHMgaXQgc2VlbXMuIFRoZSBzdGFuZGFyZCBhcmNoZXMgd2lsbCBub3QgZ2VuZXJhdGUgYW55IGNvZGUgaGVyZS4KKwkgKgorCSAqIExhcmdlc3QgcGVybWl0dGVkIGFsaWdubWVudCBpcyAyNTYgYnl0ZXMgZHVlIHRvIHRoZSB3YXkgd2UKKwkgKiBoYW5kbGUgdGhlIGluZGV4IGRldGVybWluYXRpb24gZm9yIHRoZSBzbWFsbGVyIGNhY2hlcy4KKwkgKgorCSAqIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgY3JhenkgaGFwcGVucyBpZiBzb21lb25lIHN0YXJ0cyB0aW5rZXJpbmcKKwkgKiBhcm91bmQgd2l0aCBBUkNIX0tNQUxMT0NfTUlOQUxJR04KKwkgKi8KKwlCVUlMRF9CVUdfT04oS01BTExPQ19NSU5fU0laRSA+IDI1NiB8fAorCQkoS01BTExPQ19NSU5fU0laRSAmIChLTUFMTE9DX01JTl9TSVpFIC0gMSkpKTsKKworCWZvciAoaSA9IDg7IGkgPCBLTUFMTE9DX01JTl9TSVpFOyBpICs9IDgpCisJCXNpemVfaW5kZXhbKGkgLSAxKSAvIDhdID0gS01BTExPQ19TSElGVF9MT1c7CisKIAlzbGFiX3N0YXRlID0gVVA7CiAKIAkvKiBQcm92aWRlIHRoZSBjb3JyZWN0IGttYWxsb2MgbmFtZXMgbm93IHRoYXQgdGhlIGNhY2hlcyBhcmUgdXAgKi8KQEAgLTI1MTksNyArMjYyOSw3IEBACiAJCXNpemVfdCBhbGlnbiwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJdm9pZCAoKmN0b3IpKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwgdW5zaWduZWQgbG9uZykpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKIAogCWlmIChzbHViX25vbWVyZ2UgfHwgKGZsYWdzICYgU0xVQl9ORVZFUl9NRVJHRSkpCiAJCXJldHVybiBOVUxMOwpAQCAtMjUzMSwxMCArMjY0MSw3IEBACiAJYWxpZ24gPSBjYWxjdWxhdGVfYWxpZ25tZW50KGZsYWdzLCBhbGlnbiwgc2l6ZSk7CiAJc2l6ZSA9IEFMSUdOKHNpemUsIGFsaWduKTsKIAotCWxpc3RfZm9yX2VhY2goaCwgJnNsYWJfY2FjaGVzKSB7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICpzID0KLQkJCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgewogCQlpZiAoc2xhYl91bm1lcmdlYWJsZShzKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yNTc3LDI1ICsyNjg0LDI2IEBACiAJCSAqLwogCQlzLT5vYmpzaXplID0gbWF4KHMtPm9ianNpemUsIChpbnQpc2l6ZSk7CiAJCXMtPmludXNlID0gbWF4X3QoaW50LCBzLT5pbnVzZSwgQUxJR04oc2l6ZSwgc2l6ZW9mKHZvaWQgKikpKTsKKwkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CiAJCWlmIChzeXNmc19zbGFiX2FsaWFzKHMsIG5hbWUpKQogCQkJZ290byBlcnI7Ci0JfSBlbHNlIHsKLQkJcyA9IGttYWxsb2Moa21lbV9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHMgJiYga21lbV9jYWNoZV9vcGVuKHMsIEdGUF9LRVJORUwsIG5hbWUsCisJCXJldHVybiBzOworCX0KKwlzID0ga21hbGxvYyhrbWVtX3NpemUsIEdGUF9LRVJORUwpOworCWlmIChzKSB7CisJCWlmIChrbWVtX2NhY2hlX29wZW4ocywgR0ZQX0tFUk5FTCwgbmFtZSwKIAkJCQlzaXplLCBhbGlnbiwgZmxhZ3MsIGN0b3IpKSB7Ci0JCQlpZiAoc3lzZnNfc2xhYl9hZGQocykpIHsKLQkJCQlrZnJlZShzKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KIAkJCWxpc3RfYWRkKCZzLT5saXN0LCAmc2xhYl9jYWNoZXMpOwotCQl9IGVsc2UKLQkJCWtmcmVlKHMpOworCQkJdXBfd3JpdGUoJnNsdWJfbG9jayk7CisJCQlpZiAoc3lzZnNfc2xhYl9hZGQocykpCisJCQkJZ290byBlcnI7CisJCQlyZXR1cm4gczsKKwkJfQorCQlrZnJlZShzKTsKIAl9CiAJdXBfd3JpdGUoJnNsdWJfbG9jayk7Ci0JcmV0dXJuIHM7CiAKIGVycjoKLQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKIAlpZiAoZmxhZ3MgJiBTTEFCX1BBTklDKQogCQlwYW5pYygiQ2Fubm90IGNyZWF0ZSBzbGFiY2FjaGUgJXNcbiIsIG5hbWUpOwogCWVsc2UKQEAgLTI2MDQsNDUgKzI3MTIsNyBAQAogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2NyZWF0ZSk7CiAKLXZvaWQgKmttZW1fY2FjaGVfemFsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBnZnBfdCBmbGFncykKLXsKLQl2b2lkICp4OwotCi0JeCA9IHNsYWJfYWxsb2MocywgZmxhZ3MsIC0xLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCWlmICh4KQotCQltZW1zZXQoeCwgMCwgcy0+b2Jqc2l6ZSk7Ci0JcmV0dXJuIHg7Ci19Ci1FWFBPUlRfU1lNQk9MKGttZW1fY2FjaGVfemFsbG9jKTsKLQogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIGZvcl9hbGxfc2xhYnModm9pZCAoKmZ1bmMpKHN0cnVjdCBrbWVtX2NhY2hlICosIGludCksIGludCBjcHUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaDsKLQotCWRvd25fcmVhZCgmc2x1Yl9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKGgsICZzbGFiX2NhY2hlcykgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9Ci0JCQljb250YWluZXJfb2YoaCwgc3RydWN0IGttZW1fY2FjaGUsIGxpc3QpOwotCi0JCWZ1bmMocywgY3B1KTsKLQl9Ci0JdXBfcmVhZCgmc2x1Yl9sb2NrKTsKLX0KLQotLyoKLSAqIFZlcnNpb24gb2YgX19mbHVzaF9jcHVfc2xhYiBmb3IgdGhlIGNhc2UgdGhhdCBpbnRlcnJ1cHRzCi0gKiBhcmUgZW5hYmxlZC4KLSAqLwotc3RhdGljIHZvaWQgY3B1X3NsYWJfZmx1c2goc3RydWN0IGttZW1fY2FjaGUgKnMsIGludCBjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfX2ZsdXNoX2NwdV9zbGFiKHMsIGNwdSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCiAvKgogICogVXNlIHRoZSBjcHUgbm90aWZpZXIgdG8gaW5zdXJlIHRoYXQgdGhlIGNwdSBzbGFicyBhcmUgZmx1c2hlZCB3aGVuCiAgKiBuZWNlc3NhcnkuCkBAIC0yNjUxLDEzICsyNzIxLDIxIEBACiAJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQogewogCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9VUF9DQU5DRUxFRDoKIAljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46CiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJZm9yX2FsbF9zbGFicyhjcHVfc2xhYl9mbHVzaCwgY3B1KTsKKwkJZG93bl9yZWFkKCZzbHViX2xvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgeworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkJX19mbHVzaF9jcHVfc2xhYihzLCBjcHUpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CisJCXVwX3JlYWQoJnNsdWJfbG9jayk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMjY3NCw4ICsyNzUyLDggQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqcyA9IGdldF9zbGFiKHNpemUsIGdmcGZsYWdzKTsKIAotCWlmICghcykKLQkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJaWYgKFpFUk9fT1JfTlVMTF9QVFIocykpCisJCXJldHVybiBzOwogCiAJcmV0dXJuIHNsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIC0xLCBjYWxsZXIpOwogfQpAQCAtMjY4NSwxOCArMjc2MywxOCBAQAogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzID0gZ2V0X3NsYWIoc2l6ZSwgZ2ZwZmxhZ3MpOwogCi0JaWYgKCFzKQotCQlyZXR1cm4gWkVST19TSVpFX1BUUjsKKwlpZiAoWkVST19PUl9OVUxMX1BUUihzKSkKKwkJcmV0dXJuIHM7CiAKIAlyZXR1cm4gc2xhYl9hbGxvYyhzLCBnZnBmbGFncywgbm9kZSwgY2FsbGVyKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX1NZU0ZTKSAmJiBkZWZpbmVkKENPTkZJR19TTFVCX0RFQlVHKQotc3RhdGljIGludCB2YWxpZGF0ZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCQl1bnNpZ25lZCBsb25nICptYXApCiB7CiAJdm9pZCAqcDsKIAl2b2lkICphZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCURFQ0xBUkVfQklUTUFQKG1hcCwgcy0+b2JqZWN0cyk7CiAKIAlpZiAoIWNoZWNrX3NsYWIocywgcGFnZSkgfHwKIAkJCSFvbl9mcmVlbGlzdChzLCBwYWdlLCBOVUxMKSkKQEAgLTI3MTgsMTAgKzI3OTYsMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgdmFsaWRhdGVfc2xhYl9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX3NsYWJfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCQl1bnNpZ25lZCBsb25nICptYXApCiB7CiAJaWYgKHNsYWJfdHJ5bG9jayhwYWdlKSkgewotCQl2YWxpZGF0ZV9zbGFiKHMsIHBhZ2UpOworCQl2YWxpZGF0ZV9zbGFiKHMsIHBhZ2UsIG1hcCk7CiAJCXNsYWJfdW5sb2NrKHBhZ2UpOwogCX0gZWxzZQogCQlwcmludGsoS0VSTl9JTkZPICJTTFVCICVzOiBTa2lwcGVkIGJ1c3kgc2xhYiAweCVwXG4iLApAQCAtMjczOCw3ICsyODE3LDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYl9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuKQorc3RhdGljIGludCB2YWxpZGF0ZV9zbGFiX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKnMsCisJCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sIHVuc2lnbmVkIGxvbmcgKm1hcCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTI3NDcsNyArMjgyNyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm4tPmxpc3RfbG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmbi0+cGFydGlhbCwgbHJ1KSB7Ci0JCXZhbGlkYXRlX3NsYWJfc2xhYihzLCBwYWdlKTsKKwkJdmFsaWRhdGVfc2xhYl9zbGFiKHMsIHBhZ2UsIG1hcCk7CiAJCWNvdW50Kys7CiAJfQogCWlmIChjb3VudCAhPSBuLT5ucl9wYXJ0aWFsKQpAQCAtMjc1OCw3ICsyODM4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZuLT5mdWxsLCBscnUpIHsKLQkJdmFsaWRhdGVfc2xhYl9zbGFiKHMsIHBhZ2UpOworCQl2YWxpZGF0ZV9zbGFiX3NsYWIocywgcGFnZSwgbWFwKTsKIAkJY291bnQrKzsKIAl9CiAJaWYgKGNvdW50ICE9IGF0b21pY19sb25nX3JlYWQoJm4tPm5yX3NsYWJzKSkKQEAgLTI3NzEsMTcgKzI4NTEsMjMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZhbGlkYXRlX3NsYWJfY2FjaGUoc3RydWN0IGttZW1fY2FjaGUgKnMpCitzdGF0aWMgbG9uZyB2YWxpZGF0ZV9zbGFiX2NhY2hlKHN0cnVjdCBrbWVtX2NhY2hlICpzKQogewogCWludCBub2RlOwogCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgKm1hcCA9IGttYWxsb2MoQklUU19UT19MT05HUyhzLT5vYmplY3RzKSAqCisJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWFwKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWZsdXNoX2FsbChzKTsKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CiAJCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4gPSBnZXRfbm9kZShzLCBub2RlKTsKIAotCQljb3VudCArPSB2YWxpZGF0ZV9zbGFiX25vZGUocywgbik7CisJCWNvdW50ICs9IHZhbGlkYXRlX3NsYWJfbm9kZShzLCBuLCBtYXApOwogCX0KKwlrZnJlZShtYXApOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMjg3MCwxOCArMjk1NiwxNCBAQAogCQkJZ2V0X29yZGVyKHNpemVvZihzdHJ1Y3QgbG9jYXRpb24pICogdC0+bWF4KSk7CiB9CiAKLXN0YXRpYyBpbnQgYWxsb2NfbG9jX3RyYWNrKHN0cnVjdCBsb2NfdHJhY2sgKnQsIHVuc2lnbmVkIGxvbmcgbWF4KQorc3RhdGljIGludCBhbGxvY19sb2NfdHJhY2soc3RydWN0IGxvY190cmFjayAqdCwgdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGZsYWdzKQogewogCXN0cnVjdCBsb2NhdGlvbiAqbDsKIAlpbnQgb3JkZXI7CiAKLQlpZiAoIW1heCkKLQkJbWF4ID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBsb2NhdGlvbik7Ci0KIAlvcmRlciA9IGdldF9vcmRlcihzaXplb2Yoc3RydWN0IGxvY2F0aW9uKSAqIG1heCk7CiAKLQlsID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIG9yZGVyKTsKLQorCWwgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MsIG9yZGVyKTsKIAlpZiAoIWwpCiAJCXJldHVybiAwOwogCkBAIC0yOTQ3LDcgKzMwMjksNyBAQAogCS8qCiAJICogTm90IGZvdW5kLiBJbnNlcnQgbmV3IHRyYWNraW5nIGVsZW1lbnQuCiAJICovCi0JaWYgKHQtPmNvdW50ID49IHQtPm1heCAmJiAhYWxsb2NfbG9jX3RyYWNrKHQsIDIgKiB0LT5tYXgpKQorCWlmICh0LT5jb3VudCA+PSB0LT5tYXggJiYgIWFsbG9jX2xvY190cmFjayh0LCAyICogdC0+bWF4LCBHRlBfQVRPTUlDKSkKIAkJcmV0dXJuIDA7CiAKIAlsID0gdC0+bG9jICsgcG9zOwpAQCAtMjk5MCwxMSArMzA3MiwxMiBAQAogewogCWludCBuID0gMDsKIAl1bnNpZ25lZCBsb25nIGk7Ci0Jc3RydWN0IGxvY190cmFjayB0OworCXN0cnVjdCBsb2NfdHJhY2sgdCA9IHsgMCwgMCwgTlVMTCB9OwogCWludCBub2RlOwogCi0JdC5jb3VudCA9IDA7Ci0JdC5tYXggPSAwOworCWlmICghYWxsb2NfbG9jX3RyYWNrKCZ0LCBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGxvY2F0aW9uKSwKKwkJCUdGUF9LRVJORUwpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICJPdXQgb2YgbWVtb3J5XG4iKTsKIAogCS8qIFB1c2ggYmFjayBjcHUgc2xhYnMgKi8KIAlmbHVzaF9hbGwocyk7CkBAIC0zMzk4LDExICszNDgxLDE0IEBACiBzdGF0aWMgc3NpemVfdCB2YWxpZGF0ZV9zdG9yZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKIHsKLQlpZiAoYnVmWzBdID09ICcxJykKLQkJdmFsaWRhdGVfc2xhYl9jYWNoZShzKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiBsZW5ndGg7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoYnVmWzBdID09ICcxJykgeworCQlyZXQgPSB2YWxpZGF0ZV9zbGFiX2NhY2hlKHMpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSBsZW5ndGg7CisJfQorCXJldHVybiByZXQ7CiB9CiBTTEFCX0FUVFIodmFsaWRhdGUpOwogCkBAIC0zNTU2LDcgKzM2NDIsNyBAQAogCS5maWx0ZXIgPSB1ZXZlbnRfZmlsdGVyLAogfTsKIAotZGVjbF9zdWJzeXMoc2xhYiwgJnNsYWJfa3R5cGUsICZzbGFiX3VldmVudF9vcHMpOworc3RhdGljIGRlY2xfc3Vic3lzKHNsYWIsICZzbGFiX2t0eXBlLCAmc2xhYl91ZXZlbnRfb3BzKTsKIAogI2RlZmluZSBJRF9TVFJfTEVOR1RIIDY0CiAKQEAgLTM2NTQsNyArMzc0MCw3IEBACiAJc3RydWN0IHNhdmVkX2FsaWFzICpuZXh0OwogfTsKIAotc3RydWN0IHNhdmVkX2FsaWFzICphbGlhc19saXN0Oworc3RhdGljIHN0cnVjdCBzYXZlZF9hbGlhcyAqYWxpYXNfbGlzdDsKIAogc3RhdGljIGludCBzeXNmc19zbGFiX2FsaWFzKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMzY4Miw3ICszNzY4LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2xhYl9zeXNmc19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKIAlpbnQgZXJyOwogCiAJZXJyID0gc3Vic3lzdGVtX3JlZ2lzdGVyKCZzbGFiX3N1YnN5cyk7CkBAIC0zNjkzLDEwICszNzc5LDcgQEAKIAogCXNsYWJfc3RhdGUgPSBTWVNGUzsKIAotCWxpc3RfZm9yX2VhY2goaCwgJnNsYWJfY2FjaGVzKSB7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICpzID0KLQkJCWNvbnRhaW5lcl9vZihoLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgewogCQllcnIgPSBzeXNmc19zbGFiX2FkZChzKTsKIAkJQlVHX09OKGVycik7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcF9zdGF0ZS5jIGIvbW0vc3dhcF9zdGF0ZS5jCmluZGV4IDVmN2NmMmEuLjY3ZGFlY2IgMTAwNjQ0Ci0tLSBhL21tL3N3YXBfc3RhdGUuYworKysgYi9tbS9zd2FwX3N0YXRlLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoKICAqIHN3YXBwZXJfc3BhY2UgaXMgYSBmaWN0aW9uLCByZXRhaW5lZCB0byBzaW1wbGlmeSB0aGUgcGF0aCB0aHJvdWdoCi0gKiB2bXNjYW4ncyBzaHJpbmtfbGlzdCwgdG8gbWFrZSBzeW5jX3BhZ2UgbG9vayBuaWNlciwgYW5kIHRvIGFsbG93CisgKiB2bXNjYW4ncyBzaHJpbmtfcGFnZV9saXN0LCB0byBtYWtlIHN5bmNfcGFnZSBsb29rIG5pY2VyLCBhbmQgdG8gYWxsb3cKICAqIGZ1dHVyZSB1c2Ugb2YgcmFkaXhfdHJlZSB0YWdzIGluIHRoZSBzd2FwIGNhY2hlLgogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzd2FwX2FvcHMgPSB7CkBAIC0zMzQsNyArMzM0LDggQEAKIAkJICogR2V0IGEgbmV3IHBhZ2UgdG8gcmVhZCBpbnRvIGZyb20gc3dhcC4KIAkJICovCiAJCWlmICghbmV3X3BhZ2UpIHsKLQkJCW5ld19wYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsIGFkZHIpOworCQkJbmV3X3BhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVJfTU9WQUJMRSwKKwkJCQkJCQkJdm1hLCBhZGRyKTsKIAkJCWlmICghbmV3X3BhZ2UpCiAJCQkJYnJlYWs7CQkvKiBPdXQgb2YgbWVtb3J5ICovCiAJCX0KZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IGFjYzE3MmMuLjdmZjBhODEgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtODg1LDcgKzg4NSw3IEBACiAJCS8qCiAJCSAqIFNvIHdlIGNvdWxkIHNraXAgc2VhcmNoaW5nIG1tcyBvbmNlIHN3YXAgY291bnQgd2VudAogCQkgKiB0byAxLCB3ZSBkaWQgbm90IG1hcmsgYW55IHByZXNlbnQgcHRlcyBhcyBkaXJ0eTogbXVzdAotCQkgKiBtYXJrIHBhZ2UgZGlydHkgc28gc2hyaW5rX2xpc3Qgd2lsbCBwcmVzZXJ2ZSBpdC4KKwkJICogbWFyayBwYWdlIGRpcnR5IHNvIHNocmlua19wYWdlX2xpc3Qgd2lsbCBwcmVzZXJ2ZSBpdC4KIAkJICovCiAJCVNldFBhZ2VEaXJ0eShwYWdlKTsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCA0ZmJlMWEyLi5mNDdlNDZkIDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTEwMCw5ICsxMDAsOSBAQAogCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKIAkJZG9faW52YWxpZGF0ZXBhZ2UocGFnZSwgMCk7CiAKKwlyZW1vdmVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOwogCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCUNsZWFyUGFnZU1hcHBlZFRvRGlzayhwYWdlKTsKLQlyZW1vdmVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsJLyogcGFnZWNhY2hlIHJlZiAqLwogfQogCkBAIC0yNTMsMjEgKzI1Myw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRydW5jYXRlX2lub2RlX3BhZ2VzKTsKIAotLyoqCi0gKiBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMgLSBJbnZhbGlkYXRlIGFsbCB0aGUgdW5sb2NrZWQgcGFnZXMgb2Ygb25lIGlub2RlCi0gKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2Ugd2hpY2ggaG9sZHMgdGhlIHBhZ2VzIHRvIGludmFsaWRhdGUKLSAqIEBzdGFydDogdGhlIG9mZnNldCAnZnJvbScgd2hpY2ggdG8gaW52YWxpZGF0ZQotICogQGVuZDogdGhlIG9mZnNldCAndG8nIHdoaWNoIHRvIGludmFsaWRhdGUgKGluY2x1c2l2ZSkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG9ubHkgcmVtb3ZlcyB0aGUgdW5sb2NrZWQgcGFnZXMsIGlmIHlvdSB3YW50IHRvCi0gKiByZW1vdmUgYWxsIHRoZSBwYWdlcyBvZiBvbmUgaW5vZGUsIHlvdSBtdXN0IGNhbGwgdHJ1bmNhdGVfaW5vZGVfcGFnZXMuCi0gKgotICogaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKCkgd2lsbCBub3QgYmxvY2sgb24gSU8gYWN0aXZpdHkuIEl0IHdpbGwgbm90Ci0gKiBpbnZhbGlkYXRlIHBhZ2VzIHdoaWNoIGFyZSBkaXJ0eSwgbG9ja2VkLCB1bmRlciB3cml0ZWJhY2sgb3IgbWFwcGVkIGludG8KLSAqIHBhZ2V0YWJsZXMuCi0gKi8KLXVuc2lnbmVkIGxvbmcgaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJCXBnb2ZmX3Qgc3RhcnQsIHBnb2ZmX3QgZW5kKQordW5zaWduZWQgbG9uZyBfX2ludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQlwZ29mZl90IHN0YXJ0LCBwZ29mZl90IGVuZCwgYm9vbCBiZV9hdG9taWMpCiB7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlwZ29mZl90IG5leHQgPSBzdGFydDsKQEAgLTMwOCwxNyArMjk1LDM4IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwkJaWYgKGxpa2VseSghYmVfYXRvbWljKSkKKwkJCWNvbmRfcmVzY2hlZCgpOwogCX0KIAlyZXR1cm4gcmV0OwogfQorCisvKioKKyAqIGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyAtIEludmFsaWRhdGUgYWxsIHRoZSB1bmxvY2tlZCBwYWdlcyBvZiBvbmUgaW5vZGUKKyAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzc19zcGFjZSB3aGljaCBob2xkcyB0aGUgcGFnZXMgdG8gaW52YWxpZGF0ZQorICogQHN0YXJ0OiB0aGUgb2Zmc2V0ICdmcm9tJyB3aGljaCB0byBpbnZhbGlkYXRlCisgKiBAZW5kOiB0aGUgb2Zmc2V0ICd0bycgd2hpY2ggdG8gaW52YWxpZGF0ZSAoaW5jbHVzaXZlKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gb25seSByZW1vdmVzIHRoZSB1bmxvY2tlZCBwYWdlcywgaWYgeW91IHdhbnQgdG8KKyAqIHJlbW92ZSBhbGwgdGhlIHBhZ2VzIG9mIG9uZSBpbm9kZSwgeW91IG11c3QgY2FsbCB0cnVuY2F0ZV9pbm9kZV9wYWdlcy4KKyAqCisgKiBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoKSB3aWxsIG5vdCBibG9jayBvbiBJTyBhY3Rpdml0eS4gSXQgd2lsbCBub3QKKyAqIGludmFsaWRhdGUgcGFnZXMgd2hpY2ggYXJlIGRpcnR5LCBsb2NrZWQsIHVuZGVyIHdyaXRlYmFjayBvciBtYXBwZWQgaW50bworICogcGFnZXRhYmxlcy4KKyAqLwordW5zaWduZWQgbG9uZyBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJcGdvZmZfdCBzdGFydCwgcGdvZmZfdCBlbmQpCit7CisJcmV0dXJuIF9faW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKG1hcHBpbmcsIHN0YXJ0LCBlbmQsIGZhbHNlKTsKK30KIEVYUE9SVF9TWU1CT0woaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKTsKIAogLyoKICAqIFRoaXMgaXMgbGlrZSBpbnZhbGlkYXRlX2NvbXBsZXRlX3BhZ2UoKSwgZXhjZXB0IGl0IGlnbm9yZXMgdGhlIHBhZ2UncwogICogcmVmY291bnQuICBXZSBkbyB0aGlzIGJlY2F1c2UgaW52YWxpZGF0ZV9pbm9kZV9wYWdlczIoKSBuZWVkcyBzdHJvbmdlcgogICogaW52YWxpZGF0aW9uIGd1YXJhbnRlZXMsIGFuZCBjYW5ub3QgYWZmb3JkIHRvIGxlYXZlIHBhZ2VzIGJlaGluZCBiZWNhdXNlCi0gKiBzaHJpbmtfbGlzdCgpIGhhcyBhIHRlbXAgcmVmIG9uIHRoZW0sIG9yIGJlY2F1c2UgdGhleSdyZSB0cmFuc2llbnRseSBzaXR0aW5nCi0gKiBpbiB0aGUgbHJ1X2NhY2hlX2FkZCgpIHBhZ2V2ZWNzLgorICogc2hyaW5rX3BhZ2VfbGlzdCgpIGhhcyBhIHRlbXAgcmVmIG9uIHRoZW0sIG9yIGJlY2F1c2UgdGhleSdyZSB0cmFuc2llbnRseQorICogc2l0dGluZyBpbiB0aGUgbHJ1X2NhY2hlX2FkZCgpIHBhZ2V2ZWNzLgogICovCiBzdGF0aWMgaW50CiBpbnZhbGlkYXRlX2NvbXBsZXRlX3BhZ2UyKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKZGlmZiAtLWdpdCBhL21tL3V0aWwuYyBiL21tL3V0aWwuYwppbmRleCBhY2UyYWVhLi43OGYzNzgzIDEwMDY0NAotLS0gYS9tbS91dGlsLmMKKysrIGIvbW0vdXRpbC5jCkBAIC01LDIwICs1LDYgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAvKioKLSAqIF9fa3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KLSAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgotICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCi0gKi8KLXZvaWQgKl9fa3phbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCi17Ci0Jdm9pZCAqcmV0ID0ga21hbGxvY190cmFja19jYWxsZXIoc2l6ZSwgZmxhZ3MpOwotCWlmIChyZXQpCi0JCW1lbXNldChyZXQsIDAsIHNpemUpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fa3phbGxvYyk7Ci0KLS8qCiAgKiBrc3RyZHVwIC0gYWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBjb3B5IGFuIGV4aXN0aW5nIHN0cmluZwogICoKICAqIEBzOiB0aGUgc3RyaW5nIHRvIGR1cGxpY2F0ZQpAQCAtNTgsNiArNDQsNDAgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbWR1cCk7CiAKKy8qKgorICoga3JlYWxsb2MgLSByZWFsbG9jYXRlIG1lbW9yeS4gVGhlIGNvbnRlbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4KKyAqIEBwOiBvYmplY3QgdG8gcmVhbGxvY2F0ZSBtZW1vcnkgZm9yLgorICogQG5ld19zaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcG9pbnRlZCB0byBhcmUgcHJlc2VydmVkIHVwIHRvIHRoZQorICogbGVzc2VyIG9mIHRoZSBuZXcgYW5kIG9sZCBzaXplcy4gIElmIEBwIGlzICVOVUxMLCBrcmVhbGxvYygpCisgKiBiZWhhdmVzIGV4YWN0bHkgbGlrZSBrbWFsbG9jKCkuICBJZiBAc2l6ZSBpcyAwIGFuZCBAcCBpcyBub3QgYQorICogJU5VTEwgcG9pbnRlciwgdGhlIG9iamVjdCBwb2ludGVkIHRvIGlzIGZyZWVkLgorICovCit2b2lkICprcmVhbGxvYyhjb25zdCB2b2lkICpwLCBzaXplX3QgbmV3X3NpemUsIGdmcF90IGZsYWdzKQoreworCXZvaWQgKnJldDsKKwlzaXplX3Qga3M7CisKKwlpZiAodW5saWtlbHkoIW5ld19zaXplKSkgeworCQlrZnJlZShwKTsKKwkJcmV0dXJuIFpFUk9fU0laRV9QVFI7CisJfQorCisJa3MgPSBrc2l6ZShwKTsKKwlpZiAoa3MgPj0gbmV3X3NpemUpCisJCXJldHVybiAodm9pZCAqKXA7CisKKwlyZXQgPSBrbWFsbG9jX3RyYWNrX2NhbGxlcihuZXdfc2l6ZSwgZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJbWVtY3B5KHJldCwgcCwgbWluKG5ld19zaXplLCBrcykpOworCQlrZnJlZShwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woa3JlYWxsb2MpOworCiAvKgogICogc3RybmR1cF91c2VyIC0gZHVwbGljYXRlIGFuIGV4aXN0aW5nIHN0cmluZyBmcm9tIHVzZXIgc3BhY2UKICAqCmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggZDNhOWM1My4uOGUwNWExMSAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtNjgsMTIgKzY4LDEyIEBACiAJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiB9CiAKLXZvaWQgdW5tYXBfdm1fYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhKQordm9pZCB1bm1hcF9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJcGdkX3QgKnBnZDsKIAl1bnNpZ25lZCBsb25nIG5leHQ7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFyZWEtPmFkZHI7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgYXJlYS0+c2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gYWRkcjsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHIgKyBzaXplOwogCiAJQlVHX09OKGFkZHIgPj0gZW5kKTsKIAlwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7CkBAIC04NCw3ICs4NCwxMiBAQAogCQkJY29udGludWU7CiAJCXZ1bm1hcF9wdWRfcmFuZ2UocGdkLCBhZGRyLCBuZXh0KTsKIAl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKLQlmbHVzaF90bGJfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBhcmVhLT5hZGRyLCBlbmQpOworCWZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uoc3RhcnQsIGVuZCk7Cit9CisKK3N0YXRpYyB2b2lkIHVubWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSkKK3sKKwl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYXJlYS0+YWRkciwgYXJlYS0+c2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgdm1hcF9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLApAQCAtNDI3LDExICs0MzIsMTIgQEAKIAlhcmVhLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOwogCS8qIFBsZWFzZSBub3RlIHRoYXQgdGhlIHJlY3Vyc2lvbiBpcyBzdHJpY3RseSBib3VuZGVkLiAqLwogCWlmIChhcnJheV9zaXplID4gUEFHRV9TSVpFKSB7Ci0JCXBhZ2VzID0gX192bWFsbG9jX25vZGUoYXJyYXlfc2l6ZSwgZ2ZwX21hc2ssIFBBR0VfS0VSTkVMLCBub2RlKTsKKwkJcGFnZXMgPSBfX3ZtYWxsb2Nfbm9kZShhcnJheV9zaXplLCBnZnBfbWFzayB8IF9fR0ZQX1pFUk8sCisJCQkJCVBBR0VfS0VSTkVMLCBub2RlKTsKIAkJYXJlYS0+ZmxhZ3MgfD0gVk1fVlBBR0VTOwogCX0gZWxzZSB7CiAJCXBhZ2VzID0ga21hbGxvY19ub2RlKGFycmF5X3NpemUsCi0JCQkJKGdmcF9tYXNrICYgR0ZQX0xFVkVMX01BU0spLAorCQkJCShnZnBfbWFzayAmIEdGUF9MRVZFTF9NQVNLKSB8IF9fR0ZQX1pFUk8sCiAJCQkJbm9kZSk7CiAJfQogCWFyZWEtPnBhZ2VzID0gcGFnZXM7CkBAIC00NDAsNyArNDQ2LDYgQEAKIAkJa2ZyZWUoYXJlYSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQoYXJlYS0+cGFnZXMsIDAsIGFycmF5X3NpemUpOwogCiAJZm9yIChpID0gMDsgaSA8IGFyZWEtPm5yX3BhZ2VzOyBpKyspIHsKIAkJaWYgKG5vZGUgPCAwKQpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCAxYmU1YTYzLi5kNDE5ZTEwIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNjYsMTcgKzY2LDggQEAKIAlpbnQgc3dhcHBpbmVzczsKIAogCWludCBhbGxfdW5yZWNsYWltYWJsZTsKLX07CiAKLS8qCi0gKiBUaGUgbGlzdCBvZiBzaHJpbmtlciBjYWxsYmFja3MgdXNlZCBieSB0byBhcHBseSBwcmVzc3VyZSB0bwotICogYWdlYWJsZSBjYWNoZXMuCi0gKi8KLXN0cnVjdCBzaHJpbmtlciB7Ci0Jc2hyaW5rZXJfdAkJc2hyaW5rZXI7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCWludAkJCXNlZWtzOwkvKiBzZWVrcyB0byByZWNyZWF0ZSBhbiBvYmogKi8KLQlsb25nCQkJbnI7CS8qIG9ianMgcGVuZGluZyBkZWxldGUgKi8KKwlpbnQgb3JkZXI7CiB9OwogCiAjZGVmaW5lIGxydV90b19wYWdlKF9oZWFkKSAobGlzdF9lbnRyeSgoX2hlYWQpLT5wcmV2LCBzdHJ1Y3QgcGFnZSwgbHJ1KSkKQEAgLTEyMSwzNCArMTEyLDI1IEBACiAvKgogICogQWRkIGEgc2hyaW5rZXIgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGZyb20gdGhlIHZtCiAgKi8KLXN0cnVjdCBzaHJpbmtlciAqc2V0X3Nocmlua2VyKGludCBzZWVrcywgc2hyaW5rZXJfdCB0aGVzaHJpbmtlcikKK3ZvaWQgcmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICpzaHJpbmtlcikKIHsKLSAgICAgICAgc3RydWN0IHNocmlua2VyICpzaHJpbmtlcjsKLQotICAgICAgICBzaHJpbmtlciA9IGttYWxsb2Moc2l6ZW9mKCpzaHJpbmtlciksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoc2hyaW5rZXIpIHsKLQkgICAgICAgIHNocmlua2VyLT5zaHJpbmtlciA9IHRoZXNocmlua2VyOwotCSAgICAgICAgc2hyaW5rZXItPnNlZWtzID0gc2Vla3M7Ci0JICAgICAgICBzaHJpbmtlci0+bnIgPSAwOwotCSAgICAgICAgZG93bl93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwotCSAgICAgICAgbGlzdF9hZGRfdGFpbCgmc2hyaW5rZXItPmxpc3QsICZzaHJpbmtlcl9saXN0KTsKLQkgICAgICAgIHVwX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7Ci0JfQotCXJldHVybiBzaHJpbmtlcjsKKwlzaHJpbmtlci0+bnIgPSAwOworCWRvd25fd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKKwlsaXN0X2FkZF90YWlsKCZzaHJpbmtlci0+bGlzdCwgJnNocmlua2VyX2xpc3QpOworCXVwX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHNldF9zaHJpbmtlcik7CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX3Nocmlua2VyKTsKIAogLyoKICAqIFJlbW92ZSBvbmUKICAqLwotdm9pZCByZW1vdmVfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICpzaHJpbmtlcikKK3ZvaWQgdW5yZWdpc3Rlcl9zaHJpbmtlcihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyKQogewogCWRvd25fd3JpdGUoJnNocmlua2VyX3J3c2VtKTsKIAlsaXN0X2RlbCgmc2hyaW5rZXItPmxpc3QpOwogCXVwX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7Ci0Ja2ZyZWUoc2hyaW5rZXIpOwogfQotRVhQT1JUX1NZTUJPTChyZW1vdmVfc2hyaW5rZXIpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3Nocmlua2VyKTsKIAogI2RlZmluZSBTSFJJTktfQkFUQ0ggMTI4CiAvKgpAQCAtMTg1LDcgKzE2Nyw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzaHJpbmtlciwgJnNocmlua2VyX2xpc3QsIGxpc3QpIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhOwogCQl1bnNpZ25lZCBsb25nIHRvdGFsX3NjYW47Ci0JCXVuc2lnbmVkIGxvbmcgbWF4X3Bhc3MgPSAoKnNocmlua2VyLT5zaHJpbmtlcikoMCwgZ2ZwX21hc2spOworCQl1bnNpZ25lZCBsb25nIG1heF9wYXNzID0gKCpzaHJpbmtlci0+c2hyaW5rKSgwLCBnZnBfbWFzayk7CiAKIAkJZGVsdGEgPSAoNCAqIHNjYW5uZWQpIC8gc2hyaW5rZXItPnNlZWtzOwogCQlkZWx0YSAqPSBtYXhfcGFzczsKQEAgLTIxMyw4ICsxOTUsOCBAQAogCQkJaW50IHNocmlua19yZXQ7CiAJCQlpbnQgbnJfYmVmb3JlOwogCi0JCQlucl9iZWZvcmUgPSAoKnNocmlua2VyLT5zaHJpbmtlcikoMCwgZ2ZwX21hc2spOwotCQkJc2hyaW5rX3JldCA9ICgqc2hyaW5rZXItPnNocmlua2VyKSh0aGlzX3NjYW4sIGdmcF9tYXNrKTsKKwkJCW5yX2JlZm9yZSA9ICgqc2hyaW5rZXItPnNocmluaykoMCwgZ2ZwX21hc2spOworCQkJc2hyaW5rX3JldCA9ICgqc2hyaW5rZXItPnNocmluaykodGhpc19zY2FuLCBnZnBfbWFzayk7CiAJCQlpZiAoc2hyaW5rX3JldCA9PSAtMSkKIAkJCQlicmVhazsKIAkJCWlmIChzaHJpbmtfcmV0IDwgbnJfYmVmb3JlKQpAQCAtNDgxLDcgKzQ2Myw4IEBACiAKIAkJcmVmZXJlbmNlZCA9IHBhZ2VfcmVmZXJlbmNlZChwYWdlLCAxKTsKIAkJLyogSW4gYWN0aXZlIHVzZSBvciByZWFsbHkgdW5mcmVlYWJsZT8gIEFjdGl2YXRlIGl0LiAqLwotCQlpZiAocmVmZXJlbmNlZCAmJiBwYWdlX21hcHBpbmdfaW51c2UocGFnZSkpCisJCWlmIChzYy0+b3JkZXIgPD0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYKKwkJCQkJcmVmZXJlbmNlZCAmJiBwYWdlX21hcHBpbmdfaW51c2UocGFnZSkpCiAJCQlnb3RvIGFjdGl2YXRlX2xvY2tlZDsKIAogI2lmZGVmIENPTkZJR19TV0FQCkBAIC01MTQsNyArNDk3LDcgQEAKIAkJfQogCiAJCWlmIChQYWdlRGlydHkocGFnZSkpIHsKLQkJCWlmIChyZWZlcmVuY2VkKQorCQkJaWYgKHNjLT5vcmRlciA8PSBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUiAmJiByZWZlcmVuY2VkKQogCQkJCWdvdG8ga2VlcF9sb2NrZWQ7CiAJCQlpZiAoIW1heV9lbnRlcl9mcykKIAkJCQlnb3RvIGtlZXBfbG9ja2VkOwpAQCAtNTk4LDYgKzU4MSw1MSBAQAogCXJldHVybiBucl9yZWNsYWltZWQ7CiB9CiAKKy8qIExSVSBJc29sYXRpb24gbW9kZXMuICovCisjZGVmaW5lIElTT0xBVEVfSU5BQ1RJVkUgMAkvKiBJc29sYXRlIGluYWN0aXZlIHBhZ2VzLiAqLworI2RlZmluZSBJU09MQVRFX0FDVElWRSAxCS8qIElzb2xhdGUgYWN0aXZlIHBhZ2VzLiAqLworI2RlZmluZSBJU09MQVRFX0JPVEggMgkJLyogSXNvbGF0ZSBib3RoIGFjdGl2ZSBhbmQgaW5hY3RpdmUgcGFnZXMuICovCisKKy8qCisgKiBBdHRlbXB0IHRvIHJlbW92ZSB0aGUgc3BlY2lmaWVkIHBhZ2UgZnJvbSBpdHMgTFJVLiAgT25seSB0YWtlIHRoaXMgcGFnZQorICogaWYgaXQgaXMgb2YgdGhlIGFwcHJvcHJpYXRlIFBhZ2VBY3RpdmUgc3RhdHVzLiAgUGFnZXMgd2hpY2ggYXJlIGJlaW5nCisgKiBmcmVlZCBlbHNld2hlcmUgYXJlIGFsc28gaWdub3JlZC4KKyAqCisgKiBwYWdlOglwYWdlIHRvIGNvbnNpZGVyCisgKiBtb2RlOglvbmUgb2YgdGhlIExSVSBpc29sYXRpb24gbW9kZXMgZGVmaW5lZCBhYm92ZQorICoKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2lzb2xhdGVfbHJ1X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtb2RlKQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJLyogT25seSB0YWtlIHBhZ2VzIG9uIHRoZSBMUlUuICovCisJaWYgKCFQYWdlTFJVKHBhZ2UpKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBXaGVuIGNoZWNraW5nIHRoZSBhY3RpdmUgc3RhdGUsIHdlIG5lZWQgdG8gYmUgc3VyZSB3ZSBhcmUKKwkgKiBkZWFsaW5nIHdpdGggY29tcGFyaWJsZSBib29sZWFuIHZhbHVlcy4gIFRha2UgdGhlIGxvZ2ljYWwgbm90CisJICogb2YgZWFjaC4KKwkgKi8KKwlpZiAobW9kZSAhPSBJU09MQVRFX0JPVEggJiYgKCFQYWdlQWN0aXZlKHBhZ2UpICE9ICFtb2RlKSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IC1FQlVTWTsKKwlpZiAobGlrZWx5KGdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSkgeworCQkvKgorCQkgKiBCZSBjYXJlZnVsIG5vdCB0byBjbGVhciBQYWdlTFJVIHVudGlsIGFmdGVyIHdlJ3JlCisJCSAqIHN1cmUgdGhlIHBhZ2UgaXMgbm90IGJlaW5nIGZyZWVkIGVsc2V3aGVyZSAtLSB0aGUKKwkJICogcGFnZSByZWxlYXNlIGNvZGUgcmVsaWVzIG9uIGl0LgorCQkgKi8KKwkJQ2xlYXJQYWdlTFJVKHBhZ2UpOworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiB6b25lLT5scnVfbG9jayBpcyBoZWF2aWx5IGNvbnRlbmRlZC4gIFNvbWUgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0CiAgKiBzaHJpbmsgdGhlIGxpc3RzIHBlcmZvcm0gYmV0dGVyIGJ5IHRha2luZyBvdXQgYSBiYXRjaCBvZiBwYWdlcwpAQCAtNjEyLDM4ICs2NDAsOTAgQEAKICAqIEBzcmM6CVRoZSBMUlUgbGlzdCB0byBwdWxsIHBhZ2VzIG9mZi4KICAqIEBkc3Q6CVRoZSB0ZW1wIGxpc3QgdG8gcHV0IHBhZ2VzIG9uIHRvLgogICogQHNjYW5uZWQ6CVRoZSBudW1iZXIgb2YgcGFnZXMgdGhhdCB3ZXJlIHNjYW5uZWQuCisgKiBAb3JkZXI6CVRoZSBjYWxsZXIncyBhdHRlbXB0ZWQgYWxsb2NhdGlvbiBvcmRlcgorICogQG1vZGU6CU9uZSBvZiB0aGUgTFJVIGlzb2xhdGlvbiBtb2RlcwogICoKICAqIHJldHVybnMgaG93IG1hbnkgcGFnZXMgd2VyZSBtb3ZlZCBvbnRvICpAZHN0LgogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpc29sYXRlX2xydV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCiAJCXN0cnVjdCBsaXN0X2hlYWQgKnNyYywgc3RydWN0IGxpc3RfaGVhZCAqZHN0LAotCQl1bnNpZ25lZCBsb25nICpzY2FubmVkKQorCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsIGludCBtb2RlKQogewogCXVuc2lnbmVkIGxvbmcgbnJfdGFrZW4gPSAwOwotCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgc2NhbjsKIAogCWZvciAoc2NhbiA9IDA7IHNjYW4gPCBucl90b19zY2FuICYmICFsaXN0X2VtcHR5KHNyYyk7IHNjYW4rKykgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICp0YXJnZXQ7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQl1bnNpZ25lZCBsb25nIHBmbjsKKwkJdW5zaWduZWQgbG9uZyBlbmRfcGZuOworCQl1bnNpZ25lZCBsb25nIHBhZ2VfcGZuOworCQlpbnQgem9uZV9pZDsKKwogCQlwYWdlID0gbHJ1X3RvX3BhZ2Uoc3JjKTsKIAkJcHJlZmV0Y2h3X3ByZXZfbHJ1X3BhZ2UocGFnZSwgc3JjLCBmbGFncyk7CiAKIAkJVk1fQlVHX09OKCFQYWdlTFJVKHBhZ2UpKTsKIAotCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQkJdGFyZ2V0ID0gc3JjOwotCQlpZiAobGlrZWx5KGdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKSkgewotCQkJLyoKLQkJCSAqIEJlIGNhcmVmdWwgbm90IHRvIGNsZWFyIFBhZ2VMUlUgdW50aWwgYWZ0ZXIgd2UncmUKLQkJCSAqIHN1cmUgdGhlIHBhZ2UgaXMgbm90IGJlaW5nIGZyZWVkIGVsc2V3aGVyZSAtLSB0aGUKLQkJCSAqIHBhZ2UgcmVsZWFzZSBjb2RlIHJlbGllcyBvbiBpdC4KLQkJCSAqLwotCQkJQ2xlYXJQYWdlTFJVKHBhZ2UpOwotCQkJdGFyZ2V0ID0gZHN0OworCQlzd2l0Y2ggKF9faXNvbGF0ZV9scnVfcGFnZShwYWdlLCBtb2RlKSkgeworCQljYXNlIDA6CisJCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwgZHN0KTsKIAkJCW5yX3Rha2VuKys7Ci0JCX0gLyogZWxzZSBpdCBpcyBiZWluZyBmcmVlZCBlbHNld2hlcmUgKi8KKwkJCWJyZWFrOwogCi0JCWxpc3RfYWRkKCZwYWdlLT5scnUsIHRhcmdldCk7CisJCWNhc2UgLUVCVVNZOgorCQkJLyogZWxzZSBpdCBpcyBiZWluZyBmcmVlZCBlbHNld2hlcmUgKi8KKwkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCBzcmMpOworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisKKwkJaWYgKCFvcmRlcikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEF0dGVtcHQgdG8gdGFrZSBhbGwgcGFnZXMgaW4gdGhlIG9yZGVyIGFsaWduZWQgcmVnaW9uCisJCSAqIHN1cnJvdW5kaW5nIHRoZSB0YWcgcGFnZS4gIE9ubHkgdGFrZSB0aG9zZSBwYWdlcyBvZgorCQkgKiB0aGUgc2FtZSBhY3RpdmUgc3RhdGUgYXMgdGhhdCB0YWcgcGFnZS4gIFdlIG1heSBzYWZlbHkKKwkJICogcm91bmQgdGhlIHRhcmdldCBwYWdlIHBmbiBkb3duIHRvIHRoZSByZXF1ZXN0ZWQgb3JkZXIKKwkJICogYXMgdGhlIG1lbV9tYXAgaXMgZ3VhcmVudGVlZCB2YWxpZCBvdXQgdG8gTUFYX09SREVSLAorCQkgKiB3aGVyZSB0aGF0IHBhZ2UgaXMgaW4gYSBkaWZmZXJlbnQgem9uZSB3ZSB3aWxsIGRldGVjdAorCQkgKiBpdCBmcm9tIGl0cyB6b25lIGlkIGFuZCBhYm9ydCB0aGlzIGJsb2NrIHNjYW4uCisJCSAqLworCQl6b25lX2lkID0gcGFnZV96b25lX2lkKHBhZ2UpOworCQlwYWdlX3BmbiA9IHBhZ2VfdG9fcGZuKHBhZ2UpOworCQlwZm4gPSBwYWdlX3BmbiAmIH4oKDEgPDwgb3JkZXIpIC0gMSk7CisJCWVuZF9wZm4gPSBwZm4gKyAoMSA8PCBvcmRlcik7CisJCWZvciAoOyBwZm4gPCBlbmRfcGZuOyBwZm4rKykgeworCQkJc3RydWN0IHBhZ2UgKmN1cnNvcl9wYWdlOworCisJCQkvKiBUaGUgdGFyZ2V0IHBhZ2UgaXMgaW4gdGhlIGJsb2NrLCBpZ25vcmUgaXQuICovCisJCQlpZiAodW5saWtlbHkocGZuID09IHBhZ2VfcGZuKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogQXZvaWQgaG9sZXMgd2l0aGluIHRoZSB6b25lLiAqLworCQkJaWYgKHVubGlrZWx5KCFwZm5fdmFsaWRfd2l0aGluKHBmbikpKQorCQkJCWJyZWFrOworCisJCQljdXJzb3JfcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisJCQkvKiBDaGVjayB0aGF0IHdlIGhhdmUgbm90IGNyb3NzZWQgYSB6b25lIGJvdW5kYXJ5LiAqLworCQkJaWYgKHVubGlrZWx5KHBhZ2Vfem9uZV9pZChjdXJzb3JfcGFnZSkgIT0gem9uZV9pZCkpCisJCQkJY29udGludWU7CisJCQlzd2l0Y2ggKF9faXNvbGF0ZV9scnVfcGFnZShjdXJzb3JfcGFnZSwgbW9kZSkpIHsKKwkJCWNhc2UgMDoKKwkJCQlsaXN0X21vdmUoJmN1cnNvcl9wYWdlLT5scnUsIGRzdCk7CisJCQkJbnJfdGFrZW4rKzsKKwkJCQlzY2FuKys7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgLUVCVVNZOgorCQkJCS8qIGVsc2UgaXQgaXMgYmVpbmcgZnJlZWQgZWxzZXdoZXJlICovCisJCQkJbGlzdF9tb3ZlKCZjdXJzb3JfcGFnZS0+bHJ1LCBzcmMpOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCX0KIAogCSpzY2FubmVkID0gc2NhbjsKQEAgLTY1MSw2ICs3MzEsMjQgQEAKIH0KIAogLyoKKyAqIGNsZWFyX2FjdGl2ZV9mbGFncygpIGlzIGEgaGVscGVyIGZvciBzaHJpbmtfYWN0aXZlX2xpc3QoKSwgY2xlYXJpbmcKKyAqIGFueSBhY3RpdmUgYml0cyBmcm9tIHRoZSBwYWdlcyBpbiB0aGUgbGlzdC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xlYXJfYWN0aXZlX2ZsYWdzKHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCkKK3sKKwlpbnQgbnJfYWN0aXZlID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgcGFnZV9saXN0LCBscnUpCisJCWlmIChQYWdlQWN0aXZlKHBhZ2UpKSB7CisJCQlDbGVhclBhZ2VBY3RpdmUocGFnZSk7CisJCQlucl9hY3RpdmUrKzsKKwkJfQorCisJcmV0dXJuIG5yX2FjdGl2ZTsKK30KKworLyoKICAqIHNocmlua19pbmFjdGl2ZV9saXN0KCkgaXMgYSBoZWxwZXIgZm9yIHNocmlua196b25lKCkuICBJdCByZXR1cm5zIHRoZSBudW1iZXIKICAqIG9mIHJlY2xhaW1lZCBwYWdlcwogICovCkBAIC02NzEsMTEgKzc2OSwxOCBAQAogCQl1bnNpZ25lZCBsb25nIG5yX3Rha2VuOwogCQl1bnNpZ25lZCBsb25nIG5yX3NjYW47CiAJCXVuc2lnbmVkIGxvbmcgbnJfZnJlZWQ7CisJCXVuc2lnbmVkIGxvbmcgbnJfYWN0aXZlOwogCiAJCW5yX3Rha2VuID0gaXNvbGF0ZV9scnVfcGFnZXMoc2MtPnN3YXBfY2x1c3Rlcl9tYXgsCi0JCQkJCSAgICAgJnpvbmUtPmluYWN0aXZlX2xpc3QsCi0JCQkJCSAgICAgJnBhZ2VfbGlzdCwgJm5yX3NjYW4pOwotCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkUsIC1ucl90YWtlbik7CisJCQkgICAgICZ6b25lLT5pbmFjdGl2ZV9saXN0LAorCQkJICAgICAmcGFnZV9saXN0LCAmbnJfc2Nhbiwgc2MtPm9yZGVyLAorCQkJICAgICAoc2MtPm9yZGVyID4gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpPworCQkJCQkgICAgIElTT0xBVEVfQk9USCA6IElTT0xBVEVfSU5BQ1RJVkUpOworCQlucl9hY3RpdmUgPSBjbGVhcl9hY3RpdmVfZmxhZ3MoJnBhZ2VfbGlzdCk7CisKKwkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRSwgLW5yX2FjdGl2ZSk7CisJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRSwKKwkJCQkJCS0obnJfdGFrZW4gLSBucl9hY3RpdmUpKTsKIAkJem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBucl9zY2FuOwogCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIApAQCAtODIwLDcgKzkyNSw3IEBACiAJbHJ1X2FkZF9kcmFpbigpOwogCXNwaW5fbG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAlwZ21vdmVkID0gaXNvbGF0ZV9scnVfcGFnZXMobnJfcGFnZXMsICZ6b25lLT5hY3RpdmVfbGlzdCwKLQkJCQkgICAgJmxfaG9sZCwgJnBnc2Nhbm5lZCk7CisJCQkgICAgJmxfaG9sZCwgJnBnc2Nhbm5lZCwgc2MtPm9yZGVyLCBJU09MQVRFX0FDVElWRSk7CiAJem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBwZ3NjYW5uZWQ7CiAJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRSwgLXBnbW92ZWQpOwogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwpAQCAtMTAxMSw3ICsxMTE2LDcgQEAKICAqIGhvbGRzIGZpbGVzeXN0ZW0gbG9ja3Mgd2hpY2ggcHJldmVudCB3cml0ZW91dCB0aGlzIG1pZ2h0IG5vdCB3b3JrLCBhbmQgdGhlCiAgKiBhbGxvY2F0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLgogICovCi11bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqem9uZXMsIGdmcF90IGdmcF9tYXNrKQordW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBpbnQgb3JkZXIsIGdmcF90IGdmcF9tYXNrKQogewogCWludCBwcmlvcml0eTsKIAlpbnQgcmV0ID0gMDsKQEAgLTEwMjYsNiArMTEzMSw3IEBACiAJCS5zd2FwX2NsdXN0ZXJfbWF4ID0gU1dBUF9DTFVTVEVSX01BWCwKIAkJLm1heV9zd2FwID0gMSwKIAkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAorCQkub3JkZXIgPSBvcmRlciwKIAl9OwogCiAJY291bnRfdm1fZXZlbnQoQUxMT0NTVEFMTCk7CkBAIC0xMTMxLDYgKzEyMzcsNyBAQAogCQkubWF5X3N3YXAgPSAxLAogCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCiAJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKKwkJLm9yZGVyID0gb3JkZXIsCiAJfTsKIAkvKgogCSAqIHRlbXBfcHJpb3JpdHkgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgc2Nhbm5pbmcgcHJpb3JpdHkgYXQgd2hpY2gKQEAgLTEzMTQsNiArMTQyMSw3IEBACiAJICogdHJ5aW5nIHRvIGZyZWUgdGhlIGZpcnN0IHBpZWNlIG9mIG1lbW9yeSBpbiB0aGUgZmlyc3QgcGxhY2UpLgogCSAqLwogCXRzay0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0MgfCBQRl9TV0FQV1JJVEUgfCBQRl9LU1dBUEQ7CisJc2V0X2ZyZWV6YWJsZSgpOwogCiAJb3JkZXIgPSAwOwogCWZvciAoIDsgOyApIHsKZGlmZiAtLWdpdCBhL21tL3Ztc3RhdC5jIGIvbW0vdm1zdGF0LmMKaW5kZXggZWNlYWY0OS4uZmFkZjc5MSAxMDA2NDQKLS0tIGEvbW0vdm1zdGF0LmMKKysrIGIvbW0vdm1zdGF0LmMKQEAgLTQ3Miw3ICs0NzIsNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgVEVYVFNfRk9SX1pPTkVTKHh4KSBURVhUX0ZPUl9ETUEoeHgpIFRFWFRfRk9SX0RNQTMyKHh4KSB4eCAiX25vcm1hbCIsIFwKLQkJCQkJVEVYVF9GT1JfSElHSE1FTSh4eCkKKwkJCQkJVEVYVF9GT1JfSElHSE1FTSh4eCkgeHggIl9tb3ZhYmxlIiwKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2bXN0YXRfdGV4dFtdID0gewogCS8qIFpvbmVkIFZNIGNvdW50ZXJzICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYwppbmRleCAxYzhmNGEwLi4xZjc4YzNlIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC00NzQsNyArNDc1LDYgQEAKIAogCWRhZW1vbml6ZSgia2JuZXBkICVzIiwgZGV2LT5uYW1lKTsKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0xNSk7Ci0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CiAKIAlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUoc2stPnNrX3NsZWVwLCAmd2FpdCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwppbmRleCA2NmJlZjFjLi5jYTYwYTQ1IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CkBAIC0yODcsNyArMjg4LDYgQEAKIAogCWRhZW1vbml6ZSgia2NtdHBkX2N0cl8lZCIsIHNlc3Npb24tPm51bSk7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWFkZF93YWl0X3F1ZXVlKHNrLT5za19zbGVlcCwgJndhaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKaW5kZXggNDUwZWIwMi4uNjRkODljYSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpAQCAtNTQ3LDcgKzU0OCw2IEBACiAKIAlkYWVtb25pemUoImtoaWRwZF8lMDR4JTA0eCIsIHZlbmRvciwgcHJvZHVjdCk7CiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAtMTUpOwotCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJmN0cmxfd2FpdCwgY3VycmVudCk7CiAJaW5pdF93YWl0cXVldWVfZW50cnkoJmludHJfd2FpdCwgY3VycmVudCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKaW5kZXggNTJlMDRkZi4uYmI3MjIwNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CkBAIC0xOTQwLDcgKzE5NDEsNiBAQAogCiAJZGFlbW9uaXplKCJrcmZjb21tZCIpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTEwKTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKIAogCUJUX0RCRygiIik7CiAKZGlmZiAtLWdpdCBhL25ldC9jb21wYXQuYyBiL25ldC9jb21wYXQuYwppbmRleCA5YTBmNWYyLi5kNzRkODIxIDEwMDY0NAotLS0gYS9uZXQvY29tcGF0LmMKKysrIGIvbmV0L2NvbXBhdC5jCkBAIC0yNzYsNyArMjc2LDggQEAKIAkJZXJyID0gc2VjdXJpdHlfZmlsZV9yZWNlaXZlKGZwW2ldKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQllcnIgPSBnZXRfdW51c2VkX2ZkKCk7CisJCWVyciA9IGdldF91bnVzZWRfZmRfZmxhZ3MoTVNHX0NNU0dfQ0xPRVhFQyAmIGttc2ctPm1zZ19mbGFncworCQkJCQkgID8gT19DTE9FWEVDIDogMCk7CiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAJCW5ld19mZCA9IGVycjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHBvbGwuYyBiL25ldC9jb3JlL25ldHBvbGwuYwppbmRleCBkMTI2NGU5Li5kZTFiMjZhIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRwb2xsLmMKKysrIGIvbmV0L2NvcmUvbmV0cG9sbC5jCkBAIC0xMjQsMTMgKzEyNCw2IEBACiAJaWYgKHRlc3RfYml0KF9fTElOS19TVEFURV9SWF9TQ0hFRCwgJm5wLT5kZXYtPnN0YXRlKSAmJgogCSAgICBucGluZm8tPnBvbGxfb3duZXIgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpICYmCiAJICAgIHNwaW5fdHJ5bG9jaygmbnBpbmZvLT5wb2xsX2xvY2spKSB7Ci0JCS8qIFdoZW4gY2FsbGluZyBkZXYtPnBvbGwgZnJvbSBwb2xsX25hcGksIHdlIG1heSBlbmQgdXAgaW4KLQkJICogbmV0aWZfcnhfY29tcGxldGUuIEhvd2V2ZXIsIG9ubHkgdGhlIENQVSB0byB3aGljaCB0aGUKLQkJICogZGV2aWNlIHdhcyBxdWV1ZWQgaXMgYWxsb3dlZCB0byByZW1vdmUgaXQgZnJvbSBwb2xsX2xpc3QuCi0JCSAqIFNldHRpbmcgUE9MTF9MSVNUX0ZST1pFTiB0ZWxscyBuZXRpZl9yeF9jb21wbGV0ZQotCQkgKiB0byBsZWF2ZSB0aGUgTkFQSSBzdGF0ZSBhbG9uZS4KLQkJICovCi0JCXNldF9iaXQoX19MSU5LX1NUQVRFX1BPTExfTElTVF9GUk9aRU4sICZucC0+ZGV2LT5zdGF0ZSk7CiAJCW5waW5mby0+cnhfZmxhZ3MgfD0gTkVUUE9MTF9SWF9EUk9QOwogCQlhdG9taWNfaW5jKCZ0cmFwcGVkKTsKIApAQCAtMTM4LDcgKzEzMSw2IEBACiAKIAkJYXRvbWljX2RlYygmdHJhcHBlZCk7CiAJCW5waW5mby0+cnhfZmxhZ3MgJj0gfk5FVFBPTExfUlhfRFJPUDsKLQkJY2xlYXJfYml0KF9fTElOS19TVEFURV9QT0xMX0xJU1RfRlJPWkVOLCAmbnAtPmRldi0+c3RhdGUpOwogCQlzcGluX3VubG9jaygmbnBpbmZvLT5wb2xsX2xvY2spOwogCX0KIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggNzUyMTUzMy4uYmNhNzg3ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTM0NjUsNiArMzQ2NSw4IEBACiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCisJc2V0X2ZyZWV6YWJsZSgpOworCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKIAkJcGt0X2RldiA9IG5leHRfdG9fcnVuKHQpOwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zY20uYyBiL25ldC9jb3JlL3NjbS5jCmluZGV4IDI5MmFkOGQuLjQ0YzRlYzIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NjbS5jCisrKyBiL25ldC9jb3JlL3NjbS5jCkBAIC0yMjgsNyArMjI4LDggQEAKIAkJZXJyID0gc2VjdXJpdHlfZmlsZV9yZWNlaXZlKGZwW2ldKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQllcnIgPSBnZXRfdW51c2VkX2ZkKCk7CisJCWVyciA9IGdldF91bnVzZWRfZmRfZmxhZ3MoTVNHX0NNU0dfQ0xPRVhFQyAmIG1zZy0+bXNnX2ZsYWdzCisJCQkJCSAgPyBPX0NMT0VYRUMgOiAwKTsKIAkJaWYgKGVyciA8IDApCiAJCQlicmVhazsKIAkJbmV3X2ZkID0gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX2Fzc29jLmMKaW5kZXggY2M4MTEwYi4uYWZiNmM2NiAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfYXNzb2MuYworKysgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY19hc3NvYy5jCkBAIC0yNzEsOCArMjcxLDExIEBACiAJCQkgKi8KIAkJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiQXNzb2NpYXRlOiBTY2FubmluZyBmb3IgbmV0d29ya3MgZmlyc3QuXG4iKTsKIAkJCWllZWU4MDIxMXNvZnRtYWNfbm90aWZ5KG1hYy0+ZGV2LCBJRUVFODAyMTFTT0ZUTUFDX0VWRU5UX1NDQU5fRklOSVNIRUQsIGllZWU4MDIxMXNvZnRtYWNfYXNzb2Nfbm90aWZ5X3NjYW4sIE5VTEwpOwotCQkJaWYgKGllZWU4MDIxMXNvZnRtYWNfc3RhcnRfc2NhbihtYWMpKQorCQkJaWYgKGllZWU4MDIxMXNvZnRtYWNfc3RhcnRfc2NhbihtYWMpKSB7CiAJCQkJZHByaW50ayhLRVJOX0lORk8gUEZYICJBc3NvY2lhdGU6IGZhaWxlZCB0byBpbml0aWF0ZSBzY2FuLiBJcyBkZXZpY2UgdXA/XG4iKTsKKwkJCQltYWMtPmFzc29jaW5mby5hc3NvY2lhdGluZyA9IDA7CisJCQkJbWFjLT5hc3NvY2luZm8uYXNzb2NpYXRlZCA9IDA7CisJCQl9CiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCW1hYy0+YXNzb2NpbmZvLmFzc29jaWF0aW5nID0gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCmluZGV4IDQyZjEyYmQuLjg5ZGNjNDggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwpAQCAtNDYsMTAgKzQ2LDYgQEAKICNpbmNsdWRlICJuZXRsYWJlbF9jaXBzb192NC5oIgogI2luY2x1ZGUgIm5ldGxhYmVsX3VzZXIuaCIKIAotLyogZG8gbm90IGRvIGFueSBhdWRpdGluZyBpZiBhdWRpdF9lbmFibGVkID09IDAsIHNlZSBrZXJuZWwvYXVkaXQuYyBmb3IKLSAqIGRldGFpbHMgKi8KLWV4dGVybiBpbnQgYXVkaXRfZW5hYmxlZDsKLQogLyoKICAqIE5ldExhYmVsIE5FVExJTksgU2V0dXAgRnVuY3Rpb25zCiAgKi8KZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCBmNDUzMDE5Li5iNzExMTQyIDEwMDY0NAotLS0gYS9uZXQvc29ja2V0LmMKKysrIGIvbmV0L3NvY2tldC5jCkBAIC0xOTM5LDkgKzE5MzksNyBAQAogCXRvdGFsX2xlbiA9IGVycjsKIAogCWNtc2dfcHRyID0gKHVuc2lnbmVkIGxvbmcpbXNnX3N5cy5tc2dfY29udHJvbDsKLQltc2dfc3lzLm1zZ19mbGFncyA9IDA7Ci0JaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKQotCQltc2dfc3lzLm1zZ19mbGFncyA9IE1TR19DTVNHX0NPTVBBVDsKKwltc2dfc3lzLm1zZ19mbGFncyA9IGZsYWdzICYgKE1TR19DTVNHX0NMT0VYRUN8TVNHX0NNU0dfQ09NUEFUKTsKIAogCWlmIChzb2NrLT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKIAkJZmxhZ3MgfD0gTVNHX0RPTlRXQUlUOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoLmMgYi9uZXQvc3VucnBjL2F1dGguYwppbmRleCBhYTU1ZDBhLi4yOWE4ZWNjIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGguYworKysgYi9uZXQvc3VucnBjL2F1dGguYwpAQCAtNTQzLDE3ICs1NDMsMTggQEAKIAkJdGVzdF9iaXQoUlBDQVVUSF9DUkVEX1VQVE9EQVRFLCAmY3JlZC0+Y3JfZmxhZ3MpICE9IDA7CiB9CiAKLQotc3RhdGljIHN0cnVjdCBzaHJpbmtlciAqcnBjX2NyZWRfc2hyaW5rZXI7CitzdGF0aWMgc3RydWN0IHNocmlua2VyIHJwY19jcmVkX3Nocmlua2VyID0geworCS5zaHJpbmsgPSBycGNhdXRoX2NhY2hlX3Nocmlua2VyLAorCS5zZWVrcyA9IERFRkFVTFRfU0VFS1MsCit9OwogCiB2b2lkIF9faW5pdCBycGNhdXRoX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJcnBjX2luaXRfYXV0aHVuaXgoKTsKLQlycGNfY3JlZF9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBycGNhdXRoX2NhY2hlX3Nocmlua2VyKTsKKwlyZWdpc3Rlcl9zaHJpbmtlcigmcnBjX2NyZWRfc2hyaW5rZXIpOwogfQogCiB2b2lkIF9fZXhpdCBycGNhdXRoX3JlbW92ZV9tb2R1bGUodm9pZCkKIHsKLQlpZiAocnBjX2NyZWRfc2hyaW5rZXIgIT0gTlVMTCkKLQkJcmVtb3ZlX3Nocmlua2VyKHJwY19jcmVkX3Nocmlua2VyKTsKKwl1bnJlZ2lzdGVyX3Nocmlua2VyKCZycGNfY3JlZF9zaHJpbmtlcik7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKaW5kZXggYmFmNDA5NmQuLmFiZmRhMzMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3MvYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2F1dGhfZ3NzLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2F1dGguaD4KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX2tyYjVfbWVjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKaW5kZXggNzFiOWRhZS4uOTg0M2VhYyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfa3JiNV9tZWNoLmMKQEAgLTIzMSw2ICsyMzEsNyBAQAogc3RhdGljIHN0cnVjdCBnc3NfYXBpX21lY2ggZ3NzX2tlcmJlcm9zX21lY2ggPSB7CiAJLmdtX25hbWUJPSAia3JiNSIsCiAJLmdtX293bmVyCT0gVEhJU19NT0RVTEUsCisJLmdtX29pZAkJPSB7OSwgKHZvaWQgKikiXHgyYVx4ODZceDQ4XHg4Nlx4ZjdceDEyXHgwMVx4MDJceDAyIn0sCiAJLmdtX29wcwkJPSAmZ3NzX2tlcmJlcm9zX29wcywKIAkuZ21fcGZfbnVtCT0gQVJSQVlfU0laRShnc3Nfa2VyYmVyb3NfcGZzKSwKIAkuZ21fcGZzCQk9IGdzc19rZXJiZXJvc19wZnMsCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3NfbWVjaF9zd2l0Y2guYwppbmRleCAyNjg3MjUxLi42MTgwMWEwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19tZWNoX3N3aXRjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX21lY2hfc3dpdGNoLmMKQEAgLTE5NCw2ICsxOTQsMjAgQEAKIEVYUE9SVF9TWU1CT0woZ3NzX21lY2hfZ2V0X2J5X3BzZXVkb2ZsYXZvcik7CiAKIHUzMgorZ3NzX3N2Y190b19wc2V1ZG9mbGF2b3Ioc3RydWN0IGdzc19hcGlfbWVjaCAqZ20sIHUzMiBzZXJ2aWNlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdtLT5nbV9wZl9udW07IGkrKykgeworCQlpZiAoZ20tPmdtX3Bmc1tpXS5zZXJ2aWNlID09IHNlcnZpY2UpIHsKKwkJCXJldHVybiBnbS0+Z21fcGZzW2ldLnBzZXVkb2ZsYXZvcjsKKwkJfQorCX0KKwlyZXR1cm4gUlBDX0FVVEhfTUFYRkxBVk9SOyAvKiBpbGxlZ2FsIHZhbHVlICovCit9CitFWFBPUlRfU1lNQk9MKGdzc19zdmNfdG9fcHNldWRvZmxhdm9yKTsKKwordTMyCiBnc3NfcHNldWRvZmxhdm9yX3RvX3NlcnZpY2Uoc3RydWN0IGdzc19hcGlfbWVjaCAqZ20sIHUzMiBwc2V1ZG9mbGF2b3IpCiB7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL2dzc19zcGttM19tZWNoLmMKaW5kZXggNTc3ZDU5MC4uNWRlYjRiNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9nc3Nfc3BrbTNfbWVjaC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3MvZ3NzX3Nwa20zX21lY2guYwpAQCAtMjE3LDYgKzIxNyw3IEBACiBzdGF0aWMgc3RydWN0IGdzc19hcGlfbWVjaCBnc3Nfc3BrbTNfbWVjaCA9IHsKIAkuZ21fbmFtZQk9ICJzcGttMyIsCiAJLmdtX293bmVyCT0gVEhJU19NT0RVTEUsCisJLmdtX29pZAkJPSB7NywgIlwwNTNcMDA2XDAwMVwwMDVcMDA1XDAwMVwwMDMifSwKIAkuZ21fb3BzCQk9ICZnc3Nfc3BrbTNfb3BzLAogCS5nbV9wZl9udW0JPSBBUlJBWV9TSVpFKGdzc19zcGttM19wZnMpLAogCS5nbV9wZnMJCT0gZ3NzX3Nwa20zX3BmcywKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwppbmRleCBjMDk0NTgzLi40OTA2OTc1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKKysrIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCkBAIC03NDMsNiArNzQzLDE1IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXV0aF9vcHMgc3ZjYXV0aG9wc19nc3M7CiAKK3UzMiBzdmNhdXRoX2dzc19mbGF2b3Ioc3RydWN0IGF1dGhfZG9tYWluICpkb20pCit7CisJc3RydWN0IGdzc19kb21haW4gKmdkID0gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IGdzc19kb21haW4sIGgpOworCisJcmV0dXJuIGdkLT5wc2V1ZG9mbGF2b3I7Cit9CisKK0VYUE9SVF9TWU1CT0woc3ZjYXV0aF9nc3NfZmxhdm9yKTsKKwogaW50CiBzdmNhdXRoX2dzc19yZWdpc3Rlcl9wc2V1ZG9mbGF2b3IodTMyIHBzZXVkb2ZsYXZvciwgY2hhciAqIG5hbWUpCiB7CkBAIC05MTMsMTAgKzkyMiwyMyBAQAogCXN0cnVjdCBnc3Nfc3ZjX2RhdGEgKnN2Y2RhdGEgPSBycXN0cC0+cnFfYXV0aF9kYXRhOwogCXN0cnVjdCByc2MgKnJzY2kgPSBzdmNkYXRhLT5yc2NpOwogCXN0cnVjdCBycGNfZ3NzX3dpcmVfY3JlZCAqZ2MgPSAmc3ZjZGF0YS0+Y2xjcmVkOworCWludCBzdGF0OwogCi0JcnFzdHAtPnJxX2NsaWVudCA9IGZpbmRfZ3NzX2F1dGhfZG9tYWluKHJzY2ktPm1lY2hjdHgsIGdjLT5nY19zdmMpOwotCWlmIChycXN0cC0+cnFfY2xpZW50ID09IE5VTEwpCisJLyoKKwkgKiBBIGdzcyBleHBvcnQgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYnk6CisJICogCWV4cG9ydAkqKHNlYz1rcmI1LHJ3KQorCSAqIG9yIGJ5CisJICogCWV4cG9ydCBnc3Mva3JiNShydykKKwkgKiBUaGUgbGF0dGVyIGlzIGRlcHJlY2F0ZWQ7IGJ1dCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucworCSAqIHRoZSBuZnNkIGNvZGUgd2lsbCBzdGlsbCBmYWxsIGJhY2sgb24gdHJ5aW5nIGl0IGlmIHRoZSBmb3JtZXIKKwkgKiBkb2Vzbid0IHdvcms7IHNvIHdlIHRyeSB0byBtYWtlIGJvdGggYXZhaWxhYmxlIHRvIG5mc2QsIGJlbG93LgorCSAqLworCXJxc3RwLT5ycV9nc3NjbGllbnQgPSBmaW5kX2dzc19hdXRoX2RvbWFpbihyc2NpLT5tZWNoY3R4LCBnYy0+Z2Nfc3ZjKTsKKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCA9PSBOVUxMKQogCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwlzdGF0ID0gc3ZjYXV0aF91bml4X3NldF9jbGllbnQocnFzdHApOworCWlmIChzdGF0ID09IFNWQ19EUk9QKQorCQlyZXR1cm4gc3RhdDsKIAlyZXR1cm4gU1ZDX09LOwogfQogCkBAIC0xMDg4LDcgKzExMTAsNiBAQAogCQkJc3ZjX3B1dG5sKHJlc3YsIEdTU19TRVFfV0lOKTsKIAkJCWlmIChzdmNfc2FmZV9wdXRuZXRvYmoocmVzdiwgJnJzaXAtPm91dF90b2tlbikpCiAJCQkJZ290byBkcm9wOwotCQkJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CiAJCX0KIAkJZ290byBjb21wbGV0ZTsKIAljYXNlIFJQQ19HU1NfUFJPQ19ERVNUUk9ZOgpAQCAtMTEzMSw2ICsxMTUyLDggQEAKIAkJfQogCQlzdmNkYXRhLT5yc2NpID0gcnNjaTsKIAkJY2FjaGVfZ2V0KCZyc2NpLT5oKTsKKwkJcnFzdHAtPnJxX2ZsYXZvciA9IGdzc19zdmNfdG9fcHNldWRvZmxhdm9yKAorCQkJCQlyc2NpLT5tZWNoY3R4LT5tZWNoX3R5cGUsIGdjLT5nY19zdmMpOwogCQlyZXQgPSBTVkNfT0s7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEzMTcsNiArMTM0MCw5IEBACiAJaWYgKHJxc3RwLT5ycV9jbGllbnQpCiAJCWF1dGhfZG9tYWluX3B1dChycXN0cC0+cnFfY2xpZW50KTsKIAlycXN0cC0+cnFfY2xpZW50ID0gTlVMTDsKKwlpZiAocnFzdHAtPnJxX2dzc2NsaWVudCkKKwkJYXV0aF9kb21haW5fcHV0KHJxc3RwLT5ycV9nc3NjbGllbnQpOworCXJxc3RwLT5ycV9nc3NjbGllbnQgPSBOVUxMOwogCWlmIChycXN0cC0+cnFfY3JlZC5jcl9ncm91cF9pbmZvKQogCQlwdXRfZ3JvdXBfaW5mbyhycXN0cC0+cnFfY3JlZC5jcl9ncm91cF9pbmZvKTsKIAlycXN0cC0+cnFfY3JlZC5jcl9ncm91cF9pbmZvID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCmluZGV4IDA3ZGNkMjAuLjQxMTQ3OTQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9nc3NfYXBpLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CkBAIC02MzcsNyArNjM4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKK2ludAogc3ZjYXV0aF91bml4X3NldF9jbGllbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IHN2Y19hZGRyX2luKHJxc3RwKTsKQEAgLTY3Miw2ICs2NzMsOCBAQAogCXJldHVybiBTVkNfT0s7CiB9CiAKK0VYUE9SVF9TWU1CT0woc3ZjYXV0aF91bml4X3NldF9jbGllbnQpOworCiBzdGF0aWMgaW50CiBzdmNhdXRoX251bGxfYWNjZXB0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIF9fYmUzMiAqYXV0aHApCiB7CkBAIC03MDcsNiArNzEwLDcgQEAKIAlzdmNfcHV0bmwocmVzdiwgUlBDX0FVVEhfTlVMTCk7CiAJc3ZjX3B1dG5sKHJlc3YsIDApOwogCisJcnFzdHAtPnJxX2ZsYXZvciA9IFJQQ19BVVRIX05VTEw7CiAJcmV0dXJuIFNWQ19PSzsKIH0KIApAQCAtNzg0LDYgKzc4OCw3IEBACiAJc3ZjX3B1dG5sKHJlc3YsIFJQQ19BVVRIX05VTEwpOwogCXN2Y19wdXRubChyZXN2LCAwKTsKIAorCXJxc3RwLT5ycV9mbGF2b3IgPSBSUENfQVVUSF9VTklYOwogCXJldHVybiBTVkNfT0s7CiAKIGJhZGNyZWQ6CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggMjc3YzMyNi4uMjVlMjBhMiAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtOSw3ICs5LDcgQEAKIG15ICRQID0gJDA7CiAkUCA9fiBzQC4qL0BAZzsKIAotbXkgJFYgPSAnMC4wNic7CitteSAkViA9ICcwLjA3JzsKIAogdXNlIEdldG9wdDo6TG9uZyBxdyg6Y29uZmlnIG5vX2F1dG9fYWJicmV2KTsKIApAQCAtMjQ2LDYgKzI0NiwxOSBAQAogCXJldHVybiAkdmV0OwogfQogCitzdWIgRVJST1IgeworCXByaW50ICJFUlJPUjogJF9bMF1cbiI7CisJb3VyICRjbGVhbiA9IDA7Cit9CitzdWIgV0FSTiB7CisJcHJpbnQgIldBUk5JTkc6ICRfWzBdXG4iOworCW91ciAkY2xlYW4gPSAwOworfQorc3ViIENISyB7CisJcHJpbnQgIkNIRUNLOiAkX1swXVxuIjsKKwlvdXIgJGNsZWFuID0gMDsKK30KKwogc3ViIHByb2Nlc3MgewogCW15ICRmaWxlbmFtZSA9IHNoaWZ0OwogCW15IEBsaW5lcyA9IEBfOwpAQCAtMjU5LDcgKzI3Miw3IEBACiAJbXkgJHByZXZpbmRlbnQ9MDsKIAlteSAkc3Rhc2hpbmRlbnQ9MDsKIAotCW15ICRjbGVhbiA9IDE7CisJb3VyICRjbGVhbiA9IDE7CiAJbXkgJHNpZ25vZmYgPSAwOwogCW15ICRpc19wYXRjaCA9IDA7CiAKQEAgLTI5MCw4ICszMDMsMTEgQEAKIAkJCQkJbG9uZ1xzK2ludHwKIAkJCQkJbG9uZ1xzK2xvbmd8CiAJCQkJCWxvbmdccytsb25nXHMraW50fAorCQkJCQl1OHx1MTZ8dTMyfHU2NHwKKwkJCQkJczh8czE2fHMzMnxzNjR8CiAJCQkJCXN0cnVjdFxzKyRJZGVudHwKIAkJCQkJdW5pb25ccyskSWRlbnR8CisJCQkJCWVudW1ccyskSWRlbnR8CiAJCQkJCSR7SWRlbnR9X3QKIAkJCQkpCiAJCQkJKD86XHMrJFNwYXJzZSkqCkBAIC0zMDQsNiArMzIwLDIzIEBACiAJbXkgJERlY2xhcmUJPSBxcnsoPzokU3RvcmFnZVxzKyk/JFR5cGV9OwogCW15ICRBdHRyaWJ1dGUJPSBxcntfX3JlYWRfbW9zdGx5fF9faW5pdHxfX2luaXRkYXRhfTsKIAorCSMgUHJlLXNjYW4gdGhlIHBhdGNoIGxvb2tpbmcgZm9yIGFueSBfX3NldHVwIGRvY3VtZW50YXRpb24uCisJbXkgQHNldHVwX2RvY3MgPSAoKTsKKwlteSAkc2V0dXBfZG9jcyA9IDA7CisJZm9yZWFjaCBteSAkbGluZSAoQGxpbmVzKSB7CisJCWlmICgkbGluZT1+L15cK1wrXCtccysoXFMrKS8pIHsKKwkJCSRzZXR1cF9kb2NzID0gMDsKKwkJCWlmICgkMSA9fiBtQERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0JEApIHsKKwkJCQkkc2V0dXBfZG9jcyA9IDE7CisJCQl9CisJCQluZXh0OworCQl9CisKKwkJaWYgKCRzZXR1cF9kb2NzICYmICRsaW5lID1+IC9eXCsvKSB7CisJCQlwdXNoKEBzZXR1cF9kb2NzLCAkbGluZSk7CisJCX0KKwl9CisKIAlmb3JlYWNoIG15ICRsaW5lIChAbGluZXMpIHsKIAkJJGxpbmVucisrOwogCkBAIC0zNjksMzAgKzQwMiw0MiBAQAogCQkkaGVyZSAuPSAiRklMRTogJHJlYWxmaWxlOiRyZWFsbGluZToiIGlmICgkcmVhbGNudCAhPSAwKTsKIAogCQlteSAkaGVyZWxpbmUgPSAiJGhlcmVcbiRsaW5lXG4iOwotCQlteSAkaGVyZWN1cnIgPSAiJGhlcmVcbiRsaW5lXG5cbiI7Ci0JCW15ICRoZXJlcHJldiA9ICIkaGVyZVxuJHByZXZsaW5lXG4kbGluZVxuXG4iOworCQlteSAkaGVyZWN1cnIgPSAiJGhlcmVcbiRsaW5lXG4iOworCQlteSAkaGVyZXByZXYgPSAiJGhlcmVcbiRwcmV2bGluZVxuJGxpbmVcbiI7CiAKICNjaGVjayB0aGUgcGF0Y2ggZm9yIGEgc2lnbm9mZjoKIAkJaWYgKCRsaW5lID1+IC9eXHMqc2lnbmVkLW9mZi1ieTovaSkgewogCQkJIyBUaGlzIGlzIGEgc2lnbm9mZiwgaWYgdWdseSwgc28gZG8gbm90IGRvdWJsZSByZXBvcnQuCiAJCQkkc2lnbm9mZisrOwogCQkJaWYgKCEoJGxpbmUgPX4gL15ccypTaWduZWQtb2ZmLWJ5Oi8pKSB7Ci0JCQkJcHJpbnQgIlNpZ25lZC1vZmYtYnk6IGlzIHRoZSBwcmVmZXJyZWQgZm9ybVxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCVdBUk4oIlNpZ25lZC1vZmYtYnk6IGlzIHRoZSBwcmVmZXJyZWQgZm9ybVxuIiAuCisJCQkJCSRoZXJlY3Vycik7CiAJCQl9CiAJCQlpZiAoJGxpbmUgPX4gL15ccypzaWduZWQtb2ZmLWJ5OlxTL2kpIHsKLQkJCQlwcmludCAibmVlZCBzcGFjZSBhZnRlciBTaWduZWQtb2ZmLWJ5OlxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCVdBUk4oIm5lZWQgc3BhY2UgYWZ0ZXIgU2lnbmVkLW9mZi1ieTpcbiIgLgorCQkJCQkkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgQ2hlY2sgZm9yIHdyYXBwYWdlIHdpdGhpbiBhIHZhbGlkIGh1bmsgb2YgdGhlIGZpbGUKIAkJaWYgKCRyZWFsY250ICE9IDAgJiYgJGxpbmUgIX4gbXteKD86XCt8LXwgfCQpfSkgewotCQkJcHJpbnQgInBhdGNoIHNlZW1zIHRvIGJlIGNvcnJ1cHQgKGxpbmUgd3JhcHBlZD8pIFskcmVhbGNudF1cbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigicGF0Y2ggc2VlbXMgdG8gYmUgY29ycnVwdCAobGluZSB3cmFwcGVkPylcbiIgLgorCQkJCSRoZXJlY3Vycik7CisJCX0KKworIyBVVEYtOCByZWdleCBmb3VuZCBhdCBodHRwOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL3F1ZXN0aW9ucy9xYS1mb3Jtcy11dGYtOC5lbi5waHAKKwkJaWYgKCgkcmVhbGZpbGUgPX4gL14kLyB8fCAkbGluZSA9fiAvXlwrLykgJiYKKwkJICAgICAhKCRsaW5lID1+IG0vXigKKwkJCQlbXHgwOVx4MEFceDBEXHgyMC1ceDdFXSAgICAgICAgICAgICAgIyBBU0NJSQorCQkJCXwgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAgICAgICAjIG5vbi1vdmVybG9uZyAyLWJ5dGUKKwkJCQl8ICBceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXSAgICAgICAgIyBleGNsdWRpbmcgb3ZlcmxvbmdzCisJCQkJfCBbXHhFMS1ceEVDXHhFRVx4RUZdW1x4ODAtXHhCRl17Mn0gICMgc3RyYWlnaHQgMy1ieXRlCisJCQkJfCAgXHhFRFtceDgwLVx4OUZdW1x4ODAtXHhCRl0gICAgICAgICMgZXhjbHVkaW5nIHN1cnJvZ2F0ZXMKKwkJCQl8ICBceEYwW1x4OTAtXHhCRl1bXHg4MC1ceEJGXXsyfSAgICAgIyBwbGFuZXMgMS0zCisJCQkJfCBbXHhGMS1ceEYzXVtceDgwLVx4QkZdezN9ICAgICAgICAgICMgcGxhbmVzIDQtMTUKKwkJCQl8ICBceEY0W1x4ODAtXHg4Rl1bXHg4MC1ceEJGXXsyfSAgICAgIyBwbGFuZSAxNgorCQkJCSkqJC94ICkpIHsKKwkJCUVSUk9SKCJJbnZhbGlkIFVURi04XG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjaWdub3JlIGxpbmVzIGJlaW5nIHJlbW92ZWQKQEAgLTQwMywxNiArNDQ4LDEyIEBACiAKICN0cmFpbGluZyB3aGl0ZXNwYWNlCiAJCWlmICgkbGluZSA9fiAvXlwrLipcU1xzKyQvIHx8ICRsaW5lID1+IC9eXCtccyskLykgewotCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcblxuIjsKLQkJCXByaW50ICJ0cmFpbGluZyB3aGl0ZXNwYWNlXG4iOwotCQkJcHJpbnQgIiRoZXJldmV0IjsKLQkJCSRjbGVhbiA9IDA7CisJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuIjsKKwkJCUVSUk9SKCJ0cmFpbGluZyB3aGl0ZXNwYWNlXG4iIC4gJGhlcmV2ZXQpOwogCQl9CiAjODAgY29sdW1uIGxpbWl0CiAJCWlmICgkbGluZSA9fiAvXlwrLyAmJiAhKCRwcmV2bGluZT1+L1wvXCpcKi8pICYmICRsZW5ndGggPiA4MCkgewotCQkJcHJpbnQgImxpbmUgb3ZlciA4MCBjaGFyYWN0ZXJzXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJV0FSTigibGluZSBvdmVyIDgwIGNoYXJhY3RlcnNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgY2hlY2sgd2UgYXJlIGluIGEgdmFsaWQgc291cmNlIGZpbGUgKi5baGNdIGlmIG5vdCB0aGVuIGlnbm9yZSB0aGlzIGh1bmsKQEAgLTQyMSwxMCArNDYyLDggQEAKICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgYW55IHRhYnMgbXVzdCBjb21lIGZpcnN0IGFuZCBhbnl0aGluZwogIyBtb3JlIHRoYW4gOCBtdXN0IHVzZSB0YWJzLgogCQlpZiAoJGxpbmU9fi9eXCtccyogXHRccypcUy8gb3IgJGxpbmU9fi9eXCtccyogICAgICAgIFxzKi8pIHsKLQkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG5cbiI7Ci0JCQlwcmludCAidXNlIHRhYnMgbm90IHNwYWNlc1xuIjsKLQkJCXByaW50ICIkaGVyZXZldCI7Ci0JCQkkY2xlYW4gPSAwOworCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcbiI7CisJCQlFUlJPUigidXNlIHRhYnMgbm90IHNwYWNlc1xuIiAuICRoZXJldmV0KTsKIAkJfQogCiAJCSMKQEAgLTQ2Myw5ICs1MDIsMjcgQEAKIAkJCQl9CiAJCQl9CiAJCQlpZiAoJGVyciBuZSAnJykgewotCQkJCXByaW50ICJzd2l0Y2ggYW5kIGNhc2Ugc2hvdWxkIGJlIGF0IHRoZSBzYW1lIGluZGVudFxuIjsKLQkJCQlwcmludCAiJGhlcmVcbiRsaW5lXG4kZXJyXG4iOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJRVJST1IoInN3aXRjaCBhbmQgY2FzZSBzaG91bGQgYmUgYXQgdGhlIHNhbWUgaW5kZW50XG4kaGVyZWxpbmVcbiRlcnJcbiIpOworCQkJfQorCQl9CisKKyMgaWYvd2hpbGUvZXRjIGJyYWNlIGRvIG5vdCBnbyBvbiBuZXh0IGxpbmUsIHVubGVzcyBkZWZpbmluZyBhIGRvIHdoaWxlIGxvb3AsCisjIG9yIGlmIHRoYXQgYnJhY2Ugb24gdGhlIG5leHQgbGluZSBpcyBmb3Igc29tZXRoaW5nIGVsc2UKKwkJaWYgKCRsaW5lID1+IC9cYig/OihpZnx3aGlsZXxmb3J8c3dpdGNoKVxzKlwofGRvXGJ8ZWxzZVxiKS8gJiYgJGxpbmUgIX4gL14uIy8pIHsKKwkJCW15IEBjdHggPSBjdHhfc3RhdGVtZW50KCRsaW5lbnIsICRyZWFsY250KTsKKwkJCW15ICRjdHhfbG4gPSAkbGluZW5yICsgJCNjdHggKyAxOworCQkJbXkgJGN0eF9jbnQgPSAkcmVhbGNudCAtICQjY3R4IC0gMTsKKwkJCW15ICRjdHggPSBqb2luKCJcbiIsIEBjdHgpOworCisJCQl3aGlsZSAoJGN0eF9jbnQgPiAwICYmICRsaW5lc1skY3R4X2xuIC0gMV0gPX4gL14tLykgeworCQkJCSRjdHhfbG4rKzsKKwkJCQkkY3R4X2NudC0tOworCQkJfQorCQkJIyN3YXJuICJsaW5lPCRsaW5lPlxuY3R4PCRjdHg+XG5uZXh0PCRsaW5lc1skY3R4X2xuIC0gMV0+IjsKKworCQkJaWYgKCRjdHggIX4gL3tccyovICYmICRjdHhfY250ID4gMCAmJiAkbGluZXNbJGN0eF9sbiAtIDFdID1+IC9eXCtccyp7LykgeworCQkJCUVSUk9SKCJUaGF0IHsgc2hvdWxkIGJlIG9uIHRoZSBwcmV2aW91cyBsaW5lXG4iIC4KKwkJCQkJIiRoZXJlXG4kY3R4XG4kbGluZXNbJGN0eF9sbiAtIDFdIik7CiAJCQl9CiAJCX0KIApAQCAtNDc0LDkgKzUzMSw3IEBACiAKICMgVEVTVDogYWxsb3cgZGlyZWN0IHRlc3Rpbmcgb2YgdGhlIHR5cGUgbWF0Y2hlci4KIAkJaWYgKCR0c3RfdHlwZSAmJiAkbGluZSA9fiAvXi4kRGVjbGFyZSQvKSB7Ci0JCQlwcmludCAiVEVTVDogaXMgdHlwZSAkRGVjbGFyZVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJURVNUOiBpcyB0eXBlICREZWNsYXJlXG4iIC4gJGhlcmVjdXJyKTsKIAkJCW5leHQ7CiAJCX0KIApAQCAtNDg4LDkgKzU0Myw4IEBACiAJCWlmICgkcmF3bGluZSA9fiBte14uI1xzKmluY2x1ZGVccytbPCJdKC4qKVsiPl19KSB7CiAJCQlteSAkcGF0aCA9ICQxOwogCQkJaWYgKCRwYXRoID1+IG17Ly99KSB7Ci0JCQkJcHJpbnQgIm1hbGZvcm1lZCAjaW5jbHVkZSBmaWxlbmFtZVxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUVSUk9SKCJtYWxmb3JtZWQgI2luY2x1ZGUgZmlsZW5hbWVcbiIgLgorCQkJCQkkaGVyZWN1cnIpOwogCQkJfQogCQkJIyBTYW5pdGlzZSB0aGlzIHNwZWNpYWwgZm9ybSBvZiBzdHJpbmcuCiAJCQkkcGF0aCA9ICdYJyB4IGxlbmd0aCgkcGF0aCk7CkBAIC00OTksOSArNTUzLDcgQEAKIAogIyBubyBDOTkgLy8gY29tbWVudHMKIAkJaWYgKCRsaW5lID1+IG17Ly99KSB7Ci0JCQlwcmludCAiZG8gbm90IHVzZSBDOTkgLy8gY29tbWVudHNcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiZG8gbm90IHVzZSBDOTkgLy8gY29tbWVudHNcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAJCSMgUmVtb3ZlIEM5OSBjb21tZW50cy4KIAkJJGxpbmUgPX4gc0AvLy4qQEA7CkBAIC01MTQsNDkgKzU2Niw0MCBAQAogCQkJICAgKCRwcmV2bGluZSAhfiAvXlwrfS8pICYmCiAJCQkgICAoJHByZXZsaW5lICF+IC9eIH0vKSAmJgogCQkJICAgKCRwcmV2bGluZSAhfiAvXHMkbmFtZSg/OlxzKyRBdHRyaWJ1dGUpP1xzKig/Ojt8PSkvKSkgewotCQkJCXByaW50ICJFWFBPUlRfU1lNQk9MKGZvbyk7IHNob3VsZCBpbW1lZGlhdGVseSBmb2xsb3cgaXRzIGZ1bmN0aW9uL3ZhcmlhYmxlXG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJV0FSTigiRVhQT1JUX1NZTUJPTChmb28pOyBzaG91bGQgaW1tZWRpYXRlbHkgZm9sbG93IGl0cyBmdW5jdGlvbi92YXJpYWJsZVxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBjaGVjayBmb3Igc3RhdGljIGluaXRpYWxpc2Vycy4KIAkJaWYgKCRsaW5lPX4vXHMqc3RhdGljXHMuKj1ccysoMHxOVUxMKTsvKSB7Ci0JCQlwcmludCAiZG8gbm90IGluaXRpYWxpc2Ugc3RhdGljcyB0byAwIG9yIE5VTExcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiZG8gbm90IGluaXRpYWxpc2Ugc3RhdGljcyB0byAwIG9yIE5VTExcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAJCX0KIAogIyBjaGVjayBmb3IgbmV3IHR5cGVkZWZzLCBvbmx5IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIHNwYXJzZSBhbm5vdGF0aW9ucwogIyBtYWtlIHNlbnNlLgogCQlpZiAoJGxpbmUgPX4gL1xidHlwZWRlZlxzLyAmJgotCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrXChccyokSWRlbnRccypcKVxzKlwoLyAmJgorCQkgICAgJGxpbmUgIX4gL1xidHlwZWRlZlxzKyRUeXBlXHMrXChccypcKiRJZGVudFxzKlwpXHMqXCgvICYmCiAJCSAgICAkbGluZSAhfiAvXGJfX2JpdHdpc2UoPzpfX3wpXGIvKSB7Ci0JCQlwcmludCAiZG8gbm90IGFkZCBuZXcgdHlwZWRlZnNcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlXQVJOKCJkbyBub3QgYWRkIG5ldyB0eXBlZGVmc1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyAqIGdvZXMgb24gdmFyaWFibGUgbm90IG9uIHR5cGUKIAkJaWYgKCRsaW5lID1+IG17XCgkTm9ucHRyVHlwZShcKispKD86XHMrY29uc3QpP1wpfSkgewotCQkJcHJpbnQgIlwiKGZvbyQxKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigiXCIoZm9vJDEpXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIiAuCisJCQkJJGhlcmVjdXJyKTsKIAogCQl9IGVsc2lmICgkbGluZSA9fiBte1woJE5vbnB0clR5cGVccysoXCorKSg/IVxzK2NvbnN0KVxzK1wpfSkgewotCQkJcHJpbnQgIlwiKGZvbyAkMSApXCIgc2hvdWxkIGJlIFwiKGZvbyAkMSlcIlxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJcIihmb28gJDEgKVwiIHNob3VsZCBiZSBcIihmb28gJDEpXCJcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAKIAkJfSBlbHNpZiAoJGxpbmUgPX4gbXskTm9ucHRyVHlwZShcKispKD86XHMrY29uc3QpP1xzK1tBLVphLXpcZF9dK30pIHsKLQkJCXByaW50ICJcImZvbyQxIGJhclwiIHNob3VsZCBiZSBcImZvbyAkMWJhclwiXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIlwiZm9vJDEgYmFyXCIgc2hvdWxkIGJlIFwiZm9vICQxYmFyXCJcbiIgLgorCQkJCSRoZXJlY3Vycik7CiAKIAkJfSBlbHNpZiAoJGxpbmUgPX4gbXskTm9ucHRyVHlwZVxzKyhcKispKD8hXHMrY29uc3QpXHMrW0EtWmEtelxkX10rfSkgewotCQkJcHJpbnQgIlwiZm9vICQxIGJhclwiIHNob3VsZCBiZSBcImZvbyAkMWJhclwiXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoIlwiZm9vICQxIGJhclwiIHNob3VsZCBiZSBcImZvbyAkMWJhclwiXG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCQl9CiAKICMgIyBubyBCVUcoKSBvciBCVUdfT04oKQpAQCAtNTg1LDkgKzYyOCw3IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKCRvayA9PSAwKSB7Ci0JCQkJcHJpbnQgInByaW50aygpIHNob3VsZCBpbmNsdWRlIEtFUk5fIGZhY2lsaXR5IGxldmVsXG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJV0FSTigicHJpbnRrKCkgc2hvdWxkIGluY2x1ZGUgS0VSTl8gZmFjaWxpdHkgbGV2ZWxcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKQEAgLTU5NSw5ICs2MzYsNyBAQAogIyBvciBpZiBjbG9zZWQgb24gc2FtZSBsaW5lCiAJCWlmICgoJGxpbmU9fi8kVHlwZVxzKltBLVphLXpcZF9dK1woLipcKS4qIHsvKSBhbmQKIAkJICAgICEoJGxpbmU9fi9cI2RlZmluZS4qZG9cc3svKSBhbmQgISgkbGluZT1+L30vKSkgewotCQkJcHJpbnQgImJyYWNlcyBmb2xsb3dpbmcgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGdvIG9uIHRoZSBuZXh0IGxpbmVcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlFUlJPUigib3BlbiBicmFjZSAneycgZm9sbG93aW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBnbyBvbiB0aGUgbmV4dCBsaW5lXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIENoZWNrIG9wZXJhdG9yIHNwYWNpbmcuCkBAIC02MzMsMjcgKzY3MiwyNyBAQAogCQkJCX0KIAogCQkJCSMgUGljayB1cCB0aGUgcHJlY2VlZGluZyBhbmQgc3VjY2VlZGluZyBjaGFyYWN0ZXJzLgotCQkJCW15ICRjYSA9IHN1YnN0cigkb3BsaW5lLCAkb2ZmIC0gMSwgMSk7CisJCQkJbXkgJGNhID0gc3Vic3RyKCRvcGxpbmUsIDAsICRvZmYpOwogCQkJCW15ICRjYyA9ICcnOwogCQkJCWlmIChsZW5ndGgoJG9wbGluZSkgPj0gKCRvZmYgKyBsZW5ndGgoJGVsZW1lbnRzWyRuICsgMV0pKSkgewogCQkJCQkkY2MgPSBzdWJzdHIoJG9wbGluZSwgJG9mZiArIGxlbmd0aCgkZWxlbWVudHNbJG4gKyAxXSkpOwogCQkJCX0KKwkJCQlteSAkY2IgPSAiJGNhJDskY2MiOwogCiAJCQkJbXkgJGN0eCA9ICIke2F9eCR7Y30iOwogCiAJCQkJbXkgJGF0ID0gIihjdHg6JGN0eCkiOwogCiAJCQkJbXkgJHB0ciA9ICgiICIgeCAkb2ZmKSAuICJeIjsKLQkJCQlteSAkaGVyZXB0ciA9ICIkaGVyZWxpbmUkcHRyXG5cbiI7CisJCQkJbXkgJGhlcmVwdHIgPSAiJGhlcmVsaW5lJHB0clxuIjsKIAogCQkJCSMjcHJpbnQgIjwkczE6JG9wOiRzMj4gPCRlbGVtZW50c1skbl06JGVsZW1lbnRzWyRuICsgMV06JGVsZW1lbnRzWyRuICsgMl0+XG4iOwogCiAJCQkJIyA7IHNob3VsZCBoYXZlIGVpdGhlciB0aGUgZW5kIG9mIGxpbmUgb3IgYSBzcGFjZSBvciBcIGFmdGVyIGl0CiAJCQkJaWYgKCRvcCBlcSAnOycpIHsKLQkJCQkJaWYgKCRjdHggIX4gLy54W1dFXS8gJiYgJGNjICF+IC9eXFwvKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQlpZiAoJGN0eCAhfiAvLnhbV0VCXS8gJiYgJGNjICF+IC9eXFwvICYmCisJCQkJCSAgICAkY2MgIX4gL147LykgeworCQkJCQkJRVJST1IoIm5lZWQgc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgLy8gaXMgYSBjb21tZW50CkBAIC02NjIsNDMgKzcwMSwzMSBAQAogCQkJCSMgLT4gc2hvdWxkIGhhdmUgbm8gc3BhY2VzCiAJCQkJfSBlbHNpZiAoJG9wIGVxICctPicpIHsKIAkJCQkJaWYgKCRjdHggPX4gL1d4LnwueFcvKSB7Ci0JCQkJCQlwcmludCAibm8gc3BhY2VzIGFyb3VuZCB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5vIHNwYWNlcyBhcm91bmQgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgLCBtdXN0IGhhdmUgYSBzcGFjZSBvbiB0aGUgcmlnaHQuCiAJCQkJfSBlbHNpZiAoJG9wIGVxICcsJykgewogCQkJCQlpZiAoJGN0eCAhfiAvLnhXfC54RS8gJiYgJGNjICF+IC9efS8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyB1bmFyeSAhIGFuZCB1bmFyeSB+IGFyZSBhbGxvd2VkIG5vIHNwYWNlIG9uIHRoZSByaWdodAogCQkJCX0gZWxzaWYgKCRvcCBlcSAnIScgb3IgJG9wIGVxICd+JykgewogCQkJCQlpZiAoJGN0eCAhfiAvW1dPRUJdeC4vKSB7Ci0JCQkJCQlwcmludCAibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiI7Ci0JCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCQkJCQlpZiAoJGN0eCA9fiAvLnhXLykgewotCQkJCQkJcHJpbnQgIm5vIHNwYWNlIGFmdGVyIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibm8gc3BhY2UgYWZ0ZXIgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgdW5hcnkgKysgYW5kIHVuYXJ5IC0tIGFyZSBhbGxvd2VkIG5vIHNwYWNlIG9uIG9uZSBzaWRlLgogCQkJCX0gZWxzaWYgKCRvcCBlcSAnKysnIG9yICRvcCBlcSAnLS0nKSB7CiAJCQkJCWlmICgkY3R4ICF+IC9bV09CXXhbXlddLyAmJiAkY3R4ICF+IC9bXlddeFtXT0JFXS8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIG9uZSBzaWRlIG9mIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBvbmUgc2lkZSBvZiB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCQkJCQlpZiAoJGN0eCA9fiAvV3guLyAmJiAkY2MgPX4gL147LykgewotCQkJCQkJcHJpbnQgIm5vIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5vIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyAmIGlzIGJvdGggdW5hcnkgYW5kIGJpbmFyeQpAQCAtNzE1LDkgKzc0Miw3IEBACiAJCQkJIwogCQkJCX0gZWxzaWYgKCRvcCBlcSAnJicgb3IgJG9wIGVxICctJykgewogCQkJCQlpZiAoJGN0eCAhfiAvVnhWfFtFV114W1dFXXxbRVdCXXhbVk9dLykgewotCQkJCQkJcHJpbnQgIm5lZWQgc3BhY2UgYmVmb3JlIHRoYXQgJyRvcCcgJGF0XG4iOwotCQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJCSRjbGVhbiA9IDA7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgKiBpcyB0aGUgc2FtZSBhcyAmIG9ubHkgYWRkaW5nOgpAQCAtNzI2LDE2ICs3NTEsOSBAQAogCQkJCSMJKGZvbyAqKikKIAkJCQkjCiAJCQkJfSBlbHNpZiAoJG9wIGVxICcqJykgewotCQkJCQlpZiAoJGNhIGVxICcqJykgewotCQkJCQkJaWYgKCRjYyA9fiAvXlxzKD8hXHMqY29uc3QpLykgewotCQkJCQkJCXByaW50ICJubyBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCQlwcmludCAiJGhlcmVwdHIiOwotCQkJCQkJCSRjbGVhbiA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzaWYgKCRjdHggIX4gL1Z4VnxbRVddeFtXRV18W0VXQl14W1ZPXXxPeFZ8V3hCfEJ4Qi8pIHsKLQkJCQkJCXByaW50ICJuZWVkIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQlpZiAoJGNhICF+IC8kVHlwZSQvICYmICRjYiAhfiAvKFwqJDt8JDtcKikvICYmCisJCQkJCSAgICAkY3R4ICF+IC9WeFZ8W0VXXXhbV0VdfFtFV0JdeFtWT118T3hWfFd4QnxCeEIvKSB7CisJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBiZWZvcmUgdGhhdCAnJG9wJyAkYXRcbiIgLiAkaGVyZXB0cik7CiAJCQkJCX0KIAogCQkJCSMgPDwgYW5kID4+IG1heSBlaXRoZXIgaGF2ZSBvciBub3QgaGF2ZSBzcGFjZXMgYm90aCBzaWRlcwpAQCAtNzQzLDU4ICs3NjEsNTEgQEAKIAkJCQkJICRvcCBlcSAnXicgb3IgJG9wIGVxICd8JykKIAkJCQl7CiAJCQkJCWlmICgkY3R4ICF+IC9WeFZ8V3hXfFZ4RXxXeEUvKSB7Ci0JCQkJCQlwcmludCAibmVlZCBjb25zaXN0ZW50IHNwYWNpbmcgYXJvdW5kICckb3AnICRhdFxuIjsKLQkJCQkJCXByaW50ICIkaGVyZXB0ciI7Ci0JCQkJCQkkY2xlYW4gPSAwOworCQkJCQkJRVJST1IoIm5lZWQgY29uc2lzdGVudCBzcGFjaW5nIGFyb3VuZCAnJG9wJyAkYXRcbiIgLgorCQkJCQkJCSRoZXJlcHRyKTsKIAkJCQkJfQogCiAJCQkJIyBBbGwgdGhlIG90aGVycyBuZWVkIHNwYWNlcyBib3RoIHNpZGVzLgogCQkJCX0gZWxzaWYgKCRjdHggIX4gL1tFV114W1dFXS8pIHsKLQkJCQkJcHJpbnQgIm5lZWQgc3BhY2VzIGFyb3VuZCB0aGF0ICckb3AnICRhdFxuIjsKLQkJCQkJcHJpbnQgIiRoZXJlcHRyIjsKLQkJCQkJJGNsZWFuID0gMDsKKwkJCQkJRVJST1IoIm5lZWQgc3BhY2VzIGFyb3VuZCB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQl9CiAJCQkJJG9mZiArPSBsZW5ndGgoJGVsZW1lbnRzWyRuICsgMV0pOwogCQkJfQogCQl9CiAKICNuZWVkIHNwYWNlIGJlZm9yZSBicmFjZSBmb2xsb3dpbmcgaWYsIHdoaWxlLCBldGMKLQkJaWYgKCRsaW5lPX4vXCguKlwpey8pIHsKLQkJCXByaW50ICJuZWVkIGEgc3BhY2UgYmVmb3JlIHRoZSBicmFjZVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJaWYgKCRsaW5lID1+IC9cKC4qXCl7LyB8fCAkbGluZSA9fiAvZG97LykgeworCQkJRVJST1IoIm5lZWQgYSBzcGFjZSBiZWZvcmUgdGhlIG9wZW4gYnJhY2UgJ3snXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCisjIGNsb3NpbmcgYnJhY2Ugc2hvdWxkIGhhdmUgYSBzcGFjZSBmb2xsb3dpbmcgaXQgd2hlbiBpdCBoYXMgYW55dGhpbmcKKyMgb24gdGhlIGxpbmUKKwkJaWYgKCRsaW5lID1+IC99KD8hKD86LHw7fFwpKSlcUy8pIHsKKwkJCUVSUk9SKCJuZWVkIGEgc3BhY2UgYWZ0ZXIgdGhhdCBjbG9zZSBicmFjZSAnfSdcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICNnb3RvIGxhYmVscyBhcmVuJ3QgaW5kZW50ZWQsIGFsbG93IGEgc2luZ2xlIHNwYWNlIGhvd2V2ZXIKIAkJaWYgKCRsaW5lPX4vXi5ccytbQS1aYS16XGRfXSs6KD8hWzAtOV0rKS8gYW5kCiAJCSAgICEoJGxpbmU9fi9eLiBbQS1aYS16XGRfXSs6LykgYW5kICEoJGxpbmU9fi9eLlxzK2RlZmF1bHQ6LykpIHsKLQkJCXByaW50ICJsYWJlbHMgc2hvdWxkIG5vdCBiZSBpbmRlbnRlZFxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oImxhYmVscyBzaG91bGQgbm90IGJlIGluZGVudGVkXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCiAjIE5lZWQgYSBzcGFjZSBiZWZvcmUgb3BlbiBwYXJlbnRoZXNpcyBhZnRlciBpZiwgd2hpbGUgZXRjCiAJCWlmICgkbGluZT1+L1xiKGlmfHdoaWxlfGZvcnxzd2l0Y2gpXCgvKSB7Ci0JCQlwcmludCAibmVlZCBhIHNwYWNlIGJlZm9yZSB0aGUgb3BlbiBwYXJlbnRoZXNpc1xuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJuZWVkIGEgc3BhY2UgYmVmb3JlIHRoZSBvcGVuIHBhcmVudGhlc2lzICcoJ1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBDaGVjayBmb3IgaWxsZWdhbCBhc3NpZ25tZW50IGluIGlmIGNvbmRpdGlvbmFsLgogCQlpZiAoJGxpbmU9fi9cYmlmXHMqXCguKltePD4hPV09W149XS4qXCkvKSB7CiAJCQkjbmV4dCBpZiAoJGxpbmU9fi9cIi4qXFEkb3BcRS4qXCIvIG9yICRsaW5lPX4vXCdcUSRvcFxFXCcvKTsKLQkJCXByaW50ICJkbyBub3QgdXNlIGFzc2lnbm1lbnQgaW4gaWYgY29uZGl0aW9uXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25cbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKIAkJIyBDaGVjayBmb3IgfTxubD5lbHNlIHssIHRoZXNlIG11c3QgYmUgYXQgdGhlIHNhbWUKIAkJIyBpbmRlbnQgbGV2ZWwgdG8gYmUgcmVsZXZhbnQgdG8gZWFjaCBvdGhlci4KIAkJaWYgKCRwcmV2bGluZT1+L31ccyokLyBhbmQgJGxpbmU9fi9eLlxzKmVsc2VccyovIGFuZAogCQkJCQkJJHByZXZpbmRlbnQgPT0gJGluZGVudCkgewotCQkJcHJpbnQgImVsc2Ugc2hvdWxkIGZvbGxvdyBjbG9zZSBicmFjZVxuIjsKLQkJCXByaW50ICIkaGVyZXByZXYiOwotCQkJJGNsZWFuID0gMDsKKwkJCUVSUk9SKCJlbHNlIHNob3VsZCBmb2xsb3cgY2xvc2UgYnJhY2UgJ30nXG4iIC4gJGhlcmVwcmV2KTsKIAkJfQogCiAjc3R1ZGx5IGNhcHMsIGNvbW1lbnRlZCBvdXQgdW50aWwgZmlndXJlIG91dCBob3cgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB1c2Ugb2YgZXhpc3RpbmcgYW5kIGFkZGluZyBuZXcKQEAgLTgwNiw1NyArODE3LDIyIEBACiAKICNubyBzcGFjZXMgYWxsb3dlZCBhZnRlciBcIGluIGRlZmluZQogCQlpZiAoJGxpbmU9fi9cI2RlZmluZS4qXFxccyQvKSB7Ci0JCQlwcmludCgiV2hpdGVwc3BhY2UgYWZ0ZXIgXFwgbWFrZXMgbmV4dCBsaW5lcyB1c2VsZXNzXG4iKTsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJCVdBUk4oIldoaXRlcHNwYWNlIGFmdGVyIFxcIG1ha2VzIG5leHQgbGluZXMgdXNlbGVzc1xuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogI3dhcm4gaWYgPGFzbS9mb28uaD4gaXMgI2luY2x1ZGVkIGFuZCA8bGludXgvZm9vLmg+IGlzIGF2YWlsYWJsZSAodXNlcyBSQVcgbGluZSkKIAkJaWYgKCR0cmVlICYmICRyYXdsaW5lID1+IG17Xi5cI1xzKmluY2x1ZGVccypcPGFzbVwvKC4qKVwuaFw+fSkgewogCQkJbXkgJGNoZWNrZmlsZSA9ICJpbmNsdWRlL2xpbnV4LyQxLmgiOwogCQkJaWYgKC1mICRjaGVja2ZpbGUpIHsKLQkJCQlwcmludCAiVXNlICNpbmNsdWRlIDxsaW51eC8kMS5oPiBpbnN0ZWFkIG9mIDxhc20vJDEuaD5cbiI7Ci0JCQkJcHJpbnQgJGhlcmVjdXJyOwotCQkJCSRjbGVhbiA9IDA7Ci0JCQl9Ci0JCX0KLQotIyBpZi93aGlsZS9ldGMgYnJhY2UgZG8gbm90IGdvIG9uIG5leHQgbGluZSwgdW5sZXNzIGRlZmluaW5nIGEgZG8gd2hpbGUgbG9vcCwKLSMgb3IgaWYgdGhhdCBicmFjZSBvbiB0aGUgbmV4dCBsaW5lIGlzIGZvciBzb21ldGhpbmcgZWxzZQotCQlpZiAoJHByZXZsaW5lPX4vXGIoPzooaWZ8d2hpbGV8Zm9yfHN3aXRjaClccypcKHxkb1xifGVsc2VcYikvKSB7Ci0JCQlteSBAb3BlbmVkID0gJHByZXZsaW5lPX4vXCgvZzsKLQkJCW15IEBjbG9zZWQgPSAkcHJldmxpbmU9fi9cKS9nOwotCQkJbXkgJG5yX2xpbmUgPSAkbGluZW5yOwotCQkJbXkgJHJlbWFpbmluZyA9ICRyZWFsY250IC0gMTsKLQkJCW15ICRuZXh0X2xpbmUgPSAkbGluZTsKLQkJCW15ICRleHRyYV9saW5lcyA9IDA7Ci0JCQlteSAkZGlzcGxheV9zZWdtZW50ID0gJHByZXZsaW5lOwotCi0JCQl3aGlsZSAoJHJlbWFpbmluZyA+IDAgJiYgc2NhbGFyIEBvcGVuZWQgPiBzY2FsYXIgQGNsb3NlZCkgewotCQkJCSRwcmV2bGluZSAuPSAkbmV4dF9saW5lOwotCQkJCSRkaXNwbGF5X3NlZ21lbnQgLj0gIlxuIiAuICRuZXh0X2xpbmU7Ci0JCQkJJG5leHRfbGluZSA9ICRsaW5lc1skbnJfbGluZV07Ci0JCQkJJG5yX2xpbmUrKzsKLQkJCQkkcmVtYWluaW5nLS07Ci0KLQkJCQlAb3BlbmVkID0gJHByZXZsaW5lPX4vXCgvZzsKLQkJCQlAY2xvc2VkID0gJHByZXZsaW5lPX4vXCkvZzsKLQkJCX0KLQotCQkJaWYgKCgkcHJldmxpbmU9fi9cYig/OihpZnx3aGlsZXxmb3J8c3dpdGNoKVxzKlwoLipcKXxkb3xlbHNlKVxzKiQvKSBhbmQgKCRuZXh0X2xpbmU9fi97LykgYW5kCi0JCQkgICAhKCRuZXh0X2xpbmU9fi9cYig/OmlmfHdoaWxlfGZvcnxzd2l0Y2h8ZG98ZWxzZSlcYi8pIGFuZCAhKCRuZXh0X2xpbmU9fi9cI2RlZmluZS4qZG8uKndoaWxlLykpIHsKLQkJCQlwcmludCAiVGhhdCB7IHNob3VsZCBiZSBvbiB0aGUgcHJldmlvdXMgbGluZVxuIjsKLQkJCQlwcmludCAiJGhlcmVcbiRkaXNwbGF5X3NlZ21lbnRcbiRuZXh0X2xpbmVcblxuIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUNISygiVXNlICNpbmNsdWRlIDxsaW51eC8kMS5oPiBpbnN0ZWFkIG9mIDxhc20vJDEuaD5cbiIgLgorCQkJCQkkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgaWYgYW5kIGVsc2Ugc2hvdWxkIG5vdCBoYXZlIGdlbmVyYWwgc3RhdGVtZW50cyBhZnRlciBpdAogCQlpZiAoJGxpbmUgPX4gL14uXHMqKD86fVxzKik/ZWxzZVxiKC4qKS8gJiYKLQkJICAgICQxICF+IC9eXHMqKD86XHNpZnx7fCQpLykgewotCQkJcHJpbnQgInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIjsKLQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJJGNsZWFuID0gMDsKKwkJICAgICQxICF+IC9eXHMqKD86XHNpZnx7fFxcfCQpLykgeworCQkJRVJST1IoInRyYWlsaW5nIHN0YXRlbWVudHMgc2hvdWxkIGJlIG9uIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBtdWx0aS1zdGF0ZW1lbnQgbWFjcm9zIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBhIGRvIHdoaWxlIGxvb3AsIGdyYWIgdGhlCkBAIC04NzcsNDkgKzg1Myw0OSBAQAogCQkJCSRsbi0tOwogCQkJCSRjbnQrKzsKIAkJCX0KLQkJCW15ICRjdHggPSBqb2luKCcnLCBjdHhfc3RhdGVtZW50KCRsbiwgJGNudCkpOworCQkJbXkgQGN0eCA9IGN0eF9zdGF0ZW1lbnQoJGxuLCAkY250KTsKKwkJCW15ICRjdHhfbG4gPSAkbG4gKyAkI2N0eCArIDE7CisJCQlteSAkY3R4ID0gam9pbigiXG4iLCBAY3R4KTsKKworCQkJIyBQdWxsIGluIGFueSBlbXB0eSBleHRlbnNpb24gbGluZXMuCisJCQl3aGlsZSAoJGN0eCA9fiAvXFwkLyAmJgorCQkJICAgICAgICRsaW5lc1skY3R4X2xuIC0gMV0gPX4gL14uXHMqKD86XFwpPyQvKSB7CisJCQkJJGN0eCAuPSAkbGluZXNbJGN0eF9sbiAtIDFdOworCQkJCSRjdHhfbG4rKzsKKwkJCX0KIAogCQkJaWYgKCRjdHggPX4gL1xcJC8pIHsKIAkJCQlpZiAoJGN0eCA9fiAvOy8pIHsKLQkJCQkJcHJpbnQgIk1hY3JvcyB3aXRoIG11bHRpcGxlIHN0YXRlbWVudHMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgZG8gLSB3aGlsZSBsb29wXG4iOworCQkJCQlFUlJPUigiTWFjcm9zIHdpdGggbXVsdGlwbGUgc3RhdGVtZW50cyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyAtIHdoaWxlIGxvb3BcbiIgLiAiJGhlcmVcbiRjdHhcbiIpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ICJNYWNyb3Mgd2l0aCBjb21wbGV4IHZhbHVlcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXNcbiI7CisJCQkJCUVSUk9SKCJNYWNyb3Mgd2l0aCBjb21wbGV4IHZhbHVlcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXNcbiIgLiAiJGhlcmVcbiRjdHhcbiIpOwogCQkJCX0KLQkJCQlwcmludCAiJGhlcmVwcmV2IjsKLQkJCQkkY2xlYW4gPSAwOwogCQkJfQogCQl9CiAKICMgZG9uJ3QgaW5jbHVkZSBkZXByZWNhdGVkIGluY2x1ZGUgZmlsZXMgKHVzZXMgUkFXIGxpbmUpCiAJCWZvciBteSAkaW5jIChAZGVwX2luY2x1ZGVzKSB7CiAJCQlpZiAoJHJhd2xpbmUgPX4gbUBcI1xzKmluY2x1ZGVccypcPCRpbmM+QCkgewotCQkJCXByaW50ICJEb24ndCB1c2UgPCRpbmM+OiBzZWUgRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0XG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJRVJST1IoIkRvbid0IHVzZSA8JGluYz46IHNlZSBEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKICMgZG9uJ3QgdXNlIGRlcHJlY2F0ZWQgZnVuY3Rpb25zCiAJCWZvciBteSAkZnVuYyAoQGRlcF9mdW5jdGlvbnMpIHsKIAkJCWlmICgkbGluZSA9fiAvXGIkZnVuY1xiLykgewotCQkJCXByaW50ICJEb24ndCB1c2UgJGZ1bmMoKTogc2VlIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dFxuIjsKLQkJCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCQkkY2xlYW4gPSAwOworCQkJCUVSUk9SKCJEb24ndCB1c2UgJGZ1bmMoKTogc2VlIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dFxuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KIAogIyBubyB2b2xhdGlsZXMgcGxlYXNlCiAJCWlmICgkbGluZSA9fiAvXGJ2b2xhdGlsZVxiLyAmJiAkbGluZSAhfiAvXGJhc21ccyt2b2xhdGlsZVxiLykgewotCQkJcHJpbnQgIlVzZSBvZiB2b2xhdGlsZSBpcyB1c3VhbGx5IHdyb25nOiBzZWUgRG9jdW1lbnRhdGlvbi92b2xhdGlsZS1jb25zaWRlcmVkLWhhcm1mdWwudHh0XG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJV0FSTigiVXNlIG9mIHZvbGF0aWxlIGlzIHVzdWFsbHkgd3Jvbmc6IHNlZSBEb2N1bWVudGF0aW9uL3ZvbGF0aWxlLWNvbnNpZGVyZWQtaGFybWZ1bC50eHRcbiIgLiAkaGVyZWN1cnIpOwogCQl9CiAKICMgd2FybiBhYm91dCAjaWYgMAogCQlpZiAoJGxpbmUgPX4gL14uI1xzKmlmXHMrMFxiLykgewotCQkJcHJpbnQgIiNpZiAwIC0tIGlmIHRoaXMgY29kZSByZWR1bmRhbnQgcmVtb3ZlIGl0XG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJQ0hLKCJpZiB0aGlzIGNvZGUgaXMgcmVkdW5kYW50IGNvbnNpZGVyIHJlbW92aW5nIGl0XG4iIC4KKwkJCQkkaGVyZWN1cnIpOwogCQl9CiAKICMgd2FybiBhYm91dCAjaWZkZWZzIGluIEMgZmlsZXMKQEAgLTkzMyw0MSArOTA5LDQ3IEBACiAJCWlmICgkbGluZSA9fiAvXi5ccyooc3RydWN0XHMrbXV0ZXh8c3BpbmxvY2tfdClccytcUys7LykgewogCQkJbXkgJHdoaWNoID0gJDE7CiAJCQlpZiAoIWN0eF9oYXNfY29tbWVudCgkZmlyc3RfbGluZSwgJGxpbmVucikpIHsKLQkJCQlwcmludCAiJDEgZGVmaW5pdGlvbiB3aXRob3V0IGNvbW1lbnRcbiI7Ci0JCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkJJGNsZWFuID0gMDsKKwkJCQlDSEsoIiQxIGRlZmluaXRpb24gd2l0aG91dCBjb21tZW50XG4iIC4gJGhlcmVjdXJyKTsKIAkJCX0KIAkJfQogIyBjaGVjayBmb3IgbWVtb3J5IGJhcnJpZXJzIHdpdGhvdXQgYSBjb21tZW50LgogCQlpZiAoJGxpbmUgPX4gL1xiKG1ifHJtYnx3bWJ8cmVhZF9iYXJyaWVyX2RlcGVuZHN8c21wX21ifHNtcF9ybWJ8c21wX3dtYnxzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMpXCgvKSB7CiAJCQlpZiAoIWN0eF9oYXNfY29tbWVudCgkZmlyc3RfbGluZSwgJGxpbmVucikpIHsKLQkJCQlwcmludCAibWVtb3J5IGJhcnJpZXIgd2l0aG91dCBjb21tZW50XG4iOwotCQkJCXByaW50ICIkaGVyZWN1cnIiOwotCQkJCSRjbGVhbiA9IDA7CisJCQkJQ0hLKCJtZW1vcnkgYmFycmllciB3aXRob3V0IGNvbW1lbnRcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAjIGNoZWNrIG9mIGhhcmR3YXJlIHNwZWNpZmljIGRlZmluZXMKIAkJaWYgKCRsaW5lID1+IG1AXi4jXHMqaWYuKlxiKF9faTM4Nl9ffF9fcG93ZXJwYzY0X198X19zdW5fX3xfX3MzOTB4X18pXGJAKSB7Ci0JCQlwcmludCAiYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGRlZmluZXMgc2hvdWxkIGJlIGF2b2lkZWRcbiI7Ci0JCQlwcmludCAiJGhlcmVjdXJyIjsKLQkJCSRjbGVhbiA9IDA7CisJCQlDSEsoImFyY2hpdGVjdHVyZSBzcGVjaWZpYyBkZWZpbmVzIHNob3VsZCBiZSBhdm9pZGVkXG4iIC4gICRoZXJlY3Vycik7CiAJCX0KIAorIyBjaGVjayB0aGUgbG9jYXRpb24gb2YgdGhlIGlubGluZSBhdHRyaWJ1dGUsIHRoYXQgaXQgaXMgYmV0d2VlbgorIyBzdG9yYWdlIGNsYXNzIGFuZCB0eXBlLgogCQlpZiAoJGxpbmUgPX4gLyRUeXBlXHMrKD86aW5saW5lfF9fYWx3YXlzX2lubGluZSlcYi8gfHwKIAkJICAgICRsaW5lID1+IC9cYig/OmlubGluZXxhbHdheXNfaW5saW5lKVxzKyRTdG9yYWdlLykgewotCQkJcHJpbnQgImlubGluZSBrZXl3b3JkIHNob3VsZCBzaXQgYmV0d2VlbiBzdG9yYWdlIGNsYXNzIGFuZCB0eXBlXG4iOwotCQkJcHJpbnQgIiRoZXJlY3VyciI7Ci0JCQkkY2xlYW4gPSAwOworCQkJRVJST1IoImlubGluZSBrZXl3b3JkIHNob3VsZCBzaXQgYmV0d2VlbiBzdG9yYWdlIGNsYXNzIGFuZCB0eXBlXG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCisjIGNoZWNrIGZvciBuZXcgZXh0ZXJucyBpbiAuYyBmaWxlcy4KKwkJaWYgKCRsaW5lID1+IC9eLlxzKmV4dGVyblxzLyAmJiAoJHJlYWxmaWxlID1+IC9cLmMkLykpIHsKKwkJCVdBUk4oImV4dGVybnMgc2hvdWxkIGJlIGF2b2lkZWQgaW4gLmMgZmlsZXNcbiIgLiAgJGhlcmVjdXJyKTsKKwkJfQorCisjIGNoZWNrcyBmb3IgbmV3IF9fc2V0dXAncworCQlpZiAoJHJhd2xpbmUgPX4gL1xiX19zZXR1cFwoIihbXiJdKikiLykgeworCQkJbXkgJG5hbWUgPSAkMTsKKworCQkJaWYgKCFncmVwKC8kbmFtZS8sIEBzZXR1cF9kb2NzKSkgeworCQkJCUNISygiX19zZXR1cCBhcHBlYXJzIHVuLWRvY3VtZW50ZWQgLS0gY2hlY2sgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHRcbiIgLiAkaGVyZWN1cnIpOworCQkJfQogCQl9CiAJfQogCiAJaWYgKCRjaGtfcGF0Y2ggJiYgISRpc19wYXRjaCkgewotCQkkY2xlYW4gPSAwOwotCQlwcmludCAiRG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdW5pZmllZC1kaWZmIGZvcm1hdCBwYXRjaFxuIjsKKwkJRVJST1IoIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHVuaWZpZWQtZGlmZiBmb3JtYXQgcGF0Y2hcbiIpOwogCX0KIAlpZiAoJGlzX3BhdGNoICYmICRjaGtfc2lnbm9mZiAmJiAkc2lnbm9mZiA9PSAwKSB7Ci0JCSRjbGVhbiA9IDA7Ci0JCXByaW50ICJNaXNzaW5nIFNpZ25lZC1vZmYtYnk6IGxpbmUocylcbiI7CisJCUVSUk9SKCJNaXNzaW5nIFNpZ25lZC1vZmYtYnk6IGxpbmUocylcbiIpOwogCX0KIAogCWlmICgkY2xlYW4gPT0gMSAmJiAkcXVpZXQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9kZWNvZGVjb2RlIGIvc2NyaXB0cy9kZWNvZGVjb2RlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWE4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2RlY29kZWNvZGUKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL3NoCisjIERpc2Fzc2VtYmxlIHRoZSBDb2RlOiBsaW5lIGluIExpbnV4IG9vcHNlcworIyB1c2FnZTogZGVjb2RlY29kZSA8IG9vcHMuZmlsZQorIworIyBvcHRpb25zOiBzZXQgZW52LiB2YXJpYWJsZSBBRkxBR1M9b3B0aW9ucyB0byBwYXNzIG9wdGlvbnMgdG8gImFzIjsKKyMgZS5nLiwgdG8gZGVjb2RlIGFuIGkzODYgb29wcyBvbiBhbiB4ODZfNjQgc3lzdGVtLCB1c2U6CisjIEFGTEFHUz0tLTMyIGRlY29kZWNvZGUgPCAzODYub29wcworCitUPWBta3RlbXBgCitjb2RlPQorCit3aGlsZSByZWFkIGkgOyBkbworCitjYXNlICIkaSIgaW4KKypDb2RlOiopCisJY29kZT0kaQorCTs7Citlc2FjCisKK2RvbmUKKworaWYgWyAteiAiJGNvZGUiIF07IHRoZW4KKwlleGl0CitmaQorCitlY2hvICRjb2RlCitjb2RlPWBlY2hvICRjb2RlIHwgc2VkIC1lICdzLy4qQ29kZTogLy8nYAorCittYXJrZXI9YGV4cHIgaW5kZXggIiRjb2RlIiAiXDwiYAoraWYgWyAkbWFya2VyIC1lcSAwIF07IHRoZW4KKwltYXJrZXI9YGV4cHIgaW5kZXggIiRjb2RlIiAiXCgiYAorZmkKKworaWYgWyAkbWFya2VyIC1uZSAwIF07IHRoZW4KKwliZWZvcmVtYXJrPWBlY2hvICIkY29kZSIgfCBjdXQgLWMtJCgoJHttYXJrZXJ9IC0gMSkpYAorCWVjaG8gLW4gIgkuYnl0ZSAweCIgPiAkVC5zCisJZWNobyAkYmVmb3JlbWFyayB8IHNlZCAtZSAncy8gLywweC9nJyA+PiAkVC5zCisJYXMgJEFGTEFHUyAtbyAkVC5vICRULnMKKwlvYmpkdW1wIC1TICRULm8KKwlybSAkVC5vICRULnMKKworIyBhbmQgZml4IGNvZGUgYXQtYW5kLWFmdGVyIG1hcmtlcgorCWNvZGU9YGVjaG8gIiRjb2RlIiB8IGN1dCAtYyQoKCR7bWFya2VyfSArIDEpKS1gCitmaQorCitjb2RlPWBlY2hvICRjb2RlIHwgc2VkIC1lICdzLyBbPChdLyAvO3MvWz4pXSAvIC87cy8gLywweC9nJ2AKK2VjaG8gLW4gIgkuYnl0ZSAweCIgPiAkVC5zCitlY2hvICRjb2RlID4+ICRULnMKK2FzICRBRkxBR1MgLW8gJFQubyAkVC5zCitvYmpkdW1wIC1TICRULm8KK3JtICRULm8gJFQucwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rYWxsc3ltcy5jIGIvc2NyaXB0cy9rYWxsc3ltcy5jCmluZGV4IDhiODA5YjIuLjEwYjAwNjYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2FsbHN5bXMuYworKysgYi9zY3JpcHRzL2thbGxzeW1zLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogCi0jZGVmaW5lIEtTWU1fTkFNRV9MRU4JCTEyNworI2RlZmluZSBLU1lNX05BTUVfTEVOCQkxMjgKIAogCiBzdHJ1Y3Qgc3ltX2VudHJ5IHsKQEAgLTI1NCw3ICsyNTQsNyBAQAogCXVuc2lnbmVkIGludCBpLCBrLCBvZmY7CiAJdW5zaWduZWQgaW50IGJlc3RfaWR4WzI1Nl07CiAJdW5zaWduZWQgaW50ICptYXJrZXJzOwotCWNoYXIgYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJY2hhciBidWZbS1NZTV9OQU1FX0xFTl07CiAKIAlwcmludGYoIiNpbmNsdWRlIDxhc20vdHlwZXMuaD5cbiIpOwogCXByaW50ZigiI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjRcbiIpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCmluZGV4IGNjZmU4NzUuLmVkZGM3YjQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKQEAgLTExMCw2ICsxMTAsOCBAQAogCXsgQVVESVRfREVMX1JVTEUsCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19XUklURSAgICB9LAogCXsgQVVESVRfVVNFUiwJCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19SRUxBWSAgICB9LAogCXsgQVVESVRfU0lHTkFMX0lORk8sCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19SRUFEICAgICB9LAorCXsgQVVESVRfVFRZX0dFVCwJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1JFQUQgICAgIH0sCisJeyBBVURJVF9UVFlfU0VULAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgfSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL0tjb25maWcgYi9zb3VuZC9vc3MvS2NvbmZpZwppbmRleCA0YjMwYWU2Li44NjZkNGRlIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvS2NvbmZpZworKysgYi9zb3VuZC9vc3MvS2NvbmZpZwpAQCAtNSwzNSArNSw2IEBACiAjCiAjIFByb21wdCB1c2VyIGZvciBwcmltYXJ5IGRyaXZlcnMuCiAKLWNvbmZpZyBPU1NfT0JTT0xFVEUKLQlib29sICJPYnNvbGV0ZSBPU1MgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBvYnNvbGV0ZSBPU1MgZHJpdmVycyB0aGF0Ci0JICBhcmUgc2NoZWR1bGVkIGZvciByZW1vdmFsIGluIHRoZSBuZWFyIGZ1dHVyZS4KLQotCSAgUGxlYXNlIGNvbnRhY3QgQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPiBpZiB5b3UgaGFkIHRvCi0JICBzYXkgWSBoZXJlIGJlY2F1c2UgeW91ciBoYXJkd2FyZSBpcyBub3QgcHJvcGVybHkgc3VwcG9ydGVkCi0JICBieSBBTFNBLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgU09VTkRfQlQ4NzgKLQl0cmlzdGF0ZSAiQlQ4NzggYXVkaW8gZG1hIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJICYmIE9TU19PQlNPTEVURQotCS0tLWhlbHAtLS0KLQkgIEF1ZGlvIERNQSBzdXBwb3J0IGZvciBidDg3OCBiYXNlZCBncmFiYmVyIGJvYXJkcy4gIEFzIHlvdSBtaWdodCBoYXZlCi0JICBhbHJlYWR5IG5vdGljZWQsIGJ0ODc4IGlzIGxpc3RlZCB3aXRoIHR3byBmdW5jdGlvbnMgaW4gL3Byb2MvcGNpLgotCSAgRnVuY3Rpb24gMCBkb2VzIHRoZSB2aWRlbyBzdHVmZiAoYnQ4NDggY29tcGF0aWJsZSksIGZ1bmN0aW9uIDEgZG9lcwotCSAgdGhlIHNhbWUgZm9yIGF1ZGlvIGRhdGEuICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgYXVkaW8gcGFydCBvZgotCSAgdGhlIGNoaXAuICBJZiB5b3Ugc2F5ICdZJyBoZXJlIHlvdSBnZXQgYSBvc3MtY29tcGF0aWJsZSBkc3AgZGV2aWNlCi0JICB3aGVyZSB5b3UgY2FuIHJlY29yZCBmcm9tLiAgSWYgeW91IHdhbnQganVzdCB3YXRjaCBUViB5b3UgcHJvYmFibHkKLQkgIGRvbid0IG5lZWQgdGhpcyBkcml2ZXIgYXMgbW9zdCBUViBjYXJkcyBoYW5kbGUgc291bmQgd2l0aCBhIHNob3J0Ci0JICBjYWJsZSBmcm9tIHRoZSBUViBjYXJkIHRvIHlvdXIgc291bmQgY2FyZCdzIGxpbmUtaW4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIGJ0YXVkaW8uCi0KIGNvbmZpZyBTT1VORF9CQ01fQ1M0Mjk3QQogCXRyaXN0YXRlICJDcnlzdGFsIFNvdW5kIENTNDI5N2EgKGZvciBTd2FybSkiCiAJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTSUJZVEVfU1dBUk0KQEAgLTQ0LDEzICsxNSw2IEBACiAJICBub3RlIHRoYXQgQ09ORklHX0tHREIgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGF0IHRoZSBzYW1lCiAJICB0aW1lLCBzaW5jZSBpdCBhbHNvIGF0dGVtcHRzIHRvIHVzZSB0aGlzIFVBUlQgcG9ydC4KIAotY29uZmlnIFNPVU5EX0lDSAotCXRyaXN0YXRlICJJbnRlbCBJQ0ggKGk4eHgpIGF1ZGlvIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kgJiYgT1NTX09CU09MRVRFCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgaW50ZWdyYWwgYXVkaW8gaW4gSW50ZWwncyBJL08gQ29udHJvbGxlciBIdWIgKElDSCkKLQkgIGNoaXBzZXQsIGFzIHVzZWQgb24gdGhlIDgxMC84MjAvODQwIG1vdGhlcmJvYXJkcy4KLQogY29uZmlnIFNPVU5EX1ZXU05ECiAJdHJpc3RhdGUgIlNHSSBWaXN1YWwgV29ya3N0YXRpb24gU291bmQiCiAJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBYODZfVklTV1MKQEAgLTM0NiwyOSArMzEwLDkgQEAKIAkgIGFuZCBQaW5uYWNsZSkuIExhcmdlciB2YWx1ZXMgcmVkdWNlIHRoZSBjaGFuY2Ugb2YgZGF0YSBvdmVycnVucyBhdAogCSAgdGhlIGV4cGVuc2Ugb2Ygb3ZlcmFsbCBsYXRlbmN5LiBJZiB1bnN1cmUsIHVzZSB0aGUgZGVmYXVsdC4KIAotY29uZmlnIFNPVU5EX1ZJQTgyQ1hYWAotCXRyaXN0YXRlICJWSUEgODJDNjg2IEF1ZGlvIENvZGVjIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJICYmIE9TU19PQlNPTEVURQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgYXVkaW8gY29kZWMgZm91bmQgb24gVklBCi0JICA4MkN4eHgtYmFzZWQgY2hpcHMuIFR5cGljYWxseSB0aGVzZSBhcmUgYnVpbHQgaW50byBhIG1vdGhlcmJvYXJkLgotCi0JICBETyBOT1Qgc2VsZWN0IFNvdW5kIEJsYXN0ZXIgb3IgQWRsaWIgd2l0aCB0aGlzIGRyaXZlciwgdW5sZXNzCi0JICB5b3UgaGF2ZSBhIFNvdW5kIEJsYXN0ZXIgb3IgQWRsaWIgY2FyZCBpbiBhZGRpdGlvbiB0byB5b3VyIFZJQQotCSAgYXVkaW8gY2hpcC4KLQotY29uZmlnIE1JRElfVklBODJDWFhYCi0JYm9vbCAiVklBIDgyQzY4NiBNSURJIgotCWRlcGVuZHMgb24gU09VTkRfVklBODJDWFhYICYmIElTQV9ETUFfQVBJCi0JaGVscAotCSAgQW5zd2VyIFkgdG8gdXNlIHRoZSBNSURJIGludGVyZmFjZSBvZiB0aGUgVmlhNjg2LiBZb3UgbWF5IG5lZWQgdG8KLQkgIGVuYWJsZSB0aGlzIGluIHRoZSBCSU9TIGJlZm9yZSBpdCB3aWxsIHdvcmsuIFRoaXMgaXMgZm9yIGNvbm5lY3Rpb24KLQkgIHRvIGV4dGVybmFsIE1JREkgaGFyZHdhcmUsIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHNvZnR3YXJlIHBsYXliYWNrCi0JICBvZiBNSURJIGZpbGVzLgotCiBjb25maWcgU09VTkRfT1NTCiAJdHJpc3RhdGUgIk9TUyBzb3VuZCBtb2R1bGVzIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgSVNBX0RNQV9BUEkKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIElTQV9ETUFfQVBJICYmIFZJUlRfVE9fQlVTCiAJaGVscAogCSAgT1NTIGlzIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBzdWl0ZSBvZiBzb3VuZCBjYXJkIGRyaXZlcnMuICBUaGV5IG1ha2UKIAkgIHNvdW5kIHByb2dyYW1taW5nIGVhc2llciBzaW5jZSB0aGV5IHByb3ZpZGUgYSBjb21tb24gQVBJLiAgU2F5IFkgb3IKQEAgLTQwMCwyMyArMzQ0LDEwIEBACiAKIAkgIFNheSBZIHVubGVzcyB5b3UgaGF2ZSAxNk1CIG9yIG1vcmUgUkFNIG9yIGEgUENJIHNvdW5kIGNhcmQuCiAKLWNvbmZpZyBTT1VORF9DUzQyMzIKLQl0cmlzdGF0ZSAiQ3J5c3RhbCBDUzQyMzIgYmFzZWQgKFBuUCkgY2FyZHMiCi0JZGVwZW5kcyBvbiBTT1VORF9PU1MgJiYgT1NTX09CU09MRVRFCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIGNhcmQgYmFzZWQgb24gdGhlIENyeXN0YWwgQ1M0MjMyIGNoaXAgc2V0LAotCSAgd2hpY2ggdXNlcyBpdHMgb3duIFBsdWcgYW5kIFBsYXkgcHJvdG9jb2wuCi0KLQkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKLQkgICJjczQyMzI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPG1wdWlvPiw8bXB1aXJxPiIgdG8gdGhlIGtlcm5lbAotCSAgY29tbWFuZCBsaW5lLgotCi0JICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvQ1M0MjMyPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgotCSAgY29uZmlndXJpbmcgdGhpcyBjYXJkLgotCiBjb25maWcgU09VTkRfU1NDQVBFCiAJdHJpc3RhdGUgIkVuc29uaXEgU291bmRTY2FwZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gU09VTkRfT1NTCisJZGVwZW5kcyBvbiBWSVJUX1RPX0JVUwogCWhlbHAKIAkgIEFuc3dlciBZIGlmIHlvdSBoYXZlIGEgc291bmQgY2FyZCBiYXNlZCBvbiB0aGUgRW5zb25pcSBTb3VuZFNjYXBlCiAJICBjaGlwc2V0LiBTdWNoIGNhcmRzIGFyZSBiZWluZyBtYW51ZmFjdHVyZWQgYXQgbGVhc3QgYnkgRW5zb25pcSwgU3BlYQpAQCAtNzE5LDEzICs2NTAsNiBAQAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBSb2Nrd2VsbCBXYXZlQXJ0aXN0IHNvdW5kCiAJICBzeXN0ZW0uICBUaGlzIGRyaXZlciBpcyBtYWlubHkgZm9yIHRoZSBOZXRXaW5kZXIuCiAKLWNvbmZpZyBTT1VORF9UVk1JWEVSCi0JdHJpc3RhdGUgIlRWIGNhcmQgKGJ0ODQ4KSBtaXhlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgSTJDICYmIFZJREVPX1Y0TDEgJiYgT1NTX09CU09MRVRFCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgYXVkaW8gbWl4ZXIgZmFjaWxpdGllcyBvbiB0aGUgQlQ4NDggVFYgZnJhbWUtZ3JhYmJlcgotCSAgY2FyZC4KLQogY29uZmlnIFNPVU5EX0tBSExVQQogCXRyaXN0YXRlICJYcHJlc3NBdWRpbyBTb3VuZCBCbGFzdGVyIGVtdWxhdGlvbiIKIAlkZXBlbmRzIG9uIFNPVU5EX1NCCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvTWFrZWZpbGUgYi9zb3VuZC9vc3MvTWFrZWZpbGUKaW5kZXggMjQ4OWJkNi4uN2EyZjlhZSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL01ha2VmaWxlCisrKyBiL3NvdW5kL29zcy9NYWtlZmlsZQpAQCAtMTgsMjAgKzE4LDE1IEBACiBvYmotJChDT05GSUdfU09VTkRfU1NDQVBFKQkrPSBzc2NhcGUubyBhZDE4NDgubyBtcHU0MDEubwogb2JqLSQoQ09ORklHX1NPVU5EX0NTNDIzMikJKz0gY3M0MjMyLm8gdWFydDQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfTVNTKQkJKz0gYWQxODQ4Lm8KLW9iai0kKENPTkZJR19TT1VORF9PUEwzU0EyKQkrPSBvcGwzc2EyLm8gYWQxODQ4Lm8gbXB1NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9QQVMpCQkrPSBwYXMyLm8gc2IubyBzYl9saWIubyB1YXJ0NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9TQikJCSs9IHNiLm8gc2JfbGliLm8gdWFydDQwMS5vCiBvYmotJChDT05GSUdfU09VTkRfS0FITFVBKQkrPSBrYWhsdWEubwogb2JqLSQoQ09ORklHX1NPVU5EX01QVTQwMSkJKz0gbXB1NDAxLm8KIG9iai0kKENPTkZJR19TT1VORF9VQVJUNjg1MCkJKz0gdWFydDY4NTAubwotb2JqLSQoQ09ORklHX1NPVU5EX0FETElCKQkrPSBhZGxpYl9jYXJkLm8gb3BsMy5vCiBvYmotJChDT05GSUdfU09VTkRfWU0zODEyKQkrPSBvcGwzLm8KIG9iai0kKENPTkZJR19TT1VORF9WTUlESSkJKz0gdl9taWRpLm8KIG9iai0kKENPTkZJR19TT1VORF9WSURDKQkrPSB2aWRjX21vZC5vCiBvYmotJChDT05GSUdfU09VTkRfV0FWRUFSVElTVCkJKz0gd2F2ZWFydGlzdC5vCi1vYmotJChDT05GSUdfU09VTkRfQUQxODE2KQkrPSBhZDE4MTYubwotb2JqLSQoQ09ORklHX1NPVU5EX0FEMTg4OSkJKz0gYWQxODg5Lm8gYWM5N19jb2RlYy5vCi1vYmotJChDT05GSUdfU09VTkRfQUNJX01JWEVSKQkrPSBhY2kubwogCiBvYmotJChDT05GSUdfU09VTkRfVklBODJDWFhYKQkrPSB2aWE4MmN4eHhfYXVkaW8ubyBhYzk3X2NvZGVjLm8KIGlmZXEgKCQoQ09ORklHX01JRElfVklBODJDWFhYKSx5KQpAQCAtNDAsMjQgKzM1LDE2IEBACiBvYmotJChDT05GSUdfU09VTkRfTVNORENMQVMpCSs9IG1zbmQubyBtc25kX2NsYXNzaWMubwogb2JqLSQoQ09ORklHX1NPVU5EX01TTkRQSU4pCSs9IG1zbmQubyBtc25kX3Bpbm5hY2xlLm8KIG9iai0kKENPTkZJR19TT1VORF9WV1NORCkJKz0gdndzbmQubwotb2JqLSQoQ09ORklHX1NPVU5EX05NMjU2KQkrPSBubTI1Nl9hdWRpby5vIGFjOTcubwogb2JqLSQoQ09ORklHX1NPVU5EX0lDSCkJCSs9IGk4MTBfYXVkaW8ubyBhYzk3X2NvZGVjLm8KIG9iai0kKENPTkZJR19TT1VORF9FUzEzNzEpCSs9IGVzMTM3MS5vIGFjOTdfY29kZWMubwogb2JqLSQoQ09ORklHX1NPVU5EX1ZSQzU0NzcpCSs9IG5lY192cmM1NDc3Lm8gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfQVUxNTUwX0FDOTcpCSs9IGF1MTU1MF9hYzk3Lm8gYWM5N19jb2RlYy5vCi1vYmotJChDT05GSUdfU09VTkRfRlVTSU9OKQkrPSBjczQ2eHgubyBhYzk3X2NvZGVjLm8KIG9iai0kKENPTkZJR19TT1VORF9UUklERU5UKQkrPSB0cmlkZW50Lm8gYWM5N19jb2RlYy5vCi1vYmotJChDT05GSUdfU09VTkRfRU1VMTBLMSkJKz0gYWM5N19jb2RlYy5vCiBvYmotJChDT05GSUdfU09VTkRfQkNNX0NTNDI5N0EpCSs9IHN3YXJtX2NzNDI5N2Eubwogb2JqLSQoQ09ORklHX1NPVU5EX0JUODc4KQkrPSBidGF1ZGlvLm8KIAogb2JqLSQoQ09ORklHX1NPVU5EX1dNOTdYWCkJKz0gYWM5N19wbHVnaW5fd205N3h4Lm8KIAotaWZlcSAoJChDT05GSUdfTUlESV9FTVUxMEsxKSx5KQotICBvYmotJChDT05GSUdfU09VTkRfRU1VMTBLMSkJKz0gc291bmQubwotZW5kaWYKLQotb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IGVtdTEwazEvCiBvYmotJChDT05GSUdfRE1BU09VTkQpCQkrPSBkbWFzb3VuZC8KIAogIyBEZWNsYXJlIG11bHRpLXBhcnQgZHJpdmVycy4KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hYzk3LmMgYi9zb3VuZC9vc3MvYWM5Ny5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNmNGVkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hYzk3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlICJhYzk3LmgiCi0KLS8qIEZsYWcgZm9yIG1vbm8gY29udHJvbHMuICovCi0jZGVmaW5lIE1PIDAKLS8qIEFuZCBmb3Igc3RlcmVvLiAqLwotI2RlZmluZSBTVCAxCi0KLS8qIFdoZXRoZXIgb3Igbm90IHRoZSBiaXRzIGluIHRoZSBjaGFubmVsIGFyZSBpbnZlcnRlZC4gKi8KLSNkZWZpbmUgSU5WIDEKLSNkZWZpbmUgTklOViAwCi0KLXN0YXRpYyBzdHJ1Y3QgYWM5N19jaG5fZGVzYyB7Ci0gICAgaW50IGFjOTdfcmVnbnVtOwotICAgIGludCBvc3NfY2hhbm5lbDsKLSAgICBpbnQgbWF4dmFsOwotICAgIGludCBpc19zdGVyZW87Ci0gICAgaW50IG9zc19tYXNrOwotICAgIGludCByZWNvcmROdW07Ci0gICAgdTE2IHJlZ21hc2s7Ci0gICAgaW50IGlzX2ludmVydGVkOwotfSBtaXhlclJlZ3NbXSA9IHsKLSAgICB7IEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIFNPVU5EX01JWEVSX1ZPTFVNRSwgICAweDNmLCBTVCwgU09VTkRfTUFTS19WT0xVTUUsICAgNSwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X01BU1RFUl9WT0xfTU9OTywgICBTT1VORF9NSVhFUl9QSE9ORU9VVCwgMHgzZiwgTU8sIFNPVU5EX01BU0tfUEhPTkVPVVQsIDYsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19NQVNURVJfVE9ORSwgICAgICAgU09VTkRfTUlYRVJfVFJFQkxFLCAgIDB4MGYsIE1PLCBTT1VORF9NQVNLX1RSRUJMRSwgIC0xLCAweDAwZmYsIElOViAgfSwKLSAgICB7IEFDOTdfTUFTVEVSX1RPTkUsICAgICAgIFNPVU5EX01JWEVSX0JBU1MsICAgICAweDBmLCBNTywgU09VTkRfTUFTS19CQVNTLCAgICAtMSwgMHhmZjAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X1BDQkVFUF9WT0wsICAgICAgICBTT1VORF9NSVhFUl9TUEVBS0VSLCAgMHgwZiwgTU8sIFNPVU5EX01BU0tfU1BFQUtFUiwgLTEsIDB4MDAxZSwgSU5WICB9LAotICAgIHsgQUM5N19QSE9ORV9WT0wsICAgICAgICAgU09VTkRfTUlYRVJfUEhPTkVJTiwgIDB4MWYsIE1PLCBTT1VORF9NQVNLX1BIT05FSU4sICA3LCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfTUlDX1ZPTCwgICAgICAgICAgIFNPVU5EX01JWEVSX01JQywgICAgICAweDFmLCBNTywgU09VTkRfTUFTS19NSUMsICAgICAgMCwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X0xJTkVJTl9WT0wsICAgICAgICBTT1VORF9NSVhFUl9MSU5FLCAgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfTElORSwgICAgIDQsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19DRF9WT0wsICAgICAgICAgICAgU09VTkRfTUlYRVJfQ0QsICAgICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0NELCAgICAgICAxLCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfVklERU9fVk9MLCAgICAgICAgIFNPVU5EX01JWEVSX1ZJREVPLCAgICAweDFmLCBTVCwgU09VTkRfTUFTS19WSURFTywgICAgMiwgMHgwMDAwLCBJTlYgIH0sCi0gICAgeyBBQzk3X0FVWF9WT0wsICAgICAgICAgICBTT1VORF9NSVhFUl9MSU5FMSwgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfTElORTEsCSAgIDMsIDB4MDAwMCwgSU5WICB9LAotICAgIHsgQUM5N19QQ01PVVRfVk9MLCAgICAgICAgU09VTkRfTUlYRVJfUENNLCAgICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX1BDTSwgICAgIC0xLCAweDAwMDAsIElOViAgfSwKLSAgICB7IEFDOTdfUkVDT1JEX0dBSU4sICAgICAgIFNPVU5EX01JWEVSX0lHQUlOLCAgICAweDBmLCBTVCwgU09VTkRfTUFTS19JR0FJTiwgICAtMSwgMHgwMDAwLCBOSU5WIH0sCi0gICAgeyAtMSwJCSAgICAgIC0xLAkJICAgIDB4ZmYsIDAsICAwLCAgICAgICAgICAgICAgICAgIC0xLCAweDAwMDAsIDAgICAgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqCi1hYzk3X2ZpbmRfY2huZGVzYyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgaW50IG9zc19jaGFubmVsKQotewotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgbWl4ZXJSZWdzW3hdLm9zc19jaGFubmVsICE9IC0xOyB4KyspIHsKLQlpZiAobWl4ZXJSZWdzW3hdLm9zc19jaGFubmVsID09IG9zc19jaGFubmVsKQotCSAgICByZXR1cm4gbWl4ZXJSZWdzICsgeDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgc3RydWN0IGFjOTdfY2huX2Rlc2MgKmNobikKLXsKLSAgICByZXR1cm4gKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tjaG4tPmFjOTdfcmVnbnVtIC8gMl0KLQkgICAgIT0gQUM5N19SRUdfVU5TVVBQT1JURUQpOwotfQotCi1pbnQKLWFjOTdfaW5pdCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKLXsKLSAgICBpbnQgeDsKLSAgICBpbnQgcmVnMDsKLQotICAgIC8qIENsZWFyIG91dCB0aGUgYXJyYXlzIG9mIGNhY2hlZCB2YWx1ZXMuICovCi0gICAgZm9yICh4ID0gMDsgeCA8IEFDOTdfUkVHX0NOVDsgeCsrKQotCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1t4XSA9IEFDOTdfUkVHVkFMX1VOS05PV047Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyB4KyspCi0JZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1t4XSA9IEFDOTdfUkVHVkFMX1VOS05PV047Ci0KLSAgICAvKiBDbGVhciB0aGUgZGV2aWNlIG1hc2tzLiAgKi8KLSAgICBkZXYtPm1peGVyX2Rldm1hc2sgPSAwOwotICAgIGRldi0+bWl4ZXJfc3RlcmVvbWFzayA9IDA7Ci0gICAgZGV2LT5taXhlcl9yZWNtYXNrID0gMDsKLQotICAgIC8qID8/PyBEbyBhICJzdGFuZGFyZCByZXNldCIgdmlhIHJlZ2lzdGVyIDA/ICovCi0KLSAgICAvKiBIYXJkd2FyZS1kZXBlbmRlbnQgcmVzZXQuICAqLwotICAgIGlmIChkZXYtPnJlc2V0X2RldmljZSAoZGV2KSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAvKiBDaGVjayB0aGUgbWl4ZXIgZGV2aWNlIGNhcGFiaWxpdGllcy4gICovCi0gICAgcmVnMCA9IGRldi0+cmVhZF9yZWcgKGRldiwgQUM5N19SRVNFVCk7Ci0KLSAgICBpZiAocmVnMCA8IDApCi0JcmV0dXJuIC0xOwotCi0gICAgLyogQ2hlY2sgZm9yIHN1cHBvcnQgZm9yIHRyZWJsZS9iYXNzIGNvbnRyb2xzLiAgKi8KLSAgICBpZiAoISAocmVnMCAmIDQpKSB7Ci0JZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW0FDOTdfTUFTVEVSX1RPTkUgLyAyXSAKLQkgICAgPSBBQzk3X1JFR19VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICAvKiA/Pz8gVGhlcmUgbWF5IGJlIG90aGVyIHRlc3RzIGhlcmU/ICovCi0KLSAgICAvKiBGaWxsIGluIHRoZSBkZXZpY2UgbWFza3MuICAqLwotICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSAhPSAtMTsgeCsrKSB7Ci0JaWYgKGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBtaXhlclJlZ3MgKyB4KSkgewotCSAgICBkZXYtPm1peGVyX2Rldm1hc2sgfD0gbWl4ZXJSZWdzW3hdLm9zc19tYXNrOwotCi0JICAgIGlmIChtaXhlclJlZ3NbeF0uaXNfc3RlcmVvKQotCQlkZXYtPm1peGVyX3N0ZXJlb21hc2sgfD0gbWl4ZXJSZWdzW3hdLm9zc19tYXNrOwotCi0JICAgIGlmIChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtICE9IC0xKQotCQlkZXYtPm1peGVyX3JlY21hc2sgfD0gbWl4ZXJSZWdzW3hdLm9zc19tYXNrOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRoZSBjb250ZW50cyBvZiByZWdpc3RlciBSRUc7IHVzZSB0aGUgY2FjaGUgaWYgdGhlIHZhbHVlIGluIGl0Ci0gICBpcyB2YWxpZC4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuICovCi1zdGF0aWMgaW50Ci1hYzk3X2dldF9yZWdpc3RlciAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnKSAKLXsKLSAgICBpZiAocmVnID4gMTI3IHx8IChyZWcgJiAxKSkKLQlyZXR1cm4gLUVJTlZBTDsKLQotICAgIC8qIFNlZSBpZiBpdCdzIGluIHRoZSBjYWNoZSwgb3IgaWYgaXQncyBqdXN0IHBsYWluIGludmFsaWQuICAqLwotICAgIHN3aXRjaCAoZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdKSB7Ci0gICAgY2FzZSBBQzk3X1JFR19VTlNVUFBPUlRFRDoKLQlyZXR1cm4gLUVJTlZBTDsKLQlicmVhazsKLSAgICBjYXNlIEFDOTdfUkVHVkFMX1VOS05PV046Ci0JZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdID0gZGV2LT5yZWFkX3JlZyAoZGV2LCByZWcpOwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbcmVnIC8gMl07Ci19Ci0KLS8qIFdyaXRlIFZBTFVFIHRvIEFDOTcgcmVnaXN0ZXIgUkVHLCBhbmQgY2FjaGUgaXRzIHZhbHVlIGluIHRoZSBsYXN0LXdyaXR0ZW4KLSAgIGNhY2hlLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgb3IgMCBvbiBzdWNjZXNzLiAqLwotaW50Ci1hYzk3X3B1dF9yZWdpc3RlciAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpCi17Ci0gICAgaWYgKHJlZyA+IDEyNyB8fCAocmVnICYgMSkpCi0JcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBpZiAoZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdID09IEFDOTdfUkVHX1VOU1VQUE9SVEVEKQotCXJldHVybiAtRUlOVkFMOwotICAgIGVsc2UgewotCWludCByZXMgPSBkZXYtPndyaXRlX3JlZyAoZGV2LCByZWcsIHZhbHVlKTsKLQlpZiAocmVzID49IDApIHsKLQkgICAgZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdID0gdmFsdWU7Ci0JICAgIHJldHVybiAwOwotCX0KLQllbHNlCi0JICAgIHJldHVybiByZXM7Ci0gICAgfQotfQotCi0vKiBTY2FsZSBWQUxVRSAoYSB2YWx1ZSBmcm8gMCB0byBNQVhWQUwpIHRvIGEgdmFsdWUgZnJvbSAwLTEwMC4gIElmCi0gICBJU19TVEVSRU8gaXMgc2V0LCBWQUxVRSBpcyBhIHN0ZXJlbyB2YWx1ZTsgdGhlIGxlZnQgY2hhbm5lbCB2YWx1ZQotICAgaXMgaW4gdGhlIGxvd2VyIDggYml0cywgYW5kIHRoZSByaWdodCBjaGFubmVsIHZhbHVlIGlzIGluIHRoZSB1cHBlcgotICAgOCBiaXRzLgotCi0gICBBIG5lZ2F0aXZlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgb24gZmFpbHVyZSwgb3IgdGhlIHVuc2lnbmVkCi0gICBzY2FsZWQgdmFsdWUgb24gc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBpbnQKLWFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAoaW50IHZhbHVlLCBpbnQgbWF4dmFsLCBpbnQgaXNfc3RlcmVvLCBpbnQgaW52KQotewotICAgIC8qIE11dGVkPyAgKi8KLSAgICBpZiAodmFsdWUgJiBBQzk3X01VVEUpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoaXNfc3RlcmVvKQotCXJldHVybiAoYWM5N19zY2FsZV90b19vc3NfdmFsICh2YWx1ZSAmIDI1NSwgbWF4dmFsLCAwLCBpbnYpIDw8IDgpCi0JfCAoYWM5N19zY2FsZV90b19vc3NfdmFsICgodmFsdWUgPj4gOCkgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCAwKTsKLSAgICBlbHNlIHsKLQlpbnQgaTsKLQkKLQkvKiBJbnZlcnRlZC4gKi8KLQlpZiAoaW52KQotCSAgICB2YWx1ZSA9IG1heHZhbCAtIHZhbHVlOwotCi0JaSA9ICh2YWx1ZSAqIDEwMCArIChtYXh2YWwgLyAyKSkgLyBtYXh2YWw7Ci0JaWYgKGkgPiAxMDApCi0JICAgICBpID0gMTAwOwotCWlmIChpIDwgMCkKLQkgICAgaSA9IDA7Ci0JcmV0dXJuIGk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1hYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAoaW50IHZhbHVlLCBpbnQgbWF4dmFsLCBpbnQgaXNfc3RlcmVvLCBpbnQgaW52KQotewotICAgIGlmIChpc19zdGVyZW8pCi0JcmV0dXJuIChhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAodmFsdWUgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCA4KQotCXwgKGFjOTdfc2NhbGVfZnJvbV9vc3NfdmFsICgodmFsdWUgPj4gOCkgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCAwKTsKLSAgICBlbHNlIHsKLQlpbnQgaSA9ICgodmFsdWUgJiAyNTUpICogbWF4dmFsICsgNTApIC8gMTAwOwotCWlmIChpbnYpCi0JICAgIGkgPSBtYXh2YWwgLSBpOwotCWlmIChpIDwgMCkKLQkgICAgaSA9IDA7Ci0JaWYgKGkgPiBtYXh2YWwpCi0JICAgIGkgPSBtYXh2YWw7Ci0JcmV0dXJuIGk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1hYzk3X3NldF9taXhlciAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgaW50IG9zc19jaGFubmVsLCB1MTYgb3NzX3ZhbHVlKQotewotICAgIGludCBzY2FsZWRfdmFsdWU7Ci0gICAgc3RydWN0IGFjOTdfY2huX2Rlc2MgKmNoYW5uZWwgPSBhYzk3X2ZpbmRfY2huZGVzYyAoZGV2LCBvc3NfY2hhbm5lbCk7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGlmIChjaGFubmVsID09IE5VTEwpCi0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgaWYgKCEgYWM5N19pc192YWxpZF9jaGFubmVsIChkZXYsIGNoYW5uZWwpKQotCXJldHVybiAtRU5PREVWOwotICAgIHNjYWxlZF92YWx1ZSA9IGFjOTdfc2NhbGVfZnJvbV9vc3NfdmFsIChvc3NfdmFsdWUsIGNoYW5uZWwtPm1heHZhbCwKLQkJCQkJICAgIGNoYW5uZWwtPmlzX3N0ZXJlbywgCi0JCQkJCSAgICBjaGFubmVsLT5pc19pbnZlcnRlZCk7Ci0gICAgaWYgKHNjYWxlZF92YWx1ZSA8IDApCi0JcmV0dXJuIHNjYWxlZF92YWx1ZTsKLQotICAgIGlmIChjaGFubmVsLT5yZWdtYXNrICE9IDApIHsKLQlpbnQgbXY7Ci0KLQlpbnQgb2xkdmFsID0gYWM5N19nZXRfcmVnaXN0ZXIgKGRldiwgY2hhbm5lbC0+YWM5N19yZWdudW0pOwotCWlmIChvbGR2YWwgPCAwKQotCSAgICByZXR1cm4gb2xkdmFsOwotCi0JZm9yIChtdiA9IGNoYW5uZWwtPnJlZ21hc2s7ICEgKG12ICYgMSk7IG12ID4+PSAxKQotCSAgICBzY2FsZWRfdmFsdWUgPDw9IDE7Ci0KLQlzY2FsZWRfdmFsdWUgJj0gY2hhbm5lbC0+cmVnbWFzazsKLQlzY2FsZWRfdmFsdWUgfD0gKG9sZHZhbCAmIH5jaGFubmVsLT5yZWdtYXNrKTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwgY2hhbm5lbC0+YWM5N19yZWdudW0sIHNjYWxlZF92YWx1ZSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAwKQotCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbb3NzX2NoYW5uZWxdID0gb3NzX3ZhbHVlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWFjOTdfZ2V0X21peGVyX3NjYWxlZCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgaW50IG9zc19jaGFubmVsKQotewotICAgIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGFubmVsID0gYWM5N19maW5kX2NobmRlc2MgKGRldiwgb3NzX2NoYW5uZWwpOwotICAgIGludCByZWd2YWw7Ci0KLSAgICBpZiAoY2hhbm5lbCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKCEgYWM5N19pc192YWxpZF9jaGFubmVsIChkZXYsIGNoYW5uZWwpKQotCXJldHVybiAtRU5PREVWOwotCi0gICAgcmVndmFsID0gYWM5N19nZXRfcmVnaXN0ZXIgKGRldiwgY2hhbm5lbC0+YWM5N19yZWdudW0pOwotCi0gICAgaWYgKHJlZ3ZhbCA8IDApCi0JcmV0dXJuIHJlZ3ZhbDsKLQotICAgIGlmIChjaGFubmVsLT5yZWdtYXNrICE9IDApIHsKLQlpbnQgbXY7Ci0KLQlyZWd2YWwgJj0gY2hhbm5lbC0+cmVnbWFzazsKLQotCWZvciAobXYgPSBjaGFubmVsLT5yZWdtYXNrOyAhIChtdiAmIDEpOyBtdiA+Pj0gMSkKLQkgICAgcmVndmFsID4+PSAxOwotICAgIH0KLSAgICByZXR1cm4gYWM5N19zY2FsZV90b19vc3NfdmFsIChyZWd2YWwsIGNoYW5uZWwtPm1heHZhbCwKLQkJCQkgIGNoYW5uZWwtPmlzX3N0ZXJlbywgCi0JCQkJICBjaGFubmVsLT5pc19pbnZlcnRlZCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWFjOTdfZ2V0X3JlY21hc2sgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgaW50IHJlY1JlZyA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIEFDOTdfUkVDT1JEX1NFTEVDVCk7Ci0KLSAgICBpZiAocmVjUmVnIDwgMCkKLQlyZXR1cm4gcmVjUmVnOwotICAgIGVsc2UgewotCWludCB4OwotCWZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA+PSAwOyB4KyspIHsKLQkgICAgaWYgKG1peGVyUmVnc1t4XS5yZWNvcmROdW0gPT0gKHJlY1JlZyAmIDcpKQotCQlyZXR1cm4gbWl4ZXJSZWdzW3hdLm9zc19tYXNrOwotCX0KLQlyZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWFjOTdfc2V0X3JlY21hc2sgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfcmVjbWFzaykKLXsKLSAgICBpbnQgeDsKLQotICAgIGlmIChvc3NfcmVjbWFzayA9PSAwKQotCW9zc19yZWNtYXNrID0gU09VTkRfTUlYRVJfTUlDOwotCi0gICAgZm9yICh4ID0gMDsgbWl4ZXJSZWdzW3hdLmFjOTdfcmVnbnVtID49IDA7IHgrKykgeyAKLQlpZiAoKG1peGVyUmVnc1t4XS5yZWNvcmROdW0gPj0gMCkKLQkgICAgICYmIChvc3NfcmVjbWFzayAmIG1peGVyUmVnc1t4XS5vc3NfbWFzaykpCi0JICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAobWl4ZXJSZWdzW3hdLmFjOTdfcmVnbnVtIDwgMCkKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICBlbHNlIHsKLQlpbnQgcmVndmFsID0gKG1peGVyUmVnc1t4XS5yZWNvcmROdW0gPDwgOCkgfCBtaXhlclJlZ3NbeF0ucmVjb3JkTnVtOwotCWludCByZXMgPSBhYzk3X3B1dF9yZWdpc3RlciAoZGV2LCBBQzk3X1JFQ09SRF9TRUxFQ1QsIHJlZ3ZhbCk7Ci0JaWYgKHJlcyA9PSAwKQotCSAgICByZXR1cm4gYWM5N19nZXRfcmVjbWFzayAoZGV2KTsKLQllbHNlCi0JICAgIHJldHVybiByZXM7Ci0gICAgfQotfQotCi0vKiBTZXQgdGhlIG1peGVyIERFViB0byB0aGUgbGlzdCBvZiB2YWx1ZXMgaW4gVkFMVUVfTElTVC4gIFJldHVybiAwIG9uCi0gICBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLwotaW50Ci1hYzk3X3NldF92YWx1ZXMgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIAotCQkgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCAqdmFsdWVfbGlzdCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHZhbHVlX2xpc3RbeF0ub3NzX2NoYW5uZWwgIT0gLTE7IHgrKykgewotCWludCBjaG51bSA9IHZhbHVlX2xpc3RbeF0ub3NzX2NoYW5uZWw7Ci0Jc3RydWN0IGFjOTdfY2huX2Rlc2MgKmNoZW50ID0gYWM5N19maW5kX2NobmRlc2MgKGRldiwgY2hudW0pOwotCWlmIChjaGVudCAhPSBOVUxMKSB7Ci0JICAgIHUxNiB2YWw7Ci0JICAgIGludCByZXM7Ci0KLQkgICAgaWYgKGNoZW50LT5pc19zdGVyZW8pCi0JCXZhbCA9ICh2YWx1ZV9saXN0W3hdLnZhbHVlLnN0ZXJlby5yaWdodCA8PCA4KSAKLQkJICAgICAgfCB2YWx1ZV9saXN0W3hdLnZhbHVlLnN0ZXJlby5sZWZ0OwotCSAgICBlbHNlIHsKLQkJLyogV2UgZG8gdGhpcyBzbyB0aGUgcmV0dXJuZWQgdmFsdWUgbG9va3MgT0sgaW4gdGhlCi0JCSAgIG1peGVyIGFwcC4gIEl0J3Mgbm90IG5lY2Vzc2FyeSBvdGhlcndpc2UuICAqLwotCQl2YWwgPSAodmFsdWVfbGlzdFt4XS52YWx1ZS5tb25vIDw8IDgpIAotCQkgICAgICB8IHZhbHVlX2xpc3RbeF0udmFsdWUubW9ubzsKLQkgICAgfQotCSAgICByZXMgPSBhYzk3X3NldF9taXhlciAoZGV2LCBjaG51bSwgdmFsKTsKLQkgICAgaWYgKHJlcyA8IDApCi0JCXJldHVybiByZXM7Ci0JfQotCWVsc2UKLQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLWFjOTdfbWl4ZXJfaW9jdGwgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCi17Ci0gICAgaW50IHJldDsKLQotICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ1NSQzoKLQlyZXQgPSBhYzk3X2dldF9yZWNtYXNrIChkZXYpOwotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNTUkM6Ci0JewotCSAgICBpZiAoZ2V0X3VzZXIgKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJcmV0ID0gLUVGQVVMVDsKLQkgICAgZWxzZQotCQlyZXQgPSBhYzk3X3NldF9yZWNtYXNrIChkZXYsIHJldCk7Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6Ci0JcmV0ID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKLQlyZXQgPSBkZXYtPm1peGVyX2Rldm1hc2s7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKLQlyZXQgPSBkZXYtPm1peGVyX3JlY21hc2s7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKLQlyZXQgPSBkZXYtPm1peGVyX3N0ZXJlb21hc2s7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCS8qIFJlYWQgb3Igd3JpdGUgcmVxdWVzdC4gKi8KLQlyZXQgPSAtRUlOVkFMOwotCWlmIChfSU9DX1RZUEUgKGNtZCkgPT0gJ00nKSB7Ci0JICAgIGludCBkaXIgPSBfU0lPQ19ESVIgKGNtZCk7Ci0JICAgIGludCBjaGFubmVsID0gX0lPQ19OUiAoY21kKTsKLQotCSAgICBpZiAoY2hhbm5lbCA+PSAwICYmIGNoYW5uZWwgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMpIHsKLQkJcmV0ID0gMDsKLQkJaWYgKGRpciAmIF9TSU9DX1dSSVRFKSB7Ci0JCSAgICBpbnQgdmFsOwotCQkgICAgaWYgKGdldF91c2VyICh2YWwsIChpbnQgX191c2VyICopIGFyZykgPT0gMCkKLQkJCXJldCA9IGFjOTdfc2V0X21peGVyIChkZXYsIGNoYW5uZWwsIHZhbCk7Ci0JCSAgICBlbHNlCi0JCQlyZXQgPSAtRUZBVUxUOwotCQl9Ci0JCWlmIChyZXQgPj0gMCAmJiAoZGlyICYgX1NJT0NfUkVBRCkpIHsKLQkJICAgIGlmIChkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW2NoYW5uZWxdCi0JCQk9PSBBQzk3X1JFR1ZBTF9VTktOT1dOKQotCQkJZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tjaGFubmVsXQotCQkJICAgID0gYWM5N19nZXRfbWl4ZXJfc2NhbGVkIChkZXYsIGNoYW5uZWwpOwotCQkgICAgcmV0ID0gZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tjaGFubmVsXTsKLQkJfQotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgIH0KLQotICAgIGlmIChyZXQgPCAwKQotCXJldHVybiByZXQ7Ci0gICAgZWxzZQotCXJldHVybiBwdXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZyk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woYWM5N19pbml0KTsKLUVYUE9SVF9TWU1CT0woYWM5N19zZXRfdmFsdWVzKTsKLUVYUE9SVF9TWU1CT0woYWM5N19wdXRfcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChhYzk3X21peGVyX2lvY3RsKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWM5Ny5oIGIvc291bmQvb3NzL2FjOTcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4MzdhOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWM5Ny5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBhYzk3LmggCi0gKiAKLSAqIGRlZmluaXRpb25zIGZvciB0aGUgQUM5NywgSW50ZWwncyBBdWRpbyBDb2RlYyA5NyBTcGVjCi0gKiBhbHNvIGluY2x1ZGVzIHN1cHBvcnQgZm9yIGEgZ2VuZXJpYyBBQzk3IGludGVyZmFjZQotICovCi0KLSNpZm5kZWYgX0FDOTdfSF8KLSNkZWZpbmUgX0FDOTdfSF8KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLSNpbmNsdWRlICJzb3VuZF9jYWxscy5oIgotCi0jZGVmaW5lICBBQzk3X1JFU0VUICAgICAgICAgICAgICAweDAwMDAgICAgICAvLwotI2RlZmluZSAgQUM5N19NQVNURVJfVk9MX1NURVJFTyAgMHgwMDAyICAgICAgLy8gTGluZSBPdXQKLSNkZWZpbmUgIEFDOTdfSEVBRFBIT05FX1ZPTCAgICAgIDB4MDAwNCAgICAgIC8vIAotI2RlZmluZSAgQUM5N19NQVNURVJfVk9MX01PTk8gICAgMHgwMDA2ICAgICAgLy8gVEFEIE91dHB1dAotI2RlZmluZSAgQUM5N19NQVNURVJfVE9ORSAgICAgICAgMHgwMDA4ICAgICAgLy8KLSNkZWZpbmUgIEFDOTdfUENCRUVQX1ZPTCAgICAgICAgIDB4MDAwYSAgICAgIC8vIG5vbmUKLSNkZWZpbmUgIEFDOTdfUEhPTkVfVk9MICAgICAgICAgIDB4MDAwYyAgICAgIC8vIFRBRCBJbnB1dCAobW9ubykKLSNkZWZpbmUgIEFDOTdfTUlDX1ZPTCAgICAgICAgICAgIDB4MDAwZSAgICAgIC8vIE1JQyBJbnB1dCAobW9ubykKLSNkZWZpbmUgIEFDOTdfTElORUlOX1ZPTCAgICAgICAgIDB4MDAxMCAgICAgIC8vIExpbmUgSW5wdXQgKHN0ZXJlbykKLSNkZWZpbmUgIEFDOTdfQ0RfVk9MICAgICAgICAgICAgIDB4MDAxMiAgICAgIC8vIENEIElucHV0IChzdGVyZW8pCi0jZGVmaW5lICBBQzk3X1ZJREVPX1ZPTCAgICAgICAgICAweDAwMTQgICAgICAvLyBub25lCi0jZGVmaW5lICBBQzk3X0FVWF9WT0wgICAgICAgICAgICAweDAwMTYgICAgICAvLyBBdXggSW5wdXQgKHN0ZXJlbykKLSNkZWZpbmUgIEFDOTdfUENNT1VUX1ZPTCAgICAgICAgIDB4MDAxOCAgICAgIC8vIFdhdmUgT3V0cHV0IChzdGVyZW8pCi0jZGVmaW5lICBBQzk3X1JFQ09SRF9TRUxFQ1QgICAgICAweDAwMWEgICAgICAvLwotI2RlZmluZSAgQUM5N19SRUNPUkRfR0FJTiAgICAgICAgMHgwMDFjCi0jZGVmaW5lICBBQzk3X1JFQ09SRF9HQUlOX01JQyAgICAweDAwMWUKLSNkZWZpbmUgIEFDOTdfR0VORVJBTF9QVVJQT1NFICAgIDB4MDAyMAotI2RlZmluZSAgQUM5N18zRF9DT05UUk9MICAgICAgICAgMHgwMDIyCi0jZGVmaW5lICBBQzk3X01PREVNX1JBVEUgICAgICAgICAweDAwMjQKLSNkZWZpbmUgIEFDOTdfUE9XRVJfQ09OVFJPTCAgICAgIDB4MDAyNgotCi0vKiByZWdpc3RlcnMgMHgwMDI4IC0gMHgwMDU4IGFyZSByZXNlcnZlZCAqLwotCi0vKiBBQyc5NyAyLjAgKi8KLSNkZWZpbmUgQUM5N19FWFRFTkRFRF9JRAkweDAwMjgJLyogRXh0ZW5kZWQgQXVkaW8gSUQgKi8KLSNkZWZpbmUgQUM5N19FWFRFTkRFRF9TVEFUVVMJMHgwMDJBCS8qIEV4dGVuZGVkIEF1ZGlvIFN0YXR1cyAqLwotI2RlZmluZSBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSAweDAwMkMgIC8qIFBDTSBGcm9udCBEQUMgUmF0ZSAqLwotI2RlZmluZSBBQzk3X1BDTV9TVVJSX0RBQ19SQVRFICAweDAwMkUgIC8qIFBDTSBTdXJyb3VuZCBEQUMgUmF0ZSAqLwotI2RlZmluZSBBQzk3X1BDTV9MRkVfREFDX1JBVEUgICAweDAwMzAgIC8qIFBDTSBMRkUgREFDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19QQ01fTFJfQURDX1JBVEUJMHgwMDMyCS8qIFBDTSBMUiBEQUMgUmF0ZSAqLwotI2RlZmluZSBBQzk3X1BDTV9NSUNfQURDX1JBVEUgICAweDAwMzQgIC8qIFBDTSBNSUMgQURDIFJhdGUgKi8KLSNkZWZpbmUgQUM5N19DRU5URVJfTEZFX01BU1RFUiAgMHgwMDM2ICAvKiBDZW50ZXIgKyBMRkUgTWFzdGVyIFZvbHVtZSAqLwotI2RlZmluZSBBQzk3X1NVUlJPVU5EX01BU1RFUiAgICAweDAwMzggIC8qIFN1cnJvdW5kIChSZWFyKSBNYXN0ZXIgVm9sdW1lICovCi0jZGVmaW5lIEFDOTdfUkVTRVJWRURfM0EJMHgwMDNBCS8qIFJlc2VydmVkICovCi0vKiByYW5nZSAweDNjLTB4NTggLSBNT0RFTSAqLwotCi0vKiByZWdpc3RlcnMgMHgwMDVhIC0gMHgwMDdhIGFyZSB2ZW5kb3IgcmVzZXJ2ZWQgKi8KLQotI2RlZmluZSAgQUM5N19WRU5ET1JfSUQxICAgICAgICAgMHgwMDdjCi0jZGVmaW5lICBBQzk3X1ZFTkRPUl9JRDIgICAgICAgICAweDAwN2UKLQotLyogdm9sdW1lIGNvbnRyb2wgYml0IGRlZmluZXMgKi8KLQotI2RlZmluZSBBQzk3X01VVEUgICAgICAgICAgICAgICAgMHg4MDAwCi0jZGVmaW5lIEFDOTdfTUlDQk9PU1QgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgQUM5N19MRUZUVk9MICAgICAgICAgICAgIDB4M2YwMAotI2RlZmluZSBBQzk3X1JJR0hUVk9MICAgICAgICAgICAgMHgwMDNmCi0KLS8qIHJlY29yZCBtdXggZGVmaW5lcyAqLwotCi0jZGVmaW5lIEFDOTdfUkVDTVVYX01JQyAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgQUM5N19SRUNNVVhfQ0QgICAgICAgICAgIDB4MDEwMQotI2RlZmluZSBBQzk3X1JFQ01VWF9WSURFTyAgICAgICAgMHgwMjAyICAgICAgLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgQUM5N19SRUNNVVhfQVVYICAgICAgICAgIDB4MDMwMyAgICAgIAotI2RlZmluZSBBQzk3X1JFQ01VWF9MSU5FICAgICAgICAgMHgwNDA0ICAgICAgCi0jZGVmaW5lIEFDOTdfUkVDTVVYX1NURVJFT19NSVggICAweDA1MDUKLSNkZWZpbmUgQUM5N19SRUNNVVhfTU9OT19NSVggICAgIDB4MDYwNgotI2RlZmluZSBBQzk3X1JFQ01VWF9QSE9ORSAgICAgICAgMHgwNzA3Ci0KLQotLyogZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGJpdCBkZWZpbmVzICovCi0KLSNkZWZpbmUgQUM5N19HUF9MUEJLICAgICAgICAgICAgIDB4MDA4MCAgICAgIC8qIExvb3BiYWNrIG1vZGUgKi8KLSNkZWZpbmUgQUM5N19HUF9NUyAgICAgICAgICAgICAgIDB4MDEwMCAgICAgIC8qIE1pYyBTZWxlY3QgMD1NaWMxLCAxPU1pYzIgKi8KLSNkZWZpbmUgQUM5N19HUF9NSVggICAgICAgICAgICAgIDB4MDIwMCAgICAgIC8qIE1vbm8gb3V0cHV0IHNlbGVjdCAwPU1peCwgMT1NaWMgKi8KLSNkZWZpbmUgQUM5N19HUF9STEJLICAgICAgICAgICAgIDB4MDQwMCAgICAgIC8qIFJlbW90ZSBMb29wYmFjayAtIE1vZGVtIGxpbmUgY29kZWMgKi8KLSNkZWZpbmUgQUM5N19HUF9MTEJLICAgICAgICAgICAgIDB4MDgwMCAgICAgIC8qIExvY2FsIExvb3BiYWNrIC0gTW9kZW0gTGluZSBjb2RlYyAqLwotI2RlZmluZSBBQzk3X0dQX0xEICAgICAgICAgICAgICAgMHgxMDAwICAgICAgLyogTG91ZG5lc3MgMT1vbiAqLwotI2RlZmluZSBBQzk3X0dQXzNEICAgICAgICAgICAgICAgMHgyMDAwICAgICAgLyogM0QgRW5oYW5jZW1lbnQgMT1vbiAqLwotI2RlZmluZSBBQzk3X0dQX1NUICAgICAgICAgICAgICAgMHg0MDAwICAgICAgLyogU3RlcmVvIEVuaGFuY2VtZW50IDE9b24gKi8KLSNkZWZpbmUgQUM5N19HUF9QT1AgICAgICAgICAgICAgIDB4ODAwMCAgICAgIC8qIFBjbSBPdXQgUGF0aCwgMD1wcmUgM0QsIDE9cG9zdCAzRCAqLwotCi0KLS8qIHBvd2VyZG93biBjb250cm9sIGFuZCBzdGF0dXMgYml0IGRlZmluZXMgKi8KLQotLyogc3RhdHVzICovCi0jZGVmaW5lIEFDOTdfUFdSX01ETSAgICAgICAgICAgICAweDAwMTAgICAgICAvKiBNb2RlbSBzZWN0aW9uIHJlYWR5ICovCi0jZGVmaW5lIEFDOTdfUFdSX1JFRiAgICAgICAgICAgICAweDAwMDggICAgICAvKiBWcmVmIG5vbWluYWwgKi8KLSNkZWZpbmUgQUM5N19QV1JfQU5MICAgICAgICAgICAgIDB4MDAwNCAgICAgIC8qIEFuYWxvZyBzZWN0aW9uIHJlYWR5ICovCi0jZGVmaW5lIEFDOTdfUFdSX0RBQyAgICAgICAgICAgICAweDAwMDIgICAgICAvKiBEQUMgc2VjdGlvbiByZWFkeSAqLwotI2RlZmluZSBBQzk3X1BXUl9BREMgICAgICAgICAgICAgMHgwMDAxICAgICAgLyogQURDIHNlY3Rpb24gcmVhZHkgKi8KLQotLyogY29udHJvbCAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjAgICAgICAgICAgICAgMHgwMTAwICAgICAgLyogQURDIGFuZCBNdXggcG93ZXJkb3duICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSMSAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBEQUMgcG93ZXJkb3duICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSMiAgICAgICAgICAgICAweDA0MDAgICAgICAvKiBPdXRwdXQgbWl4ZXIgcG93ZXJkb3duIChWcmVmIG9uKSAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjMgICAgICAgICAgICAgMHgwODAwICAgICAgLyogT3V0cHV0IG1peGVyIHBvd2VyZG93biAoVnJlZiBvZmYpICovCi0jZGVmaW5lIEFDOTdfUFdSX1BSNCAgICAgICAgICAgICAweDEwMDAgICAgICAvKiBBQy1saW5rIHBvd2VyZG93biAqLwotI2RlZmluZSBBQzk3X1BXUl9QUjUgICAgICAgICAgICAgMHgyMDAwICAgICAgLyogSW50ZXJuYWwgQ2xrIGRpc2FibGUgKi8KLSNkZWZpbmUgQUM5N19QV1JfUFI2ICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIEhQIGFtcCBwb3dlcmRvd24gKi8KLSNkZWZpbmUgQUM5N19QV1JfUFI3ICAgICAgICAgICAgIDB4ODAwMCAgICAgIC8qIE1vZGVtIG9mZiAtIGlmIHN1cHBvcnRlZCAqLwotCi0vKiB1c2VmdWwgcG93ZXIgc3RhdGVzICovCi0jZGVmaW5lIEFDOTdfUFdSX0QwICAgICAgICAgICAgICAweDAwMDAgICAgICAvKiBldmVyeXRoaW5nIG9uICovCi0jZGVmaW5lIEFDOTdfUFdSX0QxICAgICAgICAgICAgICBBQzk3X1BXUl9QUjB8QUM5N19QV1JfUFIxfEFDOTdfUFdSX1BSNAotI2RlZmluZSBBQzk3X1BXUl9EMiAgICAgICAgICAgICAgQUM5N19QV1JfUFIwfEFDOTdfUFdSX1BSMXxBQzk3X1BXUl9QUjJ8QUM5N19QV1JfUFIzfEFDOTdfUFdSX1BSNAotI2RlZmluZSBBQzk3X1BXUl9EMyAgICAgICAgICAgICAgQUM5N19QV1JfUFIwfEFDOTdfUFdSX1BSMXxBQzk3X1BXUl9QUjJ8QUM5N19QV1JfUFIzfEFDOTdfUFdSX1BSNAotI2RlZmluZSBBQzk3X1BXUl9BTkxPRkYgICAgICAgICAgQUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSMyAgLyogYW5hbG9nIHNlY3Rpb24gb2ZmICovCi0KLS8qIFRvdGFsIG51bWJlciBvZiBkZWZpbmVkIHJlZ2lzdGVycy4gICovCi0jZGVmaW5lIEFDOTdfUkVHX0NOVCA2NAotCi0vKiBHZW5lcmljIEFDOTcgbWl4ZXIgaW50ZXJmYWNlLiAqLwotCi0vKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlLiAqLwotc3RydWN0IGFjOTdfaHdpbnQKLXsKLSAgICAvKiBQZXJmb3JtIGFueSBoYXJkd2FyZS1zcGVjaWZpYyByZXNldCBhbmQgaW5pdGlhbGl6YXRpb24uICBSZXR1cm5zCi0gICAgIDAgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KLSAgICBpbnQgKCpyZXNldF9kZXZpY2UpIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KTsKLQotICAgIC8qIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgUkVHLiAgVGhlIGNhbGxlcgotICAgICAgIHNob3VsZCBjaGVjayB0byBzZWUgaWYgdGhlIGRlc2lyZWQgY29udGVudHMgYXJlIGF2YWlsYWJsZSBpbgotICAgICAgIHRoZSBjYWNoZSBmaXJzdCwgaWYgYXBwbGljYWJsZS4gUmV0dXJucyBhIHBvc2l0aXZlIHVuc2lnbmVkIHZhbHVlCi0gICAgICAgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgcmVnaXN0ZXIsIG9yIGEgbmVnYXRpdmUgZXJyb3IKLSAgICAgICBjb2RlLiAgKi8KLSAgICBpbnQgKCpyZWFkX3JlZykgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZyk7Ci0KLSAgICAvKiBXcml0ZXMgVkFMVUUgdG8gcmVnaXN0ZXIgUkVHLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGEKLSAgICAgICBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KLSAgICBpbnQgKCp3cml0ZV9yZWcpIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcsIHUxNiB2YWx1ZSk7Ci0KLSAgICAvKiBIYXJkd2FyZS1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gKi8KLSAgICB2b2lkICpkcml2ZXJfcHJpdmF0ZTsKLQotICAgIC8qIFRocmVlIE9TUyBtYXNrcy4gKi8KLSAgICBpbnQgbWl4ZXJfZGV2bWFzazsKLSAgICBpbnQgbWl4ZXJfc3RlcmVvbWFzazsKLSAgICBpbnQgbWl4ZXJfcmVjbWFzazsKLQotICAgIC8qIFRoZSBtaXhlciBjYWNoZS4gVGhlIGluZGljZXMgY29ycmVzcG9uZCB0byB0aGUgQUM5NyBoYXJkd2FyZSByZWdpc3RlcgotICAgICAgIG51bWJlciAvIDIsIHNpbmNlIHRoZSByZWdpc3RlciBudW1iZXJzIGFyZSBhbHdheXMgYW4gZXZlbiBudW1iZXIuCi0KLSAgICAgICBVbmtub3duIHZhbHVlcyBhcmUgc2V0IHRvIC0xOyB1bnN1cHBvcnRlZCByZWdpc3RlcnMgY29udGFpbiBhCi0gICAgICAgLTIuICAqLwotICAgIGludCBsYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW0FDOTdfUkVHX0NOVF07Ci0KLSAgICAvKiBBIGNhY2hlIG9mIHZhbHVlcyB3cml0dGVuIHZpYSBPU1M7IHdlIG5lZWQgdGhlc2Ugc28gd2UgY2FuIHJldHVybgotICAgICAgIHRoZSB2YWx1ZXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IHRoZSB1c2VyLgotCi0gICAgICAgV2h5IHRoZSBvcmlnaW5hbCB1c2VyIHZhbHVlcz8gIEJlY2F1c2UgdGhlIHJlYWwtd29ybGQgaGFyZHdhcmUKLSAgICAgICBoYXMgbGVzcyBwcmVjaXNpb24sIGFuZCBzb21lIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyBhc3N1bWUgdGhhdAotICAgICAgIHRoZXkgd2lsbCBnZXQgYmFjayB0aGUgZXhhY3QgdmFsdWUgdGhhdCB0aGV5IHdyb3RlIChhdW1peCkuCi0KLSAgICAgICBBIC0xIHZhbHVlIGluZGljYXRlcyB0aGF0IG5vIHZhbHVlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhpcyBtaXhlcgotICAgICAgIGNoYW5uZWwgdmlhIE9TUy4gICovCi0gICAgaW50IGxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW1NPVU5EX01JWEVSX05SREVWSUNFU107Ci19OwotCi0vKiBWYWx1ZXMgc3RvcmVkIGluIHRoZSByZWdpc3RlciBjYWNoZS4gICovCi0jZGVmaW5lIEFDOTdfUkVHVkFMX1VOS05PV04gLTEKLSNkZWZpbmUgQUM5N19SRUdfVU5TVVBQT1JURUQgLTIKLQotc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdAotewotICAgIC8qIE1peGVyIGNoYW5uZWwgdG8gc2V0LiAgTGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IGEgdmFsdWUgb2YgLTEuICAqLwotICAgIGludCBvc3NfY2hhbm5lbDsKLSAgICAvKiBUaGUgc2NhbGVkIHZhbHVlIHRvIHNldCBpdCB0bzsgdmFsdWVzIGdlbmVyYWxseSByYW5nZSBmcm9tIDAtMTAwLiAqLwotICAgIHVuaW9uIHsKLQlzdHJ1Y3QgewotCSAgICB1OCBsZWZ0LCByaWdodDsKLQl9IHN0ZXJlbzsKLQl1OCBtb25vOwotICAgIH0gdmFsdWU7Ci19OwotCi0vKiBJbml0aWFsaXplIHRoZSBhYzk3IG1peGVyIGJ5IHJlc2V0dGluZyBpdC4gICovCi1leHRlcm4gaW50IGFjOTdfaW5pdCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7Ci0KLS8qIFNldHMgdGhlIG1peGVyIERFViB0byB0aGUgdmFsdWVzIGluIFZBTFVFX0xJU1QuICBSZXR1cm5zIDAgb24gc3VjY2VzcywKLSAgIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCi1leHRlcm4gaW50IGFjOTdfc2V0X3ZhbHVlcyAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwKLQkJCSAgICBzdHJ1Y3QgYWM5N19taXhlcl92YWx1ZV9saXN0ICp2YWx1ZV9saXN0KTsKLQotLyogV3JpdGVzIHRoZSBzcGVjaWZpZWQgVkFMVUUgdG8gdGhlIEFDOTcgcmVnaXN0ZXIgUkVHIGluIHRoZSBtaXhlci4KLSAgIFRha2VzIGNhcmUgb2Ygc2V0dGluZyB0aGUgbGFzdC13cml0dGVuIGNhY2hlIGFzIHdlbGwuICAqLwotZXh0ZXJuIGludCBhYzk3X3B1dF9yZWdpc3RlciAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpOwotCi0vKiBEZWZhdWx0IGlvY3RsLiAqLwotZXh0ZXJuIGludCBhYzk3X21peGVyX2lvY3RsIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICB2b2lkIF9fdXNlciAqIGFyZyk7Ci0KLSNlbmRpZgotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWNpLmMgYi9zb3VuZC9vc3MvYWNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmFjMzcuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEyICswLDAgQEAKLS8qCi0gKiBBdWRpbyBDb21tYW5kIEludGVyZmFjZSAoQUNJKSBkcml2ZXIgKHNvdW5kL2FjaS5jKQotICoKLSAqIEFDSSBpcyBhIHByb3RvY29sIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbWljcm9jb250cm9sbGVyIG9uCi0gKiBzb21lIHNvdW5kIGNhcmRzIHByb2R1Y2VkIGJ5IG1pcm8sIGUuZy4gdGhlIG1pcm9TT1VORCBQQ00xMiBhbmQKLSAqIFBDTTIwLiBUaGUgQUNJIGhhcyBiZWVuIGRldmVsb3BlZCBmb3IgbWlybyBieSBOb3JiZXJ0byBQZWxsaWNjaQotICogPHBlbGxpY2NpQGhvbWUuY29tPi4gU3BlY2lhbCB0aGFua3MgdG8gYm90aCBoaW0gYW5kIG1pcm8gZm9yCi0gKiBwcm92aWRpbmcgdGhlIEFDSSBzcGVjaWZpY2F0aW9uLgotICoKLSAqIFRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBBQ0kgaXMgdG8gY29udHJvbCB0aGUgbWl4ZXIgYW5kIHRvIGdldCBhCi0gKiBwcm9kdWN0IGlkZW50aWZpY2F0aW9uLiBPbiB0aGUgUENNMjAsIEFDSSBhbHNvIGNvbnRyb2xzIHRoZSByYWRpbwotICogdHVuZXIgb24gdGhpcyBjYXJkLCB0aGlzIGlzIHN1cHBvcnRlZCBpbiB0aGUgVmlkZW8gZm9yIExpbnV4IAotICogbWlyb3BjbTIwIGRyaXZlci4KLSAqIC0KLSAqIFRoaXMgaXMgYSBmdWxsZmVhdHVyZWQgaW1wbGVtZW50YXRpb24uIFVuc3VwcG9ydGVkIGZlYXR1cmVzCi0gKiBhcmUgYnVncy4uLiAoOgotICoKLSAqIEl0IGlzIG5vdCBsb25nZXIgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIG1hZDE2IG1vZHVsZSBmaXJzdC4gVGhlCi0gKiB1c2VyIGlzIGN1cnJlbnRseSByZXNwb25zaWJsZSB0byBzZXQgdGhlIG1hZDE2IG1peGVyIGNvcnJlY3RseS4KLSAqCi0gKiBUbyB0b2dnbGUgdGhlIHNvbG8gbW9kZSBmb3IgZnVsbCBkdXBsZXggb3BlcmF0aW9uIGp1c3QgdXNlIHRoZSBPU1MKLSAqIHJlY29yZCBzd2l0Y2ggZm9yIHRoZSBwY20gKCd3YXZlJykgY29udHJvbGxlci4gICAgICAgICAgIFJvYmVydAotICogLQotICoKLSAqIFJldmlzaW9uIGhpc3Rvcnk6Ci0gKgotICogICAxOTk1LTExLTEwICBNYXJrdXMgS3VobiA8bXNrdWhuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KLSAqICAgICAgICBGaXJzdCB2ZXJzaW9uIHdyaXR0ZW4uCi0gKiAgIDE5OTUtMTItMzEgIE1hcmt1cyBLdWhuCi0gKiAgICAgICAgU2Vjb25kIHJldmlzaW9uLCBnZW5lcmFsIGNvZGUgY2xlYW51cC4KLSAqICAgMTk5Ni0wNS0xNgkgSGFubnUgU2F2b2xhaW5lbgotICoJICBJbnRlZ3JhdGVkIHdpdGggb3RoZXIgcGFydHMgb2YgdGhlIGRyaXZlci4KLSAqICAgMTk5Ni0wNS0yOCAgTWFya3VzIEt1aG4KLSAqICAgICAgICBJbml0aWFsaXplIENTNDIzMUEgbWl4ZXIsIG1ha2UgQUNJIGZpcnN0IG1peGVyLAotICogICAgICAgIHVzZSBuZXcgcHJpdmF0ZSBtaXhlciBBUEkgZm9yIHNvbG8gbW9kZS4KLSAqICAgMTk5OC0wOC0xOCAgUnV1cmQgUmVpdHNtYSA8Ui5BLlJlaXRzbWFAd2JtdC50dWRlbGZ0Lm5sPgotICoJICBTbWFsbCBtb2RpZmljYXRpb24gdG8gZXhwb3J0IEFDSSBmdW5jdGlvbnMgYW5kIAotICoJICBjb21wbGV0ZSBtb2R1bGFyaXNhdGlvbi4KLSAqICAgMjAwMC0wNi0yMCAgUm9iZXJ0IFNpZW1lciA8Um9iZXJ0LlNpZW1lckBnbXguZGU+Ci0gKiAgICAgICAgRG9uJ3QgaW5pdGlhbGl6ZSB0aGUgQ1M0MjMxQSBtaXhlciBhbnltb3JlLCBzbyB0aGUgY29kZSBpcwotICogICAgICAgIHdvcmtpbmcgYWdhaW4sIGFuZCBvdGhlciBzbWFsbCBjaGFuZ2VzIHRvIGZpdCBpbiB0b2RheXMKLSAqICAgICAgICBrZXJuZWxzLgotICogICAyMDAwLTA4LTI2ICBSb2JlcnQgU2llbWVyCi0gKiAgICAgICAgQ2xlYW4gdXAgYW5kIHJld3JpdGUgZm9yIDIuNC54LiBNYXliZSBpdCdzIFNNUCBzYWZlIG5vdy4uLiAoOgotICogICAgICAgIGlvY3RsIGJ1Z2ZpeCwgYW5kIGludGVncmF0aW9uIG9mIHNvbG8tbW9kZSBpbnRvIE9TUy1BUEksCi0gKiAgICAgICAgYWRkZWQgKE9TUy1saW1pdGVkKSBlcXVhbGl6ZXIgc3VwcG9ydCwgcmV0dXJuIHZhbHVlIGJ1Z2ZpeCwKLSAqICAgICAgICBjaGFuZ2VkIHBhcmFtIGFjaV9yZXNldCB0byByZXNldCwgbmV3IHBhcmFtczogaWRlLCB3c3MuCi0gKiAgIDIwMDEtMDQtMjAgIFJvYmVydCBTaWVtZXIKLSAqICAgICAgICBldmVuIG1vcmUgY2xlYW51cHMuLi4KLSAqICAgMjAwMS0xMC0wOCAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+Ci0gKiAgIAkgIEdldCByaWQgb2YgY2hlY2tfcmVnaW9uLCAuYnNzIG9wdGltaXphdGlvbnMsIHVzZSBzZXRfY3VycmVudF9zdGF0ZQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IAotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLWludCBhY2lfcG9ydDsJLyogYXMgZGV0ZXJtaW5lZCBieSBiaXQgNCBpbiB0aGUgT1BUaSA5MjkgTUM0IHJlZ2lzdGVyICovCi1zdGF0aWMgaW50IGFjaV9pZGNvZGVbMl07CS8qIG1hbnVmYWN0dXJlciBhbmQgcHJvZHVjdCBJRCAqLwotaW50IGFjaV92ZXJzaW9uOwkvKiBBQ0kgZmlybXdhcmUgdmVyc2lvbgkqLwotCi1FWFBPUlRfU1lNQk9MKGFjaV9wb3J0KTsKLUVYUE9SVF9TWU1CT0woYWNpX3ZlcnNpb24pOwotCi0jaW5jbHVkZSAiYWNpLmgiCi0KLQotc3RhdGljIGludCBhY2lfc29sbzsJLyogc3RhdHVzIGJpdCBvZiB0aGUgY2FyZCB0aGF0IGNhbid0IGJlCQkqCi0JCQkgKiBjaGVja2VkIHdpdGggQUNJIHZlcnNpb25zIHByaW9yIHRvIDB4YjAJKi8KLXN0YXRpYyBpbnQgYWNpX2FtcDsgICAvKiBzdGF0dXMgYml0IGZvciBwb3dlci1hbXAvbGluZS1vdXQgbGV2ZWwKLQkJCSAgIGJ1dCBJIGhhdmUgbm8gZG9jcyBhYm91dCB3aGF0IGlzIHdoYXQuLi4gKi8KLXN0YXRpYyBpbnQgYWNpX21pY3ByZWFtcD0zOyAvKiBtaWNyb3Bob25lIHByZWFtcC1sZXZlbCB0aGF0IGNhbid0IGJlICAgICoKLQkJCSAqIGNoZWNrZWQgd2l0aCBBQ0kgdmVyc2lvbnMgcHJpb3IgdG8gMHhiMAkqLwotCi1zdGF0aWMgaW50IG1peGVyX2RldmljZTsKLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggYWNpX211dGV4OwotCi0jaWZkZWYgTU9EVUxFCi1zdGF0aWMgaW50IHJlc2V0OwotbW9kdWxlX3BhcmFtKHJlc2V0LCBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocmVzZXQsIldoZW4gc2V0IHRvIDEsIHJlc2V0IGFjaSBtaXhlci4iKTsKLSNlbHNlCi1zdGF0aWMgaW50IHJlc2V0ID0gMTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGlkZT0tMTsKLW1vZHVsZV9wYXJhbShpZGUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlkZSwiMSBlbmFibGUsIDAgZGlzYWJsZSBpZGUtcG9ydCAtIHVudGVzdGVkIgotCQkgIiBkZWZhdWx0OiBkbyBub3RoaW5nIik7Ci1zdGF0aWMgaW50IHdzcz0tMTsKLW1vZHVsZV9wYXJhbSh3c3MsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdzcywiY2hhbmdlIGJldHdlZW4gQUNJL1dTUy1taXhlcjsgdXNlIDAgYW5kIDEgLSB1bnRlc3RlZCIKLQkJICIgZGVmYXVsdDogZG8gbm90aGluZzsgZm9yIFBDTTEtcHJvIG9ubHkiKTsKLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgdm9pZCBwcmludF9iaXRzKHVuc2lnbmVkIGNoYXIgYykKLXsKLQlpbnQgajsKLQlwcmludGsoS0VSTl9ERUJVRyAiYWNpOiAiKTsKLQotCWZvciAoaj03OyBqPj0wOyBqLS0pIHsKLQkJcHJpbnRrKCIlZCIsIChjID4+IGopICYgMHgxKTsKLQl9Ci0KLQlwcmludGsoIlxuIik7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgYnVzeSB3YWl0IGNvZGUgbm9ybWFsbHkgcmVxdWlyZXMgbGVzcyB0aGFuIDE1IGxvb3BzIGFuZAotICogcHJhY3RpY2FsbHkgYWx3YXlzIGxlc3MgdGhhbiAxMDAgbG9vcHMgb24gbXkgaTQ4Ni9EWDIgNjYgTUh6LgotICoKLSAqIFdhcm5pbmc6IFdhaXRpbmcgb24gdGhlIGdlbmVyYWwgc3RhdHVzIGZsYWcgYWZ0ZXIgcmVzZXRpbmcgdGhlIE1VVEUKLSAqIGZ1bmN0aW9uIGNhbiB0YWtlIGEgVkVSWSBsb25nIHRpbWUsIGJlY2F1c2UgdGhlIFBDTTEyIGRvZXMgc29tZSBraW5kCi0gKiBvZiBmYWRlLWluIGVmZmVjdC4gRm9yIHRoaXMgcmVhc29uLCBhY2Nlc3MgdG8gdGhlIE1VVEUgZnVuY3Rpb24gaGFzCi0gKiBub3QgYmVlbiBpbXBsZW1lbnRlZCBhdCBhbGwuCi0gKgotICogLSBUaGUgT1NTIGludGVyZmFjZSBoYXMgbm8gbXV0ZSBvcHRpb24uIEl0IHRha2VzIGFib3V0IDMgc2Vjb25kcyB0bwotICogZmFkZS1pbiBvbiBteSBQQ00yMC4gYnVzeV93YWl0KCkgaGFuZGxlcyBpdCBncmVhdCBub3cuLi4gICAgIFJvYmVydAotICovCi0KLXN0YXRpYyBpbnQgYnVzeV93YWl0KHZvaWQpCi17Ci0JI2RlZmluZSBNSU5USU1FIDUwMAotCWxvbmcgdGltZW91dDsKLQl1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLQlmb3IgKHRpbWVvdXQgPSAxOyB0aW1lb3V0IDw9IE1JTlRJTUUrMzA7IHRpbWVvdXQrKykgewotCQlpZiAoKChieXRlPWluYihCVVNZX1JFR0lTVEVSKSkgJiAxKSA9PSAwKSB7Ci0JCQlpZiAodGltZW91dCA+PSBNSU5USU1FKQotCQkJCXByaW50ayhLRVJOX0RFQlVHICJhY2k6IEdvdCBSRUFEWUZMQUcgaW4gcm91bmQgJWxkLlxuIiwgdGltZW91dC1NSU5USU1FKTsKLQkJCXJldHVybiBieXRlOwotCQl9Ci0JCWlmICh0aW1lb3V0ID49IE1JTlRJTUUpIHsKLQkJCWxvbmcgb3V0PTEwKkhaOwotCQkJc3dpdGNoICh0aW1lb3V0LU1JTlRJTUUpIHsKLQkJCWNhc2UgMCAuLi4gOToKLQkJCQlvdXQgLz0gMTA7Ci0JCQljYXNlIDEwIC4uLiAxOToKLQkJCQlvdXQgLz0gMTA7Ci0JCQljYXNlIDIwIC4uLiAzMDoKLQkJCQlvdXQgLz0gMTA7Ci0JCQlkZWZhdWx0OgotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCQlzY2hlZHVsZV90aW1lb3V0KG91dCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiYWNpOiBidXN5X3dhaXQoKSB0aW1lIG91dC5cbiIpOwotCXJldHVybiAtRUJVU1k7Ci19Ci0KLS8qIFRoZSBmb3VyIEFDSSBjb21tYW5kIHR5cGVzIGFyZSBmdWNrZWQgdXAuIFstOgotICogaW1wbGllZCBpczogMXcgICAgICAtIHNwZWNpYWwgY2FzZSBmb3IgSU5JVAotICogd3JpdGUgICBpczogMncxcgotICogcmVhZCAgICBpczogeCgxdzFyKSB3aGVyZSB4IGlzIDEgb3IgMiAoMSBDSEVDS19TSUcsIDEgQ0hFQ0tfU1RFUiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgVkVSU0lPTiwgMiBJRENPREUpCi0gKiAgdGhlIGNvbW1hbmQgaXMgb25seSBpbiB0aGUgZmlyc3Qgd3JpdGUsIHJlc3QgaXMgcHJvdG9jb2wgb3ZlcmhlYWQKLSAqCi0gKiBpbmRleGVkIGlzIHRlY2huaWNhbGx5IGEgd3JpdGUgYW5kIHVzZWQgZm9yIFNUQVRVUwotICogYW5kIHRoZSBzcGVjaWFsIGNhc2UgZm9yIFRVTkUgaXM6IDN3MXIKLSAqIAotICogSGVyZSB0aGUgbmV3IGdlbmVyYWwgc2hlbWU6IFRVTkUgLS0+IGFjaV9yd19jbWQoeCwgIHksICB6KQotICogICAgICAgICAgICAgICAgaW5kZXhlZCBhbmQgd3JpdGUgLS0+IGFjaV9yd19jbWQoeCwgIHksIC0xKQotICogICAgICAgICAgIGltcGxpZWQgYW5kIHJlYWQgKHg9MSkgLS0+IGFjaV9yd19jbWQoeCwgLTEsIC0xKQotICoKLSAqIFJlYWQgKHg+PTIpIGlzIG5vdCBpbXBsZW1lbnRlZCAob25seSB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbikuCi0gKiBVc2UgYWNpX2lkY29kZVsyXSBhbmQgYWNpX3ZlcnNpb24uLi4gICAgICAgICAgICAgICAgICAgIFJvYmVydAotICovCi0KLS8qIFNvbWUgbm90ZXMgZm9yIGVycm9yIGRldGVjdGlvbjogdGhlb3JldGljYWxseSBpdCBpcyBwb3NzaWJsZS4KLSAqIEJ1dCBpdCBkb3VibGVzIHRoZSBJL08tdHJhZmZpYyBmcm9tIHd3KHIpIHRvIHd3d3J3KHIpIGluIHRoZSBub3JtYWwgCi0gKiBjYXNlIGFuZCBkb2Vzbid0IHNlZW0gdG8gYmUgZGVzaWduZWQgZm9yIHRoYXQuLi4gICAgICAgIFJvYmVydAotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGFjaV9yYXd3cml0ZSh1bnNpZ25lZCBjaGFyIGJ5dGUpCi17Ci0JaWYgKGJ1c3lfd2FpdCgpID49IDApIHsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpX3Jhd3dyaXRlKCVkKVxuIiwgYnl0ZSk7Ci0jZW5kaWYKLQkJb3V0YihieXRlLCBDT01NQU5EX1JFR0lTVEVSKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlCi0JCXJldHVybiAtRUJVU1k7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFjaV9yYXdyZWFkKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciBieXRlOwotCi0JaWYgKGJ1c3lfd2FpdCgpID49IDApIHsKLQkJYnl0ZT1pbmIoU1RBVFVTX1JFR0lTVEVSKTsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiJWQgPSBhY2lfcmF3cmVhZCgpXG4iLCBieXRlKTsKLSNlbmRpZgotCQlyZXR1cm4gYnl0ZTsKLQl9IGVsc2UKLQkJcmV0dXJuIC1FQlVTWTsKLX0KLQotCi1pbnQgYWNpX3J3X2NtZChpbnQgd3JpdGUxLCBpbnQgd3JpdGUyLCBpbnQgd3JpdGUzKQotewotCWludCB3cml0ZVtdID0ge3dyaXRlMSwgd3JpdGUyLCB3cml0ZTN9OwotCWludCByZWFkID0gLUVJTlRSLCBpOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWNpX211dGV4KSkKLQkJZ290byBvdXQ7Ci0KLQlmb3IgKGk9MDsgaTwzOyBpKyspIHsKLQkJaWYgKHdyaXRlW2ldPCAwIHx8IHdyaXRlW2ldID4gMjU1KQotCQkJYnJlYWs7Ci0JCWVsc2UgewotCQkJcmVhZCA9IGFjaV9yYXd3cml0ZSh3cml0ZVtpXSk7Ci0JCQlpZiAocmVhZCA8IDApCi0JCQkJZ290byBvdXRfdXA7Ci0JCX0KLQkJCi0JfQotCQotCXJlYWQgPSBhY2lfcmF3cmVhZCgpOwotb3V0X3VwOgltdXRleF91bmxvY2soJmFjaV9tdXRleCk7Ci1vdXQ6CXJldHVybiByZWFkOwotfQotCi1FWFBPUlRfU1lNQk9MKGFjaV9yd19jbWQpOwotCi1zdGF0aWMgaW50IHNldHZvbHVtZShpbnQgX191c2VyICphcmcsIAotCQkgICAgIHVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKLXsKLQlpbnQgdm9sLCByZXQsIHVzZXJ2b2wsIGJ1ZjsKLQotCV9fZ2V0X3VzZXIodXNlcnZvbCwgYXJnKTsKLQotCS8qIGxlZnQgY2hhbm5lbCAqLwotCXZvbCA9IHVzZXJ2b2wgJiAweGZmOwotCWlmICh2b2wgPiAxMDApCi0JCXZvbCA9IDEwMDsKLQl2b2wgPSBTQ0FMRSgxMDAsIDB4MjAsIHZvbCk7Ci0JaWYgKChidWY9YWNpX3dyaXRlX2NtZChsZWZ0X2luZGV4LCAweDIwIC0gdm9sKSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQlyZXQgPSBTQ0FMRSgweDIwLCAxMDAsIHZvbCk7Ci0KLQotCS8qIHJpZ2h0IGNoYW5uZWwgKi8KLQl2b2wgPSAodXNlcnZvbCA+PiA4KSAmIDB4ZmY7Ci0JaWYgKHZvbCA+IDEwMCkKLQkJdm9sID0gMTAwOwotCXZvbCA9IFNDQUxFKDEwMCwgMHgyMCwgdm9sKTsKLQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKHJpZ2h0X2luZGV4LCAweDIwIC0gdm9sKSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQlyZXQgfD0gU0NBTEUoMHgyMCwgMTAwLCB2b2wpIDw8IDg7Ci0gCi0JX19wdXRfdXNlcihyZXQsIGFyZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXR2b2x1bWUoaW50IF9fdXNlciAqYXJnLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKLXsKLQlpbnQgdm9sOwotCWludCBidWY7Ci0KLQkvKiBsZWZ0IGNoYW5uZWwgKi8KLQlpZiAoKGJ1Zj1hY2lfaW5kZXhlZF9jbWQoQUNJX1NUQVRVUywgbGVmdF9pbmRleCkpPDApCi0JCXJldHVybiBidWY7Ci0Jdm9sID0gU0NBTEUoMHgyMCwgMTAwLCBidWYgPCAweDIwID8gMHgyMC1idWYgOiAwKTsKLQkKLQkvKiByaWdodCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIHJpZ2h0X2luZGV4KSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQl2b2wgfD0gU0NBTEUoMHgyMCwgMTAwLCBidWYgPCAweDIwID8gMHgyMC1idWYgOiAwKSA8PCA4OwotCi0JX19wdXRfdXNlcih2b2wsIGFyZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZXF1YWxpemVyIGlzIHNvbWV3aGF0IHN0cmFuZ2Ugb24gdGhlIEFDSS4gRnJvbSAtMTJkQiB0byArMTJkQgotICogd3JpdGU6ICAweGZmLi5kb3duLnRvLi4weDgwPT0weDAwLi51cC50by4uMHg3ZgotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGVxX29zczJhY2kodW5zaWduZWQgaW50IHZvbCkKLXsKLQlpbnQgYm9vc3Q9MDsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0JaWYgKHZvbCA+IDEwMCkKLQkJdm9sID0gMTAwOwotCWlmICh2b2wgPiA1MCkgewotCQl2b2wgLT0gNTE7Ci0JCWJvb3N0PTE7Ci0JfQotCWlmIChib29zdCkKLQkJcmV0PVNDQUxFKDQ5LCAweDdlLCB2b2wpKzE7Ci0JZWxzZQotCQlyZXQ9MHhmZiAtIFNDQUxFKDUwLCAweDdmLCB2b2wpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGVxX2FjaTJvc3ModW5zaWduZWQgaW50IHZvbCkKLXsKLQlpZiAodm9sIDwgMHg4MCkKLQkJcmV0dXJuIFNDQUxFKDB4N2YsIDUwLCB2b2wpICsgNTA7Ci0JZWxzZQotCQlyZXR1cm4gU0NBTEUoMHg3ZiwgNTAsIDB4ZmYtdm9sKTsKLX0KLQotCi1zdGF0aWMgaW50IHNldGVxdWFsaXplcihpbnQgX191c2VyICphcmcsIAotCQkJdW5zaWduZWQgY2hhciBsZWZ0X2luZGV4LCB1bnNpZ25lZCBjaGFyIHJpZ2h0X2luZGV4KQotewotCWludCBidWY7Ci0JdW5zaWduZWQgaW50IHZvbDsKLQotCV9fZ2V0X3VzZXIodm9sLCBhcmcpOwotCi0JLyogbGVmdCBjaGFubmVsICovCi0JaWYgKChidWY9YWNpX3dyaXRlX2NtZChsZWZ0X2luZGV4LCBlcV9vc3MyYWNpKHZvbCAmIDB4ZmYpKSk8MCkKLQkJcmV0dXJuIGJ1ZjsKLQotCS8qIHJpZ2h0IGNoYW5uZWwgKi8KLQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKHJpZ2h0X2luZGV4LCBlcV9vc3MyYWNpKCh2b2w+PjgpICYgMHhmZikpKTwwKQotCQlyZXR1cm4gYnVmOwotCi0JLyogdGhlIEFDSSBlcXVhbGl6ZXIgaXMgbW9yZSBwcmVjaXNlICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0ZXF1YWxpemVyKGludCBfX3VzZXIgKmFyZywKLQkJCXVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKLXsKLQlpbnQgYnVmOwotCXVuc2lnbmVkIGludCB2b2w7Ci0KLQkvKiBsZWZ0IGNoYW5uZWwgKi8KLQlpZiAoKGJ1Zj1hY2lfaW5kZXhlZF9jbWQoQUNJX1NUQVRVUywgbGVmdF9pbmRleCkpPDApCi0JCXJldHVybiBidWY7Ci0Jdm9sID0gZXFfYWNpMm9zcyhidWYpOwotCQotCS8qIHJpZ2h0IGNoYW5uZWwgKi8KLQlpZiAoKGJ1Zj1hY2lfaW5kZXhlZF9jbWQoQUNJX1NUQVRVUywgcmlnaHRfaW5kZXgpKTwwKQotCQlyZXR1cm4gYnVmOwotCXZvbCB8PSBlcV9hY2kyb3NzKGJ1ZikgPDwgODsKLQotCV9fcHV0X3VzZXIodm9sLCBhcmcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWNpX21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKLXsKLQlpbnQgdm9sLCBidWY7Ci0JaW50IF9fdXNlciAqcCA9IGFyZzsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgwMSwgMHgwMCk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9DRDoKLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNjLCAweDM0KTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX01JQzoKLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDM4LCAweDMwKTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0xJTkU6Ci0JCXJldHVybiBzZXR2b2x1bWUocCwgMHgzOSwgMHgzMSk7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9TWU5USDoKLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNiLCAweDMzKTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1BDTToKLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNhLCAweDMyKTsKLQljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JBRElPKTogLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMTogIC8qIEFVWDEgb3IgcmFkaW8gKi8KLQkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNkLCAweDM1KTsKLQljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0xJTkUyOiAgLyogQVVYMiAqLwotCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4M2UsIDB4MzYpOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQkFTUzogICAvKiBzZXQgYmFuZCBvbmUgYW5kIHR3byAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlpZiAoKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0OCwgMHg0MCkpIHx8IAotCQkJICAgIChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NDksIDB4NDEpKSk7Ci0JCQlyZXR1cm4gYnVmOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVFJFQkxFOiAvKiBzZXQgYmFuZCBzaXggYW5kIHNldmVuICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCWlmICgoYnVmPXNldGVxdWFsaXplcihwLCAweDRkLCAweDQ1KSkgfHwgCi0JCQkgICAgKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0ZSwgMHg0NikpKTsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9JR0FJTjogIC8qIE1JQyBwcmUtYW1wICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQicgfHwgYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlfX2dldF91c2VyKHZvbCwgcCk7Ci0JCQl2b2wgPSB2b2wgJiAweGZmOwotCQkJaWYgKHZvbCA+IDEwMCkKLQkJCQl2b2wgPSAxMDA7Ci0JCQl2b2wgPSBTQ0FMRSgxMDAsIDMsIHZvbCk7Ci0JCQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKEFDSV9XUklURV9JR0FJTiwgdm9sKSk8MCkKLQkJCQlyZXR1cm4gYnVmOwotCQkJYWNpX21pY3ByZWFtcCA9IHZvbDsKLQkJCXZvbCA9IFNDQUxFKDMsIDEwMCwgdm9sKTsKLQkJCXZvbCB8PSAodm9sIDw8IDgpOwotCQkJX19wdXRfdXNlcih2b2wsIHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9XUklURV9PR0FJTjogIC8qIFBvd2VyLWFtcC9saW5lLW91dCBsZXZlbCAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0EnIHx8IGFjaV9pZGNvZGVbMV09PSdCJykgewotCQkJX19nZXRfdXNlcihidWYsIHApOwotCQkJYnVmID0gYnVmICYgMHhmZjsKLQkJCWlmIChidWYgPiA1MCkKLQkJCQl2b2wgPSAxOwotCQkJZWxzZQotCQkJCXZvbCA9IDA7Ci0JCQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKEFDSV9TRVRfUE9XRVJBTVAsIHZvbCkpPDApCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJCWFjaV9hbXAgPSB2b2w7Ci0JCQlpZiAoYWNpX2FtcCkKLQkJCQlidWYgPSAoMTAwIHx8IDEwMDw8OCk7Ci0JCQllbHNlCi0JCQkJYnVmID0gMDsKLQkJCV9fcHV0X3VzZXIoYnVmLCBwKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgotCQkvKiBoYW5kbGUgc29sbyBtb2RlIGNvbnRyb2wgKi8KLQkJX19nZXRfdXNlcihidWYsIHApOwotCQkvKiB1bnNldCBzb2xvIHdoZW4gUkVDU1JDIGZvciBQQ00gaXMgcmVxdWVzdGVkICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQicgfHwgYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQl2b2wgPSAhKGJ1ZiAmIFNPVU5EX01BU0tfUENNKTsKLQkJCWlmICgoYnVmPWFjaV93cml0ZV9jbWQoQUNJX1NFVF9TT0xPTU9ERSwgdm9sKSk8MCkKLQkJCQlyZXR1cm4gYnVmOwotCQkJYWNpX3NvbG8gPSB2b2w7Ci0JCX0KLQkJYnVmID0gKFNPVU5EX01BU0tfQ0R8IFNPVU5EX01BU0tfTUlDfCBTT1VORF9NQVNLX0xJTkV8Ci0JCSAgICAgICBTT1VORF9NQVNLX1NZTlRIfCBTT1VORF9NQVNLX0xJTkUyKTsKLQkJaWYgKGFjaV9pZGNvZGVbMV0gPT0gJ0MnKSAvKiBQQ00yMCByYWRpbyAqLwotCQkJYnVmIHw9IFNPVU5EX01BU0tfUkFESU87Ci0JCWVsc2UKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOwotCQlpZiAoIWFjaV9zb2xvKQotCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOwotCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgotCQlidWYgPSAoU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0NEICAgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTUlDICAgIHwgU09VTkRfTUFTS19MSU5FICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX1NZTlRIICB8IFNPVU5EX01BU0tfUENNICAgfAotCQkgICAgICAgU09VTkRfTUFTS19MSU5FMik7Ci0JCXN3aXRjaCAoYWNpX2lkY29kZVsxXSkgewotCQljYXNlICdDJzogLyogUENNMjAgcmFkaW8gKi8KLQkJCWJ1ZiB8PSAoU09VTkRfTUFTS19SQURJTyB8IFNPVU5EX01BU0tfSUdBSU4gfAotCQkJCVNPVU5EX01BU0tfQkFTUyAgfCBTT1VORF9NQVNLX1RSRUJMRSk7Ci0JCQlicmVhazsKLQkJY2FzZSAnQic6IC8qIFBDTTEyICovCi0JCQlidWYgfD0gKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX0lHQUlOIHwKLQkJCQlTT1VORF9NQVNLX09HQUlOKTsKLQkJCWJyZWFrOwotCQljYXNlICdBJzogLyogUENNMS1wcm8gKi8KLQkJCWJ1ZiB8PSAoU09VTkRfTUFTS19MSU5FMSB8IFNPVU5EX01BU0tfT0dBSU4pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKLQkJfQotCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgotCQlidWYgPSAoU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0NEICAgIHwKLQkJICAgICAgIFNPVU5EX01BU0tfTUlDICAgIHwgU09VTkRfTUFTS19MSU5FICB8Ci0JCSAgICAgICBTT1VORF9NQVNLX1NZTlRIICB8IFNPVU5EX01BU0tfUENNICAgfAotCQkgICAgICAgU09VTkRfTUFTS19MSU5FMik7Ci0JCXN3aXRjaCAoYWNpX2lkY29kZVsxXSkgewotCQljYXNlICdDJzogLyogUENNMjAgcmFkaW8gKi8KLQkJCWJ1ZiB8PSAoU09VTkRfTUFTS19SQURJTyB8Ci0JCQkJU09VTkRfTUFTS19CQVNTICB8IFNPVU5EX01BU0tfVFJFQkxFKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0JCX0KLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKLQkJYnVmID0gKFNPVU5EX01BU0tfQ0R8IFNPVU5EX01BU0tfTUlDfCBTT1VORF9NQVNLX0xJTkV8Ci0JCSAgICAgICBTT1VORF9NQVNLX1NZTlRIfCBTT1VORF9NQVNLX0xJTkUyfCBTT1VORF9NQVNLX1BDTSk7Ci0JCWlmIChhY2lfaWRjb2RlWzFdID09ICdDJykgLyogUENNMjAgcmFkaW8gKi8KLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1JBRElPOwotCQllbHNlCi0JCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKLQotCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCXJldHVybiAwOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6Ci0JCWJ1ZiA9IChTT1VORF9NQVNLX0NEICAgIHwgU09VTkRfTUFTS19NSUMgICB8IFNPVU5EX01BU0tfTElORSAgfAotCQkgICAgICAgU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfTElORTIpOwotCQkvKiBkbyB3ZSBuZWVkIGFjaV9zb2xvIG9yIGNhbiBJIGdldCBpdCBmcm9tIHRoZSBBQ0k/ICovCi0JCXN3aXRjaCAoYWNpX2lkY29kZVsxXSkgewotCQljYXNlICdCJzogLyogUENNMTIgKi8KLQkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCi0JCQlpZiAoYWNpX3ZlcnNpb24gPj0gMHhiMCkgewotCQkJCWlmICgodm9sPWFjaV9yd19jbWQoQUNJX1NUQVRVUywKLQkJCQkJCSAgICBBQ0lfU19HRU5FUkFMLCAtMSkpPDApCi0JCQkJCXJldHVybiB2b2w7Ci0JCQkJaWYgKHZvbCAmIDB4MjApCi0JCQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlpZiAoIWFjaV9zb2xvKQotCQkJCQlidWYgfD0gU09VTkRfTUFTS19QQ007Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKLQkJfQotCQlpZiAoYWNpX2lkY29kZVsxXSA9PSAnQycpIC8qIFBDTTIwIHJhZGlvICovCi0JCQlidWYgfD0gU09VTkRfTUFTS19SQURJTzsKLQkJZWxzZQotCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7Ci0KLQkJX19wdXRfdXNlcihidWYsIHApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0FQUzoKLQkJX19wdXRfdXNlcigwLCBwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRToKLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDA0LCAweDAzKTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0Q6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwYSwgMHgwOSk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX01JQzoKLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDA2LCAweDA1KTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfTElORToKLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDA4LCAweDA3KTsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfU1lOVEg6Ci0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgwYywgMHgwYik7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX1BDTToKLQkJcmV0dXJuIGdldHZvbHVtZShwLCAweDBlLCAweDBkKTsKLQljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkFESU8pOiAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIFNPVU5EX01JWEVSX1JFQURfTElORTE6ICAvKiBBVVgxICovCi0JCXJldHVybiBnZXR2b2x1bWUocCwgMHgxMSwgMHgxMCk7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUyOiAgLyogQVVYMiAqLwotCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MTMsIDB4MTIpOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9CQVNTOiAgIC8qIGdldCBiYW5kIG9uZSAqLwotCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7Ci0JCQlyZXR1cm4gZ2V0ZXF1YWxpemVyKHAsIDB4MjMsIDB4MjIpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9UUkVCTEU6IC8qIGdldCBiYW5kIHNldmVuICovCi0JCWlmIChhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCXJldHVybiBnZXRlcXVhbGl6ZXIocCwgMHgyZiwgMHgyZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9SRUFEX0lHQUlOOiAgLyogTUlDIHByZS1hbXAgKi8KLQkJaWYgKGFjaV9pZGNvZGVbMV09PSdCJyB8fCBhY2lfaWRjb2RlWzFdPT0nQycpIHsKLQkJCS8qIGFjaV9taWNwcmVhbXAgb3IgQUNJPyAqLwotCQkJaWYgKGFjaV92ZXJzaW9uID49IDB4YjApIHsKLQkJCQlpZiAoKGJ1Zj1hY2lfaW5kZXhlZF9jbWQoQUNJX1NUQVRVUywKLQkJCQkJCQkgQUNJX1NfUkVBRF9JR0FJTikpPDApCi0JCQkJCXJldHVybiBidWY7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYnVmPWFjaV9taWNwcmVhbXA7Ci0JCQl2b2wgPSBTQ0FMRSgzLCAxMDAsIGJ1ZiA8PSAzID8gYnVmIDogMyk7Ci0JCQl2b2wgfD0gdm9sIDw8IDg7Ci0JCQlfX3B1dF91c2VyKHZvbCwgcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX1JFQURfT0dBSU46Ci0JCWlmIChhY2lfYW1wKQotCQkJYnVmID0gKDEwMCB8fCAxMDA8PDgpOwotCQllbHNlCi0JCQlidWYgPSAwOwotCQlfX3B1dF91c2VyKGJ1ZiwgcCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIGFjaV9taXhlcl9vcGVyYXRpb25zID0KLXsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuaWQgICAgPSAiQUNJIiwKLQkuaW9jdGwgPSBhY2lfbWl4ZXJfaW9jdGwKLX07Ci0KLS8qCi0gKiBUaGVyZSBpcyBhbHNvIGFuIGludGVybmFsIG1peGVyIGluIHRoZSBjb2RlYyAoQ1M0MjMxQSBvciBBRDE4NDUpLAotICogdGhhdCBkZXNlcnZlcyBubyBwdXJwb3NlIGluIGFuIEFDSSBiYXNlZCBzeXN0ZW0gd2hpY2ggdXNlcyBhbgotICogZXh0ZXJuYWwgQUNJIGNvbnRyb2xsZWQgc3RlcmVvIG1peGVyLiBNYWtlIHN1cmUgdGhhdCB0aGlzIGNvZGVjCi0gKiBtaXhlciBoYXMgdGhlIEFVWDEgaW5wdXQgc2VsZWN0ZWQgYXMgdGhlIHJlY29yZGluZyBzb3VyY2UsIHRoYXQgdGhlCi0gKiBpbnB1dCBnYWluIGlzIHNldCBuZWFyIG1heGltdW0gYW5kIHRoYXQgdGhlIG90aGVyIGNoYW5uZWxzIGdvaW5nCi0gKiBmcm9tIHRoZSBpbnB1dHMgdG8gdGhlIGNvZGVjIG91dHB1dCBhcmUgbXV0ZWQuCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgYXR0YWNoX2FjaSh2b2lkKQotewotCWNoYXIgKmJvYXJkbmFtZTsKLQlpbnQgaSwgcmMgPSAtRUJVU1k7Ci0KLQltdXRleF9pbml0KCZhY2lfbXV0ZXgpOwotCi0Jb3V0YigweEUzLCAweGY4Zik7IC8qIFdyaXRlIE1BRDE2IHBhc3N3b3JkICovCi0JYWNpX3BvcnQgPSAoaW5iKDB4ZjkwKSAmIDB4MTApID8KLQkJMHgzNDQ6IDB4MzU0OyAvKiBHZXQgYWNpX3BvcnQgZnJvbSBNQzRfUE9SVCAqLwotCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihhY2lfcG9ydCwgMywgInNvdW5kIG1peGVyIChBQ0kpIikpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCSAgICAgICAiYWNpOiBJL08gYXJlYSAweCUwM3gtMHglMDN4IGFscmVhZHkgdXNlZC5cbiIsCi0JCSAgICAgICBhY2lfcG9ydCwgYWNpX3BvcnQrMik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGZvcmNlIEFDSSBpbnRvIGEga25vd24gc3RhdGUgKi8KLQlyYyA9IC1FRkFVTFQ7Ci0JZm9yIChpPTA7IGk8MzsgaSsrKQotCQlpZiAoYWNpX3J3X2NtZChBQ0lfRVJST1JfT1AsIC0xLCAtMSk8MCkKLQkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCi0JLyogb2ZmaWNpYWwgdGhpcyBpcyBvbmUgYWNpIHJlYWQgY2FsbDogKi8KLQlyYyA9IC1FRkFVTFQ7Ci0JaWYgKChhY2lfaWRjb2RlWzBdPWFjaV9yd19jbWQoQUNJX1JFQURfSURDT0RFLCAtMSwgLTEpKTwwIHx8Ci0JICAgIChhY2lfaWRjb2RlWzFdPWFjaV9yd19jbWQoQUNJX1JFQURfSURDT0RFLCAtMSwgLTEpKTwwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWNpOiBGYWlsZWQgdG8gcmVhZCBpZGNvZGUgb24gMHglMDN4LlxuIiwKLQkJICAgICAgIGFjaV9wb3J0KTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JaWYgKChhY2lfdmVyc2lvbj1hY2lfcndfY21kKEFDSV9SRUFEX1ZFUlNJT04sIC0xLCAtMSkpPDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhY2k6IEZhaWxlZCB0byByZWFkIHZlcnNpb24gb24gMHglMDN4LlxuIiwKLQkJICAgICAgIGFjaV9wb3J0KTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JaWYgKGFjaV9pZGNvZGVbMF0gPT0gJ20nKSB7Ci0JCS8qIEl0IGxvb2tzIGxpa2UgYSBtaXJvIHNvdW5kIGNhcmQuICovCi0JCXN3aXRjaCAoYWNpX2lkY29kZVsxXSkgewotCQljYXNlICdBJzoKLQkJCWJvYXJkbmFtZSA9ICJQQ00xIHBybyAvIGVhcmx5IFBDTTEyIjsKLQkJCWJyZWFrOwotCQljYXNlICdCJzoKLQkJCWJvYXJkbmFtZSA9ICJQQ00xMiI7Ci0JCQlicmVhazsKLQkJY2FzZSAnQyc6Ci0JCQlib2FyZG5hbWUgPSAiUENNMjAgcmFkaW8iOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlib2FyZG5hbWUgPSAidW5rbm93biBtaXJvIjsKLQkJfQotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFjaTogV2FybmluZzogdW5zdXBwb3J0ZWQgY2FyZCEgLSAiCi0JCSAgICAgICAibm8gaGFyZHdhcmUsIG5vIHNwZWNzLi4uXG4iKTsKLQkJYm9hcmRuYW1lID0gInVua25vd24gQ2FyZGluYWwgVGVjaG5vbG9naWVzIjsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICI8QUNJIDB4JTAyeCwgaWQgJTAyeC8lMDJ4IFwiJWMvJWNcIiwgKCVzKT4gYXQgMHglMDN4XG4iLAotCSAgICAgICBhY2lfdmVyc2lvbiwKLQkgICAgICAgYWNpX2lkY29kZVswXSwgYWNpX2lkY29kZVsxXSwKLQkgICAgICAgYWNpX2lkY29kZVswXSwgYWNpX2lkY29kZVsxXSwKLQkgICAgICAgYm9hcmRuYW1lLCBhY2lfcG9ydCk7Ci0KLQlyYyA9IC1FQlVTWTsKLQlpZiAocmVzZXQpIHsKLQkJLyogZmlyc3Qgd3JpdGUoKXMgYWZ0ZXIgcmVzZXQgZmFpbCB3aXRoIG15IFBDTTIwICovCi0JCWlmIChhY2lfcndfY21kKEFDSV9JTklULCAtMSwgLTEpPDAgfHwKLQkJICAgIGFjaV9yd19jbWQoQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCk8MCB8fAotCQkgICAgYWNpX3J3X2NtZChBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QKTwwKQotCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogdGhlIFBDTTIwIGlzIG11dGVkIGFmdGVyIHJlc2V0IChhbmQgcmVib290KSAqLwotCWlmIChhY2lfcndfY21kKEFDSV9TRVRfTVVURSwgMHgwMCwgLTEpPDApCi0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCi0JaWYgKGlkZT49MCkKLQkJaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9JREUsICFpZGUsIC0xKTwwKQotCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JCi0JaWYgKHdzcz49MCAmJiBhY2lfaWRjb2RlWzFdPT0nQScpCi0JCWlmIChhY2lfcndfY21kKEFDSV9TRVRfV1NTLCAhIXdzcywgLTEpPDApCi0JCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQotCW1peGVyX2RldmljZSA9IHNvdW5kX2luc3RhbGxfbWl4ZXIoTUlYRVJfRFJJVkVSX1ZFUlNJT04sIGJvYXJkbmFtZSwKLQkJCQkJICAgJmFjaV9taXhlcl9vcGVyYXRpb25zLAotCQkJCQkgICBzaXplb2YoYWNpX21peGVyX29wZXJhdGlvbnMpLCBOVUxMKTsKLQlyYyA9IDA7Ci0JaWYgKG1peGVyX2RldmljZSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhY2k6IEZhaWxlZCB0byBpbnN0YWxsIG1peGVyLlxuIik7Ci0JCXJjID0gbWl4ZXJfZGV2aWNlOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9IC8qIGVsc2UgTWF5YmUgaW5pdGlhbGl6ZSB0aGUgQ1M0MjMxQSBtaXhlciBoZXJlLi4uICovCi1vdXQ6CXJldHVybiByYzsKLW91dF9yZWxlYXNlX3JlZ2lvbjoKLQlyZWxlYXNlX3JlZ2lvbihhY2lfcG9ydCwgMyk7Ci0JZ290byBvdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfYWNpKHZvaWQpCi17Ci0Jc291bmRfdW5sb2FkX21peGVyZGV2KG1peGVyX2RldmljZSk7Ci0JcmVsZWFzZV9yZWdpb24oYWNpX3BvcnQsIDMpOwotfQotCi1tb2R1bGVfaW5pdChhdHRhY2hfYWNpKTsKLW1vZHVsZV9leGl0KHVubG9hZF9hY2kpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjaS5oIGIvc291bmQvb3NzL2FjaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDEwMmVlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9hY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNpZm5kZWYgX0FDSV9IXwotI2RlZmluZSBfQUNJX0hfCi0KLWV4dGVybiBpbnQgYWNpX3BvcnQ7Ci1leHRlcm4gaW50IGFjaV92ZXJzaW9uOwkJLyogQUNJIGZpcm13YXJlIHZlcnNpb24JKi8KLWV4dGVybiBpbnQgYWNpX3J3X2NtZChpbnQgd3JpdGUxLCBpbnQgd3JpdGUyLCBpbnQgd3JpdGUzKTsKLQotI2RlZmluZSBhY2lfaW5kZXhlZF9jbWQoYSwgYikgYWNpX3J3X2NtZChhLCBiLCAtMSkKLSNkZWZpbmUgYWNpX3dyaXRlX2NtZChhLCBiKSAgIGFjaV9yd19jbWQoYSwgYiwgLTEpCi0jZGVmaW5lIGFjaV9yZWFkX2NtZChhKSAgICAgICBhY2lfcndfY21kKGEsLTEsIC0xKQotCi0jZGVmaW5lIENPTU1BTkRfUkVHSVNURVIgICAgKGFjaV9wb3J0KSAgICAgIC8qIHdyaXRlIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNUQVRVU19SRUdJU1RFUiAgICAgKGFjaV9wb3J0ICsgMSkgIC8qIHJlYWQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQlVTWV9SRUdJU1RFUiAgICAgICAoYWNpX3BvcnQgKyAyKSAgLyogYWxzbyB1c2VkIGZvciByZHMgKi8KLQotI2RlZmluZSBSRFNfUkVHSVNURVIgICAgICAgIEJVU1lfUkVHSVNURVIKLQotI2RlZmluZSBBQ0lfU0VUX01VVEUgICAgICAgICAgMHgwZAotI2RlZmluZSBBQ0lfU0VUX1BPV0VSQU1QICAgICAgMHgwZgotI2RlZmluZSBBQ0lfU0VUX1RVTkVSTVVURSAgICAgMHhhMwotI2RlZmluZSBBQ0lfU0VUX1RVTkVSTU9OTyAgICAgMHhhNAotI2RlZmluZSBBQ0lfU0VUX0lERSAgICAgICAgICAgMHhkMAotI2RlZmluZSBBQ0lfU0VUX1dTUyAgICAgICAgICAgMHhkMQotI2RlZmluZSBBQ0lfU0VUX1NPTE9NT0RFICAgICAgMHhkMgotI2RlZmluZSBBQ0lfV1JJVEVfSUdBSU4gICAgICAgMHgwMwotI2RlZmluZSBBQ0lfV1JJVEVfVFVORSAgICAgICAgMHhhNwotI2RlZmluZSBBQ0lfUkVBRF9UVU5FUlNURVJFTyAgMHhhOAotI2RlZmluZSBBQ0lfUkVBRF9UVU5FUlNUQVRJT04gMHhhOQotI2RlZmluZSBBQ0lfUkVBRF9WRVJTSU9OICAgICAgMHhmMQotI2RlZmluZSBBQ0lfUkVBRF9JRENPREUgICAgICAgMHhmMgotI2RlZmluZSBBQ0lfSU5JVCAgICAgICAgICAgICAgMHhmZgotI2RlZmluZSBBQ0lfU1RBVFVTICAgICAgICAgICAgMHhmMAotI2RlZmluZSAgICAgQUNJX1NfR0VORVJBTCAgICAgMHgwMAotI2RlZmluZSAgICAgQUNJX1NfUkVBRF9JR0FJTiAgMHgyMQotI2RlZmluZSBBQ0lfRVJST1JfT1AgICAgICAgICAgMHhkZgotCi0vKgotICogVGhlIGZvbGxvd2luZyBtYWNybyBTQ0FMRSBjYW4gYmUgdXNlZCB0byBzY2FsZSBvbmUgaW50ZWdlciB2b2x1bWUKLSAqIHZhbHVlIGludG8gYW5vdGhlciBvbmUgdXNpbmcgb25seSBpbnRlZ2VyIGFyaXRobWV0aWMuIElmIHRoZSBpbnB1dAotICogdmFsdWUgeCBpcyBpbiB0aGUgcmFuZ2UgMCA8PSB4IDw9IHhtYXgsIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlIGluCi0gKiB0aGUgcmFuZ2UgMCA8PSBTQ0FMRSh4bWF4LHltYXgseCkgPD0geW1heC4KLSAqCi0gKiBUaGlzIG1hY3JvIGhhcyBmb3IgYWxsIHhtYXgsIHltYXggPiAwIGFuZCBhbGwgMCA8PSB4IDw9IHhtYXggdGhlCi0gKiBmb2xsb3dpbmcgbmljZSBwcm9wZXJ0aWVzOgotICoKLSAqIC0gU0NBTEUoeG1heCx5bWF4LHhtYXgpID0geW1heAotICogLSBTQ0FMRSh4bWF4LHltYXgsMCkgPSAwCi0gKiAtIFNDQUxFKHhtYXgseW1heCxTQ0FMRSh5bWF4LHhtYXgsU0NBTEUoeG1heCx5bWF4LHgpKSkgPSBTQ0FMRSh4bWF4LHltYXgseCkKLSAqCi0gKiBJbiBhZGRpdGlvbiwgdGhlIHJvdW5kaW5nIGVycm9yIGlzIG1pbmltYWwgYW5kIG5pY2VseSBkaXN0cmlidXRlZC4KLSAqIFRoZSBwcm9vZnMgYXJlIGxlZnQgYXMgYW4gZXhlcmNpc2UgdG8gdGhlIHJlYWRlci4KLSAqLwotCi0jZGVmaW5lIFNDQUxFKHhtYXgseW1heCx4KSAoKCh4KSooeW1heCkrKHhtYXgpLzIpLyh4bWF4KSkKLQotCi0jZW5kaWYgIC8qIF9BQ0lfSF8gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZDE4MTYuYyBiL3NvdW5kL29zcy9hZDE4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhYmYzMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWQxODE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY4ICswLDAgQEAKLS8qCi0gKgotICogQUQxODE2IGxvd2xldmVsIHNvdW5kIGRyaXZlciBmb3IgTGludXggMi42LjAgYW5kIGFib3ZlCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgPGxpbnV4QHRob3JzdGVuLWtuYWJlLmRlPgotICoKLSAqIEJhc2VkIG9uIHRoZSBDUzQyMzIvQUQxODQ4IGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2Ci0gKgotICoKLSAqIHZlcnNpb246IDEuNQotICogc3RhdHVzOiBiZXRhCi0gKiBkYXRlOiAyMDAzLzA3LzE1Ci0gKgotICogQ2hhbmdlczoKLSAqCU9sZWcgRHJva2luOiBTb21lIGNsZWFudXAgb2YgbG9hZC91bmxvYWQgZnVuY3Rpb25zLgkxOTk4LzExLzI0Ci0gKgkKLSAqCVRob3JzdGVuIEtuYWJlOiBhdHRhY2ggYW5kIHVubG9hZCByZXdyaXR0ZW4sIAotICoJc29tZSBhcmd1bWVudCBjaGVja3MgYWRkZWQJCQkJMTk5OC8xMS8zMAotICoKLSAqCVRob3JzdGVuIEtuYWJlOiBCdWdneSBpc2EgYnJpZGdlIHdvcmthcm91bmQgYWRkZWQJMTk5OS8wMS8xNgotICoJCi0gKglEYXZpZCBNb2V3cy9UaG9yc3RlbiBLbmFiZTogSW50cm9kdWNlZCBvcHRpb25zIAotICoJcGFyYW1ldGVyLiBBZGRlZCBzbGlnaHRseSBtb2RpZmllZCBwYXRjaCBmcm9tIAotICoJRGF2aWQgTW9ld3MgdG8gZGlzYWJsZSBkc3AgYXVkaW8gc291cmNlcyBieSBzZXR0aW5nIAotICoJYml0IDAgb2Ygb3B0aW9ucyBwYXJhbWV0ZXIuIFRoaXMgc2VlbXMgdG8gYmUKLSAqCXJlcXVpcmVkIGJ5IHNvbWUgQXp0ZWNoL05ld2NvbSBTQy0xNiBjYXJkcy4JCTE5OTkvMDQvMTgKLSAqCi0gKglDaHJpc3RvcGggSGVsbHdpZzogQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdC4JMjAwMC8wMy8wMwotICoKLSAqCUNocmlzdG9waCBIZWxsd2lnOiBBZGRlZCBpc2FwbnAgc3VwcG9ydAkJCTIwMDAvMDMvMTUKLSAqCi0gKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG86IGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCTIwMDEvMTAvMDcKLSAqICAgICAgCi0gKiAgICAgIFRob3JzdGVuIEtuYWJlOiBDb21waWxpbmcgd2l0aCBDT05GSUdfUE5QIGVuYWJsZWQKLSAqCXdvcmtzIGFnYWluLiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG1vcmUgdGhhbiBvbmUgCi0gKglBRDE4MTYgc291bmQgY2FyZC4gU2FtcGxlIHJhdGUgbm93IG1heSBiZSBjaGFuZ2VkIGR1cmluZwotICoJcGxheWJhY2svY2FwdHVyZS4gcHJpbnRrKCkgdXNlcyBsb2cgbGV2ZWxzIGV2ZXJ5d2hlcmUuCi0gKglTTVAgZml4ZXMuIERNQSBoYW5kbGluZyBmaXhlcy4KLSAqCU90aGVyIG1pbm9yIGNvZGUgY2xlYW51cC4JCQkJMjAwMy8wNy8xNQotICoKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotI2RlZmluZSBERUJVR05PSVNFKHgpCi0KLSNkZWZpbmUgQ0hFQ0tfRk9SX1BPV0VSIHsgaW50IHRpbWVvdXQ9MTAwOyBcCi0gIHdoaWxlICh0aW1lb3V0ID4gMCAmJiAoaW5iKGRldmMtPmJhc2UpJjB4ODApIT0gMHg4MCkge1wKLSAgICAgICAgICB0aW1lb3V0LS07IFwKLSAgfSBcCi0gIGlmICh0aW1lb3V0PT0wKSB7XAotICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogQ2hlY2sgZm9yIHBvd2VyIGZhaWxlZCBpbiAlcyBsaW5lOiAlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7IFwKLSAgfSBcCi19Ci0KLS8qIHN0cnVjdHVyZSB0byBob2xkIGRldmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgICAgaW50ICAgICAgICAgICAgYmFzZTsgICAgICAgICAgLyogc2V0IGluIGF0dGFjaCAqLwotCWludCAgICAgICAgICAgIGlycTsKLQlpbnQgICAgICAgICAgICBkbWFfcGxheWJhY2s7Ci0gICAgICAgIGludCAgICAgICAgICAgIGRtYV9jYXB0dXJlOwotICAKLQlpbnQgICAgICAgICAgICBvcGVuZWQ7ICAgICAgICAgLyogb3BlbiAqLwotICAgICAgICBpbnQgICAgICAgICAgICBzcGVlZDsJCi0JaW50ICAgICAgICAgICAgY2hhbm5lbHM7Ci0JaW50ICAgICAgICAgICAgYXVkaW9fZm9ybWF0OwotICAgICAgICBpbnQgICAgICAgICAgICBhdWRpb19tb2RlOyAKLSAgCi0gICAgICAgIGludCAgICAgICAgICAgIHJlY21hc2s7ICAgICAgICAvKiBzZXR1cCAqLwotCXVuc2lnbmVkIGNoYXIgIGZvcm1hdF9iaXRzOwotCWludCAgICAgICAgICAgIHN1cHBvcnRlZF9kZXZpY2VzOwotCWludCAgICAgICAgICAgIHN1cHBvcnRlZF9yZWNfZGV2aWNlczsKLQl1bnNpZ25lZCBzaG9ydCBsZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKLQkJCQkJLyogbWlzYyAqLwotCXN0cnVjdCBwbnBfZGV2ICpwbnBkZXY7CSAvKiBjb25maWd1cmVkIHZpYSBwbnAgKi8KLSAgICAgICAgaW50ICAgICAgICAgICAgZGV2X25vOyAgIC8qIHRoaXMgaXMgdGhlICMgaW4gYXVkaW9fZGV2cyBhbmQgTk9UIAotCQkJCSAgICBpbiBhZDE4MTZfaW5mbyAqLwotCXNwaW5sb2NrX3QJbG9jazsgIAotfSBhZDE4MTZfaW5mbzsKLQotc3RhdGljIGludCBucl9hZDE4MTZfZGV2czsKLXN0YXRpYyBpbnQgYWQxODE2X2Nsb2NrZnJlcSA9IDMzMDAwOwotc3RhdGljIGludCBvcHRpb25zOwotCi0vKiBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cyAqLwotc3RhdGljIGludCAgYWRfZm9ybWF0X21hc2sgPQotQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVc7Ci0KLS8qIGFycmF5IG9mIGRldmljZSBpbmZvIHN0cnVjdHVyZXMgKi8KLXN0YXRpYyBhZDE4MTZfaW5mbyBkZXZfaW5mb1tNQVhfQVVESU9fREVWXTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGZ1bmN0aW9ucyBmb3IgZWFzaWVyIGFjY2VzcyB0byBpbmRlcmVjdCByZWdpc3RlcnMgKi8KLQotc3RhdGljIGludCBhZF9yZWFkIChhZDE4MTZfaW5mbyAqIGRldmMsIGludCByZWcpCi17Ci0JaW50IHJlc3VsdDsKLQkKLQlDSEVDS19GT1JfUE9XRVI7Ci0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChyZWcgJiAweDNmKSwgZGV2Yy0+YmFzZSswKTsKLQlyZXN1bHQgPSBpbmIoZGV2Yy0+YmFzZSsyKTsKLQlyZXN1bHQrPSBpbmIoZGV2Yy0+YmFzZSszKTw8ODsKLQlyZXR1cm4gKHJlc3VsdCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWRfd3JpdGUgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IHJlZywgaW50IGRhdGEpCi17Ci0JQ0hFQ0tfRk9SX1BPV0VSOwotCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHhmZiksIGRldmMtPmJhc2UrMCk7Ci0Jb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZiksZGV2Yy0+YmFzZSsyKTsKLQlvdXRiICgodW5zaWduZWQgY2hhcikgKChkYXRhPj44KSYweGZmKSxkZXZjLT5iYXNlKzMpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGZ1bmN0aW9uIGludGVyZmFjZSByZXF1aXJlZCBieSBzdHJ1Y3QgYXVkaW9fZHJpdmVyICovCi0KLXN0YXRpYyB2b2lkIGFkMTgxNl9oYWx0X2lucHV0IChpbnQgZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwotCQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogaGFsdF9pbnB1dCBjYWxsZWRcbiIpKTsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7IAotCQotCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgewotCSAgICAgICAgZGlzYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOwotCX0KLQkKLQlidWZmZXI9aW5iKGRldmMtPmJhc2UrOSk7Ci0JaWYgKGJ1ZmZlciAmIDB4MDEpIHsKLQkJLyogZGlzYWJsZSBjYXB0dXJlICovCi0JCW91dGIoYnVmZmVyICYgfjB4MDEsZGV2Yy0+YmFzZSs5KTsgCi0JfQotCi0JaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7Ci0JICAgICAgICBlbmFibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hKTsKLQl9Ci0KLQkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0Jb3V0YiAofjB4NDAsIGRldmMtPmJhc2UrMSk7CQotCQotCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfSU5QVVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl9oYWx0X291dHB1dCAoaW50IGRldikKLXsKLQl1bnNpZ25lZCBsb25nICBmbGFnczsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0JdW5zaWduZWQgY2hhciBidWZmZXI7Ci0KLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGhhbHRfb3V0cHV0IGNhbGxlZCFcbiIpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsgCi0JLyogTXV0ZSBwY20gb3V0cHV0ICovCi0JYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpfDB4ODA4MCk7Ci0KLQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKLQkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSk7Ci0JfQotCi0JYnVmZmVyPWluYihkZXZjLT5iYXNlKzgpOwotCWlmIChidWZmZXIgJiAweDAxKSB7Ci0JCS8qIGRpc2FibGUgY2FwdHVyZSAqLwotCQlvdXRiKGJ1ZmZlciAmIH4weDAxLGRldmMtPmJhc2UrOCk7IAotCX0KLQotCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgewotCSAgICAgICAgZW5hYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEpOwotCX0KLQotCS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KLQlvdXRiICgodW5zaWduZWQgY2hhcil+MHg4MCwgZGV2Yy0+YmFzZSsxKTsJCi0KLQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWQxODE2X291dHB1dF9ibG9jayAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIAotCQkJCSBpbnQgY291bnQsIGludCBpbnRyZmxhZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgY250OwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQkKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG91dHB1dF9ibG9jayBjYWxsZWQgYnVmPSVsZCBjb3VudD0lZCBmbGFncz0lZFxuIixidWYsY291bnQsaW50cmZsYWcpKTsKLSAgCi0JY250ID0gY291bnQvNCAtIDE7Ci0gIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQkKLQkvKiBzZXQgdHJhbnNmZXIgY291bnQgKi8KLQlhZF93cml0ZSAoZGV2YywgOCwgY250ICYgMHhmZmZmKTsgCi0JCi0JZGV2Yy0+YXVkaW9fbW9kZSB8PSBQQ01fRU5BQkxFX09VVFBVVDsgCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWQxODE2X3N0YXJ0X2lucHV0IChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IGNvdW50LAotCQkJCWludCBpbnRyZmxhZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgIGNudDsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBzdGFydF9pbnB1dCBjYWxsZWQgYnVmPSVsZCBjb3VudD0lZCBmbGFncz0lZFxuIixidWYsY291bnQsaW50cmZsYWcpKTsKLQotCWNudCA9IGNvdW50LzQgLSAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCi0JLyogc2V0IHRyYW5zZmVyIGNvdW50ICovCi0JYWRfd3JpdGUgKGRldmMsIDEwLCBjbnQgJiAweGZmZmYpOyAKLQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgYWQxODE2X3ByZXBhcmVfZm9yX2lucHV0IChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgZnJlcTsKLQlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7Ci0JdW5zaWduZWQgY2hhciBmbXRfYml0czsKLQkKLQlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IHByZXBhcmVfZm9yX2lucHV0IGNhbGxlZDogYnNpemU9JWQgYmNvdW50PSVkXG4iLGJzaXplLGJjb3VudCkpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCWZtdF9iaXRzPSAoZGV2Yy0+Zm9ybWF0X2JpdHMmMHg3KTw8MzsKLQkKLQkvKiBzZXQgbW9uby9zdGVyZW8gbW9kZSAqLwotCWlmIChkZXZjLT5jaGFubmVscyA+IDEpIHsKLQkJZm10X2JpdHMgfD0weDQ7Ci0JfQotCS8qIHNldCBNb25vL1N0ZXJlbyBpbiBwbGF5YmFjay9jYXB0dXJlIHJlZ2lzdGVyICovCi0Jb3V0YiggKGluYihkZXZjLT5iYXNlKzgpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzgpOyAKLQlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOSkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOSk7Ci0KLQlmcmVxPSgodW5zaWduZWQgaW50KWRldmMtPnNwZWVkKjMzMDAwKS9hZDE4MTZfY2xvY2tmcmVxOyAKLQotCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCi0JYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOwkKLQlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7CQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0KLQlhZDE4MTZfaGFsdF9pbnB1dChkZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkMTgxNl9wcmVwYXJlX2Zvcl9vdXRwdXQgKGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBmcmVxOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQl1bnNpZ25lZCBjaGFyIGZtdF9iaXRzOwotCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBwcmVwYXJlX2Zvcl9vdXRwdXQgY2FsbGVkOiBic2l6ZT0lZCBiY291bnQ9JWRcbiIsYnNpemUsYmNvdW50KSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0KLQlmbXRfYml0cz0gKGRldmMtPmZvcm1hdF9iaXRzJjB4Nyk8PDM7Ci0JLyogc2V0IG1vbm8vc3RlcmVvIG1vZGUgKi8KLQlpZiAoZGV2Yy0+Y2hhbm5lbHMgPiAxKSB7Ci0JCWZtdF9iaXRzIHw9MHg0OwotCX0KLQotCS8qIHdyaXRlIGZvcm1hdCBiaXRzIHRvIHBsYXliYWNrL2NhcHR1cmUgcmVnaXN0ZXJzICovCi0Jb3V0YiggKGluYihkZXZjLT5iYXNlKzgpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzgpOyAKLQlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOSkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOSk7Ci0gIAotCWZyZXE9KCh1bnNpZ25lZCBpbnQpZGV2Yy0+c3BlZWQqMzMwMDApL2FkMTgxNl9jbG9ja2ZyZXE7IAotCQotCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCi0JYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOwotCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCQotCWFkMTgxNl9oYWx0X291dHB1dChkZXYpOwotCXJldHVybiAwOwotCi19Ci0KLXN0YXRpYyB2b2lkIGFkMTgxNl90cmlnZ2VyIChpbnQgZGV2LCBpbnQgc3RhdGUpIAotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiB0cmlnZ2VyIGNhbGxlZCEgKGRldmM9JWQsZGV2Yy0+YmFzZT0lZFxuIiwgZGV2YywgZGV2Yy0+YmFzZSkpOwotCi0JLyogbW9kZSBtYXkgaGF2ZSBjaGFuZ2VkICovCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0KLQkvKiBtYXNrIG91dCBtb2RlcyBub3Qgc3BlY2lmaWVkIG9uIG9wZW4gY2FsbCAqLwotCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7IAotCQkJCQotCS8qIHNldHVwIHNvdW5kY2hpcCB0byBuZXcgaW8tbW9kZSAqLwotCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKLQkJLyogZW5hYmxlIGNhcHR1cmUgKi8KLQkJb3V0YihpbmIoZGV2Yy0+YmFzZSs5KXwweDAxLCBkZXZjLT5iYXNlKzkpOwotCX0gZWxzZSB7Ci0JCS8qIGRpc2FibGUgY2FwdHVyZSAqLwotCQlvdXRiKGluYihkZXZjLT5iYXNlKzkpJn4weDAxLCBkZXZjLT5iYXNlKzkpOwotCX0KLQotCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7Ci0JCS8qIGVuYWJsZSBwbGF5YmFjayAqLwotCQlvdXRiKGluYihkZXZjLT5iYXNlKzgpfDB4MDEsIGRldmMtPmJhc2UrOCk7Ci0JCS8qIHVubXV0ZSBwY20gb3V0cHV0ICovCi0JCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KSZ+MHg4MDgwKTsKLQl9IGVsc2UgewotCQkvKiBtdXRlIHBjbSBvdXRwdXQgKi8KLQkJYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpfDB4ODA4MCk7Ci0JCS8qIGRpc2FibGUgY2FwdHVyZSAqLwotCQlvdXRiKGluYihkZXZjLT5iYXNlKzgpJn4weDAxLCBkZXZjLT5iYXNlKzgpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLX0KLQotCi0vKiBoYWx0IGlucHV0ICYgb3V0cHV0ICovCi1zdGF0aWMgdm9pZCBhZDE4MTZfaGFsdCAoaW50IGRldikKLXsKLQlhZDE4MTZfaGFsdF9pbnB1dChkZXYpOwotCWFkMTgxNl9oYWx0X291dHB1dChkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4MTZfcmVzZXQgKGludCBkZXYpCi17Ci0JYWQxODE2X2hhbHQgKGRldik7Ci19Ci0KLS8qIHNldCBwbGF5YmFjayBzcGVlZCAqLwotc3RhdGljIGludCBhZDE4MTZfc2V0X3NwZWVkIChpbnQgZGV2LCBpbnQgYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGZyZXE7Ci0JaW50IHJldDsKLQotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCWlmIChhcmcgPT0gMCkgewotCQlyZXQgPSBkZXZjLT5zcGVlZDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkvKiByYW5nZSBjaGVja2luZyAqLwotCWlmIChhcmcgPCA0MDAwKSB7Ci0JCWFyZyA9IDQwMDA7Ci0JfQotCWlmIChhcmcgPiA1NTAwMCkgewotCQlhcmcgPSA1NTAwMDsKLQl9Ci0JZGV2Yy0+c3BlZWQgPSBhcmc7Ci0KLQkvKiBjaGFuZ2Ugc3BlZWQgZHVyaW5nIHBsYXliYWNrICovCi0JZnJlcT0oKHVuc2lnbmVkIGludClkZXZjLT5zcGVlZCozMzAwMCkvYWQxODE2X2Nsb2NrZnJlcTsgCi0JLyogd3JpdGUgcGxheWJhY2svY2FwdHVyZSBzcGVlZHMgKi8KLQlhZF93cml0ZSAoZGV2YywgMiwgZnJlcSAmIDB4ZmZmZik7CQotCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsJCi0KLQlyZXQgPSBkZXZjLT5zcGVlZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGFkMTgxNl9zZXRfYml0cyAoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQkKLQlzdGF0aWMgc3RydWN0IGZvcm1hdF90YmwgewotCQlpbnQgICAgICAgICAgICAgZm9ybWF0OwotCQl1bnNpZ25lZCBjaGFyICAgYml0czsKLQl9IGZvcm1hdDJiaXRzW10gPSB7Ci0JCXsgMCwgMCB9LAotCQl7IEFGTVRfTVVfTEFXLCAxIH0sCi0JCXsgQUZNVF9BX0xBVywgMyB9LAotCQl7IEFGTVRfSU1BX0FEUENNLCAwIH0sCi0JCXsgQUZNVF9VOCwgMCB9LAotCQl7IEFGTVRfUzE2X0xFLCAyIH0sCi0JCXsgQUZNVF9TMTZfQkUsIDYgfSwKLQkJeyBBRk1UX1M4LCAwIH0sCi0JCXsgQUZNVF9VMTZfTEUsIDAgfSwKLQkJeyBBRk1UX1UxNl9CRSwgMCB9Ci0gIAl9OwotCi0JaW50ICBpLCBuID0gc2l6ZW9mIChmb3JtYXQyYml0cykgLyBzaXplb2YgKHN0cnVjdCBmb3JtYXRfdGJsKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JLyogcmV0dXJuIGN1cnJlbnQgZm9ybWF0ICovCi0JaWYgKGFyZyA9PSAwKSB7Ci0JICAJYXJnID0gZGV2Yy0+YXVkaW9fZm9ybWF0OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBhcmc7Ci0JfQotCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IGFyZzsKLQotCS8qIHNlYXJjaCBtYXRjaGluZyBmb3JtYXQgYml0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0JCWlmIChmb3JtYXQyYml0c1tpXS5mb3JtYXQgPT0gYXJnKSB7Ci0JCQlkZXZjLT5mb3JtYXRfYml0cyA9IGZvcm1hdDJiaXRzW2ldLmJpdHM7Ci0JCQlkZXZjLT5hdWRpb19mb3JtYXQgPSBhcmc7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gYXJnOwotCQl9Ci0KLQkvKiBTdGlsbCBoYW5naW5nIGhlcmUuIFNvbWV0aGluZyBtdXN0IGJlIHRlcnJpYmx5IHdyb25nICovCi0JZGV2Yy0+Zm9ybWF0X2JpdHMgPSAwOwotCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IEFGTVRfVTg7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCXJldHVybihBRk1UX1U4KTsgCi19Ci0KLXN0YXRpYyBzaG9ydCBhZDE4MTZfc2V0X2NoYW5uZWxzIChpbnQgZGV2LCBzaG9ydCBhcmcpCi17Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOwotCi0JaWYgKGFyZyAhPSAxICYmIGFyZyAhPSAyKQotCQlyZXR1cm4gZGV2Yy0+Y2hhbm5lbHM7Ci0KLQlkZXZjLT5jaGFubmVscyA9IGFyZzsKLQlyZXR1cm4gYXJnOwotfQotCi0vKiBvcGVuIGRldmljZSAqLwotc3RhdGljIGludCBhZDE4MTZfb3BlbiAoaW50IGRldiwgaW50IG1vZGUpIAotewotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLQkvKiBpcyBkZXZpY2UgbnVtYmVyIHZhbGlkID8gKi8KLQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKLQkJcmV0dXJuIC0oRU5YSU8pOwotCi0JLyogZ2V0IGRldmljZSBpbmZvIG9mIHRoaXMgZGV2ICovCi0JZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7IAotCi0JLyogbWFrZSBjaGVjayBpZiBkZXZpY2UgYWxyZWFkeSBvcGVuIGF0b21pYyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQotCWlmIChkZXZjLT5vcGVuZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Ci0JCXJldHVybiAtKEVCVVNZKTsKLQl9Ci0KLQkvKiBtYXJrIGRldmljZSBhcyBvcGVuICovCi0JZGV2Yy0+b3BlbmVkID0gMTsgCi0KLQlkZXZjLT5hdWRpb19tb2RlID0gMDsKLQlkZXZjLT5zcGVlZCA9IDgwMDA7Ci0JZGV2Yy0+YXVkaW9fZm9ybWF0PUFGTVRfVTg7Ci0JZGV2Yy0+Y2hhbm5lbHM9MTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLQlhZDE4MTZfcmVzZXQoZGV2Yy0+ZGV2X25vKTsgLyogaGFsdCBhbGwgcGVuZGluZyBvdXRwdXQgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWQxODE2X2Nsb3NlIChpbnQgZGV2KSAvKiBjbG9zZSBkZXZpY2UgKi8KLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKLQotCS8qIGhhbHQgYWxsIHBlbmRpbmcgb3V0cHV0ICovCi0JYWQxODE2X3Jlc2V0KGRldmMtPmRldl9ubyk7IAotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCWRldmMtPm9wZW5lZCA9IDA7Ci0JZGV2Yy0+YXVkaW9fbW9kZSA9IDA7Ci0JZGV2Yy0+c3BlZWQgPSA4MDAwOwotCWRldmMtPmF1ZGlvX2Zvcm1hdD1BRk1UX1U4OwotCWRldmMtPmZvcm1hdF9iaXRzID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIEF1ZGlvIGRyaXZlciBzdHJ1Y3R1cmUgKi8KLQotc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgYWQxODE2X2F1ZGlvX2RyaXZlciA9Ci17Ci0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJCT0gYWQxODE2X29wZW4sCi0JLmNsb3NlCQkJPSBhZDE4MTZfY2xvc2UsCi0JLm91dHB1dF9ibG9jawkJPSBhZDE4MTZfb3V0cHV0X2Jsb2NrLAotCS5zdGFydF9pbnB1dAkJPSBhZDE4MTZfc3RhcnRfaW5wdXQsCi0JLnByZXBhcmVfZm9yX2lucHV0CT0gYWQxODE2X3ByZXBhcmVfZm9yX2lucHV0LAotCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBhZDE4MTZfcHJlcGFyZV9mb3Jfb3V0cHV0LAotCS5oYWx0X2lvCQk9IGFkMTgxNl9oYWx0LAotCS5oYWx0X2lucHV0CQk9IGFkMTgxNl9oYWx0X2lucHV0LAotCS5oYWx0X291dHB1dAkJPSBhZDE4MTZfaGFsdF9vdXRwdXQsCi0JLnRyaWdnZXIJCT0gYWQxODE2X3RyaWdnZXIsCi0JLnNldF9zcGVlZAkJPSBhZDE4MTZfc2V0X3NwZWVkLAotCS5zZXRfYml0cwkJPSBhZDE4MTZfc2V0X2JpdHMsCi0JLnNldF9jaGFubmVscwkJPSBhZDE4MTZfc2V0X2NoYW5uZWxzLAotfTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIEludGVycnVwdCBoYW5kbGVyICovCi0KLQotc3RhdGljIGlycXJldHVybl90IGFkMTgxNl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyCXN0YXR1czsKLQlhZDE4MTZfaW5mbwkqZGV2YyA9IChhZDE4MTZfaW5mbyAqKWRldl9pZDsKLQkKLQlpZiAoaXJxIDwgMCB8fCBpcnEgPiAxNSkgewotCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBHb3QgYm9ndXMgaW50ZXJydXB0ICVkXG4iLCBpcnEpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZkZXZjLT5sb2NrKTsKLQotCS8qIHJlYWQgaW50ZXJydXB0IHJlZ2lzdGVyICovCi0Jc3RhdHVzID0gaW5iIChkZXZjLT5iYXNlKzEpOyAKLQkvKiBDbGVhciBhbGwgaW50ZXJydXB0ICAqLwotCW91dGIgKH5zdGF0dXMsIGRldmMtPmJhc2UrMSk7CQotCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBHb3QgaW50ZXJydXB0IHN1YmNsYXNzICVkXG4iLHN0YXR1cykpOwotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogaW50ZXJydXB0OiBHb3QgaW50ZXJydXB0LCBidXQgbm8gc291cmNlLlxuIikpOwotCQlzcGluX3VubG9jaygmZGV2Yy0+bG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlpZiAoZGV2Yy0+b3BlbmVkICYmIChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9JTlBVVCkgJiYgKHN0YXR1cyY2NCkpCi0JCURNQWJ1Zl9pbnB1dGludHIgKGRldmMtPmRldl9ubyk7Ci0KLQlpZiAoZGV2Yy0+b3BlbmVkICYmIChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9PVVRQVVQpICYmIChzdGF0dXMgJiAxMjgpKQotCQlETUFidWZfb3V0cHV0aW50ciAoZGV2Yy0+ZGV2X25vLCAxKTsKLQotCXNwaW5fdW5sb2NrKCZkZXZjLT5sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogTWl4ZXIgc3R1ZmYgKi8KLQotc3RydWN0IG1peGVyX2RlZiB7Ci0JdW5zaWduZWQgaW50IHJlZ25vOiA3OwotCXVuc2lnbmVkIGludCBwb2xhcml0eToxOwkvKiAwPW5vcm1hbCwgMT1yZXZlcnNlZCAqLwotCXVuc2lnbmVkIGludCBiaXRwb3M6NDsKLQl1bnNpZ25lZCBpbnQgbmJpdHM6NDsKLX07Ci0KLXN0YXRpYyBjaGFyIG1peF9jdnRbMTAxXSA9IHsKLQkgMCwgMCwgMywgNywxMCwxMywxNiwxOSwyMSwyMywyNiwyOCwzMCwzMiwzNCwzNSwzNywzOSw0MCw0MiwKLQk0Myw0NSw0Niw0Nyw0OSw1MCw1MSw1Miw1Myw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSwKLQk2NSw2Niw2Nyw2OCw2OSw3MCw3MCw3MSw3Miw3Myw3Myw3NCw3NSw3NSw3Niw3Nyw3Nyw3OCw3OSw3OSwKLQk4MCw4MSw4MSw4Miw4Miw4Myw4NCw4NCw4NSw4NSw4Niw4Niw4Nyw4Nyw4OCw4OCw4OSw4OSw5MCw5MCwKLQk5MSw5MSw5Miw5Miw5Myw5Myw5NCw5NCw5NSw5NSw5Niw5Niw5Niw5Nyw5Nyw5OCw5OCw5OCw5OSw5OSwKLQkxMDAKLX07Ci0KLXR5cGVkZWYgc3RydWN0IG1peGVyX2RlZiBtaXhlcl9lbnQ7Ci0KLS8qCi0gKiBNb3N0IG9mIHRoZSBtaXhlciBlbnRyaWVzIHdvcmsgaW4gYmFja3dhcmRzLiBTZXR0aW5nIHRoZSBwb2xhcml0eSBmaWVsZAotICogbWFrZXMgdGhlbSB0byB3b3JrIGNvcnJlY3RseS4KLSAqCi0gKiBUaGUgY2hhbm5lbCBudW1iZXJpbmcgdXNlZCBieSBpbmRpdmlkdWFsIHNvdW5kY2FyZHMgaXMgbm90IGZpeGVkLiBTb21lCi0gKiBjYXJkcyBoYXZlIGFzc2lnbmVkIGRpZmZlcmVudCBtZWFuaW5ncyBmb3IgdGhlIEFVWDEsIEFVWDIgYW5kIExJTkUgaW5wdXRzLgotICogVGhlIGN1cnJlbnQgdmVyc2lvbiBkb2Vzbid0IHRyeSB0byBjb21wZW5zYXRlIHRoaXMuCi0gKi8KLQotI2RlZmluZSBNSVhfRU5UKG5hbWUsIHJlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbCwgcmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yKQlcCi0gIHt7cmVnX2wsIHBvbGFfbCwgcG9zX2wsIGxlbl9sfSwge3JlZ19yLCBwb2xhX3IsIHBvc19yLCBsZW5fcn19Ci0KLQotc3RhdGljIG1peGVyX2VudCBtaXhfZGV2aWNlc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdWzJdID0gewotTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCTE0LCAxLCA4LCA1LAkxNCwgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCSA1LCAxLCA4LCA2LAkgNSwgMSwgMCwgNiksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDQsIDEsIDgsIDYsCSA0LCAxLCAwLCA2KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJMTgsIDEsIDgsIDUsCTE4LCAxLCAwLCA1KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkxOSwgMSwgOCwgNSwJMTksIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJIAkxNSwgMSwgOCwgNSwJMTUsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX1JFQ0xFViwJMjAsIDAsIDgsIDQsCTIwLCAwLCAwLCA0KSwKLU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCi1NSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAotTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMSwgCTE3LCAxLCA4LCA1LAkxNywgMSwgMCwgNSksCi1NSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkxNiwgMSwgOCwgNSwJMTYsIDEsIDAsIDUpLAotTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMywgICAgICAzOSwgMCwgOSwgNCwgICAgMzksIDEsIDAsIDUpCi19OwotCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBkZWZhdWx0X21peGVyX2xldmVsc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdID0KLXsKLQkweDQzNDMsCQkvKiBNYXN0ZXIgVm9sdW1lICovCi0JMHgzMjMyLAkJLyogQmFzcyAqLwotCTB4MzIzMiwJCS8qIFRyZWJsZSAqLwotCTB4MDAwMCwJCS8qIEZNICovCi0JMHg0MzQzLAkJLyogUENNICovCi0JMHgwMDAwLAkJLyogUEMgU3BlYWtlciAqLwotCTB4MDAwMCwJCS8qIEV4dCBMaW5lICovCi0JMHgwMDAwLAkJLyogTWljICovCi0JMHgwMDAwLAkJLyogQ0QgKi8KLQkweDAwMDAsCQkvKiBSZWNvcmRpbmcgbW9uaXRvciAqLwotCTB4MDAwMCwJCS8qIFNCIFBDTSAqLwotCTB4MDAwMCwJCS8qIFJlY29yZGluZyBsZXZlbCAqLwotCTB4MDAwMCwJCS8qIElucHV0IGdhaW4gKi8KLQkweDAwMDAsCQkvKiBPdXRwdXQgZ2FpbiAqLwotCTB4MDAwMCwJCS8qIExpbmUxICovCi0JMHgwMDAwLAkJLyogTGluZTIgKi8KLQkweDAwMDAJCS8qIExpbmUzICh1c3VhbGx5IGxpbmUgaW4pKi8KLX07Ci0KLSNkZWZpbmUgTEVGVF9DSE4JMAotI2RlZmluZSBSSUdIVF9DSE4JMQotCi0KLQotc3RhdGljIGludAotYWQxODE2X3NldF9yZWNtYXNrIChhZDE4MTZfaW5mbyAqIGRldmMsIGludCBtYXNrKQotewotICAJdW5zaWduZWQgbG9uZyAJZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciAgIHJlY2RldjsKLQlpbnQgICAgICAgICAgICAgaSwgbjsKLQkKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotCW1hc2sgJj0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOwotCQotCW4gPSAwOwotCS8qIENvdW50IHNlbGVjdGVkIGRldmljZSBiaXRzICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCWlmIChtYXNrICYgKDEgPDwgaSkpCi0JCQluKys7Ci0JCi0JaWYgKG4gPT0gMCkKLQkJbWFzayA9IFNPVU5EX01BU0tfTUlDOwotCWVsc2UgaWYgKG4gIT0gMSkgeyAvKiBUb28gbWFueSBkZXZpY2VzIHNlbGVjdGVkICovCi0JCS8qIEZpbHRlciBvdXQgYWN0aXZlIHNldHRpbmdzICovCi0JCW1hc2sgJj0gfmRldmMtPnJlY21hc2s7CQotCQkKLQkJbiA9IDA7Ci0JCS8qIENvdW50IHNlbGVjdGVkIGRldmljZSBiaXRzICovCi0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSAKLQkJCWlmIChtYXNrICYgKDEgPDwgaSkpCi0JCQkJbisrOwotCQkKLQkJaWYgKG4gIT0gMSkKLQkJCW1hc2sgPSBTT1VORF9NQVNLX01JQzsKLQl9Ci0JCi0Jc3dpdGNoIChtYXNrKSB7Ci0JY2FzZSBTT1VORF9NQVNLX01JQzoKLQkJcmVjZGV2ID0gNTsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgU09VTkRfTUFTS19MSU5FOgotCQlyZWNkZXYgPSAwOwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NQVNLX0NEOgotCQlyZWNkZXYgPSAyOwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NQVNLX0xJTkUxOgotCQlyZWNkZXYgPSA0OwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NQVNLX0xJTkUyOgotCQlyZWNkZXYgPSAzOwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NQVNLX1ZPTFVNRToKLQkJcmVjZGV2ID0gMTsKLQkJYnJlYWs7Ci0JCQotCWRlZmF1bHQ6Ci0JCW1hc2sgPSBTT1VORF9NQVNLX01JQzsKLQkJcmVjZGV2ID0gNTsKLQl9Ci0JCi0JcmVjZGV2IDw8PSA0OwotCWFkX3dyaXRlIChkZXZjLCAyMCwgCi0JCSAgKGFkX3JlYWQgKGRldmMsIDIwKSAmIDB4OGY4ZikgfCByZWNkZXYgfCAocmVjZGV2PDw4KSk7Ci0KLQlkZXZjLT5yZWNtYXNrID0gbWFzazsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGFuZ2VfYml0cyAoaW50ICpyZWd2YWwsIGludCBkZXYsIGludCBjaG4sIGludCBuZXd2YWwpCi17Ci0JdW5zaWduZWQgY2hhciAgIG1hc2s7Ci0JaW50ICAgICAgICAgICAgIHNoaWZ0OwotICAKLQkvKiBSZXZlcnNlIHBvbGFyaXR5Ki8KLQotCWlmIChtaXhfZGV2aWNlc1tkZXZdW2Nobl0ucG9sYXJpdHkgPT0gMSkgCi0JCW5ld3ZhbCA9IDEwMCAtIG5ld3ZhbDsKLQotCW1hc2sgPSAoMSA8PCBtaXhfZGV2aWNlc1tkZXZdW2Nobl0ubmJpdHMpIC0gMTsKLQlzaGlmdCA9IG1peF9kZXZpY2VzW2Rldl1bY2huXS5iaXRwb3M7Ci0JLyogU2NhbGUgaXQgKi8KLQluZXd2YWwgPSAoaW50KSAoKG5ld3ZhbCAqIG1hc2spICsgNTApIC8gMTAwOwkKLQkvKiBDbGVhciBiaXRzICovCi0JKnJlZ3ZhbCAmPSB+KG1hc2sgPDwgc2hpZnQpOwkKLQkvKiBTZXQgbmV3IHZhbHVlICovCi0JKnJlZ3ZhbCB8PSAobmV3dmFsICYgbWFzaykgPDwgc2hpZnQ7CQotfQotCi1zdGF0aWMgaW50Ci1hZDE4MTZfbWl4ZXJfZ2V0IChhZDE4MTZfaW5mbyAqIGRldmMsIGludCBkZXYpCi17Ci0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBtaXhlcl9nZXQgY2FsbGVkIVxuIikpOwotCQotCS8qIHJhbmdlIGNoZWNrICsgc3VwcG9ydGVkIG1peGVyIGNoZWNrICovCi0JaWYgKGRldiA8IDAgfHwgZGV2ID49IFNPVU5EX01JWEVSX05SREVWSUNFUyApCi0JICAgICAgICByZXR1cm4gKC0oRUlOVkFMKSk7Ci0JaWYgKCEoKDEgPDwgZGV2KSAmIGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzKSkKLQkJcmV0dXJuIC0oRUlOVkFMKTsKLQkKLQlyZXR1cm4gZGV2Yy0+bGV2ZWxzW2Rldl07Ci19Ci0KLXN0YXRpYyBpbnQKLWFkMTgxNl9taXhlcl9zZXQgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IGRldiwgaW50IHZhbHVlKQotewotCWludCAgIGxlZnQgPSB2YWx1ZSAmIDB4MDAwMDAwZmY7Ci0JaW50ICAgcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OwotCWludCAgIHJldHZvbDsKLQotCWludCAgIHJlZ29mZnM7Ci0JaW50ICAgdmFsOwotCWludCAgIHZhbG11dGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfc2V0IGNhbGxlZCFcbiIpKTsKLQkKLQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTICkKLQkJcmV0dXJuIC0oRUlOVkFMKTsKLQotCWlmIChsZWZ0ID4gMTAwKQotCQlsZWZ0ID0gMTAwOwotCWlmIChsZWZ0IDwgMCkKLQkJbGVmdCA9IDA7Ci0JaWYgKHJpZ2h0ID4gMTAwKQotCQlyaWdodCA9IDEwMDsKLQlpZiAocmlnaHQgPCAwKQotCQlyaWdodCA9IDA7Ci0JCi0JLyogTW9ubyBjb250cm9sICovCi0JaWYgKG1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5uYml0cyA9PSAwKSAKLQkJcmlnaHQgPSBsZWZ0OwotCXJldHZvbCA9IGxlZnQgfCAocmlnaHQgPDwgOCk7Ci0JCi0JLyogU2NhbGUgaXQgKi8KLQkKLQlsZWZ0ID0gbWl4X2N2dFtsZWZ0XTsKLQlyaWdodCA9IG1peF9jdnRbcmlnaHRdOwotCi0JLyogcmVqZWN0IGFsbCBtaXhlcnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAqLwotCWlmICghKGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzICYgKDEgPDwgZGV2KSkpCi0JCXJldHVybiAtKEVJTlZBTCk7Ci0JCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYgKG1peF9kZXZpY2VzW2Rldl1bTEVGVF9DSE5dLm5iaXRzID09IDApCi0JCXJldHVybiAtKEVJTlZBTCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGtlZXAgcHJlY2lzZSB2b2x1bWUgaW50ZXJuYWwgKi8KLQlkZXZjLT5sZXZlbHNbZGV2XSA9IHJldHZvbDsKLQotCS8qIFNldCB0aGUgbGVmdCBjaGFubmVsICovCi0JcmVnb2ZmcyA9IG1peF9kZXZpY2VzW2Rldl1bTEVGVF9DSE5dLnJlZ25vOwotCXZhbCA9IGFkX3JlYWQgKGRldmMsIHJlZ29mZnMpOwotCWNoYW5nZV9iaXRzICgmdmFsLCBkZXYsIExFRlRfQ0hOLCBsZWZ0KTsKLQotCXZhbG11dGU9dmFsOwotCi0JLyogTXV0ZSBiaXQgbWFza2luZyBvbiBzb21lIHJlZ2lzdGVycyAqLwotCWlmICggcmVnb2Zmcz09NSB8fCByZWdvZmZzPT0xNCB8fCByZWdvZmZzPT0xNSB8fAotCSAgICAgcmVnb2Zmcz09MTYgfHwgcmVnb2Zmcz09MTcgfHwgcmVnb2Zmcz09MTggfHwgCi0JICAgICByZWdvZmZzPT0xOSB8fCByZWdvZmZzPT0zOSkgewotCQlpZiAobGVmdD09MCkKLQkJCXZhbG11dGUgfD0gMHg4MDAwOwotCQllbHNlCi0JCQl2YWxtdXRlICY9IH4weDgwMDA7Ci0JfQotCWFkX3dyaXRlIChkZXZjLCByZWdvZmZzLCB2YWxtdXRlKTsgLyogbXV0ZSAqLwotCi0JLyoKLQkgKiBTZXQgdGhlIHJpZ2h0IGNoYW5uZWwKLQkgKi8KLSAKLQkvKiBXYXMganVzdCBhIG1vbm8gY2hhbm5lbCAqLwotCWlmIChtaXhfZGV2aWNlc1tkZXZdW1JJR0hUX0NITl0ubmJpdHMgPT0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiByZXR2b2w7CQkKLQl9Ci0KLQlyZWdvZmZzID0gbWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLnJlZ25vOwotCXZhbCA9IGFkX3JlYWQgKGRldmMsIHJlZ29mZnMpOwotCWNoYW5nZV9iaXRzICgmdmFsLCBkZXYsIFJJR0hUX0NITiwgcmlnaHQpOwotCi0JdmFsbXV0ZT12YWw7Ci0JaWYgKCByZWdvZmZzPT01IHx8IHJlZ29mZnM9PTE0IHx8IHJlZ29mZnM9PTE1IHx8Ci0JICAgICByZWdvZmZzPT0xNiB8fCByZWdvZmZzPT0xNyB8fCByZWdvZmZzPT0xOCB8fCAKLQkgICAgIHJlZ29mZnM9PTE5IHx8IHJlZ29mZnM9PTM5KSB7Ci0JCWlmIChyaWdodD09MCkKLQkJCXZhbG11dGUgfD0gMHg4MDsKLQkJZWxzZQotCQkJdmFsbXV0ZSAmPSB+MHg4MDsKLQl9Ci0JYWRfd3JpdGUgKGRldmMsIHJlZ29mZnMsIHZhbG11dGUpOyAvKiBtdXRlICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOwotICAgICAgIAlyZXR1cm4gcmV0dm9sOwotfQotCi0jZGVmaW5lIE1JWEVSX0RFVklDRVMgKCBTT1VORF9NQVNLX1ZPTFVNRSB8IFwKLQkJCVNPVU5EX01BU0tfU1lOVEggfCBcCi0JCQlTT1VORF9NQVNLX1BDTSB8IFwKLQkJCVNPVU5EX01BU0tfTElORSB8IFwKLQkJCVNPVU5EX01BU0tfTElORTEgfCBcCi0JCQlTT1VORF9NQVNLX0xJTkUyIHwgXAotCQkJU09VTkRfTUFTS19MSU5FMyB8IFwKLQkJCVNPVU5EX01BU0tfTUlDIHwgXAotCQkJU09VTkRfTUFTS19DRCB8IFwKLQkJCVNPVU5EX01BU0tfUkVDTEVWICBcCi0JCQkpCi0jZGVmaW5lIFJFQ19ERVZJQ0VTICggU09VTkRfTUFTS19MSU5FMiB8XAotCQkgICAgICBTT1VORF9NQVNLX0xJTkUgfFwKLQkJICAgICAgU09VTkRfTUFTS19MSU5FMSB8XAotCQkgICAgICBTT1VORF9NQVNLX01JQyB8XAotCQkgICAgICBTT1VORF9NQVNLX0NEIHxcCi0JCSAgICAgIFNPVU5EX01BU0tfVk9MVU1FIFwKLQkJICAgICAgKQotICAgICAKLXN0YXRpYyB2b2lkCi1hZDE4MTZfbWl4ZXJfcmVzZXQgKGFkMTgxNl9pbmZvICogZGV2YykKLXsKLQlpbnQgIGk7Ci0KLQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IE1JWEVSX0RFVklDRVM7Ci0JCi0JZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gUkVDX0RFVklDRVM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCi0JCWlmIChkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGkpKQotCQkJYWQxODE2X21peGVyX3NldCAoZGV2YywgaSwgZGVmYXVsdF9taXhlcl9sZXZlbHNbaV0pOwotCWFkMTgxNl9zZXRfcmVjbWFzayAoZGV2YywgU09VTkRfTUFTS19NSUMpOwotfQotCi1zdGF0aWMgaW50Ci1hZDE4MTZfbWl4ZXJfaW9jdGwgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQotewotCWFkMTgxNl9pbmZvICAgICpkZXZjID0gbWl4ZXJfZGV2c1tkZXZdLT5kZXZjOwotCWludCB2YWw7Ci0JaW50IF9fdXNlciAqcCA9IGFyZzsKLSAgCi0JREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBtaXhlcl9pb2N0bCBjYWxsZWQhXG4iKSk7Ci0gIAotCS8qIE1peGVyIGlvY3RsICovCi0JaWYgKCgoY21kID4+IDgpICYgMHhmZikgPT0gJ00nKSB7IAotCQkKLQkJLyogc2V0IGlvY3RsICovCi0JCWlmIChfU0lPQ19ESVIgKGNtZCkgJiBfU0lPQ19XUklURSkgeyAKLQkJCXN3aXRjaCAoY21kICYgMHhmZil7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJCQkKLQkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJdmFsPWFkMTgxNl9zZXRfcmVjbWFzayAoZGV2YywgdmFsKTsKLQkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQkJCQlicmVhazsKLQkJCQkKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCWlmICgodmFsPWFkMTgxNl9taXhlcl9zZXQgKGRldmMsIGNtZCAmIDB4ZmYsIHZhbCkpPDApCi0JCQkJICAgICAgICByZXR1cm4gdmFsOwotCQkJCWVsc2UKLQkJCQkgICAgICAgIHJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJfQotCQl9IGVsc2UgeyAKLQkJCS8qIHJlYWQgaW9jdGwgKi8KLQkJCXN3aXRjaCAoY21kICYgMHhmZikgewotCQkJCQotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCQkJdmFsPWRldmMtPnJlY21hc2s7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6Ci0JCQkJdmFsPWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6Ci0JCQkJdmFsPWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzICYgfihTT1VORF9NQVNLX1NQRUFLRVIgfCBTT1VORF9NQVNLX0lNSVgpOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgotCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXM7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCQkJdmFsPVNPVU5EX0NBUF9FWENMX0lOUFVUOwotCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJCWJyZWFrOwotCQkJCQotCQkJZGVmYXVsdDoKLQkJCSAgICAgICAgaWYgKCh2YWw9YWQxODE2X21peGVyX2dldCAoZGV2YywgY21kICYgMHhmZikpPDApCi0JCQkJICAgICAgICByZXR1cm4gdmFsOwotCQkJCWVsc2UKLQkJCQkgICAgICAgIHJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQkJfQotCQl9Ci0JfSBlbHNlCi0JCS8qIG5vdCBmb3IgbWl4ZXIgKi8KLQkJcmV0dXJuIC0oRUlOVkFMKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBNaXhlciBzdHJ1Y3R1cmUgKi8KLQotc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIGFkMTgxNl9taXhlcl9vcGVyYXRpb25zID0gewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5pZAk9ICJBRDE4MTYiLAotCS5uYW1lCT0gIkFEMTgxNiBNaXhlciIsCi0JLmlvY3RsCT0gYWQxODE2X21peGVyX2lvY3RsCi19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogc3R1ZmYgZm9yIGNhcmQgcmVjb2duaXRpb24sIGluaXQgYW5kIHVubG9hZGluZyBQTlAgLi4uKi8KLQotCi0vKiBjaGVjayBpZiBBRDE4MTYgcHJlc2VudCBhdCBzcGVjaWZpZWQgaHdfY29uZmlnIGFuZCByZWdpc3RlciBkZXZpY2Ugd2l0aCBPUyAKLSAqIHJldHVybiAxIGlmIGluaXRpYWxpemF0aW9uIHdhcyBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBhZDE4MTZfaW5pdF9jYXJkIChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIAotCXN0cnVjdCBwbnBfZGV2ICpwbnApCi17Ci0JYWQxODE2X2luZm8gICAgKmRldmMgPSBOVUxMOwotCWludCB0bXA7Ci0JaW50IG9zc19kZXZubyA9IC0xOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBpbml0aWFsaXppbmcgY2FyZDogaW89MHgleCwgaXJxPSVkLCBkbWE9JWQsICIKLQkJCSAiZG1hMj0lZCwgY2xvY2tmcmVxPSVkLCBvcHRpb25zPSVkIGlzYWRtYWJ1Zz0lZCAiCi0JCQkgIiVzXG4iLAotCSAgICAgICBod19jb25maWctPmlvX2Jhc2UsCi0JICAgICAgIGh3X2NvbmZpZy0+aXJxLAotCSAgICAgICBod19jb25maWctPmRtYSwKLQkgICAgICAgaHdfY29uZmlnLT5kbWEyLAotCSAgICAgICBhZDE4MTZfY2xvY2tmcmVxLAotCSAgICAgICBvcHRpb25zLAotCSAgICAgICBpc2FfZG1hX2JyaWRnZV9idWdneSwKLQkgICAgICAgcG5wPyIoUE5QKSI6IiIpOwotCi0JLyogYWQxODE2X2luZm8gc3RydWN0dXJlIHJlbWFpbmluZyA/ICovCi0JaWYgKG5yX2FkMTgxNl9kZXZzID49IE1BWF9BVURJT19ERVYpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBubyBtb3JlIGFkMTgxNl9pbmZvIHN0cnVjdHVyZXMgIgotCQkJImxlZnRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlkZXZjID0gJmRldl9pbmZvW25yX2FkMTgxNl9kZXZzXTsKLQlkZXZjLT5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOwotCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOwotCWRldmMtPmRtYV9wbGF5YmFjaz1od19jb25maWctPmRtYTsKLQlkZXZjLT5kbWFfY2FwdHVyZT1od19jb25maWctPmRtYTI7Ci0JZGV2Yy0+b3BlbmVkID0gMDsKLQlkZXZjLT5wbnBkZXYgPSBwbnA7Ci0Jc3Bpbl9sb2NrX2luaXQoJmRldmMtPmxvY2spOwotCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXZjLT5iYXNlLCAxNiwgIkFEMTgxNiBTb3VuZCIpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogSS9PIHBvcnQgMHglMDN4IG5vdCBmcmVlXG4iLAotCQkJCSAgICBkZXZjLT5iYXNlKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBFeGFtaW5pbmcgQUQxODE2IGF0IGFkZHJlc3MgMHglMDN4LlxuIiwgCi0JCWRldmMtPmJhc2UpOwotCQotCi0JLyogdGVzdHMgZm9yIGFkMTgxNiAqLwotCS8qIGJhc2UrMDogYml0IDEgbXVzdCBiZSBzZXQgYnV0IG5vdCAyNTUgKi8KLQl0bXA9aW5iKGRldmMtPmJhc2UpOwotCWlmICggKHRtcCYweDgwKT09MCB8fCB0bXA9PTI1NSApIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IG9yIGNoaXAgIgotCQkJImlzIG5vdCBhY3RpdmUgKFRlc3QgMClcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiB3cml0ZXMgdG8gaXJlZyA4IGFyZSBjb3BpZWQgdG8gaXJlZyA5ICovCi0JYWRfd3JpdGUoZGV2Yyw4LDEyMzQ1KTsgCi0JaWYgKGFkX3JlYWQoZGV2Yyw5KSE9MTIzNDUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgMSlcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0gIAotCS8qIHdyaXRlcyB0byBpcmVnIDggYXJlIGNvcGllZCB0byBpcmVnIDkgKi8KLQlhZF93cml0ZShkZXZjLDgsNTQzMjEpOyAKLQlpZiAoYWRfcmVhZChkZXZjLDkpIT01NDMyMSkgewotCQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCAyKVxuIik7Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCS8qIHdyaXRlcyB0byBpcmVnIDEwIGFyZSBjb3BpZWQgdG8gaXJlZyAxMSAqLwotCWFkX3dyaXRlKGRldmMsMTAsNTQzMjEpOyAKLQlpZiAoYWRfcmVhZChkZXZjLDExKSE9NTQzMjEpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDMpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotCi0JLyogd3JpdGVzIHRvIGlyZWcgMTAgYXJlIGNvcGllZCB0byBpcmVnIDExICovCi0JYWRfd3JpdGUoZGV2YywxMCwxMjM0NSk7IAotCWlmIChhZF9yZWFkKGRldmMsMTEpIT0xMjM0NSkgewotCQlwcmludGsgKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgNClcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiBiaXQgaW4gYmFzZSArMSBjYW5ub3QgYmUgc2V0IHRvIDEgKi8KLQl0bXA9aW5iKGRldmMtPmJhc2UrMSk7Ci0Jb3V0YigweGZmLGRldmMtPmJhc2UrMSk7IAotCWlmIChpbmIoZGV2Yy0+YmFzZSsxKSE9dG1wKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDUpXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Ci0JfQotICAKLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IEFEMTgxNiAodmVyc2lvbiAlZCkgc3VjY2Vzc2Z1bGx5IGRldGVjdGVkIVxuIiwKLQkJYWRfcmVhZChkZXZjLDQ1KSk7Ci0KLQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0JYWRfd3JpdGUoZGV2YywxLDApOyAgICAgCi0KLQkvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KLQlvdXRiICgwLCBkZXZjLT5iYXNlKzEpOwkKLQotCS8qIGFsbG9jYXRlIGlycSAqLwotCWlmIChkZXZjLT5pcnEgPCAwIHx8IGRldmMtPmlycSA+IDE1KQotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBhZDE4MTZfaW50ZXJydXB0LDAsCi0JCQkiU291bmRQb3J0IiwgZGV2YykgPCAwKQl7Ci0JICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IElSUSBpbiB1c2VcbiIpOwotCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKLQl9Ci0KLQkvKiBETUEgc3R1ZmYgKi8KLQlpZiAoc291bmRfYWxsb2NfZG1hIChkZXZjLT5kbWFfcGxheWJhY2ssICJTb3VuZCBTeXN0ZW0iKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENhbid0IGFsbG9jYXRlIERNQSVkXG4iLAotCQkJCSAgICBkZXZjLT5kbWFfcGxheWJhY2spOwotCQlnb3RvIG91dF9mcmVlX2lycTsKLQl9Ci0JCi0JaWYgKCBkZXZjLT5kbWFfY2FwdHVyZSA+PSAwICYmIAotCSAgCWRldmMtPmRtYV9jYXB0dXJlICE9IGRldmMtPmRtYV9wbGF5YmFjaykgewotCQlpZiAoc291bmRfYWxsb2NfZG1hKGRldmMtPmRtYV9jYXB0dXJlLAotCQkJCSAgICAiU291bmQgU3lzdGVtIChjYXB0dXJlKSIpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENhbid0IGFsbG9jYXRlIERNQSVkXG4iLAotCQkJCQkgICAgZGV2Yy0+ZG1hX2NhcHR1cmUpOwotCQkJZ290byBvdXRfZnJlZV9kbWE7Ci0JCX0KLQkJZGV2Yy0+YXVkaW9fbW9kZT1ETUFfQVVUT01PREV8RE1BX0RVUExFWDsKLQl9IGVsc2UgewotCSAgCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogT25seSBvbmUgRE1BIGNoYW5uZWwgIgotCQkJImF2YWlsYWJsZS9jb25maWd1cmVkLiBObyBkdXBsZXggb3BlcmF0aW9uIHBvc3NpYmxlXG4iKTsKLQkJZGV2Yy0+YXVkaW9fbW9kZT1ETUFfQVVUT01PREU7Ci0JfQotCi0JY29uZl9wcmludGYyICgiQUQxODE2IGF1ZGlvIGRyaXZlciIsCi0JCSAgICAgIGRldmMtPmJhc2UsIGRldmMtPmlycSwgZGV2Yy0+ZG1hX3BsYXliYWNrLCAKLQkJICAgICAgZGV2Yy0+ZG1hX2NhcHR1cmUpOwotCi0JLyogcmVnaXN0ZXIgZGV2aWNlICovCi0JaWYgKChvc3NfZGV2bm8gPSBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2IChBVURJT19EUklWRVJfVkVSU0lPTiwKLQkJCQkJICAgICAgIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAotCQkJCQkgICAgICAmYWQxODE2X2F1ZGlvX2RyaXZlciwKLQkJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYXVkaW9fZHJpdmVyKSwKLQkJCQkJICAgICAgZGV2Yy0+YXVkaW9fbW9kZSwKLQkJCQkJICAgICAgYWRfZm9ybWF0X21hc2ssCi0JCQkJCSAgICAgIGRldmMsCi0JCQkJCSAgICAgIGRldmMtPmRtYV9wbGF5YmFjaywgCi0JCQkJCSAgICAgIGRldmMtPmRtYV9jYXB0dXJlKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogQ2FuJ3QgaW5zdGFsbCBzb3VuZCBkcml2ZXJcbiIpOwotCQlnb3RvIG91dF9mcmVlX2RtYV8yOwotCX0KLQotCi0JYWRfd3JpdGUoZGV2YywzMiwweDgwZjApOyAvKiBzb3VuZCBzeXN0ZW0gbW9kZSAqLwotCWlmIChvcHRpb25zJjEpIHsKLQkgICAgICAgIGFkX3dyaXRlKGRldmMsMzMsMCk7IC8qIGRpc2FibGUgYWxsIGF1ZGlvc291cmNlcyBmb3IgZHNwICovCi0JfSBlbHNlIHsKLQkgICAgICAgIGFkX3dyaXRlKGRldmMsMzMsMHgwM2Y4KTsgLyogZW5hYmxlIGFsbCBhdWRpb3NvdXJjZXMgZm9yIGRzcCAqLwotCX0KLQlhZF93cml0ZShkZXZjLDQsMHg4MDgwKTsgIC8qIGRlZmF1bHQgdmFsdWVzIGZvciB2b2x1bWVzIChtdXRlZCkqLwotCWFkX3dyaXRlKGRldmMsNSwweDgwODApOwotCWFkX3dyaXRlKGRldmMsNiwweDgwODApOwotCWFkX3dyaXRlKGRldmMsNywweDgwODApOwotCWFkX3dyaXRlKGRldmMsMTUsMHg4ODg4KTsKLQlhZF93cml0ZShkZXZjLDE2LDB4ODg4OCk7Ci0JYWRfd3JpdGUoZGV2YywxNywweDg4ODgpOwotCWFkX3dyaXRlKGRldmMsMTgsMHg4ODg4KTsKLQlhZF93cml0ZShkZXZjLDE5LDB4Yzg4OCk7IC8qICsyMGRiIG1pYyBhY3RpdmUgKi8KLQlhZF93cml0ZShkZXZjLDE0LDB4MDAwMCk7IC8qIE1hc3RlciB2b2x1bWUgdW5tdXRlZCAqLwotCWFkX3dyaXRlKGRldmMsMzksMHgwMDlmKTsgLyogM0QgZWZmZWN0IG9uIDAlIHBob25lIG91dCBtdXRlZCAqLwotCWFkX3dyaXRlKGRldmMsNDQsMHgwMDgwKTsgLyogZXZlcnl0aGluZyBvbiBwb3dlciwgM2QgZW5hYmxlZCBmb3IgZC9hICovCi0Jb3V0YigweDEwLGRldmMtPmJhc2UrOCk7IC8qIHNldCBkbWEgbW9kZSAqLwotCW91dGIoMHgxMCxkZXZjLT5iYXNlKzkpOwotICAKLQkvKiBlbmFibGUgY2FwdHVyZSArIHBsYXliYWNrIGludGVycnVwdCAqLwotCWFkX3dyaXRlKGRldmMsMSwweGMwMDApOyAKLQkKLQkvKiBzZXQgbWl4ZXIgZGVmYXVsdHMgKi8KLQlhZDE4MTZfbWl4ZXJfcmVzZXQgKGRldmMpOyAKLSAgCi0JLyogcmVnaXN0ZXIgbWl4ZXIgKi8KLQlpZiAoKGF1ZGlvX2RldnNbb3NzX2Rldm5vXS0+bWl4ZXJfZGV2PXNvdW5kX2luc3RhbGxfbWl4ZXIoCi0JCQkJICAgICAgIE1JWEVSX0RSSVZFUl9WRVJTSU9OLAotCQkJCSAgICAgICAiQUQxODE2IGF1ZGlvIGRyaXZlciIsCi0JCQkJICAgICAgICZhZDE4MTZfbWl4ZXJfb3BlcmF0aW9ucywKLQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyksCi0JCQkJICAgICAgIGRldmMpKSA8IDApIHsKLQkgIAlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBpbnN0YWxsIG1peGVyXG4iKTsKLQl9Ci0JLyogbWFrZSBhZDE4MTZfaW5mbyBhY3RpdmUgKi8KLQlucl9hZDE4MTZfZGV2cysrOwotCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogY2FyZCBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIVxuIik7Ci0JcmV0dXJuIDE7Ci0JLyogZXJyb3IgaGFuZGxpbmcgKi8KLW91dF9mcmVlX2RtYV8yOgotCWlmIChkZXZjLT5kbWFfY2FwdHVyZSA+PSAwICYmIGRldmMtPmRtYV9jYXB0dXJlICE9IGRldmMtPmRtYV9wbGF5YmFjaykKLQkgICAgICAgIHNvdW5kX2ZyZWVfZG1hKGRldmMtPmRtYV9jYXB0dXJlKTsKLW91dF9mcmVlX2RtYToKLQlzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfcGxheWJhY2spOwotb3V0X2ZyZWVfaXJxOgotCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7Ci1vdXRfcmVsZWFzZV9yZWdpb246Ci0JcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMTYpOwotb3V0OgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX2NhcmQoYWQxODE2X2luZm8gKmRldmMpCi17Ci0JaW50ICBtaXhlciwgZGV2ID0gMDsKLQkKLQlpZiAoZGV2YyAhPSBOVUxMKSB7Ci0JCXByaW50aygiYWQxODE2OiBVbmxvYWRpbmcgY2FyZCBhdCBhZGRyZXNzIDB4JTAzeFxuIixkZXZjLT5iYXNlKTsKLQkJCi0JCWRldiA9IGRldmMtPmRldl9ubzsKLQkJbWl4ZXIgPSBhdWRpb19kZXZzW2Rldl0tPm1peGVyX2RldjsKLQotCQkvKiB1bnJlZyBtaXhlciovCi0JCWlmKG1peGVyPj0wKSB7Ci0JCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYobWl4ZXIpOwotCQl9Ci0JCS8qIHVucmVnIGF1ZGlvZGV2ICovCi0JCXNvdW5kX3VubG9hZF9hdWRpb2RldihkZXYpOwotCQkKLQkJLyogZnJlZSBkbWEgY2hhbm5lbHMgKi8KLQkJaWYgKGRldmMtPmRtYV9jYXB0dXJlPj0wICYmIAotCQkgIAlkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spIHsKLQkJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmRtYV9jYXB0dXJlKTsKLQkJfQotCQlzb3VuZF9mcmVlX2RtYSAoZGV2Yy0+ZG1hX3BsYXliYWNrKTsKLQkJLyogZnJlZSBpcnEgKi8KLQkJZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKLQkJLyogZnJlZSBpbyAqLwotCQlyZWxlYXNlX3JlZ2lvbiAoZGV2Yy0+YmFzZSwgMTYpOwotI2lmZGVmIF9fSVNBUE5QX18KLQkJaWYgKGRldmMtPnBucGRldikgewotCQkgIAlwbnBfZGlzYWJsZV9kZXYoZGV2Yy0+cG5wZGV2KTsKLQkJCXBucF9kZXZpY2VfZGV0YWNoKGRldmMtPnBucGRldik7Ci0JCX0KLSNlbmRpZgotCQkKLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBubyBkZXZpY2UvY2FyZCBzcGVjaWZpZWRcbiIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyID0gLTE7Ci0KLSNpZmRlZiBfX0lTQVBOUF9fCi0vKiB1c2UgaXNhcG5wIGZvciBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgaW50IGlzYXBucAk9IDE7Ci1zdGF0aWMgaW50IGlzYXBucGp1bXA7Ci1tb2R1bGVfcGFyYW0oaXNhcG5wLCBib29sLCAwKTsKLW1vZHVsZV9wYXJhbShpc2FwbnBqdW1wLCBpbnQsIDApOwotI2VuZGlmCi0KLW1vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGRtYTIsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oYWQxODE2X2Nsb2NrZnJlcSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShvcHRpb25zLCBpbnQsIDApOwotCi0jaWZkZWYgX19JU0FQTlBfXwotc3RhdGljIHN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgY2FyZF92ZW5kb3IsIGNhcmRfZGV2aWNlOwotCXVuc2lnbmVkIHNob3J0IHZlbmRvcjsKLQl1bnNpZ25lZCBzaG9ydCBmdW5jdGlvbjsKLQlzdHJ1Y3QgYWQxODE2X2RhdGEgKmRhdGE7Ci19IGlzYXBucF9hZDE4MTZfbGlzdFtdIF9faW5pdGRhdGEgPSB7Ci0JewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAotCQlJU0FQTlBfVkVORE9SKCdBJywnRCcsJ1MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NzE1MCksIAotCQlOVUxMIH0sCi0JewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAotCQlJU0FQTlBfVkVORE9SKCdBJywnRCcsJ1MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NzE4MCksCi0JCU5VTEwgfSwKLQl7MH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpc2FwbnBfYWQxODE2X2xpc3QpOwotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBhZDE4MTZfY29uZmlnX3BucF9jYXJkKHN0cnVjdCBwbnBfY2FyZCAqY2FyZCwKLQkJCQkJICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3IsCi0JCQkJCSAgdW5zaWduZWQgc2hvcnQgZnVuY3Rpb24pCi17Ci0Jc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7Ci0gIAlzdHJ1Y3QgcG5wX2RldiAqY2FyZF9kZXYgPSBwbnBfZmluZF9kZXYoY2FyZCwgdmVuZG9yLCBmdW5jdGlvbiwgTlVMTCk7Ci0JaWYgKCFjYXJkX2RldikgcmV0dXJuOwotCWlmIChwbnBfZGV2aWNlX2F0dGFjaChjYXJkX2RldikgPCAwKSB7Ci0JICAJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBGYWlsZWQgdG8gYXR0YWNoIFBuUCBkZXZpY2VcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlmIChwbnBfYWN0aXZhdGVfZGV2KGNhcmRfZGV2KSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBGYWlsZWQgdG8gYWN0aXZhdGUgUG5QIGRldmljZVxuIik7Ci0JCXBucF9kZXZpY2VfZGV0YWNoKGNhcmRfZGV2KTsKLQkJcmV0dXJuOwotCX0KLQljZmcuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGNhcmRfZGV2LCAyKTsKLQljZmcuaXJxID0gcG5wX2lycShjYXJkX2RldiwgMCk7Ci0JY2ZnLmRtYSA9IHBucF9pcnEoY2FyZF9kZXYsIDApOwotCWNmZy5kbWEyID0gcG5wX2lycShjYXJkX2RldiwgMSk7Ci0JaWYgKCFhZDE4MTZfaW5pdF9jYXJkKCZjZmcsIGNhcmRfZGV2KSkgewotCSAgCXBucF9kaXNhYmxlX2RldihjYXJkX2Rldik7Ci0JCXBucF9kZXZpY2VfZGV0YWNoKGNhcmRfZGV2KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhZDE4MTZfY29uZmlnX3BucF9jYXJkcyh2b2lkKQotewotCWludCBucl9wbnBfY2ZnOwotCWludCBpOwotCQotCS8qIENvdW50IGVudHJpZXMgaW4gaXNhcG5wX2FkMTgxNl9saXN0ICovCi0JZm9yIChucl9wbnBfY2ZnID0gMDsgaXNhcG5wX2FkMTgxNl9saXN0W25yX3BucF9jZmddLmNhcmRfdmVuZG9yICE9IDA7IAotCQlucl9wbnBfY2ZnKyspOwotCS8qIENoZWNrIGFuZCBhZGp1c3QgaXNhcG5wanVtcCAqLwotCWlmKCBpc2FwbnBqdW1wIDwgMCB8fCBpc2FwbnBqdW1wID49IG5yX3BucF9jZmcpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCSJhZDE4MTY6IFZhbGlkIHJhbmdlIGZvciBpc2FwbnBqdW1wIGlzIDAtJWQuICIKLQkJCSJBZGp1c3RlZCB0byAwLlxuIiwgbnJfcG5wX2NmZy0xKTsKLQkJaXNhcG5wanVtcCA9IDA7Ci0JfQotCWZvciAoaSA9IGlzYXBucGp1bXA7IGlzYXBucF9hZDE4MTZfbGlzdFtpXS5jYXJkX3ZlbmRvciAhPSAwOyBpKyspIHsKLQkgCXN0cnVjdCBwbnBfY2FyZCAqY2FyZCA9IE5VTEw7Ci0JCS8qIGl0ZXJhdGUgb3ZlciBhbGwgcG5wIGNhcmRzICovCQkKLQkJd2hpbGUgKChjYXJkID0gcG5wX2ZpbmRfY2FyZChpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF92ZW5kb3IsCi0JCSAgICAgICAgICAgICAgCWlzYXBucF9hZDE4MTZfbGlzdFtpXS5jYXJkX2RldmljZSwgY2FyZCkpKSAKLQkJCWFkMTgxNl9jb25maWdfcG5wX2NhcmQoY2FyZCwgCi0JCQkJaXNhcG5wX2FkMTgxNl9saXN0W2ldLnZlbmRvciwKLQkJCQlpc2FwbnBfYWQxODE2X2xpc3RbaV0uZnVuY3Rpb24pOwotCX0KLX0KLSNlbmRpZgotCi0vKiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gKi8KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfYWQxODE2KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBBRDE4MTYgc291bmRkcml2ZXIgIgotCQkJICJDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBieSBUaG9yc3RlbiBLbmFiZSBhbmQgIgotCQkJICJvdGhlcnNcbiIpOwotI2lmZGVmIEFEMTgxNl9DTE9DSyAKLQkvKiBzZXQgYWQxODE2X2Nsb2NrZnJlcSBpZiBzZXQgZHVyaW5nIGNvbXBpbGF0aW9uICovCi0JYWQxODE2X2Nsb2NrZnJlcT1BRDE4MTZfQ0xPQ0s7Ci0jZW5kaWYKLQlpZiAoYWQxODE2X2Nsb2NrZnJlcTw1MDAwIHx8IGFkMTgxNl9jbG9ja2ZyZXE+MTAwMDAwKSB7Ci0JCWFkMTgxNl9jbG9ja2ZyZXE9MzMwMDA7Ci0JfQotCi0jaWZkZWYgX19JU0FQTlBfXwotCS8qIGNvbmZpZ3VyZSBQblAgY2FyZHMgKi8KLQlpZihpc2FwbnApIGFkMTgxNl9jb25maWdfcG5wX2NhcmRzKCk7Ci0jZW5kaWYKLQkvKiBjb25maWd1cmUgY2FyZCBieSBtb2R1bGUgcGFyYW1zICovCi0JaWYgKGlvICE9IC0xICYmIGlycSAhPSAtMSAmJiBkbWEgIT0gLTEpIHsKLQkJc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7Ci0JCWNmZy5pb19iYXNlID0gaW87Ci0JCWNmZy5pcnEgPSBpcnE7Ci0JCWNmZy5kbWEgPSBkbWE7Ci0JCWNmZy5kbWEyID0gZG1hMjsKLQkJYWQxODE2X2luaXRfY2FyZCgmY2ZnLCBOVUxMKTsKLQl9Ci0JaWYgKG5yX2FkMTgxNl9kZXZzIDw9IDApCi0JICAJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIG1vZHVsZSBjbGVhbnVwICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9hZDE4MTYgKHZvaWQpCi17Ci0JaW50ICAgICAgICAgIGk7Ci0JYWQxODE2X2luZm8gICpkZXZjID0gTlVMTDsKLSAgCi0JLyogcmVtb3ZlIGFueSBzb3VuZGNhcmQgKi8KLQlmb3IgKGkgPSAwOyAgaSA8IG5yX2FkMTgxNl9kZXZzOyBpKyspIHsKLQkJZGV2YyA9ICZkZXZfaW5mb1tpXTsKLQkJdW5sb2FkX2NhcmQoZGV2Yyk7Ci0JfSAgICAgCi0JbnJfYWQxODE2X2RldnM9MDsKLQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IGRyaXZlciB1bmxvYWRlZCFcbiIpOwotfQotCi1tb2R1bGVfaW5pdChpbml0X2FkMTgxNik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX2FkMTgxNik7Ci0KLSNpZm5kZWYgTU9EVUxFCi0vKiBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlciBldmFsdWF0aW9uICovCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZDE4MTYoY2hhciAqc3RyKQotewotCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiAqLwotCWludCBpbnRzWzVdOwotCQotCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0JCi0JaW8JPSBpbnRzWzFdOwotCWlycQk9IGludHNbMl07Ci0JZG1hCT0gaW50c1szXTsKLQlkbWEyCT0gaW50c1s0XTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiYWQxODE2PSIsIHNldHVwX2FkMTgxNik7Ci0jZW5kaWYKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZDE4ODkuYyBiL3NvdW5kL29zcy9hZDE4ODkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3MzBhMy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvYWQxODg5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAxICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KLSAqCi0gKiAgQW5hbG9nIERldmljZXMgMTg4OSBQQ0kgYXVkaW8gZHJpdmVyIChBRDE4MTkgQUM5Ny1jb21wYXRpYmxlIGNvZGVjKQotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAgIE5vdGVzOgotICogICAxLiBPbmx5IGZsYXQgRE1BIGlzIHN1cHBvcnRlZDsgcy1nIGlzIG5vdCBzdXBwb3J0ZWQgcmlnaHQgbm93Ci0gKgotICoKLTxqc20+IHRhdXNxOiBBbnl3YXksIHRvIHNldCB1cCBzYW1wbGUgcmF0ZXMgZm9yIEQgdG8gQSwgeW91IGp1c3QgdXNlIHRoZSBzYW1wbGUgcmF0ZSBvbiB0aGUgY29kZWMuIEZvciBBIHRvIEQsIHlvdSBuZWVkIHRvIHNldCB0aGUgY29kZWMgYWx3YXlzIHRvIDQ4SyAodXNpbmcgdGhlIHNwbGl0IHNhbXBsZSByYXRlIGZlYXR1cmUgb24gdGhlIGNvZGVjKSBhbmQgdGhlbiBzZXQgdGhlIHJlc2FtcGxlciBvbiB0aGUgQUQxODg5IHRvIHRoZSBzYW1wbGUgcmF0ZSB5b3Ugd2FudC4KLTxqc20+IEFsc28sIHdoZW4gY2hhbmdpbmcgdGhlIHNhbXBsZSByYXRlIG9uIHRoZSBjb2RlYyB5b3UgbmVlZCB0byBwb3dlciBpdCBkb3duIGFuZCByZSBwb3dlciBpdCB1cCBmb3IgdGhlIGNoYW5nZSB0byB0YWtlIGVmZmVjdCEKLSAqCi0gKiAkSWQ6IGFkMTg4OS5jLHYgMS4zIDIwMDIvMTAvMTkgMjE6MzE6NDQgZ3J1bmRsZXIgRXhwICQKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICJhZDE4ODkuaCIKLQotI2RlZmluZSBEQkcoZm10LCBhcmcuLi4pIHByaW50ayhmbXQsICMjYXJnKQotI2RlZmluZSBERVZOQU1FICJhZDE4ODkiCi0KLSNkZWZpbmUgTlJfSFdfQ0gJNAotI2RlZmluZSBEQUNfUlVOTklORwkxCi0jZGVmaW5lIEFEQ19SVU5OSU5HCTIKLQotI2RlZmluZSBVTkRFUlJVTihkZXYpCSgwKQotCi0jZGVmaW5lIEFEMTg4OV9SRUFEVyhkZXYscmVnKSByZWFkdyhkZXYtPnJlZ2Jhc2UgKyByZWcpCi0jZGVmaW5lIEFEMTg4OV9XUklURVcoZGV2LHJlZyx2YWwpIHdyaXRldygodmFsKSwgZGV2LT5yZWdiYXNlICsgcmVnKQotI2RlZmluZSBBRDE4ODlfUkVBREwoZGV2LHJlZykgcmVhZGwoZGV2LT5yZWdiYXNlICsgcmVnKQotI2RlZmluZSBBRDE4ODlfV1JJVEVMKGRldixyZWcsdmFsKSB3cml0ZWwoKHZhbCksIGRldi0+cmVnYmFzZSArIHJlZykKLQotLy9ub3cgMTAwbXMKLS8qICNkZWZpbmUgV0FJVF8xME1TKCkJc2NoZWR1bGVfdGltZW91dChIWi8xMCkgKi8KLSNkZWZpbmUgV0FJVF8xME1TKCkJZG8geyBpbnQgX19pOyBmb3IgKF9faSA9IDA7IF9faSA8IDEwMDsgX19pKyspIHVkZWxheSgxMDAwKTsgfSB3aGlsZSgwKQotCi0vKiBjdXJyZW50bHkgb25seSBzdXBwb3J0IGEgc2luZ2xlIGRldmljZSAqLwotc3RhdGljIGFkMTg4OV9kZXZfdCAqYWQxODg5X2RldiA9IE5VTEw7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIGhlbHBlciByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfd2F2X3JhdGUoYWQxODg5X2Rldl90ICpkZXYsIGludCByYXRlKQotewotCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjID0gZGV2LT5hYzk3X2NvZGVjOwotCi0JREJHKCJTZXR0aW5nIFdBViByYXRlIHRvICVkXG4iLCByYXRlKTsKLQlkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0uZG1hYnVmLnJhdGUgPSByYXRlOwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9EU19XQVMsIHJhdGUpOwotCi0JLyogQ3ljbGUgdGhlIERBQyB0byBlbmFibGUgdGhlIG5ldyByYXRlICovCi0JYWM5N19jb2RlYy0+Y29kZWNfd3JpdGUoZGV2LT5hYzk3X2NvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIDB4MDIwMCk7Ci0JV0FJVF8xME1TKCk7Ci0JYWM5N19jb2RlYy0+Y29kZWNfd3JpdGUoZGV2LT5hYzk3X2NvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIDApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWQxODg5X3NldF93YXZfZm10KGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgZm10KQotewotCXUxNiB0bXA7Ci0KLQlEQkcoIlNldHRpbmcgV0FWIGZvcm1hdCB0byAweCV4XG4iLCBmbXQpOwotCi0JdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOwotCWlmIChmbXQgJiBBRk1UX1MxNl9MRSkgewotCQkvL3RtcCB8PSAweDAxMDA7IC8qIHNldCBXQTE2ICovCi0JCXRtcCB8PSAweDAzMDA7IC8qIHNldCBXQTE2IHN0ZXJlbyAqLwotCX0gZWxzZSBpZiAoZm10ICYgQUZNVF9VOCkgewotCQl0bXAgJj0gfjB4MDEwMDsgLyogY2xlYXIgV0ExNiAqLwotCX0gCi0JQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DLCB0bXApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWQxODg5X3NldF9hZGNfZm10KGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgZm10KQotewotCXUxNiB0bXA7Ci0KLQlEQkcoIlNldHRpbmcgQURDIGZvcm1hdCB0byAweCV4XG4iLCBmbXQpOwotCi0JdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMpOwotCWlmIChmbXQgJiBBRk1UX1MxNl9MRSkgewotCQl0bXAgfD0gMHgwMTAwOyAvKiBzZXQgV0ExNiAqLwotCX0gZWxzZSBpZiAoZm10ICYgQUZNVF9VOCkgewotCQl0bXAgJj0gfjB4MDEwMDsgLyogY2xlYXIgV0ExNiAqLwotCX0gCi0JQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DLCB0bXApOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfc3RhcnRfd2F2KGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCWludCBjbnQ7Ci0JdTE2IHRtcDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGRtYWJ1Zi0+ZG1hX2xlbikJLyogRE1BIGFscmVhZHkgaW4gZmxpZ2h0ICovCi0JCWdvdG8gc2tpcF9kbWE7Ci0KLQkvKiBzZXR1cCBkbWEgKi8KLQljbnQgPSBkbWFidWYtPndyX3B0ciAtIGRtYWJ1Zi0+cmRfcHRyOwotCWlmIChjbnQgPT0gMCkJCS8qIGRvbmUgLSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nICovCi0JCWdvdG8gc2tpcF9kbWE7Ci0KLQkvKiBJZiB0aGUgd3JfcHRyIGhhcyB3cmFwcGVkLCBvbmx5IG1hcCB0byB0aGUgZW5kICovCi0JaWYgKGNudCA8IDApCi0JCWNudCA9IERNQV9TSVpFIC0gZG1hYnVmLT5yZF9wdHI7Ci0KLQlkbWFidWYtPmRtYV9oYW5kbGUgPSBwY2lfbWFwX3NpbmdsZShhZDE4ODlfZGV2LT5wY2ksCi0JCQkJCWRtYWJ1Zi0+cmF3YnVmICsgZG1hYnVmLT5yZF9wdHIsCi0JCQkJCWNudCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JZG1hYnVmLT5kbWFfbGVuID0gY250OwotCWRtYWJ1Zi0+cmVhZHkgPSAxOwotCi0JREJHKCJTdGFydGluZyBwbGF5YmFjayBhdCAweCVwIGZvciAlbGQgYnl0ZXNcbiIsIGRtYWJ1Zi0+cmF3YnVmICsKLQkgICAgZG1hYnVmLT5yZF9wdHIsIGRtYWJ1Zi0+ZG1hX2xlbik7Ci0KLSAgICAgICAgLyogbG9hZCB1cCB0aGUgY3VycmVudCByZWdpc3RlciBzZXQgKi8KLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9XQVZDQywgY250KTsKLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9XQVZJQ0MsIGNudCk7Ci0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWQ0EsIGRtYWJ1Zi0+ZG1hX2hhbmRsZSk7Ci0KLQkvKiBUT0RPOiBmb3Igbm93IHdlIGxvYWQgdGhlIGJhc2UgcmVnaXN0ZXJzIHdpdGggdGhlIHNhbWUgdGhpbmcgKi8KLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9XQVZCQywgY250KTsKLQlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQV9XQVZJQkMsIGNudCk7Ci0JQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFfV0FWQkEsIGRtYWJ1Zi0+ZG1hX2hhbmRsZSk7Ci0KLQkvKiBhbmQgd2UncmUgb2ZmIHRvIHRoZSByYWNlcy4uLiAqLwotCUFEMTg4OV9XUklURUwoYWQxODg5X2RldiwgQURfRE1BX0NIU1MsIDB4OCk7Ci0JdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOwotCXRtcCB8PSAweDA0MDA7IC8qIHNldCBXQUVOICovCi0JQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DLCB0bXApOwotCSh2b2lkKSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7IC8qIGZsdXNoIHBvc3RlZCBQQ0kgd3JpdGUgKi8KLQotCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOwotCi1za2lwX2RtYToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFkMTg4OV9zdG9wX3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKLQkJdTE2IHRtcDsKLQkJdW5zaWduZWQgbG9uZyBjbnQgPSBkbWFidWYtPmRtYV9sZW47Ci0KLQkJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMpOwotCQl0bXAgJj0gfjB4MDQwMDsgLyogY2xlYXIgV0FFTiAqLwotCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1dTTUMsIHRtcCk7Ci0JCSh2b2lkKSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV1NNQyk7IC8qIGZsdXNoIHBvc3RlZCBQQ0kgd3JpdGUgKi8KLQkJcGNpX3VubWFwX3NpbmdsZShhZDE4ODlfZGV2LT5wY2ksIGRtYWJ1Zi0+ZG1hX2hhbmRsZSwgCi0JCQkJY250LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQotCQlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7Ci0KLQkJLyogdXBkYXRlIGRtYSBwb2ludGVycyAqLwotCQlkbWFidWYtPnJkX3B0ciArPSBjbnQ7Ci0JCWRtYWJ1Zi0+cmRfcHRyICY9IChETUFfU0laRSAtIDEpOwotCi0JCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7Ci0JCWRtYWJ1Zi0+ZG1hX2xlbiA9IDA7Ci0JCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCi0JCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotCi0jaWYgMAotc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0c3RvcF9hZGMoYWQxODg5X3N0YXRlX3QgKnN0YXRlLCBpbnQgc3RhcnQpCi17Ci0JdTE2IHRtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCi0JdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTX1JBTUMpOwotCWlmIChzdGFydCkgewotCQlzdGF0ZS0+ZG1hYnVmLmVuYWJsZSB8PSBBRENfUlVOTklORzsKLQkJdG1wIHw9IDB4MDAwNDsgLyogc2V0IEFERU4gKi8KLQl9IGVsc2UgewotCQlzdGF0ZS0+ZG1hYnVmLmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7Ci0JCXRtcCAmPSB+MHgwMDA0OyAvKiBjbGVhciBBREVOICovCi0JfQotCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfUkFNQywgdG1wKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGFkMTg4OV9kZXZfdCAqYWQxODg5X2FsbG9jX2RldihzdHJ1Y3QgcGNpX2RldiAqcGNpKQotewotCWFkMTg4OV9kZXZfdCAqZGV2OwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlpbnQgaTsKLQotCWlmICgoZGV2ID0ga3phbGxvYyhzaXplb2YoYWQxODg5X2Rldl90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOwotCWRldi0+cGNpID0gcGNpOwotCi0JZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgewotCQlkZXYtPnN0YXRlW2ldLmNhcmQgPSBkZXY7Ci0JCW11dGV4X2luaXQoJmRldi0+c3RhdGVbaV0ubXV0ZXgpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnN0YXRlW2ldLmRtYWJ1Zi53YWl0KTsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBkbWEgYnVmZmVyICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgQURfTUFYX1NUQVRFUzsgaSsrKSB7Ci0JCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW2ldLmRtYWJ1ZjsKLQkJZG1hYnVmLT5yYXdidWYgPSBrbWFsbG9jKERNQV9TSVpFLCBHRlBfS0VSTkVMfEdGUF9ETUEpOwotCQlpZiAoIWRtYWJ1Zi0+cmF3YnVmKQotCQkJZ290byBlcnJfZnJlZV9kbWFidWY7Ci0JCWRtYWJ1Zi0+cmF3YnVmX3NpemUgPSBETUFfU0laRTsKLQkJZG1hYnVmLT5kbWFfaGFuZGxlID0gMDsKLQkJZG1hYnVmLT5yZF9wdHIgPSBkbWFidWYtPndyX3B0ciA9IGRtYWJ1Zi0+ZG1hX2xlbiA9IDBVTDsKLQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCWRtYWJ1Zi0+cmF0ZSA9IDQ4MDAwOwotCX0KLQlyZXR1cm4gZGV2OwotCi1lcnJfZnJlZV9kbWFidWY6Ci0Jd2hpbGUgKC0taSA+PSAwKQotCQlrZnJlZShkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5yYXdidWYpOwotCWtmcmVlKGRldik7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg4OV9mcmVlX2RldihhZDE4ODlfZGV2X3QgKmRldikKLXsKLQlpbnQgajsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0KLQlpZiAoZGV2ID09IE5VTEwpIAotCQlyZXR1cm47Ci0KLQlpZiAoZGV2LT5hYzk3X2NvZGVjKQotCQlhYzk3X3JlbGVhc2VfY29kZWMoZGV2LT5hYzk3X2NvZGVjKTsKLQotCWZvciAoaiA9IDA7IGogPCBBRF9NQVhfU1RBVEVTOyBqKyspIHsKLQkJZG1hYnVmID0gJmRldi0+c3RhdGVbal0uZG1hYnVmOwotCQlrZnJlZShkbWFidWYtPnJhd2J1Zik7Ci0JfQotCi0Ja2ZyZWUoZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV90cmlnZ2VyX3BsYXliYWNrKGFkMTg4OV9kZXZfdCAqZGV2KQotewotI2lmIDAKLQl1MzIgdmFsOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0uZG1hYnVmOwotI2VuZGlmCi0KLQlhZDE4ODlfc3RhcnRfd2F2KCZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0pOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9yZWFkX3Byb2MgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCWNoYXIgKm91dCA9IHBhZ2U7Ci0JaW50IGxlbiwgaTsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IGRhdGE7Ci0JYWQxODg5X3JlZ190IHJlZ3NbXSA9IHsKLQkJeyAiV1NNQyIsIEFEX0RTX1dTTUMsIDE2IH0sCi0JCXsgIlJBTUMiLCBBRF9EU19SQU1DLCAxNiB9LAotCQl7ICJXQURBIiwgQURfRFNfV0FEQSwgMTYgfSwKLQkJeyAiU1lEQSIsIEFEX0RTX1NZREEsIDE2IH0sCi0JCXsgIldBUyIsIEFEX0RTX1dBUywgMTYgfSwKLQkJeyAiUkVTIiwgQURfRFNfUkVTLCAxNiB9LAotCQl7ICJDQ1MiLCBBRF9EU19DQ1MsIDE2IH0sCi0JCXsgIkFEQ0JBIiwgQURfRE1BX0FEQ0JBLCAzMiB9LAotCQl7ICJBRENDQSIsIEFEX0RNQV9BRENDQSwgMzIgfSwKLQkJeyAiQURDQkMiLCBBRF9ETUFfQURDQkMsIDMyIH0sCi0JCXsgIkFEQ0NDIiwgQURfRE1BX0FEQ0NDLCAzMiB9LAotCQl7ICJBRENJQkMiLCBBRF9ETUFfQURDSUJDLCAzMiB9LAotCQl7ICJBRENJQ0MiLCBBRF9ETUFfQURDSUNDLCAzMiB9LAotCQl7ICJBRENDVFJMIiwgQURfRE1BX0FEQ0NUUkwsIDE2IH0sCi0JCXsgIldBVkJBIiwgQURfRE1BX1dBVkJBLCAzMiB9LAotCQl7ICJXQVZDQSIsIEFEX0RNQV9XQVZDQSwgMzIgfSwKLQkJeyAiV0FWQkMiLCBBRF9ETUFfV0FWQkMsIDMyIH0sCi0JCXsgIldBVkNDIiwgQURfRE1BX1dBVkNDLCAzMiB9LAotCQl7ICJXQVZJQkMiLCBBRF9ETUFfV0FWSUJDLCAzMiB9LAotCQl7ICJXQVZJQ0MiLCBBRF9ETUFfV0FWSUNDLCAzMiB9LAotCQl7ICJXQVZDVFJMIiwgQURfRE1BX1dBVkNUUkwsIDE2IH0sCi0JCXsgIkRJU1IiLCBBRF9ETUFfRElTUiwgMzIgfSwKLQkJeyAiQ0hTUyIsIEFEX0RNQV9DSFNTLCAzMiB9LAotCQl7ICJJUEMiLCBBRF9HUElPX0lQQywgMTYgfSwKLQkJeyAiT1AiLCBBRF9HUElPX09QLCAxNiB9LAotCQl7ICJJUCIsIEFEX0dQSU9fSVAsIDE2IH0sCi0JCXsgIkFDSUMiLCBBRF9BQzk3X0FDSUMsIDE2IH0sCi0JCXsgIkFDOTdfUkVTRVQiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1JFU0VULCAxNiB9LAotCQl7ICJBQzk3X01BU1RFUl9WT0xfU1RFUkVPIiwgQURfQUM5N19CQVNFICsgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMTYgfSwKLQkJeyAiQUM5N19IRUFEUEhPTkVfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19IRUFEUEhPTkVfVk9MLCAxNiB9LAotCQl7ICJBQzk3X01BU1RFUl9WT0xfTU9OTyIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTUFTVEVSX1ZPTF9NT05PLCAxNiB9LAotCQl7ICJBQzk3X01BU1RFUl9UT05FIiwgQURfQUM5N19CQVNFICsgQUM5N19NQVNURVJfVE9ORSwgMTYgfSwKLQkJeyAiQUM5N19QQ0JFRVBfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19QQ0JFRVBfVk9MLCAxNiB9LAotCQl7ICJBQzk3X1BIT05FX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUEhPTkVfVk9MLCAxNiB9LAotCQl7ICJBQzk3X01JQ19WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X01JQ19WT0wsIDE2IH0sCi0JCXsgIkFDOTdfTElORUlOX1ZPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfTElORUlOX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19DRF9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X0NEX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19WSURFT19WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1ZJREVPX1ZPTCwgMTYgfSwKLQkJeyAiQUM5N19BVVhfVk9MIiwgQURfQUM5N19CQVNFICsgQUM5N19BVVhfVk9MLCAxNiB9LAotCQl7ICJBQzk3X1BDTU9VVF9WT0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1BDTU9VVF9WT0wsIDE2IH0sCi0JCXsgIkFDOTdfUkVDT1JEX1NFTEVDVCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUkVDT1JEX1NFTEVDVCwgMTYgfSwKLQkJeyAiQUM5N19SRUNPUkRfR0FJTiIsIEFEX0FDOTdfQkFTRSArIEFDOTdfUkVDT1JEX0dBSU4sIDE2IH0sCi0JCXsgIkFDOTdfUkVDT1JEX0dBSU5fTUlDIiwgQURfQUM5N19CQVNFICsgQUM5N19SRUNPUkRfR0FJTl9NSUMsIDE2IH0sCi0JCXsgIkFDOTdfR0VORVJBTF9QVVJQT1NFIiwgQURfQUM5N19CQVNFICsgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDE2IH0sCi0JCXsgIkFDOTdfM0RfQ09OVFJPTCIsIEFEX0FDOTdfQkFTRSArIEFDOTdfM0RfQ09OVFJPTCwgMTYgfSwKLQkJeyAiQUM5N19NT0RFTV9SQVRFIiwgQURfQUM5N19CQVNFICsgQUM5N19NT0RFTV9SQVRFLCAxNiB9LAotCQl7ICJBQzk3X1BPV0VSX0NPTlRST0wiLCBBRF9BQzk3X0JBU0UgKyBBQzk3X1BPV0VSX0NPTlRST0wsIDE2IH0sCi0JCXsgTlVMTCB9Ci0JfTsKLQotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlmb3IgKGkgPSAwOyByZWdzW2ldLm5hbWUgIT0gMDsgaSsrKQotCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlczogMHglMCp4XG4iLCByZWdzW2ldLm5hbWUsIAotCQkJcmVnc1tpXS53aWR0aCA+PiAyLCAKLQkJCShyZWdzW2ldLndpZHRoID09IDE2IAotCQkJIAk/IEFEMTg4OV9SRUFEVyhkZXYsIHJlZ3NbaV0ub2Zmc2V0KQotCQkJCTogQUQxODg5X1JFQURMKGRldiwgcmVnc1tpXS5vZmZzZXQpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQURfTUFYX1NUQVRFUzsgaSsrKSB7Ci0JCW91dCArPSBzcHJpbnRmKG91dCwgIkRNQSBzdGF0dXMgZm9yICVzOlxuIiwgCi0JCQkoaSA9PSBBRF9XQVZfU1RBVEUgPyAiV0FWIiA6ICJBREMiKSk7IAotCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdFx0MHglcCAoSU9WQTogMHglbGx1KVxuIiwKLQkJCWRldi0+c3RhdGVbaV0uZG1hYnVmLnJhd2J1ZiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5zdGF0ZVtpXS5kbWFidWYuZG1hX2hhbmRsZSk7Ci0KLQkJb3V0ICs9IHNwcmludGYob3V0LCAiXHRyZWFkIHB0cjogb2Zmc2V0ICV1XG4iLCAKLQkJCSh1bnNpZ25lZCBpbnQpZGV2LT5zdGF0ZVtpXS5kbWFidWYucmRfcHRyKTsKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiXHR3cml0ZSBwdHI6IG9mZnNldCAldVxuIiwgCi0JCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLndyX3B0cik7Ci0JCW91dCArPSBzcHJpbnRmKG91dCwgIlx0ZG1hIGxlbjogb2Zmc2V0ICV1XG4iLCAKLQkJCSh1bnNpZ25lZCBpbnQpZGV2LT5zdGF0ZVtpXS5kbWFidWYuZG1hX2xlbik7Ci0JfQotCi0JbGVuID0gb3V0IC0gcGFnZSAtIG9mZjsKLQlpZiAobGVuIDwgY291bnQpIHsKLQkJKmVvZiA9IDE7Ci0JCWlmIChsZW4gPD0gMCkgcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJbGVuID0gY291bnQ7Ci0JfQotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0JcmV0dXJuIGxlbjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0jaWYgMAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFkMTg4OV9nZXRfZG1hX2FkZHIoYWQxODg5X3N0YXRlX3QgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXUzMiBvZmZzZXQ7Ci0KLQlpZiAoIShkbWFidWYtPmVuYWJsZSAmIChEQUNfUlVOTklORyB8IEFEQ19SVU5OSU5HKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogZ2V0X2RtYV9hZGRyIGNhbGxlZCB3aXRob3V0IGRtYSBlbmFibGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQotCQlvZmZzZXQgPSBsZTMyX3RvX2NwdShBRDE4ODlfUkVBREwoc3RhdGUtPmNhcmQsIEFEX0RNQV9XQVZCQSkpOwotCWVsc2UKLQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFfQURDQkEpKTsKLQotCXJldHVybiAodW5zaWduZWQgbG9uZylidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylvZmZzZXQpIC0gKHVuc2lnbmVkIGxvbmcpZG1hYnVmLT5yYXdidWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkMTg4OV91cGRhdGVfcHRyKGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgd2FrZSkKLXsKLQlhZDE4ODlfc3RhdGVfdCAqc3RhdGU7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXVuc2lnbmVkIGxvbmcgaHdwdHI7Ci0JaW50IGRpZmY7Ci0KLQkvKiBjaGVjayBBREMgZmlyc3QgKi8KLQlzdGF0ZSA9ICZkZXYtPmFkY19zdGF0ZTsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgewotCQlod3B0ciA9IGFkMTg4OV9nZXRfZG1hX2FkZHIoc3RhdGUpOwotCQlkaWZmID0gKGRtYWJ1Zi0+ZG1hc2l6ZSArIGh3cHRyIC0gZG1hYnVmLT5od3B0cikgJSBkbWFidWYtPmRtYXNpemU7Ci0KLQkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOwotCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7Ci0JCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwotCi0JCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJaWYgKHdha2UgJiBkbWFidWYtPmNvdW50ID49IGRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJfSBlbHNlIHsKLQkJCWlmICh3YWtlICYgZG1hYnVmLT5jb3VudCA+IDApCi0JCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJfQotCX0KLQotCS8qIGNoZWNrIERBQyAqLwotCXN0YXRlID0gJmRldi0+d2F2X3N0YXRlOwotCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7Ci1YWFgKLQotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqIC9kZXYvZHNwIGludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1zdGF0aWMgc3NpemVfdCBhZDE4ODlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAotCWxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQxODg5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCi0JbG9mZl90ICpwcG9zKQotewotCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlhZDE4ODlfc3RhdGVfdCAqc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdOwotCXZvbGF0aWxlIHN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXNzaXplX3QgcmV0ID0gMDsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQotCW11dGV4X2xvY2soJnN0YXRlLT5tdXRleCk7Ci0jaWYgMAotCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZXJyMTsKLQl9Ci0jZW5kaWYKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBlcnIxOwotCX0KLQotCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLQotCS8qIHN0YXJ0IGZpbGxpbmcgZG1hIGJ1ZmZlci4uLi4gKi8KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCWxvbmcgcmVtOwotCQlsb25nIGNudCA9IGNvdW50OwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCWZvciAoOzspIHsKLQkJCWxvbmcgdXNlZF9ieXRlczsKLQkJCWxvbmcgdGltZW91dDsJLyogbWF4IHRpbWUgZm9yIERNQSBpbiBqaWZmaWVzICovCi0KLQkJCS8qIGJ1ZmZlciBpcyBmdWxsIGlmIHdyIGNhdGNoZXMgdXAgdG8gcmQgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJdXNlZF9ieXRlcyA9IGRtYWJ1Zi0+d3JfcHRyIC0gZG1hYnVmLT5yZF9wdHI7Ci0JCQl0aW1lb3V0ID0gKGRtYWJ1Zi0+ZG1hX2xlbiAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCS8qIGFkanVzdCBmb3IgYnVmZmVyIHdyYXAgYXJvdW5kICovCi0JCQl1c2VkX2J5dGVzID0gKHVzZWRfYnl0ZXMgKyBETUFfU0laRSkgJiAoRE1BX1NJWkUgLSAxKTsKLQotCQkJLyogSWYgYXQgbGVhc3Qgb25lIHBhZ2UgdW51c2VkICovCi0JCQlpZiAodXNlZF9ieXRlcyA8IChETUFfU0laRSAtIDB4MTAwMCkpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIGRtYSBidWZmZXIgZnVsbCAqLwotCi0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWdvdG8gZXJyMjsKLQkJCX0KLQotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCArIDEpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gZXJyMjsKLQkJCX0KLQkJfQotCi0JCS8qIHdhdGNoIG91dCBmb3Igd3JhcHBpbmcgYXJvdW5kIHN0YXRpYyBidWZmZXIgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJlbSA9IERNQV9TSVpFIC0gZG1hYnVmLT53cl9wdHI7Ci0JCWlmIChjbnQgPiByZW0pCi0JCQljbnQgPSByZW07Ci0KLQkJcmVtID0gZG1hYnVmLT53cl9wdHI7Ci0KLQkJLyogdXBkYXRlIGRtYSBwb2ludGVycyAqLwotCQlkbWFidWYtPndyX3B0ciArPSBjbnQ7Ci0JCWRtYWJ1Zi0+d3JfcHRyICY9IERNQV9TSVpFIC0gMTsJLyogd3JhcCBwdHIgaWYgbmVjZXNzYXJ5ICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogdHJhbnNmZXIgdW53cmFwcGVkIGNodW5rICovCi0JCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHJlbSwgYnVmZmVyLCBjbnQpKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBlcnIyOwotCQl9Ci0KLQkJREJHKCJXcml0aW5nIDB4JWx4IGJ5dGVzIHRvICsweCVseFxuIiwgY250LCByZW0pOwotCi0JCS8qIHVwZGF0ZSBjb3VudGVycyAqLwotCQljb3VudCAtPSBjbnQ7Ci0JCWJ1ZmZlciArPSBjbnQ7Ci0JCXJldCArPSBjbnQ7Ci0KLQkJLyogd2UgaGF2ZSBzb21ldGhpbmcgdG8gcGxheSAtIGdvIHBsYXkgaXQhICovCi0JCWFkMTg4OV90cmlnZ2VyX3BsYXliYWNrKGRldik7Ci0JfQotCi1lcnIyOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLWVycjE6Ci0JbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYWQxODg5X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0jaWYgMAotCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlhZDE4ODlfc3RhdGVfdCAqc3RhdGUgPSBOVUxMOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQotCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdOwotCQlpZiAoIXN0YXRlKSByZXR1cm4gMDsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV07Ci0JCWlmICghc3RhdGUpIHJldHVybiAwOwotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQlhZDE4ODlfdXBkYXRlX3B0cihkZXYsIDApOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVbV0FWX1NUQVRFXTsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKGludClkbWFidWYtPmZyYWdzaXplKQotCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKGludClkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAotCQkJCShpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQl9Ci0JfQotCi0JaWYgKGZpbGUgLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0YXRlID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXTsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCWlmIChkbWFidWYtPmNvdW50ID49IChpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0KLSNlbmRpZgotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHZhbCA9IDA7Ci0JYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlhdWRpb19idWZfaW5mbyBhYmluZm87Ci0JaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwotCi0JREJHKCJhZDE4ODlfaW9jdGwgY21kIDB4JXggYXJnICVsdVxuIiwgY21kLCBhcmcpOwotCi0Jc3dpdGNoIChjbWQpCi0JewotCWNhc2UgT1NTX0dFVFZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1lOQzoKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1BFRUQ6Ci0JCS8qIHNldCBzYW1wbGluZyByYXRlICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICh2YWwgPiA1NDAwICYmIHZhbCA8IDQ4MDAwKQotCQl7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XQVMsIHZhbCk7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTX1JFUywgdmFsKTsKLQkJfQotCQlyZXR1cm4gMDsKLQotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IC8qIHVuZG9jdW1lbnRlZD8gKi8KLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXZhbCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19XU01DKTsKLQkJCWlmICh2YWwpIHsKLQkJCQl2YWwgfD0gMHgwMjAwOyAgLyogc2V0IFdBU1QgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsICY9IH4weDAyMDA7IC8qIGNsZWFyIFdBU1QgKi8KLQkJCX0KLQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfV1NNQywgdmFsKTsKLQkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXZhbCA9IEFEMTg4OV9SRUFEVyhhZDE4ODlfZGV2LCBBRF9EU19SQU1DKTsKLQkJCWlmICh2YWwpIHsKLQkJCQl2YWwgfD0gMHgwMDAyOyAgLyogc2V0IEFEU1QgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsICY9IH4weDAwMDI7IC8qIGNsZWFyIEFEU1QgKi8KLQkJCX0KLQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNfUkFNQywgdmFsKTsKLQkJfQotCi0JCXJldHVybiAwOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6Ci0JCXJldHVybiBwdXRfdXNlcihETUFfU0laRSwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKLQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAodmFsID09IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAKLQkJCQlhZDE4ODlfc2V0X2FkY19mbXQoZGV2LCB2YWwpOwotCi0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIAotCQkJCWFkMTg4OV9zZXRfd2F2X2ZtdChkZXYsIHZhbCk7Ci0JCX0gZWxzZSB7Ci0JCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7Ci0JCX0KLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfUE9TVDoKLQkJLyogc2VuZCBhbGwgZGF0YSB0byBkZXZpY2UgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKLQkJLyogbm90IHN1cHBvcnRlZDsgdXNlcyBmaXhlZCBmcmFnbWVudCBzaXplcyAqLwotCQlyZXR1cm4gcHV0X3VzZXIoRE1BX1NJWkUsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKLQljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgotCQkvKiBzcGFjZSBsZWZ0IGluIGRtYSBidWZmZXJzICovCi0JCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRPU1BBQ0UpCi0JCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKLQkJZWxzZQotCQkJZG1hYnVmID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXS5kbWFidWY7Ci0JCWFiaW5mby5mcmFnbWVudHMgPSAxOwotCQlhYmluZm8uZnJhZ3N0b3RhbCA9IDE7Ci0JCWFiaW5mby5mcmFnc2l6ZSA9IERNQV9TSVpFOwotCQlhYmluZm8uYnl0ZXMgPSBETUFfU0laRTsKLQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKLQljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6Ci0JCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6Ci0JY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6Ci0JY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKLQkJYnJlYWs7Ci0JCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6Ci0JCXJldHVybiBwdXRfdXNlcihBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNfV0FTKSwgcCk7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgotCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfTUFQSU5CVUY6Ci0JY2FzZSBTTkRDVExfRFNQX01BUE9VVEJVRjoKLQljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgotCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKLQljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gLUVOT1RUWTsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQkvKiBjaGVjayBtaW5vcjsgb25seSBzdXBwb3J0IC9kZXYvZHNwIGF0bSAqLwotCWlmIChpbWlub3IoaW5vZGUpICE9IDMpCi0JCXJldHVybiAtRU5YSU87Ci0JCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWQxODg5X2RldjsKLQotCWFkMTg4OV9zZXRfd2F2X3JhdGUoYWQxODg5X2RldiwgNDgwMDApOwotCWFkMTg4OV9zZXRfd2F2X2ZtdChhZDE4ODlfZGV2LCBBRk1UX1MxNl9MRSk7Ci0JQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU19XQURBLCAweDA0MDQpOyAvKiBhdHRlbnVhdGlvbiAqLwotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQkvKiBpZiB3ZSBoYXZlIHN0YXRlIGZyZWUgaXQgaGVyZSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZDE4ODlfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWQJCT0gYWQxODg5X3JlYWQsCi0JLndyaXRlCQk9IGFkMTg4OV93cml0ZSwKLQkucG9sbAkJPSBhZDE4ODlfcG9sbCwKLQkuaW9jdGwJCT0gYWQxODg5X2lvY3RsLAotCS5tbWFwCQk9IGFkMTg4OV9tbWFwLAotCS5vcGVuCQk9IGFkMTg4OV9vcGVuLAotCS5yZWxlYXNlCT0gYWQxODg5X3JlbGVhc2UsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAvZGV2L21peGVyIGludGVyZmFjZXMgKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgaW50IGFkMTg4OV9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWlmIChhZDE4ODlfZGV2LT5hYzk3X2NvZGVjLT5kZXZfbWl4ZXIgIT0gaW1pbm9yKGlub2RlKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBhZDE4ODlfZGV2LT5hYzk3X2NvZGVjOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFkMTg4OV9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZDE4ODlfbWl4ZXJfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLmlvY3RsCQk9IGFkMTg4OV9taXhlcl9pb2N0bCwKLQkub3BlbgkJPSBhZDE4ODlfbWl4ZXJfb3BlbiwKLQkucmVsZWFzZQk9IGFkMTg4OV9taXhlcl9yZWxlYXNlLAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQUM5NyBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQgYWQxODg5X2NvZGVjX3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICphYzk3LCB1OCByZWcsIHUxNiB2YWwpCi17Ci0JYWQxODg5X2Rldl90ICpkZXYgPSBhYzk3LT5wcml2YXRlX2RhdGE7Ci0KLQkvL0RCRygiV3JpdGluZyAweCV4IHRvIDB4JWx4XG4iLCB2YWwsIGRldi0+cmVnYmFzZSArIEFEX0FDOTdfQkFTRSArIHJlZyk7Ci0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDOTdfQkFTRSArIHJlZywgdmFsKTsKLX0KLQotc3RhdGljIHUxNiBhZDE4ODlfY29kZWNfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NywgdTggcmVnKQotewotCWFkMTg4OV9kZXZfdCAqZGV2ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwotCS8vREJHKCJSZWFkaW5nIGZyb20gMHglbHhcbiIsIGRldi0+cmVnYmFzZSArIEFEX0FDOTdfQkFTRSArIHJlZyk7Ci0JcmV0dXJuIEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQkFTRSArIHJlZyk7Ci19CQotCi1zdGF0aWMgaW50IGFkMTg4OV9hYzk3X2luaXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBpZCkKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NzsKLQl1MTYgZWlkOwotCi0JaWYgKChhYzk3ID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKSAKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhYzk3LT5wcml2YXRlX2RhdGEgPSBkZXY7Ci0JYWM5Ny0+aWQgPSBpZDsKLQotCWFjOTctPmNvZGVjX3JlYWQgPSBhZDE4ODlfY29kZWNfcmVhZDsKLQlhYzk3LT5jb2RlY193cml0ZSA9IGFkMTg4OV9jb2RlY193cml0ZTsKLQotCWlmIChhYzk3X3Byb2JlX2NvZGVjKGFjOTcpID09IDApIHsKLQkJcHJpbnRrKERFVk5BTUUgIjogYWM5N19wcm9iZV9jb2RlYyBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWVpZCA9IGFkMTg4OV9jb2RlY19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfSUQpOwotCWlmIChlaWQgPT0gMHhmZmZmKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgREVWTkFNRSAiOiBubyBjb2RlYyBhdHRhY2hlZD9cbiIpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWRldi0+YWM5N19mZWF0dXJlcyA9IGVpZDsKLQotCWlmICgoYWM5Ny0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmFkMTg4OV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgcmVnaXN0ZXIgbWl4ZXJcbiIpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWRldi0+YWM5N19jb2RlYyA9IGFjOTc7Ci0JcmV0dXJuIDA7Ci0KLW91dF9mcmVlOgotCWFjOTdfcmVsZWFzZV9jb2RlYyhhYzk3KTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBhZDE4ODlfYWNsaW5rX3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICogcGNpZGV2KQotewotCXUxNiBzdGF0OwotCWludCByZXRyeSA9IDIwMDsKLQlhZDE4ODlfZGV2X3QgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOwotCi0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTX0NDUywgMHg4MDAwKTsgLyogdHVybiBvbiBjbG9jayAqLwotCUFEMTg4OV9SRUFEVyhkZXYsIEFEX0RTX0NDUyk7Ci0KLQlXQUlUXzEwTVMoKTsKLQotCXN0YXQgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpOwotCXN0YXQgfD0gMHgwMDAyOwkJCQkvKiBSZXNldCBEaXNhYmxlICovCi0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDOTdfQUNJQywgc3RhdCk7Ci0JKHZvaWQpIEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDOTdfQUNJQyk7CS8qIGZsdXNoIHBvc3RlZCB3cml0ZSAqLwotCi0JdWRlbGF5KDEwKTsKLQotCXN0YXQgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpOwotCXN0YXQgfD0gMHgwMDAxOwkJCQkvKiBJbnRlcmZhY2UgRW5hYmxlICovCi0JQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDOTdfQUNJQywgc3RhdCk7Ci0KLQlkbyB7Ci0JCWlmIChBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpICYgMHg4MDAwKQkvKiBSZWFkeSAqLwotCQkJYnJlYWs7Ci0JCVdBSVRfMTBNUygpOwotCQlyZXRyeS0tOwotCX0gd2hpbGUgKHJldHJ5ID4gMCk7Ci0KLQlpZiAoIXJldHJ5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWQxODg5X2FjbGlua19yZXNldDogY29kZWMgaXMgbm90IHJlYWR5IFsweCV4XVxuIiwKLQkJCSAgICBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQkvKiBUT0RPIHJlc2V0IEFDOTcgY29kZWMgKi8KLQkvKiBUT0RPIHNldCB3YXZlL2FkYyBwY2kgY3RybCBzdGF0dXMgKi8KLQotCXN0YXQgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQzk3X0FDSUMpOwotCXN0YXQgfD0gMHgwMDA0OwkJCQkvKiBBdWRpbyBTdHJlYW0gT3V0cHV0IEVuYWJsZSAqLwotCUFEMTg4OV9XUklURVcoZGV2LCBBRF9BQzk3X0FDSUMsIHN0YXQpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIFBDSSBkZXZpY2UgdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhZDE4ODlfaWRfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX0FOQUxPR19ERVZJQ0VTLCBQQ0lfREVWSUNFX0lEX0FEMTg4OUpTLCBQQ0lfQU5ZX0lELCAKLQkgIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKURFVk5BTUUgfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFkMTg4OV9pZF90YmwpOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWQxODg5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdTMyIHN0YXQ7Ci0JYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZGV2X2lkOwotCi0Jc3RhdCA9IEFEMTg4OV9SRUFETChkZXYsIEFEX0RNQV9ESVNSKTsKLQotCS8qIGNsZWFyIElTUiAqLwotCUFEMTg4OV9XUklURUwoZGV2LCBBRF9ETUFfRElTUiwgc3RhdCk7Ci0KLQlpZiAoc3RhdCAmIDB4OCkgewkJLyogV0FWSSAqLwotCQlEQkcoIldBViBpbnRlcnJ1cHRcbiIpOwotCQlkZXYtPnN0YXRzLndhdl9pbnRycysrOwotCQlpZiAoZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1Zi5yZWFkeSkgewotCQkJYWQxODg5X3N0b3Bfd2F2KCZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0pOwkvKiBjbGVhbiB1cCAqLwotCQkJYWQxODg5X3N0YXJ0X3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsJLyogc3RhcnQgbmV3ICovCi0JCX0KLQl9Ci0KLQlpZiAoKHN0YXQgJiAweDIpICYmIGRldi0+c3RhdGVbQURfQURDX1NUQVRFXS5kbWFidWYucmVhZHkpIHsgLyogQURDSSAqLwotCQlEQkcoIkFEQyBpbnRlcnJ1cHRcbiIpOwotCQlkZXYtPnN0YXRzLmFkY19pbnRycysrOwotCX0KLQlpZihzdGF0KQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JcmV0dXJuIElSUV9OT05FOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfaW5pdGNmZyhhZDE4ODlfZGV2X3QgKmRldikKLXsKLQl1MTYgdG1wMTY7Ci0JdTMyIHRtcDMyOwotCi0JLyogbWFrZSBzdXJlIHRoZSBpbnRlcnJ1cHQgYml0cyBhcmUgc2V0dXAgdGhlIHdheSB3ZSB3YW50ICovCi0JdG1wMzIgPSBBRDE4ODlfUkVBREwoZGV2LCBBRF9ETUFfV0FWQ1RSTCk7Ci0JdG1wMzIgJj0gfjB4ZmY7IC8qIGZsYXQgZG1hLCBubyBzZywgbWFzayBvdXQgdGhlIGludHIgYml0cyAqLwotCXRtcDMyIHw9IDB4NjsgIC8qIGludHIgb24gY291bnQsIGxvb3AgKi8KLQlBRDE4ODlfV1JJVEVMKGRldiwgQURfRE1BX1dBVkNUUkwsIHRtcDMyKTsKLQotCS8qIHVubXV0ZS4uLiAqLwotCXRtcDE2ID0gQUQxODg5X1JFQURXKGRldiwgQURfRFNfV0FEQSk7Ci0JdG1wMTYgJj0gfjB4ODA4MDsKLQlBRDE4ODlfV1JJVEVXKGRldiwgQURfRFNfV0FEQSwgdG1wMTYpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhZDE4ODlfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlpbnQgZXJyOwotCWFkMTg4OV9kZXZfdCAqZGV2OwotCXVuc2lnbmVkIGxvbmcgYmFyOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290ID0gTlVMTDsKLQotCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7Ci0JaWYgKChkZXYgPSBhZDE4ODlfYWxsb2NfZGV2KHBjaWRldikpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIGRldik7Ci0JYmFyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7Ci0JCi0gICAgICAgIGlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IG1lbW9yeSByZWdpb24gbm90IGFzc2lnbmVkXG4iKTsKLQkJZ290byBvdXQxOwotCX0KLQotCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGNpZGV2LCAwLCBERVZOQU1FKSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKLQkJZ290byBvdXQxOwotCX0KLQotCWRldi0+cmVnYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShiYXIsIEFEX0RTX0lPTUVNU0laRSk7Ci0JaWYgKCFkZXYtPnJlZ2Jhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogdW5hYmxlIHRvIHJlbWFwIGlvbWVtXG4iKTsKLQkJZ290byBvdXQyOwotCX0KLQotCWlmIChyZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgYWQxODg5X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIERFVk5BTUUsIGRldikgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHRcbiIpOwotCQlnb3RvIG91dDM7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyBERVZOQU1FICI6ICVzIGF0ICVwIElSUSAlZFxuIiwKLQkJKGNoYXIgKillbnQtPmRyaXZlcl9kYXRhLCBkZXYtPnJlZ2Jhc2UsIHBjaWRldi0+aXJxKTsKLQotCWlmIChhZDE4ODlfYWNsaW5rX3Jlc2V0KHBjaWRldikgIT0gMCkKLQkJZ290byBvdXQ0OwotCi0JLyogcmVnaXN0ZXIgL2Rldi9kc3AgKi8KLQlpZiAoKGRldi0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZhZDE4ODlfZm9wcywgLTEpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogY2Fubm90IHJlZ2lzdGVyIC9kZXYvZHNwXG4iKTsKLQkJZ290byBvdXQ0OwotCX0KLQotCWlmICgoZXJyID0gYWQxODg5X2FjOTdfaW5pdChkZXYsIDApKSAhPSAwKQotCQlnb3RvIG91dDU7Ci0KLQkvKiBYWFg6IGNsZWFudXBzICovCi0JaWYgKCgocHJvY19yb290ID0gcHJvY19ta2RpcigiZHJpdmVyL2FkMTg4OSIsIE5VTEwpKSA9PSBOVUxMKSB8fAotCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhYzk3IiwgU19JRlJFR3xTX0lSVUdPLCBwcm9jX3Jvb3QsIGFjOTdfcmVhZF9wcm9jLCBkZXYtPmFjOTdfY29kZWMpID09IE5VTEwgfHwKLQkgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaW5mbyIsIFNfSUZSRUd8U19JUlVHTywgcHJvY19yb290LCBhZDE4ODlfcmVhZF9wcm9jLCBkZXYpID09IE5VTEwpIAotCQlnb3RvIG91dDU7Ci0JCi0JYWQxODg5X2luaXRjZmcoZGV2KTsKLQotCS8vREJHKERFVk5BTUUgIjogRHJpdmVyIGluaXRpYWxpemF0aW9uIGRvbmUhXG4iKTsKLQotCWFkMTg4OV9kZXYgPSBkZXY7Ci0KLQlyZXR1cm4gMDsKLQotb3V0NToKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChkZXYtPmRldl9hdWRpbyk7Ci1vdXQ0OgotCWZyZWVfaXJxKHBjaWRldi0+aXJxLCBkZXYpOwotb3V0MzoKLQlpb3VubWFwKGRldi0+cmVnYmFzZSk7Ci1vdXQyOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwY2lkZXYsIDApOwotb3V0MToKLQlhZDE4ODlfZnJlZV9kZXYoZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBOVUxMKTsKLQotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgYWQxODg5X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQotewotCWFkMTg4OV9kZXZfdCAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0KLQlpZiAoZGV2ID09IE5VTEwpIHJldHVybjsKLQkKLQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldi0+YWM5N19jb2RlYy0+ZGV2X21peGVyKTsKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChkZXYtPmRldl9hdWRpbyk7Ci0JZnJlZV9pcnEocGNpZGV2LT5pcnEsIGRldik7Ci0JaW91bm1hcChkZXYtPnJlZ2Jhc2UpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbihwY2lkZXYsIDApOwotCi0JLyogYW55IGh3IHByb2dyYW1taW5nIG5lZWRlZD8gKi8KLQlhZDE4ODlfZnJlZV9kZXYoZGV2KTsKLQlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBOVUxMKTsKLX0KLQotTU9EVUxFX0FVVEhPUigiUmFuZG9scGggQ2h1bmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQxODg5IFBDSSBBdWRpbyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYWQxODg5X2RyaXZlciA9IHsKLQkubmFtZQkJPSBERVZOQU1FLAotCS5pZF90YWJsZQk9IGFkMTg4OV9pZF90YmwsCi0JLnByb2JlCQk9IGFkMTg4OV9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFkMTg4OV9yZW1vdmUpLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYWQxODg5X2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFkMTg4OV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBhZDE4ODlfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMTg4OV9kcml2ZXIpOwotCXJldHVybjsKLX0KLQotbW9kdWxlX2luaXQoYWQxODg5X2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGFkMTg4OV9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODg5LmggYi9zb3VuZC9vc3MvYWQxODg5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTEzNzYuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FkMTg4OS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLSNpZm5kZWYgX0FEMTg4OV9IXwotI2RlZmluZSBfQUQxODg5X0hfCi0KLSNkZWZpbmUgQURfRFNfV1NNQwkweDAwCS8qIERNQSBpbnB1dCB3YXZlL3N5biBtaXhlciBjb250cm9sICovCi0jZGVmaW5lIEFEX0RTX1JBTUMJMHgwMgkvKiBETUEgb3V0cHV0IHJlc2FtcC9BREMgbWl4ZXIgY29udHJvbCAqLwotI2RlZmluZSBBRF9EU19XQURBCTB4MDQJLyogRE1BIGlucHV0IHdhdmUgYXR0ZW51YXRpb24gKi8KLSNkZWZpbmUgQURfRFNfU1lEQQkweDA2CS8qIERNQSBpbnB1dCBzeW4gYXR0ZW50dWF0aW9uICovCi0jZGVmaW5lIEFEX0RTX1dBUwkweDA4CS8qIHdhdmUgaW5wdXQgc2FtcGxlIHJhdGUgKi8KLSNkZWZpbmUgQURfRFNfUkVTCTB4MGEJLyogcmVzYW1wbGVyIG91dHB1dCBzYW1wbGUgcmF0ZSAqLwotI2RlZmluZSBBRF9EU19DQ1MJMHgwYwkvKiBjaGlwIGNvbnRyb2wvc3RhdHVzICovCi0KLSNkZWZpbmUgQURfRE1BX1JFU0JBCTB4NDAJLyogUkVTIGJhc2UgYWRkciAqLwotI2RlZmluZSBBRF9ETUFfUkVTQ0EJMHg0NAkvKiBSRVMgY3VycmVudCBhZGRyICovCi0jZGVmaW5lIEFEX0RNQV9SRVNCQwkweDQ4CS8qIFJFUyBiYXNlIGNudCAqLwotI2RlZmluZSBBRF9ETUFfUkVTQ0MJMHg0YwkvKiBSRVMgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfQURDQkEJMHg1MAkvKiBBREMgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0NBCTB4NTQKLSNkZWZpbmUgQURfRE1BX0FEQ0JDCTB4NTgKLSNkZWZpbmUgQURfRE1BX0FEQ0NDCTB4NWMKLSNkZWZpbmUgQURfRE1BX1NZTkJBCTB4NjAJLyogU1lOICovCi0jZGVmaW5lIEFEX0RNQV9TWU5DQQkweDY0Ci0jZGVmaW5lIEFEX0RNQV9TWU5CQwkweDY4Ci0jZGVmaW5lIEFEX0RNQV9TWU5DQwkweDZjCi0jZGVmaW5lIEFEX0RNQV9XQVZCQQkweDcwCS8qIFdBViAqLwotI2RlZmluZSBBRF9ETUFfV0FWQ0EJMHg3NAotI2RlZmluZSBBRF9ETUFfV0FWQkMJMHg3OAotI2RlZmluZSBBRF9ETUFfV0FWQ0MJMHg3YwotI2RlZmluZSBBRF9ETUFfUkVTSUNDCTB4ODAJLyogUkVTIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9SRVNJQkMJMHg4NAkvKiBSRVMgaW50ZXJydXB0IGJhc2UgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX0FEQ0lDQwkweDg4CS8qIEFEQyBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfQURDSUJDCTB4OGMJLyogQURDIGludGVycnVwdCBiYXNlIGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9TWU5JQ0MJMHg5MAkvKiBTWU4gaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1NZTklCQwkweDk0CS8qIFNZTiBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLwotI2RlZmluZSBBRF9ETUFfV0FWSUNDCTB4OTgJLyogV0FWIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCi0jZGVmaW5lIEFEX0RNQV9XQVZJQkMJMHg5YwkvKiBXQVYgaW50ZXJydXB0IGJhc2UgY291bnQgKi8KLSNkZWZpbmUgQURfRE1BX1JFU0NUUkwJMHhhMAkvKiBSRVMgUENJIGNvbnRyb2wvc3RhdHVzICovCi0jZGVmaW5lIEFEX0RNQV9BRENDVFJMCTB4YTgJLyogQURDIFBDSSBjb250cm9sL3N0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfU1lOQ1RSTAkweGIwCS8qIFNZTiBQQ0kgY29udHJvbC9zdGF0dXMgKi8KLSNkZWZpbmUgQURfRE1BX1dBVkNUUkwJMHhiOAkvKiBXQVYgUENJIGNvbnRyb2wvc3RhdHVzICovCi0jZGVmaW5lIEFEX0RNQV9ESVNSCTB4YzAJLyogUENJIERNQSBpbnRyIHN0YXR1cyAqLwotI2RlZmluZSBBRF9ETUFfQ0hTUwkweGM0CS8qIFBDSSBETUEgY2hhbm5lbCBzdG9wIHN0YXR1cyAqLwotCi0jZGVmaW5lIEFEX0dQSU9fSVBDCTB4YzgJLyogSU8gcG9ydCBjdHJsICovCi0jZGVmaW5lIEFEX0dQSU9fT1AJMHhjYQkvKiBJTyBvdXRwdXQgc3RhdHVzICovCi0jZGVmaW5lIEFEX0dQSU9fSVAJMHhjYwkvKiBJTyBpbnB1dCBzdGF0dXMgKi8KLQotLyogQUM5NyByZWdpc3RlcnMsIDB4MTAwIC0gMHgxN2Y7IHNlZSBhYzk3LmggKi8KLSNkZWZpbmUgQURfQUM5N19CQVNFICAgIDB4MTAwICAgLyogYWM5NyBiYXNlIHJlZ2lzdGVyICovCi0jZGVmaW5lIEFEX0FDOTdfQUNJQwkweDE4MAkvKiBBQyBMaW5rIGludGVyZmFjZSBjdHJsICovCi0KLS8qIE9QTDM7IEJBUjEgKi8KLSNkZWZpbmUgQURfT1BMX00wQVMJMHgwMAkvKiBNdXNpYzAgYWRkcmVzcy9zdGF0dXMgKi8KLSNkZWZpbmUgQURfT1BMX00wREFUQQkweDAxCS8qIE11c2ljMCBkYXRhICovCi0jZGVmaW5lIEFEX09QTF9NMUEJMHgwMgkvKiBNdXNpYzEgYWRkcmVzcyAqLwotI2RlZmluZSBBRF9PUExfTTFEQVRBCTB4MDMJLyogTXVzaWMxIGRhdGEgKi8KLS8qIDB4MDQtMHgwZiByZXNlcnZlZCAqLwotCi0vKiBNSURJOyBCQVIyICovCi0jZGVmaW5lIEFEX01JREEJCTB4MDAJLyogTUlESSBkYXRhICovCi0jZGVmaW5lIEFEX01JU0MJCTB4MDEJLyogTUlESSBzdGF0dXMvY21kICovCi0vKiAweDAyLTB4ZmYgcmVzZXJ2ZWQgKi8KLQotI2RlZmluZSBBRF9EU19JT01FTVNJWkUJNTEyCi0jZGVmaW5lIEFEX09QTF9NRU1TSVpFCTE2Ci0jZGVmaW5lIEFEX01JRElfTUVNU0laRQkxNgotCi0jZGVmaW5lIEFEX1dBVl9TVEFURQkwCi0jZGVmaW5lIEFEX0FEQ19TVEFURQkxCi0jZGVmaW5lIEFEX01BWF9TVEFURVMJMgotCi0jZGVmaW5lIERNQV9TSVpFCSgxMjgqMTAyNCkKLQotI2RlZmluZSBETUFfRkxBR19NQVBQRUQJMQotCi1zdHJ1Y3QgYWQxODg5X2RldjsKLQotdHlwZWRlZiBzdHJ1Y3QgYWQxODg5X3N0YXRlIHsKLQlzdHJ1Y3QgYWQxODg5X2RldiAqY2FyZDsKLQotCW1vZGVfdCBvcGVuX21vZGU7Ci0Jc3RydWN0IGRtYWJ1ZiB7Ci0JCXVuc2lnbmVkIGludCByYXRlOwotCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOwotCi0JCS8qIGJ1ZiBtYW5hZ2VtZW50ICovCi0JCXNpemVfdCByYXdidWZfc2l6ZTsKLQkJdm9pZCAqcmF3YnVmOwotCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CS8qIG1hcHBlZCBhZGRyZXNzICovCi0JCXVuc2lnbmVkIGxvbmcgZG1hX2xlbjsJLyogbnVtYmVyIG9mIGJ5dGVzIG1hcHBlZCAqLwotCi0JCS8qIGluZGV4ZXMgaW50byByYXdidWYgZm9yIHNldHRpbmcgdXAgRE1BIGVuZ2luZSAqLwotCQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHJkX3B0ciwgd3JfcHRyOwotCi0JCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7IC8qIHRvIHdhaXQgZm9yIGJ1ZiBzZXJ2aWNpbmcgKi8KLQotCQkvKiBPU1MgYml0cyAqLwotCQl1bnNpZ25lZCBpbnQgbWFwcGVkOjE7Ci0JCXVuc2lnbmVkIGludCByZWFkeToxOwotCQl1bnNpZ25lZCBpbnQgb3NzZnJhZ3NoaWZ0OwotCQlpbnQgb3NzbWF4ZnJhZ3M7Ci0JCXVuc2lnbmVkIGludCBzdWJkaXZpc2lvbjsKLQl9IGRtYWJ1ZjsKLQotCXN0cnVjdCBtdXRleCBtdXRleDsKLX0gYWQxODg5X3N0YXRlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGFkMTg4OV9kZXYgewotCXZvaWQgX19pb21lbSAqcmVnYmFzZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpOwotCQotCXNwaW5sb2NrX3QgbG9jazsKLQotCWludCBkZXZfYXVkaW87Ci0KLQkvKiBzdGF0ZXM7IG9uZSBwZXIgY2hhbm5lbDsgcmlnaHQgbm93IG9ubHkgV0FWIGFuZCBBREMgKi8KLQlzdHJ1Y3QgYWQxODg5X3N0YXRlIHN0YXRlW0FEX01BWF9TVEFURVNdOwotCi0JLyogQUM5NyBjb2RlYyAqLwotCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjOwotCXUxNiBhYzk3X2ZlYXR1cmVzOwotCi0JLyogZGVidWdnaW5nIHN0dWZmICovCi0Jc3RydWN0IHN0YXRzIHsKLQkJdW5zaWduZWQgaW50IHdhdl9pbnRycywgYWRjX2ludHJzOwotCQl1bnNpZ25lZCBpbnQgYmxvY2tzLCB1bmRlcnJ1biwgZXJyb3I7Ci0JfSBzdGF0czsKLX0gYWQxODg5X2Rldl90OwotCi10eXBlZGVmIHN0cnVjdCBhZDE4ODlfcmVnIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWludCBvZmZzZXQ7Ci0JaW50IHdpZHRoOwotfSBhZDE4ODlfcmVnX3Q7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkbGliX2NhcmQuYyBiL3NvdW5kL29zcy9hZGxpYl9jYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTdjOWIuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2FkbGliX2NhcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBzb3VuZC9vc3MvYWRsaWJfY2FyZC5jCi0gKgotICogRGV0ZWN0aW9uIHJvdXRpbmUgZm9yIHRoZSBBZExpYiBjYXJkLgotICoKLSAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKLSAqCi0gKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCi0gKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCi0gKiBmb3IgbW9yZSBpbmZvLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKLQotI2luY2x1ZGUgIm9wbDMuaCIKLQotc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9hZGxpYl9jYXJkKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKLXsKLQlod19jb25maWctPnNsb3RzWzBdID0gb3BsM19pbml0KGh3X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5vc3AsIFRISVNfTU9EVUxFKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHJvYmVfYWRsaWIoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQotewotCXJldHVybiBvcGwzX2RldGVjdChod19jb25maWctPmlvX2Jhc2UsIGh3X2NvbmZpZy0+b3NwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOwotCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKLQotbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2FkbGliKHZvaWQpCi17Ci0JY2ZnLmlvX2Jhc2UgPSBpbzsKLQotCWlmIChjZmcuaW9fYmFzZSA9PSAtMSkgewotCQlwcmludGsoS0VSTl9FUlIgImFkbGliOiBtdXN0IHNwZWNpZnkgSS9PIGFkZHJlc3MuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChwcm9iZV9hZGxpYigmY2ZnKSA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlhdHRhY2hfYWRsaWJfY2FyZCgmY2ZnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9hZGxpYih2b2lkKQotewotCXNvdW5kX3VubG9hZF9zeW50aGRldihjZmcuc2xvdHNbMF0pOwotCQotfQotCi1tb2R1bGVfaW5pdChpbml0X2FkbGliKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfYWRsaWIpOwotCi0jaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWRsaWIoY2hhciAqc3RyKQotewotICAgICAgICAvKiBpbyAqLwotCWludCBpbnRzWzJdOwotCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0JCi0JaW8gPSBpbnRzWzFdOwotCi0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJhZGxpYj0iLCBzZXR1cF9hZGxpYik7Ci0jZW5kaWYKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2MXguaCBiL3NvdW5kL29zcy9jczQ2MXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlNDEzMy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0NjF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkxICswLDAgQEAKLSNpZm5kZWYgX19DUzQ2MVhfSAotI2RlZmluZSBfX0NTNDYxWF9ICi0KLS8qCi0gKiAgQ29weXJpZ2h0IChjKSBieSBDaXJydXMgTG9naWMgQ29ycG9yYXRpb24gPHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tPgotICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgotICogIERlZmluaXRpb25zIGZvciBDaXJydXMgTG9naWMgQ1M0NjF4IGNoaXBzCi0gKgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKi8KLQotI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NJUlJVUwotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NJUlJVUyAgICAgICAgICAgIDB4MTAxMwotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMCAgICAgICAweDYwMDEKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIgICAgICAgMHg2MDAzCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1ICAgICAgIDB4NjAwNAotI2VuZGlmCi0KLS8qCi0gKiAgRGlyZWN0IHJlZ2lzdGVycwotICovCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIHJlZ2lzdGVycyBhY2Nlc3NlZCB2aWEgYmFzZSBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIgemVybyBvbiB0aGUgQ1M0NjF4IHBhcnQuCi0gKi8KLSNkZWZpbmUgQkEwX0hJU1IJCQkJMHgwMDAwMDAwMAotI2RlZmluZSBCQTBfSFNSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBCQTBfSElDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBCQTBfRE1TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBCQTBfSFNBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAotI2RlZmluZSBCQTBfSERBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAotI2RlZmluZSBCQTBfSERNUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOAotI2RlZmluZSBCQTBfSERDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQwotI2RlZmluZSBCQTBfUEZNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBCQTBfUEZDVjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNAotI2RlZmluZSBCQTBfUEZDVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOAotI2RlZmluZSBCQTBfUENJQ0ZHMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAotI2RlZmluZSBCQTBfUENJQ0ZHMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNAotI2RlZmluZSBCQTBfUENJQ0ZHMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwOAotI2RlZmluZSBCQTBfUENJQ0ZHMEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwQwotI2RlZmluZSBCQTBfUENJQ0ZHMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxMAotI2RlZmluZSBCQTBfUENJQ0ZHMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxNAotI2RlZmluZSBCQTBfUENJQ0ZHMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxOAotI2RlZmluZSBCQTBfUENJQ0ZHMUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxQwotI2RlZmluZSBCQTBfUENJQ0ZHMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyMAotI2RlZmluZSBCQTBfUENJQ0ZHMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyNAotI2RlZmluZSBCQTBfUENJQ0ZHMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyOAotI2RlZmluZSBCQTBfUENJQ0ZHMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyQwotI2RlZmluZSBCQTBfUENJQ0ZHMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzMAotI2RlZmluZSBCQTBfUENJQ0ZHMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzNAotI2RlZmluZSBCQTBfUENJQ0ZHMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzOAotI2RlZmluZSBCQTBfUENJQ0ZHM0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzQwotI2RlZmluZSBCQTBfQ0xLQ1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBCQTBfQ0xLQ1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAotI2RlZmluZSBCQTBfUExMTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwOAotI2RlZmluZSBCQTBfUExMQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwQwotI2RlZmluZSBCQTBfRlJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxMCAKLSNkZWZpbmUgQkEwX0NGTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTQKLSNkZWZpbmUgQkEwX0NGTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTgKLSNkZWZpbmUgQkEwX1NFUk1DMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjAKLSNkZWZpbmUgQkEwX1NFUk1DMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjQKLSNkZWZpbmUgQkEwX1NFUkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjgKLSNkZWZpbmUgQkEwX1NFUkMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MkMKLSNkZWZpbmUgQkEwX1NFUkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzAKLSNkZWZpbmUgQkEwX1NFUkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzQKLSNkZWZpbmUgQkEwX1NFUkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzgKLSNkZWZpbmUgQkEwX1NFUkJTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0M0MKLSNkZWZpbmUgQkEwX1NFUkJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDAKLSNkZWZpbmUgQkEwX1NFUkJDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDQKLSNkZWZpbmUgQkEwX1NFUkJBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDgKLSNkZWZpbmUgQkEwX1NFUkJDRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NEMKLSNkZWZpbmUgQkEwX1NFUkJXUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTAKLSNkZWZpbmUgQkEwX1NFUkJSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTQKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEJBMF9BU0VSX0ZBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDU4Ci0jZW5kaWYKLSNkZWZpbmUgQkEwX0FDQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjAKLSNkZWZpbmUgQkEwX0FDU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjQKLSNkZWZpbmUgQkEwX0FDT1NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjgKLSNkZWZpbmUgQkEwX0FDQ0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NkMKLSNkZWZpbmUgQkEwX0FDQ0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzAKLSNkZWZpbmUgQkEwX0FDSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzQKLSNkZWZpbmUgQkEwX0FDU0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzgKLSNkZWZpbmUgQkEwX0FDU0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0N0MKLSNkZWZpbmUgQkEwX0pTUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODAKLSNkZWZpbmUgQkEwX0pTQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODQKLSNkZWZpbmUgQkEwX0pTQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODgKLSNkZWZpbmUgQkEwX0pTQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OEMKLSNkZWZpbmUgQkEwX01JRENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTAKLSNkZWZpbmUgQkEwX01JRFNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTQKLSNkZWZpbmUgQkEwX01JRFdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTgKLSNkZWZpbmUgQkEwX01JRFJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OUMKLSNkZWZpbmUgQkEwX0pTSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QTAKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEJBMF9BU0VSX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEE0Ci0jZW5kaWYKLSNkZWZpbmUgQkEwX0NGR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjAKLSNkZWZpbmUgQkEwX1NTVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjQKLSNkZWZpbmUgQkEwX0dQSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjgKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEJBMF9FR1BJT0RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEJDCi0jZGVmaW5lIEJBMF9FR1BJT1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEMwCi0jZGVmaW5lIEJBMF9FR1BJT1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEM0Ci0jZGVmaW5lIEJBMF9FR1BJT1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEM4Ci0jZGVmaW5lIEJBMF9FR1BJT1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNENDCi0jZGVmaW5lIEJBMF9TRVJDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQwCi0jZGVmaW5lIEJBMF9TRVJDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQ0Ci0jZGVmaW5lIEJBMF9TRVJBQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQ4Ci0jZGVmaW5lIEJBMF9BQ0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEUwCi0jZGVmaW5lIEJBMF9BQ1NUUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEU0Ci0jZGVmaW5lIEJBMF9BQ09TVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEU4Ci0jZGVmaW5lIEJBMF9BQ0NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEVDCi0jZGVmaW5lIEJBMF9BQ0NEQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEYwCi0jZGVmaW5lIEJBMF9BQ0lTVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY0Ci0jZGVmaW5lIEJBMF9BQ1NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY4Ci0jZGVmaW5lIEJBMF9BQ1NEQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEZDCi0jZGVmaW5lIEJBMF9JT1RBQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTAwCi0jZGVmaW5lIEJBMF9JT1RBQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA0Ci0jZGVmaW5lIEJBMF9JT1RBQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA4Ci0jZGVmaW5lIEJBMF9JT1RBQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTBDCi0jZGVmaW5lIEJBMF9JT1RBQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTEwCi0jZGVmaW5lIEJBMF9JT1RBQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTE0Ci0jZGVmaW5lIEJBMF9JT1RBQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTE4Ci0jZGVmaW5lIEJBMF9JT1RBQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTFDCi0jZGVmaW5lIEJBMF9JT1RBQzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTIwCi0jZGVmaW5lIEJBMF9JT1RBQzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTI0Ci0jZGVmaW5lIEJBMF9JT1RBQzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTI4Ci0jZGVmaW5lIEJBMF9JT1RBQzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTJDCi0jZGVmaW5lIEJBMF9JT1RGUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQwCi0jZGVmaW5lIEJBMF9JT1RGUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQ0Ci0jZGVmaW5lIEJBMF9JT1RGUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQ4Ci0jZGVmaW5lIEJBMF9JT1RGUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTRDCi0jZGVmaW5lIEJBMF9JT1RGUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTUwCi0jZGVmaW5lIEJBMF9JT1RGUjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTU0Ci0jZGVmaW5lIEJBMF9JT1RGUjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTU4Ci0jZGVmaW5lIEJBMF9JT1RGUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTVDCi0jZGVmaW5lIEJBMF9JT1RGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTgwCi0jZGVmaW5lIEJBMF9JT1RSUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTg0Ci0jZGVmaW5lIEJBMF9JT1RGUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTg4Ci0jZGVmaW5lIEJBMF9JT1RDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNThDCi0jZGVmaW5lIEJBMF9EUENJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTkwCi0jZGVmaW5lIEJBMF9EUENJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk0Ci0jZGVmaW5lIEJBMF9EUENJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk4Ci0jZGVmaW5lIEJBMF9QQ1BDSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjAwCi0jZGVmaW5lIEJBMF9QQ1BDSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA0Ci0jZGVmaW5lIEJBMF9QQ1BDSUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA4Ci0jZGVmaW5lIEJBMF9FUENJUE1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjEwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBtZW1vcmllcyBhY2Nlc3NlZCB2aWEKLSAqICBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgb25lIG9uIHRoZSBDUzQ2MXggcGFydC4KLSAqLwotI2RlZmluZSBCQTFfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBCQTFfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBCQTFfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBCQTFfU1BfUkVHCQkJCTB4MDAwMzAwMDAKLSNkZWZpbmUgQkExX1NQQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgQkExX0RSRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDQKLSNkZWZpbmUgQkExX0RTUldQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDgKLSNkZWZpbmUgQkExX1RXUFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMEMKLSNkZWZpbmUgQkExX1NQV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMTAKLSNkZWZpbmUgQkExX1NQSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMTQKLSNkZWZpbmUgQkExX0ZHUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMjAKLSNkZWZpbmUgQkExX1NQQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMjgKLSNkZWZpbmUgQkExX1NEU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMkMKLSNkZWZpbmUgQkExX0ZSTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzAKLSNkZWZpbmUgQkExX0ZSQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzQKLSNkZWZpbmUgQkExX0ZSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzgKLSNkZWZpbmUgQkExX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IHN0YXR1cwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEhJU1JfVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEhJU1JfVkMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEhJU1JfVkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEhJU1JfVkMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEhJU1JfVkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEhJU1JfVkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEhJU1JfVkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEhJU1JfVkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEhJU1JfVkM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEhJU1JfVkM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEhJU1JfVkM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEhJU1JfVkMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEhJU1JfVkMxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIEhJU1JfVkMxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEhJU1JfVkMxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEhJU1JfVkMxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEhJU1JfVkMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEhJU1JfSU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEhJU1JfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEhJU1JfRE1BSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIEhJU1JfRlJPVlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCi0jZGVmaW5lIEhJU1JfTUlESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jaWZkZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRTAwMDAwCi0jZWxzZQotI2RlZmluZSBISVNSX1NCSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBISVNSX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkMwMDAwMAotI2VuZGlmCi0jZGVmaW5lIEhJU1JfSDBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhJU1JfSU5URU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IHNpZ25hbCByZWdpc3RlciAwLgotICovCi0jZGVmaW5lIEhTUjBfVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIEhTUjBfVkMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEhTUjBfVkMxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEhTUjBfVkMxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEhTUjBfVkMxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEhTUjBfVkMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEhTUjBfVkMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEhTUjBfVkMyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEhTUjBfVkMyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIEhTUjBfVkMyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEhTUjBfVkMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEhTUjBfVkMyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEhTUjBfVkMyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIEhTUjBfVkMyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEhTUjBfVkMyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIEhTUjBfVkMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEhTUjBfVkMzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEhTUjBfVkMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIEhTUjBfVkMzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEhTUjBfVkMzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIEhTUjBfVkMzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCi0jZGVmaW5lIEhTUjBfVkMzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIEhTUjBfVkMzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEhTUjBfVkMzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0jZGVmaW5lIEhTUjBfVkMzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEhTUjBfVkM0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IGludGVycnVwdCBjb250cm9sCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSElDUl9JRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSElDUl9DSEdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRE1TUl9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRE1TUl9IUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRE1TUl9TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRE1TUl9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIHNvdXJjZSBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSFNBUl9IT1NUX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgSFNBUl9EU1BfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSFNBUl9NRU1JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKLSNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ETUVNMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ETUVNMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgSFNBUl9NRU1JRF9TUF9QTUVNICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ERUJVRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgSFNBUl9NRU1JRF9PTU5JX01FTSAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKLSNkZWZpbmUgSFNBUl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSFNBUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBIREFSX0hPU1RfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBIREFSX0RTUF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBIREFSX01FTUlEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSBIREFSX01FTUlEX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIREFSX01FTUlEX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBIREFSX01FTUlEX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBIREFSX01FTUlEX1NQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotI2RlZmluZSBIREFSX01FTUlEX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAotI2RlZmluZSBIREFSX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBIREFSX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBIRE1SX0FDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRjAwMAotI2RlZmluZSBIRE1SX0FDXzhfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBIRE1SX0FDX01fUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBIRE1SX0FDX0JfTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBIRE1SX0FDX1NfVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBIRENSX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGRgotI2RlZmluZSBIRENSX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBIRENSX09QVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBIRENSX1dCRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBIRENSX1dCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBIRENSX0RNU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAotI2RlZmluZSBIRENSX0RNU19MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIRENSX0RNU18xNl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBIRENSX0RNU18zMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBIRENSX0RNU182NF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDAwMAotI2RlZmluZSBIRENSX0RNU18xMjhfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBIRENSX0RNU18yNTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAotI2RlZmluZSBIRENSX0RNU181MTJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAotI2RlZmluZSBIRENSX0RNU18xMDI0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAotI2RlZmluZSBIRENSX0RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBIRENSX1NNU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAotI2RlZmluZSBIRENSX1NNU19MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBIRENSX1NNU18xNl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBIRENSX1NNU18zMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBIRENSX1NNU182NF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBIRENSX1NNU18xMjhfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBIRENSX1NNU18yNTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg1MDAwMDAwMAotI2RlZmluZSBIRENSX1NNU181MTJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMAotI2RlZmluZSBIRENSX1NNU18xMDI0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAotI2RlZmluZSBIRENSX1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBIRENSX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBjb250cm9sCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUEZNQ19DMVNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKLSNkZWZpbmUgUEZNQ19DMUVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUEZNQ19DMVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgUEZNQ19DMlNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAwMDAKLSNkZWZpbmUgUEZNQ19DMkVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgUEZNQ19DMlJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgUEZNQ19DMVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUEZNQ19DMlNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFBGTUNfQlVTX0dSQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBGTUNfR1JBTlRfQUZURVJfUkVRICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFBGTUNfVFJBTlNBQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFBGTUNfRFdPUkRfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFBGTUNfU0xBVkVfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFBGTUNfU0xBVkVfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFBGTUNfUFJFRU1QVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFBGTUNfRElTQ09OTkVDVF9SRVRSWSAgICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFBGTUNfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFBGTUNfQlVTX09XTkVSU0hJUCAgICAgICAgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIFBGTUNfVFJBTlNBQ1RJT05fTEFHICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBQRk1DX1BDSV9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgUEZNQ19TRVJJQUxfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFBGTUNfU1BfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAxMwotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSAxCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUEZDVjFfUEMxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgUEZDVjFfUEMxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgdmFsdWUgMgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFBGQ1YyX1BDMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCi0jZGVmaW5lIFBGQ1YyX1BDMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyIDEuCi0gKi8KLSNkZWZpbmUgQ0xLQ1IxX09TQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ0xLQ1IxX09TQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQ0xLQ1IxX1BMTFNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKLSNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1NFUklBTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0xLQ1IxX1BMTFNTX0NSWVNUQUwgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1BDSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKLSNkZWZpbmUgQ0xLQ1IxX1BMTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQ0xLQ1IxX1NXQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQ0xLQ1IxX1BMTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMi4KLSAqLwotI2RlZmluZSBDTEtDUjJfUERJVlNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgotI2RlZmluZSBDTEtDUjJfUERJVlNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBDTEtDUjJfUERJVlNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBDTEtDUjJfUERJVlNfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBDTEtDUjJfUERJVlNfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2RlZmluZSBDTEtDUjJfUERJVlNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBDTEtDUjJfUERJVlNfMTYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUExMIG11bHRpcGxpZXIgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgUExMTV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLSNkZWZpbmUgUExMTV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBMTCBjYXBhY2l0b3IgY29lZmZpY2llbnQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBQTExDQ19DRFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2lmbmRlZiBOT19DUzQ2MTAKLSNkZWZpbmUgUExMQ0NfQ0RSXzI0MF8zNTBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUExMQ0NfQ0RSXzE4NF8yNjVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUExMQ0NfQ0RSXzE0NF8yMDVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUExMQ0NfQ0RSXzExMV8xNjBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgUExMQ0NfQ0RSXzg3XzEyM19NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUExMQ0NfQ0RSXzY3Xzk2X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKLSNkZWZpbmUgUExMQ0NfQ0RSXzUyXzc0X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgUExMQ0NfQ0RSXzQ1XzU4X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLSNlbmRpZgotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgUExMQ0NfQ0RSXzI3MV8zOThfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUExMQ0NfQ0RSXzIyN18zMzBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUExMQ0NfQ0RSXzE2N18yMzlfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUExMQ0NfQ0RSXzE1MF8yMTVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgUExMQ0NfQ0RSXzEwN18xNTRfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUExMQ0NfQ0RSXzk4XzE0MF9NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKLSNkZWZpbmUgUExMQ0NfQ0RSXzczXzEwNF9NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgUExMQ0NfQ0RSXzYzXzkwX01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLSNlbmRpZgotI2RlZmluZSBQTExDQ19MUEZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAotI2lmbmRlZiBOT19DUzQ2MTAKLSNkZWZpbmUgUExMQ0NfTFBGXzIzODUwXzYwMDAwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUExMQ0NfTFBGXzc5NjBfMjYyOTBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUExMQ0NfTFBGXzQxNjBfMTA5ODBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKLSNkZWZpbmUgUExMQ0NfTFBGXzE3NDBfNDU4MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgUExMQ0NfTFBGXzcyNF8xOTEwX0tIWiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKLSNkZWZpbmUgUExMQ0NfTFBGXzMxN183OThfS0haICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKLSNlbmRpZgotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgUExMQ0NfTFBGXzI1NTgwXzY0NTMwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgUExMQ0NfTFBGXzE0MzYwXzM3MjcwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUExMQ0NfTFBGXzYxMDBfMTYwMjBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKLSNkZWZpbmUgUExMQ0NfTFBGXzI1NDBfNjY5MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgUExMQ0NfTFBGXzEwNTBfMjc4MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKLSNkZWZpbmUgUExMQ0NfTFBGXzQ1MF8xMTYwX0tIWiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZmVhdHVyZSByZXBvcnRpbmcgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRlJSX0ZBQl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgRlJSX01BU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKLSNpZmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRlJSX0NGT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRTAKLSNlbHNlCi0jZGVmaW5lIEZSUl9DRk9QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwRkUwCi0jZW5kaWYKLSNkZWZpbmUgRlJSX0NGT1BfTk9UX0RWRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRlJSX0NGT1BfQTNEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRlJSX0NGT1BfMTI4X1BJTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEZSUl9DRk9QX0NTNDI4MCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZW5kaWYKLSNkZWZpbmUgRlJSX0ZBQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRlJSX01BU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRlJSX0NGT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDUKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZCAxCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQ1M0MjNYICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQUM5NyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQ1JZU1RBTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfRFVBTF9BQzk3ICAgICAgICAgICAgIDB4MDAwMDAwMDMKLSNkZWZpbmUgQ0ZMMV9WQUxJRF9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZCAyCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQ0ZMMl9WQUxJRF9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IG1hc3RlciBjb250cm9sCi0gKiAgcmVnaXN0ZXIgMS4KLSAqLwotI2RlZmluZSBTRVJNQzFfTVNQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJNQzFfUFRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQotI2RlZmluZSBTRVJNQzFfUFRDX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJNQzFfUFRDX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJNQzFfUFRDX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJNQzFfUExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBTRVJNQzFfWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKLSAqICByZWdpc3RlciAyLgotICovCi0jZGVmaW5lIFNFUk1DMl9MUk9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUk1DMl9NQ09FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNFUk1DMl9NQ0RJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAxIGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDMV9TTzFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDMV9TTzFGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQotI2RlZmluZSBTRVJDMV9TTzFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDMV9TTzFGX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJDMV9TTzFGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJDMV9TTzFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgMiBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQzJfU0kxRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzJfU0kxRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEUKLSNkZWZpbmUgU0VSQzJfU0kxRl9DUzQyM1ggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQzJfU0kxRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSQzJfU0kxRl9BREMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU0VSQzJfU0kxRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDMgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkMzX1NPMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkMzX1NPMkZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2Ci0jZGVmaW5lIFNFUkMzX1NPMkZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFNFUkMzX1NPMkZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA0IGNvbmZpZ3VyYXRpb24KLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRVJDNF9TTzNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDNF9TTzNGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgotI2RlZmluZSBTRVJDNF9TTzNGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBTRVJDNF9TTzNGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNSBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQzVfU0kyRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQzVfU0kyRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgU0VSQzVfU0kyRl9BREMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQzVfU0kyRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHNhbXBsZQotICogIHBvaW50ZXIgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQlNQX0ZTUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgU0VSQlNQX0ZTUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHN0YXR1cwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkJTVF9SUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNFUkJTVF9XQlNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciBjb21tYW5kCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQkNNX1JEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQkNNX1dSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIGFkZHJlc3MKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTRVJCQURfRkFEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2Vsc2UKLSNkZWZpbmUgU0VSQkFEX0ZBRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRkYKLSNlbmRpZgotI2RlZmluZSBTRVJCQURfRkFEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IKLSAqICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkJDRl9IQlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciB3cml0ZQotICogIHBvcnQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU0VSQldQX0ZXRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRkZGRkYKLSNkZWZpbmUgU0VSQldQX0ZXRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHJlYWQKLSAqICBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNFUkJSUF9GUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEZGRkZGCi0jZGVmaW5lIFNFUkJSUF9GUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBhc3luYyBGSUZPIGFkZHJlc3MgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFTRVJfRkFERFJfQTFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMUZGCi0jZGVmaW5lIEFTRVJfRkFERFJfRU4xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEFTRVJfRkFERFJfQTJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxRkYwMDAwCi0jZGVmaW5lIEFTRVJfRkFERFJfRU4yICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIEFTRVJfRkFERFJfQTFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFTRVJfRkFERFJfQTJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNgotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNDVExfUlNUTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNDVExfRVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNDVExfVkZSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNDVExfRENWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNDVExfQ1JXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNDVExfQVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDQ1RMX1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDU1RTX0NSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDU1RTX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ1NUU19XS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IG91dHB1dCBzbG90IHZhbGlkCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNPU1ZfU0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQUNPU1ZfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQUNPU1ZfU0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQUNPU1ZfU0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQUNPU1ZfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgQUNPU1ZfU0xWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgQUNPU1ZfU0xWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQUNPU1ZfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgQUNPU1ZfU0xWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgQUNPU1ZfU0xWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQUNDQURfQ0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgQUNDQURfQ0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBkYXRhIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDQ0RBX0NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEFDQ0RBX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBBQ0lTVl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ0lTVl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ0lTVl9JU1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ0lTVl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ0lTVl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ0lTVl9JU1Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBQ0lTVl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBBQ0lTVl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBBQ0lTVl9JU1YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBQ0lTVl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgYWRkcmVzcwotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDU0FEX1NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCi0jZGVmaW5lIEFDU0FEX1NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEFDU0RBX1NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEFDU0RBX1NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBwb2xsL3RyaWdnZXIKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBKU1BUX0NBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBKU1BUX0NBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBKU1BUX0NCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBKU1BUX0NCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBKU1BUX0JBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBKU1BUX0JBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBKU1BUX0JCMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBKU1BUX0JCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBKU0NUTF9TUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBKU0NUTF9TUF9TTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fU0xPVyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fRkFTVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBKU0NUTF9TUF9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMwotI2RlZmluZSBKU0NUTF9BUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29vcmRpbmF0ZSBwYWlyIDEKLSAqICByZWFkYmFjayByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBKU0MxX1kxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBKU0MxX1gxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBKU0MxX1kxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBKU0MxX1gxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvb3JkaW5hdGUgcGFpciAyCi0gKiAgcmVhZGJhY2sgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgSlNDMl9ZMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSlNDMl9YMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgSlNDMl9ZMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSlNDMl9YMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgTUlEQ1JfVFhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogRW5hYmxlIHRyYW5zbWl0dGluZy4gKi8KLSNkZWZpbmUgTUlEQ1JfUlhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIJLyogRW5hYmxlIHJlY2VpdmluZy4gKi8KLSNkZWZpbmUgTUlEQ1JfUklFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogSW50ZXJydXB0IHVwb24gdHggcmVhZHkuICovCi0jZGVmaW5lIE1JRENSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CS8qIEludGVycnVwdCB1cG9uIHJ4IHJlYWR5LiAqLwotI2RlZmluZSBNSURDUl9NTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAkvKiBFbmFibGUgbWlkaSBsb29wYmFjay4gKi8KLSNkZWZpbmUgTUlEQ1JfTVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAJLyogUmVzZXQgaW50ZXJmYWNlLiAqLwotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSBzdGF0dXMgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgTUlEU1JfVEJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogVHggRklGTyBpcyBmdWxsLiAqLwotI2RlZmluZSBNSURTUl9SQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBSeCBGSUZPIGlzIGVtcHR5LiAqLwotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSB3cml0ZSBwb3J0IHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIE1JRFdQX01XRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCi0jZGVmaW5lIE1JRFdQX01XRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHJlYWQgcG9ydCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBNSURSUF9NUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBNSURSUF9NUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgR1BJTyByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBKU0lPX0RBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBKU0lPX0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBKU0lPX0RCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBKU0lPX0RCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBKU0lPX0FYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBKU0lPX0FZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBKU0lPX0JYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBKU0lPX0JZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgbWFzdGVyIGFzeW5jL3N5bmMgc2VyaWFsCi0gKiAgcG9ydCBlbmFibGUgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFTRVJfTUFTVEVSX01FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgQ0ZHSV9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQ0ZHSV9ET1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgQ0ZHSV9ESU5fRUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgQ0ZHSV9FRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHN1YnN5c3RlbSBJRCBhbmQgdmVuZG9yIElECi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1NWSURfVklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgU1NWSURfU0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgU1NWSURfVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1NWSURfU0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBHUElPIHBpbiBpbnRlcmZhY2UgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgR1BJT1JfVk9MRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgR1BJT1JfVk9MVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgR1BJT1JfU0kyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgR1BJT1JfU0kyT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIGRpcmVjdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT0RSX0dQT0UwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT0RSX0dQT0UxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT0RSX0dQT0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT0RSX0dQT0UzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT0RSX0dQT0U0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT0RSX0dQT0U1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT0RSX0dQT0U2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT0RSX0dQT0U3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT0RSX0dQT0U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBwb2xhcml0eS8KLSAqICB0eXBlIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT1BUUl9HUFBUMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT1BUUl9HUFBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT1BUUl9HUFBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT1BUUl9HUFBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT1BUUl9HUFBUNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT1BUUl9HUFBUNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT1BUUl9HUFBUNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT1BUUl9HUFBUNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT1BUUl9HUFBUOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBzdGlja3kKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRUdQSU9UUl9HUFMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUdQSU9UUl9HUFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRUdQSU9UUl9HUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUdQSU9UUl9HUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRUdQSU9UUl9HUFM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUdQSU9UUl9HUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUdQSU9UUl9HUFM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRUdQSU9UUl9HUFM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRUdQSU9UUl9HUFM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW5nIHdha2V1cAotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFR1BJT1dSX0dQVzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFR1BJT1dSX0dQVzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBFR1BJT1dSX0dQVzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBFR1BJT1dSX0dQVzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBFR1BJT1dSX0dQVzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBFR1BJT1dSX0dQVzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBFR1BJT1dSX0dQVzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBFR1BJT1dSX0dQVzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBFR1BJT1dSX0dQVzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBzdGF0dXMKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRUdQSU9TUl9HUFMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRUdQSU9TUl9HUFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRUdQSU9TUl9HUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRUdQSU9TUl9HUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgRUdQSU9TUl9HUFM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRUdQSU9TUl9HUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRUdQSU9TUl9HUFM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgRUdQSU9TUl9HUFM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRUdQSU9TUl9HUFM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNiBjb25maWd1cmF0aW9uCi0gKiAgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIFNFUkM2X0FTRE8yRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDcgY29uZmlndXJhdGlvbgotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBTRVJDN19BU0RJMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTRVJDN19QT1NJTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTRVJDN19TSVBPTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTRVJDN19TT1NJTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBTRVJDN19TSVNPTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBBQyBsaW5rCi0gKiAgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfMV8wMyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfMl8wICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU0VSQUNDX1RXT19DT0RFQ1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU0VSQUNDX01ETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU0VSQUNDX0hTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDQ1RMMl9SU1ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDQ1RMMl9FU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFDQ1RMMl9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFDQ1RMMl9EQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFDQ1RMMl9DUlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFDQ1RMMl9BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDU1RTMl9DUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFDU1RTMl9WU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKLSAqICByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ09TVjJfU0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ09TVjJfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ09TVjJfU0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ09TVjJfU0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ09TVjJfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ09TVjJfU0xWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBQ09TVjJfU0xWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBBQ09TVjJfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBBQ09TVjJfU0xWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBQ09TVjJfU0xWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgYWRkcmVzcwotICogIHJlZ2lzdGVyIDIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIEFDQ0FEMl9DSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCi0jZGVmaW5lIEFDQ0FEMl9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBkYXRhIHJlZ2lzdGVyCi0gKiAgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNDREEyX0NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgQUNDREEyX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKLSAqICByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ0lTVjJfSVNWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBQ0lTVjJfSVNWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBBQ0lTVjJfSVNWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBBQ0lTVjJfSVNWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBBQ0lTVjJfSVNWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBBQ0lTVjJfSVNWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBBQ0lTVjJfSVNWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBBQ0lTVjJfSVNWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBBQ0lTVjJfSVNWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBBQ0lTVjJfSVNWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBhZGRyZXNzCi0gKiAgcmVnaXN0ZXIgMi4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgQUNTQUQyX1NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgQUNTQUQyX1NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgZGF0YSByZWdpc3RlciAyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBBQ1NEQTJfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBBQ1NEQTJfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBhZGRyZXNzIGFuZCBjb250cm9sCi0gKiAgcmVnaXN0ZXJzIChhbGwgMTIpLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RBQ19TQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBJT1RBQ19NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAotI2RlZmluZSBJT1RBQ19JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAotI2RlZmluZSBJT1RBQ19JT0RDXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBJT1RBQ19JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBJT1RBQ19JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBJT1RBQ19XU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBJT1RBQ19SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBJT1RBQ19XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBJT1RBQ19XRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJT1RBQ19SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBJT1RBQ19TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJT1RBQ19NU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgZmFzdCByZWFkIHJlZ2lzdGVycwotICogIChhbGwgOCkuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVEZSX0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIElPVEZSX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIElPVEZSX1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGMDAwMDAwCi0jZGVmaW5lIElPVEZSX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElPVEZSX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIElPVEZSX0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElPVEZSX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBJT1RGUl9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgRklGTyByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9URklGT19CQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKLSNkZWZpbmUgSU9URklGT19TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDAKLSNkZWZpbmUgSU9URklGT19PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgSU9URklGT19TUElPRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgSU9URklGT19CQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSU9URklGT19TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIHJldHJ5IHJlYWQgZGF0YQotICogIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBJT1RSUkRfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBJT1RSUkRfUkRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2RlZmluZSBJT1RSUkRfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBGSUZPIHBvaW50ZXIKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgSU9URlBfQ0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKLSNkZWZpbmUgSU9URlBfUEFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRjAwMDAKLSNkZWZpbmUgSU9URlBfQ0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSU9URlBfUEFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGNvbnRyb2wgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIElPVENSX0lURCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIElPVENSX0hSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIElPVENSX1NSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIElPVENSX0RUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIElPVENSX0RGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIElPVENSX0REUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIElPVENSX0pURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIElPVENSX1BQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRpcmVjdCBQQ0kgZGF0YSByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgRFBDSURfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgRFBDSURfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGlyZWN0IFBDSSBhZGRyZXNzIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBEUENJQV9BX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgotI2RlZmluZSBEUENJQV9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2VuZGlmCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkaXJlY3QgUENJIGNvbW1hbmQgcmVnaXN0ZXIuCi0gKi8KLSNpZm5kZWYgTk9fQ1M0NjEyCi0jZGVmaW5lIERQQ0lDX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIERQQ0lDX0NfSU9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIERQQ0lDX0NfSU9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIERQQ0lDX0JFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEYwCi0jZW5kaWYKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSByZXF1ZXN0IHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBQQ1BDSVJfUkRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotI2RlZmluZSBQQ1BDSVJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNzAwMAotI2RlZmluZSBQQ1BDSVJfUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBQQ1BDSVJfUkRDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQQ1BDSVJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIGdyYW50IHJlZ2lzdGVyLgotICovIAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgUENQQ0lHX0dEQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKLSNkZWZpbmUgUENQQ0lHX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgUENQQ0lHX0dEQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIG1hc3RlciBlbmFibGUKLSAqICByZWdpc3Rlci4KLSAqLwotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgUENQQ0lFTl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgUENJIHBvd2VyCi0gKiAgbWFuYWdlbWVudCBjb250cm9sIHJlZ2lzdGVyLgotICovCi0jaWZuZGVmIE5PX0NTNDYxMgotI2RlZmluZSBFUENJUE1DX0dXVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBFUENJUE1DX0ZTUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2VuZGlmIAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTUENSX1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBTUENSX1NUUEZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBTUENSX1JVTkZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBTUENSX1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBTUENSX0RSUUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBTUENSX1JTVFNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBTUENSX09SRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2lmbmRlZiBOT19DUzQ2MTIKLSNkZWZpbmUgU1BDUl9QQ0lJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgU1BDUl9PSU5URCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgU1BDUl9DUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNlbmRpZgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGVidWcgaW5kZXggcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRFJFR19SRUdJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKLSNkZWZpbmUgRFJFR19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgRFJFR19SR0JLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDAKLSNkZWZpbmUgRFJFR19UUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCi0jaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQotI2RlZmluZSBEUkVHX1RSQVBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2VuZGlmCi0jZW5kaWYKLSNkZWZpbmUgRFJFR19SRUdJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRFJFR19SR0JLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgRFJFR19SR0JLX1JFR0lEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3N0YKLSNkZWZpbmUgRFJFR19SRUdJRF9SMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgRFJFR19SRUdJRF9SMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKLSNkZWZpbmUgRFJFR19SRUdJRF9SMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKLSNkZWZpbmUgRFJFR19SRUdJRF9SMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTMKLSNkZWZpbmUgRFJFR19SRUdJRF9SNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKLSNkZWZpbmUgRFJFR19SRUdJRF9SNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTUKLSNkZWZpbmUgRFJFR19SRUdJRF9SNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTYKLSNkZWZpbmUgRFJFR19SRUdJRF9SNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTcKLSNkZWZpbmUgRFJFR19SRUdJRF9SOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKLSNkZWZpbmUgRFJFR19SRUdJRF9SOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTkKLSNkZWZpbmUgRFJFR19SRUdJRF9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUEKLSNkZWZpbmUgRFJFR19SRUdJRF9SQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUIKLSNkZWZpbmUgRFJFR19SRUdJRF9SQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKLSNkZWZpbmUgRFJFR19SRUdJRF9SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUQKLSNkZWZpbmUgRFJFR19SRUdJRF9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUUKLSNkZWZpbmUgRFJFR19SRUdJRF9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKLSNkZWZpbmUgRFJFR19SRUdJRF9SQV9CVVNfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgRFJFR19SRUdJRF9SQV9CVVNfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKLSNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTAKLSNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTgKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDEKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDIKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDQKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDUKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDYKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDcKLSNkZWZpbmUgRFJFR19SRUdJRF9JTkRJUkVDVF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAxMEUKLSNkZWZpbmUgRFJFR19SRUdJRF9UT1BfT0ZfU1RBQ0sgICAgICAgICAgICAgICAgIDB4MDAwMDAxMEYKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCi0jaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTggICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRgotI2VuZGlmCi0jZW5kaWYKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0EwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0EwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDEKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDIKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDMKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0EyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDQKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0EzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDUKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0kwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDYKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0kwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDcKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0kxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDgKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0kyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDkKLSNkZWZpbmUgRFJFR19SRUdJRF9TQUdVU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMEEKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEIKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEMKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEQKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEUKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0RNQTAxRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMEYKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0RNQTIzRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTAKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTEKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTIKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTMKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTQKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QyX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTUKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QyX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTYKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTcKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTgKLSNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUEKLSNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUIKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUMKLSNkZWZpbmUgRFJFR19SRUdJRF9DVVJSRU5UX0RNQV9TVFJFQU0gICAgICAgICAgIDB4MDAwMDAyMUQKLSNkZWZpbmUgRFJFR19SRUdJRF9ORVhUX0RNQV9TVFJFQU0gICAgICAgICAgICAgIDB4MDAwMDAyMUUKLSNkZWZpbmUgRFJFR19SRUdJRF9DUFVfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDEKLSNkZWZpbmUgRFJFR19SRUdJRF9TVEFDS19BTkRfUkVQRUFUICAgICAgICAgICAgIDB4MDAwMDAzMDIKLSNkZWZpbmUgRFJFR19SRUdJRF9JTkRFWDAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDQKLSNkZWZpbmUgRFJFR19SRUdJRF9JTkRFWDEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDUKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMF8zICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNF83ICAgICAgICAgICAgICAgIDB4MDAwMDA0MDQKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfOF8xMSAgICAgICAgICAgICAgIDB4MDAwMDA0MDgKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTJfMTUgICAgICAgICAgICAgIDB4MDAwMDA0MEMKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTZfMTkgICAgICAgICAgICAgIDB4MDAwMDA0MTAKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjBfMjMgICAgICAgICAgICAgIDB4MDAwMDA0MTQKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjRfMjcgICAgICAgICAgICAgIDB4MDAwMDA0MTgKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjhfMzEgICAgICAgICAgICAgIDB4MDAwMDA0MUMKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzJfMzUgICAgICAgICAgICAgIDB4MDAwMDA0MjAKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzZfMzkgICAgICAgICAgICAgIDB4MDAwMDA0MjQKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDBfNDMgICAgICAgICAgICAgIDB4MDAwMDA0MjgKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDRfNDcgICAgICAgICAgICAgIDB4MDAwMDA0MkMKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDhfNTEgICAgICAgICAgICAgIDB4MDAwMDA0MzAKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNTJfNTUgICAgICAgICAgICAgIDB4MDAwMDA0MzQKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNTZfNTkgICAgICAgICAgICAgIDB4MDAwMDA0MzgKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjBfNjMgICAgICAgICAgICAgIDB4MDAwMDA0M0MKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjRfNjcgICAgICAgICAgICAgIDB4MDAwMDA0NDAKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjhfNzEgICAgICAgICAgICAgIDB4MDAwMDA0NDQKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzJfNzUgICAgICAgICAgICAgIDB4MDAwMDA0NDgKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzZfNzkgICAgICAgICAgICAgIDB4MDAwMDA0NEMKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODBfODMgICAgICAgICAgICAgIDB4MDAwMDA0NTAKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODRfODcgICAgICAgICAgICAgIDB4MDAwMDA0NTQKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODhfOTEgICAgICAgICAgICAgIDB4MDAwMDA0NTgKLSNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfOTJfOTUgICAgICAgICAgICAgIDB4MDAwMDA0NUMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1NFTEVDVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDEKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDIKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzMgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDMKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzQgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDQKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzUgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDUKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzYgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDYKLSNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzcgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDcKLSNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCi0jaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOCAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOSAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTEgICAgICAgICAgICAgICAgMHgwMDAwMDUxMwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTIgICAgICAgICAgICAgICAgMHgwMDAwMDUxNAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTMgICAgICAgICAgICAgICAgMHgwMDAwMDUxNQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTQgICAgICAgICAgICAgICAgMHgwMDAwMDUxNgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTUgICAgICAgICAgICAgICAgMHgwMDAwMDUxNwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTYgICAgICAgICAgICAgICAgMHgwMDAwMDUxOAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTcgICAgICAgICAgICAgICAgMHgwMDAwMDUxOQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTggICAgICAgICAgICAgICAgMHgwMDAwMDUxQQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTkgICAgICAgICAgICAgICAgMHgwMDAwMDUxQgotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjAgICAgICAgICAgICAgICAgMHgwMDAwMDUxQwotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjEgICAgICAgICAgICAgICAgMHgwMDAwMDUxRAotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjIgICAgICAgICAgICAgICAgMHgwMDAwMDUxRQotI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjMgICAgICAgICAgICAgICAgMHgwMDAwMDUxRgotI2VuZGlmCi0jZW5kaWYKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDEKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDIKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDMKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDQKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDUKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDYKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDcKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDgKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDkKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEEKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEIKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEMKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEQKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEUKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEYKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTAKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTEKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTIKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTMKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTQKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTUKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTYKLSNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTcKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MjAKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfTUlEICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MjgKLSNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MzAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIERNQSBzdHJlYW0gcmVxdWVzdG9yIHdyaXRlCi0gKi8KLSNkZWZpbmUgRFNSV1BfRFNSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgRFNSV1BfRFNSX0JHX1JRICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKLSNkZWZpbmUgRFNSV1BfRFNSX1JRX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHRyYXAgd3JpdGUgcG9ydCByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBUV1BSX1RXX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBUV1BSX1RXX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc3RhY2sgcG9pbnRlciB3cml0ZQotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNQV1JfU1RLUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIFNQV1JfU1RLUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgU1BJUl9GUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgU1BJUl9ET0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgU1BJUl9HUEkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgU1BJUl9HUEkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgU1BJUl9JUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgU1BJUl9JUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgU1BJUl9JUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgU1BJUl9JUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZ1bmN0aW9uYWwgZ3JvdXAgMSByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGR1IxX0YxU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBGR1IxX0YxU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgY2xvY2sgc3RhdHVzIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIFNQQ1NfRlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFNQQ1NfRE9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFNQQ1NfR1BJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFNQQ1NfR1BJMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFNQQ1NfSVAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFNQQ1NfSVAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFNQQ1NfSVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFNQQ1NfSVAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFNQQ1NfU1BSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFNQQ1NfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFNQQ1NfRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFNQQ1NfT1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIFNQQ1NfSVJRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIFNQQ1NfRkdOX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBFMDAwCi0jZGVmaW5lIFNQQ1NfRkdOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMwotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgRE1BIHJlcXVlc3RvciBzdGF0dXMKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBTRFNSX0RDU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgotI2RlZmluZSBTRFNSX0RDU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTRFNSX0RDU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNwotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgcmVnaXN0ZXIuCi0gKi8KLSNkZWZpbmUgRlJNVF9GVFZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgRlJNVF9GVFZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZyYW1lIHRpbWVyIGN1cnJlbnQgY291bnQKLSAqICByZWdpc3Rlci4KLSAqLwotI2RlZmluZSBGUkNDX0ZDQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBGUkNDX0ZDQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgc2F2ZSBjb3VudAotICogIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEZSU0NfRkNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIEZSU0NfRkNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIHZhcmlvdXMgZmxhZ3Mgc3RvcmVkIGluIHRoZSBzY2F0dGVyL2dhdGhlcgotICogIGRlc2NyaXB0b3JzLgotICovCi0jZGVmaW5lIERNQV9TR19ORVhUX0VOVFJZX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwRkY4Ci0jZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX01BU0sgICAgICAgICAgICAgICAgICAweDBGRkYwMDAwCi0jZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIERNQV9TR19MT09QX0VORF9GTEFHICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIERNQV9TR19TSUdOQUxfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIERNQV9TR19TSUdOQUxfUEFHRV9GTEFHICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIERNQV9TR19ORVhUX0VOVFJZX1NISUZUICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX1NISUZUICAgICAgICAgICAgICAgICAxNgotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSBmaWVsZHMgd2l0aGluIHRoZSBvbi1jaGlwIGdlbmVyaWMKLSAqICBETUEgcmVxdWVzdG9yLgotICovCi0jZGVmaW5lIERNQV9SUV9DT05UUk9MMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9DT05UUk9MMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIERNQV9SUV9TT1VSQ0VfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIERNQV9SUV9ERVNUSU5BVElPTl9BRERSICAgICAgICAgICAgICAgICAweDAwMDAwMDBDCi0jZGVmaW5lIERNQV9SUV9ORVhUX1BBR0VfQUREUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIERNQV9SUV9ORVhUX1BBR0VfU0dERVNDICAgICAgICAgICAgICAgICAweDAwMDAwMDE0Ci0jZGVmaW5lIERNQV9SUV9MT09QX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4Ci0jZGVmaW5lIERNQV9SUV9QT1NUX0xPT1BfQUREUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCi0jZGVmaW5lIERNQV9SUV9QQUdFX01BUF9BRERSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmaXJzdCBjb250cm9sIHdvcmQgb2YgdGhlCi0gKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX0MxX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRkYKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RJTkFUSU9OX1NDQVRURVIgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9HQVRIRVIgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RPTkVfRkxBRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX09QVElNSVpFX1NUQVRFICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NBTVBMRV9FTkRfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0ZVTExfUEFHRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0JFRk9SRV9TQU1QTEVfRU5EICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1BBR0VfTUFQX0VSUk9SICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0FUX1NBTVBMRV9FTkQgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0xPT1BfRU5EX1NUQVRFX01BU0sgICAgICAgICAgIDB4MDAwQzAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX05PVF9MT09QX0VORCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0JFRk9SRV9MT09QX0VORCAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxXzJQQUdFX0xPT1BfQkVHSU4gICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0xPT1BfQkVHSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwQzAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1BBR0VfTUFQX01BU0sgICAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1BNX05PTkVfUEVORElORyAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1BNX05FWFRfUEVORElORyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1BNX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1BNX0xPT1BfTkVYVF9QRU5ESU5HICAgICAgICAgIDB4MDAzMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1dSSVRFQkFDS19ERVNUX0ZMQUcgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1dSSVRFQkFDS19TUkNfRkxBRyAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfU0laRV9NQVNLICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTElORUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTYgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMzIgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9ENjQgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTI4ICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMjU2ICAgICAgICAgICAgICAgICAgIDB4MDUwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9ENTEyICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTAyNCAgICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfT05fSE9TVCAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9TSVpFX01BU0sgICAgICAgICAgICAgIDB4NzAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9MSU5FQVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxNiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QzMiAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0Q2NCAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxMjggICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QyNTYgICAgICAgICAgICAgICAgIDB4NTAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0Q1MTIgICAgICAgICAgICAgICAgIDB4NjAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxMDI0ICAgICAgICAgICAgICAgIDB4NzAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9PTl9IT1NUICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MxX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDAKLQotLyoKLSAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlY29uZCBjb250cm9sIHdvcmQgb2YgdGhlCi0gKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfQ0hBTk5FTF9NQVNLICAgICAgICAgIDB4MDAwMDAwM0YKLSNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfU0lHTkFMX01BU0sgICAgICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgRE1BX1JRX0MyX05PX1ZJUlRVQUxfU0lHTkFMICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9FVkVSWV9ETUEgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9TT1VSQ0VfUElOR1BPTkcgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9ERVNUX1BJTkdQT05HICAgICAgICAgIDB4MDAwMDAzMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0FVRElPX0NPTlZFUlRfTUFTSyAgICAgICAgICAgIDB4MDAwMEYwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0FDX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0FDXzhfVE9fMTZfQklUICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0FDX0VORElBTl9DT05WRVJUICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0FDX1NJR05FRF9DT05WRVJUICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfRU5EX01BU0sgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX05PX0xPT1AgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX09ORV9QQUdFX0xPT1AgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1RXT19QQUdFX0xPT1AgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX01VTFRJX1BBR0VfTE9PUCAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9MT09QX0JBQ0sgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9QT1NUX0JFR0lOX1BBR0UgICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfQ0hBTk5FTF9TSElGVCAgICAgICAgIDAKLSNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfRU5EX1NISUZUICAgICAgICAgICAgICAgIDE2Ci0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHdvcmRzCi0gKiAgb2YgdGhlIG9uLWNoaXAgZ2VuZXJpYyBETUEgcmVxdWVzdG9yLgotICovCi0jZGVmaW5lIERNQV9SUV9TRF9BRERSRVNTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCi0jZGVmaW5lIERNQV9SUV9TRF9NRU1PUllfSURfTUFTSyAgICAgICAgICAgICAgICAweDAwMEYwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9TUF9QQVJBTV9BRERSICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9TUF9TQU1QTEVfQUREUiAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9TUF9QUk9HUkFNX0FERFIgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9TUF9ERUJVR19BRERSICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9PTU5JTUVNX0FERFIgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9FTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9FUlJPUl9GTEFHICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0jZGVmaW5lIERNQV9SUV9TRF9BRERSRVNTX1NISUZUICAgICAgICAgICAgICAgICAwCi0KLS8qCi0gKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwYWdlIG1hcCBhZGRyZXNzIHdvcmQgb2YgdGhlCi0gKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCi0gKi8KLSNkZWZpbmUgRE1BX1JRX1BNQV9MT09QX1RISVJEX1BBR0VfRU5UUllfTUFTSyAgIDB4MDAwMDBGRjgKLSNkZWZpbmUgRE1BX1JRX1BNQV9QQUdFX1RBQkxFX01BU0sgICAgICAgICAgICAgIDB4RkZGRkYwMDAKLSNkZWZpbmUgRE1BX1JRX1BNQV9MT09QX1RISVJEX1BBR0VfRU5UUllfU0hJRlQgIDMKLSNkZWZpbmUgRE1BX1JRX1BNQV9QQUdFX1RBQkxFX1NISUZUICAgICAgICAgICAgIDEyCi0KLSNkZWZpbmUgQkExX1ZBUklERUNfQlVGXzEgICAgICAgMHgwMDAKLQotI2RlZmluZSBCQTFfUERUQyAgICAgICAgICAgICAgICAweDBjMCAgICAvKiBCQTFfUExBWV9ETUFfVFJBTlNBQ1RJT05fQ09VTlRfUkVHICovCi0jZGVmaW5lIEJBMV9QRklFICAgICAgICAgICAgICAgIDB4MGM0ICAgIC8qIEJBMV9QTEFZX0ZPUk1BVF8mX0lOVEVSUlVQVF9FTkFCTEVfUkVHICovCi0jZGVmaW5lIEJBMV9QQkEgICAgICAgICAgICAgICAgIDB4MGM4ICAgIC8qIEJBMV9QTEFZX0JVRkZFUl9BRERSRVNTICovCi0jZGVmaW5lIEJBMV9QVk9MICAgICAgICAgICAgICAgIDB4MGY4ICAgIC8qIEJBMV9QTEFZX1ZPTFVNRV9SRUcgKi8KLSNkZWZpbmUgQkExX1BTUkMgICAgICAgICAgICAgICAgMHgyODggICAgLyogQkExX1BMQVlfU0FNUExFX1JBVEVfQ09SUkVDVElPTl9SRUcgKi8KLSNkZWZpbmUgQkExX1BDVEwgICAgICAgICAgICAgICAgMHgyYTQgICAgLyogQkExX1BMQVlfQ09OVFJPTF9SRUcgKi8KLSNkZWZpbmUgQkExX1BQSSAgICAgICAgICAgICAgICAgMHgyYjQgICAgLyogQkExX1BMQVlfUEhBU0VfSU5DUkVNRU5UX1JFRyAqLwotCi0jZGVmaW5lIEJBMV9DQ1RMICAgICAgICAgICAgICAgIDB4MDY0ICAgIC8qIEJBMV9DQVBUVVJFX0NPTlRST0xfUkVHICovCi0jZGVmaW5lIEJBMV9DSUUgICAgICAgICAgICAgICAgIDB4MTA0ICAgIC8qIEJBMV9DQVBUVVJFX0lOVEVSUlVQVF9FTkFCTEVfUkVHICovCi0jZGVmaW5lIEJBMV9DQkEgICAgICAgICAgICAgICAgIDB4MTBjICAgIC8qIEJBMV9DQVBUVVJFX0JVRkZFUl9BRERSRVNTICovCi0jZGVmaW5lIEJBMV9DU1JDICAgICAgICAgICAgICAgIDB4MmM4ICAgIC8qIEJBMV9DQVBUVVJFX1NBTVBMRV9SQVRFX0NPUlJFQ1RJT05fUkVHICovCi0jZGVmaW5lIEJBMV9DQ0kgICAgICAgICAgICAgICAgIDB4MmQ4ICAgIC8qIEJBMV9DQVBUVVJFX0NPRUZGSUNJRU5UX0lOQ1JFTUVOVF9SRUcgKi8KLSNkZWZpbmUgQkExX0NEICAgICAgICAgICAgICAgICAgMHgyZTAgICAgLyogQkExX0NBUFRVUkVfREVMQVlfUkVHICovCi0jZGVmaW5lIEJBMV9DUEkgICAgICAgICAgICAgICAgIDB4MmY0ICAgIC8qIEJBMV9DQVBUVVJFX1BIQVNFX0lOQ1JFTUVOVF9SRUcgKi8KLSNkZWZpbmUgQkExX0NWT0wgICAgICAgICAgICAgICAgMHgyZjggICAgLyogQkExX0NBUFRVUkVfVk9MVU1FX1JFRyAqLwotCi0jZGVmaW5lIEJBMV9DRkcxICAgICAgICAgICAgICAgIDB4MTM0ICAgIC8qIEJBMV9DQVBUVVJFX0ZSQU1FX0dST1VQXzFfUkVHICovCi0jZGVmaW5lIEJBMV9DRkcyICAgICAgICAgICAgICAgIDB4MTM4ICAgIC8qIEJBMV9DQVBUVVJFX0ZSQU1FX0dST1VQXzJfUkVHICovCi0jZGVmaW5lIEJBMV9DQ1NUICAgICAgICAgICAgICAgIDB4MTNjICAgIC8qIEJBMV9DQVBUVVJFX0NPTlNUQU5UX1JFRyAqLwotI2RlZmluZSBCQTFfQ1NQQiAgICAgICAgICAgICAgICAweDM0MCAgICAvKiBCQTFfQ0FQVFVSRV9TUEJfQUREUkVTUyAqLwotCi0vKgotICoKLSAqLwotCi0jZGVmaW5lIENTNDYxWF9NT0RFX09VVFBVVAkoMTw8MCkJIC8qIE1JREkgVUFSVCAtIG91dHB1dCAqLyAKLSNkZWZpbmUgQ1M0NjFYX01PREVfSU5QVVQJKDE8PDEpCSAvKiBNSURJIFVBUlQgLSBpbnB1dCAqLwotCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vCi0vLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgQUM5NyBzaGFkb3cgcmVnaXN0ZXJzLCB3aGljaCBhcHBlYXIKLS8vIGFzIGEgdmlydHVhbCBleHRlbnNpb24gdG8gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciB6ZXJvIG1lbW9yeSByYW5nZS4KLS8vCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSNkZWZpbmUgQUM5N19SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0VMCi0jZGVmaW5lIEFDOTdfQ09ERUNfTlVNQkVSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAotCi0jZGVmaW5lIEJBMF9BQzk3X1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAotI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVk9MVU1FICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMkwKLSNkZWZpbmUgQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSAgICAgICAgICAgICAgIDB4MDAwMDEwMDRMCi0jZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyAgICAgICAgICAgICAweDAwMDAxMDA2TAotI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwOEwKLSNkZWZpbmUgQkEwX0FDOTdfUENfQkVFUF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMEFMCi0jZGVmaW5lIEJBMF9BQzk3X1BIT05FX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBDTAotI2RlZmluZSBCQTBfQUM5N19NSUNfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwRUwKLSNkZWZpbmUgQkEwX0FDOTdfTElORV9JTl9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTBMCi0jZGVmaW5lIEJBMF9BQzk3X0NEX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEyTAotI2RlZmluZSBCQTBfQUM5N19WSURFT19WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNEwKLSNkZWZpbmUgQkEwX0FDOTdfQVVYX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTZMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDE4TAotI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQUwKLSNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMUNMCi0jZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9HQUlOX01JQyAgICAgICAgICAgICAgICAweDAwMDAxMDFFTAotI2RlZmluZSBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgICAgICAgICAgICAgMHgwMDAwMTAyMEwKLSNkZWZpbmUgQkEwX0FDOTdfM0RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjJMCi0jZGVmaW5lIEJBMF9BQzk3X01PREVNX1JBVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI0TAotI2RlZmluZSBCQTBfQUM5N19QT1dFUkRPV04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyNkwKLSNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjhMCi0jZGVmaW5lIEJBMF9BQzk3X0VYVF9BVURJT19QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDJBTAotI2RlZmluZSBCQTBfQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTAyQ0wKLSNkZWZpbmUgQkEwX0FDOTdfUENNX1NVUlJfREFDX1JBVEUgICAgICAgICAgICAgIDB4MDAwMDEwMkVMCi0jZGVmaW5lIEJBMF9BQzk3X1BDTV9MRkVfREFDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDMwTAotI2RlZmluZSBCQTBfQUM5N19QQ01fTFJfQURDX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAwMTAzMkwKLSNkZWZpbmUgQkEwX0FDOTdfTUlDX0FEQ19SQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzRMCi0jZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfQ19MRkUgICAgICAgICAgICAgICAgICAweDAwMDAxMDM2TAotI2RlZmluZSBCQTBfQUM5N182Q0hfVk9MX1NVUlJPVU5EICAgICAgICAgICAgICAgMHgwMDAwMTAzOEwKLSNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfM0EgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0FMCi0jZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9JRCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDNDTAotI2RlZmluZSBCQTBfQUM5N19FWFRfTU9ERU1fUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMTAzRUwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDBMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDQyTAotI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTA0NEwKLSNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDZMCi0jZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX0xFVkVMICAgICAgICAgICAgICAweDAwMDAxMDQ4TAotI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX0xFVkVMICAgICAgICAgICAgMHgwMDAwMTA0QUwKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fQ09ORklHICAgICAgICAgICAgICAgIDB4MDAwMDEwNENMCi0jZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAxMDRFTAotI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9TVElDS1kgICAgICAgICAgICAgICAgMHgwMDAwMTA1MEwKLSNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fV0FLRVVQICAgICAgICAgICAgICAgIDB4MDAwMDEwNTJMCi0jZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAxMDU0TAotI2RlZmluZSBCQTBfQUM5N19NSVNDX01PREVNX0FGRV9TVEFUICAgICAgICAgICAgMHgwMDAwMTA1NkwKLSNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfNTggICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNThMCi0jZGVmaW5lIEJBMF9BQzk3X0NSWVNUQUxfUkVWX05fRkFCX0lEICAgICAgICAgICAweDAwMDAxMDVBTAotI2RlZmluZSBCQTBfQUM5N19URVNUX0FORF9NSVNDX0NUUkwgICAgICAgICAgICAgMHgwMDAwMTA1Q0wKLSNkZWZpbmUgQkEwX0FDOTdfQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNUVMCi0jZGVmaW5lIEJBMF9BQzk3X01JU0NfQ1JZU1RBTF9DT05UUk9MICAgICAgICAgICAweDAwMDAxMDYwTAotI2RlZmluZSBCQTBfQUM5N19MSU5FMV9IWVBSSURfQ1RSTCAgICAgICAgICAgICAgMHgwMDAwMTA2MkwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY0ICAgICAgICAgICAgIDB4MDAwMDEwNjRMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82NiAgICAgICAgICAgICAweDAwMDAxMDY2TAotI2RlZmluZSBCQTBfQUM5N19TUERJRl9DT05UUk9MICAgICAgICAgICAgICAgICAgMHgwMDAwMTA2OEwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZBICAgICAgICAgICAgIDB4MDAwMDEwNkFMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82QyAgICAgICAgICAgICAweDAwMDAxMDZDTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkUgICAgICAgICAgICAgMHgwMDAwMTA2RUwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcwICAgICAgICAgICAgIDB4MDAwMDEwNzBMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83MiAgICAgICAgICAgICAweDAwMDAxMDcyTAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzQgICAgICAgICAgICAgMHgwMDAwMTA3NEwKLSNkZWZpbmUgQkEwX0FDOTdfQ0FMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzZMCi0jZGVmaW5lIEJBMF9BQzk3X0NBTF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDc4TAotI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfN0EgICAgICAgICAgICAgMHgwMDAwMTA3QUwKLSNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0NMCi0jZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9JRDIgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDdFTAotI2VuZGlmCQkJCS8qIF9fQ1M0NjFYX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaCBiL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjNWE0Ni4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvY3M0NjF4X2ltYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICJDV0NJTUFHRS5IIi0tIEZvciBDUzQ2WFguIFZlciAxLjA0Ci0gKiAgICAgIENvcHlyaWdodCAxOTk4LTIwMDEgKGMpIENpcnJ1cyBMb2dpYyBDb3JwLgotICogICAgICBWZXJzaW9uIDEuMDQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpZm5kZWYgX19DU19JTUFHRV9ICi0jZGVmaW5lIF9fQ1NfSU1BR0VfSAotCi0jZGVmaW5lIENMRUFSX19DT1VOVCAgICAgMwotI2RlZmluZSBGSUxMX19DT1VOVCAgICAgIDQKLSNkZWZpbmUgQkExX19EV09SRF9TSVpFICAxMyoxMDI0KzUxMgotCi1zdGF0aWMgc3RydWN0Ci17Ci0gICAgICAgIHVuc2lnbmVkIEJBMV9fRGVzdEJ5dGVPZmZzZXQ7Ci0gICAgICAgIHVuc2lnbmVkIEJBMV9fU291cmNlU2l6ZTsKLX0gQ2xyU3RhdFtDTEVBUl9fQ09VTlRdID17IHsweDAwMDAwMDAwLCAweDAwMDAzMDAwIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAxMDAwMCwgMHgwMDAwMzgwMCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMjAwMDAsIDB4MDAwMDcwMDAgfSB9OwotCi1zdGF0aWMgdTMyIEZpbGxBcnJheTFbXT17Ci0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMTYzLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAyMDAwNDAsMHgwMDAwODAxMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDgwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDA2MDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwOTAwMDgwLDB4MDAwMDAxNzMsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAxMCwweDAwODAwMDAwLDB4MDA5MDAwMDAsCi0weGYyYzAwMDBmLDB4MDAwMDAyMDAsMHgwMDAwMDAwMCwweDAwMDEwNjAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMTYzLDB4MzMwMzAwYzIsCi0weDA2MDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwweDgwMDA4MDAwLAotMHgzZmMwMDAwZiwweDAwMDAwMzAxLDB4MDAwMTA0MDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDBiMDAwMDAsMHgwMGQwODA2ZCwweDMzMDQ4MGMzLAotMHgwNDgwMDAwMCwweDAwMDAwMDAxLDB4MDA4MDAwMDEsMHgwMDAwZmZmZiwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwNjZhMDYwMCwweDA2MzUwMDcwLDB4MDAwMDkyOWQsMHg5MjlkOTI5ZCwKLTB4MDAwMDAwMDAsMHgwMDAwNzM1YSwweDAwMDAwNjAwLDB4MDAwMDAwMDAsCi0weDkyOWQ3MzVhLDB4MDAwMDAwMDAsMHgwMDAxMDAwMCwweDczNWE3MzVhLAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDgwNGYsMHgwMDAwMDBjMywKLTB4MDUwMDAwMDAsMHgwMGEwMDAxMCwweDAwMDAwMDAwLDB4ODAwMDgwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDcwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwODAsMHgwMGEwMDAwMCwweDAwMDA4MDlhLDB4MDAwMDAwYzIsCi0weDA3NDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotMHgwMGM4MDAyOCwweDAwMDA1NTU1LDB4MDAwMDAwMDAsMHgwMDAxMDdhMCwKLTB4MDBjODAwMjgsMHgwMDAwMDBjMiwweDA2ODAwMDAwLDB4MDAwMDAwMDAsCi0weDA2ZTAwMDgwLDB4MDAzMDAwMDAsMHgwMDAwODBiYiwweDAwMDAwMGM5LAotMHgwN2EwMDAwMCwweDA0MDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKLTB4MDBjODAwMjgsMHgwMDAwNTU1NSwweDAwMDAwMDAwLDB4MDAwMDA3ODAsCi0weDAwYzgwMDI4LDB4MDAwMDAwYzUsMHhmZjgwMDAwMCwweDAwMDAwMDAwLAotMHgwMDY0MDA4MCwweDAwYzAwMDAwLDB4MDAwMDgxOTcsMHgwMDAwMDBjOSwKLTB4MDc4MDAwMDAsMHgwNDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA4MDVlLDB4MDAwMDAwYzEsCi0weDAwMDAwMDAwLDB4MDA4MDAwMDAsMHg4MDAwODAwMCwweDgwMDA4MDAwLAotMHgwMDAyMDAwMCwweDAwMDBmZmZmLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH07Ci0KLXN0YXRpYyB1MzIgRmlsbEFycmF5MltdPXsKLTB4OTI5ZDA2MDAsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDAwMDAsCi0weDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweDAwMTAwNjM1LDB4MDYwYjAxM2YsMHgwMDAwMDAwNCwKLTB4MDAwMDAwMDEsMHgwMDdhMDAwMiwweDAwMDAwMDAwLDB4MDY2ZTA2MTAsCi0weDAxMDU5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweGE0MzFhYzc1LDB4MDAwMTczNWEsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4NzM1YTAwNTEsCi0weDAwMDAwMDAwLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwKLTB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDAwMDAwMDAwLDB4MDY0MDAxMzYsCi0weDAwMDAyNzBmLDB4MDAwMTAwMDAsMHgwMDdhMDAwMCwweDAwMDAwMDAwLAotMHgwNjhlMDY0NSwweDAxMDU5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwKLTB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweGE0MzFhYzc1LDB4MDAwMTczNWEsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKLTB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCi0weGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotMHg3MzVhMDEwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH07Ci0KLXN0YXRpYyB1MzIgRmlsbEFycmF5M1tdPXsKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTAwMDR9OwotCi1zdGF0aWMgdTMyIEZpbGxBcnJheTRbXT17Ci0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAwMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDA5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMTE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDIxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLTB4MDAwMjk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCi0weDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAotMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLTB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCi0weDAwMDM5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAotMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwOWM3MzAsMHgwMDAwMTAwMywKLTB4MDAwOGUxOWMsMHgwMDAwMTAwMywweDAwMDA4M2MxLDB4MDAwOTMwNDAsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDExNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMTk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCi0weDAwMDI5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAotMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLTB4MDAwMzE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCi0weDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAotMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLTB4MDAwMGE3MzAsMHgwMDAwMTAwOCwweDAwMGUyNzMwLDB4MDAwMDEwMDIsCi0weDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAotMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLTB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBmNjE5YywweDAwMDAxMDAzLAotMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDM3M2MsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMGVlMTljLDB4MDAwMDEwMDMsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAotMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMjczYywweDAwMDAxMDAwLAotMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwZTY3OWUsMHgwMDAwMTAwMywKLTB4MDAwMDc3MDUsMHgwMDAwMTQwMCwweDAwMGFjNzFlLDB4MDAwMDEwMDMsCi0weDAwMDg3ZmMxLDB4MDAwYzNiZTAsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAotMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTczMCwweDAwMDAxMDAzLAotMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMzcsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMzIsMHgwMDAwMTAwMCwweDAwMDAyNzNkLDB4MDAwMDEwMDAsCi0weDAwMDRhNzMwLDB4MDAwMDEwMDMsMHgwMDAwMGY0MSwweDAwMDk3MTQwLAotMHgwMDAwYTg0MSwweDAwMDliMjQwLDB4MDAwMGEwYzEsMHgwMDA5ZjA0MCwKLTB4MDAwMWM2NDEsMHgwMDA5MzU0MCwweDAwMDFjZWMxLDB4MDAwOWI1YzAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxYmYwNSwweDAwMDNmYzQwLAotMHgwMDAwMjcyNSwweDAwMGFhNDAwLDB4MDAwMTM3MDUsMHgwMDA5M2EwMCwKLTB4MDAwMDAwMmUsMHgwMDA5ZDZjMCwweDAwMDM4NjMwLDB4MDAwMDEwMDQsCi0weDAwMDRlZjBhLDB4MDAwZWI3ODUsMHgwMDAzZmM4YSwweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwweDAwMGM3MGUwLDB4MDAwN2QxODIsMHgwMDAyYzY0MCwKLTB4MDAwMDA2MzAsMHgwMDAwMTAwNCwweDAwMDc5OWI4LDB4MDAwMmM2YzAsCi0weDAwMDMxNzA1LDB4MDAwOTIyNDAsMHgwMDAzOWYwNSwweDAwMDkzMmMwLAotMHgwMDAzNTIwYSwweDAwMDAwMDAwLDB4MDAwNDA3MzEsMHgwMDAwMTAwYiwKLTB4MDAwMTA3MDUsMHgwMDBiMjBjMCwweDAwMDAwMDAwLDB4MDAwZWJhNDQsCi0weDAwMDMyMTA4LDB4MDAwYzYwYzQsMHgwMDA2NTIwOCwweDAwMGMyOTE3LAotMHgwMDA0MDZiMCwweDAwMDAxMDA3LDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKLTB4MDAwMjgxOGUsMHgwMDBjMDAwMCwweDAwMDQ0MTBhLDB4MDAwMDAwMDAsCi0weDAwMDQwNjMwLDB4MDAwMDEwMDcsMHgwMDAyOTcwNSwweDAwMGMwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDAzZmM0MCwKLTB4MDAwMDM3YzEsMHgwMDA5MWI0MCwweDAwMDAzZmMxLDB4MDAwOTExYzAsCi0weDAwMDAzN2MxLDB4MDAwOTU3YzAsMHgwMDAwM2ZjMSwweDAwMDk1MWMwLAotMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5OTFjMCwKLTB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDAzZmMxLDB4MDAwOWQxYzAsCi0weDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAxY2NjMSwweDAwMDkxNWMwLAotMHgwMDAxYzQ0MSwweDAwMDlkODAwLDB4MDAwOWNkYzEsMHgwMDA5MTI0MCwKLTB4MDAwMWM1NDEsMHgwMDA5MWQwMCwweDAwMDljZmMxLDB4MDAwOTUyNDAsCi0weDAwMDFjNzQxLDB4MDAwOTVjODAsMHgwMDBlOGNhOSwweDAwMDk5MjQwLAotMHgwMDBlODVhZCwweDAwMDk1NjQwLDB4MDAwNjljYTksMHgwMDA5OWQ4MCwKLTB4MDAwZTk1MmQsMHgwMDA5OTY0MCwweDAwMGVhY2E5LDB4MDAwOWQ2YzAsCi0weDAwMGVhNWFkLDB4MDAwOTFhNDAsMHgwMDA2YmNhOSwweDAwMDlkZTgwLAotMHgwMDBlYjUyZCwweDAwMDk1YTQwLDB4MDAwZWNjYTksMHgwMDA5OWFjMCwKLTB4MDAwZWM1YWQsMHgwMDA5ZGE0MCwweDAwMGVkY2E5LDB4MDAwOWQzMDAsCi0weDAwMGE2ZTBhLDB4MDAwMDEwMDAsMHgwMDBlZDUyZCwweDAwMDkxZTQwLAotMHgwMDBlZWNhOSwweDAwMDk1ZWMwLDB4MDAwZWU1YWQsMHgwMDA5OWU0MCwKLTB4MDAwNmZjYTksMHgwMDAwMjUwMCwweDAwMGZiMjA4LDB4MDAwYzU5YTAsCi0weDAwMGVmNTJkLDB4MDAwOWRlNDAsMHgwMDA2OGNhOSwweDAwMDkxMmMxLAotMHgwMDA2ODNhZCwweDAwMDk1MjQxLDB4MDAwMjBmMDUsMHgwMDA5OTFjMSwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDg2Zjg4LDB4MDAwMDEwMDAsCi0weDAwMDljZjgxLDB4MDAwYjUzNDAsMHgwMDA5YzcwMSwweDAwMGI5MmMwLAotMHgwMDA5ZGU4MSwweDAwMGJkMzAwLDB4MDAwOWQ2MDEsMHgwMDBiMTcwMCwKLTB4MDAwMWZkODEsMHgwMDBiOWQ4MCwweDAwMDlmNTAxLDB4MDAwYjU3YzAsCi0weDAwMGEwZjgxLDB4MDAwYmQ3NDAsMHgwMDAyMDcwMSwweDAwMGI1YzgwLAotMHgwMDBhMTY4MSwweDAwMGI5N2MwLDB4MDAwMjE2MDEsMHgwMDAwMjUwMCwKLTB4MDAwYTA3MDEsMHgwMDBiOWI0MCwweDAwMGEwZjgxLDB4MDAwYjFiYzAsCi0weDAwMDIxNjgxLDB4MDAwMDJkMDAsMHgwMDAyMGY4MSwweDAwMGJkODAwLAotMHgwMDBhMDcwMSwweDAwMGI1YmMwLDB4MDAwMjE2MDEsMHgwMDAwMzUwMCwKLTB4MDAwYTBmODEsMHgwMDBiNWY0MCwweDAwMGEwNzAxLDB4MDAwYmRiYzAsCi0weDAwMDIxNjgxLDB4MDAwMDNkMDAsMHgwMDAyMGY4MSwweDAwMGIxZDAwLAotMHgwMDBhMDcwMSwweDAwMGIxZmMwLDB4MDAwMjE2MDEsMHgwMDAyMDUwMCwKLTB4MDAwMjBmODEsMHgwMDBiMTM0MSwweDAwMGEwNzAxLDB4MDAwYjlmYzAsCi0weDAwMDIxNjgxLDB4MDAwMjBkMDAsMHgwMDAyMGY4MSwweDAwMGJkZTgwLAotMHgwMDBhMDcwMSwweDAwMGJkZmMwLDB4MDAwMjE2MDEsMHgwMDAyMTUwMCwKLTB4MDAwMjBmODEsMHgwMDBiOTM0MSwweDAwMDIwNzAxLDB4MDAwYjUzYzEsCi0weDAwMDIxNjgxLDB4MDAwMjFkMDAsMHgwMDBhMGY4MSwweDAwMGQwMzgwLAotMHgwMDAwYjYwMSwweDAwMGIxNWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKLTB4MDAwMDdiODEsMHgwMDBiZDFjMCwweDAwMDA3YjAxLDB4MDAwMDAwMDAsCi0weDAwMDA3YjgxLDB4MDAwYjkxYzAsMHgwMDAwN2IwMSwweDAwMGI1N2MwLAotMHgwMDAwN2I4MSwweDAwMGI1MWMwLDB4MDAwMDdiMDEsMHgwMDBiMWI0MCwKLTB4MDAwMDdiODEsMHgwMDBiMTFjMCwweDAwMDg3YjAxLDB4MDAwYzNkYzAsCi0weDAwMDdlNDg4LDB4MDAwZDdlNDUsMHgwMDAwMDAwMCwweDAwMGQ3YTQ0LAotMHgwMDA3ZTQ4YSwweDAwMDAwMDAwLDB4MDAwMTFmMDUsMHgwMDA4NDA4MCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxNzA1LDB4MDAwYjM1NDAsCi0weDAwMDA4YTAxLDB4MDAwYmYwNDAsMHgwMDAwNzA4MSwweDAwMGJiNWMwLAotMHgwMDA1NTQ4OCwweDAwMDAwMDAwLDB4MDAwMGQ0ODIsMHgwMDAzZmM0MCwKLTB4MDAwM2ZjODgsMHgwMDAwMDAwMCwweDAwMDFlNDAxLDB4MDAwYjNhMDAsCi0weDAwMDFlYzgxLDB4MDAwYmQ2YzAsMHgwMDA0ZWYwOCwweDAwMGViNzg0LAotMHgwMDBjODZiMCwweDAwMDAxMDA3LDB4MDAwMDgyODEsMHgwMDBiYjI0MCwKLTB4MDAwMGI4MDEsMHgwMDBiNzE0MCwweDAwMDA3ODg4LDB4MDAwMDAwMDAsCi0weDAwMDAwNzNjLDB4MDAwMDEwMDAsMHgwMDA3ZjE4OCwweDAwMGMwMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwNTUyODgsMHgwMDBjNTU1YywKLTB4MDAwNTUyOGEsMHgwMDBjMDAwMCwweDAwMDlmYTg4LDB4MDAwYzVkMDAsCi0weDAwMDBmYTg4LDB4MDAwMDAwMDAsMHgwMDAwMDAzMiwweDAwMDAxMDAwLAotMHgwMDAwMDczZCwweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDhjMDFjLDB4MDAwMDEwMDMsCi0weDAwMDAyNzA1LDB4MDAwMDEwMDgsMHgwMDA4YjIwMSwweDAwMGMxMzkyLAotMHgwMDAwYmEwMSwweDAwMDAwMDAwLDB4MDAwMDg3MzEsMHgwMDAwMTQwMCwKLTB4MDAwNGMxMDgsMHgwMDBmZTBjNCwweDAwMDU3NDg4LDB4MDAwMDAwMDAsCi0weDAwMGE2Mzg4LDB4MDAwMDEwMDEsMHgwMDA4YjMzNCwweDAwMGJjMTQxLAotMHgwMDAzMDIwZSwweDAwMDAwMDAwLDB4MDAwODg2YjAsMHgwMDAwMTAwOCwKLTB4MDAwMDM2MjUsMHgwMDBjNWRmYSwweDAwMGE2MzhhLDB4MDAwMDEwMDEsCi0weDAwMDgwMjBlLDB4MDAwMDEwMDIsMHgwMDA4YTZiMCwweDAwMDAxMDA4LAotMHgwMDA3ZjMwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDI3MjUsMHgwMDBhOGM0MCwweDAwMDAwMGFlLDB4MDAwMDAwMDAsCi0weDAwMGQ4NjMwLDB4MDAwMDEwMDgsMHgwMDAwMDAwMCwweDAwMGM3NGUwLAotMHgwMDA3ZDE4MiwweDAwMDJkNjQwLDB4MDAwYTg2MzAsMHgwMDAwMTAwOCwKLTB4MDAwNzk5YjgsMHgwMDAyZDZjMCwweDAwMDA3NDhhLDB4MDAwYzNlYzUsCi0weDAwMDc0MjBhLDB4MDAwYzAwMDAsMHgwMDA2MjIwOCwweDAwMGM0MTE3LAotMHgwMDA3MDYzMCwweDAwMDAxMDA5LDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKLTB4MDAwMTAyMmUsMHgwMDAwMDAwMCwweDAwMDNhNjMwLDB4MDAwMDEwMDksCi0weDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAzNiwweDAwMDAxMDAwLAotMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDJhNzMwLDB4MDAwMDEwMDgsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAotMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAyYTczMCwweDAwMDAxMDA4LAotMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwMmE3MDUsMHgwMDAwMTAwOCwKLTB4MDAwMDdhMDEsMHgwMDBjMDAwMCwweDAwMGU2Mjg4LDB4MDAwZDU1MGEsCi0weDAwMDY0MjhhLDB4MDAwMDAwMDAsMHgwMDA2MDczMCwweDAwMDAxMDBhLAotMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDc4ZmIwLDB4MDAwMDEwMGIsCi0weDAwMDU3NDg4LDB4MDAwMDAwMDAsMHgwMDAzM2I5NCwweDAwMDgxMTQwLAotMHgwMDAxODNhZSwweDAwMDAwMDAwLDB4MDAwNzg2YjAsMHgwMDAwMTAwYiwKLTB4MDAwMjJmMDUsMHgwMDBjMzU0NSwweDAwMDBlYjhhLDB4MDAwMDAwMDAsCi0weDAwMDQyNzMxLDB4MDAwMDEwMDMsMHgwMDA3YWFiMCwweDAwMDM0ODgwLAotMHgwMDA0OGZiMCwweDAwMDAxMDBhLDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwKLTB4MDAwMzNiOTQsMHgwMDA4MTE0MCwweDAwMDE4M2FlLDB4MDAwMDAwMDAsCi0weDAwMDgwNmIwLDB4MDAwMDEwMGIsMHgwMDAyMmYwNSwweDAwMDAwMDAwLAotMHgwMDAwNzQwMSwweDAwMDkxMTQwLDB4MDAwNDhmMDUsMHgwMDA5NTFjMCwKLTB4MDAwNDI3MzEsMHgwMDAwMTAwMywweDAwMDA0NzNkLDB4MDAwMDEwMDAsCi0weDAwMGYxOWIwLDB4MDAwYmJjNDcsMHgwMDA4MDAwMCwweDAwMGJmZmM3LAotMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwOGUxOWMsMHgwMDAwMTAwMywweDAwMDA4M2MxLDB4MDAwOTMwNDAsCi0weDAwMDAwZjQxLDB4MDAwOTcxNDAsMHgwMDAwYTg0MSwweDAwMDliMjQwLAotMHgwMDAwYTBjMSwweDAwMDlmMDQwLDB4MDAwMWM2NDEsMHgwMDA5MzU0MCwKLTB4MDAwMWNlYzEsMHgwMDA5YjVjMCwweDAwMDAwMDAwLDB4MDAwZmRjNDQsCi0weDAwMDU1MjA4LDB4MDAwMDAwMDAsMHgwMDAxMDcwNSwweDAwMGEyODgwLAotMHgwMDAwYTIzYSwweDAwMDkzYTAwLDB4MDAwM2ZjOGEsMHgwMDBkZjZjNSwKLTB4MDAwNGVmMGEsMHgwMDBjMDAwMCwweDAwMDEyZjA1LDB4MDAwMzY4ODAsCi0weDAwMDY1MzA4LDB4MDAwYzI5OTcsMHgwMDBkODZiMCwweDAwMDAxMDBhLAotMHgwMDA0NDEwYSwweDAwMGQ0MGM3LDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLTB4MDAwODA3MzAsMHgwMDAwMTAwNCwweDAwMDU2ZjBhLDB4MDAwZWExMDUsCi0weDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwNDczZCwweDAwMDAxMDAwLAotMHgwMDBmMTliMCwweDAwMGJiYzQ3LDB4MDAwODAwMDAsMHgwMDBiZmZjNywKLTB4MDAwMDI3M2QsMHgwMDAwMTAwMCwweDAwMDAwMDAwLDB4MDAwZWJhNDQsCi0weDAwMDQ4ZjA1LDB4MDAwMGY0NDAsMHgwMDAwNzQwMSwweDAwMDBmN2MwLAotMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKLTB4MDAwMDZhODgsMHgwMDBjNzVjNCwweDAwMDAwMDAwLDB4MDAwZTUwODQsCi0weDAwMDAwMDAwLDB4MDAwZWJhNDQsMHgwMDA4NzQwMSwweDAwMGU0NzgyLAotMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKLTB4MDAwMDZhODgsMHgwMDBjNzVjNCwweDAwMDdjMTA4LDB4MDAwYzAwMDAsCi0weDAwMDdlNzIxLDB4MDAwYmVkNDAsMHgwMDAwNWYyNSwweDAwMGJhZGMwLAotMHgwMDAzYmE5NywweDAwMGJlYjgwLDB4MDAwNjU1OTAsMHgwMDBiMmUwMCwKLTB4MDAwMzMyMTcsMHgwMDAwM2VjMCwweDAwMDY1NTkwLDB4MDAwYjhlNDAsCi0weDAwMDNlZDgwLDB4MDAwNDkxYzAsMHgwMDA3M2ZiMCwweDAwMDc0YzgwLAotMHgwMDAyODNhMCwweDAwMDAxMDBjLDB4MDAwZWUzODgsMHgwMDA0Mjk3MCwKLTB4MDAwMDgzMDEsMHgwMDAyMWVmMiwweDAwMGI4ZjE0LDB4MDAwMDAwMGYsCi0weDAwMGM0ZDhkLDB4MDAwMDAwMWIsMHgwMDBkNmRjMiwweDAwMGUwNmM2LAotMHgwMDAwMzJhYywweDAwMGMzOTE2LDB4MDAwNGVkYzIsMHgwMDA3NGM4MCwKLTB4MDAwNzg4OTgsMHgwMDAwMTAwMCwweDAwMDM4ODk0LDB4MDAwMDAwMzIsCi0weDAwMGM0ZDhkLDB4MDAwOTJlMWIsMHgwMDBkNmRjMiwweDAwMGUwNmM2LAotMHgwMDA0ZWRjMiwweDAwMGMxOTU2LDB4MDAwMDcyMmMsMHgwMDAzNGEwMCwKLTB4MDAwNDE3MDUsMHgwMDA5ZWQ0MCwweDAwMDU4NzMwLDB4MDAwMDE0MDAsCi0weDAwMGQ3NDg4LDB4MDAwYzNhMDAsMHgwMDA0OGYwNSwweDAwMDAwMDAwfTsKLQotc3RhdGljIHN0cnVjdAoteyAgIHUzMiBPZmZzZXQ7Ci0gICAgdTMyIFNpemU7Ci0gICAgdTMyICpwRmlsbDsKLX0gRmlsbFN0YXRbRklMTF9fQ09VTlRdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDAwMDAwLCBzaXplb2YoRmlsbEFycmF5MSksIEZpbGxBcnJheTF9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDAxODAwLCBzaXplb2YoRmlsbEFycmF5MiksIEZpbGxBcnJheTJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDEzN2YwLCBzaXplb2YoRmlsbEFycmF5MyksIEZpbGxBcnJheTN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDIwMDAwLCBzaXplb2YoRmlsbEFycmF5NCksIEZpbGxBcnJheTR9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0Nnh4LmMgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWYwZDkuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2NzNDZ4eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0NCArMCwwIEBACi0vKgotICoJQ3J5c3RhbCBTb3VuZEZ1c2lvbiBDUzQ2eHggZHJpdmVyCi0gKgotICoJQ29weXJpZ2h0IDE5OTgtMjAwMSBDaXJydXMgTG9naWMgQ29ycG9yYXRpb24gPHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tPgotICoJCQkJCQk8dHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20+Ci0gKglDb3B5cmlnaHQgMTk5OS0yMDAwIEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KLSAqCUNvcHlyaWdodCAyMDAwIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+Ci0gKgotICoJVGhlIGNvcmUgb2YgdGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIEFMU0EgcHJvamVjdCBkcml2ZXIgYnkgCi0gKglKYXJvc2xhdi4gUGxlYXNlIHNlbmQgSmFyb3NsYXYgdGhlIGNyZWRpdCBmb3IgdGhlIGRyaXZlciBhbmQgCi0gKglyZXBvcnQgYnVncyBpbiB0aGlzIHBvcnQgdG8gPGFsYW5AcmVkaGF0LmNvbT4KLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCUN1cnJlbnQgbWFpbnRhaW5lcnM6Ci0gKgkJQ2lycnVzIExvZ2ljIENvcnBvcmF0aW9uLCBUaG9tYXMgV29sbGVyICh0dykKLSAqCQkJPHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tPgotICoJCU5pbHMgRmFlcmJlciAobmYpCi0gKgkJCTxuaWxzQGtlcm5lbGNvbmNlcHRzLmRlPgotICoJCVRoYW5rcyB0byBEYXZpZCBQb2xsYXJkIGZvciB0ZXN0aW5nLgotICoKLSAqCUNoYW5nZXM6Ci0gKgkyMDAwMDkwOS1uZglDaGFuZ2VkIGNzX3JlYWQsIGNzX3dyaXRlIGFuZCBkcmFpbl9kYWMKLSAqCTIwMDAxMDI1LXR3CVNlcGFyYXRlIFBsYXliYWNrL0NhcHR1cmUgc3RydWN0cyBhbmQgYnVmZmVycy4KLSAqCQkJQWRkZWQgU2NhdHRlci9HYXRoZXIgc3VwcG9ydCBmb3IgUGxheWJhY2suCi0gKgkJCUFkZGVkIENhcHR1cmUuCi0gKgkyMDAwMTAyNy1uZglQb3J0IHRvIGtlcm5lbCAyLjQuMC10ZXN0OSwgc29tZSBjbGVhbi11cHMKLSAqCQkJU3RhcnQgb2YgcG93ZXJtYW5hZ2VtZW50IHN1cHBvcnQgKENTNDZYWF9QTSkuCi0gKgkyMDAwMTEyOC10dwlBZGQgbW9kdWxlIHBhcm0gZm9yIGRlZmF1bHQgYnVmZmVyIG9yZGVyLgotICoJCQlhZGRlZCBETUFfR0ZQIGZsYWcgdG8ga21hbGxvYyBkbWEgYnVmZmVyIGFsbG9jcy4KLSAqCQkJYmFja2ZpbGwgc2lsZW5jZSB0byBlbGltaW5hdGUgc3R1dHRlcmluZyBvbgotICoJCQl1bmRlcnJ1bnMuCi0gKgkyMDAwMTIwMS10dwlhZGQgcmVzeW5jaW5nIG9mIHN3cHRyIG9uIHVuZGVycnVucy4KLSAqCTIwMDAxMjA1LXR3LW5mCWZpeGVkIEdFVE9TUEFDRSBpb2N0bCgpIGFmdGVyIG9wZW4oKQotICoJMjAwMTAxMTMtdHcJcGF0Y2ggZnJvbSBIYW5zIEdyb2JsZXIgZ2VuZXJhbCBjbGVhbnVwLgotICoJMjAwMTAxMTctdHcJMi40LjAgcGNpIGNsZWFudXAsIHdyYXBwZXIgY29kZSBmb3IgMi4yLjE2LTIuNC4wCi0gKgkyMDAxMDExOC10dwliYXNpYyBQTSBzdXBwb3J0IGZvciAyLjIuMTYrIGFuZCAyLjQuMC8yLjQuMi4KLSAqCTIwMDEwMjI4LWRoCXBhdGNoIGZyb20gRGF2aWQgSHVnZ2lucyAtIGNzX3VwZGF0ZV9wdHIgcmVjdXJzaW9uLgotICoJMjAwMTA0MDktdHcJYWRkIGhlcmN1bGVzIGdhbWUgdGhlYXRyZSBYUCBhbXAgY29kZS4KLSAqCTIwMDEwNDIwLXR3CWNsZWFudXAgcG93ZXJkb3duL3VwIGNvZGUuCi0gKgkyMDAxMDUyMS10dwllbGltaW5hdGUgcG9wcywgYW5kIGZpeGVzIGZvciBwb3dlcmRvd24uCi0gKgkyMDAxMDUyNS10dwlhZGRlZCBmaXhlcyBmb3IgdGhpbmtwYWRzIHdpdGggcG93ZXJkb3duIGxvZ2ljLgotICoJMjAwMTA3MjMtc2ggICAgIHBhdGNoIGZyb20gSG9ybXMgKFNpbW9uIEhvcm1hbikgLQotICoJICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0JJVFMgcmV0dXJucyBiaXRzIGFzIHNldCBpbiBkcml2ZXIKLSAqCSAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBhIGxvZ2ljYWwgb3Igb2YgdGhlIHBvc3NpYmxlIHZhbHVlcy4KLSAqCSAgICAgICAgICAgICAgICBWYXJpb3VzIGlvY3RscyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGRldmljZQotICoJICAgICAgICAgICAgICAgIGlzIG9wZW4gZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBidXQgbm90IGJvdGggYmV0dGVyLgotICoKLSAqCVN0YXR1czoKLSAqCVBsYXliYWNrL0NhcHR1cmUgc3VwcG9ydGVkIGZyb20gOGstNDhrLgotICoJMTZCaXQgU2lnbmVkIExFICYgOEJpdCBVbnNpZ25lZCwgd2l0aCBNb25vIG9yIFN0ZXJlbyBzdXBwb3J0ZWQuCi0gKgotICoJQVBNL1BNIC0gMi4yLnggQVBNIGlzIGVuYWJsZWQgYW5kIGZ1bmN0aW9uaW5nIGZpbmUuIEFQTSBjYW4gYWxzbwotICoJYmUgZW5hYmxlZCBmb3IgMi40LnggYnkgbW9kaWZ5aW5nIHRoZSBDUzQ2WFhfQUNQSV9TVVBQT1JUIG1hY3JvCi0gKglkZWZpbml0aW9uLgotICoKLSAqICAgICAgSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIC0gdGhlIEVHUElPMiBwaW4gY29udHJvbHMgdGhlIGV4dGVybmFsIEFtcCwKLSAqCXNvLCB1c2UgdGhlIGRyYWluL3BvbGFyaXR5IHRvIGVuYWJsZS4gIAotICoJaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSBzZXQgdG8gMSwgd2lsbCBmb3JjZSBhIDAgdG8gRUdQSU9EUi4KLSAqCi0gKglWVEIgU2FudGEgQ3J1eiAtIHRoZSBHUElPNy9HUElPOCBvbiB0aGUgU2Vjb25kYXJ5IENvZGVjIGNvbnRyb2wKLSAqCXRoZSBleHRlcm5hbCBhbXBsaWZpZXIgZm9yIHRoZSAiYmFjayIgc3BlYWtlcnMsIHNpbmNlIHdlIGRvIG5vdAotICoJc3VwcG9ydCB0aGUgc2Vjb25kYXJ5IGNvZGVjIHRoZW4gdGhpcyBleHRlcm5hbCBhbXAgaXMgYWxzbyBub3QKLSAqCXR1cm5lZCBvbi4KLSAqLwotIAotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICJjczQ2eHhwbS5oIgotI2luY2x1ZGUgImNzNDZ4eF93cmFwcGVyLTI0LmgiCi0jaW5jbHVkZSAiY3M0NjF4LmgiCi0KLS8qIE1JREkgYnVmZmVyIHNpemVzICovCi0jZGVmaW5lIENTX01JRElJTkJVRiAgNTAwCi0jZGVmaW5lIENTX01JRElPVVRCVUYgNTAwCi0KLSNkZWZpbmUgQURDX1JVTk5JTkcJMQotI2RlZmluZSBEQUNfUlVOTklORwkyCi0KLSNkZWZpbmUgQ1NfRk1UXzE2QklUCTEJCS8qIFRoZXNlIGFyZSBmaXhlZCBpbiBmYWN0ICovCi0jZGVmaW5lIENTX0ZNVF9TVEVSRU8JMgotI2RlZmluZSBDU19GTVRfTUFTSwkzCi0KLSNkZWZpbmUgQ1NfVFlQRV9BREMJMQotI2RlZmluZSBDU19UWVBFX0RBQwkyCi0KLSNkZWZpbmUgQ1NfVFJVRSAJMQotI2RlZmluZSBDU19GQUxTRSAJMAotCi0jZGVmaW5lIENTX0lOQ19VU0VfQ09VTlQobSkgKGF0b21pY19pbmMobSkpCi0jZGVmaW5lIENTX0RFQ19VU0VfQ09VTlQobSkgKGF0b21pY19kZWMobSkpCi0jZGVmaW5lIENTX0RFQ19BTkRfVEVTVChtKSAoYXRvbWljX2RlY19hbmRfdGVzdChtKSkKLSNkZWZpbmUgQ1NfSU5fVVNFKG0pIChhdG9taWNfcmVhZChtKSAhPSAwKQotCi0jZGVmaW5lIENTX0RCR0JSRUFLUE9JTlQge19fYXNtX18oIklOVCAkMyIpO30KLS8qCi0gKglDUzQ2MXggZGVmaW5pdGlvbnMKLSAqLwotIAotI2RlZmluZSBDUzQ2MVhfQkEwX1NJWkUJCTB4MjAwMAotI2RlZmluZSBDUzQ2MVhfQkExX0RBVEEwX1NJWkUJMHgzMDAwCi0jZGVmaW5lIENTNDYxWF9CQTFfREFUQTFfU0laRQkweDM4MDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9QUkdfU0laRQkweDcwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9SRUdfU0laRQkweDAxMDAKLQotI2RlZmluZSBHT0ZfUEVSX1NFQwkyMDAKLQotI2RlZmluZSBDU0RFQlVHX0lOVEVSRkFDRSAxCi0jZGVmaW5lIENTREVCVUcgMQotLyoKLSAqIFR1cm4gb24vb2ZmIGRlYnVnZ2luZyBjb21waWxhdGlvbiBieSB1c2luZyAxLzAgcmVzcGVjdGl2ZWx5IGZvciBDU0RFQlVHCi0gKgotICoKLSAqIENTREVCVUcgaXMgdXN1YWwgbW9kZSBpcyBzZXQgdG8gMSwgdGhlbiB1c2UgdGhlCi0gKiBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgdG8gdHVybiBvbiBvciBvZmYgZGVidWdnaW5nLgotICogRGVidWcgbGV2ZWwgb2YgMSBoYXMgYmVlbiBkZWZpbmVkIHRvIGJlIGtlcm5lbCBlcnJvcnMgYW5kIGluZm8KLSAqIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgb24gYW55IHJlbGVhc2VkIGRyaXZlci4KLSAqLwotI2lmIENTREVCVUcKLSNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgaWYgKChjc19kZWJ1Z2xldmVsID49IChsZXZlbCkpICYmICgobWFzaykgJiBjc19kZWJ1Z21hc2spKSB7eDt9Ci0jZWxzZQotI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSAKLSNlbmRpZgotLyoKLSAqIGNzX2RlYnVnbWFzayBhcmVhcwotICovCi0jZGVmaW5lIENTX0lOSVQJIAkweDAwMDAwMDAxCQkvKiBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmUgZnVuY3Rpb25zICovCi0jZGVmaW5lIENTX0VSUk9SIAkweDAwMDAwMDAyCQkvKiB0bXAgZGVidWdnaW5nIGJpdCBwbGFjZWhvbGRlciAqLwotI2RlZmluZSBDU19JTlRFUlJVUFQJMHgwMDAwMDAwNAkJLyogaW50ZXJydXB0IGhhbmRsZXIgKHNlcGFyYXRlIGZyb20gYWxsIG90aGVyKSAqLwotI2RlZmluZSBDU19GVU5DVElPTiAJMHgwMDAwMDAwOAkJLyogZW50ZXIvbGVhdmUgZnVuY3Rpb25zICovCi0jZGVmaW5lIENTX1dBVkVfV1JJVEUgCTB4MDAwMDAwMTAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciB3YXZlICovCi0jZGVmaW5lIENTX1dBVkVfUkVBRCAJMHgwMDAwMDAyMAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3Igd2F2ZSAqLwotI2RlZmluZSBDU19NSURJX1dSSVRFIAkweDAwMDAwMDQwCQkvKiB3cml0ZSBpbmZvcm1hdGlvbiBmb3IgbWlkaSAqLwotI2RlZmluZSBDU19NSURJX1JFQUQgCTB4MDAwMDAwODAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1pZGkgKi8KLSNkZWZpbmUgQ1NfTVBVNDAxX1dSSVRFIDB4MDAwMDAxMDAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciBtcHU0MDEgKi8KLSNkZWZpbmUgQ1NfTVBVNDAxX1JFQUQgCTB4MDAwMDAyMDAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1wdTQwMSAqLwotI2RlZmluZSBDU19PUEVOCQkweDAwMDAwNDAwCQkvKiBhbGwgb3BlbiBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlciAqLwotI2RlZmluZSBDU19SRUxFQVNFCTB4MDAwMDA4MDAJCS8qIGFsbCByZWxlYXNlIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyICovCi0jZGVmaW5lIENTX1BBUk1TCTB4MDAwMDEwMDAJCS8qIGZ1bmN0aW9uYWwgYW5kIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgQ1NfSU9DVEwJMHgwMDAwMjAwMAkJLyogaW9jdGwgKG5vbi1taXhlcikgKi8KLSNkZWZpbmUgQ1NfUE0JCTB4MDAwMDQwMDAJCS8qIFBNICovCi0jZGVmaW5lIENTX1RNUAkJMHgxMDAwMDAwMAkJLyogdG1wIGRlYnVnIG1hc2sgYml0ICovCi0KLSNkZWZpbmUgQ1NfSU9DVExfQ01EX1NVU1BFTkQJMHgxCS8vIHN1c3BlbmQKLSNkZWZpbmUgQ1NfSU9DVExfQ01EX1JFU1VNRQkweDIJLy8gcmVzdW1lCi0KLSNpZiBDU0RFQlVHCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsID0gMTsJCQkvKiBsZXZlbHMgcmFuZ2UgZnJvbSAxLTkgKi8KLW1vZHVsZV9wYXJhbShjc19kZWJ1Z2xldmVsLCB1bG9uZywgMDY0NCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z21hc2sgPSBDU19JTklUIHwgQ1NfRVJST1I7CS8qIHVzZSBDU19EQkdPVVQgd2l0aCB2YXJpb3VzIG1hc2sgdmFsdWVzICovCi1tb2R1bGVfcGFyYW0oY3NfZGVidWdtYXNrLCB1bG9uZywgMDY0NCk7Ci0jZW5kaWYKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhlcmN1bGVzX2VncGlvX2Rpc2FibGU7ICAvKiBpZiBub24temVybyBzZXQgYWxsIEVHUElPIHRvIDAgKi8KLW1vZHVsZV9wYXJhbShoZXJjdWxlc19lZ3Bpb19kaXNhYmxlLCB1bG9uZywgMCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbml0ZGVsYXkgPSA3MDA7ICAvKiBQTSBkZWxheSBpbiBtaWxsaXNlY3MgKi8KLW1vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VyZG93biA9IC0xOyAgLyogdHVybiBvbi9vZmYgcG93ZXJkb3duIHByb2Nlc3NpbmcgaW4gZHJpdmVyICovCi1tb2R1bGVfcGFyYW0ocG93ZXJkb3duLCB1bG9uZywgMCk7Ci0jZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgMwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsKLW1vZHVsZV9wYXJhbShkZWZhdWx0b3JkZXIsIHVsb25nLCAwKTsKLQotc3RhdGljIGludCBleHRlcm5hbF9hbXA7Ci1tb2R1bGVfcGFyYW0oZXh0ZXJuYWxfYW1wLCBib29sLCAwKTsKLXN0YXRpYyBpbnQgdGhpbmtwYWQ7Ci1tb2R1bGVfcGFyYW0odGhpbmtwYWQsIGJvb2wsIDApOwotCi0vKgotKiBzZXQgdGhlIHBvd2VyZG93biBtb2R1bGUgcGFybSB0byAwIHRvIGRpc2FibGUgYWxsIAotKiBwb3dlcmRvd24uIGFsc28gc2V0IHRoaW5rcGFkIHRvIDEgdG8gZGlzYWJsZSBwb3dlcmRvd24sIAotKiBidXQgYWxzbyB0byBlbmFibGUgdGhlIGNsa3J1biBmdW5jdGlvbmFsaXR5LgotKi8KLXN0YXRpYyB1bnNpZ25lZCBjc19wb3dlcmRvd24gPSAxOwotc3RhdGljIHVuc2lnbmVkIGNzX2xhcHRvcF93YWl0ID0gMTsKLQotLyogQW4gaW5zdGFuY2Ugb2YgdGhlIDQ2MTAgY2hhbm5lbCAqLwotc3RydWN0IGNzX2NoYW5uZWwgCi17Ci0JaW50IHVzZWQ7Ci0JaW50IG51bTsKLQl2b2lkICpzdGF0ZTsKLX07Ci0KLSNkZWZpbmUgQ1M0NlhYX01BSk9SX1ZFUlNJT04gIjEiCi0jZGVmaW5lIENTNDZYWF9NSU5PUl9WRVJTSU9OICIyOCIKLQotI2lmZGVmIF9faWE2NF9fCi0jZGVmaW5lIENTNDZYWF9BUkNICSAgICAgCSI2NCIJLy9hcmNoaXRlY3R1cmUga2V5Ci0jZWxzZQotI2RlZmluZSBDUzQ2WFhfQVJDSAkgICAgIAkiMzIiCS8vYXJjaGl0ZWN0dXJlIGtleQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGNzNDZ4eF9kZXZzID0geyAmY3M0Nnh4X2RldnMsICZjczQ2eHhfZGV2cyB9OwotCi0vKiBtYWdpYyBudW1iZXJzIHRvIHByb3RlY3Qgb3VyIGRhdGEgc3RydWN0dXJlcyAqLwotI2RlZmluZSBDU19DQVJEX01BR0lDCQkweDQzNTI1NTUzIC8qICJDUlVTIiAqLwotI2RlZmluZSBDU19TVEFURV9NQUdJQwkJMHg0YzRmNDc0OSAvKiAiTE9HSSIgKi8KLSNkZWZpbmUgTlJfSFdfQ0gJCTMKLQotLyogbWF4aW51bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQgKi8KLSNkZWZpbmUgTlJfQUM5NwkJMgotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07Ci0KLS8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8KLXN0cnVjdCBjc19zdGF0ZSB7Ci0JdW5zaWduZWQgaW50IG1hZ2ljOwotCXN0cnVjdCBjc19jYXJkICpjYXJkOwkvKiBDYXJkIGluZm8gKi8KLQotCS8qIHNpbmdsZSBvcGVuIGxvY2sgbWVjaGFuaXNtLCBvbmx5IHVzZWQgZm9yIHJlY29yZGluZyAqLwotCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwotCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKLQotCS8qIGZpbGUgbW9kZSAqLwotCW1vZGVfdCBvcGVuX21vZGU7Ci0KLQkvKiB2aXJ0dWFsIGNoYW5uZWwgbnVtYmVyICovCi0JaW50IHZpcnQ7Ci0JCi0Jc3RydWN0IGRtYWJ1ZiB7Ci0JCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCi0JCXVuc2lnbmVkIGludCByYXRlOwotCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOwotCi0JCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KLQkJc3RydWN0IGNzX2NoYW5uZWwgKmNoYW5uZWw7Ci0JCWludCBwcmluZ2J1ZjsJCS8qIFNvZnR3YXJlIHJpbmcgc2xvdCAqLwotCQl2b2lkICpwYnVmOwkJLyogNEsgaGFyZHdhcmUgRE1BIGJ1ZmZlciAqLwotCi0JCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLwotCQl2b2lkICpyYXdidWY7Ci0JCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKLQkJdW5zaWduZWQgYnVmb3JkZXI7Ci0JCXVuc2lnbmVkIG51bWZyYWc7Ci0JCXVuc2lnbmVkIGZyYWdzaGlmdDsKLQkJdW5zaWduZWQgZGl2aXNvcjsKLQkJdW5zaWduZWQgdHlwZTsKLQkJdm9pZCAqdG1wYnVmZjsJCQkvKiB0bXAgYnVmZmVyIGZvciBzYW1wbGUgY29udmVyc2lvbnMgKi8KLQkJZG1hX2FkZHJfdCBkbWFhZGRyOwotCQlkbWFfYWRkcl90IGRtYWFkZHJfdG1wYnVmZjsKLQkJdW5zaWduZWQgYnVmb3JkZXJfdG1wYnVmZjsJLyogTG9nIGJhc2UgMiBvZiBzaXplIGluIGJ5dGVzLi4gKi8KLQotCQkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KLQkJdW5zaWduZWQgaHdwdHI7CQkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KLQkJdW5zaWduZWQgc3dwdHI7CQkvKiB3aGVyZSBkcml2ZXIgbGFzdCBjbGVhci9maWxsZWQsIHVwZGF0ZWQgYnkgcmVhZC93cml0ZSAqLwotCQlpbnQgY291bnQ7CQkvKiBieXRlcyB0byBiZSBjb21zdW1lZCBvciBiZWVuIGdlbmVyYXRlZCBieSBkbWEgbWFjaGluZSAqLwotCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsJLyogdG90YWwgYnl0ZXMgZG1hZWQgYnkgaGFyZHdhcmUgKi8KLQkJdW5zaWduZWQgYmxvY2tzOwkvKiB0b3RhbCBibG9ja3MgKi8KLQotCQl1bnNpZ25lZCBlcnJvcjsJCS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLwotCQl1bnNpZ25lZCB1bmRlcnJ1bjsJLyogdW5kZXJydW4gcGVuZGluZyBiZWZvcmUgbmV4dCB3cml0ZSBoYXMgb2NjdXJyZWQgKi8KLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJLyogcHV0IHByb2Nlc3Mgb24gd2FpdCBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgaW4gYnVmZmVyICovCi0KLQkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLwotCQl1bnNpZ25lZCBmcmFnc2l6ZTsKLQkJdW5zaWduZWQgZG1hc2l6ZTsKLQkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7Ci0KLQkJLyogT1NTIHN0dWZmICovCi0JCXVuc2lnbmVkIG1hcHBlZDoxOwotCQl1bnNpZ25lZCByZWFkeToxOwotCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7Ci0JCXVuc2lnbmVkIFNHb2s6MTsKLQkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7Ci0JCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKLQkJaW50IG9zc21heGZyYWdzOwotCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKLQl9IGRtYWJ1ZjsKLQkvKiBHdWFyZCBhZ2FpbnN0IG1tYXAvd3JpdGUvcmVhZCByYWNlcyAqLwotCXN0cnVjdCBtdXRleCBzZW07Ci19OwotCi1zdHJ1Y3QgY3NfY2FyZCB7Ci0Jc3RydWN0IGNzX2NoYW5uZWwgY2hhbm5lbFsyXTsKLQl1bnNpZ25lZCBpbnQgbWFnaWM7Ci0KLQkvKiBXZSBrZWVwIGNzNDYxeCBjYXJkcyBpbiBhIGxpbmtlZCBsaXN0ICovCi0Jc3RydWN0IGNzX2NhcmQgKm5leHQ7Ci0KLQkvKiBUaGUgY3M0NjF4IGhhcyBhIGNlcnRhaW4gYW1vdW50IG9mIGNyb3NzIGNoYW5uZWwgaW50ZXJhY3Rpb24KLQkgICBzbyB3ZSB1c2UgYSBzaW5nbGUgcGVyIGNhcmQgbG9jayAqLwotCXNwaW5sb2NrX3QgbG9jazsKLQkKLQkvKiBLZWVwIEFDOTcgc2FuZSAqLwotCXNwaW5sb2NrX3QgYWM5N19sb2NrOwotCi0JLyogbWl4ZXIgdXNlIGNvdW50ICovCi0JYXRvbWljX3QgbWl4ZXJfdXNlX2NudDsKLQotCS8qIFBDSSBkZXZpY2Ugc3R1ZmYgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQl1bnNpZ25lZCBpbnQgcGN0bCwgY2N0bDsJLyogSGFyZHdhcmUgRE1BIGZsYWcgc2V0cyAqLwotCi0JLyogc291bmRjb3JlIHN0dWZmICovCi0JaW50IGRldl9hdWRpbzsKLQlpbnQgZGV2X21pZGk7Ci0KLQkvKiBzdHJ1Y3R1cmVzIGZvciBhYnN0cmFjdGlvbiBvZiBoYXJkd2FyZSBmYWNpbGl0aWVzLCBjb2RlY3MsIGJhbmtzIGFuZCBjaGFubmVscyovCi0Jc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWNbTlJfQUM5N107Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZXNbMl07Ci0KLQl1MTYgYWM5N19mZWF0dXJlczsKLQkKLQlpbnQgYW1wbGlmaWVyOwkJCS8qIEFtcGxpZmllciBjb250cm9sICovCi0Jdm9pZCAoKmFtcGxpZmllcl9jdHJsKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQpOwotCXZvaWQgKCphbXBfaW5pdCkoc3RydWN0IGNzX2NhcmQgKik7Ci0JCi0JaW50IGFjdGl2ZTsJCQkvKiBBY3RpdmUgY2xvY2tpbmcgKi8KLQl2b2lkICgqYWN0aXZlX2N0cmwpKHN0cnVjdCBjc19jYXJkICosIGludCk7Ci0JCi0JLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCi0JdW5zaWduZWQgbG9uZyBiYTBfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGJhMV9hZGRyOwotCXUzMiBpcnE7Ci0JCi0JLyogbWFwcGluZ3MgKi8KLQl2b2lkIF9faW9tZW0gKmJhMDsKLQl1bmlvbgotCXsKLQkJc3RydWN0Ci0JCXsKLQkJCXU4IF9faW9tZW0gKmRhdGEwOwotCQkJdTggX19pb21lbSAqZGF0YTE7Ci0JCQl1OCBfX2lvbWVtICpwbWVtOwotCQkJdTggX19pb21lbSAqcmVnOwotCQl9IG5hbWU7Ci0JCXU4IF9faW9tZW0gKmlkeFs0XTsKLQl9IGJhMTsKLQkKLQkvKiBGdW5jdGlvbiBzdXBwb3J0ICovCi0Jc3RydWN0IGNzX2NoYW5uZWwgKigqYWxsb2NfcGNtX2NoYW5uZWwpKHN0cnVjdCBjc19jYXJkICopOwotCXN0cnVjdCBjc19jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKik7Ci0Jdm9pZCAoKmZyZWVfcGNtX2NoYW5uZWwpKHN0cnVjdCBjc19jYXJkICosIGludCBjaGFuKTsKLQotCS8qIC9kZXYvbWlkaSBzdHVmZiAqLwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OwotCQl1bnNpZ25lZCBvcmQsIG93ciwgb2NudDsKLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwotCQl3YWl0X3F1ZXVlX2hlYWRfdCBpd2FpdDsKLQkJd2FpdF9xdWV1ZV9oZWFkX3Qgb3dhaXQ7Ci0JCXNwaW5sb2NrX3QgbG9jazsKLQkJdW5zaWduZWQgY2hhciBpYnVmW0NTX01JRElJTkJVRl07Ci0JCXVuc2lnbmVkIGNoYXIgb2J1ZltDU19NSURJT1VUQlVGXTsKLQkJbW9kZV90IG9wZW5fbW9kZTsKLQkJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7Ci0JfSBtaWRpOwotCXN0cnVjdCBjczQ2eHhfcG0gcG07Ci19OwotCi1zdGF0aWMgaW50IGNzX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgY3NfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGludCBjc19pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQl1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50IGNzX2hhcmR3YXJlX2luaXQoc3RydWN0IGNzX2NhcmQgKmNhcmQpOwotc3RhdGljIGludCBjczQ2eHhfcG93ZXJ1cChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHR5cGUpOwotc3RhdGljIGludCBjczQ2MXhfcG93ZXJkb3duKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50IHN1c3BlbmRmbGFnKTsKLXN0YXRpYyB2b2lkIGNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3Moc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCB0eXBlKTsKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmRfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1zdGF0aWMgaW50IGNzNDZ4eF9yZXN1bWVfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpOwotI2VuZGlmCi0KLSNpZiBDU0RFQlVHCi0KLS8qIERFQlVHIFJPVVRJTkVTICovCi0KLSNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIwLCBpbnQpCi0jZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMIAlfU0lPV1IoJ00nLDEyMSwgaW50KQotI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLIAlfU0lPV1IoJ00nLDEyMiwgaW50KQotI2RlZmluZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLIAlfU0lPV1IoJ00nLDEyMywgaW50KQotI2RlZmluZSBTT1VORF9NSVhFUl9DU19BUE0JIAlfU0lPV1IoJ00nLDEyNCwgaW50KQotCi1zdGF0aWMgdm9pZCBwcmludGlvY3RsKHVuc2lnbmVkIGludCB4KQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHVuc2lnbmVkIGNoYXIgdmlkeDsKLQkvKiB0aGVzZSB2YWx1ZXMgYXJlIGluY29ycmVjdCBmb3IgdGhlIGFjOTcgZHJpdmVyLCBmaXguCi0gICAgICAgICAqIEluZGV4IG9mIG1peHRhYmxlMVtdIG1lbWJlciBpcyBEZXZpY2UgSUQgCi0gICAgICAgICAqIGFuZCBtdXN0IGJlIDw9IFNPVU5EX01JWEVSX05SREVWSUNFUy4KLSAgICAgICAgICogVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIGluZGV4IGludG8gcy0+bWl4LnZvbFtdCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtaXh0YWJsZTFbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfUENNXSAgICAgPSAxLCAgIC8qIHZvaWNlICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX0xJTkUxXSAgID0gMiwgICAvKiBBVVggKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfQ0RdICAgICAgPSAzLCAgIC8qIENEICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX0xJTkVdICAgID0gNCwgICAvKiBMaW5lICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX1NZTlRIXSAgID0gNSwgICAvKiBGTSAqLwotICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9NSUNdICAgICA9IDYsICAgLyogTWljICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX1NQRUFLRVJdID0gNywgICAvKiBTcGVha2VyICovCi0gICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX1JFQ0xFVl0gID0gOCwgICAvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KLSAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfVk9MVU1FXSAgPSA5ICAgIC8qIE1hc3RlciBWb2x1bWUgKi8KLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgc3dpdGNoICh4KSB7Ci0JY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzogIikgKTsKLQkJYnJlYWs7Ci0JY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOiAiKSApOwotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOiAiKSApOwotCQlicmVhazsKLQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIE9TU19HRVRWRVJTSU9OOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiT1NTX0dFVFZFUlNJT046ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU1lOQzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1lOQzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVERVUExFWDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRDQVBTOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9SRVNFVDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1BFRUQ6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TVEVSRU86ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0NIQU5ORUxTOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IAotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRGTVRTOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogCi0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVDogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9QT1NUOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9QT1NUOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVFRSSUdHRVI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VUVFJJR0dFUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9TUEFDRTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElTUEFDRTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfTk9OQkxPQ0s6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPREVMQVk6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUSVBUUjogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPUFRSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEJMS1NJWkU6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1VCRElWSURFOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfUkFURTogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzogIikgKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fV1JJVEVfRklMVEVSOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VUU1lOQ1JPOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9GSUxURVI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUxOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTE6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUyOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTI6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU0OgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTQ6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU1OgotCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTU6ICIpICk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0lORk86Ci0JCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOiAiKSApOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBTT1VORF9PTERfTUlYRVJfSU5GTzoKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX09MRF9NSVhFUl9JTkZPOiAiKSApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlzd2l0Y2ggKF9JT0NfTlIoeCkpIHsKLQkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1NQRUFLRVI6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NQRUFLRVI6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUkVDTEVWOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX01JQzogIikgKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NZTlRIOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IAotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNTUkM6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0RFVk1BU0s6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6ICIpICk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IAotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAiKSApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgotCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOiIpICk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWkgPSBfSU9DX05SKHgpOwotCQkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhKHZpZHggPSBtaXh0YWJsZTFbaV0pKSB7Ci0JCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJVTktOT1dOIElPQ1RMOiAweCUuOHggTlI9JWQgIix4LGkpICk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0lPQ1RMIEFDOXg6IDB4JS44eCBOUj0lZCAiLAotCQkJCQkJCXgsaSkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotICAgIH0KLSAgICBDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiY29tbWFuZCA9IDB4JXggSU9DX05SPSVkXG4iLHgsIF9JT0NfTlIoeCkpICk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqICBjb21tb24gSS9PIHJvdXRpbmVzCi0gKi8KLQotc3RhdGljIHZvaWQgY3M0NjF4X3Bva2Uoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQl3cml0ZWwodmFsLCBjb2RlYy0+YmExLmlkeFsocmVnID4+IDE2KSAmIDNdICsgKHJlZyAmIDB4ZmZmZikpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcpCi17Ci0JcmV0dXJuIHJlYWRsKGNvZGVjLT5iYTEuaWR4WyhyZWcgPj4gMTYpICYgM10gKyAocmVnICYgMHhmZmZmKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9wb2tlQkEwKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0Jd3JpdGVsKHZhbCwgY29kZWMtPmJhMCArIHJlZyk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWtCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZykKLXsKLQlyZXR1cm4gcmVhZGwoY29kZWMtPmJhMCArIHJlZyk7Ci19Ci0KLQotc3RhdGljIHUxNiBjc19hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpOwotc3RhdGljIHZvaWQgY3NfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3NfY2hhbm5lbCAqY3NfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0JaWYgKGNhcmQtPmNoYW5uZWxbMV0udXNlZCA9PSAxKQotCQlyZXR1cm4gTlVMTDsKLQljYXJkLT5jaGFubmVsWzFdLnVzZWQgPSAxOwotCWNhcmQtPmNoYW5uZWxbMV0ubnVtID0gMTsKLQlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMV07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY3NfY2hhbm5lbCAqY3NfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWlmIChjYXJkLT5jaGFubmVsWzBdLnVzZWQgPT0gMSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2FyZC0+Y2hhbm5lbFswXS51c2VkID0gMTsKLQljYXJkLT5jaGFubmVsWzBdLm51bSA9IDA7Ci0JcmV0dXJuICZjYXJkLT5jaGFubmVsWzBdOwotfQotCi1zdGF0aWMgdm9pZCBjc19mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbm5lbCkKLXsKLQljYXJkLT5jaGFubmVsW2NoYW5uZWxdLnN0YXRlID0gTlVMTDsKLQljYXJkLT5jaGFubmVsW2NoYW5uZWxdLnVzZWQgPSAwOwotfQotCi0vKgotICogc2V0dXAgYSBkaXZpc29yIHZhbHVlIHRvIGhlbHAgd2l0aCBjb252ZXJzaW9uIGZyb20KLSAqIDE2Yml0IFN0ZXJlbywgZG93biB0byA4Yml0IHN0ZXJlby9tb25vIG9yIDE2Yml0IG1vbm8uCi0gKiBhc3NpZ24gYSBkaXZpc29yIG9mIDEgaWYgdXNpbmcgMTZiaXQgU3RlcmVvIGFzIHRoYXQgaXMKLSAqIHRoZSBvbmx5IGZvcm1hdCB0aGF0IHRoZSBzdGF0aWMgaW1hZ2Ugd2lsbCBjYXB0dXJlLgotICovCi1zdGF0aWMgdm9pZCBjc19zZXRfZGl2aXNvcihzdHJ1Y3QgZG1hYnVmICpkbWFidWYpCi17Ci0JaWYgKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0RBQykKLQkJZG1hYnVmLT5kaXZpc29yID0gMTsKLQllbHNlIGlmICghKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgJiYKLQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKLQkJZG1hYnVmLT5kaXZpc29yID0gMjsKLQllbHNlIGlmICgoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJgotCSAgICAhKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKLQkJZG1hYnVmLT5kaXZpc29yID0gMjsKLQllbHNlIGlmICghKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgJiYKLQkgICAgIShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpCi0JCWRtYWJ1Zi0+ZGl2aXNvciA9IDQ7Ci0JZWxzZQotCQlkbWFidWYtPmRpdmlzb3IgPSAxOwotCi0JQ1NfREJHT1VUKENTX1BBUk1TIHwgQ1NfRlVOQ1RJT04sIDgsIHByaW50aygKLQkJImNzNDZ4eDogY3Nfc2V0X2Rpdmlzb3IoKS0gJXMgJWRcbiIsCi0JCQkoZG1hYnVmLT50eXBlID09IENTX1RZUEVfQURDKSA/ICJBREMiIDogIkRBQyIsIAotCQkJZG1hYnVmLT5kaXZpc29yKSApOwotfQotCi0vKgotKiBtdXRlIHNvbWUgb2YgdGhlIG1vcmUgcHJldmFsZW50IHJlZ2lzdGVycyB0byBhdm9pZCBwb3BwaW5nLgotKi8KLXN0YXRpYyB2b2lkIGNzX211dGUoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBzdGF0ZSkgCi17Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmRldiA9IGNhcmQtPmFjOTdfY29kZWNbMF07Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfbXV0ZSgpKyAlc1xuIiwKLQkJKHN0YXRlID09IENTX1RSVUUpID8gIk11dGluZyIgOiAiVW5NdXRpbmciKSk7Ci0KLQlpZiAoc3RhdGUgPT0gQ1NfVFJVRSkgewotCS8qCi0JKiBmaXggcG9wcyB3aGVuIHBvd2VyaW5nIHVwIG9uIHRoaW5rcGFkcwotCSovCi0JCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZSA9ICh1MzIpY3NfYWM5N19nZXQoIGRldiwgCi0JCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUpOyAKLQkJY2FyZC0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJCSh1OClCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FKTsgCi0JCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJCSh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8pOyAKLQkJY2FyZC0+cG0udTMyQUM5N19wY21fb3V0X3ZvbHVtZSA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAKLQkJCQkodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUpOwotCQkJCi0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUsIDB4ODAwMCk7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsIDB4ODAwMCk7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTywgMHg4MDAwKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIDB4ODAwMCk7Ci0JfSBlbHNlIHsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lKTsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCBjYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubyk7Ci0JCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lKTsKLQl9Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX211dGUoKS1cbiIpKTsKLX0KLQotLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNzX3NldF9kYWNfcmF0ZShzdHJ1Y3QgY3Nfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCi17CQotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXVuc2lnbmVkIGludCB0bXAxLCB0bXAyOwotCXVuc2lnbmVkIGludCBwaGlJbmNyOwotCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfZGFjX3JhdGUoKSsgJWRcbiIscmF0ZSkgKTsKLQotCS8qCi0JICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KLQkgKiAgVGhlIGZvbGxvd2luZyBmb3JtdWxhcyBhcmUgYmVpbmcgY29tcHV0ZWQsIHVzaW5nIGlubGluZSBhc3NlbWJseQotCSAqICBzaW5jZSB3ZSBuZWVkIHRvIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBjb21wdXRlIHRoZSB2YWx1ZXM6Ci0JICoKLQkgKiAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQotCSAqICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDKQotICAgICAgICAgKiAgdWxDb3JyZWN0aW9uUGVyU2VjID0gRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jciAtTQotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCi0JICoKLQkgKiAgaS5lLgotCSAqCi0JICogIHBoaUluY3I6b3RoZXIgPSBkaXZpZGVuZDpyZW1haW5kZXIoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCi0JICogIGNvcnJlY3Rpb25QZXJHT0Y6Y29ycmVjdGlvblBlclNlYyA9Ci0JICogICAgICBkaXZpZGVuZDpyZW1haW5kZXIodWxPdGhlciAvIEdPRl9QRVJfU0VDKQotCSAqLwotCXRtcDEgPSByYXRlIDw8IDE2OwotCXBoaUluY3IgPSB0bXAxIC8gNDgwMDA7Ci0JdG1wMSAtPSBwaGlJbmNyICogNDgwMDA7Ci0JdG1wMSA8PD0gMTA7Ci0JcGhpSW5jciA8PD0gMTA7Ci0JdG1wMiA9IHRtcDEgLyA0ODAwMDsKLQlwaGlJbmNyICs9IHRtcDI7Ci0JdG1wMSAtPSB0bXAyICogNDgwMDA7Ci0JY29ycmVjdGlvblBlckdPRiA9IHRtcDEgLyBHT0ZfUEVSX1NFQzsKLQl0bXAxIC09IGNvcnJlY3Rpb25QZXJHT0YgKiBHT0ZfUEVSX1NFQzsKLQljb3JyZWN0aW9uUGVyU2VjID0gdG1wMTsKLQotCS8qCi0JICogIEZpbGwgaW4gdGhlIFNhbXBsZVJhdGVDb252ZXJ0ZXIgY29udHJvbCBibG9jay4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQljczQ2MXhfcG9rZShzdGF0ZS0+Y2FyZCwgQkExX1BTUkMsCi0JICAoKGNvcnJlY3Rpb25QZXJTZWMgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAoY29ycmVjdGlvblBlckdPRiAmIDB4RkZGRikpOwotCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUFBJLCBwaGlJbmNyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7Ci0JCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2RhY19yYXRlKCktICVkXG4iLHJhdGUpICk7Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KLS8qIHNldCByZWNvcmRpbmcgc2FtcGxlIHJhdGUgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3Nfc2V0X2FkY19yYXRlKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgaW50IHBoaUluY3IsIGNvZWZmSW5jciwgdG1wMSwgdG1wMjsKLQl1bnNpZ25lZCBpbnQgY29ycmVjdGlvblBlckdPRiwgY29ycmVjdGlvblBlclNlYywgaW5pdGlhbERlbGF5OwotCXVuc2lnbmVkIGludCBmcmFtZUdyb3VwTGVuZ3RoLCBjbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfYWRjX3JhdGUoKSsgJWRcbiIscmF0ZSkgKTsKLQotCS8qCi0JICogIFdlIGNhbiBvbmx5IGRlY2ltYXRlIGJ5IHVwIHRvIGEgZmFjdG9yIG9mIDEvOXRoIHRoZSBoYXJkd2FyZSByYXRlLgotCSAqICBDb3JyZWN0IHRoZSB2YWx1ZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc3RyYXkgb3V0c2lkZSB0aGF0IGxpbWl0LgotCSAqLwotCWlmICgocmF0ZSAqIDkpIDwgNDgwMDApCi0JCXJhdGUgPSA0ODAwMCAvIDk7Ci0KLQkvKgotCSAqICBXZSBjYW5ub3QgY2FwdHVyZSBhdCBhdCByYXRlIGdyZWF0ZXIgdGhhbiB0aGUgSW5wdXQgUmF0ZSAoNDgwMDApLgotCSAqICBSZXR1cm4gYW4gZXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHN0cmF5IG91dHNpZGUgdGhhdCBsaW1pdC4KLQkgKi8KLQlpZiAocmF0ZSA+IDQ4MDAwKQotCQlyYXRlID0gNDgwMDA7Ci0KLQkvKgotCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCi0JICogIFRoZSBmb2xsb3dpbmcgZm9ybXVsYXMgYXJlIGJlaW5nIGNvbXB1dGVkLCB1c2luZyBpbmxpbmUgYXNzZW1ibHkKLQkgKiAgc2luY2Ugd2UgbmVlZCB0byB1c2UgNjQgYml0IGFyaXRobWV0aWMgdG8gY29tcHV0ZSB0aGUgdmFsdWVzOgotCSAqCi0JICogICAgIGNvZWZmSW5jciA9IC1mbG9vcigoRnMsb3V0ICogMl4yMykgLyBGcyxpbikKLQkgKiAgICAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQotCSAqICAgICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMpCi0JICogICAgIGNvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC0KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCi0JICogICAgIGluaXRpYWxEZWxheSA9IGNlaWwoKDI0ICogRnMsaW4pIC8gRnMsb3V0KQotCSAqCi0JICogaS5lLgotCSAqCi0JICogICAgIGNvZWZmSW5jciA9IG5lZyhkaXZpZGVuZCgoRnMsb3V0ICogMl4yMykgLyBGcyxpbikpCi0JICogICAgIHBoaUluY3I6dWxPdGhlciA9IGRpdmlkZW5kOnJlbWFpbmRlcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKLQkgKiAgICAgY29ycmVjdGlvblBlckdPRjpjb3JyZWN0aW9uUGVyU2VjID0KLQkgKiAJICAgIGRpdmlkZW5kOnJlbWFpbmRlcih1bE90aGVyIC8gR09GX1BFUl9TRUMpCi0JICogICAgIGluaXRpYWxEZWxheSA9IGRpdmlkZW5kKCgoMjQgKiBGcyxpbikgKyBGcyxvdXQgLSAxKSAvIEZzLG91dCkKLQkgKi8KLQl0bXAxID0gcmF0ZSA8PCAxNjsKLQljb2VmZkluY3IgPSB0bXAxIC8gNDgwMDA7Ci0JdG1wMSAtPSBjb2VmZkluY3IgKiA0ODAwMDsKLQl0bXAxIDw8PSA3OwotCWNvZWZmSW5jciA8PD0gNzsKLQljb2VmZkluY3IgKz0gdG1wMSAvIDQ4MDAwOwotCWNvZWZmSW5jciBePSAweEZGRkZGRkZGOwotCWNvZWZmSW5jcisrOwotCXRtcDEgPSA0ODAwMCA8PCAxNjsKLQlwaGlJbmNyID0gdG1wMSAvIHJhdGU7Ci0JdG1wMSAtPSBwaGlJbmNyICogcmF0ZTsKLQl0bXAxIDw8PSAxMDsKLQlwaGlJbmNyIDw8PSAxMDsKLQl0bXAyID0gdG1wMSAvIHJhdGU7Ci0JcGhpSW5jciArPSB0bXAyOwotCXRtcDEgLT0gdG1wMiAqIHJhdGU7Ci0JY29ycmVjdGlvblBlckdPRiA9IHRtcDEgLyBHT0ZfUEVSX1NFQzsKLQl0bXAxIC09IGNvcnJlY3Rpb25QZXJHT0YgKiBHT0ZfUEVSX1NFQzsKLQljb3JyZWN0aW9uUGVyU2VjID0gdG1wMTsKLQlpbml0aWFsRGVsYXkgPSAoKDQ4MDAwICogMjQpICsgcmF0ZSAtIDEpIC8gcmF0ZTsKLQotCS8qCi0JICogIEZpbGwgaW4gdGhlIFZhcmlEZWNpbWF0ZSBjb250cm9sIGJsb2NrLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NTUkMsCi0JCSgoY29ycmVjdGlvblBlclNlYyA8PCAxNikgJiAweEZGRkYwMDAwKSB8IChjb3JyZWN0aW9uUGVyR09GICYgMHhGRkZGKSk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDSSwgY29lZmZJbmNyKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0QsCi0JCSgoKEJBMV9WQVJJREVDX0JVRl8xICsgKGluaXRpYWxEZWxheSA8PCAyKSkgPDwgMTYpICYgMHhGRkZGMDAwMCkgfCAweDgwKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1BJLCBwaGlJbmNyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqICBGaWd1cmUgb3V0IHRoZSBmcmFtZSBncm91cCBsZW5ndGggZm9yIHRoZSB3cml0ZSBiYWNrIHRhc2suICBCYXNpY2FsbHksCi0JICogIHRoaXMgaXMganVzdCB0aGUgZmFjdG9ycyBvZiAyNDAwMCAoMl42KjMqNV4zKSB0aGF0IGFyZSBub3QgcHJlc2VudCBpbgotCSAqICB0aGUgb3V0cHV0IHNhbXBsZSByYXRlLgotCSAqLwotCWZyYW1lR3JvdXBMZW5ndGggPSAxOwotCWZvciAoY250ID0gMjsgY250IDw9IDY0OyBjbnQgKj0gMikgewotCQlpZiAoKChyYXRlIC8gY250KSAqIGNudCkgIT0gcmF0ZSkKLQkJCWZyYW1lR3JvdXBMZW5ndGggKj0gMjsKLQl9Ci0JaWYgKCgocmF0ZSAvIDMpICogMykgIT0gcmF0ZSkgewotCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDM7Ci0JfQotCWZvciAoY250ID0gNTsgY250IDw9IDEyNTsgY250ICo9IDUpIHsKLQkJaWYgKCgocmF0ZSAvIGNudCkgKiBjbnQpICE9IHJhdGUpIAotCQkJZnJhbWVHcm91cExlbmd0aCAqPSA1OwotICAgICAgICB9Ci0KLQkvKgotCSAqIEZpbGwgaW4gdGhlIFdyaXRlQmFjayBjb250cm9sIGJsb2NrLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NGRzEsIGZyYW1lR3JvdXBMZW5ndGgpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DRkcyLCAoMHgwMDgwMDAwMCB8IGZyYW1lR3JvdXBMZW5ndGgpKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NTVCwgMHgwMDAwRkZGRik7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NTUEIsICgoNjU1MzYgKiByYXRlKSAvIDI0MDAwKSk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgKEJBMV9DU1BCICsgNCksIDB4MDAwMEZGRkYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlkbWFidWYtPnJhdGUgPSByYXRlOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9hZGNfcmF0ZSgpLSAlZFxuIixyYXRlKSApOwotCXJldHVybiByYXRlOwotfQotCi0vKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcGxheWJhY2sgKi8gCi1zdGF0aWMgdm9pZCBjc19wbGF5X3NldHVwKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLSAgICAgICAgdW5zaWduZWQgaW50IHRtcCwgQ291bnQsIHBsYXlGb3JtYXQ7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wbGF5X3NldHVwKCkrXG4iKSApOwotICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUFZPTCwgMHg4MDAwODAwMCk7Ci0gICAgICAgIGlmICghZG1hYnVmLT5TR29rKQotICAgICAgICAgICAgICAgY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BCQSwgdmlydF90b19idXMoZG1hYnVmLT5wYnVmKSk7Ci0gICAgCi0gICAgICAgIENvdW50ID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHBsYXlGb3JtYXQ9Y3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmICgoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGxheUZvcm1hdCAmPSB+RE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQ291bnQgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfihETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwbGF5Rm9ybWF0IHw9IChETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRE1BX1JRX0MyX0FDX1NJR05FRF9DT05WRVJUKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BGSUUsIHBsYXlGb3JtYXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BEVEMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdG1wICY9IDB4ZmZmZmZlMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BEVEMsIHRtcCB8IC0tQ291bnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BsYXlfc2V0dXAoKS1cbiIpICk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgSW5pdFN0cnVjdAotewotICAgIHUzMiBvZmY7Ci0gICAgdTMyIHZhbDsKLX0gSW5pdEFycmF5W10gPSB7IHsweDAwMDAwMDQwLCAweDNmYzAwMDBmfSwKLSAgICAgICAgICAgICAgICAgIHsweDAwMDAwMDRjLCAweDA0ODAwMDAwfSwKLQotICAgICAgICAgICAgICAgICAgezB4MDAwMDAwYjMsIDB4MDAwMDA3ODB9LAotICAgICAgICAgICAgICAgICAgezB4MDAwMDAwYjcsIDB4MDAwMDAwMDB9LAotICAgICAgICAgICAgICAgICAgezB4MDAwMDAwYmMsIDB4MDc4MDAwMDB9LAotCi0gICAgICAgICAgICAgICAgICB7MHgwMDAwMDBjZCwgMHgwMDgwMDAwMH0sCi0gICAgICAgICAgICAgICAgfTsKLQotLyoKLSAqICJTZXRDYXB0dXJlU1BWYWx1ZXMoKSIgLS0gSW5pdGlhbGl6ZSByZWNvcmQgdGFzayB2YWx1ZXMgYmVmb3JlIGVhY2gKLSAqIAljYXB0dXJlIHN0YXJ0dXAuICAKLSAqLwotc3RhdGljIHZvaWQgU2V0Q2FwdHVyZVNQVmFsdWVzKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCXVuc2lnbmVkIGksIG9mZnNldDsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50aygiY3M0Nnh4OiBTZXRDYXB0dXJlU1BWYWx1ZXMoKStcbiIpICk7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihJbml0QXJyYXkpIC8gc2l6ZW9mKHN0cnVjdCBJbml0U3RydWN0KTsgaSsrKSB7Ci0JCW9mZnNldCA9IEluaXRBcnJheVtpXS5vZmYqNDsgLyogOGJpdCB0byAzMmJpdCBvZmZzZXQgdmFsdWUgKi8KLQkJY3M0NjF4X3Bva2UoY2FyZCwgb2Zmc2V0LCBJbml0QXJyYXlbaV0udmFsICk7Ci0JfQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKCJjczQ2eHg6IFNldENhcHR1cmVTUFZhbHVlcygpLVxuIikgKTsKLX0KLQotLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHJlY29yZGluZyAqLwotc3RhdGljIHZvaWQgY3NfcmVjX3NldHVwKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlY19zZXR1cCgpK1xuIikpOwotCVNldENhcHR1cmVTUFZhbHVlcyhjYXJkKTsKLQotCS8qCi0JICogc2V0IHRoZSBhdHRlbnVhdGlvbiB0byAwZEIgCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NWT0wsIDB4ODAwMDgwMDApOwotCi0JLyoKLQkgKiBzZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGludG8gdGhlIFNQCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NCQSwgdmlydF90b19idXMoZG1hYnVmLT5yYXdidWYpKTsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlY19zZXR1cCgpLVxuIikgKTsKLX0KLQotCi0vKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCi0gICBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkISAqLwotICAgCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNzX2dldF9kbWFfYWRkcihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXUzMiBvZmZzZXQ7Ci0JCi0JaWYgKCAoIShkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgJiYKLQkgICAgICghKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpICkgKQotCXsKLQkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoCi0JCQkiY3M0Nnh4OiBFUlJPUiBjc19nZXRfZG1hX2FkZHIoKTogbm90IGVuYWJsZWQgXG4iKSApOwotCQlyZXR1cm4gMDsKLQl9Ci0JCQotCS8qCi0JICogZ3JhbnVsYXJpdHkgaXMgYnl0ZSBib3VuZGFyeSwgZ29vZCBwYXJ0LgotCSAqLwotCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQotCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX1BCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCWVsc2UgLyogQURDX1JVTk5JTkcgbXVzdCBiZSBzZXQgKi8KLQkJb2Zmc2V0ID0gY3M0NjF4X3BlZWsoc3RhdGUtPmNhcmQsIEJBMV9DQkEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCUNTX0RCR09VVChDU19QQVJNUyB8IENTX0ZVTkNUSU9OLCA5LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX2dldF9kbWFfYWRkcigpICVkXG4iLG9mZnNldCkgKTsKLQlvZmZzZXQgPSAodTMyKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW9mZnNldCkgLSAodTMyKWRtYWJ1Zi0+cmF3YnVmOwotCUNTX0RCR09VVChDU19QQVJNUyB8IENTX0ZVTkNUSU9OLCA4LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX2dldF9kbWFfYWRkcigpLSAlZFxuIixvZmZzZXQpICk7Ci0JcmV0dXJuIG9mZnNldDsKLX0KLQotc3RhdGljIHZvaWQgcmVzeW5jX2RtYV9wdHJzKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHJlc3luY19kbWFfcHRycygpKyBcbiIpICk7Ci0JaWYgKHN0YXRlKSB7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQlkbWFidWYtPmh3cHRyPWRtYWJ1Zi0+c3dwdHIgPSAwOwotCQlkbWFidWYtPnByaW5nYnVmID0gMDsKLQl9Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogcmVzeW5jX2RtYV9wdHJzKCktIFxuIikgKTsKLX0KLQkKLS8qIFN0b3AgcmVjb3JkaW5nIChsb2NrIGhlbGQpICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zdG9wX2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQkKLQlkbWFidWYtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7Ci0JCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwotCXRtcCAmPSAweEZGRkYwMDAwOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgKTsKLX0KLQotc3RhdGljIHZvaWQgc3RvcF9hZGMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9hZGMoKSsgXG4iKSApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCV9fc3RvcF9hZGMoc3RhdGUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9hZGMoKS0gXG4iKSApOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCEoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgJiYgCi0JICAgICAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKWRtYWJ1Zi0+ZG1hc2l6ZSkgCi0JICAgICAgICYmIGRtYWJ1Zi0+cmVhZHkpICYmIAotCSAgICAgICAoKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHx8IAotCSAgICAgICAgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1JFU1VNRUQpKSApCi0JewotCQlkbWFidWYtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKLQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwotCQl0bXAgJj0gMHhGRkZGMDAwMDsKLQkJdG1wIHw9IGNhcmQtPmNjdGw7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKAotCQkJImNzNDZ4eDogc3RhcnRfYWRjKCkgcG9rZSAweCV4IFxuIix0bXApICk7Ci0JCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXApOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIHN0b3AgcGxheWJhY2sgKGxvY2sgaGVsZCkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOwotCQotCXRtcD1jczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JdG1wJj0weEZGRkY7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0b3BfZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0b3BfZGFjKCkrIFxuIikgKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlfX3N0b3BfZGFjKHN0YXRlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0b3BfZGFjKCktIFxuIikgKTsKLX0JCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X2RhYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RhcnRfZGFjKCkrIFxuIikgKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCWlmICghKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpICYmIAotCSAgICAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPiAwKSAmJiBkbWFidWYtPnJlYWR5KSAmJgotCSAgICAgICAoKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHx8IAotCSAgICAgICAgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1JFU1VNRUQpKSApCi0JewotCQlkbWFidWYtPmVuYWJsZSB8PSBEQUNfUlVOTklORzsKLQkJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BDVEwpOwotCQl0bXAgJj0gMHhGRkZGOwotCQl0bXAgfD0gY2FyZC0+cGN0bDsKLQkJQ1NfREJHT1VUKENTX1BBUk1TLCA2LCBwcmludGsoCi0JCSAgICAiY3M0Nnh4OiBzdGFydF9kYWMoKSBwb2tlIGNhcmQ9JXAgdG1wPTB4JS4wOHggYWRkcj0lcCBcbiIsCi0JCSAgICBjYXJkLCAodW5zaWduZWQpdG1wLCAKLQkJICAgIGNhcmQtPmJhMS5pZHhbKEJBMV9QQ1RMID4+IDE2KSAmIDNdKyhCQTFfUENUTCYweGZmZmYpICkgKTsKLQkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdGFydF9kYWMoKS0gXG4iKSApOwotfQotCi0jZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCi0KLS8qCi0gKiBhbGxvY2F0ZSBETUEgYnVmZmVyLCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIGJ1ZmZlcnMgYXJlIHNlcGFyYXRlLgotICovCi1zdGF0aWMgaW50IGFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQotewotCi0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ9c3RhdGUtPmNhcmQ7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0Jdm9pZCAqcmF3YnVmID0gTlVMTDsKLQl2b2lkICp0bXBidWZmID0gTlVMTDsKLQlpbnQgb3JkZXI7Ci0Jc3RydWN0IHBhZ2UgKm1hcCwgKm1hcGVuZDsKLQl1bnNpZ25lZCBsb25nIGRmOwotCQotCWRtYWJ1Zi0+cmVhZHkgID0gZG1hYnVmLT5tYXBwZWQgPSAwOwotCWRtYWJ1Zi0+U0dvayA9IDA7Ci0vKgotKiBjaGVjayBmb3Igb3JkZXIgd2l0aGluIGxpbWl0cywgYnV0IGRvIG5vdCBvdmVyd3JpdGUgdmFsdWUuCi0qLwotCWlmICgoZGVmYXVsdG9yZGVyID4gMSkgJiYgKGRlZmF1bHRvcmRlciA8IDEyKSkKLQkJZGYgPSBkZWZhdWx0b3JkZXI7Ci0JZWxzZQotCQlkZiA9IDI7CQotCi0JZm9yIChvcmRlciA9IGRmOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCi0JCWlmICgocmF3YnVmID0gKHZvaWQgKilwY2lfYWxsb2NfY29uc2lzdGVudCgKLQkJCWNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRtYWJ1Zi0+ZG1hYWRkcikpKQotCQkJICAgIGJyZWFrOwotCWlmICghcmF3YnVmKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCQkiY3M0Nnh4OiBhbGxvY19kbWFidWYoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHJhd2J1ZlxuIikpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOwotCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOwotCS8vIE5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHRoZSAKLQkvLyByZW1hcF9wZm5fcmFuZ2UoKSBpbiBjczQ2eHhfbW1hcCBkb2Vzbid0IHdvcmsuCi0JLy8gMS4gZ2V0IGluZGV4IHRvIGxhc3QgcGFnZSBpbiBtZW1fbWFwIGFycmF5IGZvciByYXdidWYuCi0JbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgCi0JCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKLQotCS8vIDIuIG1hcmsgZWFjaCBwaHlzaWNhbCBwYWdlIGluIHJhbmdlIGFzICdyZXNlcnZlZCcuCi0JZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKLQkJY3M0eF9tZW1fbWFwX3Jlc2VydmUobWFwKTsKLQotCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKCJjczQ2eHg6IGFsbG9jX2RtYWJ1ZigpOiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKLQkgICAgICAgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgcmF3YnVmKSApOwotCi0vKgotKiAgb25seSBhbGxvY2F0ZSB0aGUgY29udmVyc2lvbiBidWZmZXIgZm9yIHRoZSBBREMKLSovCi0JaWYgKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0RBQykgewotCQlkbWFidWYtPnRtcGJ1ZmYgPSBOVUxMOwotCQlkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0vKgotICogbm93IHRoZSB0ZW1wIGJ1ZmZlciBmb3IgMTYvOCBjb252ZXJzaW9ucwotICovCi0KLQl0bXBidWZmID0gKHZvaWQgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoCi0JCWNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRtYWJ1Zi0+ZG1hYWRkcl90bXBidWZmKTsKLQotCWlmICghdG1wYnVmZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoImNzNDZ4eDogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCi0JICAgICAgIFBBR0VfU0laRSA8PCBvcmRlciwgb3JkZXIsIHRtcGJ1ZmYpICk7Ci0KLQlkbWFidWYtPnRtcGJ1ZmYgPSB0bXBidWZmOwotCWRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZiA9IG9yZGVyOwotCQotCS8vIE5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHRoZSAKLQkvLyByZW1hcF9wZm5fcmFuZ2UoKSBpbiBjczQ2eHhfbW1hcCBkb2Vzbid0IHdvcmsuCi0JLy8gMS4gZ2V0IGluZGV4IHRvIGxhc3QgcGFnZSBpbiBtZW1fbWFwIGFycmF5IGZvciByYXdidWYuCi0JbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZiArIAotCQkoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKLQotCS8vIDIuIG1hcmsgZWFjaCBwaHlzaWNhbCBwYWdlIGluIHJhbmdlIGFzICdyZXNlcnZlZCcuCi0JZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCi0JCWNzNHhfbWVtX21hcF9yZXNlcnZlKG1hcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGZyZWUgRE1BIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQgZGVhbGxvY19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOwotCi0JaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7Ci0JCS8vIFVuZG8gcHJvZ19kbWFidWYoKSdzIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkIAotCQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAKLQkJCQkoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7Ci0JCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCi0JCQljczR4X21lbV9tYXBfdW5yZXNlcnZlKG1hcCk7Ci0JCWZyZWVfZG1hYnVmKHN0YXRlLT5jYXJkLCBkbWFidWYpOwotCX0KLQotCWlmIChkbWFidWYtPnRtcGJ1ZmYpIHsKLQkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCi0JCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYgKwotCQkJCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcl90bXBidWZmKSAtIDEpOwotCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKLQkJCWNzNHhfbWVtX21hcF91bnJlc2VydmUobWFwKTsKLQkJZnJlZV9kbWFidWYyKHN0YXRlLT5jYXJkLCBkbWFidWYpOwotCX0KLQotCWRtYWJ1Zi0+cmF3YnVmID0gTlVMTDsKLQlkbWFidWYtPnRtcGJ1ZmYgPSBOVUxMOwotCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Ci0JZG1hYnVmLT5TR29rID0gMDsKLX0KLQotc3RhdGljIGludCBfX3Byb2dfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0gICAgICAgIHN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFsbG9jYXRlZF9wYWdlcywgYWxsb2NhdGVkX2J5dGVzOyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB1bnNpZ25lZCBsb25nIHRtcDEsIHRtcDIsIGZtdD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqcHRtcCA9ICh1bnNpZ25lZCBsb25nICopIGRtYWJ1Zi0+cGJ1ZjsgICAgICAgICAgICAgICAKLSAgICAgICAgdW5zaWduZWQgbG9uZyBTR2FycmF5WzldLCBuU0dwYWdlcz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IHJldDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkrIFxuIikpOwotLyoKLSAqIGNoZWNrIGZvciBDQVBUVVJFIGFuZCB1c2Ugb25seSBub24tc2cgZm9yIGluaXRpYWwgcmVsZWFzZQotICovCi0JaWYgKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0FEQykgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpIEFEQ1xuIikpOwotCQkvKiAKLQkJICogYWRkIGluIG5vbi1zZyBzdXBwb3J0IGZvciBjYXB0dXJlLgotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JLyogYWRkIGNvZGUgdG8gcmVzZXQgdGhlIHJhd2J1ZiBtZW1vcnkuIFRSVyAqLwotCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOwotCQlkbWFidWYtPnRvdGFsX2J5dGVzID0gZG1hYnVmLT5ibG9ja3MgPSAwOwotCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IGRtYWJ1Zi0+dW5kZXJydW4gPSAwOwotCi0JCWRtYWJ1Zi0+U0dvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCi0JCWlmICghZG1hYnVmLT5yYXdidWYgfHwgIWRtYWJ1Zi0+dG1wYnVmZikKLQkJCWlmICgocmV0ID0gYWxsb2NfZG1hYnVmKHN0YXRlKSkpCi0JCQkJcmV0dXJuIHJldDsgCi0JLyoKLQkgKiBzdGF0aWMgaW1hZ2Ugb25seSBzdXBwb3J0cyAxNkJpdCBzaWduZWQsIHN0ZXJlbyAtIGhhcmQgY29kZSBmbXQKLQkgKi8KLQkJZm10ID0gQ1NfRk1UXzE2QklUIHwgQ1NfRk1UX1NURVJFTzsKLQotCQlkbWFidWYtPm51bWZyYWcgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJZG1hYnVmLT5mcmFnc2l6ZSA9IDIwNDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSAyMDQ4ID4+IHNhbXBsZV9zaGlmdFtmbXRdOyAgICAKLQkJZG1hYnVmLT5kbWFzaXplID0gNDA5NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgKGZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKLQkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7Ci0gICAgICAgIAltZW1zZXQoZG1hYnVmLT50bXBidWZmLCAoZm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLCAKLQkJCVBBR0VfU0laRTw8ZG1hYnVmLT5idWZvcmRlcl90bXBidWZmKTsgICAgICAKLQotCQkvKgotCQkgKiAgICAgIE5vdyBzZXQgdXAgdGhlIHJpbmcKLQkJICovCi0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCWNzX3JlY19zZXR1cChzdGF0ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLwotCQlkbWFidWYtPnJlYWR5ID0gMTsKLQotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCSJjczQ2eHg6IHByb2dfZG1hYnVmKCk6IENBUFRVUkUgcmF0ZT0lZCBmbXQ9MHgleCBudW1mcmFnPSVkICIKLQkJCSJmcmFnc2l6ZT0lZCBkbWFzaXplPSVkXG4iLAotCQkJICAgIGRtYWJ1Zi0+cmF0ZSwgZG1hYnVmLT5mbXQsIGRtYWJ1Zi0+bnVtZnJhZywKLQkJCSAgICBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpICk7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKS0gMCBcbiIpKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpIHsKLQkvKgotCSAqIE11c3QgYmUgREFDCi0JICovCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgREFDXG4iKSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOwotCQlkbWFidWYtPnRvdGFsX2J5dGVzID0gZG1hYnVmLT5ibG9ja3MgPSAwOwotCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IGRtYWJ1Zi0+dW5kZXJydW4gPSAwOwotCi0JCWRtYWJ1Zi0+U0dvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCi0JCWlmICghZG1hYnVmLT5yYXdidWYpCi0JCQlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCXJldHVybiByZXQ7Ci0KLQkJYWxsb2NhdGVkX3BhZ2VzID0gMSA8PCBkbWFidWYtPmJ1Zm9yZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJYWxsb2NhdGVkX2J5dGVzID0gYWxsb2NhdGVkX3BhZ2VzKlBBR0VfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJCQkgICAgCi0JCWlmIChhbGxvY2F0ZWRfcGFnZXMgPCAyKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygKLQkJCSAgICAiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpIEVycm9yOiBhbGxvY2F0ZWRfcGFnZXMgdG9vIHNtYWxsICglZClcbiIsCi0JCQkJKHVuc2lnbmVkKWFsbG9jYXRlZF9wYWdlcykpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJCQkJCQkJCQkgICAgCi0JCS8qIFVzZSBhbGwgdGhlIHBhZ2VzIGFsbG9jYXRlZCwgZnJhZ3NpemUgNGsuICovCi0JCS8qIFVzZSAncGJ1ZicgZm9yIFMvRyBwYWdlIG1hcCB0YWJsZS4gKi8KLQkJZG1hYnVmLT5TR29rID0gMTsgICAgICAgICAgIC8qIFVzZSBTL0cuICovCi0KLQkJblNHcGFnZXMgPSBhbGxvY2F0ZWRfYnl0ZXMvNDA5NjsgICAgLyogUy9HIHBhZ2VzIGFsd2F5cyA0ay4gKi8KLQkJCQkJCQkJCQkgICAgCi0JCSAgICAgLyogU2V0IHVwIFMvRyB2YXJpYWJsZXMuICovCi0JCSpwdG1wID0gdmlydF90b19idXMoZG1hYnVmLT5yYXdidWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSoocHRtcCArIDEpID0gMHgwMDAwMDAwODsKLQkJZm9yICh0bXAxID0gMTsgdG1wMSA8IG5TR3BhZ2VzOyB0bXAxKyspIHsKLQkJCSoocHRtcCArIDIgKiB0bXAxKSA9IHZpcnRfdG9fYnVzKChkbWFidWYtPnJhd2J1ZikgKyA0MDk2ICogdG1wMSk7Ci0JCQlpZiAodG1wMSA9PSBuU0dwYWdlcyAtIDEpCi0JCQkJdG1wMiA9IDB4YmZmZjAwMDA7Ci0JCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQl0bXAyID0gMHg4MDAwMDAwMCArIDggKiAodG1wMSArIDEpOwotCQkJKihwdG1wICsgMiAqIHRtcDEgKyAxKSA9IHRtcDI7Ci0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbMF0gPSAweDgyYzAyMDBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbMV0gPSAweGZmZmYwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbMl0gPSAqcHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbM10gPSAweDAwMDEwNjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbNF0gPSAqKHB0bXArMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbNV0gPSAweDgwMDAwMDEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCVNHYXJyYXlbNl0gPSAqcHRtcDsKLQkJU0dhcnJheVs3XSA9ICoocHRtcCsyKTsKLQkJU0dhcnJheVs4XSA9ICh2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpICYgMHhmZmZmMDAwKSB8IDB4MTA7Ci0KLQkJaWYgKGRtYWJ1Zi0+U0dvaykgewotCQkJZG1hYnVmLT5udW1mcmFnID0gblNHcGFnZXM7Ci0JCQlkbWFidWYtPmZyYWdzaXplID0gNDA5NjsKLQkJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSA0MDk2ID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07Ci0JCQlkbWFidWYtPmZyYWdzaGlmdCA9IDEyOwotCQkJZG1hYnVmLT5kbWFzaXplID0gZG1hYnVmLT5udW1mcmFnICogNDA5NjsKLQkJfSBlbHNlIHsKLQkJCVNHYXJyYXlbMF0gPSAweGYyYzAwMDBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJU0dhcnJheVsxXSA9IDB4MDAwMDAyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlTR2FycmF5WzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCVNHYXJyYXlbM10gPSAweDAwMDEwNjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJU0dhcnJheVs0XT1TR2FycmF5WzVdPVNHYXJyYXlbNl09U0dhcnJheVs3XT1TR2FycmF5WzhdID0gMDsgCi0JCQlkbWFidWYtPm51bWZyYWcgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAyMDQ4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsgICAgCi0JCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQl9Ci0JCWZvciAodG1wMSA9IDA7IHRtcDEgPCBzaXplb2YoU0dhcnJheSkgLyA0OyB0bXAxKyspCi0JCQljczQ2MXhfcG9rZShzdGF0ZS0+Y2FyZCwgQkExX1BEVEMrdG1wMSAqIDQsIFNHYXJyYXlbdG1wMV0pOwotCi0JCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLAotCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKLQotCQkvKgotCQkgKiAgICAgIE5vdyBzZXQgdXAgdGhlIHJpbmcKLQkJICovCi0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCWNzX3BsYXlfc2V0dXAoc3RhdGUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKi8KLQkJZG1hYnVmLT5yZWFkeSA9IDE7Ci0KLQkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoCi0JCQkiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpOiBQTEFZQkFDSyByYXRlPSVkIGZtdD0weCV4IG51bWZyYWc9JWQgIgotCQkJImZyYWdzaXplPSVkIGRtYXNpemU9JWRcbiIsCi0JCQkgICAgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAotCQkJICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSkgKTsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSBcbiIpKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKS0gSW52YWxpZCBUeXBlICVkXG4iLAotCQkJZG1hYnVmLT50eXBlKSk7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHByb2dfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCi17Ci0JaW50IHJldDsKLQkKLQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQlyZXQgPSBfX3Byb2dfZG1hYnVmKHN0YXRlKTsKLQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzX2NsZWFyX3RhaWwoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKLXsKLX0KLQotc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSwgaW50IG5vbmJsb2NrKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCXN0cnVjdCBjc19jYXJkICpjYXJkPXN0YXRlLT5jYXJkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyB0bW87Ci0JaW50IGNvdW50OwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCkrIFxuIikpOwotCWlmIChkbWFidWYtPm1hcHBlZCB8fCAhZG1hYnVmLT5yZWFkeSkKLQl7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpLSAwLCBub3QgcmVhZHlcbiIpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwotCWZvciAoOzspIHsKLQkJLyogSXQgc2VlbXMgdGhhdCB3ZSBoYXZlIHRvIHNldCB0aGUgY3VycmVudCBzdGF0ZSB0byBUQVNLX0lOVEVSUlVQVElCTEUKLQkJICAgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzIHJlYWxseSBnbyB0byBzbGVlcCAqLwotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJY291bnQgPSBkbWFidWYtPmNvdW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChjb3VudCA8PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKG5vbmJsb2NrKSB7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gZG1hYnVmLT5yYXRlOwotCQl0bW8gPj49IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07Ci0JCXRtbyArPSAoMjA0OCpIWikvZG1hYnVmLT5yYXRlOwotCQkKLQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IHRtbyA6IDEpICYmIHRtbyl7Ci0JCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogZHJhaW5fZGFjLCBkbWEgdGltZW91dD8gJWRcbiIsIGNvdW50KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIC1FUkVTVEFSVFNZU1xuIikpOwotCQkvKgotCQkqIHNldCB0byBzaWxlbmNlIGFuZCBsZXQgdGhhdCBjbGVhciB0aGUgZmlmb3MuCi0JCSovCi0JCWNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3MoY2FyZCwgQ1NfVFlQRV9EQUMpOwotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCX0KLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpLSAwXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLwotc3RhdGljIHZvaWQgY3NfdXBkYXRlX3B0cihzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHdha2UpCi17Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JdW5zaWduZWQgaHdwdHI7Ci0JaW50IGRpZmY7Ci0KLQkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBBREMgKi8KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7Ci0JCQkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLwotCQkJaHdwdHIgPSBjc19nZXRfZG1hX2FkZHIoc3RhdGUpOwotCi0JCQlkaWZmID0gKGRtYWJ1Zi0+ZG1hc2l6ZSArIGh3cHRyIC0gZG1hYnVmLT5od3B0cikgJSBkbWFidWYtPmRtYXNpemU7Ci0JCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDksIHByaW50aygKLQkJCQkiY3M0Nnh4OiBjc191cGRhdGVfcHRyKCkrIEFEQyBod3B0cj0lZCBkaWZmPSVkXG4iLCAKLQkJCQlod3B0cixkaWZmKSApOwotCQkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOwotCQkJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwotCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPiAwKQotCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQkJfQotCQl9Ci0JfQotCi0vKgotICogTm93IHRoZSBEQUMKLSAqLwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmIChzdGF0ZSkgewotCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgREFDICovCi0JCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7Ci0JCQkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLwotCQkJaHdwdHIgPSBjc19nZXRfZG1hX2FkZHIoc3RhdGUpOwotCi0JCQlkaWZmID0gKGRtYWJ1Zi0+ZG1hc2l6ZSArIGh3cHRyIC0gZG1hYnVmLT5od3B0cikgJSBkbWFidWYtPmRtYXNpemU7Ci0JCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDksIHByaW50aygKLQkJCQkiY3M0Nnh4OiBjc191cGRhdGVfcHRyKCkrIERBQyBod3B0cj0lZCBkaWZmPSVkXG4iLCAKLQkJCQlod3B0cixkaWZmKSApOwotCQkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOwotCQkJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwotCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQotCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwotCQkJCS8qCi0JCQkJICogb3RoZXIgZHJpdmVycyB1c2UgZnJhZ3NpemUsIGJ1dCBkb24ndCBzZWUgYW55IHNlbnNlCi0JCQkJICogaW4gdGhhdCwgc2luY2UgZG1hc2l6ZSBpcyB0aGUgYnVmZmVyIGFza2VkIGZvcgotCQkJCSAqIHZpYSBtbWFwLgotCQkJCSAqLwotCQkJCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQotCQkJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZG1hc2l6ZS0xOwotCQkJfSBlbHNlIHsKLQkJCQlkbWFidWYtPmNvdW50IC09IGRpZmY7Ci0JCQkJLyoKLQkJCQkgKiBiYWNrZmlsbCB3aXRoIHNpbGVuY2UgYW5kIGNsZWFyIG91dCB0aGUgbGFzdCAKLQkJCQkgKiAiZGlmZiIgbnVtYmVyIG9mIGJ5dGVzLgotCQkJCSAqLwotCQkJCWlmIChod3B0ciA+PSBkaWZmKSB7Ci0JCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIGh3cHRyIC0gZGlmZiwgCi0JCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIGRpZmYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgCi0JCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCi0JCQkJCQkodW5zaWduZWQpaHdwdHIpOwotCQkJCQltZW1zZXQoKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIAotCQkJCQkJCWRtYWJ1Zi0+ZG1hc2l6ZSArIGh3cHRyIC0gZGlmZiwKLQkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCi0JCQkJCQlkaWZmIC0gaHdwdHIpOyAKLQkJCQl9Ci0KLQkJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewotCQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KLQkJCQkJICAiY3M0Nnh4OiBFUlJPUiBEQUMgY291bnQ8MCBvciBjb3VudCA+IGRtYXNpemUgKCVkKVxuIiwKLQkJCQkJICAJZG1hYnVmLT5jb3VudCkpOwotCQkJCQkvKiAKLQkJCQkJKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sIHJlc2V0IHRoZQotCQkJCQkqIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gYmFjayB0byAwLgotCQkJCQkqLwotCQkJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApCi0JCQkJCQlkbWFidWYtPnVuZGVycnVuID0gMTsKLQkJCQkJZG1hYnVmLT5jb3VudCA9IDA7Ci0JCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKLQkJCQl9Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplIC8gMikKLQkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJCX0KLQkJfQotCX0KLX0KLQotCi0vKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLwotc3RhdGljIHZvaWQgY3NfaGFuZGxlX21pZGkoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgY2g7Ci0gICAgICAgIGludCB3YWtlOwotICAgICAgICB1bnNpZ25lZCB0ZW1wMTsKLQotICAgICAgICB3YWtlID0gMDsKLSAgICAgICAgd2hpbGUgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgIEJBMF9NSURTUikgJiBNSURTUl9SQkUpKSB7Ci0gICAgICAgICAgICAgICAgY2ggPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfTUlEUlApOwotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLmljbnQgPCBDU19NSURJSU5CVUYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaWJ1ZltjYXJkLT5taWRpLml3cl0gPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXdyID0gKGNhcmQtPm1pZGkuaXdyICsgMSkgJSBDU19NSURJSU5CVUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmljbnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2FrZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdha2UpCi0gICAgICAgICAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5pd2FpdCk7Ci0gICAgICAgIHdha2UgPSAwOwotICAgICAgICB3aGlsZSAoIShjczQ2MXhfcGVla0JBMChjYXJkLCAgQkEwX01JRFNSKSAmIE1JRFNSX1RCRikgJiYgY2FyZC0+bWlkaS5vY250ID4gMCkgewotICAgICAgICAgICAgICAgIHRlbXAxID0gKCBjYXJkLT5taWRpLm9idWZbY2FyZC0+bWlkaS5vcmRdICkgJiAweDAwMDAwMGZmOwotICAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9NSURXUCx0ZW1wMSk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vcmQgPSAoY2FyZC0+bWlkaS5vcmQgKyAxKSAlIENTX01JRElPVVRCVUY7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vY250LS07Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkub2NudCA8IENTX01JRElPVVRCVUYtMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICB3YWtlID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2FrZSkKLSAgICAgICAgICAgICAgICB3YWtlX3VwKCZjYXJkLT5taWRpLm93YWl0KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGNzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilkZXZfaWQ7Ci0JLyogU2luZ2xlIGNoYW5uZWwgY2FyZCAqLwotCXN0cnVjdCBjc19zdGF0ZSAqcmVjc3RhdGUgPSBjYXJkLT5jaGFubmVsWzBdLnN0YXRlOwotCXN0cnVjdCBjc19zdGF0ZSAqcGxheXN0YXRlID0gY2FyZC0+Y2hhbm5lbFsxXS5zdGF0ZTsKLQl1MzIgc3RhdHVzOwotCi0JQ1NfREJHT1VUKENTX0lOVEVSUlVQVCwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzX2ludGVycnVwdCgpKyBcbiIpKTsKLQotCXNwaW5fbG9jaygmY2FyZC0+bG9jayk7Ci0KLQlzdGF0dXMgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfSElTUik7Ci0JCi0JaWYgKChzdGF0dXMgJiAweDdmZmZmZmZmKSA9PSAwKSB7Ci0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0NIR018SElDUl9JRVYpOwotCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsJLyogTWlnaHQgYmUgSVJRX05PTkUuLiAqLwotCX0KLQkKLQkvKgotCSAqIGNoZWNrIGZvciBwbGF5YmFjayBvciBjYXB0dXJlIGludGVycnVwdCBvbmx5Ci0JICovCi0JaWYgKCgoc3RhdHVzICYgSElTUl9WQzApICYmIHBsYXlzdGF0ZSAmJiBwbGF5c3RhdGUtPmRtYWJ1Zi5yZWFkeSkgfHwKLQkgICAgKCgoc3RhdHVzICYgSElTUl9WQzEpICYmIHJlY3N0YXRlICYmIHJlY3N0YXRlLT5kbWFidWYucmVhZHkpKSkgewotCQlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA4LCBwcmludGsoCi0JCQkiY3M0Nnh4OiBjc19pbnRlcnJ1cHQoKSBpbnRlcnJ1cHQgYml0KHMpIHNldCAoMHgleClcbiIsc3RhdHVzKSk7Ci0JCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JfQotCi0gICAgICAgIGlmIChzdGF0dXMgJiBISVNSX01JREkpCi0gICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7Ci0JCi0gCS8qIGNsZWFyICdlbSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0NIR018SElDUl9JRVYpOwotCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKLQlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCktIFxuIikpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHNzaXplX3QgY3NfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIHNzaXplX3QgcmV0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBwdHI7Ci0gICAgICAgIGludCBjbnQ7Ci0KLSAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgcHRyID0gY2FyZC0+bWlkaS5pcmQ7Ci0gICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESUlOQlVGIC0gcHRyOwotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLmljbnQgPCBjbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBjYXJkLT5taWRpLmljbnQ7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGlmIChjbnQgPiBjb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IGNvdW50OwotICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkuaXdhaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBjYXJkLT5taWRpLmlidWYgKyBwdHIsIGNudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKLSAgICAgICAgICAgICAgICBwdHIgPSAocHRyICsgY250KSAlIENTX01JRElJTkJVRjsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXJkID0gcHRyOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaWNudCAtPSBjbnQ7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNvdW50IC09IGNudDsKLSAgICAgICAgICAgICAgICBidWZmZXIgKz0gY250OwotICAgICAgICAgICAgICAgIHJldCArPSBjbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjc19taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIHNzaXplX3QgcmV0OwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBwdHI7Ci0gICAgICAgIGludCBjbnQ7Ci0KLSAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICByZXQgPSAwOwotICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBwdHIgPSBjYXJkLT5taWRpLm93cjsKLSAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJT1VUQlVGIC0gcHRyOwotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgKyBjbnQgPiBDU19NSURJT1VUQlVGKQotICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESU9VVEJVRiAtIGNhcmQtPm1pZGkub2NudDsKLSAgICAgICAgICAgICAgICBpZiAoY250IDw9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjc19oYW5kbGVfbWlkaShjYXJkKTsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA+IGNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNudCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5vd2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGNhcmQtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcHRyID0gKHB0ciArIGNudCkgJSBDU19NSURJT1VUQlVGOwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vd3IgPSBwdHI7Ci0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vY250ICs9IGNudDsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgY291bnQgLT0gY250OwotICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjbnQ7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IGNudDsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICAgICAgICAgIGNzX2hhbmRsZV9taWRpKGNhcmQpOwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3NfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLSAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkKLSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNhcmQtPm1pZGkub3dhaXQsIHdhaXQpOwotICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpCi0gICAgICAgICAgICAgICAgcG9sbF93YWl0KGZpbGUsICZjYXJkLT5taWRpLml3YWl0LCB3YWl0KTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkgewotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgPCBDU19NSURJT1VUQlVGKQotICAgICAgICAgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLSAgICAgICAgfQotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIHJldHVybiBtYXNrOwotfQotCi0KLXN0YXRpYyBpbnQgY3NfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotICAgICAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IE5VTEw7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJaWYgKGNhcmQtPmRldl9taWRpID09IG1pbm9yKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVudHJ5ID09ICZjczQ2eHhfZGV2cykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KLQkJCSJjczQ2eHg6IGNzNDZ4eF9taWRpX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBjYXJkIHN0cnVjdFxuIikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLSAgICAgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKLSAgICAgICAgLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCi0gICAgICAgIG11dGV4X2xvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIHdoaWxlIChjYXJkLT5taWRpLm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgewotICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXhfdW5sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbXV0ZXhfdW5sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKLSAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOwotICAgICAgICAgICAgICAgIG11dGV4X2xvY2soJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPm1pZGkubG9jaywgZmxhZ3MpOwotICAgICAgICBpZiAoIShjYXJkLT5taWRpLm9wZW5fbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSkgewotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXJkID0gY2FyZC0+bWlkaS5pd3IgPSBjYXJkLT5taWRpLmljbnQgPSAwOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3JkID0gY2FyZC0+bWlkaS5vd3IgPSBjYXJkLT5taWRpLm9jbnQgPSAwOwotICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXJkID0gY2FyZC0+bWlkaS5pd3IgPSBjYXJkLT5taWRpLmljbnQgPSAwOwotICAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9NSURDUiwgMHgwMDAwMDAwZik7ICAgICAgICAgICAgLyogRW5hYmxlIHhtaXQsIHJjdi4gKi8KLSAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9JRVYgfCBISUNSX0NIR00pOyAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0gICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7Ci0gICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLSAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IGNhcmQtPm1pZGkub3dyID0gY2FyZC0+bWlkaS5vY250ID0gMDsKLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7Ci0gICAgICAgIGNhcmQtPm1pZGkub3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSk7Ci0gICAgICAgIG11dGV4X3VubG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBjc19taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgdW5zaWduZWQgY291bnQsIHRtbzsKLQotICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLSAgICAgICAgICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmY2FyZC0+bWlkaS5vd2FpdCwgJndhaXQpOwotICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY2FyZC0+bWlkaS5vY250OwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImNzNDZ4eDogbWlkaSB0aW1lZCBvdXQ/P1xuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZjYXJkLT5taWRpLm93YWl0LCAmd2FpdCk7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0gICAgICAgIH0KLSAgICAgICAgbXV0ZXhfbG9jaygmY2FyZC0+bWlkaS5vcGVuX211dGV4KTsKLSAgICAgICAgY2FyZC0+bWlkaS5vcGVuX21vZGUgJj0gKH4oZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpKTsKLSAgICAgICAgbXV0ZXhfdW5sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwotICAgICAgICB3YWtlX3VwKCZjYXJkLT5taWRpLm9wZW5fd2FpdCk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKgotICogICBNaWRpIGZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3QuCi0gKi8KLXN0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjc19taWRpX2ZvcHMgPSB7Ci0JQ1NfT1dORVIJQ1NfVEhJU19NT0RVTEUKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBjc19taWRpX3JlYWQsCi0JLndyaXRlCQk9IGNzX21pZGlfd3JpdGUsCi0JLnBvbGwJCT0gY3NfbWlkaV9wb2xsLAotCS5vcGVuCQk9IGNzX21pZGlfb3BlbiwKLQkucmVsZWFzZQk9IGNzX21pZGlfcmVsZWFzZSwKLX07Ci0KLS8qCi0gKgotICogQ29weVNhbXBsZXMgY29waWVzIDE2LWJpdCBzdGVyZW8gc2lnbmVkIHNhbXBsZXMgZnJvbSB0aGUgc291cmNlIHRvIHRoZQotICogZGVzdGluYXRpb24sIHBvc3NpYmx5IGNvbnZlcnRpbmcgZG93biB0byB1bnNpZ25lZCA4LWJpdCBhbmQvb3IgbW9uby4KLSAqIGNvdW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyB0byB3cml0ZS4KLSAqCi0gKiAgQXJndW1lbnRzOgotICoKLSAqICBkc3QgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgZGVzdGluYXRpb24gYnVmZmVyLgotICogIHNyYyAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSBzb3VyY2UgYnVmZmVyCi0gKiAgY291bnQgICAgICAgICAgIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KLSAqICBmbXQgICAgICAgICAgICAgLSBDU19GTVRfMTZCSVQgYW5kL29yIENTX0ZNVF9TVEVSRU8gYml0cwotICogIGRtYWJ1ZiAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRtYSBidWZmZXIgc3RydWN0dXJlCi0gKgotICogTk9URVM6IG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUgaWYgdGhlIG91dHB1dCBkZXNpcmVkIGlzIG5vdCAxNiBTaWduZWQgU3RlcmVvCi0gKiAJCi0gKgotICovCi1zdGF0aWMgdm9pZCBDb3B5U2FtcGxlcyhjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IGNvdW50LCB1bnNpZ25lZCBmbXQsIAotCQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYpCi17Ci0gICAgczMyIHMzMkF1ZGlvU2FtcGxlOwotICAgIHMxNiAqcHNTcmMgPSAoczE2ICopc3JjOwotICAgIHMxNiAqcHNEc3QgPSAoczE2ICopZHN0OwotICAgIHU4ICpwdWNEc3QgPSAodTggKilkc3Q7Ci0KLSAgICBDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQ29weVNhbXBsZXMoKSsgIikgKTsKLSAgICBDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCi0JIiBkc3Q9JXAgc3JjPSVwIGNvdW50PSVkIGZtdD0weCV4XG4iLAotCWRzdCxzcmMsY291bnQsZm10KSApOwotCi0gICAgLyoKLSAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhcyA4LWJpdCB1bnNpZ25lZCBzdGVyZW8uCi0gICAgICovCi0gICAgaWYgKChmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAhKGZtdCAmIENTX0ZNVF8xNkJJVCkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCBlYWNoIDE2LWJpdCBzaWduZWQgc3RlcmVvIHNhbXBsZSB0byA4LWJpdCB1bnNpZ25lZCAKLQkgKiBzdGVyZW8gdXNpbmcgcm91bmRpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwc1NyYyA9IChzMTYgKilzcmM7Ci0JY291bnQgPSBjb3VudCAvIDI7Ci0gICAgICAgIHdoaWxlIChjb3VudC0tKQotICAgICAgICAgICAgKihwdWNEc3QrKykgPSAodTgpKCgoczE2KSgqcHNTcmMrKykgKyAoczE2KTB4ODAwMCkgPj4gOCk7Ci0gICAgfQotICAgIC8qCi0gICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgOC1iaXQgdW5zaWduZWQgbW9uby4KLSAgICAgKi8KLSAgICBlbHNlIGlmICghKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmICEoZm10ICYgQ1NfRk1UXzE2QklUKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDgtYml0IHVuc2lnbmVkIAotCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nIGFuZCByb3VuZGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKLQljb3VudCA9IGNvdW50IC8gMjsKLSAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKLQkgICAgczMyQXVkaW9TYW1wbGUgPSAoKCpwc1NyYykgKyAoKihwc1NyYyArIDEpKSkgLyAyICsgKHMzMikweDgwOwotCSAgICBpZiAoczMyQXVkaW9TYW1wbGUgPiAweDdmZmYpCi0JICAgIAlzMzJBdWRpb1NhbXBsZSA9IDB4N2ZmZjsKLSAgICAgICAgICAgICoocHVjRHN0KyspID0gKHU4KSgoKHMxNilzMzJBdWRpb1NhbXBsZSArIChzMTYpMHg4MDAwKSA+PiA4KTsKLQkgICAgcHNTcmMgKz0gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKgotICAgICAqIFNlZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgb3V0cHV0IGF0IDE2LWJpdCBzaWduZWQgbW9uby4KLSAgICAgKi8KLSAgICBlbHNlIGlmICghKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIChmbXQgJiBDU19GTVRfMTZCSVQpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gMTYtYml0IHNpZ25lZCAKLQkgKiBtb25vIHVzaW5nIGF2ZXJhZ2luZy4KLSAgICAgICAgICovCi0gICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKLQljb3VudCA9IGNvdW50IC8gMjsKLSAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgICAgICAgICoocHNEc3QrKykgPSAoczE2KSgoKnBzU3JjKSArICgqKHBzU3JjICsgMSkpKSAvIDI7Ci0JICAgIHBzU3JjICs9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBjc19jb3B5X3RvX3VzZXIoKQotICogcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCBjb3B5X3RvX3VzZXIsIHRvIGFsbG93IGZvciBhIGNvbnZlcnNpb24gZnJvbQotICogMTYgYml0IHRvIDggYml0IGFuZCBmcm9tIHN0ZXJlbyB0byBtb25vLCBpZiB0aGUgcmVjb3JkIGNvbnZlcnNpb24gaXMgYWN0aXZlLiAgCi0gKiBUaGUgY3VycmVudCBDUzQ2eHgvQ1M0MjgwIHN0YXRpYyBpbWFnZSBvbmx5IHJlY29yZHMgaW4gMTZiaXQgdW5zaWduZWQgU3RlcmVvLCAKLSAqIHNvIHdlIGNvbnZlcnQgZnJvbSBhbnkgb2YgdGhlIG90aGVyIGZvcm1hdCBjb21iaW5hdGlvbnMuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjc19jb3B5X3RvX3VzZXIoCi0Jc3RydWN0IGNzX3N0YXRlICpzLCAKLQl2b2lkIF9fdXNlciAqZGVzdCwgCi0Jdm9pZCAqaHdzcmMsIAotCXVuc2lnbmVkIGNudCwgCi0JdW5zaWduZWQgKmNvcGllZCkKLXsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmcy0+ZG1hYnVmOwotCXZvaWQgKnNyYyA9IGh3c3JjOyAgLyogZGVmYXVsdCB0byB0aGUgc3RhbmRhcmQgZGVzdGluYXRpb24gYnVmZmVyIGFkZHIgKi8KLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzX2NvcHlfdG9fdXNlcigpKyBmbXQ9MHgleCBjbnQ9JWQgZGVzdD0lcFxuIiwKLQkJZG1hYnVmLT5mbXQsKHVuc2lnbmVkKWNudCxkZXN0KSApOwotCi0JaWYgKGNudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKLQkJY250ID0gZG1hYnVmLT5kbWFzaXplOwotCWlmICghY250KSB7Ci0JCSpjb3BpZWQgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGRtYWJ1Zi0+ZGl2aXNvciAhPSAxKSB7Ci0JCWlmICghZG1hYnVmLT50bXBidWZmKSB7Ci0JCQkqY29waWVkID0gY250IC8gZG1hYnVmLT5kaXZpc29yOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlDb3B5U2FtcGxlcygoY2hhciAqKWRtYWJ1Zi0+dG1wYnVmZiwgKGNoYXIgKilod3NyYywgY250LCAKLQkJCWRtYWJ1Zi0+Zm10LCBkbWFidWYpOwotCQlzcmMgPSBkbWFidWYtPnRtcGJ1ZmY7Ci0JCWNudCA9IGNudC9kbWFidWYtPmRpdmlzb3I7Ci0JfQotICAgICAgICBpZiAoY29weV90b191c2VyKGRlc3QsIHNyYywgY250KSkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0VSUiAKLQkJCSJjczQ2eHg6IGNzX2NvcHlfdG9fdXNlcigpLSBmYXVsdCBkZXN0PSVwIHNyYz0lcCBjbnQ9JWRcbiIsCi0JCQkJZGVzdCxzcmMsY250KSk7Ci0JCSpjb3BpZWQgPSAwOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JKmNvcGllZCA9IGNudDsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzX2NvcHlfdG9fdXNlcigpLSBjb3BpZWQgYnl0ZXMgaXMgJWQgXG4iLGNudCkpOwotCXJldHVybiAwOwotfQotCi0vKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBjb3BpZWQgdG8KLSAgIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZHJhaW5lZCBieSB0aGlzIGxvb3AuICovCi1zdGF0aWMgc3NpemVfdCBjc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBzd3B0cjsKLQlpbnQgY250OwotCXVuc2lnbmVkIGNvcGllZCA9IDA7Ci0KLQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFEIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoImNzNDZ4eDogY3NfcmVhZCgpKyAlemRcbiIsY291bnQpICk7Ci0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JaWYgKCFzdGF0ZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0KLQlpZiAoZG1hYnVmLT5tYXBwZWQpCi0JCXJldHVybiAtRU5YSU87Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCi0JbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBfX3Byb2dfZG1hYnVmKHN0YXRlKSkpCi0JCWdvdG8gb3V0MjsKLQotCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXdoaWxlICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKSB7Ci0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwotCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCBjbnQpCi0JCQljbnQgPSBkbWFidWYtPmNvdW50OwotCQlpZiAoY250IDw9IDApCi0JCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGNudCA+IChjb3VudCAqIGRtYWJ1Zi0+ZGl2aXNvcikpCi0JCQljbnQgPSBjb3VudCAqIGRtYWJ1Zi0+ZGl2aXNvcjsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQkvKiBidWZmZXIgaXMgZW1wdHksIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgd2FpdCBmb3IgZGF0YSB0byBiZQotCQkJICAgcmVjb3JkZWQgKi8KLQkJCXN0YXJ0X2FkYyhzdGF0ZSk7Ci0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVBR0FJTjsKLQkJCQlnb3RvIG91dDsKLSAJCQl9Ci0JCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCQkJc2NoZWR1bGUoKTsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQkJCWlmIChkbWFidWYtPm1hcHBlZCkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRU5YSU87Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0gCQkJY29udGludWU7Ci0JCX0KLQotCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJIl9yZWFkKCkgY29weV90byBjbnQ9JWQgY291bnQ9JXpkICIsIGNudCxjb3VudCkgKTsKLQkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSIgLmRtYXNpemU9JWQgLmNvdW50PSVkIGJ1ZmZlcj0lcCByZXQ9JXpkXG4iLAotCQkJZG1hYnVmLT5kbWFzaXplLGRtYWJ1Zi0+Y291bnQsYnVmZmVyLHJldCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNzX2NvcHlfdG9fdXNlcihzdGF0ZSwgYnVmZmVyLCAKLQkJCShjaGFyICopZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250LCAmY29waWVkKSkgewotCQkJaWYgKCFyZXQpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0gICAgICAgICAgICAgICAgc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgZG1hYnVmLT5zd3B0ciA9IHN3cHRyOwotICAgICAgICAgICAgICAgIGRtYWJ1Zi0+Y291bnQgLT0gY250OwotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBjb3VudCAtPSBjb3BpZWQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyICs9IGNvcGllZDsKLSAgICAgICAgICAgICAgICByZXQgKz0gY29waWVkOwotICAgICAgICAgICAgICAgIHN0YXJ0X2FkYyhzdGF0ZSk7Ci0JfQotb3V0OgotCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKLW91dDI6Ci0JbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCUNTX0RCR09VVChDU19XQVZFX1JFQUQgfCBDU19GVU5DVElPTiwgNCwgCi0JCXByaW50aygiY3M0Nnh4OiBjc19yZWFkKCktICV6ZFxuIixyZXQpICk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZG1hIHRvCi0gICB0aGUgc291bmRjYXJkLiAgaXQgaXMgZHJhaW5lZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kIGZpbGxlZCBieSB0aGlzIGxvb3AuICovCi1zdGF0aWMgc3NpemVfdCBjc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0Jc3NpemVfdCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBzd3B0cjsKLQlpbnQgY250OwotCi0JQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19GVU5DVElPTiwgNCwKLQkJcHJpbnRrKCJjczQ2eHg6IGNzX3dyaXRlIGNhbGxlZCwgY291bnQgPSAlemRcbiIsIGNvdW50KSApOwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmICghc3RhdGUpCi0JCXJldHVybiAtRU5PREVWOwotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0KLQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJZ290byBvdXQ7Ci0JYWRkX3dhaXRfcXVldWUoJnN0YXRlLT5kbWFidWYud2FpdCwgJndhaXQpOwotCXJldCA9IDA7Ci0vKgotKiBTdGFydCB0aGUgbG9vcCB0byByZWFkIGZyb20gdGhlIHVzZXIncyBidWZmZXIgYW5kIHdyaXRlIHRvIHRoZSBkbWEgYnVmZmVyLgotKiBjaGVjayBmb3IgUE0gZXZlbnRzIGFuZCB1bmRlcnJ1bi9vdmVycnVuIGluIHRoZSBsb29wLgotKi8KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXdoaWxlICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKSB7Ci0JCQlzY2hlZHVsZSgpOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKCFyZXQpCi0JCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7Ci0JCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gc2xlZXBfb25fdGltZW91dCwKLQkJCSAgIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KLQkJCWRtYWJ1Zi0+Y291bnQgPSAwOwotCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7Ci0JCX0KLQkJaWYgKGRtYWJ1Zi0+dW5kZXJydW4pIHsKLQkJCWRtYWJ1Zi0+dW5kZXJydW4gPSAwOwotCQkJZG1hYnVmLT5od3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7Ci0JCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKLQkJfQotCi0JCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKLQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7Ci0JCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplKQotCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKLQkJaWYgKGNudCA8PSAwKQotCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChjbnQgPiBjb3VudCkKLQkJCWNudCA9IGNvdW50OwotCQlpZiAoY250IDw9IDApIHsKLQkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kIHdhaXQgZm9yIGRhdGEgdG8gYmUKLQkJCSAgIHBsYXllZCAqLwotCQkJc3RhcnRfZGFjKHN0YXRlKTsKLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWdvdG8gb3V0OwotIAkJCX0KLQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCQlzY2hlZHVsZSgpOwotIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCWlmICghcmV0KQotCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJZ290byBvdXQ7Ci0gCQkJfQotCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQlpZiAoIXJldCkKLQkJCQkJcmV0ID0gLUVOWElPOwotCQkJCWdvdG8gb3V0OwotCQkJfQotIAkJCWNvbnRpbnVlOwotIAkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXN3cHRyID0gKHN3cHRyICsgY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOwotCQlkbWFidWYtPmNvdW50ICs9IGNudDsKLQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKLQkJCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfRVJST1IsIDIsIHByaW50aygKLQkJCSAgICAiY3M0Nnh4OiBjc193cml0ZSgpIGQtPmNvdW50ID4gZG1hc2l6ZSAtIHJlc2V0dGluZ1xuIikpOwotCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQkJfQotCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCWNvdW50IC09IGNudDsKLQkJYnVmZmVyICs9IGNudDsKLQkJcmV0ICs9IGNudDsKLQkJc3RhcnRfZGFjKHN0YXRlKTsKLQl9Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfRlVOQ1RJT04sIDIsIAotCQlwcmludGsoImNzNDZ4eDogY3Nfd3JpdGUoKS0gcmV0PSV6ZFxuIiwgcmV0KSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjc19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCkrIFxuIikpOwotCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQpKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwotCQl9Ci0JfQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQljc191cGRhdGVfcHRyKGNhcmQsIENTX0ZBTFNFKTsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKLQkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JCX0KLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7Ci0JCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQotCQkJCSAgICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKHNpZ25lZClkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCAKLQkJCQkJKyAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCi0JCQkJICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcG9sbCgpLSAoMHgleCkgXG4iLAotCQltYXNrKSk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLS8qCi0gKglXZSBsZXQgdXNlcnMgbW1hcCB0aGUgcmluZyBidWZmZXIuIEl0cyBub3QgdGhlIHJlYWwgRE1BIGJ1ZmZlciBidXQKLSAqCXRoYXQgc2lkZSBvZiB0aGUgY29kZSBpcyBoaWRkZW4gaW4gdGhlIElSUSBoYW5kbGluZy4gV2UgZG8gYSBzb2Z0d2FyZQotICoJZW11bGF0aW9uIG9mIERNQSBmcm9tIGEgNjRLIG9yIHNvIGJ1ZmZlciBpbnRvIGEgMksgRklGTy4gCi0gKgkodGhlIGhhcmR3YXJlIHByb2JhYmx5IGRlc2VydmVzIGEgbW9hbiBoZXJlIGJ1dCBDcnlzdGFsIHNlbmQgbWUgbmljZQotICoJdG95cyA7KSkuCi0gKi8KLSAKLXN0YXRpYyBpbnQgY3NfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUEFSTVMsIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCkrIGZpbGU9JXAgJXMgJXNcbiIsIAotCQlmaWxlLCB2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUgPyAiVk1fV1JJVEUiIDogIiIsCi0JCXZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEID8gIlZNX1JFQUQiIDogIiIpICk7Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCUNTX0RCR09VVChDU19PUEVOLCAyLCBwcmludGsoCi0JCQkgICJjczQ2eHg6IGNzX21tYXAoKSBWTV9XUklURSAtIHN0YXRlIFRSVUUgcHJvZ19kbWFidWYgREFDXG4iKSApOwotCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpICE9IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWlmIChzdGF0ZSkgewotCQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygKLQkJCSAgImNzNDZ4eDogY3NfbW1hcCgpIFZNX1JFQUQgLSBzdGF0ZSBUUlVFIHByb2dfZG1hYnVmIEFEQ1xuIikgKTsKLQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSAhPSAwKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50aygKLQkJICAiY3M0Nnh4OiBjc19tbWFwKCkgcmV0dXJuIC1FSU5WQUxcbiIpICk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotLyoKLSAqIEZvciBub3cgT05MWSBzdXBwb3J0IHBsYXliYWNrLCBidXQgc2VlbXMgbGlrZSB0aGUgb25seSB3YXkgdG8gdXNlCi0gKiBtbWFwKCkgaXMgdG8gb3BlbiBhbiBGRCB3aXRoIFJEV1IsIGp1c3QgcmVhZCBvciBqdXN0IHdyaXRlIGFjY2VzcwotICogZG9lcyBub3QgZnVuY3Rpb24sIGdldCBhbiBlcnJvciBiYWNrIGZyb20gdGhlIGtlcm5lbC4KLSAqIEFsc28sIFF1YWtlSUlJIG9wZW5zIHdpdGggUkRXUiEgIFNvLCB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZwotICogdG8gbmVlZGluZyByZWFkL3dyaXRlIGFjY2VzcyBtYXBwaW5nLiAgU28sIGFsbG93IHJlYWQvd3JpdGUgYnV0IAotICogdXNlIHRoZSBEQUMgb25seS4KLSAqLwotCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOyAgCi0JaWYgKCFzdGF0ZSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKLQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpZiAoY3M0eF9wZ29mZih2bWEpICE9IDApIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0KLQlDU19EQkdPVVQoQ1NfUEFSTVMsIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCk6IHNpemU9JWRcbiIsKHVuc2lnbmVkKXNpemUpICk7Ci0KLQlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAotCQkJICAgICB2aXJ0X3RvX3BoeXMoZG1hYnVmLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCi0JCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgewotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dDsKLQl9Ci0JZG1hYnVmLT5tYXBwZWQgPSAxOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfbW1hcCgpLVxuIikgKTsKLW91dDoKLQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwotCXJldHVybiByZXQ7CQotfQotCi1zdGF0aWMgaW50IGNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlhdWRpb19idWZfaW5mbyBhYmluZm87Ci0JY291bnRfaW5mbyBjaW5mbzsKLQlpbnQgdmFsLCB2YWxzYXZlLCByZXQ7Ci0JaW50IG1hcHBlZCA9IDA7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IF9fdXNlciAqcCA9IGFyZ3A7Ci0KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQlpZiAoc3RhdGUpIHsKLQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCW1hcHBlZCA9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBkbWFidWYtPm1hcHBlZDsKLQl9Ci0Jc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JaWYgKHN0YXRlKSB7Ci0JCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQltYXBwZWQgfD0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBkbWFidWYtPm1hcHBlZDsKLQl9Ci0JCQotI2lmIENTREVCVUcKLQlwcmludGlvY3RsKGNtZCk7Ci0jZW5kaWYKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPU1NfR0VUVkVSU0lPTjoKLQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOwotCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKLQkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7Ci0JCQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCQkJcmVzeW5jX2RtYV9wdHJzKHN0YXRlKTsKLQkJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7Ci0JCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwotCQkJCWRtYWJ1Zi0+YmxvY2tzID0gMDsKLQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCXN0b3BfYWRjKHN0YXRlKTsKLQkJCQlzeW5jaHJvbml6ZV9pcnEoY2FyZC0+aXJxKTsKLQkJCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOwotCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKLQkJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7Ci0JCQkJZG1hYnVmLT5ibG9ja3MgPSAwOwotCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQl9Ci0JCX0KLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCAyLCBwcmludGsoImNzNDZ4eDogRFNQX1JFU0VUKCktXG4iKSApOwotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfU1lOQzoKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJcmV0dXJuIGRyYWluX2RhYyhzdGF0ZSwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfU1BFRUQ6IC8qIHNldCBzYW1wbGUgcmF0ZSAqLwotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodmFsID49IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQljc19zZXRfYWRjX3JhdGUoc3RhdGUsIHZhbCk7Ci0JCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQlzdG9wX2RhYyhzdGF0ZSk7Ci0JCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQljc19zZXRfZGFjX3JhdGUoc3RhdGUsIHZhbCk7Ci0JCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJfQotCQkJfQotCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCSAgICAiY3M0Nnh4OiBjc19pb2N0bCgpIERTUF9TUEVFRCAlcyAlcyAlZFxuIiwKLQkJCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJEQUMiIDogIiIsCi0JCQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJBREMiIDogIiIsCi0JCQkJZG1hYnVmLT5yYXRlICkgKTsKLQkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLwotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJaWYgKHZhbCkKLQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKLQkJCQllbHNlCi0JCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOwotCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCQkgICAgImNzNDZ4eDogRFNQX1NURVJFTygpIERBQyAlc1xuIiwKLQkJCQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPwotCQkJCQkiU1RFUkVPIjoiTU9OTyIpICk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJaWYgKHZhbCkKLQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKLQkJCQllbHNlCi0JCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOwotCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKLQkJCQkgICAgImNzNDZ4eDogRFNQX1NURVJFTygpIEFEQyAlc1xuIiwKLQkJCQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPwotCQkJCQkiU1RFUkVPIjoiTU9OTyIpICk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCi0JCQkJCXJldHVybiB2YWw7Ci0JCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUsIHApOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmICgodmFsID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJcmV0dXJuIHZhbDsKLQkJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5mcmFnc2l6ZS9kbWFidWYtPmRpdmlzb3IsIAotCQkJCQkJcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCovCi0JCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTgsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoCi0JCSAgICAiY3M0Nnh4OiBjc19pb2N0bCgpIERTUF9TRVRGTVQgJXMgJXMgJXMgJXNcbiIsCi0JCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJEQUMiIDogIiIsCi0JCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEID8gIkFEQyIgOiAiIiwKLQkJCXZhbCA9PSBBRk1UX1MxNl9MRSA/ICIxNkJpdCBTaWduZWQiIDogIiIsCi0JCQl2YWwgPT0gQUZNVF9VOCA/ICI4Qml0IFVuc2lnbmVkIiA6ICIiKSApOwotCQl2YWxzYXZlID0gdmFsOwotCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKLQkJCWlmICh2YWw9PUFGTVRfUzE2X0xFIHx8IHZhbD09QUZNVF9VOCkgewotCQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCi0JCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UXzE2QklUOwotCQkJCQkJZWxzZQotCQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfMTZCSVQ7Ci0JCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQkJdmFsID0gdmFsc2F2ZTsKLQkJCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQkJCWlmIChzdGF0ZSkgewotCQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQotCQkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF8xNkJJVDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UXzE2QklUOwotCQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKLQkJCQkJCQlyZXR1cm4gcmV0OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19FUlJPUiwgMiwgcHJpbnRrKAotCQkJCSAgICAiY3M0Nnh4OiBEU1BfU0VURk1UKCkgVW5zdXBwb3J0ZWQgZm9ybWF0ICgweCV4KVxuIiwKLQkJCQkJdmFsc2F2ZSkgKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJCWlmIChzdGF0ZSkKLQkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQl9IGVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCQlpZiAoc3RhdGUpCi0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJfQotCQl9Ci0JCWlmIChkbWFidWYpIHsKLQkJCWlmIChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkKLQkJCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUsIHApOwotCQkJZWxzZQotCQkJCXJldHVybiBwdXRfdXNlcihBRk1UX1U4LCBwKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAodmFsICE9IDApIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJCWlmIChzdGF0ZSkgewotCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKLQkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJaWYgKHZhbCA+IDEpCi0JCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOwotCQkJCQllbHNlCi0JCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKLQkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJCQkJaWYgKHByb2dfZG1hYnVmKHN0YXRlKSkKLQkJCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQkJaWYgKHN0YXRlKSB7Ci0JCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCQlzdG9wX2FkYyhzdGF0ZSk7Ci0JCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQlpZiAodmFsID4gMSkKLQkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87Ci0JCQkJCWVsc2UKLQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOwotCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQlpZiAocHJvZ19kbWFidWYoc3RhdGUpKQotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSA/IDIgOiAxLAotCQkJCXApOwotCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgotCQkvKgotCQkgKiBUaGVyZSB3aWxsIGJlIGEgbG9uZ2VyIHRoYW4gbm9ybWFsIHBhdXNlIGluIHRoZSBkYXRhLgotCQkgKiBzby4uLiBkbyBub3RoaW5nLCBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCB3ZSBjYW4gZG8uCi0JCSAqLwotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7Ci0JCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJCWlmIChzdGF0ZSkgewotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwotCQkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOwotCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7Ci0JCS8qCi0JCSAqIGZvciBtbWFwIHdlIGFsd2F5cyBoYXZlIHRvdGFsIHNwYWNlIGF2YWlsYWJsZQotCQkgKi8KLQkJCWlmIChkbWFidWYtPm1hcHBlZCkKLQkJCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemU7Ci0JCQllbHNlCi0JCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKLQotCQkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOwotCQl9Ci0JCXJldHVybiAtRU5PREVWOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwotCQkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZS9kbWFidWYtPmRpdmlzb3I7Ci0JCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmNvdW50L2RtYWJ1Zi0+ZGl2aXNvcjsKLQkJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwotCQkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOwotCQl9Ci0JCXJldHVybiAtRU5PREVWOwotCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKLQkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwotCQlyZXR1cm4gMDsKLQljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKLQkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUV8RFNQX0NBUF9UUklHR0VSfERTUF9DQVBfTU1BUCwKLQkJCSAgICBwKTsKLQljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKLQkJdmFsID0gMDsKLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCAyLCBwcmludGsoImNzNDZ4eDogRFNQX0dFVFRSSUdHRVIoKStcbiIpICk7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKLQkJCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCWlmIChzdGF0ZSkgewotCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKQotCQkJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7Ci0JCQl9Ci0JCX0KLQkJQ1NfREJHT1VUKENTX0lPQ1RMLCAyLCBwcmludGsoImNzNDZ4eDogRFNQX0dFVFRSSUdHRVIoKS0gdmFsPTB4JXhcbiIsdmFsKSApOwotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKLQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYgKHN0YXRlKSB7Ci0JCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKLQkJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJc3RhcnRfYWRjKHN0YXRlKTsKLQkJCQl9IGVsc2UKLQkJCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUpIHsKLQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKLQkJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJc3RhcnRfZGFjKHN0YXRlKTsKLQkJCQl9IGVsc2UKLQkJCQkJc3RvcF9kYWMoc3RhdGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlcy9kbWFidWYtPmRpdmlzb3I7Ci0JCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50L2RtYWJ1Zi0+ZGl2aXNvciA+PiBkbWFidWYtPmZyYWdzaGlmdDsKLQkJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHIvZG1hYnVmLT5kaXZpc29yOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAtRU5PREVWOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgotCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmIChzdGF0ZSkgewotCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7Ci0JCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKLQkJCQljaW5mby5ibG9ja3MgPSAoY2luZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQpIAotCQkJCQkJCS0gZG1hYnVmLT5ibG9ja3M7Ci0JCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA4LCAKLQkJCQkJcHJpbnRrKCJ0b3RhbF9ieXRlcz0lZCBibG9ja3M9JWQgZG1hYnVmLT5ibG9ja3M9JWRcbiIsIAotCQkJCQljaW5mby5ieXRlcyxjaW5mby5ibG9ja3MsZG1hYnVmLT5ibG9ja3MpICk7Ci0JCQkJZG1hYnVmLT5ibG9ja3MgPSBjaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKLQkJCX0gZWxzZSB7Ci0JCQkJY2luZm8uYmxvY2tzID0gZG1hYnVmLT5jb3VudCA+PiBkbWFidWYtPmZyYWdzaGlmdDsKLQkJCX0KLQkJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7Ci0KLQkJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAotCQkJICAgICJjczQ2eHg6IEdFVE9QVFIgYnl0ZXM9JWQgYmxvY2tzPSVkIHB0cj0lZFxuIiwKLQkJCQljaW5mby5ieXRlcyxjaW5mby5ibG9ja3MsY2luZm8ucHRyKSApOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAtRU5PREVWOwotCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6Ci0JCXJldHVybiAwOwotCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKLQkJCXZhbCA9IGRtYWJ1Zi0+Y291bnQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UKLQkJCXZhbCA9IDA7Ci0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQkJZWxzZSAKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCQlpZiAoc3RhdGUpIHsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7Ci0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWVsc2UgCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXJldHVybiBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSA/IDIgOiAxLAotCQkJCXApOwotCQl9Ci0JCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCWVsc2UgCi0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYgKHN0YXRlKSB7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCXJldHVybiBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gCi0JCQkgIAlBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOwotCi0JCX0KLQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKLQljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgotCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86Ci0JY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgotCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLQotLyoKLSAqCUFNUCBjb250cm9sIC0gbnVsbCBBTVAKLSAqLwotIAotc3RhdGljIHZvaWQgYW1wX25vbmUoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFuZ2UpCi17CQotfQotCi0vKgotICoJQ3J5c3RhbCBFQVBEIG1vZGUKLSAqLwotIAotc3RhdGljIHZvaWQgYW1wX3ZveWV0cmEoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFuZ2UpCi17Ci0JLyogTWFuYWdlIHRoZSBFQVBEIGJpdCBvbiB0aGUgQ3J5c3RhbCA0Mjk3IAotCSAgIGFuZCB0aGUgQW5hbG9nIEFEMTg4NSAqLwotCSAgIAotCWludCBvbGQgPSBjYXJkLT5hbXBsaWZpZXI7Ci0JCi0JY2FyZC0+YW1wbGlmaWVyKz1jaGFuZ2U7Ci0JaWYgKGNhcmQtPmFtcGxpZmllciAmJiAhb2xkKSB7Ci0JCS8qIFR1cm4gdGhlIEVBUEQgYW1wIG9uICovCi0JCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sICBBQzk3X1BPV0VSX0NPTlRST0wsIAotCQkJY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSB8Ci0JCQkJMHg4MDAwKTsKLQl9IGVsc2UgaWYob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpIHsKLQkJLyogVHVybiB0aGUgRUFQRCBhbXAgb2ZmICovCi0JCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sICBBQzk3X1BPV0VSX0NPTlRST0wsIAotCQkJY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmCi0JCQkJfjB4ODAwMCk7Ci0JfQotfQotCi0JCSAgICAgICAKLS8qCi0gKglHYW1lIFRoZWF0cmUgWFAgY2FyZCAtIEVHUElPWzJdIGlzIHVzZWQgdG8gZW5hYmxlIHRoZSBleHRlcm5hbCBhbXAuCi0gKi8KLSAKLXN0YXRpYyB2b2lkIGFtcF9oZXJjdWxlcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKLXsKLQlpbnQgb2xkID0gY2FyZC0+YW1wbGlmaWVyOwotCWlmICghY2FyZCkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBhbXBfaGVyY3VsZXMoKSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemVkLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCWNhcmQtPmFtcGxpZmllcis9Y2hhbmdlOwotCWlmICgoY2FyZC0+YW1wbGlmaWVyICYmICFvbGQpICYmICEoaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSkpIHsKLQkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgZXh0ZXJuYWwgYW1wIGVuYWJsZWRcbiIpKTsKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPRFIsIAotCQkJRUdQSU9EUl9HUE9FMik7ICAgICAvKiBlbmFibGUgRUdQSU8yIG91dHB1dCAqLwotCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9QVFIsIAotCQkJRUdQSU9QVFJfR1BQVDIpOyAgIC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCi0JfSBlbHNlIGlmIChvbGQgJiYgIWNhcmQtPmFtcGxpZmllcikgewotCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBhbXBfaGVyY3VsZXMoKSBleHRlcm5hbCBhbXAgZGlzYWJsZWRcbiIpKTsKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPRFIsIDApOyAvKiBkaXNhYmxlICovCi0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT1BUUiwgMCk7IC8qIGRpc2FibGUgKi8KLQl9Ci19Ci0KLS8qCi0gKglIYW5kbGUgdGhlIENMS1JVTiBvbiBhIHRoaW5rcGFkLiBXZSBtdXN0IGRpc2FibGUgQ0xLUlVOIHN1cHBvcnQKLSAqCXdoZW5ldmVyIHdlIG5lZWQgdG8gYmVhdCBvbiB0aGUgY2hpcC4KLSAqCi0gKglUaGUgb3JpZ2luYWwgaWRlYSBhbmQgY29kZSBmb3IgdGhpcyBoYWNrIGNvbWVzIGZyb20gRGF2aWQgS2Fpc2VyIGF0Ci0gKglMaW51eGNhcmUuIFBlcmhhcHMgb25lIGRheSBDcnlzdGFsIHdpbGwgZG9jdW1lbnQgdGhlaXIgY2hpcHMgd2VsbAotICoJZW5vdWdoIHRvIG1ha2UgdGhlbSB1c2VmdWwuCi0gKi8KLSAKLXN0YXRpYyB2b2lkIGNsa3J1bl9oYWNrKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQotewotCXN0cnVjdCBwY2lfZGV2ICphY3BpX2RldjsKLQl1MTYgY29udHJvbDsKLQl1OCBwcDsKLQl1bnNpZ25lZCBsb25nIHBvcnQ7Ci0JaW50IG9sZCA9IGNhcmQtPmFjdGl2ZTsKLQkKLQljYXJkLT5hY3RpdmUrPWNoYW5nZTsKLQkKLQlhY3BpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKTsKLQlpZiAoYWNwaV9kZXYgPT0gTlVMTCkKLQkJcmV0dXJuOwkJLyogTm90IGEgdGhpbmtwYWQgdGhhdHMgZm9yIHN1cmUgKi8KLQotCS8qIEZpbmQgdGhlIGNvbnRyb2wgcG9ydCAqLwkJCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoYWNwaV9kZXYsIDB4NDEsICZwcCk7Ci0JcG9ydCA9IHBwIDw8IDg7Ci0KLQkvKiBSZWFkIEFDUEkgcG9ydCAqLwkKLQljb250cm9sID0gaW53KHBvcnQgKyAweDEwKTsKLQotCS8qIEZsaXAgQ0xLUlVOIG9mZiB3aGlsZSBydW5uaW5nICovCi0JaWYgKCFjYXJkLT5hY3RpdmUgJiYgb2xkKSB7Ci0JCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCi0JCQkiY3M0Nnh4OiBjbGtydW4oKSBlbmFibGUgY2xrcnVuIC0gY2hhbmdlPSVkIGFjdGl2ZT0lZFxuIiwKLQkJCQljaGFuZ2UsY2FyZC0+YWN0aXZlKSk7Ci0JCW91dHcoY29udHJvbHwweDIwMDAsIHBvcnQrMHgxMCk7Ci0JfSBlbHNlIHsKLQkvKgotCSogc29tZXRpbWVzIG9uIGEgcmVzdW1lIHRoZSBiaXQgaXMgc2V0LCBzbyBhbHdheXMgcmVzZXQgdGhlIGJpdC4KLQkqLwotCQlDU19EQkdPVVQoQ1NfUEFSTVMgLCA5LCBwcmludGsoIEtFUk5fSU5GTwotCQkJImNzNDZ4eDogY2xrcnVuKCkgZGlzYWJsZSBjbGtydW4gLSBjaGFuZ2U9JWQgYWN0aXZlPSVkXG4iLAotCQkJCWNoYW5nZSxjYXJkLT5hY3RpdmUpKTsKLQkJb3V0dyhjb250cm9sJn4weDIwMDAsIHBvcnQrMHgxMCk7Ci0JfQotCXBjaV9kZXZfcHV0KGFjcGlfZGV2KTsKLX0KLQotCQotc3RhdGljIGludCBjc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGUgPSBOVUxMOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCkrIGZpbGU9JXAgJXMgJXNcbiIsCi0JCWZpbGUsIGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkZNT0RFX1dSSVRFIiA6ICIiLAotCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEID8gIkZNT0RFX1JFQUQiIDogIiIpICk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQotCQlpZiAoISgoY2FyZC0+ZGV2X2F1ZGlvIF4gbWlub3IpICYgfjB4ZikpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGVudHJ5ID09ICZjczQ2eHhfZGV2cykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KLQkJCSJjczQ2eHg6IGNzX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBjYXJkIHN0cnVjdFxuIikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKgotCSAqIGhhcmRjb2RlIHN0YXRlWzBdIGZvciBjYXB0dXJlLCBbMV0gZm9yIHBsYXliYWNrCi0JICovCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSBGTU9ERV9SRUFEXG4iKSApOwotCQlpZiAoY2FyZC0+c3RhdGVzWzBdID09IE5VTEwpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdID0KLQkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgY3Nfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChzdGF0ZSA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJbXV0ZXhfaW5pdCgmc3RhdGUtPnNlbSk7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCWRtYWJ1Zi0+cGJ1ZiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJCWlmIChkbWFidWYtPnBidWYgPT0gTlVMTCkgewotCQkJCWtmcmVlKHN0YXRlKTsKLQkJCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZiAoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwoY2FyZCk7Ci0JCQkKLQkJaWYgKGRtYWJ1Zi0+Y2hhbm5lbCA9PSBOVUxMKSB7Ci0JCQlrZnJlZShjYXJkLT5zdGF0ZXNbMF0pOwotCQkJY2FyZC0+c3RhdGVzWzBdID0gTlVMTDsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJLyogTm93IHR1cm4gb24gZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLwotCQlzdGF0ZS0+Y2FyZCA9IGNhcmQ7Ci0JCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgMSk7Ci0JCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgMSk7Ci0JCQotCQlpZiAoKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0FEQykpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwIG9mIEFEQyBmYWlsZWQgKDB4JXgpXG4iLCB0bXApKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJZG1hYnVmLT5jaGFubmVsLT5zdGF0ZSA9IHN0YXRlOwotCQkvKiBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIGNoYW5uZWwgKi8KLQkJc3RhdGUtPnZpcnQgPSAwOwotCQlzdGF0ZS0+bWFnaWMgPSBDU19TVEFURV9NQUdJQzsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKLQkJbXV0ZXhfaW5pdCgmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCi0JCW11dGV4X2xvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQotCQkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyBHdWlkZSAgL2Rldi9kc3AKLQkJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCi0JCSAgIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwotCi0JCS8qIERlZmF1bHQgaW5wdXQgaXMgOGJpdCBtb25vICovCi0JCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfTUFTSzsKLQkJZG1hYnVmLT50eXBlID0gQ1NfVFlQRV9BREM7Ci0JCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKLQkJZG1hYnVmLT5vc3NtYXhmcmFncyAgPSAwOwotCQlkbWFidWYtPnN1YmRpdmlzaW9uICA9IDA7Ci0JCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7Ci0JCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0KLQkJc3RhdGUtPm9wZW5fbW9kZSB8PSBGTU9ERV9SRUFEOwotCQltdXRleF91bmxvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCUNTX0RCR09VVChDU19PUEVOLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpIEZNT0RFX1dSSVRFXG4iKSApOwotCQlpZiAoY2FyZC0+c3RhdGVzWzFdID09IE5VTEwpIHsKLQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdID0KLQkJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgY3Nfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChzdGF0ZSA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJbXV0ZXhfaW5pdCgmc3RhdGUtPnNlbSk7Ci0JCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCWRtYWJ1Zi0+cGJ1ZiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJCWlmIChkbWFidWYtPnBidWYgPT0gTlVMTCkgewotCQkJCWtmcmVlKHN0YXRlKTsKLQkJCQljYXJkLT5zdGF0ZXNbMV0gPSBOVUxMOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZiAoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7Ci0JCQkKLQkJaWYgKGRtYWJ1Zi0+Y2hhbm5lbCA9PSBOVUxMKSB7Ci0JCQlrZnJlZShjYXJkLT5zdGF0ZXNbMV0pOwotCQkJY2FyZC0+c3RhdGVzWzFdID0gTlVMTDsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJLyogTm93IHR1cm4gb24gZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLwotCQlzdGF0ZS0+Y2FyZCA9IGNhcmQ7Ci0JCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgMSk7Ci0JCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgMSk7Ci0KLQkJaWYgKCh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMpKSkgewotCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBEQUMgZmFpbGVkICgweCV4KVxuIiwgdG1wKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCQkKLQkJZG1hYnVmLT5jaGFubmVsLT5zdGF0ZSA9IHN0YXRlOwotCQkvKiBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIGNoYW5uZWwgKi8KLQkJc3RhdGUtPnZpcnQgPSAxOwotCQlzdGF0ZS0+bWFnaWMgPSBDU19TVEFURV9NQUdJQzsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKLQkJbXV0ZXhfaW5pdCgmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOwotCi0JCW11dGV4X2xvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQotCQkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyBHdWlkZSAgL2Rldi9kc3AKLQkJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCi0JCSAgIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwotCi0JCS8qIERlZmF1bHQgb3V0cHV0IGlzIDhiaXQgbW9uby4gKi8KLQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9NQVNLOwotCQlkbWFidWYtPnR5cGUgPSBDU19UWVBFX0RBQzsKLQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOwotCQlkbWFidWYtPm9zc21heGZyYWdzICA9IDA7Ci0JCWRtYWJ1Zi0+c3ViZGl2aXNpb24gID0gMDsKLQkJY3Nfc2V0X2RhY19yYXRlKHN0YXRlLCA4MDAwKTsKLQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQotCQlzdGF0ZS0+b3Blbl9tb2RlIHw9IEZNT0RFX1dSSVRFOwotCQltdXRleF91bmxvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0JQ1NfREJHT1VUKENTX09QRU4gfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKS0gMFxuIikpOwotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCBjc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwotCXVuc2lnbmVkIGludCB0bXA7Ci0JQ1NfREJHT1VUKENTX1JFTEVBU0UgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSsgZmlsZT0lcCAlcyAlc1xuIiwKLQkJZmlsZSwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiRk1PREVfV1JJVEUiIDogIiIsCi0JCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiRk1PREVfUkVBRCIgOiAiIikpOwotCi0JaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQlpZiAoc3RhdGUpIHsKLQkJaWYgKChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpICYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewotCQkJQ1NfREJHT1VUKENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCkgRk1PREVfV1JJVEVcbiIpKTsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJY3NfY2xlYXJfdGFpbChzdGF0ZSk7Ci0JCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQkJCS8qIHN0b3AgRE1BIHN0YXRlIG1hY2hpbmUgYW5kIGZyZWUgRE1BIGJ1ZmZlcnMvY2hhbm5lbHMgKi8KLQkJCW11dGV4X2xvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJCXN0b3BfZGFjKHN0YXRlKTsKLQkJCWRlYWxsb2NfZG1hYnVmKHN0YXRlKTsKLQkJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBkbWFidWYtPmNoYW5uZWwtPm51bSk7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpc3RhdGUtPmRtYWJ1Zi5wYnVmKTsKLQotCQkJLyogd2UncmUgY292ZXJlZCBieSB0aGUgb3Blbl9tdXRleCAqLwotCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCQlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7Ci0JCQlzdGF0ZS0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKLQotCQkJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQywgQ1NfRkFMU0UpKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gREFDIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKLQkJCX0KLQotCQkJLyogTm93IHR1cm4gb2ZmIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KLQkJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7Ci0JCQlrZnJlZShzdGF0ZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQlpZiAoc3RhdGUpIHsKLQkJaWYgKChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkgJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJCUNTX0RCR09VVChDU19SRUxFQVNFLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpIEZNT0RFX1JFQURcbiIpKTsKLQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJbXV0ZXhfbG9jaygmc3RhdGUtPm9wZW5fbXV0ZXgpOwotCQkJc3RvcF9hZGMoc3RhdGUpOwotCQkJZGVhbGxvY19kbWFidWYoc3RhdGUpOwotCQkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylzdGF0ZS0+ZG1hYnVmLnBidWYpOwotCi0JCQkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX211dGV4ICovCi0JCQltdXRleF91bmxvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKLQkJCXN0YXRlLT5jYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKLQkJCXN0YXRlLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwotCi0JCQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfQURDLCBDU19GQUxTRSkpKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBBREMgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOwotCQkJfQotCi0JCQkvKiBOb3cgdHVybiBvZmYgZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLwotCQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7Ci0JCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKLQkJCWtmcmVlKHN0YXRlKTsKLQkJfQotCX0KLQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCktIDBcbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRwbShzdHJ1Y3QgY3NfY2FyZCAqcykKLXsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygicG0gc3RydWN0OlxuIikpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJmbGFnczoweCV4IHUzMkNMS0NSMV9TQVZFOiAwJXggdTMyU1NQTVZhbHVlOiAweCV4XG4iLAotCQkodW5zaWduZWQpcy0+cG0uZmxhZ3Mscy0+cG0udTMyQ0xLQ1IxX1NBVkUscy0+cG0udTMyU1NQTVZhbHVlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMlBQTFZDdmFsdWU6IDB4JXggdTMyUFBSVkN2YWx1ZTogMHgleFxuIiwKLQkJcy0+cG0udTMyUFBMVkN2YWx1ZSxzLT5wbS51MzJQUFJWQ3ZhbHVlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZNTFZDdmFsdWU6IDB4JXggdTMyRk1SVkN2YWx1ZTogMHgleFxuIiwKLQkJcy0+cG0udTMyRk1MVkN2YWx1ZSxzLT5wbS51MzJGTVJWQ3ZhbHVlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkdQSU9SdmFsdWU6IDB4JXggdTMySlNDVEx2YWx1ZTogMHgleFxuIiwKLQkJcy0+cG0udTMyR1BJT1J2YWx1ZSxzLT5wbS51MzJKU0NUTHZhbHVlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMlNTQ1I6IDB4JXggdTMyU1JDU0E6IDB4JXhcbiIsCi0JCXMtPnBtLnUzMlNTQ1Iscy0+cG0udTMyU1JDU0EpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRGFjQVNSOiAweCV4IHUzMkFkY0FTUjogMHgleFxuIiwKLQkJcy0+cG0udTMyRGFjQVNSLHMtPnBtLnUzMkFkY0FTUikpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEYWNTUjogMHgleCB1MzJBZGNTUjogMHgleFxuIiwKLQkJcy0+cG0udTMyRGFjU1Iscy0+cG0udTMyQWRjU1IpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyTUlEQ1JfU2F2ZTogMHgleFxuIiwKLQkJcy0+cG0udTMyTUlEQ1JfU2F2ZSkpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X3Bvd2VyZG93bjogMHgleCBfZ2VuZXJhbF9wdXJwb3NlIDB4JXhcbiIsCi0JCXMtPnBtLnUzMkFDOTdfcG93ZXJkb3duLHMtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfbWFzdGVyX3ZvbHVtZTogMHgleFxuIiwKLQkJcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZTogMHgleFxuIiwKLQkJcy0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vOiAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubykpOwotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X3BjbV9vdXRfdm9sdW1lOiAweCV4XG4iLAotCQlzLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lKSk7Ci0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImRtYWJ1Zl9zd3B0cl9wbGF5OiAweCV4IGRtYWJ1Zl9jb3VudF9wbGF5OiAlZFxuIiwKLQkJcy0+cG0uZG1hYnVmX3N3cHRyX3BsYXkscy0+cG0uZG1hYnVmX2NvdW50X3BsYXkpKTsKLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiZG1hYnVmX3N3cHRyX2NhcHR1cmU6IDB4JXggZG1hYnVmX2NvdW50X2NhcHR1cmU6ICVkXG4iLAotCQlzLT5wbS5kbWFidWZfc3dwdHJfY2FwdHVyZSxzLT5wbS5kbWFidWZfY291bnRfY2FwdHVyZSkpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICBTdXNwZW5kIC0gc2F2ZSB0aGUgYWM5NyByZWdzLCBtdXRlIHRoZSBvdXRwdXRzIGFuZCBwb3dlciBkb3duIHRoZSBwYXJ0LiAgCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY3M0Nnh4X2FjOTdfc3VzcGVuZChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgQ291bnQsaTsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2PWNhcmQtPmFjOTdfY29kZWNbMF07Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKStcbiIpKTsKLQotCWlmIChjYXJkLT5zdGF0ZXNbMV0pIHsKLQkJc3RvcF9kYWMoY2FyZC0+c3RhdGVzWzFdKTsKLQkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1sxXSk7Ci0JfQotCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKLQkJc3RvcF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKLQkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7Ci0JfQotCi0JZm9yIChDb3VudCA9IDB4MiwgaSA9IDA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQotCQkJJiYgKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsKLQkJCUNvdW50ICs9IDIsIGkrKykgewotCQljYXJkLT5wbS5hYzk3W2ldID0gY3NfYWM5N19nZXQoZGV2LCBCQTBfQUM5N19SRVNFVCArIENvdW50KTsKLQl9Ci0vKgotKiBTYXZlIHRoZSBhYzk3IHZvbHVtZSByZWdpc3RlcnMgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBwb3dlcmRvd24gc3RhdGUuCi0qIE5vdywgbXV0ZSB0aGUgYWxsIHRoZSBvdXRwdXRzIChtYXN0ZXIsIGhlYWRwaG9uZSwgYW5kIG1vbm8pLCBhcyB3ZWxsCi0qIGFzIHRoZSBQQ00gdm9sdW1lLCBpbiBwcmVwYXJhdGlvbiBmb3IgcG93ZXJpbmcgZG93biB0aGUgZW50aXJlIHBhcnQuCi0JY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldCggZGV2LCAKLQkJCSh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FKTsgCi0JY2FyZC0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUpOyAKLQljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubyA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAKLQkJCSh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8pOyAKLQljYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAotCQkJKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FKTsKLSovIAotLyoKLSogbXV0ZSB0aGUgb3V0cHV0cwotKi8KLQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FLCAweDgwMDApOwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsIDB4ODAwMCk7Ci0JY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAweDgwMDApOwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FLCAweDgwMDApOwotCi0vKgotKiBzYXZlIHRoZSByZWdpc3RlcnMgdGhhdCBjYXVzZSBwb3BzCi0qLwotCWNhcmQtPnBtLnUzMkFDOTdfcG93ZXJkb3duID0gKHUzMiljc19hYzk3X2dldChkZXYsICh1OClBQzk3X1BPV0VSX0NPTlRST0wpOyAKLQljYXJkLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSA9ICh1MzIpY3NfYWM5N19nZXQoZGV2LCAodTgpQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFKTsgCi0vKgotKiBBbmQgcG93ZXIgZG93biBldmVyeXRoaW5nIG9uIHRoZSBBQzk3IGNvZGVjLgotKiB3ZWxsLCBmb3Igbm93LCBvbmx5IHBvd2VyIGRvd24gdGhlIERBQy9BREMgYW5kIE1JWEVSIFZSRUZPTiBjb21wb25lbnRzLiAKLSogdHJvdWJsZSB3aXRoIHJlbW92aW5nIFZSRUYuCi0qLwotCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19UUlVFKSkpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKSBmYWlsdXJlICgweCV4KVxuIix0bXApKTsKLQl9Ci0KLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19zdXNwZW5kKCktXG4iKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qICBSZXN1bWUgLSBwb3dlciB1cCB0aGUgcGFydCBhbmQgcmVzdG9yZSBpdHMgcmVnaXN0ZXJzLi4gIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNzNDZ4eF9hYzk3X3Jlc3VtZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgQ291bnQsaTsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2PWNhcmQtPmFjOTdfY29kZWNbMF07Ci0KLQlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19yZXN1bWUoKStcbiIpKTsKLQotLyoKLSogRmlyc3QsIHdlIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuICBUaGlzCi0qIGNvbnRhaW5zIHRoZSBtaWMgc2VsZWN0IChtaWMxIG9yIG1pYzIpIGFuZCBpZiB3ZSByZXN0b3JlIHRoaXMgYWZ0ZXIKLSogd2UgcmVzdG9yZSB0aGUgbWljIHZvbHVtZS9ib29zdCBzdGF0ZSBhbmQgbWljMiB3YXMgc2VsZWN0ZWQgYXQKLSogc3VzcGVuZCB0aW1lLCB3ZSB3aWxsIGVuZCB1cCB3aXRoIGEgYnJpZWYgcGVyaW9kIG9mIHRpbWUgd2hlcmUgbWljMQotKiBpcyBzZWxlY3RlZCB3aXRoIHRoZSB2b2x1bWUvYm9vc3Qgc2V0dGluZ3MgZm9yIG1pYzIsIGNhdXNpbmcKLSogYWNvdXN0aWMgZmVlZGJhY2suICBTbyB3ZSByZXN0b3JlIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIKLSogZmlyc3QsIHRoZXJlYnkgZ2V0dGluZyB0aGUgY29ycmVjdCBtaWMgc2VsZWN0ZWQgYmVmb3JlIHdlIHJlc3RvcmUKLSogdGhlIG1pYyB2b2x1bWUvYm9vc3QuCi0qLwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X0dFTkVSQUxfUFVSUE9TRSwgCi0JCSh1MTYpY2FyZC0+cG0udTMyQUM5N19nZW5lcmFsX3B1cnBvc2UpOwotLyoKLSogTm93LCB3aGlsZSB0aGUgb3V0cHV0cyBhcmUgc3RpbGwgbXV0ZWQsIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHBvd2VyCi0qIG9uIHRoZSBBQzk3IHBhcnQuCi0qLwotCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X1BPV0VSRE9XTiwgKHUxNiljYXJkLT5wbS51MzJBQzk3X3Bvd2VyZG93bik7Ci0JbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7Ci0vKgotKiBSZXN0b3JlIGp1c3QgdGhlIGZpcnN0IHNldCBvZiByZWdpc3RlcnMsIGZyb20gcmVnaXN0ZXIgbnVtYmVyCi0qIDB4MDIgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciB0aGF0IHVsSGlnaGVzdFJlZ1RvUmVzdG9yZSBzcGVjaWZpZXMuCi0qLwotCWZvciAoQ291bnQgPSAweDIsIGk9MDsgKENvdW50IDw9IENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUpICYmCi0JCQkoaSA8IENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MpOyBDb3VudCArPSAyLCBpKyspIHsKLQkJY3NfYWM5N19zZXQoZGV2LCAodTgpKEJBMF9BQzk3X1JFU0VUICsgQ291bnQpLCAodTE2KWNhcmQtPnBtLmFjOTdbaV0pOwotCX0KLQotCS8qIENoZWNrIGlmIHdlIGhhdmUgdG8gaW5pdCB0aGUgYW1wbGlmaWVyICovCi0JaWYgKGNhcmQtPmFtcF9pbml0KQotCQljYXJkLT5hbXBfaW5pdChjYXJkKTsKLSAgICAgICAgCi0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfcmVzdW1lKCktXG4iKSk7Ci19Ci0KLQotc3RhdGljIGludCBjczQ2eHhfcmVzdGFydF9wYXJ0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdGFydF9wYXJ0KCkrXG4iKSk7Ci0JaWYgKGNhcmQtPnN0YXRlc1sxXSkgewotCQlkbWFidWYgPSAmY2FyZC0+c3RhdGVzWzFdLT5kbWFidWY7Ci0JCWRtYWJ1Zi0+cmVhZHkgPSAwOwotCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKLQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKLQkJaWYgKF9fcHJvZ19kbWFidWYoY2FyZC0+c3RhdGVzWzFdKSkgewotCQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDEsIAotCQkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfcmVzdGFydF9wYXJ0KCktICgtMSkgcHJvZ19kbWFidWYoKSBkYWMgZXJyb3JcbiIpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQljc19zZXRfZGFjX3JhdGUoY2FyZC0+c3RhdGVzWzFdLCBkbWFidWYtPnJhdGUpOwotCX0KLQlpZiAoY2FyZC0+c3RhdGVzWzBdKSB7Ci0JCWRtYWJ1ZiA9ICZjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1ZjsKLQkJZG1hYnVmLT5yZWFkeSA9IDA7Ci0JCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMF0pOwotCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQlpZiAoX19wcm9nX2RtYWJ1ZihjYXJkLT5zdGF0ZXNbMF0pKSB7Ci0JCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgCi0JCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS0gKC0xKSBwcm9nX2RtYWJ1ZigpIGFkYyBlcnJvclxuIikpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWNzX3NldF9hZGNfcmF0ZShjYXJkLT5zdGF0ZXNbMF0sIGRtYWJ1Zi0+cmF0ZSk7Ci0JfQotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9SRVNVTUVEOwotCWlmIChjYXJkLT5zdGF0ZXNbMF0pCi0JCXN0YXJ0X2FkYyhjYXJkLT5zdGF0ZXNbMF0pOwotCWlmIChjYXJkLT5zdGF0ZXNbMV0pCi0JCXN0YXJ0X2RhYyhjYXJkLT5zdGF0ZXNbMV0pOwotCi0JY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX0lETEU7Ci0JY2FyZC0+cG0uZmxhZ3MgJj0gfihDUzQ2WFhfUE1fU1VTUEVORElORyB8IENTNDZYWF9QTV9TVVNQRU5ERUQgCi0JCQl8IENTNDZYWF9QTV9SRVNVTUlORyB8IENTNDZYWF9QTV9SRVNVTUVEKTsKLQlpZiAoY2FyZC0+c3RhdGVzWzBdKQotCQl3YWtlX3VwKCZjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi53YWl0KTsKLQlpZiAoY2FyZC0+c3RhdGVzWzFdKQotCQl3YWtlX3VwKCZjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi53YWl0KTsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdGFydF9wYXJ0KCktXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9yZXNldChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7Ci1zdGF0aWMgdm9pZCBjczQ2MXhfcHJvY19zdG9wKHN0cnVjdCBjc19jYXJkICpjYXJkKTsKLXN0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmQoKSsgZmxhZ3M9MHgleCBzPSVwXG4iLAotCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzLGNhcmQpKTsKLS8qCi0qIGNoZWNrIHRoZSBjdXJyZW50IHN0YXRlLCBvbmx5IHN1c3BlbmQgaWYgSURMRQotKi8KLQlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMiwgCi0JCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmQoKSB1bmFibGUgdG8gc3VzcGVuZCwgbm90IElETEVcbiIpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWNhcmQtPnBtLmZsYWdzICY9IH5DUzQ2WFhfUE1fSURMRTsKLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fU1VTUEVORElORzsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsMSk7Ci0JCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOwotCXRtcCAmPSB+MHgwMDAwZjAzZjsKLQl0bXAgfD0gIDB4MDAwMDAwMTA7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BGSUUsIHRtcCk7CS8qIHBsYXliYWNrIGludGVycnVwdCBkaXNhYmxlICovCi0KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0lFKTsKLQl0bXAgJj0gfjB4MDAwMDAwM2Y7Ci0JdG1wIHw9ICAweDAwMDAwMDExOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DSUUsIHRtcCk7CS8qIGNhcHR1cmUgaW50ZXJydXB0IGRpc2FibGUgKi8KLQotCS8qCi0gICAgICAgICAqICBTdG9wIHBsYXliYWNrIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCAmIDB4MDAwMGZmZmYpOwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgY2FwdHVyZSBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKLQotCWlmIChjYXJkLT5zdGF0ZXNbMV0pIHsKLQkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX3BsYXkgPSBjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi5zd3B0cjsKLQkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X3BsYXkgPSBjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi5jb3VudDsKLQl9Ci0JaWYgKGNhcmQtPnN0YXRlc1swXSkgewotCQljYXJkLT5wbS5kbWFidWZfc3dwdHJfY2FwdHVyZSA9IGNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmLnN3cHRyOwotCQljYXJkLT5wbS5kbWFidWZfY291bnRfY2FwdHVyZSA9IGNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmLmNvdW50OwotCX0KLQotCWNzNDZ4eF9hYzk3X3N1c3BlbmQoY2FyZCk7Ci0KLQkvKgotICAgICAgICAgKiAgUmVzZXQgdGhlIHByb2Nlc3Nvci4KLSAgICAgICAgICovCi0JY3M0NjF4X3Jlc2V0KGNhcmQpOwotCi0JY3M0NjF4X3Byb2Nfc3RvcChjYXJkKTsKLQotCS8qCi0JICogIFBvd2VyIGRvd24gdGhlIERBQyBhbmQgQURDLiAgRm9yIG5vdyBsZWF2ZSB0aGUgb3RoZXIgYXJlYXMgb24uCi0JICovCi0JY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCAweDAzMDApOwotCi0JLyoKLQkgKiAgUG93ZXIgZG93biB0aGUgUExMLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIDApOwotCi0JLyoKLQkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCi0JICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpICYgfkNMS0NSMV9TV0NFOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Ci0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLC0xKTsKLQotCWNhcmQtPnBtLmZsYWdzICY9IH5DUzQ2WFhfUE1fU1VTUEVORElORzsKLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fU1VTUEVOREVEOwotCi0JcHJpbnRwbShjYXJkKTsKLQotCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKLQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9zdXNwZW5kKCktIGZsYWdzPTB4JXhcbiIsCi0JCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjczQ2eHhfcmVzdW1lKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBpOwotCi0JQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAotCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKSsgZmxhZ3M9MHgleFxuIiwKLQkJCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncykpOwotCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1NVU1BFTkRFRCkpIHsKLQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAotCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKSB1bmFibGUgdG8gcmVzdW1lLCBub3QgU1VTUEVOREVEXG4iKSk7Ci0JCXJldHVybiAxOwotCX0KLQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fUkVTVU1JTkc7Ci0JY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9TVVNQRU5ERUQ7Ci0JcHJpbnRwbShjYXJkKTsKLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAxKTsKLQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJaWYgKGNzX2hhcmR3YXJlX2luaXQoY2FyZCkgIT0gMCkgewotCQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDQsIHByaW50aygKLQkJCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCktIEVSUk9SIGluIGNzX2hhcmR3YXJlX2luaXQoKVxuIikpOwotCQkJbWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOwotCQkJY3M0NjF4X3Jlc2V0KGNhcmQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWlmIChpID49IDQpIHsKLQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDEsIHByaW50aygKLQkJCSJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKS0gY3NfaGFyZHdhcmVfaW5pdCgpIGZhaWxlZCwgcmV0cmllZCAlZCB0aW1lcy5cbiIsaSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY3M0Nnh4X3Jlc3RhcnRfcGFydChjYXJkKSkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgNCwgcHJpbnRrKAotCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpOiBjczQ2eHhfcmVzdGFydF9wYXJ0KCkgcmV0dXJuZWQgZXJyb3JcbiIpKTsKLQl9Ci0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7Ci0KLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKS0gZmxhZ3M9MHgleFxuIiwKLQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQ2MXhfZm9wcyA9IHsKLQlDU19PV05FUglDU19USElTX01PRFVMRQotCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAotCS5yZWFkCQk9IGNzX3JlYWQsCi0JLndyaXRlCQk9IGNzX3dyaXRlLAotCS5wb2xsCQk9IGNzX3BvbGwsCi0JLmlvY3RsCQk9IGNzX2lvY3RsLAotCS5tbWFwCQk9IGNzX21tYXAsCi0JLm9wZW4JCT0gY3Nfb3BlbiwKLQkucmVsZWFzZQk9IGNzX3JlbGVhc2UsCi19OwotCi0vKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLwotCi0KLXN0YXRpYyB1MTYgX2NzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOwotCWludCBjb3VudCxsb29wY250OwotCXVuc2lnbmVkIGludCB0bXA7Ci0JdTE2IHJldDsKLQkKLQkvKgotCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcwotCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NyAKLQkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKLQkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMTdoCi0JICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgotCSAqICA2LiBSZWFkIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aCwgY2hlY2sgVlNUUyBiaXQKLQkgKi8KLQotCWNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSk7Ci0KLQkvKgotCSAqICBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0NjF4IHRvIHNlbmQgdGhlCi0JICogIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KLQkgKiAgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoCi0JICogIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAotCSAqICBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCi0JICogIHNldCBEQ1YgLSB3aWxsIGNsZWFyIHdoZW4gcHJvY2VzcyBjb21wbGV0ZWQKLQkgKiAgc2V0IENSVyAtIFJlYWQgY29tbWFuZAotCSAqICBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKLQkgKiAgc2V0IEVTWU4gLSBBU1lOQyBnZW5lcmF0aW9uIGVuYWJsZWQKLQkgKiAgc2V0IFJTVE4gLSBBUlNUIyBpbmFjdGl2ZSwgQUM5NyBjb2RlYyBub3QgcmVzZXQKLQkgKi8KLQotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIDApOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfQ1JXIHwKLQkJCQkJICAgICBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8Ci0JCQkJCSAgICAgQUNDVExfUlNUTik7Ci0KLQotCS8qCi0JICogIFdhaXQgZm9yIHRoZSByZWFkIHRvIG9jY3VyLgotCSAqLwotCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQotCQlsb29wY250ID0gMjAwMDsKLQllbHNlCi0JCWxvb3BjbnQgPSA1MDAgKiBjc19sYXB0b3Bfd2FpdDsKLSAJbG9vcGNudCAqPSBjc19sYXB0b3Bfd2FpdDsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wY250OyBjb3VudCsrKSB7Ci0JCS8qCi0JCSAqICBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCi0JIAkgKi8KLQkJdWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOwotCQkvKgotCQkgKiAgTm93LCBjaGVjayB0byBzZWUgaWYgdGhlIHJlYWQgaGFzIGNvbXBsZXRlZC4KLQkJICogIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAxN2gKLQkJICovCi0JCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpKQotCQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiAgTWFrZSBzdXJlIHRoZSByZWFkIGNvbXBsZXRlZC4KLQkgKi8KLQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkiY3M0Nnh4OiBBQyc5NyByZWFkIHByb2JsZW0gKEFDQ1RMX0RDViksIHJlZyA9IDB4JXggcmV0dXJuaW5nIDB4ZmZmZlxuIiwgcmVnKSk7Ci0JCXJldHVybiAweGZmZmY7Ci0JfQotCi0JLyoKLQkgKiAgV2FpdCBmb3IgdGhlIHZhbGlkIHN0YXR1cyBiaXQgdG8gZ28gYWN0aXZlLgotCSAqLwotCi0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCi0JCWxvb3BjbnQgPSAyMDAwOwotCWVsc2UKLQkJbG9vcGNudCA9IDEwMDA7Ci0gCWxvb3BjbnQgKj0gY3NfbGFwdG9wX3dhaXQ7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbG9vcGNudDsgY291bnQrKykgewotCQkvKgotCQkgKiAgUmVhZCB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIuCi0JCSAqICBBQ1NUUyA9IFN0YXR1cyBSZWdpc3RlciA9IDQ2NGgKLQkJICogIFZTVFMgLSBWYWxpZCBTdGF0dXMKLQkJICovCi0JCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfVlNUUykKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7Ci0JfQotCQotCS8qCi0JICogIE1ha2Ugc3VyZSB3ZSBnb3QgdmFsaWQgc3RhdHVzLgotCSAqLwotCWlmICghKCh0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpKSAmIEFDU1RTX1ZTVFMpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIHJlZyA9IDB4JXggdmFsPTB4JXggMHhmZmZmIFxuIiwgCi0JCQkJcmVnLCB0bXApKTsKLQkJcmV0dXJuIDB4ZmZmZjsKLQl9Ci0KLQkvKgotCSAqICBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCi0JICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCi0JICovCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA5LCBwcmludGsoS0VSTl9JTkZPCi0JCSJjczQ2eHg6IGNzX2FjOTdfZ2V0KCkgcmVnID0gMHgleCwgdmFsID0gMHgleCwgQkEwX0FDQ0FEID0gMHgleFxuIiwgCi0JCQlyZWcsIGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSksCi0JCQljczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDQUQpKSk7Ci0JcmV0ID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdTE2IGNzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKLXsKLQl1MTYgcmV0OwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7Ci0JCi0Jc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOwotCXJldCA9IF9jc19hYzk3X2dldChkZXYsIHJlZyk7Ci0Jc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY3NfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgdmFsKQotewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7Ci0JaW50IGNvdW50OwotCWludCB2YWwyID0gMDsKLQkKLQlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7Ci0JCi0JaWYgKHJlZyA9PSBBQzk3X0NEX1ZPTCkKLQkJdmFsMiA9IF9jc19hYzk3X2dldChkZXYsIEFDOTdfQ0RfVk9MKTsKLQotCS8qCi0JICogIDEuIFdyaXRlIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaCBmb3IgQUM5NyByZWdpc3RlciBhZGRyZXNzCi0JICogIDIuIFdyaXRlIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaCAgICBmb3IgZGF0YSB0byB3cml0ZSB0byBBQzk3Ci0JICogIDMuIFdyaXRlIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGggZm9yIGluaXRpYXRpbmcgdGhlIHdyaXRlCi0JICogIDQuIFJlYWQgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDA3aAotCSAqICA1LiBpZiBEQ1Ygbm90IGNsZWFyZWQsIGJyZWFrIGFuZCByZXR1cm4gZXJyb3IKLQkgKi8KLQotCS8qCi0JICogIFNldHVwIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXJzIG9uIHRoZSBDUzQ2MXggdG8gc2VuZCB0aGUKLQkgKiAgYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgotCSAqICBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKLQkgKiAgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoCi0JICogIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKLQkgKiAgc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAotCSAqICByZXNldCBDUlcgLSBXcml0ZSBjb21tYW5kCi0JICogIHNldCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAotCSAqICBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAotCSAqICBzZXQgUlNUTiAtIEFSU1QjIGluYWN0aXZlLCBBQzk3IGNvZGVjIG5vdCByZXNldAotICAgICAgICAgKi8KLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDQUQsIHJlZyk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ0RBLCB2YWwpOwotCWNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCk7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCAwIHwgQUNDVExfVkZSTSB8IEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKLQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX0RDViB8IEFDQ1RMX1ZGUk0gfAotCQkJCSAgICAgICAgICAgICBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwMDsgY291bnQrKykgewotCQkvKgotCQkgKiAgRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgotCQkgKi8KLQkJdWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOwotCQkvKgotCQkgKiAgTm93LCBjaGVjayB0byBzZWUgaWYgdGhlIHdyaXRlIGhhcyBjb21wbGV0ZWQuCi0JCSAqICBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMDdoCi0JCSAqLwotCQlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSkKLQkJCWJyZWFrOwotCX0KLQkvKgotCSAqICBNYWtlIHN1cmUgdGhlIHdyaXRlIGNvbXBsZXRlZC4KLQkgKi8KLQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkiY3M0Nnh4OiBBQyc5NyB3cml0ZSBwcm9ibGVtLCByZWcgPSAweCV4LCB2YWwgPSAweCV4XG4iLCByZWcsIHZhbCkpOwotCX0KLQotCXNwaW5fdW5sb2NrKCZjYXJkLT5hYzk3X2xvY2spOwotCi0JLyoKLQkgKglBZGp1c3QgcG93ZXIgaWYgdGhlIG1peGVyIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWQgYWNjb3JkaW5nCi0JICoJdG8gdGhlIENELgotCSAqCi0JICoJSUYgdGhlIENEIGlzIGEgdmFsaWQgaW5wdXQgc291cmNlIChtaXhlciBvciBkaXJlY3QpIEFORAotCSAqCQl0aGUgQ0QgaXMgbm90IG11dGVkIFRIRU4gcG93ZXIgaXMgbmVlZGVkCi0JICoKLQkgKglXZSBkbyB0d28gdGhpbmdzLiBXaGVuIHJlY29yZCBzZWxlY3QgY2hhbmdlcyB0aGUgaW5wdXQgdG8KLQkgKglhZGQvcmVtb3ZlIHRoZSBDRCB3ZSBhZGp1c3QgdGhlIHBvd2VyIGNvdW50IGlmIHRoZSBDRCBpcwotCSAqCXVubXV0ZWQuCi0JICoKLQkgKglXaGVuIHRoZSBDRCBtdXRlIGNoYW5nZXMgd2UgYWRqdXN0IHRoZSBwb3dlciBsZXZlbCBpZiB0aGUKLQkgKglDRCB3YXMgYSB2YWxpZCBpbnB1dC4KLQkgKgotCSAqICAgICAgV2UgYWxzbyBjaGVjayBmb3IgQ0Qgdm9sdW1lICE9IDAsIGFzIHRoZSBDRCBtdXRlIGlzbid0Ci0JICogICAgICBub3JtYWxseSB0d2Vha2VkIGZyb20gdXNlcnNwYWNlLgotCSAqLwotCSAKLQkvKiBDRCBtdXRlIGNoYW5nZSA/ICovCi0JCi0JaWYgKHJlZyA9PSBBQzk3X0NEX1ZPTCkgewotCQkvKiBNdXRlIGJpdCBjaGFuZ2UgPyAqLwotCQlpZiAoKHZhbDJedmFsKSAmIDB4ODAwMCB8fAotCQkgICAgKCh2YWwyID09IDB4MWYxZiB8fCB2YWwgPT0gMHgxZjFmKSAmJiB2YWwyICE9IHZhbCkpIHsKLQkJCS8qIFRoaXMgaXMgYSBoYWNrIGJ1dCBpdHMgY2xlYW5lciB0aGFuIHRoZSBhbHRlcm5hdGl2ZXMuCi0JCQkgICBSaWdodCBub3cgY2FyZC0+YWM5N19jb2RlY1swXSBtaWdodCBiZSBOVUxMIGFzIHdlIGFyZQotCQkJICAgc3RpbGwgZG9pbmcgY29kZWMgc2V0dXAuIFRoaXMgZG9lcyBhbiBlYXJseSBhc3NpZ25tZW50Ci0JCQkgICB0byBhdm9pZCB0aGUgcHJvYmxlbSBpZiBpdCBvY2N1cnMgKi8KLQkJCSAgIAotCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMF0gPT0gTlVMTCkKLQkJCQljYXJkLT5hYzk3X2NvZGVjWzBdID0gZGV2OwotCQkJCQotCQkJLyogTXV0ZSBvbiAqLwotCQkJaWYgKHZhbCAmIDB4ODAwMCB8fCB2YWwgPT0gMHgxZjFmKQotCQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKLQkJCWVsc2UgeyAvKiBNdXRlIG9mZiBwb3dlciBvbiAqLwotCQkJCWlmIChjYXJkLT5hbXBfaW5pdCkKLQkJCQkJY2FyZC0+YW1wX2luaXQoY2FyZCk7Ci0JCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8KLQotc3RhdGljIGludCBjc19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgaSA9IDA7Ci0JdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19vcGVuX21peGRldigpK1xuIikpOwotCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCi0JCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmCi0JCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQotCQkJCWdvdG8gbWF0Y2g7Ci0JfQotCWlmICghY2FyZCkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOIHwgQ1NfRVJST1IsIDIsCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9vcGVuX21peGRldigpLSAtRU5PREVWXG4iKSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLSBtYXRjaDoKLQlpZiAoIWNhcmQtPmFjOTdfY29kZWNbaV0pCi0JCXJldHVybiAtRU5PREVWOwotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQtPmFjOTdfY29kZWNbaV07Ci0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLDEpOwotCWlmICghQ1NfSU5fVVNFKCZjYXJkLT5taXhlcl91c2VfY250KSkgewotCQlpZiAoKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX01JWFZPTikpKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCkgcG93ZXJ1cCBmYWlsdXJlICgweCV4KVxuIiwgdG1wKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KLQljYXJkLT5hbXBsaWZpZXJfY3RybChjYXJkLCAxKTsKLQlDU19JTkNfVVNFX0NPVU5UKCZjYXJkLT5taXhlcl91c2VfY250KTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKS0gMFxuIikpOwotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCBjc19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgNCwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkrXG4iKSk7Ci0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQotCXsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKLQkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYKLQkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCi0JCQkJZ290byBtYXRjaDsKLQl9Ci0JaWYgKCFjYXJkKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotbWF0Y2g6Ci0JaWYgKCFDU19ERUNfQU5EX1RFU1QoJmNhcmQtPm1peGVyX3VzZV9jbnQpKSB7Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDQsCi0JCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKS0gbm8gcG93ZXJkb3duLCB1c2VjbnQ+MFxuIikpOwotCQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7Ci0JCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKLQkJcmV0dXJuIDA7Ci0JfQotLyoKLSogb2ssIG5vIG91dHN0YW5kaW5nIG1peGVyIG9wZW5zLCBzbyBwb3dlcmRvd24uCi0qLwotCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9NSVhWT04sIENTX0ZBTFNFKSkpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIE1JWFZPTiBmYWlsdXJlICgweCV4KVxuIiwgdG1wKSk7Ci0JCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKLQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOwotCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAotCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKS0gMFxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNzX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBfX3VzZXIgKnAgPSAobG9uZyBfX3VzZXIgKilhcmc7Ci0jaWYgQ1NERUJVR19JTlRFUkZBQ0UKLSAgICAgICAgaW50IHZhbDsKLQotCWlmICgJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLKSB8fAotCQkoY21kID09IFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0spIHx8Ci0JCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUwpIHx8Ci0JCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwpIHx8Ci0JCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfQVBNKSkgewotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6Ci0JCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdtYXNrLCBwKTsKLQkJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKLQkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z2xldmVsLCBwKTsKLQkJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOgotCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQljc19kZWJ1Z21hc2sgPSB2YWw7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDoKLQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJY3NfZGVidWdsZXZlbCA9IHZhbDsKLQkJCXJldHVybiAwOwotCQljYXNlIFNPVU5EX01JWEVSX0NTX0FQTToKLQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKHZhbCA9PSBDU19JT0NUTF9DTURfU1VTUEVORCkgewotCQkJCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykgewotCQkJCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOwotCQkJCQljczQ2eHhfc3VzcGVuZChjYXJkLCBQTVNHX09OKTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSBpZiAodmFsID09IENTX0lPQ1RMX0NNRF9SRVNVTUUpIHsKLQkJCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKLQkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJCQkJY3M0Nnh4X3Jlc3VtZShjYXJkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAiY3M0Nnh4OiBtaXhlcl9pb2N0bCgpOiBpbnZhbGlkIEFQTSBjbWQgKCVkKVxuIiwKLQkJCQkJdmFsKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJZGVmYXVsdDoKLQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBtaXhlcl9pb2N0bCgpOiBFUlJPUiB1bmtub3duIGRlYnVnIGNtZFxuIikpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Ci19Ci0KLXN0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjc19taXhlcl9mb3BzID0gewotCUNTX09XTkVSCUNTX1RISVNfTU9EVUxFCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLmlvY3RsCQk9IGNzX2lvY3RsX21peGRldiwKLQkub3BlbgkJPSBjc19vcGVuX21peGRldiwKLQkucmVsZWFzZQk9IGNzX3JlbGVhc2VfbWl4ZGV2LAotfTsKLQotLyogQUM5NyBjb2RlYyBpbml0aWFsaXNhdGlvbi4gKi8KLXN0YXRpYyBpbnQgX19pbml0IGNzX2FjOTdfaW5pdChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgbnVtX2FjOTcgPSAwOwotCWludCByZWFkeV8ybmQgPSAwOwotCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKLQl1MTYgZWlkOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkrXG4iKSApOwotCi0JZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgewotCQlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgd2lsbCBiZSBmaWxsZWQKLQkJICAgaW4gYWM5N19wcm9iZV9jb2RlYyAqLwotCQljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKLQkJY29kZWMtPmlkID0gbnVtX2FjOTc7Ci0KLQkJY29kZWMtPmNvZGVjX3JlYWQgPSBjc19hYzk3X2dldDsKLQkJY29kZWMtPmNvZGVjX3dyaXRlID0gY3NfYWM5N19zZXQ7Ci0JCi0JCWlmIChhYzk3X3Byb2JlX2NvZGVjKGNvZGVjKSA9PSAwKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpLSBjb2RlYyBudW1iZXIgJWQgbm90IGZvdW5kXG4iLAotCQkJCQludW1fYWM5NykgKTsKLQkJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKSBmb3VuZCBjb2RlYyAlZFxuIixudW1fYWM5NykpOwotCi0JCWVpZCA9IGNzX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKLQkJCi0JCWlmIChlaWQgPT0gMHhGRkZGKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNvZGVjICVkIG5vdCBwcmVzZW50XG4iLG51bV9hYzk3KTsKLQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJY2FyZC0+YWM5N19mZWF0dXJlcyA9IGVpZDsKLQkJCQotCQlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmY3NfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOwotCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGFjOTdfY29kZWNbJWRdIHNldCB0byAlcFxuIiwKLQkJCQkodW5zaWduZWQgaW50KW51bV9hYzk3LAotCQkJCWNvZGVjKSk7Ci0JCS8qIGlmIHRoZXJlIGlzIG5vIHNlY29uZGFyeSBjb2RlYyBhdCBhbGwsIGRvbid0IHByb2JlIGFueSBtb3JlICovCi0JCWlmICghcmVhZHlfMm5kKQotCQl7Ci0JCQludW1fYWM5NyArPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktICVkXG4iLCAodW5zaWduZWQgaW50KW51bV9hYzk3KSk7Ci0JcmV0dXJuIG51bV9hYzk3OwotfQotCi0vKgotICogbG9hZCB0aGUgc3RhdGljIGltYWdlIGludG8gdGhlIERTUAotICovCi0jaW5jbHVkZSAiY3M0NjF4X2ltYWdlLmgiCi1zdGF0aWMgdm9pZCBjczQ2MXhfZG93bmxvYWRfaW1hZ2Uoc3RydWN0IGNzX2NhcmQgKmNhcmQpCi17Ci0gICAgdW5zaWduZWQgaSwgaiwgdGVtcDEsIHRlbXAyLCBvZmZzZXQsIGNvdW50OwotICAgIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqcEJBMSA9IGlvcmVtYXAoY2FyZC0+YmExX2FkZHIsIDB4NDAwMDApOwotICAgIGZvciAoaSA9IDA7IGkgPCBDTEVBUl9fQ09VTlQ7IGkrKykgewotICAgICAgICBvZmZzZXQgPSBDbHJTdGF0W2ldLkJBMV9fRGVzdEJ5dGVPZmZzZXQ7Ci0gICAgICAgIGNvdW50ICA9IENsclN0YXRbaV0uQkExX19Tb3VyY2VTaXplOwotICAgICAgICBmb3IgKHRlbXAxID0gb2Zmc2V0OyB0ZW1wMSA8IChvZmZzZXQgKyBjb3VudCk7IHRlbXAxICs9IDQpCi0gICAgICAgICAgICAgIHdyaXRlbCgwLCBwQkExK3RlbXAxKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRklMTF9fQ09VTlQ7IGkrKykgewotICAgICAgICB0ZW1wMiA9IEZpbGxTdGF0W2ldLk9mZnNldDsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IChGaWxsU3RhdFtpXS5TaXplKSAvIDQ7IGorKykgewotICAgICAgICAgICAgdGVtcDEgPSAoRmlsbFN0YXRbaV0pLnBGaWxsW2pdOwotICAgICAgICAgICAgd3JpdGVsKHRlbXAxLCBwQkExK3RlbXAyICsgaiAqIDQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlvdW5tYXAocEJBMSk7Ci19Ci0KLS8qCi0gKiAgQ2hpcCByZXNldAotICovCi0KLXN0YXRpYyB2b2lkIGNzNDYxeF9yZXNldChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgaWR4OwotCi0JLyoKLQkgKiAgV3JpdGUgdGhlIHJlc2V0IGJpdCBvZiB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgU1BDUl9SU1RTUCk7Ci0KLQkvKgotCSAqICBXcml0ZSB0aGUgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgU1BDUl9EUlFFTik7Ci0KLQkvKgotCSAqICBDbGVhciB0aGUgdHJhcCByZWdpc3RlcnMuCi0JICovCi0JZm9yIChpZHggPSAwOyBpZHggPCA4OyBpZHgrKykgewotCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfRFJFRywgRFJFR19SRUdJRF9UUkFQX1NFTEVDVCArIGlkeCk7Ci0JCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9UV1BSLCAweEZGRkYpOwotCX0KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfRFJFRywgMCk7Ci0KLQkvKgotCSAqICBTZXQgdGhlIGZyYW1lIHRpbWVyIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiBjeWNsZXMgcGVyIGZyYW1lLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9GUk1ULCAweGFkZik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3Moc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCB0eXBlKQotewotCWludCBpZHgsIGxvb3AsIHN0YXJ0Zmlmbz0wLCBlbmRmaWZvPTAsIHBvd2VyZG93bjEgPSAwOwotCXVuc2lnbmVkIGludCB0bXA7Ci0KLQkvKgotCSAqICBTZWUgaWYgdGhlIGRldmljZXMgYXJlIHBvd2VyZWQgZG93bi4gIElmIHNvLCB3ZSBtdXN0IHBvd2VyIHRoZW0gdXAgZmlyc3QKLQkgKiAgb3IgdGhleSB3aWxsIG5vdCByZXNwb25kLgotCSAqLwotCWlmICghKCh0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSkgJiBDTEtDUjFfU1dDRSkpIHsKLQkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wIHwgQ0xLQ1IxX1NXQ0UpOwotCQlwb3dlcmRvd24xID0gMTsKLQl9Ci0KLQkvKgotCSAqICBXZSB3YW50IHRvIGNsZWFyIG91dCB0aGUgc2VyaWFsIHBvcnQgRklGT3Mgc28gd2UgZG9uJ3QgZW5kIHVwIHBsYXlpbmcKLQkgKiAgd2hhdGV2ZXIgcmFuZG9tIGdhcmJhZ2UgaGFwcGVucyB0byBiZSBpbiB0aGVtLiAgV2UgZmlsbCB0aGUgc2FtcGxlIEZJRk9TCi0JICogIHdpdGggemVybyAoc2lsZW5jZSkuCi0gICAgICAgICAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCV1AsIDApOwotCi0JLyoKLQkqIENoZWNrIGZvciB3aGljaCBGSUZPIGxvY2F0aW9ucyB0byBjbGVhciwgaWYgd2UgYXJlIGN1cnJlbnRseQotCSogcGxheWluZyBvciBjYXB0dXJpbmcgdGhlbiB3ZSBkb24ndCB3YW50IHRvIHB1dCBpbiAxMjggYnl0ZXMgb2YKLQkqICJub2lzZSIuCi0JICovCi0JaWYgKHR5cGUgJiBDU19UWVBFX0RBQykgewotCQlzdGFydGZpZm8gPSAxMjg7Ci0JCWVuZGZpZm8gPSAyNTY7Ci0JfQotCWlmICh0eXBlICYgQ1NfVFlQRV9BREMpIHsKLQkJc3RhcnRmaWZvID0gMDsKLQkJaWYgKCFlbmRmaWZvKQotCQkJZW5kZmlmbyA9IDEyODsKLQl9Ci0JLyoKLQkgKiAgRmlsbCBzYW1wbGUgRklGTyBsb2NhdGlvbnMgKDI1NiBsb2NhdGlvbnMgdG90YWwpLgotCSAqLwotCWZvciAoaWR4ID0gc3RhcnRmaWZvOyBpZHggPCBlbmRmaWZvOyBpZHgrKykgewotCQkvKgotCQkgKiAgTWFrZSBzdXJlIHRoZSBwcmV2aW91cyBGSUZPIHdyaXRlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgotCQkgKi8KLQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDU7IGxvb3ArKykgewotCQkJdWRlbGF5KDUwKTsKLQkJCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9TRVJCU1QpICYgU0VSQlNUX1dCU1kpKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfU0VSQlNUKSAmIFNFUkJTVF9XQlNZKSB7Ci0JCQlpZiAocG93ZXJkb3duMSkKLQkJCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOwotCQl9Ci0JCS8qCi0JCSAqICBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgRklGTyBpbmRleC4KLQkJICovCi0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCQUQsIGlkeCk7Ci0JCS8qCi0JCSAqICBUZWxsIHRoZSBzZXJpYWwgcG9ydCB0byBsb2FkIHRoZSBuZXcgdmFsdWUgaW50byB0aGUgRklGTyBsb2NhdGlvbi4KLQkJICovCi0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCQ00sIFNFUkJDTV9XUkMpOwotCX0KLQkvKgotCSAqICBOb3csIGlmIHdlIHBvd2VyZWQgdXAgdGhlIGRldmljZXMsIHRoZW4gcG93ZXIgdGhlbSBiYWNrIGRvd24gYWdhaW4uCi0JICogIFRoaXMgaXMga2luZGEgdWdseSwgYnV0IHNob3VsZCBuZXZlciBoYXBwZW4uCi0JICovCi0JaWYgKHBvd2VyZG93bjEpCi0JCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Ci19Ci0KLQotc3RhdGljIGludCBjczQ2MXhfcG93ZXJkb3duKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50IHN1c3BlbmRmbGFnKQotewotCWludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgdG1wPTAsbXV0ZWQ9MDsKLQotCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyB0eXBlPTB4JXhcbiIsdHlwZSkpOwotCWlmICghY3NfcG93ZXJkb3duICYmICFzdXNwZW5kZmxhZykgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgRElTQUJMRUQgZXhpdGluZ1xuIikpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBwb3dlcmRvd24gcmVnPTB4JXhcbiIsdG1wKSk7Ci0vKgotKiBpZiBwb3dlcmluZyBkb3duIG9ubHkgdGhlIFZSRUYsIGFuZCBub3QgcG93ZXJpbmcgZG93biB0aGUgREFDL0FEQywKLSogdGhlbiBkbyBub3QgcG93ZXIgZG93biB0aGUgVlJFRiwgVU5MRVNTIGJvdGggdGhlIERBQyBhbmQgQURDIGFyZSBub3QKLSogY3VycmVudGx5IHBvd2VyZWQgZG93bi4gIElmIHBvd2VyaW5nIGRvd24gREFDIGFuZCBBREMsIHRoZW4KLSogaXQgaXMgcG9zc2libGUgdG8gcG93ZXIgZG93biB0aGUgVlJFRiAoT04pLgotKi8KLQlpZiAoKCh0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKSAmJgotCQkgKCEodHlwZSAmIENTX1BPV0VSX0FEQykgfHwgKCEodHlwZSAmIENTX1BPV0VSX0RBQykpKSkKLQkgICAgICAmJiAKLQkJKCh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSB8fAotCQkgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKSkgewotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCi0JCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCktIDAgIHVuYWJsZSB0byBwb3dlcmRvd24uIHRtcD0weCV4XG4iLHRtcCkpOwotCQlyZXR1cm4gMDsKLQl9Ci0vKgotKiBmb3Igbm93LCBhbHdheXMga2VlcCBwb3dlciB0byB0aGUgbWl4ZXIgYmxvY2suCi0qIG5vdCBzdXJlIHdoeSBpdCdzIGEgcHJvYmxlbSBidXQgaXQgc2VlbXMgdG8gYmUgaWYgd2UgcG93ZXIgb2ZmLgotKi8KLQl0eXBlICY9IH5DU19QT1dFUl9NSVhWT047Ci0JdHlwZSAmPSB+Q1NfUE9XRVJfTUlYVk9GRjsKLQotCS8qCi0JICogIFBvd2VyIGRvd24gaW5kaWNhdGVkIGFyZWFzLgotCSAqLwotCWlmICh0eXBlICYgQ1NfUE9XRVJfTUlYVk9GRikgewotCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCi0JCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgTUlYVk9GRlxuIikpOwotCQkvKgotCQkgKiAgUG93ZXIgZG93biB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VyZG93biBNSVhWT0ZGIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKSB7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBNSVhWT05cbiIpKTsKLQkJLyoKLQkJICogIFBvd2VyIGRvd24gdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT047Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPTiBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodHlwZSAmIENTX1BPV0VSX0FEQykgewotCQkvKgotCQkgKiAgUG93ZXIgZG93biB0aGUgQURDIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0JCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIEFEQ1xuIikpOwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREM7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCk7Ci0KLQkJCS8qCi0JCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgotCQkJICovCi0JCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgewotCQkJCS8qCi0JCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQotCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgotCQkJCSAqLwotCQkJCXVkZWxheSg1MDApOwotCi0JCQkJLyoKLQkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KLQkJCQkgKi8KLQkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gQURDIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlICYgQ1NfUE9XRVJfREFDKSB7Ci0JCS8qCi0JCSAqICBQb3dlciBkb3duIHRoZSBEQUMgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIERBQ1xuIikpOwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJkb3duIERBQyBmYWlsZWRcbiIpKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCX0KLQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCWlmIChtdXRlZCkKLQkJY3NfbXV0ZShjYXJkLCBDU19GQUxTRSk7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCktIDAgdG1wPTB4JXhcbiIsdG1wKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3M0Nnh4X3Bvd2VydXAoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlKQotewotCWludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgdG1wID0gMCwgbXV0ZWQgPSAwOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyB0eXBlPTB4JXhcbiIsdHlwZSkpOwotCS8qCi0JKiBjaGVjayBmb3IgVlJFRiBhbmQgcG93ZXJ1cCBpZiBuZWVkIHRvLgotCSovCi0JaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pCi0JCXR5cGUgfD0gQ1NfUE9XRVJfTUlYVk9GRjsKLQlpZiAodHlwZSAmIChDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMpKQotCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPTiB8IENTX1BPV0VSX01JWFZPRkY7Ci0KLQkvKgotCSAqICBQb3dlciB1cCBpbmRpY2F0ZWQgYXJlYXMuCi0JICovCi0JaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT0ZGKSB7Ci0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgTUlYVk9GRlxuIikpOwotCQkvKgotCQkgKiAgUG93ZXIgdXAgdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCi0JCSAqLwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikpIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkY7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJLyoKLQkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KLQkJCSAqLwotCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJ1cCBNSVhWT0ZGIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pIHsKLQotCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBNSVhWT05cbiIpKTsKLQkJLyoKLQkJICogIFBvd2VyIHVwIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikpIHsKLQkJCWlmICghbXV0ZWQpIHsKLQkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkID0gMTsKLQkJCX0KLQkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTjsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7Ci0JCQkvKgotCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KLQkJCSAqLwotCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKLQkJCQkvKgotCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKLQkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KLQkJCQkgKi8KLQkJCQl1ZGVsYXkoNTAwKTsKLQotCQkJCS8qCi0JCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCi0JCQkJICovCi0JCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkKLQkJCS8qCi0JCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCi0JCQkgKi8KLQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkgewotCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKLQkJCQkJImNzNDZ4eDogcG93ZXJ1cCBNSVhWT04gZmFpbGVkXG4iKSk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHR5cGUgJiBDU19QT1dFUl9BREMpIHsKLQkJLyoKLQkJICogIFBvd2VyIHVwIHRoZSBBREMgb24gdGhlIEFDOTcgY2FyZC4gIAotCQkgKi8KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIEFEQ1xuIikpOwotCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSkgewotCQkJaWYgKCFtdXRlZCkgewotCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQgPSAxOwotCQkJfQotCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfQURDOwotCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKLQotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VydXAgQURDIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCWlmICh0eXBlICYgQ1NfUE9XRVJfREFDKSB7Ci0JCS8qCi0JCSAqICBQb3dlciB1cCB0aGUgREFDIG9uIHRoZSBBQzk3IGNhcmQuICAKLQkJICovCi0KLQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKLQkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgREFDXG4iKSk7Ci0JCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKSB7Ci0JCQlpZiAoIW11dGVkKSB7Ci0JCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZCA9IDE7Ci0JCQl9Ci0JCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwotCQkJLyoKLQkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCi0JCQkgKi8KLQkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7Ci0JCQkJLyoKLQkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCi0JCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCi0JCQkJICovCi0JCQkJdWRlbGF5KDUwMCk7Ci0KLQkJCQkvKgotCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgotCQkJCSAqLwotCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgotCQkJICovCi0JCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpIHsKLQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCi0JCQkJCSJjczQ2eHg6IHBvd2VydXAgREFDIGZhaWxlZFxuIikpOwotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JfQotCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JaWYgKG11dGVkKQotCQljc19tdXRlKGNhcmQsIENTX0ZBTFNFKTsKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCktIDAgdG1wPTB4JXhcbiIsdG1wKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0YXJ0KHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCWludCBjbnQ7Ci0KLQkvKgotCSAqICBTZXQgdGhlIGZyYW1lIHRpbWVyIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiBjeWNsZXMgcGVyIGZyYW1lLgotCSAqLwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9GUk1ULCAweGFkZik7Ci0JLyoKLQkgKiAgVHVybiBvbiB0aGUgcnVuLCBydW4gYXQgZnJhbWUsIGFuZCBETUEgZW5hYmxlIGJpdHMgaW4gdGhlIGxvY2FsIGNvcHkgb2YKLQkgKiAgdGhlIFNQIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX1NQQ1IsIFNQQ1JfUlVOIHwgU1BDUl9SVU5GUiB8IFNQQ1JfRFJRRU4pOwotCS8qCi0JICogIFdhaXQgdW50aWwgdGhlIHJ1biBhdCBmcmFtZSBiaXQgcmVzZXRzIGl0c2VsZiBpbiB0aGUgU1AgY29udHJvbAotCSAqICByZWdpc3Rlci4KLQkgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IDI1OyBjbnQrKykgewotCQl1ZGVsYXkoNTApOwotCQlpZiAoIShjczQ2MXhfcGVlayhjYXJkLCBCQTFfU1BDUikgJiBTUENSX1JVTkZSKSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChjczQ2MXhfcGVlayhjYXJkLCBCQTFfU1BDUikgJiBTUENSX1JVTkZSKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IFNQQ1JfUlVORlIgbmV2ZXIgcmVzZXRcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcHJvY19zdG9wKHN0cnVjdCBjc19jYXJkICpjYXJkKQotewotCS8qCi0JICogIFR1cm4gb2ZmIHRoZSBydW4sIHJ1biBhdCBmcmFtZSwgYW5kIERNQSBlbmFibGUgYml0cyBpbiB0aGUgbG9jYWwgY29weSBvZgotCSAqICB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KLQkgKi8KLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgY3NfaGFyZHdhcmVfaW5pdChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKLXsKLQl1bnNpZ25lZCBsb25nIGVuZF90aW1lOwotCXVuc2lnbmVkIGludCB0bXAsY291bnQ7Ci0JCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJImNzNDZ4eDogY3NfaGFyZHdhcmVfaW5pdCgpK1xuIikgKTsKLQkvKiAKLQkgKiAgRmlyc3QsIGJsYXN0IHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyIHRvIHplcm8gc28gdGhhdCB0aGUgUExMIHN0YXJ0cwotICAgICAgICAgKiAgb3V0IGluIGEga25vd24gc3RhdGUsIGFuZCBibGFzdCB0aGUgbWFzdGVyIHNlcmlhbCBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIKLSAgICAgICAgICogIHRvIHplcm8gc28gdGhhdCB0aGUgc2VyaWFsIHBvcnRzIGFsc28gc3RhcnQgb3V0IGluIGEga25vd24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUk1DMSwgMCk7Ci0KLQkvKgotCSAqICBJZiB3ZSBhcmUgaW4gQUM5NyBtb2RlLCB0aGVuIHdlIG11c3Qgc2V0IHRoZSBwYXJ0IHRvIGEgaG9zdCBjb250cm9sbGVkCi0gICAgICAgICAqICBBQy1saW5rLiAgT3RoZXJ3aXNlLCB3ZSB3b24ndCBiZSBhYmxlIHRvIGJyaW5nIHVwIHRoZSBsaW5rLgotICAgICAgICAgKi8gICAgICAgIAotICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQUNDLCBTRVJBQ0NfSFNQIHwgU0VSQUNDX0NPREVDX1RZUEVfMV8wMyk7CS8qIDEuMDMgY2FyZCAqLwotICAgICAgICAvKiBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQUNDLCBTRVJBQ0NfSFNQIHwgU0VSQUNDX0NPREVDX1RZUEVfMl8wKTsgKi8gLyogMi4wMCBjYXJkICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogIERyaXZlIHRoZSBBUlNUIyBwaW4gbG93IGZvciBhIG1pbmltdW0gb2YgMXVTIChhcyBkZWZpbmVkIGluIHRoZSBBQzk3Ci0gICAgICAgICAqICBzcGVjKSBhbmQgdGhlbiBkcml2ZSBpdCBoaWdoLiAgVGhpcyBpcyBkb25lIGZvciBub24gQUM5NyBtb2RlcyBzaW5jZQotICAgICAgICAgKiAgdGhlcmUgbWlnaHQgYmUgbG9naWMgZXh0ZXJuYWwgdG8gdGhlIENTNDYxeCB0aGF0IHVzZXMgdGhlIEFSU1QjIGxpbmUKLSAgICAgICAgICogIGZvciBhIHJlc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCAxKTsKLSAgICAgICAgdWRlbGF5KDUwKTsKLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCAwKTsKLSAgICAgICAgdWRlbGF5KDUwKTsKLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCBBQ0NUTF9SU1ROKTsKLQotCS8qCi0JICogIFRoZSBmaXJzdCB0aGluZyB3ZSBkbyBoZXJlIGlzIHRvIGVuYWJsZSBzeW5jIGdlbmVyYXRpb24uICBBcyBzb29uCi0JICogIGFzIHdlIHN0YXJ0IHJlY2VpdmluZyBiaXQgY2xvY2ssIHdlJ2xsIHN0YXJ0IHByb2R1Y2luZyB0aGUgU1lOQwotCSAqICBzaWduYWwuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7Ci0KLQkvKgotCSAqICBOb3cgd2FpdCBmb3IgYSBzaG9ydCB3aGlsZSB0byBhbGxvdyB0aGUgQUM5NyBwYXJ0IHRvIHN0YXJ0Ci0JICogIGdlbmVyYXRpbmcgYml0IGNsb2NrIChzbyB3ZSBkb24ndCB0cnkgdG8gc3RhcnQgdGhlIFBMTCB3aXRob3V0IGFuCi0JICogIGlucHV0IGNsb2NrKS4KLQkgKi8KLQltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsJCS8qIDEgc2hvdWxkIGJlIGVub3VnaCA/PyAoYW5kIHBpZ3MgbWlnaHQgZmx5KSAqLwotCi0JLyoKLQkgKiAgU2V0IHRoZSBzZXJpYWwgcG9ydCB0aW1pbmcgY29uZmlndXJhdGlvbiwgc28gdGhhdAotCSAqICB0aGUgY2xvY2sgY29udHJvbCBjaXJjdWl0IGdldHMgaXRzIGNsb2NrIGZyb20gdGhlIGNvcnJlY3QgcGxhY2UuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUk1DMSwgU0VSTUMxX1BUQ19BQzk3KTsKLQotCS8qCi0JKiBUaGUgcGFydCBzZWVtcyB0byBub3QgYmUgcmVhZHkgZm9yIGEgd2hpbGUgYWZ0ZXIgYSByZXN1bWUuCi0JKiBzbywgaWYgd2UgYXJlIHJlc3VtaW5nLCB0aGVuIHdhaXQgZm9yIDcwMCBtaWxzLiAgTm90ZSB0aGF0IDYwMCBtaWxzCi0JKiBpcyBub3QgZW5vdWdoIGZvciBzb21lIHBsYXRmb3JtcyEgdGVzdGVkIG9uIGFuIElCTSBUaGlua3BhZHMgYW5kIAotCSogcmVmZXJlbmNlIGNhcmRzLgotCSovCi0JaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCi0JCW1kZWxheShpbml0ZGVsYXkpOwotCS8qCi0JICogIFdyaXRlIHRoZSBzZWxlY3RlZCBjbG9jayBjb250cm9sIHNldHVwIHRvIHRoZSBoYXJkd2FyZS4gIERvIG5vdCB0dXJuIG9uCi0JICogIFNXQ0UgeWV0IChpZiByZXF1ZXN0ZWQpLCBzbyB0aGF0IHRoZSBkZXZpY2VzIGNsb2NrZWQgYnkgdGhlIG91dHB1dCBvZgotCSAqICBQTEwgYXJlIG5vdCBjbG9ja2VkIHVudGlsIHRoZSBQTEwgaXMgc3RhYmxlLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9QTExDQywgUExMQ0NfTFBGXzEwNTBfMjc4MF9LSFogfCBQTExDQ19DRFJfNzNfMTA0X01IWik7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1BMTE0sIDB4M2EpOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjIsIENMS0NSMl9QRElWU184KTsKLQotCS8qCi0JICogIFBvd2VyIHVwIHRoZSBQTEwuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgQ0xLQ1IxX1BMTFApOwotCi0JLyoKLSAgICAgICAgICogIFdhaXQgdW50aWwgdGhlIFBMTCBoYXMgc3RhYmlsaXplZC4KLQkgKi8KLQltZGVsYXkoNSAqIGNzX2xhcHRvcF93YWl0KTsJCS8qIEFnYWluIDEgc2hvdWxkIGJlIGVub3VnaCA/PyAqLwotCi0JLyoKLQkgKiAgVHVybiBvbiBjbG9ja2luZyBvZiB0aGUgY29yZSBzbyB0aGF0IHdlIGNhbiBzZXR1cCB0aGUgc2VyaWFsIHBvcnRzLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpIHwgQ0xLQ1IxX1NXQ0U7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLQotCS8qCi0JICogIEZpbGwgdGhlIHNlcmlhbCBwb3J0IEZJRk9zIHdpdGggc2lsZW5jZS4KLQkgKi8KLQljczQ2MXhfY2xlYXJfc2VyaWFsX0ZJRk9zKGNhcmQsQ1NfVFlQRV9EQUMgfCBDU19UWVBFX0FEQyk7Ci0KLQkvKgotCSAqICBTZXQgdGhlIHNlcmlhbCBwb3J0IEZJRk8gcG9pbnRlciB0byB0aGUgZmlyc3Qgc2FtcGxlIGluIHRoZSBGSUZPLgotCSAqLwotCS8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCU1AsIDApOyAqLwotCi0JLyoKLQkgKiAgV3JpdGUgdGhlIHNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24gdG8gdGhlIHBhcnQuICBUaGUgbWFzdGVyCi0JICogIGVuYWJsZSBiaXQgaXMgbm90IHNldCB1bnRpbCBhbGwgb3RoZXIgdmFsdWVzIGhhdmUgYmVlbiB3cml0dGVuLgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJDMSwgU0VSQzFfU08xRl9BQzk3IHwgU0VSQzFfU08xRU4pOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJDMiwgU0VSQzJfU0kxRl9BQzk3IHwgU0VSQzFfU08xRU4pOwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJNQzEsIFNFUk1DMV9QVENfQUM5NyB8IFNFUk1DMV9NU1BFKTsKLQotCi0JbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7CQkvKiBTaG91bGRudCBiZSBuZWVkZWQgPz8gKi8KLQkKLS8qCi0qIElmIHdlIGFyZSByZXN1bWluZyB1bmRlciAyLjIueCB0aGVuIHdlIGNhbm5vdCBzY2hlZHVsZSBhIHRpbWVvdXQsCi0qIHNvIGp1c3Qgc3BpbiB0aGUgQ1BVLgotKi8KLQlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewotCS8qCi0JICogV2FpdCBmb3IgdGhlIGNhcmQgcmVhZHkgc2lnbmFsIGZyb20gdGhlIEFDOTcgY2FyZC4KLQkgKi8KLQkJZW5kX3RpbWUgPSBqaWZmaWVzICsgMyAqIChIWiA+PiAyKTsKLQkJZG8gewotCQkvKgotCQkgKiAgUmVhZCB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIgdG8gc2VlIGlmIHdlJ3ZlIHNlZW4gYSBDT0RFQyBSRUFEWQotCQkgKiAgc2lnbmFsIGZyb20gdGhlIEFDOTcgY2FyZC4KLQkJICovCi0JCQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSAmIEFDU1RTX0NSRFkpCi0JCQkJYnJlYWs7Ci0JCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwotCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKLQl9IGVsc2UgewotCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KyspIHsKLQkJLy8gRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgotCQkJdWRlbGF5KDI1ICogY3NfbGFwdG9wX3dhaXQpOwotCi0JCQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSAmIEFDU1RTX0NSRFkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICBNYWtlIHN1cmUgQ09ERUMgaXMgUkVBRFkuCi0JICovCi0JaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSAmIEFDU1RTX0NSRFkpKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgIAotCQkJImNzNDZ4eDogY3JlYXRlIC0gbmV2ZXIgcmVhZCBjYXJkIHJlYWR5IGZyb20gQUMnOTdcbiIpKTsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAgCi0JCQkiY3M0Nnh4OiBwcm9iYWJseSBub3QgYSBidWcsIHRyeSB1c2luZyB0aGUgQ1M0MjMyIGRyaXZlcixcbiIpKTsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAgCi0JCQkiY3M0Nnh4OiBvciB0dXJuIG9mZiBhbnkgYXV0b21hdGljIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBpbiB0aGUgQklPUy5cbiIpKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyoKLQkgKiAgQXNzZXJ0IHRoZSB2YWlkIGZyYW1lIHNpZ25hbCBzbyB0aGF0IHdlIGNhbiBzdGFydCBzZW5kaW5nIGNvbW1hbmRzCi0JICogIHRvIHRoZSBBQzk3IGNhcmQuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDQ1RMLCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOwotCi0JaWYgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHsKLQkvKgotCSAqICBXYWl0IHVudGlsIHdlJ3ZlIHNhbXBsZWQgaW5wdXQgc2xvdHMgMyBhbmQgNCBhcyB2YWxpZCwgbWVhbmluZyB0aGF0Ci0JICogIHRoZSBjYXJkIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQy1saW5rLgotCSAqLwotCQllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaID4+IDIpOwotCQlkbyB7Ci0JCQkvKgotCQkJICogIFJlYWQgdGhlIGlucHV0IHNsb3QgdmFsaWQgcmVnaXN0ZXIgYW5kIHNlZSBpZiBpbnB1dCBzbG90cyAzIGFuZAotCQkJICogIDQgYXJlIHZhbGlkIHlldC4KLQkJCSAqLwotCQkJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkKLQkJCQlicmVhazsKLQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOwotCX0gZWxzZSB7Ci0JCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykgewotCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCi0JCQl1ZGVsYXkoMjUgKiBjc19sYXB0b3Bfd2FpdCk7Ci0KLQkJCWlmICgoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDSVNWKSAmIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpID09IChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAgTWFrZSBzdXJlIGlucHV0IHNsb3RzIDMgYW5kIDQgYXJlIHZhbGlkLiAgSWYgbm90LCB0aGVuIHJldHVybgotCSAqICBhbiBlcnJvci4KLQkgKi8KLQlpZiAoKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSAhPSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogY3JlYXRlIC0gbmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyoKLQkgKiAgTm93LCBhc3NlcnQgdmFsaWQgZnJhbWUgYW5kIHRoZSBzbG90IDMgYW5kIDQgdmFsaWQgYml0cy4gIFRoaXMgd2lsbAotCSAqICBjb21tZW5zZSB0aGUgdHJhbnNmZXIgb2YgZGlnaXRhbCBhdWRpbyBkYXRhIHRvIHRoZSBBQzk3IGNhcmQuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0FDT1NWLCBBQ09TVl9TTFYzIHwgQUNPU1ZfU0xWNCk7Ci0KLQkvKgotCSAqICBUdXJuIG9mZiB0aGUgUHJvY2Vzc29yIGJ5IHR1cm5pbmcgb2ZmIHRoZSBzb2Z0d2FyZSBjbG9jayBlbmFibGUgZmxhZyBpbiAKLQkgKiAgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JLyogdG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkgJiB+Q0xLQ1IxX1NXQ0U7ICovCi0JLyogY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsgKi8KLQotCS8qCi0gICAgICAgICAqICBSZXNldCB0aGUgcHJvY2Vzc29yLgotICAgICAgICAgKi8KLQljczQ2MXhfcmVzZXQoY2FyZCk7Ci0KLQkvKgotICAgICAgICAgKiAgRG93bmxvYWQgdGhlIGltYWdlIHRvIHRoZSBwcm9jZXNzb3IuCi0JICovCi0JCi0JY3M0NjF4X2Rvd25sb2FkX2ltYWdlKGNhcmQpOwotCi0JLyoKLSAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKLQljYXJkLT5wY3RsID0gdG1wICYgMHhmZmZmMDAwMDsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7Ci0KLQkvKgotICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KLQkgKi8KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7Ci0JY2FyZC0+Y2N0bCA9IHRtcCAmIDB4MDAwMGZmZmY7Ci0JY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOwotCi0JLyogaW5pdGlhbGl6ZSBBQzk3IGNvZGVjIGFuZCByZWdpc3RlciAvZGV2L21peGVyICovCi0JaWYgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHsKLQkJaWYgKGNzX2FjOTdfaW5pdChjYXJkKSA8PSAwKSB7Ci0JCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGZhaWx1cmVcbiIpKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfSBlbHNlIHsKLQkJY3M0Nnh4X2FjOTdfcmVzdW1lKGNhcmQpOwotCX0KLQkKLQljczQ2MXhfcHJvY19zdGFydChjYXJkKTsKLQotCS8qCi0JICogIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBwYXJ0LgotCSAqLwotCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0lFViB8IEhJQ1JfQ0hHTSk7Ci0KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7Ci0JdG1wICY9IH4weDAwMDBmMDNmOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QRklFLCB0bXApOwkvKiBwbGF5YmFjayBpbnRlcnJ1cHQgZW5hYmxlICovCi0KLQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0lFKTsKLQl0bXAgJj0gfjB4MDAwMDAwM2Y7Ci0JdG1wIHw9ICAweDAwMDAwMDAxOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DSUUsIHRtcCk7CS8qIGNhcHR1cmUgaW50ZXJydXB0IGVuYWJsZSAqLwkKLQotCS8qCi0JICogIElmIElETEUgdGhlbiBQb3dlciBkb3duIHRoZSBwYXJ0LiAgV2Ugd2lsbCBwb3dlciBjb21wb25lbnRzIHVwIAotCSAqICB3aGVuIHdlIG5lZWQgdGhlbS4gIAotCSAqLwotCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7Ci0JCWlmICghY3NfcG93ZXJkb3duKSB7Ci0JCQlpZiAoKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8Ci0JCQkJCUNTX1BPV0VSX01JWFZPTikpKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VydXAoKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19GQUxTRSkpKSB7Ci0JCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJfQotCX0KLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19oYXJkd2FyZV9pbml0KCktIDBcbiIpKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciBub3csIHRoZXkgYXJlIGRlZmVyZWQgCi0gICB1bnRpbCAiQUNDRVNTIiB0aW1lIChpbiBwcm9nX2RtYWJ1ZiBjYWxsZWQgYnkgb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCi0gICAKLS8qCi0gKglDYXJkIHN1YmlkIHRhYmxlCi0gKi8KLSAKLXN0cnVjdCBjc19jYXJkX3R5cGUKLXsKLQl1MTYgdmVuZG9yOwotCXUxNiBpZDsKLQljaGFyICpuYW1lOwotCXZvaWQgKCphbXApKHN0cnVjdCBjc19jYXJkICosIGludCk7Ci0Jdm9pZCAoKmFtcF9pbml0KShzdHJ1Y3QgY3NfY2FyZCAqKTsKLQl2b2lkICgqYWN0aXZlKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQpOwotfTsKLQotc3RhdGljIHN0cnVjdCBjc19jYXJkX3R5cGUgY2FyZHNbXSA9IHsKLQl7Ci0JCS52ZW5kb3IJPSAweDE0ODksCi0JCS5pZAk9IDB4NzAwMSwKLQkJLm5hbWUJPSAiR2VuaXVzIFNvdW5kbWFrZXIgMTI4IHZhbHVlIiwKLQkJLmFtcAk9IGFtcF9ub25lLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHg1MDUzLAotCQkuaWQJPSAweDMzNTcsCi0JCS5uYW1lCT0gIlZveWV0cmEiLAotCQkuYW1wCT0gYW1wX3ZveWV0cmEsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDEwNzEsCi0JCS5pZAk9IDB4NjAwMywKLQkJLm5hbWUJPSAiTWl0YWMgTUk2MDIwLzIxIiwKLQkJLmFtcAk9IGFtcF92b3lldHJhLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNEFGLAotCQkuaWQJPSAweDAwNTAsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4MDA1MCwKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDUxLAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweDAwNTIsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCi0JCS5hbXAJPSBhbXBfaGVyY3VsZXMsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSAweDE2ODEsCi0JCS5pZAk9IDB4MDA1MywKLQkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKLQkJLmFtcAk9IGFtcF9oZXJjdWxlcywKLQl9LAotCXsKLQkJLnZlbmRvcgk9IDB4MTY4MSwKLQkJLmlkCT0gMHgwMDU0LAotCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAotCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAotCX0sCi0JewotCQkudmVuZG9yCT0gMHgxNjgxLAotCQkuaWQJPSAweGEwMTAsCi0JCS5uYW1lCT0gIkhlcmN1bGVzIEZvcnRpc3NpbW8gSUkiLAotCQkuYW1wCT0gYW1wX25vbmUsCi0JfSwKLQkvKiBOb3Qgc3VyZSBpZiB0aGUgNTcwIG5lZWRzIHRoZSBjbGtydW4gaGFjayAqLwotCXsKLQkJLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfSUJNLAotCQkuaWQJPSAweDAxMzIsCi0JCS5uYW1lCT0gIlRoaW5rcGFkIDU3MCIsCi0JCS5hbXAJPSBhbXBfbm9uZSwKLQkJLmFjdGl2ZQk9IGNsa3J1bl9oYWNrLAotCX0sCi0JewotCQkudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9JQk0sCi0JCS5pZAk9IDB4MDE1MywKLQkJLm5hbWUJPSAiVGhpbmtwYWQgNjAwWC9BMjAvVDIwIiwKLQkJLmFtcAk9IGFtcF9ub25lLAotCQkuYWN0aXZlCT0gY2xrcnVuX2hhY2ssCi0JfSwKLQl7Ci0JCS52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX0lCTSwKLQkJLmlkCT0gMHgxMDEwLAotCQkubmFtZQk9ICJUaGlua3BhZCA2MDBFICh1bnN1cHBvcnRlZCkiLAotCX0sCi0JewotCQkubmFtZQk9ICJDYXJkIHdpdGhvdXQgU1NJRCBzZXQiLAotCX0sCi0JeyAwLCB9LAotfTsKLQotTU9EVUxFX0FVVEhPUigiQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEphcm9zbGF2IEt5c2VsYSwgPHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDcnlzdGFsIFNvdW5kRnVzaW9uIEF1ZGlvIFN1cHBvcnQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgY3M0Nnh4X2Jhbm5lcltdID0gS0VSTl9JTkZPICJDcnlzdGFsIDQyODAvNDZ4eCArIEFDOTcgQXVkaW8sIHZlcnNpb24gIiBDUzQ2WFhfTUFKT1JfVkVSU0lPTiAiLiIgQ1M0NlhYX01JTk9SX1ZFUlNJT04gIi4iIENTNDZYWF9BUkNIICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7Ci1zdGF0aWMgY29uc3QgY2hhciBmbmRtc2dbXSA9IEtFUk5fSU5GTyAiY3M0Nnh4OiBGb3VuZCAlZCBhdWRpbyBkZXZpY2UocykuXG4iOwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBjczQ2eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCi0JCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCi17Ci0JaW50IGksIGo7Ci0JdTE2IHNzX2NhcmQsIHNzX3ZlbmRvcjsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZDsKLQlkbWFfYWRkcl90IGRtYV9tYXNrOwotCXN0cnVjdCBjc19jYXJkX3R5cGUgKmNwID0gJmNhcmRzWzBdOwotCi0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IHByb2JlKCkrXG4iKSk7Ci0KLQlkbWFfbWFzayA9IDB4ZmZmZmZmZmY7CS8qIHRoaXMgZW5hYmxlcyBwbGF5YmFjayBhbmQgcmVjb3JkaW5nICovCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKSB7Ci0JCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgotCQkJICJjczQ2eHg6IHBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFSU1JDSVNNRU1PUllSRUdJT04ocGNpX2RldiwgMCkgfHwKLQkgICAgIVJTUkNJU01FTU9SWVJFR0lPTihwY2lfZGV2LCAxKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgotCQkJICJjczQ2eHg6IHByb2JlKCktIE1lbW9yeSByZWdpb24gbm90IGFzc2lnbmVkXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHBjaV9kZXYtPmlycSA9PSAwKSB7Ci0JCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCi0JCQkgImNzNDZ4eDogcHJvYmUoKSBJUlEgbm90IGFzc2lnbmVkXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFwY2lfZG1hX3N1cHBvcnRlZChwY2lfZGV2LCAweGZmZmZmZmZmKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgotCQkgICAgICAiY3M0Nnh4OiBwcm9iZSgpIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzc192ZW5kb3IpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzc19jYXJkKTsKLQotCWlmICgoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjc19jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JY2FyZC0+YmEwX2FkZHIgPSBSU1JDQUREUkVTUyhwY2lfZGV2LCAwKTsKLQljYXJkLT5iYTFfYWRkciA9IFJTUkNBRERSRVNTKHBjaV9kZXYsIDEpOwotCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2OwotCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKLQljYXJkLT5tYWdpYyA9IENTX0NBUkRfTUFHSUM7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5hYzk3X2xvY2spOwotCi0JcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7Ci0KLQlwcmludGsoY3M0Nnh4X2Jhbm5lcik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBDYXJkIGZvdW5kIGF0IDB4JTA4bHggYW5kIDB4JTA4bHgsIElSUSAlZFxuIiwKLQkgICAgICAgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCBjYXJkLT5pcnEpOwotCi0JY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjc19hbGxvY19wY21fY2hhbm5lbDsKLQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBjc19hbGxvY19yZWNfcGNtX2NoYW5uZWw7Ci0JY2FyZC0+ZnJlZV9wY21fY2hhbm5lbCA9IGNzX2ZyZWVfcGNtX2NoYW5uZWw7Ci0JY2FyZC0+YW1wbGlmaWVyX2N0cmwgPSBhbXBfbm9uZTsKLQljYXJkLT5hY3RpdmVfY3RybCA9IGFtcF9ub25lOwotCi0Jd2hpbGUgKGNwLT5uYW1lKQotCXsKLQkJaWYgKGNwLT52ZW5kb3IgPT0gc3NfdmVuZG9yICYmIGNwLT5pZCA9PSBzc19jYXJkKSB7Ci0JCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGNwLT5hbXA7Ci0JCQlpZiAoY3AtPmFjdGl2ZSkKLQkJCQljYXJkLT5hY3RpdmVfY3RybCA9IGNwLT5hY3RpdmU7Ci0JCQlpZiAoY3AtPmFtcF9pbml0KQotCQkJCWNhcmQtPmFtcF9pbml0ID0gY3AtPmFtcF9pbml0OwotCQkJYnJlYWs7Ci0JCX0KLQkJY3ArKzsKLQl9Ci0JaWYgKGNwLT5uYW1lID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBVbmtub3duIGNhcmQgKCUwNFg6JTA0WCkgYXQgMHglMDhseC8weCUwOGx4LCBJUlEgJWRcbiIsCi0JCQlzc192ZW5kb3IsIHNzX2NhcmQsIGNhcmQtPmJhMF9hZGRyLCBjYXJkLT5iYTFfYWRkciwgIGNhcmQtPmlycSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiAlcyAoJTA0WDolMDRYKSBhdCAweCUwOGx4LzB4JTA4bHgsIElSUSAlZFxuIiwKLQkJCWNwLT5uYW1lLCBzc192ZW5kb3IsIHNzX2NhcmQsIGNhcmQtPmJhMF9hZGRyLCBjYXJkLT5iYTFfYWRkciwgY2FyZC0+aXJxKTsKLQl9Ci0JCi0JaWYgKGNhcmQtPmFtcGxpZmllcl9jdHJsID09IE5VTEwpIHsKLQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwgPSBhbXBfbm9uZTsKLQkJY2FyZC0+YWN0aXZlX2N0cmwgPSBjbGtydW5faGFjazsKLQl9CQkKLQotCWlmIChleHRlcm5hbF9hbXAgPT0gMSkgewotCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOwotCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF92b3lldHJhOwotCX0KLQotCWlmICh0aGlua3BhZCA9PSAxKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQWN0aXZhdGluZyBDTEtSVU4gaGFjayBmb3IgVGhpbmtwYWQuXG4iKTsKLQkJY2FyZC0+YWN0aXZlX2N0cmwgPSBjbGtydW5faGFjazsKLQl9Ci0vKgotKiBUaGUgdGhpbmtwYWRzIGRvbid0IHdvcmsgd2VsbCB3aXRob3V0IHJ1bnRpbWUgdXBkYXRpbmcgb24gdGhlaXIga2VybmVsIAotKiBkZWxheSB2YWx1ZXMgKG9yIGFueSBsYXB0b3Agd2l0aCB2YXJpYWJsZSBDUFUgc3BlZWRzIHJlYWxseSkuCi0qIHNvLCBqdXN0IHRvIGJlIHNhZmUgc2V0IHRoZSBpbml0IGRlbGF5IHRvIDIxMDAuICBFbGltaW5hdGVzCi0qIGZhaWx1cmVzIG9uIFQyMSBUaGlua3BhZHMuICByZW1vdmUgdGhpcyBjb2RlIHdoZW4gdGhlIHVkZWxheQotKiBhbmQgbWRlbGF5IGtlcm5lbCBjb2RlIGlzIHJlcGxhY2VkIGJ5IGEgcG0gdGltZXIsIG9yIHRoZSBkZWxheXMKLSogd29yayB3ZWxsIGZvciBiYXR0ZXJ5IGFuZC9vciBBQyBwb3dlciBib3RoLgotKi8KLQlpZiAoY2FyZC0+YWN0aXZlX2N0cmwgPT0gY2xrcnVuX2hhY2spIHsKLQkJaW5pdGRlbGF5ID0gMjEwMDsKLQkJY3NfbGFwdG9wX3dhaXQgPSA1OwotCX0KLQlpZiAoKGNhcmQtPmFjdGl2ZV9jdHJsID09IGNsa3J1bl9oYWNrKSAmJiAhKHBvd2VyZG93biA9PSAxKSkgewotLyoKLSogZm9yIHNvbWUgY3VycmVudGx5IHVua25vd24gcmVhc29uLCBwb3dlcmluZyBkb3duIHRoZSBEQUMgYW5kIEFEQyBjb21wb25lbnQKLSogYmxvY2tzIG9uIHRoaW5rcGFkcyBjYXVzZXMgc29tZSBmdW5reSBiZWhhdmlvci4uLiBkaXN0b29ycnJ0aW9uIGFuZCBhYzk3IAotKiBjb2RlYyBhY2Nlc3MgcHJvYmxlbXMuICBwcm9iYWJseSB0aGUgc2VyaWFsIGNsb2NrIGJlY29tZXMgdW5zeW5jZWQuIAotKiBhZGRlZCBjb2RlIHRvIHN5bmMgdGhlIGNoaXBzIGJhY2sgdXAsIGJ1dCBvbmx5IGhlbHBlZCBhYm91dCA3MCUgdGhlIHRpbWUuCi0qLwotCQljc19wb3dlcmRvd24gPSAwOwotCX0KLQlpZiAocG93ZXJkb3duID09IDApCi0JCWNzX3Bvd2VyZG93biA9IDA7Ci0JY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgMSk7Ci0KLQkvKiBjbGFpbSBvdXIgaW9zcGFjZSBhbmQgaXJxICovCi0JCi0JY2FyZC0+YmEwID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMF9hZGRyLCBDUzQ2MVhfQkEwX1NJWkUpOwotCWNhcmQtPmJhMS5uYW1lLmRhdGEwID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0wLCBDUzQ2MVhfQkExX0RBVEEwX1NJWkUpOwotCWNhcmQtPmJhMS5uYW1lLmRhdGExID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0xLCBDUzQ2MVhfQkExX0RBVEExX1NJWkUpOwotCWNhcmQtPmJhMS5uYW1lLnBtZW0gPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfUE1FTSwgQ1M0NjFYX0JBMV9QUkdfU0laRSk7Ci0JY2FyZC0+YmExLm5hbWUucmVnID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX1JFRywgQ1M0NjFYX0JBMV9SRUdfU0laRSk7Ci0JCi0JQ1NfREJHT1VUKENTX0lOSVQsIDQsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNhcmQ9JXAgY2FyZC0+YmEwPSVwXG4iLGNhcmQsY2FyZC0+YmEwKSApOwotCUNTX0RCR09VVChDU19JTklULCA0LCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjYXJkLT5iYTE9JXAgJXAgJXAgJXBcbiIsCi0JCQljYXJkLT5iYTEubmFtZS5kYXRhMCwKLQkJCWNhcmQtPmJhMS5uYW1lLmRhdGExLAotCQkJY2FyZC0+YmExLm5hbWUucG1lbSwKLQkJCWNhcmQtPmJhMS5uYW1lLnJlZykgKTsKLQotCWlmIChjYXJkLT5iYTAgPT0gMCB8fCBjYXJkLT5iYTEubmFtZS5kYXRhMCA9PSAwIHx8Ci0JCWNhcmQtPmJhMS5uYW1lLmRhdGExID09IDAgfHwgY2FyZC0+YmExLm5hbWUucG1lbSA9PSAwIHx8Ci0JCWNhcmQtPmJhMS5uYW1lLnJlZyA9PSAwKQotCQlnb3RvIGZhaWwyOwotCQkKLQlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmY3NfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgImNzNDZ4eCIsIGNhcmQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCBjYXJkLT5pcnEpOwotCQlnb3RvIGZhaWwyOwotCX0KLQkvKiByZWdpc3RlciAvZGV2L2RzcCAqLwotCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZjczQ2MXhfZm9wcywgLTEpKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byByZWdpc3RlciBkc3BcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0gICAgICAgIC8qIHJlZ2lzdGVyIC9kZXYvbWlkaSAqLwotICAgICAgICBpZiAoKGNhcmQtPmRldl9taWRpID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmY3NfbWlkaV9mb3BzLCAtMSkpIDwgMCkKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogdW5hYmxlIHRvIHJlZ2lzdGVyIG1pZGlcbiIpOwotICAgICAgICAgICAgICAgIAotCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9JRExFOwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJaWYgKGNzX2hhcmR3YXJlX2luaXQoY2FyZCkgIT0gMCkgewotCQkJQ1NfREJHT1VUKENTX0VSUk9SLCA0LCBwcmludGsoCi0JCQkJImNzNDZ4eDogRVJST1IgaW4gY3NfaGFyZHdhcmVfaW5pdCgpLi4uIHJldHJ5aW5nXG4iKSk7Ci0JCQlmb3IgKGogPSAwOyBqIDwgTlJfQUM5NzsgaisrKQotCQkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2pdICE9IE5VTEwpIHsKLQkJCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2pdLT5kZXZfbWl4ZXIpOwotCQkJCQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5N19jb2RlY1tqXSk7Ci0JCQkJfQotCQkJbWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWlmKGkgPj0gNCkgewotCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAotCQkJImNzNDZ4eDogY3M0Nnh4X3Byb2JlKCktIGNzX2hhcmR3YXJlX2luaXQoKSBmYWlsZWQsIHJldHJpZWQgJWQgdGltZXMuXG4iLGkpKTsKLSAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5kZXZfYXVkaW8pOwotICAgICAgICAgICAgICAgIGlmIChjYXJkLT5kZXZfbWlkaSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5kZXZfbWlkaSk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotCX0KLQotICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5taWRpLm9wZW5fd2FpdCk7Ci0gICAgICAgIG11dGV4X2luaXQoJmNhcmQtPm1pZGkub3Blbl9tdXRleCk7Ci0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkuaXdhaXQpOwotICAgICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5taWRpLm93YWl0KTsKLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX01JRENSLCBNSURDUl9NUlNUKTsgICAKLSAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX01JRENSLCAwKTsgICAKLQotCS8qIAotCSogQ2hlY2sgaWYgd2UgaGF2ZSB0byBpbml0IHRoZSBhbXBsaWZpZXIsIGJ1dCBwcm9iYWJseSBhbHJlYWR5IGRvbmUKLQkqIHNpbmNlIHRoZSBDRCBsb2dpYyBpbiB0aGUgYWM5NyBpbml0IGNvZGUgd2lsbCB0dXJuIG9uIHRoZSBleHQgYW1wLgotCSovCi0JaWYgKGNwLT5hbXBfaW5pdCkKLQkJY3AtPmFtcF9pbml0KGNhcmQpOwotICAgICAgICBjYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7Ci0KLQlQQ0lfU0VUX0RSSVZFUl9EQVRBKHBjaV9kZXYsIGNhcmQpOwotCVBDSV9TRVRfRE1BX01BU0socGNpX2RldiwgZG1hX21hc2spOwotCWxpc3RfYWRkKCZjYXJkLT5saXN0LCAmY3M0Nnh4X2RldnMpOwotCi0JQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IHBtLmZsYWdzPTB4JXggY2FyZD0lcFxuIiwKLQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzLGNhcmQpKTsKLQotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KLQkJImNzNDZ4eDogcHJvYmUoKS0gZGV2aWNlIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHlcbiIpKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKLWZhaWwyOgotCWlmIChjYXJkLT5iYTApCi0JCWlvdW5tYXAoY2FyZC0+YmEwKTsKLQlpZiAoY2FyZC0+YmExLm5hbWUuZGF0YTApCi0JCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTApOwotCWlmIChjYXJkLT5iYTEubmFtZS5kYXRhMSkKLQkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMSk7Ci0JaWYgKGNhcmQtPmJhMS5uYW1lLnBtZW0pCi0JCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucG1lbSk7Ci0JaWYgKGNhcmQtPmJhMS5uYW1lLnJlZykKLQkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5yZWcpOwotCWtmcmVlKGNhcmQpOwotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8KLQkJImNzNDZ4eDogcHJvYmUoKS0gbm8gZGV2aWNlIGFsbG9jYXRlZFxuIikpOwotCXJldHVybiAtRU5PREVWOwotfSAvLyBwcm9iZV9jczQ2eHgKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgY3M0Nnh4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpX2Rldik7Ci0JaW50IGk7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQkKLQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPCi0JCSAiY3M0Nnh4OiBjczQ2eHhfcmVtb3ZlKCkrXG4iKSk7Ci0KLQljYXJkLT5hY3RpdmVfY3RybChjYXJkLDEpOwotCQotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsKLQl0bXAgJj0gfjB4MDAwMGYwM2Y7Ci0JdG1wIHw9ICAweDAwMDAwMDEwOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QRklFLCB0bXApOwkvKiBwbGF5YmFjayBpbnRlcnJ1cHQgZGlzYWJsZSAqLwotCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NJRSk7Ci0JdG1wICY9IH4weDAwMDAwMDNmOwotCXRtcCB8PSAgMHgwMDAwMDAxMTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0lFLCB0bXApOwkvKiBjYXB0dXJlIGludGVycnVwdCBkaXNhYmxlICovCi0KLQkvKgotICAgICAgICAgKiAgU3RvcCBwbGF5YmFjayBETUEuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BDVEwpOwotCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQ1RMLCB0bXAgJiAweDAwMDBmZmZmKTsKLQotCS8qCi0gICAgICAgICAqICBTdG9wIGNhcHR1cmUgRE1BLgotCSAqLwotCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DQ1RMKTsKLQljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wICYgMHhmZmZmMDAwMCk7Ci0KLQkvKgotICAgICAgICAgKiAgUmVzZXQgdGhlIHByb2Nlc3Nvci4KLSAgICAgICAgICovCi0JY3M0NjF4X3Jlc2V0KGNhcmQpOwotCi0JY3M0NjF4X3Byb2Nfc3RvcChjYXJkKTsKLQotCS8qCi0JICogIFBvd2VyIGRvd24gdGhlIERBQyBhbmQgQURDLiAgV2Ugd2lsbCBwb3dlciB0aGVtIHVwIChpZikgd2hlbiB3ZSBuZWVkCi0JICogIHRoZW0uCi0JICovCi0JaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8Ci0JCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUpKSkgewotCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKLQl9Ci0KLQkvKgotCSAqICBQb3dlciBkb3duIHRoZSBQTEwuCi0JICovCi0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgMCk7Ci0KLQkvKgotCSAqICBUdXJuIG9mZiB0aGUgUHJvY2Vzc29yIGJ5IHR1cm5pbmcgb2ZmIHRoZSBzb2Z0d2FyZSBjbG9jayBlbmFibGUgZmxhZyBpbiAKLQkgKiAgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIuCi0JICovCi0JdG1wID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0NMS0NSMSkgJiB+Q0xLQ1IxX1NXQ0U7Ci0JY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0NMS0NSMSwgdG1wKTsKLQotCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsLTEpOwotCi0JLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KLQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCWlvdW5tYXAoY2FyZC0+YmEwKTsKLQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGEwKTsKLQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGExKTsKLQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLnBtZW0pOwotCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucmVnKTsKLQkKLQkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQotCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMKSB7Ci0JCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlcik7Ci0JCQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5N19jb2RlY1tpXSk7Ci0JCX0KLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5kZXZfYXVkaW8pOwotICAgICAgICBpZiAoY2FyZC0+ZGV2X21pZGkpCi0gICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9taWRpKGNhcmQtPmRldl9taWRpKTsKLQlsaXN0X2RlbCgmY2FyZC0+bGlzdCk7Ci0Ja2ZyZWUoY2FyZCk7Ci0JUENJX1NFVF9EUklWRVJfREFUQShwY2lfZGV2LE5VTEwpOwotCi0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwotCQkgImNzNDZ4eDogY3M0Nnh4X3JlbW92ZSgpLTogcmVtb3ZlIHN1Y2Nlc3NmdWxcbiIpKTsKLX0KLQotZW51bSB7Ci0JQ1M0NlhYXzQ2MTAgPSAwLAotCUNTNDZYWF80NjEyLCAgCS8qIHNhbWUgYXMgNDYzMCAqLwotCUNTNDZYWF80NjE1LCAgCS8qIHNhbWUgYXMgNDYyNCAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNzNDZ4eF9wY2lfdGJsW10gPSB7Ci0JewotCQkudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0lEX0NJUlJVUywKLQkJLmRldmljZQkgICAgID0gUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMCwKLQkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gQ1M0NlhYXzQ2MTAsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAotCQkuZGV2aWNlCSAgICAgPSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyLAotCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBDUzQ2WFhfNDYxMiwKLQl9LAotCXsKLQkJLnZlbmRvcgkgICAgID0gUENJX1ZFTkRPUl9JRF9DSVJSVVMsCi0JCS5kZXZpY2UJICAgICA9IFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTUsCi0JCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IENTNDZYWF80NjE1LAotCX0sCi0JeyAwLCB9LAotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNDZ4eF9wY2lfdGJsKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNzNDZ4eF9wY2lfZHJpdmVyID0gewotCS5uYW1lCSAgPSAiY3M0Nnh4IiwKLQkuaWRfdGFibGUgPSBjczQ2eHhfcGNpX3RibCwKLQkucHJvYmUJICA9IGNzNDZ4eF9wcm9iZSwKLQkucmVtb3ZlCSAgPSBfX2RldmV4aXRfcChjczQ2eHhfcmVtb3ZlKSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZCAgPSBjczQ2eHhfc3VzcGVuZF90YmwsCi0JLnJlc3VtZQkgID0gY3M0Nnh4X3Jlc3VtZV90YmwsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNzNDZ4eF9pbml0X21vZHVsZSh2b2lkKQotewotCWludCBydG4gPSAwOwotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gCi0JCSJjczQ2eHg6IGNzNDZ4eF9pbml0X21vZHVsZSgpKyBcbiIpKTsKLQlydG4gPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjczQ2eHhfcGNpX2RyaXZlcik7Ci0KLQlpZiAocnRuID09IC1FTk9ERVYpIHsKLQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKCAKLQkJCSJjczQ2eHg6IFVuYWJsZSB0byBkZXRlY3QgdmFsaWQgY3M0Nnh4IGRldmljZVxuIikpOwotCX0KLQotCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsCi0JCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfaW5pdF9tb2R1bGUoKS0gKCVkKVxuIixydG4pKTsKLQlyZXR1cm4gcnRuOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY3M0Nnh4X2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjczQ2eHhfcGNpX2RyaXZlcik7Ci0JQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKLQkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNsZWFudXBfY3M0Nnh4KCkgZmluaXNoZWRcbiIpKTsKLX0KLQotbW9kdWxlX2luaXQoY3M0Nnh4X2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGNzNDZ4eF9jbGVhbnVwX21vZHVsZSk7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmRfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCi0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmRfdGJsIHJlcXVlc3RcbiIpKTsKLQljczQ2eHhfc3VzcGVuZChzLCBzdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZV90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKLXsKLQlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKLQlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCi0JCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZV90YmwgcmVxdWVzdFxuIikpOwotCWNzNDZ4eF9yZXN1bWUocyk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHhfd3JhcHBlci0yNC5oIGIvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OGUwMTEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiAgICAgICJjczQ2eHhfd3JhcHBlci5jIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0NlhYIGxpbnV4IGF1ZGlvIGRyaXZlci4KLSoKLSogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKLSogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKLSogICAgICAgICAgICAgICAocGNhdWRpb0BjcnlzdGFsLmNpcnJ1cy5jb20pLgotKgotKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0qICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0qCi0qICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0qICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0qICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSoKLSogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qCi0qIDAxLzExLzIwMDEgdHJ3IC0gbmV3IGZpbGUgZnJvbSBjczQyODEgd3JhcHBlciBjb2RlLiAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fQ1M0NlhYX1dSQVBQRVIyNF9ICi0jZGVmaW5lIF9fQ1M0NlhYX1dSQVBQRVIyNF9ICi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0jZGVmaW5lIENTX09XTkVSIC5vd25lciA9Ci0jZGVmaW5lIENTX1RISVNfTU9EVUxFIFRISVNfTU9EVUxFLAotc3RhdGljIGlubGluZSB2b2lkIGNzNDZ4eF9udWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpIHsgcmV0dXJuOyB9Ci0jZGVmaW5lIGNzNHhfbWVtX21hcF9yZXNlcnZlKHBhZ2UpIFNldFBhZ2VSZXNlcnZlZChwYWdlKQotI2RlZmluZSBjczR4X21lbV9tYXBfdW5yZXNlcnZlKHBhZ2UpIENsZWFyUGFnZVJlc2VydmVkKHBhZ2UpCi0KLSNkZWZpbmUgZnJlZV9kbWFidWYoY2FyZCwgZG1hYnVmKSBcCi0JcGNpX2ZyZWVfY29uc2lzdGVudCgoY2FyZCktPnBjaV9kZXYsIFwKLQkJCSAgICBQQUdFX1NJWkUgPDwgKGRtYWJ1ZiktPmJ1Zm9yZGVyLCBcCi0JCQkgICAgKGRtYWJ1ZiktPnJhd2J1ZiwgKGRtYWJ1ZiktPmRtYWFkZHIpOwotI2RlZmluZSBmcmVlX2RtYWJ1ZjIoY2FyZCwgZG1hYnVmKSBcCi0JcGNpX2ZyZWVfY29uc2lzdGVudCgoY2FyZCktPnBjaV9kZXYsIFwKLQkJCQkgICAgUEFHRV9TSVpFIDw8IChkbWFidWYpLT5idWZvcmRlcl90bXBidWZmLCBcCi0JCQkJICAgIChkbWFidWYpLT50bXBidWZmLCAoZG1hYnVmKS0+ZG1hYWRkcl90bXBidWZmKTsKLSNkZWZpbmUgY3M0eF9wZ29mZih2bWEpICgodm1hKS0+dm1fcGdvZmYpCi0KLSNkZWZpbmUgUlNSQ0lTSU9SRUdJT04oZGV2LG51bSkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uc3RhcnQgIT0gMCAmJiBcCi0JICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLmZsYWdzICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykKLSNkZWZpbmUgUlNSQ0lTTUVNT1JZUkVHSU9OKGRldixudW0pICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLnN0YXJ0ICE9IDAgJiYgXAotCSAoKGRldiktPnJlc291cmNlWyhudW0pXS5mbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZKQotI2RlZmluZSBSU1JDQUREUkVTUyhkZXYsbnVtKSAoKGRldiktPnJlc291cmNlWyhudW0pXS5zdGFydCkKLSNkZWZpbmUgUENJX0dFVF9EUklWRVJfREFUQSBwY2lfZ2V0X2RydmRhdGEKLSNkZWZpbmUgUENJX1NFVF9EUklWRVJfREFUQSBwY2lfc2V0X2RydmRhdGEKLSNkZWZpbmUgUENJX1NFVF9ETUFfTUFTSyhwY2lkZXYsbWFzaykgcGNpZGV2LT5kbWFfbWFzayA9IG1hc2sKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0Nnh4cG0uaCBiL3NvdW5kL29zcy9jczQ2eHhwbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTMyYjZlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9jczQ2eHhwbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogICAgICAiY3M0Nnh4cG0uaCIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCi0qCi0qICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCi0qICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCi0qICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KLSoKLSogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0qICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotKgotKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0qICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qCi0qICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKgotKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0NTNDZYWFBNX0gKLSNkZWZpbmUgX19DUzQ2WFhQTV9ICi0KLSNkZWZpbmUgQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSAweDI2Ci0jZGVmaW5lIENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MgKENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUvMi0xKQotCi0vKiBQTSBzdGF0ZSBkZWZpbnRpb25zICovCi0jZGVmaW5lIENTNDZYWF9QTV9OT1RfUkVHSVNURVJFRAkweDEwMDAKLSNkZWZpbmUgQ1M0NlhYX1BNX0lETEUJCQkweDAwMDEKLSNkZWZpbmUgQ1M0NlhYX1BNX1NVU1BFTkRJTkcJCTB4MDAwMgotI2RlZmluZSBDUzQ2WFhfUE1fU1VTUEVOREVECQkweDAwMDQKLSNkZWZpbmUgQ1M0NlhYX1BNX1JFU1VNSU5HCQkweDAwMDgKLSNkZWZpbmUgQ1M0NlhYX1BNX1JFU1VNRUQJCTB4MDAxMAotCi0jZGVmaW5lIENTX1BPV0VSX0RBQwkJCTB4MDAwMQotI2RlZmluZSBDU19QT1dFUl9BREMJCQkweDAwMDIKLSNkZWZpbmUgQ1NfUE9XRVJfTUlYVk9OCQkJMHgwMDA0Ci0jZGVmaW5lIENTX1BPV0VSX01JWFZPRkYJCTB4MDAwOAotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfT04JMHhmMDAwICAvKiBhbHdheXMgb24gYml0cyAoaW52ZXJ0ZWQpICovCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREMJMHgwMTAwCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUMJMHgwMjAwCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT04JMHgwNDAwCi0jZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGCTB4MDgwMAotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OCTB4MDAwMQotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OCTB4MDAwMgotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OCTB4MDAwNAotI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTiAweDAwMDgKLQotc3RydWN0IGNzNDZ4eF9wbSB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdTMyQ0xLQ1IxX1NBVkUsdTMyU1NQTVZhbHVlLHUzMlBQTFZDdmFsdWUsdTMyUFBSVkN2YWx1ZTsKLQl1MzIgdTMyRk1MVkN2YWx1ZSx1MzJGTVJWQ3ZhbHVlLHUzMkdQSU9SdmFsdWUsdTMySlNDVEx2YWx1ZSx1MzJTU0NSOwotCXUzMiB1MzJTUkNTQSx1MzJEYWNBU1IsdTMyQWRjQVNSLHUzMkRhY1NSLHUzMkFkY1NSLHUzMk1JRENSX1NhdmU7Ci0JdTMyIHUzMlNTUE1fQklUUzsKLQl1MzIgYWM5N1tDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTXTsKLQl1MzIgdTMyQUM5N19tYXN0ZXJfdm9sdW1lLCB1MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUsIHUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vOwotCXUzMiB1MzJBQzk3X3BjbV9vdXRfdm9sdW1lLCB1MzJBQzk3X3Bvd2VyZG93biwgdTMyQUM5N19nZW5lcmFsX3B1cnBvc2U7Ci0JdTMyIHUzMmh3cHRyX3BsYXliYWNrLHUzMmh3cHRyX2NhcHR1cmU7Ci0JdW5zaWduZWQgZG1hYnVmX3N3cHRyX3BsYXk7Ci0JaW50IGRtYWJ1Zl9jb3VudF9wbGF5OwotCXVuc2lnbmVkIGRtYWJ1Zl9zd3B0cl9jYXB0dXJlOwotCWludCBkbWFidWZfY291bnRfY2FwdHVyZTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvODAxMC5oIGIvc291bmQvb3NzL2VtdTEwazEvODAxMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWM2YzQyLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxLzgwMTAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICA4MDEwLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OS0yMDAxIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlCQkgICAgQXV0aG9yCSAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tCQkgICAgLS0tLS0tCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveAkgICAgQ2xlYW5lZCBvZiA4Yml0IGNoYXJzLCBET1MKLSAqCQkJCQkgICAgbGluZSBlbmRpbmdzCi0gKiAgICAgRGVjZW1iZXIgOCwgMTk5OSAgICAgSm9uIFRheWxvcgkgICAgQWRkZWQgbG90cyBvZiBuZXcgcmVnaXN0ZXIgaW5mbwotICogICAgIE1heSAxNiwgMjAwMSAgICAgICAgIERhbmllbCBCZXJ0cmFuZCBBZGRlZCB1bm9mZmljaWFsIERCRyByZWdpc3RlciBpbmZvCi0gKiAgICAgT2N0LU5vdiAyMDAxICAgICAgICAgRC5CLiAgICAgICAgICAgIEFkZGVkIHVub2ZmaWNpYWwgQXVkaWd5IHJlZ2lzdGVycyAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZm5kZWYgXzgwMTBfSAotI2RlZmluZSBfODAxMF9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0vLyBEcml2ZXIgdmVyc2lvbjoKLSNkZWZpbmUgTUFKT1JfVkVSIDAKLSNkZWZpbmUgTUlOT1JfVkVSIDIwCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjIwYSIKLQotCi0vLyBBdWRpZ3kgc3BlY2lmeSByZWdpc3RlcnMgYXJlIHByZWZpeGVkIHdpdGggJ0FfJwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUENJIGZ1bmN0aW9uIDAgcmVnaXN0ZXJzLCBhZGRyZXNzID0gPHZhbD4gKyBQQ0lCQVNFMAkJCQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFBUUgkJCTB4MDAJCS8qIEluZGV4ZWQgcmVnaXN0ZXIgc2V0IHBvaW50ZXIgcmVnaXN0ZXIJKi8KLQkJCQkJCS8qIE5PVEU6IFRoZSBDSEFOTkVMTlVNIGFuZCBBRERSRVNTIHdvcmRzIGNhbgkqLwotCQkJCQkJLyogYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBvZiBlYWNoIG90aGVyLgkqLwotI2RlZmluZSBQVFJfQ0hBTk5FTE5VTV9NQVNLCTB4MDAwMDAwM2YJLyogRm9yIGVhY2ggcGVyLWNoYW5uZWwgcmVnaXN0ZXIsIGluZGljYXRlcyB0aGUJKi8KLQkJCQkJCS8qIGNoYW5uZWwgbnVtYmVyIG9mIHRoZSByZWdpc3RlciB0byBiZQkJKi8KLQkJCQkJCS8qIGFjY2Vzc2VkLiAgRm9yIG5vbiBwZXItY2hhbm5lbCByZWdpc3RlcnMgdGhlCSovCi0JCQkJCQkvKiB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHplcm8uCQkJKi8KLSNkZWZpbmUgUFRSX0FERFJFU1NfTUFTSwkweDA3ZmYwMDAwCS8qIFJlZ2lzdGVyIGluZGV4CQkJCSovCi0KLSNkZWZpbmUgREFUQQkJCTB4MDQJCS8qIEluZGV4ZWQgcmVnaXN0ZXIgc2V0IGRhdGEgcmVnaXN0ZXIJCSovCi0KLSNkZWZpbmUgSVBSCQkJMHgwOAkJLyogR2xvYmFsIGludGVycnVwdCBwZW5kaW5nIHJlZ2lzdGVyCQkqLwotCQkJCQkJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzIGJ5IHdyaXRpbmcgYSAxIHRvCSovCi0JCQkJCQkvKiB0aGUgcmVsZXZhbnQgYml0cyBhbmQgemVybyB0byB0aGUgb3RoZXIgYml0cwkqLwotCi0vKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAoQV9NUFUxKQkJCSovCi0jZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZMgkweDEwMDAwMDAwCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCi0jZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkyCTB4MDgwMDAwMDAJLyogTUlESSBVQVJUIHJlY2VpdmUgYnVmZmVyIGVtcHR5CQkqLwotCi0jZGVmaW5lIElQUl9TQU1QTEVSQVRFVFJBQ0tFUgkweDAxMDAwMDAwCS8qIFNhbXBsZSByYXRlIHRyYWNrZXIgbG9jayBzdGF0dXMgY2hhbmdlCSovCi0jZGVmaW5lIElQUl9GWERTUAkJMHgwMDgwMDAwMAkvKiBFbmFibGUgRlggRFNQIGludGVycnVwdHMJCQkqLwotI2RlZmluZSBJUFJfRk9SQ0VJTlQJCTB4MDA0MDAwMDAJLyogRm9yY2UgU291bmQgQmxhc3RlciBpbnRlcnJ1cHQJCSovCi0jZGVmaW5lIElQUl9QQ0lFUlJPUgkJMHgwMDIwMDAwMAkvKiBQQ0kgYnVzIGVycm9yCQkJCSovCi0jZGVmaW5lIElQUl9WT0xJTkNSCQkweDAwMTAwMDAwCS8qIFZvbHVtZSBpbmNyZW1lbnQgYnV0dG9uIHByZXNzZWQJCSovCi0jZGVmaW5lIElQUl9WT0xERUNSCQkweDAwMDgwMDAwCS8qIFZvbHVtZSBkZWNyZW1lbnQgYnV0dG9uIHByZXNzZWQJCSovCi0jZGVmaW5lIElQUl9NVVRFCQkweDAwMDQwMDAwCS8qIE11dGUgYnV0dG9uIHByZXNzZWQJCQkJKi8KLSNkZWZpbmUgSVBSX01JQ0JVRkZVTEwJCTB4MDAwMjAwMDAJLyogTWljcm9waG9uZSBidWZmZXIgZnVsbAkJCSovCi0jZGVmaW5lIElQUl9NSUNCVUZIQUxGRlVMTAkweDAwMDEwMDAwCS8qIE1pY3JvcGhvbmUgYnVmZmVyIGhhbGYgZnVsbAkJCSovCi0jZGVmaW5lIElQUl9BRENCVUZGVUxMCQkweDAwMDA4MDAwCS8qIEFEQyBidWZmZXIgZnVsbAkJCQkqLwotI2RlZmluZSBJUFJfQURDQlVGSEFMRkZVTEwJMHgwMDAwNDAwMAkvKiBBREMgYnVmZmVyIGhhbGYgZnVsbAkJCQkqLwotI2RlZmluZSBJUFJfRUZYQlVGRlVMTAkJMHgwMDAwMjAwMAkvKiBFZmZlY3RzIGJ1ZmZlciBmdWxsCQkJCSovCi0jZGVmaW5lIElQUl9FRlhCVUZIQUxGRlVMTAkweDAwMDAxMDAwCS8qIEVmZmVjdHMgYnVmZmVyIGhhbGYgZnVsbAkJCSovCi0jZGVmaW5lIElQUl9HUFNQRElGU1RBVFVTQ0hBTkdFCTB4MDAwMDA4MDAJLyogR1BTUERJRiBjaGFubmVsIHN0YXR1cyBjaGFuZ2UJCSovCi0jZGVmaW5lIElQUl9DRFJPTVNUQVRVU0NIQU5HRQkweDAwMDAwNDAwCS8qIENELVJPTSBjaGFubmVsIHN0YXR1cyBjaGFuZ2UJCQkqLwotI2RlZmluZSBJUFJfSU5URVJWQUxUSU1FUgkweDAwMDAwMjAwCS8qIEludGVydmFsIHRpbWVyIHRlcm1pbmFsIGNvdW50CQkqLwotI2RlZmluZSBJUFJfTUlESVRSQU5TQlVGRU1QVFkJMHgwMDAwMDEwMAkvKiBNSURJIFVBUlQgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CQkqLwotI2RlZmluZSBJUFJfTUlESVJFQ1ZCVUZFTVBUWQkweDAwMDAwMDgwCS8qIE1JREkgVUFSVCByZWNlaXZlIGJ1ZmZlciBlbXB0eQkJKi8KLSNkZWZpbmUgSVBSX0NIQU5ORUxMT09QCQkweDAwMDAwMDQwCS8qIE9uZSBvciBtb3JlIGNoYW5uZWwgbG9vcCBpbnRlcnJ1cHRzIHBlbmRpbmcJKi8KLSNkZWZpbmUgSVBSX0NIQU5ORUxOVU1CRVJNQVNLCTB4MDAwMDAwM2YJLyogV2hlbiBJUFJfQ0hBTk5FTExPT1AgaXMgc2V0LCBpbmRpY2F0ZXMgdGhlCSovCi0JCQkJCQkvKiBIaWdoZXN0IHNldCBjaGFubmVsIGluIENMSVBMIG9yIENMSVBILiAgV2hlbgkqLwotCQkJCQkJLyogSVAgaXMgd3JpdHRlbiB3aXRoIENMIHNldCwgdGhlIGJpdCBpbiBDTElQTAkqLwotCQkJCQkJLyogb3IgQ0xJUEggY29ycmVzcG9uZGluZyB0byB0aGUgQ0lOIHZhbHVlIAkqLwotCQkJCQkJLyogd3JpdHRlbiB3aWxsIGJlIGNsZWFyZWQuCQkJKi8KLSNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkxCUlQUl9NSURJVFJBTlNCVUZFTVBUWQkvKiBNSURJIFVBUlQgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CQkqLwotI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZMQlJUFJfTUlESVJFQ1ZCVUZFTVBUWQkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCi0KLQotCi0jZGVmaW5lIElOVEUJCQkweDBjCQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMU0JfTUFTSwkweGMwMDAwMDAwCS8qIFZpcnR1YWwgU291bmRibGFzdGVyIEkvTyBwb3J0IGNhcHR1cmUJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjIwCTB4MDAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjIwLTB4MjJmCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTFNCXzI0MAkweDQwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDI0MAkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjYwCTB4ODAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjYwCQkqLwotI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yODAJMHhjMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyODAJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTE1QVV9NQVNLCTB4MzAwMDAwMDAJLyogVmlydHVhbCBNUFUgSS9PIHBvcnQgY2FwdHVyZQkJCSovCi0jZGVmaW5lIElOVEVfVklSVFVBTE1QVV8zMDAJMHgwMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgzMDAtMHgzMDEJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMxMAkweDEwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMxMAkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMyMAkweDIwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMyMAkJKi8KLSNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMzMAkweDMwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMzMAkJKi8KLSNkZWZpbmUgSU5URV9NQVNURVJETUFFTkFCTEUJMHgwODAwMDAwMAkvKiBNYXN0ZXIgRE1BIGVtdWxhdGlvbiBhdCAweDAwMC0weDAwZgkJKi8KLSNkZWZpbmUgSU5URV9TTEFWRURNQUVOQUJMRQkweDA0MDAwMDAwCS8qIFNsYXZlIERNQSBlbXVsYXRpb24gYXQgMHgwYzAtMHgwZGYJCSovCi0jZGVmaW5lIElOVEVfTUFTVEVSUElDRU5BQkxFCTB4MDIwMDAwMDAJLyogTWFzdGVyIFBJQyBlbXVsYXRpb24gYXQgMHgwMjAtMHgwMjEJCSovCi0jZGVmaW5lIElOVEVfU0xBVkVQSUNFTkFCTEUJMHgwMTAwMDAwMAkvKiBTbGF2ZSBQSUMgZW11bGF0aW9uIGF0IDB4MGEwLTB4MGExCQkqLwotI2RlZmluZSBJTlRFX1ZTQkVOQUJMRQkJMHgwMDgwMDAwMAkvKiBFbmFibGUgdmlydHVhbCBTb3VuZGJsYXN0ZXIJCQkqLwotI2RlZmluZSBJTlRFX0FETElCRU5BQkxFCTB4MDA0MDAwMDAJLyogRW5hYmxlIEFkTGliIGVtdWxhdGlvbiBhdCAweDM4OC0weDM4YgkqLwotI2RlZmluZSBJTlRFX01QVUVOQUJMRQkJMHgwMDIwMDAwMAkvKiBFbmFibGUgdmlydHVhbCBNUFUJCQkJKi8KLSNkZWZpbmUgSU5URV9GT1JDRUlOVAkJMHgwMDEwMDAwMAkvKiBDb250aW51b3VzbHkgYXNzZXJ0IElOVEFOCQkJKi8KLQotI2RlZmluZSBJTlRFX01SSEFOREVOQUJMRQkweDAwMDgwMDAwCS8qIEVuYWJsZSB0aGUgIk1yLiBIYW5kIiBsb2dpYwkJCSovCi0JCQkJCQkvKiBOT1RFOiBUaGVyZSBpcyBubyByZWFzb24gdG8gdXNlIHRoaXMgdW5kZXIJKi8KLQkJCQkJCS8qIExpbnV4LCBhbmQgaXQgd2lsbCBjYXVzZSBvZGQgaGFyZHdhcmUgCSovCi0JCQkJCQkvKiBiZWhhdmlvciBhbmQgcG9zc2libHkgcmFuZG9tIHNlZ2ZhdWx0cyBhbmQJKi8KLQkJCQkJCS8qIGxvY2t1cHMgaWYgZW5hYmxlZC4JCQkJKi8KLQotLyogVGhlIG5leHQgdHdvIGludGVycnVwdHMgYXJlIGZvciB0aGUgbWlkaSBwb3J0IG9uIHRoZSBBdWRpZ3kgRHJpdmUgKEFfTVBVMSkJCQkqLwotI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFMgkweDAwMDIwMDAwCS8qIEVuYWJsZSBNSURJIHRyYW5zbWl0LWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUyCTB4MDAwMTAwMDAJLyogRW5hYmxlIE1JREkgcmVjZWl2ZS1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLwotCi0KLSNkZWZpbmUgSU5URV9TQU1QTEVSQVRFVFJBQ0tFUgkweDAwMDAyMDAwCS8qIEVuYWJsZSBzYW1wbGUgcmF0ZSB0cmFja2VyIGludGVycnVwdHMJKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgYml0IG11c3QgYWx3YXlzIGJlIGVuYWJsZWQgICAgICAgCSovCi0jZGVmaW5lIElOVEVfRlhEU1BFTkFCTEUJMHgwMDAwMTAwMAkvKiBFbmFibGUgRlggRFNQIGludGVycnVwdHMJCQkqLwotI2RlZmluZSBJTlRFX1BDSUVSUk9SRU5BQkxFCTB4MDAwMDA4MDAJLyogRW5hYmxlIFBDSSBidXMgZXJyb3IgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9WT0xJTkNSRU5BQkxFCTB4MDAwMDA0MDAJLyogRW5hYmxlIHZvbHVtZSBpbmNyZW1lbnQgYnV0dG9uIGludGVycnVwdHMJKi8KLSNkZWZpbmUgSU5URV9WT0xERUNSRU5BQkxFCTB4MDAwMDAyMDAJLyogRW5hYmxlIHZvbHVtZSBkZWNyZW1lbnQgYnV0dG9uIGludGVycnVwdHMJKi8KLSNkZWZpbmUgSU5URV9NVVRFRU5BQkxFCQkweDAwMDAwMTAwCS8qIEVuYWJsZSBtdXRlIGJ1dHRvbiBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX01JQ0JVRkVOQUJMRQkweDAwMDAwMDgwCS8qIEVuYWJsZSBtaWNyb3Bob25lIGJ1ZmZlciBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX0FEQ0JVRkVOQUJMRQkweDAwMDAwMDQwCS8qIEVuYWJsZSBBREMgYnVmZmVyIGludGVycnVwdHMJCQkqLwotI2RlZmluZSBJTlRFX0VGWEJVRkVOQUJMRQkweDAwMDAwMDIwCS8qIEVuYWJsZSBFZmZlY3RzIGJ1ZmZlciBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX0dQU1BESUZFTkFCTEUJMHgwMDAwMDAxMAkvKiBFbmFibGUgR1BTUERJRiBzdGF0dXMgaW50ZXJydXB0cwkJKi8KLSNkZWZpbmUgSU5URV9DRFNQRElGRU5BQkxFCTB4MDAwMDAwMDgJLyogRW5hYmxlIENEU1BESUYgc3RhdHVzIGludGVycnVwdHMJCSovCi0jZGVmaW5lIElOVEVfSU5URVJWQUxUSU1FUkVOQgkweDAwMDAwMDA0CS8qIEVuYWJsZSBpbnRlcnZhbCB0aW1lciBpbnRlcnJ1cHRzCQkqLwotI2RlZmluZSBJTlRFX01JRElUWEVOQUJMRQkweDAwMDAwMDAyCS8qIEVuYWJsZSBNSURJIHRyYW5zbWl0LWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCi0jZGVmaW5lIElOVEVfTUlESVJYRU5BQkxFCTB4MDAwMDAwMDEJLyogRW5hYmxlIE1JREkgcmVjZWl2ZS1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLwotCi0vKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSAoQV9NUFUyKQkqLwotI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFMSAgCUlOVEVfTUlESVRYRU5BQkxFCi0jZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUxCUlOVEVfTUlESVJYRU5BQkxFCi0KLSNkZWZpbmUgV0MJCQkweDEwCQkvKiBXYWxsIENsb2NrIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFdDX1NBTVBMRUNPVU5URVJfTUFTSwkweDAzRkZGRkMwCS8qIFNhbXBsZSBwZXJpb2RzIGVsYXBzZWQgc2luY2UgcmVzZXQJCSovCi0jZGVmaW5lIFdDX1NBTVBMRUNPVU5URVIJMHgxNDA2MDAxMAotI2RlZmluZSBXQ19DVVJSRU5UQ0hBTk5FTAkweDAwMDAwMDNGCS8qIENoYW5uZWwgWzAuLjYzXSBjdXJyZW50bHkgYmVpbmcgc2VydmljZWQJKi8KLQkJCQkJCS8qIE5PVEU6IEVhY2ggY2hhbm5lbCB0YWtlcyAxLzY0dGggb2YgYSBzYW1wbGUJKi8KLQkJCQkJCS8qIHBlcmlvZCB0byBiZSBzZXJ2aWNlZC4JCQkqLwotCi0jZGVmaW5lIEhDRkcJCQkweDE0CQkvKiBIYXJkd2FyZSBjb25maWcgcmVnaXN0ZXIJCQkqLwotCQkJCQkJLyogTk9URTogVGhlcmUgaXMgbm8gcmVhc29uIHRvIHVzZSB0aGUgbGVnYWN5CSovCi0JCQkJCQkvKiBTb3VuZEJsYXN0ZXIgZW11bGF0aW9uIHN0dWZmIGRlc2NyaWJlZCBiZWxvdwkqLwotCQkJCQkJLyogdW5kZXIgTGludXgsIGFuZCBhbGwga2luZHMgb2Ygd2VpcmQgaGFyZHdhcmUJKi8KLQkJCQkJCS8qIGJlaGF2aW9yIGNhbiByZXN1bHQgaWYgeW91IHRyeS4gIERvbid0LgkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTUFTSwkweGUwMDAwMDAwCS8qIExlZ2FjeSBmdW5jdGlvbiBudW1iZXIgCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01QVQkweDAwMDAwMDAwCS8qIExlZ2FjeSBNUFUJIAkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU0IJMHg0MDAwMDAwMAkvKiBMZWdhY3kgU0IJCQkJCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19BRAkweDYwMDAwMDAwCS8qIExlZ2FjeSBBRAkJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01QSUMJMHg4MDAwMDAwMAkvKiBMZWdhY3kgTVBJQwkJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01ETUEJMHhhMDAwMDAwMAkvKiBMZWdhY3kgTURNQQkJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX1NQQ0kJMHhjMDAwMDAwMAkvKiBMZWdhY3kgU1BDSQkJCQkJKi8KLSNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX1NETUEJMHhlMDAwMDAwMAkvKiBMZWdhY3kgU0RNQQkJCQkJKi8KLSNkZWZpbmUgSENGR19JT0NBUFRVUkVBRERSCTB4MWYwMDAwMDAJLyogVGhlIDQgTFNCcyBvZiB0aGUgY2FwdHVyZWQgSS9PIGFkZHJlc3MuCSovCi0jZGVmaW5lIEhDRkdfTEVHQUNZV1JJVEUJMHgwMDgwMDAwMAkvKiAxID0gd3JpdGUsIDAgPSByZWFkIAkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWVdPUkQJCTB4MDA0MDAwMDAJLyogMSA9IHdvcmQsIDAgPSBieXRlIAkJCQkqLwotI2RlZmluZSBIQ0ZHX0xFR0FDWUlOVAkJMHgwMDIwMDAwMAkvKiAxID0gbGVnYWN5IGV2ZW50IGNhcHR1cmVkLiBXcml0ZSAxIHRvIGNsZWFyLgkqLwotCQkJCQkJLyogTk9URTogVGhlIHJlc3Qgb2YgdGhlIGJpdHMgaW4gdGhpcyByZWdpc3RlcgkqLwotCQkJCQkJLyogX2FyZV8gcmVsZXZhbnQgdW5kZXIgTGludXguCQkJKi8KLSNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9NQVNLCTB4MDAwNzAwMDAJLyogQ09ERUMgZm9ybWF0CQkJCQkqLwotI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0FDOTcJMHgwMDAwMDAwMAkvKiBBQzk3IENPREVDIGZvcm1hdCAtLSBQcmltYXJ5IE91dHB1dAkJKi8KLSNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9JMlMJMHgwMDAxMDAwMAkvKiBJMlMgQ09ERUMgZm9ybWF0IC0tIFNlY29uZGFyeSAoUmVhcikgT3V0cHV0CSovCi0jZGVmaW5lIEhDRkdfR1BJTlBVVDAJCTB4MDAwMDQwMDAJLyogRXh0ZXJuYWwgcGluMTEyCQkJCSovCi0jZGVmaW5lIEhDRkdfR1BJTlBVVDEJCTB4MDAwMDIwMDAJLyogRXh0ZXJuYWwgcGluMTEwCQkJCSovCi0KLSNkZWZpbmUgSENGR19HUE9VVFBVVF9NQVNLCTB4MDAwMDFjMDAJLyogRXh0ZXJuYWwgcGlucyB3aGljaCBtYXkgYmUgY29udHJvbGxlZAkqLwotI2RlZmluZSBIQ0ZHX0dQT1VUMAkJMHgwMDAwMTAwMAkvKiBzZXQgdG8gZW5hYmxlIGRpZ2l0YWwgb3V0IG9uIDUuMSBjYXJkcwkqLwotCi0jZGVmaW5lIEhDRkdfSk9ZRU5BQkxFICAgICAgCTB4MDAwMDAyMDAJLyogSW50ZXJuYWwgam95c3RpY2sgZW5hYmxlICAgIAkJCSovCi0jZGVmaW5lIEhDRkdfUEhBU0VUUkFDS0VOQUJMRQkweDAwMDAwMTAwCS8qIFBoYXNlIHRyYWNraW5nIGVuYWJsZQkJCSovCi0JCQkJCQkvKiAxID0gRm9yY2UgYWxsIDMgYXN5bmMgZGlnaXRhbCBpbnB1dHMgdG8gdXNlCSovCi0JCQkJCQkvKiB0aGUgc2FtZSBhc3luYyBzYW1wbGUgcmF0ZSB0cmFja2VyIChaVklERU8pCSovCi0jZGVmaW5lIEhDRkdfQUMzRU5BQkxFX01BU0sJMHgweDAwMDBlMAkvKiBBQzMgYXN5bmMgaW5wdXQgY29udHJvbCAtIE5vdCBpbXBsZW1lbnRlZAkqLwotI2RlZmluZSBIQ0ZHX0FDM0VOQUJMRV9aVklERU8JMHgwMDAwMDA4MAkvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgWlZJREVPCQkqLwotI2RlZmluZSBIQ0ZHX0FDM0VOQUJMRV9DRFNQRElGCTB4MDAwMDAwNDAJLyogQ2hhbm5lbHMgMCBhbmQgMSByZXBsYWNlIENEU1BESUYJCSovCi0jZGVmaW5lIEhDRkdfQUMzRU5BQkxFX0dQU1BESUYgIDB4MDAwMDAwMjAgICAgICAvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgR1BTUERJRiAgICAgICAgICAgICAqLwotI2RlZmluZSBIQ0ZHX0FVVE9NVVRFCQkweDAwMDAwMDEwCS8qIFdoZW4gc2V0LCB0aGUgYXN5bmMgc2FtcGxlIHJhdGUgY29udmVydG9ycwkqLwotCQkJCQkJLyogd2lsbCBhdXRvbWF0aWNhbGx5IG11dGUgdGhlaXIgb3V0cHV0IHdoZW4JKi8KLQkJCQkJCS8qIHRoZXkgYXJlIG5vdCByYXRlLWxvY2tlZCB0byB0aGUgZXh0ZXJuYWwJKi8KLQkJCQkJCS8qIGFzeW5jIGF1ZGlvIHNvdXJjZSAgCQkJCSovCi0jZGVmaW5lIEhDRkdfTE9DS1NPVU5EQ0FDSEUJMHgwMDAwMDAwOAkvKiAxID0gQ2FuY2VsIGJ1c3RtYXN0ZXIgYWNjZXNzZXMgdG8gc291bmRjYWNoZSAqLwotCQkJCQkJLyogTk9URTogVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG5ldmVyIGJlIHVzZWQuICAJKi8KLSNkZWZpbmUgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sJMHgwMDAwMDAwNAkvKiAxID0gQ2FuY2VsIGJ1c3RtYXN0ZXIgYWNjZXNzZXMgdG8gdGFua2NhY2hlCSovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgYmUgdXNlZC4gIAkqLwotI2RlZmluZSBIQ0ZHX0xPQ0tUQU5LQ0FDSEUJMHgwMTAyMDAxNAotI2RlZmluZSBIQ0ZHX01VVEVCVVRUT05FTkFCTEUJMHgwMDAwMDAwMgkvKiAxID0gTWFzdGVyIG11dGUgYnV0dG9uIHNldHMgQVVESU9FTkFCTEUgPSAwLgkqLwotCQkJCQkJLyogTk9URTogVGhpcyBpcyBhICdjaGVhcCcgd2F5IHRvIGltcGxlbWVudCBhCSovCi0JCQkJCQkvKiBtYXN0ZXIgbXV0ZSBmdW5jdGlvbiBvbiB0aGUgbXV0ZSBidXR0b24sIGFuZAkqLwotCQkJCQkJLyogaW4gZ2VuZXJhbCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIGEgbW9yZQkqLwotCQkJCQkJLyogc29waGlzdGljYXRlZCBtYXN0ZXIgbXV0ZSBmdW5jdGlvbiBoYXMgbm90CSovCi0JCQkJCQkvKiBiZWVuIHdyaXR0ZW4uICAgICAgIAkJCQkqLwotI2RlZmluZSBIQ0ZHX0FVRElPRU5BQkxFCTB4MDAwMDAwMDEJLyogMCA9IENPREVDcyB0cmFuc21pdCB6ZXJvLXZhbHVlZCBzYW1wbGVzCSovCi0JCQkJCQkvKiBTaG91bGQgYmUgc2V0IHRvIDEgd2hlbiB0aGUgRU1VMTBLMSBpcwkqLwotCQkJCQkJLyogY29tcGxldGVseSBpbml0aWFsaXplZC4JCQkqLwotCi0vL0ZvciBBdWRpZ3ksIE1QVSBwb3J0IG1vdmUgdG8gMHg3MC0weDc0IHB0ciByZWdpc3RlcgotCi0jZGVmaW5lIE1VREFUQQkJCTB4MTgJCS8qIE1QVTQwMSBkYXRhIHJlZ2lzdGVyICg4IGJpdHMpICAgICAgIAkJKi8KLQotI2RlZmluZSBNVUNNRAkJCTB4MTkJCS8qIE1QVTQwMSBjb21tYW5kIHJlZ2lzdGVyICg4IGJpdHMpICAgIAkJKi8KLSNkZWZpbmUgTVVDTURfUkVTRVQJCTB4ZmYJCS8qIFJFU0VUIGNvbW1hbmQJCQkJKi8KLSNkZWZpbmUgTVVDTURfRU5URVJVQVJUTU9ERQkweDNmCQkvKiBFbnRlcl9VQVJUX21vZGUgY29tbWFuZAkJCSovCi0JCQkJCQkvKiBOT1RFOiBBbGwgb3RoZXIgY29tbWFuZHMgYXJlIGlnbm9yZWQJCSovCi0KLSNkZWZpbmUgTVVTVEFUCQkJTVVDTUQJCS8qIE1QVTQwMSBzdGF0dXMgcmVnaXN0ZXIgKDggYml0cykgICAgIAkJKi8KLSNkZWZpbmUgTVVTVEFUX0lSRFlOCQkweDgwCQkvKiAwID0gTUlESSBkYXRhIG9yIGNvbW1hbmQgQUNLCQkJKi8KLSNkZWZpbmUgTVVTVEFUX09SRFlOCQkweDQwCQkvKiAwID0gTVVEQVRBIGNhbiBhY2NlcHQgYSBjb21tYW5kIG9yIGRhdGEJKi8KLQotI2RlZmluZSBBX0lPQ0ZHCQkJMHgxOAkJLyogR1BJTyBvbiBBdWRpZ3kgY2FyZCAoMTZiaXRzKQkJCSovCi0jZGVmaW5lIEFfR1BJTlBVVF9NQVNLCQkweGZmMDAKLSNkZWZpbmUgQV9HUE9VVFBVVF9NQVNLCQkweDAwZmYKLQotI2RlZmluZSBUSU1FUgkJCTB4MWEJCS8qIFRpbWVyIHRlcm1pbmFsIGNvdW50IHJlZ2lzdGVyICgxNi1iaXQpCSovCi0JCQkJCQkvKiBOT1RFOiBBZnRlciB0aGUgcmF0ZSBpcyBjaGFuZ2VkLCBhIG1heGltdW0JKi8KLQkJCQkJCS8qIG9mIDEwMjQgc2FtcGxlIHBlcmlvZHMgc2hvdWxkIGJlIGFsbG93ZWQJKi8KLQkJCQkJCS8qIGJlZm9yZSB0aGUgbmV3IHJhdGUgaXMgZ3VhcmFudGVlZCBhY2N1cmF0ZS4JKi8KLSNkZWZpbmUgVElNRVJfUkFURV9NQVNLCQkweDAzZmYJCS8qIFRpbWVyIGludGVycnVwdCByYXRlIGluIHNhbXBsZSBwZXJpb2RzCSovCi0JCQkJCQkvKiAwID09IDEwMjQgcGVyaW9kcywgWzEuLjRdIGFyZSBub3QgdXNlZnVsCSovCi0KLSNkZWZpbmUgQUM5N0RBVEEJCTB4MWMJCS8qIEFDOTcgcmVnaXN0ZXIgc2V0IGRhdGEgcmVnaXN0ZXIgKDE2IGJpdCkJKi8KLQotI2RlZmluZSBBQzk3QUREUkVTUwkJMHgxZQkJLyogQUM5NyByZWdpc3RlciBzZXQgYWRkcmVzcyByZWdpc3RlciAoOCBiaXQpCSovCi0jZGVmaW5lIEFDOTdBRERSRVNTX1JFQURZCTB4ODAJCS8qIFJlYWQtb25seSBiaXQsIHJlZmxlY3RzIENPREVDIFJFQURZIHNpZ25hbAkqLwotI2RlZmluZSBBQzk3QUREUkVTU19BRERSRVNTCTB4N2YJCS8qIEFkZHJlc3Mgb2YgaW5kZXhlZCBBQzk3IHJlZ2lzdGVyCQkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFbXUxMGsxIHBvaW50ZXItb2Zmc2V0IHJlZ2lzdGVyIHNldCwgYWNjZXNzZWQgdGhyb3VnaCB0aGUgUFRSIGFuZCBEQVRBIHJlZ2lzdGVycwkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgQ1BGCQkJMHgwMAkJLyogQ3VycmVudCBwaXRjaCBhbmQgZnJhY3Rpb24gcmVnaXN0ZXIJCQkqLwotI2RlZmluZSBDUEZfQ1VSUkVOVFBJVENIX01BU0sJMHhmZmZmMDAwMAkvKiBDdXJyZW50IHBpdGNoIChsaW5lYXIsIDB4NDAwMCA9PSB1bml0eSBwaXRjaCBzaGlmdCkgCSovCi0jZGVmaW5lIENQRl9DVVJSRU5UUElUQ0gJMHgxMDEwMDAwMAotI2RlZmluZSBDUEZfU1RFUkVPX01BU0sJCTB4MDAwMDgwMDAJLyogMSA9IEV2ZW4gY2hhbm5lbCBpbnRlcmxlYXZlLCBvZGQgY2hhbm5lbCBsb2NrZWQJKi8KLSNkZWZpbmUgQ1BGX1NUT1BfTUFTSwkJMHgwMDAwNDAwMAkvKiAxID0gQ3VycmVudCBwaXRjaCBmb3JjZWQgdG8gMAkJCSovCi0jZGVmaW5lIENQRl9GUkFDQUREUkVTU19NQVNLCTB4MDAwMDNmZmYJLyogTGluZWFyIGZyYWN0aW9uYWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBjaGFubmVsCSovCi0KLSNkZWZpbmUgUFRSWAkJCTB4MDEJCS8qIFBpdGNoIHRhcmdldCBhbmQgc2VuZCBBL0IgYW1vdW50cyByZWdpc3RlcgkJKi8KLSNkZWZpbmUgUFRSWF9QSVRDSFRBUkdFVF9NQVNLCTB4ZmZmZjAwMDAJLyogUGl0Y2ggdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkJKi8KLSNkZWZpbmUgUFRSWF9QSVRDSFRBUkdFVAkweDEwMTAwMDAxCi0jZGVmaW5lIFBUUlhfRlhTRU5EQU1PVU5UX0FfTUFTSyAweDAwMDBmZjAwCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEEJKi8KLSNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQQkweDA4MDgwMDAxCi0jZGVmaW5lIFBUUlhfRlhTRU5EQU1PVU5UX0JfTUFTSyAweDAwMDAwMGZmCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEIJKi8KLSNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQgkweDA4MDAwMDAxCi0KLSNkZWZpbmUgQ1ZDRgkJCTB4MDIJCS8qIEN1cnJlbnQgdm9sdW1lIGFuZCBmaWx0ZXIgY3V0b2ZmIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBDVkNGX0NVUlJFTlRWT0xfTUFTSwkweGZmZmYwMDAwCS8qIEN1cnJlbnQgbGluZWFyIHZvbHVtZSBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KLSNkZWZpbmUgQ1ZDRl9DVVJSRU5UVk9MCQkweDEwMTAwMDAyCi0jZGVmaW5lIENWQ0ZfQ1VSUkVOVEZJTFRFUl9NQVNLCTB4MDAwMGZmZmYJLyogQ3VycmVudCBmaWx0ZXIgY3V0b2ZmIGZyZXF1ZW5jeSBvZiBzcGVjaWZpZWQgY2hhbm5lbAkqLwotI2RlZmluZSBDVkNGX0NVUlJFTlRGSUxURVIJMHgxMDAwMDAwMgotCi0jZGVmaW5lIFZURlQJCQkweDAzCQkvKiBWb2x1bWUgdGFyZ2V0IGFuZCBmaWx0ZXIgY3V0b2ZmIHRhcmdldCByZWdpc3RlcgkqLwotI2RlZmluZSBWVEZUX1ZPTFVNRVRBUkdFVF9NQVNLCTB4ZmZmZjAwMDAJLyogVm9sdW1lIHRhcmdldCBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJCSovCi0jZGVmaW5lIFZURlRfRklMVEVSVEFSR0VUX01BU0sJMHgwMDAwZmZmZgkvKiBGaWx0ZXIgY3V0b2ZmIHRhcmdldCBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KLQotI2RlZmluZSBaMQkJCTB4MDUJCS8qIEZpbHRlciBkZWxheSBtZW1vcnkgMSByZWdpc3RlcgkJCSovCi0KLSNkZWZpbmUgWjIJCQkweDA0CQkvKiBGaWx0ZXIgZGVsYXkgbWVtb3J5IDIgcmVnaXN0ZXIJCQkqLwotCi0jZGVmaW5lIFBTU1QJCQkweDA2CQkvKiBTZW5kIEMgYW1vdW50IGFuZCBsb29wIHN0YXJ0IGFkZHJlc3MgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgUFNTVF9GWFNFTkRBTU9VTlRfQ19NQVNLIDB4ZmYwMDAwMDAJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQwkqLwotCi0jZGVmaW5lIFBTU1RfRlhTRU5EQU1PVU5UX0MJMHgwODE4MDAwNgotCi0jZGVmaW5lIFBTU1RfTE9PUFNUQVJUQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogTG9vcCBzdGFydCBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KLSNkZWZpbmUgUFNTVF9MT09QU1RBUlRBRERSCTB4MTgwMDAwMDYKLQotI2RlZmluZSBEU0wJCQkweDA3CQkvKiBTZW5kIEQgYW1vdW50IGFuZCBsb29wIHN0YXJ0IGFkZHJlc3MgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgRFNMX0ZYU0VOREFNT1VOVF9EX01BU0sJMHhmZjAwMDAwMAkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBECSovCi0KLSNkZWZpbmUgRFNMX0ZYU0VOREFNT1VOVF9ECTB4MDgxODAwMDcKLQotI2RlZmluZSBEU0xfTE9PUEVOREFERFJfTUFTSwkweDAwZmZmZmZmCS8qIExvb3AgZW5kIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCQkqLwotI2RlZmluZSBEU0xfTE9PUEVOREFERFIJCTB4MTgwMDAwMDcKLQotI2RlZmluZSBDQ0NBCQkJMHgwOAkJLyogRmlsdGVyIFEsIGludGVycC4gUk9NLCBieXRlIHNpemUsIGN1ci4gYWRkciByZWdpc3RlciAqLwotI2RlZmluZSBDQ0NBX1JFU09OQU5DRQkJMHhmMDAwMDAwMAkvKiBMb3dwYXNzIGZpbHRlciByZXNvbmFuY2UgKFEpIGhlaWdodAkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NTUFTSwkweDBlMDAwMDAwCS8qIFNlbGVjdHMgcGFzc2JhbmQgb2YgaW50ZXJwb2xhdGlvbiBST00JCSovCi0JCQkJCQkvKiAxID09IGZ1bGwgYmFuZCwgNyA9PSBsb3dwYXNzCQkJCSovCi0JCQkJCQkvKiBST00gMCBpcyB1c2VkIHdoZW4gcGl0Y2ggc2hpZnRpbmcgZG93bndhcmQgb3IgbGVzcwkqLwotCQkJCQkJLyogdGhlbiAzIHNlbWl0b25lcyB1cHdhcmQuICBJbmNyZWFzaW5nbHkgaGlnaGVyIFJPTQkqLwotCQkJCQkJLyogbnVtYmVycyBhcmUgdXNlZCwgdHlwaWNhbGx5IGluIHN0ZXBzIG9mIDMgc2VtaXRvbmVzLAkqLwotCQkJCQkJLyogYXMgdXB3YXJkIHBpdGNoIHNoaWZ0aW5nIGlzIHBlcmZvcm1lZC4JCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzAJMHgwMDAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMAkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8xCTB4MDIwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDEJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMgkweDA0MDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAyCQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzMJMHgwNjAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMwkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV80CTB4MDgwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDQJCQkJKi8KLSNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNQkweDBhMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA1CQkJCSovCi0jZGVmaW5lIENDQ0FfSU5URVJQUk9NXzYJMHgwYzAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNgkJCQkqLwotI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV83CTB4MGUwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDcJCQkJKi8KLSNkZWZpbmUgQ0NDQV84QklUU0VMRUNUCQkweDAxMDAwMDAwCS8qIDEgPSBTb3VuZCBtZW1vcnkgZm9yIHRoaXMgY2hhbm5lbCB1c2VzIDgtYml0IHNhbXBsZXMJKi8KLSNkZWZpbmUgQ0NDQV9DVVJSQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogQ3VycmVudCBhZGRyZXNzIG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsCQkqLwotI2RlZmluZSBDQ0NBX0NVUlJBRERSCQkweDE4MDAwMDA4Ci0KLSNkZWZpbmUgQ0NSCQkJMHgwOQkJLyogQ2FjaGUgY29udHJvbCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDQ1JfQ0FDSEVJTlZBTElEU0laRQkweDA3MTkwMDA5Ci0jZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFX01BU0sJMHhmZTAwMDAwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGNhY2hlIGZvciB0aGlzIGNoYW5uZWwgICAgCSovCi0jZGVmaW5lIENDUl9DQUNIRUxPT1BGTEFHCTB4MDEwMDAwMDAJLyogMSA9IENhY2hlIGhhcyBhIGxvb3Agc2VydmljZSBwZW5kaW5nCQkJKi8KLSNkZWZpbmUgQ0NSX0lOVEVSTEVBVkVEU0FNUExFUwkweDAwODAwMDAwCS8qIDEgPSBBIGNhY2hlIHNlcnZpY2Ugd2lsbCBmZXRjaCBpbnRlcmxlYXZlZCBzYW1wbGVzCSovCi0jZGVmaW5lIENDUl9XT1JEU0laRURTQU1QTEVTCTB4MDA0MDAwMDAJLyogMSA9IEEgY2FjaGUgc2VydmljZSB3aWxsIGZldGNoIHdvcmQgc2l6ZWQgc2FtcGxlcwkqLwotI2RlZmluZSBDQ1JfUkVBREFERFJFU1MJCTB4MDYxMDAwMDkKLSNkZWZpbmUgQ0NSX1JFQURBRERSRVNTX01BU0sJMHgwMDNmMDAwMAkvKiBMb2NhdGlvbiBvZiBjYWNoZSBqdXN0IGJleW9uZCBjdXJyZW50IGNhY2hlIHNlcnZpY2UJKi8KLSNkZWZpbmUgQ0NSX0xPT1BJTlZBTFNJWkUJMHgwMDAwZmUwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGluIGNhY2hlIHByaW9yIHRvIGxvb3AJKi8KLQkJCQkJCS8qIE5PVEU6IFRoaXMgaXMgdmFsaWQgb25seSBpZiBDQUNIRUxPT1BGTEFHIGlzIHNldAkqLwotI2RlZmluZSBDQ1JfTE9PUEZMQUcJCTB4MDAwMDAxMDAJLyogU2V0IGZvciBhIHNpbmdsZSBzYW1wbGUgcGVyaW9kIHdoZW4gYSBsb29wIG9jY3VycwkqLwotI2RlZmluZSBDQ1JfQ0FDSEVMT09QQUREUkhJCTB4MDAwMDAwZmYJLyogRFNMX0xPT1BTVEFSVEFERFIncyBoaSBieXRlIGlmIENBQ0hFTE9PUEZMQUcgaXMgc2V0CSovCi0KLSNkZWZpbmUgQ0xQCQkJMHgwYQkJLyogQ2FjaGUgbG9vcCByZWdpc3RlciAodmFsaWQgaWYgQ0NSX0NBQ0hFTE9PUEZMQUcgPSAxKSAqLwotCQkJCQkJLyogTk9URTogVGhpcyByZWdpc3RlciBpcyBub3JtYWxseSBub3QgdXNlZAkJKi8KLSNkZWZpbmUgQ0xQX0NBQ0hFTE9PUEFERFIJMHgwMDAwZmZmZgkvKiBDYWNoZSBsb29wIGFkZHJlc3MgKERTTF9MT09QU1RBUlRBRERSIFswLi4xNV0pCSovCi0KLSNkZWZpbmUgRlhSVAkJCTB4MGIJCS8qIEVmZmVjdHMgc2VuZCByb3V0aW5nIHJlZ2lzdGVyCQkJKi8KLQkJCQkJCS8qIE5PVEU6IEl0IGlzIGlsbGVnYWwgdG8gYXNzaWduIHRoZSBzYW1lIHJvdXRpbmcgdG8JKi8KLQkJCQkJCS8qIHR3byBlZmZlY3RzIHNlbmRzLgkJCQkJKi8KLSNkZWZpbmUgRlhSVF9DSEFOTkVMQQkJMHgwMDBmMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBBCSovCi0jZGVmaW5lIEZYUlRfQ0hBTk5FTEIJCTB4MDBmMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQgkqLwotI2RlZmluZSBGWFJUX0NIQU5ORUxDCQkweDBmMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEMJKi8KLSNkZWZpbmUgRlhSVF9DSEFOTkVMRAkJMHhmMDAwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBECSovCi0KLSNkZWZpbmUgTUFQQQkJCTB4MGMJCS8qIENhY2hlIG1hcCBBCQkJCQkJKi8KLQotI2RlZmluZSBNQVBCCQkJMHgwZAkJLyogQ2FjaGUgbWFwIEIJCQkJCQkqLwotCi0jZGVmaW5lIE1BUF9QVEVfTUFTSwkJMHhmZmZmZTAwMAkvKiBUaGUgMTkgTVNCcyBvZiB0aGUgUFRFIGluZGV4ZWQgYnkgdGhlIFBUSQkJKi8KLSNkZWZpbmUgTUFQX1BUSV9NQVNLCQkweDAwMDAxZmZmCS8qIFRoZSAxMyBiaXQgaW5kZXggdG8gb25lIG9mIHRoZSA4MTkyIFBURSBkd29yZHMgICAgICAJKi8KLQotI2RlZmluZSBFTlZWT0wJCQkweDEwCQkvKiBWb2x1bWUgZW52ZWxvcGUgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgRU5WVk9MX01BU0sJCTB4MDAwMGZmZmYJLyogQ3VycmVudCB2YWx1ZSBvZiB2b2x1bWUgZW52ZWxvcGUgc3RhdGUgdmFyaWFibGUJKi8gIAotCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkgICAgICAgCQkJKi8KLQotI2RlZmluZSBBVEtITERWIAkJMHgxMQkJLyogVm9sdW1lIGVudmVsb3BlIGhvbGQgYW5kIGF0dGFjayByZWdpc3RlcgkJKi8KLSNkZWZpbmUgQVRLSExEVl9QSEFTRTAJCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZQkJCQkqLwotI2RlZmluZSBBVEtITERWX0hPTERUSU1FX01BU0sJMHgwMDAwN2YwMAkvKiBFbnZlbG9wZSBob2xkIHRpbWUgKDEyNy1uID09IG4qODguMm1zZWMpCQkqLwotI2RlZmluZSBBVEtITERWX0FUVEFDS1RJTUVfTUFTSwkweDAwMDAwMDdmCS8qIEVudmVsb3BlIGF0dGFjayB0aW1lLCBsb2cgZW5jb2RlZAkJCSovCi0JCQkJCQkvKiAwID0gaW5maW5pdGUsIDEgPSAxMC45bXNlYywgLi4uIDB4N2YgPSA1LjVtc2VjCSovCi0KLSNkZWZpbmUgRENZU1VTViAJCTB4MTIJCS8qIFZvbHVtZSBlbnZlbG9wZSBzdXN0YWluIGFuZCBkZWNheSByZWdpc3RlcgkJKi8KLSNkZWZpbmUgRENZU1VTVl9QSEFTRTFfTUFTSwkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UsIDEgPSBiZWdpbiByZWxlYXNlIHBoYXNlCSovCi0jZGVmaW5lIERDWVNVU1ZfU1VTVEFJTkxFVkVMX01BU0sgMHgwMDAwN2YwMAkvKiAxMjcgPSBmdWxsLCAwID0gb2ZmLCAwLjc1ZEIgaW5jcmVtZW50cwkJKi8KLSNkZWZpbmUgRENZU1VTVl9DSEFOTkVMRU5BQkxFX01BU0sgMHgwMDAwMDA4MAkvKiAxID0gSW5oaWJpdCBlbnZlbG9wZSBlbmdpbmUgZnJvbSB3cml0aW5nIHZhbHVlcyBpbgkqLwotCQkJCQkJLyogdGhpcyBjaGFubmVsIGFuZCBmcm9tIHdyaXRpbmcgdG8gcGl0Y2gsIGZpbHRlciBhbmQJKi8KLQkJCQkJCS8qIHZvbHVtZSB0YXJnZXRzLgkJCQkJKi8KLSNkZWZpbmUgRENZU1VTVl9ERUNBWVRJTUVfTUFTSwkweDAwMDAwMDdmCS8qIFZvbHVtZSBlbnZlbG9wZSBkZWNheSB0aW1lLCBsb2cgZW5jb2RlZCAgICAgCQkqLwotCQkJCQkJLyogMCA9IDQzLjdtc2VjLCAxID0gMjEuOG1zZWMsIDB4N2YgPSAyMm1zZWMJCSovCi0KLSNkZWZpbmUgTEZPVkFMMSAJCTB4MTMJCS8qIE1vZHVsYXRpb24gTEZPIHZhbHVlCQkJCQkqLwotI2RlZmluZSBMRk9WQUxfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIG1vZHVsYXRpb24gTEZPIHN0YXRlIHZhcmlhYmxlCSovCi0JCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CQkJCSovCi0KLSNkZWZpbmUgRU5WVkFMCQkJMHgxNAkJLyogTW9kdWxhdGlvbiBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBFTlZWQUxfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIG1vZHVsYXRpb24gZW52ZWxvcGUgc3RhdGUgdmFyaWFibGUgCSovCi0JCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CQkJCSovCi0KLSNkZWZpbmUgQVRLSExETQkJCTB4MTUJCS8qIE1vZHVsYXRpb24gZW52ZWxvcGUgaG9sZCBhbmQgYXR0YWNrIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBBVEtITERNX1BIQVNFMAkJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlCQkJCSovCi0jZGVmaW5lIEFUS0hMRE1fSE9MRFRJTUUJMHgwMDAwN2YwMAkvKiBFbnZlbG9wZSBob2xkIHRpbWUgKDEyNy1uID09IG4qNDJtc2VjKQkJKi8KLSNkZWZpbmUgQVRLSExETV9BVFRBQ0tUSU1FCTB4MDAwMDAwN2YJLyogRW52ZWxvcGUgYXR0YWNrIHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KLQkJCQkJCS8qIDAgPSBpbmZpbml0ZSwgMSA9IDExbXNlYywgLi4uIDB4N2YgPSA1LjVtc2VjCQkqLwotCi0jZGVmaW5lIERDWVNVU00JCQkweDE2CQkvKiBNb2R1bGF0aW9uIGVudmVsb3BlIGRlY2F5IGFuZCBzdXN0YWluIHJlZ2lzdGVyCSovCi0jZGVmaW5lIERDWVNVU01fUEhBU0UxX01BU0sJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlLCAxID0gYmVnaW4gcmVsZWFzZSBwaGFzZQkqLwotI2RlZmluZSBEQ1lTVVNNX1NVU1RBSU5MRVZFTF9NQVNLIDB4MDAwMDdmMDAJLyogMTI3ID0gZnVsbCwgMCA9IG9mZiwgMC43NWRCIGluY3JlbWVudHMJCSovCi0jZGVmaW5lIERDWVNVU01fREVDQVlUSU1FX01BU0sJMHgwMDAwMDA3ZgkvKiBFbnZlbG9wZSBkZWNheSB0aW1lLCBsb2cgZW5jb2RlZAkJCSovCi0JCQkJCQkvKiAwID0gNDMuN21zZWMsIDEgPSAyMS44bXNlYywgMHg3ZiA9IDIybXNlYwkJKi8KLQotI2RlZmluZSBMRk9WQUwyIAkJMHgxNwkJLyogVmlicmF0byBMRk8gcmVnaXN0ZXIJCQkJCSovCi0jZGVmaW5lIExGT1ZBTDJfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIHZpYnJhdG8gTEZPIHN0YXRlIHZhcmlhYmxlIAkJKi8KLQkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KLQotI2RlZmluZSBJUAkJCTB4MTgJCS8qIEluaXRpYWwgcGl0Y2ggcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgSVBfTUFTSwkJCTB4MDAwMGZmZmYJLyogRXhwb25lbnRpYWwgaW5pdGlhbCBwaXRjaCBzaGlmdAkJCSovCi0JCQkJCQkvKiA0IGJpdHMgb2Ygb2N0YXZlLCAxMiBiaXRzIG9mIGZyYWN0aW9uYWwgb2N0YXZlCSovCi0jZGVmaW5lIElQX1VOSVRZCQkweDAwMDBlMDAwCS8qIFVuaXR5IHBpdGNoIHNoaWZ0CQkJCQkqLwotCi0jZGVmaW5lIElGQVROCQkJMHgxOQkJLyogSW5pdGlhbCBmaWx0ZXIgY3V0b2ZmIGFuZCBhdHRlbnVhdGlvbiByZWdpc3RlcgkqLwotI2RlZmluZSBJRkFUTl9GSUxURVJDVVRPRkZfTUFTSwkweDAwMDBmZjAwCS8qIEluaXRpYWwgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kgaW4gZXhwb25lbnRpYWwgdW5pdHMJKi8KLQkJCQkJCS8qIDYgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSBzZW1pdG9uZXMJCSovCi0JCQkJCQkvKiAyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGZyYWN0aW9ucwkJKi8KLSNkZWZpbmUgSUZBVE5fRklMVEVSQ1VUT0ZGCTB4MDgwODAwMTkKLSNkZWZpbmUgSUZBVE5fQVRURU5VQVRJT05fTUFTSwkweDAwMDAwMGZmCS8qIEluaXRpYWwgYXR0ZW51YXRpb24gaW4gMC4zNzVkQiBzdGVwcwkJCSovCi0jZGVmaW5lIElGQVROX0FUVEVOVUFUSU9OCTB4MDgwMDAwMTkKLQotCi0jZGVmaW5lIFBFRkUJCQkweDFhCQkvKiBQaXRjaCBlbnZlbG9wZSBhbmQgZmlsdGVyIGVudmVsb3BlIGFtb3VudCByZWdpc3RlcgkqLwotI2RlZmluZSBQRUZFX1BJVENIQU1PVU5UX01BU0sJMHgwMDAwZmYwMAkvKiBQaXRjaCBlbnZsb3BlIGFtb3VudAkJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIG9uZSBvY3RhdmUgcGVhayBleHRyZW1lcwkqLwotI2RlZmluZSBQRUZFX1BJVENIQU1PVU5UCTB4MDgwODAwMWEKLSNkZWZpbmUgUEVGRV9GSUxURVJBTU9VTlRfTUFTSwkweDAwMDAwMGZmCS8qIEZpbHRlciBlbnZsb3BlIGFtb3VudAkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gc2l4IG9jdGF2ZXMgcGVhayBleHRyZW1lcyAqLwotI2RlZmluZSBQRUZFX0ZJTFRFUkFNT1VOVAkweDA4MDAwMDFhCi0jZGVmaW5lIEZNTU9ECQkJMHgxYgkJLyogVmlicmF0by9maWx0ZXIgbW9kdWxhdGlvbiBmcm9tIExGTyByZWdpc3RlcgkJKi8KLSNkZWZpbmUgRk1NT0RfTU9EVklCUkFUTwkweDAwMDBmZjAwCS8qIFZpYnJhdG8gTEZPIG1vZHVsYXRpb24gZGVwdGgJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIG9uZSBvY3RhdmUgZXh0cmVtZXMJKi8KLSNkZWZpbmUgRk1NT0RfTU9GSUxURVIJCTB4MDAwMDAwZmYJLyogRmlsdGVyIExGTyBtb2R1bGF0aW9uIGRlcHRoCQkJCSovCi0JCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSB0aHJlZSBvY3RhdmUgZXh0cmVtZXMJKi8KLQotCi0jZGVmaW5lIFRSRU1GUlEgCQkweDFjCQkvKiBUcmVtb2xvIGFtb3VudCBhbmQgbW9kdWxhdGlvbiBMRk8gZnJlcXVlbmN5IHJlZ2lzdGVyCSovCi0jZGVmaW5lIFRSRU1GUlFfREVQVEgJCTB4MDAwMGZmMDAJLyogVHJlbW9sbyBkZXB0aAkJCQkJKi8KLQkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgd2l0aCArLy0gMTJkQiBleHRyZW1lcwkqLwotI2RlZmluZSBUUkVNRlJRX0ZSRVFVRU5DWQkweDAwMDAwMGZmCS8qIFRyZW1vbG8gTEZPIGZyZXF1ZW5jeQkJCQkqLwotCQkJCQkJLyogPz9IeiBzdGVwcywgbWF4aW11bSBvZiA/PyBIei4JCQkqLwotCi0jZGVmaW5lIEZNMkZSUTIgCQkweDFkCQkvKiBWaWJyYXRvIGFtb3VudCBhbmQgdmlicmF0byBMRk8gZnJlcXVlbmN5IHJlZ2lzdGVyCSovCi0jZGVmaW5lIEZNMkZSUTJfREVQVEgJCTB4MDAwMGZmMDAJLyogVmlicmF0byBMRk8gdmlicmF0byBkZXB0aAkJCQkqLwotCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBleHRyZW1lcwkqLwotI2RlZmluZSBGTTJGUlEyX0ZSRVFVRU5DWQkweDAwMDAwMGZmCS8qIFZpYnJhdG8gTEZPIGZyZXF1ZW5jeQkJCQkqLwotCQkJCQkJLyogMC4wMzlIeiBzdGVwcywgbWF4aW11bSBvZiA5Ljg1IEh6LgkJCSovCi0KLSNkZWZpbmUgVEVNUEVOViAJCTB4MWUJCS8qIFRlbXBvcnkgZW52ZWxvcGUgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgVEVNUEVOVl9NQVNLCQkweDAwMDBmZmZmCS8qIDE2LWJpdCB2YWx1ZQkJCQkJCSovCi0JCQkJCQkvKiBOT1RFOiBBbGwgY2hhbm5lbHMgY29udGFpbiBpbnRlcm5hbCB2YXJpYWJsZXM7IGRvCSovCi0JCQkJCQkvKiBub3Qgd3JpdGUgdG8gdGhlc2UgbG9jYXRpb25zLgkJCSovCi0KLSNkZWZpbmUgQ0QwCQkJMHgyMAkJLyogQ2FjaGUgZGF0YSAwIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEMQkJCTB4MjEJCS8qIENhY2hlIGRhdGEgMSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDIJCQkweDIyCQkvKiBDYWNoZSBkYXRhIDIgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0QzCQkJMHgyMwkJLyogQ2FjaGUgZGF0YSAzIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENENAkJCTB4MjQJCS8qIENhY2hlIGRhdGEgNCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDUJCQkweDI1CQkvKiBDYWNoZSBkYXRhIDUgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q2CQkJMHgyNgkJLyogQ2FjaGUgZGF0YSA2IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENENwkJCTB4MjcJCS8qIENhY2hlIGRhdGEgNyByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDRDgJCQkweDI4CQkvKiBDYWNoZSBkYXRhIDggcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0Q5CQkJMHgyOQkJLyogQ2FjaGUgZGF0YSA5IHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENEQQkJCTB4MmEJCS8qIENhY2hlIGRhdGEgQSByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREIJCQkweDJiCQkvKiBDYWNoZSBkYXRhIEIgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RDCQkJMHgyYwkJLyogQ2FjaGUgZGF0YSBDIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIENERAkJCTB4MmQJCS8qIENhY2hlIGRhdGEgRCByZWdpc3RlcgkJCQkqLwotI2RlZmluZSBDREUJCQkweDJlCQkvKiBDYWNoZSBkYXRhIEUgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQ0RGCQkJMHgyZgkJLyogQ2FjaGUgZGF0YSBGIHJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgUFRCCQkJMHg0MAkJLyogUGFnZSB0YWJsZSBiYXNlIHJlZ2lzdGVyCQkJCSovCi0jZGVmaW5lIFBUQl9NQVNLCQkweGZmZmZmMDAwCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBhZ2UgdGFibGUgaW4gaG9zdCBtZW1vcnkJKi8KLQotI2RlZmluZSBUQ0IJCQkweDQxCQkvKiBUYW5rIGNhY2hlIGJhc2UgcmVnaXN0ZXIgICAgCQkJCSovCi0jZGVmaW5lIFRDQl9NQVNLCQkweGZmZmZmMDAwCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvdHRvbSBvZiBob3N0IGJhc2VkIFRSQU0JKi8KLQotI2RlZmluZSBBRENDUgkJCTB4NDIJCS8qIEFEQyBzYW1wbGUgcmF0ZS9zdGVyZW8gY29udHJvbCByZWdpc3RlcgkJKi8KLSNkZWZpbmUgQURDQ1JfUkNIQU5FTkFCTEUJMHgwMDAwMDAxMAkvKiBFbmFibGVzIHJpZ2h0IGNoYW5uZWwgZm9yIHdyaXRpbmcgdG8gdGhlIGhvc3QgICAgICAgCSovCi0jZGVmaW5lIEFEQ0NSX0xDSEFORU5BQkxFCTB4MDAwMDAwMDgJLyogRW5hYmxlcyBsZWZ0IGNoYW5uZWwgZm9yIHdyaXRpbmcgdG8gdGhlIGhvc3QJCSovCi0JCQkJCQkvKiBOT1RFOiBUbyBndWFyYW50ZWUgcGhhc2UgY29oZXJlbmN5LCBib3RoIGNoYW5uZWxzCSovCi0JCQkJCQkvKiBtdXN0IGJlIGRpc2FibGVkIHByaW9yIHRvIGVuYWJsaW5nIGJvdGggY2hhbm5lbHMuCSovCi0jZGVmaW5lIEFfQURDQ1JfUkNIQU5FTkFCTEUJMHgwMDAwMDAyMAotI2RlZmluZSBBX0FEQ0NSX0xDSEFORU5BQkxFCTB4MDAwMDAwMTAKLQotI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfTUFTSyAweDAwMDAwMDBGICAgICAgLyogQXVkaWd5IHNhbXBsZSByYXRlIGNvbnZlcnRvciBvdXRwdXQgcmF0ZQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV9NQVNLCTB4MDAwMDAwMDcJLyogU2FtcGxlIHJhdGUgY29udmVydG9yIG91dHB1dCByYXRlCQkJKi8KLQotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzQ4CTB4MDAwMDAwMDAJLyogNDhrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfNDQJMHgwMDAwMDAwMQkvKiA0NC4xa0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzMyCTB4MDAwMDAwMDIJLyogMzJrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMjQJMHgwMDAwMDAwMwkvKiAyNGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8yMgkweDAwMDAwMDA0CS8qIDIyLjA1a0h6IHNhbXBsZSByYXRlCQkJCQkqLwotI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzE2CTB4MDAwMDAwMDUJLyogMTZrSHogc2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMTEJMHgwMDAwMDAwNgkvKiAxMS4wMjVrSHogc2FtcGxlIHJhdGUJCQkJKi8KLSNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV84CTB4MDAwMDAwMDcJLyogOGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLQotI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfMTIJMHgwMDAwMDAwNgkvKiAxMmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLSNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFXzExCTB4MDAwMDAwMDcJLyogMTEuMDI1a0h6IHNhbXBsZSByYXRlCQkJCSovCi0jZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV84CTB4MDAwMDAwMDgJLyogOGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KLQotI2RlZmluZSBGWFdDCQkJMHg0MwkJLyogRlggb3V0cHV0IHdyaXRlIGNoYW5uZWxzIHJlZ2lzdGVyCQkJKi8KLQkJCQkJCS8qIFdoZW4gc2V0LCBlYWNoIGJpdCBlbmFibGVzIHRoZSB3cml0aW5nIG9mIHRoZQkqLwotCQkJCQkJLyogY29ycmVzcG9uZGluZyBGWCBvdXRwdXQgY2hhbm5lbCAoaW50ZXJuYWwgcmVnaXN0ZXJzICAqLwotCQkJCQkJLyogMHgyMC0weDNmKSBpbnRvIGhvc3QgbWVtb3J5LiBUaGlzIG1vZGUgb2YgcmVjb3JkaW5nCSovCi0JCQkJCQkvKiBpcyAxNmJpdCwgNDhLSHogb25seS4gQWxsIDMyCWNoYW5uZWxzIGNhbiBiZSBlbmFibGVkICovCi0JCQkJCQkvKiBzaW11bHRhbmVvdXNseS4JCQkJCSovCi0jZGVmaW5lIFRDQlMJCQkweDQ0CQkvKiBUYW5rIGNhY2hlIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJKi8KLSNkZWZpbmUgVENCU19NQVNLCQkweDAwMDAwMDA3CS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgZmllbGQJCQkJKi8KLSNkZWZpbmUgVENCU19CVUZGU0laRV8xNksJMHgwMDAwMDAwMAotI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzMySwkweDAwMDAwMDAxCi0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfNjRLCTB4MDAwMDAwMDIKLSNkZWZpbmUgVENCU19CVUZGU0laRV8xMjhLCTB4MDAwMDAwMDMKLSNkZWZpbmUgVENCU19CVUZGU0laRV8yNTZLCTB4MDAwMDAwMDQKLSNkZWZpbmUgVENCU19CVUZGU0laRV81MTJLCTB4MDAwMDAwMDUKLSNkZWZpbmUgVENCU19CVUZGU0laRV8xMDI0SwkweDAwMDAwMDA2Ci0jZGVmaW5lIFRDQlNfQlVGRlNJWkVfMjA0OEsJMHgwMDAwMDAwNwotCi0jZGVmaW5lIE1JQ0JBCQkJMHg0NQkJLyogQUM5NyBtaWNyb3Bob25lIGJ1ZmZlciBhZGRyZXNzIHJlZ2lzdGVyCQkqLwotI2RlZmluZSBNSUNCQV9NQVNLCQkweGZmZmZmMDAwCS8qIDIwIGJpdCBiYXNlIGFkZHJlc3MJCQkJCSovCi0KLSNkZWZpbmUgQURDQkEJCQkweDQ2CQkvKiBBREMgYnVmZmVyIGFkZHJlc3MgcmVnaXN0ZXIJCQkJKi8KLSNkZWZpbmUgQURDQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLwotCi0jZGVmaW5lIEZYQkEJCQkweDQ3CQkvKiBGWCBCdWZmZXIgQWRkcmVzcyAqLwotI2RlZmluZSBGWEJBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KLQotI2RlZmluZSBNSUNCUwkJCTB4NDkJCS8qIE1pY3JvcGhvbmUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLwotCi0jZGVmaW5lIEFEQ0JTCQkJMHg0YQkJLyogQURDIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJCSovCi0KLSNkZWZpbmUgRlhCUwkJCTB4NGIJCS8qIEZYIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJCSovCi0KLS8qIFRoZSBmb2xsb3dpbmcgbWFzayB2YWx1ZXMgZGVmaW5lIHRoZSBzaXplIG9mIHRoZSBBREMsIE1JWCBhbmQgRlggYnVmZmVycyBpbiBieXRlcyAqLwotI2RlZmluZSBBRENCU19CVUZTSVpFX05PTkUJMHgwMDAwMDAwMAotI2RlZmluZSBBRENCU19CVUZTSVpFXzM4NAkweDAwMDAwMDAxCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDQ4CTB4MDAwMDAwMDIKLSNkZWZpbmUgQURDQlNfQlVGU0laRV81MTIJMHgwMDAwMDAwMwotI2RlZmluZSBBRENCU19CVUZTSVpFXzY0MAkweDAwMDAwMDA0Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNzY4CTB4MDAwMDAwMDUKLSNkZWZpbmUgQURDQlNfQlVGU0laRV84OTYJMHgwMDAwMDAwNgotI2RlZmluZSBBRENCU19CVUZTSVpFXzEwMjQJMHgwMDAwMDAwNwotI2RlZmluZSBBRENCU19CVUZTSVpFXzEyODAJMHgwMDAwMDAwOAotI2RlZmluZSBBRENCU19CVUZTSVpFXzE1MzYJMHgwMDAwMDAwOQotI2RlZmluZSBBRENCU19CVUZTSVpFXzE3OTIJMHgwMDAwMDAwYQotI2RlZmluZSBBRENCU19CVUZTSVpFXzIwNDgJMHgwMDAwMDAwYgotI2RlZmluZSBBRENCU19CVUZTSVpFXzI1NjAJMHgwMDAwMDAwYwotI2RlZmluZSBBRENCU19CVUZTSVpFXzMwNzIJMHgwMDAwMDAwZAotI2RlZmluZSBBRENCU19CVUZTSVpFXzM1ODQJMHgwMDAwMDAwZQotI2RlZmluZSBBRENCU19CVUZTSVpFXzQwOTYJMHgwMDAwMDAwZgotI2RlZmluZSBBRENCU19CVUZTSVpFXzUxMjAJMHgwMDAwMDAxMAotI2RlZmluZSBBRENCU19CVUZTSVpFXzYxNDQJMHgwMDAwMDAxMQotI2RlZmluZSBBRENCU19CVUZTSVpFXzcxNjgJMHgwMDAwMDAxMgotI2RlZmluZSBBRENCU19CVUZTSVpFXzgxOTIJMHgwMDAwMDAxMwotI2RlZmluZSBBRENCU19CVUZTSVpFXzEwMjQwCTB4MDAwMDAwMTQKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8xMjI4OAkweDAwMDAwMDE1Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTQzNjYJMHgwMDAwMDAxNgotI2RlZmluZSBBRENCU19CVUZTSVpFXzE2Mzg0CTB4MDAwMDAwMTcKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8yMDQ4MAkweDAwMDAwMDE4Ci0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjQ1NzYJMHgwMDAwMDAxOQotI2RlZmluZSBBRENCU19CVUZTSVpFXzI4NjcyCTB4MDAwMDAwMWEKLSNkZWZpbmUgQURDQlNfQlVGU0laRV8zMjc2OAkweDAwMDAwMDFiCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDA5NjAJMHgwMDAwMDAxYwotI2RlZmluZSBBRENCU19CVUZTSVpFXzQ5MTUyCTB4MDAwMDAwMWQKLSNkZWZpbmUgQURDQlNfQlVGU0laRV81NzM0NAkweDAwMDAwMDFlCi0jZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjU1MzYJMHgwMDAwMDAxZgotCi0KLSNkZWZpbmUgQ0RDUwkJCTB4NTAJCS8qIENELVJPTSBkaWdpdGFsIGNoYW5uZWwgc3RhdHVzIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgR1BTQ1MJCQkweDUxCQkvKiBHZW5lcmFsIFB1cnBvc2UgU1BESUYgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIqLwotCi0jZGVmaW5lIERCRwkJCTB4NTIJCS8qIERPIE5PVCBQUk9HUkFNIFRISVMgUkVHSVNURVIhISEgTUFZIERFU1RST1kgQ0hJUCAqLwotCi0vKiBkZWZpbml0aW9ucyBmb3IgZGVidWcgcmVnaXN0ZXIgLSB0YWtlbiBmcm9tIHRoZSBhbHNhIGRyaXZlcnMgKi8KLSNkZWZpbmUgREJHX1pDICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8qIHplcm8gdHJhbSBjb3VudGVyICovCi0jZGVmaW5lIERCR19TQVRVUkFUSU9OX09DQ1VSRUQgIDB4MDIwMDAwMDAgICAgICAvKiBzYXR1cmF0aW9uIGNvbnRyb2wgKi8KLSNkZWZpbmUgREJHX1NBVFVSQVRJT05fQUREUiAgICAgMHgwMWZmMDAwMCAgICAgIC8qIHNhdHVyYXRpb24gYWRkcmVzcyAqLwotI2RlZmluZSBEQkdfU0lOR0xFX1NURVAgICAgICAgICAweDAwMDA4MDAwICAgICAgLyogc2luZ2xlIHN0ZXAgbW9kZSAqLwotI2RlZmluZSBEQkdfU1RFUCAgICAgICAgICAgICAgICAweDAwMDA0MDAwICAgICAgLyogc3RhcnQgc2luZ2xlIHN0ZXAgKi8KLSNkZWZpbmUgREJHX0NPTkRJVElPTl9DT0RFICAgICAgMHgwMDAwM2UwMCAgICAgIC8qIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIERCR19TSU5HTEVfU1RFUF9BRERSICAgIDB4MDAwMDAxZmYgICAgICAvKiBzaW5nbGUgc3RlcCBhZGRyZXNzICovCi0KLQotI2RlZmluZSBSRUc1MwkJCTB4NTMJCS8qIERPIE5PVCBQUk9HUkFNIFRISVMgUkVHSVNURVIhISEgTUFZIERFU1RST1kgQ0hJUCAqLwotCi0jZGVmaW5lIEFfREJHCQkJIDB4NTMKLSNkZWZpbmUgQV9EQkdfU0lOR0xFX1NURVAJIDB4MDAwMjAwMDAJLyogU2V0IHRvIHplcm8gdG8gc3RhcnQgZHNwICovCi0jZGVmaW5lIEFfREJHX1pDCQkgMHg0MDAwMDAwMAkvKiB6ZXJvIHRyYW0gY291bnRlciAqLwotI2RlZmluZSBBX0RCR19TVEVQX0FERFIJCSAweDAwMDAwM2ZmCi0jZGVmaW5lIEFfREJHX1NBVFVSQVRJT05fT0NDVVJFRCAweDIwMDAwMDAwCi0jZGVmaW5lIEFfREJHX1NBVFVSQVRJT05fQUREUgkgMHgwZmZjMDAwMAotCi0jZGVmaW5lIFNQQ1MwCQkJMHg1NAkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDAgcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBTUENTMQkJCTB4NTUJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAxIHJlZ2lzdGVyCSovCi0KLSNkZWZpbmUgU1BDUzIJCQkweDU2CQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMiByZWdpc3RlcgkqLwotCi0jZGVmaW5lIFNQQ1NfQ0xLQUNDWU1BU0sJMHgzMDAwMDAwMAkvKiBDbG9jayBhY2N1cmFjeQkJCQkqLwotI2RlZmluZSBTUENTX0NMS0FDQ1lfMTAwMFBQTQkweDAwMDAwMDAwCS8qIDEwMDAgcGFydHMgcGVyIG1pbGxpb24JCQkqLwotI2RlZmluZSBTUENTX0NMS0FDQ1lfNTBQUE0JMHgxMDAwMDAwMAkvKiA1MCBwYXJ0cyBwZXIgbWlsbGlvbgkJCQkqLwotI2RlZmluZSBTUENTX0NMS0FDQ1lfVkFSSUFCTEUJMHgyMDAwMDAwMAkvKiBWYXJpYWJsZSBhY2N1cmFjeQkJCQkqLwotI2RlZmluZSBTUENTX1NBTVBMRVJBVEVNQVNLCTB4MGYwMDAwMDAJLyogU2FtcGxlIHJhdGUJCQkJCSovCi0jZGVmaW5lIFNQQ1NfU0FNUExFUkFURV80NAkweDAwMDAwMDAwCS8qIDQ0LjFrSHogc2FtcGxlIHJhdGUJCQkJKi8KLSNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ4CTB4MDIwMDAwMDAJLyogNDhrSHogc2FtcGxlIHJhdGUJCQkJKi8KLSNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzMyCTB4MDMwMDAwMDAJLyogMzJrSHogc2FtcGxlIHJhdGUJCQkJKi8KLSNkZWZpbmUgU1BDU19DSEFOTkVMTlVNTUFTSwkweDAwZjAwMDAwCS8qIENoYW5uZWwgbnVtYmVyCQkJCSovCi0jZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBjaGFubmVsIG51bWJlcgkJCSovCi0jZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUCTB4MDAxMDAwMDAJLyogTGVmdCBjaGFubmVsCQkJCQkqLwotI2RlZmluZSBTUENTX0NIQU5ORUxOVU1fUklHSFQJMHgwMDIwMDAwMAkvKiBSaWdodCBjaGFubmVsCQkJCSovCi0jZGVmaW5lIFNQQ1NfU09VUkNFTlVNTUFTSwkweDAwMGYwMDAwCS8qIFNvdXJjZSBudW1iZXIJCQkJKi8KLSNkZWZpbmUgU1BDU19TT1VSQ0VOVU1fVU5TUEVDCTB4MDAwMDAwMDAJLyogVW5zcGVjaWZpZWQgc291cmNlIG51bWJlcgkJCSovCi0jZGVmaW5lIFNQQ1NfR0VORVJBVElPTlNUQVRVUwkweDAwMDA4MDAwCS8qIE9yaWdpbmFsaXR5IGZsYWcgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLwotI2RlZmluZSBTUENTX0NBVEVHT1JZQ09ERU1BU0sJMHgwMDAwN2YwMAkvKiBDYXRlZ29yeSBjb2RlIChzZWUgSUVDLTk1OCBzcGVjKQkJKi8KLSNkZWZpbmUgU1BDU19NT0RFTUFTSwkJMHgwMDAwMDBjMAkvKiBNb2RlIChzZWUgSUVDLTk1OCBzcGVjKQkJCSovCi0jZGVmaW5lIFNQQ1NfRU1QSEFTSVNNQVNLCTB4MDAwMDAwMzgJLyogRW1waGFzaXMJCQkJCSovCi0jZGVmaW5lIFNQQ1NfRU1QSEFTSVNfTk9ORQkweDAwMDAwMDAwCS8qIE5vIGVtcGhhc2lzCQkJCQkqLwotI2RlZmluZSBTUENTX0VNUEhBU0lTXzUwXzE1CTB4MDAwMDAwMDgJLyogNTAvMTUgdXNlYyAyIGNoYW5uZWwJCQkJKi8KLSNkZWZpbmUgU1BDU19DT1BZUklHSFQJCTB4MDAwMDAwMDQJLyogQ29weXJpZ2h0IGFzc2VydGVkIGZsYWcgLS0gZG8gbm90IG1vZGlmeQkqLwotI2RlZmluZSBTUENTX05PVEFVRElPREFUQQkweDAwMDAwMDAyCS8qIDAgPSBEaWdpdGFsIGF1ZGlvLCAxID0gbm90IGF1ZGlvCQkqLwotI2RlZmluZSBTUENTX1BST0ZFU1NJT05BTAkweDAwMDAwMDAxCS8qIDAgPSBDb25zdW1lciAoSUVDLTk1OCksIDEgPSBwcm8gKEFFUzMtMTk5MikJKi8KLQotLyogVGhlIDMyLWJpdCBDTEl4IGFuZCBTT0x4IHJlZ2lzdGVycyBhbGwgaGF2ZSBvbmUgYml0IHBlciBjaGFubmVsIGNvbnRyb2wvc3RhdHVzICAgICAgCQkqLwotI2RlZmluZSBDTElFTAkJCTB4NTgJCS8qIENoYW5uZWwgbG9vcCBpbnRlcnJ1cHQgZW5hYmxlIGxvdyByZWdpc3RlcgkqLwotCi0jZGVmaW5lIENMSUVICQkJMHg1OQkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBlbmFibGUgaGlnaCByZWdpc3RlcgkqLwotCi0jZGVmaW5lIENMSVBMCQkJMHg1YQkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBwZW5kaW5nIGxvdyByZWdpc3RlcgkqLwotCi0jZGVmaW5lIENMSVBICQkJMHg1YgkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBwZW5kaW5nIGhpZ2ggcmVnaXN0ZXIJKi8KLQotI2RlZmluZSBTT0xFTAkJCTB4NWMJCS8qIFN0b3Agb24gbG9vcCBlbmFibGUgbG93IHJlZ2lzdGVyCQkqLwotCi0jZGVmaW5lIFNPTEVICQkJMHg1ZAkJLyogU3RvcCBvbiBsb29wIGVuYWJsZSBoaWdoIHJlZ2lzdGVyCQkqLwotCi0jZGVmaW5lIFNQQllQQVNTCQkweDVlCQkvKiBTUERJRiBCWVBBU1MgbW9kZSByZWdpc3RlcgkJCSovCi0jZGVmaW5lIFNQQllQQVNTX0VOQUJMRQkJMHgwMDAwMDAwMQkvKiBFbmFibGUgU1BESUYgYnlwYXNzIG1vZGUJCQkqLwotCi0jZGVmaW5lIEFDOTdTTE9UCQkweDVmCQkvKiBhZGRpdGlvbmFsIEFDOTcgc2xvdHMgZW5hYmxlIGJpdHMgKi8KLSNkZWZpbmUgQUM5N1NMT1RfQ05UUgkJMHgxMAkJLyogQ2VudGVyIGVuYWJsZSAqLwotI2RlZmluZSBBQzk3U0xPVF9MRkUJCTB4MjAJCS8qIExGRSBlbmFibGUgKi8KLQotI2RlZmluZSBDRFNSQ1MJCQkweDYwCQkvKiBDRC1ST00gU2FtcGxlIFJhdGUgQ29udmVydGVyIHN0YXR1cyByZWdpc3RlcgkqLwotCi0jZGVmaW5lIEdQU1JDUwkJCTB4NjEJCS8qIEdlbmVyYWwgUHVycG9zZSBTUERJRiBzYW1wbGUgcmF0ZSBjdnQgc3RhdHVzICovCi0KLSNkZWZpbmUgWlZTUkNTCQkJMHg2MgkJLyogWlZpZGVvIHNhbXBsZSByYXRlIGNvbnZlcnRlciBzdGF0dXMJCSovCi0JCQkJCQkvKiBOT1RFOiBUaGlzIG9uZSBoYXMgbm8gU1BESUZMT0NLRUQgZmllbGQJKi8KLQkJCQkJCS8qIEFzc3VtZXMgc2FtcGxlIGxvY2sJCQkJKi8KLQotLyogVGhlc2UgdGhyZWUgYml0ZmllbGRzIGFwcGx5IHRvIENEU1JDUywgR1BTUkNTLCBhbmQgKGV4Y2VwdCBhcyBub3RlZCkgWlZTUkNTLgkJCSovCi0jZGVmaW5lIFNSQ1NfU1BESUZMT0NLRUQJMHgwMjAwMDAwMAkvKiBTUERJRiBzdHJlYW0gbG9ja2VkCQkJCSovCi0jZGVmaW5lIFNSQ1NfUkFURUxPQ0tFRAkJMHgwMTAwMDAwMAkvKiBTYW1wbGUgcmF0ZSBsb2NrZWQJCQkJKi8KLSNkZWZpbmUgU1JDU19FU1RTQU1QTEVSQVRFCTB4MDAwN2ZmZmYJLyogRG8gbm90IG1vZGlmeSB0aGlzIGZpZWxkLgkJCSovCi0KLQotLyogTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBjYW4gdmFyeSArLy0gYnkgYSBzbWFsbCBhbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU1JDU19TUERJRlJBVEVfNDQJMHgwMDAzYWNkOQotI2RlZmluZSBTUkNTX1NQRElGUkFURV80OAkweDAwMDQwMDAwCi0jZGVmaW5lIFNSQ1NfU1BESUZSQVRFXzk2CTB4MDAwODAwMDAKLQotI2RlZmluZSBNSUNJRFggICAgICAgICAgICAgICAgICAweDYzICAgICAgICAgICAgLyogTWljcm9waG9uZSByZWNvcmRpbmcgYnVmZmVyIGluZGV4IHJlZ2lzdGVyICAgKi8KLSNkZWZpbmUgTUlDSURYX01BU0sgICAgICAgICAgICAgMHgwMDAwZmZmZiAgICAgIC8qIDE2LWJpdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE1JQ0lEWF9JRFgJCTB4MTAwMDAwNjMKLQotI2RlZmluZSBBX0FEQ0lEWAkJMHg2MwotI2RlZmluZSBBX0FEQ0lEWF9JRFgJCTB4MTAwMDAwNjMKLQotI2RlZmluZSBBRENJRFgJCQkweDY0CQkvKiBBREMgcmVjb3JkaW5nIGJ1ZmZlciBpbmRleCByZWdpc3RlcgkJKi8KLSNkZWZpbmUgQURDSURYX01BU0sJCTB4MDAwMGZmZmYJLyogMTYgYml0IGluZGV4IGZpZWxkCQkJCSovCi0jZGVmaW5lIEFEQ0lEWF9JRFgJCTB4MTAwMDAwNjQKLQotI2RlZmluZSBGWElEWAkJCTB4NjUJCS8qIEZYIHJlY29yZGluZyBidWZmZXIgaW5kZXggcmVnaXN0ZXIJCSovCi0jZGVmaW5lIEZYSURYX01BU0sJCTB4MDAwMGZmZmYJLyogMTYtYml0IHZhbHVlCQkJCQkqLwotI2RlZmluZSBGWElEWF9JRFgJCTB4MTAwMDAwNjUKLQotLyogVGhpcyBpcyB0aGUgTVBVIHBvcnQgb24gdGhlIGNhcmQgKHZpYSB0aGUgZ2FtZSBwb3J0KQkJCQkJCSovCi0jZGVmaW5lIEFfTVVEQVRBMQkJMHg3MAotI2RlZmluZSBBX01VQ01EMQkJMHg3MQotI2RlZmluZSBBX01VU1RBVDEJCUFfTVVDTUQxCi0KLS8qIFRoaXMgaXMgdGhlIE1QVSBwb3J0IG9uIHRoZSBBdWRpZ3kgRHJpdmUgCQkJCQkJCSovCi0jZGVmaW5lIEFfTVVEQVRBMgkJMHg3MgotI2RlZmluZSBBX01VQ01EMgkJMHg3MwotI2RlZmluZSBBX01VU1RBVDIJCUFfTVVDTUQyCQotCi0vKiBUaGUgbmV4dCB0d28gYXJlIHRoZSBBdWRpZ3kgZXF1aXZhbGVudCBvZiBGWFdDCQkJCQkJKi8KLS8qIHRoZSBBdWRpZ3kgY2FuIHJlY29yZCBhbnkgb3V0cHV0ICgxNmJpdCwgNDhrSHosIHVwIHRvIDY0IGNoYW5uZWwgc2ltdWx0YW5lb3VzbHkpIAkJKi8KLS8qIEVhY2ggYml0IHNlbGVjdHMgYSBjaGFubmVsIGZvciByZWNvcmRpbmcgKi8KLSNkZWZpbmUgQV9GWFdDMQkJCTB4NzQgICAgICAgICAgICAvKiBTZWxlY3RzIDB4N2YtMHg2MCBmb3IgRlggcmVjb3JkaW5nICAgICAgICAgICAqLwotI2RlZmluZSBBX0ZYV0MyCQkJMHg3NQkJLyogU2VsZWN0cyAweDlmLTB4ODAgZm9yIEZYIHJlY29yZGluZyAgICAgICAgICAgKi8KLQotI2RlZmluZSBBX1NQRElGX1NBTVBMRVJBVEUJMHg3NgkJLyogU2V0IHRoZSBzYW1wbGUgcmF0ZSBvZiBTUERJRiBvdXRwdXQJCSovCi0jZGVmaW5lIEFfU1BESUZfNDgwMDAJCTB4MDAwMDAwODAKLSNkZWZpbmUgQV9TUERJRl80NDEwMAkJMHgwMDAwMDAwMAotI2RlZmluZSBBX1NQRElGXzk2MDAwCQkweDAwMDAwMDQwCi0KLSNkZWZpbmUgQV9GWFJUMgkJCTB4N2MKLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxFCQkweDAwMDAwMDNmCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEUJKi8KLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxGCQkweDAwMDAzZjAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEYJKi8KLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxHCQkweDAwM2YwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEcJKi8KLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxICQkweDNmMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEgJKi8KLQotI2RlZmluZSBBX1NFTkRBTU9VTlRTCQkweDdkCi0jZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0VfTUFTSwkweGZmMDAwMDAwCi0jZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0ZfTUFTSwkweDAwZmYwMDAwCi0jZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0dfTUFTSwkweDAwMDBmZjAwCi0jZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0hfTUFTSwkweDAwMDAwMGZmCi0KLS8qIFRoZSBzZW5kIGFtb3VudHMgZm9yIHRoaXMgb25lIGFyZSB0aGUgc2FtZSBhcyB1c2VkIHdpdGggdGhlIGVtdTEwazEgKi8KLSNkZWZpbmUgQV9GWFJUMQkJCTB4N2UKLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxBCQkweDAwMDAwMDNmCi0jZGVmaW5lIEFfRlhSVF9DSEFOTkVMQgkJMHgwMDAwM2YwMAotI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEMJCTB4MDAzZjAwMDAKLSNkZWZpbmUgQV9GWFJUX0NIQU5ORUxECQkweDNmMDAwMDAwCi0KLQotLyogRWFjaCBGWCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaXMgMzIgYml0cyBpbiBsZW5ndGgsIGFsbCBiaXRzIGFyZSB1c2VkCQkJKi8KLSNkZWZpbmUgRlhHUFJFR0JBU0UJCTB4MTAwCQkvKiBGWCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGJhc2UgICAgICAgCSovCi0jZGVmaW5lIEFfRlhHUFJFR0JBU0UJCTB4NDAwCQkvKiBBdWRpZ3kgR1BScywgMHg0MDAgdG8gMHg1ZmYJCQkqLwotLyogVGFuayBhdWRpbyBkYXRhIGlzIGxvZ2FyaXRobWljYWxseSBjb21wcmVzc2VkIGRvd24gdG8gMTYgYml0cyBiZWZvcmUgd3JpdGluZyB0byBUUkFNIGFuZCBpcwkqLwotLyogZGVjb21wcmVzc2VkIGJhY2sgdG8gMjAgYml0cyBvbiBhIHJlYWQuICBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxNjAgbG9jYXRpb25zLCB0aGUgbGFzdCAzMgkqLwotLyogbG9jYXRpb25zIGFyZSBmb3IgZXh0ZXJuYWwgVFJBTS4gCQkJCQkJCQkqLwotI2RlZmluZSBUQU5LTUVNREFUQVJFR0JBU0UJMHgyMDAJCS8qIFRhbmsgbWVtb3J5IGRhdGEgcmVnaXN0ZXJzIGJhc2UgICAgIAkJKi8KLSNkZWZpbmUgVEFOS01FTURBVEFSRUdfTUFTSwkweDAwMGZmZmZmCS8qIDIwIGJpdCB0YW5rIGF1ZGlvIGRhdGEgZmllbGQJCQkqLwotCi0vKiBDb21iaW5lZCBhZGRyZXNzIGZpZWxkIGFuZCBtZW1vcnkgb3Bjb2RlIG9yIGZsYWcgZmllbGQuICAxNjAgbG9jYXRpb25zLCBsYXN0IDMyIGFyZSBleHRlcm5hbAkqLwotI2RlZmluZSBUQU5LTUVNQUREUlJFR0JBU0UJMHgzMDAJCS8qIFRhbmsgbWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXJzIGJhc2UJCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX0FERFJfTUFTSyAweDAwMGZmZmZmCS8qIDIwIGJpdCB0YW5rIGFkZHJlc3MgZmllbGQJCQkqLwotI2RlZmluZSBUQU5LTUVNQUREUlJFR19DTEVBUgkweDAwODAwMDAwCS8qIENsZWFyIHRhbmsgbWVtb3J5CQkJCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX0FMSUdOCTB4MDA0MDAwMDAJLyogQWxpZ24gcmVhZCBvciB3cml0ZSByZWxhdGl2ZSB0byB0YW5rIGFjY2VzcwkqLwotI2RlZmluZSBUQU5LTUVNQUREUlJFR19XUklURQkweDAwMjAwMDAwCS8qIFdyaXRlIHRvIHRhbmsgbWVtb3J5CQkJCSovCi0jZGVmaW5lIFRBTktNRU1BRERSUkVHX1JFQUQJMHgwMDEwMDAwMAkvKiBSZWFkIGZyb20gdGFuayBtZW1vcnkJCQkqLwotCi0jZGVmaW5lIE1JQ1JPQ09ERUJBU0UJCTB4NDAwCQkvKiBNaWNyb2NvZGUgZGF0YSBiYXNlIGFkZHJlc3MJCQkqLwotCi0vKiBFYWNoIERTUCBtaWNyb2NvZGUgaW5zdHJ1Y3Rpb24gaXMgbWFwcGVkIGludG8gMiBkb3VibGV3b3JkcyAJCQkJCSovCi0vKiBOT1RFOiBXaGVuIHdyaXRpbmcsIGFsd2F5cyB3cml0ZSB0aGUgTE8gZG91Ymxld29yZCBmaXJzdC4gIFJlYWRzIGNhbiBiZSBpbiBlaXRoZXIgb3JkZXIuCSovCi0jZGVmaW5lIExPV09SRF9PUFhfTUFTSwkJMHgwMDBmZmMwMAkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIFgJCQkqLwotI2RlZmluZSBMT1dPUkRfT1BZX01BU0sJCTB4MDAwMDAzZmYJLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBZCQkJKi8KLSNkZWZpbmUgSElXT1JEX09QQ09ERV9NQVNLCTB4MDBmMDAwMDAJLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlCQkJCSovCi0jZGVmaW5lIEhJV09SRF9SRVNVTFRfTUFTSwkweDAwMGZmYzAwCS8qIEluc3RydWN0aW9uIHJlc3VsdAkJCQkqLwotI2RlZmluZSBISVdPUkRfT1BBX01BU0sJCTB4MDAwMDAzZmYJLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBBCQkJKi8KLQotCi0vKiBBdWRpZ3kgU291bmRjYXJkIGhhdmUgYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24gZm9ybWF0ICovCi0jZGVmaW5lIEFVRElHWV9DT0RFQkFTRQkJMHg2MDAKLSNkZWZpbmUgQV9MT1dPUkRfT1BZX01BU0sJMHgwMDAwMDdmZgkJCi0jZGVmaW5lIEFfTE9XT1JEX09QWF9NQVNLCTB4MDA3ZmYwMDAKLSNkZWZpbmUgQV9ISVdPUkRfT1BDT0RFX01BU0sJMHgwZjAwMDAwMAotI2RlZmluZSBBX0hJV09SRF9SRVNVTFRfTUFTSwkweDAwN2ZmMDAwCi0jZGVmaW5lIEFfSElXT1JEX09QQV9NQVNLCTB4MDAwMDA3ZmYKLQotCi0jZW5kaWYgLyogXzgwMTBfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvTWFrZWZpbGUgYi9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhZjljYy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIENyZWF0aXZlIExhYnMgRU1VMTBLMSAKLSMKLSMgMTIgQXByIDIwMDAgUnVpIFNvdXNhCi0KLW9iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKSArPSBlbXUxMGsxLm8KLQotZW11MTBrMS1vYmpzIDo9IGF1ZGlvLm8gY2FyZG1pLm8gY2FyZG1vLm8gY2FyZHdpLm8gY2FyZHdvLm8gZWNhcmQubyBcCi0gICAgICAgICAgICAgICAgZWZ4bWdyLm8gZW11YWR4bWcubyBod2FjY2Vzcy5vIGlycW1nci5vIG1haW4ubyBtaWRpLm8gXAotICAgICAgICAgICAgICAgIG1peGVyLm8gcGFzc3Rocm91Z2gubyByZWNtZ3IubyB0aW1lci5vIHZvaWNlbWdyLm8KLQotaWZkZWYgREVCVUcKLSAgICBFWFRSQV9DRkxBR1MgKz0gLURFTVUxMEsxX0RFQlVHCi1lbmRpZgotCi1pZmRlZiBDT05GSUdfTUlESV9FTVUxMEsxCi0gICAgRVhUUkFfQ0ZMQUdTICs9IC1ERU1VMTBLMV9TRVFVRU5DRVIKLWVuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jIGIvc291bmQvb3NzL2VtdTEwazEvYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZWEyMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBhdWRpby5jIC0tIC9kZXYvZHNwIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5CSAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCB0eXBlcy9sZWFrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgImNhcmR3by5oIgotI2luY2x1ZGUgImNhcmR3aS5oIgotI2luY2x1ZGUgInJlY21nci5oIgotI2luY2x1ZGUgImlycW1nci5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVfb2ZyYWcoc3RydWN0IHdvaW5zdCAqKTsKLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9pZnJhZyhzdHJ1Y3Qgd2lpbnN0ICopOwotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3dhdmVvdXRfYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKTsKLXN0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZWluX2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSk7Ci0KLS8qIEF1ZGlvIGZpbGUgb3BlcmF0aW9ucyAqLwotc3RhdGljIHNzaXplX3QgZW11MTBrMV9hdWRpb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRCgzLCAiZW11MTBrMV9hdWRpb19yZWFkKCksIGJ1ZmZlcj0lcCwgY291bnQ9JWRcbiIsIGJ1ZmZlciwgKHUzMikgY291bnQpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAod2lpbnN0LT5tbWFwcGVkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWlmICh3aWluc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKSB7Ci0JCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOwotCi0JCXdoaWxlIChlbXUxMGsxX3dhdmVpbl9vcGVuKHdhdmVfZGV2KSA8IDApIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCQkJcmV0dXJuIC1FQUdBSU47Ci0KLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndhdmVfZGV2LT5jYXJkLT5vcGVuX3dhaXQpOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXUzMiBieXRlc3RvY29weTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKCEod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJICAgICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKQotCQkJZW11MTBrMV93YXZlaW5fc3RhcnQod2F2ZV9kZXYpOwotCi0JCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQkJZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUod2lpbnN0LCAmYnl0ZXN0b2NvcHkpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCURQRCgzLCAiYnl0ZXN0b2NvcHkgLS0+ICVkXG4iLCBieXRlc3RvY29weSk7Ci0KLQkJaWYgKChieXRlc3RvY29weSA+PSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQotCQkgICAgfHwgKGJ5dGVzdG9jb3B5ID49IGNvdW50KSkgewotCQkJaW50IHJjOwotCi0JCQlieXRlc3RvY29weSA9IG1pbl90KHUzMiwgYnl0ZXN0b2NvcHksIGNvdW50KTsKLQotCQkJcmMgPSBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YSh3aWluc3QsCi0JCQkJCQkgICAgICh1OCBfX3VzZXIgKilidWZmZXIsCi0JCQkJCQkgICAgICZieXRlc3RvY29weSk7Ci0JCQlpZiAocmMpCi0JCQkJcmV0dXJuIHJjOwotCi0JCQljb3VudCAtPSBieXRlc3RvY29weTsKLQkJCWJ1ZmZlciArPSBieXRlc3RvY29weTsKLQkJCXJldCArPSBieXRlc3RvY29weTsKLQkJfQotCi0JCWlmIChjb3VudCA+IDApIHsKLQkJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCQkgICAgfHwgKCEod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKSkpCi0JCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRUFHQUlOKTsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2lpbnN0LT53YWl0X3F1ZXVlKTsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTKTsKLQotCQl9Ci0JfQotCi0JRFBEKDMsICJieXRlcyBjb3BpZWQgLT4gJWRcbiIsICh1MzIpIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBlbXUxMGsxX2F1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzc2l6ZV90IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBEKDMsICJlbXUxMGsxX2F1ZGlvX3dyaXRlKCksIGJ1ZmZlcj0lcCwgY291bnQ9JWRcbiIsIGJ1ZmZlciwgKHUzMikgY291bnQpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh3b2luc3QtPm1tYXBwZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCS8vIFRoaXMgaXMgZm9yIGVtdTEwazEgcmV2cyBsZXNzIHRoYW4gNywgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRyYW0KLQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgewotCQlpbnQgcjsKLQkJCi0JCXdvaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IFBUX0JMT0NLU0laRV9MT0cyOwotCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9IFBUX0JMT0NLQ09VTlQ7Ci0JCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOwotCQkKLQkJciA9IGVtdTEwazFfcHRfd3JpdGUoZmlsZSwgYnVmZmVyLCBjb3VudCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlpZiAod29pbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgewotCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKLQotCQl3aGlsZSAoZW11MTBrMV93YXZlb3V0X29wZW4od2F2ZV9kZXYpIDwgMCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2F2ZV9kZXYtPmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCXJldCA9IDA7Ci0JaWYgKGNvdW50ICUgd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJzYW1wbGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQljb3VudCAvPSB3b2luc3QtPm51bV92b2ljZXM7Ci0KLQl3aGlsZSAoY291bnQgPiAwKSB7Ci0JCXUzMiBieXRlc3RvY29weTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJRFBEKDMsICJieXRlc3RvY29weSAtLT4gJWRcbiIsIGJ5dGVzdG9jb3B5KTsKLQotCQlpZiAoKGJ5dGVzdG9jb3B5ID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCi0JCSAgICB8fCAoYnl0ZXN0b2NvcHkgPj0gY291bnQpKSB7Ci0KLQkJCWJ5dGVzdG9jb3B5ID0gbWluX3QodTMyLCBieXRlc3RvY29weSwgY291bnQpOwotCi0JCQllbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEod29pbnN0LCAodTggX191c2VyICopIGJ1ZmZlciwgJmJ5dGVzdG9jb3B5KTsKLQotCQkJY291bnQgLT0gYnl0ZXN0b2NvcHk7Ci0JCQlidWZmZXIgKz0gYnl0ZXN0b2NvcHkgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQlyZXQgKz0gYnl0ZXN0b2NvcHkgKiB3b2luc3QtPm51bV92b2ljZXM7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCXdvaW5zdC0+dG90YWxfY29waWVkICs9IGJ5dGVzdG9jb3B5OwotCi0JCQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkJICAgICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQotCQkJICAgICYmICh3b2luc3QtPnRvdGFsX2NvcGllZCA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSkKLQkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWlmIChjb3VudCA+IDApIHsKLQkJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCQkgICAgfHwgKCEod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpKQotCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVBR0FJTik7Ci0KLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUyk7Ci0JCX0KLQl9Ci0KLQlEUEQoMywgImJ5dGVzIGNvcGllZCAtPiAlZFxuIiwgKHUzMikgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9hdWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gTlVMTDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSBOVUxMOwotCWludCB2YWwgPSAwOwotCXUzMiBieXRlc3RvY29weTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKLQotCURQRig0LCAiZW11MTBrMV9hdWRpb19pb2N0bCgpXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQl3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE9TU19HRVRWRVJTSU9OOgotCQlEUEYoMiwgIk9TU19HRVRWRVJTSU9OOlxuIik7Ci0JCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1JFU0VUOlxuIik7Ci0JCXdhdmVfZGV2LT5lbmFibGViaXRzID0gUENNX0VOQUJMRV9PVVRQVVQgfCBQQ01fRU5BQkxFX0lOUFVUOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7Ci0JCQl9Ci0KLQkJCXdvaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCQl3b2luc3QtPnRvdGFsX2NvcGllZCA9IDA7Ci0JCQl3b2luc3QtPnRvdGFsX3BsYXllZCA9IDA7Ci0JCQl3b2luc3QtPmJsb2NrcyA9IDA7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVpbl9jbG9zZSh3YXZlX2Rldik7Ci0JCQl9Ci0KLQkJCXdpaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCQl3aWluc3QtPnRvdGFsX3JlY29yZGVkID0gMDsKLQkJCXdpaW5zdC0+YmxvY2tzID0gMDsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU1lOQzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NZTkM6XG4iKTsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCi0JCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCi0JCQkJCXdoaWxlICgod29pbnN0LT50b3RhbF9wbGF5ZWQgPCB3b2luc3QtPnRvdGFsX2NvcGllZCkKLQkJCQkJICAgICAgICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3b2luc3QtPndhaXRfcXVldWUpOwotCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQl9Ci0JCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJd29pbnN0LT5tbWFwcGVkID0gMDsKLQkJCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKLQkJCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKLQkJCXdvaW5zdC0+YmxvY2tzID0gMDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKLQkJCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOwotCQkJd2lpbnN0LT5ibG9ja3MgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TRVREVVBMRVg6XG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX0dFVENBUFM6XG4iKTsKLQkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8Ci0JCQkJRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQIHwKLQkJCQlEU1BfQ0FQX0NPUFJPQ3wgRFNQX0NBUF9NVUxUSSwgcCk7Ci0JY2FzZSBTTkRDVExfRFNQX1NQRUVEOgotCQlEUEYoMiwgIlNORENUTF9EU1BfU1BFRUQ6XG4iKTsKLQotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURQRCgyLCAidmFsIGlzICVkXG4iLCB2YWwpOwotCi0JCWlmICh2YWwgPiAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7Ci0KLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKLQkJCQlmb3JtYXQuc2FtcGxpbmdyYXRlID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7Ci0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBzYW1wbGluZyByYXRlIC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LnNhbXBsaW5ncmF0ZSA9IHZhbDsKLQotCQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgc2FtcGxpbmcgcmF0ZSAtPiAlZFxuIiwgdmFsKTsKLQkJCX0KLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7Ci0JCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7Ci0KLQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NURVJFTzpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OwotCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsID8gMiA6IDE7Ci0KLQkJCWlmIChlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVscyAtIDE7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIHN0ZXJlbyAtPiAlZFxuIiwgdmFsKTsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKLQkJCWZvcm1hdC5jaGFubmVscyA9IHZhbCA/IDIgOiAxOwotCi0JCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzIC0gMTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCURQRCgyLCAic2V0IHBsYXliYWNrIHN0ZXJlbyAtPiAlZFxuIiwgdmFsKTsKLQkJfQotCi0JCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgotCQlEUEYoMiwgIlNORENUTF9EU1BfQ0hBTk5FTFM6XG4iKTsKLQotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURQRCgyLCAiIHZhbCBpcyAlZFxuIiwgdmFsKTsKLQotCQlpZiAodmFsID4gMCkgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7Ci0JCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHM7Ci0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlEUEQoMiwgInNldCByZWNvcmRpbmcgbnVtYmVyIG9mIGNoYW5uZWxzIC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHM7Ci0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBudW1iZXIgb2YgY2hhbm5lbHMgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQl9IGVsc2UgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHM7Ci0JCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX0dFVEZNVFM6XG4iKTsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXZhbCA9IEFGTVRfUzE2X0xFOwotCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJdmFsID0gQUZNVF9TMTZfTEUgfCBBRk1UX1U4OwotCQkJaWYgKGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmd2F2ZV9kZXYtPmNhcmQtPm1nciwKLQkJCQkJCSAgICAgd2F2ZV9kZXYtPmNhcmQtPnB0LnBhdGNoX25hbWUsIAotCQkJCQkJICAgICB3YXZlX2Rldi0+Y2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKSA+PSAwKQotCQkJCXZhbCB8PSBBRk1UX0FDMzsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNhbWUgYXMgU05EQ1RMX0RTUF9TQU1QTEVTSVpFICovCi0JCURQRigyLCAiU05EQ1RMX0RTUF9TRVRGTVQ6XG4iKTsKLQotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURQRCgyLCAiIHZhbCBpcyAlZFxuIiwgdmFsKTsKLQotCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKLQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OwotCQkJCWZvcm1hdC5pZCA9IHZhbDsKLQotCQkJCWlmIChlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuaWQ7Ci0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlEUEQoMiwgInNldCByZWNvcmRpbmcgZm9ybWF0IC0+ICVkXG4iLCB2YWwpOwotCQkJfQotCi0JCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OwotCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7Ci0JCQkJZm9ybWF0LmlkID0gdmFsOwotCi0JCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgewotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuaWQ7Ci0KLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBmb3JtYXQgLT4gJWRcbiIsIHZhbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCQl9IGVsc2UgewotCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuaWQ7Ci0JCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5pZDsKLQotCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbDsKLQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbDsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKLQkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHM7Ci0JCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHM7Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6Ci0JCURQRigyLCAiU09VTkRfUENNX1dSSVRFX0ZJTFRFUjogbm90IGltcGxlbWVudGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKLQkJRFBGKDIsICJTT1VORF9QQ01fUkVBRF9GSUxURVI6IG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVFNZTkNSTzogbm90IGltcGxlbWVudGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKLQkJRFBGKDIsICJTTkRDVExfRFNQX0dFVFRSSUdHRVI6XG4iKTsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpKQotCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKQotCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7Ci0KLQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NFVFRSSUdHRVI6XG4iKTsKLQotCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKLQkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyB8PSBQQ01fRU5BQkxFX09VVFBVVDsKLQkJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikKLQkJCQkJZW11MTBrMV93YXZlb3V0X3N0YXJ0KHdhdmVfZGV2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgJj0gflBDTV9FTkFCTEVfT1VUUFVUOwotCQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkJCQllbXUxMGsxX3dhdmVvdXRfc3RvcCh3YXZlX2Rldik7Ci0JCQl9Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKLQkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyB8PSBQQ01fRU5BQkxFX0lOUFVUOwotCQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQotCQkJCQllbXUxMGsxX3dhdmVpbl9zdGFydCh3YXZlX2Rldik7Ci0JCQl9IGVsc2UgewotCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzICY9IH5QQ01fRU5BQkxFX0lOUFVUOwotCQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQkJCQllbXUxMGsxX3dhdmVpbl9zdG9wKHdhdmVfZGV2KTsKLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgotCQl7Ci0JCQlhdWRpb19idWZfaW5mbyBpbmZvOwotCi0JCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT1NQQUNFOlxuIik7Ci0KLQkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgewotCQkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQkJCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCQkJCWluZm8uYnl0ZXMgPSBieXRlc3RvY29weTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0JCQkJaW5mby5ieXRlcyA9IHdvaW5zdC0+YnVmZmVyLnNpemU7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaW5mby5ieXRlcyAqPSB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQlpbmZvLmZyYWdzaXplID0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCWluZm8uZnJhZ3N0b3RhbCA9IHdvaW5zdC0+YnVmZmVyLm51bWZyYWdzICogd29pbnN0LT5udW1fdm9pY2VzOwotCQkJaW5mby5mcmFnbWVudHMgPSBpbmZvLmJ5dGVzIC8gaW5mby5mcmFnc2l6ZTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6Ci0JCXsKLQkJCWF1ZGlvX2J1Zl9pbmZvIGluZm87Ci0KLQkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6XG4iKTsKLQotCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOwotCQkJCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQkJCQlpbmZvLmJ5dGVzID0gYnl0ZXN0b2NvcHk7Ci0JCQl9IGVsc2UgewotCQkJCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOwotCQkJCWluZm8uYnl0ZXMgPSAwOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWluZm8uZnJhZ3N0b3RhbCA9IHdpaW5zdC0+YnVmZmVyLm51bWZyYWdzOwotCQkJaW5mby5mcmFnbWVudHMgPSBpbmZvLmJ5dGVzIC8gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQkJCWluZm8uZnJhZ3NpemUgPSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCi0JCQlpZiAoY29weV90b191c2VyKHAsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgotCQlEUEYoMiwgIlNORENUTF9EU1BfTk9OQkxPQ0s6XG4iKTsKLQotCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKLQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVE9ERUxBWTpcbiIpOwotCi0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKLQkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7Ci0JCQl2YWwgPSB3b2luc3QtPmJ1ZmZlci5zaXplIC0gYnl0ZXN0b2NvcHk7Ci0JCX0gZWxzZQotCQkJdmFsID0gMDsKLQotCQl2YWwgKj0gd29pbnN0LT5udW1fdm9pY2VzOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgotCQl7Ci0JCQljb3VudF9pbmZvIGNpbmZvOwotCi0JCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUSVBUUjogXG4iKTsKLQotCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7Ci0JCQkJY2luZm8ucHRyID0gd2lpbnN0LT5idWZmZXIuaHdfcG9zOwotCQkJCWNpbmZvLmJ5dGVzID0gY2luZm8ucHRyICsgd2lpbnN0LT50b3RhbF9yZWNvcmRlZCAtIHdpaW5zdC0+dG90YWxfcmVjb3JkZWQgJSB3aWluc3QtPmJ1ZmZlci5zaXplOwotCQkJCWNpbmZvLmJsb2NrcyA9IGNpbmZvLmJ5dGVzIC8gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSAtIHdpaW5zdC0+YmxvY2tzOwotCQkJCXdpaW5zdC0+YmxvY2tzID0gY2luZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCQkJfSBlbHNlIHsKLQkJCQljaW5mby5wdHIgPSAwOwotCQkJCWNpbmZvLmJ5dGVzID0gMDsKLQkJCQljaW5mby5ibG9ja3MgPSAwOwotCQkJfQotCi0JCQlpZiAod2lpbnN0LT5tbWFwcGVkKQotCQkJCXdpaW5zdC0+YnVmZmVyLmJ5dGVzdG9jb3B5ICU9IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoY29weV90b191c2VyKHAsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKLQkJewotCQkJY291bnRfaW5mbyBjaW5mbzsKLQotCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVE9QVFI6XG4iKTsKLQotCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOIHx8IAotCQkJICAgICgod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgJiYgd2F2ZV9kZXYtPmNhcmQtPnB0LnN0YXRlKSkgewotCQkJCWludCBudW1fZnJhZ21lbnRzOwotCi0JCQkJaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDEpIHsKLQkJCQkJZW11MTBrMV9wdF93YXZlb3V0X3VwZGF0ZSh3YXZlX2Rldik7Ci0JCQkJCWNpbmZvLmJ5dGVzID0gd29pbnN0LT50b3RhbF9wbGF5ZWQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOwotCQkJCQljaW5mby5ieXRlcyA9IHdvaW5zdC0+dG90YWxfcGxheWVkOwotCQkJCX0KLQotCQkJCWNpbmZvLnB0ciA9IHdvaW5zdC0+YnVmZmVyLmh3X3BvczsKLQkJCQludW1fZnJhZ21lbnRzID0gY2luZm8uYnl0ZXMgLyB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOwotCQkJCWNpbmZvLmJsb2NrcyA9IG51bV9mcmFnbWVudHMgLSB3b2luc3QtPmJsb2NrczsKLQkJCQl3b2luc3QtPmJsb2NrcyA9IG51bV9mcmFnbWVudHM7Ci0KLQkJCQljaW5mby5ieXRlcyAqPSB3b2luc3QtPm51bV92b2ljZXM7Ci0JCQkJY2luZm8ucHRyICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKLQkJCX0gZWxzZSB7Ci0JCQkJY2luZm8ucHRyID0gMDsKLQkJCQljaW5mby5ieXRlcyA9IDA7Ci0JCQkJY2luZm8uYmxvY2tzID0gMDsKLQkJCX0KLQotCQkJaWYgKHdvaW5zdC0+bW1hcHBlZCkKLQkJCQl3b2luc3QtPmJ1ZmZlci5mcmVlX2J5dGVzICU9IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoY29weV90b191c2VyKHAsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKLQkJRFBGKDIsICJTTkRDVExfRFNQX0dFVEJMS1NJWkU6XG4iKTsKLQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7Ci0JCQl2YWwgPSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICogd29pbnN0LT5udW1fdm9pY2VzOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOwotCQkJdmFsID0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkJaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKLQkJCSAgICAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkKLQkJCSAgICAmJiAod29pbnN0LT50b3RhbF9jb3BpZWQgPiAwKSkKLQkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKLQkJRFBGKDIsICJTTkRDVExfRFNQX1NVQkRJVklERTogbm90IGltcGxlbWVudGVkXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6Ci0JCURQRigyLCAiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDpcbiIpOwotCi0JCWlmIChnZXRfdXNlcih2YWwsIHApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJRFBEKDIsICJ2YWwgaXMgJSN4XG4iLCB2YWwpOwotCi0JCWlmICh2YWwgPT0gMCkKLQkJCXJldHVybiAtRUlPOwotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJLyogZGlnaXRhbCBwYXNzLXRocm91Z2ggZnJhZ21lbnQgY291bnQgYW5kIHNpemUgYXJlIGZpeGVkIHZhbHVlcyAqLwotCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4gfHwgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDEpKQotCQkJCXJldHVybiAtRUlOVkFMOwkvKiB0b28gbGF0ZSB0byBjaGFuZ2UgKi8KLQotCQkJd29pbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwotCQkJd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKLQkJfQotCi0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikKLQkJCQlyZXR1cm4gLUVJTlZBTDsJLyogdG9vIGxhdGUgdG8gY2hhbmdlICovCi0KLQkJCXdpaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKLQkJCXdpaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgU05EQ1RMX0NPUFJfTE9BRDoKLQkJewotCQkJY29wcl9idWZmZXIgKmJ1ZjsKLQkJCXUzMiBpOwotCi0JCQlEUEYoNCwgIlNORENUTF9DT1BSX0xPQUQ6XG4iKTsKLQotCQkJYnVmID0ga21hbGxvYyhzaXplb2YoY29wcl9idWZmZXIpLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghYnVmKQotCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBwLCBzaXplb2YoY29wcl9idWZmZXIpKSkgewotCQkJCWtmcmVlIChidWYpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCi0JCQlpZiAoKGJ1Zi0+Y29tbWFuZCAhPSBDTURfUkVBRCkgJiYgKGJ1Zi0+Y29tbWFuZCAhPSBDTURfV1JJVEUpKSB7Ci0JCQkJa2ZyZWUgKGJ1Zik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWlmIChidWYtPmNvbW1hbmQgPT0gQ01EX1dSSVRFKSB7Ci0JCQkJCi0jaWZkZWYgREJHRU1VCi0JCQkJaWYgKChidWYtPm9mZnMgPCAwKSB8fCAoYnVmLT5vZmZzICsgYnVmLT5sZW4gPiAweGUwMCkgfHwgKGJ1Zi0+bGVuID4gMTAwMCkpIHsKLSNlbHNlCi0JCQkJaWYgKCgoYnVmLT5vZmZzIDwgMHgxMDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+ICh3YXZlX2Rldi0+Y2FyZC0+aXNfYXVkaWd5ID8gMHhlMDAgOiAweDgwMCkpIHx8IChidWYtPmxlbiA+IDEwMDApCi0JCQkJKSAmJiAhKAotCQkJCQkvL2FueSByZWdpc3RlciBhbGxvd2VkIHJhdyBhY2Nlc3MgdG8gdXNlcnMgZ29lcyBoZXJlOgotCQkJCQkoYnVmLT5vZmZzID09IERCRyB8fAotCQkJCQkgIGJ1Zi0+b2ZmcyA9PSBBX0RCRykKLQkJCQkJJiYgKGJ1Zi0+bGVuID09IDEpKSkgewotI2VuZGlmCQkKLQkJCQkJa2ZyZWUoYnVmKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKGJ1Zi0+b2ZmcyA8IDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+IDB4ZTAwKSB8fCAoYnVmLT5sZW4gPiAxMDAwKSkgewotCQkJCQlrZnJlZShidWYpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQl9CQkJCi0JCQkJCi0JCQlpZiAoKCh1bnNpZ25lZClidWYtPmZsYWdzKSA+IDB4M2YpCi0JCQkJYnVmLT5mbGFncyA9IDA7Ci0KLQkJCWlmIChidWYtPmNvbW1hbmQgPT0gQ01EX1JFQUQpIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5sZW47IGkrKykKLQkJCQkJKCh1MzIgKikgYnVmLT5kYXRhKVtpXSA9IHNibGl2ZV9yZWFkcHRyKHdhdmVfZGV2LT5jYXJkLCBidWYtPm9mZnMgKyBpLCBidWYtPmZsYWdzKTsKLQotCQkJCWlmIChjb3B5X3RvX3VzZXIocCwgYnVmLCBzaXplb2YoY29wcl9idWZmZXIpKSkgewotCQkJCQlrZnJlZShidWYpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKQotCQkJCQlzYmxpdmVfd3JpdGVwdHIod2F2ZV9kZXYtPmNhcmQsIGJ1Zi0+b2ZmcyArIGksIGJ1Zi0+ZmxhZ3MsICgodTMyICopIGJ1Zi0+ZGF0YSlbaV0pOwotCQkJfQotCi0JCQlrZnJlZSAoYnVmKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQlkZWZhdWx0OgkJLyogRGVmYXVsdCBpcyB1bnJlY29nbml6ZWQgY29tbWFuZCAqLwotCQlEUEQoMiwgImRlZmF1bHQ6ICUjeFxuIiwgY21kKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmVtdTEwazFfbW1fbm9wYWdlIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQotewotCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXN0cnVjdCBwYWdlICpkbWFwYWdlOwotCXVuc2lnbmVkIGxvbmcgcGdvZmY7Ci0JaW50IHJkLCB3cjsKLQotCURQRigzLCAiZW11MTBrMV9tbV9ub3BhZ2UoKVxuIik7Ci0JRFBEKDMsICJhZGRyOiAlI2x4XG4iLCBhZGRyZXNzKTsKLQotCWlmIChhZGRyZXNzID4gdm1hLT52bV9lbmQpIHsKLQkJRFBGKDEsICJFWElULCByZXR1cm5pbmcgTk9QQUdFX1NJR0JVU1xuIik7Ci0JCXJldHVybiBOT1BBR0VfU0lHQlVTOyAvKiBEaXNhbGxvdyBtcmVtYXAgKi8KLQl9Ci0KLQlwZ29mZiA9IHZtYS0+dm1fcGdvZmYgKyAoKGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKTsKLQlpZiAod29pbnN0ICE9IE5VTEwpCi0JCXdyID0gd29pbnN0LT5tbWFwcGVkOwotCWVsc2UKLQkJd3IgPSAwOwotCi0JaWYgKHdpaW5zdCAhPSBOVUxMKQotCQlyZCA9IHdpaW5zdC0+bW1hcHBlZDsKLQllbHNlCi0JCXJkID0gMDsKLQotCS8qIGlmIGZ1bGwtZHVwbGV4IChyZWFkK3dyaXRlKSBhbmQgd2UgaGF2ZSB0d28gc2V0cyBvZiBidWZzLAotCSogdGhlbiB0aGUgcGxheWJhY2sgYnVmZmVycyBjb21lIGZpcnN0LCBzZXogc291bmRjYXJkLmMgKi8KLQlpZiAod3IpIHsKLQkJaWYgKHBnb2ZmID49IHdvaW5zdC0+YnVmZmVyLnBhZ2VzKSB7Ci0JCQlwZ29mZiAtPSB3b2luc3QtPmJ1ZmZlci5wYWdlczsKLQkJCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKCh1OCAqKSB3aWluc3QtPmJ1ZmZlci5hZGRyICsgcGdvZmYgKiBQQUdFX1NJWkUpOwotCQl9IGVsc2UKLQkJCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKHdvaW5zdC0+dm9pY2VbMF0ubWVtLmFkZHJbcGdvZmZdKTsKLQl9IGVsc2UgewotCQlkbWFwYWdlID0gdmlydF90b19wYWdlICgodTggKikgd2lpbnN0LT5idWZmZXIuYWRkciArIHBnb2ZmICogUEFHRV9TSVpFKTsKLQl9Ci0KLQlnZXRfcGFnZSAoZG1hcGFnZSk7Ci0KLQlEUEQoMywgInBhZ2U6ICUjbHhcbiIsICh1bnNpZ25lZCBsb25nKSBkbWFwYWdlKTsKLQlpZiAodHlwZSkKLQkJKnR5cGUgPSBWTV9GQVVMVF9NSU5PUjsKLQlyZXR1cm4gZG1hcGFnZTsKLX0KLQotc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBlbXUxMGsxX21tX29wcyA9IHsKLQkubm9wYWdlICAgICAgICAgPSBlbXUxMGsxX21tX25vcGFnZSwKLX07Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9hdWRpb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIG1heF9wYWdlcywgbl9wYWdlcywgcGdvZmZzZXQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gTlVMTDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfYXVkaW9fbW1hcCgpXG4iKTsKLQotCW1heF9wYWdlcyA9IDA7Ci0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgewotCQl3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBObyBtJ21hcHBpbmcgcG9zc2libGUgZm9yIG11bHRpY2hhbm5lbCAqLwotCQlpZiAod29pbnN0LT5udW1fdm9pY2VzID4gMSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKHdvaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKLQkJCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOwotCi0JCQlpZiAoZW11MTBrMV93YXZlb3V0X29wZW4od2F2ZV9kZXYpIDwgMCkgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCQkJCUVSUk9SKCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0KLQotCQl3b2luc3QtPm1tYXBwZWQgPSAxOwotCQltYXhfcGFnZXMgKz0gd29pbnN0LT5idWZmZXIucGFnZXM7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgewotCQl3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKLQkJCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOwotCi0JCQlpZiAoZW11MTBrMV93YXZlaW5fb3Blbih3YXZlX2RldikgPCAwKSB7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJRVJST1IoKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCi0JCXdpaW5zdC0+bW1hcHBlZCA9IDE7Ci0JCW1heF9wYWdlcyArPSB3aWluc3QtPmJ1ZmZlci5wYWdlczsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0Jbl9wYWdlcyA9ICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JcGdvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmOwotCi0JRFBEKDIsICJ2bWFfc3RhcnQ6ICUjbHgsIHZtYV9lbmQ6ICUjbHgsIHZtYV9vZmZzZXQ6ICVsZFxuIiwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHBnb2Zmc2V0KTsKLQlEUEQoMiwgIm5fcGFnZXM6ICVsZCwgbWF4X3BhZ2VzOiAlbGRcbiIsIG5fcGFnZXMsIG1heF9wYWdlcyk7Ci0KLQlpZiAocGdvZmZzZXQgKyBuX3BhZ2VzID4gbWF4X3BhZ2VzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7Ci0Jdm1hLT52bV9vcHMgPSAmZW11MTBrMV9tbV9vcHM7Ci0Jdm1hLT52bV9wcml2YXRlX2RhdGEgPSB3YXZlX2RldjsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldjsKLQotCURQRigyLCAiZW11MTBrMV9hdWRpb19vcGVuKClcbiIpOwotCi0JLyogQ2hlY2sgZm9yIGNvcnJlY3QgZGV2aWNlIHRvIG9wZW4gKi8KLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZlbXUxMGsxX2RldnMpIHsKLQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXUxMGsxX2NhcmQsIGxpc3QpOwotCi0JCWlmICghKChjYXJkLT5hdWRpb19kZXYgXiBtaW5vcikgJiB+MHhmKSB8fCAhKChjYXJkLT5hdWRpb19kZXYxIF4gbWlub3IpICYgfjB4ZikpCi0JCQlnb3RvIG1hdGNoOwotCX0KLQotCXJldHVybiAtRU5PREVWOwotCi1tYXRjaDoKLQotCXdhdmVfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSksIEdGUF9LRVJORUwpOwotCi0JaWYgKHdhdmVfZGV2ID09IE5VTEwpIHsgCi0JCUVSUk9SKCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXdhdmVfZGV2LT5jYXJkID0gY2FyZDsKLQl3YXZlX2Rldi0+d2lpbnN0ID0gTlVMTDsKLQl3YXZlX2Rldi0+d29pbnN0ID0gTlVMTDsKLQl3YXZlX2Rldi0+ZW5hYmxlYml0cyA9IFBDTV9FTkFCTEVfT1VUUFVUIHwgUENNX0VOQUJMRV9JTlBVVDsJLyogRGVmYXVsdCAqLwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJLyogUmVjb3JkaW5nICovCi0JCXN0cnVjdCB3aWluc3QgKndpaW5zdDsKLQotCQlpZiAoKHdpaW5zdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3aWluc3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQkJRVJST1IoKTsKLQkJCWtmcmVlKHdhdmVfZGV2KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJd2lpbnN0LT5yZWNzcmMgPSBjYXJkLT53YXZlaW4ucmVjc3JjOwotICAgICAgICAgICAgICAgIHdpaW5zdC0+Znh3YyA9IGNhcmQtPndhdmVpbi5meHdjOwotCi0JCXN3aXRjaCAod2lpbnN0LT5yZWNzcmMpIHsKLQkJY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0JCQl3aWluc3QtPmZvcm1hdC5pZCA9IEFGTVRfUzE2X0xFOwotCQkJd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlID0gODAwMDsKLQkJCXdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQl3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBXQVZFUkVDT1JEX01JQzoKLQkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7Ci0JCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOwotCQkJd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCXdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCQl3aWluc3QtPmZvcm1hdC5pZCA9IEFGTVRfUzE2X0xFOwotCQkJd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlID0gNDgwMDA7Ci0JCQl3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSBod2VpZ2h0MzIod2lpbnN0LT5meHdjKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJa2ZyZWUod2F2ZV9kZXYpOwotCQkJa2ZyZWUod2lpbnN0KTsKLQkJCUJVRygpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQl3aWluc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7Ci0KLQkJd2lpbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gMDsKLQkJd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSA9IDA7Ci0JCXdpaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gMDsKLQotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3aWluc3QtPndhaXRfcXVldWUpOwotCi0JCXdpaW5zdC0+bW1hcHBlZCA9IDA7Ci0JCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOwotCQl3aWluc3QtPmJsb2NrcyA9IDA7Ci0JCXNwaW5fbG9ja19pbml0KCZ3aWluc3QtPmxvY2spOwotCQl0YXNrbGV0X2luaXQoJndpaW5zdC0+dGltZXIudGFza2xldCwgZW11MTBrMV93YXZlaW5fYmgsICh1bnNpZ25lZCBsb25nKSB3YXZlX2Rldik7Ci0JCXdhdmVfZGV2LT53aWluc3QgPSB3aWluc3Q7Ci0JCWVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJndpaW5zdC0+Zm9ybWF0KTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RydWN0IHdvaW5zdCAqd29pbnN0OwotCQlpbnQgaTsKLQotCQlpZiAoKHdvaW5zdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b2luc3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQkJRVJST1IoKTsKLQkJCWtmcmVlKHdhdmVfZGV2KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJaWYgKHdhdmVfZGV2LT53aWluc3QgIT0gTlVMTCkgewotCQkJd29pbnN0LT5mb3JtYXQgPSB3YXZlX2Rldi0+d2lpbnN0LT5mb3JtYXQ7Ci0JCX0gZWxzZSB7Ci0JCQl3b2luc3QtPmZvcm1hdC5pZCA9IEFGTVRfVTg7Ci0JCQl3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOwotCQkJd29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSA4OwotCQkJd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSAxOwotCQl9Ci0KLQkJd29pbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOwotCi0JCXdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgPSAwOwotCQl3b2luc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSAwOwotCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9IDA7Ci0JCXdvaW5zdC0+ZGV2aWNlID0gKGNhcmQtPmF1ZGlvX2RldjEgPT0gbWlub3IpOwotCQl3b2luc3QtPnRpbWVyLnN0YXRlID0gVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQ7Ci0JCXdvaW5zdC0+bnVtX3ZvaWNlcyA9IDE7Ci0JCWZvciAoaSA9IDA7IGkgPCBXQVZFT1VUX01BWFZPSUNFUzsgaSsrKSB7Ci0JCQl3b2luc3QtPnZvaWNlW2ldLnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQkJCXdvaW5zdC0+dm9pY2VbaV0ubWVtLmVtdXBhZ2VpbmRleCA9IC0xOwotCQl9Ci0KLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmd29pbnN0LT53YWl0X3F1ZXVlKTsKLQotCQl3b2luc3QtPm1tYXBwZWQgPSAwOwotCQl3b2luc3QtPnRvdGFsX2NvcGllZCA9IDA7Ci0JCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKLQkJd29pbnN0LT5ibG9ja3MgPSAwOwotCQlzcGluX2xvY2tfaW5pdCgmd29pbnN0LT5sb2NrKTsKLQkJdGFza2xldF9pbml0KCZ3b2luc3QtPnRpbWVyLnRhc2tsZXQsIGVtdTEwazFfd2F2ZW91dF9iaCwgKHVuc2lnbmVkIGxvbmcpIHdhdmVfZGV2KTsKLQkJd2F2ZV9kZXYtPndvaW5zdCA9IHdvaW5zdDsKLQkJZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJndvaW5zdC0+Zm9ybWF0KTsKLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSB3YXZlX2RldjsKLQotCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCi0JRFBGKDIsICJlbXUxMGsxX2F1ZGlvX3JlbGVhc2UoKVxuIik7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCWlmKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoPT0yKQotCQkJY2FyZC0+cHQuc3RhdGU9UFRfU1RBVEVfUExBWUlORzsKLQkJaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoICYmIGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKXsKLQkJCXNwaW5fbG9jaygmY2FyZC0+cHQubG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbXUxMGsxX3B0X3N0b3AoY2FyZCk7Ci0JCQlzcGluX3VubG9jaygmY2FyZC0+cHQubG9jayk7Ci0JCX0KLQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKLQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSB7Ci0JCQkJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7Ci0JCQkJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkKLQkJCQkJICAgICAgICYmICh3b2luc3QtPnRvdGFsX3BsYXllZCA8IHdvaW5zdC0+dG90YWxfY29waWVkKSkgewotCQkJCQkJRFBGKDQsICJCdWZmZXIgaGFzbid0IGJlZW4gdG90YWxseSBwbGF5ZWQsIHNsZWVwLi4uLlxuIik7Ci0JCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7Ci0JCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCS8qIHJlbW92ZSB0aGUgdGFza2xldCAqLwotCQl0YXNrbGV0X2tpbGwoJndvaW5zdC0+dGltZXIudGFza2xldCk7Ci0JCWtmcmVlKHdhdmVfZGV2LT53b2luc3QpOwotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQllbXUxMGsxX3dhdmVpbl9jbG9zZSh3YXZlX2Rldik7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJdGFza2xldF9raWxsKCZ3aWluc3QtPnRpbWVyLnRhc2tsZXQpOwotCQlrZnJlZSh3YXZlX2Rldi0+d2lpbnN0KTsKLQl9Ci0KLQlrZnJlZSh3YXZlX2Rldik7Ci0KLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmY2FyZC0+b3Blbl93YWl0KSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5vcGVuX3dhaXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZJWE1FIHNvcnQgb3V0IHBvbGwoKSArIG1tYXAoKSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMGsxX2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCXUzMiBieXRlc3RvY29weTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDQsICJlbXUxMGsxX2F1ZGlvX3BvbGwoKVxuIik7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCXBvbGxfd2FpdChmaWxlLCAmd29pbnN0LT53YWl0X3F1ZXVlLCB3YWl0KTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQlwb2xsX3dhaXQoZmlsZSwgJndpaW5zdC0+d2FpdF9xdWV1ZSwgd2FpdCk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOwotCi0JCQlpZiAoYnl0ZXN0b2NvcHkgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKLQkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCQl9IGVsc2UKLQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7Ci0JCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7Ci0JCQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7Ci0KLQkJCWlmIChieXRlc3RvY29weSA+PSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQotCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQkJfQotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVfb2ZyYWcoc3RydWN0IHdvaW5zdCAqd29pbnN0KQotewotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOwotCXUzMiBmcmFnc2l6ZTsKLQotCWlmIChidWZmZXItPmZyYWdtZW50X3NpemUpCi0JCXJldHVybjsKLQotCWlmICghYnVmZmVyLT5vc3NmcmFnc2hpZnQpIHsKLQkJZnJhZ3NpemUgPSAod29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSAqIHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIFdBVkVPVVRfREVGQVVMVEZSQUdMRU4pIC8gMTAwMCAtIDE7Ci0KLQkJd2hpbGUgKGZyYWdzaXplKSB7Ci0JCQlmcmFnc2l6ZSA+Pj0gMTsKLQkJCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0Kys7Ci0JCX0KLQl9Ci0KLQlpZiAoYnVmZmVyLT5vc3NmcmFnc2hpZnQgPCBXQVZFT1VUX01JTkZSQUdTSElGVCkKLQkJYnVmZmVyLT5vc3NmcmFnc2hpZnQgPSBXQVZFT1VUX01JTkZSQUdTSElGVDsKLQotCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA9IDEgPDwgYnVmZmVyLT5vc3NmcmFnc2hpZnQ7Ci0KLQl3aGlsZSAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogV0FWRU9VVF9NSU5GUkFHUyA+IFdBVkVPVVRfTUFYQlVGU0laRSkKLQkJYnVmZmVyLT5mcmFnbWVudF9zaXplID4+PSAxOwotCi0JLyogbm93IHdlIGFyZSBzdXJlIHRoYXQ6Ci0JICgyXldBVkVPVVRfTUlORlJBR1NISUZUKSA8PSAoZnJhZ21lbnRfc2l6ZSA9IDJebikgPD0gKFdBVkVPVVRfTUFYQlVGU0laRSAvIFdBVkVPVVRfTUlORlJBR1MpCi0JKi8KLQotCWlmICghYnVmZmVyLT5udW1mcmFncykgewotCQl1MzIgbnVtZnJhZ3M7Ci0KLQkJbnVtZnJhZ3MgPSAod29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSAqIHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIFdBVkVPVVRfREVGQVVMVEJVRkxFTikgLwotCQkJICAgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIDEwMDApIC0gMTsKLQotCQlidWZmZXItPm51bWZyYWdzID0gMTsKLQotCQl3aGlsZSAobnVtZnJhZ3MpIHsKLQkJCW51bWZyYWdzID4+PSAxOwotCQkJYnVmZmVyLT5udW1mcmFncyA8PD0gMTsKLQkJfQotCX0KLQotCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRU9VVF9NSU5GUkFHUykKLQkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVPVVRfTUlORlJBR1M7Ci0KLQlpZiAoYnVmZmVyLT5udW1mcmFncyAqIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+IFdBVkVPVVRfTUFYQlVGU0laRSkKLQkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVPVVRfTUFYQlVGU0laRSAvIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZTsKLQotCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRU9VVF9NSU5GUkFHUykKLQkJQlVHKCk7Ci0KLQlidWZmZXItPnNpemUgPSBidWZmZXItPmZyYWdtZW50X3NpemUgKiBidWZmZXItPm51bWZyYWdzOwotCWJ1ZmZlci0+cGFnZXMgPSBidWZmZXItPnNpemUgLyBQQUdFX1NJWkUgKyAoKGJ1ZmZlci0+c2l6ZSAlIFBBR0VfU0laRSkgPyAxIDogMCk7Ci0KLQlEUEQoMiwgIiBjYWxjdWxhdGVkIHBsYXliYWNrIGZyYWdtZW50X3NpemUgLT4gJWRcbiIsIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSk7Ci0JRFBEKDIsICIgY2FsY3VsYXRlZCBwbGF5YmFjayBudW1mcmFncyAtPiAlZFxuIiwgYnVmZmVyLT5udW1mcmFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9pZnJhZyhzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpCi17Ci0Jc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKLQl1MzIgZnJhZ3NpemUsIGJ1ZnNpemUsIHNpemVbNF07Ci0JaW50IGksIGo7Ci0KLQlpZiAoYnVmZmVyLT5mcmFnbWVudF9zaXplKQotCQlyZXR1cm47Ci0KLQlpZiAoIWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0KSB7Ci0JCWZyYWdzaXplID0gKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjICogV0FWRUlOX0RFRkFVTFRGUkFHTEVOKSAvIDEwMDAgLSAxOwotCi0JCXdoaWxlIChmcmFnc2l6ZSkgewotCQkJZnJhZ3NpemUgPj49IDE7Ci0JCQlidWZmZXItPm9zc2ZyYWdzaGlmdCsrOwotCQl9Ci0JfQotCi0JaWYgKGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0IDwgV0FWRUlOX01JTkZSQUdTSElGVCkKLQkJYnVmZmVyLT5vc3NmcmFnc2hpZnQgPSBXQVZFSU5fTUlORlJBR1NISUZUOwotCi0JYnVmZmVyLT5mcmFnbWVudF9zaXplID0gMSA8PCBidWZmZXItPm9zc2ZyYWdzaGlmdDsKLQotCXdoaWxlIChidWZmZXItPmZyYWdtZW50X3NpemUgKiBXQVZFSU5fTUlORlJBR1MgPiBXQVZFSU5fTUFYQlVGU0laRSkKLQkJYnVmZmVyLT5mcmFnbWVudF9zaXplID4+PSAxOwotCi0JLyogbm93IHdlIGFyZSBzdXJlIHRoYXQ6Ci0JICAgKDJeV0FWRUlOX01JTkZSQUdTSElGVCkgPD0gKGZyYWdtZW50X3NpemUgPSAyXm4pIDw9IChXQVZFSU5fTUFYQlVGU0laRSAvIFdBVkVJTl9NSU5GUkFHUykKLSAgICAgICAgKi8KLQotCi0JaWYgKCFidWZmZXItPm51bWZyYWdzKQotCQlidWZmZXItPm51bWZyYWdzID0gKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjICogV0FWRUlOX0RFRkFVTFRCVUZMRU4pIC8gKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIDEwMDApIC0gMTsKLQotCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRUlOX01JTkZSQUdTKQotCQlidWZmZXItPm51bWZyYWdzID0gV0FWRUlOX01JTkZSQUdTOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgKiBidWZmZXItPmZyYWdtZW50X3NpemUgPiBXQVZFSU5fTUFYQlVGU0laRSkKLQkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVJTl9NQVhCVUZTSVpFIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOwotCi0JaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFSU5fTUlORlJBR1MpCi0JCUJVRygpOwotCi0JYnVmc2l6ZSA9IGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIGJ1ZmZlci0+bnVtZnJhZ3M7Ci0KLQkvKiB0aGUgYnVmZmVyIHNpemUgZm9yIHJlY29yZGluZyBpcyByZXN0cmljdGVkIHRvIGNlcnRhaW4gdmFsdWVzLCBhZGp1c3QgaXQgbm93ICovCi0JaWYgKGJ1ZnNpemUgPj0gMHgxMDAwMCkgewotCQlidWZmZXItPnNpemUgPSAweDEwMDAwOwotCQlidWZmZXItPnNpemVyZWd2YWwgPSAweDFmOwotCX0gZWxzZSB7Ci0JCWJ1ZmZlci0+c2l6ZSA9IDA7Ci0JCXNpemVbMF0gPSAzODQ7Ci0JCXNpemVbMV0gPSA0NDg7Ci0JCXNpemVbMl0gPSA1MTI7Ci0JCXNpemVbM10gPSA2NDA7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0JCQkJaWYgKGJ1ZnNpemUgPj0gc2l6ZVtqXSkgewotCQkJCQlidWZmZXItPnNpemUgPSBzaXplW2pdOwotCQkJCQlzaXplW2pdICo9IDI7Ci0JCQkJCWJ1ZmZlci0+c2l6ZXJlZ3ZhbCA9IGkgKiA0ICsgaiArIDE7Ci0JCQkJfSBlbHNlCi0JCQkJCWdvdG8gZXhpdGxvb3A7Ci0JICAgICAgZXhpdGxvb3A6Ci0JCWlmIChidWZmZXItPnNpemUgPT0gMCkgewotCQkJYnVmZmVyLT5zaXplID0gMzg0OwotCQkJYnVmZmVyLT5zaXplcmVndmFsID0gMHgwMTsKLQkJfQotCX0KLQotCS8qIGFkanVzdCB0aGUgZnJhZ21lbnQgc2l6ZSBzbyB0aGF0IGJ1ZmZlciBzaXplIGlzIGFuIGludGVnZXIgbXVsdGlwbGUgKi8KLQl3aGlsZSAoYnVmZmVyLT5zaXplICUgYnVmZmVyLT5mcmFnbWVudF9zaXplKQotCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7Ci0KLQlidWZmZXItPm51bWZyYWdzID0gYnVmZmVyLT5zaXplIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOwotCWJ1ZmZlci0+cGFnZXMgPSAgYnVmZmVyLT5zaXplIC8gUEFHRV9TSVpFICsgKChidWZmZXItPnNpemUgJSBQQUdFX1NJWkUpID8gMSA6IDApOwotCi0JRFBEKDIsICIgY2FsY3VsYXRlZCByZWNvcmRpbmcgZnJhZ21lbnRfc2l6ZSAtPiAlZFxuIiwgYnVmZmVyLT5mcmFnbWVudF9zaXplKTsKLQlEUEQoMiwgIiBjYWxjdWxhdGVkIHJlY29yZGluZyBudW1mcmFncyAtPiAlZFxuIiwgYnVmZmVyLT5udW1mcmFncyk7Ci0JRFBEKDIsICIgYnVmZmVyIHNpemUgcmVnaXN0ZXIgLT4gJSMwNHhcbiIsIGJ1ZmZlci0+c2l6ZXJlZ3ZhbCk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZWluX2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIHJlZmRhdGE7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQl1MzIgYnl0ZXN0b2NvcHk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghd2lpbnN0KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKLQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChieXRlc3RvY29weSA+PSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSB7Ci0JIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmd2lpbnN0LT53YWl0X3F1ZXVlKSkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd2lpbnN0LT53YWl0X3F1ZXVlKTsKLQl9IGVsc2UKLQkJRFBEKDMsICJOb3QgZW5vdWdoIHRyYW5zZmVyIHNpemUsICVkXG4iLCBieXRlc3RvY29weSk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSByZWZkYXRhOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0JdTMyIGJ5dGVzdG9jb3B5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXdvaW5zdCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0JZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKLQotCWlmICh3b2luc3QtPmJ1ZmZlci5maWxsX3NpbGVuY2UpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0JCWVtdTEwazFfd2F2ZW91dF9maWxsc2lsZW5jZSh3b2luc3QpOwotCX0gZWxzZQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChieXRlc3RvY29weSA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSB7Ci0JCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3b2luc3QtPndhaXRfcXVldWUpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3b2luc3QtPndhaXRfcXVldWUpOwotCX0gZWxzZQotCQlEUEQoMywgIk5vdCBlbm91Z2ggdHJhbnNmZXIgc2l6ZSAtPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOwotCi0JcmV0dXJuOwotfQotCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfYXVkaW9fZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWQJCT0gZW11MTBrMV9hdWRpb19yZWFkLAotCS53cml0ZQkJPSBlbXUxMGsxX2F1ZGlvX3dyaXRlLAotCS5wb2xsCQk9IGVtdTEwazFfYXVkaW9fcG9sbCwKLQkuaW9jdGwJCT0gZW11MTBrMV9hdWRpb19pb2N0bCwKLQkubW1hcAkJPSBlbXUxMGsxX2F1ZGlvX21tYXAsCi0JLm9wZW4JCT0gZW11MTBrMV9hdWRpb19vcGVuLAotCS5yZWxlYXNlCT0gZW11MTBrMV9hdWRpb19yZWxlYXNlLAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmggYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVlODFiLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBhdWRpby5jIC0tIC9kZXYvZHNwIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5CSAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCB0eXBlcy9sZWFrcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfQVVESU9fSAotI2RlZmluZSBfQVVESU9fSAotCi1zdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlCi17Ci0gICAgICAgIHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0gICAgICAgIHN0cnVjdCB3aWluc3QgKndpaW5zdDsKLSAgICAgICAgc3RydWN0IHdvaW5zdCAqd29pbnN0OwotICAgICAgICB1MTYgZW5hYmxlYml0czsKLX07Ci0KLSNlbmRpZiAvKiBfQVVESU9fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2NzRmOC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYworKysgL2Rldi9udWxsCkBAIC0xLDgzMiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBzYmxpdmVfbWkuYyAtIE1JREkgVUFSVCBpbnB1dCBIQUwgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuIHVwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImNhcmRtaS5oIgotI2luY2x1ZGUgImlycW1nci5oIgotCi0KLXN0YXRpYyBpbnQgZW11MTBrMV9tcHVpbl9jYWxsYmFjayhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTMyIG1zZywgdW5zaWduZWQgbG9uZyBkYXRhLCB1MzIgYnl0ZXN2YWxpZCk7Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVJbml0KHN0cnVjdCBlbXUxMGsxX21wdWluICopOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUVudHJ5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVQYXJzZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZVZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7Ci1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGUoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNFeE5vcm0oc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c1JlYWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWludCAoKkZuKSAoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOwotfSBtaWRpc3RhdGVmbltdID0gewotCi0JewotCXNibGl2ZV9taVN0YXRlUGFyc2V9LCB7Ci0Jc2JsaXZlX21pU3RhdGUzQnl0ZX0sCS8qIDB4OG4sIDB4OW4sIDB4QW4sIDB4Qm4sIDB4RW4gKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGUzQnl0ZUtleX0sCS8qIEJ5dGUgMSAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGUzQnl0ZVZlbH0sCS8qIEJ5dGUgMiAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGUyQnl0ZX0sCS8qIDB4Q24sIDB4RG4gICAgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGUyQnl0ZUtleX0sCS8qIEJ5dGUgMSAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNDb21tb24yfSwJLyogMHhGMSAsIDB4RjMgICAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjJLZXl9LAkvKiAweEYxICwgMHhGMywgQnl0ZSAxICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM30sCS8qIDB4RjIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl7Ci0Jc2JsaXZlX21pU3RhdGVTeXNDb21tb24zS2V5fSwJLyogMHhGMiAsIEJ5dGUgMSAgICAgICAgICAgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNWZWx9LAkvKiAweEYyICwgQnl0ZSAyICAgICAgICAgICAgICAgICovCi0JewotCXNibGl2ZV9taVN0YXRlU3lzRXhOb3JtfSwJLyogMHhGMCwgMHhGNywgTm9ybWFsIG1vZGUgICAgICAqLwotCXsKLQlzYmxpdmVfbWlTdGF0ZVN5c1JlYWx9CS8qIDB4RjQgLSAweEY2ICwweEY4IC0gMHhGRiAgICAgKi8KLX07Ci0KLQotLyogSW5zdGFsbHMgdGhlIElSUSBoYW5kbGVyIGZvciB0aGUgTVBVIGluIHBvcnQgICAgICAgICAgICAgICAgICovCi0KLS8qIGFuZCBpbml0aWFsaXplIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBtaWRpX29wZW5pbmZvICpvcGVuaW5mbykKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX29wZW5cbiIpOwotCi0JaWYgKCEoY2FyZF9tcHVpbi0+c3RhdHVzICYgRkxBR1NfQVZBSUxBQkxFKSkKLQkJcmV0dXJuIC0xOwotCi0JLyogQ29weSBvcGVuIGluZm8gYW5kIG1hcmsgY2hhbm5lbCBhcyBpbiB1c2UgKi8KLQljYXJkX21wdWluLT5vcGVuaW5mbyA9ICpvcGVuaW5mbzsKLQljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX0FWQUlMQUJMRTsJLyogY2xlYXIgKi8KLQljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfUkVBRFk7CS8qIHNldCAqLwotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLwotCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBOVUxMOwotCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0JY2FyZF9tcHVpbi0+cWhlYWQgPSAwOwotCWNhcmRfbXB1aW4tPnF0YWlsID0gMDsKLQotCXNibGl2ZV9taVN0YXRlSW5pdChjYXJkX21wdWluKTsKLQotCWVtdTEwazFfbXB1X3Jlc2V0KGNhcmQpOwotCWVtdTEwazFfbXB1X2FjcXVpcmUoY2FyZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfbXB1aW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX2Nsb3NlKClcbiIpOwotCi0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaW5wdXQgU3lzRXggYnVmZmVycyAqLwotCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxICE9IE5VTEwpIHsKLQkJRVJST1IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIERpc2FibGUgUlggaW50ZXJydXB0ICovCi0JZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOwotCi0JZW11MTBrMV9tcHVfcmVsZWFzZShjYXJkKTsKLQotCWNhcmRfbXB1aW4tPnN0YXR1cyB8PSBGTEFHU19BVkFJTEFCTEU7CS8qIHNldCAqLwotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEFkZHMgTUlESSBidWZmZXIgdG8gbG9jYWwgcXVldWUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCBzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCi17Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcigpXG4iKTsKLQotCS8qIFVwZGF0ZSBNSURJIGJ1ZmZlciBmbGFncyAqLwotCW1pZGloZHItPmZsYWdzIHw9IE1JRElCVUZfSU5RVUVVRTsJLyogc2V0ICovCi0JbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfRE9ORTsJLyogY2xlYXIgKi8KLQotCWlmICgobWlkaXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9xdWV1ZSksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0JCS8qIE1lc3NhZ2UgbG9zdCAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWlkaXEtPm5leHQgPSBOVUxMOwotCW1pZGlxLT5xdHlwZSA9IDE7Ci0JbWlkaXEtPmxlbmd0aCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKLQltaWRpcS0+c2l6ZUxlZnQgPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7Ci0JbWlkaXEtPm1pZGlieXRlID0gbWlkaWhkci0+ZGF0YTsKLQltaWRpcS0+cmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpaGRyOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpIHsKLQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxOwotCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBtaWRpcTsKLQl9IGVsc2UgewotCQkoY2FyZF9tcHVpbi0+bGFzdG1pZGlxKS0+bmV4dCA9IG1pZGlxOwotCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBtaWRpcTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRmlyc3Qgc2V0IHRoZSBUaW1lIFN0YW1wIGlmIE1JREkgSU4gaGFzIG5vdCBzdGFydGVkLiAgICAgICAgICovCi0KLS8qIFRoZW4gZW5hYmxlIFJYIElycS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0JdTggZHVtbXk7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1aW5fc3RhcnQoKVxuIik7Ci0KLQkvKiBTZXQgdGltZXN0YW1wIGlmIG5vdCBzZXQgKi8KLQlpZiAoY2FyZF9tcHVpbi0+c3RhdHVzICYgRkxBR1NfTUlETV9TVEFSVEVEKSB7Ci0JCURQRigyLCAiVGltZSBTdGFtcCBub3QgY2hhbmdlZFxuIik7Ci0JfSBlbHNlIHsKLQkJd2hpbGUgKCFlbXUxMGsxX21wdV9yZWFkX2RhdGEoY2FyZCwgJmR1bW15KSk7Ci0KLQkJY2FyZF9tcHVpbi0+c3RhdHVzIHw9IEZMQUdTX01JRE1fU1RBUlRFRDsJLyogc2V0ICovCi0KLQkJLyogU2V0IG5ldyB0aW1lIHN0YW1wICovCi0JCWNhcmRfbXB1aW4tPnRpbWVzdGFydCA9IChqaWZmaWVzICogMTAwMCkgLyBIWjsKLQkJRFBEKDIsICJOZXcgVGltZSBTdGFtcCA9ICVkXG4iLCBjYXJkX21wdWluLT50aW1lc3RhcnQpOwotCi0JCWNhcmRfbXB1aW4tPnFoZWFkID0gMDsKLQkJY2FyZF9tcHVpbi0+cXRhaWwgPSAwOwotCi0JCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBEaXNhYmxlIHRoZSBSWCBJcnEuICBJZiBhIHBhcnRpYWwgcmVjb3JkZWQgYnVmZmVyICAgICAgICAgICAgKi8KLQotLyogZXhpc3QsIHNlbmQgaXQgdXAgdG8gSU1JREkgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWludCBlbXUxMGsxX21wdWluX3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdWluX3N0b3AoKVxuIik7Ci0KLQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7Ci0KLQljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsJLyogY2xlYXIgKi8KLQotCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCQlpZiAobWlkaXEgIT0gTlVMTCkgewotCQkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSBtaWRpcS0+bGVuZ3RoKQotCQkJCW1pZGlxID0gTlVMTDsKLQkJCWVsc2UgewotCQkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQkJCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQkJCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOwotCQkJfQotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChtaWRpcSkgewotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HRVJST1IsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0JCQlrZnJlZShtaWRpcSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGlzYWJsZSB0aGUgUlggSXJxLiAgSWYgYW55IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qIGV4aXN0LCBzZW5kIGl0IHVwIHRvIElNSURJIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotaW50IGVtdTEwazFfbXB1aW5fcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IGNhcmQtPm1wdWluOwotCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCURQRigyLCAiZW11MTBrMV9tcHVpbl9yZXNldCgpXG4iKTsKLQotCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKLQotCXdoaWxlIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCi0JCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gbWlkaXEtPmxlbmd0aCkKLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0RBVEEsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0JCWVsc2UKLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0VSUk9SLCAodW5zaWduZWQgbG9uZykgbWlkaXEsIDApOwotCi0JCWtmcmVlKG1pZGlxKTsKLQl9Ci0KLQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOwotCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFBhc3NlcyB0aGUgbWVzc2FnZSB3aXRoIHRoZSBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudCAgICAgICAgICAqLwotCi0vKiB2aWEgSVJRICYgRFBDIGNhbGxiYWNrcyB0byBSaW5nIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBpbnQgZW11MTBrMV9tcHVpbl9jYWxsYmFjayhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTMyIG1zZywgdW5zaWduZWQgbG9uZyBkYXRhLCB1MzIgYnl0ZXN2YWxpZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVpbjsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0JdW5zaWduZWQgbG9uZyBjYWxsYmFja19tc2dbM107Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCi0JLyogQ2FsbGVkIGR1cmluZyBJU1IuIFRoZSBkYXRhICYgY29kZSB0b3VjaGVkIGFyZToKLQkgKiAxLiBjYXJkX21wdWluCi0JICogMi4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotCSAqLwotCi0JdGltZWluID0gY2FyZF9tcHVpbi0+dGltZWluOwotCWlmIChjYXJkX21wdWluLT50aW1lc3RhcnQgPD0gdGltZWluKQotCQljYWxsYmFja19tc2dbMF0gPSB0aW1laW4gLSBjYXJkX21wdWluLT50aW1lc3RhcnQ7Ci0JZWxzZQotCQljYWxsYmFja19tc2dbMF0gPSAofjB4MEwgLSBjYXJkX21wdWluLT50aW1lc3RhcnQpICsgdGltZWluOwotCi0JaWYgKG1zZyA9PSBJQ0FSRE1JRElfSU5EQVRBIHx8IG1zZyA9PSBJQ0FSRE1JRElfSU5EQVRBRVJST1IpIHsKLQkJY2FsbGJhY2tfbXNnWzFdID0gZGF0YTsKLQkJY2FsbGJhY2tfbXNnWzJdID0gYnl0ZXN2YWxpZDsKLQkJRFBEKDIsICJlbXUxMGsxX21wdWluX2NhbGxiYWNrOiBtaWRpbXNnID0gJSNseFxuIiwgZGF0YSk7Ci0JfSBlbHNlIHsKLQkJbWlkaXEgPSAoc3RydWN0IG1pZGlfcXVldWUgKikgZGF0YTsKLQkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgbWlkaXEtPnJlZmRhdGE7Ci0KLQkJY2FsbGJhY2tfbXNnWzFdID0gbWlkaXEtPmxlbmd0aCAtIG1pZGlxLT5zaXplTGVmdDsKLQkJY2FsbGJhY2tfbXNnWzJdID0gbWlkaXEtPnJlZmRhdGE7Ci0JCW1pZGloZHItPmZsYWdzICY9IH5NSURJQlVGX0lOUVVFVUU7Ci0JCW1pZGloZHItPmZsYWdzIHw9IE1JRElCVUZfRE9ORTsKLQotCQltaWRpaGRyLT5ieXRlc3JlY29yZGVkID0gbWlkaXEtPmxlbmd0aCAtIG1pZGlxLT5zaXplTGVmdDsKLQl9Ci0KLQkvKiBOb3RpZnkgY2xpZW50IHRoYXQgU3lzZXggYnVmZmVyIGhhcyBiZWVuIHNlbnQgKi8KLQllbXUxMGsxX21pZGlfY2FsbGJhY2sobXNnLCBjYXJkX21wdWluLT5vcGVuaW5mby5yZWZkYXRhLCBjYWxsYmFja19tc2cpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV9tcHVpbl9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpCi17Ci0JdTggZGF0YTsKLQl1bnNpZ25lZCBpZHg7Ci0Jc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSAoc3RydWN0IGVtdTEwazFfbXB1aW4gKikgcmVmZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jd2hpbGUgKGNhcmRfbXB1aW4tPnFoZWFkICE9IGNhcmRfbXB1aW4tPnF0YWlsKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0JCWlkeCA9IGNhcmRfbXB1aW4tPnFoZWFkOwotCQlkYXRhID0gY2FyZF9tcHVpbi0+bWlkaXFbaWR4XS5kYXRhOwotCQljYXJkX21wdWluLT50aW1laW4gPSBjYXJkX21wdWluLT5taWRpcVtpZHhdLnRpbWVpbjsKLQkJaWR4ID0gKGlkeCArIDEpICUgTUlESUlOX01BWF9CVUZGRVJfU0laRTsKLQkJY2FyZF9tcHVpbi0+cWhlYWQgPSBpZHg7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQlzYmxpdmVfbWlTdGF0ZUVudHJ5KGNhcmRfbXB1aW4sIGRhdGEpOwotCX0KLQotCXJldHVybjsKLX0KLQotLyogSVJRIGNhbGxiYWNrIGhhbmRsZXIgcm91dGluZSBmb3IgdGhlIE1QVSBpbiBwb3J0ICovCi0KLWludCBlbXUxMGsxX21wdWluX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1bnNpZ25lZCBpZHg7Ci0JdW5zaWduZWQgY291bnQ7Ci0JdTggTVBVSXZhbHVlOwotCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47Ci0KLQkvKiBJUlEgc2VydmljZSByb3V0aW5lLiBUaGUgZGF0YSBhbmQgY29kZSB0b3VjaGVkIGFyZToKLQkgKiAxLiBjYXJkX21wdWluCi0JICovCi0KLQljb3VudCA9IDA7Ci0JaWR4ID0gY2FyZF9tcHVpbi0+cXRhaWw7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAoZW11MTBrMV9tcHVfcmVhZF9kYXRhKGNhcmQsICZNUFVJdmFsdWUpIDwgMCkgewotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQkrK2NvdW50OwotCQkJY2FyZF9tcHVpbi0+bWlkaXFbaWR4XS5kYXRhID0gTVBVSXZhbHVlOwotCQkJY2FyZF9tcHVpbi0+bWlkaXFbaWR4XS50aW1laW4gPSAoamlmZmllcyAqIDEwMDApIC8gSFo7Ci0JCQlpZHggPSAoaWR4ICsgMSkgJSBNSURJSU5fTUFYX0JVRkZFUl9TSVpFOwotCQl9Ci0JfQotCi0JaWYgKGNvdW50KSB7Ci0JCWNhcmRfbXB1aW4tPnF0YWlsID0gaWR4OwotCi0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNhcmRfbXB1aW4tPnRhc2tsZXQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICAgU3VwcG9ydGluZyBmdW5jdGlvbnMgZm9yIE1pZGktSW4gSW50ZXJwcmV0YXRpb24gU3RhdGUgTWFjaGluZSAgICAgICAgICAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLwotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUluaXQoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4pCi17Ci0JY2FyZF9tcHVpbi0+c3RhdHVzID0gMDsJLyogRm9yIE1JREkgcnVubmluZyBzdGF0dXMgKi8KLQljYXJkX21wdWluLT5mc3RhdHVzID0gMDsJLyogRm9yIDB4Rm4gc3RhdHVzIG9ubHkgKi8KLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7Ci0JY2FyZF9tcHVpbi0+bGFzdHN0YXRlID0gU1RJTl9QQVJTRTsKLQljYXJkX21wdWluLT5kYXRhID0gMDsKLQljYXJkX21wdWluLT50aW1lc3RhcnQgPSAwOwotCWNhcmRfbXB1aW4tPnRpbWVpbiA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgbWFjcm8gKi8KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVFbnRyeShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQlyZXR1cm4gbWlkaXN0YXRlZm5bY2FyZF9tcHVpbi0+Y3Vyc3RhdGVdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlUGFyc2Uoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0Jc3dpdGNoIChkYXRhICYgMHhmMCkgewotCWNhc2UgMHg4MDoKLQljYXNlIDB4OTA6Ci0JY2FzZSAweEEwOgotCWNhc2UgMHhCMDoKLQljYXNlIDB4RTA6Ci0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURTsKLQkJYnJlYWs7Ci0KLQljYXNlIDB4QzA6Ci0JY2FzZSAweEQwOgotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fMkJZVEU7Ci0JCWJyZWFrOwotCi0JY2FzZSAweEYwOgotCQkvKiBTeXN0ZW0gbWVzc2FnZXMgZG8gbm90IGFmZmVjdCB0aGUgcHJldmlvdXMgcnVubmluZyBzdGF0dXMhICovCi0JCXN3aXRjaCAoZGF0YSAmIDB4MGYpIHsKLQkJY2FzZSAweDA6Ci0JCQljYXJkX21wdWluLT5sYXN0c3RhdGUgPSBjYXJkX21wdWluLT5jdXJzdGF0ZTsKLQkJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfRVhfTk9STTsKLQotCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0KLQkJCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0JCQkJKm1pZGlxLT5taWRpYnl0ZSA9IGRhdGE7Ci0JCQkJLS1taWRpcS0+c2l6ZUxlZnQ7Ci0JCQkJKyttaWRpcS0+bWlkaWJ5dGU7Ci0JCQl9Ci0KLQkJCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci0KLQkJY2FzZSAweDc6Ci0JCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgMHhmNywgMCk7Ci0JCQlyZXR1cm4gLTE7Ci0KLQkJY2FzZSAweDI6Ci0JCQljYXJkX21wdWluLT5sYXN0c3RhdGUgPSBjYXJkX21wdWluLT5jdXJzdGF0ZTsKLQkJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfQ09NTU9OXzM7Ci0JCQlicmVhazsKLQotCQljYXNlIDB4MToKLQkJY2FzZSAweDM6Ci0JCQljYXJkX21wdWluLT5sYXN0c3RhdGUgPSBjYXJkX21wdWluLT5jdXJzdGF0ZTsKLQkJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfQ09NTU9OXzI7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJLyogaW5jbHVkZXMgMHhGNCAtIDB4RjYsIDB4RjggLSAweEZGICovCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0JCX0KLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCURQRigyLCAiQlVHOiBkZWZhdWx0IGNhc2UgaGl0XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiBtaWRpc3RhdGVmbltjYXJkX21wdWluLT5jdXJzdGF0ZV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQl1OCB0ZW1wID0gZGF0YSAmIDB4ZjA7Ci0KLQlpZiAodGVtcCA8IDB4ODApIHsKLQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fM0JZVEVfS0VZXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQl9IGVsc2UgaWYgKHRlbXAgPD0gMHhlMCAmJiB0ZW1wICE9IDB4YzAgJiYgdGVtcCAhPSAweGQwKSB7Ci0JCWNhcmRfbXB1aW4tPnN0YXR1cyA9IGRhdGE7Ci0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURV9LRVk7Ci0KLQkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLQl9Ci0KLQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9QQVJTRV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMSAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKLQkJdG1wID0gKCh1bnNpZ25lZCBsb25nKSBkYXRhKSA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+ZGF0YSA9IGRhdGE7Ci0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFX1ZFTDsKLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZVZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMiAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKLQkJdG1wID0gKCh1bnNpZ25lZCBsb25nKSBkYXRhKSA8PCA4OwotCQl0bXAgfD0gY2FyZF9tcHVpbi0+ZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEU7Ci0JdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5kYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOwotCi0JZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCB0bXAsIDMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQl1OCB0ZW1wID0gZGF0YSAmIDB4ZjA7Ci0KLQlpZiAoKHRlbXAgPT0gMHhjMCkgfHwgKHRlbXAgPT0gMHhkMCkpIHsKLQkJY2FyZF9tcHVpbi0+c3RhdHVzID0gZGF0YTsKLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzJCWVRFX0tFWTsKLQotCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotCX0KLQotCWlmICh0ZW1wIDwgMHg4MCkKLQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fMkJZVEVfS0VZXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1BBUlNFXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotLyogYnl0ZSAxICovCi17Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAoZGF0YSA+IDB4N2YpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIGRhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOwotCi0JCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOwotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fMkJZVEU7Ci0JdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7Ci0KLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjIoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi17Ci0JY2FyZF9tcHVpbi0+ZnN0YXR1cyA9IGRhdGE7Ci0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMl9LRVk7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQotCi1zdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMktleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLS8qIGJ5dGUgMSAqLwotewotCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JaWYgKGRhdGEgPiAweDdmKSB7Ci0JCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLwotCQlpZiAoZGF0YSA+IDB4ZjcpCi0JCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Ci0KLQkJLyogSW52YWxpZCBkYXRhISAqLwotCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKLQkJdG1wID0gdG1wIDw8IDg7Ci0JCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKLQotCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0JdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JdG1wID0gdG1wIDw8IDg7Ci0JdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOwotCi0JZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCB0bXAsIDIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24zKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCWNhcmRfbXB1aW4tPmZzdGF0dXMgPSBkYXRhOwotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfQ09NTU9OXzNfS0VZOwotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDEgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JCXRtcCA9IHRtcCA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmRhdGEgPSBkYXRhOwotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9TWVNfQ09NTU9OXzNfVkVMOwotCi0JcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjNWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCi0vKiBieXRlIDIgKi8KLXsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChkYXRhID4gMHg3ZikgewotCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KLQkJaWYgKGRhdGEgPiAweGY3KQotCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOwotCi0JCS8qIEludmFsaWQgZGF0YSEgKi8KLQkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKLQotCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKLQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7Ci0JCXRtcCA9IHRtcCA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmRhdGE7Ci0JCXRtcCA9IHRtcCA8PCA4OwotCQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7Ci0KLQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOwotCXRtcCA9IHRtcCA8PCA4OwotCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZGF0YTsKLQl0bXAgPSB0bXAgPDwgODsKLQl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7Ci0KLQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0V4Tm9ybShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKChkYXRhID4gMHg3ZikgJiYgKGRhdGEgIT0gMHhmNykpIHsKLQkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCi0JCWlmIChkYXRhID4gMHhmNykKLQkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKLQotCQkvKiBJbnZhbGlkIERhdGEhICovCi0JCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7Ci0KLQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7Ci0KLQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKLQkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCQkJKm1pZGlxLT5taWRpYnl0ZSA9IGRhdGE7Ci0JCQktLW1pZGlxLT5zaXplTGVmdDsKLQkJCSsrbWlkaXEtPm1pZGlieXRlOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOwotCi0JCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQotCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HRVJST1IsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0KLQkJCWtmcmVlKG1pZGlxKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgewotCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0KLQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOwotCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKLQkJLS1taWRpcS0+c2l6ZUxlZnQ7Ci0JCSsrbWlkaXEtPm1pZGlieXRlOwotCX0KLQotCWlmIChkYXRhID09IDB4ZjcpIHsKLQkJLyogRW5kIG9mIFN5c2V4IGJ1ZmZlciAqLwotCQkvKiBTZW5kIGRvd24gdGhlIGJ1ZmZlciAqLwotCi0JCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOwotCi0JCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0KLQkJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkKLQkJCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0RBVEEsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0KLQkJCWtmcmVlKG1pZGlxKTsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQotCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7Ci0JCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKLQotCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7Ci0KLQkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSAwKSB7Ci0JCQkvKiBTcGVjaWFsIGNhc2UgKi8KLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKLQotCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OwotCQkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkKLQkJCQljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7Ci0KLQkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOTE9OR0RBVEEsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7Ci0KLQkJCWtmcmVlKG1pZGlxKTsKLQotCQkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKLQkJfQotCX0KLQotCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Ci19Ci0KLXN0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNSZWFsKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQotewotCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgZGF0YSwgMSk7Ci0KLQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1pLmggYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyYzI0MS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHNibGl2ZV9taS5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX0NBUkRNSV9ICi0jZGVmaW5lIF9DQVJETUlfSAotCi0jaW5jbHVkZSAiaWNhcmRtaWQuaCIKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotdHlwZWRlZiBlbnVtCi17Ci0JU1RJTl9QQVJTRSA9IDAsCi0JU1RJTl8zQllURSwgICAgICAgICAgICAgICAgICAgICAvKiAweDgwLCAweDkwLCAweEEwLCAweEIwLCAweEUwICovCi0JU1RJTl8zQllURV9LRVksICAgICAgICAgICAgICAgICAvKiBCeXRlIDEgKi8KLQlTVElOXzNCWVRFX1ZFTCwgICAgICAgICAgICAgICAgIC8qIEJ5dGUgMSAqLwotCVNUSU5fMkJZVEUsICAgICAgICAgICAgICAgICAgICAgLyogMHhDMCwgMHhEMCAqLwotCVNUSU5fMkJZVEVfS0VZLCAgICAgICAgICAgICAgICAgLyogQnl0ZSAxICovCi0JU1RJTl9TWVNfQ09NTU9OXzIsICAgICAgICAgICAgICAvKiAweEYxLCAweEYzICAqLwotCVNUSU5fU1lTX0NPTU1PTl8yX0tFWSwKLQlTVElOX1NZU19DT01NT05fMywgICAgICAgICAgICAgIC8qIDB4RjIgKi8KLQlTVElOX1NZU19DT01NT05fM19LRVksCi0JU1RJTl9TWVNfQ09NTU9OXzNfVkVMLAotCVNUSU5fU1lTX0VYX05PUk0sICAgICAgICAgICAgICAgLyogMHhGMCwgTm9ybWFsIG1vZGUgKi8KLQlTVElOX1NZU19SRUFMCi19IG1pZGlfaW5fc3RhdGU7Ci0KLQotLyogZmxhZ3MgZm9yIGNhcmQgTUlESSBpbiBvYmplY3QgKi8KLSNkZWZpbmUgRkxBR1NfTUlETV9TVEFSVEVEICAgICAgICAgIDB4MDAwMDEwMDAgICAgICAvLyBEYXRhIGhhcyBzdGFydGVkIHRvIGNvbWUgaW4gYWZ0ZXIgTWlkbSBTdGFydAotI2RlZmluZSBNSURJSU5fTUFYX0JVRkZFUl9TSVpFICAgICAgMjAwICAgICAgICAgICAgIC8vIERlZmluaXRpb24gZm9yIHN0cnVjdCBlbXUxMGsxX21wdWluCi0KLXN0cnVjdCBtaWRpX2RhdGEKLXsKLQl1OCBkYXRhOwotCXUzMiB0aW1laW47Ci19OwotCi1zdHJ1Y3QgZW11MTBrMV9tcHVpbgotewotCXNwaW5sb2NrX3QgICAgICAgIGxvY2s7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKmZpcnN0bWlkaXE7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKmxhc3RtaWRpcTsKLQl1bnNpZ25lZCAgICAgICAgICBxaGVhZCwgcXRhaWw7Ci0Jc3RydWN0IG1pZGlfZGF0YSAgbWlkaXFbTUlESUlOX01BWF9CVUZGRVJfU0laRV07Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7Ci0Jc3RydWN0IG1pZGlfb3BlbmluZm8gICAgb3BlbmluZm87Ci0KLQkvKiBGb3IgTUlESSBzdGF0ZSBtYWNoaW5lICovCi0JdTggICAgICAgICAgICAgIHN0YXR1czsgICAgICAgIC8qIEZvciBNSURJIHJ1bm5pbmcgc3RhdHVzICovCi0JdTggICAgICAgICAgICAgIGZzdGF0dXM7ICAgICAgIC8qIEZvciAweEZuIHN0YXR1cyBvbmx5ICovCi0JbWlkaV9pbl9zdGF0ZSAgIGN1cnN0YXRlOwotCW1pZGlfaW5fc3RhdGUgICBsYXN0c3RhdGU7Ci0JdTMyICAgICAgICAgICAgIHRpbWVzdGFydDsKLQl1MzIgICAgICAgICAgICAgdGltZWluOwotCXU4ICAgICAgICAgICAgICBkYXRhOwotfTsKLQotaW50IGVtdTEwazFfbXB1aW5fb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBtaWRpX29wZW5pbmZvICopOwotaW50IGVtdTEwazFfbXB1aW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdWluX2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgc3RydWN0IG1pZGlfaGRyICopOwotaW50IGVtdTEwazFfbXB1aW5fc3RhcnQoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdWluX3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdWluX3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci0KLWludCBlbXUxMGsxX21wdWluX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV9tcHVpbl9iaCh1bnNpZ25lZCBsb25nKTsKLQotI2VuZGlmICAvKiBfQ0FSRE1JX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Y2M3NWQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBjYXJkbW8uYyAtIE1JREkgVUFSVCBvdXRwdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlciAKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiY2FyZG1vLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0KLS8qIEluc3RhbGxzIHRoZSBJUlEgaGFuZGxlciBmb3IgdGhlIE1QVSBvdXQgcG9ydCAgICAgICAgICAgICAgICoKLSAqIGFuZCBpbml0aWFsaXplIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1pbnQgZW11MTBrMV9tcHVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqb3BlbmluZm8pCi17Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQotCURQRigyLCAiZW11MTBrMV9tcHVvdXRfb3BlbigpXG4iKTsKLQotCWlmICghKGNhcmRfbXB1b3V0LT5zdGF0dXMgJiBGTEFHU19BVkFJTEFCTEUpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb3B5IG9wZW4gaW5mbyBhbmQgbWFyayBjaGFubmVsIGFzIGluIHVzZSAqLwotCWNhcmRfbXB1b3V0LT5pbnRyID0gMDsKLQljYXJkX21wdW91dC0+b3BlbmluZm8gPSAqb3BlbmluZm87Ci0JY2FyZF9tcHVvdXQtPnN0YXR1cyAmPSB+RkxBR1NfQVZBSUxBQkxFOwotCWNhcmRfbXB1b3V0LT5sYXN0c3RhdHVzID0gMHg4MDsKLQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IE5VTEw7Ci0JY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IE5VTEw7Ci0KLQllbXUxMGsxX21wdV9yZXNldChjYXJkKTsKLQllbXUxMGsxX21wdV9hY3F1aXJlKGNhcmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX21wdW91dF9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX21wdW91dF9jbG9zZSgpXG4iKTsKLQotCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpIHsKLQkJbWlkaXEgPSBjYXJkX21wdW91dC0+Zmlyc3RtaWRpcTsKLQkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgbWlkaXEtPnJlZmRhdGE7Ci0KLQkJY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKLQotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCWtmcmVlKG1pZGlxKTsKLQl9Ci0KLQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKLQotCWVtdTEwazFfbXB1X3JlbGVhc2UoY2FyZCk7Ci0KLQljYXJkX21wdW91dC0+c3RhdHVzIHw9IEZMQUdTX0FWQUlMQUJMRTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIGJ1ZmZlciBzcGFjZSwgcmVqZWN0IE1pZGkgQnVmZmVyLiAgICAgKgotKiBPdGhlcndpc2UsIGRpc2FibGUgVFgsIGNyZWF0ZSBvYmplY3QgdG8gaG9sZCBNaWRpICAgICAgICAgICAgKgotKiAgdWZmZXIsIHVwZGF0ZSBidWZmZXIgZmxhZ3MgYW5kIG90aGVyIHBhcmFtZXRlcnMgICAgICAgICAgICAgKgotKiBiZWZvcmUgZW5hYmxpbmcgVFggYWdhaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotaW50IGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQotewotCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoKVxuIik7Ci0KLQlpZiAoY2FyZF9tcHVvdXQtPnN0YXRlID09IENBUkRNSURJT1VUX1NUQVRFX1NVU1BFTkQpCi0JCXJldHVybiAwOwotCi0JbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9JTlFVRVVFOwotCW1pZGloZHItPmZsYWdzICY9IH5NSURJQlVGX0RPTkU7Ci0KLQlpZiAoKG1pZGlxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfcXVldWUpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQkvKiBNZXNzYWdlIGxvc3QgKi8KLQkJcmV0dXJuIC0xOwotCX0KLQotCW1pZGlxLT5uZXh0ID0gTlVMTDsKLQltaWRpcS0+cXR5cGUgPSAxOwotCW1pZGlxLT5sZW5ndGggPSBtaWRpaGRyLT5idWZmZXJsZW5ndGg7Ci0JbWlkaXEtPnNpemVMZWZ0ID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOwotCW1pZGlxLT5taWRpYnl0ZSA9IG1pZGloZHItPmRhdGE7Ci0KLQltaWRpcS0+cmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpaGRyOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPT0gTlVMTCkgewotCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxOwotCQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gbWlkaXE7Ci0JfSBlbHNlIHsKLQkJKGNhcmRfbXB1b3V0LT5sYXN0bWlkaXEpLT5uZXh0ID0gbWlkaXE7Ci0JCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBtaWRpcTsKLQl9Ci0KLQljYXJkX21wdW91dC0+aW50ciA9IDA7Ci0KLQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX21wdW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZW11MTBrMV9jYXJkICopIHJlZmRhdGE7Ci0Jc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKLQlpbnQgY0J5dGVTZW50ID0gMDsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqbWlkaXE7Ci0Jc3RydWN0IG1pZGlfcXVldWUgKmRvbmVxID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgewotCQltaWRpcSA9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxOwotCi0JCXdoaWxlIChjQnl0ZVNlbnQgPCA0ICYmIG1pZGlxLT5zaXplTGVmdCkgewotCQkJaWYgKGVtdTEwazFfbXB1X3dyaXRlX2RhdGEoY2FyZCwgKm1pZGlxLT5taWRpYnl0ZSkgPCAwKSB7Ci0JCQkJRFBGKDIsICJlbXUxMGsxX21wdW91dERwY0NhbGxiYWNrIGVycm9yISFcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQkrK2NCeXRlU2VudDsKLQkJCQktLW1pZGlxLT5zaXplTGVmdDsKLQkJCQkrK21pZGlxLT5taWRpYnl0ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChtaWRpcS0+c2l6ZUxlZnQgPT0gMCkgewotCQkJaWYgKGRvbmVxID09IE5VTEwpCi0JCQkJZG9uZXEgPSBtaWRpcTsKLQkJCWNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID09IE5VTEwpCi0JCWNhcmRfbXB1b3V0LT5sYXN0bWlkaXEgPSBOVUxMOwotCi0JaWYgKGRvbmVxICE9IE5VTEwpIHsKLQkJd2hpbGUgKGRvbmVxICE9IGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX21zZ1szXTsKLQotCQkJbWlkaXEgPSBkb25lcTsKLQkJCWRvbmVxID0gbWlkaXEtPm5leHQ7Ci0KLQkJCWlmIChtaWRpcS0+cXR5cGUpIHsKLQkJCQljYWxsYmFja19tc2dbMF0gPSAwOwotCQkJCWNhbGxiYWNrX21zZ1sxXSA9IG1pZGlxLT5sZW5ndGg7Ci0JCQkJY2FsbGJhY2tfbXNnWzJdID0gbWlkaXEtPnJlZmRhdGE7Ci0KLQkJCQllbXUxMGsxX21pZGlfY2FsbGJhY2soSUNBUkRNSURJX09VVExPTkdEQVRBLCBjYXJkX21wdW91dC0+b3BlbmluZm8ucmVmZGF0YSwgY2FsbGJhY2tfbXNnKTsKLQkJCX0gZWxzZSBpZiAoKCh1OCkgbWlkaXEtPnJlZmRhdGEpIDwgMHhGMCAmJiAoKHU4KSBtaWRpcS0+cmVmZGF0YSkgPiAweDdGKQotCQkJCWNhcmRfbXB1b3V0LT5sYXN0c3RhdHVzID0gKHU4KSBtaWRpcS0+cmVmZGF0YTsKLQotCQkJa2ZyZWUobWlkaXEpOwotCQl9Ci0JfQotCi0JaWYgKChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB8fCBjQnl0ZVNlbnQpIHsKLQkJY2FyZF9tcHVvdXQtPmludHIgPSAwOwotCQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi1pbnQgZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7Ci0KLQlEUEYoNCwgImVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXJcbiIpOwotCi0JY2FyZF9tcHVvdXQtPmludHIgPSAxOwotCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKLQotCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNhcmRfbXB1b3V0LT50YXNrbGV0KTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmggYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNmViMy4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmRtby5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3gJICAgIGNsZWFuZWQgdXAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX0NBUkRNT19ICi0jZGVmaW5lIF9DQVJETU9fSAotCi0jaW5jbHVkZSAiaWNhcmRtaWQuaCIKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2RlZmluZSBDQVJETUlESU9VVF9TVEFURV9ERUZBVUxUICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQ0FSRE1JRElPVVRfU1RBVEVfU1VTUEVORCAgICAweDAwMDAwMDAxCi0KLXN0cnVjdCBlbXUxMGsxX21wdW91dAotewotCXUzMgkJCXN0YXR1czsKLQl1MzIJCQlzdGF0ZTsKLQl2b2xhdGlsZSBpbnQJCWludHI7Ci0Jc3RydWN0IG1pZGlfcXVldWUJKmZpcnN0bWlkaXE7Ci0Jc3RydWN0IG1pZGlfcXVldWUJKmxhc3RtaWRpcTsKLQl1OAkJCWxhc3RzdGF0dXM7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAl0YXNrbGV0OwotCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3RydWN0IG1pZGlfb3BlbmluZm8Jb3BlbmluZm87Ci19OwotCi1pbnQgZW11MTBrMV9tcHVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBtaWRpX29wZW5pbmZvICopOwotaW50IGVtdTEwazFfbXB1b3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci1pbnQgZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBtaWRpX2hkciAqKTsKLQotaW50IGVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV9tcHVvdXRfYmgodW5zaWduZWQgbG9uZyk7Ci0KLSNlbmRpZiAgLyogX0NBUkRNT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBkMWJlLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmR3aS5jIC0gUENNIGlucHV0IEhBTCBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJ0aW1lci5oIgotI2luY2x1ZGUgInJlY21nci5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0KLS8qKgotICogcXVlcnlfZm9ybWF0IC0gcmV0dXJucyBhIHZhbGlkIHNvdW5kIGZvcm1hdAotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSB2YWxpZCBzb3VuZCBmb3JtYXQgYXMgY2xvc2UKLSAqIHRvIHRoZSByZXF1ZXN0ZWQgb25lIGFzIHBvc3NpYmxlLiAKLSAqLwotc3RhdGljIHZvaWQgcXVlcnlfZm9ybWF0KGludCByZWNzcmMsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqd2F2ZV9mbXQpCi17Ci0KLQlzd2l0Y2ggKHJlY3NyYykgewotCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgotCi0JCWlmICgod2F2ZV9mbXQtPmNoYW5uZWxzICE9IDEpICYmICh3YXZlX2ZtdC0+Y2hhbm5lbHMgIT0gMikpCi0JCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOwotCi0JCWlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweEJCODAgKyAweEFDNDQpIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweEJCODA7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4QUM0NCArIDB4N0QwMCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4QUM0NDsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHg3RDAwICsgMHg1REMwKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHg3RDAwOwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDVEQzAgKyAweDU2MjIpIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDVEQzA7Ci0JCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4NTYyMiArIDB4M0U4MCkgLyAyKQotCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4NTYyMjsKLQkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHgzRTgwICsgMHgyQjExKSAvIDIpCi0JCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHgzRTgwOwotCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDJCMTEgKyAweDFGNDApIC8gMikKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDJCMTE7Ci0JCWVsc2UKLQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDFGNDA7Ci0KLQkJc3dpdGNoICh3YXZlX2ZtdC0+aWQpIHsKLQkJY2FzZSBBRk1UX1MxNl9MRToKLQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OwotCQkJYnJlYWs7Ci0JCWNhc2UgQUZNVF9VODoKLQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDg7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXdhdmVfZm10LT5pZCA9IEFGTVRfUzE2X0xFOwotCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCQlicmVhazsKLQkJfQotCi0JCWJyZWFrOwotCi0JLyogdGhlc2UgY2FuJ3QgYmUgY2hhbmdlZCBmcm9tIHRoZSBvcmlnaW5hbCB2YWx1ZXMgKi8KLQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCWNhc2UgV0FWRVJFQ09SRF9GWDoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0Jd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbCA9IHdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA+PiAzOwotCXdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSA9IHdhdmVfZm10LT5jaGFubmVscyAqIHdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWw7Ci0Jd2F2ZV9mbXQtPmJ5dGVzcGVyc2VjID0gd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlICogd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZTsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJ2b2ljZXNhbXBsZSA9IHdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZTsKLX0KLQotc3RhdGljIGludCBhbGxvY19idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlidWZmZXItPmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBidWZmZXItPnNpemUgKiBidWZmZXItPmNvdiwKLQkJCQkJICAgICZidWZmZXItPmRtYV9oYW5kbGUpOwotCWlmIChidWZmZXItPmFkZHIgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCi17Ci0JaWYgKGJ1ZmZlci0+YWRkciAhPSBOVUxMKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGJ1ZmZlci0+c2l6ZSAqIGJ1ZmZlci0+Y292LAotCQkJCSAgICBidWZmZXItPmFkZHIsIGJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVpbl9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCXN0cnVjdCB3aWluc3QgKip3aWluc3RfdG1wID0gTlVMTDsKLQl1MTYgZGVsYXk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV93YXZlaW5fb3BlbigpXG4iKTsKLQotCXN3aXRjaCAod2lpbnN0LT5yZWNzcmMpIHsKLQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJd2lpbnN0X3RtcCA9ICZjYXJkLT53YXZlaW4uYWM5NzsKLQkJYnJlYWs7Ci0JY2FzZSBXQVZFUkVDT1JEX01JQzoKLQkJd2lpbnN0X3RtcCA9ICZjYXJkLT53YXZlaW4ubWljOwotCQlicmVhazsKLQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCXdpaW5zdF90bXAgPSAmY2FyZC0+d2F2ZWluLmZ4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlpZiAoKndpaW5zdF90bXAgIT0gTlVMTCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkqd2lpbnN0X3RtcCA9IHdpaW5zdDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBoYW5kbGUgOCBiaXQgcmVjb3JkaW5nICovCi0JaWYgKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyY2hhbm5lbCA9PSAxKSB7Ci0JCWlmICh3aWluc3QtPmJ1ZmZlci5zaXplID4gMHg4MDAwKSB7Ci0JCQl3aWluc3QtPmJ1ZmZlci5zaXplID0gMHg4MDAwOwotCQkJd2lpbnN0LT5idWZmZXIuc2l6ZXJlZ3ZhbCA9IDB4MWY7Ci0JCX0gZWxzZQotCQkJd2lpbnN0LT5idWZmZXIuc2l6ZXJlZ3ZhbCArPSA0OwotCi0JCXdpaW5zdC0+YnVmZmVyLmNvdiA9IDI7Ci0JfSBlbHNlCi0JCXdpaW5zdC0+YnVmZmVyLmNvdiA9IDE7Ci0KLQlpZiAoYWxsb2NfYnVmZmVyKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcikgPCAwKSB7Ci0JCUVSUk9SKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQllbXUxMGsxX3NldF9yZWNvcmRfc3JjKGNhcmQsIHdpaW5zdCk7Ci0KLQllbXUxMGsxX3Jlc2V0X3JlY29yZChjYXJkLCAmd2lpbnN0LT5idWZmZXIpOwotCi0Jd2lpbnN0LT5idWZmZXIuaHdfcG9zID0gMDsKLQl3aWluc3QtPmJ1ZmZlci5wb3MgPSAwOwotCXdpaW5zdC0+YnVmZmVyLmJ5dGVzdG9jb3B5ID0gMDsKLQotCWRlbGF5ID0gKDQ4MDAwICogd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLyB3aWluc3QtPmZvcm1hdC5ieXRlc3BlcnNlYzsKLQotCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lciwgZGVsYXkgLyAyKTsKLQotCXdpaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX09QRU47Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9jbG9zZSgpXG4iKTsKLQotCWVtdTEwazFfd2F2ZWluX3N0b3Aod2F2ZV9kZXYpOwotCi0JZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndpaW5zdC0+dGltZXIpOwotCi0JZnJlZV9idWZmZXIoY2FyZCwgJndpaW5zdC0+YnVmZmVyKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0Jc3dpdGNoICh3YXZlX2Rldi0+d2lpbnN0LT5yZWNzcmMpIHsKLQljYXNlIFdBVkVSRUNPUkRfQUM5NzoKLQkJY2FyZC0+d2F2ZWluLmFjOTcgPSBOVUxMOwotCQlicmVhazsKLQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQljYXJkLT53YXZlaW4ubWljID0gTlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQljYXJkLT53YXZlaW4uZnggPSBOVUxMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXdpaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQotCURQRigyLCAiZW11MTBrMV93YXZlaW5fc3RhcnQoKVxuIik7Ci0KLQllbXUxMGsxX3N0YXJ0X3JlY29yZChjYXJkLCAmd2lpbnN0LT5idWZmZXIpOwotCWVtdTEwazFfdGltZXJfZW5hYmxlKHdhdmVfZGV2LT5jYXJkLCAmd2lpbnN0LT50aW1lcik7Ci0KLQl3aWluc3QtPnN0YXRlIHw9IFdBVkVfU1RBVEVfU1RBUlRFRDsKLX0KLQotdm9pZCBlbXUxMGsxX3dhdmVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OwotCi0JRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9zdG9wKClcbiIpOwotCi0JaWYgKCEod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpCi0JCXJldHVybjsKLQotCWVtdTEwazFfdGltZXJfZGlzYWJsZShjYXJkLCAmd2lpbnN0LT50aW1lcik7Ci0JZW11MTBrMV9zdG9wX3JlY29yZChjYXJkLCAmd2lpbnN0LT5idWZmZXIpOwotCi0Jd2lpbnN0LT5zdGF0ZSAmPSB+V0FWRV9TVEFURV9TVEFSVEVEOwotfQotCi1pbnQgZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKmZvcm1hdCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKLQl1MTYgZGVsYXk7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCgpXG4iKTsKLQotCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQlyZXR1cm4gLTE7Ci0KLQlxdWVyeV9mb3JtYXQod2lpbnN0LT5yZWNzcmMsIGZvcm1hdCk7Ci0KLQlpZiAoKHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAhPSBmb3JtYXQtPnNhbXBsaW5ncmF0ZSkKLQkgICAgfHwgKHdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsICE9IGZvcm1hdC0+Yml0c3BlcmNoYW5uZWwpCi0JICAgIHx8ICh3aWluc3QtPmZvcm1hdC5jaGFubmVscyAhPSBmb3JtYXQtPmNoYW5uZWxzKSkgewotCi0JCXdpaW5zdC0+Zm9ybWF0ID0gKmZvcm1hdDsKLQotCQlpZiAod2lpbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkKLQkJCXJldHVybiAwOwotCi0JCXdpaW5zdC0+YnVmZmVyLnNpemUgKj0gd2lpbnN0LT5idWZmZXIuY292OwotCi0JCWlmICh3aWluc3QtPmZvcm1hdC5ieXRlc3BlcmNoYW5uZWwgPT0gMSkgewotCQkJd2lpbnN0LT5idWZmZXIuY292ID0gMjsKLQkJCXdpaW5zdC0+YnVmZmVyLnNpemUgLz0gd2lpbnN0LT5idWZmZXIuY292OwotCQl9IGVsc2UKLQkJCXdpaW5zdC0+YnVmZmVyLmNvdiA9IDE7Ci0KLQkJZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndpaW5zdC0+dGltZXIpOwotCi0JCWRlbGF5ID0gKDQ4MDAwICogd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLyB3aWluc3QtPmZvcm1hdC5ieXRlc3BlcnNlYzsKLQotCQllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndpaW5zdC0+dGltZXIsIGRlbGF5IC8gMik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlaW5fZ2V0eGZlcnNpemUoc3RydWN0IHdpaW5zdCAqd2lpbnN0LCB1MzIgKiBzaXplKQotewotCXN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIgPSAmd2lpbnN0LT5idWZmZXI7Ci0KLQkqc2l6ZSA9IGJ1ZmZlci0+Ynl0ZXN0b2NvcHk7Ci0KLQlpZiAod2lpbnN0LT5tbWFwcGVkKQotCQlyZXR1cm47Ci0KLQlpZiAoKnNpemUgPiBidWZmZXItPnNpemUpIHsKLQkJKnNpemUgPSBidWZmZXItPnNpemU7Ci0JCWJ1ZmZlci0+cG9zID0gYnVmZmVyLT5od19wb3M7Ci0JCWJ1ZmZlci0+Ynl0ZXN0b2NvcHkgPSBidWZmZXItPnNpemU7Ci0JCURQRigxLCAiYnVmZmVyIG92ZXJydW5cbiIpOwotCX0KLX0KLQotc3RhdGljIGludCBjb3B5X2Jsb2NrKHU4IF9fdXNlciAqZHN0LCB1OCAqIHNyYywgdTMyIHN0ciwgdTMyIGxlbiwgdTggY292KQotewotCWlmIChjb3YgPT0gMSkgewotCQlpZiAoX19jb3B5X3RvX3VzZXIoZHN0LCBzcmMgKyBzdHIsIGxlbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9IGVsc2UgewotCQl1OCBieXRlOwotCQl1MzIgaTsKLQotCQlzcmMgKz0gMSArIDIgKiBzdHI7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlieXRlID0gc3JjWzIgKiBpXSBeIDB4ODA7Ci0JCQlpZiAoX19jb3B5X3RvX3VzZXIoZHN0ICsgaSwgJmJ5dGUsIDEpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICogc2l6ZSkKLXsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwotCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0Jc2l6ZXRvY29weSA9IG1pbl90KHUzMiwgYnVmZmVyLT5zaXplLCAqc2l6ZSk7Ci0JKnNpemUgPSBzaXpldG9jb3B5OwotCi0JaWYgKCFzaXpldG9jb3B5KQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKLQlzdGFydCA9IGJ1ZmZlci0+cG9zOwotCWJ1ZmZlci0+cG9zICs9IHNpemV0b2NvcHk7Ci0JYnVmZmVyLT5wb3MgJT0gYnVmZmVyLT5zaXplOwotCWJ1ZmZlci0+Ynl0ZXN0b2NvcHkgLT0gc2l6ZXRvY29weTsKLQlzaXpldG9jb3B5X25vdyA9IGJ1ZmZlci0+c2l6ZSAtIHN0YXJ0OwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7Ci0JCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7Ci0KLQkJcmV0ID0gY29weV9ibG9jayhkYXRhLCBidWZmZXItPmFkZHIsIHN0YXJ0LCBzaXpldG9jb3B5X25vdywKLQkJCQkgYnVmZmVyLT5jb3YpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBjb3B5X2Jsb2NrKGRhdGEgKyBzaXpldG9jb3B5X25vdywgYnVmZmVyLT5hZGRyLCAwLAotCQkJCQkgc2l6ZXRvY29weSwgYnVmZmVyLT5jb3YpOwotCX0gZWxzZSB7Ci0JCXJldCA9IGNvcHlfYmxvY2soZGF0YSwgYnVmZmVyLT5hZGRyLCBzdGFydCwgc2l6ZXRvY29weSwKLQkJCQkgYnVmZmVyLT5jb3YpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlaW5fdXBkYXRlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3aWluc3QgKndpaW5zdCkKLXsKLQl1MzIgaHdfcG9zOwotCXUzMiBkaWZmOwotCi0JLyogVGhlcmUgaXMgbm8gYWN0dWFsIHN0YXJ0IHlldCAqLwotCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7Ci0JCWh3X3BvcyA9IHdpaW5zdC0+YnVmZmVyLmh3X3BvczsKLQl9IGVsc2UgewotCQkvKiBod19wb3MgaW4gYnl0ZSB1bml0cyAqLwotCQlod19wb3MgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCB3aWluc3QtPmJ1ZmZlci5pZHhyZWcsIDApIC8gd2lpbnN0LT5idWZmZXIuY292OwotCX0KLQotCWRpZmYgPSAod2lpbnN0LT5idWZmZXIuc2l6ZSArIGh3X3BvcyAtIHdpaW5zdC0+YnVmZmVyLmh3X3BvcykgJSB3aWluc3QtPmJ1ZmZlci5zaXplOwotCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgKz0gZGlmZjsKLQl3aWluc3QtPmJ1ZmZlci5ieXRlc3RvY29weSArPSBkaWZmOwotCi0Jd2lpbnN0LT5idWZmZXIuaHdfcG9zID0gaHdfcG9zOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmggYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyMDI5Yi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGNhcmR3aS5oIC0tIGhlYWRlciBmaWxlIGZvciBjYXJkIHdhdmUgaW5wdXQgZnVuY3Rpb25zCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2lmbmRlZiBfQ0FSRFdJX0gKLSNkZWZpbmUgX0NBUkRXSV9ICi0KLSNpbmNsdWRlICJpY2FyZHdhdi5oIgotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAidGltZXIuaCIKLQotc3RydWN0IHdhdmVpbl9idWZmZXIgewotCXUxNiBvc3NmcmFnc2hpZnQ7Ci0gICAgICAgIHUzMiBmcmFnbWVudF9zaXplOwotICAgICAgICB1MzIgbnVtZnJhZ3M7Ci0JdTMyIGh3X3BvczsJCS8qIGhhcmR3YXJlIGN1cnNvciBwb3NpdGlvbiAqLwotCXUzMiBwb3M7CQkvKiBzb2Z0d2FyZSBjdXJzb3IgcG9zaXRpb24gKi8KLQl1MzIgYnl0ZXN0b2NvcHk7CS8qIGJ5dGVzIG9mIHJlY29yZGVkIGRhdGEgYXZhaWxhYmxlICovCi0JdTMyIHNpemU7Ci0JdTMyIHBhZ2VzOwotCXUzMiBzaXplcmVnOwotCXUzMiBzaXplcmVndmFsOwotICAgICAgICB1MzIgYWRkcnJlZzsKLSAgICAgICAgdTMyIGlkeHJlZzsKLSAgICAgICAgdTMyIGFkY2N0bDsKLQl2b2lkICphZGRyOwotCXU4IGNvdjsKLQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CQotfTsKLQotc3RydWN0IHdpaW5zdAotewotCXU4IHN0YXRlOwotCXN0cnVjdCBlbXVfdGltZXIgdGltZXI7Ci0Jc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciBidWZmZXI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKLQl1OCBtbWFwcGVkOwotCXUzMiB0b3RhbF9yZWNvcmRlZDsJLyogdG90YWwgYnl0ZXMgcmVhZCgpIGZyb20gZGV2aWNlICovCi0JdTMyIGJsb2NrczsKLQlzcGlubG9ja190IGxvY2s7Ci0JdTggcmVjc3JjOwotCXUxNiBmeHdjOwotfTsKLQotI2RlZmluZSBXQVZFSU5fTUFYQlVGU0laRQk2NTUzNgotI2RlZmluZSBXQVZFSU5fTUlOQlVGU0laRQkzNjgKLQotI2RlZmluZSBXQVZFSU5fREVGQVVMVEZSQUdMRU4JMTAwIAotI2RlZmluZSBXQVZFSU5fREVGQVVMVEJVRkxFTgkxMDAwCi0KLSNkZWZpbmUgV0FWRUlOX01JTkZSQUdTSElGVAk4IAotI2RlZmluZSBXQVZFSU5fTUlORlJBR1MJCTIKLQotaW50IGVtdTEwazFfd2F2ZWluX29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlaW5fY2xvc2Uoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlaW5fc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlaW5fc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd2lpbnN0ICosIHUzMiAqKTsKLWludCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICosIHU4IF9fdXNlciAqLCB1MzIgKik7Ci1pbnQgZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKiwgc3RydWN0IHdhdmVfZm9ybWF0ICopOwotdm9pZCBlbXUxMGsxX3dhdmVpbl91cGRhdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2lpbnN0ICopOwotCi0KLSNlbmRpZiAvKiBfQ0FSRFdJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGFjYTQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZHdvLmMgLSBQQ00gb3V0cHV0IEhBTCBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAidm9pY2VtZ3IuaCIKLSNpbmNsdWRlICJjYXJkd28uaCIKLSNpbmNsdWRlICJhdWRpby5oIgotCi1zdGF0aWMgdTMyIHNhbXBsZXJhdGVfdG9fbGluZWFycGl0Y2godTMyIHNhbXBsaW5ncmF0ZSkKLXsKLQlzYW1wbGluZ3JhdGUgPSAoc2FtcGxpbmdyYXRlIDw8IDgpIC8gMzc1OwotCXJldHVybiAoc2FtcGxpbmdyYXRlID4+IDEpICsgKHNhbXBsaW5ncmF0ZSAmIDEpOwotfQotCi1zdGF0aWMgdm9pZCBxdWVyeV9mb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqd2F2ZV9mbXQpCi17Ci0JaW50IGksIGosIGRvX3Bhc3N0aHJvdWdoID0gMCwgaXNfYWMzID0gMDsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQotCWlmICgod2F2ZV9mbXQtPmNoYW5uZWxzID4gMikgJiYgKHdhdmVfZm10LT5pZCAhPSBBRk1UX1MxNl9MRSkgJiYgKHdhdmVfZm10LT5pZCAhPSBBRk1UX1U4KSkKLQkJd2F2ZV9mbXQtPmNoYW5uZWxzID0gMjsKLQotCWlmICgod2F2ZV9mbXQtPmNoYW5uZWxzIDwgMSkgfHwgKHdhdmVfZm10LT5jaGFubmVscyA+IFdBVkVPVVRfTUFYVk9JQ0VTKSkKLQkJd2F2ZV9mbXQtPmNoYW5uZWxzID0gMjsKLQotCWlmICh3YXZlX2ZtdC0+Y2hhbm5lbHMgPT0gMikKLQkJd29pbnN0LT5udW1fdm9pY2VzID0gMTsKLQllbHNlCi0JCXdvaW5zdC0+bnVtX3ZvaWNlcyA9IHdhdmVfZm10LT5jaGFubmVsczsKLQotCWlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49IDB4MmVlMDApCi0JCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDJlZTAwOwotCi0Jd2F2ZV9mbXQtPnBhc3N0aHJvdWdoID0gMDsKLQlkb19wYXNzdGhyb3VnaCA9IGlzX2FjMyA9IDA7Ci0KLQlpZiAoY2FyZC0+cHQuc2VsZWN0ZWQpCi0JCWRvX3Bhc3N0aHJvdWdoID0gMTsKLQotCXN3aXRjaCAod2F2ZV9mbXQtPmlkKSB7Ci0JY2FzZSBBRk1UX1MxNl9MRToKLQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCWJyZWFrOwotCWNhc2UgQUZNVF9VODoKLQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBBRk1UX0FDMzoKLQkJZG9fcGFzc3Rocm91Z2ggPSAxOwotCQlpc19hYzMgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl3YXZlX2ZtdC0+aWQgPSBBRk1UX1MxNl9MRTsKLQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCWJyZWFrOwotCX0JCi0JaWYgKGRvX3Bhc3N0aHJvdWdoKSB7Ci0JCS8qIGN1cnJlbnRseSBvbmx5IG9uZSB3YXZlb3V0IGluc3RhbmNlIG1heSB1c2UgcGFzcy10aHJvdWdoICovCi0JCWlmICh3b2luc3QtPnN0YXRlICE9IFdBVkVfU1RBVEVfQ0xPU0VEIHx8IAotCQkgICAgY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUgfHwKLQkJICAgICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlICE9IDQ4MDAwICYmICFpc19hYzMpKSB7Ci0JCQlEUEYoMiwgInVuYWJsZSB0byBzZXQgcGFzcy10aHJvdWdoIG1vZGVcbiIpOwotCQl9IGVsc2UgaWYgKFVTRV9QVF9NRVRIT0QxKSB7Ci0JCQlpID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsIGNhcmQtPnB0LmludHJfZ3ByX25hbWUpOwotCQkJaiA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLCBjYXJkLT5wdC5lbmFibGVfZ3ByX25hbWUpOwotCQkJaWYgKGkgPCAwIHx8IGogPCAwKQotCQkJCURQRigyLCAidW5hYmxlIHRvIHNldCBwYXNzLXRocm91Z2ggbW9kZVxuIik7Ci0JCQllbHNlIHsKLQkJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gNDgwMDA7Ci0JCQkJd2F2ZV9mbXQtPmNoYW5uZWxzID0gMjsKLQkJCQljYXJkLT5wdC5wb3NfZ3ByID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsCi0JCQkJCQkJCQkgICAgY2FyZC0+cHQucG9zX2dwcl9uYW1lKTsKLQkJCQl3YXZlX2ZtdC0+cGFzc3Rocm91Z2ggPSAxOwotCQkJCWNhcmQtPnB0LmludHJfZ3ByID0gaTsKLQkJCQljYXJkLT5wdC5lbmFibGVfZ3ByID0gajsKLQkJCQljYXJkLT5wdC5zdGF0ZSA9IFBUX1NUQVRFX0lOQUNUSVZFOwotCQkJCi0JCQkJRFBEKDIsICJpc19hYzMgaXMgJWRcbiIsIGlzX2FjMyk7Ci0JCQkJY2FyZC0+cHQuYWMzZGF0YSA9IGlzX2FjMzsKLQkJCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKLQkJCX0KLQkJfWVsc2V7Ci0JCQlEUEYoMiwgIlVzaW5nIFBhc3N0aHJvdWdoIE1ldGhvZCAyXG4iKTsKLQkJCWNhcmQtPnB0LmVuYWJsZV9ncHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwKLQkJCQkJCQkJICAgICAgIGNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSk7Ci0JCQl3YXZlX2ZtdC0+cGFzc3Rocm91Z2ggPSAyOwotCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7Ci0JCX0KLQl9Ci0KLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsID0gd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID4+IDM7Ci0Jd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKLQl3YXZlX2ZtdC0+Ynl0ZXNwZXJzZWMgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgKiB3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlOwotCi0JaWYgKHdhdmVfZm10LT5jaGFubmVscyA9PSAyKQotCQl3YXZlX2ZtdC0+Ynl0ZXNwZXJ2b2ljZXNhbXBsZSA9IHdhdmVfZm10LT5jaGFubmVscyAqIHdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWw7Ci0JZWxzZQotCQl3YXZlX2ZtdC0+Ynl0ZXNwZXJ2b2ljZXNhbXBsZSA9IHdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWw7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3ZvaWNlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdW5zaWduZWQgaW50IHZvaWNlbnVtKQotewotCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlID0gJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dOwotCi0JLyogQWxsb2NhdGUgdm9pY2VzIGhlcmUsIGlmIG5vIHZvaWNlcyBhdmFpbGFibGUsIHJldHVybiBlcnJvci4gKi8KLQotCXZvaWNlLT51c2FnZSA9IFZPSUNFX1VTQUdFX1BMQVlCQUNLOwotCi0Jdm9pY2UtPmZsYWdzID0gMDsKLQotCWlmICh3b2luc3QtPmZvcm1hdC5jaGFubmVscyA9PSAyKQotCQl2b2ljZS0+ZmxhZ3MgfD0gVk9JQ0VfRkxBR1NfU1RFUkVPOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID09IDE2KQotCQl2b2ljZS0+ZmxhZ3MgfD0gVk9JQ0VfRkxBR1NfMTZCSVQ7Ci0KLQlpZiAoZW11MTBrMV92b2ljZV9hbGxvYyhjYXJkLCB2b2ljZSkgPCAwKSB7Ci0JCXZvaWNlLT51c2FnZSA9IFZPSUNFX1VTQUdFX0ZSRUU7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgcGl0Y2ggKi8KLQl2b2ljZS0+aW5pdGlhbF9waXRjaCA9ICh1MTYpIChzclRvUGl0Y2god29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlKSA+PiA4KTsKLQl2b2ljZS0+cGl0Y2hfdGFyZ2V0ID0gc2FtcGxlcmF0ZV90b19saW5lYXJwaXRjaCh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUpOwotCi0JRFBEKDIsICJJbml0aWFsIHBpdGNoIC0tPiAlI3hcbiIsIHZvaWNlLT5pbml0aWFsX3BpdGNoKTsKLQotCXZvaWNlLT5zdGFydGxvb3AgPSAodm9pY2UtPm1lbS5lbXVwYWdlaW5kZXggPDwgMTIpIC8KLQkgd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQl2b2ljZS0+ZW5kbG9vcCA9IHZvaWNlLT5zdGFydGxvb3AgKyB3b2luc3QtPmJ1ZmZlci5zaXplIC8gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQl2b2ljZS0+c3RhcnQgPSB2b2ljZS0+c3RhcnRsb29wOwotCi0JCi0Jdm9pY2UtPnBhcmFtc1swXS52b2x1bWVfdGFyZ2V0ID0gMHhmZmZmOwotCXZvaWNlLT5wYXJhbXNbMF0uaW5pdGlhbF9mYyA9IDB4ZmY7Ci0Jdm9pY2UtPnBhcmFtc1swXS5pbml0aWFsX2F0dG4gPSAweDAwOwotCXZvaWNlLT5wYXJhbXNbMF0uYnlhbXBsX2Vudl9zdXN0YWluID0gMHg3ZjsKLQl2b2ljZS0+cGFyYW1zWzBdLmJ5YW1wbF9lbnZfZGVjYXkgPSAweDdmOwotCi0JCi0JaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgewotCQlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMikgewotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcgID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUFRdOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BUXTsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9kY2JhID0gMHhmZjsKLQkJCXZvaWNlLT5wYXJhbXNbMV0uc2VuZF9kY2JhID0gMHhmZjAwOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmUgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfaGdmZT0wOwotCQl9IGVsc2UgewotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX0xFRlRdOwotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX0xFRlRdOwotCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2RjYmEgPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX1JJR0hUXTsKLQkJCXZvaWNlLT5wYXJhbXNbMV0uc2VuZF9oZ2ZlID0gY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9SSUdIVF07Ci0KLQkJCWlmICh3b2luc3QtPmRldmljZSkgewotCQkJCS8vIC9kZXYvZHBzMQotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nICA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nICA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdOwotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXTsKLQkJCX0gZWxzZSB7Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcgID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNXTsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNXTsKLQkJCX0KLQkJfQotCQkKLQkJdm9pY2UtPnBhcmFtc1sxXS52b2x1bWVfdGFyZ2V0ID0gMHhmZmZmOwotCQl2b2ljZS0+cGFyYW1zWzFdLmluaXRpYWxfZmMgPSAweGZmOwotCQl2b2ljZS0+cGFyYW1zWzFdLmluaXRpYWxfYXR0biA9IDB4MDA7Ci0JCXZvaWNlLT5wYXJhbXNbMV0uYnlhbXBsX2Vudl9zdXN0YWluID0gMHg3ZjsKLQkJdm9pY2UtPnBhcmFtc1sxXS5ieWFtcGxfZW52X2RlY2F5ID0gMHg3ZjsKLQl9IGVsc2UgewotCQlpZiAod29pbnN0LT5udW1fdm9pY2VzID4gMSkgewotCQkJLy8gTXVsdGljaGFubmVsIHBjbQotCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmE9MHhmZjsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9oZ2ZlPTA7Ci0JCQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSAweDNmM2YzZjAwICsgY2FyZC0+bWNoYW5uZWxfZnggKyB2b2ljZW51bTsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSAweDNmM2YzZjNmOwotCQkJfSBlbHNlIHsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IDB4ZmZmMCArIGNhcmQtPm1jaGFubmVsX2Z4ICsgdm9pY2VudW07Ci0JCQl9Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9kY2JhID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9NT05PXTsKLQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9oZ2ZlID0gY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9NT05PXTsKLQotCQkJaWYgKHdvaW5zdC0+ZGV2aWNlKSB7Ci0JCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ00xXTsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNMV07Ci0JCQl9IGVsc2UgewotCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNXTsKLQkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNXTsKLQkJCX0KLQkJfQotCX0KLQotCURQRCgyLCAidm9pY2U6IHN0YXJ0bG9vcD0lI3gsIGVuZGxvb3A9JSN4XG4iLCB2b2ljZS0+c3RhcnRsb29wLCB2b2ljZS0+ZW5kbG9vcCk7Ci0KLQllbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKHZvaWNlKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV93YXZlb3V0X29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0JdW5zaWduZWQgaW50IHZvaWNlbnVtOwotCXUxNiBkZWxheTsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X29wZW4oKVxuIik7Ci0KLQlmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlbnVtKyspIHsKLQkJaWYgKGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyKGNhcmQsICZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXS5tZW0sIHdvaW5zdC0+YnVmZmVyLnBhZ2VzKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKGdldF92b2ljZShjYXJkLCB3b2luc3QsIHZvaWNlbnVtKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JYnVmZmVyLT5maWxsX3NpbGVuY2UgPSAwOwotCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyA9IDA7Ci0JYnVmZmVyLT5zaWxlbmNlX3BvcyA9IDA7Ci0JYnVmZmVyLT5od19wb3MgPSAwOwotCWJ1ZmZlci0+ZnJlZV9ieXRlcyA9IHdvaW5zdC0+YnVmZmVyLnNpemU7Ci0KLQlkZWxheSA9ICg0ODAwMCAqIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIC8KLQkJICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgKiB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKTsKLQotCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd29pbnN0LT50aW1lciwgZGVsYXkpOwotCi0Jd29pbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfT1BFTjsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGVtdTEwazFfd2F2ZW91dF9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9jbG9zZSgpXG4iKTsKLQotCWVtdTEwazFfd2F2ZW91dF9zdG9wKHdhdmVfZGV2KTsKLQotCWVtdTEwazFfdGltZXJfdW5pbnN0YWxsKGNhcmQsICZ3b2luc3QtPnRpbWVyKTsKLQotCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgewotCQllbXUxMGsxX3ZvaWNlX2ZyZWUoJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dKTsKLQkJZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlcihjYXJkLCAmd29pbnN0LT52b2ljZVt2b2ljZW51bV0ubWVtKTsKLQl9Ci0KLQl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlb3V0X3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X3N0YXJ0KClcbiIpOwotCi0JaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDIpIHsKLQkJZW11MTBrMV9wdF9zZXR1cCh3YXZlX2Rldik7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIHB0LT5lbmFibGVfZ3ByLCAwLCAxKTsKLQkJcHQtPnN0YXRlID0gUFRfU1RBVEVfUExBWUlORzsKLQl9Ci0KLQkvKiBBY3R1YWwgc3RhcnQgKi8KLQllbXUxMGsxX3ZvaWNlc19zdGFydCh3b2luc3QtPnZvaWNlLCB3b2luc3QtPm51bV92b2ljZXMsIHdvaW5zdC0+dG90YWxfcGxheWVkKTsKLQotCWVtdTEwazFfdGltZXJfZW5hYmxlKGNhcmQsICZ3b2luc3QtPnRpbWVyKTsKLQotCXdvaW5zdC0+c3RhdGUgfD0gV0FWRV9TVEFURV9TVEFSVEVEOwotfQotCi1pbnQgZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldiwgc3RydWN0IHdhdmVfZm9ybWF0ICpmb3JtYXQpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0JdW5zaWduZWQgaW50IHZvaWNlbnVtOwotCXUxNiBkZWxheTsKLQotCURQRigyLCAiZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCgpXG4iKTsKLQotCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQotCQlyZXR1cm4gLTE7Ci0KLQlxdWVyeV9mb3JtYXQod2F2ZV9kZXYsIGZvcm1hdCk7Ci0KLQlpZiAod29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICE9IGZvcm1hdC0+c2FtcGxpbmdyYXRlIHx8Ci0JICAgIHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzICE9IGZvcm1hdC0+Y2hhbm5lbHMgfHwKLQkgICAgd29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgIT0gZm9ybWF0LT5iaXRzcGVyY2hhbm5lbCkgewotCi0JCXdvaW5zdC0+Zm9ybWF0ID0gKmZvcm1hdDsKLQotCQlpZiAod29pbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkKLQkJCXJldHVybiAwOwotCi0JCWVtdTEwazFfdGltZXJfdW5pbnN0YWxsKGNhcmQsICZ3b2luc3QtPnRpbWVyKTsKLQotCQlmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlbnVtKyspIHsKLQkJCWVtdTEwazFfdm9pY2VfZnJlZSgmd29pbnN0LT52b2ljZVt2b2ljZW51bV0pOwotCi0JCQlpZiAoZ2V0X3ZvaWNlKGNhcmQsIHdvaW5zdCwgdm9pY2VudW0pIDwgMCkgewotCQkJCUVSUk9SKCk7Ci0JCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQotCQlkZWxheSA9ICg0ODAwMCAqIHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpIC8KLQkJCSAod29pbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICogd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSk7Ci0KLQkJZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3b2luc3QtPnRpbWVyLCBkZWxheSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV93YXZlb3V0X3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7Ci0KLQlEUEYoMiwgImVtdTEwazFfd2F2ZW91dF9zdG9wKClcbiIpOwotCi0JaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpCi0JCXJldHVybjsKLQotCWVtdTEwazFfdGltZXJfZGlzYWJsZShjYXJkLCAmd29pbnN0LT50aW1lcik7Ci0KLQkvKiBTdG9wIGFjdHVhbCB2b2ljZXMgKi8KLQllbXUxMGsxX3ZvaWNlc19zdG9wKHdvaW5zdC0+dm9pY2UsIHdvaW5zdC0+bnVtX3ZvaWNlcyk7Ci0KLQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7Ci0KLQl3b2luc3QtPnN0YXRlICY9IH5XQVZFX1NUQVRFX1NUQVJURUQ7Ci19Ci0KLS8qKgotICogZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplIC0KLSAqCi0gKiBnaXZlcyB0aGUgdG90YWwgZnJlZSBieXRlcyBvbiB0aGUgdm9pY2UgYnVmZmVyLCBpbmNsdWRpbmcgc2lsZW5jZSBieXRlcwotICogKGJhc2ljYWxseTogdG90YWxfZnJlZV9ieXRlcyA9IGZyZWVfYnl0ZXMgKyBzaWxlbmNlX2J5dGVzKS4KLSAqCi0gKi8KLXZvaWQgZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyICp0b3RhbF9mcmVlX2J5dGVzKQotewotCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOwotCWludCBwZW5kaW5nX2J5dGVzOwotCi0JaWYgKHdvaW5zdC0+bW1hcHBlZCkgewotCQkqdG90YWxfZnJlZV9ieXRlcyA9IGJ1ZmZlci0+ZnJlZV9ieXRlczsKLQkJcmV0dXJuOwotCX0KLQotCXBlbmRpbmdfYnl0ZXMgPSBidWZmZXItPnNpemUgLSBidWZmZXItPmZyZWVfYnl0ZXM7Ci0KLQlidWZmZXItPmZpbGxfc2lsZW5jZSA9IChwZW5kaW5nX2J5dGVzIDwgKHNpZ25lZCkgYnVmZmVyLT5mcmFnbWVudF9zaXplICogMikgPyAxIDogMDsKLQotCWlmIChwZW5kaW5nX2J5dGVzID4gKHNpZ25lZCkgYnVmZmVyLT5zaWxlbmNlX2J5dGVzKSB7Ci0JCSp0b3RhbF9mcmVlX2J5dGVzID0gKGJ1ZmZlci0+ZnJlZV9ieXRlcyArIGJ1ZmZlci0+c2lsZW5jZV9ieXRlcyk7Ci0JfSBlbHNlIHsKLQkJKnRvdGFsX2ZyZWVfYnl0ZXMgPSBidWZmZXItPnNpemU7Ci0JCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyA9IHBlbmRpbmdfYnl0ZXM7Ci0JCWlmIChwZW5kaW5nX2J5dGVzIDwgMCkgewotCQkJYnVmZmVyLT5zaWxlbmNlX3BvcyA9IGJ1ZmZlci0+aHdfcG9zOwotCQkJYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gMDsKLQkJCWJ1ZmZlci0+ZnJlZV9ieXRlcyA9IGJ1ZmZlci0+c2l6ZTsKLQkJCURQRigxLCAiYnVmZmVyIHVuZGVycnVuXG4iKTsKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBjb3B5X2Jsb2NrIC0KLSAqCi0gKiBjb3BpZXMgYSBibG9jayBvZiBwY20gZGF0YSB0byBhIHZvaWNlIGJ1ZmZlci4KLSAqIE5vdGljZSB0aGF0IHRoZSB2b2ljZSBidWZmZXIgaXMgYWN0dWFsbHkgYSBzZXQgb2YgZGlzam9pbnRlZCBtZW1vcnkgcGFnZXMuCi0gKgotICovCi1zdGF0aWMgdm9pZCBjb3B5X2Jsb2NrKHZvaWQgKipkc3QsIHUzMiBzdHIsIHU4IF9fdXNlciAqc3JjLCB1MzIgbGVuKQotewotCXVuc2lnbmVkIGludCBwZzsKLQl1bnNpZ25lZCBpbnQgcGdvZmY7Ci0JdW5zaWduZWQgaW50IGs7Ci0KLQlwZyA9IHN0ciAvIFBBR0VfU0laRTsKLQlwZ29mZiA9IHN0ciAlIFBBR0VfU0laRTsKLQotCWlmIChsZW4gPiBQQUdFX1NJWkUgLSBwZ29mZikgewotCQlrID0gUEFHRV9TSVpFIC0gcGdvZmY7Ci0JCWlmIChfX2NvcHlfZnJvbV91c2VyKCh1OCAqKWRzdFtwZ10gKyBwZ29mZiwgc3JjLCBrKSkKLQkJCXJldHVybjsKLQkJbGVuIC09IGs7Ci0JCXdoaWxlIChsZW4gPiBQQUdFX1NJWkUpIHsKLQkJCWlmIChfX2NvcHlfZnJvbV91c2VyKGRzdFsrK3BnXSwgc3JjICsgaywgUEFHRV9TSVpFKSkKLQkJCQlyZXR1cm47Ci0JCQlrICs9IFBBR0VfU0laRTsKLQkJCWxlbiAtPSBQQUdFX1NJWkU7Ci0JCX0KLQkJaWYgKF9fY29weV9mcm9tX3VzZXIoZHN0WysrcGddLCBzcmMgKyBrLCBsZW4pKQotCQkJcmV0dXJuOwotCi0JfSBlbHNlCi0JCV9fY29weV9mcm9tX3VzZXIoKHU4ICopZHN0W3BnXSArIHBnb2ZmLCBzcmMsIGxlbik7Ci19Ci0KLS8qKgotICogY29weV9pbHZfYmxvY2sgLQotICoKLSAqIGNvcGllcyBhIGJsb2NrIG9mIHBjbSBkYXRhIGNvbnRhaW5pbmcgbiBpbnRlcmxlYXZlZCBjaGFubmVscyB0byBuIG1vbm8gdm9pY2UgYnVmZmVycy4KLSAqIE5vdGljZSB0aGF0IHRoZSB2b2ljZSBidWZmZXIgaXMgYWN0dWFsbHkgYSBzZXQgb2YgZGlzam9pbnRlZCBtZW1vcnkgcGFnZXMuCi0gKgotICovCi1zdGF0aWMgdm9pZCBjb3B5X2lsdl9ibG9jayhzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHUzMiBzdHIsIHU4IF9fdXNlciAqc3JjLCB1MzIgbGVuKSAKLXsKLSAgICAgICAgdW5zaWduZWQgaW50IHBnOwotCXVuc2lnbmVkIGludCBwZ29mZjsKLQl1bnNpZ25lZCBpbnQgdm9pY2VfbnVtOwotCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlID0gd29pbnN0LT52b2ljZTsKLQotCXBnID0gc3RyIC8gUEFHRV9TSVpFOwotCXBnb2ZmID0gc3RyICUgUEFHRV9TSVpFOwotCi0Jd2hpbGUgKGxlbikgeyAKLQkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKSB7Ci0JCQlpZiAoX19jb3B5X2Zyb21fdXNlcigodTggKikodm9pY2Vbdm9pY2VfbnVtXS5tZW0uYWRkcltwZ10pICsgcGdvZmYsIHNyYywgd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSkpCi0JCQkJcmV0dXJuOwotCQkJc3JjICs9IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0JCX0KLQotCQlsZW4gLT0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKLQotCQlwZ29mZiArPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOwotCQlpZiAocGdvZmYgPj0gUEFHRV9TSVpFKSB7Ci0JCQlwZ29mZiA9IDA7Ci0JCQlwZysrOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGZpbGxfYmxvY2sgLQotICoKLSAqIGZpbGxzIGEgc2V0IHZvaWNlIGJ1ZmZlcnMgd2l0aCBhIGJsb2NrIG9mIGEgZ2l2ZW4gc2FtcGxlLgotICoKLSAqLwotc3RhdGljIHZvaWQgZmlsbF9ibG9jayhzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHUzMiBzdHIsIHU4IGRhdGEsIHUzMiBsZW4pCi17Ci0JdW5zaWduZWQgaW50IHBnOwotCXVuc2lnbmVkIGludCBwZ29mZjsKLQl1bnNpZ25lZCBpbnQgdm9pY2VfbnVtOwotICAgICAgICBzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSA9IHdvaW5zdC0+dm9pY2U7Ci0JdW5zaWduZWQgaW50ICBrOwotCi0JcGcgPSBzdHIgLyBQQUdFX1NJWkU7Ci0JcGdvZmYgPSBzdHIgJSBQQUdFX1NJWkU7Ci0KLQlpZiAobGVuID4gUEFHRV9TSVpFIC0gcGdvZmYpIHsKLQkJayA9IFBBR0VfU0laRSAtIHBnb2ZmOwotCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCi0JCQltZW1zZXQoKHU4ICopdm9pY2Vbdm9pY2VfbnVtXS5tZW0uYWRkcltwZ10gKyBwZ29mZiwgZGF0YSwgayk7Ci0JCWxlbiAtPSBrOwotCQl3aGlsZSAobGVuID4gUEFHRV9TSVpFKSB7Ci0JCQlwZysrOwotCQkJZm9yICh2b2ljZV9udW0gPSAwOyB2b2ljZV9udW0gPCB3b2luc3QtPm51bV92b2ljZXM7IHZvaWNlX251bSsrKQotCQkJCW1lbXNldCh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSwgZGF0YSwgUEFHRV9TSVpFKTsKLQotCQkJbGVuIC09IFBBR0VfU0laRTsKLQkJfQotCQlwZysrOwotCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCi0JCQltZW1zZXQodm9pY2Vbdm9pY2VfbnVtXS5tZW0uYWRkcltwZ10sIGRhdGEsIGxlbik7Ci0KLQl9IGVsc2UgewotCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCi0JCQltZW1zZXQoKHU4ICopdm9pY2Vbdm9pY2VfbnVtXS5tZW0uYWRkcltwZ10gKyBwZ29mZiwgZGF0YSwgbGVuKTsKLQl9Ci19Ci0KLS8qKgotICogZW11MTBrMV93YXZlb3V0X3hmZXJkYXRhIC0KLSAqCi0gKiBjb3BpZXMgcGNtIGRhdGEgdG8gdGhlIHZvaWNlIGJ1ZmZlci4gU2lsZW5jZSBzYW1wbGVzCi0gKiBwcmV2aW91c2x5IGFkZGVkIHRvIHRoZSBidWZmZXIgYXJlIG92ZXJ3cml0dGVuLgotICoKLSAqLwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEoc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1OCBfX3VzZXIgKmRhdGEsIHUzMiAqc2l6ZSkKLXsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKLQlzdHJ1Y3Qgdm9pY2VfbWVtICptZW0gPSAmd29pbnN0LT52b2ljZVswXS5tZW07Ci0JdTMyIHNpemV0b2NvcHksIHNpemV0b2NvcHlfbm93LCBzdGFydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2l6ZXRvY29weSA9IG1pbl90KHUzMiwgYnVmZmVyLT5zaXplLCAqc2l6ZSk7Ci0JKnNpemUgPSBzaXpldG9jb3B5OwotCi0JaWYgKCFzaXpldG9jb3B5KQotCQlyZXR1cm47Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCXN0YXJ0ID0gKGJ1ZmZlci0+c2l6ZSArIGJ1ZmZlci0+c2lsZW5jZV9wb3MgLSBidWZmZXItPnNpbGVuY2VfYnl0ZXMpICUgYnVmZmVyLT5zaXplOwotCi0JaWYgKHNpemV0b2NvcHkgPiBidWZmZXItPnNpbGVuY2VfYnl0ZXMpIHsKLQkJYnVmZmVyLT5zaWxlbmNlX3BvcyArPSBzaXpldG9jb3B5IC0gYnVmZmVyLT5zaWxlbmNlX2J5dGVzOwotCQlidWZmZXItPmZyZWVfYnl0ZXMgLT0gc2l6ZXRvY29weSAtIGJ1ZmZlci0+c2lsZW5jZV9ieXRlczsKLQkJYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gMDsKLQl9IGVsc2UKLQkJYnVmZmVyLT5zaWxlbmNlX2J5dGVzIC09IHNpemV0b2NvcHk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKLQotCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7Ci0JaWYgKHNpemV0b2NvcHkgPiBzaXpldG9jb3B5X25vdykgewotCQlzaXpldG9jb3B5IC09IHNpemV0b2NvcHlfbm93OwotCQlpZiAod29pbnN0LT5udW1fdm9pY2VzID4gMSkgewotCQkJY29weV9pbHZfYmxvY2sod29pbnN0LCBzdGFydCwgZGF0YSwgc2l6ZXRvY29weV9ub3cpOwotCQkJY29weV9pbHZfYmxvY2sod29pbnN0LCAwLCBkYXRhICsgc2l6ZXRvY29weV9ub3cgKiB3b2luc3QtPm51bV92b2ljZXMsIHNpemV0b2NvcHkpOwotCQl9IGVsc2UgewotCQkJY29weV9ibG9jayhtZW0tPmFkZHIsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5X25vdyk7Ci0JCQljb3B5X2Jsb2NrKG1lbS0+YWRkciwgMCwgZGF0YSArIHNpemV0b2NvcHlfbm93LCBzaXpldG9jb3B5KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKQotCQkJY29weV9pbHZfYmxvY2sod29pbnN0LCBzdGFydCwgZGF0YSwgc2l6ZXRvY29weSk7Ci0JCWVsc2UKLQkJCWNvcHlfYmxvY2sobWVtLT5hZGRyLCBzdGFydCwgZGF0YSwgc2l6ZXRvY29weSk7Ci0JfQotfQotCi0vKioKLSAqIGVtdTEwazFfd2F2ZW91dF9maWxsc2lsZW5jZSAtCi0gKgotICogYWRkcyBzYW1wbGVzIG9mIHNpbGVuY2UgdG8gdGhlIHZvaWNlIGJ1ZmZlciBzbyB0aGF0IHdlCi0gKiBkb24ndCBsb29wIG92ZXIgc3RhbGUgcGNtIGRhdGEuCi0gKgotICovCi12b2lkIGVtdTEwazFfd2F2ZW91dF9maWxsc2lsZW5jZShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QpCi17Ci0Jc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7Ci0JdTMyIHNpemV0b2NvcHksIHNpemV0b2NvcHlfbm93LCBzdGFydDsKLQl1OCBmaWxsZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2l6ZXRvY29weSA9IGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZTsKLQotCWlmICh3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9PSAxNikKLQkJZmlsbGRhdGEgPSAweDAwOwotCWVsc2UKLQkJZmlsbGRhdGEgPSAweDgwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOwotCWJ1ZmZlci0+c2lsZW5jZV9ieXRlcyArPSBzaXpldG9jb3B5OwotCWJ1ZmZlci0+ZnJlZV9ieXRlcyAtPSBzaXpldG9jb3B5OwotCWJ1ZmZlci0+c2lsZW5jZV9wb3MgJT0gYnVmZmVyLT5zaXplOwotCXN0YXJ0ID0gYnVmZmVyLT5zaWxlbmNlX3BvczsKLQlidWZmZXItPnNpbGVuY2VfcG9zICs9IHNpemV0b2NvcHk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7Ci0KLQlzaXpldG9jb3B5X25vdyA9IGJ1ZmZlci0+c2l6ZSAtIHN0YXJ0OwotCi0JaWYgKHNpemV0b2NvcHkgPiBzaXpldG9jb3B5X25vdykgewotCQlzaXpldG9jb3B5IC09IHNpemV0b2NvcHlfbm93OwotCQlmaWxsX2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGZpbGxkYXRhLCBzaXpldG9jb3B5X25vdyk7Ci0JCWZpbGxfYmxvY2sod29pbnN0LCAwLCBmaWxsZGF0YSwgc2l6ZXRvY29weSk7Ci0JfSBlbHNlIHsKLQkJZmlsbF9ibG9jayh3b2luc3QsIHN0YXJ0LCBmaWxsZGF0YSwgc2l6ZXRvY29weSk7Ci0JfQotfQotCi0vKioKLSAqIGVtdTEwazFfd2F2ZW91dF91cGRhdGUgLQotICoKLSAqIHVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB2b2ljZSBidWZmZXIgaGFyZHdhcmUgcG9pbnRlciAoaHdfcG9zKQotICogYW5kIHRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyBvbiB0aGUgYnVmZmVyIChmcmVlX2J5dGVzKS4KLSAqIFRoZSBmcmVlIGJ5dGVzIF9kb24ndF8gaW5jbHVkZSBzaWxlbmNlIGJ5dGVzIHRoYXQgbWF5IGhhdmUgYmVlbgotICogYWRkZWQgdG8gdGhlIGJ1ZmZlci4KLSAqCi0gKi8KLXZvaWQgZW11MTBrMV93YXZlb3V0X3VwZGF0ZShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QpCi17Ci0JdTMyIGh3X3BvczsKLQl1MzIgZGlmZjsKLQotCS8qIFRoZXJlIGlzIG5vIGFjdHVhbCBzdGFydCB5ZXQgKi8KLQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgewotCQlod19wb3MgPSB3b2luc3QtPmJ1ZmZlci5od19wb3M7Ci0JfSBlbHNlIHsKLQkJLyogaHdfcG9zIGluIHNhbXBsZSB1bml0cyAqLwotCQlod19wb3MgPSBzYmxpdmVfcmVhZHB0cih3b2luc3QtPnZvaWNlWzBdLmNhcmQsIENDQ0FfQ1VSUkFERFIsIHdvaW5zdC0+dm9pY2VbMF0ubnVtKTsKLQotCQlpZihod19wb3MgPCB3b2luc3QtPnZvaWNlWzBdLnN0YXJ0KQotCQkJaHdfcG9zICs9IHdvaW5zdC0+YnVmZmVyLnNpemUgLyB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlIC0gd29pbnN0LT52b2ljZVswXS5zdGFydDsKLQkJZWxzZQotCQkJaHdfcG9zIC09IHdvaW5zdC0+dm9pY2VbMF0uc3RhcnQ7Ci0KLQkJaHdfcG9zICo9IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7Ci0JfQotCi0JZGlmZiA9ICh3b2luc3QtPmJ1ZmZlci5zaXplICsgaHdfcG9zIC0gd29pbnN0LT5idWZmZXIuaHdfcG9zKSAlIHdvaW5zdC0+YnVmZmVyLnNpemU7Ci0Jd29pbnN0LT50b3RhbF9wbGF5ZWQgKz0gZGlmZjsKLQl3b2luc3QtPmJ1ZmZlci5mcmVlX2J5dGVzICs9IGRpZmY7Ci0Jd29pbnN0LT5idWZmZXIuaHdfcG9zID0gaHdfcG9zOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmggYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlY2U4OC4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgY2FyZHdvLmggLS0gaGVhZGVyIGZpbGUgZm9yIGNhcmQgd2F2ZSBvdXQgZnVuY3Rpb25zCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpZm5kZWYgX0NBUkRXT19ICi0jZGVmaW5lIF9DQVJEV09fSAotCi0jaW5jbHVkZSAiaWNhcmR3YXYuaCIKLSNpbmNsdWRlICJhdWRpby5oIgotI2luY2x1ZGUgInZvaWNlbWdyLmgiCi0jaW5jbHVkZSAidGltZXIuaCIKLQotLyogc2V0dGluZyB0aGlzIHRvIG90aGVyIHRoYW4gYSBwb3dlciBvZiB0d28gbWF5IGJyZWFrIHNvbWUgYXBwbGljYXRpb25zICovCi0jZGVmaW5lIFdBVkVPVVRfTUFYQlVGU0laRQlNQVhCVUZTSVpFCi0KLSNkZWZpbmUgV0FWRU9VVF9ERUZBVUxURlJBR0xFTgkyMCAvKiBUaW1lIHRvIHBsYXkgYSBmcmFnbWVudCBpbiBtcyAobGF0ZW5jeSkgKi8KLSNkZWZpbmUgV0FWRU9VVF9ERUZBVUxUQlVGTEVOCTUwMCAvKiBUaW1lIHRvIHBsYXkgdGhlIGVudGlyZSBidWZmZXIgaW4gbXMgKi8KLQotI2RlZmluZSBXQVZFT1VUX01JTkZSQUdTSElGVAk2IC8qIE1pbmltdW0gZnJhZ21lbnQgc2l6ZSBpbiBieXRlcyBpcyAyXjYgKi8KLSNkZWZpbmUgV0FWRU9VVF9NSU5GUkFHUwkzIC8qIF9kb24ndF8gZ28gYmVsbG93IDMsIGl0IHdvdWxkIGJyZWFrIHNpbGVuY2UgZmlsbGluZyAqLwotI2RlZmluZSBXQVZFT1VUX01BWFZPSUNFUwk2Ci0KLXN0cnVjdCB3YXZlb3V0X2J1ZmZlciB7Ci0JdTE2IG9zc2ZyYWdzaGlmdDsKLQl1MzIgbnVtZnJhZ3M7Ci0JdTMyIGZyYWdtZW50X3NpemU7CS8qIGluIGJ5dGVzIHVuaXRzICovCi0JdTMyIHNpemU7CQkvKiBpbiBieXRlcyB1bml0cyAqLwotCXUzMiBwYWdlczsJCS8qIGJ1ZmZlciBzaXplIGluIHBhZ2UgdW5pdHMqLwotCXUzMiBzaWxlbmNlX3BvczsJLyogc29mdHdhcmUgY3Vyc29yIHBvc2l0aW9uIChpbmNsdWRpbmcgc2lsZW5jZSBieXRlcykgKi8KLQl1MzIgaHdfcG9zOwkJLyogaGFyZHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCi0JdTMyIGZyZWVfYnl0ZXM7CQkvKiBmcmVlIGJ5dGVzIGF2YWlsYWJsZSBvbiB0aGUgYnVmZmVyIChub3QgaW5jbHVkaW5nIHNpbGVuY2UgYnl0ZXMpICovCi0JdTggZmlsbF9zaWxlbmNlOwotCXUzMiBzaWxlbmNlX2J5dGVzOyAgICAgIC8qIHNpbGVuY2UgYnl0ZXMgb24gdGhlIGJ1ZmZlciAqLwotfTsKLQotc3RydWN0IHdvaW5zdCAKLXsKLQl1OCBzdGF0ZTsKLQl1OCBudW1fdm9pY2VzOwotCXN0cnVjdCBlbXVfdm9pY2Ugdm9pY2VbV0FWRU9VVF9NQVhWT0lDRVNdOwotCXN0cnVjdCBlbXVfdGltZXIgdGltZXI7Ci0Jc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKLQlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgYnVmZmVyOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7Ci0JdTggbW1hcHBlZDsKLQl1MzIgdG90YWxfY29waWVkOwkvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbigpIHRvIHRoZSBidWZmZXIgKGV4Y2x1ZGluZyBzaWxlbmNlKSAqLwotCXUzMiB0b3RhbF9wbGF5ZWQ7CS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBwbGF5ZWQgaW5jbHVkaW5nIHNpbGVuY2UgKi8KLQl1MzIgYmxvY2tzOwotCXU4IGRldmljZTsKLQlzcGlubG9ja190IGxvY2s7Ci19OwotCi1pbnQgZW11MTBrMV93YXZlb3V0X29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Ci12b2lkIGVtdTEwazFfd2F2ZW91dF9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUoc3RydWN0IHdvaW5zdCosIHUzMiAqKTsKLXZvaWQgZW11MTBrMV93YXZlb3V0X3hmZXJkYXRhKHN0cnVjdCB3b2luc3QqLCB1OCBfX3VzZXIgKiwgdTMyICopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfZmlsbHNpbGVuY2Uoc3RydWN0IHdvaW5zdCopOwotaW50IGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSosIHN0cnVjdCB3YXZlX2Zvcm1hdCopOwotdm9pZCBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHN0cnVjdCB3b2luc3QqKTsKLQotI2VuZGlmIC8qIF9DQVJEV09fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZTYzNWYuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGVjYXJkLmMgLSBFLWNhcmQgaW5pdGlhbGl6YXRpb24gY29kZQotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLyAKLQotI2luY2x1ZGUgImVjYXJkLmgiCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLQotLyogUHJpdmF0ZSByb3V0aW5lcyAqLwotc3RhdGljIHZvaWQgZWNhcmRfc2V0YWRjZ2FpbihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlY2FyZF9zdGF0ZSAqLCB1MTYpOwotc3RhdGljIHZvaWQgZWNhcmRfd3JpdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmdW5jIFNldCB0aGUgZ2FpbiBvZiB0aGUgRUNBUkQncyBDUzMzMTAgVHJpbS9nYWluIGNvbnRyb2xsZXIuICBUaGUKLSAqIHRyaW0gdmFsdWUgY29uc2lzdHMgb2YgYSAxNmJpdCB2YWx1ZSB3aGljaCBpcyBjb21wb3NlZCBvZiB0d28KLSAqIDggYml0IGdhaW4vdHJpbSB2YWx1ZXMsIG9uZSBmb3IgdGhlIGxlZnQgY2hhbm5lbCBhbmQgb25lIGZvciB0aGUKLSAqIHJpZ2h0IGNoYW5uZWwuICBUaGUgZm9sbG93aW5nIHRhYmxlIG1hcHMgZnJvbSB0aGUgR2Fpbi9BdHRlbnVhdGlvbgotICogdmFsdWUgaW4gZGVjaWJlbHMgaW50byB0aGUgY29ycmVzcG9uZGluZyBiaXQgcGF0dGVybiBmb3IgYSBzaW5nbGUKLSAqIGNoYW5uZWwuCi0gKi8KLQotc3RhdGljIHZvaWQgZWNhcmRfc2V0YWRjZ2FpbihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZWNhcmRfc3RhdGUgKmVjYXJkLCB1MTYgZ2FpbikKLXsKLQl1MzIgY3VycmJpdDsKLQllY2FyZC0+YWRjX2dhaW4gPSBnYWluOwotCi0JLyogRW5hYmxlIHdyaXRpbmcgdG8gdGhlIFRSSU0gcmVnaXN0ZXJzICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQtPmNvbnRyb2xfYml0cyAmIH5FQ19UUklNX0NTTik7Ci0KLQkvKiBEbyBpdCBhZ2FpbiB0byBpbnN1cmUgdGhhdCB3ZSBtZWV0IGhvbGQgdGltZSByZXF1aXJlbWVudHMgKi8KLQllY2FyZF93cml0ZShjYXJkLCBlY2FyZC0+Y29udHJvbF9iaXRzICYgfkVDX1RSSU1fQ1NOKTsKLQotCWZvciAoY3VycmJpdCA9ICgxTCA8PCAxNSk7IGN1cnJiaXQ7IGN1cnJiaXQgPj49IDEpIHsKLQotCQl1MzIgdmFsdWUgPSBlY2FyZC0+Y29udHJvbF9iaXRzICYgfihFQ19UUklNX0NTTnxFQ19UUklNX1NEQVRBKTsKLQotCQlpZiAoZ2FpbiAmIGN1cnJiaXQpCi0JCSAgICAgIHZhbHVlIHw9IEVDX1RSSU1fU0RBVEE7Ci0KLQkJLyogQ2xvY2sgdGhlIGJpdCAqLwotCQllY2FyZF93cml0ZShjYXJkLCB2YWx1ZSk7Ci0JCWVjYXJkX3dyaXRlKGNhcmQsIHZhbHVlIHwgRUNfVFJJTV9TQ0xLKTsKLQkJZWNhcmRfd3JpdGUoY2FyZCwgdmFsdWUpOwotCX0KLQotCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLT5jb250cm9sX2JpdHMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmdW5jIENsb2NrIGJpdHMgaW50byB0aGUgRWNhcmQncyBjb250cm9sIGxhdGNoLiAgVGhlIEVjYXJkIHVzZXMgYQotICogIGNvbnRyb2wgbGF0Y2ggd2lsbCBpcyBsb2FkZWQgYml0LXNlcmlhbGx5IGJ5IHRvZ2dsaW5nIHRoZSBNb2RlbSBjb250cm9sCi0gKiAgbGluZXMgZnJvbSBmdW5jdGlvbiAyIG9uIHRoZSBFODAxMC4gIFRoaXMgZnVuY3Rpb24gaGlkZXMgdGhlc2UgZGV0YWlscwotICogIGFuZCBwcmVzZW50cyB0aGUgaWxsdXNpb24gdGhhdCB3ZSBhcmUgYWN0dWFsbHkgd3JpdGluZyB0byBhIGRpc3RpbmN0Ci0gKiAgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGVjYXJkX3dyaXRlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiB2YWx1ZSkKLXsKLQl1MTYgY291bnQ7Ci0JdTMyIGRhdGEsIGhjdmFsdWU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQloY3ZhbHVlID0gaW5sKGNhcmQtPmlvYmFzZSArIEhDRkcpICYgfihIT09LTl9CSVR8SEFORE5fQklUfFBVTFNFTl9CSVQpOwotCi0Jb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlKTsKLQotCWZvciAoY291bnQgPSAwIDsgY291bnQgPCBFQ19OVU1fQ09OVFJPTF9CSVRTOyBjb3VudCsrKSB7Ci0JCi0JCS8qIFNldCB1cCB0aGUgdmFsdWUgKi8KLQkJZGF0YSA9ICgodmFsdWUgJiAweDEpID8gUFVMU0VOX0JJVCA6IDApOwotCQl2YWx1ZSA+Pj0gMTsKLQotCQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBkYXRhKTsKLQotCQkvKiBDbG9jayB0aGUgc2hpZnQgcmVnaXN0ZXIgKi8KLQkJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgZGF0YSB8IEhBTkROX0JJVCk7Ci0JCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IGRhdGEpOwotCX0KLQotCS8qIExhdGNoIHRoZSBiaXRzICovCi0Jb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgSE9PS05fQklUKTsKLQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotfQotCi12b2lkIF9fZGV2aW5pdCBlbXUxMGsxX2VjYXJkX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1MzIgaGN2YWx1ZTsKLQlzdHJ1Y3QgZWNhcmRfc3RhdGUgZWNhcmQ7Ci0KLQkvKiBTZXQgdXAgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLQllY2FyZC5tdXgwX3NldHRpbmcgPSBFQ19ERUZBVUxUX1NQRElGMF9TRUw7Ci0JZWNhcmQubXV4MV9zZXR0aW5nID0gRUNfREVGQVVMVF9TUERJRjFfU0VMOwotCWVjYXJkLm11eDJfc2V0dGluZyA9IDA7Ci0JZWNhcmQuYWRjX2dhaW4gPSBFQ19ERUZBVUxUX0FEQ19HQUlOOwotCWVjYXJkLmNvbnRyb2xfYml0cyA9IEVDX1JBV19SVU5fTU9ERSB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19TUERJRjBfU0VMRUNUKGVjYXJkLm11eDBfc2V0dGluZykgfAotCQkJICAgICBFQ19TUERJRjFfU0VMRUNUKGVjYXJkLm11eDFfc2V0dGluZyk7Ci0KLQotCS8qIFN0ZXAgMDogU2V0IHRoZSBjb2RlYyB0eXBlIGluIHRoZSBoYXJkd2FyZSBjb250cm9sIHJlZ2lzdGVyIAotCSAqIGFuZCBlbmFibGUgYXVkaW8gb3V0cHV0ICovCi0JaGN2YWx1ZSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBIQ0ZHKTsKLQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIGhjdmFsdWUgfCBIQ0ZHX0FVRElPRU5BQkxFIHwgSENGR19DT0RFQ0ZPUk1BVF9JMlMpOwotCi0JLyogU3RlcCAxOiBUdXJuIG9mZiB0aGUgbGVkIGFuZCBkZWFzc2VydCBUUklNX0NTICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgRUNfQURDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKLQotCS8qIFN0ZXAgMjogQ2FsaWJyYXRlIHRoZSBBREMgYW5kIERBQyAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIEVDX0RBQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7Ci0KLQkvKiBTdGVwIDM6IFdhaXQgZm9yIGF3aGlsZTsgRklYTUU6IElzIHRoaXMgY29ycmVjdD8gKi8KLQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoSFopOwotCi0JLyogU3RlcCA0OiBTd2l0Y2ggb2ZmIHRoZSBEQUMgYW5kIEFEQyBjYWxpYnJhdGlvbi4gIE5vdGUKLQkgKiBUaGF0IEFEQ19DQUwgaXMgYWN0dWFsbHkgYW4gaW52ZXJ0ZWQgc2lnbmFsLCBzbyB3ZSBhc3NlcnQKLQkgKiBpdCBoZXJlIHRvIHN0b3AgY2FsaWJyYXRpb24uICAqLwotCWVjYXJkX3dyaXRlKGNhcmQsIEVDX0FEQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7Ci0KLQkvKiBTdGVwIDQ6IFN3aXRjaCBpbnRvIHJ1biBtb2RlICovCi0JZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQuY29udHJvbF9iaXRzKTsKLQotCS8qIFN0ZXAgNTogU2V0IHRoZSBhbmFsb2cgaW5wdXQgZ2FpbiAqLwotCWVjYXJkX3NldGFkY2dhaW4oY2FyZCwgJmVjYXJkLCBlY2FyZC5hZGNfZ2Fpbik7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YWVhZDEuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGVjYXJkLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovIAotCi0jaWZuZGVmIF9FQ0FSRF9ICi0jZGVmaW5lIF9FQ0FSRF9ICi0KLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLS8qIEluIEExIFNpbGljb24sIHRoZXNlIGJpdHMgYXJlIGluIHRoZSBIQyByZWdpc3RlciAqLwotI2RlZmluZSBIT09LTl9CSVQgICAoMUwgPDwgMTIpCi0jZGVmaW5lIEhBTkROX0JJVCAgICgxTCA8PCAxMSkKLSNkZWZpbmUgUFVMU0VOX0JJVCAgKDFMIDw8IDEwKQotCi0jZGVmaW5lIEVDX0dESTEgKDEgPDwgMTMpCi0jZGVmaW5lIEVDX0dESTAgKDEgPDwgMTQpCi0KLSNkZWZpbmUgRUNfTlVNX0NPTlRST0xfQklUUyAyMAotCi0jZGVmaW5lIEVDX0FDM19EQVRBX1NFTE4gIDB4MDAwMUwKLSNkZWZpbmUgRUNfRUVfREFUQV9TRUwgICAgMHgwMDAyTAotI2RlZmluZSBFQ19FRV9DTlRSTF9TRUxOICAweDAwMDRMCi0jZGVmaW5lIEVDX0VFQ0xLICAgICAgICAgIDB4MDAwOEwKLSNkZWZpbmUgRUNfRUVDUyAgICAgICAgICAgMHgwMDEwTAotI2RlZmluZSBFQ19FRVNETyAgICAgICAgICAweDAwMjBMCi0jZGVmaW5lIEVDX1RSSU1fQ1NOCSAgMHgwMDQwTAotI2RlZmluZSBFQ19UUklNX1NDTEsJICAweDAwODBMCi0jZGVmaW5lIEVDX1RSSU1fU0RBVEEJICAweDAxMDBMCi0jZGVmaW5lIEVDX1RSSU1fTVVURU4JICAweDAyMDBMCi0jZGVmaW5lIEVDX0FEQ0NBTAkgIDB4MDQwMEwKLSNkZWZpbmUgRUNfQURDUlNUTgkgIDB4MDgwMEwKLSNkZWZpbmUgRUNfREFDQ0FMCSAgMHgxMDAwTAotI2RlZmluZSBFQ19EQUNNVVRFTgkgIDB4MjAwMEwKLSNkZWZpbmUgRUNfTEVETgkJICAweDQwMDBMCi0KLSNkZWZpbmUgRUNfU1BESUYwX1NFTF9TSElGVAkxNQotI2RlZmluZSBFQ19TUERJRjFfU0VMX1NISUZUCTE3CQotI2RlZmluZSBFQ19TUERJRjBfU0VMX01BU0sJKDB4M0wgPDwgRUNfU1BESUYwX1NFTF9TSElGVCkKLSNkZWZpbmUgRUNfU1BESUYxX1NFTF9NQVNLCSgweDdMIDw8IEVDX1NQRElGMV9TRUxfU0hJRlQpCi0jZGVmaW5lIEVDX1NQRElGMF9TRUxFQ1QoX3gpICgoKF94KSA8PCBFQ19TUERJRjBfU0VMX1NISUZUKSAmIEVDX1NQRElGMF9TRUxfTUFTSykKLSNkZWZpbmUgRUNfU1BESUYxX1NFTEVDVChfeCkgKCgoX3gpIDw8IEVDX1NQRElGMV9TRUxfU0hJRlQpICYgRUNfU1BESUYxX1NFTF9NQVNLKQotI2RlZmluZSBFQ19DVVJSRU5UX1BST01fVkVSU0lPTiAweDAxIC8qIFNlbGYtZXhwbGFuYXRvcnkuICBUaGlzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIGluY3JlbWVudGVkIGFueSB0aW1lIHRoZSBFRVBST00ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvcm1hdCBpcyBjaGFuZ2VkLiAgKi8KLQotI2RlZmluZSBFQ19FRVBST01fU0laRQkgICAgICAgIDB4NDAgLyogRUNBUkQgRUVQUk9NIGhhcyA2NCAxNi1iaXQgd29yZHMgKi8KLQotLyogQWRkcmVzc2VzIGZvciBzcGVjaWFsIHZhbHVlcyBzdG9yZWQgaW4gdG8gRUVQUk9NICovCi0jZGVmaW5lIEVDX1BST01fVkVSU0lPTl9BRERSCTB4MjAJLyogQWRkcmVzcyBvZiB0aGUgY3VycmVudCBwcm9tIHZlcnNpb24gKi8KLSNkZWZpbmUgRUNfQk9BUkRSRVYwX0FERFIJMHgyMQkvKiBMU1cgb2YgYm9hcmQgcmV2ICovCi0jZGVmaW5lIEVDX0JPQVJEUkVWMV9BRERSIAkweDIyCS8qIE1TVyBvZiBib2FyZCByZXYgKi8gCi0KLSNkZWZpbmUgRUNfTEFTVF9QUk9NRklMRV9BRERSCTB4MmYKLQotI2RlZmluZSBFQ19TRVJJQUxOVU1fQURECTB4MzAJLyogRmlyc3Qgd29yZCBvZiBzZXJpYWwgbnVtYmVyLiAgVGhlIG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNhbiBiZSB1cCB0byAzMCBjaGFyYWN0ZXJzIGluIGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBpcyBzdG9yZWQgYXMgYSBOVUxMLXRlcm1pbmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBU0NJSSBzdHJpbmcuICBBbnkgdW51c2VkIGJ5dGVzIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWxsZWQgd2l0aCB6ZXJvcyAqLwotI2RlZmluZSBFQ19DSEVDS1NVTV9BRERSCTB4M2YgICAgLyogTG9jYXRpb24gYXQgd2hpY2ggY2hlY2tzdW0gaXMgc3RvcmVkICovCi0KLQotCi0vKiBNb3N0IG9mIHRoaXMgc3R1ZmYgaXMgcHJldHR5IHNlbGYtZXZpZGVudC4gIEFjY29yZGluZyB0byB0aGUgaGFyZHdhcmUgCi0gKiBkdWRlcywgd2UgbmVlZCB0byBsZWF2ZSB0aGUgQURDQ0FMIGJpdCBsb3cgaW4gb3JkZXIgdG8gYXZvaWQgYSBEQyAKLSAqIG9mZnNldCBwcm9ibGVtLiAgV2VpcmQuCi0gKi8KLSNkZWZpbmUgRUNfUkFXX1JVTl9NT0RFCShFQ19EQUNNVVRFTiB8IEVDX0FEQ1JTVE4gfCBFQ19UUklNX01VVEVOIHwgRUNfVFJJTV9DU04pCi0KLQotI2RlZmluZSBFQ19ERUZBVUxUX0FEQ19HQUlOICAgMHhDNEM0Ci0jZGVmaW5lIEVDX0RFRkFVTFRfU1BESUYwX1NFTCAweDAKLSNkZWZpbmUgRUNfREVGQVVMVF9TUERJRjFfU0VMIDB4NAotCi0jZGVmaW5lIEhDX0VBIDB4MDFMCi0KLS8qIEVDQVJEIHN0YXRlIHN0cnVjdHVyZS4gIFRoaXMgc3RydWN0dXJlIG1haW50YWlucyB0aGUgc3RhdGUKLSAqIGZvciB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBFQ0FSRCdzIG9uYm9hcmQgaGFyZHdhcmUuCi0gKi8KLXN0cnVjdCBlY2FyZF9zdGF0ZSB7Ci0JdTMyIGNvbnRyb2xfYml0czsKLQl1MTYgYWRjX2dhaW47Ci0JdTE2IG11eDBfc2V0dGluZzsKLQl1MTYgbXV4MV9zZXR0aW5nOwotCXUxNiBtdXgyX3NldHRpbmc7Ci19OwotCi12b2lkIGVtdTEwazFfZWNhcmRfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICopIF9fZGV2aW5pdDsKLQotI2VuZGlmIC8qIF9FQ0FSRF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDU4NjVkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGVmeG1nci5jCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgImVmeG1nci5oIgotCi1pbnQgZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKHN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IsIGNvbnN0IGNoYXIgKnBhdGNoX25hbWUsIGNvbnN0IGNoYXIgKmdwcl9uYW1lKQotewotICAgICAgICBzdHJ1Y3QgZHNwX3BhdGNoICpwYXRjaDsKLQlzdHJ1Y3QgZHNwX3JwYXRjaCAqcnBhdGNoOwotCWNoYXIgc1tQQVRDSF9OQU1FX1NJWkUgKyA0XTsKLQl1bnNpZ25lZCBsb25nICpncHJfdXNlZDsKLQlpbnQgaTsKLQotCURQRCgyLCAiZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCk6ICVzICVzXG4iLCBwYXRjaF9uYW1lLCBncHJfbmFtZSk7Ci0KLQlycGF0Y2ggPSAmbWdyLT5ycGF0Y2g7Ci0JaWYgKCFzdHJjbXAocnBhdGNoLT5uYW1lLCBwYXRjaF9uYW1lKSkgewotCQlncHJfdXNlZCA9IHJwYXRjaC0+Z3ByX3VzZWQ7Ci0JCWdvdG8gbWF0Y2g7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG1nci0+Y3VycmVudF9wYWdlcyAqIFBBVENIRVNfUEVSX1BBR0U7IGkrKykgewotCQlwYXRjaCA9IFBBVENIKG1nciwgaSk7Ci0JCQlzcHJpbnRmKHMsIiVzIiwgcGF0Y2gtPm5hbWUpOwotCi0JCWlmICghc3RyY21wKHMsIHBhdGNoX25hbWUpKSB7Ci0JCQlncHJfdXNlZCA9IHBhdGNoLT5ncHJfdXNlZDsKLQkJCWdvdG8gbWF0Y2g7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLTE7Ci0KLSAgbWF0Y2g6Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9HUFJTOyBpKyspCi0JCWlmIChtZ3ItPmdwcltpXS50eXBlID09IEdQUl9UWVBFX0NPTlRST0wgJiYKLQkJICAgIHRlc3RfYml0KGksIGdwcl91c2VkKSAmJgotCQkgICAgIXN0cmNtcChtZ3ItPmdwcltpXS5uYW1lLCBncHJfbmFtZSkpCi0JCQlyZXR1cm4gaTsKLQotCXJldHVybiAtMTsKLX0KLQotdm9pZCBlbXUxMGsxX3NldF9jb250cm9sX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgYWRkciwgczMyIHZhbCwgaW50IGZsYWcpCi17Ci0Jc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciA9ICZjYXJkLT5tZ3I7Ci0KLQlEUEQoMiwgImVtdTEwazFfc2V0X2NvbnRyb2xfZ3ByKCk6ICVkICV4XG4iLCBhZGRyLCB2YWwpOwotCi0JaWYgKGFkZHIgPCAwIHx8IGFkZHIgPj0gTlVNX0dQUlMpCi0JCXJldHVybjsKLQotCS8vZml4bWU6IG9uY2UgcGF0Y2ggbWFuYWdlciBpcyB1cCwgcmVtZW1iZXIgdG8gZml4IHRoaXMgZm9yIHRoZSBhdWRpZ3kKLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0dQUl9CQVNFICsgYWRkciwgMCwgdmFsKTsKLQl9IGVsc2UgewotCQlpZiAoZmxhZykKLQkJCXZhbCArPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBHUFJfQkFTRSArIGFkZHIsIDApOwotCQlpZiAodmFsID4gbWdyLT5ncHJbYWRkcl0ubWF4KQotCQkJdmFsID0gbWdyLT5ncHJbYWRkcl0ubWF4OwotCQllbHNlIGlmICh2YWwgPCBtZ3ItPmdwclthZGRyXS5taW4pCi0JCQl2YWwgPSBtZ3ItPmdwclthZGRyXS5taW47Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBHUFJfQkFTRSArIGFkZHIsIDAsIHZhbCk7Ci0JfQotCQotCQotfQotCi0vL1RPRE86IG1ha2UgdGhpcyBjb25maWd1cmFibGU6Ci0jZGVmaW5lIFZPTENUUkxfQ0hBTk5FTCBTT1VORF9NSVhFUl9WT0xVTUUKLSNkZWZpbmUgVk9MQ1RSTF9TVEVQX1NJWkUgICAgICAgIDUKLQotLy9BbiBpbnRlcm5hbCBmdW5jdGlvbiBmb3Igc2V0dGluZyBPU1MgbWl4ZXIgY29udHJvbHMuCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3NldF9vc3Nfdm9sKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBvc3NfbWl4ZXIsCi0JCQkJdW5zaWduZWQgaW50IGxlZnQsIHVuc2lnbmVkIGludCByaWdodCkKLXsKLQlleHRlcm4gY2hhciB2b2x1bWVfcGFyYW1zW1NPVU5EX01JWEVSX05SREVWSUNFU107Ci0KLQljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfbWl4ZXJdID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKLQotCWlmICghY2FyZC0+aXNfYXBzKQotCQljYXJkLT5hYzk3LT53cml0ZV9taXhlcihjYXJkLT5hYzk3LCBvc3NfbWl4ZXIsIGxlZnQsIHJpZ2h0KTsKLQkKLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzBdLCBsZWZ0LAotCQkJICAgICAgIHZvbHVtZV9wYXJhbXNbb3NzX21peGVyXSk7Ci0KLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzFdLCByaWdodCwKLQkJCSAgICAgICB2b2x1bWVfcGFyYW1zW29zc19taXhlcl0pOwotfQotCi0vL0ZJWE1FOiBtdXRlIHNob3VsZCB1bm11dGUgd2hlbiBwcmVzc2VkIGEgc2Vjb25kIHRpbWUKLXZvaWQgZW11MTBrMV9tdXRlX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlpbnQgb3NzX2NoYW5uZWwgPSBWT0xDVFJMX0NIQU5ORUw7Ci0JaW50IGxlZnQsIHJpZ2h0OwotCXN0YXRpYyBpbnQgdmFsOwotCi0JaWYgKHZhbCkgewotCQlsZWZ0ID0gdmFsICYgMHhmZjsKLQkJcmlnaHQgPSAodmFsID4+IDgpICYgMHhmZjsKLQkJdmFsID0gMDsKLQl9IGVsc2UgewotCQl2YWwgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF07Ci0JCWxlZnQgPSAwOwotCQlyaWdodCA9IDA7Ci0JfQotCi0JZW11MTBrMV9zZXRfb3NzX3ZvbChjYXJkLCBvc3NfY2hhbm5lbCwgbGVmdCwgcmlnaHQpOwotfQotCi12b2lkIGVtdTEwazFfdm9saW5jcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IG9zc19jaGFubmVsID0gVk9MQ1RSTF9DSEFOTkVMOwotCWludCBsZWZ0LCByaWdodDsKLQotCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gJiAweGZmOwotCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSA+PiA4KSAmIDB4ZmY7Ci0KLQlpZiAoKGxlZnQgKz0gVk9MQ1RSTF9TVEVQX1NJWkUpID4gMTAwKQotCQlsZWZ0ID0gMTAwOwotCi0JaWYgKChyaWdodCArPSBWT0xDVFJMX1NURVBfU0laRSkgPiAxMDApCi0JCXJpZ2h0ID0gMTAwOwotCi0JZW11MTBrMV9zZXRfb3NzX3ZvbChjYXJkLCBvc3NfY2hhbm5lbCwgbGVmdCwgcmlnaHQpOwotfQotCi12b2lkIGVtdTEwazFfdm9sZGVjcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IG9zc19jaGFubmVsID0gVk9MQ1RSTF9DSEFOTkVMOwotCWludCBsZWZ0LCByaWdodDsKLQotCWxlZnQgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gJiAweGZmOwotCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19jaGFubmVsXSA+PiA4KSAmIDB4ZmY7Ci0KLQlpZiAoKGxlZnQgLT0gVk9MQ1RSTF9TVEVQX1NJWkUpIDwgMCkKLQkJbGVmdCA9IDA7Ci0KLQlpZiAoKHJpZ2h0IC09IFZPTENUUkxfU1RFUF9TSVpFKSA8IDApCi0JCXJpZ2h0ID0gMDsKLQotCWVtdTEwazFfc2V0X29zc192b2woY2FyZCwgb3NzX2NoYW5uZWwsIGxlZnQsIHJpZ2h0KTsKLX0KLQotdm9pZCBlbXUxMGsxX3NldF92b2x1bWVfZ3ByKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBhZGRyLCBzMzIgdm9sLCBpbnQgc2NhbGUpCi17Ci0Jc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciA9ICZjYXJkLT5tZ3I7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN0YXRpYyBjb25zdCBzMzIgbG9nMmxpbls0XSA9eyAgICAgICAgICAgLy8gIGF0dGVudWF0aW9uIChkQikKLQkJMHg3ZmZmZmZmZiwgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgMC4wICAgICAgICAgCi0JCTB4N2ZmZmZmZmYgKiAwLjg0MDg5NjQxNTI1MzcxNSAsIC8vICAgICAgIDEuNSAgICAgICAgICAKLQkJMHg3ZmZmZmZmZiAqIDAuNzA3MTA2NzgxMTg2NTQ4LCAgLy8gICAgICAgMy4wCi0JCTB4N2ZmZmZmZmYgKiAwLjU5NDYwMzU1NzUwMTM2MSAsIC8vICAgICAgIDQuNQotCX07Ci0KLQlpZiAoYWRkciA8IDApCi0JCXJldHVybjsKLQotCXZvbCA9ICgxMDAgLSB2b2wgKSAqIHNjYWxlIC8gMTAwOwotCi0JLy8gVGhhbmtzIHRvIHRoZSBjb21wLmRzcCBuZXdzZ3JvdXAgZm9yIHRoaXMgbmVhdCB0cmljazoKLQl2b2wgPSAodm9sID49IHNjYWxlKSA/IDAgOiAobG9nMmxpblt2b2wgJiAzXSA+PiAodm9sID4+IDIpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtZ3ItPmxvY2ssIGZsYWdzKTsKLQllbXUxMGsxX3NldF9jb250cm9sX2dwcihjYXJkLCBhZGRyLCB2b2wsIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1nci0+bG9jaywgZmxhZ3MpOwotfQotCi12b2lkIGVtdTEwazFfZHNwX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCXUzMiBiYzsKLQkJYmMgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBHUFJfQkFTRSArIGNhcmQtPnB0LmludHJfZ3ByLCAwKTsKLQkJaWYgKGJjICE9IDApIHsKLQkJCURQRCgzLCAicHQgaW50ZXJydXB0LCBiYyA9ICVkXG4iLCBiYyk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOwotCQkJY2FyZC0+cHQuYmxvY2tzX3BsYXllZCA9IGJjOwotCQkJaWYgKGNhcmQtPnB0LmJsb2Nrc19wbGF5ZWQgPj0gY2FyZC0+cHQuYmxvY2tzX2NvcGllZCkgewotCQkJCURQRigxLCAiYnVmZmVyIHVuZGVycnVuIGluIHBhc3N0aHJvdWdoIHBsYXliYWNrXG4iKTsKLQkJCQllbXUxMGsxX3B0X3N0b3AoY2FyZCk7Ci0JCQl9Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPnB0LndhaXQpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ4ZTVjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgc2JsaXZlX2Z4LmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8KLQotI2lmbmRlZiBfRUZYTUdSX0gKLSNkZWZpbmUgX0VGWE1HUl9ICi0KLXN0cnVjdCBlbXVfZWZ4X2luZm9fdHsKLQlpbnQgb3Bjb2RlX3NoaWZ0OwotCWludCBoaWdoX29wZXJhbmRfc2hpZnQ7Ci0JaW50IGluc3RydWN0aW9uX3N0YXJ0OwotCWludCBncHJfYmFzZTsKLQlpbnQgb3V0cHV0X2Jhc2U7Ci19OwotCi0KLSNkZWZpbmUgV1JJVEVfRUZYKGEsIGIsIGMpIHNibGl2ZV93cml0ZXB0cigoYSksIGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmluc3RydWN0aW9uX3N0YXJ0ICsgKGIpLCAwLCAoYykpCi0KLSNkZWZpbmUgT1Aob3AsIHosIHcsIHgsIHkpIFwKLQlkbyB7IFdSSVRFX0VGWChjYXJkLCAocGMpICogMiwgKCh4KSA8PCBlbXVfZWZ4X2luZm9bY2FyZC0+aXNfYXVkaWd5XS5oaWdoX29wZXJhbmRfc2hpZnQpIHwgKHkpKTsgXAotCVdSSVRFX0VGWChjYXJkLCAocGMpICogMiArIDEsICgob3ApIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLm9wY29kZV9zaGlmdCApIHwgKCh6KSA8PCBlbXVfZWZ4X2luZm9bY2FyZC0+aXNfYXVkaWd5XS5oaWdoX29wZXJhbmRfc2hpZnQpIHwgKHcpKTsgXAotCSsrcGM7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTlVNX0lOUFVUUyAweDIwCi0jZGVmaW5lIE5VTV9PVVRQVVRTIDB4MjAKLSNkZWZpbmUgTlVNX0dQUlMgMHgxMDAKLQotI2RlZmluZSBBX05VTV9JTlBVVFMgMHg2MAotI2RlZmluZSBBX05VTV9PVVRQVVRTIDB4NjAgIC8vZml4bWU6IHRoaXMgbWF5IG9yIG1heSBub3QgYmUgdHJ1ZQotI2RlZmluZSBBX05VTV9HUFJTIDB4MjAwCi0KLSNkZWZpbmUgR1BSX05BTUVfU0laRSAgIDMyCi0jZGVmaW5lIFBBVENIX05BTUVfU0laRSAzMgotCi1zdHJ1Y3QgZHNwX3JwYXRjaCB7Ci0JY2hhciBuYW1lW1BBVENIX05BTUVfU0laRV07Ci0JdTE2IGNvZGVfc3RhcnQ7Ci0JdTE2IGNvZGVfc2l6ZTsKLQotCXVuc2lnbmVkIGxvbmcgZ3ByX3VzZWRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsKLQl1bnNpZ25lZCBsb25nIGdwcl9pbnB1dFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOwotCXVuc2lnbmVkIGxvbmcgcm91dGVbTlVNX09VVFBVVFNdOwotCXVuc2lnbmVkIGxvbmcgcm91dGVfdltOVU1fT1VUUFVUU107Ci19OwotCi1zdHJ1Y3QgZHNwX3BhdGNoIHsKLQljaGFyIG5hbWVbUEFUQ0hfTkFNRV9TSVpFXTsKLQl1OCBpZDsKLQl1bnNpZ25lZCBsb25nIGlucHV0OwkvKiBiaXRtYXAgb2YgdGhlIGxpbmVzIHVzZWQgYXMgaW5wdXRzICovCi0JdW5zaWduZWQgbG9uZyBvdXRwdXQ7CS8qIGJpdG1hcCBvZiB0aGUgbGluZXMgdXNlZCBhcyBvdXRwdXRzICovCi0JdTE2IGNvZGVfc3RhcnQ7Ci0JdTE2IGNvZGVfc2l6ZTsKLQotCXVuc2lnbmVkIGxvbmcgZ3ByX3VzZWRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsJLyogYml0bWFwIG9mIHVzZWQgZ3BycyAqLwotCXVuc2lnbmVkIGxvbmcgZ3ByX2lucHV0W05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07Ci0JdTggdHJhbWxfaXN0YXJ0OwkvKiBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBpbnRlcm5hbCB0cmFtIGxpbmVzIHVzZWQgKi8KLQl1OCB0cmFtbF9pc2l6ZTsJCS8qIG51bWJlciBvZiBpbnRlcm5hbCB0cmFtIGxpbmVzIHVzZWQgKi8KLQotCXU4IHRyYW1sX2VzdGFydDsKLQl1OCB0cmFtbF9lc2l6ZTsKLQotCXUxNiB0cmFtYl9pc3RhcnQ7ICAgICAgICAvKiBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBpbnRlcm5hbCB0cmFtIG1lbW9yeSB1c2VkICovCi0JdTE2IHRyYW1iX2lzaXplOyAgICAgICAgIC8qIGFtb3VudCBvZiBpbnRlcm5hbCBtZW1vcnkgdXNlZCAqLwotCXUzMiB0cmFtYl9lc3RhcnQ7Ci0JdTMyIHRyYW1iX2VzaXplOwotfTsKLQotc3RydWN0IGRzcF9ncHIgewotCXU4IHR5cGU7CQkJLyogZ3ByIHR5cGUsIFNUQVRJQywgRFlOQU1JQywgSU5QVVQsIE9VVFBVVCwgQ09OVFJPTCAqLwotCWNoYXIgbmFtZVtHUFJfTkFNRV9TSVpFXTsJLyogZ3ByIHZhbHVlLCBvbmx5IHZhbGlkIGZvciBjb250cm9sIGdwcnMgKi8KLQlzMzIgbWluLCBtYXg7CQkJLyogdmFsdWUgcmFuZ2UgZm9yIHRoaXMgZ3ByLCBvbmx5IHZhbGlkIGZvciBjb250cm9sIGdwcnMgKi8KLQl1OCBsaW5lOwkJCS8qIHdoaWNoIGlucHV0L291dHB1dCBsaW5lIGlzIHRoZSBncHIgYXR0YWNoZWQsIG9ubHkgdmFsaWQgZm9yIGlucHV0L291dHB1dCBncHJzICovCi0JdTggdXNhZ2U7Ci19OwotCi1lbnVtIHsKLQlHUFJfVFlQRV9OVUxMID0gMCwKLQlHUFJfVFlQRV9JTywKLQlHUFJfVFlQRV9TVEFUSUMsCi0JR1BSX1RZUEVfRFlOQU1JQywKLQlHUFJfVFlQRV9DT05UUk9MLAotCUdQUl9UWVBFX0NPTlNUQU5UCi19OwotCi0jZGVmaW5lIEdQUl9CQVNFIDB4MTAwCi0jZGVmaW5lIE9VVFBVVF9CQVNFIDB4MjAKLQotI2RlZmluZSBBX0dQUl9CQVNFIDB4NDAwCi0jZGVmaW5lIEFfT1VUUFVUX0JBU0UgMHg2MAotCi0jZGVmaW5lIE1BWF9QQVRDSEVTX1BBR0VTIDMyCi0KLXN0cnVjdCBwYXRjaF9tYW5hZ2VyIHsKLQl2b2lkICpwYXRjaFtNQVhfUEFUQ0hFU19QQUdFU107Ci0JaW50IGN1cnJlbnRfcGFnZXM7Ci0Jc3RydWN0IGRzcF9ycGF0Y2ggcnBhdGNoOwotCXN0cnVjdCBkc3BfZ3ByIGdwcltOVU1fR1BSU107ICAgLyogZ3ByIHVzYWdlIHRhYmxlICovCi0Jc3BpbmxvY2tfdCBsb2NrOwotCXMxNiBjdHJsX2dwcltTT1VORF9NSVhFUl9OUkRFVklDRVNdWzJdOwotfTsKLQotI2RlZmluZSBQQVRDSEVTX1BFUl9QQUdFIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGRzcF9wYXRjaCkpCi0KLSNkZWZpbmUgUEFUQ0gobWdyLCBpKSAoKHN0cnVjdCBkc3BfcGF0Y2ggKikgKG1nciktPnBhdGNoWyhpKSAvIFBBVENIRVNfUEVSX1BBR0VdICsgKGkpICUgUEFUQ0hFU19QRVJfUEFHRSkKLQotLyogUENNIHZvbHVtZSBjb250cm9sICovCi0jZGVmaW5lIFRNUF9QQ01fTCAgICAgMHgxMDAgLy90ZW1wIFBDTSBMIChhZnRlciB0aGUgdm9sIGNvbnRyb2wpICAgICAgIAotI2RlZmluZSBUTVBfUENNX1IgICAgIDB4MTAxCi0jZGVmaW5lIFZPTF9QQ01fTCAgICAgMHgxMDIgLy92b2wgUENNCi0jZGVmaW5lIFZPTF9QQ01fUiAgICAgMHgxMDMKLQotLyogUm91dGluZyBwYXRjaCAqLwotI2RlZmluZSBUTVBfQUNfTCAgICAgIDB4MTA0IC8vdG1wIGFjOTcgb3V0Ci0jZGVmaW5lIFRNUF9BQ19SICAgICAgMHgxMDUKLSNkZWZpbmUgVE1QX1JFQVJfTCAgICAweDEwNiAvL291dHB1dCAtIFRlbXAgUmVhcgotI2RlZmluZSBUTVBfUkVBUl9SICAgIDB4MTA3Ci0jZGVmaW5lIFRNUF9ESUdJX0wgICAgMHgxMDggLy9vdXRwdXQgLSBUZW1wIGRpZ2l0YWwKLSNkZWZpbmUgVE1QX0RJR0lfUiAgICAweDEwOQotI2RlZmluZSBEU1BfVk9MX0wgICAgIDB4MTBhIC8vIG1haW4gZHNwIHZvbHVtZQotI2RlZmluZSBEU1BfVk9MX1IgICAgIDB4MTBiCi0KLS8qIGh3IGlucHV0cyAqLwotI2RlZmluZSBQQ01fSU5fTCAJMHgwMAotI2RlZmluZSBQQ01fSU5fUiAJMHgwMQotCi0jZGVmaW5lIFBDTTFfSU5fTCAgICAgICAgMHgwNAotI2RlZmluZSBQQ00xX0lOX1IgICAgICAgIDB4MDUKLS8vbXV0aWxjaGFubmVsIHBsYXliYWNrIHN0cmVhbSBhcHBlYXIgaGVyZToKLQotI2RlZmluZSBNVUxUSV9GUk9OVF9MCTB4MDgKLSNkZWZpbmUgTVVMVElfRlJPTlRfUgkweDA5Ci0jZGVmaW5lIE1VTFRJX1JFQVJfTAkweDBhCi0jZGVmaW5lIE1VTFRJX1JFQVJfUgkweDBiCi0jZGVmaW5lIE1VTFRJX0NFTlRFUgkweDBjCi0jZGVmaW5lIE1VTFRJX0xGRQkweDBkCi0KLSNkZWZpbmUgQUM5N19JTl9MCTB4MTAKLSNkZWZpbmUgQUM5N19JTl9SCTB4MTEKLSNkZWZpbmUgU1BESUZfQ0RfTAkweDEyCi0jZGVmaW5lIFNQRElGX0NEX1IJMHgxMwotCi0vKiBodyBvdXRwdXRzICovCi0jZGVmaW5lIEFDOTdfRlJPTlRfTAkweDIwCi0jZGVmaW5lIEFDOTdfRlJPTlRfUgkweDIxCi0jZGVmaW5lIERJR0lUQUxfT1VUX0wJMHgyMgotI2RlZmluZSBESUdJVEFMX09VVF9SCTB4MjMKLSNkZWZpbmUgRElHSVRBTF9DRU5URVIJMHgyNAotI2RlZmluZSBESUdJVEFMX0xGRQkweDI1Ci0KLSNkZWZpbmUgQU5BTE9HX1JFQVJfTAkweDI4Ci0jZGVmaW5lIEFOQUxPR19SRUFSX1IJMHgyOQotI2RlZmluZSBBRENfUkVDX0wJMHgyYQotI2RlZmluZSBBRENfUkVDX1IJMHgyYgotCi0jZGVmaW5lIEFOQUxPR19DRU5URVIJMHgzMQotI2RlZmluZSBBTkFMT0dfTEZFCTB4MzIKLQotCi0jZGVmaW5lIElOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCBubSwgbG4sIGkpCQlcCi1kbyB7CQkJCQkJCVwKLQlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7CQkJXAotCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwkJCVwKLQlwYXRjaC0+Y29kZV9zdGFydCA9IHBjICogMjsJCQlcCi0JcGF0Y2gtPmlucHV0ID0gKDE8PCgweDFmJmxuKSk7CQkJXAotCXBhdGNoLT5vdXRwdXQ9ICgxPDwoMHgxZiZsbikpOwkJCVwKLQlwYXRjaC0+aWQgPSBpOwkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIElOUFVUX1BBVENIX0VORChwYXRjaCkJCQkJXAotZG8gewkJCQkJCQlcCi0JcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OwlcCi0JcGF0Y2hfbisrOwkJCQkJXAotfSB3aGlsZSgwKQotCi0KLSNkZWZpbmUgUk9VVElOR19QQVRDSF9TVEFSVChwYXRjaCwgbm0pCVwKLWRvIHsJCQkJCVwKLQlwYXRjaCA9ICZtZ3ItPnJwYXRjaDsJCVwKLQlzdHJjcHkocGF0Y2gtPm5hbWUsIG5tKTsJXAotCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwlcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgUk9VVElOR19QQVRDSF9FTkQocGF0Y2gpCQkJXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OyAgICAgIFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBDT05ORUNUKGlucHV0LCBvdXRwdXQpIHNldF9iaXQoaW5wdXQsICZycGF0Y2gtPnJvdXRlWyhvdXRwdXQpIC0gT1VUUFVUX0JBU0VdKTsKLQotI2RlZmluZSBDT05ORUNUX1YoaW5wdXQsIG91dHB1dCkgc2V0X2JpdChpbnB1dCwgJnJwYXRjaC0+cm91dGVfdlsob3V0cHV0KSAtIE9VVFBVVF9CQVNFXSk7Ci0KLSNkZWZpbmUgT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCBubSwgbG4sIGkpCQlcCi1kbyB7CQkJCQkJCVwKLQlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7CQkJXAotCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwkJCVwKLQlwYXRjaC0+Y29kZV9zdGFydCA9IHBjICogMjsJCQlcCi0JcGF0Y2gtPmlucHV0ID0gKDE8PCgweDFmJmxuKSk7CQkJXAotCXBhdGNoLT5vdXRwdXQ9ICgxPDwoMHgxZiZsbikpOwkJCVwKLQlwYXRjaC0+aWQgPSBpOwkJCQkJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIE9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpCQkJCVwKLWRvIHsJCQkJCQkJXAotCXBhdGNoLT5jb2RlX3NpemUgPSBwYyAqIDIgLSBwYXRjaC0+Y29kZV9zdGFydDsJXAotCXBhdGNoX24rKzsJCQkJCVwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBHRVRfT1VUUFVUX0dQUihwYXRjaCwgZywgbG4pCQkJXAotZG8gewkJCQkJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9JTzsJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5saW5lID0gbG47CQlcCi0Jc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEdFVF9JTlBVVF9HUFIocGF0Y2gsIGcsIGxuKQkJCVwKLWRvIHsJCQkJCQkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfSU87CVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udXNhZ2UrKzsJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubGluZSA9IGxuOwkJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7CVwKLQlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX2lucHV0KTsJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEdFVF9EWU5BTUlDX0dQUihwYXRjaCwgZykJCQkJXAotZG8gewkJCQkJCQkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfRFlOQU1JQzsJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJCVwKLQlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOyAgICAgICAgICAJXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIEdFVF9DT05UUk9MX0dQUihwYXRjaCwgZywgbm0sIGEsIGIpCQkJXAotZG8gewkJCQkJCQkJXAotCXN0cmNweShtZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubmFtZSwgbm0pOwkJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfQ09OVFJPTDsJXAotCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJCVwKLQltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubWluID0gYTsJCQlcCi0JbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLm1heCA9IGI7CQkJXAotCXNibGl2ZV93cml0ZXB0cihjYXJkLCBnLCAwLCBiKTsJCQkJXAotCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7CQlcCi19IHdoaWxlKDApCi0KLSNlbmRpZiAvKiBfRUZYTUdSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9lbXVhZHhtZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QyZDRjLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotCi0vKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGVtdWFkeG1nLmMgLSBBZGRyZXNzIHNwYWNlIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyIAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLQotLyogQWxsb2NhdGVzIGVtdSBhZGRyZXNzIHNwYWNlICovCi0KLWludCBlbXUxMGsxX2FkZHhtZ3JfYWxsb2ModTMyIHNpemUsIHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdTE2ICpwYWdldGFibGUgPSBjYXJkLT5lbXVwYWdldGFibGU7Ci0JdTE2IGluZGV4ID0gMDsKLQl1MTYgbnVtcGFnZXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIENvbnZlcnQgYnl0ZXMgdG8gcGFnZXMgKi8KLQludW1wYWdlcyA9IChzaXplIC8gRU1VUEFHRVNJWkUpICsgKChzaXplICUgRU1VUEFHRVNJWkUpID8gMSA6IDApOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlIChpbmRleCA8IChNQVhQQUdFUyAtIDEpKSB7Ci0JCWlmIChwYWdldGFibGVbaW5kZXhdICYgMHg4MDAwKSB7Ci0JCQkvKiBUaGlzIGJsb2NrIG9mIHBhZ2VzIGlzIGluIHVzZSwganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgYmxvY2suICovCi0JCQlpbmRleCArPSAocGFnZXRhYmxlW2luZGV4XSAmIDB4N2ZmZik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBGb3VuZCBmcmVlIGJsb2NrICovCi0JCQlpZiAocGFnZXRhYmxlW2luZGV4XSA+PSBudW1wYWdlcykgewotCi0JCQkJLyogQmxvY2sgaXMgbGFyZ2UgZW5vdWdoICovCi0KLQkJCQkvKiBJZiBmcmVlIGJsb2NrIGlzIGxhcmdlciB0aGFuIHRoZSBibG9jayByZXF1ZXN0ZWQKLQkJCQkgKiB0aGVuIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgcmVtYWluaW5nICovCi0JCQkJaWYgKHBhZ2V0YWJsZVtpbmRleF0gPiBudW1wYWdlcykKLQkJCQkJcGFnZXRhYmxlW2luZGV4ICsgbnVtcGFnZXNdID0gcGFnZXRhYmxlW2luZGV4XSAtIG51bXBhZ2VzOwotCi0JCQkJcGFnZXRhYmxlW2luZGV4XSA9IChudW1wYWdlcyB8IDB4ODAwMCk7CS8qIE1hcmsgYmxvY2sgYXMgdXNlZCAqLwotCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQkJcmV0dXJuIGluZGV4OwotCQkJfSBlbHNlIHsKLQkJCQkvKiBCbG9jayB0b28gc21hbGwsIGp1bXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrICovCi0JCQkJaW5kZXggKz0gcGFnZXRhYmxlW2luZGV4XTsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAtMTsKLX0KLQotLyogRnJlZXMgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBlbXUgYWRkcmVzcyBzcGFjZS4gKi8KLQotdm9pZCBlbXUxMGsxX2FkZHhtZ3JfZnJlZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgaW5kZXgpCi17Ci0JdTE2ICpwYWdldGFibGUgPSBjYXJkLT5lbXVwYWdldGFibGU7Ci0JdTE2IG9yaWdzaXplID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChwYWdldGFibGVbaW5kZXhdICYgMHg4MDAwKSB7Ci0JCS8qIEJsb2NrIGlzIGFsbG9jYXRlZCAtIG1hcmsgYmxvY2sgYXMgZnJlZSAqLwotCQlvcmlnc2l6ZSA9IHBhZ2V0YWJsZVtpbmRleF0gJiAweDdmZmY7Ci0JCXBhZ2V0YWJsZVtpbmRleF0gPSBvcmlnc2l6ZTsKLQotCQkvKiBJZiBuZXh0IGJsb2NrIGlzIGZyZWUsIHdlIGNvbmNhdCBib3RoIGJsb2NrcyAqLwotCQlpZiAoIShwYWdldGFibGVbaW5kZXggKyBvcmlnc2l6ZV0gJiAweDgwMDApKQotCQkJcGFnZXRhYmxlW2luZGV4XSArPSBwYWdldGFibGVbaW5kZXggKyBvcmlnc2l6ZV0gJiAweDdmZmY7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzE2YTguLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBod2FjY2Vzcy5jIC0tIEhhcmR3YXJlIGFjY2VzcyBsYXllcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICogICAgIERlY2VtYmVyIDksIDE5OTkgICAgIEpvbiBUYXlsb3IgICAgICByZXdyb3RlIHRoZSBJL08gc3Vic3lzdGVtCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJpY2FyZG1pZC5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBGdW5jdGlvbiA6IHNyVG9QaXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogSW5wdXQgICAgOiBzYW1wbGVSYXRlIC0gc2FtcGxpbmcgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qIFJldHVybiAgIDogcGl0Y2ggdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiBBYm91dCAgICA6IGNvbnZlcnQgc2FtcGxpbmcgcmF0ZSB0byBwaXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogTm90ZSAgICAgOiBmb3IgODAxMCwgc2FtcGxpbmcgcmF0ZSBpcyBhdCA0OGtIeiwgdGhpcyBmdW5jdGlvbiBzaG91bGQgICAqCi0qICAgICAgICAgICAgYmUgY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBzclRvUGl0Y2godTMyIHNhbXBsZVJhdGUpCi17Ci0JaW50IGk7Ci0KLQkvKiBGSVhNRTogVGhlc2UgdGFibGVzIHNob3VsZCBiZSBkZWZpbmVkIGluIGEgaGVhZGVyZmlsZSAqLwotCXN0YXRpYyB1MzIgbG9nTWFnVGFibGVbMTI4XSA9IHsKLQkJMHgwMDAwMCwgMHgwMmRmYywgMHgwNWI5ZSwgMHgwODhlNiwgMHgwYjVkNiwgMHgwZTI2ZiwgMHgxMGViMywgMHgxM2FhMiwKLQkJMHgxNjYzZiwgMHgxOTE4YSwgMHgxYmM4NCwgMHgxZTcyZSwgMHgyMTE4YiwgMHgyM2I5YSwgMHgyNjU1ZCwgMHgyOGVkNSwKLQkJMHgyYjgwMywgMHgyZTBlOCwgMHgzMDk4NSwgMHgzMzFkYiwgMHgzNTllYiwgMHgzODFiNiwgMHgzYTkzZCwgMHgzZDA4MSwKLQkJMHgzZjc4MiwgMHg0MWU0MiwgMHg0NDRjMSwgMHg0NmIwMSwgMHg0OTEwMSwgMHg0YjZjNCwgMHg0ZGM0OSwgMHg1MDE5MSwKLQkJMHg1MjY5ZSwgMHg1NGI2ZiwgMHg1NzAwNiwgMHg1OTQ2MywgMHg1Yjg4OCwgMHg1ZGM3NCwgMHg2MDAyOSwgMHg2MjNhNywKLQkJMHg2NDZlZSwgMHg2NmEwMCwgMHg2OGNkZCwgMHg2YWY4NiwgMHg2ZDFmYSwgMHg2ZjQzYywgMHg3MTY0YiwgMHg3MzgyOSwKLQkJMHg3NTlkNCwgMHg3N2I0ZiwgMHg3OWM5YSwgMHg3YmRiNSwgMHg3ZGVhMSwgMHg3ZmY1ZSwgMHg4MWZlZCwgMHg4NDA0ZSwKLQkJMHg4NjA4MiwgMHg4ODA4OSwgMHg4YTA2NCwgMHg4YzAxNCwgMHg4ZGY5OCwgMHg4ZmVmMSwgMHg5MWUyMCwgMHg5M2QyNiwKLQkJMHg5NWMwMSwgMHg5N2FiNCwgMHg5OTkzZSwgMHg5Yjc5ZiwgMHg5ZDVkOSwgMHg5ZjNlYywgMHhhMTFkOCwgMHhhMmY5ZCwKLQkJMHhhNGQzYywgMHhhNmFiNSwgMHhhODgwOCwgMHhhYTUzNywgMHhhYzI0MSwgMHhhZGYyNiwgMHhhZmJlNywgMHhiMTg4NSwKLQkJMHhiMzUwMCwgMHhiNTE1NywgMHhiNmQ4YywgMHhiODk5ZiwgMHhiYTU4ZiwgMHhiYzE1ZSwgMHhiZGQwYywgMHhiZjg5OSwKLQkJMHhjMTQwNCwgMHhjMmY1MCwgMHhjNGE3YiwgMHhjNjU4NywgMHhjODA3MywgMHhjOWIzZiwgMHhjYjVlZCwgMHhjZDA3YywKLQkJMHhjZWFlYywgMHhkMDUzZiwgMHhkMWY3MywgMHhkMzk4YSwgMHhkNTM4NCwgMHhkNmQ2MCwgMHhkODcyMCwgMHhkYTBjMywKLQkJMHhkYmE0YSwgMHhkZDNiNCwgMHhkZWQwMywgMHhlMDYzNiwgMHhlMWY0ZSwgMHhlMzg0YSwgMHhlNTEyYywgMHhlNjlmMywKLQkJMHhlODI5ZiwgMHhlOWIzMSwgMHhlYjNhOSwgMHhlY2MwOCwgMHhlZTQ0YywgMHhlZmM3OCwgMHhmMTQ4YSwgMHhmMmM4MywKLQkJMHhmNDQ2MywgMHhmNWMyYSwgMHhmNzNkYSwgMHhmOGI3MSwgMHhmYTJmMCwgMHhmYmE1NywgMHhmZDFhNywgMHhmZThkZgotCX07Ci0KLQlzdGF0aWMgY2hhciBsb2dTbG9wZVRhYmxlWzEyOF0gPSB7Ci0JCTB4NWMsIDB4NWMsIDB4NWIsIDB4NWEsIDB4NWEsIDB4NTksIDB4NTgsIDB4NTgsCi0JCTB4NTcsIDB4NTYsIDB4NTYsIDB4NTUsIDB4NTUsIDB4NTQsIDB4NTMsIDB4NTMsCi0JCTB4NTIsIDB4NTIsIDB4NTEsIDB4NTEsIDB4NTAsIDB4NTAsIDB4NGYsIDB4NGYsCi0JCTB4NGUsIDB4NGQsIDB4NGQsIDB4NGQsIDB4NGMsIDB4NGMsIDB4NGIsIDB4NGIsCi0JCTB4NGEsIDB4NGEsIDB4NDksIDB4NDksIDB4NDgsIDB4NDgsIDB4NDcsIDB4NDcsCi0JCTB4NDcsIDB4NDYsIDB4NDYsIDB4NDUsIDB4NDUsIDB4NDUsIDB4NDQsIDB4NDQsCi0JCTB4NDMsIDB4NDMsIDB4NDMsIDB4NDIsIDB4NDIsIDB4NDIsIDB4NDEsIDB4NDEsCi0JCTB4NDEsIDB4NDAsIDB4NDAsIDB4NDAsIDB4M2YsIDB4M2YsIDB4M2YsIDB4M2UsCi0JCTB4M2UsIDB4M2UsIDB4M2QsIDB4M2QsIDB4M2QsIDB4M2MsIDB4M2MsIDB4M2MsCi0JCTB4M2IsIDB4M2IsIDB4M2IsIDB4M2IsIDB4M2EsIDB4M2EsIDB4M2EsIDB4MzksCi0JCTB4MzksIDB4MzksIDB4MzksIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzgsIDB4MzcsCi0JCTB4MzcsIDB4MzcsIDB4MzcsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzUsCi0JCTB4MzUsIDB4MzUsIDB4MzUsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsCi0JCTB4MzMsIDB4MzMsIDB4MzMsIDB4MzMsIDB4MzIsIDB4MzIsIDB4MzIsIDB4MzIsCi0JCTB4MzIsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzAsIDB4MzAsCi0JCTB4MzAsIDB4MzAsIDB4MzAsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYsIDB4MmYKLQl9OwotCi0JaWYgKHNhbXBsZVJhdGUgPT0gMCkKLQkJcmV0dXJuIDA7CS8qIEJhaWwgb3V0IGlmIG5vIGxlYWRpbmcgIjEiICovCi0KLQlzYW1wbGVSYXRlICo9IDExMTg1OwkvKiBTY2FsZSA0ODAwMCB0byAweDIwMDAyMzgwICovCi0KLQlmb3IgKGkgPSAzMTsgaSA+IDA7IGktLSkgewotCQlpZiAoc2FtcGxlUmF0ZSAmIDB4ODAwMDAwMDApIHsJLyogRGV0ZWN0IGxlYWRpbmcgIjEiICovCi0JCQlyZXR1cm4gKHUzMikgKCgoczMyKSAoaSAtIDE1KSA8PCAyMCkgKwotCQkJCSAgICAgIGxvZ01hZ1RhYmxlWzB4N2YgJiAoc2FtcGxlUmF0ZSA+PiAyNCldICsKLQkJCQkgICAgICAoMHg3ZiAmIChzYW1wbGVSYXRlID4+IDE3KSkgKiBsb2dTbG9wZVRhYmxlWzB4N2YgJiAoc2FtcGxlUmF0ZSA+PiAyNCldKTsKLQkJfQotCQlzYW1wbGVSYXRlID0gc2FtcGxlUmF0ZSA8PCAxOwotCX0KLQotCURQRigyLCAic3JUb1BpdGNoOiBCVUchXG4iKTsKLQlyZXR1cm4gMDsJCS8qIFNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBvaW50ICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIHdyaXRlL3JlYWQgUENJIGZ1bmN0aW9uIDAgcmVnaXN0ZXJzICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGVtdTEwazFfd3JpdGVmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7Ci0JCXUzMiBtYXNrOwotCQl1OCBzaXplLCBvZmZzZXQ7Ci0KLQkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKLQkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OwotCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7Ci0JCXJlZyAmPSAweDdmOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCWRhdGEgfD0gaW5sKGNhcmQtPmlvYmFzZSArIHJlZykgJiB+bWFzazsKLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyByZWcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyByZWcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0jaWZkZWYgREJHRU1VCi12b2lkIGVtdTEwazFfd3JpdGVmbjBfMihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgZGF0YSwgaW50IHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoc2l6ZSA9PSAzMikKLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyAocmVnICYgMHgxRikpOwotCWVsc2UgaWYgKHNpemUgPT0gMTYpCi0JCW91dHcoZGF0YSwgY2FyZC0+aW9iYXNlICsgKHJlZyAmIDB4MUYpKTsKLQllbHNlCi0JCW91dGIoZGF0YSwgY2FyZC0+aW9iYXNlICsgKHJlZyAmIDB4MUYpKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KLSNlbmRpZiAgLyogIERCR0VNVSAgKi8KLQotdTMyIGVtdTEwazFfcmVhZGZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICogY2FyZCwgdTMyIHJlZykKLXsKLQl1MzIgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAocmVnICYgMHhmZjAwMDAwMCkgewotCQl1MzIgbWFzazsKLQkJdTggc2l6ZSwgb2Zmc2V0OwotCi0JCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7Ci0JCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKLQkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKLQkJcmVnICY9IDB4N2Y7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIHJlZyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gKHZhbCAmIG1hc2spID4+IG9mZnNldDsKLSAgICAgICAgfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIHJlZyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9zZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqIGNhcmQsIHUxNiBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCW91dHcoZGF0YSAmIFRJTUVSX1JBVEVfTUFTSywgY2FyZC0+aW9iYXNlICsgVElNRVIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiB3cml0ZS9yZWFkIEVtdTEwazEgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LCBhY2Nlc3NlZCB0aHJvdWdoICAgICAgKgotKiAgdGhlIFBUUiBhbmQgREFUQSByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQV9QVFJfQUREUkVTU19NQVNLIDB4MGZmZjAwMDAKLXZvaWQgc2JsaXZlX3dyaXRlcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiBjaGFubmVsLCB1MzIgZGF0YSkKLXsKLQl1MzIgcmVncHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyZWdwdHIgPSAoKHJlZyA8PCAxNikgJiBBX1BUUl9BRERSRVNTX01BU0spIHwgKGNoYW5uZWwgJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKTsKLQotCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7Ci0JCXUzMiBtYXNrOwotCQl1OCBzaXplLCBvZmZzZXQ7Ci0KLQkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKLQkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOwotCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OwotCQlkYXRhID0gKGRhdGEgPDwgb2Zmc2V0KSAmIG1hc2s7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7Ci0JCWRhdGEgfD0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpICYgfm1hc2s7Ci0JCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgREFUQSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJb3V0bChkYXRhLCBjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotLyogLi4uIDogIGRhdGEsIHJlZywgLi4uICwgVEFHTElTVF9FTkQgKi8KLXZvaWQgc2JsaXZlX3dyaXRlcHRyX3RhZyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgY2hhbm5lbCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHUzMiByZWc7Ci0KLQl2YV9zdGFydChhcmdzLCBjaGFubmVsKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKChyZWcgPSB2YV9hcmcoYXJncywgdTMyKSkgIT0gVEFHTElTVF9FTkQpIHsKLQkJdTMyIGRhdGEgPSB2YV9hcmcoYXJncywgdTMyKTsKLQkJdTMyIHJlZ3B0ciA9ICgoKHJlZyA8PCAxNikgJiBBX1BUUl9BRERSRVNTX01BU0spCi0JCQkgICAgICB8IChjaGFubmVsICYgUFRSX0NIQU5ORUxOVU1fTUFTSykpOwotCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKLQkJaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJCWludCBzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKLQkJCXUzMiBtYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OwotCQkJZGF0YSA9IChkYXRhIDw8IG9mZnNldCkgJiBtYXNrOwotCi0JCQlkYXRhIHw9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKSAmIH5tYXNrOwotCQl9Ci0JCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgREFUQSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCXZhX2VuZChhcmdzKTsKLQotCXJldHVybjsKLX0KLQotdTMyIHNibGl2ZV9yZWFkcHRyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiBjYXJkLCB1MzIgcmVnLCB1MzIgY2hhbm5lbCkKLXsKLQl1MzIgcmVncHRyLCB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJlZ3B0ciA9ICgocmVnIDw8IDE2KSAmIEFfUFRSX0FERFJFU1NfTUFTSykgfCAoY2hhbm5lbCAmIFBUUl9DSEFOTkVMTlVNX01BU0spOwotCi0JaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKLQkJdTMyIG1hc2s7Ci0JCXU4IHNpemUsIG9mZnNldDsKLQotCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOwotCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7Ci0JCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7Ci0JCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAodmFsICYgbWFzaykgPj4gb2Zmc2V0OwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOwotCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gdmFsOwotCX0KLX0KLQotdm9pZCBlbXUxMGsxX2lycV9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIGlycV9tYXNrKQotewotCXUzMiB2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCJlbXUxMGsxX2lycV9lbmFibGUoKVxuIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotICAgICAgICB2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgSU5URSkgfCBpcnFfbWFzazsKLSAgICAgICAgb3V0bCh2YWwsIGNhcmQtPmlvYmFzZSArIElOVEUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV9pcnFfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgaXJxX21hc2spCi17Ci0gICAgICAgIHUzMiB2YWw7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICAgICAgRFBGKDIsImVtdTEwazFfaXJxX2Rpc2FibGUoKVxuIik7Ci0KLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIElOVEUpICYgfmlycV9tYXNrOwotICAgICAgICBvdXRsKHZhbCwgY2FyZC0+aW9iYXNlICsgSU5URSk7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLSAgICAgICAgcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiB2b2ljZW51bSkKLXsKLQkvKiBWb2ljZSBpbnRlcnJ1cHQgKi8KLQlpZiAodm9pY2VudW0gPj0gMzIpCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTT0xFSCB8ICgoMHgwMTAwIHwgKHZvaWNlbnVtIC0gMzIpKSA8PCAxNiksIDAsIDApOwotCWVsc2UKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNPTEVMIHwgKCgweDAxMDAgfCB2b2ljZW51bSkgPDwgMTYpLCAwLCAwKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgc2JsaXZlX3djd2FpdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgd2FpdCkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCB1Q291bnQ7Ci0JdTMyIG5ld3RpbWUgPSAwLCBjdXJ0aW1lOwotCi0JY3VydGltZSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBXQ19TQU1QTEVDT1VOVEVSKTsKLQl3aGlsZSAod2FpdC0tKSB7Ci0JCXVDb3VudCA9IDA7Ci0JCXdoaWxlICh1Q291bnQrKyA8IFRJTUVPVVQpIHsKLQkJCW5ld3RpbWUgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgV0NfU0FNUExFQ09VTlRFUik7Ci0JCQlpZiAobmV3dGltZSAhPSBjdXJ0aW1lKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHVDb3VudCA+PSBUSU1FT1VUKQotCQkJYnJlYWs7Ci0KLQkJY3VydGltZSA9IG5ld3RpbWU7Ci0JfQotfQotCi11MTYgZW11MTBrMV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7Ci0JdTE2IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlvdXRiKHJlZywgY2FyZC0+aW9iYXNlICsgQUM5N0FERFJFU1MpOwotCWRhdGEgPSBpbncoY2FyZC0+aW9iYXNlICsgQUM5N0RBVEEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgZW11MTBrMV9hYzk3X3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsdWUpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQlvdXRiKHJlZywgY2FyZC0+aW9iYXNlICsgQUM5N0FERFJFU1MpOwotCW91dHcodmFsdWUsIGNhcmQtPmlvYmFzZSArIEFDOTdEQVRBKTsKLQlvdXRiKCBBQzk3X0VYVEVOREVEX0lELCBjYXJkLT5pb2Jhc2UgKyBBQzk3QUREUkVTUyk7IAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgIE1QVSBhY2Nlc3MgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IGVtdTEwazFfbXB1X3dyaXRlX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTggZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWlmICgoc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVVNUQVQsMCkgJiBNVVNUQVRfT1JEWU4pID09IDApIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VREFUQSwgMCwgZGF0YSk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChpbmIoY2FyZC0+aW9iYXNlICsgTVVTVEFUKSAmIE1VU1RBVF9PUkRZTikgPT0gMCkgewotCQkJb3V0YihkYXRhLCBjYXJkLT5pb2Jhc2UgKyBNVURBVEEpOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGVtdTEwazFfbXB1X3JlYWRfZGF0YShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1OCAqIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlpZiAoKHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVTVEFULDApICYgTVVTVEFUX0lSRFlOKSA9PSAwKSB7Ci0JCQkqZGF0YSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVEQVRBLDApOwotCQkJcmV0ID0gMDsKLQkJfSBlbHNlCi0JCQlyZXQgPSAtMTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCWlmICgoaW5iKGNhcmQtPmlvYmFzZSArIE1VU1RBVCkgJiBNVVNUQVRfSVJEWU4pID09IDApIHsKLQkJCSpkYXRhID0gaW5iKGNhcmQtPmlvYmFzZSArIE1VREFUQSk7Ci0JCQlyZXQgPSAwOwotCQl9IGVsc2UKLQkJCXJldCA9IC0xOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZW11MTBrMV9tcHVfcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQl1OCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRigyLCAiZW11MTBrMV9tcHVfcmVzZXQoKVxuIik7Ci0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlpZiAoY2FyZC0+bXB1YWNxY291bnQgPT0gMCkgewotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVDTUQsIDAsIE1VQ01EX1JFU0VUKTsKLQkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVUNNRCwgMCwgTVVDTURfUkVTRVQpOwotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VQ01ELCAwLCBNVUNNRF9FTlRFUlVBUlRNT0RFKTsKLQkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7Ci0JCQlzdGF0dXMgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VREFUQSwgMCk7Ci0JCQlpZiAoc3RhdHVzID09IDB4ZmUpCi0JCQkJcmV0dXJuIDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJaWYgKGNhcmQtPm1wdWFjcWNvdW50ID09IDApIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlvdXRiKE1VQ01EX1JFU0VULCBjYXJkLT5pb2Jhc2UgKyBNVUNNRCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlvdXRiKE1VQ01EX1JFU0VULCBjYXJkLT5pb2Jhc2UgKyBNVUNNRCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7Ci0KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JCQlvdXRiKE1VQ01EX0VOVEVSVUFSVE1PREUsIGNhcmQtPmlvYmFzZSArIE1VQ01EKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQotCQkJc2JsaXZlX3djd2FpdChjYXJkLCA4KTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJCXN0YXR1cyA9IGluYihjYXJkLT5pb2Jhc2UgKyBNVURBVEEpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JCQlpZiAoc3RhdHVzID09IDB4ZmUpCi0JCQkJcmV0dXJuIDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1pbnQgZW11MTBrMV9tcHVfYWNxdWlyZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCi0JKytjYXJkLT5tcHVhY3Fjb3VudDsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9tcHVfcmVsZWFzZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCS8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBhIG1hY3JvICovCi0JLS1jYXJkLT5tcHVhY3Fjb3VudDsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTI3YmQuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBod2FjY2Vzcy5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUJCSAgICBBdXRob3IJICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0JCSAgICAtLS0tLS0JICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfSFdBQ0NFU1NfSAotI2RlZmluZSBfSFdBQ0NFU1NfSAotCi0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgotI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgImVmeG1nci5oIgotI2luY2x1ZGUgInBhc3N0aHJvdWdoLmgiCi0jaW5jbHVkZSAibWlkaS5oIgotCi0jZGVmaW5lIEVNVVBBR0VTSVpFICAgICA0MDk2ICAgICAgICAgICAgLyogZG9uJ3QgY2hhbmdlICovCi0jZGVmaW5lIE5VTV9HICAgICAgICAgICA2NCAgICAgICAgICAgICAgLyogdXNlIGFsbCBjaGFubmVscyAqLwotI2RlZmluZSBOVU1fRlhTRU5EUyAgICAgNCAgICAgICAgICAgICAgIC8qIGRvbid0IGNoYW5nZSAqLwotLyogc2V0dGluZyB0aGlzIHRvIG90aGVyIHRoYW4gYSBwb3dlciBvZiB0d28gbWF5IGJyZWFrIHNvbWUgYXBwbGljYXRpb25zICovCi0jZGVmaW5lIE1BWEJVRlNJWkUJNjU1MzYKLSNkZWZpbmUgTUFYUEFHRVMJODE5MiAKLSNkZWZpbmUgQlVGTUFYUEFHRVMgICAgIChNQVhCVUZTSVpFIC8gUEFHRV9TSVpFKQotCi0jZGVmaW5lIEZMQUdTX0FWQUlMQUJMRSAgICAgMHgwMDAxCi0jZGVmaW5lIEZMQUdTX1JFQURZICAgICAgICAgMHgwMDAyCi0KLXN0cnVjdCBtZW1oYW5kbGUKLXsKLQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7Ci0Jdm9pZCAqYWRkcjsKLQl1MzIgc2l6ZTsKLX07Ci0KLSNkZWZpbmUgREVCVUdfTEVWRUwgMgotCi0jaWZkZWYgRU1VMTBLMV9ERUJVRwotIyBkZWZpbmUgRFBEKGxldmVsLHgseS4uLikgZG8ge2lmKGxldmVsIDw9IERFQlVHX0xFVkVMKSBwcmludGsoIEtFUk5fTk9USUNFICJlbXUxMGsxOiAlczogJWQ6ICIgeCAsIF9fRklMRV9fICwgX19MSU5FX18gLCB5ICk7fSB3aGlsZSgwKQotIyBkZWZpbmUgRFBGKGxldmVsLHgpICAgZG8ge2lmKGxldmVsIDw9IERFQlVHX0xFVkVMKSBwcmludGsoIEtFUk5fTk9USUNFICJlbXUxMGsxOiAlczogJWQ6ICIgeCAsIF9fRklMRV9fICwgX19MSU5FX18gKTt9IHdoaWxlKDApCi0jZWxzZQotIyBkZWZpbmUgRFBEKGxldmVsLHgseS4uLikgZG8geyB9IHdoaWxlICgwKSAvKiBub3QgZGVidWdnaW5nOiBub3RoaW5nICovCi0jIGRlZmluZSBEUEYobGV2ZWwseCkgZG8geyB9IHdoaWxlICgwKQotI2VuZGlmIC8qIEVNVTEwSzFfREVCVUcgKi8KLQotI2RlZmluZSBFUlJPUigpIERQRigxLCJlcnJvclxuIikKLQotLyogREFUQSBTVFJVQ1RVUkVTICovCi0KLXN0cnVjdCBlbXUxMGsxX3dhdmVvdXQKLXsKLQl1MzIgc2VuZF9yb3V0aW5nWzNdOwotCS8vIGF1ZGlneSBvbmx5OgotCXUzMiBzZW5kX3JvdXRpbmcyWzNdOwotCi0JdTMyIHNlbmRfZGNiYVszXTsKLQkvLyBhdWRpZ3kgb25seToKLQl1MzIgc2VuZF9oZ2ZlWzNdOwotfTsKLSNkZWZpbmUgUk9VVEVfUENNIDAKLSNkZWZpbmUgUk9VVEVfUFQgMQotI2RlZmluZSBST1VURV9QQ00xIDIKLQotI2RlZmluZSBTRU5EX01PTk8gMAotI2RlZmluZSBTRU5EX0xFRlQgMQotI2RlZmluZSBTRU5EX1JJR0hUIDIKLQotc3RydWN0IGVtdTEwazFfd2F2ZWluCi17Ci0gICAgICAgIHN0cnVjdCB3aWluc3QgKmFjOTc7Ci0gICAgICAgIHN0cnVjdCB3aWluc3QgKm1pYzsKLSAgICAgICAgc3RydWN0IHdpaW5zdCAqZng7Ci0KLSAgICAgICAgdTggcmVjc3JjOwotICAgICAgICB1MzIgZnh3YzsKLX07Ci0KLSNkZWZpbmUgQ01EX1JFQUQgMQotI2RlZmluZSBDTURfV1JJVEUgMgotCi1zdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCB7Ci0gICAgICAgIHUzMiBjbWQ7Ci0gICAgICAgIHUzMiB2YWxbOTBdOwotfTsKLQotLyogYm9ndXMgaW9jdGxzIG51bWJlcnMgdG8gZXNjYXBlIGZyb20gT1NTIG1peGVyIGxpbWl0YXRpb25zICovCi0jZGVmaW5lIENNRF9XUklURUZOMCAgICAgICAgICAgIF9JT1coJ0QnLCAwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1JFQURGTjAJCV9JT1IoJ0QnLCAxLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9XUklURVBUUgkJX0lPVygnRCcsIDIsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1JFQURQVFIJCV9JT1IoJ0QnLCAzLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9TRVRSRUNTUkMJCV9JT1coJ0QnLCA0LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9HRVRSRUNTUkMJCV9JT1IoJ0QnLCA1LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9HRVRWT0lDRVBBUkFNCV9JT1IoJ0QnLCA2LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9TRVRWT0lDRVBBUkFNCV9JT1coJ0QnLCA3LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9HRVRQQVRDSAkJX0lPUignRCcsIDgsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVEdQUgkJX0lPUignRCcsIDksIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX0dFVENUTEdQUiAgICAgICAgICAgX0lPUignRCcsIDEwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1NFVFBBVENICQlfSU9XKCdEJywgMTEsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKLSNkZWZpbmUgQ01EX1NFVEdQUgkJX0lPVygnRCcsIDEyLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCi0jZGVmaW5lIENNRF9TRVRDVExHUFIJCV9JT1coJ0QnLCAxMywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRHUE9VVAkJX0lPVygnRCcsIDE0LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX0dFVEdQUjJPU1MJCV9JT1IoJ0QnLCAxNSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0jZGVmaW5lIENNRF9TRVRHUFIyT1NTCQlfSU9XKCdEJywgMTYsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfU0VUTUNIX0ZYCQlfSU9XKCdEJywgMTcsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQotI2RlZmluZSBDTURfU0VUUEFTU1RIUk9VR0gJX0lPVygnRCcsIDE4LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX1BSSVZBVEUzX1ZFUlNJT04JX0lPVygnRCcsIDE5LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKLSNkZWZpbmUgQ01EX0FDOTdfQk9PU1QJCV9JT1coJ0QnLCAyMCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCi0KLS8vdXAgdGhpcyBudW1iZXIgd2hlbiBicmVha2luZyBjb21wYXRpYmlsaXR5Ci0jZGVmaW5lIFBSSVZBVEUzX1ZFUlNJT04gMgotCi1zdHJ1Y3QgZW11MTBrMV9jYXJkIAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQotCXN0cnVjdCBtZW1oYW5kbGUJdmlydHVhbHBhZ2V0YWJsZTsKLQlzdHJ1Y3QgbWVtaGFuZGxlCXRhbmttZW07Ci0Jc3RydWN0IG1lbWhhbmRsZQlzaWxlbnRwYWdlOwotCi0Jc3BpbmxvY2tfdAkJbG9jazsKLQotCXU4CQkJdm9pY2V0YWJsZVtOVU1fR107Ci0JdTE2CQkJZW11cGFnZXRhYmxlW01BWFBBR0VTXTsKLQotCXN0cnVjdCBsaXN0X2hlYWQJdGltZXJzOwotCXUxNgkJCXRpbWVyX2RlbGF5OwotCXNwaW5sb2NrX3QJCXRpbWVyX2xvY2s7Ci0KLQlzdHJ1Y3QgcGNpX2RldgkJKnBjaV9kZXY7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgaW9iYXNlOwotCXVuc2lnbmVkIGxvbmcJCWxlbmd0aDsKLQl1bnNpZ25lZCBzaG9ydAkJbW9kZWw7Ci0JdW5zaWduZWQgaW50IGlycTsgCi0KLQlpbnQJYXVkaW9fZGV2OwotCWludAlhdWRpb19kZXYxOwotCWludAltaWRpX2RldjsKLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWludCBzZXFfZGV2OwotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKnNlcV9taWRpZGV2OwotI2VuZGlmCi0KLQlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NzsKLQlpbnQgYWM5N19zdXBwb3J0ZWRfbWl4ZXJzOwotCWludCBhYzk3X3N0ZXJlb19taXhlcnM7Ci0KLQkvKiBOdW1iZXIgb2YgZmlyc3QgZnggdm9pY2UgZm9yIG11bHRpY2hhbm5lbCBvdXRwdXQgKi8KLQl1OCBtY2hhbm5lbF9meDsKLQlzdHJ1Y3QgZW11MTBrMV93YXZlb3V0CXdhdmVvdXQ7Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWluCXdhdmVpbjsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQJKm1wdW91dDsKLQlzdHJ1Y3QgZW11MTBrMV9tcHVpbgkqbXB1aW47Ci0KLQlzdHJ1Y3QgbXV0ZXgJCW9wZW5fc2VtOwotCW1vZGVfdAkJCW9wZW5fbW9kZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7Ci0KLQl1MzIJICAgIG1wdWFjcWNvdW50OwkgIC8vIE1wdSBhY3F1aXJlIGNvdW50Ci0JdTMyCSAgICBoYXNfdG9zbGluazsJICAgICAgIC8vIFRPU0xpbmsgZGV0ZWN0aW9uCi0KLQl1OCBjaGlwcmV2OyAgICAgICAgICAgICAgICAgICAgLyogQ2hpcCByZXZpc2lvbiAgICAgICAgICAgICAgICAqLwotCXU4IGlzX2F1ZGlneTsKLQl1OCBpc19hcHM7Ci0KLQlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciBtZ3I7Ci0Jc3RydWN0IHB0X2RhdGEgcHQ7Ci19OwotCi1pbnQgZW11MTBrMV9hZGR4bWdyX2FsbG9jKHUzMiwgc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV9hZGR4bWdyX2ZyZWUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBpbnQpOwotCi1pbnQgZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKHN0cnVjdCBwYXRjaF9tYW5hZ2VyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXZvaWQgZW11MTBrMV9zZXRfY29udHJvbF9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBpbnQgLCBzMzIsIGludCApOwotCi12b2lkIGVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBpbnQsIHMzMiwgaW50KTsKLQotCi0jZGVmaW5lIFZPTF82QklUIDB4NDAKLSNkZWZpbmUgVk9MXzVCSVQgMHgyMAotI2RlZmluZSBWT0xfNEJJVCAweDEwCi0KLSNkZWZpbmUgVElNRU9VVCAJCSAgICAxNjM4NAotCi11MzIgc3JUb1BpdGNoKHUzMik7Ci0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGVtdTEwazFfZGV2czsKLQotLyogSGFyZHdhcmUgQWJzdHJhY3Rpb24gTGF5ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLwotCi12b2lkIGVtdTEwazFfd3JpdGVmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIHUzMik7Ci12b2lkIGVtdTEwazFfd3JpdGVmbjBfMihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyLCBpbnQpOwotdTMyIGVtdTEwazFfcmVhZGZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9zZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MTYpOwotCi12b2lkIHNibGl2ZV93cml0ZXB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyLCB1MzIpOwotdm9pZCBzYmxpdmVfd3JpdGVwdHJfdGFnKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCAuLi4pOwotI2RlZmluZSBUQUdMSVNUX0VORAkwCi0KLXUzMiBzYmxpdmVfcmVhZHB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiAsIHUzMiApOwotCi12b2lkIGVtdTEwazFfaXJxX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci12b2lkIGVtdTEwazFfaXJxX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOwotdm9pZCBlbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Ci0KLS8qIEFDOTcgQ29kZWMgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9uICovCi11MTYgZW11MTBrMV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKiwgdTgpOwotdm9pZCBlbXUxMGsxX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKiwgdTgsIHUxNik7Ci0KLS8qIE1QVSBhY2Nlc3MgZnVuY3Rpb24qLwotaW50IGVtdTEwazFfbXB1X3dyaXRlX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1OCk7Ci1pbnQgZW11MTBrMV9tcHVfcmVhZF9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTggKik7Ci1pbnQgZW11MTBrMV9tcHVfcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLWludCBlbXUxMGsxX21wdV9hY3F1aXJlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci1pbnQgZW11MTBrMV9tcHVfcmVsZWFzZShzdHJ1Y3QgZW11MTBrMV9jYXJkICopOwotCi0jZW5kaWYgIC8qIF9IV0FDQ0VTU19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oIGIvc291bmQvb3NzL2VtdTEwazEvaWNhcmRtaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2ZWY0MS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIGlzYmxpdmVfbWlkLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX0lDQVJETUlESV9ICi0jZGVmaW5lIF9JQ0FSRE1JRElfSAotCi0vKiBNSURJIGRlZmluZXMgKi8KLSNkZWZpbmUgTUlESV9EQVRBX0ZJUlNUICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE1JRElfREFUQV9MQVNUICAgICAgICAgICAgICAgICAgMHg3RgotI2RlZmluZSBNSURJX1NUQVRVU19GSVJTVCAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgTUlESV9TVEFUVVNfTEFTVCAgICAgICAgICAgICAgICAweEZGCi0KLS8qIENoYW5uZWwgc3RhdHVzIGJ5dGVzICovCi0jZGVmaW5lIE1JRElfU1RBVFVTX0NIQU5ORUxfRklSU1QgICAgICAgMHg4MAotI2RlZmluZSBNSURJX1NUQVRVU19DSEFOTkVMX0xBU1QgICAgICAgIDB4RTAKLSNkZWZpbmUgTUlESV9TVEFUVVNfQ0hBTk5FTF9NQVNLICAgICAgICAweEYwCi0KLS8qIENoYW5uZWwgdm9pY2UgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9WT0lDRV9OT1RFX09GRiAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIE1JRElfVk9JQ0VfTk9URV9PTiAgICAgICAgICAgICAgMHg5MAotI2RlZmluZSBNSURJX1ZPSUNFX1BPTFlfUFJFU1NVUkUgICAgICAgIDB4QTAKLSNkZWZpbmUgTUlESV9WT0lDRV9DT05UUk9MX0NIQU5HRSAgICAgICAweEIwCi0jZGVmaW5lIE1JRElfVk9JQ0VfUFJPR1JBTV9DSEFOR0UgICAgICAgMHhDMAotI2RlZmluZSBNSURJX1ZPSUNFX0NIQU5ORUxfUFJFU1NVUkUgICAgIDB4RDAKLSNkZWZpbmUgTUlESV9WT0lDRV9QSVRDSF9CRU5EICAgICAgICAgICAweEUwCi0KLS8qIENoYW5uZWwgbW9kZSBtZXNzYWdlcyAqLwotI2RlZmluZSBNSURJX01PREVfQ0hBTk5FTCAgICAgICAgICAgICAgIE1JRElfVk9JQ0VfQ09OVFJPTF9DSEFOR0UKLQotLyogU3lzdGVtIHN0YXR1cyBieXRlcyAqLwotI2RlZmluZSBNSURJX1NUQVRVU19TWVNURU1fRklSU1QgICAgICAgIDB4RjAKLSNkZWZpbmUgTUlESV9TVEFUVVNfU1lTVEVNX0xBU1QgICAgICAgICAweEZGCi0KLS8qIFN5c3RlbSBleGNsdXNpdmUgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTUlESV9TWVNFWF9CRUdJTiAgICAgICAgICAgICAgICAweEYwCi0jZGVmaW5lIE1JRElfU1lTRVhfRU9YICAgICAgICAgICAgICAgICAgMHhGNwotCi0vKiBTeXN0ZW0gY29tbW9uIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1JRElfQ09NTU9OX1RDUUYgICAgICAgICAgICAgICAgMHhGMQkvKiBUaW1lIGNvZGUgcXVhcnRlciBmcmFtZSAgKi8KLSNkZWZpbmUgTUlESV9DT01NT05fU09OR19QT1NJVElPTiAgICAgICAweEYyCi0jZGVmaW5lIE1JRElfQ09NTU9OX1NPTkdfU0VMRUNUICAgICAgICAgMHhGMwotI2RlZmluZSBNSURJX0NPTU1PTl9VTkRFRklORURfRjQgICAgICAgIDB4RjQKLSNkZWZpbmUgTUlESV9DT01NT05fVU5ERUZJTkVEX0Y1ICAgICAgICAweEY1Ci0jZGVmaW5lIE1JRElfQ09NTU9OX1RVTkVfUkVRVUVTVCAgICAgICAgMHhGNgotCi0vKiBTeXN0ZW0gcmVhbC10aW1lIG1lc3NhZ2VzICovCi0jZGVmaW5lIE1JRElfUlRJTUVfVElNSU5HX0NMT0NLICAgICAgICAgMHhGOAotI2RlZmluZSBNSURJX1JUSU1FX1VOREVGSU5FRF9GOSAgICAgICAgIDB4RjkKLSNkZWZpbmUgTUlESV9SVElNRV9TVEFSVCAgICAgICAgICAgICAgICAweEZBCi0jZGVmaW5lIE1JRElfUlRJTUVfQ09OVElOVUUgICAgICAgICAgICAgMHhGQgotI2RlZmluZSBNSURJX1JUSU1FX1NUT1AgICAgICAgICAgICAgICAgIDB4RkMKLSNkZWZpbmUgTUlESV9SVElNRV9VTkRFRklORURfRkQgICAgICAgICAweEZECi0jZGVmaW5lIE1JRElfUlRJTUVfQUNUSVZFX1NFTlNJTkcgICAgICAgMHhGRQotI2RlZmluZSBNSURJX1JUSU1FX1NZU1RFTV9SRVNFVCAgICAgICAgIDB4RkYKLQotLyogRmxhZ3MgZm9yIGZsYWdzIHBhcm0gb2YgbWlkaU91dENhY2hlUGF0Y2hlcygpLCBtaWRpT3V0Q2FjaGVEcnVtUGF0Y2hlcygpICovCi0jZGVmaW5lIE1JRElfQ0FDSEVfQUxMICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNSURJX0NBQ0hFX0JFU1RGSVQgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUlESV9DQUNIRV9RVUVSWSAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1JRElfVU5DQUNIRSAgICAgICAgICAgICAgICAgICAgNAotCi0vKiBFdmVudCBkZWNsYXJhdGlvbnMgZm9yIE1QVSBJUlEgQ2FsbGJhY2tzICovCi0jZGVmaW5lIElDQVJETUlESV9JTkxPTkdEQVRBICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBNSU1fTE9OR0RBVEEgKi8KLSNkZWZpbmUgSUNBUkRNSURJX0lOTE9OR0VSUk9SICAgICAgICAgICAweDAwMDAwMDAyIC8qIE1JTV9MT05HRVJST1IgKi8KLSNkZWZpbmUgSUNBUkRNSURJX09VVExPTkdEQVRBICAgICAgICAgICAweDAwMDAwMDA0IC8qIE1PTV9ET05FIGZvciBNUFUgT1VUIGJ1ZmZlciAqLwotI2RlZmluZSBJQ0FSRE1JRElfSU5EQVRBICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogTUlNX0RBVEEgKi8KLSNkZWZpbmUgSUNBUkRNSURJX0lOREFUQUVSUk9SICAgICAgICAgICAweDAwMDAwMDIwIC8qIE1JTV9FUlJPUiAqLwotCi0vKiBEZWNsYXJhdGlvbiBmb3IgZmxhZ3MgaW4gQ0FSRE1JRElCVUZGRVJIRFIgKi8KLS8qIE1ha2UgaXQgdGhlIHNhbWUgYXMgTUhEUl9ET05FLCBNSERSX0lOUVVFVUUgaW4gbW1zeXN0ZW0uaCAqLwotI2RlZmluZSBNSURJQlVGX0RPTkUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgTUlESUJVRl9JTlFVRVVFICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLS8qIERlY2xhcmF0aW9uIGZvciBtc2cgcGFyYW1ldGVyIGluIG1pZGlDYWxsYmFja0ZuICovCi0jZGVmaW5lIElDQVJETUlESV9PVVRCVUZGRVJPSyAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBJQ0FSRE1JRElfSU5NSURJT0sgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLQotLyogRGVjbGFyYXRpb24gZm9yIHRlY2hub2xvZ3kgaW4gc3RydWN0IG1pZGlfY2FwcyAqLwotI2RlZmluZSBNVF9NSURJUE9SVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogSW4gb3JpZ2luYWwgTUlESU9VVENBUFMgc3RydWN0dXJlICovCi0jZGVmaW5lIE1UX0ZNU1lOVEggICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAkvKiBJbiBvcmlnaW5hbCBNSURJT1VUQ0FQUyBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgTVRfQVdFU1lOVEggICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIE1UX1BDSVNZTlRIICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBNVF9QQ0lTWU5USDY0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgQ0FSRE1JRElfQVdFTUFTSyAgICAgICAgICAgICAgICAweDAwMDBGMDAwCi0KLWVudW0gTG9jYWxFcnJvckNvZGUKLXsKLSAgICAgICAgQ1RTVEFUVVNfTk9URU5BQkxFRCA9IDB4NzAwMCwKLSAgICAgICAgQ1RTVEFUVVNfUkVBRFksCi0gICAgICAgIENUU1RBVFVTX0JVU1ksCi0gICAgICAgIENUU1RBVFVTX0RBVEFBVkFJTCwKLSAgICAgICAgQ1RTVEFUVVNfTk9EQVRBLAotICAgICAgICBDVFNUQVRVU19ORVhUX0JZVEUKLX07Ci0KLS8qIE1JREkgZGF0YSBibG9jayBoZWFkZXIgKi8KLXN0cnVjdCBtaWRpX2hkcgotewotCXU4ICpyZXNlcnZlZDsJCS8qIFBvaW50ZXIgdG8gb3JpZ2luYWwgbG9ja2VkIGRhdGEgYmxvY2sgKi8KLQl1MzIgYnVmZmVybGVuZ3RoOwkvKiBMZW5ndGggb2YgZGF0YSBpbiBkYXRhIGJsb2NrICovCi0JdTMyIGJ5dGVzcmVjb3JkZWQ7CS8qIFVzZWQgZm9yIGlucHV0IG9ubHkgKi8KLQl1MzIgdXNlcjsJCS8qIEZvciBjbGllbnQncyB1c2UgKi8KLQl1MzIgZmxhZ3M7CQkvKiBBc3NvcnRlZCBmbGFncyAoc2VlIGRlZmluZXMpICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBSZXNlcnZlZCBmb3IgZHJpdmVyICovCi0JdTggKmRhdGE7CQkvKiBTZWNvbmQgY29weSBvZiBmaXJzdCBwb2ludGVyICovCi19OwotCi0vKiBFbnVtZXJhdGlvbiBmb3IgU2V0Q29udHJvbCAqLwotZW51bQotewotCU1JRElPQkpWT0xVTUUgPSAweDEsCi0JTUlESVFVRVJZQUNUSVZFSU5TVAotfTsKLQotc3RydWN0IG1pZGlfcXVldWUKLXsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAgKm5leHQ7Ci0JdTMyIHF0eXBlOyAgICAgICAgICAgIC8qIDAgPSBzaG9ydCBtZXNzYWdlLCAxID0gbG9uZyBkYXRhICovCi0JdTMyIGxlbmd0aDsKLQl1MzIgc2l6ZUxlZnQ7Ci0JdTggKm1pZGlieXRlOwotCXVuc2lnbmVkIGxvbmcgcmVmZGF0YTsKLX07Ci0KLXN0cnVjdCBtaWRpX29wZW5pbmZvCi17Ci0JdTMyICAgICBjYnNpemU7Ci0JdTMyICAgICBmbGFnczsKLQl1bnNpZ25lZCBsb25nICByZWZkYXRhOwotCXUzMiAgICAgc3RyZWFtaWQ7Ci19OwotCi1pbnQgZW11MTBrMV9taWRpX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nICopOwotCi0jZW5kaWYgLyogX0lDQVJETUlESV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZHdhdi5oIGIvc291bmQvb3NzL2VtdTEwazEvaWNhcmR3YXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViZTQwOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZHdhdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBpY2FyZHdhdi5oCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCi0gKiAKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAotICogICAgIFVTQS4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICovCi0KLSNpZm5kZWYgX0lDQVJEV0FWX0gKLSNkZWZpbmUgX0lDQVJEV0FWX0gKLQotc3RydWN0IHdhdmVfZm9ybWF0IAotewotCWludCBpZDsKLQlpbnQgc2FtcGxpbmdyYXRlOwotCXU4IGJpdHNwZXJjaGFubmVsOwotCXU4IGNoYW5uZWxzOwkJLyogMSA9IE1vbm8sIDIgPSBTdGVyZW8sIDMsIC4uLiA9IE11bHRpY2hhbm5lbCAqLwotCXU4IGJ5dGVzcGVyY2hhbm5lbDsKLQl1OCBieXRlc3BlcnZvaWNlc2FtcGxlOwotCXU4IGJ5dGVzcGVyc2FtcGxlOwotCWludCBieXRlc3BlcnNlYzsKLQl1OCBwYXNzdGhyb3VnaDsKLX07Ci0KLS8qIGVtdTEwazFfd2F2ZSBzdGF0ZXMgKi8KLSNkZWZpbmUgV0FWRV9TVEFURV9PUEVOCQkweDAxCQotI2RlZmluZSBXQVZFX1NUQVRFX1NUQVJURUQJMHgwMgotI2RlZmluZSBXQVZFX1NUQVRFX0NMT1NFRAkweDA0Ci0KLSNlbmRpZiAvKiBfSUNBUkRXQVZfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyY2U2My4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBpcnFtZ3IuYyAtIElSUSBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgImNhcmRtaS5oIgotI2luY2x1ZGUgImNhcmRtby5oIgotI2luY2x1ZGUgImlycW1nci5oIgotCi0vKiBJbnRlcnJ1cHQgaGFuZGxlciAqLwotCi1pcnFyZXR1cm5fdCBlbXUxMGsxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZW11MTBrMV9jYXJkICopIGRldl9pZDsKLQl1MzIgaXJxc3RhdHVzLCBpcnFzdGF0dXNfdG1wOwotCWludCBoYW5kbGVkID0gMDsKLQotCURQRCg0LCAiZW11MTBrMV9pbnRlcnJ1cHQgY2FsbGVkLCBpcnEgPSAgJXVcbiIsIGlycSk7Ci0KLQkvKgotCSAqKiBOT1RFIDoKLQkgKiogV2UgZG8gYSAnd2hpbGUgbG9vcCcgaGVyZSBjb3Mgb24gY2VydGFpbiBtYWNoaW5lcywgd2l0aCBib3RoCi0JICoqIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgZ29pbmcgb24gYXQgdGhlIHNhbWUgdGltZSwgSVJRcyB3aWxsCi0JICoqIHN0b3AgY29taW5nIGluIGFmdGVyIGEgd2hpbGUuIENoZWNraW5nIElQTkQgaW5kZWVkIHNob3dzIHRoYXQKLQkgKiogdGhlcmUgYXJlIGludGVycnVwdHMgcGVuZGluZyBidXQgdGhlIFBJQyBzYXlzIG5vIElSUXMgcGVuZGluZy4KLQkgKiogSSBzdXNwZWN0IHRoYXQgc29tZSBib2FyZHMgbmVlZCBlZGdlLXRyaWdnZXJlZCBJUlFzIGJ1dCBhcmUgbm90Ci0JICoqIGdldHRpbmcgdGhhdCBjb25kaXRpb24gaWYgd2UgZG9uJ3QgY29tcGxldGVseSBjbGVhciB0aGUgSVBORAotCSAqKiAobWFrZSBzdXJlIG5vIG1vcmUgaW50ZXJydXB0cyBhcmUgcGVuZGluZykuCi0JICoqIC0gRXJpYwotCSAqLwotCi0Jd2hpbGUgKChpcnFzdGF0dXMgPSBpbmwoY2FyZC0+aW9iYXNlICsgSVBSKSkpIHsKLQkJRFBEKDQsICJpcnEgc3RhdHVzICUjeFxuIiwgaXJxc3RhdHVzKTsKLQotCQlpcnFzdGF0dXNfdG1wID0gaXJxc3RhdHVzOwotCi0JCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX1RJTUVSKSB7Ci0JCQllbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfVElNRVI7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9EU1ApIHsKLQkJCWVtdTEwazFfZHNwX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfRFNQOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfTVBVSU4pIHsKLQkJCWVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9NUFVJTjsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX01QVU9VVCkgewotCQkJZW11MTBrMV9tcHVvdXRfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPSB+SVJRVFlQRV9NUFVPVVQ7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzICYgSVBSX01VVEUpIHsKLQkJCWVtdTEwazFfbXV0ZV9pcnFoYW5kbGVyKGNhcmQpOwotCQkJaXJxc3RhdHVzICY9fklQUl9NVVRFOwotCQl9Ci0KLQkJaWYgKGlycXN0YXR1cyAmIElQUl9WT0xJTkNSKSB7Ci0JCQllbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihjYXJkKTsKLQkJCWlycXN0YXR1cyAmPX5JUFJfVk9MSU5DUjsKLQkJfQotCi0JCWlmIChpcnFzdGF0dXMgJiBJUFJfVk9MREVDUikgewotCQkJZW11MTBrMV92b2xkZWNyX2lycWhhbmRsZXIoY2FyZCk7Ci0JCQlpcnFzdGF0dXMgJj1+SVBSX1ZPTERFQ1I7Ci0JCX0KLQotCQlpZiAoaXJxc3RhdHVzKXsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogV2FybmluZywgdW5oYW5kbGVkIGludGVycnVwdDogJSMwOHhcbiIsIGlycXN0YXR1cyk7Ci0JCQkvL21ha2Ugc3VyZSBhbnkgaW50ZXJydXB0cyB3ZSBkb24ndCBoYW5kbGUgYXJlIGRpc2FibGVkOgotCQkJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCB+KElOVEVfTUlESVJYRU5BQkxFIHwgSU5URV9NSURJVFhFTkFCTEUgfCBJTlRFX0lOVEVSVkFMVElNRVJFTkIgfAotCQkJCQkJSU5URV9WT0xERUNSRU5BQkxFIHwgSU5URV9WT0xJTkNSRU5BQkxFIHwgSU5URV9NVVRFRU5BQkxFIHwKLQkJCQkJCUlOVEVfRlhEU1BFTkFCTEUpKTsKLQkJfQotCi0JCS8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLwotCQlvdXRsKGlycXN0YXR1c190bXAsIGNhcmQtPmlvYmFzZSArIElQUik7Ci0JCWhhbmRsZWQgPSAxOwotCX0KLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5oIGIvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlN2M5Y2EuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBpcnEuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfSVJRX0gKLSNkZWZpbmUgX0lSUV9ICi0KLS8qIEVNVSBJcnEgVHlwZXMgKi8KLSNkZWZpbmUgSVJRVFlQRV9QQ0lCVVNFUlJPUglJUFJfUENJRVJST1IKLSNkZWZpbmUgSVJRVFlQRV9NSVhFUkJVVFRPTgkoSVBSX1ZPTElOQ1IgfCBJUFJfVk9MREVDUiB8IElQUl9NVVRFKQotI2RlZmluZSBJUlFUWVBFX1ZPSUNFCQkoSVBSX0NIQU5ORUxMT09QIHwgSVBSX0NIQU5ORUxOVU1CRVJNQVNLKQotI2RlZmluZSBJUlFUWVBFX1JFQ09SRAkJKElQUl9BRENCVUZGVUxMIHwgSVBSX0FEQ0JVRkhBTEZGVUxMIHwgSVBSX01JQ0JVRkZVTEwgfCBJUFJfTUlDQlVGSEFMRkZVTEwgfCBJUFJfRUZYQlVGRlVMTCB8IElQUl9FRlhCVUZIQUxGRlVMTCkKLSNkZWZpbmUgSVJRVFlQRV9NUFVPVVQJCShJUFJfTUlESVRSQU5TQlVGRU1QVFkgfCBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTIpIAotI2RlZmluZSBJUlFUWVBFX01QVUlOCQkoSVBSX01JRElSRUNWQlVGRU1QVFkgfCBBX0lQUl9NSURJUkVDVkJVRkVNUFRZMikKLSNkZWZpbmUgSVJRVFlQRV9USU1FUgkJSVBSX0lOVEVSVkFMVElNRVIKLSNkZWZpbmUgSVJRVFlQRV9TUERJRgkJKElQUl9HUFNQRElGU1RBVFVTQ0hBTkdFIHwgSVBSX0NEUk9NU1RBVFVTQ0hBTkdFKQotI2RlZmluZSBJUlFUWVBFX0RTUAkJSVBSX0ZYRFNQCi0KLXZvaWQgZW11MTBrMV90aW1lcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Ci12b2lkIGVtdTEwazFfZHNwX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV9tdXRlX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV92b2xpbmNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLXZvaWQgZW11MTBrMV92b2xkZWNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKLQotI2VuZGlmIC8qIF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jIGIvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDU4NDExLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzEgKzAsMCBAQAotIC8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIG1haW4uYyAtIENyZWF0aXZlIEVNVTEwSzEgYXVkaW8gZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAgc3R1ZmYKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICAgU3VwcG9ydGVkIGRldmljZXM6Ci0gKiAgICAgIC9kZXYvZHNwOiAgICAgICAgU3RhbmRhcmQgL2Rldi9kc3AgZGV2aWNlLCBPU1MtY29tcGF0aWJsZQotICogICAgICAvZGV2L2RzcDE6ICAgICAgIFJvdXRlcyB0byByZWFyIHNwZWFrZXJzIG9ubHkJIAotICogICAgICAvZGV2L21peGVyOiAgICAgIFN0YW5kYXJkIC9kZXYvbWl4ZXIgZGV2aWNlLCBPU1MtY29tcGF0aWJsZQotICogICAgICAvZGV2L21pZGk6ICAgICAgIFJhdyBNSURJIFVBUlQgZGV2aWNlLCBtb3N0bHkgT1NTLWNvbXBhdGlibGUKLSAqCS9kZXYvc2VxdWVuY2VyOiAgU2VxdWVuY2VyIEludGVyZmFjZSAocmVxdWlyZXMgc291bmQubykKLSAqCi0gKiAgICAgIFJldmlzaW9uIGhpc3Rvcnk6Ci0gKiAgICAgIDAuMSBiZXRhIEluaXRpYWwgcmVsZWFzZQotICogICAgICAwLjIgTG93ZXJlZCBpbml0aWFsIG1peGVyIHZvbC4gSW1wcm92ZWQgb24gc3R1dHRlcmluZyB3YXZlIHBsYXliYWNrLiBBZGRlZCBNSURJIFVBUlQgc3VwcG9ydC4KLSAqICAgICAgMC4zIEZpeGVkIG1peGVyIHJvdXRpbmcgYnVnLCBhZGRlZCBBUFMsIGpveXN0aWNrIHN1cHBvcnQuCi0gKiAgICAgIDAuNCBBZGRlZCByZWFyLWNoYW5uZWwsIFNQRElGIHN1cHBvcnQuCi0gKgkwLjUgU291cmNlIGNsZWFudXAsIFNNUCBmaXhlcywgbXVsdGlvcGVuIHN1cHBvcnQsIDY0IGJpdCBhcmNoIGZpeGVzLAotICoJICAgIG1vdmVkIGJoJ3MgdG8gdGFza2xldHMsIG1vdmVkIHRvIHRoZSBuZXcgUENJIGRyaXZlciBpbml0aWFsaXphdGlvbiBzdHlsZS4KLSAqCTAuNiBNYWtlIHVzZSBvZiBwY2lfYWxsb2NfY29uc2lzdGVudCwgaW1wcm92ZSBjb21wYXRpYmlsaXR5IGxheWVyIGZvciAyLjIga2VybmVscywKLSAqCSAgICBjb2RlIHJlb3JnYW5pemF0aW9uIGFuZCBjbGVhbnVwLgotICoJMC43IFN1cHBvcnQgZm9yIHRoZSBFbXUtQVBTLiBCdWcgZml4ZXMgZm9yIHZvaWNlIGNhY2hlIHNldHVwLCBtbWFwZWQgc291bmQgKyBwb2xsKCkuCi0gKiAgICAgICAgICBTdXBwb3J0IGZvciBzZXR0aW5nIGV4dGVybmFsIFRSQU0gc2l6ZS4KLSAqICAgICAgMC44IE1ha2UgdXNlIG9mIHRoZSBrZXJuZWwgYWM5NyBpbnRlcmZhY2UuIFN1cHBvcnQgZm9yIGEgZHNwIHBhdGNoIG1hbmFnZXIuCi0gKiAgICAgIDAuOSBSZS1lbmFibGVzIHJlYXIgc3BlYWtlcnMgdm9sdW1lIGNvbnRyb2xzCi0gKiAgICAgMC4xMCBJbml0aWFsaXplcyByZWFyIHNwZWFrZXIgdm9sdW1lLgotICoJICAgIER5bmFtaWMgcGF0Y2ggc3RvcmFnZSBhbGxvY2F0aW9uLgotICoJICAgIE5ldyBwcml2YXRlIGlvY3RscyB0byBjaGFuZ2UgY29udHJvbCBncHIgdmFsdWVzLgotICoJICAgIEVuYWJsZSB2b2x1bWUgY29udHJvbCBpbnRlcnJ1cHRzLgotICoJICAgIEJ5IGRlZmF1bHQgZW5hYmxlIGRzcCByb3V0ZXMgdG8gZGlnaXRhbCBvdXQuIAotICogICAgIDAuMTEgRml4ZWQgZnggLyA0IHByb2JsZW0uCi0gKiAgICAgMC4xMiBJbXBsZW1lbnRlZCBtbWFwZWQgZm9yIHJlY29yZGluZy4KLSAqCSAgICBGaXhlZCBidWc6IG5vdCB1bnJlc2VydmluZyBtbWFwZWQgYnVmZmVyIHBhZ2VzLgotICoJICAgIElSUSBoYW5kbGVyIGNsZWFudXAuCi0gKiAgICAgMC4xMyBGaXhlZCBwcm9ibGVtIHdpdGggZHNwMQotICogICAgICAgICAgU2ltcGxpZmllZCBkc3AgcGF0Y2ggd3JpdGluZyAoaW5zaWRlIHRoZSBkcml2ZXIpCi0gKgkgICAgRml4ZWQgc2V2ZXJhbCBidWdzIGZvdW5kIGJ5IHRoZSBTdGFuZm9yZCB0b29scwotICogICAgIDAuMTQgTmV3IGNvbnRyb2wgZ3ByIHRvIG9zcyBtaXhlciBtYXBwaW5nIGZlYXR1cmUgKENocmlzIFB1cm5lbGwpCi0gKiAgICAgICAgICBBZGRlZCBBQzMgUGFzc3Rocm91Z2ggU3VwcG9ydCAoSnVoYSBZcmpvbGEpCi0gKiAgICAgICAgICBBZGRlZCBTdXBwb3J0IGZvciA1LjEgY2FyZHMgKGRpZ2l0YWwgb3V0IGFuZCB0aGUgdGhpcmQgYW5hbG9nIG91dCkKLSAqICAgICAwLjE1IEFkZGVkIFNlcXVlbmNlciBTdXBwb3J0IChEYW5pZWwgTWFjaykKLSAqICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpY2hhbm5lbCBwY20gcGxheWJhY2sgKEVkdWFyZCBIYXNlbmxlaXRobmVyKQotICogICAgIDAuMTYgTWl4ZXIgaW1wcm92ZW1lbnRzLCBhZGRlZCBvbGQgdHJlYmxlL2Jhc3Mgc3VwcG9ydCAoRGFuaWVsIEJlcnRyYW5kKQotICogICAgICAgICAgU21hbGwgY29kZSBmb3JtYXQgY2xlYW51cC4KLSAqICAgICAgICAgIERlYWRsb2NrIGJ1ZyBmaXggZm9yIGVtdTEwazFfdm9seHh4X2lycWhhbmRsZXIoKS4KLSAqICAgICAwLjE3IEZpeCBmb3IgbWl4ZXIgU09VTkRfTUlYRVJfSU5GTyBpb2N0bC4KLSAqCSAgICBGaXggZm9yIEhJR0hNRU0gbWFjaGluZXMgKGVtdTEwazEgY2FuIG9ubHkgZG8gMzEgYml0IGJ1cyBtYXN0ZXIpIAotICoJICAgIG1pZGkgcG9sbCBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotICoJICAgIFNtYWxsIG1peGVyIGZpeGVzL2NsZWFudXBzLgotICoJICAgIEltcHJvdmVkIHN1cHBvcnQgZm9yIDUuMSBjYXJkcy4KLSAqICAgICAwLjE4IEZpeCBmb3IgcG9zc2libGUgbGVhayBpbiBwY2lfYWxsb2NfY29uc2lzdGVudCgpCi0gKiAgICAgICAgICBDbGVhbmVkIHVwIHBvbGwoKSBmdW5jdGlvbnMgKGF1ZGlvIGFuZCBtaWRpKS4gRG9uJ3Qgc3RhcnQgaW5wdXQuCi0gKgkgICAgUmVzdHJpY3QgRE1BIHBhZ2VzIHVzZWQgdG8gNTEyTWliIHJhbmdlLgotICoJICAgIE5ldyBBQzk3X0JPT1NUIG1peGVyIGlvY3RsLgotICogICAgMC4xOWEgQWRkZWQgU3VwcG9ydCBmb3IgQXVkaWd5IENhcmRzCi0gKgkgICAgUmVhbCBmaXggZm9yIGtlcm5lbCB3aXRoIGhpZ2htZW0gc3VwcG9ydCAoY2FzdCBkbWFfaGFuZGxlIHRvIHUzMikuCi0gKgkgICAgRml4IHJlY29yZGluZyBidWZmZXJpbmcgcGFyYW1ldGVycyBjYWxjdWxhdGlvbi4KLSAqCSAgICBVc2UgdW5zaWduZWQgbG9uZyBmb3IgdmFyaWFibGVzIGluIGJpdCBvcHMuCi0gKiAgICAwLjIwYSBGaXhlZCByZWNvcmRpbmcgc3RhcnR1cAotICoJICAgIEZpeGVkIHRpbWVyIHJhdGUgc2V0dGluZyAoaXQncyBhIDE2LWJpdCByZWdpc3RlcikKLSAqCTAuMjEgQ29udmVydGVkIGNvZGUgdG8gdXNlIHBjaV9uYW1lKCkgaW5zdGVhZCBvZiBhY2Nlc3Npbmcgc2xvdF9uYW1lCi0gKgkgICAgZGlyZWN0bHkgKEV1Z2VuZSBUZW8pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGVzZSBhcmUgb25seSBpbmNsdWRlZCBvbmNlIHBlciBtb2R1bGUgKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLSNpbmNsdWRlICJlZnhtZ3IuaCIKLSNpbmNsdWRlICJjYXJkd28uaCIKLSNpbmNsdWRlICJjYXJkd2kuaCIKLSNpbmNsdWRlICJjYXJkbW8uaCIKLSNpbmNsdWRlICJjYXJkbWkuaCIKLSNpbmNsdWRlICJyZWNtZ3IuaCIKLSNpbmNsdWRlICJlY2FyZC5oIgotCi0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotI2RlZmluZSBNSURJX1NZTlRIX05BTUUgIkVNVTEwSzEgTUlESSIKLSNkZWZpbmUgTUlESV9TWU5USF9DQVBTIFNZTlRIX0NBUF9JTlBVVAotIAotI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL21pZGlfc3ludGguaCIKLQotLyogdGhpcyBzaG91bGQgYmUgaW4gZGV2X3RhYmxlLmggKi8KLSNkZWZpbmUgU05EQ0FSRF9FTVUxMEsxIDQ2Ci0jZW5kaWYKLSAKLQotLyogdGhlIGVtdTEwazEgX3NlZW1zXyB0byBvbmx5IHN1cHBvcnRzIDI5IGJpdCAoNTEyTWlCKSBiaXQgYnVzIG1hc3RlciAqLwotI2RlZmluZSBFTVUxMEsxX0RNQV9NQVNLIERNQV8yOUJJVF9NQVNLCS8qIERNQSBidWZmZXIgbWFzayBmb3IgcGNpX2FsbG9jX2NvbnNpc3QgKi8KLQotI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NSRUFUSVZFCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQ1JFQVRJVkUgMHgxMTAyCi0jZW5kaWYKLQotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0VNVTEwSzEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DUkVBVElWRV9FTVUxMEsxIDB4MDAwMgotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZIDB4MDAwNAotI2VuZGlmCi0KLSNkZWZpbmUgRU1VX0FQU19TVUJJRAkweDQwMDExMTAyCi0gCi1lbnVtIHsKLQlFTVUxMEsxID0gMCwKLQlBVURJR1ksCi19OwotCi1zdGF0aWMgY2hhciAqY2FyZF9uYW1lc1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JIkVNVTEwSzEiLAotCSJBdWRpZ3kiLAotfTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVtdTEwazFfcGNpX3RibFtdID0gewotCXtQQ0lfVkVORE9SX0lEX0NSRUFUSVZFLCBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0VNVTEwSzEsCi0JIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEVNVTEwSzF9LAotCXtQQ0lfVkVORE9SX0lEX0NSRUFUSVZFLCBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWSwKLQkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVVESUdZfSwKLQl7MCx9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZW11MTBrMV9wY2lfdGJsKTsKLQotLyogR2xvYmFsIHZhciBpbnN0YW50aWF0aW9uICovCi0KLUxJU1RfSEVBRChlbXUxMGsxX2RldnMpOwotCi1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX2F1ZGlvX2ZvcHM7Ci1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX21peGVyX2ZvcHM7Ci1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX21pZGlfZm9wczsKLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi1zdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBlbXUxMGsxX21pZGlfb3BlcmF0aW9uczsKLSNlbmRpZgotCi1leHRlcm4gaXJxcmV0dXJuX3QgZW11MTBrMV9pbnRlcnJ1cHQoaW50LCB2b2lkICopOwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX2F1ZGlvX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQkvKiBBc3NpZ24gZGVmYXVsdCBwbGF5YmFjayB2b2ljZSBwYXJhbWV0ZXJzICovCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkKLQkJY2FyZC0+bWNoYW5uZWxfZnggPSAwOwotCWVsc2UKLQkJY2FyZC0+bWNoYW5uZWxfZnggPSA4OwotCi0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCS8qIG1vbm8gdm9pY2UgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9NT05PXSA9IDB4ZmZmZmZmZmY7Ci0JCWNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTU9OT10gPSAweDAwMDBmZmZmOwotCQotCQkvKiBzdGVyZW8gdm9pY2UgKi8KLQkJLyogbGVmdCAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX0xFRlRdID0gMHgwMGZmMDBmZjsKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9MRUZUXSA9IDB4MDAwMDdmN2Y7CQotCQkvKiByaWdodCAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX1JJR0hUXSA9IDB4ZmYwMGZmMDA7Ci0JCWNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfUklHSFRdID0gMHgwMDAwN2Y3ZjsKLQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dID0gMHgwMzAyMDEwMDsgLy8gUmVndWxhciBwY20KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTV0gPSAweDA3MDYwNTA0OwotCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXSA9IDB4M2YzZjNkM2M7IC8vIFBhc3N0aHJvdWdoCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QVF0gPSAweDNmM2YzZjNmOwotCQkKLQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV0gPSAweDAzMDIwMTAwOyAvLyBTcGFyZQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNMV0gPSAweDA3MDYwNDA0OwotCQkKLQl9IGVsc2UgewotCQkvKiBtb25vIHZvaWNlICovCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTU9OT10gPSAweDAwMDBmZmZmOwotCQotCQkvKiBzdGVyZW8gdm9pY2UgKi8KLQkJLyogbGVmdCAqLwotCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX0xFRlRdID0gMHgwMDAwMDBmZjsKLQkJLyogcmlnaHQgKi8KLQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9SSUdIVF0gPSAweDAwMDBmZjAwOwotCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV0gPSAweDMyMTA7IC8vIHBjbQotCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QVF0gPSAweDMyMTA7IC8vIHBhc3N0aHJvdWdoCi0JCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdID0gMHg3NjU0OyAvLyAvZGV2L2RzcDEKLQl9Ci0KLQkvKiBBc3NpZ24gZGVmYXVsdCByZWNvcmRpbmcgcGFyYW1ldGVycyAqLwotCS8qIEZJWE1FICovCi0JaWYgKGNhcmQtPmlzX2FwcykKLQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfRlg7Ci0JZWxzZQotCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9BQzk3OwotCi0JY2FyZC0+d2F2ZWluLmZ4d2MgPSAweDAwMDM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfYXVkaW9fY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQljYXJkLT5hdWRpb19kZXYgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVtdTEwazFfYXVkaW9fZm9wcywgLTEpOwotCWlmIChjYXJkLT5hdWRpb19kZXYgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIGZpcnN0IGF1ZGlvIGRldmljZSFcbiIpOwotCQlnb3RvIGVycl9kZXY7Ci0JfQotCi0JY2FyZC0+YXVkaW9fZGV2MSA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZW11MTBrMV9hdWRpb19mb3BzLCAtMSk7Ci0JaWYgKGNhcmQtPmF1ZGlvX2RldjEgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIHNlY29uZCBhdWRpbyBkZXZpY2UhXG4iKTsKLQkJZ290byBlcnJfZGV2MTsKLQl9Ci0KLQljYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmZW11MTBrMV9taXhlcl9mb3BzLCAtMSk7Ci0JaWYgKGNhcmQtPmFjOTctPmRldl9taXhlciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgbWl4ZXIgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfbWl4ZXI7Ci0gICAgICAgIH0KLQotCWNhcmQtPm1pZGlfZGV2ID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmZW11MTBrMV9taWRpX2ZvcHMsIC0xKTsKLQlpZiAoY2FyZC0+bWlkaV9kZXYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgbWlkaSBkZXZpY2UhXG4iKTsKLQkJZ290byBlcnJfbWlkaTsKLSAgICAgICAgfQotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQljYXJkLT5zZXFfZGV2ID0gc291bmRfYWxsb2NfbWlkaWRldigpOwotCWlmIChjYXJkLT5zZXFfZGV2ID09IC0xKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbXUxMGsxOiB1bmFibGUgdG8gcmVnaXN0ZXIgc2VxdWVuY2VyIGRldmljZSEiKTsKLQllbHNlIHsKLQkJc3RkX21pZGlfc3ludGgubWlkaV9kZXYgPSBjYXJkLT5zZXFfZGV2OwotCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0gPSAKLQkJCShzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zICopCi0JCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKG1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkhIik7Ci0JCQlzb3VuZF91bmxvYWRfbWlkaWRldihjYXJkLT5zZXFfZGV2KTsKLQkJCWNhcmQtPnNlcV9kZXYgPSAtMTsKLQkJCS8qIHJldHVybiB3aXRob3V0IGVycm9yICovCi0JCX0gZWxzZSB7Ci0JCQltZW1jcHkoKGNoYXIgKiltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0sIAotCQkJCShjaGFyICopJmVtdTEwazFfbWlkaV9vcGVyYXRpb25zLCAKLQkJCQlzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucykpOwotCQkJbWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdLT5kZXZjID0gY2FyZDsKLQkJCXNlcXVlbmNlcl9pbml0KCk7Ci0JCQljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLQotZXJyX21pZGk6Ci0JdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOwotZXJyX21peGVyOgotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7Ci1lcnJfZGV2MToKLQl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5hdWRpb19kZXYpOwotZXJyX2RldjoKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgZW11MTBrMV91bnJlZ2lzdGVyX2RldmljZXMoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCWlmIChjYXJkLT5zZXFfZGV2ID4gLTEpIHsKLQkJa2ZyZWUobWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdKTsKLQkJbWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdID0gTlVMTDsKLQkJc291bmRfdW5sb2FkX21pZGlkZXYoY2FyZC0+c2VxX2Rldik7Ci0JCWNhcmQtPnNlcV9kZXYgPSAtMTsKLQl9Ci0jZW5kaWYKLQotCXVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5taWRpX2Rldik7Ci0JdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOwotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2RldjEpOwotCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9pbmZvX3Byb2MgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkJICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZGF0YTsKLQlpbnQgbGVuID0gMDsKLQkKLQlpZiAoY2FyZCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiRHJpdmVyIFZlcnNpb24gOiAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiQ2FyZCB0eXBlICAgICAgOiAlc1xuIiwgY2FyZC0+aXNfYXBzID8gIkFwcyIgOiAoY2FyZC0+aXNfYXVkaWd5ID8gIkF1ZGlneSIgOiAiRW11MTBrMSIpKTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIlJldmlzaW9uICAgICAgIDogJWRcbiIsIGNhcmQtPmNoaXByZXYpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiTW9kZWwgICAgICAgICAgOiAlIzA2eFxuIiwgY2FyZC0+bW9kZWwpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiSU8gICAgICAgICAgICAgOiAlIzA2bHgtJSMwNmx4XG4iLCBjYXJkLT5pb2Jhc2UsIGNhcmQtPmlvYmFzZSArIGNhcmQtPmxlbmd0aCAtIDEpOwotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiSVJRICAgICAgICAgICAgOiAlZFxuXG4iLCBjYXJkLT5pcnEpOwotCQotCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiUmVnaXN0ZXJlZCAvZGV2IEVudHJpZXM6XG4iKTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvZHNwJWRcbiIsIGNhcmQtPmF1ZGlvX2RldiAvIDE2KTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvZHNwJWRcbiIsIGNhcmQtPmF1ZGlvX2RldjEgLyAxNik7Ci0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L21peGVyJWRcbiIsIGNhcmQtPmFjOTctPmRldl9taXhlciAvIDE2KTsKLQlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvbWlkaSVkXG4iLCBjYXJkLT5taWRpX2RldiAvIDE2KTsKLQotI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCi0JbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L3NlcXVlbmNlclxuIik7Ci0jZW5kaWYKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcHJvY19pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JY2hhciBzWzQ4XTsKLQotCWlmICghcHJvY19ta2RpciAoImRyaXZlci9lbXUxMGsxIiwgTlVMTCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZGlyZWN0b3J5IGRyaXZlci9lbXUxMGsxXG4iKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCWlmICghcHJvY19ta2RpciAocywgTlVMTCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZGlyZWN0b3J5ICVzXG4iLCBzKTsKLQkJZ290byBlcnJfZW11MTBrMV9wcm9jOwotCX0KLQotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2luZm8iLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JaWYgKCFjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChzLCAwLCBOVUxMLCBlbXUxMGsxX2luZm9fcHJvYywgY2FyZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsIHMpOwotCQlnb3RvIGVycl9kZXZfcHJvYzsKLQl9Ci0KLQlpZiAoIWNhcmQtPmlzX2FwcykgewotCQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9hYzk3IiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCQlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHMsIDAsIE5VTEwsIGFjOTdfcmVhZF9wcm9jLCBjYXJkLT5hYzk3KSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsIHMpOwotCQkJZ290byBlcnJfcHJvY19hYzk3OwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9wcm9jX2FjOTc6Ci0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvaW5mbyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKLQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKLQotZXJyX2Rldl9wcm9jOgotCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCi1lcnJfZW11MTBrMV9wcm9jOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvZW11MTBrMSIsIE5VTEwpOwotCi1lcnJfb3V0OgotCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX3Byb2NfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWNoYXIgc1s0OF07Ci0KLQlpZiAoIWNhcmQtPmlzX2FwcykgewotCQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9hYzk3IiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKLQl9Ci0KLQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9pbmZvIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOwotCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOwotCi0Jc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7Ci0JCQotCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvZW11MTBrMSIsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX21peGVyX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgID0gYWM5N19hbGxvY19jb2RlYygpOwotCQotCWlmKGNvZGVjID09IE5VTEwpCi0JewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBhbGxvY2F0ZSBtaXhlclxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQljYXJkLT5hYzk3ID0gY29kZWM7Ci0JY2FyZC0+YWM5Ny0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKLQotCWlmICghY2FyZC0+aXNfYXBzKSB7Ci0JCWNhcmQtPmFjOTctPmlkID0gMDsKLQkJY2FyZC0+YWM5Ny0+Y29kZWNfcmVhZCA9IGVtdTEwazFfYWM5N19yZWFkOwotICAgICAgICAJY2FyZC0+YWM5Ny0+Y29kZWNfd3JpdGUgPSBlbXUxMGsxX2FjOTdfd3JpdGU7Ci0KLQkJaWYgKGFjOTdfcHJvYmVfY29kZWMgKGNhcmQtPmFjOTcpID09IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIHByb2JlIEFDOTcgY29kZWNcbiIpOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JCS8qIDUuMTogRW5hYmxlIHRoZSBhZGRpdGlvbmFsIEFDOTcgU2xvdHMgYW5kIHVubXV0ZSBleHRyYSBjaGFubmVscyBvbiBBQzk3IGNvZGVjICovCi0JCWlmIChjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCkgJiAweDAwODApewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiZW11MTBrMTogU0JMaXZlISA1LjEgY2FyZCBkZXRlY3RlZFxuIik7IAotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFDOTdTTE9ULCAwLCBBQzk3U0xPVF9DTlRSIHwgQUM5N1NMT1RfTEZFKTsKLQkJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MCk7Ci0JCX0KLQotCQkvLyBGb3JjZSA1Yml0OgkJICAgIAotCQkvL2NhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uPTU7Ci0KLQkJLyogdGhlc2Ugd2lsbCBzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWVzIGFuZCBuZXZlciBiZSBtb2RpZmllZCAqLwotCQljYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnMgPSBjYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzOwotCQljYXJkLT5hYzk3X3N0ZXJlb19taXhlcnMgPSBjYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzOwotCX0KLQotCXJldHVybiAwOwotCi0gZXJyX291dDoKLSAJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTcpOwotCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgdm9pZCBlbXUxMGsxX21peGVyX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5Nyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfbWlkaV9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IHJldDsKLQotCWNhcmQtPm1wdW91dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdW91dCksIEdGUF9LRVJORUwpOwotCWlmIChjYXJkLT5tcHVvdXQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbXUxMGsxOiBVbmFibGUgdG8gYWxsb2NhdGUgZW11MTBrMV9tcHVvdXQ6IG91dCBvZiBtZW1vcnlcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXQxOwotCX0KLQotCWNhcmQtPm1wdW91dC0+aW50ciA9IDE7Ci0JY2FyZC0+bXB1b3V0LT5zdGF0dXMgPSBGTEFHU19BVkFJTEFCTEU7Ci0JY2FyZC0+bXB1b3V0LT5zdGF0ZSA9IENBUkRNSURJT1VUX1NUQVRFX0RFRkFVTFQ7Ci0KLQl0YXNrbGV0X2luaXQoJmNhcmQtPm1wdW91dC0+dGFza2xldCwgZW11MTBrMV9tcHVvdXRfYmgsICh1bnNpZ25lZCBsb25nKSBjYXJkKTsKLQotCXNwaW5fbG9ja19pbml0KCZjYXJkLT5tcHVvdXQtPmxvY2spOwotCi0JY2FyZC0+bXB1aW4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV9tcHVpbiksIEdGUF9LRVJORUwpOwotCWlmIChjYXJkLT5tcHVpbiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbXUxMGsxX21wdWluOiBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycl9vdXQyOwotCX0KLQotCWNhcmQtPm1wdWluLT5zdGF0dXMgPSBGTEFHU19BVkFJTEFCTEU7Ci0KLQl0YXNrbGV0X2luaXQoJmNhcmQtPm1wdWluLT50YXNrbGV0LCBlbXUxMGsxX21wdWluX2JoLCAodW5zaWduZWQgbG9uZykgY2FyZC0+bXB1aW4pOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPm1wdWluLT5sb2NrKTsKLQotCS8qIFJlc2V0IHRoZSBNUFUgcG9ydCAqLwotCWlmIChlbXUxMGsxX21wdV9yZXNldChjYXJkKSA8IDApIHsKLQkJRVJST1IoKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnJfb3V0MzsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dDM6Ci0Ja2ZyZWUoY2FyZC0+bXB1aW4pOwotZXJyX291dDI6Ci0Ja2ZyZWUoY2FyZC0+bXB1b3V0KTsKLWVycl9vdXQxOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfbWlkaV9jbGVhbnVwKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JdGFza2xldF9raWxsKCZjYXJkLT5tcHVvdXQtPnRhc2tsZXQpOwotCWtmcmVlKGNhcmQtPm1wdW91dCk7Ci0KLQl0YXNrbGV0X2tpbGwoJmNhcmQtPm1wdWluLT50YXNrbGV0KTsKLQlrZnJlZShjYXJkLT5tcHVpbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCB2b2ljZV9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0c7IGkrKykKLQkJY2FyZC0+dm9pY2V0YWJsZVtpXSA9IFZPSUNFX1VTQUdFX0ZSRUU7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0aW1lcl9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJmNhcmQtPnRpbWVycyk7Ci0JY2FyZC0+dGltZXJfZGVsYXkgPSBUSU1FUl9TVE9QUEVEOwotCXNwaW5fbG9ja19pbml0KCZjYXJkLT50aW1lcl9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IGFkZHhtZ3JfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCXUzMiBjb3VudDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWFBBR0VTOyBjb3VudCsrKQotCQljYXJkLT5lbXVwYWdldGFibGVbY291bnRdID0gMDsKLQotCS8qIE1hcmsgZmlyc3QgcGFnZSBhcyB1c2VkICovCi0JLyogVGhpcyBwYWdlIGlzIHJlc2VydmVkIGJ5IHRoZSBkcml2ZXIgKi8KLQljYXJkLT5lbXVwYWdldGFibGVbMF0gPSAweDgwMDE7Ci0JY2FyZC0+ZW11cGFnZXRhYmxlWzFdID0gTUFYUEFHRVMgLSAxOwotfQotCi1zdGF0aWMgdm9pZCBmeF9jbGVhbnVwKHN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IpCi17Ci0JaW50IGk7Ci0JZm9yKGkgPSAwOyBpIDwgbWdyLT5jdXJyZW50X3BhZ2VzOyBpKyspCi0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgbWdyLT5wYXRjaFtpXSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGZ4X2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyID0gJmNhcmQtPm1ncjsKLQlzdHJ1Y3QgZHNwX3BhdGNoICpwYXRjaDsKLQlzdHJ1Y3QgZHNwX3JwYXRjaCAqcnBhdGNoOwotCXMzMiBsZWZ0LCByaWdodDsKLQlpbnQgaTsKLQl1MzIgcGMgPSAwOwotCXUzMiBwYXRjaF9uPTA7Ci0Jc3RydWN0IGVtdV9lZnhfaW5mb190IGVtdV9lZnhfaW5mb1syXT0KLQkJe3sgMjAsIDEwLCAweDQwMCwgMHgxMDAsIDB4MjAgfSwKLQkJIHsgMjQsIDEyLCAweDYwMCwgMHg0MDAsIDB4NjAgfSwKLQkJfTsgCi0JCQkKLQotCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykgewotCQltZ3ItPmN0cmxfZ3ByW2ldWzBdID0gLTE7Ci0JCW1nci0+Y3RybF9ncHJbaV1bMV0gPSAtMTsKLQl9Ci0KLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCW1nci0+Y3VycmVudF9wYWdlcyA9ICgyICsgUEFUQ0hFU19QRVJfUEFHRSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRTsKLQllbHNlCi0JCS8qICEhIFRoZSBudW1iZXIgYmVsb3cgbXVzdCBlcXVhbCB0aGUgbnVtYmVyIG9mIHBhdGNoZXMsIGN1cnJlbnRseSAxMSAhISAqLwotCQltZ3ItPmN1cnJlbnRfcGFnZXMgPSAoMTEgKyBQQVRDSEVTX1BFUl9QQUdFIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFOwotCQotCWZvciAoaSA9IDA7IGkgPCBtZ3ItPmN1cnJlbnRfcGFnZXM7IGkrKykgewotCQltZ3ItPnBhdGNoW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmIChtZ3ItPnBhdGNoW2ldID09IE5VTEwpIHsKLQkJCW1nci0+Y3VycmVudF9wYWdlcyA9IGk7Ci0JCQlmeF9jbGVhbnVwKG1ncik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQltZW1zZXQobWdyLT5wYXRjaFtpXSwgMCwgUEFHRV9TSVpFKTsKLQl9Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspCi0JCQlPUCgweGYsIDB4MGMwLCAweDBjMCwgMHgwY2YsIDB4MGMwKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgNTEyIDsgaSsrKQotCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfR1BSX0JBU0UraSwwLDApOwotCi0JCXBjPTA7Ci0KLQkJLy9QY20gaW5wdXQgdm9sdW1lCi0JCU9QKDAsIDB4NDAyLCAweDBjMCwgMHg0MDYsIDB4MDAwKTsKLQkJT1AoMCwgMHg0MDMsIDB4MGMwLCAweDQwNywgMHgwMDEpOwotCi0JCS8vQ0QtRGlnaXRhbCBpbnB1dCBWb2x1bWUKLQkJT1AoMCwgMHg0MDQsIDB4MGMwLCAweDQwZCwgMHg0Mik7Ci0JCU9QKDAsIDB4NDA1LCAweDBjMCwgMHg0MGYsIDB4NDMpOwotCi0JCS8vIENEICsgUENNIAotCQlPUCg2LCAweDQwMCwgMHgwYzAsIDB4NDAyLCAweDQwNCk7Ci0JCU9QKDYsIDB4NDAxLCAweDBjMCwgMHg0MDMsIDB4NDA1KTsKLQkJCi0JCS8vIEZyb250IE91dHB1dCArIE1hc3RlciBWb2x1bWUKLQkJT1AoMCwgMHg2OCwgMHgwYzAsIDB4NDA4LCAweDQwMCk7Ci0JCU9QKDAsIDB4NjksIDB4MGMwLCAweDQwOSwgMHg0MDEpOwotCi0JCS8vIEFkZC1pbiBhbmFsb2cgaW5wdXRzIGZvciBvdGhlciBzcGVha2VycwotCQlPUCg2LCAweDQwMCwgMHg0MCwgMHg0MDAsIDB4YzApOwotCQlPUCg2LCAweDQwMSwgMHg0MSwgMHg0MDEsIDB4YzApOwotCi0JCS8vIERpZ2l0YWwgRnJvbnQgKyBNYXN0ZXIgVm9sdW1lCi0JCU9QKDAsIDB4NjAsIDB4MGMwLCAweDQwOCwgMHg0MDApOwotCQlPUCgwLCAweDYxLCAweDBjMCwgMHg0MDksIDB4NDAxKTsKLQotCQkvLyBSZWFyIE91dHB1dCArIFJlYXIgVm9sdW1lCi0JCU9QKDAsIDB4MDZlLCAweDBjMCwgMHg0MTksIDB4NDAwKTsKLQkJT1AoMCwgMHgwNmYsIDB4MGMwLCAweDQxYSwgMHg0MDEpOwkJCi0KLQkJLy8gRGlnaXRhbCBSZWFyIE91dHB1dCArIFJlYXIgVm9sdW1lCi0JCU9QKDAsIDB4MDY2LCAweDBjMCwgMHg0MTksIDB4NDAwKTsKLQkJT1AoMCwgMHgwNjcsIDB4MGMwLCAweDQxYSwgMHg0MDEpOwkJCi0KLQkJLy8gQXVkaWd5IERyaXZlLCBIZWFkcGhvbmUgb3V0Ci0JCU9QKDYsIDB4NjQsIDB4MGMwLCAweDBjMCwgMHg0MDApOwotCQlPUCg2LCAweDY1LCAweDBjMCwgMHgwYzAsIDB4NDAxKTsKLQotCQkvLyBhYzk3IFJlY29yZGluZwotCQlPUCg2LCAweDc2LCAweDBjMCwgMHgwYzAsIDB4NDApOwotCQlPUCg2LCAweDc3LCAweDBjMCwgMHgwYzAsIDB4NDEpOwotCQkKLQkJLy8gQ2VudGVyID0gc3ViID0gTGVmdC8yICsgUmlnaHQvMgotCQlPUCgweGUsIDB4NDAwLCAweDQwMSwgMHhjZCwgMHg0MDApOwotCi0JCS8vIGNlbnRlci9zdWIgIFZvbHVtZSAobWFzdGVyKQotCQlPUCgwLCAweDA2YSwgMHgwYzAsIDB4NDA4LCAweDQwMCk7Ci0JCU9QKDAsIDB4MDZiLCAweDBjMCwgMHg0MDksIDB4NDAwKTsKLQotCQkvLyBEaWdpdGFsIGNlbnRlci9zdWIgIFZvbHVtZSAobWFzdGVyKQotCQlPUCgwLCAweDA2MiwgMHgwYzAsIDB4NDA4LCAweDQwMCk7Ci0JCU9QKDAsIDB4MDYzLCAweDBjMCwgMHg0MDksIDB4NDAwKTsKLQotCQlST1VUSU5HX1BBVENIX1NUQVJUKHJwYXRjaCwgIlJvdXRpbmciKTsKLQkJUk9VVElOR19QQVRDSF9FTkQocnBhdGNoKTsKLQotCQkvKiBkZWxpbWl0ZXIgcGF0Y2ggKi8KLQkJcGF0Y2ggPSBQQVRDSChtZ3IsIHBhdGNoX24pOwotCQlwYXRjaC0+Y29kZV9zaXplID0gMDsKLQotCQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgMHg1MywgMCwgMCk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDUxMiA7IGkrKykKLQkJCU9QKDYsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDApOwotCi0JCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQkJCQkJICAgIEZYR1BSRUdCQVNFICsgaSwgMCwKLQkJCQkJICAgIFRBTktNRU1BRERSUkVHQkFTRSArIGksIDAsCi0JCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQkJCi0JCXBjID0gMDsKLQotCQkvL2ZpcnN0IGZyZWUgR1BSID0gMHgxMWIKLQkKLQkJCi0JCS8qIEZYIHZvbHVtZSBjb3JyZWN0aW9uIGFuZCBWb2x1bWUgY29udHJvbCovCi0JCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiUGNtIEwgdm9sIiwgMHgwLCAwKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTAwLCAweDApOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA2LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0JCUdFVF9EWU5BTUlDX0dQUihwYXRjaCwgMHgxMTIpOwotCi0JCU9QKDQsIDB4MTEyLCAweDQwLCBQQ01fSU5fTCwgMHg0NCk7IC8vKjQJCi0JCU9QKDAsIDB4MTAwLCAweDA0MCwgMHgxMTIsIDB4MTA2KTsgIC8vKnZvbAkKLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiUGNtIFIgdm9sIiwgMHgxLCAwKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTAxLCAweDEpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA3LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0JCUdFVF9EWU5BTUlDX0dQUihwYXRjaCwgMHgxMTIpOwotCi0JCU9QKDQsIDB4MTEyLCAweDQwLCBQQ01fSU5fUiwgMHg0NCk7IAotCQlPUCgwLCAweDEwMSwgMHgwNDAsIDB4MTEyLCAweDEwNyk7Ci0KLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCS8vIENELURpZ2l0YWwgSW4gVm9sdW1lIGNvbnRyb2wJCi0JCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiQ0QtRGlnaXRhbCBWb2wgTCIsIDB4MTIsIDApOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMGMsIDB4MTIpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTBkLCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgMHgxMGMsIDB4MDQwLCBTUERJRl9DRF9MLCAweDEwZCk7Ci0JCUlOUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJDRC1EaWdpdGFsIFZvbCBSIiwgMHgxMywgMCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwZSwgMHgxMyk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMGYsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCAweDEwZSwgMHgwNDAsIFNQRElGX0NEX1IsIDB4MTBmKTsKLQkJSU5QVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCQkvL1ZvbHVtZSBDb3JyZWN0aW9uIGZvciBNdWx0aS1jaGFubmVsIElucHV0cwkKLQkJSU5QVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJNdWx0aS1DaGFubmVsIEdhaW4iLCAweDA4LCAwKTsKLQkJcGF0Y2gtPmlucHV0PXBhdGNoLT5vdXRwdXQ9MHgzRjAwOwotCi0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExMywgTVVMVElfRlJPTlRfTCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNCwgTVVMVElfRlJPTlRfUik7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNSwgTVVMVElfUkVBUl9MKTsKLQkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE2LCBNVUxUSV9SRUFSX1IpOwotCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTcsIE1VTFRJX0NFTlRFUik7Ci0JCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExOCwgTVVMVElfTEZFKTsKLQotCQlPUCg0LCAweDExMywgMHg0MCwgTVVMVElfRlJPTlRfTCwgMHg0NCk7Ci0JCU9QKDQsIDB4MTE0LCAweDQwLCBNVUxUSV9GUk9OVF9SLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTUsIDB4NDAsIE1VTFRJX1JFQVJfTCwgMHg0NCk7Ci0JCU9QKDQsIDB4MTE2LCAweDQwLCBNVUxUSV9SRUFSX1IsIDB4NDQpOwotCQlPUCg0LCAweDExNywgMHg0MCwgTVVMVElfQ0VOVEVSLCAweDQ0KTsKLQkJT1AoNCwgMHgxMTgsIDB4NDAsIE1VTFRJX0xGRSwgMHg0NCk7Ci0JCi0JCUlOUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQkvL1JvdXRpbmcgcGF0Y2ggc3RhcnQJCi0JCVJPVVRJTkdfUEFUQ0hfU1RBUlQocnBhdGNoLCAiUm91dGluZyIpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMDAsIDB4MCk7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwMSwgMHgxKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTBjLCAweDEyKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTBlLCAweDEzKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTEzLCBNVUxUSV9GUk9OVF9MKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE0LCBNVUxUSV9GUk9OVF9SKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE1LCBNVUxUSV9SRUFSX0wpOwotCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTYsIE1VTFRJX1JFQVJfUik7Ci0JCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNywgTVVMVElfQ0VOVEVSKTsKLQkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE4LCBNVUxUSV9MRkUpOwotCi0JCUdFVF9EWU5BTUlDX0dQUihycGF0Y2gsIDB4MTAyKTsKLQkJR0VUX0RZTkFNSUNfR1BSKHJwYXRjaCwgMHgxMDMpOwotCi0JCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMDQsIDB4OCk7Ci0JCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMDUsIDB4OSk7Ci0JCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMGEsIDB4Mik7Ci0JCUdFVF9PVVRQVVRfR1BSKHJwYXRjaCwgMHgxMGIsIDB4Myk7Ci0JCQotCQkKLQkJLyogaW5wdXQgYnVmZmVyICovCi0JCU9QKDYsIDB4MTAyLCBBQzk3X0lOX0wsIDB4NDAsIDB4NDApOwotCQlPUCg2LCAweDEwMywgQUM5N19JTl9SLCAweDQwLCAweDQwKTsKLQotCi0JCS8qIERpZ2l0YWwgSW4gKyBQQ00gKyBNVUxUSV9GUk9OVC0+IEFDOTcgb3V0IChmcm9udCBzcGVha2VycykqLwotCQlPUCg2LCBBQzk3X0ZST05UX0wsIDB4MTAwLCAweDEwYywgMHgxMTMpOwotCi0JCUNPTk5FQ1QoTVVMVElfRlJPTlRfTCwgQUM5N19GUk9OVF9MKTsKLQkJQ09OTkVDVChQQ01fSU5fTCwgQUM5N19GUk9OVF9MKTsKLQkJQ09OTkVDVChTUERJRl9DRF9MLCBBQzk3X0ZST05UX0wpOwotCi0JCU9QKDYsIEFDOTdfRlJPTlRfUiwgMHgxMDEsIDB4MTBlLCAweDExNCk7Ci0KLQkJQ09OTkVDVChNVUxUSV9GUk9OVF9SLCBBQzk3X0ZST05UX1IpOwotCQlDT05ORUNUKFBDTV9JTl9SLCBBQzk3X0ZST05UX1IpOwotCQlDT05ORUNUKFNQRElGX0NEX1IsIEFDOTdfRlJPTlRfUik7Ci0KLQkJLyogRGlnaXRhbCBJbiArIFBDTSArIEFDOTcgSW4gKyBQQ00xICsgTVVMVElfUkVBUiAtLT4gUmVhciBDaGFubmVsICovIAotCQlPUCg2LCAweDEwNCwgUENNMV9JTl9MLCAweDEwMCwgMHgxMTUpOwotCQlPUCg2LCAweDEwNCwgMHgxMDQsIDB4MTBjLCAweDEwMik7Ci0KLQkJQ09OTkVDVChNVUxUSV9SRUFSX0wsIEFOQUxPR19SRUFSX0wpOwotCQlDT05ORUNUKEFDOTdfSU5fTCwgQU5BTE9HX1JFQVJfTCk7Ci0JCUNPTk5FQ1QoUENNX0lOX0wsIEFOQUxPR19SRUFSX0wpOwotCQlDT05ORUNUKFNQRElGX0NEX0wsIEFOQUxPR19SRUFSX0wpOwotCQlDT05ORUNUKFBDTTFfSU5fTCwgQU5BTE9HX1JFQVJfTCk7Ci0KLQkJT1AoNiwgMHgxMDUsIFBDTTFfSU5fUiwgMHgxMDEsIDB4MTE2KTsKLQkJT1AoNiwgMHgxMDUsIDB4MTA1LCAweDEwZSwgMHgxMDMpOwotCi0JCUNPTk5FQ1QoTVVMVElfUkVBUl9SLCBBTkFMT0dfUkVBUl9SKTsKLQkJQ09OTkVDVChBQzk3X0lOX1IsIEFOQUxPR19SRUFSX1IpOwotCQlDT05ORUNUKFBDTV9JTl9SLCBBTkFMT0dfUkVBUl9SKTsKLQkJQ09OTkVDVChTUERJRl9DRF9SLCBBTkFMT0dfUkVBUl9SKTsKLQkJQ09OTkVDVChQQ00xX0lOX1IsIEFOQUxPR19SRUFSX1IpOwotCi0JCS8qIERpZ2l0YWwgSW4gKyBQQ00gKyBBQzk3IEluICsgTVVMVElfRlJPTlQgLS0+IERpZ2l0YWwgb3V0ICovCi0JCU9QKDYsIDB4MTBiLCAweDEwMCwgMHgxMDIsIDB4MTBjKTsKLQkJT1AoNiwgMHgxMGIsIDB4MTBiLCAweDExMywgMHg0MCk7Ci0KLQkJQ09OTkVDVChNVUxUSV9GUk9OVF9MLCBESUdJVEFMX09VVF9MKTsKLQkJQ09OTkVDVChQQ01fSU5fTCwgRElHSVRBTF9PVVRfTCk7Ci0JCUNPTk5FQ1QoQUM5N19JTl9MLCBESUdJVEFMX09VVF9MKTsKLQkJQ09OTkVDVChTUERJRl9DRF9MLCBESUdJVEFMX09VVF9MKTsKLQotCQlPUCg2LCAweDEwYSwgMHgxMDEsIDB4MTAzLCAweDEwZSk7Ci0JCU9QKDYsIDB4MTBiLCAweDEwYiwgMHgxMTQsIDB4NDApOwotCi0JCUNPTk5FQ1QoTVVMVElfRlJPTlRfUiwgRElHSVRBTF9PVVRfUik7Ci0JCUNPTk5FQ1QoUENNX0lOX1IsIERJR0lUQUxfT1VUX1IpOwotCQlDT05ORUNUKEFDOTdfSU5fUiwgRElHSVRBTF9PVVRfUik7Ci0JCUNPTk5FQ1QoU1BESUZfQ0RfUiwgRElHSVRBTF9PVVRfUik7Ci0KLQkJLyogQUM5NyBJbiAtLT4gQURDIFJlY29yZGluZyBCdWZmZXIgKi8KLQkJT1AoNiwgQURDX1JFQ19MLCAweDEwMiwgMHg0MCwgMHg0MCk7Ci0KLQkJQ09OTkVDVChBQzk3X0lOX0wsIEFEQ19SRUNfTCk7Ci0KLQkJT1AoNiwgQURDX1JFQ19SLCAweDEwMywgMHg0MCwgMHg0MCk7Ci0KLQkJQ09OTkVDVChBQzk3X0lOX1IsIEFEQ19SRUNfUik7Ci0KLQotCQkvKiBmeDEyOkFuYWxvZy1DZW50ZXIgKi8KLQkJT1AoNiwgQU5BTE9HX0NFTlRFUiwgMHgxMTcsIDB4NDAsIDB4NDApOwotCQlDT05ORUNUKE1VTFRJX0NFTlRFUiwgQU5BTE9HX0NFTlRFUik7Ci0KLQkJLyogZngxMTpBbmFsb2ctTEZFICovCi0JCU9QKDYsIEFOQUxPR19MRkUsIDB4MTE4LCAweDQwLCAweDQwKTsKLQkJQ09OTkVDVChNVUxUSV9MRkUsIEFOQUxPR19MRkUpOwotCi0JCS8qIGZ4MTI6RGlnaXRhbC1DZW50ZXIgKi8KLQkJT1AoNiwgRElHSVRBTF9DRU5URVIsIDB4MTE3LCAweDQwLCAweDQwKTsKLQkJQ09OTkVDVChNVUxUSV9DRU5URVIsIERJR0lUQUxfQ0VOVEVSKTsKLQkJCi0JCS8qIGZ4MTE6QW5hbG9nLUxGRSAqLwotCQlPUCg2LCBESUdJVEFMX0xGRSwgMHgxMTgsIDB4NDAsIDB4NDApOwotCQlDT05ORUNUKE1VTFRJX0xGRSwgRElHSVRBTF9MRkUpOwotCQotCQlST1VUSU5HX1BBVENIX0VORChycGF0Y2gpOwotCi0KLQkJLy8gUmVhciB2b2x1bWUgY29udHJvbAkKLQkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIFJlYXIgTCIsIDB4OCwgMCk7Ci0JCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTA0LCAweDgpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTE5LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgQU5BTE9HX1JFQVJfTCwgMHgwNDAsIDB4MTA0LCAweDExOSk7Ci0JCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0JCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBSZWFyIFIiLCAweDksIDApOwotCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwNSwgMHg5KTsKLQkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDExYSwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOwotCi0JCU9QKDAsIEFOQUxPR19SRUFSX1IsIDB4MDQwLCAweDEwNSwgMHgxMWEpOwotCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKLQotCi0JCS8vTWFzdGVyIHZvbHVtZSBjb250cm9sIG9uIGZyb250LWRpZ2l0YWwJCi0JCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBNYXN0ZXIgTCIsIDB4MiwgMSk7Ci0JCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTBhLCAweDIpOwotCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA4LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7Ci0KLQkJT1AoMCwgRElHSVRBTF9PVVRfTCwgMHgwNDAsIDB4MTBhLCAweDEwOCk7Ci0JCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOwotCi0KLQkJT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiVm9sIE1hc3RlciBSIiwgMHgzLCAxKTsKLQkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMGIsIDB4Myk7Ci0JCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMDksICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKLQotCQlPUCgwLCBESUdJVEFMX09VVF9SLCAweDA0MCwgMHgxMGIsIDB4MTA5KTsKLQkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7Ci0KLQotCQkvKiBkZWxpbWl0ZXIgcGF0Y2ggKi8KLQkJcGF0Y2ggPSBQQVRDSChtZ3IsIHBhdGNoX24pOwotCQlwYXRjaC0+Y29kZV9zaXplID0gMDsKLQotCQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgREJHLCAwLCAwKTsKLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgmbWdyLT5sb2NrKTsKLQotCS8vIFNldCB1cCBWb2x1bWUgY29udHJvbHMsIHRyeSB0byBrZWVwIHRoaXMgdGhlIHNhbWUgZm9yIGJvdGggQXVkaWd5IGFuZCBMaXZlCi0KLQkvL01hc3RlciB2b2x1bWUKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1ZPTFVNRV1bMF0gPSA4OwotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfVk9MVU1FXVsxXSA9IDk7Ci0KLQlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfVk9MVU1FXSAmIDB4ZmY7Ci0JcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfVk9MVU1FXSA+PiA4KSAmIDB4ZmY7Ci0KLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDgsIGxlZnQsIDEgPDwgY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb24pOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgOSwgcmlnaHQsIDEgPDwgY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb24pOwotCi0JLy9SZWFyIHZvbHVtZQotCW1nci0+Y3RybF9ncHJbIFNPVU5EX01JWEVSX09HQUlOIF1bMF0gPSAweDE5OwotCW1nci0+Y3RybF9ncHJbIFNPVU5EX01JWEVSX09HQUlOIF1bMV0gPSAweDFhOwotCi0JbGVmdCA9IHJpZ2h0ID0gNjc7Ci0JY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfT0dBSU5dID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKLQotCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gU09VTkRfTUFTS19PR0FJTjsKLQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9IFNPVU5EX01BU0tfT0dBSU47Ci0KLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4MTksIGxlZnQsIFZPTF81QklUKTsKLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4MWEsIHJpZ2h0LCBWT0xfNUJJVCk7Ci0KLQkvL1BDTSBWb2x1bWUKLQltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1BDTV1bMF0gPSA2OwotCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfUENNXVsxXSA9IDc7Ci0KLQlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfUENNXSAmIDB4ZmY7Ci0JcmlnaHQgPSAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfUENNXSA+PiA4KSAmIDB4ZmY7Ci0KLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDYsIGxlZnQsIFZPTF81QklUKTsKLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDcsIHJpZ2h0LCBWT0xfNUJJVCk7Ci0KLQkvL0NELURpZ2l0YWwgVm9sdW1lCi0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9ESUdJVEFMMV1bMF0gPSAweGQ7Ci0JbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9ESUdJVEFMMV1bMV0gPSAweGY7Ci0KLQlsZWZ0ID0gcmlnaHQgPSA2NzsKLQljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9ESUdJVEFMMV0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OyAKLQotCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgfD0gU09VTkRfTUFTS19ESUdJVEFMMTsKLQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9IFNPVU5EX01BU0tfRElHSVRBTDE7Ci0KLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4ZCwgbGVmdCwgVk9MXzVCSVQpOwotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgMHhmLCByaWdodCwgVk9MXzVCSVQpOwotCi0KLQkvL2hhcmQgd2lyZSB0aGUgYWM5NydzIHBjbSwgcGNtIHZvbHVtZSBpcyBkb25lIGFib3ZlIHVzaW5nIGRzcCBjb2RlLgotCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCS8vZm9yIEF1ZGlneSwgd2UgbXV0ZSBpdCBhbmQgdXNlIHRoZSBwaGlsaXBzIDYgY2hhbm5lbCBEQUMgaW5zdGVhZAotCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHg4MDAwKTsKLQllbHNlCi0JCS8vRm9yIHRoZSBMaXZlIHdlIGhhcmR3aXJlIGl0IHRvIGZ1bGwgdm9sdW1lCi0JCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDApOwotCi0JLy9yZW1vdmUgaXQgZnJvbSB0aGUgYWM5N19jb2RlYydzIGNvbnRyb2wKLQljYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnMgJj0gflNPVU5EX01BU0tfUENNOwotCWNhcmQtPmFjOTdfc3RlcmVvX21peGVycyAmPSB+U09VTkRfTUFTS19QQ007Ci0KLQkvL3NldCBJZ2FpbiB0byAwZEIgYnkgZGVmYXVsdCwgbWF5YmUgY29uc2lkZXIgaGFyZHdpcmluZyBpdCBoZXJlLgotCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCBBQzk3X1JFQ09SRF9HQUlOLCAweDAwMDApOwotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX0lHQUlOXSA9IDB4MTAxOyAKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBod19pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JaW50IG5DaDsKLQl1MzIgcGFnZWNvdW50OyAvKiB0bXAgKi8KLQlpbnQgcmV0OwotCi0JLyogRGlzYWJsZSBhdWRpbyBhbmQgbG9jayBjYWNoZSAqLwotCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19MT0NLU09VTkRDQUNIRSB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19NVVRFQlVUVE9ORU5BQkxFKTsKLQotCS8qIFJlc2V0IHJlY29yZGluZyBidWZmZXJzICovCi0Jc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAotCQkJICAgIE1JQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgTUlDQkEsIDAsCi0JCQkgICAgRlhCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIEZYQkEsIDAsCi0JCQkgICAgQURDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKLQkJCSAgICBBRENCQSwgMCwKLQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQkvKiBEaXNhYmxlIGNoYW5uZWwgaW50ZXJydXB0ICovCi0JZW11MTBrMV93cml0ZWZuMChjYXJkLCBJTlRFLCAwKTsKLQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0JCQkgICAgQ0xJRUwsIDAsCi0JCQkgICAgQ0xJRUgsIDAsCi0JCQkgICAgU09MRUwsIDAsCi0JCQkgICAgU09MRUgsIDAsCi0JCQkgICAgVEFHTElTVF9FTkQpOwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsMCwKLQkJCQkgICAgMHg1ZSwweGYwMCwKLQkJCQkgICAgMHg1ZiwweDMsCi0JCQkJICAgIFRBR0xJU1RfRU5EKTsKLQl9Ci0KLQkvKiBJbml0IGVudmVsb3BlIGVuZ2luZSAqLwotCWZvciAobkNoID0gMDsgbkNoIDwgTlVNX0c7IG5DaCsrKSB7Ci0JCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgbkNoLAotCQkJCSAgICBEQ1lTVVNWLCAwLAotCQkJCSAgICBJUCwgMCwKLQkJCQkgICAgVlRGVCwgMHhmZmZmLAotCQkJCSAgICBDVkNGLCAweGZmZmYsCi0JCQkJICAgIFBUUlgsIDAsCi0JCQkJICAgIC8vQ1BGLCAwLAotCQkJCSAgICBDQ1IsIDAsCi0KLQkJCQkgICAgUFNTVCwgMCwKLQkJCQkgICAgRFNMLCAweDEwLAotCQkJCSAgICBDQ0NBLCAwLAotCQkJCSAgICBaMSwgMCwKLQkJCQkgICAgWjIsIDAsCi0JCQkJICAgIEZYUlQsIDB4ZDAxYzAwMDAsCi0KLQkJCQkgICAgQVRLSExETSwgMCwKLQkJCQkgICAgRENZU1VTTSwgMCwKLQkJCQkgICAgSUZBVE4sIDB4ZmZmZiwKLQkJCQkgICAgUEVGRSwgMCwKLQkJCQkgICAgRk1NT0QsIDAsCi0JCQkJICAgIFRSRU1GUlEsIDI0LAkvKiAxIEh6ICovCi0JCQkJICAgIEZNMkZSUTIsIDI0LAkvKiAxIEh6ICovCi0JCQkJICAgIFRFTVBFTlYsIDAsCi0KLQkJCQkgICAgLyoqKiBUaGVzZSBhcmUgbGFzdCBzbyBPRkYgcHJldmVudHMgd3JpdGluZyAqKiovCi0JCQkJICAgIExGT1ZBTDIsIDAsCi0JCQkJICAgIExGT1ZBTDEsIDAsCi0JCQkJICAgIEFUS0hMRFYsIDAsCi0JCQkJICAgIEVOVlZPTCwgMCwKLQkJCQkgICAgRU5WVkFMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHTElTVF9FTkQpOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCBuQ2gsIDApOwotCQkvKgotCQkgIEF1ZGlneSBGWFJUIGluaXRpYWxpemF0aW9uCi0JCSAgcmV2ZXJzZWQgZW5nJ2QsIG1heSBub3QgYmUgYWNjdXJhdGUuCi0JCSAqLwotCQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsbkNoLAotCQkJCQkgICAgMHg0YywweDAsCi0JCQkJCSAgICAweDRkLDB4MCwKLQkJCQkJICAgIDB4NGUsMHgwLAotCQkJCQkgICAgMHg0ZiwweDAsCi0JCQkJCSAgICBBX0ZYUlQxLCAweDNmM2YzZjNmLAotCQkJCQkgICAgQV9GWFJUMiwgMHgzZjNmM2YzZiwKLQkJCQkJICAgIEFfU0VOREFNT1VOVFMsIDAsCi0JCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JCX0KLQl9Ci0JCi0KLQkvKgotCSAqKiBJbml0IHRvIDB4MDIxMDkyMDQgOgotCSAqKiBDbG9jayBhY2N1cmFjeSAgICA9IDAgICAgICgxMDAwcHBtKQotCSAqKiBTYW1wbGUgUmF0ZSAgICAgICA9IDIgICAgICg0OGtIeikKLQkgKiogQXVkaW8gQ2hhbm5lbCAgICAgPSAxICAgICAoTGVmdCBvZiAyKQotCSAqKiBTb3VyY2UgTnVtYmVyICAgICA9IDAgICAgIChVbnNwZWNpZmllZCkKLQkgKiogR2VuZXJhdGlvbiBTdGF0dXMgPSAxICAgICAoT3JpZ2luYWwgZm9yIENhdCBDb2RlIDEyKQotCSAqKiBDYXQgQ29kZSAgICAgICAgICA9IDEyICAgIChEaWdpdGFsIFNpZ25hbCBNaXhlcikKLQkgKiogTW9kZSAgICAgICAgICAgICAgPSAwICAgICAoTW9kZSAwKQotCSAqKiBFbXBoYXNpcyAgICAgICAgICA9IDAgICAgIChOb25lKQotCSAqKiBDUCAgICAgICAgICAgICAgICA9IDEgICAgIChDb3B5cmlnaHQgdW5hc3NlcnRlZCkKLQkgKiogQU4gICAgICAgICAgICAgICAgPSAwICAgICAoRGlnaXRhbCBhdWRpbykKLQkgKiogUCAgICAgICAgICAgICAgICAgPSAwICAgICAoQ29uc3VtZXIpCi0JICovCi0KLQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCi0KLQkJCSAgICAvKiBTUERJRjAgKi8KLQkJCSAgICBTUENTMCwgKFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgMHgwMDIwMDAwMDAgfAotCQkJCSAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCksCi0KLQkJCSAgICAvKiBTUERJRjEgKi8KLQkJCSAgICBTUENTMSwgKFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgMHgwMDIwMDAwMDAgfAotCQkJCSAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCksCi0KLQkJCSAgICAvKiBTUERJRjIgJiBTUERJRjMgKi8KLQkJCSAgICBTUENTMiwgKFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgMHgwMDIwMDAwMDAgfAotCQkJCSAgICBTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8IDB4MDAwMDEyMDAgfCBTUENTX0VNUEhBU0lTX05PTkUgfCBTUENTX0NPUFlSSUdIVCksCi0KLQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQlpZiAoY2FyZC0+aXNfYXVkaWd5ICYmIChjYXJkLT5jaGlwcmV2ID09IDQpKSB7Ci0JCS8qIEhhY2tzIGZvciBBbGljZTMgdG8gd29yayBpbmRlcGVuZGVudCBvZiBoYVAxNlYgZHJpdmVyICovCi0JCXUzMiB0bXA7Ci0KLQkJLy9TZXR1cCBTUkNNdWx0aV9JMlMgU2FtcGxpbmdSYXRlCi0JCXRtcCA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfU1BESUZfU0FNUExFUkFURSwgMCk7Ci0JCXRtcCAmPSAweGZmZmZmMWZmOwotCQl0bXAgfD0gKDB4Mjw8OSk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX1NQRElGX1NBTVBMRVJBVEUsIDAsIHRtcCk7Ci0KLQkJLyogU2V0dXAgU1JDU2VsIChFbmFibGUgU3BkaWYsSTJTIFNSQ011bHRpKSAqLwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjAsIDB4NjAwMDAwKTsKLQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDI0LCAweDE0KTsKLQotCQkvKiBTZXR1cCBTUkNNdWx0aSBJbnB1dCBBdWRpbyBFbmFibGUgKi8KLQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDIwLCAweDZFMDAwMCk7Ci0JCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyNCwgMHhGRjAwRkYwMCk7Ci0JfQotCi0JcmV0ID0gZnhfaW5pdChjYXJkKTsJCS8qIGluaXRpYWxpemUgZWZmZWN0cyBlbmdpbmUgKi8KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWNhcmQtPnRhbmttZW0uc2l6ZSA9IDA7Ci0KLQljYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUgPSBNQVhQQUdFUyAqIHNpemVvZih1MzIpOwotCi0JY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplLCAmY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlKTsKLQlpZiAoY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyID09IE5VTEwpIHsKLQkJRVJST1IoKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnIwOwotCX0KLQotCWNhcmQtPnNpbGVudHBhZ2Uuc2l6ZSA9IEVNVVBBR0VTSVpFOwotCi0JY2FyZC0+c2lsZW50cGFnZS5hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+c2lsZW50cGFnZS5zaXplLCAmY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlKTsKLQlpZiAoY2FyZC0+c2lsZW50cGFnZS5hZGRyID09IE5VTEwpIHsKLQkJRVJST1IoKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnIxOwotCX0KLQotCWZvciAocGFnZWNvdW50ID0gMDsgcGFnZWNvdW50IDwgTUFYUEFHRVM7IHBhZ2Vjb3VudCsrKQotCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2Vjb3VudF0gPSBjcHVfdG9fbGUzMigoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMikgfCBwYWdlY291bnQpOwotCi0JLyogSW5pdCBwYWdlIHRhYmxlICYgdGFuayBtZW1vcnkgYmFzZSByZWdpc3RlciAqLwotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLQkJCSAgICBQVEIsICh1MzIpIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSwKLQkJCSAgICBUQ0IsIDAsCi0JCQkgICAgVENCUywgMCwKLQkJCSAgICBUQUdMSVNUX0VORCk7Ci0KLQlmb3IgKG5DaCA9IDA7IG5DaCA8IE5VTV9HOyBuQ2grKykgewotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIG5DaCwKLQkJCQkgICAgTUFQQSwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAotCQkJCSAgICBNQVBCLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCi0JCQkJICAgIFRBR0xJU1RfRU5EKTsKLQl9Ci0KLQkvKiBIb2theSwgbm93IGVuYWJsZSB0aGUgQVVEIGJpdCAqLwotCS8qIEVuYWJsZSBBdWRpbyA9IDEgKi8KLQkvKiBNdXRlIERpc2FibGUgQXVkaW8gPSAwICovCi0JLyogTG9jayBUYW5rIE1lbW9yeSA9IDEgKi8KLQkvKiBMb2NrIFNvdW5kIE1lbW9yeSA9IDAgKi8KLQkvKiBBdXRvIE11dGUgPSAxICovCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSkgewotCQlpZiAoY2FyZC0+Y2hpcHJldiA9PSA0KQotCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfQUMzRU5BQkxFX0NEU1BESUYgfCBIQ0ZHX0FDM0VOQUJMRV9HUFNQRElGIHwgSENGR19BVVRPTVVURSB8IEhDRkdfSk9ZRU5BQkxFKTsKLQkJZWxzZQotCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGNhcmQtPm1vZGVsID09IDB4MjAgfHwgY2FyZC0+bW9kZWwgPT0gMHhjNDAwIHx8Ci0JCSAoY2FyZC0+bW9kZWwgPT0gMHgyMSAmJiBjYXJkLT5jaGlwcmV2IDwgNikpCi0JICAgICAgICAJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHLCBIQ0ZHX0FVRElPRU5BQkxFICB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19BVVRPTVVURSk7Ci0JCWVsc2UKLQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSk7Ci0JfQotCS8qIEVuYWJsZSBWb2xfQ3RybCBpcnFzICovCi0JZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIElOVEVfVk9MSU5DUkVOQUJMRSB8IElOVEVfVk9MREVDUkVOQUJMRSB8IElOVEVfTVVURUVOQUJMRSB8IElOVEVfRlhEU1BFTkFCTEUpOwotCi0JaWYgKGNhcmQtPmlzX2F1ZGlneSAmJiAoY2FyZC0+Y2hpcHJldiA9PSA0KSkgewotCQkvKiBVbm11dGUgQW5hbG9nIG5vdy4gIFNldCBHUE82IHRvIDEgZm9yIEFwb2xsby4KLQkJICogVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBpbml0IEFMaWNlMyBJMlNPdXQgYmV5b25kIDQ4S0h6LgotCQkgKiBTbywgc2VxdWVuY2UgaXMgaW1wb3J0YW50LiAqLwotCQl1MzIgdG1wID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIEFfSU9DRkcpOwotCQl0bXAgfD0gMHgwMDQwOwotCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEFfSU9DRkcsIHRtcCk7Ci0JfQotCQotCS8qIEZJWE1FOiBUT1NMaW5rIGRldGVjdGlvbiAqLwotCWNhcmQtPmhhc190b3NsaW5rID0gMDsKLQotCS8qIEluaXRpYWxpemUgZGlnaXRhbCBwYXNzdGhyb3VnaCB2YXJpYWJsZXMgKi8KLQljYXJkLT5wdC5wb3NfZ3ByID0gY2FyZC0+cHQuaW50cl9ncHIgPSBjYXJkLT5wdC5lbmFibGVfZ3ByID0gLTE7Ci0JY2FyZC0+cHQuc2VsZWN0ZWQgPSAwOwotCWNhcmQtPnB0LnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7Ci0JY2FyZC0+cHQuc3Bjc190b191c2UgPSAweDAxOwotCWNhcmQtPnB0LnBhdGNoX25hbWUgPSAiQUMzcGFzcyI7Ci0JY2FyZC0+cHQuaW50cl9ncHJfbmFtZSA9ICJjb3VudCI7Ci0JY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lID0gImVuYWJsZSI7Ci0JY2FyZC0+cHQucG9zX2dwcl9uYW1lID0gInB0ciI7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnB0LmxvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPnB0LndhaXQpOwotCi0vKgl0bXAgPSBzYmxpdmVfcmVhZGZuMChjYXJkLCBIQ0ZHKTsKLQlpZiAodG1wICYgKEhDRkdfR1BJTlBVVDAgfCBIQ0ZHX0dQSU5QVVQxKSkgewotCQlzYmxpdmVfd3JpdGVmbjAoY2FyZCwgSENGRywgdG1wIHwgMHg4MDApOwotCi0JCXVkZWxheSg1MTIpOwotCi0JCWlmICh0bXAgIT0gKHNibGl2ZV9yZWFkZm4wKGNhcmQsIEhDRkcpICYgfjB4ODAwKSkgewotCQkJY2FyZC0+aGFzX3Rvc2xpbmsgPSAxOwotCQkJc2JsaXZlX3dyaXRlZm4wKGNhcmQsIEhDRkcsIHRtcCk7Ci0JCX0KLQl9Ci0qLwotCXJldHVybiAwOwotCi0gIGVycjE6Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLnNpemUsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5kbWFfaGFuZGxlKTsKLSAgZXJyMDoKLQlmeF9jbGVhbnVwKCZjYXJkLT5tZ3IpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0JLyogSW5pdCBDYXJkICovCi0JaWYgKGh3X2luaXQoY2FyZCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQl2b2ljZV9pbml0KGNhcmQpOwotCXRpbWVyX2luaXQoY2FyZCk7Ci0JYWRkeG1ncl9pbml0KGNhcmQpOwotCi0JRFBEKDIsICIgIGh3IGNvbnRyb2wgcmVnaXN0ZXIgLT4gJSN4XG4iLCBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgSENGRykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGVtdTEwazFfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQotewotCWludCBjaDsKLQotCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSU5URSwgMCk7Ci0KLQkvKiogU2h1dGRvd24gdGhlIGNoaXAgKiovCi0JZm9yIChjaCA9IDA7IGNoIDwgTlVNX0c7IGNoKyspCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBEQ1lTVVNWLCBjaCwgMCk7Ci0KLQlmb3IgKGNoID0gMDsgY2ggPCBOVU1fRzsgY2grKykgewotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIGNoLAotCQkJCSAgICBWVEZULCAwLAotCQkJCSAgICBDVkNGLCAwLAotCQkJCSAgICBQVFJYLCAwLAotCQkJCSAgICAvL0NQRiwgMCwKLQkJCQkgICAgVEFHTElTVF9FTkQpOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCBjaCwgMCk7Ci0JfQotCi0JLyogRGlzYWJsZSBhdWRpbyBhbmQgbG9jayBjYWNoZSAqLwotCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19MT0NLU09VTkRDQUNIRSB8IEhDRkdfTE9DS1RBTktDQUNIRV9NQVNLIHwgSENGR19NVVRFQlVUVE9ORU5BQkxFKTsKLQotCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEIsIDAsCi0KLQkJCSAgICAvKiBSZXNldCByZWNvcmRpbmcgYnVmZmVycyAqLwotCQkJICAgIE1JQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCi0JCQkgICAgTUlDQkEsIDAsCi0JCQkgICAgRlhCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIEZYQkEsIDAsCi0JCQkgICAgRlhXQywgMCwKLQkJCSAgICBBRENCUywgQURDQlNfQlVGU0laRV9OT05FLAotCQkJICAgIEFEQ0JBLCAwLAotCQkJICAgIFRDQlMsIDAsCi0JCQkgICAgVENCLCAwLAotCQkJICAgIERCRywgMHg4MDAwLAotCi0JCQkgICAgLyogRGlzYWJsZSBjaGFubmVsIGludGVycnVwdCAqLwotCQkJICAgIENMSUVMLCAwLAotCQkJICAgIENMSUVILCAwLAotCQkJICAgIFNPTEVMLCAwLAotCQkJICAgIFNPTEVILCAwLAotCQkJICAgIFRBR0xJU1RfRU5EKTsKLQotCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAwLCBBX0RCRywgIEFfREJHX1NJTkdMRV9TVEVQKTsKLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT5zaWxlbnRwYWdlLnNpemUsIGNhcmQtPnNpbGVudHBhZ2UuYWRkciwgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlKTsKLQkKLQlpZihjYXJkLT50YW5rbWVtLnNpemUgIT0gMCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT50YW5rbWVtLnNpemUsIGNhcmQtPnRhbmttZW0uYWRkciwgY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlKTsKLQotCS8qIHJlbGVhc2UgcGF0Y2ggc3RvcmFnZSBtZW1vcnkgKi8KLQlmeF9jbGVhbnVwKCZjYXJkLT5tZ3IpOwotfQotCi0vKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSAqLwotc3RhdGljIGludCBfX2RldmluaXQgZW11MTBrMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXUzMiBzdWJzeXN2aWQ7Ci0JaW50IHJldDsKLQotCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIEVNVTEwSzFfRE1BX01BU0spKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjliaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCi0JCXJldHVybiAtRUlPOwotCi0JcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7Ci0KLQlpZiAoKGNhcmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV9jYXJkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IG91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9Ci0KLQljYXJkLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7Ci0JY2FyZC0+bGVuZ3RoID0gcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKTsgCi0KLQlpZiAocmVxdWVzdF9yZWdpb24oY2FyZC0+aW9iYXNlLCBjYXJkLT5sZW5ndGgsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0pID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBJTyBzcGFjZSBpbiB1c2VcbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX3JlZ2lvbjsKLQl9Ci0KLQlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7Ci0KLQljYXJkLT5pcnEgPSBwY2lfZGV2LT5pcnE7Ci0JY2FyZC0+cGNpX2RldiA9IHBjaV9kZXY7Ci0KLQkvKiBSZXNlcnZlIElSUSBMaW5lICovCi0JaWYgKHJlcXVlc3RfaXJxKGNhcmQtPmlycSwgZW11MTBrMV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IElSUSBpbiB1c2VcbiIpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyX2lycTsKLQl9Ci0KLQljYXJkLT5jaGlwcmV2ID0gcGNpX2Rldi0+cmV2aXNpb247Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9JRCwgJmNhcmQtPm1vZGVsKTsKLQotCXByaW50ayhLRVJOX0lORk8gImVtdTEwazE6ICVzIHJldiAlZCBtb2RlbCAlIzA0eCBmb3VuZCwgSU8gYXQgJSMwNGx4LSUjMDRseCwgSVJRICVkXG4iLAotCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkLT5jaGlwcmV2LCBjYXJkLT5tb2RlbCwgY2FyZC0+aW9iYXNlLAotCQljYXJkLT5pb2Jhc2UgKyBjYXJkLT5sZW5ndGggLSAxLCBjYXJkLT5pcnEpOwotCi0JaWYgKHBjaV9pZC0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZKQotCQljYXJkLT5pc19hdWRpZ3kgPSAxOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmc3Vic3lzdmlkKTsKLQljYXJkLT5pc19hcHMgPSAoc3Vic3lzdmlkID09IEVNVV9BUFNfU1VCSUQpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwotCW11dGV4X2luaXQoJmNhcmQtPm9wZW5fc2VtKTsKLQljYXJkLT5vcGVuX21vZGUgPSAwOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm9wZW5fd2FpdCk7Ci0KLQlyZXQgPSBlbXUxMGsxX2F1ZGlvX2luaXQoY2FyZCk7Ci0JaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIGF1ZGlvIGRldmljZXNcbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyX2F1ZGlvOwotICAgICAgICB9Ci0KLQlyZXQgPSBlbXUxMGsxX21peGVyX2luaXQoY2FyZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBBQzk3IGNvZGVjXG4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycl9taXhlcjsKLQl9Ci0KLQlyZXQgPSBlbXUxMGsxX21pZGlfaW5pdChjYXJkKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCByZWdpc3RlciBtaWRpIGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX21pZGk7Ci0JfQotCi0JcmV0ID0gZW11MTBrMV9pbml0KGNhcmQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgZGV2aWNlXG4iKTsKLQkJZ290byBlcnJfZW11MTBrMV9pbml0OwotCX0KLQotCWlmIChjYXJkLT5pc19hcHMpCi0JCWVtdTEwazFfZWNhcmRfaW5pdChjYXJkKTsKLQotCXJldCA9IGVtdTEwazFfcmVnaXN0ZXJfZGV2aWNlcyhjYXJkKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfcmVnaXN0ZXI7Ci0KLQkvKiBwcm9jIGVudHJpZXMgbXVzdCBiZSBjcmVhdGVkIGFmdGVyIHJlZ2lzdGVyaW5nIGRldmljZXMsIGFzCi0JICogZW11MTBrMV9pbmZvX3Byb2MgcHJpbnRzIGNhcmQtPmF1ZGlvX2RldiAmY28uICovCi0JcmV0ID0gZW11MTBrMV9wcm9jX2luaXQoY2FyZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBwcm9jIGRpcmVjdG9yeVxuIik7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJfcHJvYzsKLQl9Ci0JCi0JbGlzdF9hZGQoJmNhcmQtPmxpc3QsICZlbXUxMGsxX2RldnMpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9wcm9jOgotCWVtdTEwazFfdW5yZWdpc3Rlcl9kZXZpY2VzKGNhcmQpOwotCi1lcnJfcmVnaXN0ZXI6Ci0JZW11MTBrMV9jbGVhbnVwKGNhcmQpOwotCQotZXJyX2VtdTEwazFfaW5pdDoKLQllbXUxMGsxX21pZGlfY2xlYW51cChjYXJkKTsKLQotZXJyX21pZGk6Ci0JZW11MTBrMV9taXhlcl9jbGVhbnVwKGNhcmQpOwotCi1lcnJfbWl4ZXI6Ci0JZW11MTBrMV9hdWRpb19jbGVhbnVwKGNhcmQpOwotCi1lcnJfYXVkaW86Ci0JZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKLQotZXJyX2lycToKLQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCk7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOwotCi1lcnJfcmVnaW9uOgotCWtmcmVlKGNhcmQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGVtdTEwazFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0KLQlsaXN0X2RlbCgmY2FyZC0+bGlzdCk7Ci0KLQllbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhjYXJkKTsKLQllbXUxMGsxX2NsZWFudXAoY2FyZCk7Ci0JZW11MTBrMV9taWRpX2NsZWFudXAoY2FyZCk7Ci0JZW11MTBrMV9taXhlcl9jbGVhbnVwKGNhcmQpOwotCWVtdTEwazFfcHJvY19jbGVhbnVwKGNhcmQpOwotCWVtdTEwazFfYXVkaW9fY2xlYW51cChjYXJkKTsJCi0JZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKLQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCk7Ci0Ja2ZyZWUoY2FyZCk7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOwotfQotCi1NT0RVTEVfQVVUSE9SKCJCZXJ0cmFuZCBMZWUsIENhaSBZaW5nLiAoRW1haWwgdG86IGVtdTEwazEtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0KSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJDcmVhdGl2ZSBFTVUxMEsxIFBDSSBBdWRpbyBEcml2ZXIgdiIgRFJJVkVSX1ZFUlNJT04gIlxuQ29weXJpZ2h0IChDKSAxOTk5IENyZWF0aXZlIFRlY2hub2xvZ3kgTHRkLiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZW11MTBrMV9wY2lfZHJpdmVyID0gewotCS5uYW1lCQk9ICJlbXUxMGsxIiwKLQkuaWRfdGFibGUJPSBlbXUxMGsxX3BjaV90YmwsCi0JLnByb2JlCQk9IGVtdTEwazFfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlbXUxMGsxX3JlbW92ZSksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlbXUxMGsxX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ3JlYXRpdmUgRU1VMTBLMSBQQ0kgQXVkaW8gRHJpdmVyLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7Ci0KLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZW11MTBrMV9wY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGVtdTEwazFfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmVtdTEwazFfcGNpX2RyaXZlcik7Ci0KLQlyZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KGVtdTEwazFfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoZW11MTBrMV9jbGVhbnVwX21vZHVsZSk7Ci0KLSNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgotCi0vKiBpbiBtaWRpLmMgKi8KLWV4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLCAKLQkJCQl2b2lkICgqaW5wdXQpKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKSwKLQkJCQl2b2lkICgqb3V0cHV0KShpbnQgZGV2KSk7Ci1leHRlcm4gdm9pZCBlbXUxMGsxX3NlcV9taWRpX2Nsb3NlKGludCBkZXYpOwotZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSk7Ci1leHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KTsKLWV4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZChpbnQgZGV2KTsKLWV4dGVybiB2b2lkIGVtdTEwazFfc2VxX21pZGlfa2ljayhpbnQgZGV2KTsKLWV4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9idWZmZXJfc3RhdHVzKGludCBkZXYpOwotCi1zdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBlbXUxMGsxX21pZGlfb3BlcmF0aW9ucyA9Ci17Ci0JVEhJU19NT0RVTEUsCi0JeyJFTVUxMEsxIE1JREkiLCAwLCAwLCBTTkRDQVJEX0VNVTEwSzF9LAotCSZzdGRfbWlkaV9zeW50aCwKLQl7MH0sCi0JZW11MTBrMV9zZXFfbWlkaV9vcGVuLAotCWVtdTEwazFfc2VxX21pZGlfY2xvc2UsCi0JTlVMTCwKLQllbXUxMGsxX3NlcV9taWRpX291dCwKLQllbXUxMGsxX3NlcV9taWRpX3N0YXJ0X3JlYWQsCi0JZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZCwKLQllbXUxMGsxX3NlcV9taWRpX2tpY2ssCi0JTlVMTCwKLQllbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMsCi0JTlVMTAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWU5OTAuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIG1pZGkuYyAtIC9kZXYvbWlkaSBpbnRlcmZhY2UgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiY2FyZG1vLmgiCi0jaW5jbHVkZSAiY2FyZG1pLmgiCi0jaW5jbHVkZSAibWlkaS5oIgotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLSNpbmNsdWRlICIuLi9zb3VuZF9jb25maWcuaCIKLSNlbmRpZgotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pZGlfc3BpbmxvY2spOwotCi1zdGF0aWMgdm9pZCBpbml0X21pZGlfaGRyKHN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcikKLXsKLQltaWRpaGRyLT5idWZmZXJsZW5ndGggPSBNSURJSU5fQlVGTEVOOwotCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOwotCW1pZGloZHItPmZsYWdzID0gMDsKLX0KLQotc3RhdGljIGludCBtaWRpaW5fYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2Rldiwgc3RydWN0IG1pZGlfaGRyICoqbWlkaWhkcnB0cikKLXsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0KLQlpZiAoKG1pZGloZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9oZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlFUlJPUigpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpbml0X21pZGlfaGRyKG1pZGloZHIpOwotCi0JbWlkaWhkci0+ZGF0YSA9IGttYWxsb2MoTUlESUlOX0JVRkxFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaWRpaGRyLT5kYXRhKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihtaWRpX2Rldi0+Y2FyZC0+bXB1aW4sIG1pZGloZHIpIDwgMCkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkqbWlkaWhkcnB0ciA9IG1pZGloZHI7Ci0JbGlzdF9hZGRfdGFpbCgmbWlkaWhkci0+bGlzdCwgJm1pZGlfZGV2LT5taWRfaGRycyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCi0JRFBGKDIsICJlbXUxMGsxX21pZGlfb3BlbigpXG4iKTsKLQotCS8qIENoZWNrIGZvciBjb3JyZWN0IGRldmljZSB0byBvcGVuICovCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgewotCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7Ci0KLQkJaWYgKGNhcmQtPm1pZGlfZGV2ID09IG1pbm9yKQotCQkJZ290byBtYXRjaDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLQotbWF0Y2g6Ci0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQlpZiAoY2FyZC0+c2VxX21pZGlkZXYpCS8qIGNhcmQgaXMgb3BlbmVkIGJ5IHNlcXVlbmNlciAqLwotCQlyZXR1cm4gLUVCVVNZOwotI2VuZGlmCi0KLQkvKiBXYWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KLQltdXRleF9sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0Jd2hpbGUgKGNhcmQtPm9wZW5fbW9kZSAmIChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkpIHsKLQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fc2VtKTsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+b3Blbl93YWl0KTsKLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCX0KLQotCQltdXRleF9sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0JfQotCi0JaWYgKChtaWRpX2RldiA9IGttYWxsb2Moc2l6ZW9mKCptaWRpX2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1pZGlfZGV2LT5jYXJkID0gY2FyZDsKLQltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVE9QUEVEOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5vV2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPmlXYWl0KTsKLQltaWRpX2Rldi0+aXJkID0gMDsKLQltaWRpX2Rldi0+aXdyID0gMDsKLQltaWRpX2Rldi0+aWNudCA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJm1pZGlfZGV2LT5taWRfaGRycyk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbyBkc0NhcmRNaWRpT3BlbkluZm87Ci0JCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjE7Ci0JCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjI7Ci0KLQkJZHNDYXJkTWlkaU9wZW5JbmZvLnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaV9kZXY7Ci0KLQkJaWYgKGVtdTEwazFfbXB1aW5fb3BlbihjYXJkLCAmZHNDYXJkTWlkaU9wZW5JbmZvKSA8IDApIHsKLQkJCUVSUk9SKCk7Ci0JCQlrZnJlZShtaWRpX2Rldik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCS8qIEFkZCB0d28gYnVmZmVycyB0byByZWNlaXZlIHN5c2V4IGJ1ZmZlciAqLwotCQlpZiAobWlkaWluX2FkZF9idWZmZXIobWlkaV9kZXYsICZtaWRpaGRyMSkgPCAwKSB7Ci0JCQlrZnJlZShtaWRpX2Rldik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCWlmIChtaWRpaW5fYWRkX2J1ZmZlcihtaWRpX2RldiwgJm1pZGloZHIyKSA8IDApIHsKLQkJCWxpc3RfZGVsKCZtaWRpaGRyMS0+bGlzdCk7Ci0JCQlrZnJlZShtaWRpaGRyMS0+ZGF0YSk7Ci0JCQlrZnJlZShtaWRpaGRyMSk7Ci0JCQlrZnJlZShtaWRpX2Rldik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlzdHJ1Y3QgbWlkaV9vcGVuaW5mbyBkc0NhcmRNaWRpT3BlbkluZm87Ci0KLQkJZHNDYXJkTWlkaU9wZW5JbmZvLnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaV9kZXY7Ci0KLQkJaWYgKGVtdTEwazFfbXB1b3V0X29wZW4oY2FyZCwgJmRzQ2FyZE1pZGlPcGVuSW5mbykgPCAwKSB7Ci0JCQlFUlJPUigpOwotCQkJa2ZyZWUobWlkaV9kZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSBtaWRpX2RldjsKLQotCWNhcmQtPm9wZW5fbW9kZSB8PSAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpOwotCi0JbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX3NlbSk7Ci0KLQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQljYXJkID0gbWlkaV9kZXYtPmNhcmQ7Ci0JRFBGKDIsICJlbXUxMGsxX21pZGlfcmVsZWFzZSgpXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpIHsKLQotCQkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiAoY2FyZC0+bXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpKSB7Ci0JCQkJRFBGKDQsICJDYW5ub3QgY2xvc2UgLSBidWZmZXJzIG5vdCBlbXB0eVxuIik7Ci0KLQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZtaWRpX2Rldi0+b1dhaXQpOwotCi0JCQl9Ci0JCX0KLQotCQllbXUxMGsxX21wdW91dF9jbG9zZShjYXJkKTsKLQl9Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0KLQkJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVEFSVEVEKSB7Ci0JCQllbXUxMGsxX21wdWluX3N0b3AoY2FyZCk7Ci0JCQltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVE9QUEVEOwotCQl9Ci0KLQkJZW11MTBrMV9tcHVpbl9yZXNldChjYXJkKTsKLQkJZW11MTBrMV9tcHVpbl9jbG9zZShjYXJkKTsKLQotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJm1pZGlfZGV2LT5taWRfaGRycykpIHsKLQkJCW1pZGloZHIgPSBsaXN0X2VudHJ5KG1pZGlfZGV2LT5taWRfaGRycy5uZXh0LCBzdHJ1Y3QgbWlkaV9oZHIsIGxpc3QpOwotCi0JCQlsaXN0X2RlbChtaWRpX2Rldi0+bWlkX2hkcnMubmV4dCk7Ci0JCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJCWtmcmVlKG1pZGloZHIpOwotCQl9Ci0JfQotCi0Ja2ZyZWUobWlkaV9kZXYpOwotCi0JbXV0ZXhfbG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCWNhcmQtPm9wZW5fbW9kZSAmPSB+KChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpOwotCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9zZW0pOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FyZC0+b3Blbl93YWl0KTsKLQotCXVubG9ja19rZXJuZWwoKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBlbXUxMGsxX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwb3MpCi17Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXUxNiBjbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQRCg0LCAiZW11MTBrMV9taWRpX3JlYWQoKSwgY291bnQgJSN4XG4iLCAodTMyKSBjb3VudCk7Ci0KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RPUFBFRCkgewotCQlpZiAoZW11MTBrMV9tcHVpbl9zdGFydChtaWRpX2Rldi0+Y2FyZCkgPCAwKSB7Ci0JCQlFUlJPUigpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVEFSVEVEOwotCX0KLQotCXdoaWxlIChjb3VudCA+IDApIHsKLQkJY250ID0gTUlESUlOX0JVRkxFTiAtIG1pZGlfZGV2LT5pcmQ7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCQlpZiAobWlkaV9kZXYtPmljbnQgPCBjbnQpCi0JCQljbnQgPSBtaWRpX2Rldi0+aWNudDsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKGNudCA+IGNvdW50KQotCQkJY250ID0gY291bnQ7Ci0KLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47Ci0JCQlEUEYoMiwgIiBHbyB0byBzbGVlcC4uLlxuIik7Ci0KLQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJm1pZGlfZGV2LT5pV2FpdCk7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBtaWRpX2Rldi0+aUJ1ZiArIG1pZGlfZGV2LT5pcmQsIGNudCkpIHsKLQkJCUVSUk9SKCk7Ci0JCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKLQkJfQotCi0JCW1pZGlfZGV2LT5pcmQgKz0gY250OwotCQltaWRpX2Rldi0+aXJkICU9IE1JRElJTl9CVUZMRU47Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCQltaWRpX2Rldi0+aWNudCAtPSBjbnQ7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JCWNvdW50IC09IGNudDsKLQkJYnVmZmVyICs9IGNudDsKLQkJcmV0ICs9IGNudDsKLQotCQlpZiAobWlkaV9kZXYtPmljbnQgPT0gMCkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVtdTEwazFfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwb3MpCi17Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEQoNCwgImVtdTEwazFfbWlkaV93cml0ZSgpLCBjb3VudD0lI3hcbiIsICh1MzIpIGNvdW50KTsKLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKG1pZGloZHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9oZHIpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltaWRpaGRyLT5idWZmZXJsZW5ndGggPSBjb3VudDsKLQltaWRpaGRyLT5ieXRlc3JlY29yZGVkID0gMDsKLQltaWRpaGRyLT5mbGFncyA9IDA7Ci0KLQltaWRpaGRyLT5kYXRhID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtaWRpaGRyLT5kYXRhKSB7Ci0JCUVSUk9SKCk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIobWlkaWhkci0+ZGF0YSwgYnVmZmVyLCBjb3VudCkpIHsKLQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7Ci0JCWtmcmVlKG1pZGloZHIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JaWYgKGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIobWlkaV9kZXYtPmNhcmQsIG1pZGloZHIpIDwgMCkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGVtdTEwazFfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQlEUEYoNCwgImVtdTEwazFfbWlkaV9wb2xsKCkgY2FsbGVkXG4iKTsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJcG9sbF93YWl0KGZpbGUsICZtaWRpX2Rldi0+b1dhaXQsIHdhaXQpOwotCi0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCXBvbGxfd2FpdChmaWxlLCAmbWlkaV9kZXYtPmlXYWl0LCB3YWl0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07Ci0KLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlpZiAobWlkaV9kZXYtPm1pc3RhdGUgPT0gTUlESUlOX1NUQVRFX1NUQVJURUQpCi0JCQlpZiAobWlkaV9kZXYtPmljbnQgPiAwKQotCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotaW50IGVtdTEwazFfbWlkaV9jYWxsYmFjayh1bnNpZ25lZCBsb25nIG1zZywgdW5zaWduZWQgbG9uZyByZWZkYXRhLCB1bnNpZ25lZCBsb25nICpwbXNnKQotewotCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgcmVmZGF0YTsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlEUEYoNCwgImVtdTEwazFfbWlkaV9jYWxsYmFjaygpXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7Ci0KLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgSUNBUkRNSURJX09VVExPTkdEQVRBOgotCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBwbXNnWzJdOwotCi0JCWtmcmVlKG1pZGloZHItPmRhdGEpOwotCQlrZnJlZShtaWRpaGRyKTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaWRpX2Rldi0+b1dhaXQpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBJQ0FSRE1JRElfSU5MT05HREFUQToKLQkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgcG1zZ1syXTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbWlkaWhkci0+Ynl0ZXNyZWNvcmRlZDsgaSsrKSB7Ci0JCQltaWRpX2Rldi0+aUJ1ZlttaWRpX2Rldi0+aXdyKytdID0gbWlkaWhkci0+ZGF0YVtpXTsKLQkJCW1pZGlfZGV2LT5pd3IgJT0gTUlESUlOX0JVRkxFTjsKLQkJfQotCi0JCW1pZGlfZGV2LT5pY250ICs9IG1pZGloZHItPmJ5dGVzcmVjb3JkZWQ7Ci0KLQkJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVEFSVEVEKSB7Ci0JCQlpbml0X21pZGlfaGRyKG1pZGloZHIpOwotCQkJZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LT5jYXJkLT5tcHVpbiwgbWlkaWhkcik7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pZGlfZGV2LT5pV2FpdCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIElDQVJETUlESV9JTkRBVEE6Ci0JCXsKLQkJCXU4ICpwQnVmID0gKHU4ICopICYgcG1zZ1sxXTsKLQkJCXUxNiBieXRlc3ZhbGlkID0gcG1zZ1syXTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGJ5dGVzdmFsaWQ7IGkrKykgewotCQkJCW1pZGlfZGV2LT5pQnVmW21pZGlfZGV2LT5pd3IrK10gPSBwQnVmW2ldOwotCQkJCW1pZGlfZGV2LT5pd3IgJT0gTUlESUlOX0JVRkxFTjsKLQkJCX0KLQotCQkJbWlkaV9kZXYtPmljbnQgKz0gYnl0ZXN2YWxpZDsKLQkJfQotCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWlkaV9kZXYtPmlXYWl0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgkJLyogVW5rbm93biBtZXNzYWdlICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBNSURJIGZpbGUgb3BlcmF0aW9ucyAqLwotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXUxMGsxX21pZGlfZm9wcyA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLnJlYWQJCT0gZW11MTBrMV9taWRpX3JlYWQsCi0JLndyaXRlCQk9IGVtdTEwazFfbWlkaV93cml0ZSwKLQkucG9sbAkJPSBlbXUxMGsxX21pZGlfcG9sbCwKLQkub3BlbgkJPSBlbXUxMGsxX21pZGlfb3BlbiwKLQkucmVsZWFzZQk9IGVtdTEwazFfbWlkaV9yZWxlYXNlLAotfTsKLQotCi0jaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKLQotLyogZnVuY3Rpb25zIHVzZWQgZm9yIHNlcXVlbmNlciBhY2Nlc3MgKi8KLQotaW50IGVtdTEwazFfc2VxX21pZGlfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwKLQkJCQl2b2lkICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAotCQkJCXZvaWQgKCpvdXRwdXQpIChpbnQgZGV2KSkKLXsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOwotCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKLQlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldjsKLQotCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOwotCi0JaWYgKGNhcmQtPm9wZW5fbW9kZSkJCS8qIGNhcmQgaXMgb3BlbmVkIG5hdGl2ZSAqLwotCQlyZXR1cm4gLUVCVVNZOwotCQkJCi0JRFBGKDIsICJlbXUxMGsxX3NlcV9taWRpX29wZW4oKVxuIik7Ci0JCi0JaWYgKChtaWRpX2RldiA9IGttYWxsb2Moc2l6ZW9mKCptaWRpX2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1pZGlfZGV2LT5jYXJkID0gY2FyZDsKLQltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVE9QUEVEOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5vV2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPmlXYWl0KTsKLQltaWRpX2Rldi0+aXJkID0gMDsKLQltaWRpX2Rldi0+aXdyID0gMDsKLQltaWRpX2Rldi0+aWNudCA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJm1pZGlfZGV2LT5taWRfaGRycyk7Ci0KLQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKLQotCWlmIChlbXUxMGsxX21wdW91dF9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgewotCQlFUlJPUigpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQljYXJkLT5zZXFfbWlkaWRldiA9IG1pZGlfZGV2OwotCQkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3NlcV9taWRpX2Nsb3NlKGludCBkZXYpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQotCURQRigyLCAiZW11MTBrMV9zZXFfbWlkaV9jbG9zZSgpXG4iKTsKLQlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7Ci0JZW11MTBrMV9tcHVvdXRfY2xvc2UoY2FyZCk7Ci0KLQlrZnJlZShjYXJkLT5zZXFfbWlkaWRldik7Ci0JY2FyZC0+c2VxX21pZGlkZXYgPSBOVUxMOwotfQotCi1pbnQgZW11MTBrMV9zZXFfbWlkaV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOwotCi0JaWYgKChtaWRpaGRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWlkaWhkci0+YnVmZmVybGVuZ3RoID0gMTsKLQltaWRpaGRyLT5ieXRlc3JlY29yZGVkID0gMDsKLQltaWRpaGRyLT5mbGFncyA9IDA7Ci0KLQltaWRpaGRyLT5kYXRhID0ga21hbGxvYygxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1pZGloZHItPmRhdGEpIHsKLQkJRVJST1IoKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCSoobWlkaWhkci0+ZGF0YSkgPSBtaWRpX2J5dGU7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmIChlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKGNhcmQsIG1pZGloZHIpIDwgMCkgewotCQlFUlJPUigpOwotCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKLQkJa2ZyZWUobWlkaWhkcik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBlbXUxMGsxX3NlcV9taWRpX3N0YXJ0X3JlYWQoaW50IGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGVtdTEwazFfc2VxX21pZGlfZW5kX3JlYWQoaW50IGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBlbXUxMGsxX3NlcV9taWRpX2tpY2soaW50IGRldikKLXsKLX0KLQotaW50IGVtdTEwazFfc2VxX21pZGlfYnVmZmVyX3N0YXR1cyhpbnQgZGV2KQotewotCWludCBjb3VudDsKLQlzdHJ1Y3QgbWlkaV9xdWV1ZSAqcXVldWU7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKLQotCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMIHx8IG1pZGlfZGV2c1tkZXZdLT5kZXZjID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY291bnQgPSAwOwotCi0JY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOwotCXF1ZXVlID0gY2FyZC0+bXB1b3V0LT5maXJzdG1pZGlxOwotCi0Jd2hpbGUgKHF1ZXVlICE9IE5VTEwpIHsKLQkJY291bnQrKzsKLQkJaWYgKHF1ZXVlID09IGNhcmQtPm1wdW91dC0+bGFzdG1pZGlxKQotCQkJYnJlYWs7Ci0KLQkJcXVldWUgPSBxdWV1ZS0+bmV4dDsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmggYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTllYzkuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBtaWRpLmgKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqIAotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKLSAqIAotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCi0gKiAgICAgVVNBLiAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKi8gCi0KLSNpZm5kZWYgX01JRElfSAotI2RlZmluZSBfTUlESV9ICi0KLSNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAzCi0jZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKLSNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKLQotI2RlZmluZSBNSURJSU5fU1RBVEVfU1RBUlRFRCAweDAwMDAwMDAxCi0jZGVmaW5lIE1JRElJTl9TVEFURV9TVE9QUEVEIDB4MDAwMDAwMDIKLQotI2RlZmluZSBNSURJSU5fQlVGTEVOIDEwMjQKLQotc3RydWN0IGVtdTEwazFfbWlkaWRldmljZQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0JdTMyIG1pc3RhdGU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgb1dhaXQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgaVdhaXQ7Ci0JczggaUJ1ZltNSURJSU5fQlVGTEVOXTsKLQl1MTYgaXJkLCBpd3IsIGljbnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtaWRfaGRyczsKLX07Ci0KLS8qIHVuY29tbWVudCBuZXh0IGxpbmUgdG8gdXNlIG1pZGkgcG9ydCBvbiBBdWRpZ3kgZHJpdmUgKi8KLS8vI2RlZmluZSBVU0VfQVVESUdZX0RSSVZFX01JREkKLQotI2lmZGVmIFVTRV9BVURJR1lfRFJJVkVfTUlESQotI2RlZmluZSBBX01VREFUQQlBX01VREFUQTIKLSNkZWZpbmUgQV9NVUNNRAkJQV9NVUNNRDIKLSNkZWZpbmUgQV9NVVNUQVQJQV9NVUNNRDIKLSNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkJQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkyCi0jZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkJQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTIKLSNkZWZpbmUgQV9JTlRFX01JRElUWEVOQUJMRQlBX0lOVEVfTUlESVRYRU5BQkxFMgotI2RlZmluZSBBX0lOVEVfTUlESVJYRU5BQkxFCUFfSU5URV9NSURJUlhFTkFCTEUyCi0jZWxzZQotI2RlZmluZSBBX01VREFUQQlBX01VREFUQTEKLSNkZWZpbmUgQV9NVUNNRAkJQV9NVUNNRDEKLSNkZWZpbmUgQV9NVVNUQVQJQV9NVUNNRDEKLSNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkJQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkxCi0jZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkJQV9JUFJfTUlESVJFQ1ZCVUZFTVBUWTEKLSNkZWZpbmUgQV9JTlRFX01JRElUWEVOQUJMRQlBX0lOVEVfTUlESVRYRU5BQkxFMQotI2RlZmluZSBBX0lOVEVfTUlESVJYRU5BQkxFCUFfSU5URV9NSURJUlhFTkFCTEUxCi0jZW5kaWYKLQotCi0jZW5kaWYgLyogX01JRElfSCAqLwotCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jIGIvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzODA1Zi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3MvZW11MTBrMS9taXhlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIG1peGVyLmMgLSAvZGV2L21peGVyIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKLSAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcwotICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KLSAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCBzdHVmZgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgInJlY21nci5oIgotCi0KLXN0YXRpYyBjb25zdCB1MzIgYmFzc190YWJsZVs0MV1bNV0gPSB7Ci0JeyAweDNlNGY4NDRmLCAweDg0ZWQ0Y2MzLCAweDNjYzY5OTI3LCAweDdiMDM1NTNhLCAweGM0ZGE4NDg2IH0sCi0JeyAweDNlNjlhMTdhLCAweDg0YzI4MGZiLCAweDNjZDc3Y2Q0LCAweDdiMmYyYTZmLCAweGM0YjA4ZDFkIH0sCi0JeyAweDNlODJmZjQyLCAweDg0OTk5MWQ1LCAweDNjZTc0NjZiLCAweDdiNTkxN2M2LCAweGM0ODg2M2VlIH0sCi0JeyAweDNlOWJhYjNjLCAweDg0NzI2N2YwLCAweDNjZjVmZmU4LCAweDdiODEzNTYwLCAweGM0NjFmMjJjIH0sCi0JeyAweDNlYjNiMjc1LCAweDg0NGNlZDI5LCAweDNkMDNiMjk1LCAweDdiYTc5YTFjLCAweGM0M2QyMjNiIH0sCi0JeyAweDNlY2IyMTc0LCAweDg0MjkwYzhiLCAweDNkMTA2NzE0LCAweDdiY2M1YmEzLCAweGM0MTlkZmE1IH0sCi0JeyAweDNlZTIwNDRiLCAweDg0MDZiMjQ0LCAweDNkMWMyNTYxLCAweDdiZWY4ZTc3LCAweGMzZjgxNzBmIH0sCi0JeyAweDNlZjg2Njk4LCAweDgzZTVjYjk2LCAweDNkMjZmNGQ4LCAweDdjMTE0NjAwLCAweGMzZDdiNjI1IH0sCi0JeyAweDNmMGU1MzkwLCAweDgzYzY0NmM5LCAweDNkMzBkYzM5LCAweDdjMzE5NDk4LCAweGMzYjhhYjk3IH0sCi0JeyAweDNmMjNkNjBiLCAweDgzYTgxMzIxLCAweDNkMzllMWFmLCAweDdjNTA4YjljLCAweGMzOWFlNzA0IH0sCi0JeyAweDNmMzhmODg0LCAweDgzOGIyMGQyLCAweDNkNDIwYWQyLCAweDdjNmUzYjc1LCAweGMzN2U1OGYxIH0sCi0JeyAweDNmNGRjNTJjLCAweDgzNmY2MGVmLCAweDNkNDk1Y2FiLCAweDdjOGFiM2E2LCAweGMzNjJmMmJlIH0sCi0JeyAweDNmNjI0NWU4LCAweDgzNTRjNTY1LCAweDNkNGZkYmI4LCAweDdjYTYwMmQ2LCAweGMzNDhhNjliIH0sCi0JeyAweDNmNzY4NDVmLCAweDgzM2I0MGVjLCAweDNkNTU4YmYwLCAweDdjYzAzNmRmLCAweGMzMmY2NzdjIH0sCi0JeyAweDNmOGE4YTAzLCAweDgzMjJjNmZiLCAweDNkNWE3MGM0LCAweDdjZDk1Y2Q3LCAweGMzMTcyOTBiIH0sCi0JeyAweDNmOWU2MDE0LCAweDgzMGI0YmMzLCAweDNkNWU4ZDI1LCAweDdjZjE4MTFhLCAweGMyZmZkZmE1IH0sCi0JeyAweDNmYjIwZmFlLCAweDgyZjRjNDIwLCAweDNkNjFlMzdmLCAweDdkMDhhZjU2LCAweGMyZTk4MDRhIH0sCi0JeyAweDNmYzVhMWNjLCAweDgyZGYyNTkyLCAweDNkNjQ3NWMzLCAweDdkMWVmMjk0LCAweGMyZDQwMDk2IH0sCi0JeyAweDNmZDkxZjU1LCAweDgyY2E2NjMyLCAweDNkNjY0NTY0LCAweDdkMzQ1NTQxLCAweGMyYmY1NmI5IH0sCi0JeyAweDNmZWM5MTIwLCAweDgyYjY3Y2FjLCAweDNkNjc1MzU2LCAweDdkNDhlMTM4LCAweGMyYWI3OTZlIH0sCi0JeyAweDQwMDAwMDAwLCAweDgyYTM2MDM3LCAweDNkNjdhMDEyLCAweDdkNWM5ZmM5LCAweGMyOTg1ZmVlIH0sCi0JeyAweDQwMTM3NGM3LCAweDgyOTEwODhhLCAweDNkNjcyYjkzLCAweDdkNmY5OWMzLCAweGMyODYwMWYyIH0sCi0JeyAweDQwMjZmODU3LCAweDgyN2Y2ZGQ3LCAweDNkNjVmNTU5LCAweDdkODFkNzdjLCAweGMyNzQ1N2EzIH0sCi0JeyAweDQwM2E5MzlmLCAweDgyNmU4OGM1LCAweDNkNjNmYzYzLCAweDdkOTM2MGQ0LCAweGMyNjM1OTk2IH0sCi0JeyAweDQwNGU0ZmFmLCAweDgyNWU1MjY2LCAweDNkNjEzZjMyLCAweDdkYTQzZDQyLCAweGMyNTMwMGM2IH0sCi0JeyAweDQwNjIzNWJhLCAweDgyNGVjNDM0LCAweDNkNWRiYmMzLCAweDdkYjQ3M2Q3LCAweGMyNDM0NjhlIH0sCi0JeyAweDQwNzY0ZjFmLCAweDgyM2ZkODBjLCAweDNkNTk2ZjhmLCAweDdkYzQwYjQ0LCAweGMyMzQyNGEyIH0sCi0JeyAweDQwOGFhNTc2LCAweDgyMzE4ODI0LCAweDNkNTQ1Nzg3LCAweDdkZDMwOWUyLCAweGMyMjU5NTA5IH0sCi0JeyAweDQwOWY0Mjk2LCAweDgyMjNjZjBiLCAweDNkNGU3MDEyLCAweDdkZTE3NWI1LCAweGMyMTc5MjE4IH0sCi0JeyAweDQwYjQzMGEwLCAweDgyMTZhN2ExLCAweDNkNDdiNTA1LCAweDdkZWY1NDc1LCAweGMyMGExNjcwIH0sCi0JeyAweDQwYzk3YTBhLCAweDgyMGEwZDEyLCAweDNkNDAyMWExLCAweDdkZmNhYjhkLCAweGMxZmQxY2Y1IH0sCi0JeyAweDQwZGYyOWE2LCAweDgxZmRmYWQ2LCAweDNkMzdiMDhkLCAweDdlMDk4MDI4LCAweGMxZjBhMGNhIH0sCi0JeyAweDQwZjU0YWIxLCAweDgxZjI2Y2E5LCAweDNkMmU1YmQxLCAweDdlMTVkNzJiLCAweGMxZTQ5ZDUyIH0sCi0JeyAweDQxMGJlOGRhLCAweDgxZTc1ZTg5LCAweDNkMjQxY2NlLCAweDdlMjFiNTQ0LCAweGMxZDkwZTI0IH0sCi0JeyAweDQxMjMxMDUxLCAweDgxZGNjY2IzLCAweDNkMThlYzM3LCAweDdlMmQxZWU2LCAweGMxY2RlZjEwIH0sCi0JeyAweDQxM2FjZGQwLCAweDgxZDJiMzllLCAweDNkMGNjMjBhLCAweDdlMzgxODRlLCAweGMxYzMzYzEzIH0sCi0JeyAweDQxNTMyZWE3LCAweDgxYzkwZmZiLCAweDNjZmY5NTg1LCAweDdlNDJhNThiLCAweGMxYjhmMTVhIH0sCi0JeyAweDQxNmM0MGNkLCAweDgxYmZkZWIyLCAweDNjZjE1ZDIxLCAweDdlNGNjYTdjLCAweGMxYWYwYjNmIH0sCi0JeyAweDQxODYxMmVhLCAweDgxYjcxY2RjLCAweDNjZTIwZTg1LCAweDdlNTY4YWQzLCAweGMxYTU4NjQwIH0sCi0JeyAweDQxYTBiNDY1LCAweDgxYWVjN2M1LCAweDNjZDE5ZTdjLCAweDdlNWZlYTFlLCAweGMxOWM1ZjAzIH0sCi0JeyAweDQxYmMzNTczLCAweDgxYTZkY2VhLCAweDNjYzAwMGU5LCAweDdlNjhlYmMyLCAweGMxOTM5MjUwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgdHJlYmxlX3RhYmxlWzQxXVs1XSA9IHsKLQl7IDB4MDEyNWNiYTksIDB4ZmVkNWRlYmQsIDB4MDA1OTliNmMsIDB4MGQyNTA2ZGEsIDB4ZmE4NWIzNTQgfSwKLQl7IDB4MDE0MmY2N2UsIDB4ZmViMDMxNjMsIDB4MDA2NmNkMGYsIDB4MGQxNGM2OWQsIDB4ZmE5MTQ0NzMgfSwKLQl7IDB4MDE2MzI4YmQsIDB4ZmU4NjAxNTgsIDB4MDA3NWI3ZjIsIDB4MGQwM2ViMjcsIDB4ZmE5ZDMyZDIgfSwKLQl7IDB4MDE4NmI0MzgsIDB4ZmU1NmM5ODIsIDB4MDA4NjkyMzQsIDB4MGNmMjcwNDgsIDB4ZmFhOTdmY2EgfSwKLQl7IDB4MDFhZGYzNTgsIDB4ZmUyMWY1ZmUsIDB4MDA5OTk4NDIsIDB4MGNlMDUxYzIsIDB4ZmFiNjJjYTUgfSwKLQl7IDB4MDFkOTQ5ZmEsIDB4ZmRlNmUyODcsIDB4MDBhZjBkOGQsIDB4MGNjZDhiNGEsIDB4ZmFjMzNhYTcgfSwKLQl7IDB4MDIwOTI2NjksIDB4ZmRhNGQ4YmYsIDB4MDBjNzNkNGMsIDB4MGNiYTE4ODQsIDB4ZmFkMGFiMDcgfSwKLQl7IDB4MDIzZTAyNjgsIDB4ZmQ1YjBlNGEsIDB4MDBlMjdiNTQsIDB4MGNhNWY1MDksIDB4ZmFkZTdlZjIgfSwKLQl7IDB4MDI3ODY0NWMsIDB4ZmQwOGEyYjAsIDB4MDEwMTI1MDksIDB4MGM5MTFjNjMsIDB4ZmFlY2I3ODggfSwKLQl7IDB4MDJiOGUwOTEsIDB4ZmNhYzlkMWEsIDB4MDEyM2EyNjIsIDB4MGM3YjhhMTQsIDB4ZmFmYjU1ZGYgfSwKLQl7IDB4MDMwMDFhOWEsIDB4ZmM0NWU5Y2UsIDB4MDE0YTY3MDksIDB4MGM2NTM5OGYsIDB4ZmIwYTVhZmYgfSwKLQl7IDB4MDM0ZWM2ZDcsIDB4ZmJkMzU3NmIsIDB4MDE3NWYzOTcsIDB4MGM0ZTI2NDMsIDB4ZmIxOWM3ZTQgfSwKLQl7IDB4MDNhNWFjMTUsIDB4ZmI1MzkzZWUsIDB4MDFhNmQ2ZWQsIDB4MGMzNjRiOTQsIDB4ZmIyOTlkN2MgfSwKLQl7IDB4MDQwNWE1NjIsIDB4ZmFjNTI5NjgsIDB4MDFkZGFmYWUsIDB4MGMxZGE0ZTIsIDB4ZmIzOWRjYTUgfSwKLQl7IDB4MDQ2ZmEzZmUsIDB4ZmEyNjdhNjYsIDB4MDIxYjJkZGQsIDB4MGMwNDJkOGQsIDB4ZmI0YTg2MzEgfSwKLQl7IDB4MDRlNGIxN2YsIDB4Zjk3NWJlMGYsIDB4MDI2MDE0OWYsIDB4MGJlOWUwZjIsIDB4ZmI1YjlhZTAgfSwKLQl7IDB4MDU2NWYyMjAsIDB4ZjhiMGZiZTUsIDB4MDJhZDNjMjksIDB4MGJjZWJhNzMsIDB4ZmI2ZDFiNjAgfSwKLQl7IDB4MDVmNGE3NDUsIDB4ZjdkNjA3MjIsIDB4MDMwMzkzZDQsIDB4MGJiMmI1NzgsIDB4ZmI3ZjA4NGQgfSwKLQl7IDB4MDY5MjMyMzYsIDB4ZjZlMjc5YmQsIDB4MDM2NDI0NjUsIDB4MGI5NWNkNzUsIDB4ZmI5MTYyMzMgfSwKLQl7IDB4MDc0MDE3MTMsIDB4ZjVkM2FlZjksIDB4MDNkMDEyODMsIDB4MGI3N2ZkZWQsIDB4ZmJhNDI5ODQgfSwKLQl7IDB4MDgwMDAwMDAsIDB4ZjRhNmJkODgsIDB4MDQ0OGExNjEsIDB4MGI1OTQyNzgsIDB4ZmJiNzVlOWYgfSwKLQl7IDB4MDhkM2MwOTcsIDB4ZjM1ODcxMzEsIDB4MDRjZjM1YTQsIDB4MGIzOTk2YzksIDB4ZmJjYjAxY2IgfSwKLQl7IDB4MDliZDU5YTIsIDB4ZjFlNTQzZjksIDB4MDU2NTU4ODAsIDB4MGIxOGY2YjIsIDB4ZmJkZjEzMzMgfSwKLQl7IDB4MGFiZWZkMGYsIDB4ZjA0OTU2Y2EsIDB4MDYwY2JiMTIsIDB4MGFmNzVlMmMsIDB4ZmJmMzkyZTggfSwKLQl7IDB4MGJkYjEyM2UsIDB4ZWU4MDY5ODQsIDB4MDZjNzM5ZmUsIDB4MGFkNGM5NjIsIDB4ZmMwODgwZGQgfSwKLQl7IDB4MGQxNDNhOTQsIDB4ZWM4NWQyODcsIDB4MDc5NmUxNTAsIDB4MGFiMTM0YjAsIDB4ZmMxZGRjZTUgfSwKLQl7IDB4MGU2ZDU2NjQsIDB4ZWE1NDc1OTgsIDB4MDg3ZGYwYTAsIDB4MGE4YzljYjYsIDB4ZmMzM2E2YWQgfSwKLQl7IDB4MGZlOThhMmEsIDB4ZTdlNmJhMzUsIDB4MDk3ZWRmODMsIDB4MGE2NmZlNWIsIDB4ZmM0OWRkYzIgfSwKLQl7IDB4MTE4YzQ0MjEsIDB4ZTUzNjgxM2EsIDB4MGE5YzYyNDgsIDB4MGE0MDU2ZDcsIDB4ZmM2MDgxODUgfSwKLQl7IDB4MTM1OTQyMmUsIDB4ZTIzZDE5ZWIsIDB4MGJkOTZlZmIsIDB4MGExOGEzYmYsIDB4ZmM3NzkxMmMgfSwKLQl7IDB4MTU1NDk4MmIsIDB4ZGVmMzM2NDUsIDB4MGQzOTQyYmQsIDB4MDllZmUzMTIsIDB4ZmM4ZjBiYzEgfSwKLQl7IDB4MTc4MmI2OGEsIDB4ZGI1MGRlYjEsIDB4MGViZjY3NmQsIDB4MDljNjEzM2YsIDB4ZmNhNmYwMTkgfSwKLQl7IDB4MTllODcxNWQsIDB4ZDc0ZDY0ZmQsIDB4MTA2ZmI5OTksIDB4MDk5YjMzMzcsIDB4ZmNiZjNjZDYgfSwKLQl7IDB4MWM4YjA3YjgsIDB4ZDJkZjU2YWIsIDB4MTI0ZTZlYzgsIDB4MDk2ZjQyNzQsIDB4ZmNkN2YwNjAgfSwKLQl7IDB4MWY3MDJiNmQsIDB4Y2RmYzZlOTIsIDB4MTQ2MDFjMTAsIDB4MDk0MjQxMGIsIDB4ZmNmMTA4ZTUgfSwKLQl7IDB4MjI5ZTA5MzMsIDB4Yzg5OTg1Y2QsIDB4MTZhOWJjZmEsIDB4MDkxNDJmYjUsIDB4ZmQwYTg0NTEgfSwKLQl7IDB4MjYxYjUxMTgsIDB4YzJhYTg0MDksIDB4MTkzMGJhYjYsIDB4MDhlNTBmZGMsIDB4ZmQyNDYwNGQgfSwKLQl7IDB4MjllZjNmNWQsIDB4YmMyMjRmMjgsIDB4MWJmYWYzOTYsIDB4MDhiNGUzYWEsIDB4ZmQzZTlhM2IgfSwKLQl7IDB4MmUyMWE1OWIsIDB4YjRmMmJhNDYsIDB4MWYwZWMyZDYsIDB4MDg4M2FlMTUsIDB4ZmQ1OTJmMzMgfSwKLQl7IDB4MzJiYWY0NGIsIDB4YWQwYzc0MjksIDB4MjI3MzA4YTMsIDB4MDg1MTcyZWIsIDB4ZmQ3NDFiZmQgfSwKLQl7IDB4MzdjNDQ0OGIsIDB4YTQ1ZWY1MWQsIDB4MjYyZjMyNjcsIDB4MDgxZTM2ZGMsIDB4ZmQ4ZjVkMTQgfQotfTsKLQotCi1zdGF0aWMgdm9pZCBzZXRfYmFzcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgbCwgaW50IHIpCi17Ci0JaW50IGk7Ci0KLQlsID0gKGwgKiA0MCArIDUwKSAvIDEwMDsKLQlyID0gKHIgKiA0MCArIDUwKSAvIDEwMDsKLQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIGNhcmQtPm1nci5jdHJsX2dwcltTT1VORF9NSVhFUl9CQVNTXVswXSArIGksIDAsIGJhc3NfdGFibGVbbF1baV0pOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfdHJlYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBsLCBpbnQgcikKLXsKLQlpbnQgaTsKLQotCWwgPSAobCAqIDQwICsgNTApIC8gMTAwOwotCXIgPSAociAqIDQwICsgNTApIC8gMTAwOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgY2FyZC0+bWdyLmN0cmxfZ3ByW1NPVU5EX01JWEVSX1RSRUJMRV1bMF0gKyBpICwgMCwgdHJlYmxlX3RhYmxlW2xdW2ldKTsKLX0KLQotY29uc3QgY2hhciB2b2x1bWVfcGFyYW1zW1NPVU5EX01JWEVSX05SREVWSUNFU109IHsKLS8qIFVzZWQgYnkgdGhlIGFjOTcgZHJpdmVyICovCi0JW1NPVU5EX01JWEVSX1ZPTFVNRV0JPQlWT0xfNkJJVCwKLQlbU09VTkRfTUlYRVJfQkFTU10JPQlWT0xfNEJJVCwKLQlbU09VTkRfTUlYRVJfVFJFQkxFXQk9CVZPTF80QklULAotCVtTT1VORF9NSVhFUl9QQ01dCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX1NQRUFLRVJdCT0JVk9MXzRCSVQsCi0JW1NPVU5EX01JWEVSX0xJTkVdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX01JQ10JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfQ0RdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0FMVFBDTV0JPQlWT0xfNkJJVCwKLQlbU09VTkRfTUlYRVJfSUdBSU5dCT0JVk9MXzRCSVQsCi0JW1NPVU5EX01JWEVSX0xJTkUxXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9QSE9ORUlOXQk9IAlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfUEhPTkVPVVRdCT0gCVZPTF82QklULAotCVtTT1VORF9NSVhFUl9WSURFT10JPQlWT0xfNUJJVCwKLS8qIE5vdCB1c2VkIGJ5IHRoZSBhYzk3IGRyaXZlciAqLwotCVtTT1VORF9NSVhFUl9TWU5USF0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfSU1JWF0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfUkVDTEVWXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9PR0FJTl0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfTElORTJdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0xJTkUzXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9ESUdJVEFMMV0JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfRElHSVRBTDJdCT0JVk9MXzVCSVQsCi0JW1NPVU5EX01JWEVSX0RJR0lUQUwzXQk9CVZPTF81QklULAotCVtTT1VORF9NSVhFUl9SQURJT10JPQlWT0xfNUJJVCwKLQlbU09VTkRfTUlYRVJfTU9OSVRPUl0JPQlWT0xfNUJJVAotfTsKLQotLyogTWl4ZXIgZmlsZSBvcGVyYXRpb25zICovCi1zdGF0aWMgaW50IGVtdTEwazFfcHJpdmF0ZV9taXhlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCAqY3RsOwotCXN0cnVjdCBkc3BfcGF0Y2ggKnBhdGNoOwotCXUzMiBzaXplLCBwYWdlOwotCWludCBhZGRyLCBzaXplX3JlZywgaSwgcmV0OwotCXVuc2lnbmVkIGludCBpZCwgY2g7Ci0Jdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCi0JY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMzoKLQotCQljdGwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCksIEdGUF9LRVJORUwpOwotCQlpZiAoY3RsID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoY3RsLCBhcmdwLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkgewotCQkJa2ZyZWUoY3RsKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJcmV0ID0gMDsKLQkJc3dpdGNoIChjdGwtPmNtZCkgewotI2lmZGVmIERCR0VNVQotCQljYXNlIENNRF9XUklURUZOMDoKLQkJCWVtdTEwazFfd3JpdGVmbjBfMihjYXJkLCBjdGwtPnZhbFswXSwgY3RsLT52YWxbMV0sIGN0bC0+dmFsWzJdKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWNhc2UgQ01EX1dSSVRFUFRSOgotI2lmZGVmIERCR0VNVQotCQkJaWYgKGN0bC0+dmFsWzFdID49IDB4NDAgfHwgY3RsLT52YWxbMF0gPj0gMHgxMDAwKSB7Ci0jZWxzZQotCQkJaWYgKGN0bC0+dmFsWzFdID49IDB4NDAgfHwgY3RsLT52YWxbMF0gPj0gMHgxMDAwIHx8ICgoY3RsLT52YWxbMF0gPCAweDEwMCApICYmCi0JCSAgICAvL0FueSByZWdpc3RlciBhbGxvd2VkIHJhdyBhY2Nlc3MgZ29lcyBoZXJlOgotCQkJCSAgICAgKGN0bC0+dmFsWzBdICE9IEFfU1BESUZfU0FNUExFUkFURSkgJiYgKGN0bC0+dmFsWzBdICE9IEFfREJHKQotCQkJKQotCQkJCSkgewotI2VuZGlmCi0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBjdGwtPnZhbFswXSwgY3RsLT52YWxbMV0sIGN0bC0+dmFsWzJdKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX1JFQURGTjA6Ci0JCQljdGwtPnZhbFsyXSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBjdGwtPnZhbFswXSk7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9SRUFEUFRSOgotCQkJaWYgKGN0bC0+dmFsWzFdID49IDB4NDAgfHwgKGN0bC0+dmFsWzBdICYgMHg3ZmYpID4gMHhmZikgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICgoY3RsLT52YWxbMF0gJiAweDdmZikgPiAweDNmKQotCQkJCWN0bC0+dmFsWzFdID0gMHgwMDsKLQotCQkJY3RsLT52YWxbMl0gPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBjdGwtPnZhbFswXSwgY3RsLT52YWxbMV0pOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUUkVDU1JDOgotCQkJc3dpdGNoIChjdGwtPnZhbFswXSkgewotCQkJY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0JCQkJaWYgKGNhcmQtPmlzX2FwcykgewotCQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9BQzk3OwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFdBVkVSRUNPUkRfTUlDOgotCQkJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX01JQzsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBXQVZFUkVDT1JEX0ZYOgotCQkJCWNhcmQtPndhdmVpbi5yZWNzcmMgPSBXQVZFUkVDT1JEX0ZYOwotCQkJCWNhcmQtPndhdmVpbi5meHdjID0gY3RsLT52YWxbMV0gJiAweGZmZmY7Ci0KLQkJCQlpZiAoIWNhcmQtPndhdmVpbi5meHdjKQotCQkJCQlyZXQgPSAtRUlOVkFMOwotCi0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ01EX0dFVFJFQ1NSQzoKLQkJCWN0bC0+dmFsWzBdID0gY2FyZC0+d2F2ZWluLnJlY3NyYzsKLQkJCWN0bC0+dmFsWzFdID0gY2FyZC0+d2F2ZWluLmZ4d2M7Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfR0VUVk9JQ0VQQVJBTToKLQkJCWN0bC0+dmFsWzBdID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMF07Ci0JCQljdGwtPnZhbFsxXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzBdOwotCi0JCQljdGwtPnZhbFsyXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzFdOwotCQkJY3RsLT52YWxbM10gPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsxXTsKLQotCQkJY3RsLT52YWxbNF0gPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1syXTsKLQkJCWN0bC0+dmFsWzVdID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMl07Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKLQkJCQlyZXQgPSAtRUZBVUxUOwotCi0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRWT0lDRVBBUkFNOgotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMF0gPSBjdGwtPnZhbFswXTsKLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzBdID0gY3RsLT52YWxbMV07Ci0KLQkJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzFdID0gY3RsLT52YWxbMl07Ci0JCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVsxXSA9IGN0bC0+dmFsWzNdOwotCi0JCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1syXSA9IGN0bC0+dmFsWzRdOwotCQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMl0gPSBjdGwtPnZhbFs1XTsKLQotCQkJYnJlYWs7Ci0JCQotCQljYXNlIENNRF9TRVRNQ0hfRlg6Ci0JCQljYXJkLT5tY2hhbm5lbF9meCA9IGN0bC0+dmFsWzBdICYgMHgwMDBmOwotCQkJYnJlYWs7Ci0JCQotCQljYXNlIENNRF9HRVRQQVRDSDoKLQkJCWlmIChjdGwtPnZhbFswXSA9PSAwKSB7Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2FyZC0+bWdyLnJwYXRjaCwgc2l6ZW9mKHN0cnVjdCBkc3BfcnBhdGNoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlyZXQgPSAtRUZBVUxUOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKGN0bC0+dmFsWzBdIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFID49IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzKSB7Ci0JCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgUEFUQ0goJmNhcmQtPm1nciwgY3RsLT52YWxbMF0gLSAxKSwgc2l6ZW9mKHN0cnVjdCBkc3BfcGF0Y2gpKSkKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfR0VUR1BSOgotCQkJaWQgPSBjdGwtPnZhbFswXTsKLQotCQkJaWYgKGlkID4gTlVNX0dQUlMpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjYXJkLT5tZ3IuZ3ByW2lkXSwgc2l6ZW9mKHN0cnVjdCBkc3BfZ3ByKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfR0VUQ1RMR1BSOgotCQkJYWRkciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCAoY2hhciAqKSBjdGwtPnZhbCwgJigoY2hhciAqKSBjdGwtPnZhbClbUEFUQ0hfTkFNRV9TSVpFXSk7Ci0JCQljdGwtPnZhbFswXSA9IHNibGl2ZV9yZWFkcHRyKGNhcmQsIGFkZHIsIDApOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUUEFUQ0g6Ci0JCQlpZiAoY3RsLT52YWxbMF0gPT0gMCkKLQkJCQltZW1jcHkoJmNhcmQtPm1nci5ycGF0Y2gsICZjdGwtPnZhbFsxXSwgc2l6ZW9mKHN0cnVjdCBkc3BfcnBhdGNoKSk7Ci0JCQllbHNlIHsKLQkJCQlwYWdlID0gKGN0bC0+dmFsWzBdIC0gMSkgLyBQQVRDSEVTX1BFUl9QQUdFOwotCQkJCWlmIChwYWdlID4gTUFYX1BBVENIRVNfUEFHRVMpIHsKLQkJCQkJcmV0ID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKHBhZ2UgPj0gY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMpIHsKLQkJCQkJZm9yIChpID0gY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXM7IGkgPCBwYWdlICsgMTsgaSsrKSB7Ci0JCQkJICAgICAgICAgICAgICAgIGNhcmQtPm1nci5wYXRjaFtpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCQkJCQkJaWYoY2FyZC0+bWdyLnBhdGNoW2ldID09IE5VTEwpIHsKLQkJCQkJCQljYXJkLT5tZ3IuY3VycmVudF9wYWdlcyA9IGk7Ci0JCQkJCQkJcmV0ID0gLUVOT01FTTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCW1lbXNldChjYXJkLT5tZ3IucGF0Y2hbaV0sIDAsIFBBR0VfU0laRSk7Ci0JCQkJCX0KLQkJCQkJY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMgPSBwYWdlICsgMTsKLQkJCQl9Ci0KLQkJCQlwYXRjaCA9IFBBVENIKCZjYXJkLT5tZ3IsIGN0bC0+dmFsWzBdIC0gMSk7Ci0KLQkJCQltZW1jcHkocGF0Y2gsICZjdGwtPnZhbFsxXSwgc2l6ZW9mKHN0cnVjdCBkc3BfcGF0Y2gpKTsKLQotCQkJCWlmIChwYXRjaC0+Y29kZV9zaXplID09IDApIHsKLQkJCQkJZm9yKGkgPSBwYWdlICsgMTsgaSA8IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGNhcmQtPm1nci5wYXRjaFtpXSk7Ci0KLQkJCQkJY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMgPSBwYWdlICsgMTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRHUFI6Ci0JCQlpZiAoY3RsLT52YWxbMF0gPiBOVU1fR1BSUykgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW1lbWNweSgmY2FyZC0+bWdyLmdwcltjdGwtPnZhbFswXV0sICZjdGwtPnZhbFsxXSwgc2l6ZW9mKHN0cnVjdCBkc3BfZ3ByKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRDVExHUFI6Ci0JCQlhZGRyID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIChjaGFyICopIGN0bC0+dmFsLCAoY2hhciAqKSBjdGwtPnZhbCArIFBBVENIX05BTUVfU0laRSk7Ci0JCQllbXUxMGsxX3NldF9jb250cm9sX2dwcihjYXJkLCBhZGRyLCAqKChzMzIgKikoKGNoYXIgKikgY3RsLT52YWwgKyAyICogUEFUQ0hfTkFNRV9TSVpFKSksIDApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUR1BPVVQ6Ci0JCQlpZiAoICgoY3RsLT52YWxbMF0gPiAyKSAmJiAoIWNhcmQtPmlzX2F1ZGlneSkpCi0JCQkgICAgIHx8IChjdGwtPnZhbFswXSA+IDE1KSB8fCBjdGwtPnZhbFsxXSA+IDEpIHsKLQkJCQlyZXQ9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChjYXJkLT5pc19hdWRpZ3kpCi0JCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAoMSA8PCAyNCkgfCAoKGN0bC0+dmFsWzBdKSA8PCAxNikgfCBBX0lPQ0ZHLCBjdGwtPnZhbFsxXSk7Ci0JCQllbHNlCi0JCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAoMSA8PCAyNCkgfCAoKChjdGwtPnZhbFswXSkgKyAxMCkgPDwgMTYpIHwgSENGRywgY3RsLT52YWxbMV0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfR0VUR1BSMk9TUzoKLQkJCWlkID0gY3RsLT52YWxbMF07Ci0JCQljaCA9IGN0bC0+dmFsWzFdOwotCi0JCQlpZiAoaWQgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8IGNoID49IDIpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljdGwtPnZhbFsyXSA9IGNhcmQtPm1nci5jdHJsX2dwcltpZF1bY2hdOwotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTURfU0VUR1BSMk9TUzoKLQkJCWlkID0gY3RsLT52YWxbMF07Ci0JCQkvKiAwID09IGxlZnQsIDEgPT0gcmlnaHQgKi8KLQkJCWNoID0gY3RsLT52YWxbMV07Ci0JCQlhZGRyID0gY3RsLT52YWxbMl07Ci0KLQkJCWlmIChpZCA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgY2ggPj0gMikgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhcmQtPm1nci5jdHJsX2dwcltpZF1bY2hdID0gYWRkcjsKLQotCQkJaWYgKGNhcmQtPmlzX2FwcykKLQkJCQlicmVhazsKLQotCQkJaWYgKGFkZHIgPj0gMCkgewotCQkJCXVuc2lnbmVkIGludCBzdGF0ZSA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXTsKLQotCQkJCWlmIChjaCA9PSAxKSB7Ci0JCQkJCXN0YXRlID4+PSA4OwotCQkJCQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9ICgxIDw8IGlkKTsKLQkJCQl9Ci0KLQkJCQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9ICgxIDw8IGlkKTsKLQotCQkJCWlmIChpZCA9PSBTT1VORF9NSVhFUl9UUkVCTEUpIHsKLQkJCQkJc2V0X3RyZWJsZShjYXJkLCBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gJiAweGZmLCAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdID4+IDgpICYgMHhmZik7Ci0JCQkJfSBlbHNlIGlmIChpZCA9PSBTT1VORF9NSVhFUl9CQVNTKSB7Ci0JCQkJCXNldF9iYXNzKGNhcmQsIGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSAmIDB4ZmYsIChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gPj4gOCkgJiAweGZmKTsKLQkJCQl9IGVsc2UKLQkJCQkJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBhZGRyLCBzdGF0ZSAmIDB4ZmYsCi0JCQkJCQkJICAgICAgIHZvbHVtZV9wYXJhbXNbaWRdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyAmPSB+KDEgPDwgaWQpOwotCQkJCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgfD0gY2FyZC0+YWM5N19zdGVyZW9fbWl4ZXJzOwotCi0JCQkJaWYgKGNoID09IDApIHsKLQkJCQkJY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyAmPSB+KDEgPDwgaWQpOwotCQkJCQljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9IGNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVyczsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9TRVRQQVNTVEhST1VHSDoKLQkJCWNhcmQtPnB0LnNlbGVjdGVkID0gY3RsLT52YWxbMF0gPyAxIDogMDsKLQkJCWlmIChjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSkKLQkJCQlicmVhazsKLQotCQkJY2FyZC0+cHQuc3Bjc190b191c2UgPSBjdGwtPnZhbFswXSAmIDB4MDc7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9QUklWQVRFM19WRVJTSU9OOgotCQkJY3RsLT52YWxbMF0gPSBQUklWQVRFM19WRVJTSU9OOwkvL3ByaXZhdGUzIHZlcnNpb24KLQkJCWN0bC0+dmFsWzFdID0gTUFKT1JfVkVSOwkvL21ham9yIGRyaXZlciB2ZXJzaW9uCi0JCQljdGwtPnZhbFsyXSA9IE1JTk9SX1ZFUjsJLy9taW5vciBkcml2ZXIgdmVyc2lvbgotCQkJY3RsLT52YWxbM10gPSBjYXJkLT5pc19hdWRpZ3k7CS8vMT1jYXJkIGlzIGF1ZGlneQotCi0JCQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQkJCWN0bC0+dmFsWzRdPWVtdTEwazFfcmVhZGZuMChjYXJkLCAweDE4KTsKLQotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQotCQljYXNlIENNRF9BQzk3X0JPT1NUOgotCQkJaWYgKGN0bC0+dmFsWzBdKQotCQkJCWVtdTEwazFfYWM5N193cml0ZShjYXJkLT5hYzk3LCAweDE4LCAweDApOwkKLQkJCWVsc2UKLQkJCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHgwODA4KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJa2ZyZWUoY3RsKTsKLQkJcmV0dXJuIHJldDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU0OgotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc2l6ZSwgYXJncCwgc2l6ZW9mKHNpemUpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCURQRCgyLCAiRXh0ZXJuYWwgdHJhbSBzaXplICUjeFxuIiwgc2l6ZSk7Ci0KLQkJaWYgKHNpemUgPiAweDFmZmZmZikKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXNpemVfcmVnID0gMDsKLQotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQlzaXplID0gKHNpemUgLSAxKSA+PiAxNDsKLQotCQkJd2hpbGUgKHNpemUpIHsKLQkJCQlzaXplID4+PSAxOwotCQkJCXNpemVfcmVnKys7Ci0JCQl9Ci0KLQkJCXNpemUgPSAweDQwMDAgPDwgc2l6ZV9yZWc7Ci0JCX0KLQotCQlEUEQoMiwgIkV4dGVybmFsIHRyYW0gc2l6ZSAlI3ggJSN4XG4iLCBzaXplLCBzaXplX3JlZyk7Ci0KLQkJaWYgKHNpemUgIT0gY2FyZC0+dGFua21lbS5zaXplKSB7Ci0JCQlpZiAoY2FyZC0+dGFua21lbS5zaXplID4gMCkgewotCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGR19MT0NLVEFOS0NBQ0hFLCAxKTsKLQotCQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwgVENCLCAwLCBUQ0JTLCAwLCBUQUdMSVNUX0VORCk7Ci0KLQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnRhbmttZW0uc2l6ZSwgY2FyZC0+dGFua21lbS5hZGRyLCBjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUpOwotCi0JCQkJY2FyZC0+dGFua21lbS5zaXplID0gMDsKLQkJCX0KLQotCQkJaWYgKHNpemUgIT0gMCkgewotCQkJCWNhcmQtPnRhbmttZW0uYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIHNpemUsICZjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUpOwotCQkJCWlmIChjYXJkLT50YW5rbWVtLmFkZHIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCQljYXJkLT50YW5rbWVtLnNpemUgPSBzaXplOwotCi0JCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLCBUQ0IsICh1MzIpIGNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSwgVENCUywodTMyKSBzaXplX3JlZywgVEFHTElTVF9FTkQpOwotCi0JCQkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBIQ0ZHX0xPQ0tUQU5LQ0FDSEUsIDApOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfZHNwX21peGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBvc3NfbWl4ZXIsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKLQlpbnQgdmFsOwotCWludCBzY2FsZTsKLQotCWNhcmQtPmFjOTctPm1vZGNudCsrOwotCi0JaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIGNsZWFuc2UgaW5wdXQgYSBsaXR0bGUgKi8KLQlyaWdodCA9ICgodmFsID4+IDgpICAmIDB4ZmYpOwotCWxlZnQgPSAodmFsICAmIDB4ZmYpOwotCi0JaWYgKHJpZ2h0ID4gMTAwKSByaWdodCA9IDEwMDsKLQlpZiAobGVmdCA+IDEwMCkgbGVmdCA9IDEwMDsKLQotCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW29zc19taXhlcl0gPSAocmlnaHQgPDwgOCkgfCBsZWZ0OwotCWlmIChvc3NfbWl4ZXIgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7Ci0JCXNldF90cmVibGUoY2FyZCwgbGVmdCwgcmlnaHQpOwotCQlyZXR1cm4gMDsKLQl9IGlmIChvc3NfbWl4ZXIgPT0gU09VTkRfTUlYRVJfQkFTUykgewotCQlzZXRfYmFzcyhjYXJkLCBsZWZ0LCByaWdodCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChvc3NfbWl4ZXIgPT0gU09VTkRfTUlYRVJfVk9MVU1FKQotCQlzY2FsZSA9IDEgPDwgY2FyZC0+YWM5Ny0+Yml0X3Jlc29sdXRpb247Ci0JZWxzZQotCQlzY2FsZSA9IHZvbHVtZV9wYXJhbXNbb3NzX21peGVyXTsKLQotCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgY2FyZC0+bWdyLmN0cmxfZ3ByW29zc19taXhlcl1bMF0sIGxlZnQsIHNjYWxlKTsKLQllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzFdLCByaWdodCwgc2NhbGUpOwotCi0JaWYgKGNhcmQtPmFjOTdfc3VwcG9ydGVkX21peGVycyAmICgxIDw8IG9zc19taXhlcikpCi0JCWNhcmQtPmFjOTctPndyaXRlX21peGVyKGNhcmQtPmFjOTcsIG9zc19taXhlciwgbGVmdCwgcmlnaHQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZW11MTBrMV9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBvc3NfbWl4ZXIgPSBfSU9DX05SKGNtZCk7Ci0JCi0JcmV0ID0gLUVJTlZBTDsKLQlpZiAoIWNhcmQtPmlzX2FwcykgewotCQlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKLQkJCW1peGVyX2luZm8gaW5mbzsKLQotCQkJc3RybGNweShpbmZvLmlkLCBjYXJkLT5hYzk3LT5uYW1lLCBzaXplb2YoaW5mby5pZCkpOwotCi0JCQlpZiAoY2FyZC0+aXNfYXVkaWd5KQotCQkJCXN0cmxjcHkoaW5mby5uYW1lLCAiQXVkaWd5IC0gRW11MTBrMSIsIHNpemVvZihpbmZvLm5hbWUpKTsKLQkJCWVsc2UKLQkJCQlzdHJsY3B5KGluZm8ubmFtZSwgIkNyZWF0aXZlIFNCTGl2ZSAtIEVtdTEwazEiLCBzaXplb2YoaW5mby5uYW1lKSk7Ci0JCQkJCi0JCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gY2FyZC0+YWM5Ny0+bW9kY250OwotCi0JCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKChfU0lPQ19ESVIoY21kKSA9PSAoX1NJT0NfV1JJVEV8X1NJT0NfUkVBRCkpICYmIG9zc19taXhlciA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpCi0JCQlyZXQgPSBlbXUxMGsxX2RzcF9taXhlcihjYXJkLCBvc3NfbWl4ZXIsIGFyZyk7Ci0JCWVsc2UKLQkJCXJldCA9IGNhcmQtPmFjOTctPm1peGVyX2lvY3RsKGNhcmQtPmFjOTcsIGNtZCwgYXJnKTsKLQl9Ci0JCi0JaWYgKHJldCA8IDApCi0JCXJldCA9IGVtdTEwazFfcHJpdmF0ZV9taXhlcihjYXJkLCBjbWQsIGFyZyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGVtdTEwazFfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCi0JRFBGKDQsICJlbXUxMGsxX21peGVyX29wZW4oKVxuIik7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmZW11MTBrMV9kZXZzKSB7Ci0JCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11MTBrMV9jYXJkLCBsaXN0KTsKLQotCQlpZiAoY2FyZC0+YWM5Ny0+ZGV2X21peGVyID09IG1pbm9yKQotCQkJZ290byBtYXRjaDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgICAgbWF0Y2g6Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbXUxMGsxX21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JRFBGKDQsICJlbXUxMGsxX21peGVyX3JlbGVhc2UoKVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taXhlcl9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkuaW9jdGwJCT0gZW11MTBrMV9taXhlcl9pb2N0bCwKLQkub3BlbgkJPSBlbXUxMGsxX21peGVyX29wZW4sCi0JLnJlbGVhc2UJPSBlbXUxMGsxX21peGVyX3JlbGVhc2UsCi19OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYyBiL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMjFkNDMuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBwYXNzdGhyb3VnaC5jIC0tIEVtdTEwazEgZGlnaXRhbCBwYXNzdGhyb3VnaAotICogICAgIENvcHlyaWdodCAoQykgMjAwMSAgSnVoYSBZcmr2bOQgPGp5cmpvbGFAY2MuaHV0LmZpPgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgTWF5IDE1LCAyMDAxCSAgICBKdWhhIFlyavZs5AkgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0gICAgICAgICAgICAgICAgICAgICAgIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICJjYXJkd28uaCIKLSNpbmNsdWRlICJjYXJkd2kuaCIKLSNpbmNsdWRlICJyZWNtZ3IuaCIKLSNpbmNsdWRlICJpcnFtZ3IuaCIKLSNpbmNsdWRlICJhdWRpby5oIgotI2luY2x1ZGUgIjgwMTAuaCIKLQotc3RhdGljIHZvaWQgcHRfcHV0c2FtcGxlcyhzdHJ1Y3QgcHRfZGF0YSAqcHQsIHUxNiAqcHRyLCB1MTYgbGVmdCwgdTE2IHJpZ2h0KQotewotCXVuc2lnbmVkIGludCBpZHg7Ci0KLQlwdHJbcHQtPmNvcHlwdHJdID0gbGVmdDsKLQlpZHggPSBwdC0+Y29weXB0ciArIFBUX1NBTVBMRVMvMjsKLQlpZHggJT0gUFRfU0FNUExFUzsKLQlwdHJbaWR4XSA9IHJpZ2h0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwdF9jYW5fd3JpdGUoc3RydWN0IHB0X2RhdGEgKnB0KQotewotCXJldHVybiBwdC0+YmxvY2tzX2NvcGllZCA8IHB0LT5ibG9ja3NfcGxheWVkICsgODsKLX0KLQotc3RhdGljIGludCBwdF93YWl0X2Zvcl93cml0ZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlZGV2LCBpbnQgbm9uYmxvY2spCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVkZXYtPmNhcmQ7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCi0JaWYgKG5vbmJsb2NrICYmICFwdF9jYW5fd3JpdGUocHQpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQl3aGlsZSAoIXB0X2Nhbl93cml0ZShwdCkgJiYgcHQtPnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7Ci0JCWludGVycnVwdGlibGVfc2xlZXBfb24oJnB0LT53YWl0KTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQl9Ci0JaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9JTkFDVElWRSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRfcHV0YmxvY2soc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHUxNiAqYmxvY2ssIGludCBub25ibG9jaykKLXsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKLQlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7Ci0JdTE2ICpwdHIgPSAodTE2ICopIGNhcmQtPnRhbmttZW0uYWRkcjsKLQlpbnQgaSA9IDAsIHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXIgPSBwdF93YWl0X2Zvcl93cml0ZSh3YXZlX2Rldiwgbm9uYmxvY2spOwotCWlmIChyIDwgMCkKLQkJcmV0dXJuIHI7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAoaSA8IFBUX0JMT0NLU0FNUExFUykgewotCQlwdF9wdXRzYW1wbGVzKHB0LCBwdHIsIGJsb2NrWzIqaV0sIGJsb2NrWzIqaSsxXSk7Ci0JCWlmIChwdC0+Y29weXB0ciA9PSAwKQotCQkJcHQtPmNvcHlwdHIgPSBQVF9TQU1QTEVTOwotCQlwdC0+Y29weXB0ci0tOwotCQlpKys7Ci0JfQotCXdvaW5zdC0+dG90YWxfY29waWVkICs9IFBUX0JMT0NLU0laRTsKLQlwdC0+YmxvY2tzX2NvcGllZCsrOwotCWlmIChwdC0+YmxvY2tzX2NvcGllZCA+PSA0ICYmIHB0LT5zdGF0ZSAhPSBQVF9TVEFURV9QTEFZSU5HKSB7Ci0JCURQRigyLCAiYWN0aXZhdGluZyBkaWdpdGFsIHBhc3MtdGhyb3VnaCBwbGF5YmFja1xuIik7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBHUFJfQkFTRSArIHB0LT5lbmFibGVfZ3ByLCAwLCAxKTsKLQkJcHQtPnN0YXRlID0gUFRfU1RBVEVfUExBWUlORzsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1pbnQgZW11MTBrMV9wdF9zZXR1cChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQl1MzIgYml0czsKLQlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlwdC0+b2xkX3NwY3NbaV0gPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBTUENTMCArIGksIDApOwotCQlpZiAocHQtPnNwY3NfdG9fdXNlICYgKDEgPDwgaSkpIHsKLQkJCURQRCgyLCAidXNpbmcgUy9QRElGIHBvcnQgJWRcbiIsIGkpOwotCQkJYml0cyA9IFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKLQkJCQlTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8Ci0JCQkJMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUOwotCQkJaWYgKHB0LT5hYzNkYXRhKQotCQkJCWJpdHMgfD0gU1BDU19OT1RBVURJT0RBVEE7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU1BDUzAgKyBpLCAwLCBiaXRzKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3NpemVfdCBlbXUxMGsxX3B0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKLQlpbnQgbm9uYmxvY2ssIGksIHIsIGJsb2NrcywgYmxvY2tzX2NvcGllZCwgYnl0ZXNfY29waWVkID0gMDsKLQotCURQRCgzLCAiZW11MTBrMV9wdF93cml0ZSgpOiAlZCBieXRlc1xuIiwgY291bnQpOwotCQotCW5vbmJsb2NrID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7Ci0JCi0JaWYgKGNhcmQtPnRhbmttZW0uc2l6ZSA8IFBUX1NBTVBMRVMqMikKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9JTkFDVElWRSkgewotCQlEUEYoMiwgImJ1ZnB0ciBpbml0XG4iKTsKLQkJcHQtPnBsYXlwdHIgPSBQVF9TQU1QTEVTLTE7Ci0JCXB0LT5jb3B5cHRyID0gUFRfSU5JVFBUUjsKLQkJcHQtPmJsb2Nrc19wbGF5ZWQgPSBwdC0+YmxvY2tzX2NvcGllZCA9IDA7Ci0JCW1lbXNldChjYXJkLT50YW5rbWVtLmFkZHIsIDAsIGNhcmQtPnRhbmttZW0uc2l6ZSk7Ci0JCXB0LT5zdGF0ZSA9IFBUX1NUQVRFX0FDVElWQVRFRDsKLQkJcHQtPmJ1ZiA9IGttYWxsb2MoUFRfQkxPQ0tTSVpFLCBHRlBfS0VSTkVMKTsKLQkJcHQtPnByZXBlbmRfc2l6ZSA9IDA7Ci0JCWlmIChwdC0+YnVmID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJZW11MTBrMV9wdF9zZXR1cCh3YXZlX2Rldik7Ci0JfQotCWlmIChwdC0+cHJlcGVuZF9zaXplKSB7Ci0JCWludCBuZWVkZWQgPSBQVF9CTE9DS1NJWkUgLSBwdC0+cHJlcGVuZF9zaXplOwotCi0JCURQRCgzLCAicHJlcGVuZCBzaXplICVkLCBwcmVwZW5kaW5nICVkIGJ5dGVzXG4iLCBwdC0+cHJlcGVuZF9zaXplLCBuZWVkZWQpOwotCQlpZiAoY291bnQgPCBuZWVkZWQpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihwdC0+YnVmICsgcHQtPnByZXBlbmRfc2l6ZSwKLQkJCQkJICAgYnVmZmVyLCBjb3VudCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlwdC0+cHJlcGVuZF9zaXplICs9IGNvdW50OwotCQkJRFBEKDMsICJwcmVwZW5kIHNpemUgbm93ICVkXG4iLCBwdC0+cHJlcGVuZF9zaXplKTsKLQkJCXJldHVybiBjb3VudDsKLQkJfQotCQlpZiAoY29weV9mcm9tX3VzZXIocHQtPmJ1ZiArIHB0LT5wcmVwZW5kX3NpemUsIGJ1ZmZlciwgbmVlZGVkKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyID0gcHRfcHV0YmxvY2sod2F2ZV9kZXYsICh1MTYgKikgcHQtPmJ1Ziwgbm9uYmxvY2spOwotCQlpZiAocikKLQkJCXJldHVybiByOwotCQlieXRlc19jb3BpZWQgKz0gbmVlZGVkOwotCQlwdC0+cHJlcGVuZF9zaXplID0gMDsKLQl9Ci0JYmxvY2tzID0gKGNvdW50LWJ5dGVzX2NvcGllZCkvUFRfQkxPQ0tTSVpFOwotCWJsb2Nrc19jb3BpZWQgPSAwOwotCXdoaWxlIChibG9ja3MgPiAwKSB7Ci0JCXUxNiBfX3VzZXIgKmJ1ZnB0ciA9ICh1MTYgX191c2VyICopIGJ1ZmZlciArIChieXRlc19jb3BpZWQvMik7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwdC0+YnVmLCBidWZwdHIsIFBUX0JMT0NLU0laRSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJciA9IHB0X3B1dGJsb2NrKHdhdmVfZGV2LCAodTE2ICopcHQtPmJ1Ziwgbm9uYmxvY2spOwotCQlpZiAocikgewotCQkJaWYgKGJ5dGVzX2NvcGllZCkKLQkJCQlyZXR1cm4gYnl0ZXNfY29waWVkOwotCQkJZWxzZQotCQkJCXJldHVybiByOwotCQl9Ci0JCWJ5dGVzX2NvcGllZCArPSBQVF9CTE9DS1NJWkU7Ci0JCWJsb2Nrcy0tOwotCQlibG9ja3NfY29waWVkKys7Ci0JfQotCWkgPSBjb3VudCAtIGJ5dGVzX2NvcGllZDsKLQlpZiAoaSkgewotCQlwdC0+cHJlcGVuZF9zaXplID0gaTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHB0LT5idWYsIGJ1ZmZlciArIGJ5dGVzX2NvcGllZCwgaSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnl0ZXNfY29waWVkICs9IGk7Ci0JCURQRCgzLCAiZmlsbGluZyBwcmVwZW5kIGJ1ZmZlciB3aXRoICVkIGJ5dGVzIiwgaSk7Ci0JfQotCXJldHVybiBieXRlc19jb3BpZWQ7Ci19Ci0KLXZvaWQgZW11MTBrMV9wdF9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OwotCWludCBpOwotCi0JaWYgKHB0LT5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSkgewotCQlEUEYoMiwgImRpZ2l0YWwgcGFzcy10aHJvdWdoIHN0b3BwZWRcbiIpOwotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgKGNhcmQtPmlzX2F1ZGlneSA/IEFfR1BSX0JBU0UgOiBHUFJfQkFTRSkgKyBwdC0+ZW5hYmxlX2dwciwgMCwgMCk7Ci0JCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdC0+c3Bjc190b191c2UgJiAoMSA8PCBpKSkKLQkJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU1BDUzAgKyBpLCAwLCBwdC0+b2xkX3NwY3NbaV0pOwotCQl9Ci0JCXB0LT5zdGF0ZSA9IFBUX1NUQVRFX0lOQUNUSVZFOwotCQlrZnJlZShwdC0+YnVmKTsKLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV9wdF93YXZlb3V0X3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKLXsKLQlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OwotCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZ3YXZlX2Rldi0+Y2FyZC0+cHQ7Ci0JdTMyIHBvczsKLQotCWlmIChwdC0+c3RhdGUgPT0gUFRfU1RBVEVfUExBWUlORyAmJiBwdC0+cG9zX2dwciA+PSAwKSB7Ci0JCXBvcyA9IHNibGl2ZV9yZWFkcHRyKHdhdmVfZGV2LT5jYXJkLCBHUFJfQkFTRSArIHB0LT5wb3NfZ3ByLCAwKTsKLQkJaWYgKHBvcyA+IFBUX0JMT0NLU0FNUExFUykKLQkJCXBvcyA9IFBUX0JMT0NLU0FNUExFUzsKLQkJcG9zID0gNCAqIChQVF9CTE9DS1NBTVBMRVMgLSBwb3MpOwotCX0gZWxzZQotCQlwb3MgPSAwOwotCXdvaW5zdC0+dG90YWxfcGxheWVkID0gcHQtPmJsb2Nrc19wbGF5ZWQgKiB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICsgcG9zOwotCXdvaW5zdC0+YnVmZmVyLmh3X3BvcyA9IHBvczsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmggYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjBjYzk3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBwYXNzdGhyb3VnaC5oIC0tIEVtdTEwazEgZGlnaXRhbCBwYXNzdGhyb3VnaCBoZWFkZXIgZmlsZQotICogICAgIENvcHlyaWdodCAoQykgMjAwMSAgSnVoYSBZcmr2bOQgPGp5cmpvbGFAY2MuaHV0LmZpPgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgTWF5IDE1LCAyMDAxCSAgICBKdWhhIFlyavZs5CAgICAgYmFzZSBjb2RlIHJlbGVhc2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX1BBU1NUSFJPVUdIX0gKLSNkZWZpbmUgX1BBU1NUSFJPVUdIX0gKLQotI2luY2x1ZGUgImF1ZGlvLmgiCi0KLS8qIG51bWJlciBvZiAxNi1iaXQgc3RlcmVvIHNhbXBsZXMgaW4gWFRSQU0gYnVmZmVyICovCi0jZGVmaW5lIFBUX1NBTVBMRVMgMHg4MDAwCi0jZGVmaW5lIFBUX0JMT0NLU0FNUExFUyAweDQwMAotI2RlZmluZSBQVF9CTE9DS1NJWkUgKFBUX0JMT0NLU0FNUExFUyo0KQotI2RlZmluZSBQVF9CTE9DS1NJWkVfTE9HMiAxMgotI2RlZmluZSBQVF9CTE9DS0NPVU5UIChQVF9TQU1QTEVTL1BUX0JMT0NLU0FNUExFUykKLSNkZWZpbmUgUFRfSU5JVFBUUiAoUFRfU0FNUExFUy8yLTEpCi0KLSNkZWZpbmUgUFRfU1RBVEVfSU5BQ1RJVkUgMAotI2RlZmluZSBQVF9TVEFURV9BQ1RJVkFURUQgMQotI2RlZmluZSBQVF9TVEFURV9QTEFZSU5HIDIKLQotLyogcGFzc3Rocm91Z2ggc3RydWN0ICovCi1zdHJ1Y3QgcHRfZGF0YQotewotCXU4CXNlbGVjdGVkLCBzdGF0ZSwgc3Bjc190b191c2U7Ci0JaW50CWludHJfZ3ByLCBlbmFibGVfZ3ByLCBwb3NfZ3ByOwotCXUzMglibG9ja3NfcGxheWVkLCBibG9ja3NfY29waWVkLCBvbGRfc3Bjc1szXTsKLQl1MzIJcGxheXB0ciwgY29weXB0cjsKLQl1MzIJcHJlcGVuZF9zaXplOwotCXU4CSpidWY7Ci0JdTgJYWMzZGF0YTsKLQotCWNoYXIJKnBhdGNoX25hbWUsICppbnRyX2dwcl9uYW1lLCAqZW5hYmxlX2dwcl9uYW1lLCAqcG9zX2dwcl9uYW1lOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLQlzcGlubG9ja190IGxvY2s7Ci19OwotCi0vKgotICBQYXNzdGhyb3VnaCBjYW4gYmUgZG9uZSBpbiB0d28gbWV0aG9kczoKLQotICBNZXRob2QgMSA6IHRyYW0KLSAgICAgSW4gb3JpZ2luYWwgZW11MTBrMSwgd2UgY291bGRuJ3QgYnlwYXNzIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXJzLiBFdmVuIGF0IDQ4a0h6Ci0gICAgICh0aGUgaW50ZXJuYWwgc2FtcGxlIHJhdGUgb2YgdGhlIGVtdTEwazEpIHRoZSBzYW1wbGVzIHdvdWxkIGdldCBtZXNzZWQgdXAuCi0gICAgIFRvIG92ZXIgY29tZSB0aGlzLCBzYW1wbGVzIGFyZSBjb3BpZWQgaW50byB0aGUgdHJhbSBhbmQgYSBzcGVjaWFsIGRzcCBwYXRjaCBjb3BpZXMKLSAgICAgdGhlIHNhbXBsZXMgb3V0IGFuZCBnZW5lcmF0ZXMgaW50ZXJydXB0cyB3aGVuIGEgYmxvY2sgaGFzIGZpbm5pc2hlZCBwbGF5aW5nLgotCi0gIE1ldGhvZCAyIDogSW50ZXJwb2xhdG9yIGJ5cGFzcwotCi0gICAgIENyZWF0aXZlIGZpeGVkIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0IHByb2JsZW0gaW4gZW11MTBrMSByZXYgNyBhbmQgaGlnaGVyCi0gICAgIChpbmNsdWRpbmcgdGhlIGVtdTEwazIgKGF1ZGlneSkpLiBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHJlZ3VsYXIsIGFuZCBtdWNoIHNpbXBsZXIKLSAgICAgcGxheWJhY2sgbWV0aG9kLiAKLQotCi0gIEluIGJvdGggbWV0aG9kcywgZHNwIGNvZGUgaXMgdXNlZCB0byBtdXggYXVkaW8gYW5kIHBhc3N0aHJvdWdoLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BkaWYKLSAgZG9lc24ndCByZWNlaXZlIGF1ZGlvIGFuZCBwYXN0aHJvdWdoIGRhdGEgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHNwZGlmIGZsYWcgU1BDU19OT1RBVURJT0RBVEEKLSAgaXMgc2V0IHRvIHRlbGwgCi0KLSAqLwotCi0vLyBlbXUxMGsxIHJldnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDcgY2FuIHVzZSBtZXRob2QyCi0KLSNkZWZpbmUgVVNFX1BUX01FVEhPRDIgIChjYXJkLT5pc19hdWRpZ3kpCi0jZGVmaW5lIFVTRV9QVF9NRVRIT0QxCSFVU0VfUFRfTUVUSE9EMgotCi1zc2l6ZV90IGVtdTEwazFfcHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCk7Ci0KLWludCBlbXUxMGsxX3B0X3NldHVwKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KTsKLXZvaWQgZW11MTBrMV9wdF9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpOwotdm9pZCBlbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KTsKLQotI2VuZGlmIC8qIF9QQVNTVEhST1VHSF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U1NjE4Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHJlY21nci5jIC0tIFJlY29yZGluZyBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlcgotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAiODAxMC5oIgotI2luY2x1ZGUgInJlY21nci5oIgotCi12b2lkIGVtdTEwazFfcmVzZXRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCi17Ci0JRFBGKDIsICJlbXUxMGsxX3Jlc2V0X3JlY29yZCgpXG4iKTsKLQotCXNibGl2ZV93cml0ZXB0cihjYXJkLCBidWZmZXItPnNpemVyZWcsIDAsIEFEQ0JTX0JVRlNJWkVfTk9ORSk7Ci0KLQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5zaXplcmVnLCAwLCBidWZmZXItPnNpemVyZWd2YWwpOwkKLQotCXdoaWxlIChzYmxpdmVfcmVhZHB0cihjYXJkLCBidWZmZXItPmlkeHJlZywgMCkpCi0JCXVkZWxheSg1KTsKLX0KLQotdm9pZCBlbXUxMGsxX3N0YXJ0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQotewotCURQRigyLCAiZW11MTBrMV9zdGFydF9yZWNvcmQoKVxuIik7Ci0KLQlpZiAoYnVmZmVyLT5hZGNjdGwpCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBRENDUiwgMCwgYnVmZmVyLT5hZGNjdGwpOwotfQotCi12b2lkIGVtdTEwazFfc3RvcF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlEUEYoMiwgImVtdTEwazFfc3RvcF9yZWNvcmQoKVxuIik7Ci0KLQkvKiBEaXNhYmxlIHJlY29yZCB0cmFuc2ZlciAqLwotCWlmIChidWZmZXItPmFkY2N0bCkKLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFEQ0NSLCAwLCAwKTsKLX0KLQotdm9pZCBlbXUxMGsxX3NldF9yZWNvcmRfc3JjKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3aWluc3QgKndpaW5zdCkKLXsKLQlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOwotCi0JRFBGKDIsICJlbXUxMGsxX3NldF9yZWNvcmRfc3JjKClcbiIpOwotCi0Jc3dpdGNoICh3aWluc3QtPnJlY3NyYykgewotCi0JY2FzZSBXQVZFUkVDT1JEX0FDOTc6Ci0JCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogQUM5N1xuIik7Ci0JCWJ1ZmZlci0+c2l6ZXJlZyA9IEFEQ0JTOwotCQlidWZmZXItPmFkZHJyZWcgPSBBRENCQTsKLQkJYnVmZmVyLT5pZHhyZWcgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0lEWF9JRFggOiBBRENJRFhfSURYOwotCi0JCXN3aXRjaCAod2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlKSB7Ci0JCWNhc2UgMHhCQjgwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzQ4OwotCQkJYnJlYWs7Ci0JCWNhc2UgMHhBQzQ0OgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzQ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg3RDAwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzMyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg1REMwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzI0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg1NjIyOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzIyOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgzRTgwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzE2OwotCQkJYnJlYWs7Ci0JCS8vIEZJWE1FOiBhdWRpZ3kgc3VwcG9ydHMgMTJrSHogcmVjb3JkaW5nCi0JCS8qCi0JCWNhc2UgPz8/PzoKLQkJCWJ1ZmZlci0+YWRjY3RsID0gQV9BRENDUl9TQU1QTEVSQVRFXzEyOwotCQkJYnJlYWs7Ci0JCSovCi0JCWNhc2UgMHgyQjExOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1NBTVBMRVJBVEVfMTEgOiBBRENDUl9TQU1QTEVSQVRFXzExOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgxRjQwOgotCQkJYnVmZmVyLT5hZGNjdGwgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1NBTVBMRVJBVEVfOCA6IEFEQ0NSX1NBTVBMRVJBVEVfODsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWJ1ZmZlci0+YWRjY3RsIHw9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfTENIQU5FTkFCTEUgOiBBRENDUl9MQ0hBTkVOQUJMRTsKLQotCQlpZiAod2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPT0gMikKLQkJCWJ1ZmZlci0+YWRjY3RsIHw9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfUkNIQU5FTkFCTEUgOiBBRENDUl9SQ0hBTkVOQUJMRTsKLQotCQlicmVhazsKLQotCWNhc2UgV0FWRVJFQ09SRF9NSUM6Ci0JCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogTUlDXG4iKTsKLQkJYnVmZmVyLT5zaXplcmVnID0gTUlDQlM7Ci0JCWJ1ZmZlci0+YWRkcnJlZyA9IE1JQ0JBOwotCQlidWZmZXItPmlkeHJlZyA9IE1JQ0lEWF9JRFg7Ci0JCWJ1ZmZlci0+YWRjY3RsID0gMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFdBVkVSRUNPUkRfRlg6Ci0JCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogRlhcbiIpOwotCQlidWZmZXItPnNpemVyZWcgPSBGWEJTOwotCQlidWZmZXItPmFkZHJyZWcgPSBGWEJBOwotCQlidWZmZXItPmlkeHJlZyA9IEZYSURYX0lEWDsKLQkJYnVmZmVyLT5hZGNjdGwgPSAwOwotCi0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBGWFdDLCAwLCB3aWluc3QtPmZ4d2MpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJYnJlYWs7Ci0JfQotCi0JRFBEKDIsICJidXMgYWRkeDogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci0KLQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5hZGRycmVnLCAwLCAodTMyKWJ1ZmZlci0+ZG1hX2hhbmRsZSk7Ci19CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg3NjZhLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICByZWNtZ3IuaAotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogCi0gKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKLSAqIAotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAotICogCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKLSAqICAgICBVU0EuIAotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqLwotCi0jaWZuZGVmIF9SRUNPUkRNR1JfSAotI2RlZmluZSBfUkVDT1JETUdSX0gKLQotI2luY2x1ZGUgImh3YWNjZXNzLmgiCi0jaW5jbHVkZSAiY2FyZHdpLmgiCi0KLS8qIFJlY29yZGluZyByZXNvdXJjZXMgKi8KLSNkZWZpbmUgV0FWRVJFQ09SRF9BQzk3CQkweDAxCi0jZGVmaW5lIFdBVkVSRUNPUkRfTUlDCQkweDAyCi0jZGVmaW5lIFdBVkVSRUNPUkRfRlgJCTB4MDMKLQotdm9pZCBlbXUxMGsxX3Jlc2V0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKTsKLXZvaWQgZW11MTBrMV9zdGFydF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqKTsKLXZvaWQgZW11MTBrMV9zdG9wX3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3YXZlaW5fYnVmZmVyICopOwotdm9pZCBlbXUxMGsxX3NldF9yZWNvcmRfc3JjKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdpaW5zdCAqd2lpbnN0KTsKLQotI2VuZGlmIC8qIF9SRUNPUkRNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMGQzMDcuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIHRpbWVyLmMKLSAqICAgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgaW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyogMy82LzIwMDAJSW1wcm92ZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IHRpbWVyIGRlbGF5cyAgUnVpIFNvdXNhICovCi0KLS8qIDQvMy8yMDAwCUltcGxlbWVudGVkIHRpbWVyIGxpc3QgdXNpbmcgbGlzdC5oIAkgICAgIFJ1aSBTb3VzYSAqLwotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0jaW5jbHVkZSAiaXJxbWdyLmgiCi0jaW5jbHVkZSAidGltZXIuaCIKLQotLyogVHJ5IHRvIHNjaGVkdWxlIG9ubHkgb25jZSBwZXIgZnJhZ21lbnQgKi8KLQotdm9pZCBlbXUxMGsxX3RpbWVyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3QgZW11X3RpbWVyICp0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotCi0Jc3Bpbl9sb2NrKCZjYXJkLT50aW1lcl9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKLQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOwotCi0JCWlmICh0LT5zdGF0ZSAmIFRJTUVSX1NUQVRFX0FDVElWRSkgewotCQkJdC0+Y291bnQrKzsKLQkJCWlmICh0LT5jb3VudCA9PSB0LT5jb3VudF9tYXgpIHsKLQkJCQl0LT5jb3VudCA9IDA7Ci0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmdC0+dGFza2xldCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmY2FyZC0+dGltZXJfbG9jayk7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyLCB1MTYgZGVsYXkpCi17Ci0Jc3RydWN0IGVtdV90aW1lciAqdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGRlbGF5IDwgNSkKLQkJZGVsYXkgPSA1OwotCi0JdGltZXItPmRlbGF5ID0gZGVsYXk7Ci0JdGltZXItPnN0YXRlID0gVElNRVJfU1RBVEVfSU5TVEFMTEVEOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXRpbWVyLT5jb3VudF9tYXggPSB0aW1lci0+ZGVsYXkgLyAoY2FyZC0+dGltZXJfZGVsYXkgPCAxMDI0ID8gY2FyZC0+dGltZXJfZGVsYXkgOiAxMDI0KTsKLQl0aW1lci0+Y291bnQgPSB0aW1lci0+Y291bnRfbWF4IC0gMTsKLQotCWxpc3RfYWRkKCZ0aW1lci0+bGlzdCwgJmNhcmQtPnRpbWVycyk7Ci0KLQlpZiAoY2FyZC0+dGltZXJfZGVsYXkgPiBkZWxheSkgewotCQlpZiAoY2FyZC0+dGltZXJfZGVsYXkgPT0gVElNRVJfU1RPUFBFRCkKLQkJCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBJTlRFX0lOVEVSVkFMVElNRVJFTkIpOwotCi0JCWNhcmQtPnRpbWVyX2RlbGF5ID0gZGVsYXk7Ci0JCWRlbGF5ID0gKGRlbGF5IDwgMTAyNCA/IGRlbGF5IDogMTAyNCk7Ci0KLQkJZW11MTBrMV90aW1lcl9zZXQoY2FyZCwgZGVsYXkpOwotCi0JCWxpc3RfZm9yX2VhY2goZW50cnksICZjYXJkLT50aW1lcnMpIHsKLQkJCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKLQotCQkJdC0+Y291bnRfbWF4ID0gdC0+ZGVsYXkgLyBkZWxheTsKLQkJCS8qIGRvbid0IHdhbnQgdG8gdGhpbmsgbXVjaCwganVzdCBmb3JjZSBzY2hlZHVsaW5nIAotCQkJICAgb24gdGhlIG5leHQgaW50ZXJydXB0ICovCi0JCQl0LT5jb3VudCA9IHQtPmNvdW50X21heCAtIDE7Ci0JCX0KLQotCQlEUEQoMiwgInRpbWVyIHJhdGUgLS0+ICV1XG4iLCBkZWxheSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGVtdTEwazFfdGltZXJfdW5pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyKQotewotCXN0cnVjdCBlbXVfdGltZXIgKnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0JdTE2IGRlbGF5ID0gVElNRVJfU1RPUFBFRDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHRpbWVyLT5zdGF0ZSA9PSBUSU1FUl9TVEFURV9VTklOU1RBTExFRCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCWxpc3RfZGVsKCZ0aW1lci0+bGlzdCk7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7Ci0JCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKLQotCQlpZiAodC0+ZGVsYXkgPCBkZWxheSkKLQkJCWRlbGF5ID0gdC0+ZGVsYXk7Ci0JfQotCi0JaWYgKGNhcmQtPnRpbWVyX2RlbGF5ICE9IGRlbGF5KSB7Ci0JCWNhcmQtPnRpbWVyX2RlbGF5ID0gZGVsYXk7Ci0KLQkJaWYgKGRlbGF5ID09IFRJTUVSX1NUT1BQRUQpCi0JCQllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIElOVEVfSU5URVJWQUxUSU1FUkVOQik7Ci0JCWVsc2UgewotCQkJZGVsYXkgPSAoZGVsYXkgPCAxMDI0ID8gZGVsYXkgOiAxMDI0KTsKLQotCQkJZW11MTBrMV90aW1lcl9zZXQoY2FyZCwgZGVsYXkpOwotCi0JCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7Ci0JCQkJdCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXVfdGltZXIsIGxpc3QpOwotCi0JCQkJdC0+Y291bnRfbWF4ID0gdC0+ZGVsYXkgLyBkZWxheTsKLQkJCQl0LT5jb3VudCA9IHQtPmNvdW50X21heCAtIDE7Ci0JCQl9Ci0JCX0KLQotCQlEUEQoMiwgInRpbWVyIHJhdGUgLS0+ICV1XG4iLCBkZWxheSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCi0JdGltZXItPnN0YXRlID0gVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQ7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV90aW1lciAqdGltZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0JdGltZXItPnN0YXRlIHw9IFRJTUVSX1NUQVRFX0FDVElWRTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZW11MTBrMV90aW1lcl9kaXNhYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOwotCXRpbWVyLT5zdGF0ZSAmPSB+VElNRVJfU1RBVEVfQUNUSVZFOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmggYi9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU0M2I0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICB0aW1lci5oCi0gKiAgICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgotICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAotICogICAgIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmbmRlZiBfVElNRVJfSAotI2RlZmluZSBfVElNRVJfSAotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlICJod2FjY2Vzcy5oIgotCi1zdHJ1Y3QgZW11X3RpbWVyIAotewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKLQl1OCBzdGF0ZTsgCi0JdTE2IGNvdW50OwkJCQkvKiBjdXJyZW50IG51bWJlciBvZiBpbnRlcnJ1cHRzICovCi0JdTE2IGNvdW50X21heDsJCQkJLyogbnVtYmVyIG9mIGludGVycnVwdHMgbmVlZGVkIHRvIHNjaGVkdWxlIHRoZSBiaCAqLwotCXUxNiBkZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBkZWxheSAqLwotfTsKLQotdm9pZCBlbXUxMGsxX3RpbWVyX2luc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICosIHUxNik7Ci12b2lkIGVtdTEwazFfdGltZXJfdW5pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKLXZvaWQgZW11MTBrMV90aW1lcl9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOwotdm9pZCBlbXUxMGsxX3RpbWVyX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOwotCi0jZGVmaW5lIFRJTUVSX1NUT1BQRUQgCQkJMHhmZmZmIAotI2RlZmluZSBUSU1FUl9TVEFURV9JTlNUQUxMRUQgCQkweDAxCi0jZGVmaW5lIFRJTUVSX1NUQVRFX0FDVElWRQkJMHgwMgotI2RlZmluZSBUSU1FUl9TVEFURV9VTklOU1RBTExFRCAJMHgwNAotCi0jZW5kaWYgLyogX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhiNjAyLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgdm9pY2VtZ3IuYyAtIFZvaWNlIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCi0gKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKLSAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKLSAqICAgICBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAidm9pY2VtZ3IuaCIKLSNpbmNsdWRlICI4MDEwLmgiCi0KLSNkZWZpbmUgUElUQ0hfNDgwMDAgMHgwMDAwNDAwMAotI2RlZmluZSBQSVRDSF85NjAwMCAweDAwMDA4MDAwCi0jZGVmaW5lIFBJVENIXzg1MDAwIDB4MDAwMDcxNTUKLSNkZWZpbmUgUElUQ0hfODA3MjYgMHgwMDAwNmJhMgotI2RlZmluZSBQSVRDSF82Nzg4MiAweDAwMDA1YTgyCi0jZGVmaW5lIFBJVENIXzU3MDgxIDB4MDAwMDRjMWMKLQotc3RhdGljIHUzMiBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20oc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwKLQkJCQkgICAgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCi17Ci0JaWYodm9pY2UtPnBpdGNoX3RhcmdldD09UElUQ0hfNDgwMDApCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8wOwotCWVsc2UgaWYodm9pY2UtPnBpdGNoX3RhcmdldDxQSVRDSF80ODAwMCkKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzE7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfOTYwMDApCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8wOwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzg1MDAwKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNjsKLQllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF84MDcyNikKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzU7Ci0JZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfNjc4ODIpCi0JCXJldHVybiBDQ0NBX0lOVEVSUFJPTV80OwotCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzU3MDgxKQotCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMzsKLQllbHNlICAKLQkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzI7Ci19Ci0KLQotLyoqCi0gKiBlbXUxMGsxX3ZvaWNlX2FsbG9jX2J1ZmZlciAtCi0gKgotICogYWxsb2NhdGVzIHRoZSBtZW1vcnkgYnVmZmVyIGZvciBhIHZvaWNlLiBUd28gcGFnZSB0YWJsZXMgYXJlIGtlcHQgZm9yIGVhY2ggYnVmZmVyLgotICogT25lIChkbWFfaGFuZGxlKSBrZWVwcyB0cmFjayBvZiB0aGUgaG9zdCBtZW1vcnkgcGFnZXMgdXNlZCBhbmQgdGhlIG90aGVyICh2aXJ0dWFscGFnZXRhYmxlKQotICogaXMgcGFzc2VkIHRvIHRoZSBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gZG8gRE1BIHRvIGhvc3QgbWVtb3J5LgotICoKLSAqLwotaW50IGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB2b2ljZV9tZW0gKm1lbSwgdTMyIHBhZ2VzKQotewotCXUzMiBwYWdlaW5kZXgsIHBhZ2Vjb3VudDsKLQl1MzIgYnVzYWRkeDsKLQlpbnQgaTsKLQotCURQRCgyLCAicmVxdWVzdGVkIHBhZ2VzIGlzOiAlZFxuIiwgcGFnZXMpOwotCi0JaWYgKChtZW0tPmVtdXBhZ2VpbmRleCA9IGVtdTEwazFfYWRkeG1ncl9hbGxvYyhwYWdlcyAqIFBBR0VfU0laRSwgY2FyZCkpIDwgMCkKLQl7Ci0JCURQRigxLCAiY291bGRuJ3QgYWxsb2NhdGUgZW11MTBrMSBhZGRyZXNzIHNwYWNlXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIEZpbGwgaW4gdmlydHVhbCBtZW1vcnkgdGFibGUgKi8KLQlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IHBhZ2VzOyBwYWdlY291bnQrKykgewotCQlpZiAoKG1lbS0+YWRkcltwYWdlY291bnRdID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFLCAmbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0pKQotCQkJPT0gTlVMTCkgewotCQkJbWVtLT5wYWdlcyA9IHBhZ2Vjb3VudDsKLQkJCURQRigxLCAiY291bGRuJ3QgYWxsb2NhdGUgZG1hIG1lbW9yeVxuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlEUEQoMiwgIlZpcnR1YWwgQWRkeDogJXBcbiIsIG1lbS0+YWRkcltwYWdlY291bnRdKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkU7IGkrKykgewotCQkJYnVzYWRkeCA9ICh1MzIpIG1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdICsgaSAqIEVNVVBBR0VTSVpFOwotCi0JCQlEUEQoMywgIkJ1cyBBZGR4OiAlI3hcbiIsIGJ1c2FkZHgpOwotCi0JCQlwYWdlaW5kZXggPSBtZW0tPmVtdXBhZ2VpbmRleCArIHBhZ2Vjb3VudCAqIFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFICsgaTsKLQotCQkJKCh1MzIgKikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyKVtwYWdlaW5kZXhdID0gY3B1X3RvX2xlMzIoKGJ1c2FkZHggKiAyKSB8IHBhZ2VpbmRleCk7Ci0JCX0KLQl9Ci0KLQltZW0tPnBhZ2VzID0gcGFnZWNvdW50OwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlciAtCi0gKgotICogZnJlZXMgdGhlIG1lbW9yeSBidWZmZXIgZm9yIGEgdm9pY2UuCi0gKi8KLXZvaWQgZW11MTBrMV92b2ljZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgdm9pY2VfbWVtICptZW0pCi17Ci0JdTMyIHBhZ2Vjb3VudCwgcGFnZWluZGV4OwotCWludCBpOwotCi0JaWYgKG1lbS0+ZW11cGFnZWluZGV4IDwgMCkKLQkJcmV0dXJuOwotCi0JZm9yIChwYWdlY291bnQgPSAwOyBwYWdlY291bnQgPCBtZW0tPnBhZ2VzOyBwYWdlY291bnQrKykgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSwKLQkJCQkJbWVtLT5hZGRyW3BhZ2Vjb3VudF0sCi0JCQkJCW1lbS0+ZG1hX2hhbmRsZVtwYWdlY291bnRdKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkU7IGkrKykgewotCQkJcGFnZWluZGV4ID0gbWVtLT5lbXVwYWdlaW5kZXggKyBwYWdlY291bnQgKiBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRSArIGk7Ci0JCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2VpbmRleF0gPQotCQkJCWNwdV90b19sZTMyKCgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSB8IHBhZ2VpbmRleCk7Ci0JCX0KLQl9Ci0KLQllbXUxMGsxX2FkZHhtZ3JfZnJlZShjYXJkLCBtZW0tPmVtdXBhZ2VpbmRleCk7Ci0JbWVtLT5lbXVwYWdlaW5kZXggPSAtMTsKLX0KLQotaW50IGVtdTEwazFfdm9pY2VfYWxsb2Moc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCi17Ci0JdTggKnZvaWNldGFibGUgPSBjYXJkLT52b2ljZXRhYmxlOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VfYWxsb2MoKVxuIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0c7IGkgKz0gMikKLQkJCWlmICgodm9pY2V0YWJsZVtpXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSAmJiAodm9pY2V0YWJsZVtpICsgMV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkpIHsKLQkJCQl2b2ljZXRhYmxlW2ldID0gdm9pY2UtPnVzYWdlOwotCQkJCXZvaWNldGFibGVbaSArIDFdID0gdm9pY2UtPnVzYWdlOwotCQkJCWJyZWFrOwotCQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSsrKQotCQkJaWYgKHZvaWNldGFibGVbaV0gPT0gVk9JQ0VfVVNBR0VfRlJFRSkgewotCQkJCXZvaWNldGFibGVbaV0gPSB2b2ljZS0+dXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGkgPj0gTlVNX0cpCi0JCXJldHVybiAtMTsKLQotCXZvaWNlLT5jYXJkID0gY2FyZDsKLQl2b2ljZS0+bnVtID0gaTsKLQotCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKLQkJRFBEKDIsICIgdm9pY2UgYWxsb2NhdGVkIC0+ICVkXG4iLCB2b2ljZS0+bnVtICsgaSk7Ci0KLQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaSwgSUZBVE4sIDB4ZmZmZiwKLQkJCQkJCQlEQ1lTVVNWLCAwLAotCQkJCQkJCVZURlQsIDB4MDAwMGZmZmYsCi0JCQkJCQkJUFRSWCwgMCwKLQkJCQkJCQlUQUdMSVNUX0VORCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZV9mcmVlKHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB2b2ljZS0+Y2FyZDsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JRFBGKDIsICJlbXUxMGsxX3ZvaWNlX2ZyZWUoKVxuIik7Ci0KLQlpZiAodm9pY2UtPnVzYWdlID09IFZPSUNFX1VTQUdFX0ZSRUUpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBpKyspIHsKLQkJRFBEKDIsICIgdm9pY2UgcmVsZWFzZWQgLT4gJWRcbiIsIHZvaWNlLT5udW0gKyBpKTsKLQotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLCBEQ1lTVVNWLCAwLCAKLQkJCQkJCQlWVEZULCAweDAwMDBmZmZmLAotCQkJCQkJCVBUUlhfUElUQ0hUQVJHRVQsIDAsCi0JCQkJCQkJQ1ZDRiwgMHgwMDAwZmZmZiwKLQkJCQkJCQkvL0NQRiwgMCwKLQkJCQkJCQlUQUdMSVNUX0VORCk7Ci0JCQotCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGLCB2b2ljZS0+bnVtICsgaSwgMCk7Ci0JfQotCi0Jdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0KLQljYXJkLT52b2ljZXRhYmxlW3ZvaWNlLT5udW1dID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQotCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCi0JCWNhcmQtPnZvaWNldGFibGVbdm9pY2UtPm51bSArIDFdID0gVk9JQ0VfVVNBR0VfRlJFRTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBlbXUxMGsxX3ZvaWNlX3BsYXliYWNrX3NldHVwKHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlKQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB2b2ljZS0+Y2FyZDsKLQl1MzIgc3RhcnQ7Ci0JaW50IGk7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoKVxuIik7Ci0KLQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7Ci0JCS8qIFNldCBzdGVyZW8gYml0ICovCi0JCXN0YXJ0ID0gMjg7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0sIENQRl9TVEVSRU9fTUFTSyk7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0gKyAxLCBDUEZfU1RFUkVPX01BU0spOwotCX0gZWxzZSB7Ci0JCXN0YXJ0ID0gMzA7Ci0JCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0sIDApOwotCX0KLQotCWlmKCEodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpKQotCQlzdGFydCAqPSAyOwotCi0Jdm9pY2UtPnN0YXJ0ICs9IHN0YXJ0OwotCi0JZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgewotCQlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9GWFJUMSwgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9yb3V0aW5nKTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0ZYUlQyLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcyKTsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCAgQV9TRU5EQU1PVU5UUywgdm9pY2UtPm51bSArIGksIHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9oZ2ZlKTsKLQkJfSBlbHNlIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBGWFJULCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcgPDwgMTYpOwotCQl9Ci0KLQkJLyogU3RvcCBDQSAqLwotCQkvKiBBc3N1bXB0aW9uIHRoYXQgUFQgaXMgYWxyZWFkeSAwIHNvIG5vIGhhcm0gb3ZlcndyaXRpbmcgKi8KLQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFBUUlgsIHZvaWNlLT5udW0gKyBpLCAoKHZvaWNlLT5wYXJhbXNbaV0uc2VuZF9kY2JhICYgMHhmZikgPDwgOCkKLQkJCQl8ICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmMDApID4+IDgpKTsKLQotCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLAotCQkJCS8qIENTTCwgU1QsIENBICovCi0JCQkJICAgIERTTCwgdm9pY2UtPmVuZGxvb3AgfCAodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmMDAwMDAwKSwKLQkJCQkgICAgUFNTVCwgdm9pY2UtPnN0YXJ0bG9vcCB8ICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweDAwZmYwMDAwKSA8PCA4KSwKLQkJCQkgICAgQ0NDQSwgKHZvaWNlLT5zdGFydCkgfCAgZW11MTBrMV9zZWxlY3RfaW50ZXJwcm9tKGNhcmQsdm9pY2UpIHwKLQkJCQkgICAgICAgICgodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfMTZCSVQpID8gMCA6IENDQ0FfOEJJVFNFTEVDVCksCi0JCQkJICAgIC8qIENsZWFyIGZpbHRlciBkZWxheSBtZW1vcnkgKi8KLQkJCQkgICAgWjEsIDAsCi0JCQkJICAgIFoyLCAwLAotCQkJCSAgICAvKiBJbnZhbGlkYXRlIG1hcHMgKi8KLQkJCQkgICAgTUFQQSwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAotCQkJCSAgICBNQVBCLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCi0JCQkJLyogbW9kdWxhdGlvbiBlbnZlbG9wZSAqLwotCQkJCSAgICBDVkNGLCAweDAwMDBmZmZmLAotCQkJCSAgICBWVEZULCAweDAwMDBmZmZmLAotCQkJCSAgICBBVEtITERNLCAwLAotCQkJCSAgICBEQ1lTVVNNLCAweDAwN2YsCi0JCQkJICAgIExGT1ZBTDEsIDB4ODAwMCwKLQkJCQkgICAgTEZPVkFMMiwgMHg4MDAwLAotCQkJCSAgICBGTU1PRCwgMCwKLQkJCQkgICAgVFJFTUZSUSwgMCwKLQkJCQkgICAgRk0yRlJRMiwgMCwKLQkJCQkgICAgRU5WVkFMLCAweDgwMDAsCi0JCQkJLyogdm9sdW1lIGVudmVsb3BlICovCi0JCQkJICAgIEFUS0hMRFYsIDB4N2Y3ZiwKLQkJCQkgICAgRU5WVk9MLCAweDgwMDAsCi0JCQkJLyogZmlsdGVyIGVudmVsb3BlICovCi0JCQkJICAgIFBFRkVfRklMVEVSQU1PVU5ULCAweDdmLAotCQkJCS8qIHBpdGNoIGVudmVsb3BlICovCi0JCQkJICAgIFBFRkVfUElUQ0hBTU9VTlQsIDAsIFRBR0xJU1RfRU5EKTsKLQotCQl2b2ljZS0+cGFyYW1zW2ldLmZjX3RhcmdldCA9IDB4ZmZmZjsKLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZXNfc3RhcnQoc3RydWN0IGVtdV92b2ljZSAqZmlyc3Rfdm9pY2UsIHVuc2lnbmVkIGludCBudW1fdm9pY2VzLCBpbnQgc2V0KQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBmaXJzdF92b2ljZS0+Y2FyZDsKLQlzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZTsKLQl1bnNpZ25lZCBpbnQgdm9pY2VudW07Ci0JaW50IGo7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2VzX3N0YXJ0KClcbiIpOwotCi0JZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgbnVtX3ZvaWNlczsgdm9pY2VudW0rKykKLQl7Ci0JCXZvaWNlID0gZmlyc3Rfdm9pY2UgKyB2b2ljZW51bTsKLQotCQlpZiAoIXNldCkgewotCQkJdTMyIGNyYSwgY2NpcywgY3MsIHNhbXBsZTsKLQkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKLQkJCQljcmEgPSA2NDsKLQkJCQljY2lzID0gMjg7Ci0JCQkJY3MgPSA0OwotCQkJfSBlbHNlIHsKLQkJCQljcmEgPSA2NDsKLQkJCQljY2lzID0gMzA7Ci0JCQkJY3MgPSAyOwotCQkJfQotCi0JCQlpZih2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkgewotCQkJCXNhbXBsZSA9IDB4MDAwMDAwMDA7Ci0JCQl9IGVsc2UgewotCQkJCXNhbXBsZSA9IDB4ODA4MDgwODA7CQkKLQkJCQljY2lzICo9IDI7Ci0JCQl9Ci0KLQkJCWZvcihqID0gMDsgaiA8IGNzOyBqKyspCi0JICAgICAgICAJICAgICAgICBzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0QwICsgaiwgdm9pY2UtPm51bSwgc2FtcGxlKTsKLQotCQkJLyogUmVzZXQgY2FjaGUgKi8KLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSwgMCk7Ci0JCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSArIDEsIDApOwotCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX1JFQURBRERSRVNTLCB2b2ljZS0+bnVtLCBjcmEpOwotCi0JCQlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKQotCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlLT5udW0gKyAxLCBjcmEpOwotCi0JCQkvKiBGaWxsIGNhY2hlICovCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ0NSX0NBQ0hFSU5WQUxJRFNJWkUsIHZvaWNlLT5udW0sIGNjaXMpOwotCQl9Ci0KLQkJZm9yIChqID0gMDsgaiA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGorKykgewotCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCB2b2ljZS0+bnVtICsgaiwKLQkJCQkgICAgSUZBVE4sICh2b2ljZS0+cGFyYW1zW2pdLmluaXRpYWxfZmMgPDwgOCkgfCB2b2ljZS0+cGFyYW1zW2pdLmluaXRpYWxfYXR0biwKLQkJCQkgICAgVlRGVCwgKHZvaWNlLT5wYXJhbXNbal0udm9sdW1lX3RhcmdldCA8PCAxNikgfCB2b2ljZS0+cGFyYW1zW2pdLmZjX3RhcmdldCwKLQkJCQkgICAgQ1ZDRiwgKHZvaWNlLT5wYXJhbXNbal0udm9sdW1lX3RhcmdldCA8PCAxNikgfCB2b2ljZS0+cGFyYW1zW2pdLmZjX3RhcmdldCwKLQkJCQkgICAgRENZU1VTViwgKHZvaWNlLT5wYXJhbXNbal0uYnlhbXBsX2Vudl9zdXN0YWluIDw8IDgpIHwgdm9pY2UtPnBhcmFtc1tqXS5ieWFtcGxfZW52X2RlY2F5LAotCQkJCSAgICBUQUdMSVNUX0VORCk7Ci0JCi0JCQllbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChjYXJkLCB2b2ljZS0+bnVtICsgaik7Ci0JCX0KLQl9Ci0KLQotICAgICAgICBmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCBudW1fdm9pY2VzOyB2b2ljZW51bSsrKQotCXsKLQkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlbnVtOwotCi0JCWZvciAoaiA9IDA7IGogPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBqKyspIHsKLQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBQVFJYX1BJVENIVEFSR0VULCB2b2ljZS0+bnVtICsgaiwgdm9pY2UtPnBpdGNoX3RhcmdldCk7Ci0KLQkJCWlmIChqID09IDApCi0JCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRl9DVVJSRU5UUElUQ0gsIHZvaWNlLT5udW0sIHZvaWNlLT5waXRjaF90YXJnZXQpOwotCi0JCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgSVAsIHZvaWNlLT5udW0gKyBqLCB2b2ljZS0+aW5pdGlhbF9waXRjaCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgZW11MTBrMV92b2ljZXNfc3RvcChzdHJ1Y3QgZW11X3ZvaWNlICpmaXJzdF92b2ljZSwgaW50IG51bV92b2ljZXMpCi17Ci0Jc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpcnN0X3ZvaWNlLT5jYXJkOwotCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlOwotCXVuc2lnbmVkIGludCB2b2ljZV9udW07Ci0JaW50IGo7Ci0KLQlEUEYoMiwgImVtdTEwazFfdm9pY2Vfc3RvcCgpXG4iKTsKLQotICAgICAgICBmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IG51bV92b2ljZXM7IHZvaWNlX251bSsrKQotCXsKLQkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlX251bTsKLQotCQlmb3IgKGogPSAwOyBqIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaisrKSB7Ci0JCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBqLAotCQkJCQkJUFRSWF9QSVRDSFRBUkdFVCwgMCwKLQkJCQkJCUNQRl9DVVJSRU5UUElUQ0gsIDAsCi0JCQkJCQlJRkFUTiwgMHhmZmZmLAotCQkJCQkJVlRGVCwgMHgwMDAwZmZmZiwKLQkJCQkJCUNWQ0YsIDB4MDAwMGZmZmYsCi0JCQkJCQlJUCwgMCwKLQkJCQkJCVRBR0xJU1RfRU5EKTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWE4Y2IuLjAwMDAwMDAKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICBzYmxpdmVfdm9pY2UuaCAtLSBFTVUgVm9pY2UgUmVzb3VyY2UgTWFuYWdlciBoZWFkZXIgZmlsZQotICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCi0gKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQotICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCi0gKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCi0gKiAgICAgVVNBLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfVk9JQ0VNR1JfSAotI2RlZmluZSBfVk9JQ0VNR1JfSAotCi0jaW5jbHVkZSAiaHdhY2Nlc3MuaCIKLQotLyogc3RydWN0IGVtdV92b2ljZS51c2FnZSBmbGFncyAqLwotI2RlZmluZSBWT0lDRV9VU0FHRV9GUkVFCQkweDAxCi0jZGVmaW5lIFZPSUNFX1VTQUdFX01JREkJCTB4MDIKLSNkZWZpbmUgVk9JQ0VfVVNBR0VfUExBWUJBQ0sJCTB4MDQKLQotLyogc3RydWN0IGVtdV92b2ljZS5mbGFncyBmbGFncyAqLwotI2RlZmluZSBWT0lDRV9GTEFHU19TVEVSRU8JCTB4MDIKLSNkZWZpbmUgVk9JQ0VfRkxBR1NfMTZCSVQJCTB4MDQKLQotc3RydWN0IHZvaWNlX3BhcmFtCi17Ci0JLyogRlggYnVzIGFtb3VudCBzZW5kICovCi0KLQl1MzIgc2VuZF9yb3V0aW5nOwotCS8vIGF1ZGlneSBvbmx5OgotCXUzMiBzZW5kX3JvdXRpbmcyOwotCi0JdTMyIHNlbmRfZGNiYTsKLQkvLyBhdWRpZ3kgb25seToKLQl1MzIgc2VuZF9oZ2ZlOwotCi0KLQl1MzIgaW5pdGlhbF9mYzsKLQl1MzIgZmNfdGFyZ2V0OwotCi0JdTMyIGluaXRpYWxfYXR0bjsKLQl1MzIgdm9sdW1lX3RhcmdldDsKLQotCXUzMiBieWFtcGxfZW52X3N1c3RhaW47Ci0JdTMyIGJ5YW1wbF9lbnZfZGVjYXk7Ci19OwotCi1zdHJ1Y3Qgdm9pY2VfbWVtIHsKLQlpbnQgZW11cGFnZWluZGV4OwotCXZvaWQgKmFkZHJbQlVGTUFYUEFHRVNdOwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZVtCVUZNQVhQQUdFU107Ci0JdTMyIHBhZ2VzOwotfTsKLQotc3RydWN0IGVtdV92b2ljZQotewotCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7Ci0JdTggdXNhZ2U7CQkvKiBGcmVlLCBNSURJLCBwbGF5YmFjayAqLwotCXU4IG51bTsJCQkvKiBWb2ljZSBJRCAqLwotCXU4IGZsYWdzOwkJLyogU3RlcmVvL21vbm8sIDgvMTYgYml0ICovCi0KLQl1MzIgc3RhcnRsb29wOwotCXUzMiBlbmRsb29wOwotCXUzMiBzdGFydDsKLQotCXUzMiBpbml0aWFsX3BpdGNoOwotCXUzMiBwaXRjaF90YXJnZXQ7Ci0KLQlzdHJ1Y3Qgdm9pY2VfcGFyYW0gcGFyYW1zWzJdOwotCi0Jc3RydWN0IHZvaWNlX21lbSBtZW07Ci19OwotCi1pbnQgZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgdm9pY2VfbWVtICosIHUzMik7Ci12b2lkIGVtdTEwazFfdm9pY2VfZnJlZV9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgdm9pY2VfbWVtICopOwotaW50IGVtdTEwazFfdm9pY2VfYWxsb2Moc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3ZvaWNlICopOwotdm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWUoc3RydWN0IGVtdV92b2ljZSAqKTsKLXZvaWQgZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cChzdHJ1Y3QgZW11X3ZvaWNlICopOwotdm9pZCBlbXUxMGsxX3ZvaWNlc19zdGFydChzdHJ1Y3QgZW11X3ZvaWNlICosIHVuc2lnbmVkIGludCwgaW50KTsKLXZvaWQgZW11MTBrMV92b2ljZXNfc3RvcChzdHJ1Y3QgZW11X3ZvaWNlICosIGludCk7Ci0KLSNlbmRpZiAvKiBfVk9JQ0VNR1JfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21wdTQwMS5jIGIvc291bmQvb3NzL21wdTQwMS5jCmluZGV4IDI3OTZjMGUuLmE2OTBjYTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9tcHU0MDEuYworKysgYi9zb3VuZC9vc3MvbXB1NDAxLmMKQEAgLTEwMDMsNyArMTAwMyw4IEBACiAJCX0KIAkJaWYgKCFkZXZjLT5zaGFyZWRfaXJxKQogCQl7Ci0JCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBtcHVpbnRyLCAwLCAibXB1NDAxIiwgKHZvaWQgKiltKSA8IDApCisJCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBtcHVpbnRyLCAwLCAibXB1NDAxIiwKKwkJCQkJaHdfY29uZmlnKSA8IDApCiAJCQl7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBGYWlsZWQgdG8gYWxsb2NhdGUgSVJRJWRcbiIsIGRldmMtPmlycSk7CiAJCQkJcmV0ID0gLUVOT01FTTsKQEAgLTExMTIsNyArMTExMyw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF9pcnE6Ci0JZnJlZV9pcnEoZGV2Yy0+aXJxLCAodm9pZCAqKW0pOworCWZyZWVfaXJxKGRldmMtPmlycSwgaHdfY29uZmlnKTsKIG91dF9taWRpZGV2OgogCXNvdW5kX3VubG9hZF9taWRpZGV2KG0pOwogb3V0X2VycjoKQEAgLTEyMjcsNyArMTIyOCw3IEBACiAJaWYgKG4gIT0gLTEpIHsKIAkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKIAkJaWYgKGh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCA9PSAwICYmIGh3X2NvbmZpZy0+aXJxID4gMCkKLQkJCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCAodm9pZCAqKW4pOworCQkJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGh3X2NvbmZpZyk7CiAJCXA9bXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbl07CiAJCXNvdW5kX3VubG9hZF9taWRpZGV2KG4pOwogCQlzb3VuZF91bmxvYWRfdGltZXJkZXYoaHdfY29uZmlnLT5zbG90c1syXSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTYuaCBiL3NvdW5kL29zcy9ubTI1Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGFkZTkwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9ubTI1Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNpZm5kZWYgX05NMjU2X0hfCi0jZGVmaW5lIF9OTTI1Nl9IXwotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgImFjOTcuaCIKLQotLyogVGhlIHJldmlzaW9ucyB0aGF0IHdlIGN1cnJlbnRseSBoYW5kbGUuICAqLwotZW51bSBubTI1NnJldiB7Ci0gICAgUkVWX05NMjU2QVYsIFJFVl9OTTI1NlpYCi19OwotCi0vKiBQZXItY2FyZCBzdHJ1Y3R1cmUuICovCi1zdHJ1Y3Qgbm0yNTZfaW5mbyAKLXsKLSAgICAvKiBNYWdpYyBudW1iZXIgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIHN0cnVjdCBpcyB2YWxpZC4gKi8KLSNkZWZpbmUgTk1fTUFHSUNfU0lHIDB4NTVhYTAwZmYKLSAgICBpbnQgbWFnc2lnOwotCi0gICAgLyogUmV2aXNpb24gbnVtYmVyICovCi0gICAgZW51bSBubTI1NnJldiByZXY7Ci0KLSAgICBzdHJ1Y3QgYWM5N19od2ludCBtZGV2OwotCi0gICAgLyogT3VyIGF1ZGlvIGRldmljZSBudW1iZXJzLiAqLwotICAgIGludCBkZXZbMl07Ci0KLSAgICAvKiBUaGUgIyBvZiB0aW1lcyBlYWNoIGRldmljZSBoYXMgYmVlbiBvcGVuZWQuIChTaG91bGQgb25seSBiZSAKLSAgICAgICAwIG9yIDEpLiAqLwotICAgIGludCBvcGVuY250WzJdOwotCi0gICAgLyogV2UgdXNlIHR3byBkZXZpY2VzLCBiZWNhdXNlIHdlIGNhbiBkbyBzaW11bHRhbmVvdXMgcGxheSBhbmQgcmVjb3JkLgotICAgICAgIFRoaXMga2VlcHMgdHJhY2sgb2Ygd2hpY2ggZGV2aWNlIGlzIGJlaW5nIHVzZWQgZm9yIHdoYXQgcHVycG9zZTsKLSAgICAgICB0aGVzZSBhcmUgdGhlIGFjdHVhbCBkZXZpY2UgbnVtYmVycy4gKi8KLSAgICBpbnQgZGV2X2Zvcl9wbGF5OwotICAgIGludCBkZXZfZm9yX3JlY29yZDsKLQotCXNwaW5sb2NrX3QgbG9jazsKLQkKLSAgICAvKiBUaGUgbWl4ZXIgZGV2aWNlLiAqLwotICAgIGludCBtaXhlcl9vc3NfZGV2OwotCi0gICAgLyogCi0gICAgICogQ2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UgZm9yIGVhY2ggb3BlcmF0aW9uLiAgVGhlc2UgYXJlbid0IHNldAotICAgICAqIHVudGlsIGFuIGFjdHVhbCBJL08gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZDsgdGhpcyBhbGxvd3Mgb25lCi0gICAgICogZGV2aWNlIHRvIGJlIG9wZW4gZm9yIHJlYWQvd3JpdGUgd2l0aG91dCBpbmhpYml0aW5nIEkvTyB0bwotICAgICAqIHRoZSBvdGhlciBkZXZpY2UuCi0gICAgICovCi0gICAgaW50IGlzX29wZW5fcGxheTsKLSAgICBpbnQgaXNfb3Blbl9yZWNvcmQ7Ci0KLSAgICAvKiBOb24temVybyBpZiB3ZSdyZSBjdXJyZW50bHkgcGxheWluZyBhIHNhbXBsZS4gKi8KLSAgICBpbnQgcGxheWluZzsKLSAgICAvKiBEaXR0byBmb3IgcmVjb3JkaW5nIGEgc2FtcGxlLiAqLwotICAgIGludCByZWNvcmRpbmc7Ci0KLSAgICAvKiBUaGUgdHdvIG1lbW9yeSBwb3J0cy4gICovCi0gICAgc3RydWN0IG5tMjU2X3BvcnRzIHsKLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwb3J0LiAqLwotCXUzMiBwaHlzYWRkcjsKLQkvKiBPdXIgbWFwcGVkLWluIHBvaW50ZXIuICovCi0JY2hhciBfX2lvbWVtICpwdHI7Ci0JLyogUFRSJ3Mgb2Zmc2V0IHdpdGhpbiB0aGUgcGh5c2ljYWwgcG9ydC4gICovCi0JdTMyIHN0YXJ0X29mZnNldDsKLQkvKiBBbmQgdGhlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICAqLwotCXUzMiBlbmRfb2Zmc2V0OwotICAgIH0gcG9ydFsyXTsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9mZnNldHMgd2l0aGluIG1lbW9yeSBwb3J0IDEuICovCi0gICAgdTMyIGNvZWZmQnVmOwotICAgIHUzMiBhbGxDb2VmZkJ1ZjsKLQotICAgIC8qIFJlY29yZCBhbmQgcGxheWJhY2sgYnVmZmVycy4gKi8KLSAgICB1MzIgYWJ1ZjEsIGFidWYyOwotCi0gICAgLyogT2Zmc2V0IG9mIHRoZSBBQzk3IG1peGVyIGluIG1lbW9yeSBwb3J0IDIuICovCi0gICAgdTMyIG1peGVyOwotCi0gICAgLyogT2Zmc2V0IG9mIHRoZSBtaXhlciBzdGF0dXMgcmVnaXN0ZXIgaW4gbWVtb3J5IHBvcnQgMi4gICovCi0gICAgdTMyIG1peGVyX3N0YXR1c19vZmZzZXQ7Ci0KLSAgICAvKiBOb24temVybyBpZiB3ZSBoYXZlIHdyaXR0ZW4gaW5pdGlhbCB2YWx1ZXMgdG8gdGhlIG1peGVyLiAqLwotICAgIHU4IG1peGVyX3ZhbHVlc19pbml0OwotCi0gICAgLyogCi0gICAgICogU3RhdHVzIG1hc2sgYml0OyAoKm1peGVyX3N0YXR1c19sb2MgJiBtaXhlcl9zdGF0dXNfbWFzaykgPT0gMCBtZWFucwotICAgICAqIGl0J3MgcmVhZHkuICAKLSAgICAgKi8KLSAgICB1MTYgbWl4ZXJfc3RhdHVzX21hc2s7Ci0KLSAgICAvKiBUaGUgc2l6ZXMgb2YgdGhlIHBsYXliYWNrIGFuZCByZWNvcmQgcmluZyBidWZmZXJzLiAqLwotICAgIHUzMiBwbGF5YmFja0J1ZmZlclNpemU7Ci0gICAgdTMyIHJlY29yZEJ1ZmZlclNpemU7Ci0KLSAgICAvKiBBcmUgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBpbiB0aGUgbWVtb3J5IGNhY2hlIGN1cnJlbnQ/ICovCi0gICAgdTggY29lZmZzQ3VycmVudDsKLQotICAgIC8qIEZvciB3cml0ZXMsIHRoZSBhbW91bnQgd2UgbGFzdCB3cm90ZS4gKi8KLSAgICB1MzIgcmVxdWVzdGVkX2FtdDsKLSAgICAvKiBUaGUgc3RhcnQgb2YgdGhlIGJsb2NrIGN1cnJlbnRseSBwbGF5aW5nLiAqLwotICAgIHUzMiBjdXJQbGF5UG9zOwotCi0gICAgLyogVGhlIGFtb3VudCBvZiBkYXRhIHdlIHdlcmUgcmVxdWVzdGVkIHRvIHJlY29yZC4gKi8KLSAgICB1MzIgcmVxdWVzdGVkUmVjQW10OwotICAgIC8qIFRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnRseS1yZWNvcmRpbmcgYmxvY2suICovCi0gICAgdTMyIGN1clJlY1BvczsKLSAgICAvKiBUaGUgZGVzdGluYXRpb24gYnVmZmVyLiAqLwotICAgIGNoYXIgKnJlY0J1ZjsKLQotICAgIC8qIE91ciBJUlEgbnVtYmVyLiAqLwotICAgIGludCBpcnE7Ci0KLSAgICAvKiBBIGZsYWcgaW5kaWNhdGluZyBob3cgbWFueSB0aW1lcyB3ZSd2ZSBncmFiYmVkIHRoZSBJUlEuICovCi0gICAgaW50IGhhc19pcnE7Ci0KLSAgICAvKiBUaGUgY2FyZCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiAqLwotICAgIGlycV9oYW5kbGVyX3QgaW50cm91dGluZTsKLQotICAgIC8qIEN1cnJlbnQgYXVkaW8gY29uZmlnLCBjYWNoZWQuICovCi0gICAgc3RydWN0IHNpbmZvIHsKLQl1MzIgc2FtcGxlcmF0ZTsKLQl1OCBiaXRzOwotCXU4IHN0ZXJlbzsKLSAgICB9IHNpbmZvWzJdOyAvKiBnb2VzIHdpdGggZWFjaCBkZXZpY2UgKi8KLQotICAgIC8qIFRoZSBjYXJkcyBhcmUgc3RvcmVkIGluIGEgY2hhaW47ICB0aGlzIGlzIHRoZSBuZXh0IGNhcmQuICovCi0gICAgc3RydWN0IG5tMjU2X2luZm8gKm5leHRfY2FyZDsKLX07Ci0KLS8qIFRoZSBCSU9TIHNpZ25hdHVyZS4gKi8KLSNkZWZpbmUgTk1fU0lHTkFUVVJFIDB4NGU0ZDAwMDAKLS8qIFNpZ25hdHVyZSBtYXNrLiAqLwotI2RlZmluZSBOTV9TSUdfTUFTSyAweGZmZmYwMDAwCi0KLS8qIFNpemUgb2YgdGhlIHNlY29uZCBtZW1vcnkgYXJlYS4gKi8KLSNkZWZpbmUgTk1fUE9SVDJfU0laRSA0MDk2Ci0KLS8qIFRoZSBiYXNlIG9mZnNldCBvZiB0aGUgbWl4ZXIgaW4gdGhlIHNlY29uZCBtZW1vcnkgYXJlYS4gKi8KLSNkZWZpbmUgTk1fTUlYRVJfT0ZGU0VUIDB4NjAwCi0KLS8qIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBjb2VmZmljaWVudCBlbnRyeS4gKi8KLSNkZWZpbmUgTk1fTUFYX0NPRUZGSUNJRU5UIDB4NTAwMAotCi0vKiBUaGUgaW50ZXJydXB0IHJlZ2lzdGVyLiAqLwotI2RlZmluZSBOTV9JTlRfUkVHIDB4YTA0Ci0vKiBBbmQgaXRzIGJpdHMuICovCi0jZGVmaW5lIE5NX1BMQVlCQUNLX0lOVCAweDQwCi0jZGVmaW5lIE5NX1JFQ09SRF9JTlQgMHgxMDAKLSNkZWZpbmUgTk1fTUlTQ19JTlRfMSAweDQwMDAKLSNkZWZpbmUgTk1fTUlTQ19JTlRfMiAweDEKLSNkZWZpbmUgTk1fQUNLX0lOVChDQVJELCBYKSBubTI1Nl93cml0ZVBvcnQxNigoQ0FSRCksIDIsIE5NX0lOVF9SRUcsIChYKSA8PCAxKQotCi0vKiBUaGUgQVYncyAibWl4ZXIgcmVhZHkiIHN0YXR1cyBiaXQgYW5kIGxvY2F0aW9uLiAqLwotI2RlZmluZSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUIDB4YTA0Ci0jZGVmaW5lIE5NX01JWEVSX1JFQURZX01BU0sgMHgwODAwCi0jZGVmaW5lIE5NX01JWEVSX1BSRVNFTkNFIDB4YTA2Ci0jZGVmaW5lIE5NX1BSRVNFTkNFX01BU0sgMHgwMDUwCi0jZGVmaW5lIE5NX1BSRVNFTkNFX1ZBTFVFIDB4MDA0MAotCi0vKgotICogRm9yIHRoZSBaWC4gIEl0IHVzZXMgdGhlIHNhbWUgaW50ZXJydXB0IHJlZ2lzdGVyLCBidXQgaXQgaG9sZHMgMzIKLSAqIGJpdHMgaW5zdGVhZCBvZiAxNi4KLSAqLwotI2RlZmluZSBOTTJfUExBWUJBQ0tfSU5UIDB4MTAwMDAKLSNkZWZpbmUgTk0yX1JFQ09SRF9JTlQgMHg4MDAwMAotI2RlZmluZSBOTTJfTUlTQ19JTlRfMSAweDgKLSNkZWZpbmUgTk0yX01JU0NfSU5UXzIgMHgyCi0jZGVmaW5lIE5NMl9BQ0tfSU5UKENBUkQsIFgpIG5tMjU2X3dyaXRlUG9ydDMyKChDQVJEKSwgMiwgTk1fSU5UX1JFRywgKFgpKQotCi0vKiBUaGUgWlgncyAibWl4ZXIgcmVhZHkiIHN0YXR1cyBiaXQgYW5kIGxvY2F0aW9uLiAqLwotI2RlZmluZSBOTTJfTUlYRVJfU1RBVFVTX09GRlNFVCAweGEwNgotI2RlZmluZSBOTTJfTUlYRVJfUkVBRFlfTUFTSyAweDA4MDAKLQotLyogVGhlIHBsYXliYWNrIHJlZ2lzdGVycyBzdGFydCBmcm9tIGhlcmUuICovCi0jZGVmaW5lIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgMHgwCi0vKiBUaGUgcmVjb3JkIHJlZ2lzdGVycyBzdGFydCBmcm9tIGhlcmUuICovCi0jZGVmaW5lIE5NX1JFQ09SRF9SRUdfT0ZGU0VUIDB4MjAwCi0KLS8qIFRoZSByYXRlIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgMiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcmVnaXN0ZXIgYXJlYS4gKi8KLSNkZWZpbmUgTk1fUkFURV9SRUdfT0ZGU0VUIDIKLQotLyogTW9uby9zdGVyZW8gZmxhZywgbnVtYmVyIG9mIGJpdHMgb24gcGxheWJhY2ssIGFuZCByYXRlIG1hc2suICovCi0jZGVmaW5lIE5NX1JBVEVfU1RFUkVPIDEKLSNkZWZpbmUgTk1fUkFURV9CSVRTXzE2IDIKLSNkZWZpbmUgTk1fUkFURV9NQVNLIDB4ZjAKLQotLyogUGxheWJhY2sgZW5hYmxlIHJlZ2lzdGVyLiAqLwotI2RlZmluZSBOTV9QTEFZQkFDS19FTkFCTEVfUkVHIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxKQotI2RlZmluZSBOTV9QTEFZQkFDS19FTkFCTEVfRkxBRyAxCi0jZGVmaW5lIE5NX1BMQVlCQUNLX09ORVNIT1QgMgotI2RlZmluZSBOTV9QTEFZQkFDS19GUkVFUlVOIDQKLQotLyogTXV0ZXMgdGhlIGF1ZGlvIG91dHB1dC4gKi8KLSNkZWZpbmUgTk1fQVVESU9fTVVURV9SRUcgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDE4KQotI2RlZmluZSBOTV9BVURJT19NVVRFX0xFRlQgMHg4MDAwCi0jZGVmaW5lIE5NX0FVRElPX01VVEVfUklHSFQgMHgwMDgwCi0KLS8qIFJlY29yZGluZyBlbmFibGUgcmVnaXN0ZXIuICovCi0jZGVmaW5lIE5NX1JFQ09SRF9FTkFCTEVfUkVHIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDApCi0jZGVmaW5lIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyAxCi0jZGVmaW5lIE5NX1JFQ09SRF9GUkVFUlVOIDIKLQotI2RlZmluZSBOTV9SQlVGRkVSX1NUQVJUIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4NCkKLSNkZWZpbmUgTk1fUkJVRkZFUl9FTkQgICAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDEwKQotI2RlZmluZSBOTV9SQlVGRkVSX1dNQVJLIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4YykKLSNkZWZpbmUgTk1fUkJVRkZFUl9DVVJSUCAoTk1fUkVDT1JEX1JFR19PRkZTRVQgKyAweDgpCi0KLSNkZWZpbmUgTk1fUEJVRkZFUl9TVEFSVCAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4NCkKLSNkZWZpbmUgTk1fUEJVRkZFUl9FTkQgICAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MTQpCi0jZGVmaW5lIE5NX1BCVUZGRVJfV01BUksgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweGMpCi0jZGVmaW5lIE5NX1BCVUZGRVJfQ1VSUlAgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDgpCi0KLS8qIEEgZmV3IHRyaXZpYWwgcm91dGluZXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd29yayB3aXRoIHRoZSByZWdpc3RlcnMKLSAgIG9uIHRoZSBjaGlwLiAqLwotCi0vKiBUaGlzIGlzIGEgY29tbW9uIGNvZGUgcG9ydGlvbiB1c2VkIHRvIGZpeCB1cCB0aGUgcG9ydCBvZmZzZXRzLiAqLwotI2RlZmluZSBOTV9GSVhfUE9SVCBcCi0gIGlmIChwb3J0IDwgMSB8fCBwb3J0ID4gMiB8fCBjYXJkID09IE5VTEwpIFwKLSAgICAgIHJldHVybiAtMTsgXAotXAotICAgIGlmIChvZmZzZXQgPCBjYXJkLT5wb3J0W3BvcnQgLSAxXS5zdGFydF9vZmZzZXQgXAotCXx8IG9mZnNldCA+PSBjYXJkLT5wb3J0W3BvcnQgLSAxXS5lbmRfb2Zmc2V0KSB7IFwKLQlwcmludGsgKEtFUk5fRVJSICJCYWQgYWNjZXNzOiBwb3J0ICVkLCBvZmZzZXQgMHgleFxuIiwgcG9ydCwgb2Zmc2V0KTsgXAotCXJldHVybiAtMTsgXAotICAgIH0gXAotICAgIG9mZnNldCAtPSBjYXJkLT5wb3J0W3BvcnQgLSAxXS5zdGFydF9vZmZzZXQ7Ci0KLSNkZWZpbmUgREVGd3JpdGVQb3J0WChYLCBmdW5jKSBcCi1zdGF0aWMgaW5saW5lIGludCBubTI1Nl93cml0ZVBvcnQjI1ggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLFwKLQkJCQkgICAgICBpbnQgcG9ydCwgaW50IG9mZnNldCwgaW50IHZhbHVlKVwKLXtcCi0gICAgdSMjWCBfX2lvbWVtICphZGRyO1wKLVwKLSAgICBpZiAobm0yNTZfZGVidWcgPiAxKVwKLSAgICAgICAgcHJpbnRrIChLRVJOX0RFQlVHICJXcml0aW5nIDB4JXggdG8gJWQ6MHgleFxuIiwgdmFsdWUsIHBvcnQsIG9mZnNldCk7XAotXAotICAgIE5NX0ZJWF9QT1JUO1wKLVwKLSAgICBhZGRyID0gKHUjI1ggX19pb21lbSAqKShjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQpO1wKLSAgICBmdW5jICh2YWx1ZSwgYWRkcik7XAotICAgIHJldHVybiAwO1wKLX0KLQotREVGd3JpdGVQb3J0WCAoOCwgd3JpdGViKQotREVGd3JpdGVQb3J0WCAoMTYsIHdyaXRldykKLURFRndyaXRlUG9ydFggKDMyLCB3cml0ZWwpCi0KLSNkZWZpbmUgREVGcmVhZFBvcnRYKFgsIGZ1bmMpIFwKLXN0YXRpYyBpbmxpbmUgdSMjWCBubTI1Nl9yZWFkUG9ydCMjWCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsXAotCQkJCQlpbnQgcG9ydCwgaW50IG9mZnNldClcCi17XAotICAgIHUjI1ggX19pb21lbSAqYWRkcjtcCi1cCi0gICAgTk1fRklYX1BPUlRcCi1cCi0gICAgYWRkciA9ICh1IyNYIF9faW9tZW0gKikoY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0KTtcCi0gICAgcmV0dXJuIGZ1bmMoYWRkcik7XAotfQotCi1ERUZyZWFkUG9ydFggKDgsIHJlYWRiKQotREVGcmVhZFBvcnRYICgxNiwgcmVhZHcpCi1ERUZyZWFkUG9ydFggKDMyLCByZWFkbCkKLQotc3RhdGljIGlubGluZSBpbnQKLW5tMjU2X3dyaXRlQnVmZmVyOCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIHU4ICpzcmMsIGludCBwb3J0LCBpbnQgb2Zmc2V0LAotCQkgICAgICBpbnQgYW10KQotewotICAgIE5NX0ZJWF9QT1JUOwotICAgIG1lbWNweV90b2lvIChjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQsIHNyYywgYW10KTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW5tMjU2X3JlYWRCdWZmZXI4IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgdTggKmRzdCwgaW50IHBvcnQsIGludCBvZmZzZXQsCi0JCSAgICAgaW50IGFtdCkKLXsKLSAgICBOTV9GSVhfUE9SVDsKLSAgICBtZW1jcHlfZnJvbWlvIChkc3QsIGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCwgYW10KTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIGNvZWZmaWNpZW50IGNhY2hlLiAqLwotc3RhdGljIGludCBubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKLQotI2VuZGlmCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMgYi9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjZDE1NS4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2NjIgKzAsMCBAQAotLyogCi0gKiBBdWRpbyBkcml2ZXIgZm9yIHRoZSBOZW9NYWdpYyAyNTZBViBhbmQgMjU2WlggY2hpcHNldHMgaW4gbmF0aXZlCi0gKiBtb2RlLCB3aXRoIEFDOTcgbWl4ZXIgc3VwcG9ydC4KLSAqCi0gKiBPdmVyYWxsIGRlc2lnbiBhbmQgcGFydHMgb2YgdGhpcyBjb2RlIHN0b2xlbiBmcm9tIHZpZGNfKi5jIGFuZAotICogc2tlbGV0b24uYy4KLSAqCi0gKiBZZWFoLCB0aGVyZSBhcmUgYSBsb3Qgb2YgbWFnaWMgY29uc3RhbnRzIGluIGhlcmUuICBZb3UgdGVsbCBNRSB3aGF0Ci0gKiB0aGV5IGFyZS4gIEkganVzdCBnZXQgdGhpcyBzdHVmZiBwc3ljaGljYWxseSwgcmVtZW1iZXI/IAotICoKLSAqIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIGJ5IHNvbWVvbmUgd2hvIHdpc2hlcyB0byByZW1haW4gYW5vbnltb3VzLiAKLSAqIEl0IGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLCBzbyBzaGFyZSBhbmQgZW5qb3kuICBUcnkgdG8gbWFrZSBhIHByb2ZpdAotICogb2ZmIG9mIGl0OyBnbyBvbiwgSSBkYXJlIHlvdS4gIAotICoKLSAqIENoYW5nZXM6Ci0gKiAxMS0xMC0yMDAwCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgotICoJCUFkZGVkIHNvbWUgX19pbml0Ci0gKiAxOS0wNC0yMDAxCU1hcmN1cyBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KLSAqCQlQb3J0ZWQgdG8gMi40IFBDSSBBUEkuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLXN0YXRpYyBpbnQgbm0yNTZfZGVidWc7Ci1zdGF0aWMgaW50IGZvcmNlX2xvYWQ7Ci0KLSNpbmNsdWRlICJubTI1Ni5oIgotI2luY2x1ZGUgIm5tMjU2X2NvZWZmLmgiCi0KLS8qIAotICogVGhlIHNpemUgb2YgdGhlIHBsYXliYWNrIHJlc2VydmUuICBXaGVuIHRoZSBwbGF5YmFjayBidWZmZXIgaGFzIGxlc3MKLSAqIHRoYW4gTk0yNTZfUExBWV9XTUFSS19TSVpFIGJ5dGVzIHRvIG91dHB1dCwgd2UgcmVxdWVzdCBhIG5ldwotICogYnVmZmVyLgotICovCi0jZGVmaW5lIE5NMjU2X1BMQVlfV01BUktfU0laRSA1MTIKLQotc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgbm0yNTZfYXVkaW9fZHJpdmVyOwotCi1zdGF0aWMgaW50IG5tMjU2X2dyYWJJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKLXN0YXRpYyBpbnQgbm0yNTZfcmVsZWFzZUludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpOwotc3RhdGljIGlycXJldHVybl90IG5tMjU2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBubTI1Nl9pbnRlcnJ1cHRfenggKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLS8qIFRoZXNlIGJlbG9uZyBpbiBsaW51eC9wY2kuaC4gKi8KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NkFWX0FVRElPIDB4ODAwNQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU8gMHg4MDA2Ci0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPIDB4ODAxNgotCi0vKiBMaXN0IG9mIGNhcmRzLiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgbm0yNTZfaW5mbyAqbm1jYXJkX2xpc3Q7Ci0KLS8qIFJlbGVhc2UgdGhlIG1hcHBlZC1pbiBtZW1vcnkgZm9yIENBUkQuICAqLwotc3RhdGljIHZvaWQKLW5tMjU2X3JlbGVhc2VfcG9ydHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotCWlmIChjYXJkLT5wb3J0W3hdLnB0ciAhPSBOVUxMKSB7Ci0JICAgIGlvdW5tYXAgKGNhcmQtPnBvcnRbeF0ucHRyKTsKLQkgICAgY2FyZC0+cG9ydFt4XS5wdHIgPSBOVUxMOwotCX0KLSAgICB9Ci19Ci0KLS8qIAotICogTWFwIGluIHRoZSBtZW1vcnkgcG9ydHMgZm9yIENBUkQsIGlmIHRoZXkgYXJlbid0IGFscmVhZHkgbWFwcGVkIGluCi0gKiBhbmQgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuICBJZiBzdWNjZXNzZnVsLCBhIHplcm8gdmFsdWUgaXMgcmV0dXJuZWQ7Ci0gKiBvdGhlcndpc2UgYW55IHByZXZpb3VzbHkgbWFwcGVkLWluIGFyZWFzIGFyZSByZWxlYXNlZCBhbmQgYSBub24temVybwotICogdmFsdWUgaXMgcmV0dXJuZWQuCi0gKgotICogVGhpcyBpcyBpbnZva2VkIHR3aWNlLCBvbmNlIGZvciBlYWNoIHBvcnQuICBJZGVhbGx5IGl0IHdvdWxkIG9ubHkgYmUKLSAqIGNhbGxlZCBvbmNlLCBidXQgd2Ugbm93IG5lZWQgdG8gbWFwIGluIHRoZSBzZWNvbmQgcG9ydCBpbiBvcmRlciB0bwotICogY2hlY2sgaG93IG11Y2ggbWVtb3J5IHRoZSBjYXJkIGhhcyBvbiB0aGUgMjU2WlguCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X3JlbWFwX3BvcnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQlpZiAoY2FyZC0+cG9ydFt4XS5wdHIgPT0gTlVMTCAmJiBjYXJkLT5wb3J0W3hdLmVuZF9vZmZzZXQgPiAwKSB7Ci0JICAgIHUzMiBwaHlzYWRkciAKLQkJPSBjYXJkLT5wb3J0W3hdLnBoeXNhZGRyICsgY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQ7Ci0JICAgIHUzMiBzaXplIAotCQk9IGNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCAtIGNhcmQtPnBvcnRbeF0uc3RhcnRfb2Zmc2V0OwotCi0JICAgIGNhcmQtPnBvcnRbeF0ucHRyID0gaW9yZW1hcF9ub2NhY2hlIChwaHlzYWRkciwgc2l6ZSk7Ci0JCQkJCQkgIAotCSAgICBpZiAoY2FyZC0+cG9ydFt4XS5wdHIgPT0gTlVMTCkgewotCQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogVW5hYmxlIHRvIHJlbWFwIHBvcnQgJWRcbiIsIHggKyAxKTsKLQkJbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvY2F0ZSB0aGUgY2FyZCBpbiBvdXIgbGlzdC4gKi8KLXN0YXRpYyBzdHJ1Y3Qgbm0yNTZfaW5mbyAqCi1ubTI1Nl9maW5kX2NhcmQgKGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQ7Ci0KLSAgICBmb3IgKGNhcmQgPSBubWNhcmRfbGlzdDsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dF9jYXJkKQotCWlmIChjYXJkLT5kZXZbMF0gPT0gZGV2IHx8IGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JICAgIHJldHVybiBjYXJkOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBEaXR0bywgYnV0IGZpbmQgdGhlIGNhcmQgc3RydWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1peGVyIGRldmljZSBERVYgCi0gKiBpbnN0ZWFkLiAKLSAqLwotc3RhdGljIHN0cnVjdCBubTI1Nl9pbmZvICoKLW5tMjU2X2ZpbmRfY2FyZF9mb3JfbWl4ZXIgKGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQ7Ci0KLSAgICBmb3IgKGNhcmQgPSBubWNhcmRfbGlzdDsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dF9jYXJkKQotCWlmIChjYXJkLT5taXhlcl9vc3NfZGV2ID09IGRldikKLQkgICAgcmV0dXJuIGNhcmQ7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCB1c2VjYWNoZTsKLXN0YXRpYyBpbnQgYnVmZmVydG9wOwotCi0vKiBDaGVjayB0byBzZWUgaWYgd2UncmUgdXNpbmcgdGhlIGJhbmsgb2YgY2FjaGVkIGNvZWZmaWNpZW50cy4gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgcmV0dXJuIHVzZWNhY2hlOwotfQotCi0vKiBUaGUgYWN0dWFsIHJhdGVzIHN1cHBvcnRlZCBieSB0aGUgY2FyZC4gKi8KLXN0YXRpYyBpbnQgc2FtcGxlcmF0ZXNbOV0gPSB7Ci0gICAgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDk5OTk5OTk5Ci19OwotCi0vKgotICogU2V0IHRoZSBjYXJkIHNhbXBsZXJhdGUsIHdvcmQgc2l6ZSBhbmQgc3RlcmVvIG1vZGUgdG8gY29ycmVzcG9uZCB0bwotICogdGhlIHNldHRpbmdzIGluIHRoZSBDQVJEIHN0cnVjdCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UgaW4gREVWLgotICogV2Uga2VlcCB0d28gc2VwYXJhdGUgc2V0cyBvZiBpbmZvcm1hdGlvbiwgb25lIGZvciBlYWNoIGRldmljZTsgdGhlCi0gKiBoYXJkd2FyZSBpcyBub3QgYWN0dWFsbHkgY29uZmlndXJlZCB1bnRpbCBhIHJlYWQgb3Igd3JpdGUgaXMKLSAqIGF0dGVtcHRlZC4KLSAqLwotCi1zdGF0aWMgaW50Ci1ubTI1Nl9zZXRJbmZvIChpbnQgZGV2LCBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpbnQgeDsKLSAgICBpbnQgdzsKLSAgICBpbnQgdGFyZ2V0cmF0ZTsKLQotICAgIGlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQotCXcgPSAwOwotICAgIGVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JdyA9IDE7Ci0gICAgZWxzZQotCXJldHVybiAtRU5PREVWOwotCi0gICAgdGFyZ2V0cmF0ZSA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7Ci0KLSAgICBpZiAoKGNhcmQtPnNpbmZvW3ddLmJpdHMgIT0gOCAmJiBjYXJkLT5zaW5mb1t3XS5iaXRzICE9IDE2KQotCXx8IHRhcmdldHJhdGUgPCBzYW1wbGVyYXRlc1swXQotCXx8IHRhcmdldHJhdGUgPiBzYW1wbGVyYXRlc1s3XSkKLQlyZXR1cm4gLUVJTlZBTDsKLQotICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCi0JaWYgKHRhcmdldHJhdGUgPCAoKHNhbXBsZXJhdGVzW3hdICsgc2FtcGxlcmF0ZXNbeCArIDFdKSAvIDIpKQotCSAgICBicmVhazsKLQotICAgIGlmICh4IDwgOCkgewotCXU4IHJhdGViaXRzID0gKCh4IDw8IDQpICYgTk1fUkFURV9NQVNLKTsKLQlpZiAoY2FyZC0+c2luZm9bd10uYml0cyA9PSAxNikKLQkgICAgcmF0ZWJpdHMgfD0gTk1fUkFURV9CSVRTXzE2OwotCWlmIChjYXJkLT5zaW5mb1t3XS5zdGVyZW8pCi0JICAgIHJhdGViaXRzIHw9IE5NX1JBVEVfU1RFUkVPOwotCi0JY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IHNhbXBsZXJhdGVzW3hdOwotCi0KLQlpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldiAmJiBjYXJkLT5wbGF5aW5nKSB7Ci0JICAgIGlmIChubTI1Nl9kZWJ1ZykKLQkJcHJpbnRrIChLRVJOX0RFQlVHICJTZXR0aW5nIHBsYXkgcmF0ZWJpdHMgdG8gMHgleFxuIiwKLQkJCXJhdGViaXRzKTsKLQkgICAgbm0yNTZfbG9hZENvZWZmaWNpZW50IChjYXJkLCAwLCB4KTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwKLQkJCSAgICAgIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCi0JCQkgICAgICByYXRlYml0cyk7Ci0JfQotCi0JaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldiAmJiBjYXJkLT5yZWNvcmRpbmcpIHsKLQkgICAgaWYgKG5tMjU2X2RlYnVnKQotCQlwcmludGsgKEtFUk5fREVCVUcgIlNldHRpbmcgcmVjb3JkIHJhdGViaXRzIHRvIDB4JXhcbiIsCi0JCQlyYXRlYml0cyk7Ci0JICAgIG5tMjU2X2xvYWRDb2VmZmljaWVudCAoY2FyZCwgMSwgeCk7Ci0JICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsCi0JCQkgICAgICBOTV9SRUNPUkRfUkVHX09GRlNFVCArIE5NX1JBVEVfUkVHX09GRlNFVCwKLQkJCSAgICAgIHJhdGViaXRzKTsKLQl9Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogU3RhcnQgdGhlIHBsYXkgcHJvY2VzcyBnb2luZy4gKi8KLXN0YXRpYyB2b2lkCi1zdGFydFBsYXkgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGlmICghIGNhcmQtPnBsYXlpbmcpIHsKLQljYXJkLT5wbGF5aW5nID0gMTsKLQlpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgPT0gMCkgewotCSAgICBubTI1Nl9zZXRJbmZvIChjYXJkLT5kZXZfZm9yX3BsYXksIGNhcmQpOwotCi0JICAgIC8qIEVuYWJsZSBwbGF5YmFjayBlbmdpbmUgYW5kIGludGVycnVwdHMuICovCi0JICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcsCi0JCQkgICAgICBOTV9QTEFZQkFDS19FTkFCTEVfRkxBRyB8IE5NX1BMQVlCQUNLX0ZSRUVSVU4pOwotCi0JICAgIC8qIEVuYWJsZSBib3RoIGNoYW5uZWxzLiAqLwotCSAgICBubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fQVVESU9fTVVURV9SRUcsIDB4MCk7Ci0JfQotICAgIH0KLX0KLQotLyogCi0gKiBSZXF1ZXN0IG9uZSBjaHVuayBvZiBBTVQgYnl0ZXMgZnJvbSB0aGUgcmVjb3JkaW5nIGRldmljZS4gIFdoZW4gdGhlCi0gKiBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gQlVGRkVSIGFuZCB0aGUKLSAqIGZ1bmN0aW9uIERNQWJ1Zl9pbnB1dGludHIgd2lsbCBiZSBpbnZva2VkLgotICovCi0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9zdGFydFJlY29yZGluZyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGNoYXIgKmJ1ZmZlciwgdTMyIGFtdCkKLXsKLSAgICB1MzIgZW5kcG9zOwotICAgIGludCBlbmFibGVFbmdpbmUgPSAwOwotICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIGlmIChhbXQgPiAocmluZ3NpemUgLyAyKSkgewotCS8qCi0JICogT2YgY291cnNlIHRoaXMgd29uJ3QgYWN0dWFsbHkgd29yayByaWdodCwgYmVjYXVzZSB0aGUKLQkgKiBjYWxsZXIgaXMgZ29pbmcgdG8gYXNzdW1lIHdlIHdpbGwgZ2l2ZSB3aGF0IHdlIGdvdCBhc2tlZAotCSAqIGZvci4KLQkgKi8KLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogUmVhZCByZXF1ZXN0IHRvbyBsYXJnZTogJWRcbiIsIGFtdCk7Ci0JYW10ID0gcmluZ3NpemUgLyAyOwotICAgIH0KLQotICAgIGlmIChhbXQgPCA4KSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlYWQgcmVxdWVzdCB0b28gc21hbGw7ICVkXG4iLCBhbXQpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSdyZSBub3QgY3VycmVudGx5IHJlY29yZGluZywgc2V0IHVwIHRoZSBzdGFydCBhbmQgZW5kIHJlZ2lzdGVycwotICAgICAqIGZvciB0aGUgcmVjb3JkaW5nIGVuZ2luZS4KLSAgICAgKi8KLSAgICBpZiAoISBjYXJkLT5yZWNvcmRpbmcpIHsKLQljYXJkLT5yZWNvcmRpbmcgPSAxOwotCWlmIChubTI1Nl9ncmFiSW50ZXJydXB0IChjYXJkKSA9PSAwKSB7Ci0JICAgIGNhcmQtPmN1clJlY1BvcyA9IDA7Ci0JICAgIG5tMjU2X3NldEluZm8gKGNhcmQtPmRldl9mb3JfcmVjb3JkLCBjYXJkKTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfU1RBUlQsIGNhcmQtPmFidWYyKTsKLQkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfRU5ELAotCQkJCSBjYXJkLT5hYnVmMiArIHJpbmdzaXplKTsKLQotCSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9DVVJSUCwKLQkJCQkgY2FyZC0+YWJ1ZjIgKyBjYXJkLT5jdXJSZWNQb3MpOwotCSAgICBlbmFibGVFbmdpbmUgPSAxOwotCX0KLQllbHNlIHsKLQkgICAgLyogTm90IHN1cmUgd2hhdCBlbHNlIHRvIGRvIGhlcmUuICAqLwotCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBJZiB3ZSBoYXBwZW4gdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYSBiaXQgKGR1ZSB0byBhCi0gICAgICogZGVsYXllZCBpbnRlcnJ1cHQpIGl0J3MgT0suICBTbyBtaWdodCBhcyB3ZWxsIHNldCB0aGUgd2F0ZXJtYXJrCi0gICAgICogcmlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSB3ZSB3YW50LgotICAgICAqLwotICAgIGVuZHBvcyA9IGNhcmQtPmFidWYyICsgKChjYXJkLT5jdXJSZWNQb3MgKyBhbXQpICUgcmluZ3NpemUpOwotCi0gICAgY2FyZC0+cmVjQnVmID0gYnVmZmVyOwotICAgIGNhcmQtPnJlcXVlc3RlZFJlY0FtdCA9IGFtdDsKLSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9XTUFSSywgZW5kcG9zKTsKLSAgICAvKiBFbmFibGUgcmVjb3JkaW5nIGVuZ2luZSBhbmQgaW50ZXJydXB0cy4gKi8KLSAgICBpZiAoZW5hYmxlRW5naW5lKQotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLAotCQkJICAgIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyB8IE5NX1JFQ09SRF9GUkVFUlVOKTsKLQotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotfQotCi0vKiBTdG9wIHRoZSBwbGF5IGVuZ2luZS4gKi8KLXN0YXRpYyB2b2lkCi1zdG9wUGxheSAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogU2h1dCBvZmYgc291bmQgZnJvbSBib3RoIGNoYW5uZWxzLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBOTV9BVURJT19NVVRFX1JFRywKLQkJICAgICAgIE5NX0FVRElPX01VVEVfTEVGVCB8IE5NX0FVRElPX01VVEVfUklHSFQpOwotICAgIC8qIERpc2FibGUgcGxheSBlbmdpbmUuICovCi0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRywgMCk7Ci0gICAgaWYgKGNhcmQtPnBsYXlpbmcpIHsKLQlubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKLQotCS8qIFJlc2V0IHRoZSByZWxldmFudCBzdGF0ZSBiaXRzLiAqLwotCWNhcmQtPnBsYXlpbmcgPSAwOwotCWNhcmQtPmN1clBsYXlQb3MgPSAwOwotICAgIH0KLX0KLQotLyogU3RvcCByZWNvcmRpbmcuICovCi1zdGF0aWMgdm9pZAotc3RvcFJlY29yZCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogRGlzYWJsZSByZWNvcmRpbmcgZW5naW5lLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLCAwKTsKLQotICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpIHsKLQlubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKLQotCWNhcmQtPnJlY29yZGluZyA9IDA7Ci0JY2FyZC0+Y3VyUmVjUG9zID0gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBSaW5nIGJ1ZmZlcnMsIG1hbi4gIFRoYXQncyB3aGVyZSB0aGUgaGlwLWhvcCwgd2lsZC1uLXdvb2x5IGFjdGlvbidzIGF0LgotICogMTk3Mj8gIChXZWxsLCBJIHN1cHBvc2UgaXQgd2FzIGNoZWVwLW4tZWFzeSB0byBpbXBsZW1lbnQuKQotICoKLSAqIFdyaXRlIEFNVCBieXRlcyBvZiBCVUZGRVIgdG8gdGhlIHBsYXliYWNrIHJpbmcgYnVmZmVyLCBhbmQgc3RhcnQgdGhlCi0gKiBwbGF5YmFjayBlbmdpbmUgcnVubmluZy4gIEl0IHdpbGwgb25seSBhY2NlcHQgdXAgdG8gMS8yIG9mIHRoZSB0b3RhbAotICogc2l6ZSBvZiB0aGUgcmluZyBidWZmZXIuICBObyBjaGVjayBpcyBtYWRlIHRoYXQgd2UncmUgYWJvdXQgdG8gb3ZlcndyaXRlCi0gKiB0aGUgY3VycmVudGx5LXBsYXlpbmcgc2FtcGxlLgotICovCi0KLXN0YXRpYyB2b2lkCi1ubTI1Nl93cml0ZV9ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGNoYXIgKmJ1ZmZlciwgdTMyIGFtdCkKLXsKLSAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemU7Ci0gICAgdTMyIGVuZHN0b3A7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIGlmIChhbXQgPiAocmluZ3NpemUgLyAyKSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBXcml0ZSByZXF1ZXN0IHRvbyBsYXJnZTogJWRcbiIsIGFtdCk7Ci0JYW10ID0gKHJpbmdzaXplIC8gMik7Ci0gICAgfQotCi0gICAgaWYgKGFtdCA8IE5NMjU2X1BMQVlfV01BUktfU0laRSkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBXcml0ZSByZXF1ZXN0IHRvbyBzbWFsbDogJWRcbiIsIGFtdCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGNhcmQtPmN1clBsYXlQb3MgJT0gcmluZ3NpemU7Ci0KLSAgICBjYXJkLT5yZXF1ZXN0ZWRfYW10ID0gYW10OwotCi0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotCi0gICAgaWYgKChjYXJkLT5jdXJQbGF5UG9zICsgYW10KSA+PSByaW5nc2l6ZSkgewotCXUzMiByZW0gPSByaW5nc2l6ZSAtIGNhcmQtPmN1clBsYXlQb3M7Ci0KLQlubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciwgMSwKLQkJCSAgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcywKLQkJCSAgICAgIHJlbSk7Ci0JaWYgKGFtdCA+IHJlbSkKLQkgICAgbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIgKyByZW0sIDEsIGNhcmQtPmFidWYxLAotCQkJCSAgYW10IC0gcmVtKTsKLSAgICB9IAotICAgIGVsc2UKLQlubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciwgMSwKLQkJCSAgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcywKLQkJCSAgICAgIGFtdCk7Ci0KLSAgICAvKgotICAgICAqIFNldHVwIHRoZSBzdGFydC1uLXN0b3Atbi1saW1pdCByZWdpc3RlcnMsIGFuZCBzdGFydCB0aGF0IGVuZ2luZQotICAgICAqIGdvaW4nLiAKLSAgICAgKgotICAgICAqIE5vcm1hbGx5IHdlIGp1c3QgbGV0IGl0IHdyYXAgYXJvdW5kIHRvIGF2b2lkIHRoZSBjbGljay1jbGljawotICAgICAqIGFjdGlvbiBzY2VuZS4KLSAgICAgKi8KLSAgICBpZiAoISBjYXJkLT5wbGF5aW5nKSB7Ci0JLyogVGhlIFBCVUZGRVJfRU5EIHJlZ2lzdGVyIGluIHRoaXMgY2FzZSBwb2ludHMgdG8gb25lIHNhbXBsZQotCSAgIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCi0JaW50IHcgPSAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGNhcmQtPmRldlswXSA/IDAgOiAxKTsKLQlpbnQgc2FtcHNpemUgPSAoY2FyZC0+c2luZm9bd10uYml0cyA9PSAxNiA/IDIgOiAxKTsKLQotCWlmIChjYXJkLT5zaW5mb1t3XS5zdGVyZW8pCi0JICAgIHNhbXBzaXplICo9IDI7Ci0KLQkvKiBOZWVkIHRvIHNldCB0aGUgbm90LW5vcm1hbGx5LWNoYW5naW5nLXJlZ2lzdGVycyB1cC4gKi8KLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9TVEFSVCwKLQkJCSAgICAgY2FyZC0+YWJ1ZjEgKyBjYXJkLT5jdXJQbGF5UG9zKTsKLQlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9FTkQsCi0JCQkgICAgIGNhcmQtPmFidWYxICsgcmluZ3NpemUgLSBzYW1wc2l6ZSk7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfQ1VSUlAsCi0JCQkgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcyk7Ci0gICAgfQotICAgIGVuZHN0b3AgPSAoY2FyZC0+Y3VyUGxheVBvcyArIGFtdCAtIE5NMjU2X1BMQVlfV01BUktfU0laRSkgJSByaW5nc2l6ZTsKLSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9XTUFSSywgY2FyZC0+YWJ1ZjEgKyBlbmRzdG9wKTsKLQotICAgIGlmICghIGNhcmQtPnBsYXlpbmcpCi0Jc3RhcnRQbGF5IChjYXJkKTsKLQotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOwotfQotCi0vKiAgV2UganVzdCBnb3QgYSBjYXJkIHBsYXliYWNrIGludGVycnVwdDsgcHJvY2VzcyBpdC4gICovCi1zdGF0aWMgdm9pZAotbm0yNTZfZ2V0X25ld19ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCi17Ci0gICAgLyogQ2hlY2sgdG8gc2VlIGhvdyBtdWNoIGdvdCBwbGF5ZWQgc28gZmFyLiAqLwotICAgIHUzMiBhbXQgPSBubTI1Nl9yZWFkUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX0NVUlJQKSAtIGNhcmQtPmFidWYxOwotCi0gICAgaWYgKGFtdCA+PSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemUpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogU291bmQgcGxheWJhY2sgcG9pbnRlciBpbnZhbGlkIVxuIik7Ci0JYW10ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoYW10IDwgY2FyZC0+Y3VyUGxheVBvcykKLQlhbXQgPSAoY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplIC0gY2FyZC0+Y3VyUGxheVBvcykgKyBhbXQ7Ci0gICAgZWxzZQotCWFtdCAtPSBjYXJkLT5jdXJQbGF5UG9zOwotCi0gICAgaWYgKGNhcmQtPnJlcXVlc3RlZF9hbXQgPiAoYW10ICsgTk0yNTZfUExBWV9XTUFSS19TSVpFKSkgewotCXUzMiBlbmRzdG9wID0KLQkgICAgY2FyZC0+Y3VyUGxheVBvcyArIGNhcmQtPnJlcXVlc3RlZF9hbXQgLSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkU7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfV01BUkssIGNhcmQtPmFidWYxICsgZW5kc3RvcCk7Ci0gICAgfSAKLSAgICBlbHNlIHsKLQljYXJkLT5jdXJQbGF5UG9zICs9IGNhcmQtPnJlcXVlc3RlZF9hbXQ7Ci0JLyogR2V0IGEgbmV3IGJsb2NrIHRvIHdyaXRlLiAgVGhpcyB3aWxsIGV2ZW50dWFsbHkgaW52b2tlCi0JICAgbm0yNTZfd3JpdGVfYmxvY2sgKCkgb3Igc3RvcFBsYXkgKCkuICAqLwotCURNQWJ1Zl9vdXRwdXRpbnRyIChjYXJkLT5kZXZfZm9yX3BsYXksIDEpOwotICAgIH0KLX0KLQotLyogCi0gKiBSZWFkIHRoZSBsYXN0LXJlY29yZGVkIGJsb2NrIGZyb20gdGhlIHJpbmcgYnVmZmVyLCBjb3B5IGl0IGludG8gdGhlCi0gKiBzYXZlZCBidWZmZXIgcG9pbnRlciwgYW5kIGludm9rZSBETUF1Zl9pbnB1dGludHIoKSB3aXRoIHRoZSByZWNvcmRpbmcKLSAqIGRldmljZS4gCi0gKi8KLQotc3RhdGljIHZvaWQKLW5tMjU2X3JlYWRfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIC8qIEdyYWIgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlY29yZGluZyBwb2ludGVyLiAqLwotICAgIHUzMiBjdXJycHRyID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9DVVJSUCkgLSBjYXJkLT5hYnVmMjsKLSAgICB1MzIgYW10VG9SZWFkID0gY2FyZC0+cmVxdWVzdGVkUmVjQW10OwotICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7Ci0KLSAgICBpZiAoY3VycnB0ciA+PSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFNvdW5kIGJ1ZmZlciByZWNvcmQgcG9pbnRlciBpbnZhbGlkIVxuIik7Ci0gICAgICAgIGN1cnJwdHIgPSAwOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyB0ZXN0IGlzIHByb2JhYmx5IHJlZHVuZGFudDsgd2Ugc2hvdWxkbid0IGJlIGhlcmUgdW5sZXNzCi0gICAgICogaXQncyB0cnVlLgotICAgICAqLwotICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpIHsKLQkvKiBJZiB3ZSB3cmFwcGVkIGFyb3VuZCwgY29weSBldmVyeXRoaW5nIGZyb20gdGhlIHN0YXJ0IG9mIG91cgotCSAgIHJlY29yZGluZyBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLwotCWlmIChjdXJycHRyIDwgY2FyZC0+Y3VyUmVjUG9zKSB7Ci0JICAgIHUzMiBhbXQgPSBtaW4gKHJpbmdzaXplIC0gY2FyZC0+Y3VyUmVjUG9zLCBhbXRUb1JlYWQpOwotCi0JICAgIG5tMjU2X3JlYWRCdWZmZXI4IChjYXJkLCBjYXJkLT5yZWNCdWYsIDEsCi0JCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zLAotCQkJCSBhbXQpOwotCSAgICBhbXRUb1JlYWQgLT0gYW10OwotCSAgICBjYXJkLT5jdXJSZWNQb3MgKz0gYW10OwotCSAgICBjYXJkLT5yZWNCdWYgKz0gYW10OwotCSAgICBpZiAoY2FyZC0+Y3VyUmVjUG9zID09IHJpbmdzaXplKQotCQljYXJkLT5jdXJSZWNQb3MgPSAwOwotCX0KLQotCWlmICgoY2FyZC0+Y3VyUmVjUG9zIDwgY3VycnB0cikgJiYgKGFtdFRvUmVhZCA+IDApKSB7Ci0JICAgIHUzMiBhbXQgPSBtaW4gKGN1cnJwdHIgLSBjYXJkLT5jdXJSZWNQb3MsIGFtdFRvUmVhZCk7Ci0JICAgIG5tMjU2X3JlYWRCdWZmZXI4IChjYXJkLCBjYXJkLT5yZWNCdWYsIDEsCi0JCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zLCBhbXQpOwotCSAgICBjYXJkLT5jdXJSZWNQb3MgPSAoKGNhcmQtPmN1clJlY1BvcyArIGFtdCkgJSByaW5nc2l6ZSk7Ci0JfQotCWNhcmQtPnJlY0J1ZiA9IE5VTEw7Ci0JY2FyZC0+cmVxdWVzdGVkUmVjQW10ID0gMDsKLQlETUFidWZfaW5wdXRpbnRyIChjYXJkLT5kZXZfZm9yX3JlY29yZCk7Ci0gICAgfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuIAotICovCi1zdGF0aWMgdm9pZAotbm0yNTZfaW5pdEh3IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICAvKiBSZXNldCBldmVyeXRoaW5nLiAqLwotICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4MCwgMHgxMSk7Ci0gICAgbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIDB4MjE0LCAwKTsKLQotICAgIHN0b3BSZWNvcmQgKGNhcmQpOwotICAgIHN0b3BQbGF5IChjYXJkKTsKLX0KLQotLyogCi0gKiBIYW5kbGUgYSBwb3RlbnRpYWwgaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlIHJlZmVycmVkIHRvIGJ5IERFVl9JRC4gCi0gKgotICogSSBkb24ndCBsaWtlIHRoZSBjdXQtbi1wYXN0ZSBqb2IgaGVyZSBlaXRoZXIgYmV0d2VlbiB0aGUgdHdvIHJvdXRpbmVzLAotICogYnV0IHRoZXJlIGFyZSBzdWZmaWNpZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBpbnRlcnJ1cHQgaGFuZGxlcnMKLSAqIHRoYXQgcGFyYW1ldGVyaXppbmcgaXQgaXNuJ3QgYWxsIHRoYXQgZ3JlYXQgZWl0aGVyLiAgKENvdWxkIHVzZSBhIG1hY3JvLAotICogSSBzdXBwb3NlLi4ueXVja3kgYmxlYWguKQotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdAotbm0yNTZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXZfaWQ7Ci0gICAgdTE2IHN0YXR1czsKLSAgICBzdGF0aWMgaW50IGJhZGludHJjb3VudDsKLSAgICBpbnQgaGFuZGxlZCA9IDA7Ci0KLSAgICBpZiAoKGNhcmQgPT0gTlVMTCkgfHwgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBjYXJkIHBvaW50ZXJcbiIpOwotCXJldHVybiBJUlFfTk9ORTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBOTV9JTlRfUkVHKTsKLQotICAgIC8qIE5vdCBvdXJzLiAqLwotICAgIGlmIChzdGF0dXMgPT0gMCkgewotCWlmIChiYWRpbnRyY291bnQrKyA+IDEwMDApIHsKLQkgICAgLyoKLQkgICAgICogSSdtIG5vdCBzdXJlIGlmIHRoZSBiZXN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIGNhcmQgZnJvbQotCSAgICAgKiBwbGF5aW5nIG9yIGp1c3QgcmVsZWFzZSB0aGUgaW50ZXJydXB0IChhZnRlciBhbGwsIHdlJ3JlIGluCi0JICAgICAqIGEgYmFkIHNpdHVhdGlvbiwgc28gZG9pbmcgZmFuY3kgc3R1ZmYgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZAotCSAgICAgKiBpZGVhKS4KLQkgICAgICoKLQkgICAgICogSSB3b3JyeSBhYm91dCB0aGUgY2FyZCBlbmdpbmUgY29udGludWluZyB0byBwbGF5IG5vaXNlCi0JICAgICAqIG92ZXIgYW5kIG92ZXIsIGhvd2V2ZXItLXRoYXQgY291bGQgYmVjb21lIGEgdmVyeQotCSAgICAgKiBvYm5veGlvdXMgcHJvYmxlbS4gIEFuZCB3ZSBrbm93IHRoYXQgd2hlbiB0aGlzIHVzdWFsbHkKLQkgICAgICogaGFwcGVucyB0aGluZ3MgYXJlIGZhaXJseSBzYWZlLCBpdCBqdXN0IG1lYW5zIHRoZSB1c2VyJ3MKLQkgICAgICogaW5zZXJ0ZWQgYSBQQ01DSUEgY2FyZCBhbmQgc29tZW9uZSdzIHNwYW1taW5nIHVzIHdpdGggSVJRIDlzLgotCSAgICAgKi8KLQotCSAgICBoYW5kbGVkID0gMTsKLQkgICAgaWYgKGNhcmQtPnBsYXlpbmcpCi0JCXN0b3BQbGF5IChjYXJkKTsKLQkgICAgaWYgKGNhcmQtPnJlY29yZGluZykKLQkJc3RvcFJlY29yZCAoY2FyZCk7Ci0JICAgIGJhZGludHJjb3VudCA9IDA7Ci0JfQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotICAgIH0KLQotICAgIGJhZGludHJjb3VudCA9IDA7Ci0KLSAgICAvKiBSYXRoZXIgYm9yaW5nOyBjaGVjayBmb3IgaW5kaXZpZHVhbCBpbnRlcnJ1cHRzIGFuZCBwcm9jZXNzIHRoZW0uICovCi0KLSAgICBpZiAoc3RhdHVzICYgTk1fUExBWUJBQ0tfSU5UKSB7Ci0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTV9QTEFZQkFDS19JTlQ7Ci0JTk1fQUNLX0lOVCAoY2FyZCwgTk1fUExBWUJBQ0tfSU5UKTsKLQotCWlmIChjYXJkLT5wbGF5aW5nKQotCSAgICBubTI1Nl9nZXRfbmV3X2Jsb2NrIChjYXJkKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk1fUkVDT1JEX0lOVCkgewotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk1fUkVDT1JEX0lOVDsKLQlOTV9BQ0tfSU5UIChjYXJkLCBOTV9SRUNPUkRfSU5UKTsKLQotCWlmIChjYXJkLT5yZWNvcmRpbmcpCi0JICAgIG5tMjU2X3JlYWRfYmxvY2sgKGNhcmQpOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgJiBOTV9NSVNDX0lOVF8xKSB7Ci0JdTggY2J5dGU7Ci0KLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzE7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMVxuIik7Ci0JTk1fQUNLX0lOVCAoY2FyZCwgTk1fTUlTQ19JTlRfMSk7Ci0Jbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIE5NX0lOVF9SRUcsIDB4ODAwMCk7Ci0JY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgfCAyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk1fTUlTQ19JTlRfMikgewotCXU4IGNieXRlOwotCi0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTV9NSVNDX0lOVF8yOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOwotCU5NX0FDS19JTlQgKGNhcmQsIE5NX01JU0NfSU5UXzIpOwotCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7Ci0Jbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlICYgfjIpOwotICAgIH0KLQotICAgIC8qIFVua25vd24gaW50ZXJydXB0LiAqLwotICAgIGlmIChzdGF0dXMpIHsKLQloYW5kbGVkID0gMTsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRmlyZSBpbiB0aGUgaG9sZSEgVW5rbm93biBzdGF0dXMgMHgleFxuIiwKLQkJc3RhdHVzKTsKLQkvKiBQcmF5LiAqLwotCU5NX0FDS19JTlQgKGNhcmQsIHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQotCi0vKgotICogSGFuZGxlIGEgcG90ZW50aWFsIGludGVycnVwdCBmb3IgdGhlIGRldmljZSByZWZlcnJlZCB0byBieSBERVZfSUQuCi0gKiBUaGlzIGhhbmRsZXIgaXMgZm9yIHRoZSAyNTZaWCwgYW5kIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgbm9uLVpYCi0gKiByb3V0aW5lLgotICovCi0KLXN0YXRpYyBpcnFyZXR1cm5fdAotbm0yNTZfaW50ZXJydXB0X3p4IChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXZfaWQ7Ci0gICAgdTMyIHN0YXR1czsKLSAgICBzdGF0aWMgaW50IGJhZGludHJjb3VudDsKLSAgICBpbnQgaGFuZGxlZCA9IDA7Ci0KLSAgICBpZiAoKGNhcmQgPT0gTlVMTCkgfHwgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBjYXJkIHBvaW50ZXJcbiIpOwotCXJldHVybiBJUlFfTk9ORTsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBubTI1Nl9yZWFkUG9ydDMyIChjYXJkLCAyLCBOTV9JTlRfUkVHKTsKLQotICAgIC8qIE5vdCBvdXJzLiAqLwotICAgIGlmIChzdGF0dXMgPT0gMCkgewotCWlmIChiYWRpbnRyY291bnQrKyA+IDEwMDApIHsKLQkgICAgcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlbGVhc2luZyBpbnRlcnJ1cHQsIG92ZXIgMTAwMCBpbnZhbGlkIGludGVycnVwdHNcbiIpOwotCSAgICAvKgotCSAgICAgKiBJJ20gbm90IHN1cmUgaWYgdGhlIGJlc3QgdGhpbmcgaXMgdG8gc3RvcCB0aGUgY2FyZCBmcm9tCi0JICAgICAqIHBsYXlpbmcgb3IganVzdCByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKGFmdGVyIGFsbCwgd2UncmUgaW4KLQkgICAgICogYSBiYWQgc2l0dWF0aW9uLCBzbyBkb2luZyBmYW5jeSBzdHVmZiBtYXkgbm90IGJlIHN1Y2ggYSBnb29kCi0JICAgICAqIGlkZWEpLgotCSAgICAgKgotCSAgICAgKiBJIHdvcnJ5IGFib3V0IHRoZSBjYXJkIGVuZ2luZSBjb250aW51aW5nIHRvIHBsYXkgbm9pc2UKLQkgICAgICogb3ZlciBhbmQgb3ZlciwgaG93ZXZlci0tdGhhdCBjb3VsZCBiZWNvbWUgYSB2ZXJ5Ci0JICAgICAqIG9ibm94aW91cyBwcm9ibGVtLiAgQW5kIHdlIGtub3cgdGhhdCB3aGVuIHRoaXMgdXN1YWxseQotCSAgICAgKiBoYXBwZW5zIHRoaW5ncyBhcmUgZmFpcmx5IHNhZmUsIGl0IGp1c3QgbWVhbnMgdGhlIHVzZXIncwotCSAgICAgKiBpbnNlcnRlZCBhIFBDTUNJQSBjYXJkIGFuZCBzb21lb25lJ3Mgc3BhbW1pbmcgdXMgd2l0aCAKLQkgICAgICogSVJRIDlzLgotCSAgICAgKi8KLQotCSAgICBoYW5kbGVkID0gMTsKLQkgICAgaWYgKGNhcmQtPnBsYXlpbmcpCi0JCXN0b3BQbGF5IChjYXJkKTsKLQkgICAgaWYgKGNhcmQtPnJlY29yZGluZykKLQkJc3RvcFJlY29yZCAoY2FyZCk7Ci0JICAgIGJhZGludHJjb3VudCA9IDA7Ci0JfQotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotICAgIH0KLQotICAgIGJhZGludHJjb3VudCA9IDA7Ci0KLSAgICAvKiBSYXRoZXIgYm9yaW5nOyBjaGVjayBmb3IgaW5kaXZpZHVhbCBpbnRlcnJ1cHRzIGFuZCBwcm9jZXNzIHRoZW0uICovCi0KLSAgICBpZiAoc3RhdHVzICYgTk0yX1BMQVlCQUNLX0lOVCkgewotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk0yX1BMQVlCQUNLX0lOVDsKLQlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX1BMQVlCQUNLX0lOVCk7Ci0KLQlpZiAoY2FyZC0+cGxheWluZykKLQkgICAgbm0yNTZfZ2V0X25ld19ibG9jayAoY2FyZCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NMl9SRUNPUkRfSU5UKSB7Ci0JaGFuZGxlZCA9IDE7Ci0Jc3RhdHVzICY9IH5OTTJfUkVDT1JEX0lOVDsKLQlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX1JFQ09SRF9JTlQpOwotCi0JaWYgKGNhcmQtPnJlY29yZGluZykKLQkgICAgbm0yNTZfcmVhZF9ibG9jayAoY2FyZCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyAmIE5NMl9NSVNDX0lOVF8xKSB7Ci0JdTggY2J5dGU7Ci0KLQloYW5kbGVkID0gMTsKLQlzdGF0dXMgJj0gfk5NMl9NSVNDX0lOVF8xOwotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzFcbiIpOwotCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfTUlTQ19JTlRfMSk7Ci0JY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKLQlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgfCAyKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICYgTk0yX01JU0NfSU5UXzIpIHsKLQl1OCBjYnl0ZTsKLQotCWhhbmRsZWQgPSAxOwotCXN0YXR1cyAmPSB+Tk0yX01JU0NfSU5UXzI7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMlxuIik7Ci0JTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9NSVNDX0lOVF8yKTsKLQljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOwotCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSAmIH4yKTsKLSAgICB9Ci0KLSAgICAvKiBVbmtub3duIGludGVycnVwdC4gKi8KLSAgICBpZiAoc3RhdHVzKSB7Ci0JaGFuZGxlZCA9IDE7Ci0JcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEZpcmUgaW4gdGhlIGhvbGUhIFVua25vd24gc3RhdHVzIDB4JXhcbiIsCi0JCXN0YXR1cyk7Ci0JLyogUHJheS4gKi8KLQlOTTJfQUNLX0lOVCAoY2FyZCwgc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Ci19Ci0KLS8qIAotICogUmVxdWVzdCBvdXIgaW50ZXJydXB0LgotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9ncmFiSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpZiAoY2FyZC0+aGFzX2lycSsrID09IDApIHsKLQlpZiAocmVxdWVzdF9pcnEgKGNhcmQtPmlycSwgY2FyZC0+aW50cm91dGluZSwgSVJRRl9TSEFSRUQsCi0JCQkgIk5NMjU2X2F1ZGlvIiwgY2FyZCkgPCAwKSB7Ci0JICAgIHByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBjYW4ndCBvYnRhaW4gSVJRICVkXG4iLCBjYXJkLT5pcnEpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogCi0gKiBSZWxlYXNlIG91ciBpbnRlcnJ1cHQuIAotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICBpZiAoY2FyZC0+aGFzX2lycSA8PSAwKSB7Ci0JcHJpbnRrIChLRVJOX0VSUiAibm0yNTY6IHRvbyBtYW55IGNhbGxzIHRvIHJlbGVhc2VJbnRlcnJ1cHRcbiIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgY2FyZC0+aGFzX2lycS0tOwotICAgIGlmIChjYXJkLT5oYXNfaXJxID09IDApIHsKLQlmcmVlX2lycSAoY2FyZC0+aXJxLCBjYXJkKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXYWl0cyBmb3IgdGhlIG1peGVyIHRvIGJlY29tZSByZWFkeSB0byBiZSB3cml0dGVuOyByZXR1cm5zIGEgemVybyB2YWx1ZQotICogaWYgaXQgdGltZWQgb3V0LgotICovCi0KLXN0YXRpYyBpbnQKLW5tMjU2X2lzUmVhZHkgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOwotICAgIGludCB0MiA9IDEwOwotICAgIHUzMiB0ZXN0YWRkcjsKLSAgICB1MTYgdGVzdGI7Ci0gICAgaW50IGRvbmUgPSAwOwotCi0gICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiBpc1JlYWR5IVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdGVzdGFkZHIgPSBjYXJkLT5taXhlcl9zdGF0dXNfb2Zmc2V0OwotICAgIHRlc3RiID0gY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2s7Ci0KLSAgICAvKiAKLSAgICAgKiBMb29wIGFyb3VuZCB3YWl0aW5nIGZvciB0aGUgbWl4ZXIgdG8gYmVjb21lIHJlYWR5LiAKLSAgICAgKi8KLSAgICB3aGlsZSAoISBkb25lICYmIHQyLS0gPiAwKSB7Ci0JaWYgKChubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCB0ZXN0YWRkcikgJiB0ZXN0YikgPT0gMCkKLQkgICAgZG9uZSA9IDE7Ci0JZWxzZQotCSAgICB1ZGVsYXkgKDEwMCk7Ci0gICAgfQotICAgIHJldHVybiBkb25lOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgQUM5NyBtaXhlciByZWdpc3RlciBSRUcuICBSZXR1cm5zIGEgcG9zaXRpdmUKLSAqIHZhbHVlIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotc3RhdGljIGludAotbm0yNTZfcmVhZEFDOTdSZWcgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZykKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7Ci0KLSAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIHJlYWRBQzk3UmVnIVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKHJlZyA8IDEyOCkgewotCWludCByZXM7Ci0KLQlubTI1Nl9pc1JlYWR5IChkZXYpOwotCXJlcyA9IG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIGNhcmQtPm1peGVyICsgcmVnKTsKLQkvKiBNYWdpYyBkZWxheS4gIEJsZWFoIHl1Y2t5LiAgKi8KLSAgICAgICAgdWRlbGF5ICgxMDAwKTsKLQlyZXR1cm4gcmVzOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qIAotICogV3JpdGVzIFZBTFVFIHRvIEFDOTcgbWl4ZXIgcmVnaXN0ZXIgUkVHLiAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yCi0gKiBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuIAotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl93cml0ZUFDOTdSZWcgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKQotewotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgaW50IHRyaWVzID0gMjsKLSAgICBpbnQgZG9uZSA9IDA7Ci0gICAgdTMyIGJhc2U7Ci0KLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldi0+ZHJpdmVyX3ByaXZhdGU7Ci0KLSAgICBpZiAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgbWFnaWMgc2lnbmF0dXJlIGluIHdyaXRlQUM5N1JlZyFcbiIpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGJhc2UgPSBjYXJkLT5taXhlcjsKLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKLQotICAgIG5tMjU2X2lzUmVhZHkgKGRldik7Ci0KLSAgICAvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gdGFrZSwgdG9vLiAqLwotICAgIHdoaWxlICgodHJpZXMtLSA+IDApICYmICFkb25lKSB7Ci0Jbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIGJhc2UgKyByZWcsIHZhbHVlKTsKLQlpZiAobm0yNTZfaXNSZWFkeSAoZGV2KSkgewotCSAgICBkb25lID0gMTsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgfQotCi0gICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jayxmbGFncyk7Ci0gICAgdWRlbGF5ICgxMDAwKTsKLQotICAgIHJldHVybiAhIGRvbmU7Ci19Ci0KLS8qIAotICogSW5pdGlhbCByZWdpc3RlciB2YWx1ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgQUM5NyBtaXhlci4KLSAqIFdoaWxlIG1vc3Qgb2YgdGhlc2UgYXJlIGlkZW50aWNhbCB0byB0aGUgcmVzZXQgdmFsdWVzLCB3ZSBkbyB0aGlzCi0gKiBzbyB0aGF0IHdlIGhhdmUgbW9zdCBvZiB0aGUgcmVnaXN0ZXIgY29udGVudHMgY2FjaGVkLS10aGlzIGF2b2lkcwotICogcmVhZGluZyBmcm9tIHRoZSBtaXhlciBkaXJlY3RseSAod2hpY2ggc2VlbXMgdG8gYmUgcHJvYmxlbWF0aWMsCi0gKiBwcm9iYWJseSBkdWUgdG8gaWdub3JhbmNlKS4KLSAqLwotc3RydWN0IGluaXRpYWxWYWx1ZXMgCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLSAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5pdGlhbFZhbHVlcyBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW10gPSAKLXsKLSAgICB7IEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIDB4ODAwMCB9LAotICAgIHsgQUM5N19IRUFEUEhPTkVfVk9MLCAgICAgMHg4MDAwIH0sCi0gICAgeyBBQzk3X01BU1RFUl9WT0xfTU9OTywgICAweDAwMDAgfSwKLSAgICB7IEFDOTdfUENCRUVQX1ZPTCwgICAgICAgIDB4MDAwMCB9LAotICAgIHsgQUM5N19QSE9ORV9WT0wsICAgICAgICAgMHgwMDA4IH0sCi0gICAgeyBBQzk3X01JQ19WT0wsICAgICAgICAgICAweDgwMDAgfSwKLSAgICB7IEFDOTdfTElORUlOX1ZPTCwgICAgICAgIDB4ODgwOCB9LAotICAgIHsgQUM5N19DRF9WT0wsICAgICAgICAgICAgMHg4ODA4IH0sCi0gICAgeyBBQzk3X1ZJREVPX1ZPTCwgICAgICAgICAweDg4MDggfSwKLSAgICB7IEFDOTdfQVVYX1ZPTCwgICAgICAgICAgIDB4ODgwOCB9LAotICAgIHsgQUM5N19QQ01PVVRfVk9MLCAgICAgICAgMHgwODA4IH0sCi0gICAgeyBBQzk3X1JFQ09SRF9TRUxFQ1QsICAgICAweDAwMDAgfSwKLSAgICB7IEFDOTdfUkVDT1JEX0dBSU4sICAgICAgIDB4MEIwQiB9LAotICAgIHsgQUM5N19HRU5FUkFMX1BVUlBPU0UsICAgMHgwMDAwIH0sCi0gICAgeyAweGZmZmYsIDB4ZmZmZiB9Ci19OwotCi0vKiBJbml0aWFsaXplIHRoZSBBQzk3IGludG8gYSBrbm93biBzdGF0ZS4gICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9yZXNldEFDOTcgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOwotICAgIGludCB4OwotCi0gICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiByZXNldEFDOTchXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICAvKiBSZXNldCB0aGUgbWl4ZXIuICAnVGlzIG1hZ2ljISAgKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjMCwgMSk7Ci0vLyAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2Y2MsIDB4ODcpOwkvKiBUaGlzIGNyYXNoZXMgRGVsbCBsYXRpdHVkZXMgKi8KLSAgICBubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDZjYywgMHg4MCk7Ci0gICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2Y2MsIDB4MCk7Ci0KLSAgICBpZiAoISBjYXJkLT5taXhlcl92YWx1ZXNfaW5pdCkgewotCWZvciAoeCA9IDA7IG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbeF0ucG9ydCAhPSAweGZmZmY7IHgrKykgewotCSAgICBhYzk3X3B1dF9yZWdpc3RlciAoZGV2LAotCQkJICAgICAgIG5tMjU2X2FjOTdfaW5pdGlhbF92YWx1ZXNbeF0ucG9ydCwKLQkJCSAgICAgICBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW3hdLnZhbHVlKTsKLQkgICAgY2FyZC0+bWl4ZXJfdmFsdWVzX2luaXQgPSAxOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdlIGRvbid0IGRvIGFueXRoaW5nIHBhcnRpY3VsYXJseSBzcGVjaWFsIGhlcmU7IGl0IGp1c3QgcGFzc2VzIHRoZQotICogbWl4ZXIgaW9jdGwgdG8gdGhlIEFDOTcgZHJpdmVyLgotICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9kZWZhdWx0X21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkX2Zvcl9taXhlciAoZGV2KTsKLSAgICBpZiAoY2FyZCAhPSBOVUxMKQotCXJldHVybiBhYzk3X21peGVyX2lvY3RsICgmKGNhcmQtPm1kZXYpLCBjbWQsIGFyZyk7Ci0gICAgZWxzZQotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgbm0yNTZfbWl4ZXJfb3BlcmF0aW9ucyA9IHsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiTmVvTWFnaWMiLAotCS5uYW1lCT0gIk5NMjU2QUM5N01peGVyIiwKLQkuaW9jdGwJPSBubTI1Nl9kZWZhdWx0X21peGVyX2lvY3RsCi19OwotCi0vKgotICogRGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIE9TUyBtaXhlci4gIFRoZXNlIGFyZSBzZXQgbGFzdCwgYWZ0ZXIgdGhlCi0gKiBtaXhlciBpcyBpbml0aWFsaXplZC4KLSAqCi0gKiBJICJsb3ZlIiBDIHNvbWV0aW1lcy4gIEdvdCBicmFjZXM/Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgYWM5N19taXhlcl92YWx1ZV9saXN0IG1peGVyX2RlZmF1bHRzW10gPSB7Ci0gICAgeyBTT1VORF9NSVhFUl9WT0xVTUUsICB7IHsgODUsIDg1IH0gfSB9LAotICAgIHsgU09VTkRfTUlYRVJfU1BFQUtFUiwgeyB7IDEwMCB9IH0gfSwKLSAgICB7IFNPVU5EX01JWEVSX1BDTSwgICAgIHsgeyA2NSwgNjUgfSB9IH0sCi0gICAgeyBTT1VORF9NSVhFUl9DRCwgICAgICB7IHsgNjUsIDY1IH0gfSB9LAotICAgIHsgLTEsICAgICAgICAgICAgICAgICAgeyAgeyAwLCAgMCB9IH0gfQotfTsKLQotCi0vKiBJbnN0YWxscyB0aGUgQUM5NyBtaXhlciBpbnRvIENBUkQuICAqLwotc3RhdGljIGludCBfX2RldmluaXQKLW5tMjU2X2luc3RhbGxfbWl4ZXIgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIGludCBtaXhlcjsKLQotICAgIGNhcmQtPm1kZXYucmVzZXRfZGV2aWNlID0gbm0yNTZfcmVzZXRBQzk3OwotICAgIGNhcmQtPm1kZXYucmVhZF9yZWcgPSBubTI1Nl9yZWFkQUM5N1JlZzsKLSAgICBjYXJkLT5tZGV2LndyaXRlX3JlZyA9IG5tMjU2X3dyaXRlQUM5N1JlZzsKLSAgICBjYXJkLT5tZGV2LmRyaXZlcl9wcml2YXRlID0gKHZvaWQgKiljYXJkOwotCi0gICAgaWYgKGFjOTdfaW5pdCAoJihjYXJkLT5tZGV2KSkpCi0JcmV0dXJuIC0xOwotCi0gICAgbWl4ZXIgPSBzb3VuZF9hbGxvY19taXhlcmRldigpOwotICAgIGlmIChudW1fbWl4ZXJzID49IE1BWF9NSVhFUl9ERVYpIHsKLQlwcmludGsgKCJOTTI1NiBtaXhlcjogVW5hYmxlIHRvIGFsbG9jIG1peGVyZGV2XG4iKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbWl4ZXJfZGV2c1ttaXhlcl0gPSAmbm0yNTZfbWl4ZXJfb3BlcmF0aW9uczsKLSAgICBjYXJkLT5taXhlcl9vc3NfZGV2ID0gbWl4ZXI7Ci0KLSAgICAvKiBTb21lIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMuICAqLwotICAgIGFjOTdfc2V0X3ZhbHVlcyAoJihjYXJkLT5tZGV2KSwgbWl4ZXJfZGVmYXVsdHMpOwotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZWQgQUM5NyBtaXhlclxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIAotICogU2VlIGlmIHRoZSBzaWduYXR1cmUgbGVmdCBieSB0aGUgTk0yNTYgQklPUyBpcyBpbnRhY3Q7IGlmIHNvLCB3ZSB1c2UKLSAqIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgYXMgdGhlIGVuZCBvZiBvdXIgYXVkaW8gYnVmZmVyIGluIHRoZSB2aWRlbwotICogUkFNLgotICovCi0KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdAotbm0yNTZfcGVla19mb3Jfc2lnIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKLXsKLSAgICB1MzIgcG9ydDFvZmZzZXQgCi0JPSBjYXJkLT5wb3J0WzBdLnBoeXNhZGRyICsgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gMHgwNDAwOwotICAgIC8qIFRoZSBzaWduYXR1cmUgaXMgbG9jYXRlZCAxSyBiZWxvdyB0aGUgZW5kIG9mIHZpZGVvIFJBTS4gICovCi0gICAgY2hhciBfX2lvbWVtICp0ZW1wID0gaW9yZW1hcF9ub2NhY2hlIChwb3J0MW9mZnNldCwgMTYpOwotICAgIC8qIERlZmF1bHQgYnVmZmVyIGVuZCBpcyA1MTIwIGJ5dGVzIGJlbG93IHRoZSB0b3Agb2YgUkFNLiAgKi8KLSAgICB1MzIgZGVmYXVsdF92YWx1ZSA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDB4MTQwMDsKLSAgICB1MzIgc2lnOwotCi0gICAgLyogSW5zdGFsbCB0aGUgZGVmYXVsdCB2YWx1ZSBmaXJzdCwgc28gd2UgZG9uJ3QgaGF2ZSB0byByZXBlYXRlZGx5Ci0gICAgICAgZG8gaXQgaWYgdGhlcmUgaXMgYSBwcm9ibGVtLiAgKi8KLSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBkZWZhdWx0X3ZhbHVlOwotCi0gICAgaWYgKHRlbXAgPT0gTlVMTCkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBVbmFibGUgdG8gc2NhbiBmb3IgY2FyZCBzaWduYXR1cmUgaW4gdmlkZW8gUkFNXG4iKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHNpZyA9IHJlYWRsICh0ZW1wKTsKLSAgICBpZiAoKHNpZyAmIE5NX1NJR19NQVNLKSA9PSBOTV9TSUdOQVRVUkUpIHsKLQl1MzIgcG9pbnRlciA9IHJlYWRsICh0ZW1wICsgNCk7Ci0KLQkvKgotCSAqIElmIGl0J3Mgb2J2aW91c2x5IGludmFsaWQsIGRvbid0IHVzZSBpdCAodGhlIHBvcnQgYWxyZWFkeSBoYXMgYQotCSAqIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgc2V0KS4KLQkgKi8KLQlpZiAocG9pbnRlciAhPSAweGZmZmZmZmZmKQotCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBwb2ludGVyOwotCi0JcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBGb3VuZCBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU06IDB4JXhcbiIsCi0JCXBvaW50ZXIpOwotICAgIH0KLQotICAgIGlvdW5tYXAgKHRlbXApOwotfQotCi0vKiAKLSAqIEluc3RhbGwgYSBkcml2ZXIgZm9yIHRoZSBQQ0kgZGV2aWNlIHJlZmVyZW5jZWQgYnkgUENJREVWLgotICogVkVSU1RSIGlzIGEgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBzdHJpbmcuCi0gKi8KLQotc3RhdGljIGludCBfX2RldmluaXQKLW5tMjU2X2luc3RhbGwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgZW51bSBubTI1NnJldiByZXYsIGNoYXIgKnZlcnN0cikKLXsKLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZDsKLSAgICBpbnQgeDsKLQotICAgIGlmIChwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKQotCSAgICByZXR1cm4gMDsKLQotICAgIGNhcmQgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBubTI1Nl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKGNhcmQgPT0gTlVMTCkgewotCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBvdXQgb2YgbWVtb3J5IVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2FyZC0+bWFnc2lnID0gTk1fTUFHSUNfU0lHOwotICAgIGNhcmQtPnBsYXlpbmcgID0gMDsKLSAgICBjYXJkLT5yZWNvcmRpbmcgPSAwOwotICAgIGNhcmQtPnJldiA9IHJldjsKLSAgICBzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7Ci0KLSAgICAvKiBJbml0IHRoZSBtZW1vcnkgcG9ydCBpbmZvLiAgKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JY2FyZC0+cG9ydFt4XS5waHlzYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpZGV2LCB4KTsKLQljYXJkLT5wb3J0W3hdLnB0ciA9IE5VTEw7Ci0JY2FyZC0+cG9ydFt4XS5zdGFydF9vZmZzZXQgPSAwOwotCWNhcmQtPnBvcnRbeF0uZW5kX29mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgLyogUG9ydCAyIGlzIGVhc3kuICAqLwotICAgIGNhcmQtPnBvcnRbMV0uc3RhcnRfb2Zmc2V0ID0gMDsKLSAgICBjYXJkLT5wb3J0WzFdLmVuZF9vZmZzZXQgPSBOTV9QT1JUMl9TSVpFOwotCi0gICAgLyogWXVjay4gIEJ1dCB3ZSBoYXZlIHRvIG1hcCBpbiBwb3J0IDIgc28gd2UgY2FuIGNoZWNrIGhvdyBtdWNoIFJBTSB0aGUKLSAgICAgICBjYXJkIGhhcy4gICovCi0gICAgaWYgKG5tMjU2X3JlbWFwX3BvcnRzIChjYXJkKSkgewotCWtmcmVlIChjYXJkKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBUaGUgTk0yNTYgaGFzIHR3byBtZW1vcnkgcG9ydHMuICBUaGUgZmlyc3QgcG9ydCBpcyBub3RoaW5nCi0gICAgICogbW9yZSB0aGFuIGEgY2h1bmsgb2YgdmlkZW8gUkFNLCB3aGljaCBpcyB1c2VkIGFzIHRoZSBJL08gcmluZwotICAgICAqIGJ1ZmZlci4gIFRoZSBzZWNvbmQgcG9ydCBoYXMgdGhlIGFjdHVhbCBqdWljeSBzdHVmZiAobGlrZSB0aGUKLSAgICAgKiBtaXhlciBhbmQgdGhlIHBsYXliYWNrIGVuZ2luZSBjb250cm9sIHJlZ2lzdGVycykuCi0gICAgICovCi0KLSAgICBpZiAoY2FyZC0+cmV2ID09IFJFVl9OTTI1NkFWKSB7Ci0JLyogT2ssIHRyeSB0byBzZWUgaWYgdGhpcyBpcyBhIG5vbi1BQzk3IHZlcnNpb24gb2YgdGhlIGhhcmR3YXJlLiAqLwotCWludCBwdmFsID0gbm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgTk1fTUlYRVJfUFJFU0VOQ0UpOwotCWlmICgocHZhbCAmIE5NX1BSRVNFTkNFX01BU0spICE9IE5NX1BSRVNFTkNFX1ZBTFVFKSB7Ci0JICAgIGlmICghIGZvcmNlX2xvYWQpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFRoaXMgZG9lc24ndCBsb29rIHRvIG1lIGxpa2UgdGhlIEFDOTctY29tcGF0aWJsZSB2ZXJzaW9uLlxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBZb3UgY2FuIGZvcmNlIHRoZSBkcml2ZXIgdG8gbG9hZCBieSBwYXNzaW5nIGluIHRoZSBtb2R1bGVcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgcGFyYW1ldGVyOlxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICAgICAgICAgZm9yY2VfbG9hZCA9IDFcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICJcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgTW9yZSBsaWtlbHksIHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFNCLTE2IG9yXG4iKTsKLQkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIENTNDIzMiBkcml2ZXIgaW5zdGVhZC4gIChJZiB5b3VyIEJJT1MgaGFzIHNldHRpbmdzIGZvclxuIik7Ci0JCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBJUlEgYW5kL29yIERNQSBmb3IgdGhlIHNvdW5kIGNhcmQsIHRoaXMgaXMgKm5vdCogdGhlIGNvcnJlY3RcbiIpOwotCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgZHJpdmVyIHRvIHVzZS4pXG4iKTsKLQkJbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JCWtmcmVlIChjYXJkKTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogRm9yY2luZyBkcml2ZXIgbG9hZCBhcyBwZXIgdXNlciByZXF1ZXN0LlxuIik7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JIC8qICAgcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBDb25ncmF0dWxhdGlvbnMuIFlvdSdyZSBub3QgcnVubmluZyBFdW5pY2UuXG4iKSovOwotCX0KLQljYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSAyNTYwICogMTAyNDsKLQljYXJkLT5pbnRyb3V0aW5lID0gbm0yNTZfaW50ZXJydXB0OwotCWNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQgPSBOTV9NSVhFUl9TVEFUVVNfT0ZGU0VUOwotCWNhcmQtPm1peGVyX3N0YXR1c19tYXNrID0gTk1fTUlYRVJfUkVBRFlfTUFTSzsKLSAgICB9IAotICAgIGVsc2UgewotCS8qIE5vdCBzdXJlIGlmIHRoZXJlIGlzIGFueSByZWxldmFudCBkZXRlY3QgZm9yIHRoZSBaWCBvciBub3QuICAqLwotCWlmIChubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4YTBiKSAhPSAwKQotCSAgICBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSA2MTQ0ICogMTAyNDsKLQllbHNlCi0JICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDQwOTYgKiAxMDI0OwotCi0JY2FyZC0+aW50cm91dGluZSA9IG5tMjU2X2ludGVycnVwdF96eDsKLQljYXJkLT5taXhlcl9zdGF0dXNfb2Zmc2V0ID0gTk0yX01JWEVSX1NUQVRVU19PRkZTRVQ7Ci0JY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2sgPSBOTTJfTUlYRVJfUkVBRFlfTUFTSzsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVydG9wID49IDk4MzA0ICYmIGJ1ZmZlcnRvcCA8IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCkKLQljYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgPSBidWZmZXJ0b3A7Ci0gICAgZWxzZQotCW5tMjU2X3BlZWtfZm9yX3NpZyAoY2FyZCk7Ci0KLSAgICBjYXJkLT5wb3J0WzBdLnN0YXJ0X29mZnNldCA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIDk4MzA0OwotCi0gICAgcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBNYXBwaW5nIHBvcnQgMSBmcm9tIDB4JXggLSAweCV4XG4iLAotCSAgICBjYXJkLT5wb3J0WzBdLnN0YXJ0X29mZnNldCwgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0KTsKLQotICAgIGlmIChubTI1Nl9yZW1hcF9wb3J0cyAoY2FyZCkpIHsKLQlrZnJlZSAoY2FyZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogU2VlIGlmIHdlIGNhbiBnZXQgdGhlIGludGVycnVwdC4gKi8KLQotICAgIGNhcmQtPmlycSA9IHBjaWRldi0+aXJxOwotICAgIGNhcmQtPmhhc19pcnEgPSAwOwotCi0gICAgaWYgKG5tMjU2X2dyYWJJbnRlcnJ1cHQgKGNhcmQpICE9IDApIHsKLQlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKLQlrZnJlZSAoY2FyZCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbm0yNTZfcmVsZWFzZUludGVycnVwdCAoY2FyZCk7Ci0KLSAgICAvKgotICAgICAqCUluaXQgdGhlIGJvYXJkLgotICAgICAqLwotCi0gICAgY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplID0gMTYzODQ7Ci0gICAgY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZSA9IDE2Mzg0OwotCi0gICAgY2FyZC0+Y29lZmZCdWYgPSBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSBOTV9NQVhfQ09FRkZJQ0lFTlQ7Ci0gICAgY2FyZC0+YWJ1ZjIgPSBjYXJkLT5jb2VmZkJ1ZiAtIGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7Ci0gICAgY2FyZC0+YWJ1ZjEgPSBjYXJkLT5hYnVmMiAtIGNhcmQtPnBsYXliYWNrQnVmZmVyU2l6ZTsKLSAgICBjYXJkLT5hbGxDb2VmZkJ1ZiA9IGNhcmQtPmFidWYyIC0gKE5NX1RPVEFMX0NPRUZGX0NPVU5UICogNCk7Ci0KLSAgICAvKiBGaXhlZCBzZXR0aW5nLiAqLwotICAgIGNhcmQtPm1peGVyID0gTk1fTUlYRVJfT0ZGU0VUOwotICAgIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0ID0gMDsKLQotICAgIGNhcmQtPmlzX29wZW5fcGxheSA9IDA7Ci0gICAgY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAwOwotCi0gICAgY2FyZC0+Y29lZmZzQ3VycmVudCA9IDA7Ci0KLSAgICBjYXJkLT5vcGVuY250WzBdID0gMDsgY2FyZC0+b3BlbmNudFsxXSA9IDA7Ci0KLSAgICAvKiBSZWFzb25hYmxlIGRlZmF1bHQgc2V0dGluZ3MsIGJ1dCBsYXJnZWx5IHVubmVjZXNzYXJ5LiAqLwotICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKLQljYXJkLT5zaW5mb1t4XS5iaXRzID0gODsKLQljYXJkLT5zaW5mb1t4XS5zdGVyZW8gPSAwOwotCWNhcmQtPnNpbmZvW3hdLnNhbXBsZXJhdGUgPSA4MDAwOwotICAgIH0KLQotICAgIG5tMjU2X2luaXRIdyAoY2FyZCk7Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0JaWYgKChjYXJkLT5kZXZbeF0gPQotCSAgICAgc291bmRfaW5zdGFsbF9hdWRpb2RydihBVURJT19EUklWRVJfVkVSU0lPTiwKLQkJCQkgICAgIk5NMjU2IiwgJm5tMjU2X2F1ZGlvX2RyaXZlciwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAotCQkJCSAgICBETUFfTk9ETUEsIEFGTVRfVTggfCBBRk1UX1MxNl9MRSwKLQkJCQkgICAgTlVMTCwgLTEsIC0xKSkgPj0gMCkgewotCSAgICAvKiAxSyBtaW5pbXVtIGJ1ZmZlciBzaXplLiAqLwotCSAgICBhdWRpb19kZXZzW2NhcmQtPmRldlt4XV0tPm1pbl9mcmFnbWVudCA9IDEwOwotCSAgICAvKiBNYXhpbXVtIG9mIDhLIGJ1ZmZlciBzaXplLiAqLwotCSAgICBhdWRpb19kZXZzW2NhcmQtPmRldlt4XV0tPm1heF9mcmFnbWVudCA9IDEzOwotCX0KLQllbHNlIHsKLQkgICAgcHJpbnRrKEtFUk5fRVJSICJOTTI1NjogVG9vIG1hbnkgUENNIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKLQkgICAgbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JICAgIGtmcmVlIChjYXJkKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAgIHBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsY2FyZCk7Ci0KLSAgICAvKiBJbnNlcnQgdGhlIGNhcmQgaW4gdGhlIGxpc3QuICAqLwotICAgIGNhcmQtPm5leHRfY2FyZCA9IG5tY2FyZF9saXN0OwotICAgIG5tY2FyZF9saXN0ID0gY2FyZDsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemVkIE5lb01hZ2ljICVzIGF1ZGlvIGluIFBDSSBuYXRpdmUgbW9kZVxuIiwKLQkgICB2ZXJzdHIpOwotCi0gICAgLyogCi0gICAgICogQW5kIG91ciBtaXhlci4gIChXZSBzaG91bGQgYWxsb3cgc3VwcG9ydCBmb3Igb3RoZXIgbWl4ZXJzLCBtYXliZS4pCi0gICAgICovCi0KLSAgICBubTI1Nl9pbnN0YWxsX21peGVyIChjYXJkKTsKLQotICAgIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0Ci1ubTI1Nl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKLXsKLSAgICBpZiAocGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NkFWX0FVRElPKQotCXJldHVybiBubTI1Nl9pbnN0YWxsKHBjaWRldiwgUkVWX05NMjU2QVYsICIyNTZBViIpOwotICAgIGlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WlhfQVVESU8pCi0JcmV0dXJuIG5tMjU2X2luc3RhbGwocGNpZGV2LCBSRVZfTk0yNTZaWCwgIjI1NlpYIik7Ci0gICAgaWYgKHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZYTF9QTFVTX0FVRElPKQotCXJldHVybiBubTI1Nl9pbnN0YWxsKHBjaWRldiwgUkVWX05NMjU2WlgsICIyNTZYTCsiKTsKLSAgICByZXR1cm4gLTE7IC8qIHNob3VsZCBub3QgY29tZSBoZXJlIC4uLiAqLwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmluaXQKLW5tMjU2X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KSB7Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKnhjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsKm5leHRfY2FyZCA9IE5VTEw7Ci0KLSAgICBmb3IgKGNhcmQgPSBubWNhcmRfbGlzdDsgY2FyZCAhPSBOVUxMOyBjYXJkID0gbmV4dF9jYXJkKSB7Ci0JbmV4dF9jYXJkID0gY2FyZC0+bmV4dF9jYXJkOwotCWlmIChjYXJkID09IHhjYXJkKSB7Ci0JICAgIHN0b3BQbGF5IChjYXJkKTsKLQkgICAgc3RvcFJlY29yZCAoY2FyZCk7Ci0JICAgIGlmIChjYXJkLT5oYXNfaXJxKQotCQlmcmVlX2lycSAoY2FyZC0+aXJxLCBjYXJkKTsKLQkgICAgbm0yNTZfcmVsZWFzZV9wb3J0cyAoY2FyZCk7Ci0JICAgIHNvdW5kX3VubG9hZF9taXhlcmRldiAoY2FyZC0+bWl4ZXJfb3NzX2Rldik7Ci0JICAgIHNvdW5kX3VubG9hZF9hdWRpb2RldiAoY2FyZC0+ZGV2WzBdKTsKLQkgICAgc291bmRfdW5sb2FkX2F1ZGlvZGV2IChjYXJkLT5kZXZbMV0pOwotCSAgICBrZnJlZSAoY2FyZCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgaWYgKG5tY2FyZF9saXN0ID09IGNhcmQpCi0gICAgCW5tY2FyZF9saXN0ID0gbmV4dF9jYXJkOwotfQotCi0vKgotICogT3BlbiB0aGUgZGV2aWNlCi0gKgotICogREVWICAtIGRldmljZQotICogTU9ERSAtIG1vZGUgdG8gb3BlbiBkZXZpY2UgKGxvZ2ljYWwgT1Igb2YgT1BFTl9SRUFEIGFuZCBPUEVOX1dSSVRFKQotICoKLSAqIENhbGxlZCB3aGVuIG9wZW5pbmcgdGhlIERNQWJ1ZiAgICAgICAgICAgICAgIChkbWFidWYuYzoyNTkpCi0gKi8KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX29wZW4oaW50IGRldiwgaW50IG1vZGUpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0gICAgaW50IHc7Ci0JCi0gICAgaWYgKGNhcmQgPT0gTlVMTCkKLQlyZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQotCXcgPSAwOwotICAgIGVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JdyA9IDE7Ci0gICAgZWxzZQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGNhcmQtPm9wZW5jbnRbd10gPiAwKQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICAvKiBObyBiaXRzIHNldD8gSHVoPyAqLwotICAgIGlmICghICgobW9kZSAmIE9QRU5fUkVBRCkgfHwgKG1vZGUgJiBPUEVOX1dSSVRFKSkpCi0JcmV0dXJuIC1FSU87Ci0KLSAgICAvKgotICAgICAqIElmIGl0J3Mgb3BlbiBmb3IgYm90aCByZWFkIGFuZCB3cml0ZSwgYW5kIHRoZSBjYXJkJ3MgY3VycmVudGx5Ci0gICAgICogYmVpbmcgcmVhZCBvciB3cml0dGVuIHRvLCB0aGVuIGRvIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGhhcwotICAgICAqIGFscmVhZHkgYmVlbiBkb25lLiAgT3RoZXJ3aXNlLCBkb24ndCBzcGVjaWZ5IGFueSBtb2RlIHVudGlsIHRoZQotICAgICAqIHVzZXIgYWN0dWFsbHkgdHJpZXMgdG8gZG8gSS9PLiAgKFNvbWUgcHJvZ3JhbXMgb3BlbiB0aGUgZGV2aWNlCi0gICAgICogZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUsIGJ1dCBvbmx5IGFjdHVhbGx5IGRvIHJlYWRpbmcgb3Igd3JpdGluZy4pCi0gICAgICovCi0KLSAgICBpZiAoKG1vZGUgJiBPUEVOX1dSSVRFKSAmJiAobW9kZSAmIE9QRU5fUkVBRCkpIHsKLQlpZiAoY2FyZC0+aXNfb3Blbl9wbGF5KQotCSAgICBtb2RlID0gT1BFTl9XUklURTsKLQllbHNlIGlmIChjYXJkLT5pc19vcGVuX3JlY29yZCkKLQkgICAgbW9kZSA9IE9QRU5fUkVBRDsKLQllbHNlIG1vZGUgPSAwOwotICAgIH0KLQkKLSAgICBpZiAobW9kZSAmIE9QRU5fV1JJVEUpIHsKLQlpZiAoY2FyZC0+aXNfb3Blbl9wbGF5ID09IDApIHsKLQkgICAgY2FyZC0+ZGV2X2Zvcl9wbGF5ID0gZGV2OwotCSAgICBjYXJkLT5pc19vcGVuX3BsYXkgPSAxOwotCX0KLQllbHNlCi0JICAgIHJldHVybiAtRUJVU1k7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgJiBPUEVOX1JFQUQpIHsKLQlpZiAoY2FyZC0+aXNfb3Blbl9yZWNvcmQgPT0gMCkgewotCSAgICBjYXJkLT5kZXZfZm9yX3JlY29yZCA9IGRldjsKLQkgICAgY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAxOwotCX0KLQllbHNlCi0JICAgIHJldHVybiAtRUJVU1k7Ci0gICAgfQotCi0gICAgY2FyZC0+b3BlbmNudFt3XSsrOwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogQ2xvc2UgdGhlIGRldmljZQotICoKLSAqIERFViAgLSBkZXZpY2UKLSAqCi0gKiBDYWxsZWQgd2hlbiBjbG9zaW5nIHRoZSBETUFidWYgICAgICAgICAgICAgICAoZG1hYnVmLmM6NDc3KQotICogICAgICBhZnRlciBoYWx0X3hmZXIKLSAqLwotc3RhdGljIHZvaWQKLW5tMjU2X2F1ZGlvX2Nsb3NlKGludCBkZXYpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0JCi0gICAgaWYgKGNhcmQgIT0gTlVMTCkgewotCWludCB3OwotCi0JaWYgKGNhcmQtPmRldlswXSA9PSBkZXYpCi0JICAgIHcgPSAwOwotCWVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCi0JICAgIHcgPSAxOwotCWVsc2UKLQkgICAgcmV0dXJuOwotCi0JY2FyZC0+b3BlbmNudFt3XS0tOwotCWlmIChjYXJkLT5vcGVuY250W3ddIDw9IDApIHsKLQkgICAgY2FyZC0+b3BlbmNudFt3XSA9IDA7Ci0KLQkgICAgaWYgKGNhcmQtPmRldl9mb3JfcGxheSA9PSBkZXYpIHsKLQkJc3RvcFBsYXkgKGNhcmQpOwotCQljYXJkLT5pc19vcGVuX3BsYXkgPSAwOwotCQljYXJkLT5kZXZfZm9yX3BsYXkgPSAtMTsKLQkgICAgfQotCi0JICAgIGlmIChjYXJkLT5kZXZfZm9yX3JlY29yZCA9PSBkZXYpIHsKLQkJc3RvcFJlY29yZCAoY2FyZCk7Ci0JCWNhcmQtPmlzX29wZW5fcmVjb3JkID0gMDsKLQkJY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPSAtMTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFN0YW5kYXJkIGlvY3RsIGhhbmRsZXIuICovCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQotewotICAgIGludCByZXQ7Ci0gICAgdTMyIG9sZGluZm87Ci0gICAgaW50IHc7Ci0KLSAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKLQotICAgIGlmIChjYXJkID09IE5VTEwpCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoZGV2ID09IGNhcmQtPmRldlswXSkKLQl3ID0gMDsKLSAgICBlbHNlCi0JdyA9IDE7Ci0KLSAgICAvKiAKLSAgICAgKiBUaGUgY29kZSBoZXJlIGlzIG1lc3N5LiAgVGhlcmUgYXJlIHByb2JhYmx5IGJldHRlciB3YXlzIHRvIGRvCi0gICAgICogaXQuICAoSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGhhbmRsZSBpdCB0aGUgc2FtZSB3YXkgdGhlIEFDOTcgbWl4ZXIgCi0gICAgICogaXMgZG9uZS4pCi0gICAgICovCi0gICAgc3dpdGNoIChjbWQpCi0JewotCWNhc2UgU09VTkRfUENNX1dSSVRFX1JBVEU6Ci0JICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JICAgIGlmIChyZXQgIT0gMCkgewotCQlvbGRpbmZvID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKLQkJY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IHJldDsKLQkJcmV0ID0gbm0yNTZfc2V0SW5mbyhkZXYsIGNhcmQpOwotCQlpZiAocmV0ICE9IDApCi0JCSAgICBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlID0gb2xkaW5mbzsKLQkgICAgfQotCSAgICBpZiAocmV0ID09IDApCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOwotCSAgICBicmVhazsKLQotCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86Ci0JICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JICAgIGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyA9IHJldCA/IDEgOiAwOwotCSAgICByZXQgPSBubTI1Nl9zZXRJbmZvIChkZXYsIGNhcmQpOwotCSAgICBpZiAocmV0ID09IDApCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbzsKLQotCSAgICBicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTOgotCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCSAgICBpZiAocmV0IDwgMSB8fCByZXQgPiAzKQotCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gKyAxOwotCSAgICBlbHNlIHsKLQkJY2FyZC0+c2luZm9bd10uc3RlcmVvID0gcmV0IC0gMTsKLQkJcmV0ID0gbm0yNTZfc2V0SW5mbyAoZGV2LCBjYXJkKTsKLQkJaWYgKHJldCA9PSAwKQotCQkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvICsgMTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyArIDE7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKLQkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkgICAgaWYgKHJldCAhPSAwKSB7Ci0JCW9sZGluZm8gPSBjYXJkLT5zaW5mb1t3XS5iaXRzOwotCQljYXJkLT5zaW5mb1t3XS5iaXRzID0gcmV0OwotCQlyZXQgPSBubTI1Nl9zZXRJbmZvIChkZXYsIGNhcmQpOwotCQlpZiAocmV0ICE9IDApCi0JCSAgICBjYXJkLT5zaW5mb1t3XS5iaXRzID0gb2xkaW5mbzsKLQkgICAgfQotCSAgICBpZiAocmV0ID09IDApCi0JCXJldCA9IGNhcmQtPnNpbmZvW3ddLmJpdHM7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5iaXRzOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIHJldHVybiAtRUlOVkFMOwotCX0KLSAgICByZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpOwotfQotCi0vKgotICogR2l2ZW4gdGhlIHNvdW5kIGRldmljZSBERVYgYW5kIGFuIGFzc29jaWF0ZWQgcGh5c2ljYWwgYnVmZmVyIFBIWVNCVUYsIAotICogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIGJ1ZmZlciBpbiBrZXJuZWwgc3BhY2UuIAotICoKLSAqIFRoaXMgcm91dGluZSBzaG91bGQgZXhpc3QgYXMgcGFydCBvZiB0aGUgc291bmRjb3JlIHJvdXRpbmVzLgotICovCi0KLXN0YXRpYyBjaGFyICoKLW5tMjU2X2dldERNQWJ1ZmZlciAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYnVmKQotewotICAgIHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOwotICAgIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7Ci0gICAgY2hhciAqZG1hX3N0YXJ0ID0KLQkoY2hhciAqKShwaHlzYnVmIC0gKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1Zl9waHlzIAotCQkgKyAodW5zaWduZWQgbG9uZylkbWFwLT5yYXdfYnVmKTsKLQotICAgIHJldHVybiBkbWFfc3RhcnQ7Ci19Ci0KLQotLyoKLSAqIE91dHB1dCBhIGJsb2NrIHRvIHNvdW5kIGRldmljZQotICoKLSAqIGRldiAgICAgICAgICAtIGRldmljZSBudW1iZXIKLSAqIGJ1ZiAgICAgICAgICAtIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyCi0gKiB0b3RhbF9jb3VudCAgLSB0b3RhbCBieXRlIGNvdW50IGluIGJ1ZmZlcgotICogaW50cmZsYWcgICAgIC0gc2V0IGlmIHRoaXMgaGFzIGJlZW4gY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IAotICoJCQkJICAodmlhIERNQWJ1Zl9vdXRwdXRpbnRyKQotICogcmVzdGFydF9kbWEgIC0gc2V0IGlmIGVuZ2luZSBuZWVkcyB0byBiZSByZS1pbml0aWFsaXNlZAotICoKLSAqIENhbGxlZCB3aGVuOgotICogIDEuIFN0YXJ0aW5nIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6MTMyNykKLSAqICAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjE1MDQpCi0gKiAgMy4gQSBuZXcgYnVmZmVyIG5lZWRzIHRvIGJlIHNlbnQgdG8gdGhlIGRldmljZSAgICAgIChkbWFidWYuYzoxNTc5KQotICovCi1zdGF0aWMgdm9pZAotbm0yNTZfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2J1ZiwKLQkJCQkgICAgICAgaW50IHRvdGFsX2NvdW50LCBpbnQgaW50cmZsYWcpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JY2hhciAqZG1hX2J1ZiA9IG5tMjU2X2dldERNQWJ1ZmZlciAoZGV2LCBwaHlzYnVmKTsKLQljYXJkLT5pc19vcGVuX3BsYXkgPSAxOwotCWNhcmQtPmRldl9mb3JfcGxheSA9IGRldjsKLQlubTI1Nl93cml0ZV9ibG9jayAoY2FyZCwgZG1hX2J1ZiwgdG90YWxfY291bnQpOwotICAgIH0KLX0KLQotLyogRGl0dG8sIGJ1dCBkbyByZWNvcmRpbmcgaW5zdGVhZC4gICovCi1zdGF0aWMgdm9pZAotbm0yNTZfYXVkaW9fc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYnVmLCBpbnQgY291bnQsCi0JCQlpbnQgaW50cmZsYWcpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JY2hhciAqZG1hX2J1ZiA9IG5tMjU2X2dldERNQWJ1ZmZlciAoZGV2LCBwaHlzYnVmKTsKLQljYXJkLT5pc19vcGVuX3JlY29yZCA9IDE7Ci0JY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPSBkZXY7Ci0Jbm0yNTZfc3RhcnRSZWNvcmRpbmcgKGNhcmQsIGRtYV9idWYsIGNvdW50KTsKLSAgICB9Ci19Ci0KLS8qIAotICogUHJlcGFyZSBmb3IgaW5wdXR0aW5nIHNhbXBsZXMgdG8gREVWLiAKLSAqIEVhY2ggcmVxdWVzdGVkIGJ1ZmZlciB3aWxsIGJlIEJTSVpFIGJ5ZXMgbG9uZywgd2l0aCBhIHRvdGFsIG9mCi0gKiBCQ09VTlQgYnVmZmVycy4gCi0gKi8KLQotc3RhdGljIGludAotbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgPT0gTlVMTCkgCi0JcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBpZiAoY2FyZC0+aXNfb3Blbl9yZWNvcmQgJiYgY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgIT0gZGV2KQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICBhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmZsYWdzIHw9IERNQV9OT0RNQTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFByZXBhcmUgZm9yIG91dHB1dHRpbmcgc2FtcGxlcyB0byBgZGV2JwotICoKLSAqIEVhY2ggYnVmZmVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgd2lsbCBiZSBgYnNpemUnIGJ5dGVzIGxvbmcsCi0gKiB3aXRoIGEgdG90YWwgb2YgYGJjb3VudCcgYnVmZmVycy4KLSAqCi0gKiBDYWxsZWQgd2hlbjoKLSAqICAxLiBBIHRyaWdnZXIgZW5hYmxlcyBhdWRpbyBvdXRwdXQgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjk3OCkKLSAqICAyLiBXZSBnZXQgYSB3cml0ZSBidWZmZXIgd2l0aG91dCBkbWFfbW9kZSBzZXR1cCAgICAgKGRtYWJ1Zi5jOjExNTIpCi0gKiAgMy4gV2UgcmVzdGFydCBhIHRyYW5zZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzoxMzI0KQotICovCi0KLXN0YXRpYyBpbnQKLW5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCi17Ci0gICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7Ci0KLSAgICBpZiAoY2FyZCA9PSBOVUxMKQotCXJldHVybiAtRU5PREVWOwotCi0gICAgaWYgKGNhcmQtPmlzX29wZW5fcGxheSAmJiBjYXJkLT5kZXZfZm9yX3BsYXkgIT0gZGV2KQotCXJldHVybiAtRUJVU1k7Ci0KLSAgICBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5mbGFncyB8PSBETUFfTk9ETUE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFN0b3AgdGhlIGN1cnJlbnQgb3BlcmF0aW9ucyBhc3NvY2lhdGVkIHdpdGggREVWLiAgKi8KLXN0YXRpYyB2b2lkCi1ubTI1Nl9hdWRpb19yZXNldChpbnQgZGV2KQotewotICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOwotCi0gICAgaWYgKGNhcmQgIT0gTlVMTCkgewotCWlmIChjYXJkLT5kZXZfZm9yX3BsYXkgPT0gZGV2KQotCSAgICBzdG9wUGxheSAoY2FyZCk7Ci0JaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldikKLQkgICAgc3RvcFJlY29yZCAoY2FyZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1ubTI1Nl9hdWRpb19sb2NhbF9xbGVuKGludCBkZXYpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIG5tMjU2X2F1ZGlvX2RyaXZlciA9Ci17Ci0JLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJCT0gbm0yNTZfYXVkaW9fb3BlbiwKLQkuY2xvc2UJCQk9IG5tMjU2X2F1ZGlvX2Nsb3NlLAotCS5vdXRwdXRfYmxvY2sJCT0gbm0yNTZfYXVkaW9fb3V0cHV0X2Jsb2NrLAotCS5zdGFydF9pbnB1dAkJPSBubTI1Nl9hdWRpb19zdGFydF9pbnB1dCwKLQkuaW9jdGwJCQk9IG5tMjU2X2F1ZGlvX2lvY3RsLAotCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IG5tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAotCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCi0JLmhhbHRfaW8JCT0gbm0yNTZfYXVkaW9fcmVzZXQsCi0JLmxvY2FsX3FsZW4JCT0gbm0yNTZfYXVkaW9fbG9jYWxfcWxlbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBubTI1Nl9wY2lfdGJsW10gPSB7Ci0Je1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTywKLQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwfSwKLQl7UENJX1ZFTkRPUl9JRF9ORU9NQUdJQywgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPLAotCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDB9LAotCXtQQ0lfVkVORE9SX0lEX05FT01BR0lDLCBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTywKLQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwfSwKLQl7MCx9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5tMjU2X3BjaV90YmwpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBubTI1Nl9wY2lfZHJpdmVyID0gewotCS5uYW1lCQk9ICJubTI1Nl9hdWRpbyIsCi0JLmlkX3RhYmxlCT0gbm0yNTZfcGNpX3RibCwKLQkucHJvYmUJCT0gbm0yNTZfcHJvYmUsCi0JLnJlbW92ZQkJPSBubTI1Nl9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGFyYW0odXNlY2FjaGUsIGJvb2wsIDApOwotbW9kdWxlX3BhcmFtKGJ1ZmZlcnRvcCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShubTI1Nl9kZWJ1ZywgYm9vbCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0oZm9yY2VfbG9hZCwgYm9vbCwgMCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRvX2luaXRfbm0yNTYodm9pZCkKLXsKLSAgICBwcmludGsgKEtFUk5fSU5GTyAiTmVvTWFnaWMgMjU2QVYvMjU2WlggYXVkaW8gZHJpdmVyLCB2ZXJzaW9uIDEuMXBcbiIpOwotICAgIHJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZubTI1Nl9wY2lfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbm0yNTYgKHZvaWQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZubTI1Nl9wY2lfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZG9faW5pdF9ubTI1Nik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX25tMjU2KTsKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaCBiL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMwN2YzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9ubTI1Nl9jb2VmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDY5NyArMCwwIEBACi0jaWZuZGVmIE5NMjU2X0NPRUZGX0gKLSNkZWZpbmUgTk0yNTZfQ09FRkZfSAotCi0jZGVmaW5lIE5NX1RPVEFMX0NPRUZGX0NPVU5UIDB4MzE1OAotCi1zdGF0aWMgY2hhciBjb2VmZmljaWVudHNbTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0XSA9IHsgCi0JMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNSwgMHgwMSwgMHhFRiwgMHhGQywgMHgyMSwKLQkweDA1LCAweDg3LCAweEY3LCAweDYyLCAweDExLCAweEU5LCAweDQ1LCAweDVFLCAweEY5LCAweEI1LCAweDAxLAotCTB4REUsIDB4RkYsIDB4QTQsIDB4RkYsIDB4NjAsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENiwgMHgwNiwKLQkweDRDLCAweEYzLCAweEVELCAweDIwLCAweDNELCAweDNELCAweDRBLCAweEYzLCAweDRFLCAweDA1LCAweEIxLAotCTB4RkQsIDB4RTEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwKLQkweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLAotCTB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsCi0JMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywKLQkweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLCAweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0EsIDB4RkYsCi0JMHg2MCwgMHgwMCwgMHhBNCwgMHhGRiwgMHhERSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg1RSwgMHhGOSwgMHhFOSwKLQkweDQ1LCAweDYyLCAweDExLCAweDg3LCAweEY3LCAweDIxLCAweDA1LCAweEVGLCAweEZDLCAweEE1LCAweDAxLAotCTB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsCi0JMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywKLQkweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLAotCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCi0JMHhDQSwgMHgwMSwgMHg5NSwgMHhGQywgMHhFQSwgMHgwNSwgMHhCQiwgMHhGNSwgMHgyNSwgMHgxNywgMHgzQywKLQkweDQzLCAweDhELCAweEY2LCAweDQzLCAweDAzLCAweEY1LCAweEZFLCAweDI2LCAweDAwLCAweDIwLCAweDAwLAotCTB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QzUsCi0JMHgwMSwgMHg0QywgMHhGQywgMHgyNiwgMHgwNywgMHhBMywgMHhGMSwgMHhBQiwgMHgyQywgMHhCQiwgMHgzMywKLQkweDhGLCAweEYxLCAweENBLCAweDA2LCAweEE2LCAweEZDLCAweDg1LCAweDAxLCAweDZGLCAweEZGLCAweDI0LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDUsIDB4RkYsIDB4QkMsIDB4MDAsCi0JMHhGMCwgMHhGRCwgMHhFQywgMHgwNCwgMHhEOSwgMHhGMywgMHhCMSwgMHgzRSwgMHhDRCwgMHgxRSwgMHhDMSwKLQkweEYzLCAweEFGLCAweDA2LCAweDQ5LCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsIDB4RTksIDB4RkUsIDB4MzgsCi0JMHgwMSwgMHg0QiwgMHhGRiwgMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwgMHgwQSwgMHgyRSwgMHhGQSwKLQkweERGLCAweDAzLCAweDhBLCAweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4OTgsIDB4MDEsIDB4MEQsIDB4RkQsCi0JMHhFMCwgMHgwNCwgMHgxNCwgMHhGOCwgMHhDMywgMHgwRiwgMHg4OSwgMHg0NiwgMHg0QywgMHhGQSwgMHgzOCwKLQkweDAxLCAweDI1LCAweDAwLCAweDdELCAweEZGLCAweDczLCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MEYsCi0JMHgwNywgMHg4NCwgMHhGMiwgMHgyOSwgMHgyNSwgMHgxQSwgMHgzQSwgMHg2NywgMHhGMiwgMHhGNiwgMHgwNSwKLQkweDQxLCAweEZELCAweDI0LCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MTUsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MzcsIDB4MDEsIDB4MjIsIDB4RkQsIDB4MjMsIDB4MDYsCi0JMHgyRiwgMHhGMiwgMHgxMSwgMHgzOSwgMHg3QiwgMHgyNiwgMHg1MCwgMHhGMiwgMHgxQiwgMHgwNywgMHgzMiwKLQkweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAotCTB4QzgsIDB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsCi0JMHhGOSwgMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwgMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywKLQkweEEyLCAweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LAotCTB4MDAsIDB4NkEsIDB4RkYsIDB4NTMsIDB4MDEsIDB4QTYsIDB4RkQsIDB4QTYsIDB4MDMsIDB4QTEsIDB4RkEsCi0JMHhERSwgMHgwOCwgMHg3NiwgMHg0OCwgMHgwQywgMHhGRiwgMHhERSwgMHhGRSwgMHg3MywgMHgwMSwgMHhDOSwKLQkweEZFLCAweENBLCAweDAwLCAweEEwLCAweEZGLCAweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTIsIDB4RkMsIDB4OTMsIDB4MDYsIDB4MTAsIDB4RjQsIDB4NzgsCi0JMHgxRCwgMHg5MCwgMHgzRiwgMHgzRSwgMHhGNCwgMHhBQSwgMHgwNCwgMHgxOSwgMHhGRSwgMHhBNCwgMHgwMCwKLQkweEUyLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY4LAotCTB4RkYsIDB4OTMsIDB4MDEsIDB4OTIsIDB4RkMsIDB4RTIsIDB4MDYsIDB4ODMsIDB4RjEsIDB4OEMsIDB4MzIsCi0JMHhFRCwgMHgyRCwgMHg5MCwgMHhGMSwgMHgxRSwgMHgwNywgMHg1NywgMHhGQywgMHhCRCwgMHgwMSwgMHg1MSwKLQkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLCAweDAwLAotCTB4NDIsIDB4MDAsIDB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsIDB4NzYsCi0JMHgxOCwgMHg1QywgMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLCAweDAzLCAweDAxLCAweDUzLAotCTB4RkUsIDB4NTMsIDB4MDIsIDB4MzksIDB4RkQsIDB4QTksIDB4MDIsIDB4RjIsIDB4NDgsIDB4QjksIDB4MDQsCi0JMHg1NCwgMHhGQywgMHhDQSwgMHgwMiwgMHgxNiwgMHhGRSwgMHgyMCwgMHgwMSwgMHg3RiwgMHhGRiwgMHgyMCwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMzLCAweDAxLAotCTB4QTcsIDB4RkMsIDB4QzAsIDB4MDUsIDB4MUUsIDB4RjYsIDB4RDgsIDB4MTUsIDB4RTcsIDB4NDMsIDB4MjAsCi0JMHhGNywgMHhFRiwgMHgwMiwgMHgyNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgyRSwgMHgwMCwgMHhERCwgMHhGRiwKLQkweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENELCAweDAxLCAweDQzLAotCTB4RkMsIDB4MkEsIDB4MDcsIDB4QkMsIDB4RjEsIDB4NjQsIDB4MkIsIDB4RTMsIDB4MzQsIDB4QTMsIDB4RjEsCi0JMHhBRSwgMHgwNiwgMHhCRCwgMHhGQywgMHg3NywgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LCAweDAwLCAweEM4LCAweEZELAotCTB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsIDB4NzYsIDB4RjMsIDB4QzgsCi0JMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFDLCAweDAwLCAweDA4LCAweEZGLCAweEZELCAweDAwLCAweEI1LAotCTB4RkYsIDB4NEIsIDB4RkQsIDB4RjQsIDB4NDcsIDB4MzAsIDB4MEIsIDB4QkMsIDB4RjksIDB4MTcsIDB4MDQsCi0JMHg2RSwgMHhGRCwgMHg2RCwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLCAweDhELCAweDAxLCAweDI2LCAweEZELCAweEFELCAweDA0LAotCTB4ODIsIDB4RjgsIDB4ODcsIDB4MEUsIDB4RjksIDB4NDYsIDB4MEMsIDB4RkIsIDB4RDQsIDB4MDAsIDB4NUQsCi0JMHgwMCwgMHg1RSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhCRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweDAxLCAweDA3LCAweEJFLAotCTB4RjIsIDB4RDYsIDB4MjMsIDB4MUYsIDB4M0IsIDB4QTUsIDB4RjIsIDB4QzUsIDB4MDUsIDB4NjIsIDB4RkQsCi0JMHgxMCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwKLQkweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LCAweEZELCAweDRELCAweDA2LCAweDAwLCAweEYyLAotCTB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsIDB4MjMsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REQsCi0JMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRSwgMHhGRiwKLQkweDU2LCAweDAwLCAweEI5LCAweEZGLCAweEI4LCAweEZGLCAweEY3LCAweDAxLCAweEUyLCAweEY4LCAweDhELAotCTB4NDUsIDB4NDYsIDB4MTIsIDB4M0MsIDB4RjcsIDB4NDMsIDB4MDUsIDB4REYsIDB4RkMsIDB4QUMsIDB4MDEsCi0JMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwKLQkweEZGLCAweDQ2LCAweDAxLCAweEMzLCAweEZELCAweDZELCAweDAzLCAweDE0LCAweEZCLCAweEJFLCAweDA3LAotCTB4QTYsIDB4NDgsIDB4RjgsIDB4RkYsIDB4NzAsIDB4RkUsIDB4QUUsIDB4MDEsIDB4QUEsIDB4RkUsIDB4RDksCi0JMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweERFLCAweDAxLCAweDVELCAweEZDLCAweDc0LCAweDA2LCAweDYzLCAweEY0LCAweDIzLCAweDFDLCAweDY2LAotCTB4NDAsIDB4QUEsIDB4RjQsIDB4NjUsIDB4MDQsIDB4NDQsIDB4RkUsIDB4OEIsIDB4MDAsIDB4RUUsIDB4RkYsCi0JMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwKLQkweDAxLCAweDgwLCAweEZDLCAweEY3LCAweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLAotCTB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsIDB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHg1RCwgMHgwMCwKLQkweDk1LCAweEZFLCAweEUyLCAweDAzLCAweDdGLCAweEY1LCAweENDLCAweDQxLCAweEM3LCAweDE5LCAweEZGLAotCTB4RjQsIDB4MzcsIDB4MDYsIDB4NzUsIDB4RkMsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MCwgMHhGRiwgMHhGNCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgxOCwKLQkweDAyLCAweEFBLCAweEZELCAweEFCLCAweDAxLCAweERGLCAweDQ4LCAweENBLCAweDA1LCAweEUxLCAweEZCLAotCTB4MDUsIDB4MDMsIDB4RjcsIDB4RkQsIDB4MkUsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQiwgMHgwMSwgMHhCQSwgMHhGQywKLQkweDk1LCAweDA1LCAweDgzLCAweEY2LCAweDhDLCAweDE0LCAweDg3LCAweDQ0LCAweEJCLCAweEY3LCAweDk4LAotCTB4MDIsIDB4NUEsIDB4RkYsIDB4RUUsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RDgsIDB4RkYsIDB4MEEsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwKLQkweDA3LCAweERDLCAweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LAotCTB4RDUsIDB4RkMsIDB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsCi0JMHgwMCwgMHgwNywgMHgwMCwgMHhCRSwgMHhGRiwgMHhFQSwgMHgwMCwgMHhBMiwgMHhGRCwgMHg2NSwgMHgwNSwKLQkweDI4LCAweEYzLCAweERCLCAweDNDLCAweDc4LCAweDIxLCAweDMwLCAweEYzLCAweERGLCAweDA2LCAweDNBLAotCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsCi0JMHhCMiwgMHhGRiwgMHg5RCwgMHgwMCwgMHgyNywgMHhGRiwgMHhDMywgMHgwMCwgMHgxRiwgMHgwMCwgMHg3NiwKLQkweEZDLCAweEEzLCAweDQ3LCAweDYwLCAweDBDLCAweDRBLCAweEY5LCAweDRFLCAweDA0LCAweDUzLCAweEZELAotCTB4NzksIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCi0JMHgwMCwgMHg1OCwgMHhGRiwgMHg4MiwgMHgwMSwgMHgzRiwgMHhGRCwgMHg3OCwgMHgwNCwgMHhGMiwgMHhGOCwKLQkweDUwLCAweDBELCAweDVFLCAweDQ3LCAweEQ1LCAweEZCLCAweDZGLCAweDAwLCAweDk2LCAweDAwLCAweDQwLAotCTB4RkYsIDB4OTEsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywgMHhGMiwgMHg4MSwKLQkweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELCAweEZCLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODUsCi0JMHhGRiwgMHg1QiwgMHgwMSwgMHhFOSwgMHhGQywgMHg3MywgMHgwNiwgMHhEOCwgMHhGMSwgMHhFNSwgMHgzNiwKLQkweDE5LCAweDI5LCAweEY4LCAweEYxLCAweDI5LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LCAweDAxLCAweDQyLAotCTB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsIDB4MDAsCi0JMHhENywgMHhGRiwgMHg4MiwgMHhGRiwgMHg1MywgMHgwMiwgMHgzOSwgMHhGOCwgMHhGRCwgMHg0NCwgMHg4RCwKLQkweDEzLCAweEQzLCAweEY2LCAweDcyLCAweDA1LCAweENBLCAweEZDLCAweEI1LCAweDAxLCAweDQ1LCAweEZGLAotCTB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzUsIDB4RkYsIDB4MzksCi0JMHgwMSwgMHhFMCwgMHhGRCwgMHgzMywgMHgwMywgMHg4NywgMHhGQiwgMHhBMiwgMHgwNiwgMHhDQiwgMHg0OCwKLQkweEVBLCAweDAwLCAweDAxLCAweEZFLCAweEU5LCAweDAxLCAweDhBLCAweEZFLCAweEU4LCAweDAwLCAweDk1LAotCTB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REEsIDB4MDEsCi0JMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwgMHhDRSwgMHgxQSwgMHgzMiwgMHg0MSwgMHgxRiwKLQkweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLCAweDAwLCAweEZCLCAweEZGLCAweEYwLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUIsIDB4RkYsIDB4QUIsIDB4MDEsIDB4NkYsCi0JMHhGQywgMHgwOCwgMHgwNywgMHg3RSwgMHhGMSwgMHgyMSwgMHgzMCwgMHg2NywgMHgzMCwgMHg3RCwgMHhGMSwKLQkweDA1LCAweDA3LCAweDczLCAweEZDLCAweEE4LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsIDB4MDAsIDB4NjcsIDB4RkUsCi0JMHgyRCwgMHgwNCwgMHgwNCwgMHhGNSwgMHgwNywgMHg0MSwgMHgxQiwgMHgxQiwgMHhBNiwgMHhGNCwgMHg1QSwKLQkweDA2LCAweDY3LCAweEZDLCAweERCLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAotCTB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTUsIDB4MDAsIDB4OTEsIDB4RkUsIDB4REMsIDB4MDEsIDB4MUEsCi0JMHhGRSwgMHhCMywgMHgwMCwgMHhDMywgMHg0OCwgMHhFMSwgMHgwNiwgMHg2RSwgMHhGQiwgMHg0MCwgMHgwMywKLQkweERBLCAweEZELCAweDNDLCAweDAxLCAweDc0LCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsCi0JMHhFQSwgMHhGNiwgMHg0NCwgMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwgMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwKLQkweEZGLCAweEQwLCAweEZGLCAweDRBLCAweDAwLCAweEQyLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAotCTB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDksIDB4MDEsIDB4MzYsIDB4RkMsIDB4MjgsIDB4MDcsIDB4MDEsCi0JMHhGMiwgMHhDRSwgMHgyOCwgMHgyMywgMHgzNywgMHhFMCwgMHhGMSwgMHg2QiwgMHgwNiwgMHhFRiwgMHhGQywKLQkweDU3LCAweDAxLCAweDg3LCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBCLAotCTB4MDAsIDB4QjQsIDB4RkYsIDB4MDAsIDB4MDEsIDB4N0UsIDB4RkQsIDB4OUMsIDB4MDUsIDB4REMsIDB4RjIsCi0JMHhFNCwgMHgzQiwgMHhDRCwgMHgyMiwgMHhFRSwgMHhGMiwgMHhGMywgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLCAweDAwLCAweEI4LCAweEZGLAotCTB4OEUsIDB4MDAsIDB4NDYsIDB4RkYsIDB4OEEsIDB4MDAsIDB4ODYsIDB4MDAsIDB4QTcsIDB4RkIsIDB4NDgsCi0JMHg0NywgMHg5NSwgMHgwRCwgMHhEOSwgMHhGOCwgMHg4NCwgMHgwNCwgMHgzOSwgMHhGRCwgMHg4NSwgMHgwMSwKLQkweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELAotCTB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsIDB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsCi0JMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywgMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwKLQkweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAotCTB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsIDB4REEsIDB4MDYsIDB4M0YsIDB4RjMsIDB4MkMsIDB4MjEsIDB4MTEsCi0JMHgzRCwgMHgzQSwgMHhGMywgMHg1OCwgMHgwNSwgMHhBQSwgMHhGRCwgMHhFNSwgMHgwMCwgMHhDMSwgMHhGRiwKLQkweDA2LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFGLCAweDAwLCAweDdELCAweEZGLCAweDZCLAotCTB4MDEsIDB4Q0YsIDB4RkMsIDB4OTYsIDB4MDYsIDB4QjcsIDB4RjEsIDB4QzYsIDB4MzUsIDB4NjQsIDB4MkEsCi0JMHhENCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRCwgMHhGQywgMHhEMiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMiwKLQkweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ5LCAweEZGLCAweDM5LCAweDAwLCAweEY0LCAweEZGLAotCTB4NEUsIDB4RkYsIDB4QUMsIDB4MDIsIDB4OTgsIDB4RjcsIDB4NjUsIDB4NDQsIDB4RDYsIDB4MTQsIDB4NkMsCi0JMHhGNiwgMHg5RiwgMHgwNSwgMHhCNiwgMHhGQywgMHhCRCwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLCAweDJCLCAweDAxLCAweEZFLAotCTB4RkQsIDB4RjgsIDB4MDIsIDB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsIDB4NDgsIDB4RTMsIDB4MDEsCi0JMHg5MSwgMHhGRCwgMHgyNSwgMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwgMHg4RiwgMHhGRiwgMHgxQywKLQkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ1LCAweDAxLCAweDc4LCAweEZDLAotCTB4MkYsIDB4MDYsIDB4MTMsIDB4RjUsIDB4N0MsIDB4MTksIDB4RjcsIDB4NDEsIDB4OUIsIDB4RjUsIDB4RDEsCi0JMHgwMywgMHg5RiwgMHhGRSwgMHg1NywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDJELCAweDAwLCAweDU1LCAweEZGLCAweEI1LCAweDAxLCAweDYxLCAweEZDLCAweDE2LAotCTB4MDcsIDB4ODUsIDB4RjEsIDB4RTYsIDB4MkUsIDB4OUUsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjMsIDB4MDYsCi0JMHg4NCwgMHhGQywgMHg5RCwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEY2LCAweEZGLCAweEVCLCAweEZGLCAweDkxLCAweDAwLCAweDNCLCAweEZFLCAweDc1LCAweDA0LAotCTB4OTIsIDB4RjQsIDB4MzYsIDB4NDAsIDB4NkUsIDB4MUMsIDB4NTAsIDB4RjQsIDB4N0IsIDB4MDYsIDB4NUIsCi0JMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwKLQkweDlDLCAweEZGLCAweEQ2LCAweDAwLCAweEIxLCAweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLAotCTB4RkYsIDB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsIDB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsCi0JMHg0OSwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKLQkweDAwLCAweDQ5LCAweEZGLCAweEFBLCAweDAxLCAweEU0LCAweEZDLCAweDM4LCAweDA1LCAweDU0LCAweEY3LAotCTB4RkUsIDB4MTEsIDB4QUEsIDB4NDUsIDB4MDksIDB4RjksIDB4RTIsIDB4MDEsIDB4QzQsIDB4RkYsIDB4QjMsCi0JMHhGRiwgMHg1OSwgMHgwMCwgMHhDRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLCAweEZDLCAweDIyLCAweDA3LCAweDJCLCAweEYyLCAweDgwLAotCTB4MjcsIDB4M0IsIDB4MzgsIDB4MEEsIDB4RjIsIDB4NDQsIDB4MDYsIDB4MEIsIDB4RkQsIDB4NDUsIDB4MDEsCi0JMHg5MCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOSwKLQkweEZGLCAweDE1LCAweDAxLCAweDVCLCAweEZELCAweEQwLCAweDA1LCAweDk3LCAweEYyLCAweEU2LCAweDNBLAotCTB4MjEsIDB4MjQsIDB4QjEsIDB4RjIsIDB4MDQsIDB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwgMHgwMCwKLQkweDY1LCAweEZGLCAweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LCAweENELAotCTB4MEUsIDB4NkEsIDB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkYsCi0JMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2QSwKLQkweDAxLCAweDc0LCAweEZELCAweDBBLCAweDA0LCAweEQ1LCAweEY5LCAweEVELCAweDBBLCAweDAzLCAweDQ4LAotCTB4N0MsIDB4RkQsIDB4OUUsIDB4RkYsIDB4MEEsIDB4MDEsIDB4MDEsIDB4RkYsIDB4QUYsIDB4MDAsIDB4QUIsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwKLQkweDQyLCAweEZDLCAweEMzLCAweDA2LCAweDg3LCAweEYzLCAweEQ3LCAweDFGLCAweEZFLCAweDNELCAweDkxLAotCTB4RjMsIDB4MUQsIDB4MDUsIDB4RDEsIDB4RkQsIDB4Q0UsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NSwgMHhGRiwgMHg3QSwgMHgwMSwgMHhCOCwKLQkweEZDLCAweEI0LCAweDA2LCAweDlFLCAweEYxLCAweEEyLCAweDM0LCAweEFELCAweDJCLCAweEI2LCAweEYxLAotCTB4MjksIDB4MDcsIDB4NDUsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxQiwgMHhGRiwKLQkweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LCAweDA3LCAweEY2LCAweENBLAotCTB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg4MCwgMHhGRiwgMHgxQywgMHgwMSwgMHgxQywgMHhGRSwgMHhCRCwKLQkweDAyLCAweDZFLCAweEZDLCAweDdELCAweDA0LCAweEYzLCAweDQ4LCAweEUyLCAweDAyLCAweDFGLCAweEZELAotCTB4NjAsIDB4MDIsIDB4NEMsIDB4RkUsIDB4MDYsIDB4MDEsIDB4ODksIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRiwgMHgwMSwgMHg4OCwgMHhGQywgMHgwOSwgMHgwNiwKLQkweDcxLCAweEY1LCAweDJCLCAweDE4LCAweEIyLCAweDQyLCAweDIwLCAweEY2LCAweDgzLCAweDAzLCAweENGLAotCTB4RkUsIDB4M0MsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhCRiwgMHgwMSwgMHg1NCwgMHhGQywgMHgyMCwgMHgwNywgMHg5NCwKLQkweEYxLCAweEE2LCAweDJELCAweEQwLCAweDMyLCAweDg1LCAweEYxLCAweERELCAweDA2LCAweDk2LCAweEZDLAotCTB4OTAsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsCi0JMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwgMHhGRSwgMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwKLQkweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLCAweDk5LCAweDA2LCAweDUwLCAweEZDLCAweEUyLAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTIsIDB4RkYsCi0JMHhDNywgMHgwMCwgMHhEMCwgMHhGRSwgMHg2NSwgMHgwMSwgMHhGNiwgMHhGRSwgMHhEOSwgMHhGRSwgMHg2QSwKLQkweDQ4LCAweDFGLCAweDA5LCAweDg3LCAweEZBLCAweEIzLCAweDAzLCAweEEwLCAweEZELCAweDU2LCAweDAxLAotCTB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEQsCi0JMHhGRiwgMHhBMCwgMHgwMSwgMHhGQiwgMHhGQywgMHgwNywgMHgwNSwgMHhCRiwgMHhGNywgMHhCQiwgMHgxMCwKLQkweDJCLCAweDQ2LCAweEJCLCAweEY5LCAweDgzLCAweDAxLCAweEZBLCAweEZGLCAweDk1LCAweEZGLCAweDY4LAotCTB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsCi0JMHhFMSwgMHgwMSwgMHgzMSwgMHhGQywgMHgxOSwgMHgwNywgMHg1QiwgMHhGMiwgMHgzMCwgMHgyNiwgMHg0QiwKLQkweDM5LCAweDNCLCAweEYyLCAweDFBLCAweDA2LCAweDI5LCAweEZELCAweDMzLCAweDAxLCAweDk5LCAweEZGLAotCTB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsCi0JMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwgMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwKLQkweDc5LCAweEYyLCAweDEyLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4NzAsIDB4MDAsIDB4ODQsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHg0RCwgMHgwMSwgMHgyMiwgMHhGQSwgMHg3MCwgMHg0NiwgMHgwQSwgMHgxMCwgMHhGQywKLQkweEY3LCAweEVCLCAweDA0LCAweDA4LCAweEZELCAweDlBLCAweDAxLCAweDRGLCAweEZGLCAweDJFLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4NUUsIDB4MDEsIDB4OTAsCi0JMHhGRCwgMHhEMiwgMHgwMywgMHg0NywgMHhGQSwgMHhDMywgMHgwOSwgMHg0OCwgMHg0OCwgMHg1QSwgMHhGRSwKLQkweDMzLCAweEZGLCAweDQ1LCAweDAxLCAweEUyLCAweEZFLCAweEJFLCAweDAwLCAweEE1LCAweEZGLCAweDE2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEIsIDB4RkMsCi0JMHhBOSwgMHgwNiwgMHhEMiwgMHhGMywgMHg4MSwgMHgxRSwgMHhFNCwgMHgzRSwgMHhFRiwgMHhGMywgMHhERSwKLQkweDA0LCAweEY5LCAweEZELCAweEI3LCAweDAwLCAweEQ4LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsCi0JMHgwNiwgMHg4QywgMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywKLQkweDRFLCAweEZDLCAweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA4LAotCTB4MDAsIDB4RTQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MkQsIDB4MDAsIDB4RUEsIDB4RkUsIDB4NTYsIDB4MDMsCi0JMHg2RCwgMHhGNiwgMHgxNywgMHg0MywgMHg3MCwgMHgxNywgMHhBNiwgMHhGNSwgMHhGMywgMHgwNSwgMHg5MSwKLQkweEZDLCAweENDLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAotCTB4ODYsIDB4RkYsIDB4MEUsIDB4MDEsIDB4M0IsIDB4RkUsIDB4ODIsIDB4MDIsIDB4RTAsIDB4RkMsIDB4NzMsCi0JMHgwMywgMHhGNiwgMHg0OCwgMHhFOSwgMHgwMywgMHhBRCwgMHhGQywgMHg5QywgMHgwMiwgMHgyRCwgMHhGRSwKLQkweDE0LCAweDAxLCAweDgzLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTksIDB4RkMsIDB4RTEsIDB4MDUsIDB4RDEsIDB4RjUsCi0JMHhEQywgMHgxNiwgMHg2NSwgMHg0MywgMHhBRCwgMHhGNiwgMHgzMSwgMHgwMywgMHgwMCwgMHhGRiwgMHgyMCwKLQkweDAwLCAweDIzLCAweDAwLCAweEUxLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLAotCTB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsIDB4RjEsIDB4NjIsCi0JMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywgMHg4MiwgMHgwMSwKLQkweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweEQzLAotCTB4RkYsIDB4QzEsIDB4MDAsIDB4RTcsIDB4RkQsIDB4RkEsIDB4MDQsIDB4QzQsIDB4RjMsIDB4N0UsIDB4M0UsCi0JMHgxOSwgMHgxRiwgMHhCMCwgMHhGMywgMHhCNSwgMHgwNiwgMHg0NywgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI4LCAweDAwLAotCTB4RjAsIDB4RkUsIDB4MkIsIDB4MDEsIDB4NjMsIDB4RkYsIDB4RjYsIDB4RkQsIDB4MkMsIDB4NDgsIDB4NDcsCi0JMHgwQSwgMHgxNCwgMHhGQSwgMHhFQiwgMHgwMywgMHg4NCwgMHhGRCwgMHg2MywgMHgwMSwgMHg2NCwgMHhGRiwKLQkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk2LAotCTB4MDEsIDB4MTMsIDB4RkQsIDB4RDUsIDB4MDQsIDB4MkMsIDB4RjgsIDB4N0QsIDB4MEYsIDB4QTMsIDB4NDYsCi0JMHg3NiwgMHhGQSwgMHgyMiwgMHgwMSwgMHgzMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHg3NiwgMHgwMCwgMHhDMSwKLQkweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLCAweEZGLCAweEU0LCAweDAxLAotCTB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsIDB4REQsIDB4MjQsIDB4NTQsIDB4M0EsIDB4NzQsCi0JMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwgMHgwMSwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk1LCAweEZGLCAweDNCLCAweDAxLCAweDFCLAotCTB4RkQsIDB4MkQsIDB4MDYsIDB4MjQsIDB4RjIsIDB4RDMsIDB4MzgsIDB4QzYsIDB4MjYsIDB4NDUsIDB4RjIsCi0JMHgxRCwgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYxLCAweDAwLCAweEEyLCAweEZGLCAweEUyLCAweEZGLAotCTB4QUUsIDB4MDEsIDB4NkIsIDB4RjksIDB4RjIsIDB4NDUsIDB4NEEsIDB4MTEsIDB4OEYsIDB4RjcsIDB4MUQsCi0JMHgwNSwgMHhGMSwgMHhGQywgMHhBNCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDUxLCAweDAxLCAweEFDLCAweEZELCAweDlBLAotCTB4MDMsIDB4QkEsIDB4RkEsIDB4OUUsIDB4MDgsIDB4ODEsIDB4NDgsIDB4NDAsIDB4RkYsIDB4QzYsIDB4RkUsCi0JMHg4MCwgMHgwMSwgMHhDMiwgMHhGRSwgMHhDRSwgMHgwMCwgMHg5RiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUxLCAweDAxLCAweDU1LCAweEZDLCAweDhDLCAweDA2LAotCTB4MjIsIDB4RjQsIDB4MkMsIDB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsIDB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsCi0JMHhGRSwgMHg5RiwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk2LCAweDAxLCAweDhFLCAweEZDLCAweEU3LCAweDA2LCAweDgxLAotCTB4RjEsIDB4NDgsIDB4MzIsIDB4MzQsIDB4MkUsIDB4OEQsIDB4RjEsIDB4MUMsIDB4MDcsIDB4NUEsIDB4RkMsCi0JMHhCQiwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOSwKLQkweEZGLCAweDBGLCAweDAwLCAweDQ4LCAweDAwLCAweEI5LCAweEZFLCAweEE2LCAweDAzLCAweEU0LCAweEY1LAotCTB4NjAsIDB4NDIsIDB4QzEsIDB4MTgsIDB4NDcsIDB4RjUsIDB4MUEsIDB4MDYsIDB4ODEsIDB4RkMsIDB4RDIsCi0JMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4QiwgMHhGRiwKLQkweEZGLCAweDAwLCAweDVBLCAweEZFLCAweDQ2LCAweDAyLCAweDUyLCAweEZELCAweDcwLCAweDAyLCAweEVELAotCTB4NDgsIDB4RjUsIDB4MDQsIDB4M0IsIDB4RkMsIDB4RDcsIDB4MDIsIDB4MEYsIDB4RkUsIDB4MjMsIDB4MDEsCi0JMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKLQkweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLCAweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LAotCTB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsIDB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsCi0JMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwKLQkweENFLCAweDAxLCAweDQxLCAweEZDLCAweDJBLCAweDA3LCAweEMyLCAweEYxLCAweDFCLCAweDJCLCAweDI1LAotCTB4MzUsIDB4QTgsIDB4RjEsIDB4QTcsIDB4MDYsIDB4QzIsIDB4RkMsIDB4NzQsIDB4MDEsIDB4NzgsIDB4RkYsCi0JMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhDNywgMHhGRiwgMHhEOSwKLQkweDAwLCAweEJGLCAweEZELCAweDM4LCAweDA1LCAweDY5LCAweEYzLCAweDk2LCAweDNELCAweDZGLCAweDIwLAotCTB4NjYsIDB4RjMsIDB4Q0UsIDB4MDYsIDB4M0YsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRSwgMHhGRiwgMHhBOSwgMHgwMCwgMHgwRiwgMHhGRiwKLQkweEYwLCAweDAwLCAweENELCAweEZGLCAweDFCLCAweEZELCAweEU0LCAweDQ3LCAweDczLCAweDBCLCAweEEyLAotCTB4RjksIDB4MjMsIDB4MDQsIDB4NjgsIDB4RkQsIDB4NzAsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwgMHg4QiwgMHgwMSwgMHgyQiwKLQkweEZELCAweEExLCAweDA0LCAweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLCAweDQ3LCAweDM4LCAweEZCLAotCTB4QkUsIDB4MDAsIDB4NkEsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywKLQkweEZELCAweDA2LCAweENCLCAweEYyLCAweDhBLCAweDIzLCAweDU4LCAweDNCLCAweEI0LCAweEYyLCAweEJBLAotCTB4MDUsIDB4NkEsIDB4RkQsIDB4MEIsIDB4MDEsIDB4QUUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0RCwgMHgwMSwgMHhGRSwgMHhGQywgMHg1NiwKLQkweDA2LCAweEY3LCAweEYxLCAweEJGLCAweDM3LCAweDE1LCAweDI4LCAweDE4LCAweEYyLCAweDI1LCAweDA3LAotCTB4MzQsIDB4RkMsIDB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsCi0JMHgwMCwgMHhDRiwgMHhGRiwgMHg1MiwgMHgwMCwgMHhDMCwgMHhGRiwgMHhBQywgMHhGRiwgMHgwQywgMHgwMiwKLQkweEJDLCAweEY4LCAweDZELCAweDQ1LCAweDhFLCAweDEyLCAweDI0LCAweEY3LCAweDRELCAweDA1LCAweERCLAotCTB4RkMsIDB4QUUsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywgMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwKLQkweEZCLCAweDdFLCAweDA3LCAweEFGLCAweDQ4LCAweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLAotCTB4QTMsIDB4RkUsIDB4REQsIDB4MDAsIDB4OTksIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNywgMHhGRiwgMHhERCwgMHgwMSwgMHg2MCwgMHhGQywgMHg2RCwgMHgwNiwgMHg3NiwgMHhGNCwKLQkweEQ4LCAweDFCLCAweDk1LCAweDQwLCAweEMzLCAweEY0LCAweDU2LCAweDA0LCAweDRFLCAweEZFLCAweDg1LAotCTB4MDAsIDB4RjEsIDB4RkYsIDB4RjQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHg2MCwgMHhGRiwgMHhBMiwgMHgwMSwgMHg3QywgMHhGQywgMHhGQiwgMHgwNiwgMHg3QywgMHhGMSwgMHgxNSwKLQkweDMxLCAweDczLCAweDJGLCAweDgxLCAweEYxLCAweDEwLCAweDA3LCAweDY3LCAweEZDLCAweEIxLCAweDAxLAotCTB4NTgsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDIsCi0JMHgwMCwgMHg2MywgMHgwMCwgMHg4QSwgMHhGRSwgMHhGMywgMHgwMywgMHg2MywgMHhGNSwgMHhBMSwgMHg0MSwKLQkweDEyLCAweDFBLCAweEVCLCAweEY0LCAweDNGLCAweDA2LCAweDcyLCAweEZDLCAweEQ3LCAweDAxLCAweDM5LAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsIDB4MDAsCi0JMHg3OSwgMHhGRSwgMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwgMHgwNywKLQkweDA2LCAweEM3LCAweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LCAweEZGLAotCTB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkEsCi0JMHgwMSwgMHhCRiwgMHhGQywgMHg4QiwgMHgwNSwgMHg5OSwgMHhGNiwgMHg0MywgMHgxNCwgMHhBOSwgMHg0NCwKLQkweERFLCAweEY3LCAweDg1LCAweDAyLCAweDY1LCAweEZGLCAweEU3LCAweEZGLCAweDNGLCAweDAwLCAweEQ2LAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDUsIDB4MDEsCi0JMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFMywgMHhGMSwgMHhEMSwgMHgyOSwgMHg0NiwgMHgzNiwgMHhDNSwKLQkweEYxLCAweDg3LCAweDA2LCAweERBLCAweEZDLCAweDY0LCAweDAxLCAweDgwLCAweEZGLCAweDFFLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RUYsIDB4MDAsIDB4OUEsCi0JMHhGRCwgMHg3MiwgMHgwNSwgMHgxNiwgMHhGMywgMHhBNSwgMHgzQywgMHhDNCwgMHgyMSwgMHgyMSwgMHhGMywKLQkweEU0LCAweDA2LCAweDM5LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsIDB4RkYsIDB4QjYsIDB4MDAsCi0JMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywgMHgzMSwgMHhGOSwgMHg1QSwKLQkweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4ODAsIDB4MDEsIDB4NDUsIDB4RkQsIDB4NkMsCi0JMHgwNCwgMHgwQiwgMHhGOSwgMHgwQiwgMHgwRCwgMHg3MywgMHg0NywgMHgwMiwgMHhGQywgMHg1OCwgMHgwMCwKLQkweEEzLCAweDAwLCAweDM5LCAweEZGLCAweDk0LCAweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkMsIDB4RUIsIDB4MDYsCi0JMHgwQiwgMHhGMywgMHgzNSwgMHgyMiwgMHg1MiwgMHgzQywgMHhGRCwgMHhGMiwgMHg4NCwgMHgwNSwgMHg4RCwKLQkweEZELCAweEY2LCAweDAwLCAweEI4LCAweEZGLCAweDA5LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLAotCTB4MUQsIDB4MDAsIDB4ODMsIDB4RkYsIDB4NUUsIDB4MDEsIDB4RTMsIDB4RkMsIDB4N0IsIDB4MDYsIDB4RDAsCi0JMHhGMSwgMHhBNSwgMHgzNiwgMHg2MiwgMHgyOSwgMHhFRiwgMHhGMSwgMHgyOSwgMHgwNywgMHgzOSwgMHhGQywKLQkweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQ1LAotCTB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsIDB4RkYsIDB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsCi0JMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwgMHg3QywgMHgwNSwgMHhDNSwgMHhGQywgMHhCNywKLQkweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLAotCTB4NzYsIDB4RkYsIDB4MzUsIDB4MDEsIDB4RTcsIDB4RkQsIDB4MjYsIDB4MDMsIDB4QTEsIDB4RkIsIDB4NjQsCi0JMHgwNiwgMHhEMiwgMHg0OCwgMHgyMSwgMHgwMSwgMHhFOCwgMHhGRCwgMHhGNywgMHgwMSwgMHg4MywgMHhGRSwKLQkweEVDLCAweDAwLCAweDkzLCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LAotCTB4RkYsIDB4RDksIDB4MDEsIDB4NkQsIDB4RkMsIDB4NEIsIDB4MDYsIDB4Q0QsIDB4RjQsIDB4ODMsIDB4MUEsCi0JMHg1RiwgMHg0MSwgMHgzQSwgMHhGNSwgMHgwQywgMHgwNCwgMHg3QiwgMHhGRSwgMHg2QywgMHgwMCwgMHhGRSwKLQkweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVBLCAweEZGLAotCTB4QUQsIDB4MDEsIDB4NkMsIDB4RkMsIDB4MEMsIDB4MDcsIDB4N0YsIDB4RjEsIDB4REMsIDB4MkYsIDB4QUQsCi0JMHgzMCwgMHg3RCwgMHhGMSwgMHgwMSwgMHgwNywgMHg3NiwgMHhGQywgMHhBNiwgMHgwMSwgMHg1RSwgMHhGRiwKLQkweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELAotCTB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsIDB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsCi0JMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwgMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDk3LCAweEZGLCAweEUyLCAweDAwLCAweDk4LCAweEZFLAotCTB4Q0YsIDB4MDEsIDB4MzMsIDB4RkUsIDB4N0QsIDB4MDAsIDB4QkIsIDB4NDgsIDB4MUYsIDB4MDcsIDB4NTQsCi0JMHhGQiwgMHg0QywgMHgwMywgMHhEMywgMHhGRCwgMHgzRiwgMHgwMSwgMHg3MywgMHhGRiwgMHgyMywgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIxLCAweDAxLCAweEQzLAotCTB4RkMsIDB4NUQsIDB4MDUsIDB4MDEsIDB4RjcsIDB4RkIsIDB4MTIsIDB4M0YsIDB4NDUsIDB4ODMsIDB4RjgsCi0JMHgyQSwgMHgwMiwgMHg5QSwgMHhGRiwgMHhDQSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhEMSwgMHhGRiwgMHgwQywKLQkweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERBLCAweDAxLCAweDM1LCAweEZDLAotCTB4MjcsIDB4MDcsIDB4MDksIDB4RjIsIDB4ODUsIDB4MjgsIDB4NjMsIDB4MzcsIDB4RTksIDB4RjEsIDB4NjMsCi0JMHgwNiwgMHhGNSwgMHhGQywgMHg1MywgMHgwMSwgMHg4OSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LAotCTB4MDUsIDB4Q0MsIDB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsCi0JMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwKLQkweDAwLCAweEI5LCAweEZGLCAweDhBLCAweDAwLCAweDRELCAweEZGLCAweDdELCAweDAwLCAweDlDLCAweDAwLAotCTB4N0IsIDB4RkIsIDB4MzEsIDB4NDcsIDB4RDksIDB4MEQsIDB4QzAsIDB4RjgsIDB4OEYsIDB4MDQsIDB4MzQsCi0JMHhGRCwgMHg4NywgMHgwMSwgMHg1NiwgMHhGRiwgMHgyQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDI5LCAweDAwLCAweDVFLCAweEZGLCAweDc0LCAweDAxLCAweDVGLCAweEZELCAweDM1LCAweDA0LCAweDdDLAotCTB4RjksIDB4RDgsIDB4MEIsIDB4QzksIDB4NDcsIDB4RDQsIDB4RkMsIDB4RjAsIDB4RkYsIDB4REQsIDB4MDAsCi0JMHgxOSwgMHhGRiwgMHhBNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ1LCAweDA2LCAweDRGLCAweEYzLAotCTB4RTAsIDB4MjAsIDB4NDUsIDB4M0QsIDB4NEQsIDB4RjMsIDB4NEIsIDB4MDUsIDB4QjMsIDB4RkQsIDB4RTAsCi0JMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwKLQkweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLCAweEYxLCAweDg2LAotCTB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsIDB4RDEsIDB4MDEsCi0JMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEQSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZBLCAweEZGLCAweDQzLCAweEZGLCAweEJGLCAweDAyLCAweDc1LCAweEY3LCAweDQyLCAweDQ0LAotCTB4MjAsIDB4MTUsIDB4NTUsIDB4RjYsIDB4QTksIDB4MDUsIDB4QjIsIDB4RkMsIDB4QkYsIDB4MDEsIDB4NDEsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywgMHhGRiwKLQkweDI3LCAweDAxLCAweDA1LCAweEZFLCAweEVCLCAweDAyLCAweDE0LCAweEZDLCAweDUwLCAweDA1LCAweEVBLAotCTB4NDgsIDB4MUIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MzIsIDB4MDIsIDB4NjQsIDB4RkUsIDB4RkEsIDB4MDAsCi0JMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENCwKLQkweDAxLCAweDdDLCAweEZDLCAweDI3LCAweDA2LCAweDI4LCAweEY1LCAweDMxLCAweDE5LCAweDIxLCAweDQyLAotCTB4QjgsIDB4RjUsIDB4QzAsIDB4MDMsIDB4QUEsIDB4RkUsIDB4NTEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RUEsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwgMHhCNywgMHgwMSwKLQkweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLCAweDlGLCAweDJFLCAweEUzLCAweDMxLCAweDdFLAotCTB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsIDB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFOCwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzMSwKLQkweEZFLCAweDg0LCAweDA0LCAweDc5LCAweEY0LCAweDA3LCAweDQwLCAweEJBLCAweDFDLCAweDNFLCAweEY0LAotCTB4ODIsIDB4MDYsIDB4NTgsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxOCwgMHgwMCwgMHg5RCwgMHhGRiwgMHhEMywgMHgwMCwgMHhCOCwgMHhGRSwgMHg5MywgMHgwMSwKLQkweEExLCAweEZFLCAweDhFLCAweEZGLCAweDkyLCAweDQ4LCAweDNELCAweDA4LCAweEUxLCAweEZBLCAweDg2LAotCTB4MDMsIDB4QjYsIDB4RkQsIDB4NEMsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBOCwgMHgwMSwgMHhFOSwgMHhGQywgMHgyRCwKLQkweDA1LCAweDZCLCAweEY3LCAweEI2LCAweDExLCAweEM4LCAweDQ1LCAweDMwLCAweEY5LCAweENELCAweDAxLAotCTB4RDAsIDB4RkYsIDB4QUMsIDB4RkYsIDB4NUMsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMywgMHhGQywgMHgyMCwgMHgwNywKLQkweDM1LCAweEYyLCAweDM2LCAweDI3LCAweDc4LCAweDM4LCAweDE0LCAweEYyLCAweDNCLCAweDA2LCAweDExLAotCTB4RkQsIDB4NDEsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHhBNywgMHhGRiwgMHgxOSwgMHgwMSwgMHg1MywgMHhGRCwgMHhEQiwgMHgwNSwgMHg4OCwKLQkweEYyLCAweEFELCAweDNBLCAweDZELCAweDI0LCAweEE0LCAweEYyLCAweDA4LCAweDA3LCAweDMyLCAweEZDLAotCTB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkYsCi0JMHhGRiwgMHg3QiwgMHgwMCwgMHg2QywgMHhGRiwgMHg0NCwgMHgwMCwgMHgwMSwgMHgwMSwgMHhCNiwgMHhGQSwKLQkweEM4LCAweDQ2LCAweDEzLCAweDBGLCAweDUxLCAweEY4LCAweEM0LCAweDA0LCAweDFCLCAweEZELCAweDkyLAotCTB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCi0JMHg2MywgMHhGRiwgMHg2NywgMHgwMSwgMHg3QSwgMHhGRCwgMHhGRSwgMHgwMywgMHhFRSwgMHhGOSwgMHhBQSwKLQkweDBBLCAweDE2LCAweDQ4LCAweEFDLCAweEZELCAweDg2LCAweEZGLCAweDE3LCAweDAxLCAweEZBLCAweEZFLAotCTB4QjMsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCi0JMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywgMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwKLQkweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLCAweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLAotCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzMsIDB4RkYsCi0JMHg3RCwgMHgwMSwgMHhCMywgMHhGQywgMHhCQiwgMHgwNiwgMHg5QSwgMHhGMSwgMHg2MCwgMHgzNCwgMHhGNSwKLQkweDJCLCAweEIwLCAweEYxLCAweDI4LCAweDA3LCAweDQ3LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLAotCTB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MTcsCi0JMHgwMCwgMHgxMCwgMHhGRiwgMHgxNSwgMHgwMywgMHhERCwgMHhGNiwgMHg5RSwgMHg0MywgMHg2QywgMHgxNiwKLQkweEYxLCAweEY1LCAweEQzLCAweDA1LCAweDlGLCAweEZDLCAweEM2LCAweDAxLCAweDNGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MTksIDB4MDEsCi0JMHgyMywgMHhGRSwgMHhCMCwgMHgwMiwgMHg4NywgMHhGQywgMHg0MSwgMHgwNCwgMHhGNCwgMHg0OCwgMHgxQywKLQkweDAzLCAweDA2LCAweEZELCAweDZFLCAweDAyLCAweDQ1LCAweEZFLCAweDA5LCAweDAxLCAweDg4LCAweEZGLAotCTB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4OEMsCi0JMHhGQywgMHgwMCwgMHgwNiwgMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwgMHg0MiwgMHgzRiwgMHhGNiwKLQkweDcxLCAweDAzLCAweEQ5LCAweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLCAweEU1LCAweEZGLCAweDA3LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEYsIDB4RkYsIDB4QzEsIDB4MDEsIDB4NTIsIDB4RkMsCi0JMHgyMiwgMHgwNywgMHg5OCwgMHhGMSwgMHg1RSwgMHgyRCwgMHgxMywgMHgzMywgMHg4NywgMHhGMSwgMHhEOCwKLQkweDA2LCAweDlCLCAweEZDLCAweDhELCAweDAxLCAweDZCLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLAotCTB4MDMsIDB4MDAsIDB4RkMsIDB4RkYsIDB4REMsIDB4RkYsIDB4QUYsIDB4MDAsIDB4MDcsIDB4RkUsIDB4QzgsCi0JMHgwNCwgMHgxMCwgMHhGNCwgMHgyRCwgMHgzRiwgMHgwRiwgMHgxRSwgMHhFRCwgMHhGMywgMHhBMCwgMHgwNiwKLQkweDRFLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LAotCTB4MDAsIDB4QTMsIDB4RkYsIDB4QzMsIDB4MDAsIDB4RDcsIDB4RkUsIDB4NTgsIDB4MDEsIDB4MEYsIDB4RkYsCi0JMHhBNiwgMHhGRSwgMHg1RCwgMHg0OCwgMHg2MSwgMHgwOSwgMHg2RSwgMHhGQSwgMHhDMCwgMHgwMywgMHg5OSwKLQkweEZELCAweDU5LCAweDAxLCAweDY4LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsIDB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsCi0JMHhGNywgMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwgMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwKLQkweDhFLCAweEZGLCAweDZCLCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LAotCTB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTYsIDB4MDcsIDB4NjcsIDB4RjIsCi0JMHhFNSwgMHgyNSwgMHg4NywgMHgzOSwgMHg0NywgMHhGMiwgMHgxMCwgMHgwNiwgMHgzMCwgMHhGRCwgMHgyRiwKLQkweDAxLCAweDlDLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDEzLCAweDAwLAotCTB4OUQsIDB4RkYsIDB4MkQsIDB4MDEsIDB4MzMsIDB4RkQsIDB4MEIsIDB4MDYsIDB4NEQsIDB4RjIsIDB4QTUsCi0JMHgzOSwgMHhCRiwgMHgyNSwgMHg2RCwgMHhGMiwgMHgxNSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKLQkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLCAweEM1LCAweEZGLCAweDZELAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4MEQsIDB4MDAsIDB4NjMsIDB4MDEsIDB4RjksIDB4RjksIDB4NTUsIDB4NDYsCi0JMHg1MSwgMHgxMCwgMHhFMywgMHhGNywgMHhGNywgMHgwNCwgMHgwMywgMHhGRCwgMHg5RCwgMHgwMSwgMHg0RSwKLQkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLAotCTB4NUIsIDB4MDEsIDB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksIDB4NTcsCi0JMHg0OCwgMHg4RCwgMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwgMHgwMCwKLQkweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLAotCTB4MDEsIDB4NEQsIDB4RkMsIDB4QTMsIDB4MDYsIDB4RTQsIDB4RjMsIDB4MzYsIDB4MUUsIDB4MTYsIDB4M0YsCi0JMHgwNSwgMHhGNCwgMHhDRiwgMHgwNCwgMHgwMiwgMHhGRSwgMHhCMiwgMHgwMCwgMHhEQiwgMHhGRiwgMHhGQywKLQkweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDhCLCAweDAxLAotCTB4OUQsIDB4RkMsIDB4RDUsIDB4MDYsIDB4ODksIDB4RjEsIDB4MzUsIDB4MzMsIDB4M0EsIDB4MkQsIDB4OUEsCi0JMHhGMSwgMHgyMywgMHgwNywgMHg1MSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDFBLCAweDAwLCAweDMzLCAweDAwLCAweERGLAotCTB4RkUsIDB4NjgsIDB4MDMsIDB4NEUsIDB4RjYsIDB4RUUsIDB4NDIsIDB4QkIsIDB4MTcsIDB4OTAsIDB4RjUsCi0JMHhGQywgMHgwNSwgMHg4RSwgMHhGQywgMHhDRCwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLCAweEZFLCAweDc0LCAweDAyLAotCTB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsIDB4OTQsIDB4RkMsIDB4QTksCi0JMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLCAweEM3LCAweDAxLCAweDlELCAweEZDLCAweEQ4LAotCTB4MDUsIDB4RTcsIDB4RjUsIDB4OTEsIDB4MTYsIDB4ODksIDB4NDMsIDB4Q0QsIDB4RjYsIDB4MUUsIDB4MDMsCi0JMHgwQiwgMHhGRiwgMHgxQSwgMHgwMCwgMHgyNiwgMHgwMCwgMHhFMCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM5LCAweDAxLCAweDQ4LCAweEZDLCAweDI4LCAweDA3LAotCTB4QUQsIDB4RjEsIDB4MTksIDB4MkMsIDB4M0YsIDB4MzQsIDB4OTcsIDB4RjEsIDB4QkUsIDB4MDYsIDB4QjAsCi0JMHhGQywgMHg3RiwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEQwLCAweEZGLCAweEM3LCAweDAwLCAweERFLCAweEZELCAweDA4LCAweDA1LCAweEIwLAotCTB4RjMsIDB4NEEsIDB4M0UsIDB4NjQsIDB4MUYsIDB4QTAsIDB4RjMsIDB4QkIsIDB4MDYsIDB4NDUsIDB4RkMsCi0JMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOSwKLQkweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELCAweDAxLCAweDdBLCAweEZGLCAweEM1LCAweEZELAotCTB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksIDB4RjgsIDB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsCi0JMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweDUyLCAweEZGLCAweDkzLCAweDAxLCAweDE4LCAweEZELCAweEM5LCAweDA0LCAweDQ1LCAweEY4LCAweDM2LAotCTB4MEYsIDB4QkIsIDB4NDYsIDB4QTEsIDB4RkEsIDB4MEMsIDB4MDEsIDB4M0UsIDB4MDAsIDB4NzAsIDB4RkYsCi0JMHg3QSwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwKLQkweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDA5LCAweDA3LCAweDlELCAweEYyLCAweDkyLCAweDI0LAotCTB4OEYsIDB4M0EsIDB4ODIsIDB4RjIsIDB4RTEsIDB4MDUsIDB4NTAsIDB4RkQsIDB4MUIsIDB4MDEsIDB4QTYsCi0JMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwMCwgMHg5MywgMHhGRiwKLQkweDNGLCAweDAxLCAweDE1LCAweEZELCAweDM2LCAweDA2LCAweDE5LCAweEYyLCAweDk3LCAweDM4LCAweDExLAotCTB4MjcsIDB4M0IsIDB4RjIsIDB4MUYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0QsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwKLQkweEZGLCAweEQ2LCAweEZGLCAweEMzLCAweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLAotCTB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsIDB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHg0RSwgMHgwMSwKLQkweEIzLCAweEZELCAweDhELCAweDAzLCAweEQ0LCAweEZBLCAweDVELCAweDA4LCAweDhELCAweDQ4LCAweDc0LAotCTB4RkYsIDB4QUUsIDB4RkUsIDB4OEQsIDB4MDEsIDB4QkIsIDB4RkUsIDB4RDEsIDB4MDAsIDB4OUUsIDB4RkYsCi0JMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1NywKLQkweEZDLCAweDg1LCAweDA2LCAweDM0LCAweEY0LCAweEUwLCAweDFDLCAweEYwLCAweDNGLCAweDZELCAweEY0LAotCTB4OEMsIDB4MDQsIDB4MkMsIDB4RkUsIDB4OTksIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg4QSwgMHhGQywKLQkweEVDLCAweDA2LCAweDdGLCAweEYxLCAweDA0LCAweDMyLCAweDdCLCAweDJFLCAweDhBLCAweEYxLCAweDFBLAotCTB4MDcsIDB4NUQsIDB4RkMsIDB4QjgsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwKLQkweDAzLCAweEM3LCAweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LAotCTB4N0QsIDB4RkMsIDB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsCi0JMHgwMCwgMHg4RCwgMHhGRiwgMHhGQywgMHgwMCwgMHg2MSwgMHhGRSwgMHgzOSwgMHgwMiwgMHg2QiwgMHhGRCwKLQkweDM3LCAweDAyLCAweEVCLCAweDQ4LCAweDMxLCAweDA1LCAweDIxLCAweEZDLCAweEU0LCAweDAyLCAweDA4LAotCTB4RkUsIDB4MjYsIDB4MDEsIDB4N0MsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhDMCwgMHgwMSwgMHhBRiwgMHhGQywgMHhBRCwgMHgwNSwgMHg0QSwKLQkweEY2LCAweDQ0LCAweDE1LCAweDJGLCAweDQ0LCAweDY0LCAweEY3LCAweEM5LCAweDAyLCAweDNELCAweEZGLAotCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHg0NywgMHhGRiwgMHhEMCwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwgMHgwNywgMHhDQSwgMHhGMSwKLQkweEQxLCAweDJBLCAweDY1LCAweDM1LCAweEFFLCAweEYxLCAweEEwLCAweDA2LCAweEM3LCAweEZDLCAweDcwLAotCTB4MDEsIDB4N0EsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsCi0JMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwgMHhGMywgMHg2MSwKLQkweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLCAweEU2LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTUsCi0JMHgwMCwgMHgxNiwgMHhGRiwgMHhFMywgMHgwMCwgMHhFNCwgMHhGRiwgMHhFQiwgMHhGQywgMHhEMiwgMHg0NywKLQkweEI2LCAweDBCLCAweDg5LCAweEY5LCAweDJGLCAweDA0LCAweDYyLCAweEZELCAweDcyLCAweDAxLCAweDVFLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsCi0JMHg4OCwgMHgwMSwgMHgzMSwgMHhGRCwgMHg5NSwgMHgwNCwgMHhCNCwgMHhGOCwgMHhGQywgMHgwRCwgMHgyNiwKLQkweDQ3LCAweDY0LCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDAwLCAweDUxLCAweEZGLCAweDg5LCAweDAwLAotCTB4QkEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsCi0JMHgwMSwgMHgzNCwgMHhGQywgMHhGOSwgMHgwNiwgMHhEOSwgMHhGMiwgMHgzRiwgMHgyMywgMHg5MCwgMHgzQiwKLQkweEM0LCAweEYyLCAweEFFLCAweDA1LCAweDcyLCAweEZELCAweDA3LCAweDAxLCAweEIwLCAweEZGLCAweDBDLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTEsIDB4MDEsCi0JMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwgMHg4MiwgMHgzNywgMHg2MCwgMHgyOCwgMHgwRSwKLQkweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NEYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4QTAsCi0JMHhGRiwgMHgyMCwgMHgwMiwgMHg5NiwgMHhGOCwgMHg0RSwgMHg0NSwgMHhENywgMHgxMiwgMHgwRCwgMHhGNywKLQkweDU4LCAweDA1LCAweEQ2LCAweEZDLCAweEIwLCAweDAxLCAweDQ3LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4NDAsIDB4MDEsIDB4RDAsIDB4RkQsCi0JMHg1MywgMHgwMywgMHg0NywgMHhGQiwgMHgzRiwgMHgwNywgMHhCOCwgMHg0OCwgMHg2MiwgMHgwMCwgMHgzRiwKLQkweEZFLCAweEM4LCAweDAxLCAweDlDLCAweEZFLCAweEUwLCAweDAwLCAweDk4LCAweEZGLCAweDE5LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REMsIDB4MDEsIDB4NjMsIDB4RkMsIDB4NjYsCi0JMHgwNiwgMHg4OSwgMHhGNCwgMHg4QywgMHgxQiwgMHhDMywgMHg0MCwgMHhERCwgMHhGNCwgMHg0NiwgMHgwNCwKLQkweDU4LCAweEZFLCAweDgwLCAweDAwLCAweEY0LCAweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsIDB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsCi0JMHg3RCwgMHhGMSwgMHhDRiwgMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwgMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwKLQkweEZDLCAweEFFLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLAotCTB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjksIDB4MDAsIDB4ODAsIDB4RkUsIDB4MDQsIDB4MDQsIDB4NDgsCi0JMHhGNSwgMHg3NCwgMHg0MSwgMHg1RCwgMHgxQSwgMHhENywgMHhGNCwgMHg0NywgMHgwNiwgMHg2RiwgMHhGQywKLQkweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkzLAotCTB4RkYsIDB4RUQsIDB4MDAsIDB4ODAsIDB4RkUsIDB4RkQsIDB4MDEsIDB4REMsIDB4RkQsIDB4M0MsIDB4MDEsCi0JMHhENSwgMHg0OCwgMHg0NSwgMHgwNiwgMHhBRSwgMHhGQiwgMHgxRiwgMHgwMywgMHhFQSwgMHhGRCwgMHgzNCwKLQkweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLAotCTB4NDQsIDB4RkYsIDB4QjgsIDB4MDEsIDB4QzMsIDB4RkMsIDB4ODEsIDB4MDUsIDB4QjAsIDB4RjYsIDB4RkEsCi0JMHgxMywgMHhDQywgMHg0NCwgMHgwMiwgMHhGOCwgMHg3MSwgMHgwMiwgMHg3MSwgMHhGRiwgMHhFMSwgMHhGRiwKLQkweDQyLCAweDAwLCAweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLAotCTB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsIDB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksCi0JMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwgMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwKLQkweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA5LCAweDAwLCAweEJBLCAweEZGLAotCTB4RjQsIDB4MDAsIDB4OTEsIDB4RkQsIDB4N0UsIDB4MDUsIDB4MDUsIDB4RjMsIDB4NkUsIDB4M0MsIDB4MTAsCi0JMHgyMiwgMHgxMiwgMHhGMywgMHhFOSwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI1LCAweEZGLCAweDk2LCAweDAwLCAweDM1LAotCTB4RkYsIDB4QTksIDB4MDAsIDB4NEQsIDB4MDAsIDB4MTksIDB4RkMsIDB4N0MsIDB4NDcsIDB4RTgsIDB4MEMsCi0JMHgxOCwgMHhGOSwgMHg2NiwgMHgwNCwgMHg0OCwgMHhGRCwgMHg3RSwgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVBLCAweEZGLCAweDdELCAweDAxLAotCTB4NEIsIDB4RkQsIDB4NjAsIDB4MDQsIDB4MjQsIDB4RjksIDB4QzYsIDB4MEMsIDB4ODYsIDB4NDcsIDB4MzAsCi0JMHhGQywgMHg0MSwgMHgwMCwgMHhCMCwgMHgwMCwgMHgzMiwgMHhGRiwgMHg5OCwgMHgwMCwgMHhCNCwgMHhGRiwKLQkweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM4LAotCTB4RkMsIDB4RTYsIDB4MDYsIDB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsIDB4M0MsIDB4MEUsIDB4RjMsCi0JMHg3OCwgMHgwNSwgMHg5NiwgMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwKLQkweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgxLCAweEZGLCAweDYyLCAweDAxLCAweERELCAweEZDLAotCTB4ODMsIDB4MDYsIDB4QzksIDB4RjEsIDB4NjYsIDB4MzYsIDB4QUMsIDB4MjksIDB4RTcsIDB4RjEsIDB4MkEsCi0JMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDBCLCAweDAwLCAweEQ2LCAweEZGLCAweDQxLCAweDAwLCAweEU0LCAweEZGLCAweDZCLCAweEZGLCAweDdCLAotCTB4MDIsIDB4RjAsIDB4RjcsIDB4QkEsIDB4NDQsIDB4MUUsIDB4MTQsIDB4QTUsIDB4RjYsIDB4ODYsIDB4MDUsCi0JMHhDMSwgMHhGQywgMHhCOSwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDMyLCAweDAxLCAweEVELCAweEZELCAweDE5LCAweDAzLAotCTB4QkIsIDB4RkIsIDB4MjYsIDB4MDYsIDB4RDcsIDB4NDgsIDB4NTgsIDB4MDEsIDB4Q0YsIDB4RkQsIDB4MDQsCi0JMHgwMiwgMHg3RCwgMHhGRSwgMHhFRiwgMHgwMCwgMHg5MiwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLAotCTB4RjQsIDB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsIDB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsCi0JMHg2NiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwKLQkweDAwLCAweDU5LCAweEZGLCAweEIwLCAweDAxLCAweDY5LCAweEZDLCAweDBGLCAweDA3LCAweDgwLCAweEYxLAotCTB4OTYsIDB4MkYsIDB4RjIsIDB4MzAsIDB4N0MsIDB4RjEsIDB4RkQsIDB4MDYsIDB4N0EsIDB4RkMsIDB4QTMsCi0JMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGNCwgMHhGRiwKLQkweEYyLCAweEZGLCAweDgzLCAweDAwLCAweDUzLCAweEZFLCAweDRFLCAweDA0LCAweEQwLCAweEY0LCAweEFCLAotCTB4NDAsIDB4QjIsIDB4MUIsIDB4N0YsIDB4RjQsIDB4NjksIDB4MDYsIDB4NjIsIDB4RkMsIDB4REQsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OCwgMHhGRiwgMHhERSwKLQkweDAwLCAweDlGLCAweEZFLCAweEMyLCAweDAxLCAweDRCLCAweEZFLCAweDQ4LCAweDAwLCAweEIzLCAweDQ4LAotCTB4NUUsIDB4MDcsIDB4M0IsIDB4RkIsIDB4NTksIDB4MDMsIDB4Q0QsIDB4RkQsIDB4NDIsIDB4MDEsIDB4NzEsCi0JMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywgMHhGRiwKLQkweEFGLCAweDAxLCAweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLCAweDVDLAotCTB4NDUsIDB4QTksIDB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsIDB4MDAsCi0JMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQiwKLQkweDAxLCAweDM1LCAweEZDLCAweDI1LCAweDA3LCAweDEzLCAweEYyLCAweDNBLCAweDI4LCAweEEwLCAweDM3LAotCTB4RjIsIDB4RjEsIDB4NUEsIDB4MDYsIDB4RkIsIDB4RkMsIDB4NEYsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUEsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgwOSwgMHgwMSwKLQkweDZFLCAweEZELCAweEI0LCAweDA1LCAweEJDLCAweEYyLCAweDczLCAweDNCLCAweDY0LCAweDIzLCAweEQyLAotCTB4RjIsIDB4RkIsIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NywgMHgwMCwgMHg1NCwgMHhGRiwgMHg3MCwKLQkweDAwLCAweEIzLCAweDAwLCAweDRFLCAweEZCLCAweDFBLCAweDQ3LCAweDFGLCAweDBFLCAweEE4LCAweEY4LAotCTB4OUIsIDB4MDQsIDB4MkUsIDB4RkQsIDB4OEEsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwgMHgwMSwgMHg2NSwgMHhGRCwKLQkweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LCAweDAzLCAweEZELCAweEQ5LAotCTB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMCwKLQkweDA2LCAweDVFLCAweEYzLCAweDk0LCAweDIwLCAweDdCLCAweDNELCAweDYwLCAweEYzLCAweDNFLCAweDA1LAotCTB4QkIsIDB4RkQsIDB4REIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgyMCwgMHgwMCwgMHg3OSwgMHhGRiwgMHg3MiwgMHgwMSwgMHhDNCwgMHhGQywgMHhBNCwgMHgwNiwKLQkweEFCLCAweEYxLCAweDQ2LCAweDM1LCAweEY3LCAweDJBLCAweEM2LCAweEYxLCAweDJBLCAweDA3LCAweDQwLAotCTB4RkMsIDB4Q0YsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHhEQiwgMHhGRiwgMHgzMywgMHgwMCwgMHgwMSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEMywgMHgwMiwgMHg1MywKLQkweEY3LCAweDFGLCAweDQ0LCAweDY5LCAweDE1LCAweDNGLCAweEY2LCAweEIyLCAweDA1LCAweEFELCAweEZDLAotCTB4QzEsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsCi0JMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywgMHhGRSwgMHhERSwgMHgwMiwgMHgyRSwgMHhGQywKLQkweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLCAweDVFLCAweEZELCAweDNGLCAweDAyLCAweDVELAotCTB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzQiwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RiwgMHhGQywgMHgxRiwgMHgwNiwgMHgzQywgMHhGNSwgMHhFNiwKLQkweDE4LCAweDRELCAweDQyLCAweEQ1LCAweEY1LCAweEFGLCAweDAzLCAweEI0LCAweEZFLCAweDRCLCAweDAwLAotCTB4MEUsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsCi0JMHhGRiwgMHhCQSwgMHgwMSwgMHg1QiwgMHhGQywgMHgxQiwgMHgwNywgMHg4QiwgMHhGMSwgMHg1OCwgMHgyRSwKLQkweDI2LCAweDMyLCAweDgwLCAweEYxLCAweEVBLCAweDA2LCAweDhDLCAweEZDLCAweDk3LCAweDAxLCAweDY2LAotCTB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RTYsIDB4RkYsCi0JMHg5QywgMHgwMCwgMHgyNywgMHhGRSwgMHg5NCwgMHgwNCwgMHg2MSwgMHhGNCwgMHhENywgMHgzRiwgMHgwNiwKLQkweDFELCAweDJCLCAweEY0LCAweDg5LCAweDA2LCAweDU2LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsCi0JMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwgMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwKLQkweEM3LCAweEZBLCAweDkzLCAweDAzLCAweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTYsIDB4MDEsCi0JMHhFRSwgMHhGQywgMHgyMywgMHgwNSwgMHg4MywgMHhGNywgMHg2RSwgMHgxMSwgMHhFNSwgMHg0NSwgMHg1NywKLQkweEY5LCAweEI4LCAweDAxLCAweERDLCAweEZGLCAweEE1LCAweEZGLCAweDVGLCAweDAwLCAweENBLCAweEZGLAotCTB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0QsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzIsCi0JMHhGQywgMHgxRSwgMHgwNywgMHg0MCwgMHhGMiwgMHhFQiwgMHgyNiwgMHhCNSwgMHgzOCwgMHgxRiwgMHhGMiwKLQkweDMyLCAweDA2LCAweDE4LCAweEZELCAweDNELCAweDAxLCAweDk0LCAweEZGLCAweDE2LCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QTQsIDB4RkYsIDB4MUQsIDB4MDEsIDB4NEMsIDB4RkQsCi0JMHhFNiwgMHgwNSwgMHg3QiwgMHhGMiwgMHg3MSwgMHgzQSwgMHhCOCwgMHgyNCwgMHg5NywgMHhGMiwgMHgwQiwKLQkweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MEYsIDB4MDAsIDB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsCi0JMHgwMSwgMHg4QiwgMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwKLQkweDE1LCAweEZELCAweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjQsIDB4RkYsIDB4NjUsIDB4MDEsIDB4ODEsIDB4RkQsIDB4RjIsIDB4MDMsCi0JMHgwOCwgMHhGQSwgMHg2OCwgMHgwQSwgMHgyNSwgMHg0OCwgMHhERSwgMHhGRCwgMHg2RSwgMHhGRiwgMHgyNCwKLQkweDAxLCAweEYzLCAweEZFLCAweEI2LCAweDAwLCAweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDYsIDB4RkMsIDB4QjgsIDB4MDYsIDB4QTgsCi0JMHhGMywgMHgzRiwgMHgxRiwgMHg2NCwgMHgzRSwgMHhCQSwgMHhGMywgMHgwMSwgMHgwNSwgMHhFMiwgMHhGRCwKLQkweEM0LCAweDAwLCAweEQyLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIzLAotCTB4MDAsIDB4NzEsIDB4RkYsIDB4ODEsIDB4MDEsIDB4QUUsIDB4RkMsIDB4QzEsIDB4MDYsIDB4OTUsIDB4RjEsCi0JMHgxRSwgMHgzNCwgMHgzRSwgMHgyQywgMHhBQiwgMHhGMSwgMHgyNywgMHgwNywgMHg0OSwgMHhGQywgMHhDOCwKLQkweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUxLCAweEZGLAotCTB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsIDB4RjYsIDB4NzcsCi0JMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywgMHhDOCwgMHgwMSwKLQkweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLAotCTB4RkYsIDB4MTYsIDB4MDEsIDB4MkEsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTEsIDB4RkMsIDB4MDYsIDB4MDQsCi0JMHhGNSwgMHg0OCwgMHg1NiwgMHgwMywgMHhFRCwgMHhGQywgMHg3QiwgMHgwMiwgMHgzRSwgMHhGRSwgMHgwQywKLQkweDAxLCAweDg2LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAotCTB4Q0MsIDB4MDEsIDB4OEYsIDB4RkMsIDB4RjgsIDB4MDUsIDB4OUIsIDB4RjUsIDB4OTYsIDB4MTcsIDB4MDIsCi0JMHg0MywgMHg1RSwgMHhGNiwgMHg1RiwgMHgwMywgMHhFNCwgMHhGRSwgMHgzMCwgMHgwMCwgMHgxQiwgMHgwMCwKLQkweEU0LCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLAotCTB4MDEsIDB4NEYsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUMsIDB4RjEsIDB4MTcsIDB4MkQsIDB4NTcsIDB4MzMsCi0JMHg4QSwgMHhGMSwgMHhEMywgMHgwNiwgMHg5RiwgMHhGQywgMHg4QSwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwKLQkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweEQ5LCAweEZGLCAweEI0LCAweDAwLAotCTB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsIDB4RkMsIDB4M0UsIDB4NUIsIDB4MUUsIDB4REIsCi0JMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMwLCAweDAwLCAweERFLCAweEZFLCAweDRCLAotCTB4MDEsIDB4MjcsIDB4RkYsIDB4NzMsIDB4RkUsIDB4NEYsIDB4NDgsIDB4QTIsIDB4MDksIDB4NTQsIDB4RkEsCi0JMHhDQywgMHgwMywgMHg5MywgMHhGRCwgMHg1QywgMHgwMSwgMHg2NywgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlDLCAweDAxLCAweDA1LCAweEZELAotCTB4RjEsIDB4MDQsIDB4RjAsIDB4RjcsIDB4MkQsIDB4MTAsIDB4NjEsIDB4NDYsIDB4MEQsIDB4RkEsIDB4NTgsCi0JMHgwMSwgMHgxMywgMHgwMCwgMHg4NywgMHhGRiwgMHg2RSwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDE0LAotCTB4MDcsIDB4NzMsIDB4RjIsIDB4OTksIDB4MjUsIDB4QzIsIDB4MzksIDB4NTQsIDB4RjIsIDB4MDUsIDB4MDYsCi0JMHgzNywgMHhGRCwgMHgyQiwgMHgwMSwgMHg5RSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDE0LCAweDAwLCAweDlCLCAweEZGLCAweDMxLCAweDAxLCAweDJDLCAweEZELCAweDE1LCAweDA2LAotCTB4NDEsIDB4RjIsIDB4NkEsIDB4MzksIDB4MEEsIDB4MjYsIDB4NjEsIDB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsCi0JMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKLQkweEM2LCAweEZGLCAweDY5LCAweDAwLCAweDkxLCAweEZGLCAweDAwLCAweDAwLCAweDc4LCAweDAxLCAweEQwLAotCTB4RjksIDB4MzksIDB4NDYsIDB4OTgsIDB4MTAsIDB4Q0IsIDB4RjcsIDB4MDIsIDB4MDUsIDB4RkUsIDB4RkMsCi0JMHg5RiwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwKLQkweDAwLCAweDY5LCAweEZGLCAweDU4LCAweDAxLCAweDlELCAweEZELCAweEI5LCAweDAzLCAweDdCLCAweEZBLAotCTB4NDAsIDB4MDksIDB4NjMsIDB4NDgsIDB4QkYsIDB4RkUsIDB4MDMsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RDQsCi0JMHhGRSwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDRGLCAweEZDLCAweDlDLCAweDA2LCAweEY1LCAweEYzLCAweEVBLAotCTB4MUQsIDB4NDcsIDB4M0YsIDB4MUIsIDB4RjQsIDB4QzEsIDB4MDQsIDB4MEIsIDB4RkUsIDB4QUMsIDB4MDAsCi0JMHhERSwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwKLQkweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLCAweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLAotCTB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsIDB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNiwgMHhGRiwgMHgxNywgMHgwMCwKLQkweDM5LCAweDAwLCAweEQ0LCAweEZFLCAweDdBLCAweDAzLCAweDJGLCAweEY2LCAweEM3LCAweDQyLCAweDA2LAotCTB4MTgsIDB4N0IsIDB4RjUsIDB4MDUsIDB4MDYsIDB4OEEsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHgwNywgMHgwMSwgMHg0OSwKLQkweEZFLCAweDY3LCAweDAyLCAweDEzLCAweEZELCAweEZGLCAweDAyLCAweEY0LCAweDQ4LCAweDVGLCAweDA0LAotCTB4N0EsIDB4RkMsIDB4QjYsIDB4MDIsIDB4MjAsIDB4RkUsIDB4MUIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNiwgMHgwMSwKLQkweEExLCAweEZDLCAweENGLCAweDA1LCAweEZDLCAweEY1LCAweDQ3LCAweDE2LCAweEIwLCAweDQzLCAweEVFLAotCTB4RjYsIDB4MEMsIDB4MDMsIDB4MTYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4MjksIDB4MDAsIDB4REYsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhDQSwgMHgwMSwgMHg0NiwKLQkweEZDLCAweDI5LCAweDA3LCAweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLCAweDM0LCAweDlDLCAweEYxLAotCTB4QjgsIDB4MDYsIDB4QjUsIDB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRSwgMHhGRiwgMHhDQywgMHgwMCwgMHhENSwgMHhGRCwKLQkweDE2LCAweDA1LCAweDlCLCAweEYzLCAweDE4LCAweDNFLCAweEIxLCAweDFGLCAweDhGLCAweEYzLCAweEMwLAotCTB4MDYsIDB4NDMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxNSwgMHgwMCwgMHhBQSwgMHhGRiwgMHhCMSwgMHgwMCwgMHhGRSwgMHhGRSwgMHgxMCwgMHgwMSwgMHg5MiwKLQkweEZGLCAweDk0LCAweEZELCAweDBELCAweDQ4LCAweENCLCAweDBBLCAweEUyLCAweEY5LCAweDA0LCAweDA0LAotCTB4NzcsIDB4RkQsIDB4NjksIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MSwgMHgwMSwgMHgxRSwgMHhGRCwgMHhCRSwgMHgwNCwKLQkweDVFLCAweEY4LCAweEYwLCAweDBFLCAweEQzLCAweDQ2LCAweENCLCAweEZBLCAweEY2LCAweDAwLCAweDRCLAotCTB4MDAsIDB4NjksIDB4RkYsIDB4N0QsIDB4MDAsIDB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwKLQkweEYyLCAweDQ2LCAweDI0LCAweEM4LCAweDNBLCAweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELAotCTB4MTcsIDB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsCi0JMHgwMCwgMHg5MSwgMHhGRiwgMHg0MywgMHgwMSwgMHgwRSwgMHhGRCwgMHg0MCwgMHgwNiwgMHgwRiwgMHhGMiwKLQkweDVCLCAweDM4LCAweDVDLCAweDI3LCAweDMwLCAweEYyLCAweDIxLCAweDA3LCAweDMzLCAweEZDLCAweERFLAotCTB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0MsIDB4RkYsCi0JMHg1QSwgMHgwMCwgMHhBRiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgxQywgMHhGOSwgMHhCOCwKLQkweDQ1LCAweERBLCAweDExLCAweDYwLCAweEY3LCAweDMzLCAweDA1LCAweEU3LCAweEZDLCAweEE5LCAweDAxLAotCTB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkUsCi0JMHhGRiwgMHg0QiwgMHgwMSwgMHhCOSwgMHhGRCwgMHg4MCwgMHgwMywgMHhFRSwgMHhGQSwgMHgxRCwgMHgwOCwKLQkweDk4LCAweDQ4LCAweEE4LCAweEZGLCAweDk1LCAweEZFLCAweDlBLCAweDAxLCAweEI0LCAweEZFLCAweEQ0LAotCTB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhERiwgMHgwMSwgMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywgMHgxRiwKLQkweDQwLCAweDg1LCAweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUIsCi0JMHgwMSwgMHg4NiwgMHhGQywgMHhGMSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhDMCwgMHgzMSwgMHhDMiwgMHgyRSwKLQkweDg3LCAweEYxLCAweDE3LCAweDA3LCAweDVGLCAweEZDLCAweEI2LCAweDAxLCAweDU1LCAweEZGLCAweDJELAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDksIDB4MDAsIDB4NTQsIDB4MDAsCi0JMHhBNCwgMHhGRSwgMHhDOSwgMHgwMywgMHhBQSwgMHhGNSwgMHgwQywgMHg0MiwgMHg1NiwgMHgxOSwgMHgxRSwKLQkweEY1LCAweDJCLCAweDA2LCAweDdBLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEUsIDB4RkYsIDB4RjksIDB4MDAsIDB4NjgsIDB4RkUsIDB4MkMsCi0JMHgwMiwgMHg4NCwgMHhGRCwgMHhGRiwgMHgwMSwgMHhFNiwgMHg0OCwgMHg2RSwgMHgwNSwgMHgwNywgMHhGQywKLQkweEYxLCAweDAyLCAweDAxLCAweEZFLCAweDI5LCAweDAxLCAweDdCLCAweEZGLCAweDIxLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsIDB4MDEsIDB4QjQsIDB4RkMsCi0JMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwgMHg4NiwgMHhGNywgMHhCNiwKLQkweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsIDB4M0UsIDB4RkMsIDB4MkIsCi0JMHgwNywgMHhEMCwgMHhGMSwgMHg4OSwgMHgyQSwgMHhBNiwgMHgzNSwgMHhCNCwgMHhGMSwgMHg5OSwgMHgwNiwKLQkweENELCAweEZDLCAweDZELCAweDAxLCAweDdDLCAweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLCAweDAxLAotCTB4MDAsIDB4MDYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4RTMsIDB4MDAsIDB4QUUsIDB4RkQsIDB4NTIsIDB4MDUsCi0JMHg0NCwgMHhGMywgMHgyQSwgMHgzRCwgMHgwNiwgMHgyMSwgMHg0NywgMHhGMywgMHhEOCwgMHgwNiwgMHgzQywKLQkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLAotCTB4QjAsIDB4RkYsIDB4QTIsIDB4MDAsIDB4MUQsIDB4RkYsIDB4RDYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4QkMsCi0JMHhGQywgMHhDMCwgMHg0NywgMHhGQSwgMHgwQiwgMHg3MCwgMHhGOSwgMHgzQywgMHgwNCwgMHg1QywgMHhGRCwKLQkweDc1LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAotCTB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsIDB4RkQsIDB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsCi0JMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwgMHg5MSwgMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwKLQkweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjUsIDB4MDYsIDB4RTcsIDB4RjIsIDB4RjIsCi0JMHgyMiwgMHhDNywgMHgzQiwgMHhENCwgMHhGMiwgMHhBMiwgMHgwNSwgMHg3QSwgMHhGRCwgMHgwMiwgMHgwMSwKLQkweEIyLCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg4LAotCTB4RkYsIDB4NTUsIDB4MDEsIDB4RjIsIDB4RkMsIDB4NjcsIDB4MDYsIDB4RTQsIDB4RjEsIDB4NDQsIDB4MzcsCi0JMHhBQSwgMHgyOCwgMHgwNSwgMHhGMiwgMHgyNywgMHgwNywgMHgzNiwgMHhGQywgMHhEQSwgMHgwMSwgMHg0MSwKLQkweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQyLCAweEZGLCAweDRDLCAweDAwLAotCTB4Q0QsIDB4RkYsIDB4OTQsIDB4RkYsIDB4MzQsIDB4MDIsIDB4NzAsIDB4RjgsIDB4MkUsIDB4NDUsIDB4MjAsCi0JMHgxMywgMHhGNiwgMHhGNiwgMHg2MiwgMHgwNSwgMHhEMSwgMHhGQywgMHhCMiwgMHgwMSwgMHg0NiwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELAotCTB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsIDB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsCi0JMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwgMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwKLQkweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLAotCTB4NjYsIDB4RkMsIDB4NUUsIDB4MDYsIDB4OUMsIDB4RjQsIDB4NDAsIDB4MUIsIDB4RUYsIDB4NDAsIDB4RjcsCi0JMHhGNCwgMHgzNSwgMHgwNCwgMHg2MiwgMHhGRSwgMHg3QSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGMiwgMHhGRiwKLQkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweEE3LCAweDAxLCAweDc1LAotCTB4RkMsIDB4MDMsIDB4MDcsIDB4N0QsIDB4RjEsIDB4OEEsIDB4MzAsIDB4RkYsIDB4MkYsIDB4N0UsIDB4RjEsCi0JMHgwQSwgMHgwNywgMHg2RSwgMHhGQywgMHhBQywgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA1LCAweDAwLCAweEYwLCAweEZGLCAweEZDLCAweEZGLCAweDZFLCAweDAwLCAweDc2LCAweEZFLAotCTB4MTUsIDB4MDQsIDB4MkMsIDB4RjUsIDB4NDksIDB4NDEsIDB4QTksIDB4MUEsIDB4QzMsIDB4RjQsIDB4NEYsCi0JMHgwNiwgMHg2QywgMHhGQywgMHhEOSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFBLCAweDAwLCAweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LAotCTB4RkQsIDB4MDUsIDB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsCi0JMHhFNCwgMHhGRCwgMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLCAweEI2LCAweDAxLCAweEM4LCAweEZDLCAweDc3LCAweDA1LAotCTB4QzcsIDB4RjYsIDB4QjEsIDB4MTMsIDB4RUQsIDB4NDQsIDB4MjYsIDB4RjgsIDB4NUQsIDB4MDIsIDB4N0QsCi0JMHhGRiwgMHhEQSwgMHhGRiwgMHg0NiwgMHgwMCwgMHhENCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM4LCAweEZDLCAweDI5LCAweDA3LCAweEYzLAotCTB4RjEsIDB4M0UsIDB4MjksIDB4QzYsIDB4MzYsIDB4RDQsIDB4RjEsIDB4NzcsIDB4MDYsIDB4RTYsIDB4RkMsCi0JMHg1QywgMHgwMSwgMHg4NCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwKLQkweDAwLCAweEI3LCAweEZGLCAweEY5LCAweDAwLCAweDg5LCAweEZELCAweDhBLCAweDA1LCAweEY0LCAweEYyLAotCTB4MzcsIDB4M0MsIDB4NUIsIDB4MjIsIDB4MDMsIDB4RjMsIDB4RUQsIDB4MDYsIDB4MzcsIDB4RkMsIDB4RTYsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNiwgMHhGRiwKLQkweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLCAweEZCLCAweDY5LAotCTB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsIDB4ODEsIDB4MDEsCi0JMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QiwKLQkweEZGLCAweDdBLCAweDAxLCAweDUwLCAweEZELCAweDU0LCAweDA0LCAweDNELCAweEY5LCAweDgyLCAweDBDLAotCTB4OUEsIDB4NDcsIDB4NUUsIDB4RkMsIDB4MkEsIDB4MDAsIDB4QkQsIDB4MDAsIDB4MkIsIDB4RkYsIDB4OUIsCi0JMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweEU2LCAweDAxLCAweDNBLCAweEZDLCAweEUyLCAweDA2LCAweDI4LCAweEYzLCAweDlFLCAweDIxLCAweEMwLAotCTB4M0MsIDB4MUYsIDB4RjMsIDB4NkMsIDB4MDUsIDB4OUUsIDB4RkQsIDB4RUQsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4MCwgMHhGRiwgMHg2NiwKLQkweDAxLCAweEQ4LCAweEZDLCAweDhCLCAweDA2LCAweEMxLCAweEYxLCAweDI3LCAweDM2LCAweEY2LCAweDI5LAotCTB4REYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0IsIDB4RkMsIDB4RDQsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhENywgMHhGRiwgMHgzRSwgMHgwMCwgMHhFQSwgMHhGRiwKLQkweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LCAweDk5LCAweDQ0LCAweDY4LCAweDE0LCAweDhFLAotCTB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OSwgMHhGRiwgMHgyRiwgMHgwMSwgMHhGNCwKLQkweEZELCAweDBDLCAweDAzLCAweEQ0LCAweEZCLCAweEU5LCAweDA1LCAweERFLCAweDQ4LCAweDhGLCAweDAxLAotCTB4QjYsIDB4RkQsIDB4MTEsIDB4MDIsIDB4NzYsIDB4RkUsIDB4RjIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywgMHgwMSwgMHg3MywgMHhGQywKLQkweDNCLCAweDA2LCAweEY1LCAweEY0LCAweEVELCAweDE5LCAweEI3LCAweDQxLCAweDcxLCAweEY1LCAweEVCLAotCTB4MDMsIDB4OTAsIDB4RkUsIDB4NjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywgMHhGRiwgMHhCMiwgMHgwMSwgMHg2NSwgMHhGQywgMHgxMiwKLQkweDA3LCAweDgyLCAweEYxLCAweDUwLCAweDJGLCAweDM4LCAweDMxLCAweDdDLCAweEYxLCAweEY5LCAweDA2LAotCTB4N0UsIDB4RkMsIDB4QTEsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsCi0JMHgwMCwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwgMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwKLQkweEI3LCAweEY0LCAweDdELCAweDQwLCAweEZELCAweDFCLCAweDZDLCAweEY0LCAweDcwLCAweDA2LCAweDVGLAotCTB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHg5QSwgMHhGRiwgMHhEQiwgMHgwMCwgMHhBNiwgMHhGRSwgMHhCNCwgMHgwMSwgMHg2NCwgMHhGRSwgMHgxMiwKLQkweDAwLCAweEFBLCAweDQ4LCAweDlFLCAweDA3LCAweDIxLCAweEZCLCAweDY2LCAweDAzLCAweEM2LCAweEZELAotCTB4NDUsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCi0JMHgwMCwgMHg0OCwgMHhGRiwgMHhBRCwgMHgwMSwgMHhERCwgMHhGQywgMHg0OCwgMHgwNSwgMHgzMCwgMHhGNywKLQkweDZCLCAweDEyLCAweDdELCAweDQ1LCAweENGLCAweEY4LCAweDAxLCAweDAyLCAweEIyLCAweEZGLCAweEJELAotCTB4RkYsIDB4NTQsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwgMHgzNCwgMHhGQywgMHgyNCwgMHgwNywgMHgxQywgMHhGMiwgMHhGMCwKLQkweDI3LCAweERGLCAweDM3LCAweEZCLCAweEYxLCAweDUxLCAweDA2LCAweDAxLCAweEZELCAweDRCLCAweDAxLAotCTB4OEQsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsCi0JMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwKLQkweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLCAweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkMsIDB4RkYsIDB4ODQsIDB4MDAsCi0JMHg1QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOSwgMHgwMCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg0NywgMHg2NCwKLQkweDBFLCAweDhGLCAweEY4LCAweEE3LCAweDA0LCAweDI5LCAweEZELCAweDhDLCAweDAxLCAweDU0LCAweEZGLAotCTB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkUsCi0JMHgwMSwgMHg2QiwgMHhGRCwgMHgxRCwgMHgwNCwgMHhBRiwgMHhGOSwgMHg1MSwgMHgwQiwgMHhFQywgMHg0NywKLQkweDMzLCAweEZELCAweEMxLCAweEZGLCAweEY3LCAweDAwLCAweDBDLCAweEZGLCAweEFBLCAweDAwLCAweEFELAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHg0MCwgMHhGQywgMHhDQiwgMHgwNiwgMHg2RSwgMHhGMywgMHg0OSwgMHgyMCwgMHhCMCwgMHgzRCwgMHg3MywKLQkweEYzLCAweDMxLCAweDA1LCAweEM0LCAweEZELCAweEQ2LCAweDAwLCAweEM4LCAweEZGLCAweDAzLCAweDAwLAotCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsIDB4NzUsIDB4MDEsIDB4QkYsCi0JMHhGQywgMHhBQiwgMHgwNiwgMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwgMHgyQiwgMHhCRiwgMHhGMSwKLQkweDJBLCAweDA3LCAweDQyLCAweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELAotCTB4RkYsIDB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MkMsIDB4RkYsCi0JMHhFNiwgMHgwMiwgMHgzMSwgMHhGNywgMHhGQSwgMHg0MywgMHhCMywgMHgxNSwgMHgyOSwgMHhGNiwgMHhCQywKLQkweDA1LCAweEE5LCAweEZDLCAweEMyLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjEsIDB4MDEsIDB4MTIsIDB4RkUsIDB4RDEsCi0JMHgwMiwgMHg0NywgMHhGQywgMHhENywgMHgwNCwgMHhGMCwgMHg0OCwgMHg4RCwgMHgwMiwgMHg0NSwgMHhGRCwKLQkweDRELCAweDAyLCAweDU2LCAweEZFLCAweDAxLCAweDAxLCAweDhCLCAweEZGLCAweDFELCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDEsIDB4MDEsIDB4ODMsIDB4RkMsIDB4MTYsIDB4MDYsCi0JMHg1MSwgMHhGNSwgMHg5QiwgMHgxOCwgMHg3NSwgMHg0MiwgMHhGMywgMHhGNSwgMHg5RCwgMHgwMywgMHhCRiwKLQkweEZFLCAweDQ1LCAweDAwLCAweDExLCAweDAwLCAweEU4LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLAotCTB4MkUsIDB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsCi0JMHhGMSwgMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywKLQkweDk0LCAweDAxLCAweDY3LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY5LAotCTB4RkYsIDB4RTMsIDB4RkYsIDB4QTEsIDB4MDAsIDB4MUUsIDB4RkUsIDB4QTMsIDB4MDQsIDB4NDksIDB4RjQsCi0JMHhBOCwgMHgzRiwgMHg1MiwgMHgxRCwgMHgxOSwgMHhGNCwgMHg5MCwgMHgwNiwgMHg1MywgMHhGQywgMHhFMSwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLAotCTB4Q0MsIDB4MDAsIDB4QzYsIDB4RkUsIDB4NzksIDB4MDEsIDB4RDIsIDB4RkUsIDB4MjYsIDB4RkYsIDB4N0MsCi0JMHg0OCwgMHhCRSwgMHgwOCwgMHhBRSwgMHhGQSwgMHhBMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg1MiwgMHgwMSwKLQkweDZCLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLAotCTB4RkYsIDB4QTMsIDB4MDEsIDB4RjMsIDB4RkMsIDB4MTgsIDB4MDUsIDB4OUIsIDB4RjcsIDB4MjcsIDB4MTEsCi0JMHgwMiwgMHg0NiwgMHg3RiwgMHhGOSwgMHhBMywgMHgwMSwgMHhFOCwgMHhGRiwgMHg5RiwgMHhGRiwgMHg2MywKLQkweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLAotCTB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsIDB4RjIsCi0JMHgzOCwgMHgyQSwgMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwgMHhGRiwKLQkweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEEyLCAweEZGLCAweDIyLAotCTB4MDEsIDB4NDUsIDB4RkQsIDB4RjEsIDB4MDUsIDB4NkQsIDB4RjIsIDB4MzgsIDB4M0EsIDB4MDMsIDB4MjUsCi0JMHg4QiwgMHhGMiwgMHgwRSwgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMyLCAweEZGLCAweDc1LCAweDAwLCAweDdBLCAweEZGLAotCTB4MkIsIDB4MDAsIDB4MkQsIDB4MDEsIDB4NjEsIDB4RkEsIDB4OTcsIDB4NDYsIDB4QTAsIDB4MEYsIDB4MjAsCi0JMHhGOCwgMHhEQSwgMHgwNCwgMHgxMCwgMHhGRCwgMHg5NywgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYyLCAweDAxLCAweDg3LAotCTB4RkQsIDB4RTUsIDB4MDMsIDB4MjEsIDB4RkEsIDB4MjUsIDB4MEEsIDB4MzMsIDB4NDgsIDB4MEYsIDB4RkUsCi0JMHg1NywgMHhGRiwgMHgzMSwgMHgwMSwgMHhFQywgMHhGRSwgMHhCOSwgMHgwMCwgMHhBNywgMHhGRiwgMHgxNSwKLQkweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ4LCAweEZDLAotCTB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsIDB4Q0YsIDB4RjMsIDB4RjMsCi0JMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwKLQkweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcwLCAweEZGLCAweDg0LCAweDAxLCAweEE5LCAweEZDLCAweEM3LAotCTB4MDYsIDB4OTEsIDB4RjEsIDB4REMsIDB4MzMsIDB4ODcsIDB4MkMsIDB4QTUsIDB4RjEsIDB4MjYsIDB4MDcsCi0JMHg0QiwgMHhGQywgMHhDNiwgMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKLQkweDAwLCAweEUyLCAweEZGLCAweDIxLCAweDAwLCAweDIzLCAweDAwLCAweEZBLCAweEZFLCAweDNBLCAweDAzLAotCTB4OUQsIDB4RjYsIDB4NTAsIDB4NDMsIDB4MDAsIDB4MTcsIDB4QzYsIDB4RjUsIDB4RTYsIDB4MDUsIDB4OTcsCi0JMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDEzLCAweDAxLCAweDMxLCAweEZFLCAweDk1LCAweDAyLCAweEJBLAotCTB4RkMsIDB4Q0IsIDB4MDMsIDB4RjcsIDB4NDgsIDB4OTEsIDB4MDMsIDB4RDMsIDB4RkMsIDB4ODgsIDB4MDIsCi0JMHgzOCwgMHhGRSwgMHgxMCwgMHgwMSwgMHg4NSwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwKLQkweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLCAweEZDLCAweEVGLCAweDA1LCAweEIwLCAweEY1LAotCTB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsIDB4NEQsIDB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsCi0JMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweDRELCAweEZGLCAweEM0LCAweDAxLCAweDRELCAweEZDLCAweDI1LCAweDA3LCAweEExLCAweEYxLCAweENFLAotCTB4MkMsIDB4OTksIDB4MzMsIDB4OEUsIDB4RjEsIDB4Q0QsIDB4MDYsIDB4QTQsIDB4RkMsIDB4ODcsIDB4MDEsCi0JMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENywKLQkweEZGLCAweEJBLCAweDAwLCAweEY0LCAweEZELCAweEU1LCAweDA0LCAweEU0LCAweEYzLCAweENBLCAweDNFLAotCTB4QTcsIDB4MUUsIDB4Q0EsIDB4RjMsIDB4QUMsIDB4MDYsIDB4NEEsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCRCwgMHgwMCwKLQkweEU1LCAweEZFLCAweDNFLCAweDAxLCAweDNGLCAweEZGLCAweDQxLCAweEZFLCAweDQxLCAweDQ4LCAweEU0LAotCTB4MDksIDB4M0IsIDB4RkEsIDB4RDksIDB4MDMsIDB4OEQsIDB4RkQsIDB4NUYsIDB4MDEsIDB4NjYsIDB4RkYsCi0JMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwKLQkweDAxLCAweDBCLCAweEZELCAweEU2LCAweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LAotCTB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwKLQkweDMxLCAweEZDLCAweDExLCAweDA3LCAweDdGLCAweEYyLCAweDRFLCAweDI1LCAweEZELCAweDM5LCAweDYwLAotCTB4RjIsIDB4RkIsIDB4MDUsIDB4M0UsIDB4RkQsIDB4MjYsIDB4MDEsIDB4QTAsIDB4RkYsIDB4MTIsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgzNSwgMHgwMSwgMHgyNSwKLQkweEZELCAweDFFLCAweDA2LCAweDM1LCAweEYyLCAweDJFLCAweDM5LCAweDU1LCAweDI2LCAweDU2LCAweEYyLAotCTB4MUEsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2NiwgMHgwMCwgMHg5OCwgMHhGRiwgMHhGNCwgMHhGRiwKLQkweDhFLCAweDAxLCAweEE3LCAweEY5LCAweDFELCAweDQ2LCAweERGLCAweDEwLCAweEIzLCAweEY3LCAweDBELAotCTB4MDUsIDB4RjgsIDB4RkMsIDB4QTEsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwKLQkweDAzLCAweDk0LCAweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLAotCTB4NkMsIDB4MDEsIDB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MSwgMHhGQywgMHg5NiwgMHgwNiwKLQkweDA3LCAweEY0LCAweDlFLCAweDFELCAweDc3LCAweDNGLCAweDMyLCAweEY0LCAweEIyLCAweDA0LCAweDE1LAotCTB4RkUsIDB4QTcsIDB4MDAsIDB4RTAsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5NCwgMHhGQywgMHhFMCwgMHgwNiwgMHg4NCwKLQkweEYxLCAweEFGLCAweDMyLCAweENBLCAweDJELCAweDkyLCAweEYxLCAweDFGLCAweDA3LCAweDU2LCAweEZDLAotCTB4QkUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTcsCi0JMHhGRiwgMHgxNCwgMHgwMCwgMHgzRiwgMHgwMCwgMHhDOSwgMHhGRSwgMHg4QywgMHgwMywgMHgxMSwgMHhGNiwKLQkweDlFLCAweDQyLCAweDUwLCAweDE4LCAweDY2LCAweEY1LCAweDBELCAweDA2LCAweDg2LCAweEZDLCAweEQwLAotCTB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsCi0JMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwgMHgwMiwgMHhGMiwKLQkweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLCAweDFFLCAweDAxLAotCTB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCi0JMHhGRiwgMHhDNCwgMHgwMSwgMHhBNSwgMHhGQywgMHhDNSwgMHgwNSwgMHgxMywgMHhGNiwgMHhGRCwgMHgxNSwKLQkweEQ0LCAweDQzLCAweDBGLCAweEY3LCAweEY5LCAweDAyLCAweDIxLCAweEZGLCAweDBELCAweDAwLCAweDJDLAotCTB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDksIDB4RkYsCi0JMHhDQywgMHgwMSwgMHg0NCwgMHhGQywgMHgyOSwgMHgwNywgMHhCOSwgMHhGMSwgMHg4OSwgMHgyQiwgMHhDMywKLQkweDM0LCAweEEwLCAweEYxLCAweEIxLCAweDA2LCAweEJBLCAweEZDLCAweDc5LCAweDAxLCAweDc2LCAweEZGLAotCTB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4RDEsCi0JMHgwMCwgMHhDQywgMHhGRCwgMHgyNCwgMHgwNSwgMHg4NywgMHhGMywgMHhFNCwgMHgzRCwgMHhGRCwgMHgxRiwKLQkweDdGLCAweEYzLCAweEM2LCAweDA2LCAweDQxLCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUUsIDB4MDAsIDB4MDUsIDB4RkYsCi0JMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwgMHhGRCwgMHg0NywgMHgwRSwgMHgwQiwgMHhDOCwKLQkweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLCAweDAxLCAweDYxLCAweEZGLCAweDI4LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4OEYsIDB4MDEsIDB4MjMsCi0JMHhGRCwgMHhCMiwgMHgwNCwgMHg3NiwgMHhGOCwgMHhBQSwgMHgwRSwgMHhFRCwgMHg0NiwgMHhGNywgMHhGQSwKLQkweERGLCAweDAwLCAweDU3LCAweDAwLCAweDYyLCAweEZGLCAweDgwLCAweDAwLCAweEJELCAweEZGLCAweDEwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsCi0JMHgwMywgMHgwNywgMHhCNywgMHhGMiwgMHhGQywgMHgyMywgMHgwMywgMHgzQiwgMHg5RSwgMHhGMiwgMHhDQiwKLQkweDA1LCAweDVGLCAweEZELCAweDEyLCAweDAxLCAweEFBLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OEYsIDB4RkYsIDB4NDcsIDB4MDEsIDB4MDgsIDB4RkQsIDB4NDksCi0JMHgwNiwgMHgwNSwgMHhGMiwgMHgxRCwgMHgzOCwgMHhBNiwgMHgyNywgMHgyNiwgMHhGMiwgMHgyMywgMHgwNywKLQkweDMzLCAweEZDLCAweERELCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLAotCTB4MDAsIDB4Q0QsIDB4RkYsIDB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsCi0JMHhGNSwgMHhGOCwgMHg5QiwgMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwgMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwKLQkweEZDLCAweEFCLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MjQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4NDgsIDB4MDEsIDB4QzAsIDB4RkQsIDB4NzMsIDB4MDMsIDB4MDcsCi0JMHhGQiwgMHhERCwgMHgwNywgMHhBMSwgMHg0OCwgMHhERCwgMHhGRiwgMHg3RCwgMHhGRSwgMHhBNywgMHgwMSwKLQkweEFELCAweEZFLCAweEQ4LCAweDAwLCAweDlCLCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUMsIDB4RkMsIDB4NzgsIDB4MDYsIDB4NUEsIDB4RjQsCi0JMHg0OSwgMHgxQywgMHg0RSwgMHg0MCwgMHg5RSwgMHhGNCwgMHg2RCwgMHgwNCwgMHgzRiwgMHhGRSwgMHg4RSwKLQkweDAwLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAotCTB4NjIsIDB4RkYsIDB4OUUsIDB4MDEsIDB4ODIsIDB4RkMsIDB4RjUsIDB4MDYsIDB4N0QsIDB4RjEsIDB4N0IsCi0JMHgzMSwgMHgwOSwgMHgyRiwgMHg4NCwgMHhGMSwgMHgxNSwgMHgwNywgMHg2MiwgMHhGQywgMHhCNCwgMHgwMSwKLQkweDU2LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LAotCTB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsIDB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsCi0JMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywgMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwKLQkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDhGLCAweEZGLCAweEY1LCAweDAwLAotCTB4NkYsIDB4RkUsIDB4MUUsIDB4MDIsIDB4OUQsIDB4RkQsIDB4QzcsIDB4MDEsIDB4RTEsIDB4NDgsIDB4QUIsCi0JMHgwNSwgMHhFRSwgMHhGQiwgMHhGRSwgMHgwMiwgMHhGQiwgMHhGRCwgMHgyQywgMHgwMSwgMHg3QSwgMHhGRiwKLQkweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJDLAotCTB4MDEsIDB4QjgsIDB4RkMsIDB4OUEsIDB4MDUsIDB4NzcsIDB4RjYsIDB4QjEsIDB4MTQsIDB4NzcsIDB4NDQsCi0JMHhBOSwgMHhGNywgMHhBMiwgMHgwMiwgMHg1NCwgMHhGRiwgMHhGMSwgMHhGRiwgMHgzQSwgMHgwMCwgMHhEOCwKLQkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LCAweEZGLCAweEQzLCAweDAxLAotCTB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RDgsIDB4RjEsIDB4M0YsIDB4MkEsIDB4RTYsIDB4MzUsIDB4QkIsCi0JMHhGMSwgMHg5MiwgMHgwNiwgMHhEMiwgMHhGQywgMHg2OSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgxRiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweEU4LCAweDAwLCAweEE2LAotCTB4RkQsIDB4NUYsIDB4MDUsIDB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsIDB4MjEsIDB4MzcsIDB4RjMsCi0JMHhERCwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDEzLCAweDAwLCAweEIxLCAweEZGLCAweDlGLCAweDAwLCAweDI0LCAweEZGLCAweEM5LCAweDAwLAotCTB4MTMsIDB4MDAsIDB4OEQsIDB4RkMsIDB4QUUsIDB4NDcsIDB4M0UsIDB4MEMsIDB4NTYsIDB4RjksIDB4NDgsCi0JMHgwNCwgMHg1NiwgMHhGRCwgMHg3OCwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU4LCAweEZGLCAweDgzLCAweDAxLCAweDNDLCAweEZELCAweDdFLAotCTB4MDQsIDB4RTYsIDB4RjgsIDB4NzIsIDB4MEQsIDB4NTIsIDB4NDcsIDB4QkUsIDB4RkIsIDB4N0EsIDB4MDAsCi0JMHg5MCwgMHgwMCwgMHg0MywgMHhGRiwgMHg4RiwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEYxLCAweDA2LAotCTB4RjUsIDB4RjIsIDB4QTcsIDB4MjIsIDB4RkYsIDB4M0IsIDB4RTQsIDB4RjIsIDB4OTYsIDB4MDUsIDB4ODEsCi0JMHhGRCwgMHhGRCwgMHgwMCwgMHhCNSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDFDLCAweDAwLCAweDg2LCAweEZGLCAweDU5LCAweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLAotCTB4RjEsIDB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsIDB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsCi0JMHhEOCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMywKLQkweEZGLCAweDQ5LCAweDAwLCAweEQ0LCAweEZGLCAweDg4LCAweEZGLCAweDQ5LCAweDAyLCAweDRCLCAweEY4LAotCTB4MEQsIDB4NDUsIDB4NjgsIDB4MTMsIDB4REYsIDB4RjYsIDB4NkMsIDB4MDUsIDB4Q0MsIDB4RkMsIDB4QjQsCi0JMHgwMSwgMHg0NSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKLQkweDc0LCAweEZGLCAweDNBLCAweDAxLCAweERELCAweEZELCAweDM5LCAweDAzLCAweDdCLCAweEZCLCAweEMxLAotCTB4MDYsIDB4QzcsIDB4NDgsIDB4Q0YsIDB4MDAsIDB4MEQsIDB4RkUsIDB4RTMsIDB4MDEsIDB4OEUsIDB4RkUsCi0JMHhFNywgMHgwMCwgMHg5NSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKLQkweEZGLCAweERBLCAweDAxLCAweDY5LCAweEZDLCAweDU3LCAweDA2LCAweEFGLCAweEY0LCAweEY1LCAweDFBLAotCTB4MUQsIDB4NDEsIDB4MTEsIDB4RjUsIDB4MjUsIDB4MDQsIDB4NkMsIDB4RkUsIDB4NzQsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhGMSwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwKLQkweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LAotCTB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsCi0JMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMSwgMHhGRiwgMHhGOSwgMHhGRiwgMHg3NCwKLQkweDAwLCAweDZDLCAweEZFLCAweDI1LCAweDA0LCAweDExLCAweEY1LCAweDFELCAweDQxLCAweEY1LCAweDFBLAotCTB4QUYsIDB4RjQsIDB4NTcsIDB4MDYsIDB4NjksIDB4RkMsIDB4REEsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFNywgMHgwMCwgMHg4RSwgMHhGRSwKLQkweEUzLCAweDAxLCAweDBELCAweEZFLCAweENGLCAweDAwLCAweEM3LCAweDQ4LCAweEMxLCAweDA2LCAweDdCLAotCTB4RkIsIDB4MzksIDB4MDMsIDB4REQsIDB4RkQsIDB4M0EsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjMsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwgMHhCNCwgMHgwMSwgMHhDQywKLQkweEZDLCAweDZDLCAweDA1LCAweERGLCAweEY2LCAweDY4LCAweDEzLCAweDBELCAweDQ1LCAweDRCLCAweEY4LAotCTB4NDksIDB4MDIsIDB4ODgsIDB4RkYsIDB4RDQsIDB4RkYsIDB4NDksIDB4MDAsIDB4RDMsIDB4RkYsIDB4MEIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgzNywgMHhGQywKLQkweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LCAweERDLCAweEYxLCAweDZGLAotCTB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCNSwgMHhGRiwgMHhGRCwgMHgwMCwgMHg4MSwgMHhGRCwgMHg5NiwKLQkweDA1LCAweEU0LCAweEYyLCAweEZGLCAweDNCLCAweEE3LCAweDIyLCAweEY1LCAweEYyLCAweEYxLCAweDA2LAotCTB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsCi0JMHgwMCwgMHhCNywgMHhGRiwgMHg4RiwgMHgwMCwgMHg0MywgMHhGRiwgMHg5MCwgMHgwMCwgMHg3QSwgMHgwMCwKLQkweEJFLCAweEZCLCAweDUyLCAweDQ3LCAweDcyLCAweDBELCAweEU2LCAweEY4LCAweDdFLCAweDA0LCAweDNDLAotCTB4RkQsIDB4ODMsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OCwgMHgwMSwgMHg1NiwgMHhGRCwgMHg0OCwgMHgwNCwgMHg1NiwKLQkweEY5LCAweDNFLCAweDBDLCAweEFFLCAweDQ3LCAweDhELCAweEZDLCAweDEzLCAweDAwLCAweEM5LCAweDAwLAotCTB4MjQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywgMHhERCwgMHgwNiwgMHgzNywgMHhGMywKLQkweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLCAweDVGLCAweDA1LCAweEE2LCAweEZELCAweEU4LAotCTB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsCi0JMHg3RSwgMHhGRiwgMHg2OSwgMHgwMSwgMHhEMiwgMHhGQywgMHg5MiwgMHgwNiwgMHhCQiwgMHhGMSwgMHhFNiwKLQkweDM1LCAweDNGLCAweDJBLCAweEQ4LCAweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLAotCTB4NDUsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDgsIDB4RkYsIDB4M0EsCi0JMHgwMCwgMHhGMSwgMHhGRiwgMHg1NCwgMHhGRiwgMHhBMiwgMHgwMiwgMHhBOSwgMHhGNywgMHg3NywgMHg0NCwKLQkweEIxLCAweDE0LCAweDc3LCAweEY2LCAweDlBLCAweDA1LCAweEI4LCAweEZDLCAweEJDLCAweDAxLCAweDQyLAotCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsCi0JMHgyQywgMHgwMSwgMHhGQiwgMHhGRCwgMHhGRSwgMHgwMiwgMHhFRSwgMHhGQiwgMHhBQiwgMHgwNSwgMHhFMSwKLQkweDQ4LCAweEM3LCAweDAxLCAweDlELCAweEZELCAweDFFLCAweDAyLCAweDZGLCAweEZFLCAweEY1LCAweDAwLAotCTB4OEYsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsCi0JMHgwMSwgMHg3NywgMHhGQywgMHgzMywgMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwKLQkweDhELCAweEY1LCAweERBLCAweDAzLCAweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsIDB4QjQsIDB4MDEsCi0JMHg2MiwgMHhGQywgMHgxNSwgMHgwNywgMHg4NCwgMHhGMSwgMHgwOSwgMHgyRiwgMHg3QiwgMHgzMSwgMHg3RCwKLQkweEYxLCAweEY1LCAweDA2LCAweDgyLCAweEZDLCAweDlFLCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OEUsIDB4MDAsIDB4M0YsCi0JMHhGRSwgMHg2RCwgMHgwNCwgMHg5RSwgMHhGNCwgMHg0RSwgMHg0MCwgMHg0OSwgMHgxQywgMHg1QSwgMHhGNCwKLQkweDc4LCAweDA2LCAweDVDLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MTgsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RDgsIDB4MDAsIDB4QUQsIDB4RkUsIDB4QTcsIDB4MDEsCi0JMHg3RCwgMHhGRSwgMHhERCwgMHhGRiwgMHhBMSwgMHg0OCwgMHhERCwgMHgwNywgMHgwNywgMHhGQiwgMHg3MywKLQkweDAzLCAweEMwLCAweEZELCAweDQ4LCAweDAxLCAweDZGLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsCi0JMHgwNSwgMHg0OCwgMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwKLQkweEJFLCAweEZGLCAweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjMsIDB4MDcsCi0JMHgyNiwgMHhGMiwgMHhBNiwgMHgyNywgMHgxRCwgMHgzOCwgMHgwNSwgMHhGMiwgMHg0OSwgMHgwNiwgMHgwOCwKLQkweEZELCAweDQ3LCAweDAxLCAweDhGLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4MEUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTIsIDB4MDEsIDB4NUYsIDB4RkQsIDB4Q0IsIDB4MDUsIDB4OUUsCi0JMHhGMiwgMHgwMywgMHgzQiwgMHhGQywgMHgyMywgMHhCNywgMHhGMiwgMHgwMywgMHgwNywgMHgzMywgMHhGQywKLQkweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJELAotCTB4RkYsIDB4ODAsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NTcsIDB4MDAsIDB4REYsIDB4MDAsIDB4RjcsIDB4RkEsCi0JMHhFRCwgMHg0NiwgMHhBQSwgMHgwRSwgMHg3NiwgMHhGOCwgMHhCMiwgMHgwNCwgMHgyMywgMHhGRCwgMHg4RiwKLQkweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAotCTB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsIDB4RjksIDB4MEUsCi0JMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwgMHgwNSwgMHhGRiwKLQkweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAotCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzYsIDB4MDYsIDB4N0YsIDB4RjMsIDB4RkQsIDB4MUYsCi0JMHhFNCwgMHgzRCwgMHg4NywgMHhGMywgMHgyNCwgMHgwNSwgMHhDQywgMHhGRCwgMHhEMSwgMHgwMCwgMHhDQiwKLQkweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc2LCAweEZGLAotCTB4NzksIDB4MDEsIDB4QkEsIDB4RkMsIDB4QjEsIDB4MDYsIDB4QTAsIDB4RjEsIDB4QzMsIDB4MzQsIDB4ODksCi0JMHgyQiwgMHhCOSwgMHhGMSwgMHgyOSwgMHgwNywgMHg0NCwgMHhGQywgMHhDQywgMHgwMSwgMHg0OSwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJDLCAweDAwLCAweDBELAotCTB4MDAsIDB4MjEsIDB4RkYsIDB4RjksIDB4MDIsIDB4MEYsIDB4RjcsIDB4RDQsIDB4NDMsIDB4RkQsIDB4MTUsCi0JMHgxMywgMHhGNiwgMHhDNSwgMHgwNSwgMHhBNSwgMHhGQywgMHhDNCwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLCAweEZGLCAweDFFLCAweDAxLAotCTB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsIDB4OUIsIDB4MDQsIDB4RjIsIDB4NDgsIDB4QzYsCi0JMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwgMHhGRSwgMHgwNCwgMHgwMSwgMHg4QSwgMHhGRiwKLQkweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQwLCAweDAxLCAweDg2LAotCTB4RkMsIDB4MEQsIDB4MDYsIDB4NjYsIDB4RjUsIDB4NTAsIDB4MTgsIDB4OUUsIDB4NDIsIDB4MTEsIDB4RjYsCi0JMHg4QywgMHgwMywgMHhDOSwgMHhGRSwgMHgzRiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhFNywgMHhGRiwgMHgwNywKLQkweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJFLCAweDAxLCAweDU2LCAweEZDLAotCTB4MUYsIDB4MDcsIDB4OTIsIDB4RjEsIDB4Q0EsIDB4MkQsIDB4QUYsIDB4MzIsIDB4ODQsIDB4RjEsIDB4RTAsCi0JMHgwNiwgMHg5NCwgMHhGQywgMHg5MSwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUwLCAweEZGLCAweEE3LCAweDAwLCAweDE1LCAweEZFLCAweEIyLAotCTB4MDQsIDB4MzIsIDB4RjQsIDB4NzcsIDB4M0YsIDB4OUUsIDB4MUQsIDB4MDcsIDB4RjQsIDB4OTYsIDB4MDYsCi0JMHg1MSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywKLQkweDAwLCAweEExLCAweEZGLCAweEM5LCAweDAwLCAweENELCAweEZFLCAweDZDLCAweDAxLCAweEVBLCAweEZFLAotCTB4RjMsIDB4RkUsIDB4NzAsIDB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsIDB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsCi0JMHhGRCwgMHg1NSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEExLCAweDAxLCAweEY4LCAweEZDLCAweDBELCAweDA1LCAweEIzLAotCTB4RjcsIDB4REYsIDB4MTAsIDB4MUQsIDB4NDYsIDB4QTcsIDB4RjksIDB4OEUsIDB4MDEsIDB4RjQsIDB4RkYsCi0JMHg5OCwgMHhGRiwgMHg2NiwgMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMxLCAweEZDLCAweDFBLCAweDA3LCAweDU2LCAweEYyLAotCTB4NTUsIDB4MjYsIDB4MkUsIDB4MzksIDB4MzUsIDB4RjIsIDB4MUUsIDB4MDYsIDB4MjUsIDB4RkQsIDB4MzUsCi0JMHgwMSwgMHg5OCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwKLQkweEEwLCAweEZGLCAweDI2LCAweDAxLCAweDNFLCAweEZELCAweEZCLCAweDA1LCAweDYwLCAweEYyLCAweEZELAotCTB4MzksIDB4NEUsIDB4MjUsIDB4N0YsIDB4RjIsIDB4MTEsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsCi0JMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwKLQkweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LAotCTB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsIDB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsCi0JMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwKLQkweDVGLCAweDAxLCAweDhELCAweEZELCAweEQ5LCAweDAzLCAweDNCLCAweEZBLCAweEU0LCAweDA5LCAweDQxLAotCTB4NDgsIDB4NDEsIDB4RkUsIDB4M0YsIDB4RkYsIDB4M0UsIDB4MDEsIDB4RTUsIDB4RkUsIDB4QkQsIDB4MDAsCi0JMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKLQkweDAxLCAweDRBLCAweEZDLCAweEFDLCAweDA2LCAweENBLCAweEYzLCAweEE3LCAweDFFLCAweENBLCAweDNFLAotCTB4RTQsIDB4RjMsIDB4RTUsIDB4MDQsIDB4RjQsIDB4RkQsIDB4QkEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg4NywgMHgwMSwKLQkweEE0LCAweEZDLCAweENELCAweDA2LCAweDhFLCAweEYxLCAweDk5LCAweDMzLCAweENFLCAweDJDLCAweEExLAotCTB4RjEsIDB4MjUsIDB4MDcsIDB4NEQsIDB4RkMsIDB4QzQsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwgMHgyQSwgMHgwMCwgMHhFRiwKLQkweEZFLCAweDRELCAweDAzLCAweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLCAweDE3LCAweEIwLCAweEY1LAotCTB4RUYsIDB4MDUsIDB4OTMsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHg4NSwgMHhGRiwgMHgxMCwgMHgwMSwgMHgzOCwgMHhGRSwgMHg4OCwgMHgwMiwKLQkweEQzLCAweEZDLCAweDkxLCAweDAzLCAweEY3LCAweDQ4LCAweENCLCAweDAzLCAweEJBLCAweEZDLCAweDk1LAotCTB4MDIsIDB4MzEsIDB4RkUsIDB4MTMsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5NywgMHhGQywgMHhFNiwKLQkweDA1LCAweEM2LCAweEY1LCAweDAwLCAweDE3LCAweDUwLCAweDQzLCAweDlELCAweEY2LCAweDNBLCAweDAzLAotCTB4RkEsIDB4RkUsIDB4MjMsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0QywgMHhGRiwgMHhDNiwgMHgwMSwgMHg0QiwgMHhGQywgMHgyNiwgMHgwNywKLQkweEE1LCAweEYxLCAweDg3LCAweDJDLCAweERDLCAweDMzLCAweDkxLCAweEYxLCAweEM3LCAweDA2LCAweEE5LAotCTB4RkMsIDB4ODQsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwgMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwKLQkweEYzLCAweDk4LCAweDNFLCAweEYzLCAweDFFLCAweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLAotCTB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTcsCi0JMHhGRiwgMHhCOSwgMHgwMCwgMHhFQywgMHhGRSwgMHgzMSwgMHgwMSwgMHg1NywgMHhGRiwgMHgwRiwgMHhGRSwKLQkweDMzLCAweDQ4LCAweDI1LCAweDBBLCAweDIxLCAweEZBLCAweEU1LCAweDAzLCAweDg3LCAweEZELCAweDYyLAotCTB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHg1MCwgMHhGRiwgMHg5NywgMHgwMSwgMHgxMCwgMHhGRCwgMHhEQSwgMHgwNCwgMHgyMCwgMHhGOCwgMHhBMCwKLQkweDBGLCAweDk3LCAweDQ2LCAweDYxLCAweEZBLCAweDJELCAweDAxLCAweDJCLCAweDAwLCAweDdBLCAweEZGLAotCTB4NzUsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsCi0JMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwRSwgMHgwNywgMHg4QiwgMHhGMiwgMHgwMywgMHgyNSwKLQkweDM4LCAweDNBLCAweDZELCAweEYyLCAweEYxLCAweDA1LCAweDQ1LCAweEZELCAweDIyLCAweDAxLCAweEEyLAotCTB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsIDB4RkYsCi0JMHgzOSwgMHgwMSwgMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwgMHhBMCwKLQkweDI2LCAweDRCLCAweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjMsIDB4MDAsIDB4OUYsCi0JMHhGRiwgMHhFOCwgMHhGRiwgMHhBMywgMHgwMSwgMHg3RiwgMHhGOSwgMHgwMiwgMHg0NiwgMHgyNywgMHgxMSwKLQkweDlCLCAweEY3LCAweDE4LCAweDA1LCAweEYzLCAweEZDLCAweEEzLCAweDAxLCAweDRDLCAweEZGLCAweDJGLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsIDB4NTIsIDB4MDEsCi0JMHhBOSwgMHhGRCwgMHhBMCwgMHgwMywgMHhBRSwgMHhGQSwgMHhCRSwgMHgwOCwgMHg3QywgMHg0OCwgMHgyNiwKLQkweEZGLCAweEQyLCAweEZFLCAweDc5LCAweDAxLCAweEM2LCAweEZFLCAweENDLCAweDAwLCAweEEwLCAweEZGLAotCTB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTMsCi0JMHhGQywgMHg5MCwgMHgwNiwgMHgxOSwgMHhGNCwgMHg1MiwgMHgxRCwgMHhBOCwgMHgzRiwgMHg0OSwgMHhGNCwKLQkweEEzLCAweDA0LCAweDFFLCAweEZFLCAweEExLCAweDAwLCAweEUzLCAweEZGLCAweEY5LCAweEZGLCAweDA0LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsIDB4MDEsIDB4OTAsIDB4RkMsCi0JMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwgMHg4RSwgMHhGMSwgMHgxRCwKLQkweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAotCTB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTEsIDB4MDAsIDB4NDUsIDB4MDAsIDB4QkYsIDB4RkUsIDB4OUQsCi0JMHgwMywgMHhGMywgMHhGNSwgMHg3NSwgMHg0MiwgMHg5QiwgMHgxOCwgMHg1MSwgMHhGNSwgMHgxNiwgMHgwNiwKLQkweDgzLCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4MDEsIDB4MDEsIDB4NTYsIDB4RkUsIDB4NEQsIDB4MDIsIDB4NDUsIDB4RkQsCi0JMHg4RCwgMHgwMiwgMHhGMCwgMHg0OCwgMHhENywgMHgwNCwgMHg0NywgMHhGQywgMHhEMSwgMHgwMiwgMHgxMiwKLQkweEZFLCAweDIxLCAweDAxLCAweDdFLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzIsIDB4MDEsIDB4QTksIDB4RkMsIDB4QkMsIDB4MDUsIDB4MjksCi0JMHhGNiwgMHhCMywgMHgxNSwgMHhGQSwgMHg0MywgMHgzMSwgMHhGNywgMHhFNiwgMHgwMiwgMHgyQywgMHhGRiwKLQkweDA3LCAweDAwLCAweDJGLCAweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLAotCTB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsCi0JMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwgMHhBQiwgMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwKLQkweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLAotCTB4QzgsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QzQsIDB4RkQsIDB4MzEsIDB4MDUsIDB4NzMsIDB4RjMsIDB4QjAsCi0JMHgzRCwgMHg0OSwgMHgyMCwgMHg2RSwgMHhGMywgMHhDQiwgMHgwNiwgMHg0MCwgMHhGQywgMHhFNiwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFELCAweEZGLCAweEFBLAotCTB4MDAsIDB4MEMsIDB4RkYsIDB4RjcsIDB4MDAsIDB4QzEsIDB4RkYsIDB4MzMsIDB4RkQsIDB4RUMsIDB4NDcsCi0JMHg1MSwgMHgwQiwgMHhBRiwgMHhGOSwgMHgxRCwgMHgwNCwgMHg2QiwgMHhGRCwgMHg2RSwgMHgwMSwgMHg2MCwKLQkweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLAotCTB4OEMsIDB4MDEsIDB4MjksIDB4RkQsIDB4QTcsIDB4MDQsIDB4OEYsIDB4RjgsIDB4NjQsIDB4MEUsIDB4MDIsCi0JMHg0NywgMHgyMiwgMHhGQiwgMHhDOSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg1QiwgMHhGRiwgMHg4NCwgMHgwMCwKLQkweEJDLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LAotCTB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsIDB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsCi0JMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwgMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhELCAweEZGLCAweDRCLCAweDAxLAotCTB4MDEsIDB4RkQsIDB4NTEsIDB4MDYsIDB4RkIsIDB4RjEsIDB4REYsIDB4MzcsIDB4RjAsIDB4MjcsIDB4MUMsCi0JMHhGMiwgMHgyNCwgMHgwNywgMHgzNCwgMHhGQywgMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZELCAweEZGLCAweDBDLCAweDAwLCAweENFLCAweEZGLCAweDU0LCAweDAwLCAweEJELCAweEZGLCAweEIyLAotCTB4RkYsIDB4MDEsIDB4MDIsIDB4Q0YsIDB4RjgsIDB4N0QsIDB4NDUsIDB4NkIsIDB4MTIsIDB4MzAsIDB4RjcsCi0JMHg0OCwgMHgwNSwgMHhERCwgMHhGQywgMHhBRCwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLCAweEZGLCAweDQ1LCAweDAxLCAweEM2LCAweEZELAotCTB4NjYsIDB4MDMsIDB4MjEsIDB4RkIsIDB4OUUsIDB4MDcsIDB4QUEsIDB4NDgsIDB4MTIsIDB4MDAsIDB4NjQsCi0JMHhGRSwgMHhCNCwgMHgwMSwgMHhBNiwgMHhGRSwgMHhEQiwgMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLAotCTB4MDYsIDB4NkMsIDB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsCi0JMHg0OSwgMHhGRSwgMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweEExLCAweDAxLCAweDdFLCAweEZDLCAweEY5LCAweDA2LAotCTB4N0MsIDB4RjEsIDB4MzgsIDB4MzEsIDB4NTAsIDB4MkYsIDB4ODIsIDB4RjEsIDB4MTIsIDB4MDcsIDB4NjUsCi0JMHhGQywgMHhCMiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweEVELCAweEZGLCAweDA0LCAweDAwLCAweDYwLCAweDAwLCAweDkwLCAweEZFLCAweEVCLCAweDAzLCAweDcxLAotCTB4RjUsIDB4QjcsIDB4NDEsIDB4RUQsIDB4MTksIDB4RjUsIDB4RjQsIDB4M0IsIDB4MDYsIDB4NzMsIDB4RkMsCi0JMHhENywgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwKLQkweEZGLCAweEYyLCAweDAwLCAweDc2LCAweEZFLCAweDExLCAweDAyLCAweEI2LCAweEZELCAweDhGLCAweDAxLAotCTB4REUsIDB4NDgsIDB4RTksIDB4MDUsIDB4RDQsIDB4RkIsIDB4MEMsIDB4MDMsIDB4RjQsIDB4RkQsIDB4MkYsCi0JMHgwMSwgMHg3OSwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKLQkweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLCAweEY2LCAweDY4LAotCTB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsIDB4RUEsIDB4RkYsCi0JMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwKLQkweEZGLCAweEQ0LCAweDAxLCAweDNCLCAweEZDLCAweDJBLCAweDA3LCAweERGLCAweEYxLCAweEY2LCAweDI5LAotCTB4MjcsIDB4MzYsIDB4QzEsIDB4RjEsIDB4OEIsIDB4MDYsIDB4RDgsIDB4RkMsIDB4NjYsIDB4MDEsIDB4ODAsCi0JMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhCRCwgMHhGRiwKLQkweEVELCAweDAwLCAweDlFLCAweEZELCAweDZDLCAweDA1LCAweDFGLCAweEYzLCAweEMwLCAweDNDLCAweDlFLAotCTB4MjEsIDB4MjgsIDB4RjMsIDB4RTIsIDB4MDYsIDB4M0EsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5QiwgMHgwMCwgMHgyQiwKLQkweEZGLCAweEJELCAweDAwLCAweDJBLCAweDAwLCAweDVFLCAweEZDLCAweDlBLCAweDQ3LCAweDgyLCAweDBDLAotCTB4M0QsIDB4RjksIDB4NTQsIDB4MDQsIDB4NTAsIDB4RkQsIDB4N0EsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHg4MSwgMHgwMSwKLQkweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LCAweDJELCAweDBELCAweDY5LCAweDQ3LCAweEVCLAotCTB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OTMsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNywKLQkweEZDLCAweEVELCAweDA2LCAweDAzLCAweEYzLCAweDVCLCAweDIyLCAweDM3LCAweDNDLCAweEY0LCAweEYyLAotCTB4OEEsIDB4MDUsIDB4ODksIDB4RkQsIDB4RjksIDB4MDAsIDB4QjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NCwgMHhGRiwgMHg1QywgMHgwMSwgMHhFNiwgMHhGQywKLQkweDc3LCAweDA2LCAweEQ0LCAweEYxLCAweEM2LCAweDM2LCAweDNFLCAweDI5LCAweEYzLCAweEYxLCAweDI5LAotCTB4MDcsIDB4MzgsIDB4RkMsIDB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHhENCwgMHhGRiwgMHg0NiwgMHgwMCwgMHhEQSwgMHhGRiwgMHg3RCwgMHhGRiwgMHg1RCwKLQkweDAyLCAweDI2LCAweEY4LCAweEVELCAweDQ0LCAweEIxLCAweDEzLCAweEM3LCAweEY2LCAweDc3LCAweDA1LAotCTB4QzgsIDB4RkMsIDB4QjYsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNCwgMHhGRCwgMHgyQywgMHgwMywKLQkweDk0LCAweEZCLCAweDgzLCAweDA2LCAweENFLCAweDQ4LCAweDA1LCAweDAxLCAweEY1LCAweEZELCAweEYwLAotCTB4MDEsIDB4ODcsIDB4RkUsIDB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEOSwgMHgwMSwgMHg2QywgMHhGQywgMHg0RiwgMHgwNiwgMHhDMywKLQkweEY0LCAweEE5LCAweDFBLCAweDQ5LCAweDQxLCAweDJDLCAweEY1LCAweDE1LCAweDA0LCAweDc2LCAweEZFLAotCTB4NkUsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsCi0JMHgwMCwgMHg1QSwgMHhGRiwgMHhBQywgMHgwMSwgMHg2RSwgMHhGQywgMHgwQSwgMHgwNywgMHg3RSwgMHhGMSwKLQkweEZGLCAweDJGLCAweDhBLCAweDMwLCAweDdELCAweEYxLCAweDAzLCAweDA3LCAweDc1LCAweEZDLCAweEE3LAotCTB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg3QSwgMHgwMCwgMHg2MiwgMHhGRSwgMHgzNSwgMHgwNCwgMHhGNywgMHhGNCwgMHhFRiwKLQkweDQwLCAweDQwLCAweDFCLCAweDlDLCAweEY0LCAweDVFLCAweDA2LCAweDY2LCAweEZDLCAweERCLCAweDAxLAotCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsCi0JMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwgMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwKLQkweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LCAweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLAotCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsCi0JMHhCMiwgMHgwMSwgMHhEMSwgMHhGQywgMHg2MiwgMHgwNSwgMHhGNiwgMHhGNiwgMHgyMCwgMHgxMywgMHgyRSwKLQkweDQ1LCAweDcwLCAweEY4LCAweDM0LCAweDAyLCAweDk0LCAweEZGLCAweENELCAweEZGLCAweDRDLCAweDAwLAotCTB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4REEsCi0JMHgwMSwgMHgzNiwgMHhGQywgMHgyNywgMHgwNywgMHgwNSwgMHhGMiwgMHhBQSwgMHgyOCwgMHg0NCwgMHgzNywKLQkweEU0LCAweEYxLCAweDY3LCAweDA2LCAweEYyLCAweEZDLCAweDU1LCAweDAxLCAweDg4LCAweEZGLCAweDFCLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjIsIDB4RkYsIDB4MDIsIDB4MDEsCi0JMHg3QSwgMHhGRCwgMHhBMiwgMHgwNSwgMHhENCwgMHhGMiwgMHhDNywgMHgzQiwgMHhGMiwgMHgyMiwgMHhFNywKLQkweEYyLCAweEY1LCAweDA2LCAweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4ODMsCi0JMHgwMCwgMHg5MSwgMHgwMCwgMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywgMHgwRCwgMHhDRCwgMHhGOCwKLQkweDg5LCAweDA0LCAweDM2LCAweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4NzUsIDB4MDEsIDB4NUMsIDB4RkQsCi0JMHgzQywgMHgwNCwgMHg3MCwgMHhGOSwgMHhGQSwgMHgwQiwgMHhDMCwgMHg0NywgMHhCQywgMHhGQywgMHhGQywKLQkweEZGLCAweEQ2LCAweDAwLCAweDFELCAweEZGLCAweEEyLCAweDAwLCAweEIwLCAweEZGLCAweDEzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0MsIDB4RkMsIDB4RDgsCi0JMHgwNiwgMHg0NywgMHhGMywgMHgwNiwgMHgyMSwgMHgyQSwgMHgzRCwgMHg0NCwgMHhGMywgMHg1MiwgMHgwNSwKLQkweEFFLCAweEZELCAweEUzLCAweDAwLCAweEMyLCAweEZGLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MUYsIDB4MDAsIDB4N0MsIDB4RkYsIDB4NkQsIDB4MDEsIDB4Q0QsIDB4RkMsIDB4OTksIDB4MDYsCi0JMHhCNCwgMHhGMSwgMHhBNiwgMHgzNSwgMHg4OSwgMHgyQSwgMHhEMCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRSwKLQkweEZDLCAweEQxLCAweDAxLCAweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLAotCTB4RDksIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsCi0JMHhGNywgMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwgMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywKLQkweEJFLCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLAotCTB4MDAsIDB4N0IsIDB4RkYsIDB4MjksIDB4MDEsIDB4MDEsIDB4RkUsIDB4RjEsIDB4MDIsIDB4MDcsIDB4RkMsCi0JMHg2RSwgMHgwNSwgMHhFNiwgMHg0OCwgMHhGRiwgMHgwMSwgMHg4NCwgMHhGRCwgMHgyQywgMHgwMiwgMHg2OCwKLQkweEZFLCAweEY5LCAweDAwLCAweDhFLCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAotCTB4M0EsIDB4RkYsIDB4RDQsIDB4MDEsIDB4N0EsIDB4RkMsIDB4MkIsIDB4MDYsIDB4MUUsIDB4RjUsIDB4NTYsCi0JMHgxOSwgMHgwQywgMHg0MiwgMHhBQSwgMHhGNSwgMHhDOSwgMHgwMywgMHhBNCwgMHhGRSwgMHg1NCwgMHgwMCwKLQkweDA5LCAweDAwLCAweEVCLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU1LAotCTB4RkYsIDB4QjYsIDB4MDEsIDB4NUYsIDB4RkMsIDB4MTcsIDB4MDcsIDB4ODcsIDB4RjEsIDB4QzIsIDB4MkUsCi0JMHhDMCwgMHgzMSwgMHg3RSwgMHhGMSwgMHhGMSwgMHgwNiwgMHg4NiwgMHhGQywgMHg5QiwgMHgwMSwgMHg2MywKLQkweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLCAweEZGLAotCTB4OTMsIDB4MDAsIDB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsIDB4OTQsCi0JMHgxQywgMHg0NywgMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwKLQkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLCAweDlDLCAweEZGLCAweEQ0LCAweDAwLCAweEI0LAotCTB4RkUsIDB4OUEsIDB4MDEsIDB4OTUsIDB4RkUsIDB4QTgsIDB4RkYsIDB4OTgsIDB4NDgsIDB4MUQsIDB4MDgsCi0JMHhFRSwgMHhGQSwgMHg4MCwgMHgwMywgMHhCOSwgMHhGRCwgMHg0QiwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweEE5LCAweDAxLAotCTB4RTcsIDB4RkMsIDB4MzMsIDB4MDUsIDB4NjAsIDB4RjcsIDB4REEsIDB4MTEsIDB4QjgsIDB4NDUsIDB4MUMsCi0JMHhGOSwgMHhEOCwgMHgwMSwgMHhDQSwgMHhGRiwgMHhBRiwgMHhGRiwgMHg1QSwgMHgwMCwgMHhDQywgMHhGRiwKLQkweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLAotCTB4RkMsIDB4MjEsIDB4MDcsIDB4MzAsIDB4RjIsIDB4NUMsIDB4MjcsIDB4NUIsIDB4MzgsIDB4MEYsIDB4RjIsCi0JMHg0MCwgMHgwNiwgMHgwRSwgMHhGRCwgMHg0MywgMHgwMSwgMHg5MSwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LCAweDAxLCAweDU3LCAweEZELAotCTB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsIDB4QUEsIDB4RjIsIDB4MDYsCi0JMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdELCAweDAwLCAweDY5LCAweEZGLCAweDRCLCAweDAwLCAweEY2LAotCTB4MDAsIDB4Q0IsIDB4RkEsIDB4RDMsIDB4NDYsIDB4RjAsIDB4MEUsIDB4NUUsIDB4RjgsIDB4QkUsIDB4MDQsCi0JMHgxRSwgMHhGRCwgMHg5MSwgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDY5LCAweDAxLCAweDc3LCAweEZELCAweDA0LCAweDA0LAotCTB4RTIsIDB4RjksIDB4Q0IsIDB4MEEsIDB4MEQsIDB4NDgsIDB4OTQsIDB4RkQsIDB4OTIsIDB4RkYsIDB4MTAsCi0JMHgwMSwgMHhGRSwgMHhGRSwgMHhCMSwgMHgwMCwgMHhBQSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQzLCAweEZDLCAweEMwLCAweDA2LCAweDhGLAotCTB4RjMsIDB4QjEsIDB4MUYsIDB4MTgsIDB4M0UsIDB4OUIsIDB4RjMsIDB4MTYsIDB4MDUsIDB4RDUsIDB4RkQsCi0JMHhDQywgMHgwMCwgMHhDRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwKLQkweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LCAweEZDLCAweEI4LCAweDA2LCAweDlDLCAweEYxLAotCTB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsIDB4MjksIDB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsCi0JMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwKLQkweDI5LCAweDAwLCAweDE0LCAweDAwLCAweDE2LCAweEZGLCAweDBDLCAweDAzLCAweEVFLCAweEY2LCAweEIwLAotCTB4NDMsIDB4NDcsIDB4MTYsIDB4RkMsIDB4RjUsIDB4Q0YsIDB4MDUsIDB4QTEsIDB4RkMsIDB4QzYsIDB4MDEsCi0JMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwKLQkweEZGLCAweDFCLCAweDAxLCAweDIwLCAweEZFLCAweEI2LCAweDAyLCAweDdBLCAweEZDLCAweDVGLCAweDA0LAotCTB4RjQsIDB4NDgsIDB4RkYsIDB4MDIsIDB4MTMsIDB4RkQsIDB4NjcsIDB4MDIsIDB4NDksIDB4RkUsIDB4MDcsCi0JMHgwMSwgMHg4OCwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwKLQkweENGLCAweDAxLCAweDhBLCAweEZDLCAweDA1LCAweDA2LCAweDdCLCAweEY1LCAweDA2LCAweDE4LCAweEM3LAotCTB4NDIsIDB4MkYsIDB4RjYsIDB4N0EsIDB4MDMsIDB4RDQsIDB4RkUsIDB4MzksIDB4MDAsIDB4MTcsIDB4MDAsCi0JMHhFNiwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwKLQkweDAxLCAweDUzLCAweEZDLCAweDIxLCAweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLAotCTB4ODYsIDB4RjEsIDB4REIsIDB4MDYsIDB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERSwgMHhGRiwgMHhBQywgMHgwMCwKLQkweDBCLCAweEZFLCAweEMxLCAweDA0LCAweDFCLCAweEY0LCAweDQ3LCAweDNGLCAweEVBLCAweDFELCAweEY1LAotCTB4RjMsIDB4OUMsIDB4MDYsIDB4NEYsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBMiwgMHhGRiwgMHhDNSwgMHgwMCwgMHhENCwgMHhGRSwgMHg1RiwKLQkweDAxLCAweDAzLCAweEZGLCAweEJGLCAweEZFLCAweDYzLCAweDQ4LCAweDQwLCAweDA5LCAweDdCLCAweEZBLAotCTB4QjksIDB4MDMsIDB4OUQsIDB4RkQsIDB4NTgsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RCwgMHhGRiwgMHg5RiwgMHgwMSwgMHhGRSwgMHhGQywKLQkweDAyLCAweDA1LCAweENCLCAweEY3LCAweDk4LCAweDEwLCAweDM5LCAweDQ2LCAweEQwLCAweEY5LCAweDc4LAotCTB4MDEsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RkYsIDB4NjksIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywKLQkweDA3LCAweDYxLCAweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LAotCTB4MkMsIDB4RkQsIDB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHg5RSwgMHhGRiwgMHgyQiwgMHgwMSwgMHgzNywgMHhGRCwgMHgwNSwgMHgwNiwKLQkweDU0LCAweEYyLCAweEMyLCAweDM5LCAweDk5LCAweDI1LCAweDczLCAweEYyLCAweDE0LCAweDA3LCAweDMxLAotCTB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCi0JMHhDNCwgMHhGRiwgMHg2RSwgMHgwMCwgMHg4NywgMHhGRiwgMHgxMywgMHgwMCwgMHg1OCwgMHgwMSwgMHgwRCwKLQkweEZBLCAweDYxLCAweDQ2LCAweDJELCAweDEwLCAweEYwLCAweEY3LCAweEYxLCAweDA0LCAweDA1LCAweEZELAotCTB4OUMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsCi0JMHgwMCwgMHg2NywgMHhGRiwgMHg1QywgMHgwMSwgMHg5MywgMHhGRCwgMHhDQywgMHgwMywgMHg1NCwgMHhGQSwKLQkweEEyLCAweDA5LCAweDRGLCAweDQ4LCAweDczLCAweEZFLCAweDI3LCAweEZGLCAweDRCLCAweDAxLCAweERFLAotCTB4RkUsIDB4QzAsIDB4MDAsIDB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwgMHhGMywgMHg1QiwKLQkweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELCAweEI0LCAweDAwLAotCTB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkQsCi0JMHhGRiwgMHg4QSwgMHgwMSwgMHg5RiwgMHhGQywgMHhEMywgMHgwNiwgMHg4QSwgMHhGMSwgMHg1NywgMHgzMywKLQkweDE3LCAweDJELCAweDlDLCAweEYxLCAweDI0LCAweDA3LCAweDRGLCAweEZDLCAweEMzLCAweDAxLCAweDRFLAotCTB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MUIsIDB4MDAsCi0JMHgzMCwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1RiwgMHgwMywgMHg1RSwgMHhGNiwgMHgwMiwgMHg0MywgMHg5NiwKLQkweDE3LCAweDlCLCAweEY1LCAweEY4LCAweDA1LCAweDhGLCAweEZDLCAweENDLCAweDAxLCAweDNELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODYsIDB4RkYsIDB4MEMsIDB4MDEsIDB4M0UsCi0JMHhGRSwgMHg3QiwgMHgwMiwgMHhFRCwgMHhGQywgMHg1NiwgMHgwMywgMHhGNSwgMHg0OCwgMHgwNiwgMHgwNCwKLQkweEExLCAweEZDLCAweEEzLCAweDAyLCAweDJBLCAweEZFLCAweDE2LCAweDAxLCAweDgzLCAweEZGLCAweDFGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzgsIDB4MDEsCi0JMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwgMHhCNiwgMHgxNiwgMHg3NywgMHg0MywgMHhCRCwKLQkweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELCAweDAwLCAweDI1LCAweDAwLCAweEUxLCAweEZGLAotCTB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzgsIDB4MDEsIDB4NDksCi0JMHhGQywgMHgyNywgMHgwNywgMHhBQiwgMHhGMSwgMHgzRSwgMHgyQywgMHgxRSwgMHgzNCwgMHg5NSwgMHhGMSwKLQkweEMxLCAweDA2LCAweEFFLCAweEZDLCAweDgxLCAweDAxLCAweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkYsIDB4QzQsIDB4MDAsIDB4RTIsIDB4RkQsCi0JMHgwMSwgMHgwNSwgMHhCQSwgMHhGMywgMHg2NCwgMHgzRSwgMHgzRiwgMHgxRiwgMHhBOCwgMHhGMywgMHhCOCwKLQkweDA2LCAweDQ2LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAotCTB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjYsIDB4MDAsIDB4RjMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4NkUsCi0JMHhGRiwgMHhERSwgMHhGRCwgMHgyNSwgMHg0OCwgMHg2OCwgMHgwQSwgMHgwOCwgMHhGQSwgMHhGMiwgMHgwMywKLQkweDgxLCAweEZELCAweDY1LCAweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsIDB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsCi0JMHgzOSwgMHhGOCwgMHg1OSwgMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwgMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwKLQkweDAwLCAweDczLCAweEZGLCAweDc4LCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEIsIDB4MDcsIDB4OTcsCi0JMHhGMiwgMHhCOCwgMHgyNCwgMHg3MSwgMHgzQSwgMHg3QiwgMHhGMiwgMHhFNiwgMHgwNSwgMHg0QywgMHhGRCwKLQkweDFELCAweDAxLCAweEE0LCAweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LAotCTB4MDAsIDB4OTQsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MTgsIDB4RkQsIDB4MzIsIDB4MDYsIDB4MUYsIDB4RjIsCi0JMHhCNSwgMHgzOCwgMHhFQiwgMHgyNiwgMHg0MCwgMHhGMiwgMHgxRSwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwKLQkweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENBLCAweEZGLAotCTB4NUYsIDB4MDAsIDB4QTUsIDB4RkYsIDB4REMsIDB4RkYsIDB4QjgsIDB4MDEsIDB4NTcsIDB4RjksIDB4RTUsCi0JMHg0NSwgMHg2RSwgMHgxMSwgMHg4MywgMHhGNywgMHgyMywgMHgwNSwgMHhFRSwgMHhGQywgMHhBNiwgMHgwMSwKLQkweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLAotCTB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsIDB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsCi0JMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwKLQkweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAotCTB4RTAsIDB4MDEsIDB4NTYsIDB4RkMsIDB4ODksIDB4MDYsIDB4MkIsIDB4RjQsIDB4MDYsIDB4MUQsIDB4RDcsCi0JMHgzRiwgMHg2MSwgMHhGNCwgMHg5NCwgMHgwNCwgMHgyNywgMHhGRSwgMHg5QywgMHgwMCwgMHhFNiwgMHhGRiwKLQkweEY4LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk3LAotCTB4MDEsIDB4OEMsIDB4RkMsIDB4RUEsIDB4MDYsIDB4ODAsIDB4RjEsIDB4MjYsIDB4MzIsIDB4NTgsIDB4MkUsCi0JMHg4QiwgMHhGMSwgMHgxQiwgMHgwNywgMHg1QiwgMHhGQywgMHhCQSwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwKLQkweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU5LCAweEZGLCAweDBFLCAweDAwLCAweDRCLCAweDAwLAotCTB4QjQsIDB4RkUsIDB4QUYsIDB4MDMsIDB4RDUsIDB4RjUsIDB4NEQsIDB4NDIsIDB4RTYsIDB4MTgsIDB4M0MsCi0JMHhGNSwgMHgxRiwgMHgwNiwgMHg3RiwgMHhGQywgMHhEMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLCAweDVELCAweEZFLCAweDNGLAotCTB4MDIsIDB4NUUsIDB4RkQsIDB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsIDB4MDUsIDB4MkUsIDB4RkMsCi0JMHhERSwgMHgwMiwgMHgwQywgMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEMxLCAweDAxLCAweEFELCAweEZDLAotCTB4QjIsIDB4MDUsIDB4M0YsIDB4RjYsIDB4NjksIDB4MTUsIDB4MUYsIDB4NDQsIDB4NTMsIDB4RjcsIDB4RDMsCi0JMHgwMiwgMHgzOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgzMywgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwKLQkweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ3LCAweEZGLCAweENGLCAweDAxLCAweDQwLCAweEZDLCAweDJBLAotCTB4MDcsIDB4QzYsIDB4RjEsIDB4RjcsIDB4MkEsIDB4NDYsIDB4MzUsIDB4QUIsIDB4RjEsIDB4QTQsIDB4MDYsCi0JMHhDNCwgMHhGQywgMHg3MiwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwKLQkweDAwLCAweDA0LCAweDAwLCAweEM2LCAweEZGLCAweERCLCAweDAwLCAweEJCLCAweEZELCAweDNFLCAweDA1LAotCTB4NjAsIDB4RjMsIDB4N0IsIDB4M0QsIDB4OTQsIDB4MjAsIDB4NUUsIDB4RjMsIDB4RDAsIDB4MDYsIDB4M0UsCi0JMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwKLQkweEFFLCAweEZGLCAweEE3LCAweDAwLCAweDEyLCAweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLAotCTB4RkQsIDB4REMsIDB4NDcsIDB4OTUsIDB4MEIsIDB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsCi0JMHg3MSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywKLQkweDAwLCAweDU1LCAweEZGLCAweDhBLCAweDAxLCAweDJFLCAweEZELCAweDlCLCAweDA0LCAweEE4LCAweEY4LAotCTB4MUYsIDB4MEUsIDB4MUEsIDB4NDcsIDB4NEUsIDB4RkIsIDB4QjMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4NTQsCi0JMHhGRiwgMHg4NywgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLCAweEZCLCAweDA2LCAweEQyLCAweEYyLCAweDY0LAotCTB4MjMsIDB4NzMsIDB4M0IsIDB4QkMsIDB4RjIsIDB4QjQsIDB4MDUsIDB4NkUsIDB4RkQsIDB4MDksIDB4MDEsCi0JMHhBRiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QiwKLQkweEZGLCAweDRGLCAweDAxLCAweEZCLCAweEZDLCAweDVBLCAweDA2LCAweEYyLCAweEYxLCAweEEwLCAweDM3LAotCTB4M0EsIDB4MjgsIDB4MTMsIDB4RjIsIDB4MjUsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwgMHgwMCwKLQkweEMzLCAweEZGLCAweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LCAweEIyLAotCTB4MTIsIDB4MTksIDB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MiwKLQkweDAxLCAweENELCAweEZELCAweDU5LCAweDAzLCAweDNCLCAweEZCLCAweDVFLCAweDA3LCAweEIzLCAweDQ4LAotCTB4NDgsIDB4MDAsIDB4NEIsIDB4RkUsIDB4QzIsIDB4MDEsIDB4OUYsIDB4RkUsIDB4REUsIDB4MDAsIDB4OTgsCi0JMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhERCwgMHgwMSwKLQkweDYyLCAweEZDLCAweDY5LCAweDA2LCAweDdGLCAweEY0LCAweEIyLCAweDFCLCAweEFCLCAweDQwLCAweEQwLAotCTB4RjQsIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkUsIDB4ODMsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjQsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBMywgMHgwMSwgMHg3QSwKLQkweEZDLCAweEZELCAweDA2LCAweDdDLCAweEYxLCAweEYyLCAweDMwLCAweDk2LCAweDJGLCAweDgwLCAweEYxLAotCTB4MEYsIDB4MDcsIDB4NjksIDB4RkMsIDB4QjAsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg4NSwgMHhGRSwKLQkweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLCAweEUxLCAweEY0LCAweDQzLAotCTB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQiwgMHgwMCwgMHg5MiwgMHhGRiwgMHhFRiwgMHgwMCwgMHg3RCwgMHhGRSwgMHgwNCwgMHgwMiwgMHhDRiwKLQkweEZELCAweDU4LCAweDAxLCAweEQ3LCAweDQ4LCAweDI2LCAweDA2LCAweEJCLCAweEZCLCAweDE5LCAweDAzLAotCTB4RUQsIDB4RkQsIDB4MzIsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCOSwgMHgwMSwgMHhDMSwgMHhGQywgMHg4NiwgMHgwNSwKLQkweEE1LCAweEY2LCAweDFFLCAweDE0LCAweEJBLCAweDQ0LCAweEYwLCAweEY3LCAweDdCLCAweDAyLCAweDZCLAotCTB4RkYsIDB4RTQsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RDYsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMywgMHgwMCwgMHg0MywgMHhGRiwgMHhENSwgMHgwMSwgMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFNywKLQkweEYxLCAweEFDLCAweDI5LCAweDY2LCAweDM2LCAweEM5LCAweEYxLCAweDgzLCAweDA2LCAweERELCAweEZDLAotCTB4NjIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsCi0JMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwgMHhGRCwgMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywKLQkweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLCAweEU2LCAweDA2LCAweDM4LCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjQsIDB4RkYsCi0JMHg5OCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhCMCwgMHgwMCwgMHg0MSwgMHgwMCwgMHgzMCwgMHhGQywgMHg4NiwKLQkweDQ3LCAweEM2LCAweDBDLCAweDI0LCAweEY5LCAweDYwLCAweDA0LCAweDRCLCAweEZELCAweDdELCAweDAxLAotCTB4NUEsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NUEsCi0JMHhGRiwgMHg3RSwgMHgwMSwgMHg0OCwgMHhGRCwgMHg2NiwgMHgwNCwgMHgxOCwgMHhGOSwgMHhFOCwgMHgwQywKLQkweDdDLCAweDQ3LCAweDE5LCAweEZDLCAweDRELCAweDAwLCAweEE5LCAweDAwLCAweDM1LCAweEZGLCAweDk2LAotCTB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCi0JMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFOSwgMHgwNiwgMHgxMiwgMHhGMywgMHgxMCwgMHgyMiwgMHg2RSwKLQkweDNDLCAweDA1LCAweEYzLCAweDdFLCAweDA1LCAweDkxLCAweEZELCAweEY0LCAweDAwLCAweEJBLCAweEZGLAotCTB4MDksIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsCi0JMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwgMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwKLQkweEVCLCAweEYxLCAweDJBLCAweDA3LCAweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDIsIDB4MDAsIDB4RTEsIDB4RkYsCi0JMHg3MSwgMHhGRiwgMHg3MSwgMHgwMiwgMHgwMiwgMHhGOCwgMHhDQywgMHg0NCwgMHhGQSwgMHgxMywgMHhCMCwKLQkweEY2LCAweDgxLCAweDA1LCAweEMzLCAweEZDLCAweEI4LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzQsIDB4MDEsIDB4RUEsCi0JMHhGRCwgMHgxRiwgMHgwMywgMHhBRSwgMHhGQiwgMHg0NSwgMHgwNiwgMHhENSwgMHg0OCwgMHgzQywgMHgwMSwKLQkweERDLCAweEZELCAweEZELCAweDAxLCAweDgwLCAweEZFLCAweEVELCAweDAwLCAweDkzLCAweEZGLCAweDFCLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NkYsIDB4RkMsCi0JMHg0NywgMHgwNiwgMHhENywgMHhGNCwgMHg1RCwgMHgxQSwgMHg3NCwgMHg0MSwgMHg0OCwgMHhGNSwgMHgwNCwKLQkweDA0LCAweDgwLCAweEZFLCAweDY5LCAweDAwLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsCi0JMHgwNywgMHg4MCwgMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwKLQkweDc4LCAweEZDLCAweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA1LAotCTB4MDAsIDB4RjMsIDB4RkYsIDB4RjQsIDB4RkYsIDB4ODAsIDB4MDAsIDB4NTgsIDB4RkUsIDB4NDYsIDB4MDQsCi0JMHhERCwgMHhGNCwgMHhDMywgMHg0MCwgMHg4QywgMHgxQiwgMHg4OSwgMHhGNCwgMHg2NiwgMHgwNiwgMHg2MywKLQkweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLAotCTB4OTgsIDB4RkYsIDB4RTAsIDB4MDAsIDB4OUMsIDB4RkUsIDB4QzgsIDB4MDEsIDB4M0YsIDB4RkUsIDB4NjIsCi0JMHgwMCwgMHhCOCwgMHg0OCwgMHgzRiwgMHgwNywgMHg0NywgMHhGQiwgMHg1MywgMHgwMywgMHhEMCwgMHhGRCwKLQkweDQwLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAotCTB4MDAsIDB4NDcsIDB4RkYsIDB4QjAsIDB4MDEsIDB4RDYsIDB4RkMsIDB4NTgsIDB4MDUsIDB4MEQsIDB4RjcsCi0JMHhENywgMHgxMiwgMHg0RSwgMHg0NSwgMHg5NiwgMHhGOCwgMHgyMCwgMHgwMiwgMHhBMCwgMHhGRiwgMHhDNywKLQkweEZGLCAweDRGLCAweDAwLCAweEQwLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsIDB4RjIsIDB4NjAsCi0JMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywgMHg1MSwgMHgwMSwKLQkweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEIwLAotCTB4RkYsIDB4MDcsIDB4MDEsIDB4NzIsIDB4RkQsIDB4QUUsIDB4MDUsIDB4QzQsIDB4RjIsIDB4OTAsIDB4M0IsCi0JMHgzRiwgMHgyMywgMHhEOSwgMHhGMiwgMHhGOSwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLCAweDAwLCAweEJBLCAweEZGLCAweDg5LCAweDAwLAotCTB4NTEsIDB4RkYsIDB4NzcsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NjQsIDB4RkIsIDB4MjYsIDB4NDcsIDB4RkMsCi0JMHgwRCwgMHhCNCwgMHhGOCwgMHg5NSwgMHgwNCwgMHgzMSwgMHhGRCwgMHg4OCwgMHgwMSwgMHg1NiwgMHhGRiwKLQkweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVFLCAweEZGLCAweDcyLAotCTB4MDEsIDB4NjIsIDB4RkQsIDB4MkYsIDB4MDQsIDB4ODksIDB4RjksIDB4QjYsIDB4MEIsIDB4RDIsIDB4NDcsCi0JMHhFQiwgMHhGQywgMHhFNCwgMHhGRiwgMHhFMywgMHgwMCwgMHgxNiwgMHhGRiwgMHhBNSwgMHgwMCwgMHhBRiwKLQkweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAotCTB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsIDB4QkEsIDB4MjAsIDB4NjEsIDB4M0QsIDB4NTYsCi0JMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwgMHgwMCwgMHhDNSwgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDdBLCAweEZGLCAweDcwLCAweDAxLCAweEM3LAotCTB4RkMsIDB4QTAsIDB4MDYsIDB4QUUsIDB4RjEsIDB4NjUsIDB4MzUsIDB4RDEsIDB4MkEsIDB4Q0EsIDB4RjEsCi0JMHgyQSwgMHgwNywgMHg0MCwgMHhGQywgMHhEMCwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDA5LCAweDAwLCAweERCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDNELCAweEZGLAotCTB4QzksIDB4MDIsIDB4NjQsIDB4RjcsIDB4MkYsIDB4NDQsIDB4NDQsIDB4MTUsIDB4NEEsIDB4RjYsIDB4QUQsCi0JMHgwNSwgMHhBRiwgMHhGQywgMHhDMCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLCAweEZGLCAweDI2LCAweDAxLCAweDA4LCAweEZFLCAweEU0LAotCTB4MDIsIDB4MjEsIDB4RkMsIDB4MzEsIDB4MDUsIDB4RUIsIDB4NDgsIDB4MzcsIDB4MDIsIDB4NkIsIDB4RkQsCi0JMHgzOSwgMHgwMiwgMHg2MSwgMHhGRSwgMHhGQywgMHgwMCwgMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQzLCAweDAxLCAweDdELCAweEZDLCAweDIzLCAweDA2LAotCTB4MzIsIDB4RjUsIDB4MEMsIDB4MTksIDB4MzgsIDB4NDIsIDB4QzcsIDB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsCi0JMHhGRSwgMHg0RSwgMHgwMCwgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJELCAweDAwLCAweDU0LCAweEZGLCAweEI4LCAweDAxLCAweDVELCAweEZDLCAweDFBLCAweDA3LCAweDhBLAotCTB4RjEsIDB4N0IsIDB4MkUsIDB4MDQsIDB4MzIsIDB4N0YsIDB4RjEsIDB4RUMsIDB4MDYsIDB4OEEsIDB4RkMsCi0JMHg5OCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOCwKLQkweEZGLCAweEU3LCAweEZGLCAweDk5LCAweDAwLCAweDJDLCAweEZFLCAweDhDLCAweDA0LCAweDZELCAweEY0LAotCTB4RjAsIDB4M0YsIDB4RTAsIDB4MUMsIDB4MzQsIDB4RjQsIDB4ODUsIDB4MDYsIDB4NTcsIDB4RkMsIDB4RTAsCi0JMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5RSwgMHhGRiwKLQkweEQxLCAweDAwLCAweEJCLCAweEZFLCAweDhELCAweDAxLCAweEFFLCAweEZFLCAweDc0LCAweEZGLCAweDhELAotCTB4NDgsIDB4NUQsIDB4MDgsIDB4RDQsIDB4RkEsIDB4OEQsIDB4MDMsIDB4QjMsIDB4RkQsIDB4NEUsIDB4MDEsCi0JMHg2RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwKLQkweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLCAweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLAotCTB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsIDB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsCi0JMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKLQkweERGLCAweDAxLCAweDMyLCAweEZDLCAweDFGLCAweDA3LCAweDNCLCAweEYyLCAweDExLCAweDI3LCAweDk3LAotCTB4MzgsIDB4MTksIDB4RjIsIDB4MzYsIDB4MDYsIDB4MTUsIDB4RkQsIDB4M0YsIDB4MDEsIDB4OTMsIDB4RkYsCi0JMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxQiwKLQkweDAxLCAweDUwLCAweEZELCAweEUxLCAweDA1LCAweDgyLCAweEYyLCAweDhGLCAweDNBLCAweDkyLCAweDI0LAotCTB4OUQsIDB4RjIsIDB4MDksIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMCwgMHhGRiwgMHg3QSwgMHgwMCwgMHg3MCwgMHhGRiwKLQkweDNFLCAweDAwLCAweDBDLCAweDAxLCAweEExLCAweEZBLCAweEJCLCAweDQ2LCAweDM2LCAweDBGLCAweDQ1LAotCTB4RjgsIDB4QzksIDB4MDQsIDB4MTgsIDB4RkQsIDB4OTMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg2NiwgMHgwMSwgMHg3RCwKLQkweEZELCAweEY4LCAweDAzLCAweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELCAweDQ4LCAweEM1LCAweEZELAotCTB4N0EsIDB4RkYsIDB4MUQsIDB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsIDB4QTksIDB4RkYsIDB4MTUsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NSwgMHhGQywKLQkweEJCLCAweDA2LCAweEEwLCAweEYzLCAweDY0LCAweDFGLCAweDRBLCAweDNFLCAweEIwLCAweEYzLCAweDA4LAotCTB4MDUsIDB4REUsIDB4RkQsIDB4QzcsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg3RiwgMHgwMSwgMHhCMCwgMHhGQywgMHhCRSwKLQkweDA2LCAweDk3LCAweEYxLCAweDNGLCAweDM0LCAweDE5LCAweDJDLCAweEFELCAweEYxLCAweDI4LCAweDA3LAotCTB4NDgsIDB4RkMsIDB4QzksIDB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHhFMCwgMHhGRiwgMHgyNiwgMHgwMCwgMHgxQSwgMHgwMCwgMHgwQiwgMHhGRiwgMHgxRSwgMHgwMywKLQkweENELCAweEY2LCAweDg5LCAweDQzLCAweDkxLCAweDE2LCAweEU3LCAweEY1LCAweEQ4LCAweDA1LCAweDlELAotCTB4RkMsIDB4QzcsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgxRiwgMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwgMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwKLQkweEZDLCAweDI0LCAweDA0LCAweEY1LCAweDQ4LCAweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLAotCTB4NDIsIDB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsCi0JMHgwMCwgMHgzQywgMHhGRiwgMHhDRCwgMHgwMSwgMHg4RSwgMHhGQywgMHhGQywgMHgwNSwgMHg5MCwgMHhGNSwKLQkweEJCLCAweDE3LCAweEVFLCAweDQyLCAweDRFLCAweEY2LCAweDY4LCAweDAzLCAweERGLCAweEZFLCAweDMzLAotCTB4MDAsIDB4MUEsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHg0RiwgMHhGRiwgMHhDMiwgMHgwMSwgMHg1MSwgMHhGQywgMHgyMywgMHgwNywgMHg5QSwgMHhGMSwgMHgzQSwKLQkweDJELCAweDM1LCAweDMzLCAweDg5LCAweEYxLCAweEQ1LCAweDA2LCAweDlELCAweEZDLCAweDhCLCAweDAxLAotCTB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkMsIDB4RkYsIDB4REIsCi0JMHhGRiwgMHhCMiwgMHgwMCwgMHgwMiwgMHhGRSwgMHhDRiwgMHgwNCwgMHgwNSwgMHhGNCwgMHgxNiwgMHgzRiwKLQkweDM2LCAweDFFLCAweEU0LCAweEYzLCAweEEzLCAweDA2LCAweDRELCAweEZDLCAweEUzLCAweDAxLCAweDM2LAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsIDB4MDAsCi0JMHhEQiwgMHhGRSwgMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwgMHg4MSwKLQkweDA5LCAweDYxLCAweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LCAweEZGLAotCTB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUQsCi0JMHgwMSwgMHgwMywgMHhGRCwgMHhGNywgMHgwNCwgMHhFMywgMHhGNywgMHg1MSwgMHgxMCwgMHg1NSwgMHg0NiwKLQkweEY5LCAweEY5LCAweDYzLCAweDAxLCAweDBELCAweDAwLCAweDhCLCAweEZGLCAweDZELCAweDAwLCAweEM1LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsCi0JMHgzMSwgMHhGQywgMHgxNSwgMHgwNywgMHg2RCwgMHhGMiwgMHhCRiwgMHgyNSwgMHhBNSwgMHgzOSwgMHg0RCwKLQkweEYyLCAweDBCLCAweDA2LCAweDMzLCAweEZELCAweDJELCAweDAxLCAweDlELCAweEZGLCAweDEzLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MkYsIDB4MDEsIDB4MzAsCi0JMHhGRCwgMHgxMCwgMHgwNiwgMHg0NywgMHhGMiwgMHg4NywgMHgzOSwgMHhFNSwgMHgyNSwgMHg2NywgMHhGMiwKLQkweDE2LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwgMHhENywgMHhGNywgMHhGQywKLQkweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsIDB4NTksIDB4MDEsIDB4OTksIDB4RkQsIDB4QzAsCi0JMHgwMywgMHg2RSwgMHhGQSwgMHg2MSwgMHgwOSwgMHg1RCwgMHg0OCwgMHhBNiwgMHhGRSwgMHgwRiwgMHhGRiwKLQkweDU4LCAweDAxLCAweEQ3LCAweEZFLCAweEMzLCAweDAwLCAweEEzLCAweEZGLCAweDE2LCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4QTAsIDB4MDYsCi0JMHhFRCwgMHhGMywgMHgwRiwgMHgxRSwgMHgyRCwgMHgzRiwgMHgxMCwgMHhGNCwgMHhDOCwgMHgwNCwgMHgwNywKLQkweEZFLCAweEFGLCAweDAwLCAweERDLCAweEZGLCAweEZDLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLAotCTB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsIDB4OEQsIDB4MDEsIDB4OUIsIDB4RkMsIDB4RDgsIDB4MDYsIDB4ODcsCi0JMHhGMSwgMHgxMywgMHgzMywgMHg1RSwgMHgyRCwgMHg5OCwgMHhGMSwgMHgyMiwgMHgwNywgMHg1MiwgMHhGQywKLQkweEMxLCAweDAxLCAweDRGLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU1LAotCTB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkUsIDB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsCi0JMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwgMHgwMCwgMHgwNiwgMHg4QywgMHhGQywgMHhDRSwKLQkweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDg4LCAweEZGLAotCTB4MDksIDB4MDEsIDB4NDUsIDB4RkUsIDB4NkUsIDB4MDIsIDB4MDYsIDB4RkQsIDB4MUMsIDB4MDMsIDB4RjQsCi0JMHg0OCwgMHg0MSwgMHgwNCwgMHg4NywgMHhGQywgMHhCMCwgMHgwMiwgMHgyMywgMHhGRSwgMHgxOSwgMHgwMSwKLQkweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLAotCTB4RkYsIDB4QzYsIDB4MDEsIDB4OUYsIDB4RkMsIDB4RDMsIDB4MDUsIDB4RjEsIDB4RjUsIDB4NkMsIDB4MTYsCi0JMHg5RSwgMHg0MywgMHhERCwgMHhGNiwgMHgxNSwgMHgwMywgMHgxMCwgMHhGRiwgMHgxNywgMHgwMCwgMHgyOCwKLQkweDAwLCAweERGLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAotCTB4Q0EsIDB4MDEsIDB4NDcsIDB4RkMsIDB4MjgsIDB4MDcsIDB4QjAsIDB4RjEsIDB4RjUsIDB4MkIsIDB4NjAsCi0JMHgzNCwgMHg5QSwgMHhGMSwgMHhCQiwgMHgwNiwgMHhCMywgMHhGQywgMHg3RCwgMHgwMSwgMHg3MywgMHhGRiwKLQkweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LAotCTB4MDAsIDB4REEsIDB4RkQsIDB4MEYsIDB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsCi0JMHg5NywgMHhGMywgMHhCRCwgMHgwNiwgMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKLQkweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEFBLCAweEZGLCAweEIzLCAweDAwLCAweEZBLCAweEZFLAotCTB4MTcsIDB4MDEsIDB4ODYsIDB4RkYsIDB4QUMsIDB4RkQsIDB4MTYsIDB4NDgsIDB4QUEsIDB4MEEsIDB4RUUsCi0JMHhGOSwgMHhGRSwgMHgwMywgMHg3QSwgMHhGRCwgMHg2NywgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkyLCAweDAxLCAweDFCLAotCTB4RkQsIDB4QzQsIDB4MDQsIDB4NTEsIDB4RjgsIDB4MTMsIDB4MEYsIDB4QzgsIDB4NDYsIDB4QjYsIDB4RkEsCi0JMHgwMSwgMHgwMSwgMHg0NCwgMHgwMCwgMHg2QywgMHhGRiwgMHg3QiwgMHgwMCwgMHhCRiwgMHhGRiwgMHgxMCwKLQkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLAotCTB4MDgsIDB4MDcsIDB4QTQsIDB4RjIsIDB4NkQsIDB4MjQsIDB4QUQsIDB4M0EsIDB4ODgsIDB4RjIsIDB4REIsCi0JMHgwNSwgMHg1MywgMHhGRCwgMHgxOSwgMHgwMSwgMHhBNywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLAotCTB4MDYsIDB4MTQsIDB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsCi0JMHgzMywgMHhGQywgMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwKLQkweDAwLCAweENCLCAweEZGLCAweDVDLCAweDAwLCAweEFDLCAweEZGLCAweEQwLCAweEZGLCAweENELCAweDAxLAotCTB4MzAsIDB4RjksIDB4QzgsIDB4NDUsIDB4QjYsIDB4MTEsIDB4NkIsIDB4RjcsIDB4MkQsIDB4MDUsIDB4RTksCi0JMHhGQywgMHhBOCwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDI1LCAweDAwLCAweDZELCAweEZGLCAweDRDLCAweDAxLCAweEI2LCAweEZELCAweDg2LCAweDAzLCAweEUxLAotCTB4RkEsIDB4M0QsIDB4MDgsIDB4OTIsIDB4NDgsIDB4OEUsIDB4RkYsIDB4QTEsIDB4RkUsIDB4OTMsIDB4MDEsCi0JMHhCOCwgMHhGRSwgMHhEMywgMHgwMCwgMHg5RCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU4LCAweEZDLCAweDgyLCAweDA2LCAweDNFLCAweEY0LAotCTB4QkEsIDB4MUMsIDB4MDcsIDB4NDAsIDB4NzksIDB4RjQsIDB4ODQsIDB4MDQsIDB4MzEsIDB4RkUsIDB4OTYsCi0JMHgwMCwgMHhFOCwgMHhGRiwgMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKLQkweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLCAweEYxLCAweEUzLAotCTB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsIDB4QjcsIDB4MDEsCi0JMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwQiwKLQkweDAwLCAweDUxLCAweDAwLCAweEFBLCAweEZFLCAweEMwLCAweDAzLCAweEI4LCAweEY1LCAweDIxLCAweDQyLAotCTB4MzEsIDB4MTksIDB4MjgsIDB4RjUsIDB4MjcsIDB4MDYsIDB4N0MsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RCwgMHhGRiwgMHhGQSwgMHgwMCwKLQkweDY0LCAweEZFLCAweDMyLCAweDAyLCAweDc4LCAweEZELCAweDFCLCAweDAyLCAweEVBLCAweDQ4LCAweDUwLAotCTB4MDUsIDB4MTQsIDB4RkMsIDB4RUIsIDB4MDIsIDB4MDUsIDB4RkUsIDB4MjcsIDB4MDEsIDB4N0MsIDB4RkYsCi0JMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhCRiwKLQkweDAxLCAweEIyLCAweEZDLCAweEE5LCAweDA1LCAweDU1LCAweEY2LCAweDIwLCAweDE1LCAweDQyLCAweDQ0LAotCTB4NzUsIDB4RjcsIDB4QkYsIDB4MDIsIDB4NDMsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MzYsIDB4MDAsIDB4REEsCi0JMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwKLQkweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLCAweEFFLCAweDJBLCAweDg2LCAweDM1LCAweEIxLAotCTB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsIDB4MDEsIDB4N0IsIDB4RkYsIDB4MjAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDMywgMHhGRiwgMHhFMCwgMHgwMCwgMHhCMywKLQkweEZELCAweDRCLCAweDA1LCAweDRELCAweEYzLCAweDQ1LCAweDNELCAweEUwLCAweDIwLCAweDRGLCAweEYzLAotCTB4RDUsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNCwgMHgwMCwgMHgxOSwgMHhGRiwgMHhERCwgMHgwMCwKLQkweEYwLCAweEZGLCAweEQ0LCAweEZDLCAweEM5LCAweDQ3LCAweEQ4LCAweDBCLCAweDdDLCAweEY5LCAweDM1LAotCTB4MDQsIDB4NUYsIDB4RkQsIDB4NzQsIDB4MDEsIDB4NUUsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwgMHg4NywgMHgwMSwgMHgzNCwgMHhGRCwgMHg4RiwKLQkweDA0LCAweEMwLCAweEY4LCAweEQ5LCAweDBELCAweDMxLCAweDQ3LCAweDdCLCAweEZCLCAweDlDLCAweDAwLAotCTB4N0QsIDB4MDAsIDB4NEQsIDB4RkYsIDB4OEEsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNywgMHgwNiwKLQkweEUwLCAweEYyLCAweDE4LCAweDIzLCAweEFCLCAweDNCLCAweENDLCAweEYyLCAweEE4LCAweDA1LCAweDc2LAotCTB4RkQsIDB4MDQsIDB4MDEsIDB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgxQSwgMHgwMCwgMHg4OSwgMHhGRiwgMHg1MywgMHgwMSwgMHhGNSwgMHhGQywgMHg2MywgMHgwNiwgMHhFOSwKLQkweEYxLCAweDYzLCAweDM3LCAweDg1LCAweDI4LCAweDA5LCAweEYyLCAweDI3LCAweDA3LCAweDM1LCAweEZDLAotCTB4REEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDEsCi0JMHhGRiwgMHg0RSwgMHgwMCwgMHhDQSwgMHhGRiwgMHg5QSwgMHhGRiwgMHgyQSwgMHgwMiwgMHg4MywgMHhGOCwKLQkweDNGLCAweDQ1LCAweEZCLCAweDEyLCAweDAxLCAweEY3LCAweDVELCAweDA1LCAweEQzLCAweEZDLCAweEIxLAotCTB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCi0JMHg3MywgMHhGRiwgMHgzRiwgMHgwMSwgMHhEMywgMHhGRCwgMHg0QywgMHgwMywgMHg1NCwgMHhGQiwgMHgxRiwKLQkweDA3LCAweEJCLCAweDQ4LCAweDdELCAweDAwLCAweDMzLCAweEZFLCAweENGLCAweDAxLCAweDk4LCAweEZFLAotCTB4RTIsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCi0JMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywgMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwKLQkweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLCAweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUUsIDB4RkYsCi0JMHhBNiwgMHgwMSwgMHg3NiwgMHhGQywgMHgwMSwgMHgwNywgMHg3RCwgMHhGMSwgMHhBRCwgMHgzMCwgMHhEQywKLQkweDJGLCAweDdGLCAweEYxLCAweDBDLCAweDA3LCAweDZDLCAweEZDLCAweEFELCAweDAxLCAweDVBLCAweEZGLAotCTB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4NkMsCi0JMHgwMCwgMHg3QiwgMHhGRSwgMHgwQywgMHgwNCwgMHgzQSwgMHhGNSwgMHg1RiwgMHg0MSwgMHg4MywgMHgxQSwKLQkweENELCAweEY0LCAweDRCLCAweDA2LCAweDZELCAweEZDLCAweEQ5LCAweDAxLCAweDM5LCAweEZGLCAweDM1LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTMsIDB4RkYsIDB4RUMsIDB4MDAsIDB4ODMsIDB4RkUsCi0JMHhGNywgMHgwMSwgMHhFOCwgMHhGRCwgMHgyMSwgMHgwMSwgMHhEMiwgMHg0OCwgMHg2NCwgMHgwNiwgMHhBMSwKLQkweEZCLCAweDI2LCAweDAzLCAweEU3LCAweEZELCAweDM1LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4QzUsCi0JMHhGQywgMHg3QywgMHgwNSwgMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywgMHg0NCwgMHgxNCwgMHhGOCwKLQkweDY3LCAweDAyLCAweDc3LCAweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLCAweEQ1LCAweEZGLCAweDBCLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzksIDB4RkMsCi0JMHgyOSwgMHgwNywgMHhFRiwgMHhGMSwgMHg2MiwgMHgyOSwgMHhBNSwgMHgzNiwgMHhEMCwgMHhGMSwgMHg3QiwKLQkweDA2LCAweEUzLCAweEZDLCAweDVFLCAweDAxLCAweDgzLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLAotCTB4MDEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjgsIDB4RkYsIDB4RjYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4ODQsCi0JMHgwNSwgMHhGRCwgMHhGMiwgMHg1MiwgMHgzQywgMHgzNSwgMHgyMiwgMHgwQiwgMHhGMywgMHhFQiwgMHgwNiwKLQkweDM3LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLAotCTB4MDAsIDB4QjUsIDB4RkYsIDB4OTQsIDB4MDAsIDB4MzksIDB4RkYsIDB4QTMsIDB4MDAsIDB4NTgsIDB4MDAsCi0JMHgwMiwgMHhGQywgMHg3MywgMHg0NywgMHgwQiwgMHgwRCwgMHgwQiwgMHhGOSwgMHg2QywgMHgwNCwgMHg0NSwKLQkweEZELCAweDgwLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MkEsIDB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsIDB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsCi0JMHhGOSwgMHhBNCwgMHgwQywgMHg5MCwgMHg0NywgMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwKLQkweDJFLCAweEZGLCAweDk5LCAweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LAotCTB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzksIDB4RkMsIDB4RTQsIDB4MDYsIDB4MjEsIDB4RjMsCi0JMHhDNCwgMHgyMSwgMHhBNSwgMHgzQywgMHgxNiwgMHhGMywgMHg3MiwgMHgwNSwgMHg5QSwgMHhGRCwgMHhFRiwKLQkweDAwLCAweEJDLCAweEZGLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAotCTB4ODAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4REEsIDB4RkMsIDB4ODcsIDB4MDYsIDB4QzUsIDB4RjEsIDB4NDYsCi0JMHgzNiwgMHhEMSwgMHgyOSwgMHhFMywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwKLQkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ2LCAweEZGLCAweDNGLAotCTB4MDAsIDB4RTcsIDB4RkYsIDB4NjUsIDB4RkYsIDB4ODUsIDB4MDIsIDB4REUsIDB4RjcsIDB4QTksIDB4NDQsCi0JMHg0MywgMHgxNCwgMHg5OSwgMHhGNiwgMHg4QiwgMHgwNSwgMHhCRiwgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywKLQkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LCAweEZGLAotCTB4MzEsIDB4MDEsIDB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsIDB4REIsCi0JMHg0OCwgMHg3MywgMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwgMHgwMCwKLQkweDkxLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LAotCTB4MDEsIDB4NzIsIDB4RkMsIDB4M0YsIDB4MDYsIDB4RUIsIDB4RjQsIDB4MTIsIDB4MUEsIDB4QTEsIDB4NDEsCi0JMHg2MywgMHhGNSwgMHhGMywgMHgwMywgMHg4QSwgMHhGRSwgMHg2MywgMHgwMCwgMHgwMiwgMHgwMCwgMHhFRSwKLQkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU4LCAweEZGLCAweEIxLCAweDAxLAotCTB4NjcsIDB4RkMsIDB4MTAsIDB4MDcsIDB4ODEsIDB4RjEsIDB4NzMsIDB4MkYsIDB4MTUsIDB4MzEsIDB4N0MsCi0JMHhGMSwgMHhGQiwgMHgwNiwgMHg3QywgMHhGQywgMHhBMiwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY0LCAweEZGLCAweEYxLCAweEZGLCAweDg1LCAweDAwLCAweDRFLAotCTB4RkUsIDB4NTYsIDB4MDQsIDB4QzMsIDB4RjQsIDB4OTUsIDB4NDAsIDB4RDgsIDB4MUIsIDB4NzYsIDB4RjQsCi0JMHg2RCwgMHgwNiwgMHg2MCwgMHhGQywgMHhERCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLCAweEZFLCAweEJCLCAweDAxLAotCTB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsIDB4MkUsIDB4RkIsIDB4NjAsCi0JMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFFLCAweDAxLCAweERCLCAweEZDLCAweDRELAotCTB4MDUsIDB4MjQsIDB4RjcsIDB4OEUsIDB4MTIsIDB4NkQsIDB4NDUsIDB4QkMsIDB4RjgsIDB4MEMsIDB4MDIsCi0JMHhBQywgMHhGRiwgMHhDMCwgMHhGRiwgMHg1MiwgMHgwMCwgMHhDRiwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERDLCAweDAxLCAweDM0LCAweEZDLCAweDI1LCAweDA3LAotCTB4MTgsIDB4RjIsIDB4MTUsIDB4MjgsIDB4QkYsIDB4MzcsIDB4RjcsIDB4RjEsIDB4NTYsIDB4MDYsIDB4RkUsCi0JMHhGQywgMHg0RCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweEFFLCAweEZGLCAweDBCLCAweDAxLCAweDZBLCAweEZELCAweEJBLCAweDA1LCAweEI0LAotCTB4RjIsIDB4NTgsIDB4M0IsIDB4OEEsIDB4MjMsIDB4Q0IsIDB4RjIsIDB4RkQsIDB4MDYsIDB4MzQsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQiwKLQkweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLCAweDAwLCAweEJFLCAweDAwLCAweDM4LCAweEZCLAotCTB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsIDB4QTEsIDB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsCi0JMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwKLQkweDVGLCAweEZGLCAweDcwLCAweDAxLCAweDY4LCAweEZELCAweDIzLCAweDA0LCAweEEyLCAweEY5LCAweDczLAotCTB4MEIsIDB4RTQsIDB4NDcsIDB4MUIsIDB4RkQsIDB4Q0QsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MEYsIDB4RkYsCi0JMHhBOSwgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKLQkweEZGLCAweEU2LCAweDAxLCAweDNGLCAweEZDLCAweENFLCAweDA2LCAweDY2LCAweEYzLCAweDZGLCAweDIwLAotCTB4OTYsIDB4M0QsIDB4NjksIDB4RjMsIDB4MzgsIDB4MDUsIDB4QkYsIDB4RkQsIDB4RDksIDB4MDAsIDB4QzcsCi0JMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3OCwgMHhGRiwKLQkweDc0LCAweDAxLCAweEMyLCAweEZDLCAweEE3LCAweDA2LCAweEE4LCAweEYxLCAweDI1LCAweDM1LCAweDFCLAotCTB4MkIsIDB4QzIsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDEsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDcsIDB4RkYsCi0JMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwKLQkweDAwLCAweDMyLCAweEZGLCAweERDLCAweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LAotCTB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsIDB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMywgMHgwMSwKLQkweDBGLCAweEZFLCAweEQ3LCAweDAyLCAweDNCLCAweEZDLCAweEY1LCAweDA0LCAweEVELCAweDQ4LCAweDcwLAotCTB4MDIsIDB4NTIsIDB4RkQsIDB4NDYsIDB4MDIsIDB4NUEsIDB4RkUsIDB4RkYsIDB4MDAsIDB4OEIsIDB4RkYsCi0JMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMiwgMHgwMSwgMHg4MSwKLQkweEZDLCAweDFBLCAweDA2LCAweDQ3LCAweEY1LCAweEMxLCAweDE4LCAweDYwLCAweDQyLCAweEU0LCAweEY1LAotCTB4QTYsIDB4MDMsIDB4QjksIDB4RkUsIDB4NDgsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MywgMHhGRiwgMHhCQiwgMHgwMSwgMHg1QSwgMHhGQywKLQkweDFDLCAweDA3LCAweDhELCAweEYxLCAweDM0LCAweDJFLCAweDQ4LCAweDMyLCAweDgxLCAweEYxLCAweEU3LAotCTB4MDYsIDB4OEUsIDB4RkMsIDB4OTYsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwKLQkweDA0LCAweDU1LCAweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LAotCTB4NTUsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsCi0JMHgwMCwgMHg5RiwgMHhGRiwgMHhDRSwgMHgwMCwgMHhDMiwgMHhGRSwgMHg4MCwgMHgwMSwgMHhDNiwgMHhGRSwKLQkweDQwLCAweEZGLCAweDgxLCAweDQ4LCAweDlFLCAweDA4LCAweEJBLCAweEZBLCAweDlBLCAweDAzLCAweEFDLAotCTB4RkQsIDB4NTEsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNCwgMHgwMSwgMHhGMSwgMHhGQywgMHgxRCwgMHgwNSwgMHg4RiwKLQkweEY3LCAweDRBLCAweDExLCAweEYyLCAweDQ1LCAweDZCLCAweEY5LCAweEFFLCAweDAxLCAweEUyLCAweEZGLAotCTB4QTIsIDB4RkYsIDB4NjEsIDB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCi0JMHgwMCwgMHgzRCwgMHhGRiwgMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRCwgMHgwNywgMHg0NSwgMHhGMiwKLQkweEM2LCAweDI2LCAweEQzLCAweDM4LCAweDI0LCAweEYyLCAweDJELCAweDA2LCAweDFCLCAweEZELCAweDNCLAotCTB4MDEsIDB4OTUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwgMHhGMiwgMHg1NCwKLQkweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLAotCTB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzEsIDB4RkYsIDB4NzYsCi0JMHgwMCwgMHg3NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHgyMiwgMHgwMSwgMHg3NiwgMHhGQSwgMHhBMywgMHg0NiwKLQkweDdELCAweDBGLCAweDJDLCAweEY4LCAweEQ1LCAweDA0LCAweDEzLCAweEZELCAweDk2LCAweDAxLCAweDUxLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjQsIDB4RkYsCi0JMHg2MywgMHgwMSwgMHg4NCwgMHhGRCwgMHhFQiwgMHgwMywgMHgxNCwgMHhGQSwgMHg0NywgMHgwQSwgMHgyQywKLQkweDQ4LCAweEY2LCAweEZELCAweDYzLCAweEZGLCAweDJCLCAweDAxLCAweEYwLCAweEZFLCAweEI4LCAweDAwLAotCTB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCi0JMHgwMSwgMHg0NywgMHhGQywgMHhCNSwgMHgwNiwgMHhCMCwgMHhGMywgMHgxOSwgMHgxRiwgMHg3RSwgMHgzRSwKLQkweEM0LCAweEYzLCAweEZBLCAweDA0LCAweEU3LCAweEZELCAweEMxLCAweDAwLCAweEQzLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzEsIDB4RkYsIDB4ODIsIDB4MDEsCi0JMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwgMHhGRCwgMHgzMywgMHg2MiwgMHgyQywgMHhBOCwKLQkweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LCAweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHgzMSwgMHgwMywgMHhBRCwgMHhGNiwgMHg2NSwgMHg0MywgMHhEQywgMHgxNiwgMHhEMSwgMHhGNSwKLQkweEUxLCAweDA1LCAweDk5LCAweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsIDB4RkYsIDB4MTQsIDB4MDEsIDB4MkQsIDB4RkUsCi0JMHg5QywgMHgwMiwgMHhBRCwgMHhGQywgMHhFOSwgMHgwMywgMHhGNiwgMHg0OCwgMHg3MywgMHgwMywgMHhFMCwKLQkweEZDLCAweDgyLCAweDAyLCAweDNCLCAweEZFLCAweDBFLCAweDAxLCAweDg2LCAweEZGLCAweDFFLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0MsIDB4MDEsIDB4OTEsIDB4RkMsIDB4RjMsCi0JMHgwNSwgMHhBNiwgMHhGNSwgMHg3MCwgMHgxNywgMHgxNywgMHg0MywgMHg2RCwgMHhGNiwgMHg1NiwgMHgwMywKLQkweEVBLCAweEZFLCAweDJELCAweDAwLCAweDFELCAweDAwLCAweEU0LCAweEZGLCAweDA4LCAweDAwLCAweEZELAotCTB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsCi0JMHg5RSwgMHhGMSwgMHhGMiwgMHgyQywgMHg3OCwgMHgzMywgMHg4QywgMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwKLQkweEZDLCAweDg4LCAweDAxLCAweDZELCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4RDgsIDB4RkYsIDB4QjcsIDB4MDAsIDB4RjksIDB4RkQsIDB4REUsIDB4MDQsIDB4RUYsCi0JMHhGMywgMHhFNCwgMHgzRSwgMHg4MSwgMHgxRSwgMHhEMiwgMHhGMywgMHhBOSwgMHgwNiwgMHg0QiwgMHhGQywKLQkweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE1LAotCTB4RkYsIDB4QkUsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NDUsIDB4MDEsIDB4MzMsIDB4RkYsIDB4NUEsIDB4RkUsCi0JMHg0OCwgMHg0OCwgMHhDMywgMHgwOSwgMHg0NywgMHhGQSwgMHhEMiwgMHgwMywgMHg5MCwgMHhGRCwgMHg1RSwKLQkweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAotCTB4NEYsIDB4RkYsIDB4OUEsIDB4MDEsIDB4MDgsIDB4RkQsIDB4RUIsIDB4MDQsIDB4RkMsIDB4RjcsIDB4MEEsCi0JMHgxMCwgMHg3MCwgMHg0NiwgMHgyMiwgMHhGQSwgMHg0RCwgMHgwMSwgMHgxOSwgMHgwMCwgMHg4NCwgMHhGRiwKLQkweDcwLCAweDAwLCAweEM0LCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLAotCTB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsCi0JMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwgMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwKLQkweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE1LCAweDAwLCAweDk5LCAweEZGLAotCTB4MzMsIDB4MDEsIDB4MjksIDB4RkQsIDB4MUEsIDB4MDYsIDB4M0IsIDB4RjIsIDB4NEIsIDB4MzksIDB4MzAsCi0JMHgyNiwgMHg1QiwgMHhGMiwgMHgxOSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwKLQkweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY4LCAweDAwLCAweDk1LAotCTB4RkYsIDB4RkEsIDB4RkYsIDB4ODMsIDB4MDEsIDB4QkIsIDB4RjksIDB4MkIsIDB4NDYsIDB4QkIsIDB4MTAsCi0JMHhCRiwgMHhGNywgMHgwNywgMHgwNSwgMHhGQiwgMHhGQywgMHhBMCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDU2LCAweDAxLAotCTB4QTAsIDB4RkQsIDB4QjMsIDB4MDMsIDB4ODcsIDB4RkEsIDB4MUYsIDB4MDksIDB4NkEsIDB4NDgsIDB4RDksCi0JMHhGRSwgMHhGNiwgMHhGRSwgMHg2NSwgMHgwMSwgMHhEMCwgMHhGRSwgMHhDNywgMHgwMCwgMHhBMiwgMHhGRiwKLQkweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUwLAotCTB4RkMsIDB4OTksIDB4MDYsIDB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsIDB4M0YsIDB4MjcsIDB4RjQsCi0JMHhCOSwgMHgwNCwgMHgxMCwgMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywKLQkweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDkwLCAweDAxLCAweDk2LCAweEZDLAotCTB4REQsIDB4MDYsIDB4ODUsIDB4RjEsIDB4RDAsIDB4MzIsIDB4QTYsIDB4MkQsIDB4OTQsIDB4RjEsIDB4MjAsCi0JMHgwNywgMHg1NCwgMHhGQywgMHhCRiwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDA3LCAweDAwLCAweEU2LCAweEZGLCAweDE1LCAweDAwLCAweDNDLCAweDAwLCAweENGLCAweEZFLCAweDgzLAotCTB4MDMsIDB4MjAsIDB4RjYsIDB4QjIsIDB4NDIsIDB4MkIsIDB4MTgsIDB4NzEsIDB4RjUsIDB4MDksIDB4MDYsCi0JMHg4OCwgMHhGQywgMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwKLQkweDAwLCAweDg5LCAweEZGLCAweDA2LCAweDAxLCAweDRDLCAweEZFLCAweDYwLCAweDAyLCAweDFGLCAweEZELAotCTB4RTIsIDB4MDIsIDB4RjMsIDB4NDgsIDB4N0QsIDB4MDQsIDB4NkUsIDB4RkMsIDB4QkQsIDB4MDIsIDB4MUMsCi0JMHhGRSwgMHgxQywgMHgwMSwgMHg4MCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM1LCAweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LAotCTB4RjYsIDB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsIDB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsCi0JMHgxMSwgMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwKLQkweDAwLCAweDQ5LCAweEZGLCAweENCLCAweDAxLCAweDQ1LCAweEZDLCAweDI5LCAweDA3LCAweEI2LCAweEYxLAotCTB4QUQsIDB4MkIsIDB4QTIsIDB4MzQsIDB4OUUsIDB4RjEsIDB4QjQsIDB4MDYsIDB4QjgsIDB4RkMsIDB4N0EsCi0JMHgwMSwgMHg3NSwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweENDLCAweEZGLCAweENFLCAweDAwLCAweEQxLCAweEZELCAweDFELCAweDA1LCAweDkxLCAweEYzLCAweEZFLAotCTB4M0QsIDB4RDcsIDB4MUYsIDB4ODcsIDB4RjMsIDB4QzMsIDB4MDYsIDB4NDIsIDB4RkMsIDB4RTUsIDB4MDEsCi0JMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQiwgMHhGRiwgMHhBRiwKLQkweDAwLCAweDAxLCAweEZGLCAweDBBLCAweDAxLCAweDlFLCAweEZGLCAweDdDLCAweEZELCAweDAzLCAweDQ4LAotCTB4RUQsIDB4MEEsIDB4RDUsIDB4RjksIDB4MEEsIDB4MDQsIDB4NzQsIDB4RkQsIDB4NkEsIDB4MDEsIDB4NjIsCi0JMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwKLQkweDkwLCAweDAxLCAweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLCAweEUxLAotCTB4NDYsIDB4RTEsIDB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsIDB4MDAsCi0JMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKLQkweDAxLCAweDMzLCAweEZDLCAweDA0LCAweDA3LCAweEIxLCAweEYyLCAweDIxLCAweDI0LCAweEU2LCAweDNBLAotCTB4OTcsIDB4RjIsIDB4RDAsIDB4MDUsIDB4NUIsIDB4RkQsIDB4MTUsIDB4MDEsIDB4QTksIDB4RkYsIDB4MEYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5MCwgMHhGRiwgMHg0NSwgMHgwMSwKLQkweDBCLCAweEZELCAweDQ0LCAweDA2LCAweDBBLCAweEYyLCAweDNCLCAweDM4LCAweDgwLCAweDI3LCAweDJCLAotCTB4RjIsIDB4MjIsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDRCwgMHhGRiwgMHg1OSwgMHgwMCwgMHhCMywgMHhGRiwgMHhDNCwKLQkweEZGLCAweEUyLCAweDAxLCAweDA5LCAweEY5LCAweEFBLCAweDQ1LCAweEZFLCAweDExLCAweDU0LCAweEY3LAotCTB4MzgsIDB4MDUsIDB4RTQsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHhCQywgMHhGRCwKLQkweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LCAweEMzLCAweEZGLCAweDg5LAotCTB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QiwgMHhGQywgMHg3QiwKLQkweDA2LCAweDUwLCAweEY0LCAweDZFLCAweDFDLCAweDM2LCAweDQwLCAweDkyLCAweEY0LCAweDc1LCAweDA0LAotCTB4M0IsIDB4RkUsIDB4OTEsIDB4MDAsIDB4RUIsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5RCwgMHgwMSwgMHg4NCwgMHhGQywgMHhGMywgMHgwNiwKLQkweDdELCAweEYxLCAweDlFLCAweDMxLCAweEU2LCAweDJFLCAweDg1LCAweEYxLCAweDE2LCAweDA3LCAweDYxLAotCTB4RkMsIDB4QjUsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsCi0JMHhFQywgMHhGRiwgMHgwOCwgMHgwMCwgMHg1NywgMHgwMCwgMHg5RiwgMHhGRSwgMHhEMSwgMHgwMywgMHg5QiwKLQkweEY1LCAweEY3LCAweDQxLCAweDdDLCAweDE5LCAweDEzLCAweEY1LCAweDJGLCAweDA2LCAweDc4LCAweEZDLAotCTB4RDUsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEYsCi0JMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwgMHgwMiwgMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwKLQkweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLCAweEY4LCAweDAyLCAweEZFLCAweEZELCAweDJCLAotCTB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHg0MiwgMHhGRiwgMHhCRCwgMHgwMSwgMHhCNiwgMHhGQywgMHg5RiwgMHgwNSwgMHg2QywgMHhGNiwgMHhENiwKLQkweDE0LCAweDY1LCAweDQ0LCAweDk4LCAweEY3LCAweEFDLCAweDAyLCAweDRFLCAweEZGLCAweEY0LCAweEZGLAotCTB4MzksIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsCi0JMHhGRiwgMHhEMiwgMHgwMSwgMHgzRCwgMHhGQywgMHgyQiwgMHgwNywgMHhENCwgMHhGMSwgMHg2NCwgMHgyQSwKLQkweEM2LCAweDM1LCAweEI3LCAweEYxLCAweDk2LCAweDA2LCAweENGLCAweEZDLCAweDZCLCAweDAxLCAweDdELAotCTB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzEsIDB4RkYsCi0JMHhFNSwgMHgwMCwgMHhBQSwgMHhGRCwgMHg1OCwgMHgwNSwgMHgzQSwgMHhGMywgMHgxMSwgMHgzRCwgMHgyQywKLQkweDIxLCAweDNGLCAweEYzLCAweERBLCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsCi0JMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywgMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywKLQkweDYzLCAweEY5LCAweDQyLCAweDA0LCAweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODUsIDB4MDEsCi0JMHgzOSwgMHhGRCwgMHg4NCwgMHgwNCwgMHhEOSwgMHhGOCwgMHg5NSwgMHgwRCwgMHg0OCwgMHg0NywgMHhBNywKLQkweEZCLCAweDg2LCAweDAwLCAweDhBLCAweDAwLCAweDQ2LCAweEZGLCAweDhFLCAweDAwLCAweEI4LCAweEZGLAotCTB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsCi0JMHhGQywgMHhGMywgMHgwNiwgMHhFRSwgMHhGMiwgMHhDRCwgMHgyMiwgMHhFNCwgMHgzQiwgMHhEQywgMHhGMiwKLQkweDlDLCAweDA1LCAweDdFLCAweEZELCAweDAwLCAweDAxLCAweEI0LCAweEZGLCAweDBCLCAweDAwLCAweDAxLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NTcsIDB4MDEsIDB4RUYsIDB4RkMsCi0JMHg2QiwgMHgwNiwgMHhFMCwgMHhGMSwgMHgyMywgMHgzNywgMHhDRSwgMHgyOCwgMHgwMSwgMHhGMiwgMHgyOCwKLQkweDA3LCAweDM2LCAweEZDLCAweEQ5LCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAotCTB4MEIsIDB4MDAsIDB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsCi0JMHgwMiwgMHg1RSwgMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwKLQkweENGLCAweEZDLCAweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjMsIDB4MDAsIDB4NzQsIDB4RkYsIDB4M0MsIDB4MDEsIDB4REEsIDB4RkQsIDB4NDAsIDB4MDMsCi0JMHg2RSwgMHhGQiwgMHhFMSwgMHgwNiwgMHhDMywgMHg0OCwgMHhCMywgMHgwMCwgMHgxQSwgMHhGRSwgMHhEQywKLQkweDAxLCAweDkxLCAweEZFLCAweEU1LCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsIDB4NjcsIDB4RkMsIDB4NUEsIDB4MDYsIDB4QTYsCi0JMHhGNCwgMHgxQiwgMHgxQiwgMHgwNywgMHg0MSwgMHgwNCwgMHhGNSwgMHgyRCwgMHgwNCwgMHg2NywgMHhGRSwKLQkweDc3LCAweDAwLCAweEY4LCAweEZGLCAweEYyLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLAotCTB4MDAsIDB4NUMsIDB4RkYsIDB4QTgsIDB4MDEsIDB4NzMsIDB4RkMsIDB4MDUsIDB4MDcsIDB4N0QsIDB4RjEsCi0JMHg2NywgMHgzMCwgMHgyMSwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwOCwgMHgwNywgMHg2RiwgMHhGQywgMHhBQiwKLQkweDAxLCAweDVCLCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYwLCAweEZGLAotCTB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsIDB4RjUsIDB4MzIsCi0JMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywgMHhEQSwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU4LAotCTB4MDAsIDB4OEEsIDB4RkUsIDB4RTksIDB4MDEsIDB4MDEsIDB4RkUsIDB4RUEsIDB4MDAsIDB4Q0IsIDB4NDgsCi0JMHhBMiwgMHgwNiwgMHg4NywgMHhGQiwgMHgzMywgMHgwMywgMHhFMCwgMHhGRCwgMHgzOSwgMHgwMSwgMHg3NSwKLQkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLAotCTB4QjUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4NzIsIDB4MDUsIDB4RDMsIDB4RjYsIDB4OEQsIDB4MTMsIDB4RkQsCi0JMHg0NCwgMHgzOSwgMHhGOCwgMHg1MywgMHgwMiwgMHg4MiwgMHhGRiwgMHhENywgMHhGRiwgMHg0NywgMHgwMCwKLQkweEQzLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ4LAotCTB4MDEsIDB4MzcsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjgsIDB4RjEsIDB4MTksIDB4MjksIDB4RTUsIDB4MzYsCi0JMHhEOCwgMHhGMSwgMHg3MywgMHgwNiwgMHhFOSwgMHhGQywgMHg1QiwgMHgwMSwgMHg4NSwgMHhGRiwgMHgxQywKLQkweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEI2LCAweEZGLCAweEZCLCAweDAwLAotCTB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsIDB4MUMsIDB4M0MsIDB4ODEsIDB4MjIsIDB4RkMsCi0JMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI3LCAweEZGLCAweDkxLCAweDAwLCAweDQwLCAweEZGLCAweDk2LAotCTB4MDAsIDB4NkYsIDB4MDAsIDB4RDUsIDB4RkIsIDB4NUUsIDB4NDcsIDB4NTAsIDB4MEQsIDB4RjIsIDB4RjgsCi0JMHg3OCwgMHgwNCwgMHgzRiwgMHhGRCwgMHg4MiwgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc5LCAweDAxLCAweDUzLCAweEZELAotCTB4NEUsIDB4MDQsIDB4NEEsIDB4RjksIDB4NjAsIDB4MEMsIDB4QTMsIDB4NDcsIDB4NzYsIDB4RkMsIDB4MUYsCi0JMHgwMCwgMHhDMywgMHgwMCwgMHgyNywgMHhGRiwgMHg5RCwgMHgwMCwgMHhCMiwgMHhGRiwgMHgxMywgMHgwMCwKLQkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDNBLCAweEZDLCAweERGLAotCTB4MDYsIDB4MzAsIDB4RjMsIDB4NzgsIDB4MjEsIDB4REIsIDB4M0MsIDB4MjgsIDB4RjMsIDB4NjUsIDB4MDUsCi0JMHhBMiwgMHhGRCwgMHhFQSwgMHgwMCwgMHhCRSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDFFLCAweDAwLCAweDdGLCAweEZGLCAweDY3LCAweDAxLCAweEQ1LCAweEZDLCAweDhFLCAweDA2LAotCTB4QkUsIDB4RjEsIDB4MDYsIDB4MzYsIDB4MUEsIDB4MkEsIDB4REMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsCi0JMHhGQywgMHhEMywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwKLQkweEQ4LCAweEZGLCAweDNDLCAweDAwLCAweEVFLCAweEZGLCAweDVBLCAweEZGLCAweDk4LCAweDAyLCAweEJCLAotCTB4RjcsIDB4ODcsIDB4NDQsIDB4OEMsIDB4MTQsIDB4ODMsIDB4RjYsIDB4OTUsIDB4MDUsIDB4QkEsIDB4RkMsCi0JMHhCQiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwKLQkweDAwLCAweDc5LCAweEZGLCAweDJFLCAweDAxLCAweEY3LCAweEZELCAweDA1LCAweDAzLCAweEUxLCAweEZCLAotCTB4Q0EsIDB4MDUsIDB4REYsIDB4NDgsIDB4QUIsIDB4MDEsIDB4QUEsIDB4RkQsIDB4MTgsIDB4MDIsIDB4NzIsCi0JMHhGRSwgMHhGNCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDM5LCAweEZGLCAweEQ2LCAweDAxLCAweDc1LCAweEZDLCAweDM3LCAweDA2LCAweEZGLCAweEY0LCAweEM3LAotCTB4MTksIDB4Q0MsIDB4NDEsIDB4N0YsIDB4RjUsIDB4RTIsIDB4MDMsIDB4OTUsIDB4RkUsIDB4NUQsIDB4MDAsCi0JMHgwNSwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywKLQkweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLCAweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLAotCTB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsIDB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRSwgMHhGRiwKLQkweDhCLCAweDAwLCAweDQ0LCAweEZFLCAweDY1LCAweDA0LCAweEFBLCAweEY0LCAweDY2LCAweDQwLCAweDIzLAotCTB4MUMsIDB4NjMsIDB4RjQsIDB4NzQsIDB4MDYsIDB4NUQsIDB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHhEOSwgMHgwMCwgMHhBQSwKLQkweEZFLCAweEFFLCAweDAxLCAweDcwLCAweEZFLCAweEY4LCAweEZGLCAweEE2LCAweDQ4LCAweEJFLCAweDA3LAotCTB4MTQsIDB4RkIsIDB4NkQsIDB4MDMsIDB4QzMsIDB4RkQsIDB4NDYsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBQywgMHgwMSwKLQkweERGLCAweEZDLCAweDQzLCAweDA1LCAweDNDLCAweEY3LCAweDQ2LCAweDEyLCAweDhELCAweDQ1LCAweEUyLAotCTB4RjgsIDB4RjcsIDB4MDEsIDB4QjgsIDB4RkYsIDB4QjksIDB4RkYsIDB4NTYsIDB4MDAsIDB4Q0UsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhERCwgMHgwMSwgMHgzNCwKLQkweEZDLCAweDIzLCAweDA3LCAweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLCAweDM3LCAweDAwLCAweEYyLAotCTB4NEQsIDB4MDYsIDB4MDQsIDB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQiwgMHhGRiwgMHgxMCwgMHgwMSwgMHg2MiwgMHhGRCwKLQkweEM1LCAweDA1LCAweEE1LCAweEYyLCAweDFGLCAweDNCLCAweEQ2LCAweDIzLCAweEJFLCAweEYyLCAweDAxLAotCTB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHhCRCwgMHhGRiwgMHg4MiwgMHgwMCwgMHg1RSwgMHhGRiwgMHg1RCwgMHgwMCwgMHhENCwKLQkweDAwLCAweDBDLCAweEZCLCAweEY5LCAweDQ2LCAweDg3LCAweDBFLCAweDgyLCAweEY4LCAweEFELCAweDA0LAotCTB4MjYsIDB4RkQsIDB4OEQsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RCwgMHgwMSwgMHg2RSwgMHhGRCwgMHgxNywgMHgwNCwKLQkweEJDLCAweEY5LCAweDMwLCAweDBCLCAweEY0LCAweDQ3LCAweDRCLCAweEZELCAweEI1LCAweEZGLCAweEZELAotCTB4MDAsIDB4MDgsIDB4RkYsIDB4QUMsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwKLQkweEYzLCAweDIyLCAweDIwLCAweENBLCAweDNELCAweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELAotCTB4RDQsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsCi0JMHgwMCwgMHg3NywgMHhGRiwgMHg3NywgMHgwMSwgMHhCRCwgMHhGQywgMHhBRSwgMHgwNiwgMHhBMywgMHhGMSwKLQkweEUzLCAweDM0LCAweDY0LCAweDJCLCAweEJDLCAweEYxLCAweDJBLCAweDA3LCAweDQzLCAweEZDLCAweENELAotCTB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyNywgMHhGRiwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGNywgMHhFNywKLQkweDQzLCAweEQ4LCAweDE1LCAweDFFLCAweEY2LCAweEMwLCAweDA1LCAweEE3LCAweEZDLCAweEMzLCAweDAxLAotCTB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsCi0JMHhGRiwgMHgyMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHhDQSwgMHgwMiwgMHg1NCwgMHhGQywgMHhCOSwgMHgwNCwKLQkweEYyLCAweDQ4LCAweEE5LCAweDAyLCAweDM5LCAweEZELCAweDUzLCAweDAyLCAweDUzLCAweEZFLCAweDAzLAotCTB4MDEsIDB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsCi0JMHhEMSwgMHgwMSwgMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwgMHg4OSwKLQkweDQyLCAweDAyLCAweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLCAweDAwLAotCTB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkQsCi0JMHgwMSwgMHg1NywgMHhGQywgMHgxRSwgMHgwNywgMHg5MCwgMHhGMSwgMHhFRCwgMHgyRCwgMHg4QywgMHgzMiwKLQkweDgzLCAweEYxLCAweEUyLCAweDA2LCAweDkyLCAweEZDLCAweDkzLCAweDAxLCAweDY4LCAweEZGLCAweDI2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTIsIDB4RkYsIDB4QTQsIDB4MDAsCi0JMHgxOSwgMHhGRSwgMHhBQSwgMHgwNCwgMHgzRSwgMHhGNCwgMHg5MCwgMHgzRiwgMHg3OCwgMHgxRCwgMHgxMCwKLQkweEY0LCAweDkzLCAweDA2LCAweDUyLCAweEZDLCAweEUxLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4QzksIDB4RkUsIDB4NzMsCi0JMHgwMSwgMHhERSwgMHhGRSwgMHgwQywgMHhGRiwgMHg3NiwgMHg0OCwgMHhERSwgMHgwOCwgMHhBMSwgMHhGQSwKLQkweEE2LCAweDAzLCAweEE2LCAweEZELCAweDUzLCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsIDB4MDEsIDB4RjYsIDB4RkMsCi0JMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwgMHg5MywgMHhGOSwgMHg5OCwKLQkweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LCAweEZGLCAweDBFLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUIsCi0JMHgwNywgMHg1MCwgMHhGMiwgMHg3QiwgMHgyNiwgMHgxMSwgMHgzOSwgMHgyRiwgMHhGMiwgMHgyMywgMHgwNiwKLQkweDIyLCAweEZELCAweDM3LCAweDAxLCAweDk3LCAweEZGLCAweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MTIsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MjQsIDB4MDEsIDB4NDEsIDB4RkQsIDB4RjYsIDB4MDUsCi0JMHg2NywgMHhGMiwgMHgxQSwgMHgzQSwgMHgyOSwgMHgyNSwgMHg4NCwgMHhGMiwgMHgwRiwgMHgwNywgMHgzMSwKLQkweEZDLCAweEUzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLAotCTB4QzIsIDB4RkYsIDB4NzMsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MzgsIDB4MDEsIDB4NEMsCi0JMHhGQSwgMHg4OSwgMHg0NiwgMHhDMywgMHgwRiwgMHgxNCwgMHhGOCwgMHhFMCwgMHgwNCwgMHgwRCwgMHhGRCwKLQkweDk4LCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LAotCTB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsIDB4RkQsIDB4REYsIDB4MDMsIDB4MkUsIDB4RkEsCi0JMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwgMHg0QiwgMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwKLQkweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDksIDB4RkMsIDB4QUYsIDB4MDYsIDB4QzEsIDB4RjMsIDB4Q0QsCi0JMHgxRSwgMHhCMSwgMHgzRSwgMHhEOSwgMHhGMywgMHhFQywgMHgwNCwgMHhGMCwgMHhGRCwgMHhCQywgMHgwMCwKLQkweEQ1LCAweEZGLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZGLAotCTB4RkYsIDB4ODUsIDB4MDEsIDB4QTYsIDB4RkMsIDB4Q0EsIDB4MDYsIDB4OEYsIDB4RjEsIDB4QkIsIDB4MzMsCi0JMHhBQiwgMHgyQywgMHhBMywgMHhGMSwgMHgyNiwgMHgwNywgMHg0QywgMHhGQywgMHhDNSwgMHgwMSwgMHg0RCwKLQkweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUyLCAweEZGLCAweDIwLCAweDAwLAotCTB4MjYsIDB4MDAsIDB4RjUsIDB4RkUsIDB4NDMsIDB4MDMsIDB4OEQsIDB4RjYsIDB4M0MsIDB4NDMsIDB4MjUsCi0JMHgxNywgMHhCQiwgMHhGNSwgMHhFQSwgMHgwNSwgMHg5NSwgMHhGQywgMHhDQSwgMHgwMSwgMHgzRCwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLAotCTB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsCi0JMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwKLQkweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAotCTB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsIDB4NEMsIDB4RjMsIDB4RUQsIDB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsCi0JMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwgMHhGRCwgMHhFMSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLAotCTB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsIDB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsCi0JMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLAotCTB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsCi0JMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRELCAweEZGLCAweEM1LCAweDAxLCAweDRDLCAweEZDLCAweDI2LAotCTB4MDcsIDB4QTMsIDB4RjEsIDB4QUIsIDB4MkMsIDB4QkIsIDB4MzMsIDB4OEYsIDB4RjEsIDB4Q0EsIDB4MDYsCi0JMHhBNiwgMHhGQywgMHg4NSwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwKLQkweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLCAweEU5LCAweEZFLCAweDM4LCAweDAxLCAweDRCLCAweEZGLAotCTB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsIDB4MEEsIDB4MkUsIDB4RkEsIDB4REYsIDB4MDMsIDB4OEEsCi0JMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDBGLCAweDA3LCAweDg0LAotCTB4RjIsIDB4MjksIDB4MjUsIDB4MUEsIDB4M0EsIDB4NjcsIDB4RjIsIDB4RjYsIDB4MDUsIDB4NDEsIDB4RkQsCi0JMHgyNCwgMHgwMSwgMHhBMSwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDOCwKLQkweEZGLCAweDY0LCAweDAwLCAweDlCLCAweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLCAweEY5LAotCTB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsIDB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsIDB4QTIsCi0JMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKLQkweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUyLCAweEZDLCAweDkzLCAweDA2LCAweDEwLCAweEY0LCAweDc4LAotCTB4MUQsIDB4OTAsIDB4M0YsIDB4M0UsIDB4RjQsIDB4QUEsIDB4MDQsIDB4MTksIDB4RkUsIDB4QTQsIDB4MDAsCi0JMHhFMiwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwKLQkweDAwLCAweDQyLCAweDAwLCAweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLAotCTB4NzYsIDB4MTgsIDB4NUMsIDB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwKLQkweEMzLCAweDAxLCAweEE3LCAweEZDLCAweEMwLCAweDA1LCAweDFFLCAweEY2LCAweEQ4LCAweDE1LCAweEU3LAotCTB4NDMsIDB4MjAsIDB4RjcsIDB4RUYsIDB4MDIsIDB4MjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkUsIDB4MDAsCi0JMHhERCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwKLQkweDAwLCAweEM4LCAweEZELCAweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLAotCTB4NzYsIDB4RjMsIDB4QzgsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwgMHg4RCwgMHgwMSwKLQkweDI2LCAweEZELCAweEFELCAweDA0LCAweDgyLCAweEY4LCAweDg3LCAweDBFLCAweEY5LCAweDQ2LCAweDBDLAotCTB4RkIsIDB4RDQsIDB4MDAsIDB4NUQsIDB4MDAsIDB4NUUsIDB4RkYsIDB4ODIsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwKLQkweEZELCAweDRELCAweDA2LCAweDAwLCAweEYyLCAweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLAotCTB4MjMsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwgMHhGRiwgMHg0NiwgMHgwMSwgMHhDMywgMHhGRCwKLQkweDZELCAweDAzLCAweDE0LCAweEZCLCAweEJFLCAweDA3LCAweEE2LCAweDQ4LCAweEY4LCAweEZGLCAweDcwLAotCTB4RkUsIDB4QUUsIDB4MDEsIDB4QUEsIDB4RkUsIDB4RDksIDB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwgMHgwMSwgMHg4MCwgMHhGQywgMHhGNywKLQkweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLCAweDgzLCAweEYxLCAweDEzLCAweDA3LAotCTB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHg5MCwgMHhGRiwgMHhGNCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgxOCwgMHgwMiwgMHhBQSwgMHhGRCwKLQkweEFCLCAweDAxLCAweERGLCAweDQ4LCAweENBLCAweDA1LCAweEUxLCAweEZCLCAweDA1LCAweDAzLCAweEY3LAotCTB4RkQsIDB4MkUsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwgMHgwNywgMHhEQywKLQkweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LCAweEQ1LCAweEZDLAotCTB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QjIsCi0JMHhGRiwgMHg5RCwgMHgwMCwgMHgyNywgMHhGRiwgMHhDMywgMHgwMCwgMHgxRiwgMHgwMCwgMHg3NiwgMHhGQywKLQkweEEzLCAweDQ3LCAweDYwLCAweDBDLCAweDRBLCAweEY5LCAweDRFLCAweDA0LCAweDUzLCAweEZELCAweDc5LAotCTB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywgMHhGMiwgMHg4MSwKLQkweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELCAweEZCLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsCi0JMHgwMCwgMHhENywgMHhGRiwgMHg4MiwgMHhGRiwgMHg1MywgMHgwMiwgMHgzOSwgMHhGOCwgMHhGRCwgMHg0NCwKLQkweDhELCAweDEzLCAweEQzLCAweEY2LCAweDcyLCAweDA1LCAweENBLCAweEZDLCAweEI1LCAweDAxLCAweDQ1LAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsCi0JMHhEQSwgMHgwMSwgMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwgMHhDRSwgMHgxQSwgMHgzMiwKLQkweDQxLCAweDFGLCAweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLCAweDAwLCAweEZCLCAweEZGLAotCTB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsCi0JMHgwMCwgMHg2NywgMHhGRSwgMHgyRCwgMHgwNCwgMHgwNCwgMHhGNSwgMHgwNywgMHg0MSwgMHgxQiwgMHgxQiwKLQkweEE2LCAweEY0LCAweDVBLCAweDA2LCAweDY3LCAweEZDLCAweERCLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsCi0JMHhDRiwgMHhGQywgMHg2NywgMHgwNSwgMHhFQSwgMHhGNiwgMHg0NCwgMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwKLQkweEY4LCAweDNGLCAweDAyLCAweDhFLCAweEZGLCAweEQwLCAweEZGLCAweDRBLCAweDAwLCAweEQyLCAweEZGLAotCTB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjQsIDB4RkYsIDB4MDAsIDB4MDEsIDB4N0UsCi0JMHhGRCwgMHg5QywgMHgwNSwgMHhEQywgMHhGMiwgMHhFNCwgMHgzQiwgMHhDRCwgMHgyMiwgMHhFRSwgMHhGMiwKLQkweEYzLCAweDA2LCAweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsCi0JMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywgMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywKLQkweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLCAweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLAotCTB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NkIsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4OTYsCi0JMHgwNiwgMHhCNywgMHhGMSwgMHhDNiwgMHgzNSwgMHg2NCwgMHgyQSwgMHhENCwgMHhGMSwgMHgyQiwgMHgwNywKLQkweDNELCAweEZDLCAweEQyLCAweDAxLCAweDQ1LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RkUsIDB4RkQsIDB4RjgsIDB4MDIsCi0JMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwgMHg0OCwgMHhFMywgMHgwMSwgMHg5MSwgMHhGRCwgMHgyNSwKLQkweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLCAweDhGLCAweEZGLCAweDFDLCAweDAwLCAweEZELCAweEZGLAotCTB4MkQsIDB4MDAsIDB4NTUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NjEsIDB4RkMsIDB4MTYsIDB4MDcsIDB4ODUsCi0JMHhGMSwgMHhFNiwgMHgyRSwgMHg5RSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGMywgMHgwNiwgMHg4NCwgMHhGQywKLQkweDlELCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweDAwLCAweDlDLAotCTB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsIDB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsIDB4RkYsCi0JMHg5QywgMHg0OCwgMHhGRCwgMHgwNywgMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwgMHg0OSwKLQkweDAxLCAweDZFLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjIsIDB4MDcsIDB4MkIsIDB4RjIsIDB4ODAsCi0JMHgyNywgMHgzQiwgMHgzOCwgMHgwQSwgMHhGMiwgMHg0NCwgMHgwNiwgMHgwQiwgMHhGRCwgMHg0NSwgMHgwMSwKLQkweDkwLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLAotCTB4MDAsIDB4NjUsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsCi0JMHhDRCwgMHgwRSwgMHg2QSwgMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywKLQkweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAotCTB4RTUsIDB4MDEsIDB4NDIsIDB4RkMsIDB4QzMsIDB4MDYsIDB4ODcsIDB4RjMsIDB4RDcsIDB4MUYsIDB4RkUsCi0JMHgzRCwgMHg5MSwgMHhGMywgMHgxRCwgMHgwNSwgMHhEMSwgMHhGRCwgMHhDRSwgMHgwMCwgMHhDQywgMHhGRiwKLQkweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLAotCTB4MDAsIDB4MUIsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsCi0JMHgwNywgMHhGNiwgMHhDQSwgMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENGLCAweDAxLAotCTB4ODgsIDB4RkMsIDB4MDksIDB4MDYsIDB4NzEsIDB4RjUsIDB4MkIsIDB4MTgsIDB4QjIsIDB4NDIsIDB4MjAsCi0JMHhGNiwgMHg4MywgMHgwMywgMHhDRiwgMHhGRSwgMHgzQywgMHgwMCwgMHgxNSwgMHgwMCwgMHhFNiwgMHhGRiwKLQkweDA3LCAweDAwLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLAotCTB4RkUsIDB4QjksIDB4MDQsIDB4MjcsIDB4RjQsIDB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsCi0JMHg5OSwgMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKLQkweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRELCAweEZGLCAweEEwLCAweDAxLCAweEZCLCAweEZDLAotCTB4MDcsIDB4MDUsIDB4QkYsIDB4RjcsIDB4QkIsIDB4MTAsIDB4MkIsIDB4NDYsIDB4QkIsIDB4RjksIDB4ODMsCi0JMHgwMSwgMHhGQSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg2OCwgMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwKLQkweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LCAweDAxLCAweDNBLCAweEZELCAweDAwLAotCTB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsIDB4NzksIDB4RjIsIDB4MTIsIDB4MDcsCi0JMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDVFLCAweDAxLCAweDkwLCAweEZELCAweEQyLCAweDAzLAotCTB4NDcsIDB4RkEsIDB4QzMsIDB4MDksIDB4NDgsIDB4NDgsIDB4NUEsIDB4RkUsIDB4MzMsIDB4RkYsIDB4NDUsCi0JMHgwMSwgMHhFMiwgMHhGRSwgMHhCRSwgMHgwMCwgMHhBNSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLCAweDA2LCAweDhDLAotCTB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEUsIDB4RkMsCi0JMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NiwKLQkweEZGLCAweDBFLCAweDAxLCAweDNCLCAweEZFLCAweDgyLCAweDAyLCAweEUwLCAweEZDLCAweDczLCAweDAzLAotCTB4RjYsIDB4NDgsIDB4RTksIDB4MDMsIDB4QUQsIDB4RkMsIDB4OUMsIDB4MDIsIDB4MkQsIDB4RkUsIDB4MTQsCi0JMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwKLQkweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LCAweEYxLCAweDYyLAotCTB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsIDB4ODIsIDB4MDEsCi0JMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCOCwKLQkweDAwLCAweEYwLCAweEZFLCAweDJCLCAweDAxLCAweDYzLCAweEZGLCAweEY2LCAweEZELCAweDJDLCAweDQ4LAotCTB4NDcsIDB4MEEsIDB4MTQsIDB4RkEsIDB4RUIsIDB4MDMsIDB4ODQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4NjQsCi0JMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwgMHhGRiwKLQkweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLCAweERELCAweDI0LCAweDU0LAotCTB4M0EsIDB4NzQsIDB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsIDB4MDEsIDB4QTMsIDB4RkYsCi0JMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MSwgMHgwMCwgMHhBMiwKLQkweEZGLCAweEUyLCAweEZGLCAweEFFLCAweDAxLCAweDZCLCAweEY5LCAweEYyLCAweDQ1LCAweDRBLCAweDExLAotCTB4OEYsIDB4RjcsIDB4MUQsIDB4MDUsIDB4RjEsIDB4RkMsIDB4QTQsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwKLQkweDU1LCAweEZDLCAweDhDLCAweDA2LCAweDIyLCAweEY0LCAweDJDLCAweDFELCAweEMwLCAweDNGLCAweDU1LAotCTB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsIDB4RkUsIDB4OUYsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjksIDB4RkYsCi0JMHgwNCwgMHgwMCwgMHgwNywgMHgwMCwgMHhFOSwgMHhGRiwgMHgwRiwgMHgwMCwgMHg0OCwgMHgwMCwgMHhCOSwKLQkweEZFLCAweEE2LCAweDAzLCAweEU0LCAweEY1LCAweDYwLCAweDQyLCAweEMxLCAweDE4LCAweDQ3LCAweEY1LAotCTB4MUEsIDB4MDYsIDB4ODEsIDB4RkMsIDB4RDIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywKLQkweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LCAweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLAotCTB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsIDB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhDNywgMHhGRiwgMHhEOSwgMHgwMCwgMHhCRiwgMHhGRCwgMHgzOCwKLQkweDA1LCAweDY5LCAweEYzLCAweDk2LCAweDNELCAweDZGLCAweDIwLCAweDY2LCAweEYzLCAweENFLCAweDA2LAotCTB4M0YsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwgMHg4QiwgMHgwMSwgMHgyQiwgMHhGRCwgMHhBMSwgMHgwNCwKLQkweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLCAweDQ3LCAweDM4LCAweEZCLCAweEJFLCAweDAwLCAweDZBLAotCTB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0RCwgMHgwMSwgMHhGRSwgMHhGQywgMHg1NiwgMHgwNiwgMHhGNywKLQkweEYxLCAweEJGLCAweDM3LCAweDE1LCAweDI4LCAweDE4LCAweEYyLCAweDI1LCAweDA3LCAweDM0LCAweEZDLAotCTB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsCi0JMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywgMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwgMHhGQiwKLQkweDdFLCAweDA3LCAweEFGLCAweDQ4LCAweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLCAweEEzLAotCTB4RkUsIDB4REQsIDB4MDAsIDB4OTksIDB4RkYsIDB4MTksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCi0JMHg2MCwgMHhGRiwgMHhBMiwgMHgwMSwgMHg3QywgMHhGQywgMHhGQiwgMHgwNiwgMHg3QywgMHhGMSwgMHgxNSwKLQkweDMxLCAweDczLCAweDJGLCAweDgxLCAweEYxLCAweDEwLCAweDA3LCAweDY3LCAweEZDLCAweEIxLCAweDAxLAotCTB4NTgsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsCi0JMHgwMCwgMHg3OSwgMHhGRSwgMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwKLQkweDA3LCAweDA2LCAweEM3LCAweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LAotCTB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsCi0JMHhENSwgMHgwMSwgMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFMywgMHhGMSwgMHhEMSwgMHgyOSwgMHg0NiwKLQkweDM2LCAweEM1LCAweEYxLCAweDg3LCAweDA2LCAweERBLCAweEZDLCAweDY0LCAweDAxLCAweDgwLCAweEZGLAotCTB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsCi0JMHhGRiwgMHhCNiwgMHgwMCwgMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywKLQkweDMxLCAweEY5LCAweDVBLCAweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsCi0JMHgzNywgMHhGQywgMHhFQiwgMHgwNiwgMHgwQiwgMHhGMywgMHgzNSwgMHgyMiwgMHg1MiwgMHgzQywgMHhGRCwKLQkweEYyLCAweDg0LCAweDA1LCAweDhELCAweEZELCAweEY2LCAweDAwLCAweEI4LCAweEZGLCAweDA5LCAweDAwLAotCTB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsCi0JMHhGRiwgMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwgMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwKLQkweDdDLCAweDA1LCAweEM1LCAweEZDLCAweEI3LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLAotCTB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDksIDB4MDEsIDB4NkQsIDB4RkMsCi0JMHg0QiwgMHgwNiwgMHhDRCwgMHhGNCwgMHg4MywgMHgxQSwgMHg1RiwgMHg0MSwgMHgzQSwgMHhGNSwgMHgwQywKLQkweDA0LCAweDdCLCAweEZFLCAweDZDLCAweDAwLCAweEZFLCAweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLAotCTB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsCi0JMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwgMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwKLQkweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjEsIDB4MDEsIDB4RDMsIDB4RkMsIDB4NUQsIDB4MDUsCi0JMHgwMSwgMHhGNywgMHhGQiwgMHgxMiwgMHgzRiwgMHg0NSwgMHg4MywgMHhGOCwgMHgyQSwgMHgwMiwgMHg5QSwKLQkweEZGLCAweENBLCAweEZGLCAweDRFLCAweDAwLCAweEQxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsIDB4MDUsIDB4Q0MsCi0JMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwgMHgzNSwgMHhGQywKLQkweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI5LAotCTB4MDAsIDB4NUUsIDB4RkYsIDB4NzQsIDB4MDEsIDB4NUYsIDB4RkQsIDB4MzUsIDB4MDQsIDB4N0MsIDB4RjksCi0JMHhEOCwgMHgwQiwgMHhDOSwgMHg0NywgMHhENCwgMHhGQywgMHhGMCwgMHhGRiwgMHhERCwgMHgwMCwgMHgxOSwKLQkweEZGLCAweEE0LCAweDAwLCAweEFGLCAweEZGLCAweDEzLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLAotCTB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsIDB4RjEsIDB4ODYsCi0JMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywgMHhEMSwgMHgwMSwKLQkweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLAotCTB4RkYsIDB4MjcsIDB4MDEsIDB4MDUsIDB4RkUsIDB4RUIsIDB4MDIsIDB4MTQsIDB4RkMsIDB4NTAsIDB4MDUsCi0JMHhFQSwgMHg0OCwgMHgxQiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgzMiwgMHgwMiwgMHg2NCwgMHhGRSwgMHhGQSwKLQkweDAwLCAweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU0LCAweEZGLAotCTB4QjcsIDB4MDEsIDB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsIDB4OUYsIDB4MkUsIDB4RTMsCi0JMHgzMSwgMHg3RSwgMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwgMHgwMSwgMHg2NCwgMHhGRiwKLQkweDI4LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweDAwLCAweDlELCAweEZGLCAweEQzLCAweDAwLCAweEI4LAotCTB4RkUsIDB4OTMsIDB4MDEsIDB4QTEsIDB4RkUsIDB4OEUsIDB4RkYsIDB4OTIsIDB4NDgsIDB4M0QsIDB4MDgsCi0JMHhFMSwgMHhGQSwgMHg4NiwgMHgwMywgMHhCNiwgMHhGRCwgMHg0QywgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERGLCAweDAxLAotCTB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsIDB4MzUsIDB4RjIsIDB4MzYsIDB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsCi0JMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwgMHhGRCwgMHg0MSwgMHgwMSwgMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwKLQkweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJGLCAweEZGLCAweDdCLCAweDAwLCAweDZDLCAweEZGLCAweDQ0LAotCTB4MDAsIDB4MDEsIDB4MDEsIDB4QjYsIDB4RkEsIDB4QzgsIDB4NDYsIDB4MTMsIDB4MEYsIDB4NTEsIDB4RjgsCi0JMHhDNCwgMHgwNCwgMHgxQiwgMHhGRCwgMHg5MiwgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLAotCTB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsIDB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsCi0JMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkweDA5LCAweDAwLCAweERGLCAweEZGLCAweDI4LCAweDAwLCAweDE3LCAweDAwLCAweDEwLCAweEZGLCAweDE1LAotCTB4MDMsIDB4REQsIDB4RjYsIDB4OUUsIDB4NDMsIDB4NkMsIDB4MTYsIDB4RjEsIDB4RjUsIDB4RDMsIDB4MDUsCi0JMHg5RiwgMHhGQywgMHhDNiwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKLQkweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENFLCAweDAxLCAweDhDLCAweEZDLCAweDAwLCAweDA2LAotCTB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsIDB4NDIsIDB4M0YsIDB4RjYsIDB4NzEsIDB4MDMsIDB4RDksCi0JMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwKLQkweEZDLCAweEZGLCAweERDLCAweEZGLCAweEFGLCAweDAwLCAweDA3LCAweEZFLCAweEM4LCAweDA0LCAweDEwLAotCTB4RjQsIDB4MkQsIDB4M0YsIDB4MEYsIDB4MUUsIDB4RUQsIDB4RjMsIDB4QTAsIDB4MDYsIDB4NEUsIDB4RkMsCi0JMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwKLQkweDAwLCAweDRFLCAweEZGLCAweDlFLCAweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LCAweEY3LAotCTB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsIDB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsIDB4OEUsCi0JMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMCwKLQkweDlELCAweEZGLCAweDJELCAweDAxLCAweDMzLCAweEZELCAweDBCLCAweDA2LCAweDRELCAweEYyLCAweEE1LAotCTB4MzksIDB4QkYsIDB4MjUsIDB4NkQsIDB4RjIsIDB4MTUsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCi0JMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwKLQkweEZGLCAweDVCLCAweDAxLCAweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LAotCTB4NTcsIDB4NDgsIDB4OEQsIDB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsCi0JMHgwMCwgMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwKLQkweDhCLCAweDAxLCAweDlELCAweEZDLCAweEQ1LCAweDA2LCAweDg5LCAweEYxLCAweDM1LCAweDMzLCAweDNBLAotCTB4MkQsIDB4OUEsIDB4RjEsIDB4MjMsIDB4MDcsIDB4NTEsIDB4RkMsIDB4QzIsIDB4MDEsIDB4NEYsIDB4RkYsCi0JMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwKLQkweEZFLCAweDc0LCAweDAyLCAweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LAotCTB4OTQsIDB4RkMsIDB4QTksIDB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOSwgMHgwMSwKLQkweDQ4LCAweEZDLCAweDI4LCAweDA3LCAweEFELCAweEYxLCAweDE5LCAweDJDLCAweDNGLCAweDM0LCAweDk3LAotCTB4RjEsIDB4QkUsIDB4MDYsIDB4QjAsIDB4RkMsIDB4N0YsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwKLQkweDAxLCAweDdBLCAweEZGLCAweEM1LCAweEZELCAweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LAotCTB4RjgsIDB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywKLQkweDA5LCAweDA3LCAweDlELCAweEYyLCAweDkyLCAweDI0LCAweDhGLCAweDNBLCAweDgyLCAweEYyLCAweEUxLAotCTB4MDUsIDB4NTAsIDB4RkQsIDB4MUIsIDB4MDEsIDB4QTYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhENiwgMHhGRiwgMHhDMywKLQkweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLCAweDc3LCAweEY3LCAweDI4LCAweDA1LAotCTB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1NywgMHhGQywgMHg4NSwgMHgwNiwKLQkweDM0LCAweEY0LCAweEUwLCAweDFDLCAweEYwLCAweDNGLCAweDZELCAweEY0LCAweDhDLCAweDA0LCAweDJDLAotCTB4RkUsIDB4OTksIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsCi0JMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwgMHgwMywgMHhDNywKLQkweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LCAweDdELCAweEZDLAotCTB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHg0MSwgMHhGRiwgMHhDMCwgMHgwMSwgMHhBRiwgMHhGQywgMHhBRCwgMHgwNSwgMHg0QSwgMHhGNiwKLQkweDQ0LCAweDE1LCAweDJGLCAweDQ0LCAweDY0LCAweEY3LCAweEM5LCAweDAyLCAweDNELCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsCi0JMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwgMHhGMywgMHg2MSwKLQkweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLCAweEU2LCAweDAxLAotCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsCi0JMHhGRiwgMHg4OCwgMHgwMSwgMHgzMSwgMHhGRCwgMHg5NSwgMHgwNCwgMHhCNCwgMHhGOCwgMHhGQywgMHgwRCwKLQkweDI2LCAweDQ3LCAweDY0LCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDAwLCAweDUxLCAweEZGLCAweDg5LAotCTB4MDAsIDB4QkEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEEsIDB4RkYsCi0JMHg1MSwgMHgwMSwgMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwgMHg4MiwgMHgzNywgMHg2MCwKLQkweDI4LCAweDBFLCAweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4NDAsCi0JMHgwMSwgMHhEMCwgMHhGRCwgMHg1MywgMHgwMywgMHg0NywgMHhGQiwgMHgzRiwgMHgwNywgMHhCOCwgMHg0OCwKLQkweDYyLCAweDAwLCAweDNGLCAweEZFLCAweEM4LCAweDAxLCAweDlDLCAweEZFLCAweEUwLCAweDAwLCAweDk4LAotCTB4RkYsIDB4MTksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsCi0JMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwgMHg3RCwgMHhGMSwgMHhDRiwgMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwKLQkweEYxLCAweDBELCAweDA3LCAweDZBLCAweEZDLCAweEFFLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTMsIDB4RkYsIDB4RUQsIDB4MDAsIDB4ODAsIDB4RkUsIDB4RkQsCi0JMHgwMSwgMHhEQywgMHhGRCwgMHgzQywgMHgwMSwgMHhENSwgMHg0OCwgMHg0NSwgMHgwNiwgMHhBRSwgMHhGQiwKLQkweDFGLCAweDAzLCAweEVBLCAweEZELCAweDM0LCAweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsIDB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsCi0JMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwgMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwKLQkweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLAotCTB4MTIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzUsIDB4RkYsIDB4QTksIDB4MDAsIDB4NEQsCi0JMHgwMCwgMHgxOSwgMHhGQywgMHg3QywgMHg0NywgMHhFOCwgMHgwQywgMHgxOCwgMHhGOSwgMHg2NiwgMHgwNCwKLQkweDQ4LCAweEZELCAweDdFLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDYsCi0JMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwgMHgzQywgMHgwRSwgMHhGMywgMHg3OCwgMHgwNSwgMHg5NiwKLQkweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLAotCTB4RDYsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RTQsIDB4RkYsIDB4NkIsIDB4RkYsIDB4N0IsIDB4MDIsIDB4RjAsCi0JMHhGNywgMHhCQSwgMHg0NCwgMHgxRSwgMHgxNCwgMHhBNSwgMHhGNiwgMHg4NiwgMHgwNSwgMHhDMSwgMHhGQywKLQkweEI5LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LAotCTB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsIDB4RjQsCi0JMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwgMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwgMHg2NiwKLQkweDAwLCAweDAxLCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweDAwLCAweDA1LCAweDAwLCAweEY0LCAweEZGLAotCTB4RjIsIDB4RkYsIDB4ODMsIDB4MDAsIDB4NTMsIDB4RkUsIDB4NEUsIDB4MDQsIDB4RDAsIDB4RjQsIDB4QUIsCi0JMHg0MCwgMHhCMiwgMHgxQiwgMHg3RiwgMHhGNCwgMHg2OSwgMHgwNiwgMHg2MiwgMHhGQywgMHhERCwgMHgwMSwKLQkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LAotCTB4RkYsIDB4QUYsIDB4MDEsIDB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsCi0JMHg1QywgMHg0NSwgMHhBOSwgMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwKLQkweDAwLCAweEQwLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEFGLCAweEZGLAotCTB4MDksIDB4MDEsIDB4NkUsIDB4RkQsIDB4QjQsIDB4MDUsIDB4QkMsIDB4RjIsIDB4NzMsIDB4M0IsIDB4NjQsCi0JMHgyMywgMHhEMiwgMHhGMiwgMHhGQiwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwKLQkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLAotCTB4MDEsIDB4NjUsIDB4RkQsIDB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsCi0JMHgwMywgMHhGRCwgMHhEOSwgMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwKLQkweEZGLCAweDE0LCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDc5LCAweEZGLCAweDcyLCAweDAxLAotCTB4QzQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4QUIsIDB4RjEsIDB4NDYsIDB4MzUsIDB4RjcsIDB4MkEsIDB4QzYsCi0JMHhGMSwgMHgyQSwgMHgwNywgMHg0MCwgMHhGQywgMHhDRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMSwgMHgwMCwKLQkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLAotCTB4RkUsIDB4REUsIDB4MDIsIDB4MkUsIDB4RkMsIDB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsCi0JMHg1RSwgMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwgMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywKLQkweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweEJBLCAweDAxLCAweDVCLCAweEZDLAotCTB4MUIsIDB4MDcsIDB4OEIsIDB4RjEsIDB4NTgsIDB4MkUsIDB4MjYsIDB4MzIsIDB4ODAsIDB4RjEsIDB4RUEsCi0JMHgwNiwgMHg4QywgMHhGQywgMHg5NywgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLCAweEZFLCAweDg2LCAweDAxLCAweEJBLAotCTB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsIDB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsCi0JMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM1LCAweDAwLCAweDNELCAweEZGLCAweERGLCAweDAxLCAweDMyLCAweEZDLCAweDFFLCAweDA3LAotCTB4NDAsIDB4RjIsIDB4RUIsIDB4MjYsIDB4QjUsIDB4MzgsIDB4MUYsIDB4RjIsIDB4MzIsIDB4MDYsIDB4MTgsCi0JMHhGRCwgMHgzRCwgMHgwMSwgMHg5NCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwKLQkweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LCAweDAxLCAweDhCLAotCTB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsIDB4MTUsIDB4RkQsCi0JMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ2LCAweEZDLCAweEI4LCAweDA2LCAweEE4LCAweEYzLAotCTB4M0YsIDB4MUYsIDB4NjQsIDB4M0UsIDB4QkEsIDB4RjMsIDB4MDEsIDB4MDUsIDB4RTIsIDB4RkQsIDB4QzQsCi0JMHgwMCwgMHhEMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELCAweEY2LCAweDc3LAotCTB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsIDB4QzgsIDB4MDEsCi0JMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwKLQkweEZGLCAweENDLCAweDAxLCAweDhGLCAweEZDLCAweEY4LCAweDA1LCAweDlCLCAweEY1LCAweDk2LCAweDE3LAotCTB4MDIsIDB4NDMsIDB4NUUsIDB4RjYsIDB4NUYsIDB4MDMsIDB4RTQsIDB4RkUsIDB4MzAsIDB4MDAsIDB4MUIsCi0JMHgwMCwgMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhEOSwgMHhGRiwKLQkweEI0LCAweDAwLCAweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLCAweEZDLCAweDNFLCAweDVCLAotCTB4MUUsIDB4REIsIDB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5QywKLQkweDAxLCAweDA1LCAweEZELCAweEYxLCAweDA0LCAweEYwLCAweEY3LCAweDJELCAweDEwLCAweDYxLCAweDQ2LAotCTB4MEQsIDB4RkEsIDB4NTgsIDB4MDEsIDB4MTMsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QzQsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwKLQkweDJDLCAweEZELCAweDE1LCAweDA2LCAweDQxLCAweEYyLCAweDZBLCAweDM5LCAweDBBLCAweDI2LCAweDYxLAotCTB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg5RCwKLQkweEZELCAweEI5LCAweDAzLCAweDdCLCAweEZBLCAweDQwLCAweDA5LCAweDYzLCAweDQ4LCAweEJGLCAweEZFLAotCTB4MDMsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RDQsIDB4RkUsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwgMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywKLQkweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLCAweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLAotCTB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHgwNywgMHgwMSwgMHg0OSwgMHhGRSwgMHg2NywgMHgwMiwgMHgxMywKLQkweEZELCAweEZGLCAweDAyLCAweEY0LCAweDQ4LCAweDVGLCAweDA0LCAweDdBLCAweEZDLCAweEI2LCAweDAyLAotCTB4MjAsIDB4RkUsIDB4MUIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhDQSwgMHgwMSwgMHg0NiwgMHhGQywgMHgyOSwgMHgwNywKLQkweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLCAweDM0LCAweDlDLCAweEYxLCAweEI4LCAweDA2LCAweEI1LAotCTB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsCi0JMHhBQSwgMHhGRiwgMHhCMSwgMHgwMCwgMHhGRSwgMHhGRSwgMHgxMCwgMHgwMSwgMHg5MiwgMHhGRiwgMHg5NCwKLQkweEZELCAweDBELCAweDQ4LCAweENCLCAweDBBLCAweEUyLCAweEY5LCAweDA0LCAweDA0LCAweDc3LCAweEZELAotCTB4NjksIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwgMHhGMiwKLQkweDQ2LCAweDI0LCAweEM4LCAweDNBLCAweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELCAweDE3LAotCTB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4Q0MsIDB4RkYsCi0JMHg1QSwgMHgwMCwgMHhBRiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgxQywgMHhGOSwgMHhCOCwKLQkweDQ1LCAweERBLCAweDExLCAweDYwLCAweEY3LCAweDMzLCAweDA1LCAweEU3LCAweEZDLCAweEE5LCAweDAxLAotCTB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsCi0JMHhGRiwgMHhERiwgMHgwMSwgMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywKLQkweDFGLCAweDQwLCAweDg1LCAweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDksIDB4MDAsCi0JMHg1NCwgMHgwMCwgMHhBNCwgMHhGRSwgMHhDOSwgMHgwMywgMHhBQSwgMHhGNSwgMHgwQywgMHg0MiwgMHg1NiwKLQkweDE5LCAweDFFLCAweEY1LCAweDJCLCAweDA2LCAweDdBLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLCAweEZGLAotCTB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsCi0JMHgwMSwgMHhCNCwgMHhGQywgMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwKLQkweDg2LCAweEY3LCAweEI2LCAweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LAotCTB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4RTMsIDB4MDAsCi0JMHhBRSwgMHhGRCwgMHg1MiwgMHgwNSwgMHg0NCwgMHhGMywgMHgyQSwgMHgzRCwgMHgwNiwgMHgyMSwgMHg0NywKLQkweEYzLCAweEQ4LCAweDA2LCAweDNDLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsCi0JMHhGRCwgMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwgMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwKLQkweDkxLCAweDAwLCAweDgzLCAweDAwLCAweDRBLCAweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODgsIDB4RkYsIDB4NTUsIDB4MDEsIDB4RjIsIDB4RkMsCi0JMHg2NywgMHgwNiwgMHhFNCwgMHhGMSwgMHg0NCwgMHgzNywgMHhBQSwgMHgyOCwgMHgwNSwgMHhGMiwgMHgyNywKLQkweDA3LCAweDM2LCAweEZDLCAweERBLCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsIDB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsCi0JMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwgMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwKLQkweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweEZELAotCTB4RkYsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4QTcsIDB4MDEsIDB4NzUsIDB4RkMsIDB4MDMsIDB4MDcsCi0JMHg3RCwgMHhGMSwgMHg4QSwgMHgzMCwgMHhGRiwgMHgyRiwgMHg3RSwgMHhGMSwgMHgwQSwgMHgwNywgMHg2RSwKLQkweEZDLCAweEFDLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDFBLCAweDAwLAotCTB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsIDB4RkQsIDB4MDUsCi0JMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywgMHhFNCwgMHhGRCwKLQkweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMzLAotCTB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzgsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjMsIDB4RjEsCi0JMHgzRSwgMHgyOSwgMHhDNiwgMHgzNiwgMHhENCwgMHhGMSwgMHg3NywgMHgwNiwgMHhFNiwgMHhGQywgMHg1QywKLQkweDAxLCAweDg0LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDEyLCAweDAwLCAweEI2LCAweEZGLAotCTB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsIDB4RkIsIDB4NjksCi0JMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwgMHg4MSwgMHgwMSwKLQkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LAotCTB4RkYsIDB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4RTIsIDB4MDYsIDB4MjgsIDB4RjMsIDB4OUUsIDB4MjEsCi0JMHhDMCwgMHgzQywgMHgxRiwgMHhGMywgMHg2QywgMHgwNSwgMHg5RSwgMHhGRCwgMHhFRCwgMHgwMCwgMHhCRCwKLQkweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEQ3LCAweEZGLCAweDNFLCAweDAwLAotCTB4RUEsIDB4RkYsIDB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsIDB4OTksIDB4NDQsIDB4NjgsCi0JMHgxNCwgMHg4RSwgMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywgMHhGRiwKLQkweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LAotCTB4MDEsIDB4NzMsIDB4RkMsIDB4M0IsIDB4MDYsIDB4RjUsIDB4RjQsIDB4RUQsIDB4MTksIDB4QjcsIDB4NDEsCi0JMHg3MSwgMHhGNSwgMHhFQiwgMHgwMywgMHg5MCwgMHhGRSwgMHg2MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFRCwKLQkweEZGLCAweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDg4LCAweDAwLAotCTB4NDksIDB4RkUsIDB4NUQsIDB4MDQsIDB4QjcsIDB4RjQsIDB4N0QsIDB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsCi0JMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwgMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFELCAweDAxLCAweERELAotCTB4RkMsIDB4NDgsIDB4MDUsIDB4MzAsIDB4RjcsIDB4NkIsIDB4MTIsIDB4N0QsIDB4NDUsIDB4Q0YsIDB4RjgsCi0JMHgwMSwgMHgwMiwgMHhCMiwgMHhGRiwgMHhCRCwgMHhGRiwgMHg1NCwgMHgwMCwgMHhDRSwgMHhGRiwgMHgwQywKLQkweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLCAweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELAotCTB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsIDB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsCi0JMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZFLCAweDAxLCAweDZCLCAweEZELCAweDFELAotCTB4MDQsIDB4QUYsIDB4RjksIDB4NTEsIDB4MEIsIDB4RUMsIDB4NDcsIDB4MzMsIDB4RkQsIDB4QzEsIDB4RkYsCi0JMHhGNywgMHgwMCwgMHgwQywgMHhGRiwgMHhBQSwgMHgwMCwgMHhBRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLCAweDc1LCAweDAxLCAweEJGLCAweEZDLCAweEFCLCAweDA2LAotCTB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsIDB4MkIsIDB4QkYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDIsCi0JMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIxLCAweDAxLCAweDEyLCAweEZFLCAweEQxLCAweDAyLCAweDQ3LAotCTB4RkMsIDB4RDcsIDB4MDQsIDB4RjAsIDB4NDgsIDB4OEQsIDB4MDIsIDB4NDUsIDB4RkQsIDB4NEQsIDB4MDIsCi0JMHg1NiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwKLQkweDAwLCAweDUyLCAweEZGLCAweEJDLCAweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLCAweEYxLAotCTB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsIDB4OTQsCi0JMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwKLQkweENDLCAweDAwLCAweEM2LCAweEZFLCAweDc5LCAweDAxLCAweEQyLCAweEZFLCAweDI2LCAweEZGLCAweDdDLAotCTB4NDgsIDB4QkUsIDB4MDgsIDB4QUUsIDB4RkEsIDB4QTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NTIsIDB4MDEsCi0JMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywKLQkweEZGLCAweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LAotCTB4RjIsIDB4MzgsIDB4MkEsIDB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsCi0JMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMiwgMHhGRiwgMHg3NSwgMHgwMCwKLQkweDdBLCAweEZGLCAweDJCLCAweDAwLCAweDJELCAweDAxLCAweDYxLCAweEZBLCAweDk3LCAweDQ2LCAweEEwLAotCTB4MEYsIDB4MjAsIDB4RjgsIDB4REEsIDB4MDQsIDB4MTAsIDB4RkQsIDB4OTcsIDB4MDEsIDB4NTAsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKLQkweDAxLCAweDQ4LCAweEZDLCAweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLAotCTB4Q0YsIDB4RjMsIDB4RjMsIDB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgyMywgMHgwMCwKLQkweEZBLCAweEZFLCAweDNBLCAweDAzLCAweDlELCAweEY2LCAweDUwLCAweDQzLCAweDAwLCAweDE3LCAweEM2LAotCTB4RjUsIDB4RTYsIDB4MDUsIDB4OTcsIDB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywKLQkweEZDLCAweEVGLCAweDA1LCAweEIwLCAweEY1LCAweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LAotCTB4NEQsIDB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsCi0JMHgwMCwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENywgMHhGRiwgMHhCQSwgMHgwMCwgMHhGNCwgMHhGRCwKLQkweEU1LCAweDA0LCAweEU0LCAweEYzLCAweENBLCAweDNFLCAweEE3LCAweDFFLCAweENBLCAweEYzLCAweEFDLAotCTB4MDYsIDB4NEEsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwgMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwKLQkweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LCAweDM3LCAweEZBLCAweDQyLCAweDAxLAotCTB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgxNSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgzNSwgMHgwMSwgMHgyNSwgMHhGRCwgMHgxRSwgMHgwNiwKLQkweDM1LCAweEYyLCAweDJFLCAweDM5LCAweDU1LCAweDI2LCAweDU2LCAweEYyLCAweDFBLCAweDA3LCAweDMxLAotCTB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwgMHgwMywgMHg5NCwKLQkweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLCAweDZDLCAweDAxLAotCTB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsCi0JMHgwMCwgMHg2OSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5NCwgMHhGQywgMHhFMCwgMHgwNiwgMHg4NCwgMHhGMSwKLQkweEFGLCAweDMyLCAweENBLCAweDJELCAweDkyLCAweEYxLCAweDFGLCAweDA3LCAweDU2LCAweEZDLCAweEJFLAotCTB4MDEsIDB4NTEsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsCi0JMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwgMHgwMiwgMHhGMiwKLQkweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLCAweDFFLCAweDAxLAotCTB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDksCi0JMHhGRiwgMHhDQywgMHgwMSwgMHg0NCwgMHhGQywgMHgyOSwgMHgwNywgMHhCOSwgMHhGMSwgMHg4OSwgMHgyQiwKLQkweEMzLCAweDM0LCAweEEwLCAweEYxLCAweEIxLCAweDA2LCAweEJBLCAweEZDLCAweDc5LCAweDAxLCAweDc2LAotCTB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUUsIDB4MDAsCi0JMHgwNSwgMHhGRiwgMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwgMHhGRCwgMHg0NywgMHgwRSwKLQkweDBCLCAweEM4LCAweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLCAweDAxLCAweDYxLCAweEZGLAotCTB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCi0JMHgwMSwgMHgzMywgMHhGQywgMHgwMywgMHgwNywgMHhCNywgMHhGMiwgMHhGQywgMHgyMywgMHgwMywgMHgzQiwKLQkweDlFLCAweEYyLCAweENCLCAweDA1LCAweDVGLCAweEZELCAweDEyLCAweDAxLCAweEFBLCAweEZGLCAweDBFLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsCi0JMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwgMHhGNSwgMHhGOCwgMHg5QiwgMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwKLQkweEY3LCAweDNELCAweDA1LCAweEUyLCAweEZDLCAweEFCLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUMsCi0JMHhGQywgMHg3OCwgMHgwNiwgMHg1QSwgMHhGNCwgMHg0OSwgMHgxQywgMHg0RSwgMHg0MCwgMHg5RSwgMHhGNCwKLQkweDZELCAweDA0LCAweDNGLCAweEZFLCAweDhFLCAweDAwLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweDA0LAotCTB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsCi0JMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwgMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywKLQkweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAotCTB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4QjgsIDB4RkMsIDB4OUEsCi0JMHgwNSwgMHg3NywgMHhGNiwgMHhCMSwgMHgxNCwgMHg3NywgMHg0NCwgMHhBOSwgMHhGNywgMHhBMiwgMHgwMiwKLQkweDU0LCAweEZGLCAweEYxLCAweEZGLCAweDNBLCAweDAwLCAweEQ4LCAweEZGLCAweDBBLCAweDAwLCAweDAxLAotCTB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4RTgsIDB4MDAsIDB4QTYsIDB4RkQsIDB4NUYsIDB4MDUsCi0JMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwgMHgyMSwgMHgzNywgMHhGMywgMHhERCwgMHgwNiwgMHgzQiwKLQkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MkIsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODMsIDB4MDEsIDB4M0MsIDB4RkQsIDB4N0UsIDB4MDQsIDB4RTYsCi0JMHhGOCwgMHg3MiwgMHgwRCwgMHg1MiwgMHg0NywgMHhCRSwgMHhGQiwgMHg3QSwgMHgwMCwgMHg5MCwgMHgwMCwKLQkweDQzLCAweEZGLCAweDhGLCAweDAwLCAweEI3LCAweEZGLCAweDExLCAweDAwLCAweEZFLCAweEZGLCAweDFDLAotCTB4MDAsIDB4ODYsIDB4RkYsIDB4NTksIDB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsIDB4RjEsCi0JMHgwNCwgMHgzNywgMHhGMywgMHgyOCwgMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwKLQkweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAotCTB4NzQsIDB4RkYsIDB4M0EsIDB4MDEsIDB4REQsIDB4RkQsIDB4MzksIDB4MDMsIDB4N0IsIDB4RkIsIDB4QzEsCi0JMHgwNiwgMHhDNywgMHg0OCwgMHhDRiwgMHgwMCwgMHgwRCwgMHhGRSwgMHhFMywgMHgwMSwgMHg4RSwgMHhGRSwKLQkweEU3LCAweDAwLCAweDk1LCAweEZGLCAweDFBLCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLAotCTB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsCi0JMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywKLQkweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU3LCAweDAwLAotCTB4OEUsIDB4RkUsIDB4RTMsIDB4MDEsIDB4MEQsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4QzcsIDB4NDgsIDB4QzEsCi0JMHgwNiwgMHg3QiwgMHhGQiwgMHgzOSwgMHgwMywgMHhERCwgMHhGRCwgMHgzQSwgMHgwMSwgMHg3NCwgMHhGRiwKLQkweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LAotCTB4MDEsIDB4MzcsIDB4RkMsIDB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsCi0JMHhEQywgMHhGMSwgMHg2RiwgMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywKLQkweDAwLCAweEZFLCAweEZGLCAweDExLCAweDAwLCAweEI3LCAweEZGLCAweDhGLCAweDAwLCAweDQzLCAweEZGLAotCTB4OTAsIDB4MDAsIDB4N0EsIDB4MDAsIDB4QkUsIDB4RkIsIDB4NTIsIDB4NDcsIDB4NzIsIDB4MEQsIDB4RTYsCi0JMHhGOCwgMHg3RSwgMHgwNCwgMHgzQywgMHhGRCwgMHg4MywgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwKLQkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLAotCTB4RkMsIDB4REQsIDB4MDYsIDB4MzcsIDB4RjMsIDB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsCi0JMHg1RiwgMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwKLQkweDAwLCAweDBBLCAweDAwLCAweEQ4LCAweEZGLCAweDNBLCAweDAwLCAweEYxLCAweEZGLCAweDU0LCAweEZGLAotCTB4QTIsIDB4MDIsIDB4QTksIDB4RjcsIDB4NzcsIDB4NDQsIDB4QjEsIDB4MTQsIDB4NzcsIDB4RjYsIDB4OUEsCi0JMHgwNSwgMHhCOCwgMHhGQywgMHhCQywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LCAweDAxLCAweDc3LCAweEZDLCAweDMzLAotCTB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsIDB4OEQsIDB4RjUsIDB4REEsIDB4MDMsCi0JMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwKLQkweDAwLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDhFLCAweDAwLCAweDNGLCAweEZFLCAweDZELCAweDA0LAotCTB4OUUsIDB4RjQsIDB4NEUsIDB4NDAsIDB4NDksIDB4MUMsIDB4NUEsIDB4RjQsIDB4NzgsIDB4MDYsIDB4NUMsCi0JMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwKLQkweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELCAweDA1LCAweDQ4LAotCTB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsIDB4QkUsIDB4RkYsCi0JMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwKLQkweDAwLCAweEFBLCAweEZGLCAweDEyLCAweDAxLCAweDVGLCAweEZELCAweENCLCAweDA1LCAweDlFLCAweEYyLAotCTB4MDMsIDB4M0IsIDB4RkMsIDB4MjMsIDB4QjcsIDB4RjIsIDB4MDMsIDB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsCi0JMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKLQkweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LCAweEY5LCAweDBFLAotCTB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4MDUsIDB4RkYsCi0JMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NiwKLQkweEZGLCAweDc5LCAweDAxLCAweEJBLCAweEZDLCAweEIxLCAweDA2LCAweEEwLCAweEYxLCAweEMzLCAweDM0LAotCTB4ODksIDB4MkIsIDB4QjksIDB4RjEsIDB4MjksIDB4MDcsIDB4NDQsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4NDksCi0JMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwgMHhGRiwKLQkweDFFLCAweDAxLCAweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLCAweDlCLCAweDA0LCAweEYyLAotCTB4NDgsIDB4QzYsIDB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsIDB4RkUsIDB4MDQsIDB4MDEsCi0JMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRSwKLQkweDAxLCAweDU2LCAweEZDLCAweDFGLCAweDA3LCAweDkyLCAweEYxLCAweENBLCAweDJELCAweEFGLCAweDMyLAotCTB4ODQsIDB4RjEsIDB4RTAsIDB4MDYsIDB4OTQsIDB4RkMsIDB4OTEsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMSwgMHhGRiwgMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwKLQkweDZDLCAweDAxLCAweEVBLCAweEZFLCAweEYzLCAweEZFLCAweDcwLCAweDQ4LCAweEZGLCAweDA4LCAweDk0LAotCTB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4NTUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMSwKLQkweEZDLCAweDFBLCAweDA3LCAweDU2LCAweEYyLCAweDU1LCAweDI2LCAweDJFLCAweDM5LCAweDM1LCAweEYyLAotCTB4MUUsIDB4MDYsIDB4MjUsIDB4RkQsIDB4MzUsIDB4MDEsIDB4OTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwKLQkweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LCAweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LAotCTB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0QSwgMHhGQywgMHhBQywKLQkweDA2LCAweENBLCAweEYzLCAweEE3LCAweDFFLCAweENBLCAweDNFLCAweEU0LCAweEYzLCAweEU1LCAweDA0LAotCTB4RjQsIDB4RkQsIDB4QkEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsCi0JMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwgMHgyQSwgMHgwMCwgMHhFRiwgMHhGRSwgMHg0RCwgMHgwMywKLQkweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLCAweDE3LCAweEIwLCAweEY1LCAweEVGLCAweDA1LCAweDkzLAotCTB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5NywgMHhGQywgMHhFNiwgMHgwNSwgMHhDNiwKLQkweEY1LCAweDAwLCAweDE3LCAweDUwLCAweDQzLCAweDlELCAweEY2LCAweDNBLCAweDAzLCAweEZBLCAweEZFLAotCTB4MjMsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwgMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwgMHhGMywKLQkweDk4LCAweDNFLCAweEYzLCAweDFFLCAweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLCAweEU0LAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCi0JMHg1MCwgMHhGRiwgMHg5NywgMHgwMSwgMHgxMCwgMHhGRCwgMHhEQSwgMHgwNCwgMHgyMCwgMHhGOCwgMHhBMCwKLQkweDBGLCAweDk3LCAweDQ2LCAweDYxLCAweEZBLCAweDJELCAweDAxLCAweDJCLCAweDAwLCAweDdBLCAweEZGLAotCTB4NzUsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsCi0JMHhGRiwgMHgzOSwgMHgwMSwgMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwKLQkweEEwLCAweDI2LCAweDRCLCAweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLAotCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsCi0JMHg1MiwgMHgwMSwgMHhBOSwgMHhGRCwgMHhBMCwgMHgwMywgMHhBRSwgMHhGQSwgMHhCRSwgMHgwOCwgMHg3QywKLQkweDQ4LCAweDI2LCAweEZGLCAweEQyLCAweEZFLCAweDc5LCAweDAxLCAweEM2LCAweEZFLCAweENDLCAweDAwLAotCTB4QTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsCi0JMHgwMSwgMHg5MCwgMHhGQywgMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwKLQkweDhFLCAweEYxLCAweDFELCAweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEIsIDB4RkYsIDB4MDEsIDB4MDEsIDB4NTYsIDB4RkUsCi0JMHg0RCwgMHgwMiwgMHg0NSwgMHhGRCwgMHg4RCwgMHgwMiwgMHhGMCwgMHg0OCwgMHhENywgMHgwNCwgMHg0NywKLQkweEZDLCAweEQxLCAweDAyLCAweDEyLCAweEZFLCAweDIxLCAweDAxLCAweDdFLCAweEZGLCAweDIwLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsCi0JMHhGQywgMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwgMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwKLQkweEFCLCAweDA2LCAweEJGLCAweEZDLCAweDc1LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MTQsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QUEsIDB4MDAsIDB4MEMsIDB4RkYsIDB4RjcsIDB4MDAsCi0JMHhDMSwgMHhGRiwgMHgzMywgMHhGRCwgMHhFQywgMHg0NywgMHg1MSwgMHgwQiwgMHhBRiwgMHhGOSwgMHgxRCwKLQkweDA0LCAweDZCLCAweEZELCAweDZFLCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsCi0JMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwgMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwKLQkweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDBDLAotCTB4MDAsIDB4Q0UsIDB4RkYsIDB4NTQsIDB4MDAsIDB4QkQsIDB4RkYsIDB4QjIsIDB4RkYsIDB4MDEsIDB4MDIsCi0JMHhDRiwgMHhGOCwgMHg3RCwgMHg0NSwgMHg2QiwgMHgxMiwgMHgzMCwgMHhGNywgMHg0OCwgMHgwNSwgMHhERCwKLQkweEZDLCAweEFELCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAotCTB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsIDB4MDYsIDB4NkMsCi0JMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwgMHg0OSwgMHhGRSwKLQkweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLCAweEVELAotCTB4RkYsIDB4MDQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4OTAsIDB4RkUsIDB4RUIsIDB4MDMsIDB4NzEsIDB4RjUsCi0JMHhCNywgMHg0MSwgMHhFRCwgMHgxOSwgMHhGNSwgMHhGNCwgMHgzQiwgMHgwNiwgMHg3MywgMHhGQywgMHhENywKLQkweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAotCTB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsIDB4RjYsIDB4NjgsCi0JMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwgMHhFQSwgMHhGRiwKLQkweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEJELAotCTB4RkYsIDB4RUQsIDB4MDAsIDB4OUUsIDB4RkQsIDB4NkMsIDB4MDUsIDB4MUYsIDB4RjMsIDB4QzAsIDB4M0MsCi0JMHg5RSwgMHgyMSwgMHgyOCwgMHhGMywgMHhFMiwgMHgwNiwgMHgzQSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLAotCTB4ODEsIDB4MDEsIDB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsIDB4MkQsIDB4MEQsIDB4NjksCi0JMHg0NywgMHhFQiwgMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywgMHhGRiwgMHg5MywgMHgwMCwKLQkweEI2LCAweEZGLCAweDEyLCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg0LCAweEZGLCAweDVDLAotCTB4MDEsIDB4RTYsIDB4RkMsIDB4NzcsIDB4MDYsIDB4RDQsIDB4RjEsIDB4QzYsIDB4MzYsIDB4M0UsIDB4MjksCi0JMHhGMywgMHhGMSwgMHgyOSwgMHgwNywgMHgzOCwgMHhGQywgMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywKLQkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc2LCAweEZGLCAweDM3LCAweDAxLAotCTB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsIDB4OTQsIDB4RkIsIDB4ODMsIDB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsCi0JMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwgMHgwMSwgMHg4NywgMHhGRSwgMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwKLQkweDFBLCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVBLCAweEZGLCAweEFDLCAweDAxLCAweDZFLAotCTB4RkMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4RjEsIDB4RkYsIDB4MkYsIDB4OEEsIDB4MzAsIDB4N0QsIDB4RjEsCi0JMHgwMywgMHgwNywgMHg3NSwgMHhGQywgMHhBNywgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLCAweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLAotCTB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsIDB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsCi0JMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweERBLCAweDAxLCAweDM2LCAweEZDLCAweDI3LAotCTB4MDcsIDB4MDUsIDB4RjIsIDB4QUEsIDB4MjgsIDB4NDQsIDB4MzcsIDB4RTQsIDB4RjEsIDB4NjcsIDB4MDYsCi0JMHhGMiwgMHhGQywgMHg1NSwgMHgwMSwgMHg4OCwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMSwKLQkweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLCAweDRBLCAweEZGLCAweDgzLCAweDAwLCAweDkxLCAweDAwLAotCTB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsIDB4MEQsIDB4Q0QsIDB4RjgsIDB4ODksIDB4MDQsIDB4MzYsCi0JMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNDLCAweEZDLCAweEQ4LCAweDA2LCAweDQ3LAotCTB4RjMsIDB4MDYsIDB4MjEsIDB4MkEsIDB4M0QsIDB4NDQsIDB4RjMsIDB4NTIsIDB4MDUsIDB4QUUsIDB4RkQsCi0JMHhFMywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhEOSwKLQkweEZGLCAweDM3LCAweDAwLCAweEY3LCAweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LCAweEY3LAotCTB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsIDB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsIDB4QkUsCi0JMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKLQkweDNBLCAweEZGLCAweEQ0LCAweDAxLCAweDdBLCAweEZDLCAweDJCLCAweDA2LCAweDFFLCAweEY1LCAweDU2LAotCTB4MTksIDB4MEMsIDB4NDIsIDB4QUEsIDB4RjUsIDB4QzksIDB4MDMsIDB4QTQsIDB4RkUsIDB4NTQsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwKLQkweEZGLCAweDkzLCAweDAwLCAweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLAotCTB4OTQsIDB4MUMsIDB4NDcsIDB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsCi0JMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKLQkweEE5LCAweDAxLCAweEU3LCAweEZDLCAweDMzLCAweDA1LCAweDYwLCAweEY3LCAweERBLCAweDExLCAweEI4LAotCTB4NDUsIDB4MUMsIDB4RjksIDB4RDgsIDB4MDEsIDB4Q0EsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NUEsIDB4MDAsCi0JMHhDQywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywKLQkweDAxLCAweDU3LCAweEZELCAweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LAotCTB4QUEsIDB4RjIsIDB4MDYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2OSwgMHgwMSwKLQkweDc3LCAweEZELCAweDA0LCAweDA0LCAweEUyLCAweEY5LCAweENCLCAweDBBLCAweDBELCAweDQ4LCAweDk0LAotCTB4RkQsIDB4OTIsIDB4RkYsIDB4MTAsIDB4MDEsIDB4RkUsIDB4RkUsIDB4QjEsIDB4MDAsIDB4QUEsIDB4RkYsCi0JMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwKLQkweEZDLCAweEI4LCAweDA2LCAweDlDLCAweEYxLCAweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLAotCTB4MjksIDB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxQiwgMHgwMSwgMHgyMCwgMHhGRSwKLQkweEI2LCAweDAyLCAweDdBLCAweEZDLCAweDVGLCAweDA0LCAweEY0LCAweDQ4LCAweEZGLCAweDAyLCAweDEzLAotCTB4RkQsIDB4NjcsIDB4MDIsIDB4NDksIDB4RkUsIDB4MDcsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUQsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwgMHgwMSwgMHg1MywgMHhGQywgMHgyMSwKLQkweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLCAweDg2LCAweEYxLCAweERCLCAweDA2LAotCTB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsCi0JMHgwMCwgMHhBMiwgMHhGRiwgMHhDNSwgMHgwMCwgMHhENCwgMHhGRSwgMHg1RiwgMHgwMSwgMHgwMywgMHhGRiwKLQkweEJGLCAweEZFLCAweDYzLCAweDQ4LCAweDQwLCAweDA5LCAweDdCLCAweEZBLCAweEI5LCAweDAzLCAweDlELAotCTB4RkQsIDB4NTgsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywgMHgwNywgMHg2MSwKLQkweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LCAweDJDLCAweEZELAotCTB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzQsCi0JMHhGRiwgMHg2RSwgMHgwMCwgMHg4NywgMHhGRiwgMHgxMywgMHgwMCwgMHg1OCwgMHgwMSwgMHgwRCwgMHhGQSwKLQkweDYxLCAweDQ2LCAweDJELCAweDEwLCAweEYwLCAweEY3LCAweEYxLCAweDA0LCAweDA1LCAweEZELCAweDlDLAotCTB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwgMHhGMywgMHg1QiwKLQkweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELCAweEI0LCAweDAwLAotCTB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHgzMCwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1RiwgMHgwMywgMHg1RSwgMHhGNiwgMHgwMiwgMHg0MywKLQkweDk2LCAweDE3LCAweDlCLCAweEY1LCAweEY4LCAweDA1LCAweDhGLCAweEZDLCAweENDLCAweDAxLCAweDNELAotCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsCi0JMHhDOCwgMHgwMSwgMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwgMHhCNiwgMHgxNiwgMHg3NywKLQkweDQzLCAweEJELCAweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELCAweDAwLCAweDI1LCAweDAwLAotCTB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkYsIDB4QzQsCi0JMHgwMCwgMHhFMiwgMHhGRCwgMHgwMSwgMHgwNSwgMHhCQSwgMHhGMywgMHg2NCwgMHgzRSwgMHgzRiwgMHgxRiwKLQkweEE4LCAweEYzLCAweEI4LCAweDA2LCAweDQ2LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsCi0JMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwgMHgzOSwgMHhGOCwgMHg1OSwgMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwKLQkweEZBLCAweDE3LCAweDAxLCAweDM4LCAweDAwLCAweDczLCAweEZGLCAweDc4LCAweDAwLCAweEMwLCAweEZGLAotCTB4MEYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTQsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MTgsCi0JMHhGRCwgMHgzMiwgMHgwNiwgMHgxRiwgMHhGMiwgMHhCNSwgMHgzOCwgMHhFQiwgMHgyNiwgMHg0MCwgMHhGMiwKLQkweDFFLCAweDA3LCAweDMyLCAweEZDLCAweERGLCAweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsCi0JMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwgMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwKLQkweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLCAweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTcsIDB4MDEsIDB4OEMsIDB4RkMsIDB4RUEsCi0JMHgwNiwgMHg4MCwgMHhGMSwgMHgyNiwgMHgzMiwgMHg1OCwgMHgyRSwgMHg4QiwgMHhGMSwgMHgxQiwgMHgwNywKLQkweDVCLCAweEZDLCAweEJBLCAweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDFDLAotCTB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0YsIDB4MDIsIDB4NUUsIDB4RkQsCi0JMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywgMHgwNSwgMHgyRSwgMHhGQywgMHhERSwgMHgwMiwgMHgwQywKLQkweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAotCTB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QzYsCi0JMHhGMSwgMHhGNywgMHgyQSwgMHg0NiwgMHgzNSwgMHhBQiwgMHhGMSwgMHhBNCwgMHgwNiwgMHhDNCwgMHhGQywKLQkweDcyLCAweDAxLCAweDc5LCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDE0LCAweDAwLCAweEFFLAotCTB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsIDB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsIDB4RkQsCi0JMHhEQywgMHg0NywgMHg5NSwgMHgwQiwgMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwgMHg3MSwKLQkweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsIDB4RkIsIDB4MDYsIDB4RDIsIDB4RjIsIDB4NjQsCi0JMHgyMywgMHg3MywgMHgzQiwgMHhCQywgMHhGMiwgMHhCNCwgMHgwNSwgMHg2RSwgMHhGRCwgMHgwOSwgMHgwMSwKLQkweEFGLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLAotCTB4MDAsIDB4QzMsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsCi0JMHhCMiwgMHgxMiwgMHgxOSwgMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywKLQkweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLAotCTB4REQsIDB4MDEsIDB4NjIsIDB4RkMsIDB4NjksIDB4MDYsIDB4N0YsIDB4RjQsIDB4QjIsIDB4MUIsIDB4QUIsCi0JMHg0MCwgMHhEMCwgMHhGNCwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRSwgMHg4MywgMHgwMCwgMHhGMiwgMHhGRiwKLQkweEY0LCAweEZGLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LAotCTB4MDAsIDB4ODUsIDB4RkUsIDB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsCi0JMHhFMSwgMHhGNCwgMHg0MywgMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwKLQkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEI5LCAweDAxLAotCTB4QzEsIDB4RkMsIDB4ODYsIDB4MDUsIDB4QTUsIDB4RjYsIDB4MUUsIDB4MTQsIDB4QkEsIDB4NDQsIDB4RjAsCi0JMHhGNywgMHg3QiwgMHgwMiwgMHg2QiwgMHhGRiwgMHhFNCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhENiwgMHhGRiwKLQkweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LAotCTB4RkQsIDB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsIDB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsCi0JMHhFNiwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDVBLCAweEZGLCAweDdFLCAweDAxLCAweDQ4LCAweEZELAotCTB4NjYsIDB4MDQsIDB4MTgsIDB4RjksIDB4RTgsIDB4MEMsIDB4N0MsIDB4NDcsIDB4MTksIDB4RkMsIDB4NEQsCi0JMHgwMCwgMHhBOSwgMHgwMCwgMHgzNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLCAweDAxLCAweEUwLCAweEZDLCAweDdGLAotCTB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksIDB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsCi0JMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKLQkweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDM0LCAweDAxLCAweEVBLCAweEZELCAweDFGLCAweDAzLAotCTB4QUUsIDB4RkIsIDB4NDUsIDB4MDYsIDB4RDUsIDB4NDgsIDB4M0MsIDB4MDEsIDB4REMsIDB4RkQsIDB4RkQsCi0JMHgwMSwgMHg4MCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg5MywgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELCAweDA3LCAweDgwLAotCTB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsIDB4NzgsIDB4RkMsCi0JMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OCwKLQkweEZGLCAweEUwLCAweDAwLCAweDlDLCAweEZFLCAweEM4LCAweDAxLCAweDNGLCAweEZFLCAweDYyLCAweDAwLAotCTB4QjgsIDB4NDgsIDB4M0YsIDB4MDcsIDB4NDcsIDB4RkIsIDB4NTMsIDB4MDMsIDB4RDAsIDB4RkQsIDB4NDAsCi0JMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLCAweEYyLCAweDYwLAotCTB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsIDB4NTEsIDB4MDEsCi0JMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQSwgMHhGRiwgMHg4OSwKLQkweDAwLCAweDUxLCAweEZGLCAweDc3LCAweDAwLCAweEE3LCAweDAwLCAweDY0LCAweEZCLCAweDI2LCAweDQ3LAotCTB4RkMsIDB4MEQsIDB4QjQsIDB4RjgsIDB4OTUsIDB4MDQsIDB4MzEsIDB4RkQsIDB4ODgsIDB4MDEsIDB4NTYsCi0JMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKLQkweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLCAweEJBLCAweDIwLCAweDYxLAotCTB4M0QsIDB4NTYsIDB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsIDB4MDAsIDB4QzUsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKLQkweEZGLCAweDNELCAweEZGLCAweEM5LCAweDAyLCAweDY0LCAweEY3LCAweDJGLCAweDQ0LCAweDQ0LCAweDE1LAotCTB4NEEsIDB4RjYsIDB4QUQsIDB4MDUsIDB4QUYsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwKLQkweDdELCAweEZDLCAweDIzLCAweDA2LCAweDMyLCAweEY1LCAweDBDLCAweDE5LCAweDM4LCAweDQyLCAweEM3LAotCTB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsIDB4RkUsIDB4NEUsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsCi0JMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhFNywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyQywKLQkweEZFLCAweDhDLCAweDA0LCAweDZELCAweEY0LCAweEYwLCAweDNGLCAweEUwLCAweDFDLCAweDM0LCAweEY0LAotCTB4ODUsIDB4MDYsIDB4NTcsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywKLQkweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLCAweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLAotCTB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxQiwgMHgwMSwgMHg1MCwgMHhGRCwgMHhFMSwKLQkweDA1LCAweDgyLCAweEYyLCAweDhGLCAweDNBLCAweDkyLCAweDI0LCAweDlELCAweEYyLCAweDA5LCAweDA3LAotCTB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg2NiwgMHgwMSwgMHg3RCwgMHhGRCwgMHhGOCwgMHgwMywKLQkweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELCAweDQ4LCAweEM1LCAweEZELCAweDdBLCAweEZGLCAweDFELAotCTB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsIDB4QTksIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg3RiwgMHgwMSwgMHhCMCwgMHhGQywgMHhCRSwgMHgwNiwgMHg5NywKLQkweEYxLCAweDNGLCAweDM0LCAweDE5LCAweDJDLCAweEFELCAweEYxLCAweDI4LCAweDA3LCAweDQ4LCAweEZDLAotCTB4QzksIDB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsCi0JMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwgMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwgMHhGQywKLQkweDI0LCAweDA0LCAweEY1LCAweDQ4LCAweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLCAweDQyLAotCTB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHg0RiwgMHhGRiwgMHhDMiwgMHgwMSwgMHg1MSwgMHhGQywgMHgyMywgMHgwNywgMHg5QSwgMHhGMSwgMHgzQSwKLQkweDJELCAweDM1LCAweDMzLCAweDg5LCAweEYxLCAweEQ1LCAweDA2LCAweDlELCAweEZDLCAweDhCLCAweDAxLAotCTB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsCi0JMHgwMCwgMHhEQiwgMHhGRSwgMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwKLQkweDgxLCAweDA5LCAweDYxLCAweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LAotCTB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsCi0JMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNSwgMHgwNywgMHg2RCwgMHhGMiwgMHhCRiwgMHgyNSwgMHhBNSwKLQkweDM5LCAweDRELCAweEYyLCAweDBCLCAweDA2LCAweDMzLCAweEZELCAweDJELCAweDAxLCAweDlELCAweEZGLAotCTB4MTMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwKLQkweEQ3LCAweEY3LCAweEZDLCAweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsCi0JMHg0RSwgMHhGQywgMHhBMCwgMHgwNiwgMHhFRCwgMHhGMywgMHgwRiwgMHgxRSwgMHgyRCwgMHgzRiwgMHgxMCwKLQkweEY0LCAweEM4LCAweDA0LCAweDA3LCAweEZFLCAweEFGLCAweDAwLCAweERDLCAweEZGLCAweEZDLCAweEZGLAotCTB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksCi0JMHhGRSwgMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwgMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwKLQkweDAwLCAweDA2LCAweDhDLCAweEZDLCAweENFLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzYsIDB4MDEsIDB4OUYsIDB4RkMsCi0JMHhEMywgMHgwNSwgMHhGMSwgMHhGNSwgMHg2QywgMHgxNiwgMHg5RSwgMHg0MywgMHhERCwgMHhGNiwgMHgxNSwKLQkweDAzLCAweDEwLCAweEZGLCAweDE3LCAweDAwLCAweDI4LCAweDAwLCAweERGLCAweEZGLCAweDA5LCAweDAwLAotCTB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksIDB4MDAsIDB4REEsIDB4RkQsIDB4MEYsCi0JMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwgMHg5NywgMHhGMywgMHhCRCwgMHgwNiwKLQkweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAotCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTIsIDB4MDEsIDB4MUIsIDB4RkQsIDB4QzQsIDB4MDQsCi0JMHg1MSwgMHhGOCwgMHgxMywgMHgwRiwgMHhDOCwgMHg0NiwgMHhCNiwgMHhGQSwgMHgwMSwgMHgwMSwgMHg0NCwKLQkweDAwLCAweDZDLCAweEZGLCAweDdCLCAweDAwLCAweEJGLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLAotCTB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsIDB4MDYsIDB4MTQsCi0JMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywgMHgzMywgMHhGQywKLQkweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI1LAotCTB4MDAsIDB4NkQsIDB4RkYsIDB4NEMsIDB4MDEsIDB4QjYsIDB4RkQsIDB4ODYsIDB4MDMsIDB4RTEsIDB4RkEsCi0JMHgzRCwgMHgwOCwgMHg5MiwgMHg0OCwgMHg4RSwgMHhGRiwgMHhBMSwgMHhGRSwgMHg5MywgMHgwMSwgMHhCOCwKLQkweEZFLCAweEQzLCAweDAwLCAweDlELCAweEZGLCAweDE4LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAotCTB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsIDB4RjEsIDB4RTMsCi0JMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywgMHhCNywgMHgwMSwKLQkweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDFDLCAweDAwLCAweDhELCAweEZGLCAweEZBLAotCTB4MDAsIDB4NjQsIDB4RkUsIDB4MzIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MUIsIDB4MDIsIDB4RUEsIDB4NDgsCi0JMHg1MCwgMHgwNSwgMHgxNCwgMHhGQywgMHhFQiwgMHgwMiwgMHgwNSwgMHhGRSwgMHgyNywgMHgwMSwgMHg3QywKLQkweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLAotCTB4RDEsIDB4MDEsIDB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsIDB4QUUsIDB4MkEsIDB4ODYsCi0JMHgzNSwgMHhCMSwgMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwgMHgwMSwgMHg3QiwgMHhGRiwKLQkweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE0LCAweDAwLCAweDE5LAotCTB4RkYsIDB4REQsIDB4MDAsIDB4RjAsIDB4RkYsIDB4RDQsIDB4RkMsIDB4QzksIDB4NDcsIDB4RDgsIDB4MEIsCi0JMHg3QywgMHhGOSwgMHgzNSwgMHgwNCwgMHg1RiwgMHhGRCwgMHg3NCwgMHgwMSwgMHg1RSwgMHhGRiwgMHgyOSwKLQkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLAotCTB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsIDB4RTAsIDB4RjIsIDB4MTgsIDB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsCi0JMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwgMHhGRCwgMHgwNCwgMHgwMSwgMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwKLQkweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQxLCAweEZGLCAweDRFLCAweDAwLCAweENBLCAweEZGLCAweDlBLAotCTB4RkYsIDB4MkEsIDB4MDIsIDB4ODMsIDB4RjgsIDB4M0YsIDB4NDUsIDB4RkIsIDB4MTIsIDB4MDEsIDB4RjcsCi0JMHg1RCwgMHgwNSwgMHhEMywgMHhGQywgMHhCMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwKLQkweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLAotCTB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsIDB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsCi0JMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwKLQkweDA1LCAweDAwLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweDZDLCAweDAwLCAweDdCLCAweEZFLCAweDBDLAotCTB4MDQsIDB4M0EsIDB4RjUsIDB4NUYsIDB4NDEsIDB4ODMsIDB4MUEsIDB4Q0QsIDB4RjQsIDB4NEIsIDB4MDYsCi0JMHg2RCwgMHhGQywgMHhEOSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwKLQkweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLCAweEI3LCAweDAxLCAweEM1LCAweEZDLCAweDdDLCAweDA1LAotCTB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsIDB4NDQsIDB4MTQsIDB4RjgsIDB4NjcsIDB4MDIsIDB4NzcsCi0JMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwKLQkweDA5LCAweDAwLCAweEI4LCAweEZGLCAweEY2LCAweDAwLCAweDhELCAweEZELCAweDg0LCAweDA1LCAweEZELAotCTB4RjIsIDB4NTIsIDB4M0MsIDB4MzUsIDB4MjIsIDB4MEIsIDB4RjMsIDB4RUIsIDB4MDYsIDB4MzcsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwKLQkweDAwLCAweDVCLCAweEZGLCAweDdDLCAweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLCAweEY5LAotCTB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsIDB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsIDB4MkUsCi0JMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKLQkweDgwLCAweEZGLCAweDY0LCAweDAxLCAweERBLCAweEZDLCAweDg3LCAweDA2LCAweEM1LCAweEYxLCAweDQ2LAotCTB4MzYsIDB4RDEsIDB4MjksIDB4RTMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsCi0JMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwKLQkweEZGLCAweDMxLCAweDAxLCAweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LAotCTB4REIsIDB4NDgsIDB4NzMsIDB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsCi0JMHgwMCwgMHg5MSwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1OCwgMHhGRiwKLQkweEIxLCAweDAxLCAweDY3LCAweEZDLCAweDEwLCAweDA3LCAweDgxLCAweEYxLCAweDczLCAweDJGLCAweDE1LAotCTB4MzEsIDB4N0MsIDB4RjEsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NjAsIDB4RkYsCi0JMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywKLQkweEZFLCAweEJCLCAweDAxLCAweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LAotCTB4MkUsIDB4RkIsIDB4NjAsIDB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwKLQkweDM0LCAweEZDLCAweDI1LCAweDA3LCAweDE4LCAweEYyLCAweDE1LCAweDI4LCAweEJGLCAweDM3LCAweEY3LAotCTB4RjEsIDB4NTYsIDB4MDYsIDB4RkUsIDB4RkMsIDB4NEQsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTksIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwKLQkweDAwLCAweEJFLCAweDAwLCAweDM4LCAweEZCLCAweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LAotCTB4QTEsIDB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRiwgMHhGQywKLQkweENFLCAweDA2LCAweDY2LCAweEYzLCAweDZGLCAweDIwLCAweDk2LCAweDNELCAweDY5LCAweEYzLCAweDM4LAotCTB4MDUsIDB4QkYsIDB4RkQsIDB4RDksIDB4MDAsIDB4QzcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywKLQkweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LCAweDM0LCAweEY2LCAweEI3LCAweDA1LAotCTB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMiwgMHgwMSwgMHg4MSwgMHhGQywgMHgxQSwgMHgwNiwKLQkweDQ3LCAweEY1LCAweEMxLCAweDE4LCAweDYwLCAweDQyLCAweEU0LCAweEY1LCAweEE2LCAweDAzLCAweEI5LAotCTB4RkUsIDB4NDgsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MDAsCi0JMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwgMHgwNCwgMHg1NSwKLQkweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LCAweDU1LCAweEZDLAotCTB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsCi0JMHgwMCwgMHg0QiwgMHhGRiwgMHhBNCwgMHgwMSwgMHhGMSwgMHhGQywgMHgxRCwgMHgwNSwgMHg4RiwgMHhGNywKLQkweDRBLCAweDExLCAweEYyLCAweDQ1LCAweDZCLCAweEY5LCAweEFFLCAweDAxLCAweEUyLCAweEZGLCAweEEyLAotCTB4RkYsIDB4NjEsIDB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCi0JMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwgMHhGMiwgMHg1NCwKLQkweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLAotCTB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjQsCi0JMHhGRiwgMHg2MywgMHgwMSwgMHg4NCwgMHhGRCwgMHhFQiwgMHgwMywgMHgxNCwgMHhGQSwgMHg0NywgMHgwQSwKLQkweDJDLCAweDQ4LCAweEY2LCAweEZELCAweDYzLCAweEZGLCAweDJCLCAweDAxLCAweEYwLCAweEZFLCAweEI4LAotCTB4MDAsIDB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzEsIDB4RkYsCi0JMHg4MiwgMHgwMSwgMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwgMHhGRCwgMHgzMywgMHg2MiwKLQkweDJDLCAweEE4LCAweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LCAweDAxLCAweDRDLCAweEZGLAotCTB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsIDB4RkYsIDB4MTQsCi0JMHgwMSwgMHgyRCwgMHhGRSwgMHg5QywgMHgwMiwgMHhBRCwgMHhGQywgMHhFOSwgMHgwMywgMHhGNiwgMHg0OCwKLQkweDczLCAweDAzLCAweEUwLCAweEZDLCAweDgyLCAweDAyLCAweDNCLCAweEZFLCAweDBFLCAweDAxLCAweDg2LAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsCi0JMHg0RSwgMHhGQywgMHgyNCwgMHgwNywgMHg5RSwgMHhGMSwgMHhGMiwgMHgyQywgMHg3OCwgMHgzMywgMHg4QywKLQkweEYxLCAweEQwLCAweDA2LCAweEEyLCAweEZDLCAweDg4LCAweDAxLCAweDZELCAweEZGLCAweDI0LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTUsIDB4RkYsIDB4QkUsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NDUsCi0JMHgwMSwgMHgzMywgMHhGRiwgMHg1QSwgMHhGRSwgMHg0OCwgMHg0OCwgMHhDMywgMHgwOSwgMHg0NywgMHhGQSwKLQkweEQyLCAweDAzLCAweDkwLCAweEZELCAweDVFLCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsCi0JMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwgMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwKLQkweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLCAweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjgsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RkEsIDB4RkYsIDB4ODMsCi0JMHgwMSwgMHhCQiwgMHhGOSwgMHgyQiwgMHg0NiwgMHhCQiwgMHgxMCwgMHhCRiwgMHhGNywgMHgwNywgMHgwNSwKLQkweEZCLCAweEZDLCAweEEwLCAweDAxLCAweDRELCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTAsIDB4RkMsIDB4OTksIDB4MDYsCi0JMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwgMHgzRiwgMHgyNywgMHhGNCwgMHhCOSwgMHgwNCwgMHgxMCwKLQkweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLCAweEZCLCAweEZGLCAweDAzLCAweDAwLCAweDA3LCAweDAwLAotCTB4RTYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4M0MsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4ODMsIDB4MDMsIDB4MjAsCi0JMHhGNiwgMHhCMiwgMHg0MiwgMHgyQiwgMHgxOCwgMHg3MSwgMHhGNSwgMHgwOSwgMHgwNiwgMHg4OCwgMHhGQywKLQkweENGLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLAotCTB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsIDB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsIDB4RjYsCi0JMHgyMiwgMHgxNiwgMHhDMywgMHg0MywgMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwgMHgxMSwKLQkweDAwLCAweDJCLCAweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAotCTB4Q0MsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4RDEsIDB4RkQsIDB4MUQsIDB4MDUsIDB4OTEsIDB4RjMsIDB4RkUsCi0JMHgzRCwgMHhENywgMHgxRiwgMHg4NywgMHhGMywgMHhDMywgMHgwNiwgMHg0MiwgMHhGQywgMHhFNSwgMHgwMSwKLQkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLAotCTB4RkYsIDB4OTAsIDB4MDEsIDB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsCi0JMHhFMSwgMHg0NiwgMHhFMSwgMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwKLQkweDAwLCAweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDkwLCAweEZGLAotCTB4NDUsIDB4MDEsIDB4MEIsIDB4RkQsIDB4NDQsIDB4MDYsIDB4MEEsIDB4RjIsIDB4M0IsIDB4MzgsIDB4ODAsCi0JMHgyNywgMHgyQiwgMHhGMiwgMHgyMiwgMHgwNywgMHgzMywgMHhGQywgMHhERSwgMHgwMSwgMHgzRSwgMHhGRiwKLQkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LAotCTB4MDEsIDB4QkMsIDB4RkQsIDB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsCi0JMHhDMywgMHhGRiwgMHg4OSwgMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywKLQkweEZGLCAweDE4LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlELCAweDAxLAotCTB4ODQsIDB4RkMsIDB4RjMsIDB4MDYsIDB4N0QsIDB4RjEsIDB4OUUsIDB4MzEsIDB4RTYsIDB4MkUsIDB4ODUsCi0JMHhGMSwgMHgxNiwgMHgwNywgMHg2MSwgMHhGQywgMHhCNSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweEZELCAweEZGLCAweDFDLCAweDAwLCAweDhGLCAweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LAotCTB4MDIsIDB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsIDB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsCi0JMHhGOCwgMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwgMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKLQkweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LCAweEZGLCAweEQyLCAweDAxLCAweDNELCAweEZDLAotCTB4MkIsIDB4MDcsIDB4RDQsIDB4RjEsIDB4NjQsIDB4MkEsIDB4QzYsIDB4MzUsIDB4QjcsIDB4RjEsIDB4OTYsCi0JMHgwNiwgMHhDRiwgMHhGQywgMHg2QiwgMHgwMSwgMHg3RCwgMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLCAweEZGLCAweEQwLCAweDAwLCAweDA3LAotCTB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsIDB4NjMsIDB4RjksIDB4NDIsIDB4MDQsCi0JMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEYzLCAweDA2LAotCTB4RUUsIDB4RjIsIDB4Q0QsIDB4MjIsIDB4RTQsIDB4M0IsIDB4REMsIDB4RjIsIDB4OUMsIDB4MDUsIDB4N0UsCi0JMHhGRCwgMHgwMCwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwKLQkweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLCAweDAyLCAweDVFLAotCTB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsIDB4Q0YsIDB4RkMsCi0JMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwKLQkweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLCAweDY3LCAweEZDLCAweDVBLCAweDA2LCAweEE2LCAweEY0LAotCTB4MUIsIDB4MUIsIDB4MDcsIDB4NDEsIDB4MDQsIDB4RjUsIDB4MkQsIDB4MDQsIDB4NjcsIDB4RkUsIDB4NzcsCi0JMHgwMCwgMHhGOCwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwKLQkweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLCAweEY1LCAweDMyLAotCTB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsIDB4REEsIDB4MDEsCi0JMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwKLQkweEZGLCAweEI1LCAweDAxLCAweENBLCAweEZDLCAweDcyLCAweDA1LCAweEQzLCAweEY2LCAweDhELCAweDEzLAotCTB4RkQsIDB4NDQsIDB4MzksIDB4RjgsIDB4NTMsIDB4MDIsIDB4ODIsIDB4RkYsIDB4RDcsIDB4RkYsIDB4NDcsCi0JMHgwMCwgMHhEMywgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCNiwgMHhGRiwKLQkweEZCLCAweDAwLCAweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLCAweDFDLCAweDNDLCAweDgxLAotCTB4MjIsIDB4RkMsIDB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OSwKLQkweDAxLCAweDUzLCAweEZELCAweDRFLCAweDA0LCAweDRBLCAweEY5LCAweDYwLCAweDBDLCAweEEzLCAweDQ3LAotCTB4NzYsIDB4RkMsIDB4MUYsIDB4MDAsIDB4QzMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4OUQsIDB4MDAsIDB4QjIsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwKLQkweEQ1LCAweEZDLCAweDhFLCAweDA2LCAweEJFLCAweEYxLCAweDA2LCAweDM2LCAweDFBLCAweDJBLCAweERDLAotCTB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3OSwgMHhGRiwgMHgyRSwgMHgwMSwgMHhGNywKLQkweEZELCAweDA1LCAweDAzLCAweEUxLCAweEZCLCAweENBLCAweDA1LCAweERGLCAweDQ4LCAweEFCLCAweDAxLAotCTB4QUEsIDB4RkQsIDB4MTgsIDB4MDIsIDB4NzIsIDB4RkUsIDB4RjQsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MUIsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywgMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywKLQkweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLCAweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LAotCTB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHgxOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHhEOSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhBRSwgMHgwMSwgMHg3MCwKLQkweEZFLCAweEY4LCAweEZGLCAweEE2LCAweDQ4LCAweEJFLCAweDA3LCAweDE0LCAweEZCLCAweDZELCAweDAzLAotCTB4QzMsIDB4RkQsIDB4NDYsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhERCwgMHgwMSwgMHgzNCwgMHhGQywgMHgyMywgMHgwNywKLQkweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLCAweDM3LCAweDAwLCAweEYyLCAweDRELCAweDA2LCAweDA0LAotCTB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsCi0JMHhCRCwgMHhGRiwgMHg4MiwgMHgwMCwgMHg1RSwgMHhGRiwgMHg1RCwgMHgwMCwgMHhENCwgMHgwMCwgMHgwQywKLQkweEZCLCAweEY5LCAweDQ2LCAweDg3LCAweDBFLCAweDgyLCAweEY4LCAweEFELCAweDA0LCAweDI2LCAweEZELAotCTB4OEQsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwgMHhGMywKLQkweDIyLCAweDIwLCAweENBLCAweDNELCAweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELCAweEQ0LAotCTB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REQsIDB4RkYsCi0JMHgyRSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyNywgMHhGRiwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGNywgMHhFNywKLQkweDQzLCAweEQ4LCAweDE1LCAweDFFLCAweEY2LCAweEMwLCAweDA1LCAweEE3LCAweEZDLCAweEMzLCAweDAxLAotCTB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsCi0JMHhGRiwgMHhEMSwgMHgwMSwgMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwKLQkweDg5LCAweDQyLCAweDAyLCAweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLAotCTB4MDAsIDB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTIsIDB4RkYsCi0JMHhBNCwgMHgwMCwgMHgxOSwgMHhGRSwgMHhBQSwgMHgwNCwgMHgzRSwgMHhGNCwgMHg5MCwgMHgzRiwgMHg3OCwKLQkweDFELCAweDEwLCAweEY0LCAweDkzLCAweDA2LCAweDUyLCAweEZDLCAweEUxLCAweDAxLCAweDM2LCAweEZGLAotCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsCi0JMHgwMSwgMHhGNiwgMHhGQywgMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwKLQkweDkzLCAweEY5LCAweDk4LCAweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MjQsIDB4MDEsCi0JMHg0MSwgMHhGRCwgMHhGNiwgMHgwNSwgMHg2NywgMHhGMiwgMHgxQSwgMHgzQSwgMHgyOSwgMHgyNSwgMHg4NCwKLQkweEYyLCAweDBGLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsCi0JMHhGRCwgMHhERiwgMHgwMywgMHgyRSwgMHhGQSwgMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwKLQkweDRCLCAweEZGLCAweDM4LCAweDAxLCAweEU5LCAweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4ODUsIDB4MDEsIDB4QTYsIDB4RkMsCi0JMHhDQSwgMHgwNiwgMHg4RiwgMHhGMSwgMHhCQiwgMHgzMywgMHhBQiwgMHgyQywgMHhBMywgMHhGMSwgMHgyNiwKLQkweDA3LCAweDRDLCAweEZDLCAweEM1LCAweDAxLCAweDRELCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLAotCTB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsCi0JMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywKLQkweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweEZELAotCTB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsCi0JMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwKLQkweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsCi0JMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwKLQkweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAyLCAweDAwLCAweDA1LAotCTB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsIDB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsCi0JMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywgMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwKLQkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsIDB4NEMsIDB4RjMsIDB4RUQsCi0JMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwgMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwgMHhGRCwgMHhFMSwgMHgwMCwKLQkweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LAotCTB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsCi0JMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwKLQkweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLAotCTB4RTksIDB4RkUsIDB4MzgsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsCi0JMHgwQSwgMHgyRSwgMHhGQSwgMHhERiwgMHgwMywgMHg4QSwgMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwKLQkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM4LCAweEZGLCAweDY0LCAweDAwLCAweDlCLAotCTB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsIDB4RjksIDB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsCi0JMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywgMHhBMiwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwKLQkweDAwLCAweEZGLCAweEZGLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLCAweDAwLCAweDQyLCAweDAwLAotCTB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsIDB4NzYsIDB4MTgsIDB4NUMsCi0JMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LCAweDAwLCAweEM4LAotCTB4RkQsIDB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsIDB4NzYsIDB4RjMsCi0JMHhDOCwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LCAweEZELAotCTB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsIDB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsIDB4MjMsCi0JMHgwNywgMHgzNCwgMHhGQywgMHhERCwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLCAweDAxLCAweDgwLCAweEZDLCAweEY3LAotCTB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsIDB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsCi0JMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKLQkweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLCAweDA3LAotCTB4REMsIDB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsIDB4RDUsCi0JMHhGQywgMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLAotCTB4RjIsIDB4ODEsIDB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsCi0JMHhGQiwgMHgwMCwgMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwKLQkweDAwLCAweDM4LCAweEZGLCAweERBLCAweDAxLCAweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LAotCTB4Q0UsIDB4MUEsIDB4MzIsIDB4NDEsIDB4MUYsIDB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsCi0JMHgwMCwgMHhGQiwgMHhGRiwgMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwKLQkweDQ2LCAweEZGLCAweEIzLCAweDAxLCAweENGLCAweEZDLCAweDY3LCAweDA1LCAweEVBLCAweEY2LCAweDQ0LAotCTB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsIDB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsIDB4RkYsIDB4RDAsIDB4RkYsCi0JMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwKLQkweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELCAweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLAotCTB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsIDB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsCi0JMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwKLQkweDJCLCAweDAxLCAweEZFLCAweEZELCAweEY4LCAweDAyLCAweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LAotCTB4NDgsIDB4RTMsIDB4MDEsIDB4OTEsIDB4RkQsIDB4MjUsIDB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsCi0JMHg4RiwgMHhGRiwgMHgxQywgMHgwMCwgMHgxOCwgMHgwMCwgMHg5QywgMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwKLQkweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLCAweEZGLCAweDlDLCAweDQ4LCAweEZELCAweDA3LAotCTB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsIDB4NDksIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwgMHgwMCwgMHg2NSwgMHhGRiwKLQkweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LCAweENELCAweDBFLCAweDZBLAotCTB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxQiwKLQkweEZGLCAweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LCAweDA3LCAweEY2LAotCTB4Q0EsIDB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwgMHhGRSwKLQkweEI5LCAweDA0LCAweDI3LCAweEY0LCAweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLCAweDk5LAotCTB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwgMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwKLQkweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LCAweDc5LCAweEYyLCAweDEyLCAweDA3LAotCTB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCi0JMHhGRiwgMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwgMHgwNiwKLQkweDhDLCAweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LCAweDRFLAotCTB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgzMCwgMHgwMCwgMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwKLQkweEYxLCAweDYyLCAweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLAotCTB4ODIsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzQSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwKLQkweERELCAweDI0LCAweDU0LCAweDNBLCAweDc0LCAweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLAotCTB4MDEsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCi0JMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwgMHg1NSwgMHhGQywgMHg4QywgMHgwNiwgMHgyMiwgMHhGNCwgMHgyQywKLQkweDFELCAweEMwLCAweDNGLCAweDU1LCAweEY0LCAweDlCLCAweDA0LCAweDIzLCAweEZFLCAweDlGLCAweDAwLAotCTB4RTQsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCi0JMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywgMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwKLQkweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLCAweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLAotCTB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsCi0JMHg4QiwgMHgwMSwgMHgyQiwgMHhGRCwgMHhBMSwgMHgwNCwgMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwKLQkweDQ3LCAweDM4LCAweEZCLCAweEJFLCAweDAwLCAweDZBLCAweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLAotCTB4QkIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsCi0JMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwgMHhGQiwgMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwKLQkweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLCAweEEzLCAweEZFLCAweERELCAweDAwLCAweDk5LAotCTB4RkYsIDB4MTksIDB4MDAsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsIDB4MDAsIDB4NzksIDB4RkUsCi0JMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwgMHgwNywgMHgwNiwgMHhDNywKLQkweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LCAweEZGLCAweDIyLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsIDB4RkYsIDB4QjYsCi0JMHgwMCwgMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywgMHgzMSwgMHhGOSwKLQkweDVBLCAweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsIDB4RkYsCi0JMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwgMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwgMHg3QywKLQkweDA1LCAweEM1LCAweEZDLCAweEI3LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsCi0JMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwgMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwKLQkweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLAotCTB4MDAsIDB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsIDB4MDUsCi0JMHhDQywgMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwgMHgzNSwKLQkweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLAotCTB4MjAsIDB4MDAsIDB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsCi0JMHhGMSwgMHg4NiwgMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywKLQkweEQxLCAweDAxLCAweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJELAotCTB4MDAsIDB4NTQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsCi0JMHg5RiwgMHgyRSwgMHhFMywgMHgzMSwgMHg3RSwgMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwKLQkweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM0LCAweDAwLAotCTB4M0UsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsIDB4MzUsIDB4RjIsIDB4MzYsCi0JMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwgMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwgMHhGRCwgMHg0MSwgMHgwMSwKLQkweDkyLCAweEZGLCAweDE3LCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAotCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsIDB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsCi0JMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwgMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwKLQkweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLAotCTB4Q0UsIDB4MDEsIDB4OEMsIDB4RkMsIDB4MDAsIDB4MDYsIDB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsCi0JMHg0MiwgMHgzRiwgMHhGNiwgMHg3MSwgMHgwMywgMHhEOSwgMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwKLQkweEU1LCAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlFLAotCTB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsIDB4RjcsIDB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsCi0JMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwgMHg4RSwgMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwKLQkweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLCAweDVCLCAweDAxLAotCTB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksIDB4NTcsIDB4NDgsIDB4OEQsCi0JMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwgMHgwMCwgMHhBNCwgMHhGRiwKLQkweDE2LCAweDAwLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLCAweEZFLCAweDc0LAotCTB4MDIsIDB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsIDB4OTQsIDB4RkMsCi0JMHhBOSwgMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDE1LCAweDAwLCAweEE5LCAweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELCAweDAxLAotCTB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsIDB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksIDB4RjgsCi0JMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LCAweEZGLCAweEQ2LCAweEZGLCAweEMzLAotCTB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsIDB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsCi0JMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNiwKLQkweDAwLCAweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LCAweDAzLAotCTB4QzcsIDB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsIDB4N0QsCi0JMHhGQywgMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDA1LCAweDAwLCAweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LAotCTB4RjMsIDB4NjEsIDB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsCi0JMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwKLQkweDAwLCAweDhBLCAweEZGLCAweDUxLCAweDAxLCAweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLAotCTB4ODIsIDB4MzcsIDB4NjAsIDB4MjgsIDB4MEUsIDB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsCi0JMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKLQkweDVGLCAweEZGLCAweEE1LCAweDAxLCAweDc4LCAweEZDLCAweEZGLCAweDA2LCAweDdELCAweEYxLCAweENGLAotCTB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsIDB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsIDB4RkMsIDB4QUUsIDB4MDEsCi0JMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywKLQkweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLCAweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LAotCTB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsIDB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsCi0JMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKLQkweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU2LCAweDA2LCAweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLAotCTB4M0MsIDB4MEUsIDB4RjMsIDB4NzgsIDB4MDUsIDB4OTYsIDB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsCi0JMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwKLQkweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLCAweEY0LCAweDM4LCAweDFBLCAweDhDLCAweDQxLAotCTB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsIDB4NjYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsCi0JMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywgMHhGRiwgMHhBRiwgMHgwMSwKLQkweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLCAweDVDLCAweDQ1LCAweEE5LAotCTB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RDAsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwgMHgwMSwgMHg2NSwKLQkweEZELCAweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LCAweDAzLCAweEZELAotCTB4RDksIDB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywgMHhGRSwKLQkweERFLCAweDAyLCAweDJFLCAweEZDLCAweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLCAweDVFLAotCTB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsIDB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsIDB4MDAsCi0JMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwKLQkweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LCAweEM3LCAweEZBLCAweDkzLCAweDAzLAotCTB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsCi0JMHgwMCwgMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywgMHgwMSwKLQkweDhCLCAweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LCAweDE1LAotCTB4RkQsIDB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsCi0JMHhFMSwgMHhGRiwgMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwKLQkweEY2LCAweDc3LCAweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLAotCTB4QzgsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhEOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywKLQkweEZDLCAweDNFLCAweDVCLCAweDFFLCAweERCLCAweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLAotCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwgMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwgMHg0MSwgMHhGMiwgMHg2QSwKLQkweDM5LCAweDBBLCAweDI2LCAweDYxLCAweEYyLCAweDE3LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAotCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsCi0JMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywgMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwKLQkweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLCAweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCi0JMHhDQSwgMHgwMSwgMHg0NiwgMHhGQywgMHgyOSwgMHgwNywgMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwKLQkweDM0LCAweDlDLCAweEYxLCAweEI4LCAweDA2LCAweEI1LCAweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLAotCTB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCi0JMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwgMHhGMiwgMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwKLQkweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELCAweDE3LCAweDAxLCAweEE4LCAweEZGLCAweDBGLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsCi0JMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywgMHgxRiwgMHg0MCwgMHg4NSwKLQkweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLCAweEZGLCAweEY3LCAweEZGLAotCTB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsIDB4MDEsIDB4QjQsCi0JMHhGQywgMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwgMHg4NiwgMHhGNywKLQkweEI2LCAweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsIDB4RkQsCi0JMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwgMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwgMHg5MSwKLQkweDAwLCAweDgzLCAweDAwLCAweDRBLCAweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsIDB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsCi0JMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwgMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwKLQkweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweDFBLAotCTB4MDAsIDB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsIDB4RkQsCi0JMHgwNSwgMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywgMHhFNCwKLQkweEZELCAweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAotCTB4QjYsIDB4RkYsIDB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsCi0JMHhGQiwgMHg2OSwgMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwKLQkweDgxLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweEQ3LAotCTB4RkYsIDB4M0UsIDB4MDAsIDB4RUEsIDB4RkYsIDB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsCi0JMHg5OSwgMHg0NCwgMHg2OCwgMHgxNCwgMHg4RSwgMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwKLQkweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEY1LCAweEZGLAotCTB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsIDB4NDksIDB4RkUsIDB4NUQsIDB4MDQsIDB4QjcsIDB4RjQsIDB4N0QsCi0JMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywgMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwgMHhGQywgMHhERSwgMHgwMSwKLQkweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLAotCTB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsCi0JMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwgMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwKLQkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLAotCTB4NzUsIDB4MDEsIDB4QkYsIDB4RkMsIDB4QUIsIDB4MDYsIDB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsCi0JMHgyQiwgMHhCRiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MiwgMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwKLQkweDMxLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUyLCAweEZGLCAweEJDLAotCTB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsIDB4RjEsIDB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsCi0JMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywgMHg5NCwgMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwKLQkweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUwLCAweDAxLAotCTB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsIDB4RjIsIDB4MzgsIDB4MkEsCi0JMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwgMHhGRiwgMHgxNiwgMHgwMCwKLQkweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ4LAotCTB4RkMsIDB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsIDB4Q0YsIDB4RjMsCi0JMHhGMywgMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMywKLQkweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLCAweEZDLAotCTB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsIDB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsIDB4NEQsCi0JMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwgMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwgMHgwMCwKLQkweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LCAweDAxLCAweDBCLCAweEZELCAweEU2LAotCTB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsIDB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsCi0JMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELCAweDAzLAotCTB4OTQsIDB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsIDB4NkMsCi0JMHgwMSwgMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHgxRCwgMHgwMCwKLQkweDhBLCAweEZGLCAweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LAotCTB4MDIsIDB4RjIsIDB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsCi0JMHgxRSwgMHgwMSwgMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHhBQywKLQkweEZGLCAweEFFLCAweDAwLCAweDA1LCAweEZGLCAweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELAotCTB4RkQsIDB4NDcsIDB4MEUsIDB4MEIsIDB4QzgsIDB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsCi0JMHgwMSwgMHg2MSwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhDRCwgMHhGRiwKLQkweDU3LCAweDAwLCAweEI2LCAweEZGLCAweEJFLCAweEZGLCAweEVELCAweDAxLCAweEY1LCAweEY4LCAweDlCLAotCTB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsIDB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsIDB4RkMsIDB4QUIsIDB4MDEsCi0JMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwKLQkweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLCAweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLAotCTB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsIDB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwKLQkweEU4LCAweDAwLCAweEE2LCAweEZELCAweDVGLCAweDA1LCAweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLAotCTB4MjEsIDB4MzcsIDB4RjMsIDB4REQsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsCi0JMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwKLQkweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLCAweEYxLCAweDA0LCAweDM3LCAweEYzLCAweDI4LAotCTB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwKLQkweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLAotCTB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsCi0JMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgzNywKLQkweEZDLCAweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LCAweERDLCAweEYxLAotCTB4NkYsIDB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywKLQkweERELCAweDA2LCAweDM3LCAweEYzLCAweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLCAweDVGLAotCTB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NywgMHhGQywgMHgzMywKLQkweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLCAweDhELCAweEY1LCAweERBLCAweDAzLAotCTB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsCi0JMHhGRiwgMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwgMHgwNSwKLQkweDQ4LCAweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLCAweEJFLAotCTB4RkYsIDB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgyOCwgMHgwMCwgMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwKLQkweEY5LCAweDBFLCAweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLAotCTB4MDUsIDB4RkYsIDB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsCi0JMHgwMCwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMSwgMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywKLQkweDlCLCAweDA0LCAweEYyLCAweDQ4LCAweEM2LCAweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLAotCTB4RkUsIDB4MDQsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MTcsIDB4MDAsIDB4QTEsIDB4RkYsCi0JMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwgMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwgMHhGMywgMHhGRSwgMHg3MCwKLQkweDQ4LCAweEZGLCAweDA4LCAweDk0LCAweEZBLCAweEFELCAweDAzLCAweEEzLCAweEZELCAweDU1LCAweDAxLAotCTB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsCi0JMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwKLQkweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LCAweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLAotCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHhFRiwgMHhGRSwgMHg0RCwgMHgwMywgMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwKLQkweDE3LCAweEIwLCAweEY1LCAweEVGLCAweDA1LCAweDkzLCAweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLAotCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsCi0JMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwgMHhGMywgMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwKLQkweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MzksIDB4MDEsCi0JMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwgMHhBMCwgMHgyNiwgMHg0QiwKLQkweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLAotCTB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsIDB4MDEsIDB4OTAsCi0JMHhGQywgMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwgMHg4RSwgMHhGMSwKLQkweDFELCAweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLCAweDAwLCAweEZELAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsIDB4RkMsCi0JMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwgMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwgMHhBQiwKLQkweDA2LCAweEJGLCAweEZDLCAweDc1LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLAotCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsCi0JMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwgMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwKLQkweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZFLAotCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsIDB4MDYsCi0JMHg2QywgMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwgMHg0OSwKLQkweEZFLCAweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZGLCAweEZGLAotCTB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsCi0JMHhGNiwgMHg2OCwgMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwKLQkweEVBLCAweEZGLCAweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAotCTB4MDAsIDB4NTksIDB4RkYsIDB4ODEsIDB4MDEsIDB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsCi0JMHgyRCwgMHgwRCwgMHg2OSwgMHg0NywgMHhFQiwgMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywKLQkweEZGLCAweDkzLCAweDAwLCAweEI2LCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLAotCTB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsIDB4OTQsIDB4RkIsIDB4ODMsCi0JMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwgMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwgMHgwMSwgMHg4NywgMHhGRSwKLQkweEVBLCAweDAwLCAweDk0LCAweEZGLCAweDFBLCAweDAwLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLAotCTB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsIDB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsCi0JMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwgMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywKLQkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLAotCTB4NEEsIDB4RkYsIDB4ODMsIDB4MDAsIDB4OTEsIDB4MDAsIDB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsCi0JMHgwRCwgMHhDRCwgMHhGOCwgMHg4OSwgMHgwNCwgMHgzNiwgMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwKLQkweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweEQ5LCAweEZGLCAweDM3LCAweDAwLCAweEY3LAotCTB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsIDB4RjcsIDB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsCi0JMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywgMHhCRSwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwKLQkweDAwLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLCAweEZGLCAweDkzLCAweDAwLAotCTB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsIDB4OTQsIDB4MUMsIDB4NDcsCi0JMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKLQkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LCAweDAxLCAweDU3LAotCTB4RkQsIDB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsIDB4QUEsIDB4RjIsCi0JMHgwNiwgMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LCAweEZDLAotCTB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsIDB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsIDB4MjksCi0JMHgwNywgMHg0NiwgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLCAweDAxLCAweDUzLCAweEZDLCAweDIxLAotCTB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsIDB4ODYsIDB4RjEsIDB4REIsIDB4MDYsCi0JMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKLQkweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LCAweDA3LAotCTB4NjEsIDB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsIDB4MkMsCi0JMHhGRCwgMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKLQkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLAotCTB4RjMsIDB4NUIsIDB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsCi0JMHhCNCwgMHgwMCwgMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywKLQkweDAwLCAweDNFLCAweEZGLCAweEM4LCAweDAxLCAweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LAotCTB4QjYsIDB4MTYsIDB4NzcsIDB4NDMsIDB4QkQsIDB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsCi0JMHgwMCwgMHgyNSwgMHgwMCwgMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwKLQkweDUxLCAweEZGLCAweDk1LCAweDAxLCAweDE1LCAweEZELCAweENGLCAweDA0LCAweDM5LCAweEY4LCAweDU5LAotCTB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsIDB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsIDB4MDAsIDB4NzMsIDB4RkYsCi0JMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywKLQkweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELCAweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LAotCTB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsCi0JMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwgMHgxQywgMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwKLQkweDVELCAweEZFLCAweDNGLCAweDAyLCAweDVFLCAweEZELCAweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLAotCTB4MDUsIDB4MkUsIDB4RkMsIDB4REUsIDB4MDIsIDB4MEMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsCi0JMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHhBRSwgMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwKLQkweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLCAweEZELCAweERDLCAweDQ3LCAweDk1LCAweDBCLAotCTB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsIDB4NzEsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwgMHgwMCwgMHhDMywgMHhGRiwKLQkweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LCAweEIyLCAweDEyLCAweDE5LAotCTB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg4NSwKLQkweEZFLCAweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLCAweEUxLCAweEY0LAotCTB4NDMsIDB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwgMHhGRCwKLQkweDc4LCAweDA1LCAweDBFLCAweEYzLCAweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLCAweEU2LAotCTB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwgMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwKLQkweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LCAweEVCLCAweEYxLCAweDJBLCAweDA3LAotCTB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCi0JMHhGRiwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwgMHgwNywKLQkweDgwLCAweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LCAweDc4LAotCTB4RkMsIDB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCi0JMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwKLQkweEYyLCAweDYwLCAweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLAotCTB4NTEsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywKLQkweEJBLCAweDIwLCAweDYxLCAweDNELCAweDU2LCAweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLAotCTB4MDAsIDB4QzUsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCi0JMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RCwgMHhGQywgMHgyMywgMHgwNiwgMHgzMiwgMHhGNSwgMHgwQywKLQkweDE5LCAweDM4LCAweDQyLCAweEM3LCAweEY1LCAweEI4LCAweDAzLCAweEFGLCAweEZFLCAweDRFLCAweDAwLAotCTB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsCi0JMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywgMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwKLQkweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLCAweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLAotCTB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsCi0JMHg2NiwgMHgwMSwgMHg3RCwgMHhGRCwgMHhGOCwgMHgwMywgMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwKLQkweDQ4LCAweEM1LCAweEZELCAweDdBLCAweEZGLCAweDFELCAweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLAotCTB4QTksIDB4RkYsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsCi0JMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwgMHhGQywgMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwKLQkweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLCAweDQyLCAweEZFLCAweDBCLCAweDAxLCAweDg3LAotCTB4RkYsIDB4MUUsIDB4MDAsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsIDB4MDAsIDB4REIsIDB4RkUsCi0JMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwgMHg4MSwgMHgwOSwgMHg2MSwKLQkweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LCAweEZGLCAweDI2LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MDYsCi0JMHgwMCwgMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwgMHhENywgMHhGNywKLQkweEZDLCAweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLAotCTB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkUsCi0JMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwgMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwgMHgwMCwKLQkweDA2LCAweDhDLCAweEZDLCAweENFLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLAotCTB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksIDB4MDAsIDB4REEsIDB4RkQsIDB4MEYsCi0JMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwgMHg5NywgMHhGMywgMHhCRCwgMHgwNiwKLQkweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAotCTB4RkYsIDB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsIDB4MDYsCi0JMHgxNCwgMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywgMHgzMywKLQkweEZDLCAweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAotCTB4MjgsIDB4MDAsIDB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsCi0JMHhGMSwgMHhFMywgMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywKLQkweEI3LCAweDAxLCAweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMyLAotCTB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsIDB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsCi0JMHhBRSwgMHgyQSwgMHg4NiwgMHgzNSwgMHhCMSwgMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwKLQkweDAxLCAweDdCLCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLAotCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsIDB4RTAsIDB4RjIsIDB4MTgsCi0JMHgyMywgMHhBQiwgMHgzQiwgMHhDQywgMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwgMHhGRCwgMHgwNCwgMHgwMSwKLQkweEIxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAotCTB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsCi0JMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwgMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwKLQkweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLAotCTB4QjcsIDB4MDEsIDB4QzUsIDB4RkMsIDB4N0MsIDB4MDUsIDB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsCi0JMHg0NCwgMHgxNCwgMHhGOCwgMHg2NywgMHgwMiwgMHg3NywgMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwKLQkweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVCLCAweEZGLCAweDdDLAotCTB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsIDB4RjksIDB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsCi0JMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwgMHgyRSwgMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywKLQkweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LCAweEZGLCAweDMxLCAweDAxLAotCTB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsIDB4REIsIDB4NDgsIDB4NzMsCi0JMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwgMHgwMCwgMHg5MSwgMHhGRiwKLQkweDFCLCAweDAwLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLCAweEZFLCAweEJCLAotCTB4MDEsIDB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsIDB4MkUsIDB4RkIsCi0JMHg2MCwgMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDEwLCAweDAwLCAweEJCLCAweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLCAweDAwLAotCTB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsIDB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsIDB4QTEsCi0JMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LCAweDAwLCAweDMyLCAweEZGLCAweERDLAotCTB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsIDB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsCi0JMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwKLQkweDAwLCAweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLCAweDA0LAotCTB4NTUsIDB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsIDB4NTUsCi0JMHhGQywgMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwKLQkweDExLCAweDAwLCAweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LAotCTB4RjIsIDB4NTQsIDB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsCi0JMHhFNCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgyMywKLQkweDAwLCAweDcxLCAweEZGLCAweDgyLCAweDAxLCAweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLAotCTB4RkQsIDB4MzMsIDB4NjIsIDB4MkMsIDB4QTgsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsCi0JMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKLQkweDRFLCAweEZGLCAweEMzLCAweDAxLCAweDRFLCAweEZDLCAweDI0LCAweDA3LCAweDlFLCAweEYxLCAweEYyLAotCTB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsIDB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsIDB4RkMsIDB4ODgsIDB4MDEsCi0JMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwKLQkweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LAotCTB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsIDB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsCi0JMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKLQkweEUyLCAweDAxLCAweDUwLCAweEZDLCAweDk5LCAweDA2LCAweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLAotCTB4M0YsIDB4MjcsIDB4RjQsIDB4QjksIDB4MDQsIDB4MTAsIDB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwKLQkweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LCAweEY2LCAweDIyLCAweDE2LCAweEMzLCAweDQzLAotCTB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MkIsIDB4MDAsIDB4REUsCi0JMHhGRiwgMHgwOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHg5MCwgMHgwMSwKLQkweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLCAweEUxLCAweDQ2LCAweEUxLAotCTB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QkUsIDB4RkYsCi0JMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHhCQywKLQkweEZELCAweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LCAweEMzLCAweEZGLAotCTB4ODksIDB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsCi0JMHgwMCwgMHgxQywgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwgMHgwMiwKLQkweDkxLCAweEZELCAweEUzLCAweDAxLCAweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLCAweEY4LAotCTB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsIDB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywKLQkweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLCAweDYzLCAweEY5LCAweDQyLCAweDA0LAotCTB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsCi0JMHgwMCwgMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwgMHgwMiwKLQkweDVFLCAweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LCAweENGLAotCTB4RkMsIDB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsCi0JMHhGMCwgMHhGRiwgMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwKLQkweEY1LCAweDMyLCAweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLAotCTB4REEsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsCi0JMHgwMCwgMHhCNiwgMHhGRiwgMHhGQiwgMHgwMCwgMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwKLQkweDFDLCAweDNDLCAweDgxLCAweDIyLCAweEZDLCAweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LAotCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwgMHhENSwgMHhGQywgMHg4RSwgMHgwNiwgMHhCRSwgMHhGMSwgMHgwNiwKLQkweDM2LCAweDFBLCAweDJBLCAweERDLCAweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLAotCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsCi0JMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywgMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwKLQkweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LCAweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLAotCTB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsCi0JMHhERCwgMHgwMSwgMHgzNCwgMHhGQywgMHgyMywgMHgwNywgMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwKLQkweDM3LCAweDAwLCAweEYyLCAweDRELCAweDA2LCAweDA0LCAweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLAotCTB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsCi0JMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwgMHhGMywgMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwKLQkweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELCAweEQ0LCAweDAwLCAweENBLCAweEZGLCAweDAzLAotCTB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDEsIDB4MDEsCi0JMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwgMHg4OSwgMHg0MiwgMHgwMiwKLQkweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLCAweDAwLCAweEU4LCAweEZGLAotCTB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsIDB4MDEsIDB4RjYsCi0JMHhGQywgMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwgMHg5MywgMHhGOSwKLQkweDk4LCAweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LCAweEZGLCAweDBFLAotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsIDB4RkQsCi0JMHhERiwgMHgwMywgMHgyRSwgMHhGQSwgMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwgMHg0QiwKLQkweEZGLCAweDM4LCAweDAxLCAweEU5LCAweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LCAweDAwLAotCTB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsCi0JMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywKLQkweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAwLAotCTB4MDAsIDB4RjQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4MDAsIDB4MDcsIDB4MDMsIDB4MTYsIDB4MDYsCi0JMHg3QywgMHgwOSwgMHgyQSwgMHgwQywgMHgyRSwgMHgwRCwgMHgyQSwgMHgwQywgMHg3QywgMHgwOSwgMHgxNiwKLQkweDA2LCAweDA3LCAweDAzLCAweEZGLCAweDAwLCAweDFBLCAweDAwLCAweEY0LCAweEZGLCAweEYyLCAweEZGLAotCTB4QTAsIDB4RkYsIDB4NzEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4ODYsIDB4MDMsIDB4NzMsIDB4MDgsIDB4ODgsCi0JMHgwRCwgMHg3OCwgMHgxMCwgMHhDOSwgMHgwRiwgMHhENSwgMHgwQiwgMHg4QiwgMHgwNiwgMHgyOCwgMHgwMiwKLQkweERGLCAweEZGLCAweDZGLCAweEZGLCAweEMzLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERDLAotCTB4RkYsIDB4ODAsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NDYsIDB4MDEsIDB4MUUsIDB4MDUsIDB4NUEsIDB4MEEsCi0JMHhFRCwgMHgwRSwgMHhBQSwgMHgxMCwgMHhBRiwgMHgwRSwgMHhGRCwgMHgwOSwgMHhDQiwgMHgwNCwgMHgxOCwKLQkweDAxLCAweDhFLCAweEZGLCAweDg1LCAweEZGLCAweEUxLCAweEZGLCAweEZDLCAweEZGLCAweEJELCAweEZGLAotCTB4NkQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4NjUsIDB4MDIsIDB4RTUsIDB4MDYsIDB4MkIsIDB4MEMsIDB4RjMsCi0JMHgwRiwgMHg2MCwgMHgxMCwgMHgzQiwgMHgwRCwgMHgxNiwgMHgwOCwgMHgzRiwgMHgwMywgMHg1MCwgMHgwMCwKLQkweDZFLCAweEZGLCAweEE3LCAweEZGLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDlBLCAweEZGLCAweDc1LAotCTB4RkYsIDB4OTEsIDB4MDAsIDB4QzksIDB4MDMsIDB4QzgsIDB4MDgsIDB4Q0MsIDB4MEQsIDB4ODksIDB4MTAsCi0JMHg5RiwgMHgwRiwgMHg4NSwgMHgwQiwgMHgzQiwgMHgwNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhGRiwgMHg3MiwKLQkweEZGLCAweEM5LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ3LCAweEZGLCAweDdCLCAweEZGLAotCTB4QTUsIDB4RkYsIDB4NzMsIDB4MDEsIDB4NkEsIDB4MDUsIDB4QUQsIDB4MEEsIDB4MjEsIDB4MEYsIDB4QTYsCi0JMHgxMCwgMHg3NCwgMHgwRSwgMHhBOSwgMHgwOSwgMHg4MywgMHgwNCwgMHhGMCwgMHgwMCwgMHg4NSwgMHhGRiwKLQkweDhCLCAweEZGLCAweEU1LCAweEZGLCAweEZBLCAweEZGLCAweEI3LCAweEZGLCAweDZDLCAweEZGLCAweDBDLAotCTB4MDAsIDB4OUQsIDB4MDIsIDB4MzcsIDB4MDcsIDB4NzgsIDB4MEMsIDB4MTUsIDB4MTAsIDB4NDcsIDB4MTAsCi0JMHhGMywgMHgwQywgMHhDMiwgMHgwNywgMHgwMSwgMHgwMywgMHgzNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBRCwKLQkweEZGLCAweEY3LCAweEZGLCAweEVCLCAweEZGLCAweDk0LCAweEZGLCAweDdBLCAweEZGLCAweEIzLCAweDAwLAotCTB4MEQsIDB4MDQsIDB4MUMsIDB4MDksIDB4MEQsIDB4MEUsIDB4OTcsIDB4MTAsIDB4NzMsIDB4MEYsIDB4MzUsCi0JMHgwQiwgMHhFQiwgMHgwNSwgMHhDMSwgMHgwMSwgMHhCRCwgMHhGRiwgMHg3NSwgMHhGRiwgMHhDRSwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQyLCAweEZGLCAweDc3LCAweEZGLCAweEIzLCAweEZGLCAweEExLAotCTB4MDEsIDB4QjcsIDB4MDUsIDB4RkYsIDB4MEEsIDB4NTMsIDB4MEYsIDB4OUUsIDB4MTAsIDB4MzcsIDB4MEUsCi0JMHg1NSwgMHgwOSwgMHgzQiwgMHgwNCwgMHhDQiwgMHgwMCwgMHg3RSwgMHhGRiwgMHg5MCwgMHhGRiwgMHhFOSwKLQkweEZGLCAweEY4LCAweEZGLCAweEIxLCAweEZGLCAweDZDLCAweEZGLCAweDI0LCAweDAwLCAweEQ4LCAweDAyLAotCTB4OEEsIDB4MDcsIDB4QzIsIDB4MEMsIDB4MzQsIDB4MTAsIDB4MkEsIDB4MTAsIDB4QUEsIDB4MEMsIDB4NkYsCi0JMHgwNywgMHhDNCwgMHgwMiwgMHgxQywgMHgwMCwgMHg2QywgMHhGRiwgMHhCMywgMHhGRiwgMHhGOSwgMHhGRiwKLQkweEU4LCAweEZGLCAweDhFLCAweEZGLCAweDgwLCAweEZGLCAweEQ3LCAweDAwLCAweDUzLCAweDA0LCAweDcxLAotCTB4MDksIDB4NEMsIDB4MEUsIDB4QTEsIDB4MTAsIDB4NDMsIDB4MEYsIDB4RTMsIDB4MEEsIDB4OUQsIDB4MDUsCi0JMHg5MSwgMHgwMSwgMHhBRSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhENCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweENELCAweEZGLCAweDc0LCAweEZGLCAweEMyLCAweEZGLCAweEQyLCAweDAxLCAweDA2LCAweDA2LAotCTB4NTAsIDB4MEIsIDB4ODIsIDB4MEYsIDB4OTMsIDB4MTAsIDB4RjgsIDB4MEQsIDB4MDAsIDB4MDksIDB4RjYsCi0JMHgwMywgMHhBNywgMHgwMCwgMHg3OCwgMHhGRiwgMHg5NiwgMHhGRiwgMHhFQywgMHhGRiwgMHhGNiwgMHhGRiwKLQkweEFCLCAweEZGLCAweDZELCAweEZGLCAweDNFLCAweDAwLCAweDE1LCAweDAzLCAweERFLCAweDA3LCAweDBCLAotCTB4MEQsIDB4NTAsIDB4MTAsIDB4MEEsIDB4MTAsIDB4NUUsIDB4MEMsIDB4MUMsIDB4MDcsIDB4OEEsIDB4MDIsCi0JMHgwNCwgMHgwMCwgMHg2QywgMHhGRiwgMHhCOSwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFNCwgMHhGRiwgMHg4OSwKLQkweEZGLCAweDg4LCAweEZGLCAweEZELCAweDAwLCAweDlCLCAweDA0LCAweEM1LCAweDA5LCAweDg4LCAweDBFLAotCTB4QTgsIDB4MTAsIDB4MTAsIDB4MEYsIDB4OTEsIDB4MEEsIDB4NTAsIDB4MDUsIDB4NjQsIDB4MDEsIDB4QTEsCi0JMHhGRiwgMHg3RCwgMHhGRiwgMHhEOSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNywgMHhGRiwKLQkweDcxLCAweEZGLCAweEQzLCAweEZGLCAweDA1LCAweDAyLCAweDU1LCAweDA2LCAweEEwLCAweDBCLCAweEFELAotCTB4MEYsIDB4ODQsIDB4MTAsIDB4QjYsIDB4MEQsIDB4QUMsIDB4MDgsIDB4QjMsIDB4MDMsIDB4ODYsIDB4MDAsCi0JMHg3NCwgMHhGRiwgMHg5QywgMHhGRiwgMHhGMCwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNSwgMHhGRiwgMHg2RiwKLQkweEZGLCAweDVBLCAweDAwLCAweDU0LCAweDAzLCAweDMyLCAweDA4LCAweDUyLCAweDBELCAweDY4LCAweDEwLAotCTB4RTYsIDB4MEYsIDB4MTEsIDB4MEMsIDB4Q0EsIDB4MDYsIDB4NTIsIDB4MDIsIDB4RUYsIDB4RkYsIDB4NkUsCi0JMHhGRiwgMHhCRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhERiwgMHhGRiwgMHg4NCwgMHhGRiwgMHg5MSwgMHhGRiwKLQkweDI1LCAweDAxLCAweEU0LCAweDA0LCAweDE5LCAweDBBLCAweEMyLCAweDBFLCAweEFBLCAweDEwLCAweERBLAotCTB4MEUsIDB4M0UsIDB4MEEsIDB4MDUsIDB4MDUsIDB4MzgsIDB4MDEsIDB4OTYsIDB4RkYsIDB4ODEsIDB4RkYsCi0JMHhERCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFNiwKLQkweEZGLCAweDNBLCAweDAyLCAweEE2LCAweDA2LCAweEVGLCAweDBCLCAweEQ2LCAweDBGLCAweDcxLCAweDEwLAotCTB4NzEsIDB4MEQsIDB4NTcsIDB4MDgsIDB4NzEsIDB4MDMsIDB4NjcsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTIsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHhGMSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3OCwgMHgwMCwKLQkweDk1LCAweDAzLCAweDg2LCAweDA4LCAweDk4LCAweDBELCAweDdDLCAweDEwLCAweEMwLCAweDBGLCAweEMzLAotCTB4MEIsIDB4NzksIDB4MDYsIDB4MUMsIDB4MDIsIDB4REIsIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzUsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg3RiwgMHhGRiwgMHg5QywgMHhGRiwgMHg1MCwKLQkweDAxLCAweDJGLCAweDA1LCAweDZDLCAweDBBLCAweEY5LCAweDBFLCAweEE5LCAweDEwLCAweEEyLCAweDBFLAotCTB4RUEsIDB4MDksIDB4QkIsIDB4MDQsIDB4MEYsIDB4MDEsIDB4OEMsIDB4RkYsIDB4ODcsIDB4RkYsIDB4RTIsCi0JMHhGRiwgMHhGQywgMHhGRiwgMHhCQywgMHhGRiwgMHg2RCwgMHhGRiwgMHhGQSwgMHhGRiwgMHg3MSwgMHgwMiwKLQkweEY3LCAweDA2LCAweDNDLCAweDBDLCAweEZCLCAweDBGLCAweDVCLCAweDEwLCAweDJCLCAweDBELCAweDAzLAotCTB4MDgsIDB4MzEsIDB4MDMsIDB4NEEsIDB4MDAsIDB4NkUsIDB4RkYsIDB4QTgsIDB4RkYsIDB4RjUsIDB4RkYsCi0JMHhFRSwgMHhGRiwgMHg5OSwgMHhGRiwgMHg3NiwgMHhGRiwgMHg5OCwgMHgwMCwgMHhEOCwgMHgwMywgMHhEQiwKLQkweDA4LCAweERCLCAweDBELCAweDhELCAweDEwLCAweDk2LCAweDBGLCAweDczLCAweDBCLCAweDI5LCAweDA2LAotCTB4RTgsIDB4MDEsIDB4QzksIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhENiwgMHhGRiwgMHg3QSwgMHhGRiwgMHhBOCwgMHhGRiwgMHg3RCwgMHgwMSwgMHg3QiwgMHgwNSwKLQkweEJGLCAweDBBLCAweDJELCAweDBGLCAweEE1LCAweDEwLCAweDY3LCAweDBFLCAweDk2LCAweDA5LCAweDczLAotCTB4MDQsIDB4RTcsIDB4MDAsIDB4ODQsIDB4RkYsIDB4OEMsIDB4RkYsIDB4RTYsIDB4RkYsIDB4RkEsIDB4RkYsCi0JMHhCNiwgMHhGRiwgMHg2QywgMHhGRiwgMHgxMSwgMHgwMCwgMHhBQSwgMHgwMiwgMHg0QSwgMHgwNywgMHg4OCwKLQkweDBDLCAweDFDLCAweDEwLCAweDQxLCAweDEwLCAweEUzLCAweDBDLCAweEFGLCAweDA3LCAweEYzLCAweDAyLAotCTB4MkYsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QUUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTMsCi0JMHhGRiwgMHg3QiwgMHhGRiwgMHhCQiwgMHgwMCwgMHgxQywgMHgwNCwgMHgyRiwgMHgwOSwgMHgxQiwgMHgwRSwKLQkweDlBLCAweDEwLCAweDY4LCAweDBGLCAweDIzLCAweDBCLCAweERBLCAweDA1LCAweEI3LCAweDAxLCAweEI5LAotCTB4RkYsIDB4NzYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDEsIDB4RkYsCi0JMHg3NiwgMHhGRiwgMHhCNiwgMHhGRiwgMHhBQywgMHgwMSwgMHhDOCwgMHgwNSwgMHgxMSwgMHgwQiwgMHg1RSwKLQkweDBGLCAweDlDLCAweDEwLCAweDI5LCAweDBFLCAweDQyLCAweDA5LCAweDJDLCAweDA0LCAweEMyLCAweDAwLAotCTB4N0QsIDB4RkYsIDB4OTIsIDB4RkYsIDB4RUEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4QjAsIDB4RkYsIDB4NkMsCi0JMHhGRiwgMHgyOSwgMHgwMCwgMHhFNiwgMHgwMiwgMHg5RCwgMHgwNywgMHhEMywgMHgwQywgMHgzQiwgMHgxMCwKLQkweDIzLCAweDEwLCAweDk5LCAweDBDLCAweDVDLCAweDA3LCAweEI3LCAweDAyLCAweDE2LCAweDAwLCAweDZDLAotCTB4RkYsIDB4QjQsIDB4RkYsIDB4RjksIDB4RkYsIDB4RTcsIDB4RkYsIDB4OEQsIDB4RkYsIDB4ODIsIDB4RkYsCi0JMHhERiwgMHgwMCwgMHg2MywgMHgwNCwgMHg4NCwgMHgwOSwgMHg1OSwgMHgwRSwgMHhBMywgMHgxMCwgMHgzOCwKLQkweDBGLCAweEQxLCAweDBBLCAweDhDLCAweDA1LCAweDg3LCAweDAxLCAweEFCLCAweEZGLCAweDc5LCAweEZGLAotCTB4RDUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4RkYsIDB4NzMsIDB4RkYsIDB4QzYsCi0JMHhGRiwgMHhERCwgMHgwMSwgMHgxNywgMHgwNiwgMHg2MiwgMHgwQiwgMHg4QywgMHgwRiwgMHg5MCwgMHgxMCwKLQkweEU5LCAweDBELCAweEVELCAweDA4LCAweEU3LCAweDAzLCAweEEwLCAweDAwLCAweDc3LCAweEZGLCAweDk3LAotCTB4RkYsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NkQsIDB4RkYsIDB4NDQsIDB4MDAsCi0JMHgyMywgMHgwMywgMHhGMSwgMHgwNywgMHgxQiwgMHgwRCwgMHg1NSwgMHgxMCwgMHgwMiwgMHgxMCwgMHg0RCwKLQkweDBDLCAweDBBLCAweDA3LCAweDdFLCAweDAyLCAweEZGLCAweEZGLCAweDZELCAweEZGLCAweEJBLCAweEZGLAotCTB4RkIsIDB4RkYsIDB4RTMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4OEEsIDB4RkYsIDB4MDYsIDB4MDEsIDB4QUIsCi0JMHgwNCwgMHhEOCwgMHgwOSwgMHg5NSwgMHgwRSwgMHhBOSwgMHgxMCwgMHgwNSwgMHgwRiwgMHg3RiwgMHgwQSwKLQkweDQwLCAweDA1LCAweDVBLCAweDAxLCAweDlGLCAweEZGLCAweDdFLCAweEZGLCAweERBLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkUsIDB4RkYsIDB4QzYsIDB4RkYsIDB4NzAsIDB4RkYsIDB4RDcsIDB4RkYsIDB4MTAsIDB4MDIsCi0JMHg2NywgMHgwNiwgMHhCMSwgMHgwQiwgMHhCNywgMHgwRiwgMHg4MCwgMHgxMCwgMHhBNywgMHgwRCwgMHg5OSwKLQkweDA4LCAweEE0LCAweDAzLCAweDdGLCAweDAwLCAweDczLCAweEZGLCAweDlELCAweEZGLCAweEYwLCAweEZGLAotCTB4RjMsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NzAsIDB4RkYsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDMsIDB4NDUsCi0JMHgwOCwgMHg2MiwgMHgwRCwgMHg2QywgMHgxMCwgMHhERSwgMHgwRiwgMHgwMCwgMHgwQywgMHhCOCwgMHgwNiwKLQkweDQ2LCAweDAyLCAweEVBLCAweEZGLCAweDZFLCAweEZGLCAweEMwLCAweEZGLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4REUsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OTQsIDB4RkYsIDB4MkYsIDB4MDEsIDB4RjQsIDB4MDQsCi0JMHgyQiwgMHgwQSwgMHhDRSwgMHgwRSwgMHhBQSwgMHgxMCwgMHhDRSwgMHgwRSwgMHgyQiwgMHgwQSwgMHhGNCwKLQkweDA0LCAweDJGLCAweDAxLCAweDk0LCAweEZGLCAweDgzLCAweEZGLCAweERFLCAweEZGLCAweEZELCAweEZGLAotCTB4QzAsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUEsIDB4RkYsIDB4NDYsIDB4MDIsIDB4QjgsIDB4MDYsIDB4MDAsCi0JMHgwQywgMHhERSwgMHgwRiwgMHg2QywgMHgxMCwgMHg2MiwgMHgwRCwgMHg0NSwgMHgwOCwgMHg2MiwgMHgwMywKLQkweDYwLCAweDAwLCAweDcwLCAweEZGLCAweEEzLCAweEZGLCAweEYzLCAweEZGLCAweEYwLCAweEZGLCAweDlELAotCTB4RkYsIDB4NzMsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QTQsIDB4MDMsIDB4OTksIDB4MDgsIDB4QTcsIDB4MEQsCi0JMHg4MCwgMHgxMCwgMHhCNywgMHgwRiwgMHhCMSwgMHgwQiwgMHg2NywgMHgwNiwgMHgxMCwgMHgwMiwgMHhENywKLQkweEZGLCAweDcwLCAweEZGLCAweEM2LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERBLCAweEZGLAotCTB4N0UsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NUEsIDB4MDEsIDB4NDAsIDB4MDUsIDB4N0YsIDB4MEEsIDB4MDUsCi0JMHgwRiwgMHhBOSwgMHgxMCwgMHg5NSwgMHgwRSwgMHhEOCwgMHgwOSwgMHhBQiwgMHgwNCwgMHgwNiwgMHgwMSwKLQkweDhBLCAweEZGLCAweDg4LCAweEZGLCAweEUzLCAweEZGLCAweEZCLCAweEZGLCAweEJBLCAweEZGLCAweDZELAotCTB4RkYsIDB4RkYsIDB4RkYsIDB4N0UsIDB4MDIsIDB4MEEsIDB4MDcsIDB4NEQsIDB4MEMsIDB4MDIsIDB4MTAsCi0JMHg1NSwgMHgxMCwgMHgxQiwgMHgwRCwgMHhGMSwgMHgwNywgMHgyMywgMHgwMywgMHg0NCwgMHgwMCwgMHg2RCwKLQkweEZGLCAweEE5LCAweEZGLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDk3LCAweEZGLCAweDc3LCAweEZGLAotCTB4QTAsIDB4MDAsIDB4RTcsIDB4MDMsIDB4RUQsIDB4MDgsIDB4RTksIDB4MEQsIDB4OTAsIDB4MTAsIDB4OEMsCi0JMHgwRiwgMHg2MiwgMHgwQiwgMHgxNywgMHgwNiwgMHhERCwgMHgwMSwgMHhDNiwgMHhGRiwgMHg3MywgMHhGRiwKLQkweENCLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQ1LCAweEZGLCAweDc5LCAweEZGLCAweEFCLAotCTB4RkYsIDB4ODcsIDB4MDEsIDB4OEMsIDB4MDUsIDB4RDEsIDB4MEEsIDB4MzgsIDB4MEYsIDB4QTMsIDB4MTAsCi0JMHg1OSwgMHgwRSwgMHg4NCwgMHgwOSwgMHg2MywgMHgwNCwgMHhERiwgMHgwMCwgMHg4MiwgMHhGRiwgMHg4RCwKLQkweEZGLCAweEU3LCAweEZGLCAweEY5LCAweEZGLCAweEI0LCAweEZGLCAweDZDLCAweEZGLCAweDE2LCAweDAwLAotCTB4QjcsIDB4MDIsIDB4NUMsIDB4MDcsIDB4OTksIDB4MEMsIDB4MjMsIDB4MTAsIDB4M0IsIDB4MTAsIDB4RDMsCi0JMHgwQywgMHg5RCwgMHgwNywgMHhFNiwgMHgwMiwgMHgyOSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMCwgMHhGRiwKLQkweEY4LCAweEZGLCAweEVBLCAweEZGLCAweDkyLCAweEZGLCAweDdELCAweEZGLCAweEMyLCAweDAwLCAweDJDLAotCTB4MDQsIDB4NDIsIDB4MDksIDB4MjksIDB4MEUsIDB4OUMsIDB4MTAsIDB4NUUsIDB4MEYsIDB4MTEsIDB4MEIsCi0JMHhDOCwgMHgwNSwgMHhBQywgMHgwMSwgMHhCNiwgMHhGRiwgMHg3NiwgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEQwLCAweEZGLCAweDc2LCAweEZGLCAweEI5LCAweEZGLCAweEI3LCAweDAxLAotCTB4REEsIDB4MDUsIDB4MjMsIDB4MEIsIDB4NjgsIDB4MEYsIDB4OUEsIDB4MTAsIDB4MUIsIDB4MEUsIDB4MkYsCi0JMHgwOSwgMHgxQywgMHgwNCwgMHhCQiwgMHgwMCwgMHg3QiwgMHhGRiwgMHg5MywgMHhGRiwgMHhFQSwgMHhGRiwKLQkweEY3LCAweEZGLCAweEFFLCAweEZGLCAweDZDLCAweEZGLCAweDJGLCAweDAwLCAweEYzLCAweDAyLCAweEFGLAotCTB4MDcsIDB4RTMsIDB4MEMsIDB4NDEsIDB4MTAsIDB4MUMsIDB4MTAsIDB4ODgsIDB4MEMsIDB4NEEsIDB4MDcsCi0JMHhBQSwgMHgwMiwgMHgxMSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNiwKLQkweEZGLCAweDhDLCAweEZGLCAweDg0LCAweEZGLCAweEU3LCAweDAwLCAweDczLCAweDA0LCAweDk2LCAweDA5LAotCTB4NjcsIDB4MEUsIDB4QTUsIDB4MTAsIDB4MkQsIDB4MEYsIDB4QkYsIDB4MEEsIDB4N0IsIDB4MDUsIDB4N0QsCi0JMHgwMSwgMHhBOCwgMHhGRiwgMHg3QSwgMHhGRiwgMHhENiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweENBLCAweEZGLCAweDcyLCAweEZGLCAweEM5LCAweEZGLCAweEU4LCAweDAxLCAweDI5LCAweDA2LCAweDczLAotCTB4MEIsIDB4OTYsIDB4MEYsIDB4OEQsIDB4MTAsIDB4REIsIDB4MEQsIDB4REIsIDB4MDgsIDB4RDgsIDB4MDMsCi0JMHg5OCwgMHgwMCwgMHg3NiwgMHhGRiwgMHg5OSwgMHhGRiwgMHhFRSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBOCwKLQkweEZGLCAweDZFLCAweEZGLCAweDRBLCAweDAwLCAweDMxLCAweDAzLCAweDAzLCAweDA4LCAweDJCLCAweDBELAotCTB4NUIsIDB4MTAsIDB4RkIsIDB4MEYsIDB4M0MsIDB4MEMsIDB4RjcsIDB4MDYsIDB4NzEsIDB4MDIsIDB4RkEsCi0JMHhGRiwgMHg2RCwgMHhGRiwgMHhCQywgMHhGRiwgMHhGQywgMHhGRiwgMHhFMiwgMHhGRiwgMHg4NywgMHhGRiwKLQkweDhDLCAweEZGLCAweDBGLCAweDAxLCAweEJCLCAweDA0LCAweEVBLCAweDA5LCAweEEyLCAweDBFLCAweEE5LAotCTB4MTAsIDB4RjksIDB4MEUsIDB4NkMsIDB4MEEsIDB4MkYsIDB4MDUsIDB4NTAsIDB4MDEsIDB4OUMsIDB4RkYsCi0JMHg3RiwgMHhGRiwgMHhEQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNSwgMHhGRiwgMHg3MCwKLQkweEZGLCAweERCLCAweEZGLCAweDFDLCAweDAyLCAweDc5LCAweDA2LCAweEMzLCAweDBCLCAweEMwLCAweDBGLAotCTB4N0MsIDB4MTAsIDB4OTgsIDB4MEQsIDB4ODYsIDB4MDgsIDB4OTUsIDB4MDMsIDB4NzgsIDB4MDAsIDB4NzIsCi0JMHhGRiwgMHg5RiwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGMywgMHhGRiwgMHhBMiwgMHhGRiwgMHg3MCwgMHhGRiwKLQkweDY3LCAweDAwLCAweDcxLCAweDAzLCAweDU3LCAweDA4LCAweDcxLCAweDBELCAweDcxLCAweDEwLCAweEQ2LAotCTB4MEYsIDB4RUYsIDB4MEIsIDB4QTYsIDB4MDYsIDB4M0EsIDB4MDIsIDB4RTYsIDB4RkYsIDB4NkUsIDB4RkYsCi0JMHhDMSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhERCwgMHhGRiwgMHg4MSwgMHhGRiwgMHg5NiwKLQkweEZGLCAweDM4LCAweDAxLCAweDA1LCAweDA1LCAweDNFLCAweDBBLCAweERBLCAweDBFLCAweEFBLCAweDEwLAotCTB4QzIsIDB4MEUsIDB4MTksIDB4MEEsIDB4RTQsIDB4MDQsIDB4MjUsIDB4MDEsIDB4OTEsIDB4RkYsIDB4ODQsCi0JMHhGRiwgMHhERiwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRiwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFRiwgMHhGRiwKLQkweDUyLCAweDAyLCAweENBLCAweDA2LCAweDExLCAweDBDLCAweEU2LCAweDBGLCAweDY4LCAweDEwLCAweDUyLAotCTB4MEQsIDB4MzIsIDB4MDgsIDB4NTQsIDB4MDMsIDB4NUEsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTUsIDB4RkYsCi0JMHhGNCwgMHhGRiwgMHhGMCwgMHhGRiwgMHg5QywgMHhGRiwgMHg3NCwgMHhGRiwgMHg4NiwgMHgwMCwgMHhCMywKLQkweDAzLCAweEFDLCAweDA4LCAweEI2LCAweDBELCAweDg0LCAweDEwLCAweEFELCAweDBGLCAweEEwLCAweDBCLAotCTB4NTUsIDB4MDYsIDB4MDUsIDB4MDIsIDB4RDMsIDB4RkYsIDB4NzEsIDB4RkYsIDB4QzcsIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRiwgMHg3RCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NCwgMHgwMSwKLQkweDUwLCAweDA1LCAweDkxLCAweDBBLCAweDEwLCAweDBGLCAweEE4LCAweDEwLCAweDg4LCAweDBFLCAweEM1LAotCTB4MDksIDB4OUIsIDB4MDQsIDB4RkQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4ODksIDB4RkYsIDB4RTQsIDB4RkYsCi0JMHhGQiwgMHhGRiwgMHhCOSwgMHhGRiwgMHg2QywgMHhGRiwgMHgwNCwgMHgwMCwgMHg4QSwgMHgwMiwgMHgxQywKLQkweDA3LCAweDVFLCAweDBDLCAweDBBLCAweDEwLCAweDUwLCAweDEwLCAweDBCLCAweDBELCAweERFLCAweDA3LAotCTB4MTUsIDB4MDMsIDB4M0UsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUIsIDB4RkYsIDB4RjYsIDB4RkYsIDB4RUMsCi0JMHhGRiwgMHg5NiwgMHhGRiwgMHg3OCwgMHhGRiwgMHhBNywgMHgwMCwgMHhGNiwgMHgwMywgMHgwMCwgMHgwOSwKLQkweEY4LCAweDBELCAweDkzLCAweDEwLCAweDgyLCAweDBGLCAweDUwLCAweDBCLCAweDA2LCAweDA2LCAweEQyLAotCTB4MDEsIDB4QzIsIDB4RkYsIDB4NzQsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHhENCwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5RCwgMHgwNSwgMHhFMywKLQkweDBBLCAweDQzLCAweDBGLCAweEExLCAweDEwLCAweDRDLCAweDBFLCAweDcxLCAweDA5LCAweDUzLCAweDA0LAotCTB4RDcsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjMsCi0JMHhGRiwgMHg2QywgMHhGRiwgMHgxQywgMHgwMCwgMHhDNCwgMHgwMiwgMHg2RiwgMHgwNywgMHhBQSwgMHgwQywKLQkweDJBLCAweDEwLCAweDM0LCAweDEwLCAweEMyLCAweDBDLCAweDhBLCAweDA3LCAweEQ4LCAweDAyLCAweDI0LAotCTB4MDAsIDB4NkMsIDB4RkYsIDB4QjEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTAsIDB4RkYsCi0JMHg3RSwgMHhGRiwgMHhDQiwgMHgwMCwgMHgzQiwgMHgwNCwgMHg1NSwgMHgwOSwgMHgzNywgMHgwRSwgMHg5RSwKLQkweDEwLCAweDUzLCAweDBGLCAweEZGLCAweDBBLCAweEI3LCAweDA1LCAweEExLCAweDAxLCAweEIzLCAweEZGLAotCTB4NzcsIDB4RkYsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4NzUsCi0JMHhGRiwgMHhCRCwgMHhGRiwgMHhDMSwgMHgwMSwgMHhFQiwgMHgwNSwgMHgzNSwgMHgwQiwgMHg3MywgMHgwRiwKLQkweDk3LCAweDEwLCAweDBELCAweDBFLCAweDFDLCAweDA5LCAweDBELCAweDA0LCAweEIzLCAweDAwLCAweDdBLAotCTB4RkYsIDB4OTQsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4QUQsIDB4RkYsIDB4NkQsIDB4RkYsCi0JMHgzNSwgMHgwMCwgMHgwMSwgMHgwMywgMHhDMiwgMHgwNywgMHhGMywgMHgwQywgMHg0NywgMHgxMCwgMHgxNSwKLQkweDEwLCAweDc4LCAweDBDLCAweDM3LCAweDA3LCAweDlELCAweDAyLCAweDBDLCAweDAwLCAweDZDLCAweEZGLAotCTB4QjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RjAsCi0JMHgwMCwgMHg4MywgMHgwNCwgMHhBOSwgMHgwOSwgMHg3NCwgMHgwRSwgMHhBNiwgMHgxMCwgMHgyMSwgMHgwRiwKLQkweEFELCAweDBBLCAweDZBLCAweDA1LCAweDczLCAweDAxLCAweEE1LCAweEZGLCAweDdCLCAweEZGLCAweEQ3LAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzksIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0QsIDB4RkYsCi0JMHhGNCwgMHgwMSwgMHgzQiwgMHgwNiwgMHg4NSwgMHgwQiwgMHg5RiwgMHgwRiwgMHg4OSwgMHgxMCwgMHhDQywKLQkweDBELCAweEM4LCAweDA4LCAweEM5LCAweDAzLCAweDkxLCAweDAwLCAweDc1LCAweEZGLCAweDlBLCAweEZGLAotCTB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NkUsIDB4RkYsIDB4NTAsIDB4MDAsIDB4M0YsCi0JMHgwMywgMHgxNiwgMHgwOCwgMHgzQiwgMHgwRCwgMHg2MCwgMHgxMCwgMHhGMywgMHgwRiwgMHgyQiwgMHgwQywKLQkweEU1LCAweDA2LCAweDY1LCAweDAyLCAweEY2LCAweEZGLCAweDZELCAweEZGLCAweEJELCAweEZGLCAweEZDLAotCTB4RkYsIDB4RTEsIDB4RkYsIDB4ODUsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MTgsIDB4MDEsIDB4Q0IsIDB4MDQsCi0JMHhGRCwgMHgwOSwgMHhBRiwgMHgwRSwgMHhBQSwgMHgxMCwgMHhFRCwgMHgwRSwgMHg1QSwgMHgwQSwgMHgxRSwKLQkweDA1LCAweDQ2LCAweDAxLCAweDlBLCAweEZGLCAweDgwLCAweEZGLCAweERDLCAweEZGLCAweDAwLCAweDAwLAotCTB4RkQsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDIsIDB4OEIsCi0JMHgwNiwgMHhENSwgMHgwQiwgMHhDOSwgMHgwRiwgMHg3OCwgMHgxMCwgMHg4OCwgMHgwRCwgMHg3MywgMHgwOCwKLQkweDg2LCAweDAzLCAweDcxLCAweDAwLCAweDcxLCAweEZGLCAweEEwLCAweEZGLCAweEYyLCAweEZGLCAweEYyLAotCTB4RkYsIDB4QTEsIDB4RkYsIDB4NzEsIDB4RkYsIDB4NkUsIDB4MDAsIDB4N0YsIDB4MDMsIDB4NkEsIDB4MDgsCi0JMHg4MSwgMHgwRCwgMHg3NiwgMHgxMCwgMHhDRCwgMHgwRiwgMHhERCwgMHgwQiwgMHg5NCwgMHgwNiwgMHgyRSwKLQkweDAyLCAweEUxLCAweEZGLCAweDZGLCAweEZGLCAweEMzLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLAotCTB4REMsIDB4RkYsIDB4ODAsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDIsIDB4MDEsIDB4MTYsIDB4MDUsIDB4NTAsCi0JMHgwQSwgMHhFNywgMHgwRSwgMHhBQSwgMHgxMCwgMHhCNSwgMHgwRSwgMHgwNiwgMHgwQSwgMHhEMywgMHgwNCwKLQkweDFDLCAweDAxLCAweDhGLCAweEZGLCAweDg1LCAweEZGLCAweEUwLCAweEZGLCAweEZDLCAweEZGLCAweEJFLAotCTB4RkYsIDB4NkQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4NUUsIDB4MDIsIDB4REMsIDB4MDYsIDB4MjMsIDB4MEMsCi0JMHhFRiwgMHgwRiwgMHg2MywgMHgxMCwgMHg0MywgMHgwRCwgMHgxRiwgMHgwOCwgMHg0NiwgMHgwMywgMHg1MywKLQkweDAwLCAweDZFLCAweEZGLCAweEE2LCAweEZGLCAweEY0LCAweEZGLCAweEVGLCAweEZGLCAweDlCLCAweEZGLAotCTB4NzUsIDB4RkYsIDB4OEQsIDB4MDAsIDB4QzEsIDB4MDMsIDB4QkUsIDB4MDgsIDB4QzQsIDB4MEQsIDB4ODgsCi0JMHgxMCwgMHhBNCwgMHgwRiwgMHg4RSwgMHgwQiwgMHg0MywgMHgwNiwgMHhGOSwgMHgwMSwgMHhDRiwgMHhGRiwKLQkweDcxLCAweEZGLCAweEM4LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ4LCAweEZGLCAweDdDLAotCTB4RkYsIDB4QTQsIDB4RkYsIDB4NkUsIDB4MDEsIDB4NjEsIDB4MDUsIDB4QTMsIDB4MEEsIDB4MUMsIDB4MEYsCi0JMHhBNywgMHgxMCwgMHg3QiwgMHgwRSwgMHhCMiwgMHgwOSwgMHg4QiwgMHgwNCwgMHhGNCwgMHgwMCwgMHg4NiwKLQkweEZGLCAweDhBLCAweEZGLCAweEU0LCAweEZGLCAweEZBLCAweEZGLCAweEI4LCAweEZGLCAweDZDLCAweEZGLAotCTB4MDksIDB4MDAsIDB4OTcsIDB4MDIsIDB4MkUsIDB4MDcsIDB4NkYsIDB4MEMsIDB4MTEsIDB4MTAsIDB4NEEsCi0JMHgxMCwgMHhGQiwgMHgwQywgMHhDQiwgMHgwNywgMHgwNywgMHgwMywgMHgzOCwgMHgwMCwgMHg2RCwgMHhGRiwKLQkweEFDLCAweEZGLCAweEY3LCAweEZGLCAweEVDLCAweEZGLCAweDk1LCAweEZGLCAweDc5LCAweEZGLCAweEFGLAotCTB4MDAsIDB4MDUsIDB4MDQsIDB4MTMsIDB4MDksIDB4MDYsIDB4MEUsIDB4OTYsIDB4MTAsIDB4NzgsIDB4MEYsCi0JMHgzRSwgMHgwQiwgMHhGNCwgMHgwNSwgMHhDNywgMHgwMSwgMHhCRiwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDRSwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQyLCAweEZGLCAweDc4LCAweEZGLCAweEIxLCAweEZGLAotCTB4OUMsIDB4MDEsIDB4QUUsIDB4MDUsIDB4RjYsIDB4MEEsIDB4NEUsIDB4MEYsIDB4OUYsIDB4MTAsIDB4M0UsCi0JMHgwRSwgMHg1RSwgMHgwOSwgMHg0MywgMHgwNCwgMHhDRiwgMHgwMCwgMHg3RiwgMHhGRiwgMHg5MCwgMHhGRiwKLQkweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIyLCAweEZGLCAweDZDLCAweEZGLCAweDIxLCAweDAwLCAweEQyLAotCTB4MDIsIDB4ODEsIDB4MDcsIDB4QkEsIDB4MEMsIDB4MzEsIDB4MTAsIDB4MkUsIDB4MTAsIDB4QjIsIDB4MEMsCi0JMHg3OCwgMHgwNywgMHhDQiwgMHgwMiwgMHgxRSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMiwgMHhGRiwgMHhGOSwKLQkweEZGLCAweEU4LCAweEZGLCAweDhGLCAweEZGLCAweDgwLCAweEZGLCAweEQzLCAweDAwLCAweDRCLCAweDA0LAotCTB4NjcsIDB4MDksIDB4NDUsIDB4MEUsIDB4QTAsIDB4MTAsIDB4NDgsIDB4MEYsIDB4RUMsIDB4MEEsIDB4QTYsCi0JMHgwNSwgMHg5NywgMHgwMSwgMHhCMCwgMHhGRiwgMHg3OCwgMHhGRiwgMHhEMywgMHhGRiwgMHgwMCwgMHgwMCwKLQkweEZGLCAweEZGLCAweENELCAweEZGLCAweDc0LCAweEZGLCAweEMwLCAweEZGLCAweENDLCAweDAxLCAweEZELAotCTB4MDUsIDB4NDcsIDB4MEIsIDB4N0QsIDB4MEYsIDB4OTQsIDB4MTAsIDB4RkYsIDB4MEQsIDB4MEEsIDB4MDksCi0JMHhGRSwgMHgwMywgMHhBQiwgMHgwMCwgMHg3OSwgMHhGRiwgMHg5NSwgMHhGRiwgMHhFQywgMHhGRiwgMHhGNywKLQkweEZGLCAweEFDLCAweEZGLCAweDZELCAweEZGLCAweDNCLCAweDAwLCAweDBFLCAweDAzLCAweEQ1LCAweDA3LAotCTB4MDMsIDB4MEQsIDB4NEQsIDB4MTAsIDB4MEUsIDB4MTAsIDB4NjcsIDB4MEMsIDB4MjUsIDB4MDcsIDB4OTEsCi0JMHgwMiwgMHgwNywgMHgwMCwgMHg2QywgMHhGRiwgMHhCOCwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFNCwgMHhGRiwKLQkweDg5LCAweEZGLCAweDg3LCAweEZGLCAweEY5LCAweDAwLCAweDkzLCAweDA0LCAweEJDLCAweDA5LCAweDgyLAotCTB4MEUsIDB4QTcsIDB4MTAsIDB4MTYsIDB4MEYsIDB4OUEsIDB4MEEsIDB4NTksIDB4MDUsIDB4NjksIDB4MDEsCi0JMHhBMywgMHhGRiwgMHg3QywgMHhGRiwgMHhEOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDOCwKLQkweEZGLCAweDcxLCAweEZGLCAweEQxLCAweEZGLCAweEZGLCAweDAxLCAweDRDLCAweDA2LCAweDk3LCAweDBCLAotCTB4QTksIDB4MEYsIDB4ODYsIDB4MTAsIDB4QkQsIDB4MEQsIDB4QjUsIDB4MDgsIDB4QkEsIDB4MDMsIDB4OEEsCi0JMHgwMCwgMHg3NCwgMHhGRiwgMHg5QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNSwgMHhGRiwKLQkweDZGLCAweEZGLCAweDU3LCAweDAwLCAweDRELCAweDAzLCAweDI5LCAweDA4LCAweDRCLCAweDBELCAweDY1LAotCTB4MTAsIDB4RUIsIDB4MEYsIDB4MUEsIDB4MEMsIDB4RDMsIDB4MDYsIDB4NTgsIDB4MDIsIDB4RjEsIDB4RkYsCi0JMHg2RCwgMHhGRiwgMHhCRSwgMHhGRiwgMHhGQywgMHhGRiwgMHhFMCwgMHhGRiwgMHg4NCwgMHhGRiwgMHg5MCwKLQkweEZGLCAweDIxLCAweDAxLCAweERDLCAweDA0LCAweDEwLCAweDBBLCAweEJCLCAweDBFLCAweEFBLCAweDEwLAotCTB4RTEsIDB4MEUsIDB4NDcsIDB4MEEsIDB4MEQsIDB4MDUsIDB4M0QsIDB4MDEsIDB4OTcsIDB4RkYsIDB4ODEsCi0JMHhGRiwgMHhERCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMiwgMHhGRiwgMHg2RiwgMHhGRiwKLQkweEU0LCAweEZGLCAweDM0LCAweDAyLCAweDlELCAweDA2LCAweEU2LCAweDBCLCAweEQxLCAweDBGLCAweDczLAotCTB4MTAsIDB4NzksIDB4MEQsIDB4NjEsIDB4MDgsIDB4NzgsIDB4MDMsIDB4NkEsIDB4MDAsIDB4NzAsIDB4RkYsCi0JMHhBMSwgMHhGRiwgMHhGMiwgMHhGRiwgMHhGMSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3NCwKLQkweDAwLCAweDhFLCAweDAzLCAweDdELCAweDA4LCAweDkwLCAweDBELCAweDdBLCAweDEwLCAweEM0LCAweDBGLAotCTB4Q0MsIDB4MEIsIDB4ODIsIDB4MDYsIDB4MjIsIDB4MDIsIDB4REQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzQsCi0JMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg3RiwgMHhGRiwgMHg5QiwgMHhGRiwKLQkweDRCLCAweDAxLCAweDI2LCAweDA1LCAweDYzLCAweDBBLCAweEYzLCAweDBFLCAweEFBLCAweDEwLCAweEE4LAotCTB4MEUsIDB4RjQsIDB4MDksIDB4QzMsIDB4MDQsIDB4MTMsIDB4MDEsIDB4OEQsIDB4RkYsIDB4ODYsIDB4RkYsCi0JMHhFMSwgMHhGRiwgMHhGQywgMHhGRiwgMHhCQywgMHhGRiwgMHg2RCwgMHhGRiwgMHhGOCwgMHhGRiwgMHg2QiwKLQkweDAyLCAweEVFLCAweDA2LCAweDM0LCAweDBDLCAweEY3LCAweDBGLCAweDVELCAweDEwLCAweDMzLCAweDBELAotCTB4MEQsIDB4MDgsIDB4MzgsIDB4MDMsIDB4NEQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4RjUsCi0JMHhGRiwgMHhFRSwgMHhGRiwgMHg5OSwgMHhGRiwgMHg3NiwgMHhGRiwgMHg5NCwgMHgwMCwgMHhEMCwgMHgwMywKLQkweEQxLCAweDA4LCAweEQzLCAweDBELCAweDhCLCAweDEwLCAweDlBLCAweDBGLCAweDdDLCAweDBCLCAweDMyLAotCTB4MDYsIDB4RUUsIDB4MDEsIDB4Q0IsIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgwMCwgMHgwMCwgMHhENiwgMHhGRiwgMHg3QiwgMHhGRiwgMHhBNywgMHhGRiwgMHg3OCwgMHgwMSwgMHg3MiwKLQkweDA1LCAweEI2LCAweDBBLCAweDI3LCAweDBGLCAweEE1LCAweDEwLCAweDZFLCAweDBFLCAweEEwLCAweDA5LAotCTB4N0IsIDB4MDQsIDB4RUMsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4RTUsIDB4RkYsIDB4RkEsCi0JMHhGRiwgMHhCNiwgMHhGRiwgMHg2QywgMHhGRiwgMHgwRSwgMHgwMCwgMHhBNCwgMHgwMiwgMHg0MSwgMHgwNywKLQkweDgwLCAweDBDLCAweDE5LCAweDEwLCAweDQ0LCAweDEwLCAweEVCLCAweDBDLCAweEI5LCAweDA3LCAweEZBLAotCTB4MDIsIDB4MzIsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUIsIDB4RkYsCi0JMHg5MywgMHhGRiwgMHg3QiwgMHhGRiwgMHhCNywgMHgwMCwgMHgxNSwgMHgwNCwgMHgyNiwgMHgwOSwgMHgxNCwKLQkweDBFLCAweDk4LCAweDEwLCAweDZELCAweDBGLCAweDJDLCAweDBCLCAweEUzLCAweDA1LCAweEJDLCAweDAxLAotCTB4QkIsIDB4RkYsIDB4NzUsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDEsCi0JMHhGRiwgMHg3NywgMHhGRiwgMHhCNSwgMHhGRiwgMHhBNiwgMHgwMSwgMHhDMCwgMHgwNSwgMHgwOCwgMHgwQiwKLQkweDU4LCAweDBGLCAweDlELCAweDEwLCAweDMwLCAweDBFLCAweDRCLCAweDA5LCAweDM0LCAweDA0LCAweEM2LAotCTB4MDAsIDB4N0QsIDB4RkYsIDB4OTEsIDB4RkYsIDB4RTksIDB4RkYsIDB4RjgsIDB4RkYsIDB4QjAsIDB4RkYsCi0JMHg2QywgMHhGRiwgMHgyNywgMHgwMCwgMHhERiwgMHgwMiwgMHg5NCwgMHgwNywgMHhDQSwgMHgwQywgMHgzNywKLQkweDEwLCAweDI3LCAweDEwLCAweEExLCAweDBDLCAweDY1LCAweDA3LCAweEJFLCAweDAyLCAweDE5LCAweDAwLAotCTB4NkMsIDB4RkYsIDB4QjQsIDB4RkYsIDB4RjksIDB4RkYsIDB4RTcsIDB4RkYsIDB4OEUsIDB4RkYsIDB4ODEsCi0JMHhGRiwgMHhEQiwgMHgwMCwgMHg1QiwgMHgwNCwgMHg3QSwgMHgwOSwgMHg1MywgMHgwRSwgMHhBMiwgMHgxMCwKLQkweDNELCAweDBGLCAweERBLCAweDBBLCAweDk1LCAweDA1LCAweDhDLCAweDAxLCAweEFELCAweEZGLCAweDc5LAotCTB4RkYsIDB4RDQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4NzMsIDB4RkYsCi0JMHhDNCwgMHhGRiwgMHhENywgMHgwMSwgMHgwRSwgMHgwNiwgMHg1OSwgMHgwQiwgMHg4NywgMHgwRiwgMHg5MSwKLQkweDEwLCAweEYwLCAweDBELCAweEY3LCAweDA4LCAweEVGLCAweDAzLCAweEEzLCAweDAwLCAweDc4LCAweEZGLAotCTB4OTcsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4QUEsIDB4RkYsIDB4NkQsIDB4RkYsIDB4NDEsCi0JMHgwMCwgMHgxQywgMHgwMywgMHhFNywgMHgwNywgMHgxMywgMHgwRCwgMHg1MiwgMHgxMCwgMHgwNiwgMHgxMCwKLQkweDU2LCAweDBDLCAweDEzLCAweDA3LCAweDg0LCAweDAyLCAweDAyLCAweDAwLCAweDZELCAweEZGLCAweEJBLAotCTB4RkYsIDB4RkIsIDB4RkYsIDB4RTMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4ODksIDB4RkYsIDB4MDEsIDB4MDEsCi0JMHhBMywgMHgwNCwgMHhDRSwgMHgwOSwgMHg4RiwgMHgwRSwgMHhBOCwgMHgxMCwgMHgwQSwgMHgwRiwgMHg4OCwKLQkweDBBLCAweDQ4LCAweDA1LCAweDVGLCAweDAxLCAweEEwLCAweEZGLCAweDdELCAweEZGLCAweEQ5LCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzcsIDB4RkYsIDB4NzAsIDB4RkYsIDB4RDUsIDB4RkYsIDB4MEIsCi0JMHgwMiwgMHg1RSwgMHgwNiwgMHhBOSwgMHgwQiwgMHhCMiwgMHgwRiwgMHg4MiwgMHgxMCwgMHhBRSwgMHgwRCwKLQkweEEyLCAweDA4LCAweEFCLCAweDAzLCAweDgyLCAweDAwLCAweDczLCAweEZGLCAweDlELCAweEZGLCAweEYwLAotCTB4RkYsIDB4RjMsIDB4RkYsIDB4QTQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4NUQsIDB4MDAsIDB4NUIsIDB4MDMsCi0JMHgzQiwgMHgwOCwgMHg1QSwgMHgwRCwgMHg2QSwgMHgxMCwgMHhFMiwgMHgwRiwgMHgwOSwgMHgwQywgMHhDMSwKLQkweDA2LCAweDRDLCAweDAyLCAweEVDLCAweEZGLCAweDZFLCAweEZGLCAweEMwLCAweEZGLCAweEZDLCAweEZGLAotCTB4REYsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4MkEsIDB4MDEsIDB4RUMsIDB4MDQsIDB4MjIsCi0JMHgwQSwgMHhDOCwgMHgwRSwgMHhBQiwgMHgxMCwgMHhENCwgMHgwRSwgMHgzNSwgMHgwQSwgMHhGRCwgMHgwNCwKLQkweDMzLCAweDAxLCAweDk1LCAweEZGLCAweDgyLCAweEZGLCAweERFLCAweEZGLCAweDAwLCAweDAwLCAweEZELAotCTB4RkYsIDB4QzEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RTgsIDB4RkYsIDB4NDAsIDB4MDIsIDB4QUYsIDB4MDYsCi0JMHhGNywgMHgwQiwgMHhEQSwgMHgwRiwgMHg2RiwgMHgxMCwgMHg2QSwgMHgwRCwgMHg0RSwgMHgwOCwgMHg2QSwKLQkweDAzLCAweDY0LCAweDAwLCAweDcwLCAweEZGLCAweEEzLCAweEZGLCAweEYzLCAweEZGLCAweEYxLCAweEZGLAotCTB4OUUsIDB4RkYsIDB4NzIsIDB4RkYsIDB4N0IsIDB4MDAsIDB4OUMsIDB4MDMsIDB4OTAsIDB4MDgsIDB4OUYsCi0JMHgwRCwgMHg3RSwgMHgxMCwgMHhCQiwgMHgwRiwgMHhCQSwgMHgwQiwgMHg3MCwgMHgwNiwgMHgxNiwgMHgwMiwKLQkweEQ5LCAweEZGLCAweDcwLCAweEZGLCAweEM1LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERBLAotCTB4RkYsIDB4N0UsIDB4RkYsIDB4OUQsIDB4RkYsIDB4NTUsIDB4MDEsIDB4MzcsIDB4MDUsIDB4NzUsIDB4MEEsCi0JMHhGRiwgMHgwRSwgMHhBOSwgMHgxMCwgMHg5QywgMHgwRSwgMHhFMSwgMHgwOSwgMHhCMywgMHgwNCwgMHgwQSwKLQkweDAxLCAweDhCLCAweEZGLCAweDg3LCAweEZGLCAweEUyLCAweEZGLCAweEZCLCAweEZGLCAweEJCLCAweEZGLAotCTB4NkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4NzcsIDB4MDIsIDB4MDEsIDB4MDcsIDB4NDUsIDB4MEMsIDB4RkYsCi0JMHgwRiwgMHg1OCwgMHgxMCwgMHgyMywgMHgwRCwgMHhGQSwgMHgwNywgMHgyQSwgMHgwMywgMHg0NywgMHgwMCwKLQkweDZFLCAweEZGLCAweEE5LCAweEZGLCAweEY1LCAweEZGLCAweEVELCAweEZGLCAweDk4LCAweEZGLCAweDc3LAotCTB4RkYsIDB4OUMsIDB4MDAsIDB4REYsIDB4MDMsIDB4RTQsIDB4MDgsIDB4RTIsIDB4MEQsIDB4OEUsIDB4MTAsCi0JMHg5MSwgMHgwRiwgMHg2QiwgMHgwQiwgMHgyMCwgMHgwNiwgMHhFMywgMHgwMSwgMHhDOCwgMHhGRiwgMHg3MywKLQkweEZGLCAweENCLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQ1LCAweEZGLCAweDdBLCAweEZGLAotCTB4QUEsIDB4RkYsIDB4ODIsIDB4MDEsIDB4ODMsIDB4MDUsIDB4QzgsIDB4MEEsIDB4MzIsIDB4MEYsIDB4QTQsCi0JMHgxMCwgMHg2MCwgMHgwRSwgMHg4RCwgMHgwOSwgMHg2QiwgMHgwNCwgMHhFMywgMHgwMCwgMHg4MywgMHhGRiwKLQkweDhELCAweEZGLCAweEU2LCAweEZGLCAweEZBLCAweEZGLCAweEI1LCAweEZGLCAweDZDLCAweEZGLCAweDE0LAotCTB4MDAsIDB4QjEsIDB4MDIsIDB4NTMsIDB4MDcsIDB4OTEsIDB4MEMsIDB4MjAsIDB4MTAsIDB4M0UsIDB4MTAsCi0JMHhEQiwgMHgwQywgMHhBNiwgMHgwNywgMHhFQywgMHgwMiwgMHgyQywgMHgwMCwgMHg2QywgMHhGRiwgMHhBRiwKLQkweEZGLCAweEY4LCAweEZGLCAweEVBLCAweEZGLCAweDkyLCAweEZGLCAweDdDLCAweEZGLCAweEJFLCAweDAwLAotCTB4MjQsIDB4MDQsIDB4MzgsIDB4MDksIDB4MjIsIDB4MEUsIDB4OUIsIDB4MTAsIDB4NjMsIDB4MEYsIDB4MUEsCi0JMHgwQiwgMHhEMSwgMHgwNSwgMHhCMSwgMHgwMSwgMHhCOCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhEMCwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQwLCAweEZGLCAweDc2LCAweEZGLCAweEI4LCAweEZGLCAweEIxLAotCTB4MDEsIDB4RDEsIDB4MDUsIDB4MUEsIDB4MEIsIDB4NjMsIDB4MEYsIDB4OUIsIDB4MTAsIDB4MjIsIDB4MEUsCi0JMHgzOCwgMHgwOSwgMHgyNCwgMHgwNCwgMHhCRSwgMHgwMCwgMHg3QywgMHhGRiwgMHg5MiwgMHhGRiwgMHhFQSwKLQkweEZGLCAweEY4LCAweEZGLCAweEFGLCAweEZGLCAweDZDLCAweEZGLCAweDJDLCAweDAwLCAweEVDLCAweDAyLAotCTB4QTYsIDB4MDcsIDB4REIsIDB4MEMsIDB4M0UsIDB4MTAsIDB4MjAsIDB4MTAsIDB4OTEsIDB4MEMsIDB4NTMsCi0JMHgwNywgMHhCMSwgMHgwMiwgMHgxNCwgMHgwMCwgMHg2QywgMHhGRiwgMHhCNSwgMHhGRiwgMHhGQSwgMHhGRiwKLQkweEU2LCAweEZGLCAweDhELCAweEZGLCAweDgzLCAweEZGLCAweEUzLCAweDAwLCAweDZCLCAweDA0LCAweDhELAotCTB4MDksIDB4NjAsIDB4MEUsIDB4QTQsIDB4MTAsIDB4MzIsIDB4MEYsIDB4QzgsIDB4MEEsIDB4ODMsIDB4MDUsCi0JMHg4MiwgMHgwMSwgMHhBQSwgMHhGRiwgMHg3QSwgMHhGRiwgMHhENSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwKLQkweEZGLCAweENCLCAweEZGLCAweDczLCAweEZGLCAweEM4LCAweEZGLCAweEUzLCAweDAxLCAweDIwLCAweDA2LAotCTB4NkIsIDB4MEIsIDB4OTEsIDB4MEYsIDB4OEUsIDB4MTAsIDB4RTIsIDB4MEQsIDB4RTQsIDB4MDgsIDB4REYsCi0JMHgwMywgMHg5QywgMHgwMCwgMHg3NywgMHhGRiwgMHg5OCwgMHhGRiwgMHhFRCwgMHhGRiwgMHhGNSwgMHhGRiwKLQkweEE5LCAweEZGLCAweDZFLCAweEZGLCAweDQ3LCAweDAwLCAweDJBLCAweDAzLCAweEZBLCAweDA3LCAweDIzLAotCTB4MEQsIDB4NTgsIDB4MTAsIDB4RkYsIDB4MEYsIDB4NDUsIDB4MEMsIDB4MDEsIDB4MDcsIDB4NzcsIDB4MDIsCi0JMHhGRCwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFMiwgMHhGRiwgMHg4NywKLQkweEZGLCAweDhCLCAweEZGLCAweDBBLCAweDAxLCAweEIzLCAweDA0LCAweEUxLCAweDA5LCAweDlDLCAweDBFLAotCTB4QTksIDB4MTAsIDB4RkYsIDB4MEUsIDB4NzUsIDB4MEEsIDB4MzcsIDB4MDUsIDB4NTUsIDB4MDEsIDB4OUQsCi0JMHhGRiwgMHg3RSwgMHhGRiwgMHhEQSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNSwgMHhGRiwKLQkweDcwLCAweEZGLCAweEQ5LCAweEZGLCAweDE2LCAweDAyLCAweDcwLCAweDA2LCAweEJBLCAweDBCLCAweEJCLAotCTB4MEYsIDB4N0UsIDB4MTAsIDB4OUYsIDB4MEQsIDB4OTAsIDB4MDgsIDB4OUMsIDB4MDMsIDB4N0IsIDB4MDAsCi0JMHg3MiwgMHhGRiwgMHg5RSwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGMywgMHhGRiwgMHhBMywgMHhGRiwgMHg3MCwKLQkweEZGLCAweDY0LCAweDAwLCAweDZBLCAweDAzLCAweDRFLCAweDA4LCAweDZBLCAweDBELCAweDZGLCAweDEwLAotCTB4REEsIDB4MEYsIDB4RjcsIDB4MEIsIDB4QUYsIDB4MDYsIDB4NDAsIDB4MDIsIDB4RTgsIDB4RkYsIDB4NkUsCi0JMHhGRiwgMHhDMSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhERSwgMHhGRiwgMHg4MiwgMHhGRiwKLQkweDk1LCAweEZGLCAweDMzLCAweDAxLCAweEZELCAweDA0LCAweDM1LCAweDBBLCAweEQ0LCAweDBFLCAweEFCLAotCTB4MTAsIDB4QzgsIDB4MEUsIDB4MjIsIDB4MEEsIDB4RUMsIDB4MDQsIDB4MkEsIDB4MDEsIDB4OTMsIDB4RkYsCi0JMHg4MywgMHhGRiwgMHhERiwgMHhGRiwgMHhGQywgMHhGRiwgMHhDMCwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFQywKLQkweEZGLCAweDRDLCAweDAyLCAweEMxLCAweDA2LCAweDA5LCAweDBDLCAweEUyLCAweDBGLCAweDZBLCAweDEwLAotCTB4NUEsIDB4MEQsIDB4M0IsIDB4MDgsIDB4NUIsIDB4MDMsIDB4NUQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTQsCi0JMHhGRiwgMHhGMywgMHhGRiwgMHhGMCwgMHhGRiwgMHg5RCwgMHhGRiwgMHg3MywgMHhGRiwgMHg4MiwgMHgwMCwKLQkweEFCLCAweDAzLCAweEEyLCAweDA4LCAweEFFLCAweDBELCAweDgyLCAweDEwLCAweEIyLCAweDBGLCAweEE5LAotCTB4MEIsIDB4NUUsIDB4MDYsIDB4MEIsIDB4MDIsIDB4RDUsIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzcsIDB4RkYsCi0JMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRiwgMHg3RCwgMHhGRiwgMHhBMCwgMHhGRiwgMHg1RiwKLQkweDAxLCAweDQ4LCAweDA1LCAweDg4LCAweDBBLCAweDBBLCAweDBGLCAweEE4LCAweDEwLCAweDhGLCAweDBFLAotCTB4Q0UsIDB4MDksIDB4QTMsIDB4MDQsIDB4MDEsIDB4MDEsIDB4ODksIDB4RkYsIDB4ODgsIDB4RkYsIDB4RTMsCi0JMHhGRiwgMHhGQiwgMHhGRiwgMHhCQSwgMHhGRiwgMHg2RCwgMHhGRiwgMHgwMiwgMHgwMCwgMHg4NCwgMHgwMiwKLQkweDEzLCAweDA3LCAweDU2LCAweDBDLCAweDA2LCAweDEwLCAweDUyLCAweDEwLCAweDEzLCAweDBELCAweEU3LAotCTB4MDcsIDB4MUMsIDB4MDMsIDB4NDEsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUEsIDB4RkYsIDB4RjYsIDB4RkYsCi0JMHhFRCwgMHhGRiwgMHg5NywgMHhGRiwgMHg3OCwgMHhGRiwgMHhBMywgMHgwMCwgMHhFRiwgMHgwMywgMHhGNywKLQkweDA4LCAweEYwLCAweDBELCAweDkxLCAweDEwLCAweDg3LCAweDBGLCAweDU5LCAweDBCLCAweDBFLCAweDA2LAotCTB4RDcsIDB4MDEsIDB4QzQsIDB4RkYsIDB4NzMsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsCi0JMHgwMCwgMHhENCwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRCwgMHhGRiwgMHg4QywgMHgwMSwgMHg5NSwgMHgwNSwKLQkweERBLCAweDBBLCAweDNELCAweDBGLCAweEEyLCAweDEwLCAweDUzLCAweDBFLCAweDdBLCAweDA5LCAweDVCLAotCTB4MDQsIDB4REIsIDB4MDAsIDB4ODEsIDB4RkYsIDB4OEUsIDB4RkYsIDB4RTcsIDB4RkYsIDB4RjksIDB4RkYsCi0JMHhCNCwgMHhGRiwgMHg2QywgMHhGRiwgMHgxOSwgMHgwMCwgMHhCRSwgMHgwMiwgMHg2NSwgMHgwNywgMHhBMSwKLQkweDBDLCAweDI3LCAweDEwLCAweDM3LCAweDEwLCAweENBLCAweDBDLCAweDk0LCAweDA3LCAweERGLCAweDAyLAotCTB4MjcsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjAsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTEsCi0JMHhGRiwgMHg3RCwgMHhGRiwgMHhDNiwgMHgwMCwgMHgzNCwgMHgwNCwgMHg0QiwgMHgwOSwgMHgzMCwgMHgwRSwKLQkweDlELCAweDEwLCAweDU4LCAweDBGLCAweDA4LCAweDBCLCAweEMwLCAweDA1LCAweEE2LCAweDAxLCAweEI1LAotCTB4RkYsIDB4NzcsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsCi0JMHg3NSwgMHhGRiwgMHhCQiwgMHhGRiwgMHhCQywgMHgwMSwgMHhFMywgMHgwNSwgMHgyQywgMHgwQiwgMHg2RCwKLQkweDBGLCAweDk4LCAweDEwLCAweDE0LCAweDBFLCAweDI2LCAweDA5LCAweDE1LCAweDA0LCAweEI3LCAweDAwLAotCTB4N0IsIDB4RkYsIDB4OTMsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4QUUsIDB4RkYsIDB4NkQsCi0JMHhGRiwgMHgzMiwgMHgwMCwgMHhGQSwgMHgwMiwgMHhCOSwgMHgwNywgMHhFQiwgMHgwQywgMHg0NCwgMHgxMCwKLQkweDE5LCAweDEwLCAweDgwLCAweDBDLCAweDQxLCAweDA3LCAweEE0LCAweDAyLCAweDBFLCAweDAwLCAweDZDLAotCTB4RkYsIDB4QjYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4ODUsIDB4RkYsCi0JMHhFQywgMHgwMCwgMHg3QiwgMHgwNCwgMHhBMCwgMHgwOSwgMHg2RSwgMHgwRSwgMHhBNSwgMHgxMCwgMHgyNywKLQkweDBGLCAweEI2LCAweDBBLCAweDcyLCAweDA1LCAweDc4LCAweDAxLCAweEE3LCAweEZGLCAweDdCLCAweEZGLAotCTB4RDYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0IsCi0JMHhGRiwgMHhFRSwgMHgwMSwgMHgzMiwgMHgwNiwgMHg3QywgMHgwQiwgMHg5QSwgMHgwRiwgMHg4QiwgMHgxMCwKLQkweEQzLCAweDBELCAweEQxLCAweDA4LCAweEQwLCAweDAzLCAweDk0LCAweDAwLCAweDc2LCAweEZGLCAweDk5LAotCTB4RkYsIDB4RUUsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NkUsIDB4RkYsIDB4NEQsIDB4MDAsCi0JMHgzOCwgMHgwMywgMHgwRCwgMHgwOCwgMHgzMywgMHgwRCwgMHg1RCwgMHgxMCwgMHhGNywgMHgwRiwgMHgzNCwKLQkweDBDLCAweEVFLCAweDA2LCAweDZCLCAweDAyLCAweEY4LCAweEZGLCAweDZELCAweEZGLCAweEJDLCAweEZGLAotCTB4RkMsIDB4RkYsIDB4RTEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4OEQsIDB4RkYsIDB4MTMsIDB4MDEsIDB4QzMsCi0JMHgwNCwgMHhGNCwgMHgwOSwgMHhBOCwgMHgwRSwgMHhBQSwgMHgxMCwgMHhGMywgMHgwRSwgMHg2MywgMHgwQSwKLQkweDI2LCAweDA1LCAweDRCLCAweDAxLCAweDlCLCAweEZGLCAweDdGLCAweEZGLCAweERCLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4QzQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4REQsIDB4RkYsIDB4MjIsIDB4MDIsCi0JMHg4MiwgMHgwNiwgMHhDQywgMHgwQiwgMHhDNCwgMHgwRiwgMHg3QSwgMHgxMCwgMHg5MCwgMHgwRCwgMHg3RCwKLQkweDA4LCAweDhFLCAweDAzLCAweDc0LCAweDAwLCAweDcyLCAweEZGLCAweDlGLCAweEZGLCAweEYxLCAweEZGLAotCTB4RjIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NzAsIDB4RkYsIDB4NkEsIDB4MDAsIDB4NzgsIDB4MDMsIDB4NjEsCi0JMHgwOCwgMHg3OSwgMHgwRCwgMHg3MywgMHgxMCwgMHhEMSwgMHgwRiwgMHhFNiwgMHgwQiwgMHg5RCwgMHgwNiwKLQkweDM0LCAweDAyLCAweEU0LCAweEZGLCAweDZGLCAweEZGLCAweEMyLCAweEZGLCAweEZELCAweEZGLCAweDAwLAotCTB4MDAsIDB4REQsIDB4RkYsIDB4ODEsIDB4RkYsIDB4OTcsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MEQsIDB4MDUsCi0JMHg0NywgMHgwQSwgMHhFMSwgMHgwRSwgMHhBQSwgMHgxMCwgMHhCQiwgMHgwRSwgMHgxMCwgMHgwQSwgMHhEQywKLQkweDA0LCAweDIxLCAweDAxLCAweDkwLCAweEZGLCAweDg0LCAweEZGLCAweEUwLCAweEZGLCAweEZDLCAweEZGLAotCTB4QkUsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4NTgsIDB4MDIsIDB4RDMsIDB4MDYsIDB4MUEsCi0JMHgwQywgMHhFQiwgMHgwRiwgMHg2NSwgMHgxMCwgMHg0QiwgMHgwRCwgMHgyOSwgMHgwOCwgMHg0RCwgMHgwMywKLQkweDU3LCAweDAwLCAweDZGLCAweEZGLCAweEE1LCAweEZGLCAweEY0LCAweEZGLCAweEVGLCAweEZGLCAweDlCLAotCTB4RkYsIDB4NzQsIDB4RkYsIDB4OEEsIDB4MDAsIDB4QkEsIDB4MDMsIDB4QjUsIDB4MDgsIDB4QkQsIDB4MEQsCi0JMHg4NiwgMHgxMCwgMHhBOSwgMHgwRiwgMHg5NywgMHgwQiwgMHg0QywgMHgwNiwgMHhGRiwgMHgwMSwgMHhEMSwKLQkweEZGLCAweDcxLCAweEZGLCAweEM4LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ4LCAweEZGLAotCTB4N0MsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NjksIDB4MDEsIDB4NTksIDB4MDUsIDB4OUEsIDB4MEEsIDB4MTYsCi0JMHgwRiwgMHhBNywgMHgxMCwgMHg4MiwgMHgwRSwgMHhCQywgMHgwOSwgMHg5MywgMHgwNCwgMHhGOSwgMHgwMCwKLQkweDg3LCAweEZGLCAweDg5LCAweEZGLCAweEU0LCAweEZGLCAweEZCLCAweEZGLCAweEI4LCAweEZGLCAweDZDLAotCTB4RkYsIDB4MDcsIDB4MDAsIDB4OTEsIDB4MDIsIDB4MjUsIDB4MDcsIDB4NjcsIDB4MEMsIDB4MEUsIDB4MTAsCi0JMHg0RCwgMHgxMCwgMHgwMywgMHgwRCwgMHhENSwgMHgwNywgMHgwRSwgMHgwMywgMHgzQiwgMHgwMCwgMHg2RCwKLQkweEZGLCAweEFDLCAweEZGLCAweEY3LCAweEZGLCAweEVDLCAweEZGLCAweDk1LCAweEZGLCAweDc5LCAweEZGLAotCTB4QUIsIDB4MDAsIDB4RkUsIDB4MDMsIDB4MEEsIDB4MDksIDB4RkYsIDB4MEQsIDB4OTQsIDB4MTAsIDB4N0QsCi0JMHgwRiwgMHg0NywgMHgwQiwgMHhGRCwgMHgwNSwgMHhDQywgMHgwMSwgMHhDMCwgMHhGRiwgMHg3NCwgMHhGRiwKLQkweENELCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQzLCAweEZGLCAweDc4LCAweEZGLCAweEIwLAotCTB4RkYsIDB4OTcsIDB4MDEsIDB4QTYsIDB4MDUsIDB4RUMsIDB4MEEsIDB4NDgsIDB4MEYsIDB4QTAsIDB4MTAsCi0JMHg0NSwgMHgwRSwgMHg2NywgMHgwOSwgMHg0QiwgMHgwNCwgMHhEMywgMHgwMCwgMHg4MCwgMHhGRiwgMHg4RiwKLQkweEZGLCAweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIyLCAweEZGLCAweDZDLCAweEZGLCAweDFFLCAweDAwLAotCTB4Q0IsIDB4MDIsIDB4NzgsIDB4MDcsIDB4QjIsIDB4MEMsIDB4MkUsIDB4MTAsIDB4MzEsIDB4MTAsIDB4QkEsCi0JMHgwQywgMHg4MSwgMHgwNywgMHhEMiwgMHgwMiwgMHgyMSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMiwgMHhGRiwKLQkweEY5LCAweEZGLCAweEU4LCAweEZGLCAweDkwLCAweEZGLCAweDdGLCAweEZGLCAweENGLCAweDAwLCAweDQzLAotCTB4MDQsIDB4NUUsIDB4MDksIDB4M0UsIDB4MEUsIDB4OUYsIDB4MTAsIDB4NEUsIDB4MEYsIDB4RjYsIDB4MEEsCi0JMHhBRSwgMHgwNSwgMHg5QywgMHgwMSwgMHhCMSwgMHhGRiwgMHg3OCwgMHhGRiwgMHhEMiwgMHhGRiwgMHhGRiwKLQkweEZGLCAweEZGLCAweEZGLCAweENFLCAweEZGLCAweDc0LCAweEZGLCAweEJGLCAweEZGLCAweEM3LCAweDAxLAotCTB4RjQsIDB4MDUsIDB4M0UsIDB4MEIsIDB4NzgsIDB4MEYsIDB4OTYsIDB4MTAsIDB4MDYsIDB4MEUsIDB4MTMsCi0JMHgwOSwgMHgwNSwgMHgwNCwgMHhBRiwgMHgwMCwgMHg3OSwgMHhGRiwgMHg5NSwgMHhGRiwgMHhFQywgMHhGRiwKLQkweEY3LCAweEZGLCAweEFDLCAweEZGLCAweDZELCAweEZGLCAweDM4LCAweDAwLCAweDA3LCAweDAzLCAweENCLAotCTB4MDcsIDB4RkIsIDB4MEMsIDB4NEEsIDB4MTAsIDB4MTEsIDB4MTAsIDB4NkYsIDB4MEMsIDB4MkUsIDB4MDcsCi0JMHg5NywgMHgwMiwgMHgwOSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNCwKLQkweEZGLCAweDhBLCAweEZGLCAweDg2LCAweEZGLCAweEY0LCAweDAwLCAweDhCLCAweDA0LCAweEIyLCAweDA5LAotCTB4N0IsIDB4MEUsIDB4QTcsIDB4MTAsIDB4MUMsIDB4MEYsIDB4QTMsIDB4MEEsIDB4NjEsIDB4MDUsIDB4NkUsCi0JMHgwMSwgMHhBNCwgMHhGRiwgMHg3QywgMHhGRiwgMHhEOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEM4LCAweEZGLCAweDcxLCAweEZGLCAweENGLCAweEZGLCAweEY5LCAweDAxLCAweDQzLCAweDA2LCAweDhFLAotCTB4MEIsIDB4QTQsIDB4MEYsIDB4ODgsIDB4MTAsIDB4QzQsIDB4MEQsIDB4QkUsIDB4MDgsIDB4QzEsIDB4MDMsCi0JMHg4RCwgMHgwMCwgMHg3NSwgMHhGRiwgMHg5QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNiwKLQkweEZGLCAweDZFLCAweEZGLCAweDUzLCAweDAwLCAweDQ2LCAweDAzLCAweDFGLCAweDA4LCAweDQzLCAweDBELAotCTB4NjMsIDB4MTAsIDB4RUYsIDB4MEYsIDB4MjMsIDB4MEMsIDB4REMsIDB4MDYsIDB4NUUsIDB4MDIsIDB4RjMsCi0JMHhGRiwgMHg2RCwgMHhGRiwgMHhCRSwgMHhGRiwgMHhGQywgMHhGRiwgMHhFMCwgMHhGRiwgMHg4NSwgMHhGRiwKLQkweDhGLCAweEZGLCAweDFDLCAweDAxLCAweEQzLCAweDA0LCAweDA2LCAweDBBLCAweEI1LCAweDBFLCAweEFBLAotCTB4MTAsIDB4RTcsIDB4MEUsIDB4NTAsIDB4MEEsIDB4MTYsIDB4MDUsIDB4NDIsIDB4MDEsIDB4OTgsIDB4RkYsCi0JMHg4MCwgMHhGRiwgMHhEQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMywgMHhGRiwgMHg2RiwKLQkweEZGLCAweEUxLCAweEZGLCAweDJFLCAweDAyLCAweDk0LCAweDA2LCAweERELCAweDBCLCAweENELCAweDBGLAotCTB4NzYsIDB4MTAsIDB4ODEsIDB4MEQsIDB4NkEsIDB4MDgsIDB4N0YsIDB4MDMsIDB4NkUsIDB4MDAsIDB4NzEsCi0JMHhGRiwgMHhBMSwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxNSwgMHgwMCwgMHhEMSwgMHhGRiwKLQkweDhCLCAweEZFLCAweEJDLCAweEZELCAweEUxLCAweDAwLCAweDg0LCAweDA5LCAweEIwLCAweDEzLCAweDQ3LAotCTB4MTgsIDB4QjAsIDB4MTMsIDB4ODQsIDB4MDksIDB4RTEsIDB4MDAsIDB4QkMsIDB4RkQsIDB4OEIsIDB4RkUsCi0JMHhEMSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhEQSwgMHgwMCwgMHgzMCwKLQkweDAwLCAweDVELCAweEZDLCAweEIzLCAweEZDLCAweDM1LCAweDBBLCAweEMyLCAweDFDLCAweDI0LCAweDIwLAotCTB4NDgsIDB4MTAsIDB4NUQsIDB4RkYsIDB4NzQsIDB4RkIsIDB4M0EsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDIsCi0JMHgwMCwgMHhGOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGMywgMHgwMCwgMHhBRCwgMHhGRiwKLQkweEM1LCAweEZCLCAweDExLCAweEZFLCAweEFGLCAweDBELCAweEVGLCAweDFFLCAweDY4LCAweDFFLCAweEJDLAotCTB4MEMsIDB4QTcsIDB4RkQsIDB4RUEsIDB4RkIsIDB4RDMsIDB4RkYsIDB4RUUsIDB4MDAsIDB4MjQsIDB4MDAsCi0JMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0QywgMHgwMCwgMHhGQiwgMHgwMCwgMHgwQywgMHhGRiwgMHg1RiwKLQkweEZCLCAweEU4LCAweEZGLCAweDNELCAweDExLCAweDdFLCAweDIwLCAweDEzLCAweDFDLCAweDRDLCAweDA5LAotCTB4NkEsIDB4RkMsIDB4OEMsIDB4RkMsIDB4NEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4MEUsIDB4MDAsIDB4RkQsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHg3MiwgMHgwMCwgMHhFQywgMHgwMCwgMHg1NSwgMHhGRSwgMHgzRCwgMHhGQiwKLQkweDM3LCAweDAyLCAweEJFLCAweDE0LCAweDVELCAweDIxLCAweDQwLCAweDE5LCAweDE4LCAweDA2LCAweEEyLAotCTB4RkIsIDB4NDcsIDB4RkQsIDB4QTcsIDB4MDAsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwgMHg5QiwgMHgwMCwgMHhDMCwgMHgwMCwgMHg5MiwgMHhGRCwgMHg3MywKLQkweEZCLCAweEYyLCAweDA0LCAweDBFLCAweDE4LCAweDgxLCAweDIxLCAweDBDLCAweDE2LCAweDM3LCAweDAzLAotCTB4NDcsIDB4RkIsIDB4MEIsIDB4RkUsIDB4REYsIDB4MDAsIDB4ODIsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkUsCi0JMHhGRiwgMHgwOCwgMHgwMCwgMHhDMywgMHgwMCwgMHg3NCwgMHgwMCwgMHhEMiwgMHhGQywgMHgxMCwgMHhGQywKLQkweDA4LCAweDA4LCAweDBBLCAweDFCLCAweEU5LCAweDIwLCAweDlBLCAweDEyLCAweEJFLCAweDAwLCAweDQ5LAotCTB4RkIsIDB4QzgsIDB4RkUsIDB4RjksIDB4MDAsIDB4NUEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsCi0JMHgxQiwgMHgwMCwgMHhFNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgyNCwgMHhGQywgMHgxRSwgMHhGRCwgMHg2NSwKLQkweDBCLCAweDk0LCAweDFELCAweDlELCAweDFGLCAweDBELCAweDBGLCAweEI4LCAweEZFLCAweDk2LCAweEZCLAotCTB4NzIsIDB4RkYsIDB4RjksIDB4MDAsIDB4MzcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzYsCi0JMHgwMCwgMHhGOCwgMHgwMCwgMHg3OCwgMHhGRiwgMHg5QiwgMHhGQiwgMHhBNiwgMHhGRSwgMHhFOSwgMHgwRSwKLQkweDhELCAweDFGLCAweEFBLCAweDFELCAweDg3LCAweDBCLCAweDJCLCAweEZELCAweDFFLCAweEZDLCAweDAyLAotCTB4MDAsIDB4RTUsIDB4MDAsIDB4MUMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTgsIDB4MDAsCi0JMHhGOSwgMHgwMCwgMHhDRiwgMHhGRSwgMHg0QSwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgxMiwgMHhFMCwKLQkweDIwLCAweDI2LCAweDFCLCAweDI4LCAweDA4LCAweDE4LCAweEZDLCAweENCLCAweEZDLCAweDcxLCAweDAwLAotCTB4QzUsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4ODAsIDB4MDAsIDB4RTEsCi0JMHgwMCwgMHgxMywgMHhGRSwgMHg0NSwgMHhGQiwgMHgxRCwgMHgwMywgMHhFQiwgMHgxNSwgMHg3RiwgMHgyMSwKLQkweDJELCAweDE4LCAweDBFLCAweDA1LCAweDc3LCAweEZCLCAweDhCLCAweEZELCAweEJFLCAweDAwLCAweDlELAotCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QTksIDB4MDAsCi0JMHhBQSwgMHgwMCwgMHg0RiwgMHhGRCwgMHg5RCwgMHhGQiwgMHhGQSwgMHgwNSwgMHgyMiwgMHgxOSwgMHg2MiwKLQkweDIxLCAweEUwLCAweDE0LCAweDUwLCAweDAyLCAweDNFLCAweEZCLCAweDRFLCAweEZFLCAweEVCLCAweDAwLAotCTB4NzMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RDAsIDB4MDAsIDB4NTIsCi0JMHgwMCwgMHg5MywgMHhGQywgMHg2MCwgMHhGQywgMHgyQywgMHgwOSwgMHhGQSwgMHgxQiwgMHg4QSwgMHgyMCwKLQkweDYwLCAweDExLCAweEZELCAweEZGLCAweDVDLCAweEZCLCAweDA2LCAweEZGLCAweEZCLCAweDAwLCAweDRELAotCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RUQsIDB4MDAsIDB4RDksIDB4RkYsCi0JMHhFRiwgMHhGQiwgMHg5OCwgMHhGRCwgMHg5OSwgMHgwQywgMHg1NCwgMHgxRSwgMHgwMiwgMHgxRiwgMHhEMiwKLQkweDBELCAweDIwLCAweEZFLCAweEMwLCAweEZCLCAweEE3LCAweEZGLCAweEY0LCAweDAwLCAweDJELCAweDAwLAotCTB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4NzgsCi0JMHhGQiwgMHg0QSwgMHhGRiwgMHgyNSwgMHgxMCwgMHgxNiwgMHgyMCwgMHhEQSwgMHgxQywgMHg1NiwgMHgwQSwKLQkweEJFLCAweEZDLCAweDU2LCAweEZDLCAweDJDLCAweDAwLCAweERCLCAweDAwLCAweDE0LCAweDAwLCAweEZELAotCTB4RkYsIDB4RjcsIDB4RkYsIDB4NjYsIDB4MDAsIDB4RjQsIDB4MDAsIDB4OEYsIDB4RkUsIDB4M0YsIDB4RkIsCi0JMHg3NSwgMHgwMSwgMHhBRSwgMHgxMywgMHgyQywgMHgyMSwgMHgyQSwgMHgxQSwgMHgwRCwgMHgwNywgMHhENCwKLQkweEZCLCAweDBDLCAweEZELCAweDhGLCAweDAwLCAweEI3LCAweDAwLCAweDAzLCAweDAwLCAweEZGLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4OEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4Q0YsIDB4RkQsIDB4NTgsCi0JMHhGQiwgMHgxMCwgMHgwNCwgMHgxMCwgMHgxNywgMHg4QSwgMHgyMSwgMHgxMCwgMHgxNywgMHgxMCwgMHgwNCwKLQkweDU4LCAweEZCLCAweENGLCAweEZELCAweEQxLCAweDAwLCAweDhFLCAweDAwLCAweEZBLCAweEZGLCAweEZGLAotCTB4RkYsIDB4MDMsIDB4MDAsIDB4QjcsIDB4MDAsIDB4OEYsIDB4MDAsIDB4MEMsIDB4RkQsIDB4RDQsIDB4RkIsCi0JMHgwRCwgMHgwNywgMHgyQSwgMHgxQSwgMHgyQywgMHgyMSwgMHhBRSwgMHgxMywgMHg3NSwgMHgwMSwgMHgzRiwKLQkweEZCLCAweDhGLCAweEZFLCAweEY0LCAweDAwLCAweDY2LCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLAotCTB4MTQsIDB4MDAsIDB4REIsIDB4MDAsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkMsIDB4QkUsIDB4RkMsIDB4NTYsCi0JMHgwQSwgMHhEQSwgMHgxQywgMHgxNiwgMHgyMCwgMHgyNSwgMHgxMCwgMHg0QSwgMHhGRiwgMHg3OCwgMHhGQiwKLQkweDQxLCAweEZGLCAweEZCLCAweDAwLCAweDQxLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJELAotCTB4MDAsIDB4RjQsIDB4MDAsIDB4QTcsIDB4RkYsIDB4QzAsIDB4RkIsIDB4MjAsIDB4RkUsIDB4RDIsIDB4MEQsCi0JMHgwMiwgMHgxRiwgMHg1NCwgMHgxRSwgMHg5OSwgMHgwQywgMHg5OCwgMHhGRCwgMHhFRiwgMHhGQiwgMHhEOSwKLQkweEZGLCAweEVELCAweDAwLCAweDIzLCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRELCAweDAwLAotCTB4RkIsIDB4MDAsIDB4MDYsIDB4RkYsIDB4NUMsIDB4RkIsIDB4RkQsIDB4RkYsIDB4NjAsIDB4MTEsIDB4OEEsCi0JMHgyMCwgMHhGQSwgMHgxQiwgMHgyQywgMHgwOSwgMHg2MCwgMHhGQywgMHg5MywgMHhGQywgMHg1MiwgMHgwMCwKLQkweEQwLCAweDAwLCAweDBELCAweDAwLCAweEZFLCAweEZGLCAweEY3LCAweEZGLCAweDczLCAweDAwLCAweEVCLAotCTB4MDAsIDB4NEUsIDB4RkUsIDB4M0UsIDB4RkIsIDB4NTAsIDB4MDIsIDB4RTAsIDB4MTQsIDB4NjIsIDB4MjEsCi0JMHgyMiwgMHgxOSwgMHhGQSwgMHgwNSwgMHg5RCwgMHhGQiwgMHg0RiwgMHhGRCwgMHhBQSwgMHgwMCwgMHhBOSwKLQkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDlELCAweDAwLAotCTB4QkUsIDB4MDAsIDB4OEIsIDB4RkQsIDB4NzcsIDB4RkIsIDB4MEUsIDB4MDUsIDB4MkQsIDB4MTgsIDB4N0YsCi0JMHgyMSwgMHhFQiwgMHgxNSwgMHgxRCwgMHgwMywgMHg0NSwgMHhGQiwgMHgxMywgMHhGRSwgMHhFMSwgMHgwMCwKLQkweDgwLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDA4LCAweDAwLCAweEM1LCAweDAwLCAweDcxLAotCTB4MDAsIDB4Q0IsIDB4RkMsIDB4MTgsIDB4RkMsIDB4MjgsIDB4MDgsIDB4MjYsIDB4MUIsIDB4RTAsIDB4MjAsCi0JMHg3NywgMHgxMiwgMHhBNywgMHgwMCwgMHg0QSwgMHhGQiwgMHhDRiwgMHhGRSwgMHhGOSwgMHgwMCwgMHg1OCwKLQkweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFDLCAweDAwLCAweEU1LCAweDAwLCAweDAyLCAweDAwLAotCTB4MUUsIDB4RkMsIDB4MkIsIDB4RkQsIDB4ODcsIDB4MEIsIDB4QUEsIDB4MUQsIDB4OEQsIDB4MUYsIDB4RTksCi0JMHgwRSwgMHhBNiwgMHhGRSwgMHg5QiwgMHhGQiwgMHg3OCwgMHhGRiwgMHhGOCwgMHgwMCwgMHgzNiwgMHgwMCwKLQkweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDM3LCAweDAwLCAweEY5LCAweDAwLCAweDcyLCAweEZGLCAweDk2LAotCTB4RkIsIDB4QjgsIDB4RkUsIDB4MEQsIDB4MEYsIDB4OUQsIDB4MUYsIDB4OTQsIDB4MUQsIDB4NjUsIDB4MEIsCi0JMHgxRSwgMHhGRCwgMHgyNCwgMHhGQywgMHgwNiwgMHgwMCwgMHhFNCwgMHgwMCwgMHgxQiwgMHgwMCwgMHhGQywKLQkweEZGLCAweEY3LCAweEZGLCAweDVBLCAweDAwLCAweEY5LCAweDAwLCAweEM4LCAweEZFLCAweDQ5LCAweEZCLAotCTB4QkUsIDB4MDAsIDB4OUEsIDB4MTIsIDB4RTksIDB4MjAsIDB4MEEsIDB4MUIsIDB4MDgsIDB4MDgsIDB4MTAsCi0JMHhGQywgMHhEMiwgMHhGQywgMHg3NCwgMHgwMCwgMHhDMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhGRSwgMHhGRiwKLQkweEY5LCAweEZGLCAweDgyLCAweDAwLCAweERGLCAweDAwLCAweDBCLCAweEZFLCAweDQ3LCAweEZCLCAweDM3LAotCTB4MDMsIDB4MEMsIDB4MTYsIDB4ODEsIDB4MjEsIDB4MEUsIDB4MTgsIDB4RjIsIDB4MDQsIDB4NzMsIDB4RkIsCi0JMHg5MiwgMHhGRCwgMHhDMCwgMHgwMCwgMHg5QiwgMHgwMCwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDAwLCAweEE3LCAweDAwLCAweDQ3LCAweEZELCAweEEyLCAweEZCLAotCTB4MTgsIDB4MDYsIDB4NDAsIDB4MTksIDB4NUQsIDB4MjEsIDB4QkUsIDB4MTQsIDB4MzcsIDB4MDIsIDB4M0QsCi0JMHhGQiwgMHg1NSwgMHhGRSwgMHhFQywgMHgwMCwgMHg3MiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwKLQkweDBFLCAweDAwLCAweEQxLCAweDAwLCAweDRFLCAweDAwLCAweDhDLCAweEZDLCAweDZBLCAweEZDLCAweDRDLAotCTB4MDksIDB4MTMsIDB4MUMsIDB4N0UsIDB4MjAsIDB4M0QsIDB4MTEsIDB4RTgsIDB4RkYsIDB4NUYsIDB4RkIsCi0JMHgwQywgMHhGRiwgMHhGQiwgMHgwMCwgMHg0QywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNCwKLQkweDAwLCAweEVFLCAweDAwLCAweEQzLCAweEZGLCAweEVBLCAweEZCLCAweEE3LCAweEZELCAweEJDLCAweDBDLAotCTB4NjgsIDB4MUUsIDB4RUYsIDB4MUUsIDB4QUYsIDB4MEQsIDB4MTEsIDB4RkUsIDB4QzUsIDB4RkIsIDB4QUQsCi0JMHhGRiwgMHhGMywgMHgwMCwgMHgyQywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MiwgMHgwMCwKLQkweEZCLCAweDAwLCAweDNBLCAweEZGLCAweDc0LCAweEZCLCAweDVELCAweEZGLCAweDQ4LCAweDEwLCAweDI0LAotCTB4MjAsIDB4QzIsIDB4MUMsIDB4MzUsIDB4MEEsIDB4QjMsIDB4RkMsIDB4NUQsIDB4RkMsIDB4MzAsIDB4MDAsCi0JMHhEQSwgMHgwMCwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2NywgMHgwMCwgMHhGMywKLQkweDAwLCAweDg4LCAweEZFLCAweDNFLCAweEZCLCAweDhDLCAweDAxLCAweEQwLCAweDEzLCAweDMzLCAweDIxLAotCTB4MEQsIDB4MUEsIDB4RUUsIDB4MDYsIDB4Q0QsIDB4RkIsIDB4MTMsIDB4RkQsIDB4OTIsIDB4MDAsIDB4QjYsCi0JMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhGRiwgMHg5MCwgMHgwMCwKLQkweENGLCAweDAwLCAweEM3LCAweEZELCAweDVCLCAweEZCLCAweDJCLCAweDA0LCAweDMxLCAweDE3LCAweDhBLAotCTB4MjEsIDB4RjAsIDB4MTYsIDB4RjQsIDB4MDMsIDB4NTYsIDB4RkIsIDB4RDYsIDB4RkQsIDB4RDMsIDB4MDAsCi0JMHg4RCwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhCOSwgMHgwMCwgMHg4QywKLQkweDAwLCAweDA1LCAweEZELCAweERCLCAweEZCLCAweDJDLCAweDA3LCAweDQ3LCAweDFBLCAweDI1LCAweDIxLAotCTB4OEIsIDB4MTMsIDB4NUQsIDB4MDEsIDB4NDAsIDB4RkIsIDB4OTcsIDB4RkUsIDB4RjUsIDB4MDAsIDB4NjQsCi0JMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNSwgMHgwMCwgMHhEQywgMHgwMCwgMHgyNywgMHgwMCwKLQkweDUwLCAweEZDLCAweENBLCAweEZDLCAweDc4LCAweDBBLCAweEYyLCAweDFDLCAweDA3LCAweDIwLCAweDAyLAotCTB4MTAsIDB4MzcsIDB4RkYsIDB4N0IsIDB4RkIsIDB4NDcsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDAsIDB4MDAsCi0JMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHhCQiwKLQkweEZCLCAweDMxLCAweEZFLCAweEY1LCAweDBELCAweDE0LCAweDFGLCAweDNGLCAweDFFLCAweDc3LCAweDBDLAotCTB4OEEsIDB4RkQsIDB4RjUsIDB4RkIsIDB4REUsIDB4RkYsIDB4RUMsIDB4MDAsIDB4MjIsIDB4MDAsIDB4RkIsCi0JMHhGRiwgMHhGNywgMHhGRiwgMHg0RSwgMHgwMCwgMHhGQiwgMHgwMCwgMHhGRiwgMHhGRSwgMHg1OSwgMHhGQiwKLQkweDExLCAweDAwLCAweDgzLCAweDExLCAweDk2LCAweDIwLCAweEUwLCAweDFCLCAweDBCLCAweDA5LCAweDU2LAotCTB4RkMsIDB4OTksIDB4RkMsIDB4NTYsIDB4MDAsIDB4Q0UsIDB4MDAsIDB4MEQsIDB4MDAsIDB4RkUsIDB4RkYsCi0JMHhGOCwgMHhGRiwgMHg3NSwgMHgwMCwgMHhFQSwgMHgwMCwgMHg0NywgMHhGRSwgMHgzRSwgMHhGQiwgMHg2OSwKLQkweDAyLCAweDAyLCAweDE1LCAweDY2LCAweDIxLCAweDA0LCAweDE5LCAweERDLCAweDA1LCAweDk4LCAweEZCLAotCTB4NTYsIDB4RkQsIDB4QUQsIDB4MDAsIDB4QTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHg5RSwgMHgwMCwgMHhCQywgMHgwMCwgMHg4MywgMHhGRCwgMHg3QiwgMHhGQiwKLQkweDJCLCAweDA1LCAweDRDLCAweDE4LCAweDdDLCAweDIxLCAweENBLCAweDE1LCAweDAzLCAweDAzLCAweDQ0LAotCTB4RkIsIDB4MUEsIDB4RkUsIDB4RTIsIDB4MDAsIDB4N0UsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsCi0JMHgwOSwgMHgwMCwgMHhDNiwgMHgwMCwgMHg2RCwgMHgwMCwgMHhDMywgMHhGQywgMHgyMCwgMHhGQywgMHg0OSwKLQkweDA4LCAweDQxLCAweDFCLCAweEQ2LCAweDIwLCAweDU0LCAweDEyLCAweDkyLCAweDAwLCAweDRDLCAweEZCLAotCTB4RDYsIDB4RkUsIDB4RkEsIDB4MDAsIDB4NTcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUQsCi0JMHgwMCwgMHhFNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHhGQywgMHgzOCwgMHhGRCwgMHhBOSwgMHgwQiwKLQkweEMwLCAweDFELCAweDdDLCAweDFGLCAweEM2LCAweDBFLCAweDk1LCAweEZFLCAweDlGLCAweEZCLCAweDdFLAotCTB4RkYsIDB4RjgsIDB4MDAsIDB4MzUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4MzgsIDB4MDAsCi0JMHhGOSwgMHgwMCwgMHg2QywgMHhGRiwgMHg5MiwgMHhGQiwgMHhDOSwgMHhGRSwgMHgyRiwgMHgwRiwgMHhBRCwKLQkweDFGLCAweDdELCAweDFELCAweDQyLCAweDBCLCAweDEyLCAweEZELCAweDJBLCAweEZDLCAweDBCLCAweDAwLAotCTB4RTMsIDB4MDAsIDB4MUEsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NUIsIDB4MDAsIDB4RjgsCi0JMHgwMCwgMHhDMSwgMHhGRSwgMHg0NywgMHhGQiwgMHhENCwgMHgwMCwgMHhCQywgMHgxMiwgMHhGMywgMHgyMCwKLQkweEVGLCAweDFBLCAweEU5LCAweDA3LCAweDA4LCAweEZDLCAweEQ5LCAweEZDLCAweDc4LCAweDAwLCAweEMyLAotCTB4MDAsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODMsIDB4MDAsIDB4REQsIDB4MDAsCi0JMHgwNCwgMHhGRSwgMHg0OSwgMHhGQiwgMHg1MiwgMHgwMywgMHgyRCwgMHgxNiwgMHg4MywgMHgyMSwgMHhFRiwKLQkweDE3LCAweEQ1LCAweDA0LCAweDZGLCAweEZCLCAweDlBLCAweEZELCAweEMzLCAweDAwLCAweDlBLCAweDAwLAotCTB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4QUQsIDB4MDAsIDB4QTQsCi0JMHgwMCwgMHg0MCwgMHhGRCwgMHhBOCwgMHhGQiwgMHgzNiwgMHgwNiwgMHg1RSwgMHgxOSwgMHg1OCwgMHgyMSwKLQkweDlDLCAweDE0LCAweDFFLCAweDAyLCAweDNELCAweEZCLCAweDVELCAweEZFLCAweEVELCAweDAwLCAweDcwLAotCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RDIsIDB4MDAsIDB4NEEsIDB4MDAsCi0JMHg4NSwgMHhGQywgMHg3NCwgMHhGQywgMHg2RCwgMHgwOSwgMHgyRCwgMHgxQywgMHg3MiwgMHgyMCwgMHgxQSwKLQkweDExLCAweEQ0LCAweEZGLCAweDYxLCAweEZCLCAweDEzLCAweEZGLCAweEZDLCAweDAwLCAweDRBLCAweDAwLAotCTB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RUYsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4RTQsCi0JMHhGQiwgMHhCNSwgMHhGRCwgMHhERSwgMHgwQywgMHg3QywgMHgxRSwgMHhERCwgMHgxRSwgMHg4QywgMHgwRCwKLQkweDAxLCAweEZFLCAweENBLCAweEZCLCAweEIzLCAweEZGLCAweEYzLCAweDAwLCAweDJCLCAweDAwLCAweEZBLAotCTB4RkYsIDB4RjgsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RkIsIDB4MDAsIDB4MzQsIDB4RkYsIDB4NzEsIDB4RkIsCi0JMHg3MSwgMHhGRiwgMHg2QiwgMHgxMCwgMHgzMiwgMHgyMCwgMHhBOSwgMHgxQywgMHgxMywgMHgwQSwgMHhBOCwKLQkweEZDLCAweDYzLCAweEZDLCAweDM1LCAweDAwLCAweEQ5LCAweDAwLCAweDEyLCAweDAwLCAweEZELCAweEZGLAotCTB4RjcsIDB4RkYsIDB4NjksIDB4MDAsIDB4RjIsIDB4MDAsIDB4ODEsIDB4RkUsIDB4M0UsIDB4RkIsIDB4QTQsCi0JMHgwMSwgMHhGMiwgMHgxMywgMHgzQSwgMHgyMSwgMHhGMCwgMHgxOSwgMHhDRiwgMHgwNiwgMHhDNywgMHhGQiwKLQkweDFCLCAweEZELCAweDk2LCAweDAwLCAweEI0LCAweDAwLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkIsIDB4RkYsIDB4OTIsIDB4MDAsIDB4Q0QsIDB4MDAsIDB4QzAsIDB4RkQsIDB4NUUsIDB4RkIsCi0JMHg0NywgMHgwNCwgMHg1MSwgMHgxNywgMHg4QSwgMHgyMSwgMHhEMCwgMHgxNiwgMHhEOSwgMHgwMywgMHg1MywKLQkweEZCLCAweERFLCAweEZELCAweEQ1LCAweDAwLCAweDhCLCAweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLAotCTB4MDQsIDB4MDAsIDB4QkEsIDB4MDAsIDB4ODksIDB4MDAsIDB4RkQsIDB4RkMsIDB4RTIsIDB4RkIsIDB4NEIsCi0JMHgwNywgMHg2MywgMHgxQSwgMHgxRCwgMHgyMSwgMHg2OSwgMHgxMywgMHg0NiwgMHgwMSwgMHg0MSwgMHhGQiwKLQkweDlFLCAweEZFLCAweEY1LCAweDAwLCAweDYzLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE2LAotCTB4MDAsIDB4REQsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NDksIDB4RkMsIDB4RDUsIDB4RkMsIDB4OTksIDB4MEEsCi0JMHgwOSwgMHgxRCwgMHhGOSwgMHgxRiwgMHhERiwgMHgwRiwgMHgyNCwgMHhGRiwgMHg3RiwgMHhGQiwgMHg0RCwKLQkweEZGLCAweEZCLCAweDAwLCAweDNGLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJGLCAweDAwLAotCTB4RjUsIDB4MDAsIDB4OUMsIDB4RkYsIDB4QjYsIDB4RkIsIDB4NDEsIDB4RkUsIDB4MTcsIDB4MEUsIDB4MjYsCi0JMHgxRiwgMHgyQiwgMHgxRSwgMHg1NCwgMHgwQywgMHg3QywgMHhGRCwgMHhGQSwgMHhGQiwgMHhFMywgMHhGRiwKLQkweEVCLCAweDAwLCAweDIxLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDUwLCAweDAwLCAweEZCLAotCTB4MDAsIDB4RjgsIDB4RkUsIDB4NTcsIDB4RkIsIDB4MjYsIDB4MDAsIDB4QTYsIDB4MTEsIDB4QTEsIDB4MjAsCi0JMHhDNiwgMHgxQiwgMHhFQSwgMHgwOCwgMHg0RCwgMHhGQywgMHhBMCwgMHhGQywgMHg1QSwgMHgwMCwgMHhDRCwKLQkweDAwLCAweDBDLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDc3LCAweDAwLCAweEU5LCAweDAwLAotCTB4M0YsIDB4RkUsIDB4M0YsIDB4RkIsIDB4ODIsIDB4MDIsIDB4MjMsIDB4MTUsIDB4NkIsIDB4MjEsIDB4RTUsCi0JMHgxOCwgMHhCRSwgMHgwNSwgMHg5MywgMHhGQiwgMHg1RSwgMHhGRCwgMHhBRiwgMHgwMCwgMHhBNiwgMHgwMCwKLQkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEEwLCAweDAwLCAweEI5LAotCTB4MDAsIDB4N0MsIDB4RkQsIDB4ODAsIDB4RkIsIDB4NDgsIDB4MDUsIDB4NkIsIDB4MTgsIDB4NzksIDB4MjEsCi0JMHhBOSwgMHgxNSwgMHhFOSwgMHgwMiwgMHg0MywgMHhGQiwgMHgyMSwgMHhGRSwgMHhFMywgMHgwMCwgMHg3RCwKLQkweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDA5LCAweDAwLCAweEM3LCAweDAwLCAweDY5LCAweDAwLAotCTB4QkMsIDB4RkMsIDB4MjksIDB4RkMsIDB4NjksIDB4MDgsIDB4NUMsIDB4MUIsIDB4Q0MsIDB4MjAsIDB4MzIsCi0JMHgxMiwgMHg3QywgMHgwMCwgMHg0RSwgMHhGQiwgMHhERCwgMHhGRSwgMHhGQSwgMHgwMCwgMHg1NiwgMHgwMCwKLQkweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFELCAweDAwLCAweEU3LCAweDAwLCAweEY4LCAweEZGLCAweDEyLAotCTB4RkMsIDB4NDUsIDB4RkQsIDB4Q0IsIDB4MEIsIDB4RDYsIDB4MUQsIDB4NkMsIDB4MUYsIDB4QTMsIDB4MEUsCi0JMHg4NCwgMHhGRSwgMHhBNCwgMHhGQiwgMHg4NCwgMHhGRiwgMHhGNywgMHgwMCwgMHgzNCwgMHgwMCwgMHhGOSwKLQkweEZGLCAweEY4LCAweEZGLCAweDNBLCAweDAwLCAweEZBLCAweDAwLCAweDY2LCAweEZGLCAweDhFLCAweEZCLAotCTB4REIsIDB4RkUsIDB4NTMsIDB4MEYsIDB4QkQsIDB4MUYsIDB4NjYsIDB4MUQsIDB4MjEsIDB4MEIsIDB4MDUsCi0JMHhGRCwgMHgzMCwgMHhGQywgMHgxMCwgMHgwMCwgMHhFMiwgMHgwMCwgMHgxOSwgMHgwMCwgMHhGQywgMHhGRiwKLQkweEY3LCAweEZGLCAweDVELCAweDAwLCAweEY4LCAweDAwLCAweEJBLCAweEZFLCAweDQ2LCAweEZCLCAweEVBLAotCTB4MDAsIDB4REYsIDB4MTIsIDB4RkMsIDB4MjAsIDB4RDMsIDB4MUEsIDB4QzksIDB4MDcsIDB4MDAsIDB4RkMsCi0JMHhFMCwgMHhGQywgMHg3QiwgMHgwMCwgMHhDMCwgMHgwMCwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwKLQkweEZGLCAweDg1LCAweDAwLCAweERDLCAweDAwLCAweEZDLCAweEZELCAweDRBLCAweEZCLCAweDZDLCAweDAzLAotCTB4NEUsIDB4MTYsIDB4ODUsIDB4MjEsIDB4Q0YsIDB4MTcsIDB4QjgsIDB4MDQsIDB4NkMsIDB4RkIsIDB4QTIsCi0JMHhGRCwgMHhDNSwgMHgwMCwgMHg5OCwgMHgwMCwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKLQkweDAxLCAweDAwLCAweEFFLCAweDAwLCAweEExLCAweDAwLCAweDM4LCAweEZELCAweEFFLCAweEZCLCAweDU0LAotCTB4MDYsIDB4N0MsIDB4MTksIDB4NTMsIDB4MjEsIDB4N0IsIDB4MTQsIDB4MDUsIDB4MDIsIDB4M0QsIDB4RkIsCi0JMHg2NCwgMHhGRSwgMHhFRSwgMHgwMCwgMHg2RiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwRiwKLQkweDAwLCAweEQ0LCAweDAwLCAweDQ2LCAweDAwLCAweDdFLCAweEZDLCAweDdFLCAweEZDLCAweDhFLCAweDA5LAotCTB4NDYsIDB4MUMsIDB4NjYsIDB4MjAsIDB4RjcsIDB4MTAsIDB4QzAsIDB4RkYsIDB4NjQsIDB4RkIsIDB4MUEsCi0JMHhGRiwgMHhGQywgMHgwMCwgMHg0OSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNiwgMHgwMCwKLQkweEYwLCAweDAwLCAweEM5LCAweEZGLCAweERGLCAweEZCLCAweEM0LCAweEZELCAweDAxLCAweDBELCAweDkwLAotCTB4MUUsIDB4Q0EsIDB4MUUsIDB4NjksIDB4MEQsIDB4RjEsIDB4RkQsIDB4Q0YsIDB4RkIsIDB4QjgsIDB4RkYsCi0JMHhGMiwgMHgwMCwgMHgyOSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0NSwgMHgwMCwgMHhGQywKLQkweDAwLCAweDJELCAweEZGLCAweDZELCAweEZCLCAweDg0LCAweEZGLCAweDhFLCAweDEwLCAweDNGLCAweDIwLAotCTB4OTEsIDB4MUMsIDB4RjIsIDB4MDksIDB4OUQsIDB4RkMsIDB4NkEsIDB4RkMsIDB4MzksIDB4MDAsIDB4RDcsCi0JMHgwMCwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2QSwgMHgwMCwgMHhGMSwgMHgwMCwKLQkweDdBLCAweEZFLCAweDNELCAweEZCLCAweEJDLCAweDAxLCAweDE0LCAweDE0LCAweDQxLCAweDIxLCAweEQ0LAotCTB4MTksIDB4QjAsIDB4MDYsIDB4QzAsIDB4RkIsIDB4MjIsIDB4RkQsIDB4OTksIDB4MDAsIDB4QjMsIDB4MDAsCi0JMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5MywgMHgwMCwgMHhDQiwKLQkweDAwLCAweEI4LCAweEZELCAweDYxLCAweEZCLCAweDYzLCAweDA0LCAweDcxLCAweDE3LCAweDg5LCAweDIxLAotCTB4QjAsIDB4MTYsIDB4QkQsIDB4MDMsIDB4NTEsIDB4RkIsIDB4RTYsIDB4RkQsIDB4RDcsIDB4MDAsIDB4OEEsCi0JMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhCQywgMHgwMCwgMHg4NiwgMHgwMCwKLQkweEY2LCAweEZDLCAweEU5LCAweEZCLCAweDZBLCAweDA3LCAweDgwLCAweDFBLCAweDE1LCAweDIxLCAweDQ3LAotCTB4MTMsIDB4MkYsIDB4MDEsIDB4NDIsIDB4RkIsIDB4QTUsIDB4RkUsIDB4RjYsIDB4MDAsIDB4NjEsIDB4MDAsCi0JMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNiwgMHgwMCwgMHhERiwgMHgwMCwgMHgxRSwgMHgwMCwgMHg0MywKLQkweEZDLCAweEUxLCAweEZDLCAweEJCLCAweDBBLCAweDIxLCAweDFELCAweEVBLCAweDFGLCAweEJDLCAweDBGLAotCTB4MTIsIDB4RkYsIDB4ODIsIDB4RkIsIDB4NTQsIDB4RkYsIDB4RkEsIDB4MDAsIDB4M0QsIDB4MDAsIDB4RjgsCi0JMHhGRiwgMHhGOSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGNiwgMHgwMCwgMHg5NiwgMHhGRiwgMHhCMSwgMHhGQiwKLQkweDUxLCAweEZFLCAweDNBLCAweDBFLCAweDM4LCAweDFGLCAweDE2LCAweDFFLCAweDMyLCAweDBDLCAweDZFLAotCTB4RkQsIDB4MDAsIDB4RkMsIDB4RTgsIDB4RkYsIDB4RUEsIDB4MDAsIDB4MjAsIDB4MDAsIDB4RkIsIDB4RkYsCi0JMHhGNywgMHhGRiwgMHg1MSwgMHgwMCwgMHhGQiwgMHgwMCwgMHhGMSwgMHhGRSwgMHg1NCwgMHhGQiwgMHgzQiwKLQkweDAwLCAweEM5LCAweDExLCAweEFELCAweDIwLCAweEFDLCAweDFCLCAweENBLCAweDA4LCAweDQ0LCAweEZDLAotCTB4QTcsIDB4RkMsIDB4NUUsIDB4MDAsIDB4Q0MsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsCi0JMHhGRiwgMHg3OCwgMHgwMCwgMHhFNywgMHgwMCwgMHgzOCwgMHhGRSwgMHg0MCwgMHhGQiwgMHg5QiwgMHgwMiwKLQkweDQ1LCAweDE1LCAweDZGLCAweDIxLCAweEM3LCAweDE4LCAweEExLCAweDA1LCAweDhFLCAweEZCLCAweDY1LAotCTB4RkQsIDB4QjIsIDB4MDAsIDB4QTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRSwgMHhGRiwgMHhBMiwgMHgwMCwgMHhCNywgMHgwMCwgMHg3NCwgMHhGRCwgMHg4NCwgMHhGQiwgMHg2NiwKLQkweDA1LCAweDhBLCAweDE4LCAweDc2LCAweDIxLCAweDg3LCAweDE1LCAweENGLCAweDAyLCAweDQxLCAweEZCLAotCTB4MjksIDB4RkUsIDB4RTUsIDB4MDAsIDB4N0IsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEEsCi0JMHgwMCwgMHhDOSwgMHgwMCwgMHg2NiwgMHgwMCwgMHhCNSwgMHhGQywgMHgzMiwgMHhGQywgMHg4OSwgMHgwOCwKLQkweDc3LCAweDFCLCAweEMyLCAweDIwLCAweDBGLCAweDEyLCAweDY2LCAweDAwLCAweDUwLCAweEZCLCAweEU0LAotCTB4RkUsIDB4RkEsIDB4MDAsIDB4NTQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUUsIDB4MDAsCi0JMHhFOCwgMHgwMCwgMHhGMywgMHhGRiwgMHgwQywgMHhGQywgMHg1MywgMHhGRCwgMHhFRCwgMHgwQiwgMHhFQiwKLQkweDFELCAweDVBLCAweDFGLCAweDgwLCAweDBFLCAweDczLCAweEZFLCAweEE4LCAweEZCLCAweDhBLCAweEZGLAotCTB4RjcsIDB4MDAsIDB4MzIsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4M0IsIDB4MDAsIDB4RkEsCi0JMHgwMCwgMHg2MCwgMHhGRiwgMHg4QSwgMHhGQiwgMHhFRCwgMHhGRSwgMHg3NiwgMHgwRiwgMHhDQywgMHgxRiwKLQkweDRGLCAweDFELCAweEZGLCAweDBBLCAweEY5LCAweEZDLCAweDM2LCAweEZDLCAweDE1LCAweDAwLCAweEUxLAotCTB4MDAsIDB4MTgsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NUUsIDB4MDAsIDB4RjcsIDB4MDAsCi0JMHhCMywgMHhGRSwgMHg0NCwgMHhGQiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMywgMHgwNCwgMHgyMSwgMHhCOCwKLQkweDFBLCAweEE5LCAweDA3LCAweEY4LCAweEZCLCAweEU3LCAweEZDLCAweDdGLCAweDAwLCAweEJGLCAweDAwLAotCTB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODYsIDB4MDAsIDB4REEsIDB4MDAsIDB4RjUsCi0JMHhGRCwgMHg0QywgMHhGQiwgMHg4NywgMHgwMywgMHg2RSwgMHgxNiwgMHg4NiwgMHgyMSwgMHhCMCwgMHgxNywKLQkweDlDLCAweDA0LCAweDY4LCAweEZCLCAweEE5LCAweEZELCAweEM3LCAweDAwLCAweDk2LCAweDAwLCAweEZCLAotCTB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4QjAsIDB4MDAsIDB4OUYsIDB4MDAsCi0JMHgzMSwgMHhGRCwgMHhCNCwgMHhGQiwgMHg3MywgMHgwNiwgMHg5OSwgMHgxOSwgMHg0RCwgMHgyMSwgMHg1OSwKLQkweDE0LCAweEVELCAweDAxLCAweDNELCAweEZCLCAweDZCLCAweEZFLCAweEVGLCAweDAwLCAweDZELCAweDAwLAotCTB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RDUsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NzcsCi0JMHhGQywgMHg4OCwgMHhGQywgMHhBRiwgMHgwOSwgMHg1RiwgMHgxQywgMHg1OSwgMHgyMCwgMHhENCwgMHgxMCwKLQkweEFDLCAweEZGLCAweDY3LCAweEZCLCAweDIwLCAweEZGLCAweEZDLCAweDAwLCAweDQ4LCAweDAwLCAweEY3LAotCTB4RkYsIDB4RkEsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RjAsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RDksIDB4RkIsCi0JMHhEMywgMHhGRCwgMHgyNCwgMHgwRCwgMHhBMywgMHgxRSwgMHhCNywgMHgxRSwgMHg0NiwgMHgwRCwgMHhFMiwKLQkweEZELCAweEQ0LCAweEZCLCAweEJFLCAweEZGLCAweEYxLCAweDAwLCAweDI4LCAweDAwLCAweEZBLCAweEZGLAotCTB4RjcsIDB4RkYsIDB4NDYsIDB4MDAsIDB4RkMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4NkEsIDB4RkIsIDB4OTgsCi0JMHhGRiwgMHhCMSwgMHgxMCwgMHg0QywgMHgyMCwgMHg3OCwgMHgxQywgMHhEMSwgMHgwOSwgMHg5MywgMHhGQywKLQkweDcxLCAweEZDLCAweDNELCAweDAwLCAweEQ2LCAweDAwLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweEY3LAotCTB4RkYsIDB4NkMsIDB4MDAsIDB4RjAsIDB4MDAsIDB4NzIsIDB4RkUsIDB4M0QsIDB4RkIsIDB4RDQsIDB4MDEsCi0JMHgzNiwgMHgxNCwgMHg0NywgMHgyMSwgMHhCNiwgMHgxOSwgMHg5MSwgMHgwNiwgMHhCQSwgMHhGQiwgMHgyOSwKLQkweEZELCAweDlDLCAweDAwLCAweEIxLCAweDAwLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAotCTB4RkIsIDB4RkYsIDB4OTUsIDB4MDAsIDB4QzksIDB4MDAsIDB4QjEsIDB4RkQsIDB4NjUsIDB4RkIsIDB4ODAsCi0JMHgwNCwgMHg5MCwgMHgxNywgMHg4OCwgMHgyMSwgMHg4RiwgMHgxNiwgMHhBMiwgMHgwMywgMHg0RSwgMHhGQiwKLQkweEVELCAweEZELCAweEQ5LCAweDAwLCAweDg4LCAweDAwLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA1LAotCTB4MDAsIDB4QkQsIDB4MDAsIDB4ODIsIDB4MDAsIDB4RUYsIDB4RkMsIDB4RjAsIDB4RkIsIDB4OEEsIDB4MDcsCi0JMHg5QywgMHgxQSwgMHgwRCwgMHgyMSwgMHgyNCwgMHgxMywgMHgxOCwgMHgwMSwgMHg0MywgMHhGQiwgMHhBQywKLQkweEZFLCAweEY3LCAweDAwLCAweDYwLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE3LCAweDAwLAotCTB4RTAsIDB4MDAsIDB4MUEsIDB4MDAsIDB4M0QsIDB4RkMsIDB4RUQsIDB4RkMsIDB4REQsIDB4MEEsIDB4MzgsCi0JMHgxRCwgMHhEQiwgMHgxRiwgMHg5OSwgMHgwRiwgMHhGRiwgMHhGRSwgMHg4NiwgMHhGQiwgMHg1QSwgMHhGRiwKLQkweEZBLCAweDAwLCAweDNDLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDMxLCAweDAwLCAweEY2LAotCTB4MDAsIDB4OTAsIDB4RkYsIDB4QUQsIDB4RkIsIDB4NjIsIDB4RkUsIDB4NUQsIDB4MEUsIDB4NDksIDB4MUYsCi0JMHgwMSwgMHgxRSwgMHgxMCwgMHgwQywgMHg2MCwgMHhGRCwgMHgwNiwgMHhGQywgMHhFRSwgMHhGRiwgMHhFOSwKLQkweDAwLCAweDFGLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDUzLCAweDAwLCAweEZCLCAweDAwLAotCTB4RUIsIDB4RkUsIDB4NTIsIDB4RkIsIDB4NTEsIDB4MDAsIDB4RUMsIDB4MTEsIDB4QjcsIDB4MjAsIDB4OTEsCi0JMHgxQiwgMHhBOSwgMHgwOCwgMHgzQiwgMHhGQywgMHhBRSwgMHhGQywgMHg2MiwgMHgwMCwgMHhDQSwgMHgwMCwKLQkweDBCLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdBLCAweDAwLCAweEU2LCAweDAwLCAweDMwLAotCTB4RkUsIDB4NDAsIDB4RkIsIDB4QjUsIDB4MDIsIDB4NjYsIDB4MTUsIDB4NzMsIDB4MjEsIDB4QTksIDB4MTgsCi0JMHg4MywgMHgwNSwgMHg4OSwgMHhGQiwgMHg2RCwgMHhGRCwgMHhCNCwgMHgwMCwgMHhBMywgMHgwMCwgMHhGRSwKLQkweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEEzLCAweDAwLCAweEI0LCAweDAwLAotCTB4NkQsIDB4RkQsIDB4ODksIDB4RkIsIDB4ODMsIDB4MDUsIDB4QTksIDB4MTgsIDB4NzMsIDB4MjEsIDB4NjYsCi0JMHgxNSwgMHhCNSwgMHgwMiwgMHg0MCwgMHhGQiwgMHgzMCwgMHhGRSwgMHhFNiwgMHgwMCwgMHg3QSwgMHgwMCwKLQkweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBCLCAweDAwLCAweENBLCAweDAwLCAweDYyLCAweDAwLCAweEFFLAotCTB4RkMsIDB4M0IsIDB4RkMsIDB4QTksIDB4MDgsIDB4OTEsIDB4MUIsIDB4QjcsIDB4MjAsIDB4RUMsIDB4MTEsCi0JMHg1MSwgMHgwMCwgMHg1MiwgMHhGQiwgMHhFQiwgMHhGRSwgMHhGQiwgMHgwMCwgMHg1MywgMHgwMCwgMHhGNywKLQkweEZGLCAweEZCLCAweEZGLCAweDFGLCAweDAwLCAweEU5LCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweEZDLAotCTB4NjAsIDB4RkQsIDB4MTAsIDB4MEMsIDB4MDEsIDB4MUUsIDB4NDksIDB4MUYsIDB4NUQsIDB4MEUsIDB4NjIsCi0JMHhGRSwgMHhBRCwgMHhGQiwgMHg5MCwgMHhGRiwgMHhGNiwgMHgwMCwgMHgzMSwgMHgwMCwgMHhGOSwgMHhGRiwKLQkweEY4LCAweEZGLCAweDNDLCAweDAwLCAweEZBLCAweDAwLCAweDVBLCAweEZGLCAweDg2LCAweEZCLCAweEZGLAotCTB4RkUsIDB4OTksIDB4MEYsIDB4REIsIDB4MUYsIDB4MzgsIDB4MUQsIDB4REQsIDB4MEEsIDB4RUQsIDB4RkMsCi0JMHgzRCwgMHhGQywgMHgxQSwgMHgwMCwgMHhFMCwgMHgwMCwgMHgxNywgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywKLQkweEZGLCAweDYwLCAweDAwLCAweEY3LCAweDAwLCAweEFDLCAweEZFLCAweDQzLCAweEZCLCAweDE4LCAweDAxLAotCTB4MjQsIDB4MTMsIDB4MEQsIDB4MjEsIDB4OUMsIDB4MUEsIDB4OEEsIDB4MDcsIDB4RjAsIDB4RkIsIDB4RUYsCi0JMHhGQywgMHg4MiwgMHgwMCwgMHhCRCwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwKLQkweDg4LCAweDAwLCAweEQ5LCAweDAwLCAweEVELCAweEZELCAweDRFLCAweEZCLCAweEEyLCAweDAzLCAweDhGLAotCTB4MTYsIDB4ODgsIDB4MjEsIDB4OTAsIDB4MTcsIDB4ODAsIDB4MDQsIDB4NjUsIDB4RkIsIDB4QjEsIDB4RkQsCi0JMHhDOSwgMHgwMCwgMHg5NSwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwKLQkweDAwLCAweEIxLCAweDAwLCAweDlDLCAweDAwLCAweDI5LCAweEZELCAweEJBLCAweEZCLCAweDkxLCAweDA2LAotCTB4QjYsIDB4MTksIDB4NDcsIDB4MjEsIDB4MzYsIDB4MTQsIDB4RDQsIDB4MDEsIDB4M0QsIDB4RkIsIDB4NzIsCi0JMHhGRSwgMHhGMCwgMHgwMCwgMHg2QywgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwKLQkweEQ2LCAweDAwLCAweDNELCAweDAwLCAweDcxLCAweEZDLCAweDkzLCAweEZDLCAweEQxLCAweDA5LCAweDc4LAotCTB4MUMsIDB4NEMsIDB4MjAsIDB4QjEsIDB4MTAsIDB4OTgsIDB4RkYsIDB4NkEsIDB4RkIsIDB4MjcsIDB4RkYsCi0JMHhGQywgMHgwMCwgMHg0NiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyOCwgMHgwMCwgMHhGMSwKLQkweDAwLCAweEJFLCAweEZGLCAweEQ0LCAweEZCLCAweEUyLCAweEZELCAweDQ2LCAweDBELCAweEI3LCAweDFFLAotCTB4QTMsIDB4MUUsIDB4MjQsIDB4MEQsIDB4RDMsIDB4RkQsIDB4RDksIDB4RkIsIDB4QzMsIDB4RkYsIDB4RjAsCi0JMHgwMCwgMHgyNywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0OCwgMHgwMCwgMHhGQywgMHgwMCwKLQkweDIwLCAweEZGLCAweDY3LCAweEZCLCAweEFDLCAweEZGLCAweEQ0LCAweDEwLCAweDU5LCAweDIwLCAweDVGLAotCTB4MUMsIDB4QUYsIDB4MDksIDB4ODgsIDB4RkMsIDB4NzcsIDB4RkMsIDB4NDIsIDB4MDAsIDB4RDUsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2RCwgMHgwMCwgMHhFRiwgMHgwMCwgMHg2QiwKLQkweEZFLCAweDNELCAweEZCLCAweEVELCAweDAxLCAweDU5LCAweDE0LCAweDRELCAweDIxLCAweDk5LCAweDE5LAotCTB4NzMsIDB4MDYsIDB4QjQsIDB4RkIsIDB4MzEsIDB4RkQsIDB4OUYsIDB4MDAsIDB4QjAsIDB4MDAsIDB4MDEsCi0JMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5NiwgMHgwMCwgMHhDNywgMHgwMCwKLQkweEE5LCAweEZELCAweDY4LCAweEZCLCAweDlDLCAweDA0LCAweEIwLCAweDE3LCAweDg2LCAweDIxLCAweDZFLAotCTB4MTYsIDB4ODcsIDB4MDMsIDB4NEMsIDB4RkIsIDB4RjUsIDB4RkQsIDB4REEsIDB4MDAsIDB4ODYsIDB4MDAsCi0JMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhCRiwgMHgwMCwgMHg3RiwgMHgwMCwgMHhFNywKLQkweEZDLCAweEY4LCAweEZCLCAweEE5LCAweDA3LCAweEI4LCAweDFBLCAweDA0LCAweDIxLCAweDAyLCAweDEzLAotCTB4MDEsIDB4MDEsIDB4NDQsIDB4RkIsIDB4QjMsIDB4RkUsIDB4RjcsIDB4MDAsIDB4NUUsIDB4MDAsIDB4RjcsCi0JMHhGRiwgMHhGQywgMHhGRiwgMHgxOCwgMHgwMCwgMHhFMSwgMHgwMCwgMHgxNSwgMHgwMCwgMHgzNiwgMHhGQywKLQkweEY5LCAweEZDLCAweEZGLCAweDBBLCAweDRGLCAweDFELCAweENDLCAweDFGLCAweDc2LCAweDBGLCAweEVELAotCTB4RkUsIDB4OEEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4RkEsIDB4MDAsIDB4M0IsIDB4MDAsIDB4RjgsIDB4RkYsCi0JMHhGOSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGNywgMHgwMCwgMHg4QSwgMHhGRiwgMHhBOCwgMHhGQiwgMHg3MywKLQkweEZFLCAweDgwLCAweDBFLCAweDVBLCAweDFGLCAweEVCLCAweDFELCAweEVELCAweDBCLCAweDUzLCAweEZELAotCTB4MEMsIDB4RkMsIDB4RjMsIDB4RkYsIDB4RTgsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsCi0JMHhGRiwgMHg1NCwgMHgwMCwgMHhGQSwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1MCwgMHhGQiwgMHg2NiwgMHgwMCwKLQkweDBGLCAweDEyLCAweEMyLCAweDIwLCAweDc3LCAweDFCLCAweDg5LCAweDA4LCAweDMyLCAweEZDLCAweEI1LAotCTB4RkMsIDB4NjYsIDB4MDAsIDB4QzksIDB4MDAsIDB4MEEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsCi0JMHg3QiwgMHgwMCwgMHhFNSwgMHgwMCwgMHgyOSwgMHhGRSwgMHg0MSwgMHhGQiwgMHhDRiwgMHgwMiwgMHg4NywKLQkweDE1LCAweDc2LCAweDIxLCAweDhBLCAweDE4LCAweDY2LCAweDA1LCAweDg0LCAweEZCLCAweDc0LCAweEZELAotCTB4QjcsIDB4MDAsIDB4QTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsCi0JMHhGRiwgMHhBNSwgMHgwMCwgMHhCMiwgMHgwMCwgMHg2NSwgMHhGRCwgMHg4RSwgMHhGQiwgMHhBMSwgMHgwNSwKLQkweEM3LCAweDE4LCAweDZGLCAweDIxLCAweDQ1LCAweDE1LCAweDlCLCAweDAyLCAweDQwLCAweEZCLCAweDM4LAotCTB4RkUsIDB4RTcsIDB4MDAsIDB4NzgsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEIsIDB4MDAsCi0JMHhDQywgMHgwMCwgMHg1RSwgMHgwMCwgMHhBNywgMHhGQywgMHg0NCwgMHhGQywgMHhDQSwgMHgwOCwgMHhBQywKLQkweDFCLCAweEFELCAweDIwLCAweEM5LCAweDExLCAweDNCLCAweDAwLCAweDU0LCAweEZCLCAweEYxLCAweEZFLAotCTB4RkIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RUEsCi0JMHgwMCwgMHhFOCwgMHhGRiwgMHgwMCwgMHhGQywgMHg2RSwgMHhGRCwgMHgzMiwgMHgwQywgMHgxNiwgMHgxRSwKLQkweDM4LCAweDFGLCAweDNBLCAweDBFLCAweDUxLCAweEZFLCAweEIxLCAweEZCLCAweDk2LCAweEZGLCAweEY2LAotCTB4MDAsIDB4MzAsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4M0QsIDB4MDAsIDB4RkEsIDB4MDAsCi0JMHg1NCwgMHhGRiwgMHg4MiwgMHhGQiwgMHgxMiwgMHhGRiwgMHhCQywgMHgwRiwgMHhFQSwgMHgxRiwgMHgyMSwKLQkweDFELCAweEJCLCAweDBBLCAweEUxLCAweEZDLCAweDQzLCAweEZDLCAweDFFLCAweDAwLCAweERGLCAweDAwLAotCTB4MTYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjEsIDB4MDAsIDB4RjYsIDB4MDAsIDB4QTUsCi0JMHhGRSwgMHg0MiwgMHhGQiwgMHgyRiwgMHgwMSwgMHg0NywgMHgxMywgMHgxNSwgMHgyMSwgMHg4MCwgMHgxQSwKLQkweDZBLCAweDA3LCAweEU5LCAweEZCLCAweEY2LCAweEZDLCAweDg2LCAweDAwLCAweEJDLCAweDAwLCAweDA1LAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEEsIDB4MDAsIDB4RDcsIDB4MDAsIDB4RTYsIDB4RkQsCi0JMHg1MSwgMHhGQiwgMHhCRCwgMHgwMywgMHhCMCwgMHgxNiwgMHg4OSwgMHgyMSwgMHg3MSwgMHgxNywgMHg2MywKLQkweDA0LCAweDYxLCAweEZCLCAweEI4LCAweEZELCAweENCLCAweDAwLCAweDkzLCAweDAwLCAweEZCLCAweEZGLAotCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDAsIDB4QjMsIDB4MDAsIDB4OTksIDB4MDAsIDB4MjIsCi0JMHhGRCwgMHhDMCwgMHhGQiwgMHhCMCwgMHgwNiwgMHhENCwgMHgxOSwgMHg0MSwgMHgyMSwgMHgxNCwgMHgxNCwKLQkweEJDLCAweDAxLCAweDNELCAweEZCLCAweDdBLCAweEZFLCAweEYxLCAweDAwLCAweDZBLCAweDAwLCAweEY3LAotCTB4RkYsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RDcsIDB4MDAsIDB4MzksIDB4MDAsIDB4NkEsIDB4RkMsCi0JMHg5RCwgMHhGQywgMHhGMiwgMHgwOSwgMHg5MSwgMHgxQywgMHgzRiwgMHgyMCwgMHg4RSwgMHgxMCwgMHg4NCwKLQkweEZGLCAweDZELCAweEZCLCAweDJELCAweEZGLCAweEZDLCAweDAwLCAweDQ1LCAweDAwLCAweEY3LCAweEZGLAotCTB4RkEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RjIsIDB4MDAsIDB4QjgsIDB4RkYsIDB4Q0YsIDB4RkIsIDB4RjEsCi0JMHhGRCwgMHg2OSwgMHgwRCwgMHhDQSwgMHgxRSwgMHg5MCwgMHgxRSwgMHgwMSwgMHgwRCwgMHhDNCwgMHhGRCwKLQkweERGLCAweEZCLCAweEM5LCAweEZGLCAweEYwLCAweDAwLCAweDI2LCAweDAwLCAweEZBLCAweEZGLCAweEY3LAotCTB4RkYsIDB4NDksIDB4MDAsIDB4RkMsIDB4MDAsIDB4MUEsIDB4RkYsIDB4NjQsIDB4RkIsIDB4QzAsIDB4RkYsCi0JMHhGNywgMHgxMCwgMHg2NiwgMHgyMCwgMHg0NiwgMHgxQywgMHg4RSwgMHgwOSwgMHg3RSwgMHhGQywgMHg3RSwKLQkweEZDLCAweDQ2LCAweDAwLCAweEQ0LCAweDAwLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLAotCTB4NkYsIDB4MDAsIDB4RUUsIDB4MDAsIDB4NjQsIDB4RkUsIDB4M0QsIDB4RkIsIDB4MDUsIDB4MDIsIDB4N0IsCi0JMHgxNCwgMHg1MywgMHgyMSwgMHg3QywgMHgxOSwgMHg1NCwgMHgwNiwgMHhBRSwgMHhGQiwgMHgzOCwgMHhGRCwKLQkweEExLCAweDAwLCAweEFFLCAweDAwLCAweDAxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZDLAotCTB4RkYsIDB4OTgsIDB4MDAsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkQsIDB4NkMsIDB4RkIsIDB4QjgsIDB4MDQsCi0JMHhDRiwgMHgxNywgMHg4NSwgMHgyMSwgMHg0RSwgMHgxNiwgMHg2QywgMHgwMywgMHg0QSwgMHhGQiwgMHhGQywKLQkweEZELCAweERDLCAweDAwLCAweDg1LCAweDAwLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA3LCAweDAwLAotCTB4QzAsIDB4MDAsIDB4N0IsIDB4MDAsIDB4RTAsIDB4RkMsIDB4MDAsIDB4RkMsIDB4QzksIDB4MDcsIDB4RDMsCi0JMHgxQSwgMHhGQywgMHgyMCwgMHhERiwgMHgxMiwgMHhFQSwgMHgwMCwgMHg0NiwgMHhGQiwgMHhCQSwgMHhGRSwKLQkweEY4LCAweDAwLCAweDVELCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE5LCAweDAwLCAweEUyLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4MzAsIDB4RkMsIDB4MDUsIDB4RkQsIDB4MjEsIDB4MEIsIDB4NjYsIDB4MUQsCi0JMHhCRCwgMHgxRiwgMHg1MywgMHgwRiwgMHhEQiwgMHhGRSwgMHg4RSwgMHhGQiwgMHg2NiwgMHhGRiwgMHhGQSwKLQkweDAwLCAweDNBLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDM0LCAweDAwLCAweEY3LCAweDAwLAotCTB4ODQsIDB4RkYsIDB4QTQsIDB4RkIsIDB4ODQsIDB4RkUsIDB4QTMsIDB4MEUsIDB4NkMsIDB4MUYsIDB4RDYsCi0JMHgxRCwgMHhDQiwgMHgwQiwgMHg0NSwgMHhGRCwgMHgxMiwgMHhGQywgMHhGOCwgMHhGRiwgMHhFNywgMHgwMCwKLQkweDFELCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDU2LCAweDAwLCAweEZBLCAweDAwLCAweERELAotCTB4RkUsIDB4NEUsIDB4RkIsIDB4N0MsIDB4MDAsIDB4MzIsIDB4MTIsIDB4Q0MsIDB4MjAsIDB4NUMsIDB4MUIsCi0JMHg2OSwgMHgwOCwgMHgyOSwgMHhGQywgMHhCQywgMHhGQywgMHg2OSwgMHgwMCwgMHhDNywgMHgwMCwgMHgwOSwKLQkweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdELCAweDAwLCAweEUzLCAweDAwLCAweDIxLCAweEZFLAotCTB4NDMsIDB4RkIsIDB4RTksIDB4MDIsIDB4QTksIDB4MTUsIDB4NzksIDB4MjEsIDB4NkIsIDB4MTgsIDB4NDgsCi0JMHgwNSwgMHg4MCwgMHhGQiwgMHg3QywgMHhGRCwgMHhCOSwgMHgwMCwgMHhBMCwgMHgwMCwgMHhGRCwgMHhGRiwKLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEE2LCAweDAwLCAweEFGLCAweDAwLCAweDVFLAotCTB4RkQsIDB4OTMsIDB4RkIsIDB4QkUsIDB4MDUsIDB4RTUsIDB4MTgsIDB4NkIsIDB4MjEsIDB4MjMsIDB4MTUsCi0JMHg4MiwgMHgwMiwgMHgzRiwgMHhGQiwgMHgzRiwgMHhGRSwgMHhFOSwgMHgwMCwgMHg3NywgMHgwMCwgMHhGOCwKLQkweEZGLCAweEZFLCAweEZGLCAweDBDLCAweDAwLCAweENELCAweDAwLCAweDVBLCAweDAwLCAweEEwLCAweEZDLAotCTB4NEQsIDB4RkMsIDB4RUEsIDB4MDgsIDB4QzYsIDB4MUIsIDB4QTEsIDB4MjAsIDB4QTYsIDB4MTEsIDB4MjYsCi0JMHgwMCwgMHg1NywgMHhGQiwgMHhGOCwgMHhGRSwgMHhGQiwgMHgwMCwgMHg1MCwgMHgwMCwgMHhGNywgMHhGRiwKLQkweEZCLCAweEZGLCAweDIxLCAweDAwLCAweEVCLCAweDAwLCAweEUzLCAweEZGLCAweEZBLCAweEZCLCAweDdDLAotCTB4RkQsIDB4NTQsIDB4MEMsIDB4MkIsIDB4MUUsIDB4MjYsIDB4MUYsIDB4MTcsIDB4MEUsIDB4NDEsIDB4RkUsCi0JMHhCNiwgMHhGQiwgMHg5QywgMHhGRiwgMHhGNSwgMHgwMCwgMHgyRiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwKLQkweEZGLCAweDNGLCAweDAwLCAweEZCLCAweDAwLCAweDRELCAweEZGLCAweDdGLCAweEZCLCAweDI0LCAweEZGLAotCTB4REYsIDB4MEYsIDB4RjksIDB4MUYsIDB4MDksIDB4MUQsIDB4OTksIDB4MEEsIDB4RDUsIDB4RkMsIDB4NDksCi0JMHhGQywgMHgyMywgMHgwMCwgMHhERCwgMHgwMCwgMHgxNiwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwKLQkweDYzLCAweDAwLCAweEY1LCAweDAwLCAweDlFLCAweEZFLCAweDQxLCAweEZCLCAweDQ2LCAweDAxLCAweDY5LAotCTB4MTMsIDB4MUQsIDB4MjEsIDB4NjMsIDB4MUEsIDB4NEIsIDB4MDcsIDB4RTIsIDB4RkIsIDB4RkQsIDB4RkMsCi0JMHg4OSwgMHgwMCwgMHhCQSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4QiwKLQkweDAwLCAweEQ1LCAweDAwLCAweERFLCAweEZELCAweDUzLCAweEZCLCAweEQ5LCAweDAzLCAweEQwLCAweDE2LAotCTB4OEEsIDB4MjEsIDB4NTEsIDB4MTcsIDB4NDcsIDB4MDQsIDB4NUUsIDB4RkIsIDB4QzAsIDB4RkQsIDB4Q0QsCi0JMHgwMCwgMHg5MiwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMCwKLQkweEI0LCAweDAwLCAweDk2LCAweDAwLCAweDFCLCAweEZELCAweEM3LCAweEZCLCAweENGLCAweDA2LCAweEYwLAotCTB4MTksIDB4M0EsIDB4MjEsIDB4RjIsIDB4MTMsIDB4QTQsIDB4MDEsIDB4M0UsIDB4RkIsIDB4ODEsIDB4RkUsCi0JMHhGMiwgMHgwMCwgMHg2OSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhEOSwKLQkweDAwLCAweDM1LCAweDAwLCAweDYzLCAweEZDLCAweEE4LCAweEZDLCAweDEzLCAweDBBLCAweEE5LCAweDFDLAotCTB4MzIsIDB4MjAsIDB4NkIsIDB4MTAsIDB4NzEsIDB4RkYsIDB4NzEsIDB4RkIsIDB4MzQsIDB4RkYsIDB4RkIsCi0JMHgwMCwgMHg0NCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGMywgMHgwMCwKLQkweEIzLCAweEZGLCAweENBLCAweEZCLCAweDAxLCAweEZFLCAweDhDLCAweDBELCAweERELCAweDFFLCAweDdDLAotCTB4MUUsIDB4REUsIDB4MEMsIDB4QjUsIDB4RkQsIDB4RTQsIDB4RkIsIDB4Q0UsIDB4RkYsIDB4RUYsIDB4MDAsCi0JMHgyNSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0QSwgMHgwMCwgMHhGQywgMHgwMCwgMHgxMywKLQkweEZGLCAweDYxLCAweEZCLCAweEQ0LCAweEZGLCAweDFBLCAweDExLCAweDcyLCAweDIwLCAweDJELCAweDFDLAotCTB4NkQsIDB4MDksIDB4NzQsIDB4RkMsIDB4ODUsIDB4RkMsIDB4NEEsIDB4MDAsIDB4RDIsIDB4MDAsIDB4MEYsCi0JMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg3MCwgMHgwMCwgMHhFRCwgMHgwMCwgMHg1RCwgMHhGRSwKLQkweDNELCAweEZCLCAweDFFLCAweDAyLCAweDlDLCAweDE0LCAweDU4LCAweDIxLCAweDVFLCAweDE5LCAweDM2LAotCTB4MDYsIDB4QTgsIDB4RkIsIDB4NDAsIDB4RkQsIDB4QTQsIDB4MDAsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwgMHg5QSwgMHgwMCwgMHhDMywgMHgwMCwgMHg5QSwKLQkweEZELCAweDZGLCAweEZCLCAweEQ1LCAweDA0LCAweEVGLCAweDE3LCAweDgzLCAweDIxLCAweDJELCAweDE2LAotCTB4NTIsIDB4MDMsIDB4NDksIDB4RkIsIDB4MDQsIDB4RkUsIDB4REQsIDB4MDAsIDB4ODMsIDB4MDAsIDB4RjksCi0JMHhGRiwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwgMHhDMiwgMHgwMCwgMHg3OCwgMHgwMCwgMHhEOSwgMHhGQywKLQkweDA4LCAweEZDLCAweEU5LCAweDA3LCAweEVGLCAweDFBLCAweEYzLCAweDIwLCAweEJDLCAweDEyLCAweEQ0LAotCTB4MDAsIDB4NDcsIDB4RkIsIDB4QzEsIDB4RkUsIDB4RjgsIDB4MDAsIDB4NUIsIDB4MDAsIDB4RjcsIDB4RkYsCi0JMHhGQywgMHhGRiwgMHgxQSwgMHgwMCwgMHhFMywgMHgwMCwgMHgwQiwgMHgwMCwgMHgyQSwgMHhGQywgMHgxMiwKLQkweEZELCAweDQyLCAweDBCLCAweDdELCAweDFELCAweEFELCAweDFGLCAweDJGLCAweDBGLCAweEM5LCAweEZFLAotCTB4OTIsIDB4RkIsIDB4NkMsIDB4RkYsIDB4RjksIDB4MDAsIDB4MzgsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksCi0JMHhGRiwgMHgzNSwgMHgwMCwgMHhGOCwgMHgwMCwgMHg3RSwgMHhGRiwgMHg5RiwgMHhGQiwgMHg5NSwgMHhGRSwKLQkweEM2LCAweDBFLCAweDdDLCAweDFGLCAweEMwLCAweDFELCAweEE5LCAweDBCLCAweDM4LCAweEZELCAweDE4LAotCTB4RkMsIDB4RkQsIDB4RkYsIDB4RTYsIDB4MDAsIDB4MUQsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsCi0JMHg1NywgMHgwMCwgMHhGQSwgMHgwMCwgMHhENiwgMHhGRSwgMHg0QywgMHhGQiwgMHg5MiwgMHgwMCwgMHg1NCwKLQkweDEyLCAweEQ2LCAweDIwLCAweDQxLCAweDFCLCAweDQ5LCAweDA4LCAweDIwLCAweEZDLCAweEMzLCAweEZDLAotCTB4NkQsIDB4MDAsIDB4QzYsIDB4MDAsIDB4MDksIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0UsCi0JMHgwMCwgMHhFMiwgMHgwMCwgMHgxQSwgMHhGRSwgMHg0NCwgMHhGQiwgMHgwMywgMHgwMywgMHhDQSwgMHgxNSwKLQkweDdDLCAweDIxLCAweDRDLCAweDE4LCAweDJCLCAweDA1LCAweDdCLCAweEZCLCAweDgzLCAweEZELCAweEJDLAotCTB4MDAsIDB4OUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCi0JMHhBOCwgMHgwMCwgMHhBRCwgMHgwMCwgMHg1NiwgMHhGRCwgMHg5OCwgMHhGQiwgMHhEQywgMHgwNSwgMHgwNCwKLQkweDE5LCAweDY2LCAweDIxLCAweDAyLCAweDE1LCAweDY5LCAweDAyLCAweDNFLCAweEZCLCAweDQ3LCAweEZFLAotCTB4RUEsIDB4MDAsIDB4NzUsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0UsCi0JMHgwMCwgMHg1NiwgMHgwMCwgMHg5OSwgMHhGQywgMHg1NiwgMHhGQywgMHgwQiwgMHgwOSwgMHhFMCwgMHgxQiwKLQkweDk2LCAweDIwLCAweDgzLCAweDExLCAweDExLCAweDAwLCAweDU5LCAweEZCLCAweEZGLCAweEZFLCAweEZCLAotCTB4MDAsIDB4NEUsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RUMsIDB4MDAsCi0JMHhERSwgMHhGRiwgMHhGNSwgMHhGQiwgMHg4QSwgMHhGRCwgMHg3NywgMHgwQywgMHgzRiwgMHgxRSwgMHgxNCwKLQkweDFGLCAweEY1LCAweDBELCAweDMxLCAweEZFLCAweEJCLCAweEZCLCAweEEyLCAweEZGLCAweEY1LCAweDAwLAotCTB4MkUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDAsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NDcsCi0JMHhGRiwgMHg3QiwgMHhGQiwgMHgzNywgMHhGRiwgMHgwMiwgMHgxMCwgMHgwNywgMHgyMCwgMHhGMiwgMHgxQywKLQkweDc4LCAweDBBLCAweENBLCAweEZDLCAweDUwLCAweEZDLCAweDI3LCAweDAwLCAweERDLCAweDAwLCAweDE1LAotCTB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjQsIDB4MDAsIDB4RjUsIDB4MDAsIDB4OTcsIDB4RkUsCi0JMHg0MCwgMHhGQiwgMHg1RCwgMHgwMSwgMHg4QiwgMHgxMywgMHgyNSwgMHgyMSwgMHg0NywgMHgxQSwgMHgyQywKLQkweDA3LCAweERCLCAweEZCLCAweDA1LCAweEZELCAweDhDLCAweDAwLCAweEI5LCAweDAwLCAweDA0LCAweDAwLAotCTB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEQsIDB4MDAsIDB4RDMsIDB4MDAsIDB4RDYsIDB4RkQsIDB4NTYsCi0JMHhGQiwgMHhGNCwgMHgwMywgMHhGMCwgMHgxNiwgMHg4QSwgMHgyMSwgMHgzMSwgMHgxNywgMHgyQiwgMHgwNCwKLQkweDVCLCAweEZCLCAweEM3LCAweEZELCAweENGLCAweDAwLCAweDkwLCAweDAwLCAweEZBLCAweEZGLCAweDAwLAotCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsIDB4QjYsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTMsIDB4RkQsCi0JMHhDRCwgMHhGQiwgMHhFRSwgMHgwNiwgMHgwRCwgMHgxQSwgMHgzMywgMHgyMSwgMHhEMCwgMHgxMywgMHg4QywKLQkweDAxLCAweDNFLCAweEZCLCAweDg4LCAweEZFLCAweEYzLCAweDAwLCAweDY3LCAweDAwLCAweEY3LCAweEZGLAotCTB4MDYsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4QTEsIDB4MDIsIDB4QTYsCi0JMHhGOCwgMHg1NiwgMHgwMiwgMHhBNSwgMHgyOCwgMHhBNSwgMHgyOCwgMHg1NiwgMHgwMiwgMHhBNiwgMHhGOCwKLQkweEExLCAweDAyLCAweEZFLCAweDAwLCAweDAzLCAweEZGLCAweDFELCAweDAwLCAweDA2LCAweDAwLCAweDAwLAotCTB4MDAsIDB4MjEsIDB4MDAsIDB4QTYsIDB4RkYsIDB4M0YsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NDIsIDB4RkUsCi0JMHgzRSwgMHhGOCwgMHg3RiwgMHgxNSwgMHhBQywgMHgzMCwgMHg3RiwgMHgxNSwgMHgzRSwgMHhGOCwgMHg0MiwKLQkweEZFLCAweDBCLCAweDAzLCAweDNGLCAweEZGLCAweEE2LCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLAotCTB4RkEsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4MTQsIDB4MDEsIDB4MDAsIDB4RkQsIDB4MzUsIDB4MDYsIDB4RDUsCi0JMHhGNCwgMHhEQSwgMHgxNSwgMHg5MiwgMHg0MCwgMHhBRSwgMHhGRSwgMHhGMywgMHhGQywgMHg2OCwgMHgwMywKLQkweDg2LCAweEZELCAweDUxLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVDLAotCTB4RkYsIDB4RjksIDB4RkYsIDB4QzYsIDB4MDAsIDB4NTUsIDB4RkQsIDB4MzUsIDB4MDYsIDB4OTAsIDB4RjMsCi0JMHhFNSwgMHgxQywgMHg2QiwgMHgzRCwgMHg3MSwgMHhGQSwgMHgzNCwgMHhGRiwgMHg0NiwgMHgwMiwgMHhGRiwKLQkweEZELCAweDJELCAweDAxLCAweDkwLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERCLCAweEZGLAotCTB4MkQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4RTEsIDB4RkQsIDB4Q0UsIDB4MDUsIDB4RUQsIDB4RjIsIDB4RjMsCi0JMHgyMywgMHgyMCwgMHgzOSwgMHgyMiwgMHhGNywgMHg0NCwgMHgwMSwgMHgxRiwgMHgwMSwgMHg4OSwgMHhGRSwKLQkweEZCLCAweDAwLCAweDlDLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM5LCAweEZGLCAweDY4LAotCTB4MDAsIDB4RTUsIDB4RkYsIDB4QTAsIDB4RkUsIDB4RkIsIDB4MDQsIDB4MEMsIDB4RjMsIDB4QzUsIDB4MkEsCi0JMHhEOCwgMHgzMywgMHhDOSwgMHhGNCwgMHgwQiwgMHgwMywgMHgwNSwgMHgwMCwgMHgxQSwgMHhGRiwgMHhDMSwKLQkweDAwLCAweEFELCAweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEI1LCAweEZGLCAweEE1LCAweDAwLAotCTB4NUMsIDB4RkYsIDB4OEMsIDB4RkYsIDB4QkYsIDB4MDMsIDB4MDYsIDB4RjQsIDB4MjIsIDB4MzEsIDB4QzgsCi0JMHgyRCwgMHg2MywgMHhGMywgMHg3NiwgMHgwNCwgMHgwOCwgMHhGRiwgMHhBNywgMHhGRiwgMHg4NCwgMHgwMCwKLQkweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDBDLCAweDAwLCAweEE0LCAweEZGLCAweEUxLCAweDAwLCAweENCLAotCTB4RkUsIDB4OUIsIDB4MDAsIDB4MjEsIDB4MDIsIDB4RUUsIDB4RjUsIDB4Q0QsIDB4MzYsIDB4MjQsIDB4MjcsCi0JMHhFMSwgMHhGMiwgMHg3QSwgMHgwNSwgMHgzMywgMHhGRSwgMHgyQSwgMHgwMCwgMHg0NywgMHgwMCwgMHhEMywKLQkweEZGLCAweDA0LCAweDAwLCAweDBGLCAweDAwLCAweDk1LCAweEZGLCAweDE3LCAweDAxLCAweDNELCAweEZFLAotCTB4QkQsIDB4MDEsIDB4MzAsIDB4MDAsIDB4Q0MsIDB4RjgsIDB4OTIsIDB4M0IsIDB4MkEsIDB4MjAsIDB4MkUsCi0JMHhGMywgMHgxMiwgMHgwNiwgMHg4RiwgMHhGRCwgMHg5QSwgMHgwMCwgMHgxMCwgMHgwMCwgMHhFNSwgMHhGRiwKLQkweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDhDLCAweEZGLCAweDQyLCAweDAxLCAweEJCLCAweEZELCAweEU0LAotCTB4MDIsIDB4MDEsIDB4RkUsIDB4OUMsIDB4RkMsIDB4NDUsIDB4M0YsIDB4MTYsIDB4MTksIDB4MkQsIDB4RjQsCi0JMHg0MSwgMHgwNiwgMHgyMSwgMHhGRCwgMHhGMywgMHgwMCwgMHhFMCwgMHhGRiwgMHhGNCwgMHhGRiwgMHgwMSwKLQkweDAwLCAweDEwLCAweDAwLCAweDhCLCAweEZGLCAweDVELCAweDAxLCAweDRGLCAweEZELCAweEZCLCAweDAzLAotCTB4QjIsIDB4RkIsIDB4NTMsIDB4MDEsIDB4QzIsIDB4NDEsIDB4MjQsIDB4MTIsIDB4QkEsIDB4RjUsIDB4MEYsCi0JMHgwNiwgMHhFOSwgMHhGQywgMHgzMywgMHgwMSwgMHhCQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDBELCAweDAwLCAweDkzLCAweEZGLCAweDYzLCAweDAxLCAweDA0LCAweEZELCAweEVGLCAweDA0LCAweDYyLAotCTB4RjksIDB4RDcsIDB4MDYsIDB4RjIsIDB4NDIsIDB4OEQsIDB4MEIsIDB4QjAsIDB4RjcsIDB4ODcsIDB4MDUsCi0JMHhFNiwgMHhGQywgMHg1OCwgMHgwMSwgMHhBMCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDAwLCAweDA3LCAweDAwLCAweEE1LCAweEZGLCAweDUyLCAweDAxLCAweEUyLCAweEZDLCAweEFELCAweDA1LAotCTB4MzUsIDB4RjcsIDB4MDgsIDB4MEQsIDB4Q0IsIDB4NDIsIDB4ODEsIDB4MDUsIDB4RTgsIDB4RjksIDB4QkIsCi0JMHgwNCwgMHgxMiwgMHhGRCwgMHg2NCwgMHgwMSwgMHg5MCwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweEZFLCAweEZGLCAweEMyLCAweEZGLCAweDI3LCAweDAxLCAweEYxLCAweEZDLCAweDIyLCAweDA2LCAweDU0LAotCTB4RjUsIDB4QjgsIDB4MTMsIDB4NEEsIDB4NDEsIDB4MjksIDB4MDAsIDB4M0MsIDB4RkMsIDB4QkQsIDB4MDMsCi0JMHg2NiwgMHhGRCwgMHg1OCwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMSwKLQkweEZGLCAweEVCLCAweEZGLCAweEUxLCAweDAwLCAweDM1LCAweEZELCAweDQwLCAweDA2LCAweEU0LCAweEYzLAotCTB4QjcsIDB4MUEsIDB4ODUsIDB4M0UsIDB4QTYsIDB4RkIsIDB4ODYsIDB4RkUsIDB4QTAsIDB4MDIsIDB4RDcsCi0JMHhGRCwgMHgzOSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhFMSwgMHhGRiwKLQkweDFDLCAweDAwLCAweDgyLCAweDAwLCAweEIwLCAweEZELCAweEY5LCAweDA1LCAweDBDLCAweEYzLCAweENCLAotCTB4MjEsIDB4OEYsIDB4M0EsIDB4MEQsIDB4RjgsIDB4QTksIDB4MDAsIDB4NzksIDB4MDEsIDB4NUQsIDB4RkUsCi0JMHgwQiwgMHgwMSwgMHg5OCwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDRSwgMHhGRiwgMHg1NSwKLQkweDAwLCAweDBELCAweDAwLCAweDYwLCAweEZFLCAweDQ4LCAweDA1LCAweEVDLCAweEYyLCAweEI2LCAweDI4LAotCTB4OTEsIDB4MzUsIDB4NjgsIDB4RjUsIDB4ODgsIDB4MDIsIDB4NUEsIDB4MDAsIDB4RUQsIDB4RkUsIDB4RDQsCi0JMHgwMCwgMHhBOCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg5MiwgMHgwMCwKLQkweDg3LCAweEZGLCAweDNGLCAweEZGLCAweDJCLCAweDA0LCAweEExLCAweEYzLCAweDNELCAweDJGLCAweEI4LAotCTB4MkYsIDB4QjgsIDB4RjMsIDB4MTEsIDB4MDQsIDB4NTIsIDB4RkYsIDB4N0MsIDB4RkYsIDB4OTcsIDB4MDAsCi0JMHhCQSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBOSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhGOCwKLQkweEZFLCAweDQ0LCAweDAwLCAweEFBLCAweDAyLCAweDNFLCAweEY1LCAweDI0LCAweDM1LCAweDNCLCAweDI5LAotCTB4RjIsIDB4RjIsIDB4MzUsIDB4MDUsIDB4NzAsIDB4RkUsIDB4MDMsIDB4MDAsIDB4NUEsIDB4MDAsIDB4Q0QsCi0JMHhGRiwgMHgwNSwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5OSwgMHhGRiwgMHgwNywgMHgwMSwgMHg2OCwgMHhGRSwKLQkweDYzLCAweDAxLCAweEQwLCAweDAwLCAweEQwLCAweEY3LCAweDM1LCAweDNBLCAweDU1LCAweDIyLCAweDAyLAotCTB4RjMsIDB4RUYsIDB4MDUsIDB4QkMsIDB4RkQsIDB4N0EsIDB4MDAsIDB4MjAsIDB4MDAsIDB4REYsIDB4RkYsCi0JMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHg4RSwgMHhGRiwgMHgzNiwgMHgwMSwgMHhFMSwgMHhGRCwgMHg4QSwKLQkweDAyLCAweEIyLCAweEZFLCAweDU2LCAweEZCLCAweDQwLCAweDNFLCAweDQyLCAweDFCLCAweENFLCAweEYzLAotCTB4M0UsIDB4MDYsIDB4M0QsIDB4RkQsIDB4REIsIDB4MDAsIDB4RUUsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDEsCi0JMHgwMCwgMHgxMSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1NywgMHgwMSwgMHg2RCwgMHhGRCwgMHhBOCwgMHgwMywKLQkweDY5LCAweEZDLCAweEM4LCAweEZGLCAweDIwLCAweDQxLCAweDQwLCAweDE0LCAweDMzLCAweEY1LCAweDI4LAotCTB4MDYsIDB4RjUsIDB4RkMsIDB4MjIsIDB4MDEsIDB4QzUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCi0JMHgwRiwgMHgwMCwgMHg4RiwgMHhGRiwgMHg2NCwgMHgwMSwgMHgxNywgMHhGRCwgMHhBOSwgMHgwNCwgMHgxNiwKLQkweEZBLCAweDEwLCAweDA1LCAweEI4LCAweDQyLCAweDg3LCAweDBELCAweDBELCAweEY3LCAweEI5LCAweDA1LAotCTB4RTIsIDB4RkMsIDB4NTAsIDB4MDEsIDB4QTcsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHgwQSwgMHgwMCwgMHg5RSwgMHhGRiwgMHg1QSwgMHgwMSwgMHhFOCwgMHhGQywgMHg3QSwgMHgwNSwKLQkweERBLCAweEY3LCAweDEwLCAweDBCLCAweEZCLCAweDQyLCAweDRCLCAweDA3LCAweDM1LCAweEY5LCAweDAwLAotCTB4MDUsIDB4MDAsIDB4RkQsIDB4NjMsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMSwgMHgwMCwgMHhCOCwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNywgMHhGQywgMHgwNywgMHgwNiwgMHhERSwKLQkweEY1LCAweDlGLCAweDExLCAweEU0LCAweDQxLCAweEI4LCAweDAxLCAweDg0LCAweEZCLCAweDBGLCAweDA0LAotCTB4NDgsIDB4RkQsIDB4NUUsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjUsCi0JMHhGRiwgMHhERCwgMHhGRiwgMHhGOSwgMHgwMCwgMHgxQiwgMHhGRCwgMHg0MSwgMHgwNiwgMHg0NywgMHhGNCwKLQkweDhCLCAweDE4LCAweDgxLCAweDNGLCAweEYxLCAweEZDLCAweEQ1LCAweEZELCAweEZBLCAweDAyLCAweEIyLAotCTB4RkQsIDB4NDUsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTYsIDB4RkYsCi0JMHgwQywgMHgwMCwgMHhBMiwgMHgwMCwgMHg4NSwgMHhGRCwgMHgxQSwgMHgwNiwgMHgzQywgMHhGMywgMHg5RiwKLQkweDFGLCAweEU2LCAweDNCLCAweDBFLCAweEY5LCAweDA3LCAweDAwLCAweEQ0LCAweDAxLCAweDMzLCAweEZFLAotCTB4MUIsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDQsIDB4RkYsIDB4NDMsCi0JMHgwMCwgMHgzMywgMHgwMCwgMHgyNSwgMHhGRSwgMHg4OSwgMHgwNSwgMHhFMCwgMHhGMiwgMHg5QywgMHgyNiwKLQkweDMzLCAweDM3LCAweDFFLCAweEY2LCAweEZELCAweDAxLCAweEIwLCAweDAwLCAweEMwLCAweEZFLCAweEU2LAotCTB4MDAsIDB4QTIsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzEsIDB4RkYsIDB4N0YsIDB4MDAsCi0JMHhCMiwgMHhGRiwgMHhGNiwgMHhGRSwgMHg4RSwgMHgwNCwgMHg1MSwgMHhGMywgMHg0OSwgMHgyRCwgMHg5OCwKLQkweDMxLCAweDIzLCAweEY0LCAweEEyLCAweDAzLCAweEEwLCAweEZGLCAweDUxLCAweEZGLCAweEFBLCAweDAwLAotCTB4QjQsIDB4RkYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QkQsIDB4MDAsIDB4MjUsCi0JMHhGRiwgMHhGMSwgMHhGRiwgMHgyQiwgMHgwMywgMHhBNSwgMHhGNCwgMHg2OCwgMHgzMywgMHg0OCwgMHgyQiwKLQkweDE3LCAweEYzLCAweEU3LCAweDA0LCAweEIxLCAweEZFLCAweERCLCAweEZGLCAweDZDLCAweDAwLCAweEM3LAotCTB4RkYsIDB4MDYsIDB4MDAsIDB4MEQsIDB4MDAsIDB4OUUsIDB4RkYsIDB4RjcsIDB4MDAsIDB4OTQsIDB4RkUsCi0JMHgwOSwgMHgwMSwgMHg2QSwgMHgwMSwgMHhFQiwgMHhGNiwgMHhDMSwgMHgzOCwgMHg3RCwgMHgyNCwgMHhFOCwKLQkweEYyLCAweEMxLCAweDA1LCAweEVFLCAweEZELCAweDU3LCAweDAwLCAweDMxLCAweDAwLCAweERBLCAweEZGLAotCTB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OTEsIDB4RkYsIDB4MjksIDB4MDEsIDB4MDksIDB4RkUsIDB4MkYsCi0JMHgwMiwgMHg1RiwgMHhGRiwgMHgyNywgMHhGQSwgMHgyMCwgMHgzRCwgMHg3MCwgMHgxRCwgMHg3RCwgMHhGMywKLQkweDMxLCAweDA2LCAweDVFLCAweEZELCAweEJGLCAweDAwLCAweEZELCAweEZGLCAweEVCLCAweEZGLCAweDAyLAotCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NEUsIDB4MDEsIDB4OEUsIDB4RkQsIDB4NTIsIDB4MDMsCi0JMHgyMCwgMHhGRCwgMHg1MiwgMHhGRSwgMHg2MCwgMHg0MCwgMHg2MywgMHgxNiwgMHhCNywgMHhGNCwgMHgzOSwKLQkweDA2LCAweDA1LCAweEZELCAweDBGLCAweDAxLCAweEQxLCAweEZGLCAweEY5LCAweEZGLCAweDAwLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4OEQsIDB4RkYsIDB4NjIsIDB4MDEsIDB4MkUsIDB4RkQsIDB4NUUsIDB4MDQsIDB4Q0MsCi0JMHhGQSwgMHg1QiwgMHgwMywgMHg1RSwgMHg0MiwgMHg4RSwgMHgwRiwgMHg3MSwgMHhGNiwgMHhFNCwgMHgwNSwKLQkweEUyLCAweEZDLCAweDQ1LCAweDAxLCAweEFGLCAweEZGLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDAsIDB4MEIsIDB4MDAsIDB4OTksIDB4RkYsIDB4NjAsIDB4MDEsIDB4RjIsIDB4RkMsIDB4NDAsIDB4MDUsCi0JMHg4NSwgMHhGOCwgMHgyNiwgMHgwOSwgMHgwQywgMHg0MywgMHgyNiwgMHgwOSwgMHg4NSwgMHhGOCwgMHg0MCwKLQkweDA1LCAweEYyLCAweEZDLCAweDYwLCAweDAxLCAweDk5LCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLAotCTB4MDQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4NDUsIDB4MDEsIDB4RTIsIDB4RkMsIDB4RTQsIDB4MDUsIDB4NzEsCi0JMHhGNiwgMHg4RSwgMHgwRiwgMHg1RSwgMHg0MiwgMHg1QiwgMHgwMywgMHhDQywgMHhGQSwgMHg1RSwgMHgwNCwKLQkweDJFLCAweEZELCAweDYyLCAweDAxLCAweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LAotCTB4RkYsIDB4RDEsIDB4RkYsIDB4MEYsIDB4MDEsIDB4MDUsIDB4RkQsIDB4MzksIDB4MDYsIDB4QjcsIDB4RjQsCi0JMHg2MywgMHgxNiwgMHg2MCwgMHg0MCwgMHg1MiwgMHhGRSwgMHgyMCwgMHhGRCwgMHg1MiwgMHgwMywgMHg4RSwKLQkweEZELCAweDRFLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEVCLCAweEZGLAotCTB4RkQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4NUUsIDB4RkQsIDB4MzEsIDB4MDYsIDB4N0QsIDB4RjMsIDB4NzAsCi0JMHgxRCwgMHgyMCwgMHgzRCwgMHgyNywgMHhGQSwgMHg1RiwgMHhGRiwgMHgyRiwgMHgwMiwgMHgwOSwgMHhGRSwKLQkweDI5LCAweDAxLCAweDkxLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERBLCAweEZGLCAweDMxLAotCTB4MDAsIDB4NTcsIDB4MDAsIDB4RUUsIDB4RkQsIDB4QzEsIDB4MDUsIDB4RTgsIDB4RjIsIDB4N0QsIDB4MjQsCi0JMHhDMSwgMHgzOCwgMHhFQiwgMHhGNiwgMHg2QSwgMHgwMSwgMHgwOSwgMHgwMSwgMHg5NCwgMHhGRSwgMHhGNywKLQkweDAwLCAweDlFLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM3LCAweEZGLCAweDZDLCAweDAwLAotCTB4REIsIDB4RkYsIDB4QjEsIDB4RkUsIDB4RTcsIDB4MDQsIDB4MTcsIDB4RjMsIDB4NDgsIDB4MkIsIDB4NjgsCi0JMHgzMywgMHhBNSwgMHhGNCwgMHgyQiwgMHgwMywgMHhGMSwgMHhGRiwgMHgyNSwgMHhGRiwgMHhCRCwgMHgwMCwKLQkweEFFLCAweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEI0LCAweEZGLCAweEFBLCAweDAwLCAweDUxLAotCTB4RkYsIDB4QTAsIDB4RkYsIDB4QTIsIDB4MDMsIDB4MjMsIDB4RjQsIDB4OTgsIDB4MzEsIDB4NDksIDB4MkQsCi0JMHg1MSwgMHhGMywgMHg4RSwgMHgwNCwgMHhGNiwgMHhGRSwgMHhCMiwgMHhGRiwgMHg3RiwgMHgwMCwgMHhDMSwKLQkweEZGLCAweDA3LCAweDAwLCAweDBDLCAweDAwLCAweEEyLCAweEZGLCAweEU2LCAweDAwLCAweEMwLCAweEZFLAotCTB4QjAsIDB4MDAsIDB4RkQsIDB4MDEsIDB4MUUsIDB4RjYsIDB4MzMsIDB4MzcsIDB4OUMsIDB4MjYsIDB4RTAsCi0JMHhGMiwgMHg4OSwgMHgwNSwgMHgyNSwgMHhGRSwgMHgzMywgMHgwMCwgMHg0MywgMHgwMCwgMHhENCwgMHhGRiwKLQkweDA0LCAweDAwLCAweDBGLCAweDAwLCAweDk0LCAweEZGLCAweDFCLCAweDAxLCAweDMzLCAweEZFLCAweEQ0LAotCTB4MDEsIDB4MDcsIDB4MDAsIDB4MEUsIDB4RjksIDB4RTYsIDB4M0IsIDB4OUYsIDB4MUYsIDB4M0MsIDB4RjMsCi0JMHgxQSwgMHgwNiwgMHg4NSwgMHhGRCwgMHhBMiwgMHgwMCwgMHgwQywgMHgwMCwgMHhFNiwgMHhGRiwgMHgwMiwKLQkweDAwLCAweDExLCAweDAwLCAweDhDLCAweEZGLCAweDQ1LCAweDAxLCAweEIyLCAweEZELCAweEZBLCAweDAyLAotCTB4RDUsIDB4RkQsIDB4RjEsIDB4RkMsIDB4ODEsIDB4M0YsIDB4OEIsIDB4MTgsIDB4NDcsIDB4RjQsIDB4NDEsCi0JMHgwNiwgMHgxQiwgMHhGRCwgMHhGOSwgMHgwMCwgMHhERCwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwMSwgMHgwMCwKLQkweDEwLCAweDAwLCAweDhCLCAweEZGLCAweDVFLCAweDAxLCAweDQ4LCAweEZELCAweDBGLCAweDA0LCAweDg0LAotCTB4RkIsIDB4QjgsIDB4MDEsIDB4RTQsIDB4NDEsIDB4OUYsIDB4MTEsIDB4REUsIDB4RjUsIDB4MDcsIDB4MDYsCi0JMHhFNywgMHhGQywgMHgzNywgMHgwMSwgMHhCOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKLQkweDAwLCAweDk0LCAweEZGLCAweDYzLCAweDAxLCAweDAwLCAweEZELCAweDAwLCAweDA1LCAweDM1LCAweEY5LAotCTB4NEIsIDB4MDcsIDB4RkIsIDB4NDIsIDB4MTAsIDB4MEIsIDB4REEsIDB4RjcsIDB4N0EsIDB4MDUsIDB4RTgsCi0JMHhGQywgMHg1QSwgMHgwMSwgMHg5RSwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkweDA3LCAweDAwLCAweEE3LCAweEZGLCAweDUwLCAweDAxLCAweEUyLCAweEZDLCAweEI5LCAweDA1LCAweDBELAotCTB4RjcsIDB4ODcsIDB4MEQsIDB4QjgsIDB4NDIsIDB4MTAsIDB4MDUsIDB4MTYsIDB4RkEsIDB4QTksIDB4MDQsCi0JMHgxNywgMHhGRCwgMHg2NCwgMHgwMSwgMHg4RiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKLQkweEZGLCAweEM1LCAweEZGLCAweDIyLCAweDAxLCAweEY1LCAweEZDLCAweDI4LCAweDA2LCAweDMzLCAweEY1LAotCTB4NDAsIDB4MTQsIDB4MjAsIDB4NDEsIDB4QzgsIDB4RkYsIDB4NjksIDB4RkMsIDB4QTgsIDB4MDMsIDB4NkQsCi0JMHhGRCwgMHg1NywgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMCwgMHhGRiwKLQkweEVFLCAweEZGLCAweERCLCAweDAwLCAweDNELCAweEZELCAweDNFLCAweDA2LCAweENFLCAweEYzLCAweDQyLAotCTB4MUIsIDB4NDAsIDB4M0UsIDB4NTYsIDB4RkIsIDB4QjIsIDB4RkUsIDB4OEEsIDB4MDIsIDB4RTEsIDB4RkQsCi0JMHgzNiwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERiwgMHhGRiwgMHgyMCwKLQkweDAwLCAweDdBLCAweDAwLCAweEJDLCAweEZELCAweEVGLCAweDA1LCAweDAyLCAweEYzLCAweDU1LCAweDIyLAotCTB4MzUsIDB4M0EsIDB4RDAsIDB4RjcsIDB4RDAsIDB4MDAsIDB4NjMsIDB4MDEsIDB4NjgsIDB4RkUsIDB4MDcsCi0JMHgwMSwgMHg5OSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDRCwgMHhGRiwgMHg1QSwgMHgwMCwKLQkweDAzLCAweDAwLCAweDcwLCAweEZFLCAweDM1LCAweDA1LCAweEYyLCAweEYyLCAweDNCLCAweDI5LCAweDI0LAotCTB4MzUsIDB4M0UsIDB4RjUsIDB4QUEsIDB4MDIsIDB4NDQsIDB4MDAsIDB4RjgsIDB4RkUsIDB4Q0YsIDB4MDAsCi0JMHhBOSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQSwgMHhGRiwgMHg5NywgMHgwMCwgMHg3QywKLQkweEZGLCAweDUyLCAweEZGLCAweDExLCAweDA0LCAweEI4LCAweEYzLCAweEI4LCAweDJGLCAweDNELCAweDJGLAotCTB4QTEsIDB4RjMsIDB4MkIsIDB4MDQsIDB4M0YsIDB4RkYsIDB4ODcsIDB4RkYsIDB4OTIsIDB4MDAsIDB4QkIsCi0JMHhGRiwgMHgwOCwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhENCwgMHgwMCwgMHhFRCwgMHhGRSwKLQkweDVBLCAweDAwLCAweDg4LCAweDAyLCAweDY4LCAweEY1LCAweDkxLCAweDM1LCAweEI2LCAweDI4LCAweEVDLAotCTB4RjIsIDB4NDgsIDB4MDUsIDB4NjAsIDB4RkUsIDB4MEQsIDB4MDAsIDB4NTUsIDB4MDAsIDB4Q0UsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgwQiwgMHgwMSwgMHg1RCwgMHhGRSwgMHg3OSwKLQkweDAxLCAweEE5LCAweDAwLCAweDBELCAweEY4LCAweDhGLCAweDNBLCAweENCLCAweDIxLCAweDBDLCAweEYzLAotCTB4RjksIDB4MDUsIDB4QjAsIDB4RkQsIDB4ODIsIDB4MDAsIDB4MUMsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDMsCi0JMHgwMCwgMHgxMCwgMHgwMCwgMHg4RSwgMHhGRiwgMHgzOSwgMHgwMSwgMHhENywgMHhGRCwgMHhBMCwgMHgwMiwKLQkweDg2LCAweEZFLCAweEE2LCAweEZCLCAweDg1LCAweDNFLCAweEI3LCAweDFBLCAweEU0LCAweEYzLCAweDQwLAotCTB4MDYsIDB4MzUsIDB4RkQsIDB4RTEsIDB4MDAsIDB4RUIsIDB4RkYsIDB4RjEsIDB4RkYsIDB4MDEsIDB4MDAsCi0JMHgxMSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRCwgMHgwMywgMHgzQywKLQkweEZDLCAweDI5LCAweDAwLCAweDRBLCAweDQxLCAweEI4LCAweDEzLCAweDU0LCAweEY1LCAweDIyLCAweDA2LAotCTB4RjEsIDB4RkMsIDB4MjcsIDB4MDEsIDB4QzIsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsCi0JMHgwMCwgMHg5MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHgxMiwgMHhGRCwgMHhCQiwgMHgwNCwgMHhFOCwgMHhGOSwKLQkweDgxLCAweDA1LCAweENCLCAweDQyLCAweDA4LCAweDBELCAweDM1LCAweEY3LCAweEFELCAweDA1LCAweEUyLAotCTB4RkMsIDB4NTIsIDB4MDEsIDB4QTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwOSwgMHgwMCwgMHhBMCwgMHhGRiwgMHg1OCwgMHgwMSwgMHhFNiwgMHhGQywgMHg4NywgMHgwNSwgMHhCMCwKLQkweEY3LCAweDhELCAweDBCLCAweEYyLCAweDQyLCAweEQ3LCAweDA2LCAweDYyLCAweEY5LCAweEVGLCAweDA0LAotCTB4MDQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4OTMsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHgwMCwgMHhCQiwgMHhGRiwgMHgzMywgMHgwMSwgMHhFOSwgMHhGQywgMHgwRiwgMHgwNiwgMHhCQSwgMHhGNSwKLQkweDI0LCAweDEyLCAweEMyLCAweDQxLCAweDUzLCAweDAxLCAweEIyLCAweEZCLCAweEZCLCAweDAzLCAweDRGLAotCTB4RkQsIDB4NUQsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjQsIDB4RkYsCi0JMHhFMCwgMHhGRiwgMHhGMywgMHgwMCwgMHgyMSwgMHhGRCwgMHg0MSwgMHgwNiwgMHgyRCwgMHhGNCwgMHgxNiwKLQkweDE5LCAweDQ1LCAweDNGLCAweDlDLCAweEZDLCAweDAxLCAweEZFLCAweEU0LCAweDAyLCAweEJCLCAweEZELAotCTB4NDIsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTAsCi0JMHgwMCwgMHg5QSwgMHgwMCwgMHg4RiwgMHhGRCwgMHgxMiwgMHgwNiwgMHgyRSwgMHhGMywgMHgyQSwgMHgyMCwKLQkweDkyLCAweDNCLCAweENDLCAweEY4LCAweDMwLCAweDAwLCAweEJELCAweDAxLCAweDNELCAweEZFLCAweDE3LAotCTB4MDEsIDB4OTUsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsIDB4MDAsCi0JMHgyQSwgMHgwMCwgMHgzMywgMHhGRSwgMHg3QSwgMHgwNSwgMHhFMSwgMHhGMiwgMHgyNCwgMHgyNywgMHhDRCwKLQkweDM2LCAweEVFLCAweEY1LCAweDIxLCAweDAyLCAweDlCLCAweDAwLCAweENCLCAweEZFLCAweEUxLCAweDAwLAotCTB4QTQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4ODQsIDB4MDAsIDB4QTcsCi0JMHhGRiwgMHgwOCwgMHhGRiwgMHg3NiwgMHgwNCwgMHg2MywgMHhGMywgMHhDOCwgMHgyRCwgMHgyMiwgMHgzMSwKLQkweDA2LCAweEY0LCAweEJGLCAweDAzLCAweDhDLCAweEZGLCAweDVDLCAweEZGLCAweEE1LCAweDAwLCAweEI1LAotCTB4RkYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QzEsIDB4MDAsIDB4MUEsIDB4RkYsCi0JMHgwNSwgMHgwMCwgMHgwQiwgMHgwMywgMHhDOSwgMHhGNCwgMHhEOCwgMHgzMywgMHhDNSwgMHgyQSwgMHgwQywKLQkweEYzLCAweEZCLCAweDA0LCAweEEwLCAweEZFLCAweEU1LCAweEZGLCAweDY4LCAweDAwLCAweEM5LCAweEZGLAotCTB4MDYsIDB4MDAsIDB4MEQsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RkIsIDB4MDAsIDB4ODksIDB4RkUsIDB4MUYsCi0JMHgwMSwgMHg0NCwgMHgwMSwgMHgyMiwgMHhGNywgMHgyMCwgMHgzOSwgMHhGMywgMHgyMywgMHhFRCwgMHhGMiwKLQkweENFLCAweDA1LCAweEUxLCAweEZELCAweDYwLCAweDAwLCAweDJELCAweDAwLCAweERCLCAweEZGLCAweDAzLAotCTB4MDAsIDB4MTAsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MkQsIDB4MDEsIDB4RkYsIDB4RkQsIDB4NDYsIDB4MDIsCi0JMHgzNCwgMHhGRiwgMHg3MSwgMHhGQSwgMHg2QiwgMHgzRCwgMHhFNSwgMHgxQywgMHg5MCwgMHhGMywgMHgzNSwKLQkweDA2LCAweDU1LCAweEZELCAweEM2LCAweDAwLCAweEY5LCAweEZGLCAweEVDLCAweEZGLCAweDAxLCAweDAwLAotCTB4MTEsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NTEsIDB4MDEsIDB4ODYsIDB4RkQsIDB4NjgsIDB4MDMsIDB4RjMsCi0JMHhGQywgMHhBRSwgMHhGRSwgMHg5MiwgMHg0MCwgMHhEQSwgMHgxNSwgMHhENSwgMHhGNCwgMHgzNSwgMHgwNiwKLQkweDAwLCAweEZELCAweDE0LCAweDAxLCAweENFLCAweEZGLCAweEZBLCAweEZGLCAweDAwLCAweDAwLCAweDBGLAotCTB4MDAsIDB4OEQsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MjgsIDB4RkQsIDB4NzEsIDB4MDQsIDB4OUUsIDB4RkEsCi0JMHhDNywgMHgwMywgMHg3OSwgMHg0MiwgMHgwQiwgMHgwRiwgMHg5NywgMHhGNiwgMHhEQSwgMHgwNSwgMHhFMiwKLQkweEZDLCAweDQ4LCAweDAxLCAweEFELCAweEZGLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCTB4MEIsIDB4MDAsIDB4OUEsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RUYsIDB4RkMsIDB4NEYsIDB4MDUsIDB4NUEsCi0JMHhGOCwgMHg5RiwgMHgwOSwgMHgwQSwgMHg0MywgMHhBRSwgMHgwOCwgMHhCMSwgMHhGOCwgMHgzMCwgMHgwNSwKLQkweEY1LCAweEZDLCAweDYxLCAweDAxLCAweDk3LCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAzLAotCTB4MDAsIDB4QjEsIDB4RkYsIDB4NDEsIDB4MDEsIDB4RTMsIDB4RkMsIDB4RUQsIDB4MDUsIDB4NEMsIDB4RjYsCi0JMHgxMSwgMHgxMCwgMHg0MiwgMHg0MiwgMHhGMSwgMHgwMiwgMHhGQSwgMHhGQSwgMHg0QiwgMHgwNCwgMHgzNCwKLQkweEZELCAweDYxLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY4LCAweEZGLAotCTB4RDQsIDB4RkYsIDB4MEEsIDB4MDEsIDB4MEEsIDB4RkQsIDB4M0MsIDB4MDYsIDB4OUEsIDB4RjQsIDB4RUQsCi0JMHgxNiwgMHgyQSwgMHg0MCwgMHhGOCwgMHhGRCwgMHg0RCwgMHhGRCwgMHgzQywgMHgwMywgMHg5NywgMHhGRCwKLQkweDRDLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEVBLCAweEZGLCAweDAwLAotCTB4MDAsIDB4QjgsIDB4MDAsIDB4NjcsIDB4RkQsIDB4MkMsIDB4MDYsIDB4NkIsIDB4RjMsIDB4RkMsIDB4MUQsCi0JMHhEMywgMHgzQywgMHhERiwgMHhGOSwgMHg4OSwgMHhGRiwgMHgxOCwgMHgwMiwgMHgxMywgMHhGRSwgMHgyNiwKLQkweDAxLCAweDkyLCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ5LCAweEZGLCAweDM2LCAweDAwLAotCTB4NEUsIDB4MDAsIDB4RkIsIDB4RkQsIDB4QjQsIDB4MDUsIDB4RTQsIDB4RjIsIDB4MDQsIDB4MjUsIDB4NUYsCi0JMHgzOCwgMHhCNiwgMHhGNiwgMHg5MCwgMHgwMSwgMHhGMywgMHgwMCwgMHg5RiwgMHhGRSwgMHhGMywgMHgwMCwKLQkweDlGLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM2LCAweEZGLCAweDcxLCAweDAwLCAweEQxLAotCTB4RkYsIDB4QzIsIDB4RkUsIDB4RDEsIDB4MDQsIDB4MjMsIDB4RjMsIDB4QzksIDB4MkIsIDB4RjUsIDB4MzIsCi0JMHg4MywgMHhGNCwgMHg0OSwgMHgwMywgMHhEQywgMHhGRiwgMHgzMCwgMHhGRiwgMHhCOCwgMHgwMCwgMHhCMCwKLQkweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEIzLCAweEZGLCAweEFFLCAweDAwLCAweDQ2LCAweEZGLAotCTB4QjQsIDB4RkYsIDB4ODUsIDB4MDMsIDB4NDIsIDB4RjQsIDB4MEUsIDB4MzIsIDB4Q0EsIDB4MkMsIDB4NDEsCi0JMHhGMywgMHhBNSwgMHgwNCwgMHhFNCwgMHhGRSwgMHhCQywgMHhGRiwgMHg3QSwgMHgwMCwgMHhDMywgMHhGRiwKLQkweDA3LCAweDAwLCAweDBELCAweDAwLCAweEExLCAweEZGLCAweEVBLCAweDAwLCAweEI1LCAweEZFLCAweEM2LAotCTB4MDAsIDB4RDksIDB4MDEsIDB4NEYsIDB4RjYsIDB4OTksIDB4MzcsIDB4MTYsIDB4MjYsIDB4RTAsIDB4RjIsCi0JMHg5OCwgMHgwNSwgMHgxNiwgMHhGRSwgMHgzQywgMHgwMCwgMHgzRiwgMHgwMCwgMHhENiwgMHhGRiwgMHgwNCwKLQkweDAwLCAweDBGLCAweDAwLCAweDkzLCAweEZGLCAweDFGLCAweDAxLCAweDI4LCAweEZFLCAweEVCLCAweDAxLAotCTB4REQsIDB4RkYsIDB4NTIsIDB4RjksIDB4MzYsIDB4M0MsIDB4MTMsIDB4MUYsIDB4NEIsIDB4RjMsIDB4MjAsCi0JMHgwNiwgMHg3QiwgMHhGRCwgMHhBOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhFNywgMHhGRiwgMHgwMiwgMHgwMCwKLQkweDExLCAweDAwLCAweDhDLCAweEZGLCAweDQ3LCAweDAxLCAweEE5LCAweEZELCAweDEwLCAweDAzLCAweEE4LAotCTB4RkQsIDB4NDcsIDB4RkQsIDB4QkIsIDB4M0YsIDB4MDEsIDB4MTgsIDB4NjIsIDB4RjQsIDB4NDAsIDB4MDYsCi0JMHgxNSwgMHhGRCwgMHhGRiwgMHgwMCwgMHhEQSwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwKLQkweDAwLCAweDhCLCAweEZGLCAweDVGLCAweDAxLCAweDQxLCAweEZELCAweDIzLCAweDA0LCAweDU2LCAweEZCLAotCTB4MUYsIDB4MDIsIDB4MDYsIDB4NDIsIDB4MTksIDB4MTEsIDB4MDIsIDB4RjYsIDB4RkYsIDB4MDUsIDB4RTUsCi0JMHhGQywgMHgzQiwgMHgwMSwgMHhCNiwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwKLQkweDk1LCAweEZGLCAweDYyLCAweDAxLCAweEZDLCAweEZDLCAweDEwLCAweDA1LCAweDA5LCAweEY5LCAweEMxLAotCTB4MDcsIDB4MDMsIDB4NDMsIDB4OTQsIDB4MEEsIDB4MDUsIDB4RjgsIDB4NkMsIDB4MDUsIDB4RUEsIDB4RkMsCi0JMHg1QywgMHgwMSwgMHg5RCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwKLQkweDAwLCAweEE5LCAweEZGLCAweDRELCAweDAxLCAweEUxLCAweEZDLCAweEM0LCAweDA1LCAweEU2LCAweEY2LAotCTB4MDgsIDB4MEUsIDB4QTUsIDB4NDIsIDB4QTEsIDB4MDQsIDB4NDMsIDB4RkEsIDB4OTcsIDB4MDQsIDB4MUQsCi0JMHhGRCwgMHg2NCwgMHgwMSwgMHg4RiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwKLQkweEM4LCAweEZGLCAweDFFLCAweDAxLCAweEY4LCAweEZDLCAweDJELCAweDA2LCAweDEzLCAweEY1LCAweEM4LAotCTB4MTQsIDB4RjIsIDB4NDAsIDB4NjksIDB4RkYsIDB4OTcsIDB4RkMsIDB4OTIsIDB4MDMsIDB4NzUsIDB4RkQsCi0JMHg1NSwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGMiwKLQkweEZGLCAweEQ0LCAweDAwLCAweDQ1LCAweEZELCAweDNCLCAweDA2LCAweEI4LCAweEYzLCAweENFLCAweDFCLAotCTB4RkIsIDB4M0QsIDB4MDgsIDB4RkIsIDB4REUsIDB4RkUsIDB4NzMsIDB4MDIsIDB4RUIsIDB4RkQsIDB4MzMsCi0JMHgwMSwgMHg4RiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERSwgMHhGRiwgMHgyNSwgMHgwMCwKLQkweDcxLCAweDAwLCAweEM4LCAweEZELCAweEU1LCAweDA1LCAweEZBLCAweEYyLCAweERGLCAweDIyLCAweERCLAotCTB4MzksIDB4OTQsIDB4RjcsIDB4RjcsIDB4MDAsIDB4NEMsIDB4MDEsIDB4NzMsIDB4RkUsIDB4MDMsIDB4MDEsCi0JMHg5QSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDQywgMHhGRiwgMHg1RSwgMHgwMCwgMHhGOSwKLQkweEZGLCAweDgwLCAweEZFLCAweDIzLCAweDA1LCAweEY5LCAweEYyLCAweEMwLCAweDI5LCAweEI4LCAweDM0LAotCTB4MTYsIDB4RjUsIDB4Q0IsIDB4MDIsIDB4MkYsIDB4MDAsIDB4MDMsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4QUEsCi0JMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCOCwgMHhGRiwgMHg5QiwgMHgwMCwgMHg3MiwgMHhGRiwKLQkweDY1LCAweEZGLCAweEY2LCAweDAzLCAweEQxLCAweEYzLCAweDMxLCAweDMwLCAweEMxLCAweDJFLCAweDhCLAotCTB4RjMsIDB4NDUsIDB4MDQsIDB4MkQsIDB4RkYsIDB4OTIsIDB4RkYsIDB4OEQsIDB4MDAsIDB4QkQsIDB4RkYsCi0JMHgwOCwgMHgwMCwgMHgwQywgMHgwMCwgMHhBNiwgMHhGRiwgMHhEOCwgMHgwMCwgMHhFMiwgMHhGRSwgMHg2RiwKLQkweDAwLCAweDY2LCAweDAyLCAweDkzLCAweEY1LCAweEZCLCAweDM1LCAweDMxLCAweDI4LCAweEU3LCAweEYyLAotCTB4NTksIDB4MDUsIDB4NTEsIDB4RkUsIDB4MTcsIDB4MDAsIDB4NTAsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MDUsCi0JMHgwMCwgMHgwRSwgMHgwMCwgMHg5NywgMHhGRiwgMHgwRiwgMHgwMSwgMHg1MywgMHhGRSwgMHg5MCwgMHgwMSwKLQkweDgxLCAweDAwLCAweDRCLCAweEY4LCAweEU2LCAweDNBLCAweDNGLCAweDIxLCAweDE2LCAweEYzLCAweDAyLAotCTB4MDYsIDB4QTUsIDB4RkQsIDB4OEEsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDIsIDB4MDAsCi0JMHgxMCwgMHgwMCwgMHg4RCwgMHhGRiwgMHgzQywgMHgwMSwgMHhDRSwgMHhGRCwgMHhCNywgMHgwMiwgMHg1QSwKLQkweEZFLCAweEY3LCAweEZCLCAweEM2LCAweDNFLCAweDJDLCAweDFBLCAweEZDLCAweEYzLCAweDQxLCAweDA2LAotCTB4MkUsIDB4RkQsIDB4RTcsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsCi0JMHgwMCwgMHg4QiwgMHhGRiwgMHg1QSwgMHgwMSwgMHg1RSwgMHhGRCwgMHhEMiwgMHgwMywgMHgwRSwgMHhGQywKLQkweDhCLCAweDAwLCAweDc1LCAweDQxLCAweDMyLCAweDEzLCAweDc1LCAweEY1LCAweDFDLCAweDA2LCAweEVFLAotCTB4RkMsIDB4MkIsIDB4MDEsIDB4QzAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsCi0JMHg5MSwgMHhGRiwgMHg2NCwgMHgwMSwgMHgwRCwgMHhGRCwgMHhDRCwgMHgwNCwgMHhCQiwgMHhGOSwgMHhGMiwKLQkweDA1LCAweEQ5LCAweDQyLCAweDg4LCAweDBDLCAweDVFLCAweEY3LCAweEExLCAweDA1LCAweEUzLCAweEZDLAotCTB4NTQsIDB4MDEsIDB4QTMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksCi0JMHgwMCwgMHhBMiwgMHhGRiwgMHg1NiwgMHgwMSwgMHhFNSwgMHhGQywgMHg5NCwgMHgwNSwgMHg4NywgMHhGNywKLQkweDBBLCAweDBDLCAweEU2LCAweDQyLCAweDY0LCAweDA2LCAweDhFLCAweEY5LCAweERFLCAweDA0LCAweDA5LAotCTB4RkQsIDB4NjQsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JMHhCRCwgMHhGRiwgMHgyRiwgMHgwMSwgMHhFQywgMHhGQywgMHgxNiwgMHgwNiwgMHg5OCwgMHhGNSwgMHhBQiwKLQkweDEyLCAweDlDLCAweDQxLCAweEVFLCAweDAwLCAweEUwLCAweEZCLCAweEU2LCAweDAzLCAweDU3LCAweEZELAotCTB4NUIsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RTQsCi0JMHhGRiwgMHhFRCwgMHgwMCwgMHgyNywgMHhGRCwgMHg0MSwgMHgwNiwgMHgxNCwgMHhGNCwgMHhBMSwgMHgxOSwKLQkweDA2LCAweDNGLCAweDQ5LCAweEZDLCAweDJFLCAweEZFLCAweENELCAweDAyLCAweEM0LCAweEZELCAweDNGLAotCTB4MDEsIDB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MTQsIDB4MDAsCi0JMHg5MiwgMHgwMCwgMHg5QSwgMHhGRCwgMHgwQSwgMHgwNiwgMHgyMiwgMHhGMywgMHhCNCwgMHgyMCwgMHgzQywKLQkweDNCLCAweDhCLCAweEY4LCAweDU4LCAweDAwLCAweEE3LCAweDAxLCAweDQ4LCAweEZFLCAweDEzLCAweDAxLAotCTB4OTYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDEsIDB4RkYsIDB4NEMsIDB4MDAsIDB4MjAsCi0JMHgwMCwgMHg0MiwgMHhGRSwgMHg2QSwgMHgwNSwgMHhFMywgMHhGMiwgMHhBQiwgMHgyNywgMHg2NiwgMHgzNiwKLQkweEMwLCAweEY1LCAweDQ0LCAweDAyLCAweDg1LCAweDAwLCAweEQ3LCAweEZFLCAweERELCAweDAwLCAweEE1LAotCTB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkUsIDB4RkYsIDB4ODksIDB4MDAsIDB4OUQsIDB4RkYsCi0JMHgxQSwgMHhGRiwgMHg1RSwgMHgwNCwgMHg3NiwgMHhGMywgMHg0NSwgMHgyRSwgMHhBQSwgMHgzMCwgMHhFQiwKLQkweEYzLCAweERCLCAweDAzLCAweDc5LCAweEZGLCAweDY3LCAweEZGLCAweEEwLCAweDAwLCAweEI3LCAweEZGLAotCTB4MDksIDB4MDAsIDB4MEIsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QzYsIDB4MDAsIDB4MEUsIDB4RkYsIDB4MUEsCi0JMHgwMCwgMHhFQiwgMHgwMiwgMHhFRiwgMHhGNCwgMHg0OSwgMHgzNCwgMHg0MywgMHgyQSwgMHgwMiwgMHhGMywKLQkweDBGLCAweDA1LCAweDkwLCAweEZFLCAweEVGLCAweEZGLCAweDYzLCAweDAwLCAweENBLCAweEZGLCAweDA2LAotCTB4MDAsIDB4MEUsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4RkUsIDB4MzYsIDB4MDEsCi0JMHgxRSwgMHgwMSwgMHg1QiwgMHhGNywgMHg3RSwgMHgzOSwgMHg2OSwgMHgyMywgMHhGMywgMHhGMiwgMHhEOSwKLQkweDA1LCAweEQ0LCAweEZELCAweDY5LCAweDAwLCAweDI5LCAweDAwLCAweERELCAweEZGLCAweDAzLCAweDAwLAotCTB4MTAsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MzAsIDB4MDEsIDB4RjUsIDB4RkQsIDB4NUMsIDB4MDIsIDB4MDksCi0JMHhGRiwgMHhCQywgMHhGQSwgMHhCNSwgMHgzRCwgMHg1QSwgMHgxQywgMHhBMywgMHhGMywgMHgzOCwgMHgwNiwKLQkweDRELCAweEZELCAweENELCAweDAwLCAweEY1LCAweEZGLCAweEVELCAweEZGLCAweDAxLCAweDAwLCAweDExLAotCTB4MDAsIDB4OEIsIDB4RkYsIDB4NTMsIDB4MDEsIDB4N0UsIDB4RkQsIDB4N0QsIDB4MDMsIDB4QzUsIDB4RkMsCi0JMHgwQiwgMHhGRiwgMHhDMywgMHg0MCwgMHg1MSwgMHgxNSwgMHhGNCwgMHhGNCwgMHgzMSwgMHgwNiwgMHhGQywKLQkweEZDLCAweDE5LCAweDAxLCAweENCLCAweEZGLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLAotCTB4OEUsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MjIsIDB4RkQsIDB4ODQsIDB4MDQsIDB4NzEsIDB4RkEsIDB4MzQsCi0JMHgwNCwgMHg5MCwgMHg0MiwgMHg4OSwgMHgwRSwgMHhCRSwgMHhGNiwgMHhDRiwgMHgwNSwgMHhFMSwgMHhGQywKLQkweDRBLCAweDAxLCAweEFCLCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLAotCTB4MDAsIDB4OUIsIDB4RkYsIDB4NUQsIDB4MDEsIDB4RUMsIDB4RkMsIDB4NUQsIDB4MDUsIDB4MkYsIDB4RjgsCi0JMHgxOSwgMHgwQSwgMHgwNywgMHg0MywgMHgzNywgMHgwOCwgMHhERCwgMHhGOCwgMHgyMSwgMHgwNSwgMHhGOCwKLQkweEZDLCAweDYyLCAweDAxLCAweDk2LCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLAotCTB4QjQsIDB4RkYsIDB4M0UsIDB4MDEsIDB4RTQsIDB4RkMsIDB4RjYsIDB4MDUsIDB4MjYsIDB4RjYsIDB4OTUsCi0JMHgxMCwgMHgyNiwgMHg0MiwgMHg4NywgMHgwMiwgMHgyOCwgMHhGQiwgMHgzNywgMHgwNCwgMHgzQiwgMHhGRCwKLQkweDYwLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY3LCAweEZGLCAweEQ3LAotCTB4RkYsIDB4MDQsIDB4MDEsIDB4MEYsIDB4RkQsIDB4M0UsIDB4MDYsIDB4N0QsIDB4RjQsIDB4NzYsIDB4MTcsCi0JMHhGNCwgMHgzRiwgMHg5RiwgMHhGRCwgMHg3QiwgMHhGRCwgMHgyNiwgMHgwMywgMHhBMCwgMHhGRCwgMHg0QSwKLQkweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU5LCAweEZGLCAweDA0LCAweDAwLAotCTB4QjEsIDB4MDAsIDB4NzEsIDB4RkQsIDB4MjYsIDB4MDYsIDB4NUEsIDB4RjMsIDB4ODgsIDB4MUUsIDB4ODcsCi0JMHgzQywgMHg5OCwgMHhGOSwgMHhCMywgMHhGRiwgMHgwMiwgMHgwMiwgMHgxRSwgMHhGRSwgMHgyMiwgMHgwMSwKLQkweDkzLCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ3LCAweEZGLCAweDNBLCAweDAwLCAweDQ1LAotCTB4MDAsIDB4MDksIDB4RkUsIDB4QTcsIDB4MDUsIDB4RTEsIDB4RjIsIDB4OEQsIDB4MjUsIDB4RkQsIDB4MzcsCi0JMHg4MiwgMHhGNiwgMHhCNSwgMHgwMSwgMHhEQywgMHgwMCwgMHhBQSwgMHhGRSwgMHhFRSwgMHgwMCwgMHhBMCwKLQkweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM0LCAweEZGLCAweDc2LCAweDAwLCAweEM3LCAweEZGLAotCTB4RDMsIDB4RkUsIDB4QkMsIDB4MDQsIDB4MzEsIDB4RjMsIDB4NEEsIDB4MkMsIDB4ODMsIDB4MzIsIDB4NjEsCi0JMHhGNCwgMHg2OCwgMHgwMywgMHhDOCwgMHhGRiwgMHgzQiwgMHhGRiwgMHhCMywgMHgwMCwgMHhCMSwgMHhGRiwKLQkweDBBLCAweDAwLCAweDBBLCAweDAwLCAweEIxLCAweEZGLCAweEIzLCAweDAwLCAweDNCLCAweEZGLCAweEM4LAotCTB4RkYsIDB4NjgsIDB4MDMsIDB4NjEsIDB4RjQsIDB4ODMsIDB4MzIsIDB4NEEsIDB4MkMsIDB4MzEsIDB4RjMsCi0JMHhCQywgMHgwNCwgMHhEMywgMHhGRSwgMHhDNywgMHhGRiwgMHg3NiwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwNiwKLQkweDAwLCAweDBELCAweDAwLCAweEEwLCAweEZGLCAweEVFLCAweDAwLCAweEFBLCAweEZFLCAweERDLCAweDAwLAotCTB4QjUsIDB4MDEsIDB4ODIsIDB4RjYsIDB4RkQsIDB4MzcsIDB4OEQsIDB4MjUsIDB4RTEsIDB4RjIsIDB4QTcsCi0JMHgwNSwgMHgwOSwgMHhGRSwgMHg0NSwgMHgwMCwgMHgzQSwgMHgwMCwgMHhENywgMHhGRiwgMHgwNCwgMHgwMCwKLQkweDBGLCAweDAwLCAweDkzLCAweEZGLCAweDIyLCAweDAxLCAweDFFLCAweEZFLCAweDAyLCAweDAyLCAweEIzLAotCTB4RkYsIDB4OTgsIDB4RjksIDB4ODcsIDB4M0MsIDB4ODgsIDB4MUUsIDB4NUEsIDB4RjMsIDB4MjYsIDB4MDYsCi0JMHg3MSwgMHhGRCwgMHhCMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMSwKLQkweDAwLCAweDhCLCAweEZGLCAweDRBLCAweDAxLCAweEEwLCAweEZELCAweDI2LCAweDAzLCAweDdCLCAweEZELAotCTB4OUYsIDB4RkQsIDB4RjQsIDB4M0YsIDB4NzYsIDB4MTcsIDB4N0QsIDB4RjQsIDB4M0UsIDB4MDYsIDB4MEYsCi0JMHhGRCwgMHgwNCwgMHgwMSwgMHhENywgMHhGRiwgMHhGNywgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwKLQkweDhDLCAweEZGLCAweDYwLCAweDAxLCAweDNCLCAweEZELCAweDM3LCAweDA0LCAweDI4LCAweEZCLCAweDg3LAotCTB4MDIsIDB4MjYsIDB4NDIsIDB4OTUsIDB4MTAsIDB4MjYsIDB4RjYsIDB4RjYsIDB4MDUsIDB4RTQsIDB4RkMsCi0JMHgzRSwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHg5NiwKLQkweEZGLCAweDYyLCAweDAxLCAweEY4LCAweEZDLCAweDIxLCAweDA1LCAweERELCAweEY4LCAweDM3LCAweDA4LAotCTB4MDcsIDB4NDMsIDB4MTksIDB4MEEsIDB4MkYsIDB4RjgsIDB4NUQsIDB4MDUsIDB4RUMsIDB4RkMsIDB4NUQsCi0JMHgwMSwgMHg5QiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKLQkweEFCLCAweEZGLCAweDRBLCAweDAxLCAweEUxLCAweEZDLCAweENGLCAweDA1LCAweEJFLCAweEY2LCAweDg5LAotCTB4MEUsIDB4OTAsIDB4NDIsIDB4MzQsIDB4MDQsIDB4NzEsIDB4RkEsIDB4ODQsIDB4MDQsIDB4MjIsIDB4RkQsCi0JMHg2MywgMHgwMSwgMHg4RSwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhDQiwKLQkweEZGLCAweDE5LCAweDAxLCAweEZDLCAweEZDLCAweDMxLCAweDA2LCAweEY0LCAweEY0LCAweDUxLCAweDE1LAotCTB4QzMsIDB4NDAsIDB4MEIsIDB4RkYsIDB4QzUsIDB4RkMsIDB4N0QsIDB4MDMsIDB4N0UsIDB4RkQsIDB4NTMsCi0JMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRCwgMHhGRiwgMHhGNSwgMHhGRiwKLQkweENELCAweDAwLCAweDRELCAweEZELCAweDM4LCAweDA2LCAweEEzLCAweEYzLCAweDVBLCAweDFDLCAweEI1LAotCTB4M0QsIDB4QkMsIDB4RkEsIDB4MDksIDB4RkYsIDB4NUMsIDB4MDIsIDB4RjUsIDB4RkQsIDB4MzAsIDB4MDEsCi0JMHg5MCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2OSwKLQkweDAwLCAweEQ0LCAweEZELCAweEQ5LCAweDA1LCAweEYzLCAweEYyLCAweDY5LCAweDIzLCAweDdFLCAweDM5LAotCTB4NUIsIDB4RjcsIDB4MUUsIDB4MDEsIDB4MzYsIDB4MDEsIDB4N0UsIDB4RkUsIDB4RkYsIDB4MDAsIDB4OUIsCi0JMHhGRiwgMHgwRSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDQSwgMHhGRiwgMHg2MywgMHgwMCwgMHhFRiwgMHhGRiwKLQkweDkwLCAweEZFLCAweDBGLCAweDA1LCAweDAyLCAweEYzLCAweDQzLCAweDJBLCAweDQ5LCAweDM0LCAweEVGLAotCTB4RjQsIDB4RUIsIDB4MDIsIDB4MUEsIDB4MDAsIDB4MEUsIDB4RkYsIDB4QzYsIDB4MDAsIDB4QUMsIDB4RkYsCi0JMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNywgMHhGRiwgMHhBMCwgMHgwMCwgMHg2NywgMHhGRiwgMHg3OSwKLQkweEZGLCAweERCLCAweDAzLCAweEVCLCAweEYzLCAweEFBLCAweDMwLCAweDQ1LCAweDJFLCAweDc2LCAweEYzLAotCTB4NUUsIDB4MDQsIDB4MUEsIDB4RkYsIDB4OUQsIDB4RkYsIDB4ODksIDB4MDAsIDB4QkUsIDB4RkYsIDB4MDcsCi0JMHgwMCwgMHgwQywgMHgwMCwgMHhBNSwgMHhGRiwgMHhERCwgMHgwMCwgMHhENywgMHhGRSwgMHg4NSwgMHgwMCwKLQkweDQ0LCAweDAyLCAweEMwLCAweEY1LCAweDY2LCAweDM2LCAweEFCLCAweDI3LCAweEUzLCAweEYyLCAweDZBLAotCTB4MDUsIDB4NDIsIDB4RkUsIDB4MjAsIDB4MDAsIDB4NEMsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MDQsIDB4MDAsCi0JMHgwRiwgMHgwMCwgMHg5NiwgMHhGRiwgMHgxMywgMHgwMSwgMHg0OCwgMHhGRSwgMHhBNywgMHgwMSwgMHg1OCwKLQkweDAwLCAweDhCLCAweEY4LCAweDNDLCAweDNCLCAweEI0LCAweDIwLCAweDIyLCAweEYzLCAweDBBLCAweDA2LAotCTB4OUEsIDB4RkQsIDB4OTIsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTAsCi0JMHgwMCwgMHg4RCwgMHhGRiwgMHgzRiwgMHgwMSwgMHhDNCwgMHhGRCwgMHhDRCwgMHgwMiwgMHgyRSwgMHhGRSwKLQkweDQ5LCAweEZDLCAweDA2LCAweDNGLCAweEExLCAweDE5LCAweDE0LCAweEY0LCAweDQxLCAweDA2LCAweDI3LAotCTB4RkQsIDB4RUQsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsCi0JMHg4QiwgMHhGRiwgMHg1QiwgMHgwMSwgMHg1NywgMHhGRCwgMHhFNiwgMHgwMywgMHhFMCwgMHhGQiwgMHhFRSwKLQkweDAwLCAweDlDLCAweDQxLCAweEFCLCAweDEyLCAweDk4LCAweEY1LCAweDE2LCAweDA2LCAweEVDLCAweEZDLAotCTB4MkYsIDB4MDEsIDB4QkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTIsCi0JMHhGRiwgMHg2NCwgMHgwMSwgMHgwOSwgMHhGRCwgMHhERSwgMHgwNCwgMHg4RSwgMHhGOSwgMHg2NCwgMHgwNiwKLQkweEU2LCAweDQyLCAweDBBLCAweDBDLCAweDg3LCAweEY3LCAweDk0LCAweDA1LCAweEU1LCAweEZDLCAweDU2LAotCTB4MDEsIDB4QTIsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCi0JMHhBMywgMHhGRiwgMHg1NCwgMHgwMSwgMHhFMywgMHhGQywgMHhBMSwgMHgwNSwgMHg1RSwgMHhGNywgMHg4OCwKLQkweDBDLCAweEQ5LCAweDQyLCAweEYyLCAweDA1LCAweEJCLCAweEY5LCAweENELCAweDA0LCAweDBELCAweEZELAotCTB4NjQsIDB4MDEsIDB4OTEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QzAsCi0JMHhGRiwgMHgyQiwgMHgwMSwgMHhFRSwgMHhGQywgMHgxQywgMHgwNiwgMHg3NSwgMHhGNSwgMHgzMiwgMHgxMywKLQkweDc1LCAweDQxLCAweDhCLCAweDAwLCAweDBFLCAweEZDLCAweEQyLCAweDAzLCAweDVFLCAweEZELCAweDVBLAotCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RTcsIDB4RkYsCi0JMHhFNywgMHgwMCwgMHgyRSwgMHhGRCwgMHg0MSwgMHgwNiwgMHhGQywgMHhGMywgMHgyQywgMHgxQSwgMHhDNiwKLQkweDNFLCAweEY3LCAweEZCLCAweDVBLCAweEZFLCAweEI3LCAweDAyLCAweENFLCAweEZELCAweDNDLCAweDAxLAotCTB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OEEsCi0JMHgwMCwgMHhBNSwgMHhGRCwgMHgwMiwgMHgwNiwgMHgxNiwgMHhGMywgMHgzRiwgMHgyMSwgMHhFNiwgMHgzQSwKLQkweDRCLCAweEY4LCAweDgxLCAweDAwLCAweDkwLCAweDAxLCAweDUzLCAweEZFLCAweDBGLCAweDAxLCAweDk3LAotCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTAsIDB4MDAsIDB4MTcsIDB4MDAsCi0JMHg1MSwgMHhGRSwgMHg1OSwgMHgwNSwgMHhFNywgMHhGMiwgMHgzMSwgMHgyOCwgMHhGQiwgMHgzNSwgMHg5MywKLQkweEY1LCAweDY2LCAweDAyLCAweDZGLCAweDAwLCAweEUyLCAweEZFLCAweEQ4LCAweDAwLCAweEE2LCAweEZGLAotCTB4MEMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkQsIDB4RkYsIDB4OEQsIDB4MDAsIDB4OTIsIDB4RkYsIDB4MkQsCi0JMHhGRiwgMHg0NSwgMHgwNCwgMHg4QiwgMHhGMywgMHhDMSwgMHgyRSwgMHgzMSwgMHgzMCwgMHhEMSwgMHhGMywKLQkweEY2LCAweDAzLCAweDY1LCAweEZGLCAweDcyLCAweEZGLCAweDlCLCAweDAwLCAweEI4LCAweEZGLCAweDA4LAotCTB4MDAsIDB4MEIsIDB4MDAsIDB4QUEsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4MDMsIDB4RkYsIDB4MkYsIDB4MDAsCi0JMHhDQiwgMHgwMiwgMHgxNiwgMHhGNSwgMHhCOCwgMHgzNCwgMHhDMCwgMHgyOSwgMHhGOSwgMHhGMiwgMHgyMywKLQkweDA1LCAweDgwLCAweEZFLCAweEY5LCAweEZGLCAweDVFLCAweDAwLCAweENDLCAweEZGLCAweDA1LCAweDAwLAotCTB4MEUsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4NzMsIDB4RkUsIDB4NEMsIDB4MDEsIDB4RjcsCi0JMHgwMCwgMHg5NCwgMHhGNywgMHhEQiwgMHgzOSwgMHhERiwgMHgyMiwgMHhGQSwgMHhGMiwgMHhFNSwgMHgwNSwKLQkweEM4LCAweEZELCAweDcxLCAweDAwLCAweDI1LCAweDAwLCAweERFLCAweEZGLCAweDAzLCAweDAwLCAweDEwLAotCTB4MDAsIDB4OEYsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RUIsIDB4RkQsIDB4NzMsIDB4MDIsIDB4REUsIDB4RkUsCi0JMHgwOCwgMHhGQiwgMHhGQiwgMHgzRCwgMHhDRSwgMHgxQiwgMHhCOCwgMHhGMywgMHgzQiwgMHgwNiwgMHg0NSwKLQkweEZELCAweEQ0LCAweDAwLCAweEYyLCAweEZGLCAweEVGLCAweEZGLCAweDAxLCAweDAwLCAweDExLCAweDAwLAotCTB4OEEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4NzUsIDB4RkQsIDB4OTIsIDB4MDMsIDB4OTcsIDB4RkMsIDB4NjksCi0JMHhGRiwgMHhGMiwgMHg0MCwgMHhDOCwgMHgxNCwgMHgxMywgMHhGNSwgMHgyRCwgMHgwNiwgMHhGOCwgMHhGQywKLQkweDFFLCAweDAxLCAweEM4LCAweEZGLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweDhGLAotCTB4RkYsIDB4NjQsIDB4MDEsIDB4MUQsIDB4RkQsIDB4OTcsIDB4MDQsIDB4NDMsIDB4RkEsIDB4QTEsIDB4MDQsCi0JMHhBNSwgMHg0MiwgMHgwOCwgMHgwRSwgMHhFNiwgMHhGNiwgMHhDNCwgMHgwNSwgMHhFMSwgMHhGQywgMHg0RCwKLQkweDAxLCAweEE5LCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLAotCTB4OUQsIDB4RkYsIDB4NUMsIDB4MDEsIDB4RUEsIDB4RkMsIDB4NkMsIDB4MDUsIDB4MDUsIDB4RjgsIDB4OTQsCi0JMHgwQSwgMHgwMywgMHg0MywgMHhDMSwgMHgwNywgMHgwOSwgMHhGOSwgMHgxMCwgMHgwNSwgMHhGQywgMHhGQywKLQkweDYyLCAweDAxLCAweDk1LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEI2LAotCTB4RkYsIDB4M0IsIDB4MDEsIDB4RTUsIDB4RkMsIDB4RkYsIDB4MDUsIDB4MDIsIDB4RjYsIDB4MTksIDB4MTEsCi0JMHgwNiwgMHg0MiwgMHgxRiwgMHgwMiwgMHg1NiwgMHhGQiwgMHgyMywgMHgwNCwgMHg0MSwgMHhGRCwgMHg1RiwKLQkweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY2LCAweEZGLCAweERBLCAweEZGLAotCTB4RkYsIDB4MDAsIDB4MTUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4NjIsIDB4RjQsIDB4MDEsIDB4MTgsIDB4QkIsCi0JMHgzRiwgMHg0NywgMHhGRCwgMHhBOCwgMHhGRCwgMHgxMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg0NywgMHgwMSwKLQkweDhDLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU3LCAweEZGLCAweDA4LCAweDAwLCAweEE5LAotCTB4MDAsIDB4N0IsIDB4RkQsIDB4MjAsIDB4MDYsIDB4NEIsIDB4RjMsIDB4MTMsIDB4MUYsIDB4MzYsIDB4M0MsCi0JMHg1MiwgMHhGOSwgMHhERCwgMHhGRiwgMHhFQiwgMHgwMSwgMHgyOCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg5MywKLQkweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ2LCAweEZGLCAweDNGLCAweDAwLCAweDNDLCAweDAwLAotCTB4MTYsIDB4RkUsIDB4OTgsIDB4MDUsIDB4RTAsIDB4RjIsIDB4MTYsIDB4MjYsIDB4OTksIDB4MzcsIDB4NEYsCi0JMHhGNiwgMHhEOSwgMHgwMSwgMHhDNiwgMHgwMCwgMHhCNSwgMHhGRSwgMHhFQSwgMHgwMCwgMHhBMSwgMHhGRiwKLQkweDBELCAweDAwLCAweDA3LCAweDAwLCAweEMzLCAweEZGLCAweDdBLCAweDAwLCAweEJDLCAweEZGLCAweEU0LAotCTB4RkUsIDB4QTUsIDB4MDQsIDB4NDEsIDB4RjMsIDB4Q0EsIDB4MkMsIDB4MEUsIDB4MzIsIDB4NDIsIDB4RjQsCi0JMHg4NSwgMHgwMywgMHhCNCwgMHhGRiwgMHg0NiwgMHhGRiwgMHhBRSwgMHgwMCwgMHhCMywgMHhGRiwgMHgwOSwKLQkweDAwLCAweDBBLCAweDAwLCAweEIwLCAweEZGLCAweEI4LCAweDAwLCAweDMwLCAweEZGLCAweERDLCAweEZGLAotCTB4NDksIDB4MDMsIDB4ODMsIDB4RjQsIDB4RjUsIDB4MzIsIDB4QzksIDB4MkIsIDB4MjMsIDB4RjMsIDB4RDEsCi0JMHgwNCwgMHhDMiwgMHhGRSwgMHhEMSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwNiwgMHgwMCwKLQkweDBELCAweDAwLCAweDlGLCAweEZGLCAweEYzLCAweDAwLCAweDlGLCAweEZFLCAweEYzLCAweDAwLCAweDkwLAotCTB4MDEsIDB4QjYsIDB4RjYsIDB4NUYsIDB4MzgsIDB4MDQsIDB4MjUsIDB4RTQsIDB4RjIsIDB4QjQsIDB4MDUsCi0JMHhGQiwgMHhGRCwgMHg0RSwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwRiwKLQkweDAwLCAweDkyLCAweEZGLCAweDI2LCAweDAxLCAweDEzLCAweEZFLCAweDE4LCAweDAyLCAweDg5LCAweEZGLAotCTB4REYsIDB4RjksIDB4RDMsIDB4M0MsIDB4RkMsIDB4MUQsIDB4NkIsIDB4RjMsIDB4MkMsIDB4MDYsIDB4NjcsCi0JMHhGRCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMSwgMHgwMCwKLQkweDhCLCAweEZGLCAweDRDLCAweDAxLCAweDk3LCAweEZELCAweDNDLCAweDAzLCAweDRELCAweEZELCAweEY4LAotCTB4RkQsIDB4MkEsIDB4NDAsIDB4RUQsIDB4MTYsIDB4OUEsIDB4RjQsIDB4M0MsIDB4MDYsIDB4MEEsIDB4RkQsCi0JMHgwQSwgMHgwMSwgMHhENCwgMHhGRiwgMHhGOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4QywKLQkweEZGLCAweDYxLCAweDAxLCAweDM0LCAweEZELCAweDRCLCAweDA0LCAweEZBLCAweEZBLCAweEYxLCAweDAyLAotCTB4NDIsIDB4NDIsIDB4MTEsIDB4MTAsIDB4NEMsIDB4RjYsIDB4RUQsIDB4MDUsIDB4RTMsIDB4RkMsIDB4NDEsCi0JMHgwMSwgMHhCMSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHg5NywgMHhGRiwKLQkweDYxLCAweDAxLCAweEY1LCAweEZDLCAweDMwLCAweDA1LCAweEIxLCAweEY4LCAweEFFLCAweDA4LCAweDBBLAotCTB4NDMsIDB4OUYsIDB4MDksIDB4NUEsIDB4RjgsIDB4NEYsIDB4MDUsIDB4RUYsIDB4RkMsIDB4NUYsIDB4MDEsCi0JMHg5QSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHhBRCwKLQkweEZGLCAweDQ4LCAweDAxLCAweEUyLCAweEZDLCAweERBLCAweDA1LCAweDk3LCAweEY2LCAweDBCLCAweDBGLAotCTB4NzksIDB4NDIsIDB4QzcsIDB4MDMsIDB4OUUsIDB4RkEsIDB4NzEsIDB4MDQsIDB4MjgsIDB4RkQsIDB4NjMsCi0JMHgwMSwgMHg4RCwgMHhGRiwgMHgwRiwgMHgwMCAKLX07Ci0KLXN0YXRpYyB1MTYKLUNvZWZmaWNpZW50U2l6ZXNbXSA9IHsKLSAgICAvKiBQbGF5YmFjayAqLwotICAgIDB4MDBDMCwgMHg1MDAwLCAweDAwNjAsIDB4MjgwMCwgMHgwMDQwLCAweDAwNjAsIDB4MTQwMCwgMHgwMDAwLAotICAgIC8qIFJlY29yZCAqLwotICAgIDB4MDAyMCwgMHgxMjYwLCAweDAwMjAsIDB4MTI2MCwgMHgwMDAwLCAweDAwNDAsIDB4MTI2MCwgMHgwMDAwLAotfTsKLQotI2lmbmRlZiBKVVNUX0RBVEEKLQotc3RhdGljIHUxNgotbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKHU4IHdoaWNoKQotewotICAgIHUxNiBvZmZzZXQgPSAwOwotCi0gICAgd2hpbGUgKHdoaWNoLS0gPiAwKQotCW9mZnNldCArPSBDb2VmZmljaWVudFNpemVzW3doaWNoXTsKLQotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ubTI1Nl9sb2FkT25lQ29lZmZpY2llbnQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBpbnQgZGV2bnVtLCB1MzIgcG9ydCwgCi0JCQkgIHUxNiB3aGljaCkKLXsKLSAgICB1MzIgY29lZmZCdWYgPSAod2hpY2ggPCA4KSA/IGNhcmQtPmNvZWZmQnVmIDogY2FyZC0+YWxsQ29lZmZCdWY7Ci0gICAgdTE2IG9mZnNldCA9IG5tMjU2X2dldFN0YXJ0T2Zmc2V0ICh3aGljaCk7Ci0gICAgdTE2IHNpemUgPSBDb2VmZmljaWVudFNpemVzW3doaWNoXTsKLQotICAgIGNhcmQtPmNvZWZmc0N1cnJlbnQgPSAwOwotCi0gICAgaWYgKG5tMjU2X2RlYnVnKQotCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogTG9hZGluZyBjb2VmZmljaWVudCBidWZmZXIgMHgleC0weCV4IHdpdGggY29lZmZpY2llbnQgJWQsIHNpemUgJWQsIHBvcnQgMHgleFxuIiwKLQkJY29lZmZCdWYsIGNvZWZmQnVmICsgc2l6ZSAtIDEsIHdoaWNoLCBzaXplLCBwb3J0KTsKLSAgICBubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGNvZWZmaWNpZW50cyArIG9mZnNldCwgMSwgY29lZmZCdWYsIHNpemUpOwotICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBwb3J0ICsgMCwgY29lZmZCdWYpOwotICAgIC8qID8/PyAgUmVjb3JkIHNlZW1zIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSB0aGFuIHBsYXliYWNrLiAgKi8KLSAgICBpZiAoZGV2bnVtID09IDApCi0Jc2l6ZS0tOwotICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBwb3J0ICsgNCwgY29lZmZCdWYgKyBzaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLW5tMjU2X2xvYWRBbGxDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQotewotICAgIG5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgY29lZmZpY2llbnRzLCAxLCBjYXJkLT5hbGxDb2VmZkJ1ZiwKLQkJCSAgTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0KTsKLSAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLW5tMjU2X2xvYWRDb2VmZmljaWVudCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGludCB3aGljaCwgaW50IG51bWJlcikKLXsKLSAgICBzdGF0aWMgdTE2IGFkZHJzWzNdID0geyAweDFjLCAweDIxYywgMHg0MDggfTsKLSAgICAvKiBUaGUgZW5hYmxlIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWVkIGVuZ2luZS4gICovCi0gICAgdTMyIHBvZmZzZXQgPSAod2hpY2ggPT0gMSA/IDB4MjAwIDogMSk7Ci0KLSAgICBpZiAobm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCBwb2Zmc2V0KSAmIDEpIHsKLQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogRW5naW5lIHdhcyBlbmFibGVkIHdoaWxlIGxvYWRpbmcgY29lZmZpY2llbnRzIVxuIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRoZSByZWNvcmRpbmcgZW5naW5lIHVzZXMgY29lZmZpY2llbnQgdmFsdWVzIDgtMTUuICAqLwotICAgIGlmICh3aGljaCA9PSAxKQotCW51bWJlciArPSA4OwotCi0gICAgaWYgKCEgbm0yNTZfY2FjaGVkQ29lZmZpY2llbnRzIChjYXJkKSkKLQlubTI1Nl9sb2FkT25lQ29lZmZpY2llbnQgKGNhcmQsIHdoaWNoLCBhZGRyc1t3aGljaF0sIG51bWJlcik7Ci0gICAgZWxzZSB7Ci0JdTMyIGJhc2UgPSBjYXJkLT5hbGxDb2VmZkJ1ZjsKLQl1MzIgb2Zmc2V0ID0gbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKG51bWJlcik7Ci0JdTMyIGVuZE9mZnNldCA9IG9mZnNldCArIENvZWZmaWNpZW50U2l6ZXNbbnVtYmVyXTsKLQotCWlmIChubTI1Nl9kZWJ1ZykKLQkgICAgcHJpbnRrIChLRVJOX0RFQlVHICJsb2FkaW5nIGNvZWZmaWNpZW50ICVkIGF0IHBvcnQgMHgleCwgb2Zmc2V0ICVkICgweCV4LTB4JXgpXG4iLAotCQkgICAgbnVtYmVyLCBhZGRyc1t3aGljaF0sIG9mZnNldCwgYmFzZSArIG9mZnNldCwKLQkJICAgIGJhc2UgKyBlbmRPZmZzZXQgLSAxKTsKLQotCWlmICghIGNhcmQtPmNvZWZmc0N1cnJlbnQpCi0JICAgIG5tMjU2X2xvYWRBbGxDb2VmZmljaWVudHMgKGNhcmQpOwotCi0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIGFkZHJzW3doaWNoXSwgYmFzZSArIG9mZnNldCk7Ci0Jbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIGFkZHJzW3doaWNoXSArIDQsIGJhc2UgKyBlbmRPZmZzZXQgLSAxKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBKVVNUX0RBVEEgKi8KLQotI2VuZGlmCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtYmFzaWMtb2Zmc2V0OiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzLmMgYi9zb3VuZC9vc3Mvb3BsMy5jCmluZGV4IGZjMjczZTUuLjc3ODFjMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9vcGwzLmMKKysrIGIvc291bmQvb3NzL29wbDMuYwpAQCAtMzQsNyArMzQsNiBAQAogCiAjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCiAKLSNpbmNsdWRlICJvcGwzLmgiCiAjaW5jbHVkZSAib3BsM19ody5oIgogCiAjZGVmaW5lIE1BWF9WT0lDRQkxOApAQCAtNzMsNyArNzIsNiBAQAogCXVuc2lnbmVkIGNoYXIgICBjbWFzazsKIAogCWludCAgICAgICAgICAgICBpc19vcGw0OwotCWludCAgICAgICAgICAgICpvc3A7CiB9IG9wbF9kZXZpbmZvOwogCiBzdGF0aWMgc3RydWN0IG9wbF9kZXZpbmZvICpkZXZjID0gTlVMTDsKQEAgLTE0NCw3ICsxNDIsNyBAQAogCX0KIH0KIAotaW50IG9wbDNfZGV0ZWN0KGludCBpb2FkZHIsIGludCAqb3NwKQorc3RhdGljIGludCBvcGwzX2RldGVjdChpbnQgaW9hZGRyKQogewogCS8qCiAJICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIEZNIGNoaXAgaXMgcHJlc2VudCBhdCB0aGUgZ2l2ZW4gSS9PIHBvcnQKQEAgLTE4Miw3ICsxODAsNiBAQAogCQlnb3RvIGNsZWFudXBfZGV2YzsKIAl9CiAKLQlkZXZjLT5vc3AgPSBvc3A7CiAJZGV2Yy0+YmFzZSA9IGlvYWRkcjsKIAogCS8qIFJlc2V0IHRpbWVycyAxIGFuZCAyICovCkBAIC0xMTA1LDcgKzExMDIsNyBAQAogCS5zZXR1cF92b2ljZQk9IG9wbDNfc2V0dXBfdm9pY2UKIH07CiAKLWludCBvcGwzX2luaXQoaW50IGlvYWRkciwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQorc3RhdGljIGludCBvcGwzX2luaXQoaW50IGlvYWRkciwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7CiAJaW50IGk7CiAJaW50IG1lOwpAQCAtMTE5NCw5ICsxMTkxLDYgQEAKIAlyZXR1cm4gbWU7CiB9CiAKLUVYUE9SVF9TWU1CT0wob3BsM19pbml0KTsKLUVYUE9SVF9TWU1CT0wob3BsM19kZXRlY3QpOwotCiBzdGF0aWMgaW50IG1lOwogCiBzdGF0aWMgaW50IGlvID0gLTE7CkBAIC0xMjA5LDEyICsxMjAzLDEyIEBACiAKIAlpZiAoaW8gIT0gLTEpCS8qIFVzZXIgbG9hZGluZyBwdXJlIE9QTDMgbW9kdWxlICovCiAJewotCQlpZiAoIW9wbDNfZGV0ZWN0KGlvLCBOVUxMKSkKKwkJaWYgKCFvcGwzX2RldGVjdChpbykpCiAJCXsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKLQkJbWUgPSBvcGwzX2luaXQoaW8sIE5VTEwsIFRISVNfTU9EVUxFKTsKKwkJbWUgPSBvcGwzX2luaXQoaW8sIFRISVNfTU9EVUxFKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzLmggYi9zb3VuZC9vc3Mvb3BsMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM5YTRiLi4wMDAwMDAwCi0tLSBhL3NvdW5kL29zcy9vcGwzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQotaW50IG9wbDNfZGV0ZWN0IChpbnQgaW9hZGRyLCBpbnQgKm9zcCk7Ci1pbnQgb3BsM19pbml0KGludCBpb2FkZHIsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Ci0KLXZvaWQgZW5hYmxlX29wbDNfbW9kZShpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgYm90aCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvb3BsM3NhMi5jIGIvc291bmQvb3NzL29wbDNzYTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwMDUxZi4uMDAwMDAwMAotLS0gYS9zb3VuZC9vc3Mvb3BsM3NhMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMCArMCwwIEBACi0vKgotICogc291bmQvb3NzL29wbDNzYTIuYwotICoKLSAqIEEgbG93IGxldmVsIGRyaXZlciBmb3IgWWFtYWhhIE9QTDMtU0EyIGFuZCBTQTMgY2FyZHMuCi0gKiBOT1RFOiBBbGwgdHJhY2VzIG9mIHRoZSBuYW1lIE9QTDMtU0F4IGhhdmUgbm93IChEZWNlbWJlciAyMDAwKSBiZWVuCi0gKiAgICAgICByZW1vdmVkIGZyb20gdGhlIGRyaXZlciBjb2RlLCBhcyBhbiBlbWFpbCBleGNoYW5nZSB3aXRoIFlhbWFoYQotICogICAgICAgcHJvdmlkZWQgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlIFlNRi03MTkgaXMgaW5kZWVkIGp1c3QgYQotICogICAgICAgcmUtYmFkZ2VkIDcxNS4KLSAqCi0gKiBDb3B5cmlnaHQgMTk5OC0yMDAxIFNjb3R0IE11cnJheSA8c2NvdHRAc3BpdGVmdWwub3JnPgotICoKLSAqIE9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIENTNDIzMiBkcml2ZXIgKGluIGNzNDIzMi5jKSBieSBIYW5udSBTYXZvbGFpbmVuCi0gKiBhbmQgb3RoZXJzLiAgTm93IGluY29ycG9yYXRlcyBjb2RlL2lkZWFzIGZyb20gcHNzLmMsIGFsc28gYnkgSGFubnUKLSAqIFNhdm9sYWluZW4uICBCb3RoIG9mIHRob3NlIGZpbGVzIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKLSAqIGxpY2Vuc2U6Ci0gKgotICogIkNvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKLSAqCi0gKiAgT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQotICogIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKLSAqICBmb3IgbW9yZSBpbmZvLiIKLSAqCi0gKiBBcyBzdWNoLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGFib3ZlIGxpY2Vuc2UsIHRoaXMgZmlsZSwgb3BsM3NhMi5jLCBpcwotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4KLSAqIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIENoYW5nZSBIaXN0b3J5Ci0gKiAtLS0tLS0tLS0tLS0tLQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgT3JpZ2luYWwgZHJpdmVyIChKdW4gMTQsIDE5OTgpCi0gKiBQYXVsIEouWS4gTGFoYWllICAgICAgICBDaGFuZ2VkIHByb2JpbmcgLyBhdHRhY2ggY29kZSBvcmRlcgotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQWRkZWQgbWl4ZXIgc3VwcG9ydCAoRGVjIDAzLCAxOTk4KQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQ2hhbmdlZCBkZXRlY3Rpb24gY29kZSB0byBiZSBtb3JlIGZvcmdpdmluZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGZvcmNlIG9wdGlvbiBhcyBsYXN0IHJlc29ydCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIGlvY3RsIHJldHVybiB2YWx1ZXMuIChEZWMgMzAsIDE5OTgpCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBTaW1wbGVyIGRldGVjdGlvbiBjb2RlIHNob3VsZCB3b3JrIGFsbCB0aGUgdGltZSBub3cKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIHRoYW5rcyB0byBCZW4gSHV0Y2hpbmdzIGZvciB0aGUgaGV1cmlzdGljKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgbm93IHVubmVjZXNzYXJ5IGZvcmNlIG9wdGlvbi4gKEphbiA1LCAxOTk5KQotICogQ2hyaXN0b3BoIEhlbGx3aWcJICAgQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCAoTWFyIDQsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBSZXdvcmtlZCBTQTIgdmVyc3VzIFNBMyBtaXhlciBjb2RlLCB1cGRhdGVkIGNoaXBzZXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZGV0ZWN0aW9uIGNvZGUgKGFnYWluISkuIChEZWMgNSwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkanVzdGVkIG1hc3RlciB2b2x1bWUgbWl4ZXIgc2NhbGluZy4gKERlYyA2LCAyMDAwKQotICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQmFzZWQgb24gYSBwYXRjaCBieSBKb2VsIFlsaWx1b21hIChha2EgQmlzcXdpdCksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkIHdpZGUgbWl4ZXIgYW5kIGFkanVzdGVkIG1pYywgYmFzcywgdHJlYmxlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nLiAoRGVjIDYsIDIwMDApCi0gKiBTY290dCBNdXJyYXkgICAgICAgICAgICBCYXNlZCBvbiBhIHBhdGNoIGJ5IFBldGVyIEVuZ2xtYWllciwgaW50ZWdyYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgeW1vZGUgYW5kIGxvb3BiYWNrIG9wdGlvbnMuIChEZWMgNiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEluc3BpcmVkIGJ5IGEgcGF0Y2ggYnkgUGV0ZXIgRW5nbG1haWVyLCBhbmQgYmFzZWQgb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgQUxTQSBkb2VzLCBhZGRlZCBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgRE1BIGFuZCBJUlEgc2V0dGluZ3MuIChEZWMgNiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkZGVkIHNvbWUgbW9yZSBjaGVja3MgdG8gdGhlIGNhcmQgZGV0ZWN0aW9uIGNvZGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB3aGF0IEFMU0EgZG9lcy4gKERlYyAxMiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEluc3BpcmVkIGJ5IHNpbWlsYXIgcGF0Y2hlcyBmcm9tIEpvaG4gRnJlbWxpbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEppbSBSYWRmb3JkLCBNaWtlIFJvbGlnLCBhbmQgSW5nbWFyIFN0ZWVuLCBhZGRlZCAyLjQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIElTQSBQblAgQVBJIHN1cHBvcnQsIG1haW5seSBiYXNlZCBvbiBiaXRzIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgIHNiX2NhcmQuYyBhbmQgYXdlX3dhdmUuYy4gKERlYyAxMiwgMjAwMCkKLSAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIFNvbWUgc21hbGwgY2xlYW51cHMgdG8gdGhlIGluaXQgY29kZSBvdXRwdXQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAoSmFuIDcsIDIwMDEpCi0gKiBad2FuZSBNd2Fpa2FtYm8JICAgQWRkZWQgUE0gc3VwcG9ydC4gKERlYyA0IDIwMDEpCi0gKgotICogQWRhbSBCZWxheSAgICAgICAgICAgICAgQ29udmVydGVkIGRyaXZlciB0byBuZXcgUG5QIExheWVyIChPY3QgMTIsIDIwMDIpCi0gKiBad2FuZSBNd2Fpa2FtYm8JICAgQ29kZSwgZGF0YSBzdHJ1Y3R1cmUgY2xlYW51cHMuIChGZWIgMTUgMjAwMikKLSAqIFp3YW5lIE13YWlrYW1ibwkgICBGcmVlIHJlc291cmNlcyBkdXJpbmcgYXV4aWxpYXJ5IGRldmljZSBwcm9iZQotICogCQkJICAgZmFpbHVyZXMgKEFwciAyOSAyMDAyKQotICogICAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcG5wLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSAic291bmRfY29uZmlnLmgiCi0KLSNpbmNsdWRlICJhZDE4NDguaCIKLSNpbmNsdWRlICJtcHU0MDEuaCIKLQotI2RlZmluZSBPUEwzU0EyX01PRFVMRV9OQU1FCSJvcGwzc2EyIgotI2RlZmluZSBQRlgJCQlPUEwzU0EyX01PRFVMRV9OQU1FICI6ICIKLQotLyogVXNlZnVsIGNvbnRyb2wgcG9ydCBpbmRleGVzOiAqLwotI2RlZmluZSBPUEwzU0EyX1BNCSAgICAgMHgwMQotI2RlZmluZSBPUEwzU0EyX1NZU19DVFJMICAgICAweDAyCi0jZGVmaW5lIE9QTDNTQTJfSVJRX0NPTkZJRyAgIDB4MDMKLSNkZWZpbmUgT1BMM1NBMl9ETUFfQ09ORklHICAgMHgwNgotI2RlZmluZSBPUEwzU0EyX01BU1RFUl9MRUZUICAweDA3Ci0jZGVmaW5lIE9QTDNTQTJfTUFTVEVSX1JJR0hUIDB4MDgKLSNkZWZpbmUgT1BMM1NBMl9NSUMgICAgICAgICAgMHgwOQotI2RlZmluZSBPUEwzU0EyX01JU0MgICAgICAgICAweDBBCi0KLSNkZWZpbmUgT1BMM1NBM19XSURFICAgICAgICAgMHgxNAotI2RlZmluZSBPUEwzU0EzX0JBU1MgICAgICAgICAweDE1Ci0jZGVmaW5lIE9QTDNTQTNfVFJFQkxFICAgICAgIDB4MTYKLQotLyogVXNlZnVsIGNvbnN0YW50czogKi8KLSNkZWZpbmUgREVGQVVMVF9WT0xVTUUgNTAKLSNkZWZpbmUgREVGQVVMVF9NSUMgICAgNTAKLSNkZWZpbmUgREVGQVVMVF9USU1CUkUgMAotCi0vKiBQb3dlciBzYXZpbmcgbW9kZXMgKi8KLSNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMAkweDAwCi0jZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTEJMHgwNAkvKiBQU1YgKi8KLSNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMgkweDA1CS8qIFBTViB8IFBEWCAqLwotI2RlZmluZSBPUEwzU0EyX1BNX01PREUzCTB4MjcJLyogQURPV04gfCBQU1YgfCBQRE4gfCBQRFggKi8KLQotCi0vKiBGb3IgY2hlY2tpbmcgYWdhaW5zdCB3aGF0IHRoZSBjYXJkIHJldHVybnM6ICovCi0jZGVmaW5lIFZFUlNJT05fVU5LTk9XTiAwCi0jZGVmaW5lIFZFUlNJT05fWU1GNzExICAxCi0jZGVmaW5lIFZFUlNJT05fWU1GNzE1ICAyCi0jZGVmaW5lIFZFUlNJT05fWU1GNzE1QiAzCi0jZGVmaW5lIFZFUlNJT05fWU1GNzE1RSA0Ci0vKiBhbHNvIGFzc3VtaW5nIHRoYXQgYW55dGhpbmcgPiA0IGJ1dCA8PSA3IGlzIGEgNzE1RSAqLwotCi0vKiBDaGlwc2V0IHR5cGUgY29uc3RhbnRzIGZvciB1c2UgYmVsb3cgKi8KLSNkZWZpbmUgQ0hJUFNFVF9VTktOT1dOIC0xCi0jZGVmaW5lIENISVBTRVRfT1BMM1NBMiAwCi0jZGVmaW5lIENISVBTRVRfT1BMM1NBMyAxCi1zdGF0aWMgY29uc3QgY2hhciAqQ0hJUFNFVF9UQUJMRVtdID0geyJPUEwzLVNBMiIsICJPUEwzLVNBMyJ9OwotCi0jaWZkZWYgQ09ORklHX1BOUAotI2RlZmluZSBPUEwzU0EyX0NBUkRTX01BWCA0Ci0jZWxzZQotI2RlZmluZSBPUEwzU0EyX0NBUkRTX01BWCAxCi0jZW5kaWYKLQotLyogVGhpcyBzaG91bGQgYmUgcHJldHR5IG9idmlvdXMgKi8KLXN0YXRpYyBpbnQgb3BsM3NhMl9jYXJkc19udW07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiBkZXZpY2UgcmVzb3VyY2VzICovCi0JdW5zaWduZWQgc2hvcnQgY2ZnX3BvcnQ7Ci0Jc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7Ci0Jc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXNzOwotCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKLSNpZmRlZiBDT05GSUdfUE5QCi0JLyogUG5QIFN0dWZmICovCi0Jc3RydWN0IHBucF9kZXYqIHBkZXY7Ci0JaW50IGFjdGl2YXRlZDsJCQkvKiBXaGV0aGVyIHNhaWQgZGV2aWNlcyBoYXZlIGJlZW4gYWN0aXZhdGVkICovCi0jZW5kaWYKLQl1bnNpZ25lZCBpbnQJY2FyZDsKLQlpbnQJCWNoaXBzZXQ7CS8qIFdoYXQncyBteSB2ZXJzaW9uKHMpPyAqLwotCWNoYXIJCSpjaGlwc2V0X25hbWU7Ci0KLQkvKiBtaXhlciBkYXRhICovCi0JaW50CQltaXhlcjsKLQl1bnNpZ25lZCBpbnQJdm9sdW1lX2w7Ci0JdW5zaWduZWQgaW50CXZvbHVtZV9yOwotCXVuc2lnbmVkIGludAltaWM7Ci0JdW5zaWduZWQgaW50CWJhc3NfbDsKLQl1bnNpZ25lZCBpbnQJYmFzc19yOwotCXVuc2lnbmVkIGludAl0cmVibGVfbDsKLQl1bnNpZ25lZCBpbnQJdHJlYmxlX3I7Ci0JdW5zaWduZWQgaW50CXdpZGVfbDsKLQl1bnNpZ25lZCBpbnQJd2lkZV9yOwotfSBvcGwzc2EyX3N0YXRlX3Q7Ci1zdGF0aWMgb3BsM3NhMl9zdGF0ZV90IG9wbDNzYTJfc3RhdGVbT1BMM1NBMl9DQVJEU19NQVhdOwotCi0JCi0KLS8qIE91ciBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBtc3NfaW8JPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8JPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyCT0gLTE7Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgeW1vZGUJPSAtMTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBsb29wYmFjawk9IC0xOwotCi0jaWZkZWYgQ09ORklHX1BOUAotLyogUG5QIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpc2FwbnAgPSAxOwotc3RhdGljIGludCBfX2luaXRkYXRhIG11bHRpcGxlID0gMTsKLQotLyogV2hldGhlciBzYWlkIGRldmljZXMgaGF2ZSBiZWVuIGFjdGl2YXRlZCAqLwotc3RhdGljIGludCBvcGwzc2EyX2FjdGl2YXRlZFtPUEwzU0EyX0NBUkRTX01BWF07Ci0jZWxzZQotc3RhdGljIGludCBfX2luaXRkYXRhIGlzYXBucDsgLyogPSAwICovCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgbXVsdGlwbGU7IC8qID0gMCAqLwotI2VuZGlmCi0KLU1PRFVMRV9ERVNDUklQVElPTigiTW9kdWxlIGZvciBPUEwzLVNBMiBhbmQgU0EzIHNvdW5kIGNhcmRzICh1c2VzIEFEMTg0OCBNU1MgZHJpdmVyKS4iKTsKLU1PRFVMRV9BVVRIT1IoIlNjb3R0IE11cnJheSA8c2NvdHRAc3BpdGVmdWwub3JnPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLW1vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sICJTZXQgSS9PIGJhc2Ugb2YgT1BMMy1TQTIgb3IgU0EzIGNhcmQgKHVzdWFsbHkgMHgzNzAuICBBZGRyZXNzIG11c3QgYmUgZXZlbiBhbmQgbXVzdCBiZSBmcm9tIDB4MTAwIHRvIDB4RkZFKSIpOwotCi1tb2R1bGVfcGFyYW0obXNzX2lvLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhtc3NfaW8sICJTZXQgTVNTIChhdWRpbykgSS9PIGJhc2UgKDB4NTMwLCAweEU4MCwgb3Igb3RoZXIuIEFkZHJlc3MgbXVzdCBlbmQgaW4gMCBvciA0IGFuZCBtdXN0IGJlIGZyb20gMHg1MzAgdG8gMHhGNDgpIik7Ci0KLW1vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1wdV9pbywgIlNldCBNSURJIEkvTyBiYXNlICgweDMzMCBvciBvdGhlci4gQWRkcmVzcyBtdXN0IGJlIGV2ZW4gYW5kIG11c3QgYmUgZnJvbSAweDMwMCB0byAweDMzNCkiKTsKLQotbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiU2V0IE1TUyAoYXVkaW8pIElSUSAoNSwgNywgOSwgMTAsIDExLCAxMikiKTsKLQotbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hLCAiU2V0IE1TUyAoYXVkaW8pIGZpcnN0IERNQSBjaGFubmVsICgwLCAxLCAzKSIpOwotCi1tb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hMiwgIlNldCBNU1MgKGF1ZGlvKSBzZWNvbmQgRE1BIGNoYW5uZWwgKDAsIDEsIDMpIik7Ci0KLW1vZHVsZV9wYXJhbSh5bW9kZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoeW1vZGUsICJTZXQgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKDAgPSBEZXNrdG9wL05vcm1hbCwgMSA9IE5vdGVib29rIFBDICgxKSwgMiA9IE5vdGVib29rIFBDICgyKSwgMyA9IEhpLUZpKSIpOwotCi1tb2R1bGVfcGFyYW0obG9vcGJhY2ssIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLCAiU2V0IEEvRCBpbnB1dCBzb3VyY2UuIFVzZWZ1bCBmb3IgZWNobyBjYW5jZWxsYXRpb24gKDAgPSBNaWMgUmNoIChkZWZhdWx0KSwgMSA9IE1vbm8gb3V0cHV0IGxvb3BiYWNrKSIpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlzYXBucCwgIldoZW4gc2V0IHRvIDAsIElTQSBQblAgc3VwcG9ydCB3aWxsIGJlIGRpc2FibGVkIik7Ci0KLW1vZHVsZV9wYXJhbShtdWx0aXBsZSwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG11bHRpcGxlLCAiV2hlbiBzZXQgdG8gMCwgd2lsbCBub3Qgc2VhcmNoIGZvciBtdWx0aXBsZSBjYXJkcyIpOwotI2VuZGlmCi0KLQotLyoKLSAqIFN0YW5kYXJkIHJlYWQgYW5kIHdyaXRlIGZ1bmN0aW9ucwotKi8KLQotc3RhdGljIGlubGluZSB2b2lkIG9wbDNzYTJfd3JpdGUodW5zaWduZWQgc2hvcnQgcG9ydCwKLQkJCQkgdW5zaWduZWQgY2hhciAgaW5kZXgsCi0JCQkJIHVuc2lnbmVkIGNoYXIgIGRhdGEpCi17Ci0Jb3V0Yl9wKGluZGV4LCBwb3J0KTsKLQlvdXRiKGRhdGEsIHBvcnQgKyAxKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb3BsM3NhMl9yZWFkKHVuc2lnbmVkIHNob3J0IHBvcnQsCi0JCQkJdW5zaWduZWQgY2hhciAgaW5kZXgsCi0JCQkJdW5zaWduZWQgY2hhciogZGF0YSkKLXsKLQlvdXRiX3AoaW5kZXgsIHBvcnQpOwotCSpkYXRhID0gaW5iKHBvcnQgKyAxKTsKLX0KLQotCi0vKgotICogQWxsIG9mIHRoZSBtaXhlciBmdW5jdGlvbnMuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX3NldF92b2x1bWUob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjYWxlWzEwMV0gPSB7Ci0JCTB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsCi0JCTB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGMsCi0JCTB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGIsCi0JCTB4MGIsIDB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksCi0JCTB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCi0JCTB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsCi0JCTB4MDYsIDB4MDYsIDB4MDYsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDUsCi0JCTB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsCi0JCTB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsCi0JCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCTB4MDAKLQl9OwotCXVuc2lnbmVkIGNoYXIgdm9sOwotCi0Jdm9sID0gc2NhbGVbbGVmdF07Ci0KLQkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KLQlpZighbGVmdCkKLQkJdm9sIHw9IDB4ODA7Ci0KLQlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EyX01BU1RFUl9MRUZULCB2b2wpOwotCi0Jdm9sID0gc2NhbGVbcmlnaHRdOwotCi0JLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCi0JaWYoIXJpZ2h0KQotCQl2b2wgfD0gMHg4MDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUFTVEVSX1JJR0hULCB2b2wpOwotfQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTJfc2V0X21pYyhvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZXZlbCkKLXsKLQl1bnNpZ25lZCBjaGFyIHZvbCA9IDB4MUY7Ci0KLQlpZigobGV2ZWwgPj0gMCkgJiYgKGxldmVsIDw9IDEwMCkpCi0JCXZvbCA9IDB4MUYgLSAodW5zaWduZWQgY2hhcikgKDMyICogbGV2ZWwgLyAxMDEpOwotCi0JLyogSWYgbGV2ZWwgaXMgemVybywgdHVybiBvbiBtdXRlICovCi0JaWYoIWxldmVsKQotCQl2b2wgfD0gMHg4MDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUlDLCB2b2wpOwotfQotCi0KLXN0YXRpYyB2b2lkIG9wbDNzYTNfc2V0X2Jhc3Mob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewotCXVuc2lnbmVkIGNoYXIgYmFzczsKLQotCWJhc3MgPSBsZWZ0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIGxlZnQgLyAxMDEpKSA6IDA7IAotCWJhc3MgfD0gKHJpZ2h0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIHJpZ2h0IC8gMTAxKSkgOiAwKSA8PCA0OwotCi0Jb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBM19CQVNTLCBiYXNzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EzX3NldF90cmVibGUob3BsM3NhMl9zdGF0ZV90KiBkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQotewkKLQl1bnNpZ25lZCBjaGFyIHRyZWJsZTsKLQotCXRyZWJsZSA9IGxlZnQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogbGVmdCAvIDEwMSkpIDogMDsgCi0JdHJlYmxlIHw9IChyaWdodCA/ICgodW5zaWduZWQgY2hhcikgKDggKiByaWdodCAvIDEwMSkpIDogMCkgPDwgNDsKLQotCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTNfVFJFQkxFLCB0cmVibGUpOwotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX21peGVyX3Jlc2V0KG9wbDNzYTJfc3RhdGVfdCogZGV2YykKLXsKLQlpZiAoZGV2YykgewotCQlvcGwzc2EyX3NldF92b2x1bWUoZGV2YywgREVGQVVMVF9WT0xVTUUsIERFRkFVTFRfVk9MVU1FKTsKLQkJZGV2Yy0+dm9sdW1lX2wgPSBkZXZjLT52b2x1bWVfciA9IERFRkFVTFRfVk9MVU1FOwotCi0JCW9wbDNzYTJfc2V0X21pYyhkZXZjLCBERUZBVUxUX01JQyk7Ci0JCWRldmMtPm1pYyA9IERFRkFVTFRfTUlDOwotCi0JCWlmIChkZXZjLT5jaGlwc2V0ID09IENISVBTRVRfT1BMM1NBMykgewotCQkJb3BsM3NhM19zZXRfYmFzcyhkZXZjLCBERUZBVUxUX1RJTUJSRSwgREVGQVVMVF9USU1CUkUpOwotCQkJZGV2Yy0+YmFzc19sID0gZGV2Yy0+YmFzc19yID0gREVGQVVMVF9USU1CUkU7Ci0JCQlvcGwzc2EzX3NldF90cmVibGUoZGV2YywgREVGQVVMVF9USU1CUkUsIERFRkFVTFRfVElNQlJFKTsKLQkJCWRldmMtPnRyZWJsZV9sID0gZGV2Yy0+dHJlYmxlX3IgPSBERUZBVUxUX1RJTUJSRTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFyZ190b192b2xfbW9ubyh1bnNpZ25lZCBpbnQgdm9sLCBpbnQqIHZhbHVlKQotewotCWludCBsZWZ0OwotCQotCWxlZnQgPSB2b2wgJiAweDAwZmY7Ci0JaWYgKGxlZnQgPiAxMDApCi0JCWxlZnQgPSAxMDA7Ci0JKnZhbHVlID0gbGVmdDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJnX3RvX3ZvbF9zdGVyZW8odW5zaWduZWQgaW50IHZvbCwgaW50KiBhbGVmdCwgaW50KiBhcmlnaHQpCi17Ci0JYXJnX3RvX3ZvbF9tb25vKHZvbCwgYWxlZnQpOwotCWFyZ190b192b2xfbW9ubyh2b2wgPj4gOCwgYXJpZ2h0KTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIGludCByZXRfdm9sX21vbm8oaW50IHZvbCkKLXsKLQlyZXR1cm4gKCh2b2wgPDwgOCkgfCB2b2wpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgaW50IHJldF92b2xfc3RlcmVvKGludCBsZWZ0LCBpbnQgcmlnaHQpCi17Ci0JcmV0dXJuICgocmlnaHQgPDwgOCkgfCBsZWZ0KTsKLX0KLQotCi1zdGF0aWMgaW50IG9wbDNzYTJfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgcmV0dmFsLCB2YWx1ZSwgY21kZiA9IGNtZCAmIDB4ZmY7Ci0JaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOwotCi0Jb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbZGV2XTsKLQkKLQlzd2l0Y2ggKGNtZGYpIHsKLQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCWNhc2UgU09VTkRfTUlYRVJfTUlDOgotCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6Ci0JCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogCi0JCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6Ci0JCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzogCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCQotCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdNJykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQotCXJldHZhbCA9IDA7Ci0JaWYgKF9TSU9DX0RJUiAoY21kKSAmIF9TSU9DX1dSSVRFKSB7Ci0JCXN3aXRjaCAoY21kZikgewotCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6Ci0JCQkJcmV0dmFsID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKLQkJCQlpZiAocmV0dmFsKQotCQkJCQlicmVhazsKLQkJCQlhcmdfdG9fdm9sX3N0ZXJlbyh2YWx1ZSwgJmRldmMtPnZvbHVtZV9sLCAmZGV2Yy0+dm9sdW1lX3IpOwotCQkJCW9wbDNzYTJfc2V0X3ZvbHVtZShkZXZjLCBkZXZjLT52b2x1bWVfbCwgZGV2Yy0+dm9sdW1lX3IpOwotCQkJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0JCSAgCi0JCQljYXNlIFNPVU5EX01JWEVSX01JQzoKLQkJCQlyZXR2YWwgPSBnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIF9fdXNlciAqKSBhcmcpOwotCQkJCWlmIChyZXR2YWwpCi0JCQkJCWJyZWFrOwotCQkJCWFyZ190b192b2xfbW9ubyh2YWx1ZSwgJmRldmMtPm1pYyk7Ci0JCQkJb3BsM3NhMl9zZXRfbWljKGRldmMsIGRldmMtPm1pYyk7Ci0JCQkJdmFsdWUgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWljKTsKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyoKLQkJICogUmV0dXJuIHBhcmFtZXRlcnMKLQkJICovCi0JCXN3aXRjaCAoY21kZikgewotCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgotCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19NSUMsIHApOwotCQkJCWJyZWFrOwotCQkgIAotCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgotCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX01BU0tfVk9MVU1FLCBwKTsKLQkJCQlicmVhazsKLQkJICAKLQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKLQkJCQkvKiBObyByZWNvcmRpbmcgZGV2aWNlcyAqLwotCQkJCXJldHZhbCA9IHB1dF91c2VyKDAsIHApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6Ci0JCQkJcmV0dmFsID0gcHV0X3VzZXIoU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIHApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKLQkJCQkvKiBObyByZWNvcmRpbmcgc291cmNlICovCi0JCQkJcmV0dmFsID0gcHV0X3VzZXIoMCwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgotCQkJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKLQkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0JCQkgIAotCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6Ci0JCQkJdmFsdWUgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWljKTsKLQkJCQlwdXRfdXNlcih2YWx1ZSwgcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotLyogb3BsM3NhMl9taXhlcl9pb2N0bCBlbmQgKi8KLQotCi1zdGF0aWMgaW50IG9wbDNzYTNfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0JaW50IHZhbHVlLCByZXR2YWwsIGNtZGYgPSBjbWQgJiAweGZmOwotCi0Jb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbZGV2XTsKLQotCXN3aXRjaCAoY21kZikgewotCWNhc2UgU09VTkRfTUlYRVJfQkFTUzoKLQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT5iYXNzX2wsIGRldmMtPmJhc3Nfcik7Ci0JCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQkJCi0JY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6Ci0JCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dHJlYmxlX2wsIGRldmMtPnRyZWJsZV9yKTsKLQkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIChpbnQgX191c2VyICopIGFyZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTT1VORF9NSVhFUl9ESUdJVEFMMToKLQkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT53aWRlX2wsIGRldmMtPndpZGVfcik7Ci0JCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0vKiBvcGwzc2EzX21peGVyX2lvY3RsIGVuZCAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBvcGwzc2EyX21peGVyX29wZXJhdGlvbnMgPQotewotCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCS5pZAk9ICJPUEwzLVNBMiIsCi0JLm5hbWUJPSAiWWFtYWhhIE9QTDMtU0EyIiwKLQkuaW9jdGwJPSBvcGwzc2EyX21peGVyX2lvY3RsCi19OwotCi1zdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgb3BsM3NhM19taXhlcl9vcGVyYXRpb25zID0KLXsKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkuaWQJPSAiT1BMMy1TQTMiLAotCS5uYW1lCT0gIllhbWFoYSBPUEwzLVNBMyIsCi0JLmlvY3RsCT0gb3BsM3NhM19taXhlcl9pb2N0bAotfTsKLQotLyogRW5kIG9mIG1peGVyLXJlbGF0ZWQgc3R1ZmYgKi8KLQotCi0vKgotICogQ29tcG9uZW50IHByb2JlLCBhdHRhY2gsIHVubG9hZCBmdW5jdGlvbnMKLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyX21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCi17Ci0JdW5sb2FkX21wdTQwMShod19jb25maWcpOwotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfb3BsM3NhMl9tc3Moc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzKQotewotCWludCBpbml0aWFsX21peGVyczsKLQotCWluaXRpYWxfbWl4ZXJzID0gbnVtX21peGVyczsKLQlhdHRhY2hfbXNfc291bmQoaHdfY29uZmlnLCBwb3J0cywgVEhJU19NT0RVTEUpOwkvKiBTbG90IDAgKi8KLQlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSkgewotCQkvKiBEaWQgdGhlIE1TUyBkcml2ZXIgaW5zdGFsbD8gKi8KLQkJaWYobnVtX21peGVycyA9PSAoaW5pdGlhbF9taXhlcnMgKyAxKSkgewotCQkJLyogVGhlIE1TUyBtaXhlciBpcyBpbnN0YWxsZWQsIHJlcm91dGUgbWl4ZXJzIGFwcHJvcHJpYXRlbHkgKi8KLQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9DRCk7Ci0JCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMiwgU09VTkRfTUlYRVJfU1lOVEgpOwotCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0xJTkUpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTVNTIG1peGVyIG5vdCBpbnN0YWxsZWQ/XG4iKTsKLQkJfQotCX0KLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyX21zcyhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcpCi17Ci0JdW5sb2FkX21zX3NvdW5kKGh3X2NvbmZpZyk7Ci19Ci0KLQotc3RhdGljIGludCBfX2luaXQgcHJvYmVfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQotewotCXVuc2lnbmVkIGNoYXIgbWlzYzsKLQl1bnNpZ25lZCBjaGFyIHRtcDsKLQl1bnNpZ25lZCBjaGFyIHZlcnNpb247Ci0KLQkvKgotCSAqIFRyeSBhbmQgYWxsb2NhdGUgb3VyIEkvTyBwb3J0IHJhbmdlLgotCSAqLwotCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyLCBPUEwzU0EyX01PRFVMRV9OQU1FKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBub3QgZnJlZVxuIiwKLQkJICAgICAgIGh3X2NvbmZpZy0+aW9fYmFzZSk7Ci0JCWdvdG8gb3V0X25vZGV2OwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgd3JpdGluZyB0byB0aGUgcmVhZC1vbmx5IHZlcnNpb24gYml0cyBvZiB0aGUgbWlzY2VsbGFuZW91cwotCSAqIHJlZ2lzdGVyIHN1Y2NlZWRzIG9yIG5vdCAoaXQgc2hvdWxkIG5vdCkuCi0JICovCi0Jb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCAmbWlzYyk7Ci0Jb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgbWlzYyBeIDB4MDcpOwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgJnRtcCk7Ci0JaWYodG1wICE9IG1pc2MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggaXMgbm90IGEgWU1GN3h4IGNoaXBzZXQhXG4iLAotCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKLQkJZ290byBvdXRfcmVnaW9uOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIE1JQyByZWdpc3RlciBpcyBhY2Nlc3NpYmxlLgotCSAqLwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAmdG1wKTsKLQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsIDB4OGEpOwotCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlDLCAmdG1wKTsKLQlpZigodG1wICYgMHg5ZikgIT0gMHg4YSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgIFBGWCAiQ29udHJvbCBJL08gcG9ydCAlI3ggaXMgbm90IGEgWU1GN3h4IGNoaXBzZXQhXG4iLAotCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKLQkJZ290byBvdXRfcmVnaW9uOwotCX0KLQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsIHRtcCk7Ci0KLQkvKgotCSAqIERldGVybWluZSBjaGlwc2V0IHR5cGUgKFNBMiBvciBTQTMpCi0JICoKLQkgKiBUaGlzIGlzIGRvbmUgYnkgbG9va2luZyBhdCB0aGUgY2hpcHNldCB2ZXJzaW9uIGluIHRoZSBsb3dlciAzIGJpdHMKLQkgKiBvZiB0aGUgbWlzY2VsbGFuZW91cyByZWdpc3Rlci4KLQkgKi8KLQl2ZXJzaW9uID0gbWlzYyAmIDB4MDc7Ci0JcHJpbnRrKEtFUk5fREVCVUcgUEZYICJDaGlwc2V0IHZlcnNpb24gPSAlI3hcbiIsIHZlcnNpb24pOwotCXN3aXRjaCAodmVyc2lvbikgewotCQljYXNlIDA6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX1VOS05PV047Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICBQRlggIlVua25vd24gWWFtYWhhIGF1ZGlvIGNvbnRyb2xsZXIgdmVyc2lvblxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFUlNJT05fWU1GNzExOgotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EyOwotCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkZvdW5kIE9QTDMtU0EyIChZTUY3MTEpXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVkVSU0lPTl9ZTUY3MTU6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1IG9yIFlNRjcxOSlcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBWRVJTSU9OX1lNRjcxNUI6Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTM7Ci0JCQlwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgICAgUEZYICJGb3VuZCBPUEwzLVNBMyAoWU1GNzE1QiBvciBZTUY3MTlCKVxuIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFUlNJT05fWU1GNzE1RToKLQkJZGVmYXVsdDoKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKLQkJCXByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTVFIG9yIFlNRjcxOUUpXG4iKTsKLQkJCWJyZWFrOwotCX0KLQotCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgIT0gQ0hJUFNFVF9VTktOT1dOKSB7Ci0JCS8qIEdlbmVyYXRlIGEgcHJldHR5IG5hbWUgKi8KLQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0X25hbWUgPSAoY2hhciAqKUNISVBTRVRfVEFCTEVbb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0XTsKLQkJcmV0dXJuIDA7Ci0JfQotCi1vdXRfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7Ci1vdXRfbm9kZXY6Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCi17Ci0JLyogSW5pdGlhbGl6ZSBJUlEgY29uZmlndXJhdGlvbiB0byBJUlEtQjogLSwgSVJRLUE6IFdTUytNUFUrT1BMMyAqLwotCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0lSUV9DT05GSUcsIDB4MGQpOwotCi0JLyogSW5pdGlhbGl6ZSBETUEgY29uZmlndXJhdGlvbiAqLwotCWlmKGh3X2NvbmZpZy0+ZG1hMiA9PSBod19jb25maWctPmRtYSkgewotCQkvKiBXYW50IERNQSBjb25maWd1cmF0aW9uIERNQS1COiAtLCBETUEtQTogV1NTLVArV1NTLVIgKi8KLQkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfRE1BX0NPTkZJRywgMHgwMyk7Ci0JfQotCWVsc2UgewotCQkvKiBXYW50IERNQSBjb25maWd1cmF0aW9uIERNQS1COiBXU1MtUiwgRE1BLUE6IFdTUy1QICovCi0JCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX0RNQV9DT05GSUcsIDB4MjEpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTJfbWl4ZXIoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgY2FyZCkKLXsKLQlzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyogbWl4ZXJfb3BlcmF0aW9uczsKLQlvcGwzc2EyX3N0YXRlX3QqIGRldmMgPSAmb3BsM3NhMl9zdGF0ZVtjYXJkXTsKLQotCS8qIEluc3RhbGwgbWFzdGVyIG1peGVyICovCi0JaWYgKGRldmMtPmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EzKSB7Ci0JCW1peGVyX29wZXJhdGlvbnMgPSAmb3BsM3NhM19taXhlcl9vcGVyYXRpb25zOwotCX0KLQllbHNlIHsKLQkJbWl4ZXJfb3BlcmF0aW9ucyA9ICZvcGwzc2EyX21peGVyX29wZXJhdGlvbnM7Ci0JfQotCi0JZGV2Yy0+Y2ZnX3BvcnQgPSBod19jb25maWctPmlvX2Jhc2U7Ci0JZGV2Yy0+bWl4ZXIgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAotCQkJCQkgIG1peGVyX29wZXJhdGlvbnMtPm5hbWUsCi0JCQkJCSAgbWl4ZXJfb3BlcmF0aW9ucywKLQkJCQkJICBzaXplb2Yoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAotCQkJCQkgIGRldmMpOwotCWlmKGRldmMtPm1peGVyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZCBub3QgaW5zdGFsbCAlcyBtYXN0ZXIgbWl4ZXJcbiIsCi0JCQkgbWl4ZXJfb3BlcmF0aW9ucy0+bmFtZSk7Ci0JfQotCWVsc2UgewotCQkJb3BsM3NhMl9taXhlcl9yZXNldChkZXZjKTsKLQotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBvcGwzc2EyX2NsZWFyX3Nsb3RzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZykKLXsKLQlpbnQgaTsKLQotCWZvcihpID0gMDsgaSA8IDY7IGkrKykgewotCQlod19jb25maWctPnNsb3RzW2ldID0gLTE7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBvcGwzc2EyX3NldF95bW9kZShzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCB5bW9kZSkKLXsKLQkvKgotCSAqIFNldCB0aGUgWWFtYWhhIDNEIGVuaGFuY2VtZW50IG1vZGUgKGFrYSBZbWVyc2lvbikgaWYgYXNrZWQgdG8gYW5kCi0JICogaXQncyBzdXBwb3J0ZWQuCi0JICoKLQkgKiAwOiBEZXNrdG9wIChha2Egbm9ybWFsKSAgIDUtMTIgY20gc3BlYWtlcnMKLQkgKiAxOiBOb3RlYm9vayBQQyBtb2RlIDEgICAgIDMgY20gc3BlYWtlcnMKLQkgKiAyOiBOb3RlYm9vayBQQyBtb2RlIDIgICAgIDEuNSBjbSBzcGVha2VycwotCSAqIDM6IEhpLWZpICAgICAgICAgICAgICAgICAgMTYtMzggY20gc3BlYWtlcnMKLQkgKi8KLQlpZih5bW9kZSA+PSAwICYmIHltb2RlIDw9IDMpIHsKLQkJdW5zaWduZWQgY2hhciBzeXNfY3RybDsKLQotCQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX1NZU19DVFJMLCAmc3lzX2N0cmwpOwotCQlzeXNfY3RybCA9IChzeXNfY3RybCAmIDB4Y2YpIHwgKCh5bW9kZSAmIDMpIDw8IDQpOwotCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9TWVNfQ1RSTCwgc3lzX2N0cmwpOwotCX0KLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm90IHNldHRpbmcgeW1vZGUsIGl0IG11c3QgYmUgb25lIG9mIDAsMSwyLDNcbiIpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb3BsM3NhMl9zZXRfbG9vcGJhY2soc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgbG9vcGJhY2spCi17Ci0JaWYobG9vcGJhY2sgPj0gMCAmJiBsb29wYmFjayA8PSAxKSB7Ci0JCXVuc2lnbmVkIGNoYXIgbWlzYzsKLQotCQlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsICZtaXNjKTsKLQkJbWlzYyA9IChtaXNjICYgMHhlZikgfCAoKGxvb3BiYWNrICYgMSkgPDwgNCk7Ci0JCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsIG1pc2MpOwotCX0KLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm90IHNldHRpbmcgbG9vcGJhY2ssIGl0IG11c3QgYmUgZWl0aGVyIDAgb3IgMVxuIik7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhMihzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBjYXJkKQotewotICAgICAgICAvKiBSZWxlYXNlIGNvbnRyb2wgcG9ydHMgKi8KLQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOwotCi0JLyogVW5sb2FkIG1peGVyICovCi0JaWYob3BsM3NhMl9zdGF0ZVtjYXJkXS5taXhlciA+PSAwKQotCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYob3BsM3NhMl9zdGF0ZVtjYXJkXS5taXhlcik7Ci0KLX0KLQotI2lmZGVmIENPTkZJR19QTlAKLXN0YXRpYyBzdHJ1Y3QgcG5wX2RldmljZV9pZCBwbnBfb3BsM3NhMl9saXN0W10gPSB7Ci0Jey5pZCA9ICJZTUgwMDIxIiwgLmRyaXZlcl9kYXRhID0gMH0sCi0Jey5pZCA9ICIifQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHBucF9vcGwzc2EyX2xpc3QpOwotCi1zdGF0aWMgaW50IG9wbDNzYTJfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCi17Ci0JaW50IGNhcmQgPSBvcGwzc2EyX2NhcmRzX251bTsKLQotCS8qIHdlIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gcmV0dXJuIGFuIGVycm9yIGFzIHRoZSB1c2VyIG1heSBoYXZlIHNwZWNpZmllZAotCSAqIG5vIG11bHRpcGxlIGNhcmQgc2VhcmNoCi0JICovCi0KLQlpZiAob3BsM3NhMl9jYXJkc19udW0gPT0gT1BMM1NBMl9DQVJEU19NQVgpCi0JCXJldHVybiAwOwotCW9wbDNzYTJfYWN0aXZhdGVkW2NhcmRdID0gMTsKLQotCS8qIE91ciBvd24gY29uZmlnOiAqLwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsIDQpOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlycSAgICAgPSBwbnBfaXJxKGRldiwgMCk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hICAgICA9IHBucF9kbWEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEyICAgID0gcG5wX2RtYShkZXYsIDEpOwotCi0JLyogVGhlIE1TUyBjb25maWc6ICovCi0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlvX2Jhc2UgICAgICA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMSk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlycSAgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hICAgICAgICAgID0gcG5wX2RtYShkZXYsIDApOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEyICAgICAgICAgPSBwbnBfZG1hKGRldiwgMSk7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmNhcmRfc3VidHlwZSA9IDE7IC8qIE5vIElSUSBvciBETUEgc2V0dXAgKi8KLQotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICAgICAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAzKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaXJxICAgICAgICAgICA9IHBucF9pcnEoZGV2LCAwKTsKLQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hICAgICAgICAgICA9IC0xOwotCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEyICAgICAgICAgID0gLTE7Ci0Jb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmFsd2F5c19kZXRlY3QgPSAxOyAvKiBJdCdzIHRoZXJlLCBzbyB1c2Ugc2hhcmVkIElSUXMgKi8KLQotCS8qIENhbGwgbWUgcGFyYW5vaWQ6ICovCi0Jb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOwotCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7Ci0Jb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1KTsKLQotCW9wbDNzYTJfc3RhdGVbY2FyZF0ucGRldiA9IGRldjsKLQlvcGwzc2EyX2NhcmRzX251bSsrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcG5wX2RyaXZlciBvcGwzc2EyX2RyaXZlciA9IHsKLQkubmFtZQkJPSAib3BsM3NhMiIsCi0JLmlkX3RhYmxlCT0gcG5wX29wbDNzYTJfbGlzdCwKLQkucHJvYmUJCT0gb3BsM3NhMl9wbnBfcHJvYmUsCi19OwotCi0jZW5kaWYgLyogQ09ORklHX1BOUCAqLwotCi0vKiBFbmQgb2YgY29tcG9uZW50IGZ1bmN0aW9ucyAqLwotCi0vKgotICogSW5zdGFsbCBPUEwzLVNBMiBiYXNlZCBjYXJkKHMpLgotICoKLSAqIE5lZWQgdG8gaGF2ZSBhZDE4NDggYW5kIG1wdTQwMSBsb2FkZWQgcmVhZHkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGluaXRfb3BsM3NhMih2b2lkKQotewotCWludCBjYXJkLCBtYXg7Ci0KLQkvKiBTYW5pdGl6ZSBpc2FwbnAgYW5kIG11bHRpcGxlIHNldHRpbmdzICovCi0JaXNhcG5wID0gaXNhcG5wICE9IDAgPyAxIDogMDsKLQltdWx0aXBsZSA9IG11bHRpcGxlICE9IDAgPyAxIDogMDsKLQotCW1heCA9IChtdWx0aXBsZSAmJiBpc2FwbnApID8gT1BMM1NBMl9DQVJEU19NQVggOiAxOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChpc2FwbnApewotCQlwbnBfcmVnaXN0ZXJfZHJpdmVyKCZvcGwzc2EyX2RyaXZlcik7Ci0JCWlmKCFvcGwzc2EyX2NhcmRzX251bSl7Ci0JCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiTm8gUG5QIGNhcmRzIGZvdW5kXG4iKTsKLQkJCWlzYXBucCA9IDA7Ci0JCX0KLQkJbWF4ID0gb3BsM3NhMl9jYXJkc19udW07Ci0JfQotI2VuZGlmCi0KLQlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgbWF4OyBjYXJkKyspIHsKLQkJLyogSWYgYSB1c2VyIHdhbnRzIGFuIEkvTyB0aGVuIGFzc3VtZSB0aGV5IG1lYW50IGl0ICovCi0JCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7Ci0JCWludCBiYXNlOwotCQkKLQkJaWYgKCFpc2FwbnApIHsKLQkJCWlmIChpbyA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgZG1hID09IC0xIHx8Ci0JCQkgICAgZG1hMiA9PSAtMSB8fCBtc3NfaW8gPT0gLTEpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkgICAgICAgUEZYICJpbywgbXNzX2lvLCBpcnEsIGRtYSwgYW5kIGRtYTIgbXVzdCBiZSBzZXRcbiIpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJb3BsM3NhMl9jYXJkc19udW0rKzsKLQotCQkJLyoKLQkJCSAqIE91ciBvd24gY29uZmlnOgotCQkJICogKE5PVEU6IElSUSBhbmQgRE1BIGFyZW4ndCB1c2VkLCBzbyB0aGV5J3JlIHNldCB0bwotCQkJICogIGdpdmUgcHJldHR5IG91dHB1dCBmcm9tIGNvbmZfcHJpbnRmLiA6KQotCQkJICovCi0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlID0gaW87Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pcnEgICAgID0gaXJxOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hICAgICA9IGRtYTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYTIgICAgPSBkbWEyOwotCQotCQkJLyogVGhlIE1TUyBjb25maWc6ICovCi0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZSAgICAgID0gbXNzX2lvOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmlycSAgICAgICAgICA9IGlycTsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEgICAgICAgICAgPSBkbWE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuZG1hMiAgICAgICAgID0gZG1hMjsKLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5jYXJkX3N1YnR5cGUgPSAxOyAvKiBObyBJUlEgb3IgRE1BIHNldHVwICovCi0KLQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICAgICAgID0gbXB1X2lvOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlycSAgICAgICAgICAgPSBpcnE7Ci0JCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuZG1hICAgICAgICAgICA9IC0xOwotCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmFsd2F5c19kZXRlY3QgPSAxOyAvKiBVc2Ugc2hhcmVkIElSUXMgKi8KLQotCQkJLyogQ2FsbCBtZSBwYXJhbm9pZDogKi8KLQkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKLQkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcyk7Ci0JCQlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOwotCQl9Ci0KLQkJLyogRklYTUU6IGxlYWsgKi8KLQkJaWYgKHByb2JlX29wbDNzYTIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKSkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCWJhc2UgPSBvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZTsKLQotCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDQsICJXU1MgY29uZmlnIikpCi0JCQlnb3RvIGZhaWxlZDsKLQotCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UgKyA0LCA0LCAiYWQxODQ4Iik7Ci0JCWlmICghcG9ydHMpCi0JCQlnb3RvIGZhaWxlZDI7Ci0KLQkJaWYgKCFwcm9iZV9tc19zb3VuZCgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLCBwb3J0cykpIHsKLQkJCS8qCi0JCQkgKiBJZiBvbmUgb3IgbW9yZSBjYXJkcyBhcmUgYWxyZWFkeSByZWdpc3RlcmVkLCBkb24ndAotCQkJICogcmV0dXJuIGFuIGVycm9yIGJ1dCBwcmludCBhIHdhcm5pbmcuICBOb3RlLCB0aGlzCi0JCQkgKiBzaG91bGQgbmV2ZXIgcmVhbGx5IGhhcHBlbiB1bmxlc3MgdGhlIGhhcmR3YXJlIG9yCi0JCQkgKiBJU0EgUG5QIHNjcmV3ZWQgdXAuCi0JCQkgKi8KLQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UgKyA0LCA0KTsKLQkJZmFpbGVkMjoKLQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDQpOwotCQlmYWlsZWQ6Ci0JCQlyZWxlYXNlX3JlZ2lvbihvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5pb19iYXNlLCAyKTsKLQotCQkJaWYgKG9wbDNzYTJfY2FyZHNfbnVtKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSAgICAgICBQRlggIlRoZXJlIHdhcyBhIHByb2JsZW0gcHJvYmluZyBvbmUgIgotCQkJCSAgICAgICAiIG9mIHRoZSBJU0EgUE5QIGNhcmRzLCBjb250aW51aW5nXG4iKTsKLQkJCQlvcGwzc2EyX2NhcmRzX251bS0tOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQlhdHRhY2hfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOwotCQljb25mX3ByaW50ZihvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRfbmFtZSwgJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnKTsKLQkJYXR0YWNoX29wbDNzYTJfbWl4ZXIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKTsKLQkJYXR0YWNoX29wbDNzYTJfbXNzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MsIHBvcnRzKTsKLQotCQkvKiBld3d3ID0pICovCi0JCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2FyZCA9IGNhcmQ7Ci0KLQkJLyoKLQkJICogU2V0IHRoZSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoYWthIFltZXJzaW9uKSBpZiBhc2tlZCB0byBhbmQKLQkJICogaXQncyBzdXBwb3J0ZWQuCi0JCSAqLwotCQlpZiAoeW1vZGUgIT0gLTEpIHsKLQkJCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgIFBGWCAieW1vZGUgbm90IHN1cHBvcnRlZCBvbiBPUEwzLVNBMlxuIik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcGwzc2EyX3NldF95bW9kZSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIHltb2RlKTsKLQkJCX0KLQkJfQotCi0KLQkJLyogU2V0IEEvRCBpbnB1dCB0byBNb25vIGxvb3BiYWNrIGlmIGFza2VkIHRvLiAqLwotCQlpZiAobG9vcGJhY2sgIT0gLTEpIHsKLQkJCW9wbDNzYTJfc2V0X2xvb3BiYWNrKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgbG9vcGJhY2spOwotCQl9Ci0JCQotCQkvKiBBdHRhY2ggTVBVIGlmIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZG8gc28sIGZhaWx1cmUgaXNuJ3QgZmF0YWwgKi8KLQkJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICE9IC0xKSB7Ci0JCQlpbnQgYmFzZSA9IG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlOwotCQkJc3RydWN0IHJlc291cmNlICpwb3J0czsKLQkJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oYmFzZSwgMiwgIm1wdTQwMSIpOwotCQkJaWYgKCFwb3J0cykKLQkJCQlnb3RvIG91dDsKLQkJCWlmICghcHJvYmVfbXB1NDAxKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUsIHBvcnRzKSkgewotCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKGF0dGFjaF9tcHU0MDEoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSwgVEhJU19NT0RVTEUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGF0dGFjaCBNUFU0MDFcbiIpOwotCQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5zbG90c1sxXSA9IC0xOwotCQkJfQotCQl9Ci0JfQotCi1vdXQ6Ci0JaWYgKGlzYXBucCkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICIlZCBQblAgY2FyZChzKSBmb3VuZC5cbiIsIG9wbDNzYTJfY2FyZHNfbnVtKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogVW5pbnN0YWxsIE9QTDMtU0EyIGJhc2VkIGNhcmQocykuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX29wbDNzYTIodm9pZCkKLXsKLQlpbnQgY2FyZDsKLQotCWZvcihjYXJkID0gMDsgY2FyZCA8IG9wbDNzYTJfY2FyZHNfbnVtOyBjYXJkKyspIHsKLQkgICAgICAgIGlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuc2xvdHNbMV0gIT0gLTEpIHsKLQkJCXVubG9hZF9vcGwzc2EyX21wdSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1KTsKLSAJCX0KLQkJdW5sb2FkX29wbDNzYTJfbXNzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MpOwotCQl1bmxvYWRfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOwotI2lmZGVmIENPTkZJR19QTlAKLQkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZvcGwzc2EyX2RyaXZlcik7Ci0jZW5kaWYKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KGluaXRfb3BsM3NhMik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX29wbDNzYTIpOwotCi0jaWZuZGVmIE1PRFVMRQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfb3BsM3NhMihjaGFyICpzdHIpCi17Ci0JLyogaW8sIGlycSwgZG1hLCBkbWEyLC4uLiAqLwotI2lmZGVmIENPTkZJR19QTlAKLQlpbnQgaW50c1sxMV07Ci0jZWxzZQotCWludCBpbnRzWzldOwotI2VuZGlmCi0Jc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQkKLQlpbyAgICAgICA9IGludHNbMV07Ci0JaXJxICAgICAgPSBpbnRzWzJdOwotCWRtYSAgICAgID0gaW50c1szXTsKLQlkbWEyICAgICA9IGludHNbNF07Ci0JbXNzX2lvICAgPSBpbnRzWzVdOwotCW1wdV9pbyAgID0gaW50c1s2XTsKLQl5bW9kZSAgICA9IGludHNbN107Ci0JbG9vcGJhY2sgPSBpbnRzWzhdOwotI2lmZGVmIENPTkZJR19QTlAKLQlpc2FwbnAgICA9IGludHNbOV07Ci0JbXVsdGlwbGUgPSBpbnRzWzEwXTsKLSNlbmRpZgotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJvcGwzc2EyPSIsIHNldHVwX29wbDNzYTIpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHJpZGVudC5jIGIvc291bmQvb3NzL3RyaWRlbnQuYwppbmRleCAzYmMxZjZlLi45NmFkYzQ3IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvdHJpZGVudC5jCisrKyBiL3NvdW5kL29zcy90cmlkZW50LmMKQEAgLTExLDEyICsxMSwxMiBAQAogICogIEJ1aWx0IGZyb206CiAgKglMb3cgbGV2ZWwgY29kZTogPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+IGZyb20gQUxTQQogICoJRnJhbWV3b3JrOiBUaG9tYXMgU2FpbGVyIDxzYWlsZXJAaWZlLmVlLmV0aHouY2g+Ci0gKglFeHRlbmRlZCBieTogWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+ICAKKyAqCUV4dGVuZGVkIGJ5OiBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KICAqCiAgKiAgSGFja2VkIHVwIGJ5OgogICoJQWFyb24gSG9sdHptYW4gPGFob2x0em1hQGVzcy5lbmdyLnV2aWMuY2E+CiAgKglPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+IFNpUyA3MDE4IEF1ZGlvIENvcmUgU3VwcG9ydAotICoJQ2hpbmctTGluZyBMZWUgPGNsaW5nLWxpQGFsaS5jb20udHc+IEFMaSA1NDUxIEF1ZGlvIENvcmUgU3VwcG9ydCAKKyAqCUNoaW5nLUxpbmcgTGVlIDxjbGluZy1saUBhbGkuY29tLnR3PiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICAqCU1hdHQgV3UgPG1hdHR3dUBhY2Vyc29mdGVjaC5jb20uY24+IEFMaSA1NDUxIEF1ZGlvIENvcmUgU3VwcG9ydAogICoJUGV0ZXIgV8OkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+IEN5YmVyUHJvNTA1MCBzdXBwb3J0CiAgKiAgICAgIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAbXVsaXgub3JnPgpAQCAtNTQsMzMgKzU0LDMzIEBACiAgKglhZGFwdCB0byBuZXcgcGNpIGpveXN0aWNrIGF0dGFjaG1lbnQgaW50ZXJmYWNlCiAgKiAgdjAuMTQuMTBmCiAgKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KLSAqICAgICAgcGF0Y2ggZnJvbSBFcmljIExlbWFyICh2aWEgSWFuIFNvYm9yb2ZmKTogaW4gc3VzcGVuZCBhbmQgcmVzdW1lLCAKLSAqICAgICAgZml4IHdyb25nIGNhc3QgZnJvbSBwY2lfZGV2KiB0byBzdHJ1Y3QgdHJpZGVudF9jYXJkKi4gCisgKiAgICAgIHBhdGNoIGZyb20gRXJpYyBMZW1hciAodmlhIElhbiBTb2Jvcm9mZik6IGluIHN1c3BlbmQgYW5kIHJlc3VtZSwKKyAqICAgICAgZml4IHdyb25nIGNhc3QgZnJvbSBwY2lfZGV2KiB0byBzdHJ1Y3QgdHJpZGVudF9jYXJkKi4KICAqICB2MC4xNC4xMGUKICAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgotICogICAgICByZXdyaXRlIHRoZSBETUEgYnVmZmVyIGFsbG9jYXRpb24vZGVhbGxjb2F0aW9uIGZ1bmN0aW9ucywgdG8gbWFrZSBpdCAKLSAqICAgICAgbW9kdWxhciBhbmQgZml4IGEgYnVnIHdoZXJlIHdlIHdvdWxkIGNhbGwgZnJlZV9wYWdlcyBvbiBtZW1vcnkgCi0gKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZiAKKyAqICAgICAgcmV3cml0ZSB0aGUgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsY29hdGlvbiBmdW5jdGlvbnMsIHRvIG1ha2UgaXQKKyAqICAgICAgbW9kdWxhciBhbmQgZml4IGEgYnVnIHdoZXJlIHdlIHdvdWxkIGNhbGwgZnJlZV9wYWdlcyBvbiBtZW1vcnkKKyAqICAgICAgb2J0YWluZWQgd2l0aCBwY2lfYWxsb2NfY29uc2lzdGVudC4gQWxzbyByZW1vdmUgdW5uZWNlc3NhcnkgI2lmZGVmCiAgKiAgICAgIENPTkZJR19QUk9DX0ZTIGFuZCB2YXJpb3VzIG90aGVyIGNsZWFudXBzLgogICogIHYwLjE0LjEwZAogICogICAgICBKdWx5IDE5IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CiAgKiAgICAgIG1hZGUgc2V2ZXJhbCBwcmludGsoS0VSTl9OT1RJQ0UuLi4pIGludG8gVFJEQkcoLi4uKSwgdG8gYXZvaWQgc3BhbW1pbmcKLSAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAorICogICAgICBteSBzeXNsb2cgd2l0aCBodW5kcmVkcyBvZiBtZXNzYWdlcy4KICAqICB2MC4xNC4xMGMKICAqICAgICAgSnVseSAxNiAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogICogICAgICBDbGVhbmVkIHVwIExlaSBIdSdzIDAuNC4xMCBkcml2ZXIgdG8gY29uZm9ybSB0byBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCi0gKiAgICAgIGFuZCB0aGUgY29kaW5nIHN0eWxlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIGZpbGUuIAorICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLgogICogIHYwLjE0LjEwYgogICogICAgICBKdW5lIDIzIDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+Ci0gKiAgICAgIGFkZCBhIG1pc3NpbmcgdW5sb2NrX3NldF9mbXQsIHJlbW92ZSBhIHN1cGVyZmxvdXMgbG9jay91bmxvY2sgcGFpciAKLSAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uIAorICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIKKyAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uCiAgKiAgdjAuMTQuMTBhCi0gKiAgICAgIEp1bmUgMjEgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4gCi0gKiAgICAgIHVzZSBhIGRlYnVnIG1hY3JvIGluc3RlYWQgb2YgI2lmZGVmIENPTkZJR19ERUJVRywgdHJpbSB0byA4MCBjb2x1bW5zIAotICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAorICogICAgICBKdW5lIDIxIDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CisgKiAgICAgIHVzZSBhIGRlYnVnIG1hY3JvIGluc3RlYWQgb2YgI2lmZGVmIENPTkZJR19ERUJVRywgdHJpbSB0byA4MCBjb2x1bW5zCisgKiAgICAgIHBlciBsaW5lLCB1c2UgJ2RvIHt9IHdoaWxlICgwKScgaW4gc3RhdGVtZW50IG1hY3Jvcy4KICAqICB2MC4xNC4xMAogICogICAgICBKdW5lIDYgMjAwMiBMZWkgSHUgPExlaV9odUBhbGkuY29tLnR3PgotICogICAgICByZXdyaXRlIHRoZSBwYXJ0IHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9mIGF1ZGlvIGNvZGVjIGZvciBBbGk1NDUxIAorICogICAgICByZXdyaXRlIHRoZSBwYXJ0IHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzIG9mIGF1ZGlvIGNvZGVjIGZvciBBbGk1NDUxCiAgKiAgdjAuMTQuOWUKICAqICAgICAgSmFudWFyeSAyIDIwMDIgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAdWN3LmN6PiBhZGRlZCBnYW1lcG9ydAogICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCkBAIC0xMTEsNyArMTExLDcgQEAKICAqCVNldCBFQlVGMSBhbmQgRUJVRjIgdG8gc3RpbGwgbW9kZQogICoJQWRkIGRjOTcvYWM5NyByZXNldCBmdW5jdGlvbgogICoJRml4IHBvd2VyIG1hbmFnZW1lbnQ6IGFsaV9yZXN0b3JlX3JlZ3MKLSAqICB1bnJlbGVhc2VkIAorICogIHVucmVsZWFzZWQKICAqCU1hciAwOSAyMDAxIE1hdHQgV3UKICAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKICAqICB2MC4xNC43CkBAIC0xMjAsNyArMTIwLDcgQEAKICAqCUZpeCBidWc6IGFuIGV4dHJhIHRhaWwgd2lsbCBiZSBwbGF5ZWQgd2hlbiBwbGF5aW5nCiAgKglKYW4gMDUgMjAwMSBNYXR0IFd1CiAgKglJbXBsZW1lbnQgbXVsdGktY2hhbm5lbHMgYW5kIFMvUERJRiBpbiBzdXBwb3J0IGZvciBBTGkgMTUzNSsKLSAqICB2MC4xNC42IAorICogIHYwLjE0LjYKICAqCU5vdiAxIDIwMDAgQ2hpbmctTGluZyBMZWUKICAqCUZpeCB0aGUgYnVnIG9mIG1lbW9yeSBsZWFrIHdoZW4gc3dpdGNoaW5nIDUuMS1jaGFubmVscyB0byAyIGNoYW5uZWxzLgogICoJQWRkIGxvY2sgcHJvdGVjdGlvbiBpbnRvIGR5bmFtaWMgY2hhbmdpbmcgZm9ybWF0IG9mIGRhdGEuCkBAIC0xMzgsNyArMTM4LDcgQEAKICAqICB2MC4xNC4zIE1heSAxMCAyMDAwIE9sbGllIExobwogICoJZml4ZWQgYSBzbWFsbCBidWcgaW4gdHJpZGVudF91cGRhdGVfcHRyLCB4bW1zIDEuMC4xIG5vIGxvbmdlciB1c2VzIDEwMCUgQ1BVCiAgKiAgdjAuMTQuMiBNYXIgMjkgMjAwMCBDaGluZy1MaW5nIExlZQotICoJQWRkIGNsZWFyIHRvIHNpbGVuY2UgYWR2YW5jZSBpbiB0cmlkZW50X3VwZGF0ZV9wdHIgCisgKglBZGQgY2xlYXIgdG8gc2lsZW5jZSBhZHZhbmNlIGluIHRyaWRlbnRfdXBkYXRlX3B0cgogICoJZml4IGludmFsaWQgZGF0YSBvZiB0aGUgZW5kIG9mIHRoZSBzb3VuZAogICogIHYwLjE0LjEgTWFyIDI0IDIwMDAgQ2hpbmctTGluZyBMZWUKICAqCUFMaSA1NDUxIHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgTy5LLgpAQCAtMTc4LDcgKzE3OCw3IEBACiAgKglTaVMgNzAxOCBzdXBwb3J0IGFkZGVkLCBwbGF5YmFjayBPLksuCiAgKiAgdjAuMDEgQWxhbiBDb3ggZXQuIGFsLgogICoJSW5pdGlhbCBSZWxlYXNlIGluIGtlcm5lbCAyLjMuMzAsIGRvZXMgbm90IHdvcmsKLSAqIAorICoKICAqICBUb0RvCiAgKglDbGVhbiB1cCBvZiBsb3cgbGV2ZWwgY2hhbm5lbCByZWdpc3RlciBhY2Nlc3MgY29kZS4gKGRvbmUpCiAgKglGaXggdGhlIGJ1ZyBvbiBkbWEgYnVmZmVyIG1hbmFnZW1lbnQgaW4gdXBkYXRlX3B0ciwgcmVhZC93cml0ZSwgZHJhaW5fZGFjIChkb25lKQpAQCAtMzI2LDcgKzMyNiw3IEBACiAKIAkJdW5zaWduZWQgZXJyb3I7CS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLwogICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLwotCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIAogCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCiAJCXVuc2lnbmVkIGZyYWdzaXplOwpAQCAtMzU4LDcgKzM1OCw3IEBACiBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsIHsKIAlpbnQgbnVtOyAvKiBjaGFubmVsIG51bWJlciAqLwogCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCi0JdTMyIGVzbzsgLyogRW5kIFNhbXBsZSBPZmZzZXQsIHdlaHJlIGRtYSBidWZmZXIgZW5kcyAqLyAKKwl1MzIgZXNvOyAvKiBFbmQgU2FtcGxlIE9mZnNldCwgd2VocmUgZG1hIGJ1ZmZlciBlbmRzICovCiAJICAgICAgICAgLyogKGluIHRoZSB1bml0IG9mIHNhbXBsZXMpICovCiAJdTMyIGRlbHRhOyAvKiBkZWx0YSB2YWx1ZSwgc2FtcGxlIHJhdGUgLyA0OGsgZm9yIHBsYXliYWNrLCAqLwogCSAgICAgICAgICAgLyogNDhrL3NhbXBsZSByYXRlIGZvciByZWNvcmRpbmcgKi8KQEAgLTQxNyw3ICs0MTcsNyBAQAogCS8qIHNvdW5kY29yZSBzdHVmZiAqLwogCWludCBkZXZfYXVkaW87CiAKLQkvKiBzdHJ1Y3R1cmVzIGZvciBhYnN0cmFjdGlvbiBvZiBoYXJkd2FyZSBmYWNpbGl0aWVzLCBjb2RlY3MsICovIAorCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgKi8KIAkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KIAlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKIAlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayBiYW5rc1tOUl9CQU5LU107CkBAIC00NzksNyArNDc5LDcgQEAKIHN0YXRpYyB1MTYgdHJpZGVudF9hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZyk7CiAKIHN0YXRpYyBpbnQgdHJpZGVudF9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IHRyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKK3N0YXRpYyBpbnQgdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCiBzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKTsKQEAgLTQ5NiwxMCArNDk2LDEwIEBACiBzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoKTsKIHN0YXRpYyB2b2lkIGFsaV9zZXR1cF9zcGRpZl9vdXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGZsYWcpOwogc3RhdGljIGludCBhbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwKLQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCAKLQkJCSBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsIAorCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgaW50IGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgdW5zaWduZWQgaW50ICpjb3B5X2NvdW50LAogCQkJIHVuc2lnbmVkIGludCAqc3RhdGVfY250KTsKLXN0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCAKK3N0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLAogCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CiBzdGF0aWMgdm9pZCBhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSk7CiAKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWlmIChjaGFubmVsIDwgMzEgfHwgY2hhbm5lbCA+IDYzKQogCQlyZXR1cm47CiAKLQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFggfHwgCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYIHx8CiAJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CiAJCWIgPSBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwogCQlpZiAoKGIgJiB+MHg4MCkgPT0gY2hhbm5lbCkKQEAgLTc0Miw3ICs3NDIsNyBAQAogCWludCBpZHg7CiAKIAkvKiBUaGUgY3liZXJwcm8gNTA1MCBoYXMgb25seSAzMiB2b2ljZXMgYW5kIG9uZSBiYW5rICovCi0JLyogLi4gYXQgbGVhc3QgdGhleSBhcmUgbm90IGRvY3VtZW50ZWQgKGlmIHlvdSB3YW50IHRvIGNhbGwgdGhhdCAKKwkvKiAuLiBhdCBsZWFzdCB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCAoaWYgeW91IHdhbnQgdG8gY2FsbCB0aGF0CiAJICogY3JhcCBkb2N1bWVudGF0aW9uKSwgcGVyaGFwcyBicm9rZW4gPyAqLwogCiAJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwpAQCAtODAyLDcgKzgwMiw3IEBACiAJLyogZW5hYmxlLCBpZiBpdCB3YXMgZGlzYWJsZWQgKi8KIAlpZiAoKHBvcnREYXQgJiBDWUJFUl9CTVNLX0FVRU5aKSAhPSBDWUJFUl9CTVNLX0FVRU5aX0VOQUJMRSkgewogCQlwcmludGsoS0VSTl9JTkZPICJjeWJlcnBybzUwNTA6IGVuYWJsaW5nIGF1ZGlvIGNvbnRyb2xsZXJcbiIpOwotCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSwgCisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFLAogCQkJICAgICBwb3J0RGF0IHwgQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpOwogCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLwogCQlwb3J0RGF0ID0gY3liZXJfaW5pZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSk7CkBAIC04MTEsNyArODExLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IGluaXRBdWRpb0FjY2Vzczogbm8gc3VjY2Vzc1xuIik7CiAJCXJldCA9IC0xOwogCX0gZWxzZSB7Ci0JCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwgCisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwKIAkJCSAgICAgQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFKTsKIAkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmYsIDB4MDEpOwogCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiYSwgMHgyMCk7CkBAIC04MjcsNyArODI3LDcgQEAKIC8qICBjYWxsZWQgd2l0aCBzcGluIGxvY2sgaGVsZCAqLwogCiBzdGF0aWMgaW50Ci10cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwgCit0cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKIAlpbnQgaTsKQEAgLTg0NSw3ICs4NDUsNyBAQAogCQkJY29udGludWU7CiAJCW91dGwoZGF0YVtpXSwgVFJJRF9SRUcoY2FyZCwgQ0hBTk5FTF9TVEFSVCArIDQgKiBpKSk7CiAJfQotCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwKIAkgICAgY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKIAkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYxKSk7CiAJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMikpOwpAQCAtODg0LDcgKzg4NCw3IEBACiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKIAkJZGF0YVswXSA9IChjaGFubmVsLT5kZWx0YSA8PCAyNCk7Ci0JCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwgCisJCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwKIAkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKIAkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKIAkJYnJlYWs7CkBAIC05ODksMTMgKzk4OSwxMyBAQAogCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewogCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOwogCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7Ci0JCQlpZiAoKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwgCisJCQlpZiAoKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwKIAkJCSAgICAoY2hhbm5lbC0+bnVtID09IEFMSV9QQ01fSU5fQ0hBTk5FTCkpCiAJCQkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlLT5jYXJkLCBjaGFubmVsLT5udW0pOwotCQkJZWxzZSBpZiAoKGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgCisJCQllbHNlIGlmICgoaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKQogCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKIAkJCQkgJiYgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfT1VUX0NIQU5ORUwpKSB7Ci0JCQkJYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdGF0ZS0+Y2FyZCwgCisJCQkJYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdGF0ZS0+Y2FyZCwKIAkJCQkJCSAgICAgICBzdGF0ZS0+ZG1hYnVmLnJhdGUpOwogCQkJCXN0YXRlLT5kbWFidWYuY2hhbm5lbC0+ZGVsdGEgPSAweDEwMDA7CiAJCQl9CkBAIC0xMDYzLDcgKzEwNjMsNyBAQAogCiAJY2hhbm5lbC0+bGJhID0gZG1hYnVmLT5kbWFfaGFuZGxlOwogCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOwotCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmIAorCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmCiAJICAgIChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpKSB7CiAJCXJhdGUgPSBhbGlfZ2V0X3NwZGlmX2luX3JhdGUoY2FyZCk7CiAJCWlmIChyYXRlID09IDApIHsKQEAgLTExODAsOCArMTE4MCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Ci0JaWYgKChkbWFidWYtPm1hcHBlZCB8fCAKLQkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmIAorCWlmICgoZG1hYnVmLT5tYXBwZWQgfHwKKwkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmCiAJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKIAkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CiAJCXRyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7CkBAIC0xMjYxLDcgKzEyNjEsNyBAQAogCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CiAJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOwogCi0JaWYgKCEocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAKKwlpZiAoIShyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsCiAJCQkJCSAgICAmZG1hYnVmLT5kbWFfaGFuZGxlKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOwogCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKIAotCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlICovIAorCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlICovCiAJLyogcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCiAJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOwogCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CiAJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQogCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsIAorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyLAogCQkJCSAgICBkbWFidWYtPnJhd2J1ZiwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKIAkJZG1hYnVmLT5yYXdidWYgPSBOVUxMOwogCX0KQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CiAJCQkJCS8qIHJlbGVhc2UgdGhlIGF1eGlsaWFyeSBETUEgYnVmZmVycyAqLwogCQkJCQlmb3IgKGkgLT0gMjsgaSA+PSAwOyBpLS0pCi0JCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKKwkJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWYsCiAJCQkJCQkJICAgICAgIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKIAkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwogCQkJCQlyZXR1cm4gcmV0OwpAQCAtMTM5OCw3ICsxMzk4LDcgQEAKIAkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IGRtYWJ1Zi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKIAkJZG1hYnVmLT5kbWFzaXplID0gZG1hYnVmLT5udW1mcmFnIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwogCi0JCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAorCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IDAgOiAweDgwLAogCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOwpAQCAtMTQ1Myw3ICsxNDUzLDcgQEAKIAlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChzd3B0ciA9PSAwIHx8IHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgfHwgCisJaWYgKHN3cHRyID09IDAgfHwgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplIC8gMiB8fAogCSAgICBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUpCiAJCXJldHVybjsKIApAQCAtMTUxMSw3ICsxNTExLDcgQEAKIAogCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAogCQkgICBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KLQkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKKwkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fAogCQkgICAgc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CiAJCQlkaWZmID0gZG1hYnVmLT5zd3B0ciAtIHRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0YXRlKSArIGRtYWJ1Zi0+ZG1hc2l6ZTsKIAkJCWRpZmYgPSBkaWZmICUgKGRtYWJ1Zi0+ZG1hc2l6ZSk7CkBAIC0xNTMyLDcgKzE1MzIsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCAqLyAKKy8qIHVwZGF0ZSBidWZmZXIgbWFuYW5nZW1lbnQgcG9pbnRlcnMsIGVzcGVjaWFsbHksICovCiAvKiBkbWFidWYtPmNvdW50IGFuZCBkbWFidWYtPmh3cHRyICovCiBzdGF0aWMgdm9pZAogdHJpZGVudF91cGRhdGVfcHRyKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKQEAgLTE1NTksMTEgKzE1NTksMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKIAotCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IAorCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8CiAJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewotCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgKi8gCi0JCQkJLyogd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlciBpdCBoZXJlLCBqdXN0ICovIAotCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKKwkJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sICovCisJCQkJLyogd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlciBpdCBoZXJlLCBqdXN0ICovCisJCQkJLyogc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzICovCiAJCQkJLyogZm9yY2UgaHdwdHIgYW5kIHN3cHRyIHRvIHN5bmMgKi8KIAkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKIAkJCQlkbWFidWYtPmVycm9yKys7CkBAIC0xNTgyLDcgKzE1ODIsNyBAQAogCQl9IGVsc2UgewogCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOwogCi0JCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwKIAkJCSAgICBkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKSB7CiAJCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCB3ZSBoYXZlIG5vIHdheSB0byByZWNvdmVyCiAJCQkJICAgaXQgaGVyZSwganVzdCBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgZm9yY2UgaHdwdHIKQEAgLTE2MDgsMTMgKzE2MDgsMTMgQEAKIAkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKIAkJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwogCQkJCQkJCXN3cHRyID0gc3dwdHIgLyAyOwotCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CiAJCQkJCQl9CiAJCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwpAQCAtMTYyNywxMyArMTYyNywxMyBAQAogCQkJCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CiAJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwogCQkJCQkJc3dwdHIgPSBzd3B0ciAvIDI7Ci0JCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKLQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwKIAkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwotCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1syXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7Ci0JCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsCiAJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKIAkJCQkJfQogCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwpAQCAtMTY2NSw3ICsxNjY1LDcgQEAKIAkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKIAkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogc3B1cmlvdXMgY2hhbm5lbCAiCiAJCQkJICAgICAgICJpcnEgJWQuXG4iLCBjaGFubmVsKTsKIAkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CiAJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKQEAgLTE2OTQsNyArMTY5NCw3IEBACiAKIAlpZiAob3B0ID09IDEpIHsJCS8vIE1VVEUKIAkJZHdUZW1wIF49IDB4ODAwMDsKLQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgCisJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sCiAJCQkgICAgICAgMHgwMiwgZHdUZW1wKTsKIAl9IGVsc2UgaWYgKG9wdCA9PSAyKSB7CS8vIERvd24KIAkJaWYgKG11dGUpCkBAIC0xNzA2LDcgKzE3MDYsNyBAQAogCQlkd1RlbXAgJj0gMHhlMGUwOwogCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwogCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOwotCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8CiAJCQkoKCgzMiAtIHZvbHVtZVsxXSkgKiAyNSAvIDgpIDw8IDgpOwogCX0gZWxzZSBpZiAob3B0ID09IDQpIHsJLy8gVXAKIAkJaWYgKG11dGUpCkBAIC0xNzE4LDcgKzE3MTgsNyBAQAogCQlkd1RlbXAgJj0gMHhlMGUwOwogCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwogCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOwotCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8CiAJCQkoKCgzMiAtIHZvbHVtZVsxXSkgKiAyNSAvIDgpIDw8IDgpOwogCX0gZWxzZSB7CiAJCS8qIE5vdGhpbmcgbmVlZHMgZG9pbmcgKi8KQEAgLTE4MDEsNyArMTgwMSw3IEBACiAJCQlpZiAoKHN0YXRlID0gY2FyZC0+c3RhdGVzW2ldKSAhPSBOVUxMKSB7CiAJCQkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY3liZXI1MDUwOiBzcHVyaW91cyAiIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImN5YmVyNTA1MDogc3B1cmlvdXMgIgogCQkJCSAgICAgICAiY2hhbm5lbCBpcnEgJWQuXG4iLCBjaGFubmVsKTsKIAkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CiAJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKQEAgLTE4MzYsMjEgKzE4MzYsMjEgQEAKIAkJCQlhbGlfcXVldWVfdGFzayhjYXJkLCBncGlvICYgMHgwNyk7CiAJCX0KIAkJZXZlbnQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKLQkJb3V0bChldmVudCB8IChTVF9UQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwgCisJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksCiAJCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKIAkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCiAJLyogbWFudWFsbHkgY2xlYXIgaW50ZXJydXB0IHN0YXR1cywgYmFkIGhhcmR3YXJlIGRlc2lnbiwgYmxhbWUgVF4yICovCi0Jb3V0bCgoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAorCW91dGwoKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLAogCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKIAlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyAqLyAKLS8qIHRvIGJlIGNvcGllZCB0byB0aGUgdXNlcidzIGJ1ZmZlci4gIGl0IGlzIGZpbGxlZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAorLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgKi8KKy8qIHRvIGJlIGNvcGllZCB0byB0aGUgdXNlcidzIGJ1ZmZlci4gIGl0IGlzIGZpbGxlZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kICovCiAvKiBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KIHN0YXRpYyBzc2l6ZV90CiB0cmlkZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKQEAgLTE4NzgsOCArMTg3OCw4IEBACiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGRtYWJ1Zi0+Y291bnQgPiAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpIHsKLQkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAotCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8gCisJCQkvKiBidWZmZXIgb3ZlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLworCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8KIAkJCS8qIG1ha2UgcHJvY2VzcyBmbHVzaCB0aGUgYnVmZmVyICovCiAJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOwogCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CkBAIC0xODk0LDcgKzE4OTQsNyBAQAogCQkJY250ID0gY291bnQ7CiAJCWlmIChjbnQgPD0gMCkgewogCQkJdW5zaWduZWQgbG9uZyB0bW87Ci0JCQkvKiBidWZmZXIgaXMgZW1wdHksIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCisJCQkvKiBidWZmZXIgaXMgZW1wdHksIHN0YXJ0IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8KIAkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjb3JkZWQgKi8KIAkJCXN0YXJ0X2FkYyhzdGF0ZSk7CiAJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKQEAgLTE5MDQsOCArMTkwNCw4IEBACiAJCQl9CiAKIAkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7Ci0JCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggc3BhY2UgbGVmdCBpbiB0aGUgYnVmZmVyLCAqLyAKLQkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLyAKKwkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBzcGFjZSBsZWZ0IGluIHRoZSBidWZmZXIsICovCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8KIAkJCS8qIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwogCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIChkbWFidWYtPnJhdGUgKiAyKTsKIAkJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKQEAgLTIwMDUsNyArMjAwNSw3IEBACiAJd2hpbGUgKGNvdW50ID4gMCkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7Ci0JCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCisJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8KIAkJCS8qIHNsZWVwX29uX3RpbWVvdXQsIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KIAkJCWRtYWJ1Zi0+Y291bnQgPSAwOwogCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogCQkJY250ID0gY291bnQ7CiAJCWlmIChjbnQgPD0gMCkgewogCQkJdW5zaWduZWQgbG9uZyB0bW87Ci0JCQkvKiBidWZmZXIgaXMgZnVsbCwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovCiAJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZCAqLwogCQkJc3RhcnRfZGFjKHN0YXRlKTsKIAkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewpAQCAtMjAyOCw4ICsyMDI4LDggQEAKIAkJCQkJcmV0ID0gLUVBR0FJTjsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCi0JCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIsICovCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8KIAkJCS8qIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwogCQkJbG9ja19zZXRfZm10KHN0YXRlKTsKIAkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CkBAIC0yMDM3LDE1ICsyMDM3LDE1IEBACiAJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CiAJCQltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwogCi0JCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovIAotCQkJLyogcmV0dXJucywgb25lIGlzIHdoZW4gdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCAqLyAKLQkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovIAotCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8gCi0JCQkvKiBtZWFucyB0aGF0IGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkICovIAotCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8gCi0JCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLyAKLQkJCS8qIChzY2hlZHVsZXIgbGF0ZW5jeSkgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpICovIAotCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8gCisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovCisJCQkvKiByZXR1cm5zLCBvbmUgaXMgd2hlbiB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkICovCisJCQkvKiBjb3JyZWN0bHkgYW5kIHRoZSBwcm9jZXNzIGlzIHdha2VkIHVwIGJ5IElTUiAqLworCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8KKwkJCS8qIG1lYW5zIHRoYXQgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgKi8KKwkJCS8qIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0IGlzIFRPTyBMQVRFICovCisJCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLworCQkJLyogKHNjaGVkdWxlciBsYXRlbmN5KSB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgKi8KKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcyBOT1RISU5HIHdlICovCiAJCQkvKiBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KIAkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkbWFidWYtPndhaXQsIHRtbykpIHsKIAkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcGxheWJhY2sgc2NoZWR1bGUgIgpAQCAtMjA1NCw4ICsyMDU0LDggQEAKIAkJCQkJIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCiAJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKIAotCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8gCi0JCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLyAKKwkJCQkvKiBhIGJ1ZmZlciB1bmRlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5ICovCisJCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLwogCQkJCS8qIHdlIFJFQUxMWSBoYXZlIGRhdGEgdG8gcGxheSAqLwogCQkJfQogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CkBAIC0yMDc5LDcgKzIwNzksNyBAQAogCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CiAJCQljb3B5X2NvdW50ID0gMDsKIAkJCXN0YXRlX2NudCA9IDA7Ci0JCQlpZiAoYWxpX3dyaXRlXzVfMShzdGF0ZSwgYnVmZmVyLCBjbnQsICZjb3B5X2NvdW50LCAKKwkJCWlmIChhbGlfd3JpdGVfNV8xKHN0YXRlLCBidWZmZXIsIGNudCwgJmNvcHlfY291bnQsCiAJCQkJCSAgJnN0YXRlX2NudCkgPT0gLUVGQVVMVCkgewogCQkJCWlmIChzdGF0ZV9jbnQpIHsKIAkJCQkJc3dwdHIgPSAoc3dwdHIgKyBzdGF0ZV9jbnQpICUgZG1hYnVmLT5kbWFzaXplOwpAQCAtMjA5Niw3ICsyMDk2LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLAogCQkJCQkgICBidWZmZXIsIGNudCkpIHsKIAkJCQlpZiAoIXJldCkKIAkJCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTIxNzIsNyArMjE3Miw3IEBACiAJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQogCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CiAJCX0gZWxzZSB7Ci0JCQlpZiAoKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplID49IGRtYWJ1Zi0+Y291bnQgKyAKKwkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArCiAJCQkgICAgKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKIAkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCQl9CkBAIC0yMjI3LDcgKzIyMjcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci10cmlkZW50X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKK3RyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtMjM0OCw3ICsyMzQ4LDcgQEAKIAogCiAJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0ICovCi0JCXJldCA9IHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwgCisJCXJldCA9IHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwKIAkJCSAgICAgICBBRk1UX1U4LCBwKTsKIAkJYnJlYWs7CiAKQEAgLTIzNzksNyArMjM3OSw3IEBACiAJCQl9CiAJCX0KIAkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwotCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAorCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6CiAJCQkgICAgICAgQUZNVF9VOCwgcCk7CiAJCWJyZWFrOwogCkBAIC0yNDM4LDcgKzI0MzgsNyBAQAogCQkJCXN0b3BfYWRjKHN0YXRlKTsKIAkJCQlkbWFidWYtPnJlYWR5ID0gMDsKIAkJCQlpZiAodmFsID49IDIpIHsKLQkJCQkJaWYgKCEoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAKKwkJCQkJaWYgKCEoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgogCQkJCQkgICAgICAodmFsID09IDYpKSkKIAkJCQkJCXZhbCA9IDI7CiAJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKQEAgLTI1MDQsNyArMjUwNCw3IEBACiAJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwogCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/CiAJCQktRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKQEAgLTI1MjQsNyArMjUyNCw3IEBACiAJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwogCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/CiAJCQktRUZBVUxUIDogMDsKIAkJYnJlYWs7CiAKQEAgLTI1MzMsNyArMjUzMyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6Ci0JCXJldCA9IHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCAKKwkJcmV0ID0gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8CiAJCQkgICAgICAgRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9CSU5ELCBwKTsKIAkJYnJlYWs7CiAKQEAgLTI1NTMsNyArMjU1Myw3IEBACiAJCX0KIAkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKIAkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7Ci0JCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAorCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJgogCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCiAJCQkJCWJyZWFrOwogCQkJCXN0YXJ0X2FkYyhzdGF0ZSk7CkBAIC0yNTYyLDcgKzI1NjIsNyBAQAogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewogCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7Ci0JCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAorCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJgogCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKIAkJCQkJYnJlYWs7CiAJCQkJc3RhcnRfZGFjKHN0YXRlKTsKQEAgLTI1ODksNyArMjU4OSw3IEBACiAJCWlmIChkbWFidWYtPm1hcHBlZCkKIAkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAorCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPwogCQkJLUVGQVVMVCA6IDA7CiAJCWJyZWFrOwogCkBAIC0yNjEyLDcgKzI2MTIsNyBAQAogCQlpZiAoZG1hYnVmLT5tYXBwZWQpCiAJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwotCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKKwkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8KIAkJCS1FRkFVTFQgOiAwOwogCQlicmVhazsKIApAQCAtMjY0MSwxNyArMjY0MSwxNyBAQAogCQlicmVhazsKIAogCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6Ci0JCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UX1NURVJFTykgPyAyIDogMSwgCisJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UX1NURVJFTykgPyAyIDogMSwKIAkJCSAgICAgICBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6Ci0JCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDogCisJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUKSA/IEFGTVRfUzE2X0xFIDoKIAkJCSAgICAgICBBRk1UX1U4LCBwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0s6Ci0JCXJldCA9IHB1dF91c2VyKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IAorCQlyZXQgPSBwdXRfdXNlcihEU1BfQklORF9GUk9OVCB8IERTUF9CSU5EX1NVUlIgfAogCQkJICAgICAgIERTUF9CSU5EX0NFTlRFUl9MRkUsICBwKTsKIAkJYnJlYWs7CiAKQEAgLTI2NzEsMTAgKzI2NzEsMTAgQEAKIAkJfSBlbHNlIHsKIAkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwogCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCAKKwkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8CiAJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CiAJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9TUENfUEIgfCAKKwkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1NQQ19QQiB8CiAJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CiAJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8PSBtYXNrMmF0dHJbZmZzKHZhbCldOwogCQl9CkBAIC0yNzAyLDYgKzI3MDIsNyBAQAogCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBkZXZzOwogCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CiAJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCiAJLyogVE9ETzogdGhlcmUncyBzb21lIHJlZHVuZGFjeSBoZXJlIHdydCB0aGUgY2hlY2sgYmVsb3cgKi8KQEAgLTI3NjUsOCArMjc2Niw4IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBzdGF0ZTsKIAotCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovIAotCS8qIEd1aWRlICAvZGV2L2RzcCBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sICovIAorCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovCisJLyogR3VpZGUgIC9kZXYvZHNwIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgKi8KIAkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewogCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKQEAgLTI3NzksMTEgKzI3ODAsMTMgQEAKIAkJCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgYXR0cmlidXRlIHRvIG5vcm1hbCBwbGF5YmFjayAqLwogCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSBDSEFOTkVMX1BCOwogCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCXRyaWRlbnRfc2V0X2RhY19yYXRlKHN0YXRlLCA4MDAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCX0KIAogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCS8qIEZJWE1FOiBUcmlkZW50IDRkIGNhbiBvbmx5IHJlY29yZCBpbiBzaWduZWQgMTYtYml0cyBzdGVyZW8sICovIAorCQkvKiBGSVhNRTogVHJpZGVudCA0ZCBjYW4gb25seSByZWNvcmQgaW4gc2lnbmVkIDE2LWJpdHMgc3RlcmVvLCAqLwogCQkvKiA0OGtIeiBzYW1wbGUsIHRvIGJlIGRlYWxlZCB3aXRoIGluIHRyaWRlbnRfc2V0X2FkY19yYXRlKCkgPz8gKi8KIAkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CiAJCWlmICgobWlub3IgJiAweDBmKSA9PSBTTkRfREVWX0RTUDE2KQpAQCAtMjc5NCwxMCArMjc5NywxMiBAQAogCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewogCQkJLyogc2V0IGRlZmF1bHQgY2hhbm5lbCBhdHRyaWJ1dGUgdG8gMHg4YTgwLCByZWNvcmQgZnJvbQogCQkJICAgUENNIEwvUiBGSUZPIGFuZCBtb25vID0gKGxlZnQgKyByaWdodCArIDEpLzIgKi8KLQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgUENNX0xSIHwgCisJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IFBDTV9MUiB8CiAJCQkJCQkgICAgICBNT05PX01JWCk7CiAJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJdHJpZGVudF9zZXRfYWRjX3JhdGUoc3RhdGUsIDgwMDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKIAkJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCiAJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKQEAgLTMwMjAsNyArMzAyNSw3IEBACiAJCQlicmVhazsKIAkJaWYgKHdzZW1hYml0cyA9PSAwKSB7CiAJCSAgICAgIHVubG9jazoKLQkJCW91dGwoKCh1MzIpICh3Y29udHJvbCAmIDB4MWVmZikgfCAweDAwMDA0MDAwKSwgCisJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksCiAJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMzEwNCw3ICszMTA5LDcgQEAKIAluY291bnQgPSAxMDsKIAogCXdoaWxlICgxKSB7Ci0JCWlmICgoaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSkgJiBBTElfQUM5N19CVVNZX1JFQUQpIAorCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKQogCQkgICAgIT0gMCkKIAkJCWJyZWFrOwogCQlpZiAobmNvdW50IDw9IDApCkBAIC0zMTEyLDcgKzMxMTcsNyBAQAogCQlpZiAobmNvdW50LS0gPT0gMSkgewogCQkJcHJfZGVidWcoImFsaV9hYzk3X3JlYWQgOnRyeSBjbGVhciBidXN5IGZsYWdcbiIpOwogCQkJYXVkX3JlZyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwotCQkJb3V0bCgoYXVkX3JlZyAmIDB4ZmZmZjdmZmYpLCAKKwkJCW91dGwoKGF1ZF9yZWcgJiAweGZmZmY3ZmZmKSwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIAkJfQogCQl1ZGVsYXkoMTApOwpAQCAtMzE1OSw3ICszMTY0LDcgQEAKIAogCXdjb250cm9sID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CiAJd2NvbnRyb2wgJj0gMHhmZjAwOwotCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovIAorCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovCiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsaTE1MzUrIHdyaXRlICovCiAJb3V0bCgoZGF0YSB8IHdjb250cm9sKSwgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIApAQCAtMzE3Nyw3ICszMTgyLDcgQEAKIAkJCWJyZWFrOwogCQlpZiAobmNvdW50LS0gPT0gMSkgewogCQkJcHJfZGVidWcoImFsaV9hYzk3X3NldCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZyEhXG4iKTsKLQkJCW91dHcod2NvbnRyb2wgJiAweDdmZmYsIAorCQkJb3V0dyh3Y29udHJvbCAmIDB4N2ZmZiwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKIAkJfQogCQl1ZGVsYXkoMTApOwpAQCAtMzM4Miw3ICszMzg3LDcgQEAKIAlidmFsIHw9IDB4MUY7CiAJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKIAotCXdoaWxlICgoKFIxIDwgMHgwQikgfHwgKFIxID4gMHgwRSkpICYmIChSMSAhPSAweDEyKSAmJiAKKwl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYKIAkgICAgICAgY291bnQgPD0gNTAwMDApIHsKIAkJY291bnQrKzsKIApAQCAtMzY2OSwxNCArMzY3NCwxNCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKIAlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7Ci0JLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsgICAgCisJLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsKIAlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjFdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9TVE9QX0EpKTsKIAogCS8vZGlzYWJsZSBhbGwgSVJRIGJpdHMKIAlvdXRsKEFMSV9ESVNBQkxFX0FMTF9JUlEsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKLQkJYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLCAKKwkJYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldID0gYWxpX2FjOTdfcmVhZChjYXJkLT5hYzk3X2NvZGVjWzBdLAogCQkJCQkJCSAgICBpICogMik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQUxJX0dMT0JBTF9SRUdTOyBpKyspIHsKQEAgLTM2ODgsNyArMzY5Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CiAJCW91dGIoaSwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKIAkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKLQkJCWFsaV9yZWdpc3RlcnMuY2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKFRSSURfUkVHKGNhcmQsIAorCQkJYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0gPSBpbmwoVFJJRF9SRUcoY2FyZCwKIAkJCQkJCQkJCWogKiA0ICsgMHhlMCkpOwogCX0KIApAQCAtMzcwNywxOCArMzcxMiwxOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKLQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsIAorCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCBpICogMiwKIAkJCSAgICAgICBhbGlfcmVnaXN0ZXJzLm1peGVyX3JlZ3NbaV0pOwogCiAJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKSB7CiAJCW91dGIoaSwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKIAkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKLQkJCW91dGwoYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0sIAorCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwKIAkJCSAgICAgVFJJRF9SRUcoY2FyZCwgaiAqIDQgKyAweGUwKSk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7Ci0JCWlmICgoaSAqIDQgPT0gVDREX01JU0NJTlQpIHx8IChpICogNCA9PSBUNERfU1RPUF9BKSB8fCAKKwkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpIHx8CiAJCSAgICAoaSAqIDQgPT0gVDREX1NUQVJUX0EpKQogCQkJY29udGludWU7CiAJCW91dGwoYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1tpXSwgVFJJRF9SRUcoY2FyZCwgaSAqIDQpKTsKQEAgLTM3NjMsNyArMzc2OCw3IEBACiAKIAliYW5rID0gJmNhcmQtPmJhbmtzW0JBTktfQV07CiAKLQlpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgCisJaWYgKGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAmCiAJICAgIChBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkpIHsKIAkJaWR4ID0gQUxJX1NQRElGX09VVF9DSEFOTkVMOwogCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgewpAQCAtMzc3NCw3ICszNzc5LDcgQEAKIAkJfQogCX0KIAotCWZvciAoaWR4ID0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9GSVJTVDsgaWR4IDw9IEFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVDsgCisJZm9yIChpZHggPSBBTElfUENNX09VVF9DSEFOTkVMX0ZJUlNUOyBpZHggPD0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9MQVNUOwogCSAgICAgaWR4KyspIHsKIAkJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgaWR4KSkpIHsKIAkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKQEAgLTM3ODUsOSArMzc5MCw5IEBACiAJfQogCiAJLyogbm8gbW9yZSBmcmVlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwotI2lmIDAgCisjaWYgMAogCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyBtb3JlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKLSNlbmRpZiAvKiAwICovIAorI2VuZGlmIC8qIDAgKi8KIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzgxMiw5ICszODE3LDkgQEAKIAl9CiAKIAkvKiBubyBmcmVlIHJlY29yZGFibGUgY2hhbm5lbHMgYXZhbGlhYmxlICovCi0jaWYgMCAKKyNpZiAwCiAJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIHJlY29yZGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOwotI2VuZGlmIC8qIDAgKi8gCisjZW5kaWYgLyogMCAqLwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zODM3LDE0ICszODQyLDE0IEBACiAJCWJyZWFrOwogCX0KIAotCS8qIHNlbGVjdCBzcGRpZl9vdXQgKi8gCisJLyogc2VsZWN0IHNwZGlmX291dCAqLwogCWNoX3N0X3NlbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVM7CiAKLQljaF9zdF9zZWwgfD0gMHg4MDsJLyogc2VsZWN0IHJpZ2h0ICovIAorCWNoX3N0X3NlbCB8PSAweDgwOwkvKiBzZWxlY3QgcmlnaHQgKi8KIAlvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKIAlvdXRiKHN0YXR1c19yYXRlIHwgMHgyMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOwogCi0JY2hfc3Rfc2VsICY9ICh+MHg4MCk7CS8qIHNlbGVjdCBsZWZ0ICovIAorCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLwogCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwogCW91dHcoc3RhdHVzX3JhdGUgfCAweDEwLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAyKSk7CiB9CkBAIC0zODgxLDE0ICszODg2LDE0IEBACiAJfQogfQogCi0vKiBVcGRhdGluZyB0aGUgdmFsdWVzIG9mIGNvdW50ZXJzIG9mIG90aGVyX3N0YXRlcycgRE1BcyB3aXRob3V0IGxvY2sgCisvKiBVcGRhdGluZyB0aGUgdmFsdWVzIG9mIGNvdW50ZXJzIG9mIG90aGVyX3N0YXRlcycgRE1BcyB3aXRob3V0IGxvY2sKIHByb3RlY3Rpb24gaXMgbm8gaGFybSBiZWNhdXNlIGFsbCBETUFzIG9mIG11bHRpLWNoYW5uZWxzIGFuZCBpbnRlcnJ1cHQKIGRlcGVuZCBvbiBhIG1hc3RlciBzdGF0ZSdzIERNQSwgYW5kIGNoYW5naW5nIHRoZSBjb3VudGVycyBvZiB0aGUgbWFzdGVyCiBzdGF0ZSBETUEgaXMgcHJvdGVjdGVkIGJ5IGEgc3BpbmxvY2suCiAqLwogc3RhdGljIGludAotYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIAotCSAgICAgIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCithbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkgICAgICBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsCiAJICAgICAgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpCiB7CiAKQEAgLTM5MDQsMTAgKzM5MDksMTAgQEAKIAogCWlmICgoaSA9IHN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQpID4gMCkgewogCQlpZiAoaSA9PSAxKSB7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCQkJaS0tOwogCQkJKCpzdGF0ZV9jbnQpICs9IHNhbXBsZV9zOwpAQCAtMzkxNiwxMCArMzkyMSwxMCBAQAogCQkJaSA9IGkgLSAoc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zKTsKIAkJZm9yICg7IChpIDwgb3RoZXJfZG1hX251bXMpICYmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKTsgaSsrKSB7CiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCX0KIAkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA9PSAwKQpAQCAtMzkyOCwzOSArMzkzMywzOSBAQAogCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CiAJCWxvb3AgPSBjbnRfZm9yX211bHRpX2NoYW5uZWwgLyAoc3RhdGUtPmNoYW5zX251bSAqIHNhbXBsZV9zKTsKIAkJZm9yIChpID0gMDsgaSA8IGxvb3A7IGkrKykgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLAogCQkJCQkgICBzYW1wbGVfcyAqIDIpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MgKiAyLCAqY29weV9jb3VudCk7CiAJCQkoKnN0YXRlX2NudCkgKz0gKHNhbXBsZV9zICogMik7CiAKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAogCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwogCiAJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWY7Ci0JCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwKIAkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAKIAkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1ZjsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLAogCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJfQogCkBAIC0zOTY5LDE1ICszOTc0LDE1IEBACiAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIHNhbXBsZV9zKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsCiAJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CiAJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CiAKIAkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLAogCQkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCiAJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLAogCQkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CiAKQEAgLTM5ODYsMTIgKzM5OTEsMTIgQEAKIAkJCQkJbG9vcCA9IHN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgLSBkaWZmOwogCQkJCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CiAJCQkJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7Ci0JCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIAotCQkJCQkJCQkgICBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKworCQkJCQkJCQkgICBkbWFidWZfdGVtcC0+c3dwdHIsCiAJCQkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQogCQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIAotCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsCisJCQkJCQkJICAgIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwKIAkJCQkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKIAkJCQkJfQogCQkJCX0KQEAgLTQwNDgsMTEgKzQwNTMsMTEgQEAKIAkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7CiAJCWJyZWFrOwogCWNhc2UgJzEnOgotCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCisJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfAogCQkJCSAgICBBTElfU1BESUZfT1VUX1BDTSk7CiAJCWJyZWFrOwogCWNhc2UgJzInOgotCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCisJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfAogCQkJCSAgICBBTElfU1BESUZfT1VUX05PTl9QQ00pOwogCQlicmVhazsKIAljYXNlICczJzoKQEAgLTQwNzcsNyArNDA4Miw3IEBACiAKIAlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KQogCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQotCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJiAKKwkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYKIAkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCiAJCQkJZ290byBtYXRjaDsKIApAQCAtNDA5MSw3ICs0MDk2LDcgQEAKIH0KIAogc3RhdGljIGludAotdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIAordHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTQxODUsOSArNDE5MCw5IEBACiAJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLwogCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwogCQkvKiB3aGVuIHBvd2VyIHVwIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSBzbyBzdG9wIGl0ICovCi0JCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCB8IFNFQ09OREFSWV9JRCwgCisJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCB8IFNFQ09OREFSWV9JRCwKIAkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7Ci0JCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAqLyAKKwkJLyogaXQgdGFrZSBhIGxvbmcgdGltZSB0byByZWNvdmVyIGZyb20gYSBjb2xkIHJlc2V0ICovCiAJCS8qIChlc3BlY2lhbGx5IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KIAkJdWRlbGF5KDIwMDApOwogCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwpAQCAtNDIwNyw5ICs0MjEyLDkgQEAKIAkJLyogZGlzYWJsZSBBQzk3IEdQSU8gaW50ZXJydXB0ICovCiAJCW91dGwoMHgwMCwgVFJJRF9SRUcoY2FyZCwgU0lfQUM5N19HUElPKSk7CiAJCS8qIHdoZW4gcG93ZXIgdXAsIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSwgc28gc3RvcCBpdCAqLwotCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQsIAorCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQsCiAJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwotCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKGVzcGVjaWFsbHkgKi8gCisJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAoZXNwZWNpYWxseSAqLwogCQkvKiB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29kZWMpICovCiAJCXVkZWxheSgyMDAwKTsKIAkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKQEAgLTQyMjEsNyArNDIyNiw3IEBACiAJCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyAqLyAKKwkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgKi8KIAkJLyogd2lsbCBiZSBmaWxsZWQgaW4gYWM5N19wcm9iZV9jb2RlYyAqLwogCQljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKIAkJY29kZWMtPmlkID0gbnVtX2FjOTc7CkBAIC00MzUyLDggKzQzNTcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKSB7IH0KICNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCiAKLS8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgKi8gCi0vKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovIAorLyogaW5zdGFsbCB0aGUgZHJpdmVyLCB3ZSBkbyBub3QgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbCBub3IgRE1BIGJ1ZmZlciAqLworLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLwogLyogb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogdHJpZGVudF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTQzNzYsOSArNDM4MSw5IEBACiAJZWxzZQogCQlkbWFfbWFzayA9IFRSSURFTlRfRE1BX01BU0s7CiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgZG1hX21hc2spKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiIAotCQkgICAgICAgIiAlcyBQQ0kgYnVzbWFzdGVyIERNQVxuIiwgCi0JCSAgICAgICBwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSA/IAorCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IgorCQkgICAgICAgIiAlcyBQQ0kgYnVzbWFzdGVyIERNQVxuIiwKKwkJICAgICAgIHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxID8KIAkJICAgICAgICIzMi1iaXQiIDogIjMwLWJpdCIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC00NDIyLDcgKzQ0MjcsNyBAQAogCiAJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJ0cmlkZW50OiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4LCBJUlEgJWRcbiIsIAorCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHgsIElSUSAlZFxuIiwKIAkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOwogCiAJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CkBAIC00NDQ5LDkgKzQ0NTQsOSBAQAogCiAJCS8qIEFkZCBIL1cgVm9sdW1lIENvbnRyb2wgQnkgTWF0dCBXdSBKdWwuIDA2LCAyMDAxICovCiAJCWNhcmQtPmh3dm9sY3RsID0gMDsKLQkJcGNpX2Rldl9tMTUzMyA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAKLQkJCQkJCVBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAotCQkJCQkJcGNpX2Rldl9tMTUzMyk7CisJCXBjaV9kZXZfbTE1MzMgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLAorCQkJCQkgICAgICAgUENJX0RFVklDRV9JRF9BTF9NMTUzMywKKwkJCQkJICAgICAgIHBjaV9kZXZfbTE1MzMpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWlmIChwY2lfZGV2X20xNTMzID09IE5VTEwpCiAJCQlnb3RvIG91dF9wcm9jX2ZzOwpAQCAtNDQ2NSw2ICs0NDcwLDggQEAKIAkJCWJpdHMgJj0gMHhiZjsJLypjbGVhciBiaXQgNiAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4N2IsIGJpdHMpOwogCQl9CisJCXBjaV9kZXZfcHV0KHBjaV9kZXZfbTE1MzMpOworCiAJfSBlbHNlIGlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewogCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwogCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKQEAgLTQ0ODIsNyArNDQ4OSw3IEBACiAJcmMgPSAtRU5PREVWOwogCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgewotCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIAorCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsCiAJCSAgICAgICBjYXJkLT5pcnEpOwogCQlnb3RvIG91dF9wcm9jX2ZzOwogCX0KQEAgLTQ1MzMsNyArNDU0MCw3IEBACiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAidHJpZGVudDogUnVubmluZyBvbiBBbHBoYSBzeXN0ZW0gIgogCQkJCSAgICAgICAidHlwZSBOYXV0aWx1c1xuIik7CiAJCQkJYWM5N19kYXRhID0gYWxpX2FjOTdfZ2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCQkJYWxpX2FjOTdfc2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCwgCisJCQkJYWxpX2FjOTdfc2V0KGNhcmQsIDAsIEFDOTdfUE9XRVJfQ09OVFJPTCwKIAkJCQkJICAgICBhYzk3X2RhdGEgfCBBTElfRUFQRF9QT1dFUl9ET1dOKTsKIAkJCX0KIAkJfQpAQCAtNDU2Niw3ICs0NTczLDcgQEAKIAlkZXZzID0gTlVMTDsKIG91dF9yZWxlYXNlX3JlZ2lvbjoKIAlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDI1Nik7Ci0JcmV0dXJuIHJjOyAKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdApAQCAtNDYzNCw4ICs0NjQxLDggQEAKIHN0YXRpYyBpbnQgX19pbml0CiB0cmlkZW50X2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVHJpZGVudCA0RFdhdmUvU2lTIDcwMTgvQUxpIDU0NTEsVHZpYSBDeWJlclBybyAiIAotCSAgICAgICAiNTA1MCBQQ0kgQXVkaW8sIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiLCAiIF9fVElNRV9fICIgIiAKKwlwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSxUdmlhIEN5YmVyUHJvICIKKwkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIKIAkgICAgICAgX19EQVRFX18gIlxuIik7CiAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3Vzci8uZ2l0aWdub3JlIGIvdXNyLy5naXRpZ25vcmUKaW5kZXggYmUxODZhOC4uNjliMmU4OSAxMDA2NDQKLS0tIGEvdXNyLy5naXRpZ25vcmUKKysrIGIvdXNyLy5naXRpZ25vcmUKQEAgLTUsMyArNSw0IEBACiBpbml0cmFtZnNfZGF0YS5jcGlvCiBpbml0cmFtZnNfZGF0YS5jcGlvLmd6CiBpbml0cmFtZnNfbGlzdAoraW5jbHVkZQo=